Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Mas Abnormals program terminations

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Mas Abnormals program terminations Responder citando

Tengo una aplicacion organizada segun una Form repartida en tres Paginas (Sheet), segun una TPageControl.

Para descargar el codigo asociado a: Unit1.h, y Unit1.ccp; he trasladado parte del codigo de una aplicacion a una clase.
En ese codigo hay varias funciones que reciben datos char [], y devuelven std::vector<AnsiString>

Cuando uso la clase, defino un puntero a ella, en Unit1.h:
class TForm1 : public TForm
{
public:
cl_navYnah *cLaseCoincide;
};

Luego la instancio en Unit1.cpp, en codigo que se ejecuta cuando la primera de las tres paginas, se hace Show:
cLaseCoincide = new cl_navYnah;

Cuando la primera de las tres pagians se hace Hide, hay un codigo que hace:
delete cLaseCoincide;

Durante la ejecucion del programa, uso la instancia para acceder a las funciones definidas en la clase, por ejemplo:
enNavi = (*cLaseCoincide).hayEnNAVI(atoi(campo2));

El programa Compila y Linka bien, pero.............. al ejecutarlo, (unas veces al arrancar, y otras al cambiar de Sheet) da un mensaje de:
Abnormal program termination.

¿Alguien puede indicarme donde cometo el error, y/o proporcionarme un esquema para el uso de las clases?

Saludos

beta

P.D. El problema es el mismo, si defino un puntero a la clase, en Unit1.ccp
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Holas:

Cuelga el codigo para ver el problema


Saludos
_________________
Es dificil decir q es imposible xq el sueño de ayer es la esperanza de hoy y la realidad d mañana
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: ¿Donde? Responder citando

Yo no tengo ninguna página web.
¿Donde lo cuelgo?
¿Es posible hacerlo dentro del foro?

Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Sí, copia el foro y ponlo entre dos tags Code.
Por ejemplo

[ code]

... Código del programa ...

[ /code]

Pero pones los tags sin los espacios después del corchete
_________________
Saludos, Alpha.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Pues alla va, (eso si, abreviado a lo esencial) Responder citando

Codigo de la clase que me da problemas

[ code]
//--------------------------------------------------------
// Clase con la gestion de coincidencias entre NAVI y NAH
// Domingo 25 de MARZO de 2007

//--------------------------------------------------------
using namespace std;

#include <iostream>
#include <strstrea>
#include <fstream>
#include <fstream>
#include <string>
#include <stdio>
#include <ctype>
//#include "Estructuras_NAVI.h"
#include <vcl>
#pragma hdrstop
#include <iterator>
#include <list>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
//--------------------------------------------------------

class cl_navYnah{
//...............................................
public:
cl_navYnah(void);//constructor
~cl_navYnah(void);//destructor
std::vector<AnsiString> hayEnNAVI(int campoNavi);//enNavi devuelve hasta cuatro coincidencias halladas en NAVI con el puntero NAH recibido
std::vector<AnsiString> hayEnNAH(int campoNah);//enNah devuelve hasta cuatro coincidencias halladas en NAH con el puntero NAVI recibido
int m_koincide[2][58];
private:
void cargaArray();//rellena el array con los datos de las coincidencias
};
//.................funciones externas a la clase

//++++++++++++++++++++++++++++++++++++++++++++++++++++
//=====================================================
//++++++++++++++++++++++++++++++++++++++++++++++++++++
cl_navYnah::cl_navYnah(void)
{//Constructor de la clase
cargaArray();
}

//=====================================================

cl_navYnah::~cl_navYnah(void)
{//Destructor de la clase
}

//=====================================================
std::vector<AnsiString> cl_navYnah::hayEnNAVI(int campoNavi)
//void cl_navYnah::hayEnNAVI(char campoNah[8],char *enNavi[4])
{//enNavi devuelve hasta cuatro coincidencias halladas en NAVI con el puntero NAH recibido
std::vector<AnsiString> salida(4);

salida[0] ="";
salida[1] ="";
salida[2] ="";
salida[3] ="";
char nNavi[8] = "";

int punteroNAH = campoNavi;
int k2 = 0;
int k = 0;

for(k=0; k<58;k++){//begin for
//ShowMessage(AnsiString(m_koincide[1][k]));
if(punteroNAH == m_koincide[0][k]){//begin if
//strcpy(enNavi[k2],itoa(m_koincide[0][k]));
strcpy(nNavi,"");
itoa(m_koincide[1][k],nNavi,10);
salida[k2]= AnsiString(nNavi);
k2++;
}//end if
}//end for

return salida;
}

//=====================================================
std::vector<AnsiString> cl_navYnah::hayEnNAH(int campoNah)
{//enNah devuelve hasta cuatro coincidencias halladas en NAH con el puntero NAVI recibido
std::vector<AnsiString> salida(4);

salida[0] ="";
salida[1] ="";
salida[2] ="";
salida[3] ="";
char nNah[8] = "";

int punteroNAVI = campoNah;
int k2 = 0;
int k = 0;

for(k=0; k<58;k++){//begin for
//ShowMessage(AnsiString(m_koincide[1][k]));
if(punteroNAVI == m_koincide[1][k]){//begin if
//strcpy(enNavi[k2],itoa(m_koincide[0][k]));
strcpy(nNah,"");
itoa(m_koincide[0][k],nNah,10);
salida[k2]= AnsiString(nNah);

k2++;
}//end if
}//end for

return salida;

}
//=====================================================
//============================================================
void cl_navYnah::cargaArray()
{//rellena el array con los datos de las coincidencias
int bm_koincide[2][58] = {{188,251,256,266,317,344,352,363,419,431,449,450,450,465,466,466,482,483,483,500,501,501,617,617,730,737,849,856,872,934,1322,1322,1324,1326,1327,1366,1380,1415,1417,1430,1431,1434,1441,1443,1444,1450,1451,1451,1452,1519,1568,1592,1708,1868,1903,1944,1947,2618} , {110,322,340,110,256,84,156,110,84,84,299,273,305,299,273,305,299,273,305,299,273,305,349,362,381,386,608,360,386,386,518,581,565,582,330,598,610,588,592,612,619,603,610,565,582,612,614,620,621,610,610,689,775,776,776,775,776,754}};
for (int i = 0; i < 2; i++) {
for (int c = 0; c <58; c++) {
m_koincide[i][c] = bm_koincide[i][c];
}
}
}
//=====================================================
[ /code]


Codigo de la Unit_1.ccp que usa la clase que da problemas


[ code]
//---------------------------------------------------------------------------
#include "Unit_1.h"
#include <vcl>
#include <fstream>
#include <jpeg>
//---------------------------------------------------------------------------
#pragma hdrstop
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
char sExo,eSpecie,eSpecie2;
int NivelesRamificacion,Niveles2Ramificacion;
int BotonLatinCastellano = 0;//1 = Latin, 2 = Castellano
char DesLiar(char);
TForm1 *Form1;
//cl_navYnah *cLaseCoincide;//esto esta en la parte public de Unit_1.h
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//cLaseCoincide = new cl_navYnah;
}
//======================================================================
//============ PESTAÑA-HOJA_1 ==========================================
//======================================================================
//---------------------------------------------------------------------------
void __fastcall TForm1::Button11Click(TObject *Sender)
{ //Boton oculto para activar acciones al hacer Show la Pestaña-Hoja_1
ACeroCamposNAVI();//Borra los campos expuestos de la NAVI
ACeroEspecies();//Pone a cero la existencia de un vaso en las especies NAVI
ACeroCamposNAH();//Borra los campos expuestos de la NAH

cLaseCoincide = new cl_navYnah;

LeeNAVIh1.open("newkNAVI.dat",ios::in|ios::binary|ios::ate);//Para abrir el fichero NAVI leido en la Pestaña-Hoja_1
if(!LeeNAVIh1){//begin if seguridad apertura fichero
ShowMessage("No es posible abrir el fichero: LeeNAVIh1");
throw;
}//end if seguridad apertura fichero
NumeroRegistro(1); // desplazarnos al primero de NAVI
Actualiza(); // Actualizar la información mostrada de NAVI

LeeNAHh1.open("newkNAH.dat",ios::in|ios::binary|ios::ate);//Para abrir el fichero NAVI leido en la Pestaña-Hoja_1
if(!LeeNAHh1){//begin if seguridad apertura fichero
ShowMessage("No es posible abrir el fichero: LeeNAHh1");
throw;
}//end if seguridad apertura fichero
NumeroReg(1); // desplazarnos al primero de NAH
ActualizaNAH(); // Actualizar la información mostrada de NAH
}//Boton oculto para activar acciones al hacer Show la Pestaña-Hoja_1
//---------------------------------------------------------------------------
void __fastcall TForm1::Button12Click(TObject *Sender)
{//Boton oculto para activar acciones al hacer Hide la Pestaña-Hoja_1
//ShowMessage("Salida en la HOJA 1");
LeeNAVIh1.close();//Para cerrar el fichero NAVI leido en la Pestaña-Hoja_1
LeeNAHh1.close();//Para cerrar el fichero NAH leido en la Pestaña-Hoja_1
delete cLaseCoincide;
}//Boton oculto para activar acciones al hacer Hide la Pestaña-Hoja_1
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{//Boton <para> 1) // Si no estamos en el primer registro
NumeroRegistro(NumeroRegistro()-1); // desplazarnos al anterior

Actualiza(); // Actualizar la información mostrada
}//Boton < para NAVI en Pestaña-Hoja_1
//----------------------------------------------------------------------------
//---------------------------------------------------------------------------
void TForm1::Actualiza() // Función para actualizar la información en la ficha en NAVI
{
TRegistro RegistroB,RegistroC; // y los datos de sus registros
char C_Leido;

ACeroEspecies();//Pone a cero la existencia de un vaso en las especies NAVI

if (NumeroRegistro()<NumeroRegistros>Caption = Registro.kAmpo16;//Contenido Voz en Latín en NAVI
Label10->Caption = Registro.kAmpo17;//Contenido Voz en Español en NAVI
Label11->Caption = Registro.kAmpo16;//Contenido Voz en Inglés en NAVI
Label12->Caption = Registro.kAmpo26;//Contenido Texto en NAVI
if((strlen(Registro.kAmpo18))> 0){
HayTodos(Registro.kAmpo18);
}
else{
HayPerro(Registro.kAmpo19);
HayGato(Registro.kAmpo20);
HayCaballo(Registro.kAmpo21);
HayCerdo(Registro.kAmpo22);
HayVaca(Registro.kAmpo23);
HayOveja(Registro.kAmpo24);
HayCabra(Registro.kAmpo25);
}

HaySexoNAVI(Registro.kAmpo8);//Pone a uno el sexo de un vaso en las especies NAVI
Label28->Caption = Registro.kAmpo10;//Contenido Página en NAVI
Label29->Caption = Registro.kAmpo2;//Contenido Número en NAVI

}
else { // Si estamos al final del archivo
ACeroCamposNAVI();//Borra los campos expuestos de la NAVI
ACeroEspecies();//Pone a cero la existencia de un vaso en las especies NAVI
Label12->Caption = "Fichero Terminado";//Contenido Texto en NAVI
}

NAVI_NAH_Verifica(Registro.kAmpo2);
}
//---------------------------------------------------------------------------
// Verifica si hay hasta 4 coincidencias enntre la voz de la NAVI y las existentes en NAH
void TForm1::NAVI_NAH_Verifica(char campo2[8])
{
//char enNah[4][8];

GroupBox6->Visible = false;
Button13->Visible = false;
Button14->Visible = false;
Button15->Visible = false;
Button16->Visible = false;


enNavi = cLaseCoincide->hayEnNAVI(atoi(campo2));

if((enNavi[0].Length())> 0){//begin if
GroupBox6->Visible = true;
Button13->Caption = enNavi[0];
Button13->Visible = true;
}//end if
if((enNavi[1].Length())> 0){//begin if
Button14->Caption = enNavi[1];
Button14->Visible = true;
}//end if
if((enNavi[2].Length())> 0){//begin if
Button15->Caption = enNavi[2];
Button15->Visible = true;
}//end if
if(((enNavi[3].Length()))> 0){//begin if
Button16->Caption = enNavi[3];
Button16->Visible = true;
}//end if
}
//---------------------------------------------------------------------------
//--- en NAH------
//---------------------------------------------------------------------------
void TForm1::ActualizaNAH() // Función para actualizar la información en la ficha en NAH
{
kmpoNAH RegistroB,RegistroC; // y los datos de sus registros
char C_Leido;

ACeroCamposNAH();//Pone a cero los campos de NAH
if (NumeroReg()<NumerosRegNAH>Caption = RegNAH.kAmpo17;//Contenido Voz en Latín en NAH
Label14->Caption = RegNAH.kAmpo18;//Contenido Voz en Español en NAH
Label15->Caption = RegNAH.kAmpo16;//Contenido Voz en Inglés en NAH
Label16->Caption = RegNAH.kAmpo22;//Contenido Texto expañol en NAH
Label17->Caption = RegNAH.kAmpo21;//Contenido Texto ingles en NAH
Label20->Caption = RegNAH.kAmpo10;//Página de la voz en NAH
Label21->Caption = RegNAH.kAmpo1;//Número en página de la voz en NAH

HaySexoNAH(RegNAH.kAmpo8);//Pone a uno el sexo de un vaso en las especies NAV

}
else { // Si estamos al final del archivo
ACeroCamposNAH();//Borra los campos expuestos de la NAH
Label16->Caption = "Fichero Terminado";//Contenido Texto en NAVI
}
NAH_NAVI_Verifica(RegNAH.kAmpo2);
// Mostrar la posición en el archivo
}
//---------------------------------------------------------------------------
// Verifica si hay hasta 4 coincidencias enntre la voz de la NAH y las existentes en NAVI
void TForm1::NAH_NAVI_Verifica(char campo2[8])
{
//char enNah[4][8];

GroupBox7->Visible = false;
Button17->Visible = false;
Button18->Visible = false;
Button19->Visible = false;
Button20->Visible = false;

enNah = cLaseCoincide->hayEnNAH(atoi(campo2));

if((enNah[0].Length())> 0){//begin if
GroupBox7->Visible = true;
Button17->Caption = enNah[0];
Button17->Visible = true;
}//end if
if((enNah[1].Length())> 0){//begin if
Button18->Caption = enNah[1];
Button18->Visible = true;
}//end if
if((enNah[2].Length())> 0){//begin if
Button19->Caption = enNah[2];
Button19->Visible = true;
}//end if
if((enNah[3].Length())> 0){//begin if
Button20->Caption = enNah[3];
Button20->Visible = true;
}//end if
}
//---------------------------------------------------------------------------
[ /code]


Ultima edición por beta el Jue 05 Abr, 2007 9:37 am, editado 2 veces
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Retraso Responder citando

Por cuestiones familiares, no podré acceder a este foro durante los próximos cuatro días.
Así que disculpas por adelantado, a quienes puedan ayudarme

Saludos

beta
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

HoLaS::::::

Cita:

Luego la instancio en Unit1.cpp, en codigo que se ejecuta cuando la primera de las tres paginas, se hace Show:
cLaseCoincide = new cl_navYnah;


La verdad q no veo un evento parecido a lo q mencionas en tu codigo

Cita:

class TForm1 : public TForm
{
public:
cl_navYnah *cLaseCoincide;
};


Si lo anterior es verdad el complidar deberia mandar un error al querer crear el del siguiente modo

Cita:

...
ACeroCamposNAH();//Borra los campos expuestos de la NAH
cLaseCoincide = new cl_navYnah;


esto xq cLaseCoincide lo referencias como una varible global no como una varible de la clase.

La razon xq ta compilando sin problemas es xq posiblemente en algun lao
estar declarando pero como una variable global
Código:

cl_navYnah *cLaseCoincide; //seguro lo tas declaron fuera de TForm y tbm como mencionas como miembro de Form chekea el codigo


aaa me olvidaba los guros recomiendan utilizar al minimo las variables globales siempre tendras q crear un objeto dinamico en algun evento del Form talvez en un OnShow o en el contructor del Form

Código:

__fastcall TForm2::TForm2(TComponent* Owner)
   : TForm(Owner)
{
cLaseCoincide = new cl_navYnah; //esto es una muy buena practica de progrmacion
}



Saludos
_________________
Es dificil decir q es imposible xq el sueño de ayer es la esperanza de hoy y la realidad d mañana
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Completo la informacion Responder citando

Seguramente no me he explicado bien, por lo que he completado el codigo colgado y preciso lo siguiente:

La clase (cl_navYnah), completa, (con sus encabezados y desarrollo de funciones) está toda incluida en el primer bloque incluido entre [code ] (Codigo de la clase que me da problemas). Y ello en un fichero independiente que se llama LaClase.h.

En el encabezamiento del programa principal (que no he incluido en el envio, pues creo no aporta nada) Unit_1.h; he puesto :
#include “LaClase.h”

Y en la parte public, del usuario, de Unit_1.h, pongo:
cl_navYnah *cLaseCoincide

Con ello, creo tener acceso a instanciar la clase en Unit.1.cpp. Cosa que hago en el contenido de un botón que automáticamente se ejecuta, al entrar en la Sheet de la Form.
Concretamente en:
void __fastcall TForm1::Button11Click(TObject *Sender)

Mediante:
cLaseCoincide = new cl_navYnah;

Luego, en el desarrollo del programa (Unit_1.cpp), hago uso de las funciones de la instancia, por ejemplo (enNavi = cLaseCoincide->hayEnNAVI(atoi(campo2))Wink en:
void TForm1::NAVI_NAH_Verifica(char campo2[8])


Y la destruyo cuando salgo de la Sheet, mediante un codigo (delete cLaseCoincide;) que se autoejecuta, en:
void __fastcall TForm1::Button12Click(TObject *Sender)

El programa compila y linka bien. Pero da error al ejecutarlo. ??????

Saludos y buenas vacaciones, los que las tengais ahora.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.