2015-02-24 2 views
0

У меня возникают проблемы с функцией, которую я использую для записи в элемент массива.Проблема Проблема с массивом структур с помощью указателей

Я думаю, это может быть потому, что я не передаю массив структуры правильно. Мне было интересно, может ли кто-нибудь указать, как это сделать правильно. Я заставляю его больше, чем исправлять его.

скажем, у меня есть функция menu.c я декларировать свою newPerson person[MAX_PERSONS];-структуру Я затем запустить свою функцию addPerson(person, &num); которая является следующей

void addPerson(newPerson *pers, int *num){ 
    pers[*num] = (newPerson) { 
        "Michelle", "Leo", "6136458798", STUDENT, 
        .data = {.s = {9, 1234.50, 3}} 
       }; 
    *num = *num + 1; 
} 

Он работает, но не печатает правильно, я угадывая, потому что он не пишет, где я хочу его pers[num]. Я пытался вызвать функцию таким образом, также addPerson(&person, &num); вместо просто addPerson(person, &num); но я получаю эту ошибку

предупреждение: передавая аргумент 1 из «addPerson» от несовместимого типа указателя [по умолчанию включено]

и

примечание: ожидаемый 'STRUCT newPerson ', но аргумент типа 'STRUCT newPerson () [20]'

Я попытался изменить функцию на void addPerson(newPerson *pers[], int *num){, но ничего там нет. Интересно, может ли кто-нибудь указать, что я делаю неправильно здесь, и как я могу исправить свою проблему. Любая помощь будет оценена, спасибо!

Забыл упомянуть, что функция addPerson работает в некоторых местах, где я запускаю ее.

int menu(int num) { 
    newPerson person[MAX_PERSONS]; 
    //printf("THE NUMBER START OF MENU IS %d\n", num); test counter 

    //addPerson(person, &num); <- WRITES AND READS PROPERLY IF DONE HERE 

    int option; 
    printf(
      "\n\tPlease choose one of the following options to continue (0-9): "); 
    scanf("%d", &option); 


if (option == 1) { //program will ask for name input 
    addPerson(person, &num); <- HOWEVER IT DOES NOT WRITE OR READ PROPERLY HERE 
    menu(num); 
} 

Обе функции вызываются в menu.c Однако, когда я называю addPerson в заявлении, если он не писать/читать правильно.

Просто решил проблему, объявив структуру статичной! static newPerson person[MAX_PERSONS];

Я не уверен, что это табу или что-то еще, но это исправило мою проблему!

+0

я собираюсь сделать дикое предположение, что вы обращаетесь ' человек' вне. Какова ценность 'num' перед использованием в' addPerson'? –

+0

Проблема заключается в том, что массив 'person' является локальной переменной, и вы вызываете функцию' menu' рекурсивно. – user3386109

ответ

0

я смог получить работу, объявив-структуру как статический

static newPerson person[MAX_PERSONS];

Не уверен, если это фактическое исправление или, если это просто маскировка моей проблемы, хотя.

+0

Какова ценность 'MAX_PERSONS'? У вас достаточно пространства стека? – Vagish

+0

Это один из способов устранить проблему, что массив 'person' является локальной переменной. Однако у вас все еще есть проблема с рекурсией. Если функция 'menu' вызывает себя, стек будет расти до тех пор, пока не произойдет переполнение стека, и программа выйдет из строя. Не видя больше программы, трудно посоветовать, как исправить эту проблему. Проводка [MCVE] (http://stackoverflow.com/help/mcve) заставит этот вопрос намного легче ответить. – user3386109

1

Делая статическими вы сделали код неэффективного как память для структуры данных была отложено, независимо от того, является требуется или нет в то время как программа выполняется. (С помощью статических данных структуры, размер структуры фиксирован.)

Объявить функцию как

void addPerson(newPerson *pers[],int *num) 

вызова функция как

void addPerson(newPerson *pers, int *num); 

ИЛИ

void addPerson(newPerson pers[], int *num); 
+0

Объявить функцию как void addPerson (newPerson * pers [], int * num) вызывать функцию как void addPerson (newPerson * pers, int * num); ИЛИ void addPerson (newPerson pers [], int * num); – Mayavi