[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