 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
beta Lt JG

Registrado: 01 Abr 2006Mensajes: 74
|
Publicado: Lun 02 Abr, 2007 7:48 pm Asunto: Mas Abnormals program terminations |
|
|
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 |
|
 |
Jumanor Lt


Registrado: 28 Feb 2003Mensajes: 91Ubicación: tacna-Peru
|
Publicado: Mar 03 Abr, 2007 1:56 am Asunto: |
|
|
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 |
|
 |
beta Lt JG

Registrado: 01 Abr 2006Mensajes: 74
|
Publicado: Mie 04 Abr, 2007 7:23 am Asunto: ¿Donde? |
|
|
Yo no tengo ninguna página web.
¿Donde lo cuelgo?
¿Es posible hacerlo dentro del foro?
Saludos |
|
| Volver arriba |
|
 |
Alpha120 Lt


Registrado: 11 Mar 2007Mensajes: 99Ubicación: Sevilla, España
|
Publicado: Mie 04 Abr, 2007 1:02 pm Asunto: |
|
|
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 |
|
 |
beta Lt JG

Registrado: 01 Abr 2006Mensajes: 74
|
Publicado: Mie 04 Abr, 2007 11:26 pm Asunto: Pues alla va, (eso si, abreviado a lo esencial) |
|
|
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 |
|
 |
beta Lt JG

Registrado: 01 Abr 2006Mensajes: 74
|
Publicado: Mie 04 Abr, 2007 11:28 pm Asunto: Retraso |
|
|
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 |
|
 |
Jumanor Lt


Registrado: 28 Feb 2003Mensajes: 91Ubicación: tacna-Peru
|
Publicado: Jue 05 Abr, 2007 9:24 am Asunto: |
|
|
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 |
|
 |
beta Lt JG

Registrado: 01 Abr 2006Mensajes: 74
|
Publicado: Jue 05 Abr, 2007 9:45 am Asunto: Completo la informacion |
|
|
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)) 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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|