我正在使用Dev C ++编译器。 那么,这里有什么问题,我在addRecord模块中遇到错误。
编译日志:
Compiler: Default compiler
Executing g++.exe...
g++.exe "C:\SAI,MANI\test_add(09.03.2013).cpp" -o "C:\Users\Ravitheja\Desktop\C and C++\Projects\SAI,MANI\test_add(09.03.2013).exe" -O3 -g3
-I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"C:\Dev-Cpp\include\c++\3.4.2\backward" -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32" -I"C:\Dev-Cpp\include\c++\3.4.2" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib" -g3
C:\SAI,MANI\test_add(09.03.2013).cpp: In function `void addRecord(Record*)':
C:\SAI,MANI\test_add(09.03.2013).cpp:151: error: using typedef-name `Record' after `struct'
C:\SAI,MANI\test_add(09.03.2013).cpp:151: error: cannot convert `Record*' to `Database*' in assignment
C:\SAI,MANI\test_add(09.03.2013).cpp:153: error: expected primary-expression before '*' token
C:\SAI,MANI\test_add(09.03.2013).cpp:153: error: expected primary-expression before ')' token
C:\SAI,MANI\test_add(09.03.2013).cpp:153: error: expected `;' before "malloc"
C:\SAI,MANI\test_add(09.03.2013).cpp:154: error: cannot convert `Record*' to `Database*' in assignment
C:\SAI,MANI\test_add(09.03.2013).cpp: In function `void viewRecords(Record*)':
C:\SAI,MANI\test_add(09.03.2013).cpp:180: error: cannot convert `Database*' to `Record*' in assignment
C:\SAI,MANI\test_add(09.03.2013).cpp: In function `int getDate(date*)':
C:SAI,MANI\test_add(09.03.2013).cpp:187: error: conversion from `date*' to non-scalar type `date' requested
Execution terminated
特别是在这一行中,
x->next = (Record*)malloc(sizeof(struct Record));
我收到错误:在分配时无法将'Record *'转换为'Database *',但Record和Database之间有什么区别,因为我已经对它们进行了类型定义。
我还没有编写所有模块,我只是想测试我的addRecord()和viewRecords(),但它不起作用。如何纠正这些错误?
#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<malloc.h>
using namespace std;
// global declarations and function prototypes....
const int TRUE = 1,FALSE = 0,SUCCESS = 1;
const int SUBJECTS = 3;
typedef char String[25];
// date structure , a better way to store dates.
struct date
{
int day,month,year;
};
// Database structure , the main double linked list which stores all the information.
typedef struct DataBase
{
String Name,FatherName,Address,Hometown;
float Marks[SUBJECTS],Total,Percentage;
date DOB;
long int RegNo,PhoneNumber;
struct Database *previous; // the addresses of the next and previous nodes in the dll.
struct Database *next;
}Record;
int main();
int menu(); // for displaying menu.
void process(int,Record*); // for processing the menu.
void addRecord(Record*); // for adding a record.
void delRecord(Record*); // for deleting a record.
void modRecord(Record*); // for modifying values of a record.
void sortRecords(Record*); // for sorting records.
void filterRecords(Record*); // for filtering records.
void searchRecords(Record*); // for searching a record.
void viewRecords(Record*); // for viewing records (all).
int getDate(date*); // for getting input for a date.
void copyDate(date,date*); // for copying two date variables.
int checkDate(date); // for checking wether a given date is correct.
char *toString(int); // for displaying month name given the month number.
void copyRecord(Record*,Record*); // for copying contents of one record into another.
// main function...
int main()
{
Record *r;
r = (Record*) malloc (sizeof(Record));
r->next = NULL;
r->previous = NULL;
while(1)
{
process(menu(),r);
}
}
// the menu function.
int menu()
{
static int choice;
cout<<"\n\t\t\t Menu";
cout<<"\n\t\t\t 1.Add Records ";
cout<<"\n\t\t\t 2.Delete Records";
cout<<"\n\t\t\t 3.Modify Records";
cout<<"\n\t\t\t 4.Sort Records";
cout<<"\n\t\t\t 5.Filter Records";
cout<<"\n\t\t\t 6.Search Records";
cout<<"\n\t\t\t 7.View Records";
cout<<"\n\t\t\t 8.Exit";
cout<<"\n\t\t\t YOUR CHOICE : ";
cin>>choice;
if(choice>=1 && choice<=7) return choice;
else if(choice == 8) exit(0);
else
{
cout<<"\n Sorry, that's an invalid choice.";
cout<<"\n Please Try Again.";
menu();
}
}
void process(int choice,Record *r)
{
switch(choice)
{
case 1:
addRecord(r);
break;
case 2:
delRecord(r);
break;
case 3:
modRecord(r);
break;
case 4:
sortRecords(r);
break;
case 5:
filterRecords(r);
break;
case 6:
searchRecords(r);
break;
case 7:
viewRecords(r);
break;
}
}
void addRecord(Record *x)
{
date *t;
t = (date*) malloc ( sizeof(date) );
fflush(stdin);
Record *temp; temp = (Record*) malloc ( sizeof(Record) );
cout<<"\n Enter the following details ..... "<<endl;
cout<<"\n Name : ";
gets(temp->Name);
cout<<"\n Father's Name : ";
gets(temp->FatherName);
cout<<"\n Address :";
gets(temp->Address);
cout<<"\n Hometown : ";
gets(temp->Hometown);
cout<<"\n Register Number : ";
cin>>temp->RegNo;
temp->Total = 0;
for(int i=0;i<SUBJECTS;i++)
{
cin>>temp->Marks[i];
temp->Total += temp->Marks[i];
}
temp->Percentage = temp->Total/SUBJECTS;
cout<<"\n Total Marks : "<<temp->Total;
cout<<"\n\n Percentage : "<<temp->Percentage;
if(getDate(t) == SUCCESS) // trick!
copyDate(temp->DOB,t);
x->next = (Record*)malloc(sizeof(struct Record));
copyRecord(x,temp);
temp->previous = (Record*)malloc(struct Database);
temp->previous = x;
temp->next = NULL;
return;
}
void viewRecords(Record *x)
{
if(x->next == NULL && x->previous == NULL)
{
cout<<"\n There are no records to view.";
cout<<"\n Please Add some records and then try again!";
return;
}
do
{
cout<<"\n Name : "<<x->Name;
cout<<"\n Father's Name : "<<x->FatherName;
cout<<"\n Address : "<<x->Address;
cout<<"\n Hometown : "<<x->Hometown;
cout<<"\n Register Number : "<<x->RegNo;
for(int i=0;i<SUBJECTS;i++)
cout<<"\n Mark "<<i+1<<" : "<<x->Marks[i];
cout<<"\n Total Marks : "<<x->Total<<endl;
cout<<"\n Percentage : "<<x->Percentage;
cout<<"\n Date Of Birth : "<<x->DOB.day<<"th"<<toString(x->DOB.month)<<" "<<x->DOB.year;
if(x->next == NULL) break;
}while((x=x->next)!=NULL);
}
int getDate(date *t)
{
cout<<"\nDate of birth (dd:mm:yyyy) : ";
scanf("%d:%d:%d",&t->day,&t->month,&t->year);
if(checkDate(t) == SUCCESS)
return SUCCESS;
else
{
cout<<"\n Sorry, that's not a valid Date.";
cout<<"\n Please Try Again,"<<endl;
getDate(t);
}
}
void copyDate(date d1,date *d2)
{
d1.day = d2->day;
d1.month = d2->month;
d1.year = d2->year;
return;
}
int checkDate(date *x)
{
int leap = (x->year%4==0)?TRUE:FALSE;
if( ( x->day<=0 || x->day > 31 ) || (x->month>12 || x->month<=0) || (x->year<1900 || x->year > 2008) )
return FALSE;
else if(leap == TRUE && x->month == 2 && (x->day>29))
return FALSE;
else if(leap == FALSE && x->month == 2 && (x->day>28))
return FALSE;
else if( (x->month == 4 || x->month == 6 || x->month == 9 || x->month == 11) && x->month >= 31 )
return FALSE;
else
return TRUE;
}
char *toString(int m)
{
char *t = (char*) malloc (sizeof(char)*4);
switch(m)
{
case 1 : t = "Jan"; break;
case 2 : t = "Feb"; break;
case 3 : t = "Mar"; break;
case 4 : t = "Apr"; break;
case 5 : t = "May"; break;
case 6 : t = "Jun"; break;
case 7 : t = "Jul"; break;
case 8 : t = "Aug"; break;
case 9 : t = "Sep"; break;
case 10 : t = "Oct"; break;
case 11 : t = "Nov"; break;
case 12 : t = "Dec"; break;
}
return t;
}
答案 0 :(得分:2)
我认为问题的根源是Record
是struct Database
的typedef名称,第一个错误(使用struct
关键字Record
)正在引导以后的错误。
由于这是C ++,请完全转储malloc
并使用new
运算符:
x->next = new Record;
答案 1 :(得分:1)
您不需要为typedef ..
使用struct关键字所以,
x->next = (Record*)malloc(sizeof(struct Record));
应该是
x->next = (Record*)malloc(sizeof(Record));
注意:
您最好使用new
代替malloc
答案 2 :(得分:1)
你应该决定是否要编写C或C ++,因为它们是不同的语言。
你的主要问题“记录和数据库之间有什么区别”的答案是
typedef struct Database
{
// ...
} Record;
为结构引入了几个名称。
在C中会有两个:struct Database
和Record
在C ++中,例如你的代码,有三个:与C中相同的两个,加上Database
。
在这两种语言中都没有名为struct Record
的类型,这就是你得到第一个错误的原因:“在'struct'之后使用typedef-name'Record'。”
您应该始终先修复第一个错误。
(我不确定这是否可以解决你的问题,因为你的g ++有点过时了 - 如果它真的是版本3.4.2,它已经差不多10年了,你应该考虑升级)。