Ошибка undefined reference - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Имеется программа. Представляет из себя поисковую систему. Пишу в dev-cpp. При компиляции вылезает одна единственная ошибка "C:\kurs\kurc\main.cpp|6|undefined reference to `base_menu()'" Из-за чего она может быть. Вроде модуль указал, а не нашел. Прошу меня поправить. Все файлы прикладываю. base.c
#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;
}
base.h
#ifndef base_h
#define base_h
 
struct _student *read_base(struct _student *); //чтение из базы
int write_base(struct _student *); //запись в базу
int free_memory(struct _student *); //освобождение памяти, занимаемой списком
 
#endif
interface.c
#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);
}
interface.h
#ifndef interface_h
#define interface_h
 
void base_menu();//прототип функции вызова меню
void about_student(struct _student *);//прототип функции сбора информации
 
#endif
main.cpp
#include <stdio.h>
#include "interface.h"
 
int main()
{
    base_menu();//вызов основного меню
    return 0;
}
student.c
#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';
}
student.h
#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;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.182 из 5