2016-09-24 7 views
0

저는 자바 스크립트와 같은 언어에서 오는 C 언어에 익숙하지 않습니다. 언어의 양, 키워드 등은 고통스럽게 혼란 스럽습니다.C에서 객체 배열을 만드는 방법은 무엇입니까?

자바 스크립트에서 객체 배열을 만들 수 있습니다. 나는 내가 typedef 및 또는 struct의를 사용해야한다는 것 읽은에서

arrayOfObjectsInsideJavascript = [ 
    { s:"ejf09j290fj390j2f09", f=0 }, 
    { s:"dj320992209920209dj", f=0 } 
] 

.

나는 시도했다 :

typedef struct[] = { 
    { s:"ejf09j290fj390j2f09", f=0 }, 
    { s:"dj320992209920209dj", f=0 } 
} 

struct[] = { 
    { s:"ejf09j290fj390j2f09", f=0 }, 
    { s:"dj320992209920209dj", f=0 } 
} 

typedef struct { 
    char[] s = "ejf09j290fj390j2f09"; 
    int f = 0; 
} objectLikeClassThingy; 

내가 필요로하는 개체를 만들 수있는 가장 좋은 방법은 무엇입니까?

+0

객체 지향이 아니기 때문에'C 클래스와 객체 '에 대한 개념이 없다. 그래서 나는'어떻게 C로 구조체의 배열을 만들 수 있을까?'라고 생각한다. – Cherubim

+0

나는 요점을 얻지 못한다. 이 주석, 구조를 작성하는 방법을 모르는 경우 왜 내가 "C로 구조체의 배열을 작성합니까?"라는 질문에 이름을 붙여야한다고 말하고 있습니까? –

+0

그렇다면 질문에 대한 답은 ** C의 객체 (클래스의 인스턴스) 개념이 없으므로 ** 할 수 없습니다 ... – Cherubim

답변

0

여기 JavaScript에는 동적 "속성"이 있으며 C에는 정적 "태그"가 있습니다. 구조체 유형은 태그 유형으로 정의되며 각 유형은 태그 유형을가집니다. 귀하의 예를 배열 내부의 유형에 대해

arrayOfObjectsInsideJavascript = [ 
    { s:"ejf09j290fj390j2f09", f=0 }, 
    { s:"dj320992209920209dj", f=0 } 
] 

마지막 솔루션은 거의 정확하게 시작했다 :

  • 경우 :

    struct element { 
        char s[256]; 
        int f; 
    }; 
    

    당신은 s의 유형에 대한 두 가지 옵션이 있습니다 당신은 객체 내부에 문자열을 저장하기를 원한다면, 어떤 배열 타입을 사용하라. 예 : char s[256]. 256은 배열의 길이이므로 0으로 끝나는 문자열을 사용할 때 허용되는 최대 문자열 길이는 255입니다 (문자는 '\0'의 경우 256에서 1).

  • 문자열을 개체 외부에 저장하려면 포인터 유형을 사용합니다. 문자열 리터럴을 사용하려는 경우 태그를 const char *s으로 선언해야합니다. 문자열 리터럴을 변경하면 정의되지 않은 동작이 발생하므로 자신을 방지하는 것이 가장 좋습니다.

이 답변의 경우 첫 번째 옵션을 사용합니다. 당신이 구조체를 정의하려면


, 당신은 지금하는 typedef

struct element { 
    char s[256]; 
    int f; 
} one_object = { 
    .s = "ejf09j290fj390j2f09", 
    .f = 0, 
}; 

또는

struct element { 
    char s[256]; 
    int f; 
}; 

/* ... later, in a scope where `struct element` is visible ... */ 

struct element one_object = { 
    .s = "ejf09j290fj390j2f09", 
    .f = 0, 
}; 

또는, 같은 것을 쓸 수

typedef struct { 
    char s[256]; 
    int f; 
} your_element_type; 

/* ... later, in a scope where `your_element_type` is visible ... */ 

your_element_type one_object = { 
    .s = "ejf09j290fj390j2f09", 
    .f = 0, 
}; 
,536,

C99 표준을 지원하지 않는 구형 컴파일러에서는 이것이 작동하지 않는다는 점에 유의하십시오.다시 유형 이름 struct element를 참조 할 것 없습니다하는 경우

your_element_type one_object = { "ejf09j290fj390j2f09", 0 }; 

는 또한 이름이 그렇게하지, 그주의 : 이전 일, 당신은 순서대로 필드를 초기화해야 할 것 그것은 :

struct { 
    char s[256]; 
    int f; 
} one_object = { 
    .s = "ejf09j290fj390j2f09", 
    .f = 0, 
}; 

배열이 유사하게 초기화된다 (실제로 이미 문자열 배열, 즉 s, 초기화 한) :

struct element { 
    char s[256]; 
    int f; 
} so_many_objects[] = { 
    { .s = "ejf09j290fj390j2f09", .f = 0 }, 
    { .s = "dj320992209920209dj", .f = 0 }, 
}; 

또는

다시 typedef
struct element { 
    char s[256]; 
    int f; 
}; 

/* ... later, in a scope where `struct element` is visible ... */ 

struct element so_many_objects[] = { 
    { .s = "ejf09j290fj390j2f09", .f = 0 }, 
    { .s = "dj320992209920209dj", .f = 0 }, 
}; 

또는, 그런데

typedef struct { 
    char s[256]; 
    int f; 
} your_element_type; 

/* ... later, in a scope where `your_element_type` is visible ... */ 

your_element_type so_many_objects[] = { 
    { .s = "ejf09j290fj390j2f09", .f = 0 }, 
    { .s = "dj320992209920209dj", .f = 0 }, 
}; 

, 우리는 so_many_objects에 대한 불완전한 유형을 사용하고 있습니다; 이는 컴파일러가 배열의 크기를 볼 수 있기 때문에 가능합니다. 이 예제에서 컴파일러는 마치 코드가 struct element so_many_objects[2] 인 것처럼 취급합니다. 더 많은 객체로 배열을 확장해야한다고 생각한다면 배열에 포함 된 요소의 수 (최대)를 지정하거나 동적 할당에 대해 알아 두는 것이 좋습니다.

+0

구조체의 인스턴스를 초기화 할 때 왜 변수 이름 앞에'.'를 써야합니까? –

+0

@dev 그 구문에서 점은 변수 이름과 태그 이름을 구별하는 역할을합니다. 할당은 표현식이기도합니다. 'struct element aaaa = {bbbb = "foo", cccc = 0};'이라고 쓰면, 객체'aaaa'를 선언하고 초기화 할뿐만 아니라 변수'bbbb'와' cccc' *'struct element'의 바깥 쪽 *. –

+0

@dev 또한'struct element aaaa = {bbbb = "foo", cccc = 0};가 작동하는 유일한 이유는 "구식"이니셜 라이저 구문이 적용된다는 것입니다. 'struct element aaaa = { "foo", 0};와 거의 같습니다. –

3

이 마음에 드십니까?

struct { 
    const char *s; 
    double f; 
} obj[] = { 
    { .s = "ejf09j290fj390j2f09", .f = 0 }, 
    { .s = "dj320992209920209dj", .f = 0 } 
}; 
관련 문제