• Jueves 14 de Noviembre de 2024, 16:44

Autor Tema:  Error de aceso  (Leído 1907 veces)

ismaibz

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Error de aceso
« en: Lunes 15 de Noviembre de 2010, 16:43 »
0
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

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error de aceso
« Respuesta #1 en: Lunes 15 de Noviembre de 2010, 16:52 »
0
Como no dés más detalles o más código, es imposible que lo sepamos. Semos programadores, no adivinos.

ismaibz

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Error de aceso
« Respuesta #2 en: Lunes 15 de Noviembre de 2010, 17:06 »
0
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

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error de aceso
« Respuesta #3 en: Lunes 15 de Noviembre de 2010, 17:14 »
0
¿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  &lt;_&lt;

EDITO: he añadido un par de preguntas más  ;)
« última modificación: Lunes 15 de Noviembre de 2010, 17:24 por m0skit0 »

ismaibz

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Error de aceso
« Respuesta #4 en: Lunes 15 de Noviembre de 2010, 17:23 »
0
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);

y esto en UFORMBorrarEquipo.cpp

__fastcall TFormBorrarEquipo::TFormBorrarEquipo(TComponent* Owner, TTorneo &x)
        : TForm(Owner), t(x)
{
}

¿puede tener alguna relacion?

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Error de aceso
« Respuesta #5 en: Lunes 15 de Noviembre de 2010, 17:29 »
0
Creo que

Código: C
  1. bool torneo_nombre_equipo(TTorneo t,int id_equipo, AnsiString &nombre_equipo)
  2.  
debería ser

Código: C
  1. bool torneo_nombre_equipo(TTorneo t,int id_equipo, AnsiString* nombre_equipo)
  2. {
  3. [...]
  4. *nombre_equipo = t.equipos_nombres[id_equipo];
  5. [...]
  6. }
  7.  
y habría que llamarla tal que

Código: C
  1. torneo_nombre_equipo(t,i,&nombre_equipo);
  2.  
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.

ismaibz

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Error de aceso
« Respuesta #6 en: Lunes 15 de Noviembre de 2010, 17:38 »
0
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....