unerklärlicher fehler?!?!
-
Hallo!
ich habe hier ein programm, was schon nach geringster modifikation einen runtime error verursacht. leider hab ich keine ahnung woher und warum dieser fehler auftritt.
Ich habe:
WORD depth[124][160]; WORD depthIn[124][160]; WORD *pDist,*pIntens = NULL;
global definiert.
in winmain allokiere ich dann noch etwas speicher:
pDist=(WORD*)malloc(160*124*sizeof(WORD)); if(!pDist){ ... } pIntens=(WORD*)malloc(160*124*sizeof(WORD)); if(!pIntens){ ... }
So, dass ist meine Nachrichtenschleife:
while(g_fRun) { if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else if (GLInit) { ierr=GetFrame(pCam,pDist,pIntens); if(ierr) { ... } else { for(yr=frow;yr<=lrow;yr++) { for(xr=fcol;xr<=lrow;xr++) { depth[xr][159-yr] = pDist[xr+yr*124]; //depthIn[xr][159-yr] = pDist[xr+yr*124]; } } } Render(); ...
So und jetzt das Prickelnde: Sobald ich die Daten die mir GetFrame auf dem Speicher ablegt nicht in depth, sondern in depthIn schreibe bekomme ich die Fehler meldung das ein read auf dem Speicher nicht ausgeführt werden konnte.
Das is aber meiner Meinung nach gegen sämtliche Logik? Wieso gehts mit dem anderen array dann???
Gut hab ich mir gedacht, mit dem Read is bestimmt die Zeigeroperation gemeint, also den Wert "pDist[...]" zum Beispiel durch "10000" ersetzt:
Vorgang Written konnte nicht ausgeführt werden. Mit written wird dann wiederum GetFrame gemeint sein. Dieser Funktion unterstell ich aber mal Fehlerfreiheit, weil die nich von mir is
So kommentiere ich nun auch diese Funktion aus läuft die Schleife wieder.Aber warum in Gottes Namen???? Hat jemand ne idee woran das liegen kann??
Ich habe den Code bekommen und schreibe daran weiter.ich weiß nich mehr weiter, ich sitzt seit 2h davor und rätsel rum.
Der Code stammt aus einem C Source.
-
Hmm, seltsam! Klappt es denn mit depthIn, wenn du bei der Definition die beiden Zeilen vertauscht? Also so:
WORD depthIn[124][160]; WORD depth[124][160];
-
habs mal getestet. funktioniert auch nicht.
Was ich noch festgestellt habe und mir nicht ganz klar ist:Ich habe einen globalen String zum Debugoutput:
char LogText[100000]; //Text im LogWindow
Wenn ich nun in meinem hauptprogramm nichts anderes mache, als die Daten vom Speicher in depth[..][..] zu schreiben (also auch die (unterstellt) fehlerfreie Funktion GetFrame ausklammere), wird mein String mit Grissel gefüllt. Also quasi so hier...
while(g_fRun) { if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else if (GLInit) { //ierr=GetFrame(pCam,pDist,pIntens); if(ierr) { ... } else { for(yr=frow;yr<=lrow;yr++) { for(xr=fcol;xr<=lrow;xr++) { depth[xr][159-yr] = pDist[xr+yr*124]; //depthIn[xr][159-yr] = pDist[xr+yr*124]; } } } Render(); ...
Das heißt im klartext: Ich allokiere Speicher und arbeite damit (OK was da drin steht weiß ich nicht, aber das dürfte ja kein Grund sein, das sich ein String an anderer Stelle mit Zeichen füllt?)
Klammer ich die Zeile wieder aus:
depth[xr][159-yr] = pDist[xr+yr*124]; //depthIn[xr][159-yr] = pDist[xr+yr*124];
...läuft alles fehlerfrei. Kein Grissel und kein Absturz. Die Ursache muss also irgendwie in dieser Zeile liegen??
Aber bereichstechnisch haut das ja alles hin? mit dem anderen array funktioniert es ja auch.
Hm....
Weiter getestet:
depthIn[1][1] = pDist[1]; depth[1][1] = pDist[xr+yr*124];
geht auch. Kein Grissel und kein Absturz. Muss wohl wirklich was an der Schleife nicht stimmen? Aber warum funktioniert sie dann mit dem anderen array??
-
Also OK!
Ich kann den Fehler jetzt zumindest eingrenzen, aber noch nicht erklären:
depth[xr][159-yr] = pDist[xr+yr*124];
-> geht nicht
depth[xr][159-yr] = 10000;
-> geht nicht
depth[1][1] = pDist[xr+yr*124];
-> geht
depth[123][159] = pDist[xr+yr*124];
-> geht
Fazit: Es muss wohl irgendie am array liegen! Aber was is da falsch?
Muss ich es noch irgendwie initalisieren?
-
Vorhin hattest du doch geschrieben, dass es mit depth wunderbar funktioniert und der Fehler nur bei depthIn kommt
Hast du noch mehr so riesige Variablen wie LogText definiert?
-
es war echt ein einfacher schleifenfehler, der ZUFÄLLIG auch mal funktioniert hat. ICH GEH KAPUTT!
manchmal kann man sich echt zum
machen!
-
So wie ich das jetzt sehe hast du wohl einfach mit den Schleifen-Variablen xr bzw. yr den gültigen Index-Bereich des Arrays überschritten, oder
-
genauso ist dem...
asche auf mein haupt....aber ich saß jetzt echt bestimmt 3h davor und habs NICHT gerafft. wahnsinn, ich hol mir erst mal n kaffee...