2016-12-01 6 views
1

Я пытаюсь распечатать все элементы каждой структуры из списка. Мне были предоставлены следующие функции печати, чтобы распечатать элемент из общего списка.Массив структур: печать всех элементов каждой структуры

Вот определение структуры моего списка, который в общем списке ADT гр файла:

struct list_type { 
    void *data; 
    int size; 
    int capacity; 
    int elementSize; 
    int (*comparePtr) (void *d1, void *d2); 
}; 

Так в общем списке ADT файл Си, у меня есть эта функция печати:

// client needs to send a pointer to a function capable of printing an element 
void printl(ListType listptr, void (*printItem) (void *d)) { 
    int i; 
    for(i = 0; i < listptr->size; i++) { 
    // since we cannot use data[i], we need to calculate the address 
    // of the element to be sent to the client's print function 
    // since data is of type void, the formula is: 
    // the beginning address of the array + (offset x element size) 
    printItem(listptr->data + i * (listptr->elementSize)); 
    printf(" "); 
    } 
    printf("\n"); 
} 

Я называю свою функцию printl так:

printl(clientList, printItem); 

в моем файле драйвера, есть функция распечатки в Elemen т из списка:

void printItem (int* p) { 
    printf("%d", *p); 
    //`my attempt at printing the members of an individual structure from the list 
    // printf("%s", ((Client *)&p)[0]); 
} 

Вот моя Client структуры определение:

struct client_tag { 
    char id[5]; 
    char name[30]; 
    char email[30]; 
    char phoneNum[15]; 
}; 

Когда я запускаю программу, я получаю кучу странных персонажей. Как это исправить?

+3

Мы должны видеть, как 'printl' является и что такое определение структуры, и что такое ListType. – Schwern

+2

http://stackoverflow.com/help/mcve - Как создать минимальный, полный, проверяемый пример – Elyasin

+0

@ Шварн Хорошо, я предоставил их. Надеюсь, я дал достаточно, мой код довольно длинный, поэтому я не был уверен, сколько нужно быть включенным. – Jasmine

ответ

1

Предполагая, что вы оставили из линии

typedef struct client_tag Client; 

и предполагая, что строки Client гарантированно быть нулем, это идея:

void printItem (const Client* p) { 
    printf("%s\n", p->id); 
} 
+0

Ваши предположения верны. Однако проблема заключается в том, что 'printItem' должен работать для различных структур (у меня есть всего три) в одном классе драйверов. – Jasmine

+1

@ Jasmine Нет смысла использовать ту же функцию, если вы используете указатель на функцию! – Stargateur

+0

@Stargateur Я не уверен, что вы подразумеваете под этим – Jasmine

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