2013-05-13 3 views
2

У меня есть C -структуру вида:Обработка массивов структур C

#define RGB_TYPE 1 
#define YUV_TYPE 2 
#define MAX_LIST 20 


typedef struct 
{ 
    uint16_t a[2]; 
    uint8_t b; 
    float_t c; 

} mystruct; 

У меня есть массив MyStruct как этот

mystruct MyStructList[MAX_LIST]= { 
     {{100, 200}, RGB_TYPE, 25.0},   
     {{200, 400}, RGB_TYPE,25.0}, 
     {{300,600} ,YUV_TYPE ,30.0}, 
      {{400,600},YUV_TYPE, 30.0} 


}; 

В моем коде я делаю следующее;

mystruct config; 
int i = 0; 

..... 
for(i=0;i<4;i++) 
{ 
    config = MyStructList[i]; 
    /* further processing on config */ 
    some_func(i,&config); 

} 


int some_func(int x, mystruct* pstruct); 
{ 
     /* using pstruct values and storing them in internal arrays */ 
} 

Является ли этот вид копии структуры и правильной обработки? Я использую mingw gcc

+0

'struct' присваиваются, поэтому 'config = MyStructList [i];' отлично. Любые другие сомнения? –

+0

Я не вижу никакой ошибки, но я не знаю, какой ур цель. вам нужно «config», если вы собираетесь назначить его другому «MyStructList [i]» , вы можете просто сделать some_func (i, & MyStructList [i]) – hit

+0

«используя значения pstruct и хранить их во внутренних массивах» Какие внутренние массивы вы сохраняете значения pstruct? И когда вы говорите «значения pstruct», вы имеете в виду указатель, который передается в 'some_func' или значения элементов structs' pstruct'? –

ответ

2

Это выглядит нормально, но обратите внимание, что config = MyStructList[i]; делает мелкую копию структуры. Если вы хотите работать с исходным массивом, mystruct должен быть указателем, который берет адрес MyStructList [i].

Например:

for(i=0;i<4;i++) 
{ 
    mystruct * config = &MyStructList[i]; 
    some_func(i, config); 
} 
0

Вместо того, чтобы говорить config = MyStructList[i]; следует выделить ряд элементов, необходимых при использовании malloc. Например, в корпусе петли вы должны указать

mystruct * config = (mystruct *) malloc (i * sizeof (mystruct)); 
some_func (i, config); // You do not have to use address because config is a pointer type now 
free (config); 
+0

** Dat kast to 'mystruct *' !! ** – 2013-05-13 19:28:26

+2

(«Вы должны» - почему он должен, между прочим, использовать автоматические переменные ...) – 2013-05-13 19:29:11

0

Настоящий экземпляр действителен. Это может быть неэффективно, вы можете просто использовать указатель на исходную структуру при вызове функции some_func(). Затем в some_func вы храните копию своих значений во внутренних массивах.