Ошибка 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;