2011-01-07 4 views
0

Ich habe ein String-Array bekommtC++ std :: string für die Verwendung mit OpenGL LoadBMP verkohlen

string name[1000]; 

und mit

int counter; 
counter = 0; 

while(FindNextFile(fHandle, &wf)) 
{ 

... //some more code which is checking if its a folder 

string theName = wf.cFileName; 
if(theName.find(".bmp") != std::string::npos) 
{ 
    name[counter] = theName; 
    counter++; 
} 
} 

Ich füge jede BMP-Datei, um meinen Namen Array.

Mit NeHe's Tutorial Ich füge Texturen zu meinen Qubes, die sehr gut funktioniert.

Nun meine angepassten Code sieht wie folgt aus:

int n; string imageFileString[1000]; char *imageFile[1000]; 
for(n=0; n<1000; n++) 
{ 
    imageFileString[n] = name[n]; 
    imageFile[n] = new char[imageFileString[n].length()]; 
    strcpy(imageFile[n], imageFileString[n].c_str()); 

    if(TextureImage[n] = loadBMP(imageFile[n])) 
    { 
     ... // Some more Functions to set textures 
    } 
} 

Alles funktioniert gut, nur dass meine BMP-Dateien geladen Arent.

Wenn ich

name[0] = "pic1.bmp"; 
name[1] = "pic2.bmp"; 
name[2] = "pic2.bmp"; 
name[3] = "pic2.bmp"; 

vor der int n; string imageFileString... Einstellung, fügen Sie so für die for(...) Schleife sind meine Bilder geladen, ohne etwas anderes zu ändern. Meine erste Meinung war, dass der Name Array keine Einträge vorhanden, aber ich erstellt eine Log-Datei mit dem Ausgang

name[0] << endl << name[1] << endl << name[2] ... 

und in meiner Log-Datei waren die gleichen Namen

pic1.bmp 
pic2.bmp 
pic3.bmp 

so denke ich, gibt es einige ist anderer Fehler beim Hinzufügen des cFileName zu meinem Array.

Kann mir bitte jemand helfen? Ich weiß nicht, wie dieses Problem zu beheben, ich meine, ich habe keine Ahnung, was los ist ...

+1

Statt string name [1000] warum nicht Sie std :: vector Namen verwenden ;. Und benutze names.push_back (theName) ;. – yasouser

Antwort

4
imageFile[n] = new char[imageFileString[n].length()]; 

Sie sind nicht für die Null-Terminator-Bilanzierung. In einer zur Länge:

imageFile[n] = new char[imageFileString[n].length() + 1]; 
+0

hmm, ändert nichts. – ahmet2106

1

Da Sie sagte, alles funktioniert gut, wenn Sie name[0] = "pic1.bmp" etc zu tun, müssen Sie ausdrucken/debug string theName = wf.cFileName; Ich würde vermuten, dass es ein Pfadproblem ist. wf.cFileName gibt wahrscheinlich einen Dateipfad zurück, den Sie nicht erwarten.

Zum Beispiel wette ich, dass es so etwas wie \MyData\Bitmaps\pic1.bmp zurückkehrt, wo man nur pic1.bmp

aktualisieren

Angesichts all die anderen wunderbaren Veränderungen, können Sie es auch verkürzen weiter erwartet werden, auch und tun dies

int counter = 0; 

while (FindNextFile(fHandle, &wf)) 
{ 
    if (strstr(wf.cFileName, ".bmp") != 0) 
    { 
      if(TextureImage[counter] = loadBMP(wf.cFileName) 
      { 
      ... // Some more Functions to set textures 
      counter++ 
      } 
    } 
} 

Es gibt keinen Grund, mehr Speicher zuzuweisen, nur um zu überprüfen, ob eine Zeichenfolge (".bmp") vorhanden ist. Beachten Sie auch, dass ich den Zähler erst aktualisieren, wenn der Ladevorgang erfolgreich ist.

Sie sollten wirklich TextureImage zu einem std::vector wechseln dann müssten Sie keine zählen. Überprüfen Sie, ob Sie wf.cFileName direkt an Ihren loadBMP übergeben, wenn die Dinge funktionieren. Und ich stelle fest, dass dies in einem Überlauf aufgrund TextureImage[] und Zähler auftreten könnte, weshalb ich vorschlage, auf std::vector zu wechseln.Wir sehen nicht, wie er TextureImage[] zuweist, wenn es wie alles andere mit einer magischen Zahl von 1000 ist.

Denken Sie auch daran, dass .cFileName als TCHAR [] definiert ist, die Unicode-Werte enthalten kann.

+0

Nein, wie gesagt, wenn ich eine Log-Datei mit dem Namen [0] erstelle, gibt es die Datei pic1.bmp in meiner Log-Datei. Ich denke also nicht, dass es ein Problem mit dem Pfad gibt. – ahmet2106

3

Dies ist keine Antwort, aber es wäre zu schwer, in einem Kommentar zu posten.

Warum machst du das alles?

int n; string imageFileString[1000]; char *imageFile[1000]; 
for(n=0; n<1000; n++) 
{ 
    imageFileString[n] = name[n]; 
    imageFile[n] = new char[imageFileString[n].length()]; 
    strcpy(imageFile[n], imageFileString[n].c_str()); 

    if(TextureImage[n] = loadBMP(imageFile[n])) 
    { 
     ... // Some more Functions to set textures 
    } 
} 

Wenn Sie das einfach tun könnten?

int n; 
for(n=0; n<1000; n++) 
{ 
    if(TextureImage[n] = loadBMP(name[n].c_str())) 
    { 
     ... // Some more Functions to set textures 
    } 
} 
+0

Konvertierung von const char * in char * ist nicht möglich, das ist der Fehler. – ahmet2106

+0

@ ahmet2106 Dann repariere loadBMP. Es sollte ein const Char * anstelle eines Char * –

+0

@ PigBen +1 nett :) akzeptieren. Danke, aber das behebt meinen Fehler nicht: D – ahmet2106

0

Ok fand ich das Problem selbst,

aktualisieren, feste Version (WinMain):

void ScanTheDirectory() 
{ 
    // this function is scanning the directory and is adding 
    // each bmp file to the string array "name" 
} 

int initGL() 
{ 
    // this function calls the loadTextures() function 
} 

int loadTextures() 
{ 
    // this function is loading all files of the string array "name" 
    // converts them to a const char * and is adding them to the "textures" GLuint (array) 
} 

int WINAPI WinMain() 
{ 
    // this function is the main window which is showing the 
    // qubes (GL_QUBES) 

    ScanTheDirectory(); 
    initGL(); 
} 

Das Problem war in WinMain(), weil es so aussah:

initGL(); 
ScanTheDirectory(); 

Wenn es zuerst die initGL() aufruft, so erstellt es die Texturen, und da das name-Array leer ist, gibt es kein Textu res wurde meinem Texturen-Array hinzugefügt.

Danach Wechsel zu

ScanTheDirectory(); 
initGL(); 

Nun ist es zuerst die ScanTheDirectory Aufruf() void und so ist mein Name Array mit den Namen von BMP-Bilddateien gefüllt. Jetzt kann es die initGL aufrufen, und das erstellt die Texturen aus meinen Bildern.

Vielen Dank für die Hilfe, jetzt mein Code sucht ein wenig klarer: D

Ahmet

+0

Das macht nicht viel Sinn angesichts der Code, den Sie vorgestellt haben. Würde es Ihnen etwas ausmachen, dies mit Ihrem modifizierten Code zu aktualisieren, damit andere davon lernen können? –

+0

@Andrew, jetzt habe ich ein bisschen meine Antwort geändert, das ist ein Teil des Codes mit Beschreibung. Mehr hilfreich, denke ich. – ahmet2106

+0

Ich weiß es zu schätzen, danke. Jetzt werden andere sehen, dass Ordnung wichtig ist. –

Verwandte Themen