Arrays, Pointer, Laufzeitfehler
-
#include <iostream> #define SCHWERT 1 #define BOGEN 2 class GEGENSTAND { public: int gegID; }; class SLOT { public: GEGENSTAND *pGegenstand; bool istBelegt; }; void gegenstandreintun(SLOT *slot, GEGENSTAND *pGeg) { slot->pGegenstand->gegID = pGeg->gegID; slot->istBelegt = true; } int main () { SLOT Inventar[3][4]; GEGENSTAND *Schwert = new GEGENSTAND; GEGENSTAND *Bogen = new GEGENSTAND; Schwert->gegID = SCHWERT; Bogen->gegID = BOGEN; //gegenstandreintun(&(Inventar[0][3]), Schwert); //gegenstandreintun(&(Inventar[2][2]), Bogen); gegenstandreintun(&(*(*(Inventar+0)+3)), Schwert); gegenstandreintun(&(*(*(Inventar+2)+2)), Bogen); for (int x = 0; x <= 2; x++) { for(int y = 0; y <= 3; y++) { if(Inventar[x][y].istBelegt = 0) { continue; } else if ((Inventar[x][y].pGegenstand->gegID) == SCHWERT) { printf("im gepaeck, in der %d Reihe und" "der %d Spalte liegt ein Schwert \n", x, y); } else if ((Inventar[x][y].pGegenstand->gegID) == BOGEN) { printf("im gepaeck, in der %d Reihe und" "der %d Spalte liegt ein Bogen \n", x, y); } } } return 0; }Kein Compilerfehler, kein LinkerFehler, aber Laufzeitfehler. Mist.
Überhaupt keine Ahnung worans liegt, außer dass es vllt die arrays und die Zeiger sind, hab versucht zu debuggen, gab mir das folgende ergebnis:Unbehandelte Ausnahme bei 0x00401028 in bla.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x004026cb.
Toll, er schreibt am Ziel vorbei, soviel ist klar, aber hä?
hier noch ein bisschen Dissasembly:
00401004 push esi 00401005 push edi 00401006 push 4 00401008 call 004011B0 0040100D push 4 0040100F mov esi,eax 00401011 call 004011B0 00401016 mov edx,dword ptr [esp+2Ch] 0040101A mov dword ptr [esi],1 00401020 mov dword ptr [eax],2 00401026 mov ecx,dword ptr [esi] 00401028 mov dword ptr [edx],ecx <- hier zeigt er mir mit nem pfeil hin 0040102A mov eax,dword ptr [eax] 0040102C mov ecx,dword ptr [esp+64h] 00401030 add esp,8 00401033 mov byte ptr [esp+28h],1 00401038 mov dword ptr [ecx],eax 0040103A mov byte ptr [esp+60h],1 0040103F xor ebp,ebp 00401041 lea edi,[esp+0Ch] 00401045 xor esi,esibei 004026cb, dort wo er was hinschreiben wollte, gibt es
004026CB retTja, hab zwar ein schönes Assembler Buch hier, aber ich glaub, wenn ich nicht mal C++ richtig kann, sollte ich assembler erstmal lassen.
Achso: helft mir bitte xDD, ich möchte dass es klappt, sonst esse ich meine gitarre
-
dein SLOT array Inventar beinhaltet keine initialisierten objekte. ebenso ist pGegenstand jedes SLOT "objekts" (die nicht existieren) nicht initialisiert.
solltest dir konstruktoren o.ä. für die klassen schreiben, die diese objekte erzeugen.
sehe übrigens für das programm keinen bedarf an pointern. zumindest nicht so, wie es derzeit verwendet wird.
-
später haben die Gegenstände viele andere Eigenschaften, wie z.B Angriffsstärke, benötigte Stärke, blablabla... und natürlich eine schöne Grafik^^. Da es ja viele einzelne Gegenstände geben wird, die eigentlich ziemlich konstant bleiben soll(t)en und auch nicht jeder Feind in seinem eigenen Inventar die Waffe mit all ihren Eigenschaften nochmal gespeichert haben sollte, finde ich Zeiger durchaus angebracht.
hmmm... konstruktoren gemacht, trotzdem absturz:
class GEGENSTAND { public: GEGENSTAND(); int gegID; }; GEGENSTAND::GEGENSTAND() { gegID = NULL; } class SLOT { public: SLOT(); GEGENSTAND *pGegenstand; bool istBelegt; }; SLOT::SLOT() { pGegenstand = NULL; istBelegt = 0; }Beim Debuggen schreibt er diesmal Zugriffsverletzung beim Schreiben an Position 0x00000000.
hmmm... pGegenstand = NULL... Zugriffsverletzung bei 0x00000000.
Ich fang so langsam an, zu verstehen, aber jemand muss mir trotzdem ein Konzertflügel auf den Kopf schmeißen, damit ich merke, wo mein fehler ist

-
Problem selbständig (durch denken) gelöst:
SLOT::SLOT()
{
pGegenstand = new GEGENSTAND;
istBelegt = 0;
}juhu, kein Konzertflügeln aufm Kopf.
vielen Dank für die Idee mit den Konstruktoren, thordk.
