Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-07-2013
NEG1414 NEG1414 is offline
Miembro
 
Registrado: mar 2007
Posts: 177
Poder: 18
NEG1414 Va por buen camino
Imposible.. no encuentro el error

Buenas..

LLevo varios dias intentando encontrar el porque de un error (el valor de una variable varia al inicializar una clase sin razon aparente).... y me es imposible ... He reducido a la minima expresion el codigo y que siga dando el problema para hacerlo mas comprensible.
Cita:
Class TClase1
{
private :
TStringList *Lista;
public :
TClase1();
{
Lista = new TStringList;
}
}


Class TClase2 (#Include "Clase1.h")
{
private:
TClase1 ClaseHija;
public:
TClase2()
{
struct ffblk ffblk; //Obiamente en el programa original se lee un archivo en esta version reducida solo incluyo esta linea
suficiente para hacer saltar el error
}

}

class TDatos
{
private:

struct SRegistro
{
bool a;
bool b;
unsigned short Num;
};

typedef SRegistro TRegistro

struct SArchivo
{
char Nombre [16];
TRegistro ListaRegistros [100];
};


typedef SArchivo TArchivo;

public:

typedef SArchivo TArch;
TDatos()
{
}

TDatos::Archivo *TDatos::LeerDatos()
{
TDatos A;
A.ListaRegistro[12].a = true
A.ListaRegistro[12].b = false;
A.ListaRegistro[12].Num = 0;

return &A
}


PROGRAMA PRINCIPAL

#Include Clase2
#Include Datos
......
.....
TDatos *BDatos = new TDatos();
TDatos::TArch LeLosDatos;
LeLosDatos = BDatos->LeerDatos();

TClase2 *ClaseSegunda = new TClase2()
Una vez Leidos, los datos obtenidos son los correctos

LeLosDatos.ListaRegistro[12].a = true
LeLosDatos.ListaRegistro[12].b = false;
LeLosDatos.ListaRegistro[12].Num = 0;

El problema surge cuando inicializo ClaseSegunda.. los Valores de LeLosDatos se modifican sin razon aparente.

He comprobado que:

- Si Elimino de Clase 1 el TStringList *Lista NO DA ERROR
- Si elimino de Clase1 en el Constructor struct ffblk ffblk NO DA ERROR
- Si en la estructura struct SArchivo de Tclase2 sustituyo TRegistro ListaRegistros [100];
por TRegistro ListaRegistros; NO DA ERROR

Supongo que es error al declarar punteros o estructuras que solapan posiciones de memoria pero no lo veo NECESITO AYUDA..

Gracias





}
Responder Con Cita
  #2  
Antiguo 01-08-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola NEG1414.

No estoy seguro de haber entendido el problema, pero hice una prueba simple con algunas modificaciónes (respetando la esencia que entendí del código) y luego de instanciada TClase2 visualizo sin cambios los valores asignados.

Y realmente en la porción de código de tu mensaje no veo de que modo la clase TClase2 pudiera estar induciendo cambios en la clase TDatos...

De todas formas te pongo la prueba por si pudiera servirte de ayuda:
Código:
...
#include <dir.h>

class TClase1 {
private:
  TStringList* Lista;
public:
  TClase1() { Lista = new TStringList; }
};

class TClase2 : public TClase1 {
private:
  TClase1 ClaseHija;
public:
  TClase2 () { struct ffblk ffblk; }
};

class TDatos {
private:
  struct SRegistro {
    char a, b, c;
    unsigned short Num;
  };
  typedef SRegistro TRegistro;

  struct SArchivo {
    char Nombre[16];
    TRegistro ListaRegistros[100];
  };
  typedef SArchivo TArchivo;

public:
  typedef SArchivo TArch;
  TDatos(){ }
  TDatos::SArchivo* TDatos::LeerDatos() {
    TArch A;
    // Asignar unos valores para visualizar
    strcpy(A.Nombre, "UN NOMBRE");
    A.ListaRegistros[0].a   = 'X';
    A.ListaRegistros[0].b   = 'Y';
    A.ListaRegistros[0].c   = 'Z';
    A.ListaRegistros[0].Num = 115;
    return &A;
  }
};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TDatos* BDatos = new TDatos();
  TDatos::TArch LeLosDatos;

  LeLosDatos = *BDatos->LeerDatos();
  Memo1->Clear();
  Memo1->Lines->Add("Antes de instanciar Clase2\n");
  Memo1->Lines->Add(LeLosDatos.Nombre);
  Memo1->Lines->Add(LeLosDatos.ListaRegistros[0].a);
  Memo1->Lines->Add(LeLosDatos.ListaRegistros[0].b);
  Memo1->Lines->Add(LeLosDatos.ListaRegistros[0].c);
  Memo1->Lines->Add(IntToStr(LeLosDatos.ListaRegistros[0].Num));
  Memo1->Lines->Add("\n--------------------------");

  TClase2 *ClaseSegunda = new TClase2();

  Memo1->Lines->Add("Luego de instanciar Clase2\n");
  Memo1->Lines->Add(LeLosDatos.Nombre);
  Memo1->Lines->Add(LeLosDatos.ListaRegistros[0].a);
  Memo1->Lines->Add(LeLosDatos.ListaRegistros[0].b);
  Memo1->Lines->Add(LeLosDatos.ListaRegistros[0].c);
  Memo1->Lines->Add(IntToStr(LeLosDatos.ListaRegistros[0].Num));
}
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 01-08-2013
NEG1414 NEG1414 is offline
Miembro
 
Registrado: mar 2007
Posts: 177
Poder: 18
NEG1414 Va por buen camino
Gracias por contestarme...

Muestro la direccion de donde bajar el programa ejecutable (Uloerror) para facilitar la compresion del problema..

https://app.box.com/s/bni8bvn20e4zdzgz67f4

Gracias Otra Vez.
Responder Con Cita
  #4  
Antiguo 02-08-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola NEG1414.

Lo siento, intenté compilar el código para probarlo pero aparentemente me falta el package LDM70SE_B6.BPI:
Cita:
[C++ Warning] PRINCIPAL.cpp(54): W8004 'Clas2' is assigned a value that is never used
[C++ Warning] Datos.cpp(37): W8075 Suspicious pointer conversion
[Linker Fatal Error] Fatal: Unable to open file 'LMD70SE_B6.BPI'
Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 02-08-2013
NEG1414 NEG1414 is offline
Miembro
 
Registrado: mar 2007
Posts: 177
Poder: 18
NEG1414 Va por buen camino
Gracias por contestar (eres mi ultima esperanza) Mando la direccion de donde bajar el ejecutable limpio de polvo y paja .... compilado sin ningun paquete adicional...

https://app.box.com/s/uva20447qs27q9ts5o1o

Gracias otra vez...
Responder Con Cita
  #6  
Antiguo 02-08-2013
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Si me permitís, NEG1414 fíjate en este fragmento de tu código:

Código:
TDatos::TArchivo *TDatos::LeoDatos()
{

   TArchivo A;


   for(int i=0;i<100;i++)
    {
       A.ListaRegistros[12].Primero      = true;
       A.ListaRegistros[12].Segundo      = false;
       A.ListaRegistros[12].Num          = 0;
    }

   return &A;

}
Creas una variable local, la modificas y devuelves un puntero a la misma. Al salir de la función esa variable deja de existir, luego el puntero devuelto apunta a un valor inválido.

Creo que lo que pretendes es que la variable A sea de la clase y no de la función, en cuyo caso declarala como miembro de la clase TDatos. En oreo caso incorporalá como parámetro de la función LeoDatos().

Con estos cambios que te pongo debajo, funciona como creo que quieres:

Código:
class TDatos
{
  private:


    struct ERegistro
     {
        bool Primero;
        bool Segundo;
        unsigned short  Num;
     };

    typedef ERegistro TRegistro;

    struct SArchivo
     {
        char Nom[16];
        TRegistro ListaRegistros[100];
     } Archivo;                                 // DECLARO VARIABLE Archivo

    typedef SArchivo TArchivo;


  public:

    typedef SArchivo TArch;

    //Constructores
    TDatos();

    TArchivo *LeoDatos();

};
Código:
TDatos::TArchivo *TDatos::LeoDatos()
{
   for(int i=0;i<100;i++)
    {
       Archivo.ListaRegistros[12].Primero      = true;
       Archivo.ListaRegistros[12].Segundo      = false;
       Archivo.ListaRegistros[12].Num          = 0;
    }

   return &Archivo;
}
Permíteme un consejo, clarifica un poco la estructura de tu código y no abuses de typedef



Saludos.
Responder Con Cita
  #7  
Antiguo 03-08-2013
NEG1414 NEG1414 is offline
Miembro
 
Registrado: mar 2007
Posts: 177
Poder: 18
NEG1414 Va por buen camino
Muchisimas gracias a los dos por atenderme....

Escafandra (Master) con tu explicacion he entendido donde esta el problema, la verdad es que los punteros siempre se me han atascascado...

Gracias otra vez..

Nota: tomare en cuenta tus consejos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
No Encuentro el Error del Trigger en FireBird 2.5 teletranx Firebird e Interbase 7 06-06-2011 22:03:25
No encuentro el error en esta sentencia Sql..... verito_83mdq SQL 13 14-01-2011 18:32:10
No Encuentro El Error En Este *.rc MON___ Varios 4 05-09-2007 13:50:28
Es imposible un lector de DVD???? gandalf_27 Varios 2 15-06-2006 16:07:40


La franja horaria es GMT +2. Ahora son las 07:30:04.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi