2010-06-13 5 views
2

아래의 make_quad() 함수에서 quad_t 구조체의 vertex_color 배열에 대한 기본값을 어떻게 설정합니까?함수 내에서 구조체 배열을 초기화하는 방법은 무엇입니까?

/* RGBA color */ 
typedef struct { 
    uint8_t r,g,b,a; 
} rgba_t; 

/* Quad polygon - other members removed */ 
typedef struct { 
    rgba_t vertex_color[ 4 ]; 
} quad_t; 

한편, 함수하고 쿼드 초기화하기 : 분명히

quad_t *make_quad() { 
    quad_t *quad = malloc(sizeof(quad_t)); 
    quad->vertex_color = ??? /* What goes here? */ 
    return (quad); 
} 

내가 이런 식으로 작업을 수행 할 수 있습니다

quad->vertex_color[ 0 ] = { 0xFF, 0xFF, 0xFF, 0xFF }; 
... 
quad->vertex_color[ 3 ] = { 0xFF, 0xFF, 0xFF, 0xFF }; 

그러나이 : ​​

quad->vertex_color = { 
    { 0xFF, 0xFF, 0xFF, 0xFF }, 
    { 0xFF, 0xFF, 0xFF, 0xFF }, 
    { 0xFF, 0xFF, 0xFF, 0xFF }, 
    { 0xFF, 0xFF, 0xFF, 0xFF } 
}; 

을 ... 결과는 "오류 : expe '{'토큰 "앞에 표현식을 사용했습니다.

수정 : 몇 가지 오타가 수정되었습니다.

+0

Missign 세미콜론을 쓰기로 더 나은 것 [4]? – zoli2k

답변

4

보십시오 :

rgba_t t = { 1,2,3,4 }; 

하지만을 : 당신이 제대로 구조체를 선언했다면, 당신은 말할 수있을 것입니다 나는 그들 모두를 여기에서 바로 잡았다. quad_t은 이미 <sys/types.h>에 정의되어 있으므로 myquad_t으로 변경했습니다.

기본적으로 런타임에 동적으로 할당되는 메모리를 정적으로 초기화 할 수 없으므로 컴파일 타임에 초기화 된 전역을 작성한 다음 memcpy을 사용하여 동적으로 할당 된 메모리로 복사하십시오.

여기에 designated initializers에 대한 설명이 있습니다. 오른쪽 리터럴 소위 화합물이다

#include <stdlib.h> 
#include <string.h> 
#include <stdint.h> 

/* RGBA color */ 
typedef struct rgba { 
    uint8_t r,g,b,a; 
} rgba_t; 

/* Quad polygon - other members removed */ 
typedef struct quad { 
    rgba_t vertex_color[ 4 ]; 
} myquad_t; 

static const myquad_t init_quad = { 
    .vertex_color[ 0 ... 3 ] = { 0xFF, 0xFF, 0xFF, 0xFF } 
    };  

myquad_t *make_quad() { 
    myquad_t *q = malloc(sizeof(myquad_t)); 
    memcpy(q , &init_quad, sizeof(myquad_t)); 
    return (q); 
}  

int main(void) { 

    myquad_t * q = make_quad(); 

    return 0; 
} 
1

실제 코드를 게시하십시오. 예 :

typedef { 
    uint8_t r,g,b,a; 
} rgba_t; 

은 컴파일되지 않습니다. 그리고 당신은 초기화가 아니라 과제를하려는 것 같습니다. ,

t = { 1,2,3,4 }; 
+0

입력 할 때 'struct'키워드를 사용하지 않았습니다. 나는 그것을 위에 고쳤다 ... 그리고 내가 다른 것을 놓치지 않는 한, 그것은 컴파일된다. –

+0

C가 구조 지정을 지원합니다 ... – Artelius

+0

중괄호 안의 @Artelius는 초기화 값을 묶습니다. –

1

코드에서 오류의 수 있었다

memset(quad, 0xFF, sizeof(quad_t)); 
1

C99에서는

 
*quad = (quad_t const){ 
    .vertex_color = { 
    { .r = 0xFF, .g = 0xFF, .b = 0xFF, a. = 0xFF }, 
    { .r = 0xFF, .g = 0xFF, .b = 0xFF, a. = 0xFF }, 
    { .r = 0xFF, .g = 0xFF, .b = 0xFF, a. = 0xFF }, 
    { .r = 0xFF, .g = 0xFF, .b = 0xFF, a. = 0xFF }, 
    } 
}; 

뭔가를 할 수 있습니다. 현대의 컴파일러는 이것을 가장 효율적인 방법으로 구현해야합니다.

그러나 아마 더 체계적인 조금

 
#define RGBA_INITIALIZER { .r = 0xFF, .g = 0xFF, .b = 0xFF, a. = 0xFF } 
#define QUAD_INITIALIZER {      \ 
.vertex_color = {        \ 
    RGBA_INITIALIZER, RGBA_INITIALIZER,   \ 
    RGBA_INITIALIZER, RGBA_INITIALIZER   \ 
    }            \ 
} 

다음 바로 vertex_color rgba_t 후

 
*quad = (quad_t const)RGBA_INITIALIZER; 
관련 문제