Eigenartiger Error
-
Hi leuts,
ich hab ein kleines Programm (Console) entworfen, das eine BMP-Datei in ein anders Format (kennt ihr sicher nicht, .w3e) konvertiert. Das selbst ist ja nicht das Problem, nur bekomm ich immer einen Error, wenn ich das Programm startet. (bzw. nach ein paar Sekunden)Source:
#include "stdafx.h" #include <windows.h> #include <fstream> #include "CxImage/ximage.h" #include "MapPoint.h" bool CreatePoints(char* szInhalt, int FileSize) { CxImage File; RGBQUAD ColorBuffer; MapPoint* Points; int Height; int Width; int MapPointsNum; File.Load("C:\\Test.bmp", CXIMAGE_SUPPORT_BMP); Height = File.GetHeight(); Width = File.GetWidth(); /* * The number of points in a map is always * Height (min. 33) * Width (min. 33) - 1 * the height (width) of the bmp is always * mapheight (mapwidth) + 1 */ MapPointsNum = Height*Width-1; Points = new MapPoint[MapPointsNum]; std::cout << MapPointsNum << " Areapoints" << std::endl; for(int y = 0; y <= Height; y++) { static int Counter = 0; for(int x = 0; x <= Width; x++) { if(y == 0) { if(x == 0) { break; } } int Red; int Green; int Blue; int Color; ColorBuffer = File.GetPixelColor(x, y, false); Red = ColorBuffer.rgbRed; Green = ColorBuffer.rgbGreen; Blue = ColorBuffer.rgbBlue; Color = (Red + Blue + Green)/3; if(Color == 0) { Color = 1; } Points[Counter].Hight = Color; Counter++; } } HANDLE hWrite; char* Buffer = new char[FileSize]; MessageBox(NULL, "Hilfe!", "hm..", MB_ICONERROR); //Here is the Error-Code for(int i = 0; i < 69; i++) { Buffer[i] = szInhalt[i]; } MessageBox(NULL, "Hilfe!", "hm..", MB_ICONERROR); for(int i = 69; i < FileSize; i++) { static int Counter = 0; static int PointCounter = 0; switch(Counter) { /* case 1: { Buffer[i] = 0x20+(Points[PointCounter-1].Hight/32); //I don't now why, but if it wasn't here, the editor would get an error ;) Counter++; break; } */ case 0: { Points[PointCounter].Hight; Buffer[i] = Points[PointCounter].Hight; PointCounter++; /* Height += 0x01; if(Height == 0x0A) { Height = 0x00; } */ break; } default: { Buffer[i] = szInhalt[i]; break; } } if(Counter < 7) { Counter++; } else { Counter = 0; } } DWORD w; hWrite = CreateFile("C:\\war3map_buffer.w3e", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); WriteFile(hWrite, Buffer, FileSize, &w, NULL); return true; } int _tmain(int argc, _TCHAR* argv[]) { HANDLE hFile; hFile = CreateFile("C:\\war3map.w3e", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if(hFile == NULL) return 0; int FileSize = GetFileSize(hFile, NULL); char* szInhalt = new char[FileSize]; DWORD r; ReadFile(hFile, szInhalt, FileSize, &r, NULL); CloseHandle(hFile); CreatePoints(szInhalt, FileSize); system("Pause"); return 0; }
-
DarkLord schrieb:
nur bekomm ich immer einen Error, wenn ich das Programm startet
Mensch Leute, könnten wir uns mal darauf einigen, bei sowas immer schön mit anzugeben, wie der Fehler lautet bzw. in welcher Form er sich darstellt.
Ausserdem, dein Code sieht imo etwas dirty aus. Fehlende Speicherfreigaben, fehlende Auswertung der WinAPI Rückgabewerte. Und wozu die Variablen static innerhalb der Schleifen. Irgendwie bleibt mir der Sinn dabei verborgen. Oder hast du vor, CreatePoints mehrmals aufzurufen?
Aber da gibts noch mehr seltsame Sachen, zBif(y == 0) { if(x == 0) { break; } }
Wozu das? Genauso gut könntest du y gleich bei 1 starten lassen.
-
Jo jetzt wo dus sagst, meine logik hat wohl in dem Moment ausgesetzt. Als Fehler kommt ja, dass der Fehler nicht erkannt wurde und mein Debuger zeigt keinen richtigen Code an sondern nur "???" im Assembler. (Ich arbeite mit VC++ 2003 .Net)
Aber auf den ersten Blick findet keiner den Fehler? Ich hab mal mit verschiedenen MessageBoxen (Um zu sehen bis wie weit der Code ausgeführt wird) das ganze auf den Bereich...char* Buffer = new char[FileSize]; //Here is the Error-Code for(int i = 0; i < 69; i++) { Buffer[i] = szInhalt[i]; }
... eingegenzt. Ich vermute mal das es Probleme mit der FileSize-Variable gibt.
-
mal ganz spontan: wie wäre es mit i<FileSize ?
-
Du solltest mal den Erfolg von GetFileSize ueberpruefen, das returnt naemlich evtl. einen Fehlercode (der dann wahrscheinlich eine negative Zahl ist, und dann fliegt die die Speicherreservierung um die Ohren).
-
Ich hab durch einen Test herrausgefunden das Wenn ich...
CxImage File;
... deklariere werden alle Variablen auf 0 gesetzt. Find ich persönlich schon etwas seltsam. Entwder leigts an der lib/dll oder ich hab das Ding falsch deklariert. Als Test hab ich mal ein kleines Test-Proggie geschrieben:
... int main() { int Test = 22; CxImage Test; std::cout << Test; return 0; }
Da bekomm ich immer so nen Error von wegen "Run-Time Check Failure #2 - Stack around the variable 'Test' was corrupted.". Ein ähnlicher Fehler kommt auch bei den eigentlichen Programm.
Ich hab mal das richtige Prog als VC++-Projekt hochgeladen, so könnt ihr wohl besser den Fehler finden:
http://www.wc3campaigns.com/attachment.php?attachmentid=56989
-
DarkLord schrieb:
Ich hab mal das richtige Prog als VC++-Projekt hochgeladen, so könnt ihr wohl besser den Fehler finden
Wohl kaum, wenn man nicht registriert ist.