[C con Clase] un acces en c++
Carlos Pizarro (GM)
carlopiza en gmail.com
Jue Oct 28 11:24:38 CEST 2010
Ese error es porque cuando defines nombre1 no le asignas espacio :
char nombre1[];
deberia ser
char nombre1[30];
y eso malograba el valor de max3 (que estaba justo definida abajo de el),
cuando le hacias una asignacion.
Te atacho un listado con algunos cambios aqui y alla y que me parece que si
funciona pero lo malo es que solo funciona con el Dev-Cpp (lo puedes
instalar y lo tienes junto con el TurboC++).
#include<stdio.h>
#include<iostream>
#include<conio.h>
#include<windows.h>
using namespace std;
void GotoXY(int x, int y);
void GetXY(int *x, int *y);
void ClrEol();
void ClrLine(int y);
void ClrScr(void);
class campo
{
string nombre3; //nombre del campo
int tipo;
string nombretipo;
string descripcion; //descripcion
public:
void leer3();
void presenta();
} ;
void campo::leer3()
{
int op;
cout<<"\n Nombre del campo: ";
cin >> nombre3;
//aki ira el tipo de dato k contendra el atributo
cout<<"\n Tipo de dato: ";
cout<<"\n [1]Entero";
cout<<"\n [2]Decimal";
cout<<"\n [3]Fecha/hora";
cout<<"\n [4]cadena";
cout<<"\n Ingrese opcion: ";
cin>>op;
switch (op)
{
case 1:
nombretipo="entero";
break;
case 2:
nombretipo="decimal";
break;
case 3:
nombretipo="fecha/hora";
break;
case 4:
nombretipo="cadena";
break;
}
cout<<"\n Descripcion del campo: ";
cin >> descripcion;
}
void campo::presenta()
{
cout<<nombre3;
cout<<" ";
cout<<nombretipo;
cout<<" ";
cout<<descripcion;
getch();
}
///////////////////////////////////////////////////////////////////////////////////////////
class tabla
{
char nombre2[20]; /*nombre de la tabla*/
int n2;
int max2; //maximo de campos
campo* data2; //arreglo de campos
public:
tabla() //constructor
{
n2=max2=0;
data2=NULL;
};
void leernombre2();
void inserta2(campo);
void crece2();
void procesa2();
void visualiza2();
string NombreTabla() { return nombre2; };
~tabla()
{
delete data2; //destructor
};
};
//definiendo funciones
void tabla::leernombre2()
{
cout<<"\n\t TABLA: ";
cout<<"\n nombre: ";
fflush(stdin);
gets(nombre2);
}
void tabla::procesa2()
{
campo C;
int op;
do
{
ClrScr();
cout<<"\t MENU :\n";
cout<<"[1] Agregar campo:\n";
cout<<"[2]Ver campos:\n";
cout<<"[3]Salir:\n";
cout<<" Ingrese opcion: ";
cin>>op;
switch (op)
{
case 1:
C.leer3();
inserta2(C);
break;
case 2:
visualiza2();
break;
}//fin switch
}
while (!(op==3));
}// fin procesa
void tabla::inserta2(campo c)
{
if (n2==max2)
crece2(); // es llamada cuando yano hay espacio
data2[n2]=c;
n2++;
}
void tabla::crece2()
{
campo* temp2;
temp2= new campo [max2 + 5]; //se reserva 5 espacios mas al arreglo data2
for (int i=0; i<n2; i++) //aqui temp2 se llena hasta donde llegue el
arreglo data2 kedando aun 5 espacios
temp2[i]=data2[i];
delete data2;
data2=temp2; // ahora data tiene 5 espacios mas para almacenar
max2+=5; // su max tbm debe ser aumentado en 5
}
void tabla:: visualiza2()
{
if (n2 > 0)
{
cout<<"\nCampos: \n";
for (int i=0; i<n2; i++)
data2[i].presenta();
}
else
cout<<"\nNO HAY CAMPOS";
}
///////////////////////////////////////////////////////////////////////////////////////////
class basedatos
{
char nombre1[30];
int max3; //Maximo de tablas
int n3;
tabla *data; //arreglo de tablas
public:
basedatos(); //constructor
void leernombre1();
void inserta(tabla);
void crece();
void procesa();
void visualiza3();
~basedatos()
{
delete data; //destructor
}
};
//definiendo funciones
basedatos::basedatos() //CONSTRUCTOR
{
max3 = n3 = 0;
cout << "Constructor - max3 : " << max3 << endl;
data=NULL;
}
void basedatos::leernombre1()
{
cout<<"\n\t BASE DE DATOS: ";
cout<<"\n nombre: ";
fflush(stdin);
gets(nombre1);
}
void basedatos::procesa()
{
tabla T;
int op;
do
{
ClrScr();
cout<<"\t MENU :\n";
cout<<"[1]Crear una tabla:\n";
cout<<"[2]Ver tablas:\n";
cout<<"[3]Salir:\n";
cout<<" Ingrese opcion: ";
cin>>op;
switch (op)
{
case 1:
T.leernombre2();
T.procesa2();
inserta(T);
break;
case 2:
visualiza3();
break;
}//fin switch
}
while (!(op==3));
}// fin procesa
void basedatos::inserta(tabla t)
{
cout << endl << " **** LLEGO 1 **** " << endl;
cout << "n3 : " << n3 << endl;
cout << "max3 : " << max3 << endl;
if (n3==max3)
crece(); // es llamada cuando yano hay espacio
cout << endl << " **** LLEGO 1.1 **** " << endl;
data[n3]=t;
cout << endl << " **** LLEGO 1.2 **** " << endl;
n3++;
}
void basedatos::crece()
{
tabla* temp;
cout << endl << " **** LLEGO 2 **** " << endl;
temp= new tabla [max3 + 5]; //se reserva 5 espacios mas al arreglo data
for (int i=0; i<n3; i++) //aqui temp se llena hasta donde llegue el
arreglo data kedando aun 5 espacios
temp[i]=data[i];
delete data;
data=temp; // ahora data tiene 5 espacios mas para almacenar
max3+=5; // su max tbm debe ser aumentado en 5
}
void basedatos:: visualiza3()
{
if (n3 > 0)
{
cout << endl << " TABLAS " << endl;
cout << endl << "--------" << endl;
for (int i=0; i<n3; i++)
{
cout << data[i].NombreTabla() << endl;
}
}
else
cout<<"\nNO HAY TABLAS";
}
int main()
{
basedatos B;
ClrScr();
B.leernombre1();
B.procesa();
getch();
return 0;
}
// ---------------------------------------------------------
// Funciones de manejo de Pantalla
// ---------------------------------------------------------
void GotoXY(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void GetXY(int *x, int *y)
{
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
*x = csbInfo.dwCursorPosition.X;
*y = csbInfo.dwCursorPosition.Y;
}
void ClrEol()
{
int i;
int x, y;
COORD a = { 80, 1 };
COORD b;
SMALL_RECT r;
DWORD len;
CHAR_INFO str[81];
for(i = 0; i < 80; i++) {
str[i].Char.AsciiChar = ' ';
str[i].Attributes = 0x07;
}
GetXY(&x, &y);
len = 80 - x;
b.X = 0;
b.Y = 0;
r.Top = y;
r.Left = x;
r.Bottom = y+1;
r.Right = (SHORT)(x + len);
WriteConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE), str, a, b, &r);
}
void ClrLine(int y)
{
GotoXY(0, y);
ClrEol();
}
void ClrScr(void)
{
COORD a = {0,0};
DWORD nwrite;
FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x07, 2000, a,
&nwrite);
}
--------------- Original Message ---------------
From: "wolf" <wolverine_ch en hotmail.com>
To: <cconclase en listas.conclase.net>
Sent: Tuesday, October 26, 2010 7:02 PM
Subject: Re: [C con Clase] un acces en c++
ahh es que yo uso el turbo C aqui los problemas son los submenus que he
hecho por ejemplo en el submenu para ingresar los campos cuando se ingresa
la opcion salir me bota de todo el turbo c y me sale este cuadro que dice:
turboc++ ide
LA CPU NTVDM ha encontrado una instruccion no permitida CS:23ff etc..
tbm tngo problemas ha la hora de presentar los campos ingresados solo se
muestra el primero que ingrese y los demas no...
_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Más información sobre la lista de distribución Cconclase