Programación General => C/C++ => C++ Builder => Mensaje iniciado por: ismaibz en Lunes 15 de Noviembre de 2010, 16:43
Título: Error de aceso
Publicado por: ismaibz en Lunes 15 de Noviembre de 2010, 16:43
Hola,
Estudio ingenieria informatica y estamos empezando a programar en C++ con el C++ Builder 5 y me da un error un poco raro al compilar He creado una unidad llamada UTorneo.cpp con su UTorneo.h He declarado el metodo:
int torneo_numero_equipos (TTorneo t) "TTorneo es un registro" { return t.num_equipos; }
en teoria me tiene que devolver una variable entera con el numero de equipos. Hasta ahi todo bien. Cuando hago lo siguiente: int num_equipos=torneo_numero_equipos(t); >>Codigo proporcionado por un profesor de la universidad<< o cuando quiero llamar a este metodo desde otra parte me da el siguiente error: Project Torneo.exe raised exceptcion class EAccessViolation with message 'Access violation address 0040352B in module 'Torneo.exe'.Read of address 0000000'.Process stopped.
¿A que puede ser debido este error?
Gracias
Título: Re: Error de aceso
Publicado por: m0skit0 en Lunes 15 de Noviembre de 2010, 16:52
Como no dés más detalles o más código, es imposible que lo sepamos. Semos programadores, no adivinos.
Título: Re: Error de aceso
Publicado por: ismaibz en Lunes 15 de Noviembre de 2010, 17:06
void __fastcall TFormBorrarEquipo::FormCreate(TObject *Sender) { int num_equipos=torneo_numero_equipos(t); //Todo este codigo es proporcionado por el profesor AnsiString nombre_equipo; for (int i=0; i<num_equipos; i++) { torneo_nombre_equipo(t,i,nombre_equipo); ComboBoxEquipo->Items->Values=nombre_equipo; } } //
Este es el metodo y en la cabecera de la unidad esta puesto: #include "UTorneo.h" donde esta declarado el registro TTorneo que s la siguiente:
struct TTorneo { int num_equipos; AnsiString equipos_nombres[MAX_EQUIPOS]; TPartido partidos[MAX_EQUIPOS][MAX_EQUIPOS]; TResumenEquipo clasificacion[MAX_EQUIPOS]; int equipos_posiciones[MAX_EQUIPOS]; };
el metododo int torneo_numero_equipos(TTorneo t) en teoria te devuelve num_equipos y la cuestion es que me da errores pero si me limito a darle a aceptar el programa acaba arrancando y obtiene bien el numero de equipos. Este codigo esta en una unidad llamada UFORMBorrarEquipo.cpp En otra unidad llamada UFORMClasificacion.cpp no me da ningun error
Título: Re: Error de aceso
Publicado por: m0skit0 en Lunes 15 de Noviembre de 2010, 17:14
¿Puedes poner la implementación de torneo_nombre_equipo y torneo_numero_equipos? ¿Podrías depurar y ver dónde te da dicho error en ejecución (en qué línea)?
PD: dile a tu profe de mi parte que cuando se usa C++ se usan clases, no structs <_<
EDITO: he añadido un par de preguntas más ;)
Título: Re: Error de aceso
Publicado por: ismaibz en Lunes 15 de Noviembre de 2010, 17:23
bool torneo_nombre_equipo(TTorneo t,int id_equipo, AnsiString &nombre_equipo) { if (id_equipo <= t.num_equipos && id_equipo >=0) { nombre_equipo = t.equipos_nombres[id_equipo]; return true;} else{ return false;} } esta es la implementacion y me acabo de dar cuenta de que hay un error en el trozo de antes :oops: pero no creo que el problema sea ese ni mucho menos, sino en esto: esto esta en UFORMBorrarEquipo.h private: // User declarations TTorneo &t; public: // User declarations __fastcall TFormBorrarEquipo(TComponent* Owner, TTorneo &x);
Es decir, hay que pasar nombre_equipo por referencia si queremos que nos devuelva un objeto ahí, porque de lo contrario pasará una copia del objeto y no el objeto en sí. Si no se pasa por referencia, el valor se perderá al volver del método.
Título: Re: Error de aceso
Publicado por: ismaibz en Lunes 15 de Noviembre de 2010, 17:38
El metodo de torneo_equipo_nombre no me da ningun problema es el de torneo_numero_equipos(t) tiene que ver con el acceso a la posicion de memoria y con la declaracion en el *.h pero no se exactamente que falla por que son trozos de codigo dados por el profesor de programacion y no deberia fallar....