Hej, od ładnych kilku lat nie zadawałem pytań : D
No ale do rzeczy.
Mam forka Quake-2 (wziętego z ID software) i w jednym momencie dzieje się coś co w tej chwili mi psuje zabawę.
Piszę sobie funkcję która zastępuje macro EDICT_NUM
:
edict_t* EdictNum( int n )
{
if( ge.edict_size == 0 )
{
return NULL;
}
edict_t* result = &ge.edicts[n];
return result;
}
SV_InitGameProgs ();
for (i=0 ; i<maxclients->value ; i++)
{
ent = EdictNum(i); // ent to edict_t*
ent->s.number = i+1;
svs.clients[i].edict = ent;
memset (&svs.clients[i].lastcmd, 0, sizeof(svs.clients[i].lastcmd));
}
EdictNum zwraca:
0x0000026289726070
(podgląd autosów w visualu na linijce ent = , no i na końcu funkcji EdictNum jest też ta wartość.).
a potem okazuje się, że zmienna ent (w linijce ent->...) ma już wartość:
0xffffffff89726070
Jak można się domyślać, kończy się to crashem, najpewniej jest to adres w jakimś chronionym rejonie.
Wie ktoś o co tu może chodzić?
Ps. dzieje się tak dla i = 0, case kiedy i = 1, 2 ... zostawiam sobie na potem.
Ps2. moje repo: https://github.com/bartekordek/Quake-2/tree/cmake-c
plik to server/sv_init.c i win32/qgl_win.c