Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema De Memoria.

Iniciado por Warchief, 09 de Abril de 2005, 04:30:25 AM

« anterior - próximo »

Warchief

 Saludos,

llevo bastante tiempo tiempo dándole vueltas a un problema y no lo consigo resolver. A ver si alguno puede echarme otro cable, porque estoy que me tiro de los pelos.

(véase la imagen).

El código interesante para la cuestión es:


class Board
{
public:
...
Team* Board::getTeam(TTeam t) const
{
return boardTeams[t];
}

private:
Team** boardTeams;
...
}

class MiAI
{
public:
    foo(const Board* board);

private:
TTeam aiTeam;
};

// los team se crean en el constructor del tablero mediante:
boardTeams = new Team*[2];
boardTeams[0] = new Team;
boardTeams[1] = new Team;


// pues en MiAI::foo(const Board* board) me pasa lo de la imagen, y es que:
a) board->getTeam(TEAM_A) // me funciona bien (en la imagen)
b) aiTeam == TEAM_A //me devuelve 1
c) aiTeam dice ser TEAM_A // (en la imagen)
y sin embargo,
d) board->getTeam(aiTeam) me da una Access Violation 0xC0000005



He actualizado el msvc a SP6 por si las moscas. Llevo ya ni se sabe el tiempo (empecé por la tarde y son las 4:25am  :oops:) y soy incapaz de saber qué pasa. A alguien se le ocurre?

Gracias de antemano.

El problema: la llamada a getTeam no se hace bien. Si contiúo pasando de la excepción, la llamada a getTeam dice que se hace con un t de cien mil o algo así.

ethernet

 Aclara un poco más las cosas:
- qué es aiTeam ? en enum? un entero? qué valor tiene? debo suponer que es un enum de valor 0 o 1.
- pega como inicializas el Board y como y donde los llamas después.
- las otras variables que aparecen tienen o no que ver? y si es así como las calculas

saludos

Warchief

 
Cita de: "ethernet"Aclara un poco más las cosas:
- qué es aiTeam ? en enum? un entero? qué valor tiene? debo suponer que es un enum de valor 0 o 1.
- pega como inicializas el Board y como y donde los llamas después.
- las otras variables que aparecen tienen o no que ver? y si es así como las calculas

saludos
Sí, aclaro:

+ enum TTeam { TEAM_A, TEAM_B, NOTEAM };

+ Creación de board:

Board::Board(int w, int h, int n) : width(w), height(h), connectivity(n)
{
// Create teams
boardTeams = new Team*[2];
boardTeams[0] = new Team;
boardTeams[1] = new Team;

// Create nodes.
... // algo de codigo donde se resetean los nodos (vecindad y eso)
}

// Y le invoco:
// (supongamos que es el main, porque es un poco mas lejos, es ya en el bucle de juego, habiendo inicializado
// allegro, etc).

main() {

Board* board = new Board(w,h,c); // w, h, c pillados de interfaz

       // en una función donde se colocan las unidades; pego aquí por sencillez
board->getTeam(TEAM_A)->setObjective(iniRowB, iniColB);
board->getTeam(TEAM_B)->setObjective(iniRowA, iniColA);
board->getTeam(TEAM_A)->nUnits = nUnits*3;
board->getTeam(TEAM_B)->nUnits = nUnits*3;
       // hasta aquí


AIinterface** AIs = new AIinterface*[2];
AIs[0] = new RandomMovesAI(TEAM_A); // en el constructor de la ia se asigna a AITeam
AIs[1] = new RandomMovesAI(TEAM_B);

       AIs[turno]->foo(board);  // esta llamada falla
}


// donde ahora mismo

RandomMovesAI::foo(const Board* board) {
TTeam j = TEAM_A;
int x = 3;// esto es para parar aqui el depurador
assert(j==AIteam);
}


La cuestión es que al parar sobre "int x=3;", me sale lo de la imagen:
+ board->getTeam(TEAM_A); OK
+ board->getTeam(j); OK
+ board->getTeam(AIteam); Falla, la excepción que comenté
+ AIteam == TEAM_A da 1
+ AIteam dice que vale TEAM_A (como this->AIteam)

No hay mas sitios donde toque los equipos del tablero. Es que no se por donde agarrar lo de la foto; pienso que es solo un fallo de memoria que haga por ahí, pero no sé por qué board->getTeam(j) funciona y board->getTeam(AIteam) no, cuando j==AIteam.

Repego la foto con todas las variables:


Gracias por echarle un vistazo.

ethernet

 Aparentenmente no se ve nada mal, se me ocurre que puede ser que hagas un delete de algo que después llames. Has probado a compilar en release a ver qué pasa?

saludos

Warchief

Cita de: "ethernet"Aparentenmente no se ve nada mal, se me ocurre que puede ser que hagas un delete de algo que después llames. Has probado a compilar en release a ver qué pasa?

saludos

lia_AI.obj : error LNK2001: unresolved external symbol "public: int __thiscall Board::getConnectivity(void)const " (?getConnectivity@Board@@QBEHXZ)
wlia_Render.obj : error LNK2001: unresolved external symbol "public: enum TTeam __thiscall Node::getUnitTeam(void)const " (?getUnitTeam@Node@@QBE?AW4TTeam@@XZ)
wlia_Render.obj : error LNK2001: unresolved external symbol "public: enum TUnit __thiscall Node::getUnit(void)const " (?getUnit@Node@@QBE?AW4TUnit@@XZ)
wlia_Render.obj : error LNK2001: unresolved external symbol "public: enum TTeam __thiscall Node::isTeamHome(void)const " (?isTeamHome@Node@@QBE?AW4TTeam@@XZ)
wlia_Render.obj : error LNK2001: unresolved external symbol "public: unsigned int __thiscall Node::getNeighboursNumber(void)const " (?getNeighboursNumber@Node@@QBEIXZ)
wlia_Render.obj : error LNK2001: unresolved external symbol "public: int __thiscall Node::hasNeighbourAt(enum TNeighbour)const " (?hasNeighbourAt@Node@@QBEHW4TNeighbour@@@Z)
wlia_Render.obj : error LNK2001: unresolved external symbol "public: unsigned int __thiscall Node::getZone(void)const " (?getZone@Node@@QBEIXZ)
wlia_Render.obj : error LNK2001: unresolved external symbol "public: class Node * __thiscall Board::getNodeAt(int,int)const " (?getNodeAt@Board@@QBEPAVNode@@HH@Z)
wlia_Render.obj : error LNK2001: unresolved external symbol "public: int __thiscall Board::getHeight(void)const " (?getHeight@Board@@QBEHXZ)
wlia_Render.obj : error LNK2001: unresolved external symbol "public: int __thiscall Board::getWidth(void)const " (?getWidth@Board@@QBEHXZ)
Release/WLIA.exe : fatal error LNK1120: 10 unresolved externals
Error executing link.exe.

WLIA.exe - 11 error(s), 0 warning(s)


En release.  :blink:  

ethernet

 VC++ tiene configuraciones separadas para release y debug de forma que si estás enlazando con una librería externa debes indicarlo en project->settings seleccionando release.  

Warchief

 
Cita de: "ethernet"VC++ tiene configuraciones separadas para release y debug de forma que si estás enlazando con una librería externa debes indicarlo en project->settings seleccionando release.
Ya, ya, si lo hice al principio. Son además liebrerías distintas para debug que para release. Pero es que esas funciones que faltan son todas de mi world.h.

O_O

****nudo, curiosamente eran todas las inline.
He quitado los inline y compila bien en release.

Uhmm, sólo falla si ejecuto con depurador (f5). Incluso endebug con ctrl+f5 no falla. Ahora si que me han matao.

Joderk, funciona perfectamente en:
+ debug con ejecutar (Ctrl+F5)
+ realease con ejecutar
+ release con debugger (sin debug info claro)

Y sólo se jode con
+ debug con debugger (F5)

Warchief

 Gracias por la idea etherrnet, al menos puedo continuar sabiendo que no es de mi código.

¿Se os ocurre alguna idea de por qué falla? (como dije, por la noche actualicé a service pack 6 por si era eso).

--------------------

Uhmm, sólo falla si pongo expresamente "board->getTeam(AIteam)" para ver su valor!!!

Si pongo:
   int xxx = bcon*board->getTeam(AIteam)->nUnits;

Y en el debugger pongo xxx para ver su valor, me funciona perfectamente.

Supongo que el depurador no está pensado para meterle funciones con parametros dependientes de puntero this. (Aunque recuerdo que lo puse ahí porque ya me había dado el fallo de access violation).

En fin, ahora parece que funciona bien.

Gracias eth por el empujón.  ;)  

ethernet

 Recuerda que las funciones inline deben ir declaradas y desarrolladas en el .h (o como mucho hacerlas en un .inl y después hacer un include del mismo)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.