2016-01-14 3 views
1

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

#include <stdio.h> 

struct age{ 
    int num; 
}; 

struct name{ 
    char fname [15]; 
    char lname[15]; 
    struct age nameAge; 
}; 

void input(struct name *info[]); 

int main (void){ 
char choice; 
char ans; 
int i; 
struct name record[10]; 
do{ 
    printf("M E N U"); 
    printf("\n\n[I]nput\n[D]isplay\n[S]earch\n[Q]uit"); 
    printf("\n\nEnter choice: "); 
    choice=tolower(getche()); 
    system("cls"); 

    switch (choice){ 
     case 'i': input(&record[]); 
        i++; 
       break; 
     case 'd': //function here 
       break; 
     case 's': //fucntion here 
       break; 
     case 'q': printf("The program will now close."); 
       break; 
     default: printf("Invalid character. Try again"); 
       break; 
     } 

    getch(); 
    system("cls"); 

    }while (choice!='q'); 
return 0; 
} 

void input(struct name *info[]){ 
//codes here 
} 
+2

Почему 'input (& record []);' ?? –

+1

Кроме того: вам нужно «# include» больше заголовков библиотек - 'ctype.h',' conio.h' и 'stdlib.h' как минимум. Вы должны получать предупреждения о компиляторе. И 'char choice;' должен быть 'int choice', так же как возвращаемый тип' getche' и 'tolower'. –

+0

Примечание: вы не инициализировали 'i'. –

ответ

1

Изменить определение функции и реализация и вызов функции, как это (если вы хотите использовать массивы)

void input(struct name info[]); 
... 
      input(record); 

Или с помощью указателя (также работает с массивами в качестве аргументов)

void input(struct name *info); 
... 
      input(record); 
2

Имейте в виду, что Имя массива «распадается» на указатель на его первый элемент. Итак, в вашем случае просто используйте record, чтобы передать «массив» (вы не можете передать массив) функции. Вам также необходимо изменить тип аргумента функции на struct info*, так как record имеет тип struct info*.

Вот рабочий код с изменениями прокомментировал:

#include <stdio.h> 

struct age{ 
    int num; 
}; 

struct name{ 
    char fname[15]; 
    char lname[15]; 
    struct age nameAge; 
}; 

/*void input(struct name *info[]); Note the change in the declaration */ 
void input(struct name *info); 

int main (void){ 
    char choice; 
    char ans; 
    int i; 
    struct name record[10]; 
    do{ 
     printf("M E N U"); 
     printf("\n\n[I]nput\n[D]isplay\n[S]earch\n[Q]uit"); 
     printf("\n\nEnter choice: "); 
     choice=tolower(getche()); 
     system("cls"); 

     switch (choice){ 
      case 'i': input(record); /* Note the change here as well */ 
         i++; 
        break; 
      case 'd': //function here 
        break; 
      case 's': //fucntion here 
        break; 
      case 'q': printf("The program will now close."); 
        break; 
      default: printf("Invalid character. Try again"); 
        break; 
      } 

     getch(); 
     system("cls"); 

     }while (choice!='q'); 
    return 0; 
} 

void input(struct name *info){ /* Note the change here in the function definition too */ 
    //codes here 
} 
1

Вы не хотите, чтобы это сделать void input(struct name *info[]); для функции ввода. Вы хотите передать ссылку на одну из информационных структур в массиве функции, так как вы будете только редактировать одну информацию за раз.

Таким образом, ваша измененная функция будет void input(struct name *info);, и вы бы назвали ее, используя input(&record[i]);, которая дает адрес записи i. Вам также нужно инициализировать i, поскольку вы никогда не устанавливали его в 0, а подстрекали его.

1

еще одно предложение для вас ....

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

#include <stdio.h> 

struct age{ 
    int num; 
}; 

struct name{ 
    char fname [15]; 
    char lname[15]; 
    struct age nameAge; 
}; 

// void input(struct name *info[]); 
void input(struct name *info); 

int main (void){ 
char choice; 
char ans; 
int i; 

int n_records=0; 

struct name record[10]; 
do{ 
    printf("M E N U"); 
    printf("\n\n[I]nput\n[D]isplay\n[S]earch\n[Q]uit"); 
    printf("\n\nEnter choice: "); 
    choice=tolower(getche()); 
    system("cls"); 

    switch (choice){ 
     case 'i': input(&record[n_records]); 
        i++; 
        nrecords++; 
       break; 
     case 'd': //function here 
       break; 
     case 's': //fucntion here 
       break; 
     case 'q': printf("The program will now close."); 
       break; 
     default: printf("Invalid character. Try again"); 
       break; 
     } 

    getch(); 
    system("cls"); 

    }while (choice!='q'); 
return 0; 
} 

// void input(struct name *info[]){ 
void input(struct name *info){ 
//codes here 
} 
Смежные вопросы