Varaan muistia rakenteen (struct) käyttämiseen. Miten saan sen koon (tavuissa) selville? sizeof()-funktio hämää rutkasti, se palauttaa char:n kooksi 1 (kuten pitääkin), mutta miksi se palauttaa int:in kooksi 4 tavua? Rakenteen, jossa on yksi int ja yksi char, kooksi se ilmoittaa 8 tavua.
Mitä *SENSUROITU* tämä meinaa?
Ehkäpä kääntäjässäsi on int on 4 tavuinen? :-) Näin taitaa olla lähes kaikissa 32-bittisissä, kuten DJGPP jota ilmeisesti käytät. Rakenne on alignoitu tehokkuussyistä 8-tavuiseksi. Uskon että DJGPP:stä löytyy joku taikasana (tai kääntäjän vipu) jolla tuon alignoimisen saa kytkettyä pois.
No olkoon. Seuraava kohta bugaa ankarasti:
Hero_Spells[x] = (struct SPELL_hold *)malloc(sizeof(SPELL_hold) * get_max_spell(sp));
Eli yritän varata jokaiselle sankarihahmolle x tietyn määrän SPELL_hold-tyyppisiä rakenteita (tietty määrä = loitsujen max. määrä), ja kun rakenteen dataa muutetaan myöhemmin niin se aiheuttaa ongelmia. Muistin varaus kuitenkin onnistuu :)
Hero_Spells on määritetty:
struct SPELL_hold *Hero_Spells[MAX_HEROES];
Ahh.. Ei tarvitse enää apua. Sain ratkaistua.
char + int struktuurista tulee 8 tavua koska kääntäjä alignaa 4:ään tavuun eli
struktuuri:
- int 4 tavua
- char 1 tavu
- 3 tavua tyhjää
tämä nopeuttaa muistinkäsittelyä varsinkin joukoissa huomattavasti x86 koneilla
ja int on näköjään kääntäjällä 32:n bitin word
Aihe on jo aika vanha, joten et voi enää vastata siihen.