Ergebnis 1 bis 3 von 3

Thema: [C++] Pointermagic? Hilfe! - erledigt

  1. #1

    [C++] Pointermagic? Hilfe! - erledigt

    Ich bin grad etwas ratlos was Pointer angeht. Eigentlich wollte ich mir eine "float *getData()" Methode schreiben, die mir einen Pointer auf irgendwelche von den Parametern abhängige Daten zurückgibt. Die Methode gibt mir allerdings immer einen Pointer auf dieselbe Stelle zurück. Interessanterweise aber nur solange bis ich mir den Pointer nicht nur ausserhalb der Methode auf die Console ausgebe, sondern auch innerhalb. Dann hab ich nämlich sowohl in der Methode als auch ausserhalb der Methode unterschiedliche Pointer. Aber leider nochimmer nicht die richtigen. Die richtigen bekomme ich dann, wenn ich den Methodenaufruf bleiben lasse und stattdessen direkt den Code innerhalb der Methode verwende.

    getData sieht folgendermaßen aus:
    Code:
        float *getData(Scene *scene, MeshNode *meshNode, SubMesh *subMesh, string name){
            float *data = NULL;
            if(name == "world"){
                data = reinterpret_cast<float*>(&meshNode->getDerivedTransform());
            }else if(name == "view"){
                data = reinterpret_cast<float*>(&scene->getActiveCamera()->getDerivedTransform());
            }else if(name == "proj"){
                data = reinterpret_cast<float*>(&scene->getActiveCamera()->getPerspectiveMatrix());
            }else if(name == "vertex"){
                data = reinterpret_cast<float*>(subMesh->getValue("position") );
            }else if(name == "normal"){
                data = reinterpret_cast<float*>(subMesh->getValue("normal") );
            }
    
            // Wenn data ausgegeben wird, dann liefert getData() für unterschiedliche namen unterschiedliche Pointer. 
            // cout << data << endl;
            return data;
        }
    Wenn ich jetzt getData folgendermaßen verwende:
    Code:
    float *data = getData(scene, meshNode, subMesh, uniform.name);
                        Logger::instance()->logInfo <<  StringUtils::rightPad(uniform.name + ":", 10) << uUniform << "\t" << data << endl;
    dann bekomme ich diese Ausgabe:
    Zitat Zitat
    INFO: [ SinglePassAutoMapMaterial.cpp (293)]: === AUTOMAP ===
    INFO: [ SinglePassAutoMapMaterial.cpp (300)]: proj: 0 0034F8BC
    INFO: [ SinglePassAutoMapMaterial.cpp (300)]: view: 1 0034F8BC
    INFO: [ SinglePassAutoMapMaterial.cpp (300)]: world: 2 0034F8BC
    INFO: [ SinglePassAutoMapMaterial.cpp (342)]: ==========
    Alle 3 Pointer sind ident. Wenn ich das cout in getData aus dem Kommentar nehme, dann sieht die Ausgabe so aus:
    Zitat Zitat
    INFO: [ main.cpp (100)]: fps: 9.24413
    INFO: [ SinglePassAutoMapMaterial.cpp (293)]: === AUTOMAP ===
    0038F3CC
    INFO: [ SinglePassAutoMapMaterial.cpp (300)]: proj: 0 0038F3CC
    0038F38C
    INFO: [ SinglePassAutoMapMaterial.cpp (300)]: view: 1 0038F38C
    0038F34C
    INFO: [ SinglePassAutoMapMaterial.cpp (300)]: world: 2 0038F34C
    INFO: [ SinglePassAutoMapMaterial.cpp (342)]: ==========
    Die Pointer sind jetzt verschieden aber die richtigen Pointer bekomme ich erst dann, wenn ich den getData Code direkt verwende:
    Code:
    // Mit getData()
    GLuint uUniform = glGetUniformLocation(shaderHandle, uniform.name.c_str());
    float *data = getData(scene, meshNode, subMesh, uniform.name);
    Logger::instance()->logInfo <<  StringUtils::rightPad(uniform.name + ":", 10) << uUniform << "\t" << data << endl;
                    
    // direkt
    if(uniform.name == "world"){
        data = reinterpret_cast<float*>(&meshNode->getDerivedTransform());
    }else if(uniform.name == "view"){
        data = reinterpret_cast<float*>(&scene->getActiveCamera()->getDerivedTransform());
    }else if(uniform.name == "proj"){
        data = reinterpret_cast<float*>(&scene->getActiveCamera()->getPerspectiveMatrix());
    }else if(uniform.name == "vertex"){
        data = reinterpret_cast<float*>(subMesh->getValue("position") );
    }else if(uniform.name == "normal"){
        data = reinterpret_cast<float*>(subMesh->getValue("normal") );
    }
    Logger::instance()->logInfo <<  StringUtils::rightPad(uniform.name + ":", 10) << uUniform << "\t" << data << endl;
    Die Ausgabe dazu:
    Zitat Zitat
    INFO: [ SinglePassAutoMapMaterial.cpp (293)]: === AUTOMAP ===
    0039F75C
    INFO: [ SinglePassAutoMapMaterial.cpp (300)]: proj: 0 0039F75C getData()
    INFO: [ SinglePassAutoMapMaterial.cpp (313)]: proj: 0 0039F9C4 direkt
    0039F71C
    INFO: [ SinglePassAutoMapMaterial.cpp (300)]: view: 1 0039F71C getData()
    INFO: [ SinglePassAutoMapMaterial.cpp (313)]: view: 1 0039FA44 direkt
    0039F6DC
    INFO: [ SinglePassAutoMapMaterial.cpp (300)]: world: 2 0039F6DC getData()
    INFO: [ SinglePassAutoMapMaterial.cpp (313)]: world: 2 0039FA04 direkt
    INFO: [ SinglePassAutoMapMaterial.cpp (341)]: ==========
    Ich wäre sehr dankbar wenn mir jemand erklären könnte was da passiert.

    Geändert von nudelsalat (22.09.2010 um 21:35 Uhr)

  2. #2
    Haha, ich rätsel da schon ein weilchen rum und kaum mach ich nen Thread auf hab ich nen Geistesblitz was die Ursache sein könnt. getDerivedTransform und getPerspectiveMatrix geben keine Pointer zurück und sind damit futsch sobald die getData Methode verlassen wird. Auf sowas muss man mal draufkommen wenn man den ganzen Tag nur Java programmiert.

    Mal testen.

    Edit: Das wars tatsächlich.

    Geändert von nudelsalat (22.09.2010 um 21:34 Uhr)

  3. #3
    Hätte ich jetzt auch erstmal getippt, dass die Variablen nur in der Methode lokal existieren, und danach wieder gelöscht werden, oderwie das bei C++ halt gehandhabt wird. Mit sowas hab ich in letzter Zeit ständig mit Java zu kämpfen x(

    Naja, viel Erfolg noch!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •