Problem mit Array-Of-Structs und Wertzuweisung in For-Schleife



  • Hi,

    ich versuche gerade mir einen Texturloader zu schreiben und habe für die zu ladenden Texturen ein struct angelegt:

    typedef struct _TEXTURE_INFORMATION {
       char         texture_name[256];		// Dateiname der Textur
       TEXTURE_TYPE texture_type;			// Format der Textur
       GLuint       texture_id;			// ID der Textur
    } TEXTURE_INFORMATION;
    

    Dieses struct fülle ich dann, global, mit den folgenden Werten:

    TEXTURE_INFORMATION texture_information[] = 
    {
      // Texturname,Typ, ID
      "img\\cube.bmp", BMP, 0,
      "img\\sphere.bmp,BMP, 0,
      "img\\xyz.bmp,   BMP, 0,
      "img\\test.bmp,  BMP, 0
    };
    

    Nun habe ich also ein globales Array-Of-Structs, welches 4 Einträge enthält.
    Wenn mein Programm startet, möchte ich, dass die Texturen wie folgt in einer For-Schleife geladen werden:

    for(int i = 0; i < LOAD_TEXTURE_COUNT; i++) {
    
      LoadMipMapTexture( (LPSTR)texture_information[i].texture_name,
                          texture_information[i].texture_type,
                          &texture_information[i].texture_id );
    }
    // Prototyp der LoadMipMapTexture() Funktion:
    /* int LoadMipMapTexture(LPSTR lpTexturename,	// Dateiname der Textur
                             TEXTURE_TYPE type,     // Typ der Textur: BMP, TGA
                             GLuint *textureID);    // Ziel für die Textur-ID
    */
    

    Das Problem ist nun, dass bei jeder 2ten zu ladenden Textur (jeder 2te Durchlauf der Schleife) ein ungültiger Dateiname beim Funktionsaufruf der LoadMipMapTexture() auftritt. Ich vermute, dass das mit dem dritten Parameter der Funktion zusammenhängt, und das ich vielleicht mit dem Adressoperator etwas falsch mache...

    Für Hinweise wäre ich Euch dankbar!

    Viele Gruß
    Prog



  • Falls du es wirklich so geschrieben haben solltest könnte der Fehler in den fehlenden 2.ten Hochkommeas der Namen ab dem zweiten Eintrag nach dem .bmp liegen.
    Solche Inits schreibt man übersichtlicher so

    TEXTURE_INFORMATION texture_information[] =  
    { 
      // Texturname,Typ, ID 
      {"img\\cube.bmp", BMP, 0}, 
      {"img\\sphere.bmp",BMP, 0}, 
      {"img\\xyz.bmp",   BMP, 0}, 
      {"img\\test.bmp",  BMP, 0} 
    };
    


  • Sorry aber für die Dateinamen habe ich eigentlich Konstanten und die sind in Ordnung. Ich wollte den Code nicht unübersichtlicher machen und habe (mal wieder) falsch getippt... 😞

    Ich vermutete, dass ich vielleicht den dritten Parameter der LoadMipMapTexture so schreiben müsste:

    (&texture_information[i].texture_id)
    

    Daran lag es allerdings auch nicht. Das Merkwürdige ist, dass der Dateiname des 2. Bildes nur teilweise nicht vorhanden ist. Das bedeutet, dass die ersten 3 Zeichen "überschrieben" wurden (das habe ich im Debugger gesehen).

    Das komische ist, dass es (bei zwei Bildern) funktioniert, wenn ich die Reihenfolge ändere. Das heißt: Zuerst das 2. Bild, dann das 1. laden...



  • ich möchte wetten wen du die Bilder von hinten nach vorne liest, das es dann funktioniert. erst 4 dann 3 dann 2 dann 1. Aber das heißt das deine Strukturdefinition noch einen Massiven Fehler hat. Was passiert sit das du beim Laden der Daten die Daten des nächsten Feldes überschreibst.

    Poste doch mal die Definitionen von
    TEXTURE_TYPE
    GLuint

    Als quick fix um zu überprüfen ob das der fehler ist
    erweitere deine Struktur wie folgt:

    typedef struct _TEXTURE_INFORMATION { 
       char         texture_name[256];       // Dateiname der Textur 
       TEXTURE_TYPE texture_type;            // Format der Textur 
       GLuint       texture_id;              // ID der Textur 
       char         dummiBuffer[512];        // Dummi Buffer
    
    } TEXTURE_INFORMATION;
    

    Wenns damit funktioniert hast du sicher ein Memory Problem



  • ich möchte wetten wen du die Bilder von hinten nach vorne liest, das es dann funktioniert. erst 4 dann 3 dann 2 dann 1.

    Ja, das funktioniert! Und vielen Dank, denn ich habe den Fehler nun gefunden als ich alles nochmal auseinander genommen hatte:

    Es lag an der Funktion:

    LoadMipMapTexture( texture_information[i].texture_name,
                       texture_information[i].texture_type,
                       &texture_information[i].texture_id);
    
    // LoadMipMapTexture verwendet  nur 2 OpenGL-API Funktionen,
    // die den dritten Parameter von LoadMipMapTexture modifizieren:
    
    glGenTextures(LOAD_TEXTURE_COUNT, textureID); //void glGenTextures (GLsizei n, GLuint *textures)
    glBindTexture(GL_TEXTURE_2D, *textureID); // void glBindTexture (GLenum target, GLuint texture)
    

    An der glGenTextures lag es, denn die Konstante LOAD_TEXTURE_COUNT führte dazu, dass diese Funktion bei jedem Aufruf in der Schleife 4 Textur-IDs erzeugte, die dann in einem zu kleinen Speicherbereich abgelegt wurden...

    LOAD_TEXTURE_ID habe ich entfernt und durch 1 ersetzt.

    Jetzt läuft es.

    PS: Sorry wegen des z.T. "unrelated topics". Ich vermutete allerdings einen ganz trivialen char-Fehler...

    Gruß
    Prog



  • Sorry wegen des z.T. "unrelated topics". Ich vermutete allerdings einen ganz trivialen char-Fehler...

    Was war den unrelated??



  • Was war den unrelated??

    Naja, die OpenGL Bezugnahme und teilweise Win32 typedefs... Das ist z.T. ganz schön nervig, oder nicht?

    😉


Anmelden zum Antworten