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
constin 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