En mi programa, ¿cuál es la diferencia entre Record* y Databse*?

Estoy usando el compilador Dev C++. Entonces, ¿qué está mal aquí? Recibo errores en el módulo addRecord.

El registro de compilación:

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

particularmente en esta línea,

x->next = (Record*)malloc(sizeof(struct Record));

Recibo un error: no puedo convertir 'Registro*' a 'Base de datos*' en la asignación, pero cuál es la diferencia entre Registro y Base de datos, ya que los he tipeado.

Todavía no he escrito todos los módulos, solo quería probar mi addRecord() y viewRecords() , pero no funciona. ¿Cómo corregir estos errores?

#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;
}

preguntado el 09 de marzo de 13 a las 14:03

¡Esto es C++, no C! No hay espacios de nombres en C. -

No le encuentro el sentido a tu casting.... -

@Sascha: Tiene sentido porque el programa es C++ y no C. -

3 Respuestas

Creo que la raíz del problema es que Record es un nombre typedef para struct Database, y el primer error (usando el struct palabra clave con Record) está conduciendo a los errores posteriores.

Dado que esto es C ++, volcar malloc por completo y utilizar el new operador:

x->next = new Record;

respondido 09 mar '13, 14:03

Gracias John, es una buena idea, pero solo quiero familiarizarme con la implementación de malloc(). - Ravitheja

No necesita usar la palabra clave struct para typedef.

así,

x->next = (Record*)malloc(sizeof(struct Record));

debiera ser

x->next = (Record*)malloc(sizeof(Record));

Nota:

Es mejor que uses new en lugar de malloc

respondido 09 mar '13, 14:03

Esto no responde a la Q porque: 1. El programa es C++ y no C, Usando malloc es incorrecto para empezar. Hay un std::string miembro en la estructura. 2. Si en absoluto fuera C, aún así este no es un buen consejo, idealmente uno usaría x->next = malloc(*(x->next)); - Guardar

@AlokSave creo que no es un std::string, pero le di ese typedef char String[25]; por lo que en realidad no es una clase de cadena, sino un alias para char[25]. - Ravitheja

@Ravitheja: ¿Cómo estás usando un std::cout en un programa en C? ¿No sabe si está escribiendo un programa en C o un programa en C++? - Guardar

@AlokSave: Lo siento, pero he usado std::cout porque es más fácil de usar que printf(). - Ravitheja

Debes decidir si quieres escribir C o C++, ya que son lenguajes diferentes.

La respuesta a su pregunta principal, "¿cuál es la diferencia entre registro y base de datos", es que

typedef struct Database
{
   // ...
} Record;

introduce varios nombres para la estructura.

En C serían dos: struct Database y Record.
En C++, como su código, hay tres: los mismos dos que en C, más solo Database.

En ninguno de los dos idiomas hay un tipo llamado struct Record, por lo que aparece el primer error: "using typedef-name 'Record' after 'struct'".
Siempre debe corregir el primer error primero.

(No estoy seguro de si esto solucionaría su problema ya que su g ++ parece un poco anticuado; si realmente es la versión 3.4.2, tiene casi 10 años y debería considerar actualizar).

respondido 09 mar '13, 15:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.