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 

Problema raro... violacion de acceso *** en modulo cc3250mt

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problema raro... violacion de acceso *** en modulo cc3250mt Responder citando

Hola, como ven soy nuevo por aqui, tengo una duda un tanto larga...

Estoy haciendo una aplicacion para el manejo de una caja de ahorro, para ello tengo una pequeña forma para cada operacion, depositos, prestamos, cancelacion de cuenta, etc.
Todas las funciones que utilizo(bueno casi todas) estan en la forma de la ventana principal, y pues bien en la forma donde se realizan los depositos se tiene la posibilidad de hacer un deposito pero divididos en varios, es decir digamos que quieres hacer 10 depositos de 100 cada uno, entonces solo pones 1000 y le pones repartir en 10 depositos, aqui es donde esta el problema.
Cuando el numero en que se dividira el pago es grande (digamos mayor a 30) me manda un mensaje de error de violacion de acceso en la direccion ****** en el modulo cc3250mt.dll, pero lo raro es que si solo se hacen depositos divididos en numeros pequeños todo funciona a la perfeccion...

Ahora lo que hago es un for, donde mando llamar a la funcion de la ventana principal(la que escribe en un archivo la informacion) y la llamo segun el numero de veces que se divide el deposito.

El codigo:
Código:


                        for(x = 1; x <Edit2>Text.ToInt(); x++)
                                {                   //Tipo Trans, Canti, # indicador fecha, Nombre, aval,
                                Main->Registra_Transaccion(1, Edit1->Text.ToDouble()/Edit2->Text.ToDouble(), x-1, ComboBox1->Text, "");
                                }
                        ShowMessage("Deposito(s) registrado correctamente");
                        ComboBox1->ItemIndex = -1;
                        Edit1->Text = "0";
                        Edit2->Text = "1";


Y bueno la funcion de la ventana principal lo unico que hace es recibir la informacion, guardarla en un objeto de la clase Tranza, para escribirla mas facilmente en modo binario(por cierto cuando me manda el mensaje de error ocurre justamente en la linea del fwrite)

El codigo:
Código:

                                   //Tipo Trans, Canti, # indicador fecha, Nombre, aval,
bool TMain :: Registra_Transaccion(int tipo, double cantidad, int fecha, AnsiString Nombre, AnsiString Aval)
{
FILE *writer;
Fecha DIA;
Tranza X;
char tmp[9];


writer = fopen("trans.cid", "ab");
X.Accion = tipo;
X.Cantidad = cantidad;
DIA.fija_fecha(fecha);
strcpy(X.Fecha,DIA.FEC);
DIA.getdate(X.DIA,X.MES,X.ANO);
strcpy(X.Nombre, Nombre.c_str());
strcpy(X.Aval, Aval.c_str());

if(Aval.Length() > 1)
        X.Socio = 0;
else
        X.Socio = 1;

fwrite(&X,sizeof(Tranza), 1, writer);
fclose(writer);

}


Bueno pues de antemano gracias a cualquier ayuda u orientacion...

PD:
Uso el BCB 5 enterprise suite, y bueno si les interesa o les sirve de algo mi codigo les dejo un link donde esta todo el proyecto comprimido como archivo *.rar
http://rapidshare.com/files/89271583/Caja_de_Ahorro.rar
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Hola bien venido al foro.

Mira este error proviene cuando tu software realiza muchas operaciones recurrentes y no se liberan correctamente algunas variables.

Es decir, algun objeto no borrado con delete y vuelto a utilizar.

Tambien puede darse por algun antivirus, generalmente cuando existe un fallo sobre esta libreria, es tambien por que dentro de tu programa estás usando Threads (hilos) y estos no son liberados correctamente, en pocas palabras, es un tipo desbordamiento de memoria, pero interno de borland cuando no se liberan correctamente variables creadas o estas son declaradas globalmente dentro de tu programa.

Saludos.
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Mar 05 Feb, 2008 4:57 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias por la pronta respuesta...

creo que tienes razon por una prueba que recien hice con una division en 35 no me dio error y despues hice otra(en la misma ejecucion) con 10 y ahi si me marco error, ya es un poco tarde aca, lo probare mañana y te aviso como fue...
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Eureka... javascript:emoticon('Very Happy')
Very Happy
Gracias, parece que por fin quedo...

lo chistoso de esto es que ya estaba apunto de escribir que no quedaba, pero me di cuenta que ademas de la funcion Registrar_Transaccion(...) tambien usaba otra funcion que usaba las clases tranza y fecha, ahi justamente era donde no se liberaba la memoria correctamente...
De ahora en adelante tratare de usar mas apuntadores para solicitar y liberar memoria explicitamente cuando necesite un objeto...

Les muestro el codigo del antes y el despues(es bastante chequenlo solo si les interesa o tienen problemas similares javascript:emoticon('Smile')
Smile)...
Codigo del boton se quedo casi intacto, no hago liberacion de memoria pero le hice unos pequeños cambios para evitar demasiadas llamadas innecesarias a funciones de los Edit...
Código:
void __fastcall TDep::Button1Click(TObject *Sender)
{
int x, dep=0;
double money, Ndep;

if(ComboBox1->Text.Length() > 0)
        {
        if(Edit1->Text.ToDouble()> 0)
                {
                for(x = 1; x <Ndep>ExisteDep(ComboBox1->Text, x-1))
                                {
                                dep = x;
                                break;
                                }


                if(dep == 0)
                        {
                        money = Edit1->Text.ToDouble();
                        Ndep = Edit2->Text.ToDouble();
                        for(x = 1; x <Ndep>Registra_Transaccion(1, money/Ndep, x-1, ComboBox1->Text, "");
                                }
                        ShowMessage("Deposito(s) registrado correctamente");
                        ComboBox1->ItemIndex = -1;
                        Edit1->Text = "0";
                        Edit2->Text = "1";
                        }
                else
                        {
                        AnsiString G;
                        G = "No se puede registrar al men[code]os un deposito, ya se registro un deposito dentro de " ;[/code]
                        G += dep;
                        G += "dias, no puede haber mas de un deposito por dia";
                        ShowMessage(G);
                        }
                }
        else
                {
                ShowMessage("Introduce la cantidad del deposito donde se indica...");
                }

        }
else
        {
        ShowMessage("Elige el nombre del socio o registra el nuevo socio...");
        }

}


Antes de la funcion ExisteDep(...)
Código:
bool TMain :: ExisteDep(AnsiString Nombre, int IndFec)
{
FILE *reader, *writer;
Tranza Def[2], X;
Fecha TMP;
bool returner = false;


reader = fopen("trans.cid", "rb");
TMP.fija_fecha(IndFec);

if(reader)
        {
        while(fread(Def, sizeof(Def[0]), 1, reader))
                {
                if(Def[0].Accion == 1 && strcmp(Def[0].Nombre, Nombre.c_str()) == 0)
                        {
                        if(strcmp(Def[0].Fecha, TMP.getdate()) == 0)
                                {
                                returner = true;
                                break;
                                }
                        }
                }
        }
else
        {
        fclose(reader);
        writer = fopen("trans.cid", "wb");
        fclose(writer);
        }
return returner;
}


Despues
Código:
bool TMain :: ExisteDep(AnsiString Nombre, int IndFec)
{
FILE *reader, *writer;
Tranza *Def, *X;
Fecha *TMP;
bool returner = false;

Def = new Tranza;
X = new Tranza;
TMP = new Fecha;


reader = fopen("trans.cid", "rb");
TMP->fija_fecha(IndFec);

if(reader)
        {
        while(fread(Def, sizeof(Tranza), 1, reader))
                {
                if(Def->Accion == 1 && strcmp(Def->Nombre, Nombre.c_str()) == 0)
                        {
                        if(strcmp(Def->Fecha, TMP->getdate()) == 0)
                                {
                                returner = true;
                                break;
                                }
                        }
                }
        }
else
        {
        fclose(reader);
        writer = fopen("trans.cid", "wb");
        fclose(writer);
        }

delete Def;
delete TMP;

return returner;

}


Antes de la funcion Registra_Transaccion(...)
Código:
bool TMain :: Registra_Transaccion(int tipo, double cantidad, int fecha, AnsiString Nombre, AnsiString Aval)
{
FILE *writer;
Fecha DIA;
Tranza X;
char tmp[9];


writer = fopen("trans.cid", "ab");
X.Accion = tipo;
X.Cantidad = cantidad;
DIA.fija_fecha(fecha);
strcpy(X.Fecha,DIA.FEC);
DIA.getdate(X.DIA,X.MES,X.ANO);
strcpy(X.Nombre, Nombre.c_str());
strcpy(X.Aval, Aval.c_str());

if(Aval.Length() > 1)
        X.Socio = 0;
else
        X.Socio = 1;

fwrite(&X,sizeof(Tranza), 1, writer);
fclose(writer);

}


Despues
Código:
bool TMain :: Registra_Transaccion(int tipo, double cantidad, int fecha, AnsiString Nombre, AnsiString Aval)
{
FILE *writer;
Fecha *DIA;
Tranza *X;
char tmp[9];


X = new Tranza;
DIA = new Fecha;

writer = fopen("trans.cid", "ab");
X->Accion = tipo;
X->Cantidad = cantidad;
DIA->fija_fecha(fecha);
strcpy(X->Fecha,DIA->FEC);
strcpy(X->Nombre, Nombre.c_str());
strcpy(X->Aval, Aval.c_str());

if(Aval.Length() > 1)
        X->Socio = 0;
else
        X->Socio = 1;

fwrite(X,sizeof(Tranza), 1, writer);
delete X;
delete DIA;
fclose(writer);

}



Very Happy Very Happy
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
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.