Ошибка undefined reference - C (СИ)
Формулировка задачи:
Имеется программа. Представляет из себя поисковую систему. Пишу в dev-cpp. При компиляции вылезает одна единственная ошибка "C:\kurs\kurc\main.cpp|6|undefined reference to `base_menu()'"
Из-за чего она может быть. Вроде модуль указал, а не нашел. Прошу меня поправить.
Все файлы прикладываю.
base.c
base.h
interface.c
interface.h
main.cpp
student.c
student.h
Заранее спасибо
#include <stdio.h> #include <stdlib.h> #include "student.h" struct _student *read_base(struct _student *student) //чтение из базы { FILE *base; struct _student *newstd; //новый узел if ((base = fopen("student.base", "r")) != NULL) //проверка файла на возможность чтения { fseek ( base , 0 , SEEK_SET ); //перемещаемся в начало файла while(!feof(base)) //пока не конец файла { newstd=(struct _student *) malloc(sizeof(struct _student)); //выделяем память для нового узла списка fread(new_student, sizeof(struct _student), 1, base); //считываем данные /*добавление элемента в начало списка*/ newstd->next=student; student=newstd;//делаем элемент 1 в списке } fclose(base); //закрываем файл return student; } else return student;//ошибка } int write_base(struct _student *student) //запись в базу { FILE *base; //указатель на файл struct _student *currstd; //текущий узел if ((base= fopen("student.base", "w")) == NULL) //проверка на доступность файла для записи { puts("Cannot edit main file."); return -1;//ошибка } currstd=student; //текущий узел становится первым while(currstd!=NULL) //пока не закончился список { fwrite(currstd, sizeof(struct _student), 1, base); //записываем в файл данные списка currstd=currstd->next; //получаем адрес следующего узла } fclose(base); //закрываем файл return 0; } int free_memory(struct _student *student) //освобождение памяти, занимаемой списком { struct _student *currstd; //текущий узел struct _student *nextstd; //следующий узел if(student==NULL) //проверка на пустоту списка { puts("base empty"); return -1; } currstd=student; //делаем первый элемент текущим while(currstd!=NULL) { nextstd=currstd->next; //получаем адрес следующего элемента free(currstd); //освобождаем память currstd=nextstd; } return 0; }
#ifndef base_h #define base_h struct _student *read_base(struct _student *); //чтение из базы int write_base(struct _student *); //запись в базу int free_memory(struct _student *); //освобождение памяти, занимаемой списком #endif
#include <stdio.h> #include "student.h" #include "base.h" #include "interface.h" void base_menu() { int key; struct _student *student=NULL;//заголовок списка student=read_base(student);//считываем данные из базы while(1) { //вывод основного меню puts("1-Add student"); puts("2-Delete student"); puts("3-Change student's info"); puts("4-Search of student by surname."); puts("5-Search of student with dept"); puts("6-Search of student by group."); puts("7-Exit"); scanf("%d",&key); switch(key) { case 7: write_base(student); //сохранить список в файл free_memory(student); //освобождение памяти, занимаемой списком return; case 1: student=new_student(student); //добавить запись break; case 2: student=delete_student(student); //удалить запись break; case 3: student=change_student(student); //изменить запись break; case 4: student=info_student(student); //информация о студенте break; case 5: student=debt(student); //задолжники break; case 6: student=list_group(student); //список группы break; default:puts("Enter Error"); //введены неверные данные break; } } } void about_student(struct _student *editstd) { /*получение информации о студенте*/ puts("Enter surname of student"); //фамилия scanf("%s",&editstd->surname); puts("Enter name of student"); //имя scanf("%s",&editstd->name); puts("Enter patronymic of student"); //отчество scanf("%s",&editstd->otchestvo); puts("Enter floor of student(male/female)"); //пол scanf("%s",&editstd->pol_stud); puts("Enter name of group"); //группа scanf("%s",&editstd->group); puts("Enter day of born");//день scanf("%d",&editstd->day); puts("Enter month of born");//месяц scanf("%d",&editstd->month); puts("Enter year of born");//год scanf("%d",&editstd->year); puts("Enter estimation by mathematics");//матан scanf("%d",&editstd->ozenkamatan); puts("Enter estimation by computer science");//информатика scanf("%d",&editstd->ozenkainfa); puts("Enter estimation by bases of the theory of chains");//отц scanf("%d",&editstd->ozenkaotc); }
#ifndef interface_h #define interface_h void base_menu();//прототип функции вызова меню void about_student(struct _student *);//прототип функции сбора информации #endif
#include <stdio.h> #include "interface.h" int main() { base_menu();//вызов основного меню return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "student.h" #include "interface.h" struct _student *new_student(struct _student *student) //добавить новую запись в базу { struct _student *newstd; //новый узел newstd=(struct _student *) malloc(sizeof(struct _student)); //выделение памяти под новый узел списка if(newstd!=NULL){ about_student(newstd); /*добавление элемента в начало списка*/ newstd->next=student; student=newstd; system("cls"); puts("student is successfully added"); } return student; } struct _student *delete_student(struct _student *student) //удалить запись { char name[size], surname[size], patronymic[size]; struct _student *currstd; //текущий узел struct _student *prestd; //предыдущий узел int found=0;//флаг поиска if(student==NULL) //проверка на пустоту списка { puts("base empty"); return student;//ошибка } sclear(name); //очистка массива sclear(surname); //очистка массива sclear(patronymic); //очистка массива currstd=student; //делаем первый элемент списка текущим prestd=NULL; /*получение информации об удаляемой записи*/ puts("Enter surname of student"); //фамилия scanf("%s",&surname); puts("Enter name of student"); //имя scanf("%s",&name); puts("Enter patronymic of student"); //отчество scanf("%s",&patronymic); system("cls"); /*поиск записи*/ while((currstd!=NULL)&&(found!=1)) ////пока не закончился список и пока не найден нужный узел { if( (strcmp(currstd->surname,surname)==0) && (strcmp(currstd->name,name)==0) && (strcmp(currstd->otchestvo,patronymic)==0) )//проверка на совпадение found=1; else { prestd=currstd; //заносим адрес текущего узла в предыдущий currstd=currstd->next; //получаем адрес следующего узла списка } } if(found==1) //если нужная запись найдена { if(prestd==NULL) //если предыдущий узел не существует student=currstd->next; //следующий узел становится началом списка else prestd->next=currstd->next; //следующим узлом для предыдущего становится следующий узел для найденного free(currstd); //удаление текущего элемента и освобождение памяти puts("Delete Success"); } else puts("student not found"); //если нужная запись не найдена return student; } struct _student *change_student(struct _student *student) //изменить запись { struct _student *currstd; //текущий узел char name[size], surname[size], patronymic[size]; int found=0;//флаг поиска sclear(name); //очистка массива sclear(surname); //очистка массива sclear(patronymic); //очистка массива if(student==NULL) //проверка на пустоту списка { puts("base empty"); return student; } puts("Enter surname of student"); //фамилия scanf("%s",&surname); puts("Enter name of student"); //имя scanf("%s",&name); puts("Enter patronymic of student"); //отчество scanf("%s",&patronymic); currstd=student; //делаем первый элемент списка текущим system("cls"); while((currstd!=NULL)&&(found!=1)) ////пока не закончился список и пока не найден нужный узел { if( (strcmp(currstd->surname,surname)==0) && (strcmp(currstd->name,name)==0) && (strcmp(currstd->otchestvo,patronymic)==0) )//проверка на совпадение found=1; else currstd=currstd->next; //получаем адрес следующего узла списка } if(found==0) { //если не найдено puts("student not found"); return student; } //выводим текущую информацию printf("%s\n%s\n%s\n",currstd->surname,currstd->name, currstd->otchestvo); printf("%s\n%d.%d.%d\n",currstd->pol_stud,currstd->day, currstd->month, currstd->year); printf("%s\n%d\n%d\n%d\n%d\n",currstd->group,currstd->number,currstd->ozenkamatan, currstd->ozenkainfa, currstd->ozenkaotc); about_student(currstd); system("cls"); return student; } struct _student *info_student(struct _student *student) //информация о студенте { struct _student *currstd; //текущий узел char surname[size]; int found=0;//флаг поиска sclear(surname); //очистка массива if(student==NULL) //проверка на пустоту списка { puts("base empty"); return student; } puts("Enter surname of student"); //фамилия scanf("%s",&surname); system("cls"); currstd=student; //делаем первый элемент списка текущим while((currstd!=NULL)&&(found!=1)) ////пока не закончился список и пока не найден нужный узел { if( (strcmp(currstd->surname,surname)==0) )//проверка на совпадение found=1; else currstd=currstd->next; //получаем адрес следующего узла списка } if(found==0) { //если не найдено puts("student not found"); return student; } //выводим текущую информацию printf("%s\n%d.%d.%d\n",currstd->pol_stud,currstd->day, currstd->month, currstd->year); printf("%s\n%d\n%d\n%d\n%d\n",currstd->group, currstd->number,currstd->ozenkamatan, currstd->ozenkainfa, currstd->ozenkaotc); return student; } struct _student *debt(struct _student *student) //задолжники { struct _student *currstd; //текущий узел int found=0;//флаг поиска if(student==NULL) //проверка на пустоту списка { puts("base empty"); return student; } currstd=student; //делаем первый элемент списка текущим while((currstd!=NULL)) ////пока не закончился список и пока не найден нужный узел { if( (currstd->ozenkamatan<3) || (currstd->ozenkainfa<3) || (currstd->ozenkaotc) ){//проверка на совпадение found=1; printf("%s\n%s\n",currstd->surname,currstd->group); currstd=currstd->next; //получаем адрес следующего узла списка } else currstd=currstd->next; //получаем адрес следующего узла списка } if(found==0) { //если не найдено puts("student not found"); return student; } return student; } struct _student *list_group(struct _student *student) //список группы { struct _student *currstd; //текущий узел char group[size]; int found=0;//флаг поиска sclear(group); //очистка массива if(student==NULL) //проверка на пустоту списка { puts("base empty"); return student; } puts("Enter name of group"); //группа scanf("%s",&group); system("cls"); currstd=student; //делаем первый элемент списка текущим while((currstd!=NULL)) ////пока не закончился список и пока не найден нужный узел { if( (strcmp(currstd->group,group)==0) ){//проверка на совпадение found=1; printf("%s\n%s\n%s\n",currstd->surname,currstd->name, currstd->otchestvo); currstd=currstd->next; //получаем адрес следующего узла списка } else currstd=currstd->next; //получаем адрес следующего узла списка } if(found==0) { //если не найдено puts("student not found"); return student; } return student; } void sclear(char *array) //очистка массива { int i; for(i=0;i<size;i++) array[i]='\0'; }
#ifndef student_h #define student_h #define size 20 struct _student{//структура информации о студенте char surname[size]; char otchestvo[size]; char name[size]; char pol_stud[size]; char group[size]; int day; int month; int year; int ozenkamatan; int ozenkainfa; int ozenkaotc; int number;//номер зачетки struct _student *next;//указатель на следующий элемент списка }; struct _student *new_student(struct _student *); //добавить новую запись в базу struct _student *delete_student(struct _student *); //удалить запись struct _student *change_student(struct _student *); //изменить запись struct _student *info_student(struct _student *); //информация о студенте struct _student *debt(struct _student *); //задолжники struct _student *list_group(struct _student *); //список группы void sclear(char *); //очистка массива #endif
Решение задачи: «Ошибка undefined reference»
textual
Листинг программы
using namespace std;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д