2016-09-09 2 views
0

У меня есть функцияC- Итерация по массиву структур, передаваемых через пустоту *

struct Analysis reduce (int n, void* results) 

Где п число файлов, которые будут проанализированы, и я передаю массив анализа структур к результатам ,

Анализ структура определяется следующим образом:

struct Analysis { 
    int ascii[128]; //frequency of ascii characters in the file 
    int lineLength; //longest line in the file 
    int lineNum; //line number of longest line 
    char* filename; 
} 

Я бросил пустоту * как таковой,

struct Analysis resArray[n]; 
struct Analysis* ptr = results; 
resArray[0] = ptr[0]; 

, но я не могу понять, как перебирать resArray правильно , Я пробовал

for (i = 0; i < n; i++){ 
    printf("lineLength: %d\n", resArray[i].lineLength); 
} 

с n = 3, и я получаю значения мусора. resArray [0] правильный, но resArray [1] - безумно высокое число, а resArray [2] - всего 0. Почему resArray [1] или resArray [2] не дают правильных значений? Если бы я неправильно увеличивал адрес, тогда это имело бы смысл, но я просто обращаюсь к массиву с определенным индексом. Довольно здесь потеряно!

+1

попробуйте 'ptr [i]' вместо 'resArray [i]'. – BLUEPIXY

+1

Использование 'resArray [0] = ptr [0];' вы копируете первый элемент 'results' в первый элемент' resArray'. Другие значения остаются неинициализированными. – LPs

+3

'Почему бы не resArray [1] или resArray [2] не дать правильные значения' - потому что для этих элементов не выполнялось присвоение? Все, что вы сделали с 'resArray [0] = ptr [0];', вытащили первый элемент. Все остальное * неопределенно * в этом массиве. Но ... зачем вставлять их в другой массив. Что случилось с использованием 'ptr [i] .linelength'? – WhozCraig

ответ

0

resArray [0] правильно, потому что есть «что-то»:

resArray[0] = ptr[0]; 

Другие элементы мусора, потому что вы не установили там какие-либо значения. Если вы хотите скопировать весь массив, вам необходимо изменить способ копирования на:

for (i = 0; i < n; i++) 
{ 
    resArray[i] = ptr[i]; 
} 
-1

Надеюсь, этот код вам поможет.

#include <stdio.h> 
#define d 3 
struct Analysis { 
    int ascii[128]; 
    int lineLength; 
    int lineNum; 
    char *filename; 
}; 

struct Analysis Analyses[d]; 

struct Analysis reduce(int n, void *results) { 

    struct Analysis resArray[n]; 
    struct Analysis *ptr = results; 

    for (int i = 0; i < n; i++) { 
     resArray[i] = ptr[i]; 
    } 

    for (int i = 0; i < n; i++) { 
     printf("lineLength: %d\n", ptr[i].lineLength); 
    } 

    return *ptr; 
} 

int main(void) { 
    struct Analysis a = {{5}, 2, 2, "George"}; 
    struct Analysis b = {{6}, 3, 3, "Peter"}; 
    struct Analysis c = {{7}, 4, 4, "Jane"}; 
    Analyses[0] = a; 
    Analyses[1] = b; 
    Analyses[2] = c; 
    reduce(d, &Analyses); 
    return 0; 
} 

Вы можете попробовать online.

0

Вы не можете назначить указатель на массив напрямую, потому что они разные типы since array[n] is type struct analysis(*)[n] and ptr is type struct analysis(*). Проверьте here для получения дополнительной информации.