Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 03, 2025 11:47

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Mai 03, 2012 21:03 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Hallo,

ich habe bisschen weiter entwickelt und bin schon wieder auf etwas gestoßen auf das ich einfach keine Antwort finde.

Also ich Arbeite ja an einem Modellloader die Vertex daten einlesen funktioniert nun ganz gut. Auch das sortieren nach den Faces ist kein Problem.

Das ganze Läuft nun so ab Das ich ein Object erstelle vom Typ "MainObject" welches von "ChldObject" abstammt.

Das MainObject hat ein Array welches die ganzen "Kinder" beinhaltet.

beim einlesen werden nun alle daten in die arrays gespeichert: Name, Vertexdaten, Sichtbarkeit.
das geht alles super und hier setzt das problem an.

von dem mainobject kann ich die Bounding Box noch ohne probleme ermitteln aber bei den Kindern geht das nicht mehr.

wenn ich das versuche wird mir das gesammte Array gelöscht und ich bekomme einen schönen zugriffsfehler.

hier die Wichtigsten Codestellen:

Code:
  1. struct TVertex
  2. {
  3.     float x,y,z;
  4.     TVertex(){x=0;y=0;z=0;};
  5.     void Set(float x_, float y_, float z_){x=x_;y=y_;z=z_;};
  6.  
  7.     TVertex& operator = (TVertex const& rhs)  //Dem Linken die Rechten werte Zuweisen
  8.     {
  9.         TVertex tmp(rhs);
  10.         this->x=tmp.x;
  11.         this->y=tmp.y;
  12.         this->z=tmp.z;
  13.         return *this;
  14.     };
  15. };
  16.  
  17. struct ChildObject
  18. {
  19. public:
  20.   bool Visible;
  21.   std::string Name;
  22.   std::vector<TPolygon> Polys;
  23.   TVertex BoundingBox[7];
  24.  
  25.   void DrawBoundingBox_();
  26.   void Draw();
  27.   void CalculateBoundingBox();
  28. };
  29. void ChildObject::CalculateBoundingBox()
  30. {
  31.     float MinX, MaxX, MinY, MaxY, MinZ, MaxZ;
  32.     unsigned int x;
  33.     MinX=0; MaxX=0; MinY=0; MaxY=0; MinZ=0; MaxZ=0;
  34.  
  35.     for(x=0; x<Polys.size()-1; x++)
  36.     {
  37.         if(Polys[x].vert->x < MinX) MinX = Polys[x].vert->x;
  38.         if(Polys[x].vert->y < MinY) MinY = Polys[x].vert->y;
  39.         if(Polys[x].vert->z < MinZ) MinZ = Polys[x].vert->z;
  40.  
  41.         if(Polys[x].vert->x > MaxX) MaxX = Polys[x].vert->x;
  42.         if(Polys[x].vert->y > MaxY) MaxY = Polys[x].vert->y;
  43.         if(Polys[x].vert->z > MaxZ) MaxZ = Polys[x].vert->z;
  44.     }
  45.  
  46.     BoundingBox[0].Set(MinX,MinY,MinZ);
  47.     BoundingBox[1].Set(MaxX,MinY,MinZ);
  48.     BoundingBox[2].Set(MaxX,MinY,MaxZ);
  49.     BoundingBox[3].Set(MinX,MinY,MaxZ);
  50.     BoundingBox[4].Set(MinX,MaxY,MinZ);
  51.     BoundingBox[5].Set(MaxX,MaxY,MinZ);
  52.     BoundingBox[6].Set(MaxX,MaxY,MaxZ);
  53.     BoundingBox[7].Set(MinX,MaxY,MaxZ);
  54. };
  55.  
  56. struct MainObject : public ChildObject
  57. {
  58. public:
  59.     vector<ChildObject> Childs;
  60.     void DrawBoundingBox();
  61. };
  62.  


lg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mai 03, 2012 21:38 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Code:
  1. TVertex BoundingBox[7];

Hat die BoundingBox nicht 8 Ecken?

Übrigens kann man eine BoundingBox auch mit nur 2 Ecken beschreiben (Min und Max) oder (Position und Ausdehnung)

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mai 04, 2012 13:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
damadmax hat glaube ich schon einen guten Hinweis gegeben. Das klingt mir auch nach dem Überschreiben einer Arraygrenze. Sowas lässt sich ganz gut mit dem kostenlosen OpenSource-Tool valgrind debuggen.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mai 04, 2012 14:15 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Da wir von 0 anfangen zu zählen habe ich 8 ecken

Lg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mai 04, 2012 14:58 
Offline
DGL Member

Registriert: Sa Mär 14, 2009 17:48
Beiträge: 99
Programmiersprache: D, Java, C++
Dropye hat geschrieben:
Da wir von 0 anfangen zu zählen habe ich 8 ecken

Lg


Tatsächlich? In jeder mir bekannten Sprache werden die Anzahl der Array Elemente angegeben und nicht der letzte Index.

D.h. um nur ein Element in Delphi zu haben müsstest du sagen
Code:
  1. TVertex BoundingBox[0]
? Ich kann mir das garnicht vorstellen. Die Regel ist zumindest das man beim definieren die Anzahl der Elemente angibt und dann müsstest du wohl 8 angeben.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mai 04, 2012 18:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Dropye hat geschrieben:
Da wir von 0 anfangen zu zählen habe ich 8 ecken

Ich unterstütze mal Skeptiker. Das was du da hast sieht arg nach C++ aus, und ich zitiere mal den g++:
Code:
  1. #include <iostream>
  2.  
  3. struct Bar {
  4.   char foo[0];
  5. };
  6.  
  7. int main()
  8. {
  9.   std::cout << sizeof(Bar::foo) << std::endl;
  10.   std::cout << sizeof(Bar) << std::endl;
  11.   return 0;
  12. }

Führt zu:
Code:
  1. 0
  2. 0

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mai 04, 2012 19:36 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Haha, es gibt Sprachen die richtig s...... sind, da werden Arrays mit dem Index definiert und nicht mit der länge. (VB+VB.NET).
Aber der fehler ist ganz klar, das array muss als 8 definiert sein, da 0 - 7 indices... wie es sich gehört...
Übrigens VB ist s.......

Was für ein tag heute.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mai 08, 2012 12:51 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ja gut ich gebe mich geschlagen :D

Aber ich verstehe immernoch nicht warum ich nicht wie es sich gehört eine Access Violation bekommen habe sondern er mir das übergeordnete Array kaputt macht.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mai 08, 2012 13:31 
Offline
DGL Member

Registriert: Sa Mär 14, 2009 17:48
Beiträge: 99
Programmiersprache: D, Java, C++
Weil du in c++(?) Programmierst ;-). Es wird nicht geprüft ob du über die arraygrenzen hinaus schießt, und wenn du dann noch im Speicherbereich deines Programmes bleibst wirft das OS auch keine Access Violation, du darfst ja da rumwuseln.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 09, 2012 09:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das ist aber nicht nur in C++ so. Eine Zugriffsverletzung tritt in Delphi auch nur dann auf, wenn du versuchst auf Speicher zuzugreifen der nicht deiner Anwendung zugeordnet ist. So lange man im Speicher der Anwendung bleibt ist ziemlich egal was man da anstellt. In Delphi gibt für solche ArrayProbleme immerhin die Bereichsprüfung/Rangecheck der dabei dann wohl einen Fehler ausgelöst hätte. Keine Ahnung ob es so was für C++ auch gibt. Aber in der Regel entwickelt man eh mit so ziemlich allen möglichen Prüfungen. Erst bei der Veröffentlichung werden dann die meisten Prüfungen deaktiviert.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mai 09, 2012 10:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
std::vector wirft Exceptions, sofern aktiviert, wenn man aus den Bereich springt.
Das ist auch alles genau so wie es sein soll, denn std::vector ist c++ und int blupp[7] ist c.
In c gibt es keine exceptions und der rückgabewert von einem index operator ist nunmal eine reference vom array+offset. In C++ gibt es exceptions und die stl macht out of bound checks und wirft exceptions, wenn diese aktive werden.

Wenn man also out of bound checks haben will, dann sollte man auch c++ nutzten und nicht C, also std:vector oder besser ein besser geeigneten Container schreiben.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]