2012-02-07 3 views
1

Странно, потому что я сделал это раньше, но он просто не работает. У меня есть структура xmp_frame вот так.Найти нет. элементов в массиве структур?

typedef struct { 
    short int attr_dtype; 
    short int attr_code; 
    short int attr_len; 
    const char *attr; 
}xmp_frame; 

Теперь я создаю массив xmp_frame и использовать их люблю:

xmp_frame frame_array[]={ 
    {1,2,strlen("Hello there"),"Hello there"}, 
    {1,3,strlen("This is not working"),"This is not working"}, 
    {0,3,strlen("But why??"),"But why??"} 
}; 

Теперь у меня есть рутина, которая в основном записывает frame_array, чтобы файл:

short int write_frames(xmp_frame frame_array[],FILE *outfp){ 

} 

Перед тем, как написать frame_array Мне нужно получить нет. элементов в frame_array[] для выполнения некоторой обработки. Так что это, как мы делаем это (в целом):

short int write_frames(xmp_frame frame_array[],FILE *outfp) { 
    short intnum_frames=sizeof(frame_array)/sizeof(frame_array[0]); 
    /*But i get the value of num_frames as 0. I will print the outout of some debugging.*/ 

    fprintf(stderr,"\n Size of frame_array : %lu",sizeof(frame_array)); //prints 8 
     fprintf(stderr,"\n Size of frame_array[0] : %lu",sizeof(frame_array[0])); //prints 16 
     fprintf(stderr,"\n So num. of frames to write : %d", (sizeof(frame_array))/(sizeof(frame_array[0]))); //prints 0 
} 

Конечно, если frame_array 8 байт и frame_array[0] составляет 16 байт, то num_frames будет 0.

Но вопрос в том, как может размер массив будет меньше одного из его элементов? Я слышал о заполнении байтов.

У меня нет большой идеи, если это вызывает проблему. Вот одна из ссылок, на которые я ссылался: Result of 'sizeof' on array of structs in C?

Хотя я нашел несколько обходных решений, чтобы определить размер массива структур.

  1. Получить №. элементов из вызывающей и

  2. другой в обязательном порядке получить последний элемент структуры, как {0,0,0,NULL}, а затем в write() чек на его присутствие и остановить сканирование frame_array дальше.

Но оба зависят от вызывающего, чего вы не можете доверять. Итак, где реальная проблема. И как я могу определить значение num_frames?

ответ

4

Массивы передаются в функции в качестве указателей, поэтому 8 байтов, которые вы видите, действительно являются размером указателя (если вы на 64-битном уровне), а не размером исходного массива. Невозможно получить фактический размер массива с указателем, поэтому вам придется передавать его отдельно для функции.

+0

Да, я думаю, мне придется идти с проезжающим размером. Но какой из двух подходов я упомянул лучше? – tnx1991

+0

@ tnx1991: Любой подход прекрасен. Выберите тот, который лучше подходит для вашей ситуации. – casablanca

1

Невозможно узнать размер массива после его передачи в качестве параметра функции. Вам нужно передать количество элементов в массиве.

short int write_frames(xmp_frame frame_array[], int num_frames,FILE *outfp) 
{ 
    for(int i=0; i < num_frames; i++) 
     // write frame_array[i] 
} 
0

Вы можете сделать это с помощью этой функции:

size_t _msize(void *memblock); 

и вызвать его, когда вы хотите с указателем структуры массива.

+0

Обратите внимание, что это специальная функция Microsoft. – dbush

Смежные вопросы