Programación General > C++ Builder
Porque este error en el Codigo
(1/1)
Jesmi89:
Hola a todos, quisiera saber si alguien posria atudarme a saber porq me aparece el siguiente error en este codigo.
[*]Too much global data defined in file
Gracias les agradeceria mucho
--- Código: C++ ---#include<iostream.h>#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<time.h>#include<fstream.h> char inscripcion( FILE *abrir);char consulta( FILE *abrir);char modificar( FILE *abrir);char eliminar( FILE *abrir);void listado( FILE *abrir);char borrar( FILE *abrir);char menualumno(); int tvs = 0;#define capacidad 300struct alumnos{ char carne[7]; char nombre[45]; char carrera[55]; char direccion[45]; char semestre[2]; char seccion[2]; char correo[20];}; //fin struct alumnos struct alumnos alu[capacidad];struct alumnos alu2[capacidad];struct alumnos alu3[capacidad];struct alumnos alu4[capacidad]; //declaracion de 4 objetos alumnos char main(){ bool salir = false; while (salir == false) { int opcion; int opconsulta=1; FILE *abrir; clrscr(); cout<<"ttttBIENVENIDOnn"<<endl; cout<<"tttt OPCIONES ALUMNOSnnnn"<<endl; cout<<"ttt1) INSCRIPCIONn "<<endl; cout<<"ttt2) CONSULTASn"<<endl; cout<<"ttt3) MODIFICARn"<<endl; cout<<"ttt4) ELIMINARn"<<endl; cout<<"ttt50) ELIMINAR BASE DE DATOSn"<<endl; cout<<"ttt5) SALIRn"<<endl; cin>> opcion; switch(opcion) { case 1: inscripcion(abrir); break; case 2: { cout<<endl<<endl<<endl<<"1 ver alumnos individuales"<<endl; cout<<"2 ver listado de todos los alumnos"<<endl<<endl; cin>>opconsulta; switch (opconsulta) { case 1: consulta(abrir); break; case 2: listado(abrir); break; default: cout<<"opcion incorrecta"; } //fin switch }//fin case 2 break; case 3: modificar(abrir); break; case 4: eliminar(abrir); break; case 5: salir = true; break; case 50: borrar(abrir); break; default: cout<<"OPCION NO VALIDA"<<endl; } //fin del while}//fin primer switch}//fin main char borrar(FILE *abrir){ remove("alumnos.txt"); remove("contador.txt");} char inscripcion(FILE *abrir){ char numero[7]; ifstream abr; abr.open("contador.txt",ios::in); abr>>tvs; abr.close(); tvs++; itoa(tvs,numero,10); fseek(abrir, 0L, SEEK_END); abrir=fopen("alumnos.txt","a+"); cout<<"ttINSCRIPCIONn"<<endl; cout<<"CARNE No: "<<tvs<<endl; cout<<"INGRESE LO SIGUIENTE"<<endl; strcpy(alu[tvs].carne, numero); fflush(stdin); cout<<" NOMBRE"<<endl; gets(alu[tvs].nombre); fflush(stdin); cout<<" DIRECCION"<<endl; gets(alu[tvs].direccion); fflush(stdin); cout<<" CORREO"<<endl; gets(alu[tvs].correo); fflush(stdin); cout<<"CARRERA"<<endl; gets(alu[tvs].carrera);fflush(stdin); cout<<"SEMESTRE"<<endl; gets(alu[tvs].semestre);fflush(stdin); cout<<" SECCION"<<endl; gets(alu[tvs].seccion); fflush(stdin); fwrite(&alu[tvs],sizeof(struct alumnos),1,abrir); fseek(abrir, 0L, SEEK_SET); fclose(abrir); ofstream ab; ab.open("contador.txt",ios::trunc); ab<<tvs; ab.close(); }char consulta( FILE *abrir){ int num; ifstream abr; abr.open("contador.txt",ios::in); abr>>tvs; abr.close(); cout<<"INGRESE EL No. DE CARNE"<<endl; cin>>num; abrir = fopen("alumnos.txt", "r"); if(abrir == NULL) { cout<<"nALUMNOS NO EXISTE! nPOR FAVOR CREELO"<<endl; } else { num--; fread(&alu2, sizeof(alumnos),tvs, abrir); cout<<"CARNE: "<<alu2[num].carne<<endl; cout<<"NOMBRES: "<<alu2[num].nombre<<endl; cout<<"CARRERA: "<<alu2[num].carrera<<endl; cout<<"DIRECCION: "<<alu2[num].direccion<<endl; cout<<"SEMESTRE: "<<alu2[num].semestre<<endl; cout<<"SECCION: "<<alu2[num].seccion<<endl; cout<<"CORREO: "<<alu2[num].correo<<endl<<endl<<endl; } fclose(abrir); getch();} char modificar( FILE *abrir){ int num; abrir = fopen("alumnos.txt", "r+"); ifstream abr; abr.open("contador.txt",ios::in); abr>>tvs; abr.close(); fread(&alu3, sizeof(alumnos),tvs, abrir); fclose(abrir); //listado(abrir); cout<<"INGRESE EL No. DE CARNE"<<endl; cin>>num; if(abrir == NULL) { cout<<"nALUMNOS NO EXISTE! nPOR FAVOR CREELO"<<endl; } if (num > tvs) { cout<<endl<<"alumno no registrado"<<endl; getche();} else { num--; cout<<" NOMBRE"<<endl; gets(alu3[num].nombre); cout<<" DIRECCION"<<endl; gets(alu3[num].direccion); cout<<" CORREO"<<endl; gets(alu3[num].correo); cout<<"CARRERA"<<endl; gets(alu3[num].carrera); cout<<"SEMESTRE"<<endl; gets(alu3[num].semestre); cout<<" SECCION"<<endl; gets(alu3[num].seccion); cout<<"n"; abrir = fopen("alumnos.txt", "w+"); fwrite(&alu3,sizeof(struct alumnos),tvs,abrir); fseek(abrir, 0L, SEEK_END); fclose(abrir); } fclose(abrir);} char eliminar( FILE *abrir){ char decision = 'n'; int num; abrir = fopen("alumnos.txt", "r+"); ifstream abr; abr.open("contador.txt",ios::in); abr>>tvs; abr.close(); fread(&alu4, sizeof(alumnos),tvs, abrir); fclose(abrir); cout<<"ttELIMINARn"<<endl; cout<<"INGRESE EL No. DE CARNE"<<endl; cin>>num; if (num>tvs) { cout<<"El registro que desea eliminar NO existe"; } // fin del if else { num--; cout<<"CARNE: "<<alu4[num].carne<<endl; cout<<"NOMBRES: "<<alu4[num].nombre<<endl; cout<<"CARRERA: "<<alu4[num].carrera<<endl; cout<<"DIRECCION: "<<alu4[num].direccion<<endl; cout<<"SEMESTRE: "<<alu4[num].semestre<<endl; cout<<"SECCION: "<<alu4[num].seccion<<endl; cout<<"CORREO: "<<alu4[num].correo<<endl<<endl<<endl; cout<<endl<<endl<<"Desea eliminar este alumno? S/N"<<endl; cin>>decision; switch (decision) { case 'n': return 'n'; break; case 's': { strcpy(alu4[num].nombre, "ELIMINADO"); strcpy(alu4[num].direccion, "ELIMINADO"); strcpy(alu4[num].correo, "ELIMINADO"); strcpy(alu4[num].carrera, "ELIMINADO"); strcpy(alu4[num].semestre, "0"); strcpy(alu4[num].seccion, "0"); abrir = fopen("alumnos.txt", "w+"); fwrite(&alu4,sizeof(struct alumnos),tvs,abrir); fseek(abrir, 0L, SEEK_END); fclose(abrir); cout<<"EL CARNE No: "<<(num+1)<<" HA SIDO ELIMINADO"<<endl; } //fin del case }// fin del switch getche(); } //fin del else} void listado(FILE *abrir){ abrir = fopen("alumnos.txt", "r+"); ifstream abr; abr.open("contador.txt",ios::in); abr>>tvs; abr.close(); fread(&alu3, sizeof(alumnos),tvs, abrir); fclose(abrir); for (int i= 0; i<tvs; i++) { cout<<"CARNE: "<<alu3[i].carne<<endl; cout<<"NOMBRES: "<<alu3[i].nombre<<endl; cout<<"CARRERA: "<<alu3[i].carrera<<endl; cout<<"DIRECCION: "<<alu3[i].direccion<<endl; cout<<"SEMESTRE: "<<alu3[i].semestre<<endl; cout<<"SECCION: "<<alu3[i].seccion<<endl; cout<<"CORREO: "<<alu3[i].correo<<endl<<endl<<endl; } getche();}
:good:
ProfesorX:
--- Cita de: "Jesmi89" ---Hola a todos, quisiera saber si alguien posria atudarme a saber porq me aparece el siguiente error en este codigo.
[*]Too much global data defined in file
--- Fin de la cita ---
El problema es que estas sobrepasando el tamaño maximo que puedes utilizar para variables globales, que si no mal recuerdo es de 2 elevado a la 16, o sea, 65536 bytes.
Solamente haz cuentas:
El tamaño (en bytes) de tu estructura alumnos es 7+45+55+45+2+2+20=176
Luego defines 4 arreglos de 300 alumnos, por lo tanto, la cantidad de memoria utilizada es 4 * 300 * 176 = 211200, y como dje antes, el maximo es 65536.
Una solucion podria ser que utilices memoria dinamica (new o malloc), en lugar de memoria estatica, para definir tus arreglos, ya que la memoria dinamica no tiene ese limite, solo esta limitada por la cantidad de memoria que tengas instalada en tu maquina, pero aun asi me parece que es exagerado que quieras los 300 * 4 registros de alumnos en la memoria.
La solucion, mas correcta a mi a parecer, es que solo leas una parte del archivo, de 1 a 20 registros a la vez, quizas un poco mas, pero no los 300, y que implementes un algoritmo que te permita tener acceso a tus 300 registros sin tener que subirlos todos a la memoria a la vez, (pista, busca informacion sobre hash y busqueda en archivos) que es demasiado ineficiente.
Saludos :)
Navegación
Ir a la versión completa