segfault bei float - Zuweisung



  • Hallo zusammen,
    ich verzweifle langsam an einer gar nicht so schwierigen Sache...
    ich will eine einfache Maximums- / Minimumsbestimmung auf drei Vektoren machen, Ergebnis ist ein Vektor mit maximalem/minimalem x1,x2 und x3-Wert.
    Folgender Code produziert einen Segmentation-Fault:

    float temp=v[0][0]<v[1][0]?v[0][0]:v[1][0];
    min[0]=temp;
    

    Unabhängig von der Funktionalität, mich wundert dass folgender Code läuft:

    float temp=v[0][0]<v[1][0]?v[0][0]:v[1][0];
    min[0]=3;
    

    btw, mein eigentlicher Code war (ebenfalls Segmentation fault):

    min[1]=minf(minf(v[0][1],v[1][1]),v[2][1])
    

    bereits vorgegeben war:
    inline float minf(const float a, const float b){ ...

    Danke schonmal für eure Hilfe
    BeefBonanza



  • Du suchst den Fehler wahrscheinlich an einer falschen Stelle. Syntaktisch ist der Code offensichtlich in Ordnung, sonst könntest Du es ja nicht kompilieren. Aber ich rate mal, dass v und/oder min ein Zeiger ist, und dass Du auf Speicherbereiche zugreifst, in denen Du nichts verloren hast.

    Mehr kann man eigentlich nicht zu deinem unvollständigen Code sagen.



  • v ist eine Vec3-Instanz... wichtig sind denke ich folgende oben verwendete Dinge:
    [] Operator in Vec3:

    struct Vec3 {
      float x, y, z;
    
      inline float& Vec3::operator[] (const int i) {
      return (&x)[i];
      }
    
      inline float Vec3::operator[] (const int i) const {
      return (&x)[i];
      }
    

    Evtl. ist schreiben über den []-Operator nicht möglich?! Über min.x führt zu segmentation fault...

    Funktion minf:

    inline float minf(const float a, const float b) {
      return a < b ? a : b;
    }
    

    Irgendwelche neuen Ansätze daraus?



  • BeefBonanza schrieb:

    Irgendwelche neuen Ansätze daraus?

    Das ist ziemlicher Murks. Niemand garantiert dir, dass x, y und z lückenlos und in dieser Reihenfolge im Speicher abgelegt sind. Nimm ein Array.

    Off-Topic: was versprichst du dir vom const in den Parameterlisten deiner Funktionen? Nicht dass es falsch wäre, ich frage mich nur warum man sowas macht.



  • BeefBonanza schrieb:

    struct Vec3 {
      float x, y, z;
      
      inline float& Vec3::operator[] (const int i) {
      return (&x)[i];
      }
    
      inline float Vec3::operator[] (const int i) const {
      return (&x)[i];
      }
    

    Kann mich nur anschließen: Murks!

    Wenn Du eine der beiden Funktionen mit i!=0 aufrufst --> undefiniertes Verhalten. Zeigerarithmetik ist nur erlaubt, solange der resultierende Zeiger noch "zum gleichen Array gehört". Die Variablen x, y und z sind dabei als 1-elementige Arrays zu betrachten. (&x)+0, (&x)+1, (&x)[0], *((&x)+0) ist so ziemlich das einzige, was erlaubt ist.

    Was ist denn nun der Typ von v und min? Zeig doch mal mehr relevanten Code!

    Gruß,
    SP


Anmelden zum Antworten