Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Mathias

Frischling

  • »Mathias« ist der Autor dieses Themas

Beiträge: 29

Wohnort: Berlin

Beruf: Schüler

  • Private Nachricht senden

1

20.04.2005, 21:21

Unerklärbarer Fehler?

Hi Leute!
Ich habe hier ein Problem. Ich lese eine DTS-Modelfile ein, der Fehler tritt auf beim Einlesen der Mesh-Daten. Das erste Mesh wird ohne Probleme eingelesen, danach bleibt das Programm mitten im normalen Programmfluss stehen.
Hier ein bisschen Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
   //// Meshes


   if(m_dwNumMeshes > 0)
   {
    m_pMeshes = new SMesh[m_dwNumMeshes];
    
    for(int j=0;j<m_dwNumMeshes;j++)
    {
     SMesh& mesh = m_pMeshes[j];
     
     //PrintBufferProgress();

     
     // Typ des Meshes ---------------

     Read(&mesh.dwType,1);
     
     iCheckpoint++;
     /// Nächster Checkpoint

     if( !ReadCheck(iCheckpoint) ) return 160100+j;
     cout << "BEGIN" << endl;
     // Header -----------------------

     Read(&mesh.dwNumFrames,1); cout << "dwNumFrames = " << mesh.dwNumFrames << endl;
     Read(&mesh.dwMatFrames,1); cout << "dwMatFrames = " << mesh.dwMatFrames << endl;
     Read(&mesh.dwParent,1);    cout << "dwParent = " << mesh.dwParent << endl;
     // BoundingBox ------------------

     Read(&mesh.sbBounds.ptMin->x,1); cout << "bounds.min.x = " << mesh.sbBounds.ptMin->x << endl;
     Read(&mesh.sbBounds.ptMin->y,1); cout << "bounds.min.y = " << mesh.sbBounds.ptMin->y << endl;
     Read(&mesh.sbBounds.ptMin->z,1); cout << "bounds.min.z = " << mesh.sbBounds.ptMin->z << endl;
     Read(&mesh.sbBounds.ptMax->x,1); cout << "bounds.max.x = " << mesh.sbBounds.ptMax->x << endl;
     Read(&mesh.sbBounds.ptMax->y,1); cout << "bounds.max.y = " << mesh.sbBounds.ptMax->y << endl;
     Read(&mesh.sbBounds.ptMax->z,1); cout << "bounds.max.z = " << mesh.sbBounds.ptMax->z << endl;
     Read(&mesh.ptCenter.x,1);        cout << "center.x = " << mesh.ptCenter.x << endl;
     Read(&mesh.ptCenter.y,1);        cout << "center.y = " << mesh.ptCenter.y << endl;
     Read(&mesh.ptCenter.z,1);        cout << "center.z = " << mesh.ptCenter.z << endl;
     Read(&mesh.fRadius,1);           
     cout << "radius = " << mesh.fRadius << endl;
     // hier bleibt das Programm stehen?                ////////////////////////////////////////--------------------------------------

     cout << "vertices,";
     // Vertices ---------------------

     int iNumVertices = 0;
     Read(&iNumVertices,1);
     mesh.pVertices = new SPoint[iNumVertices];
     for(int i=0;i<iNumVertices;i++)
     {
      Read(&mesh.pVertices[i].x,1);
      Read(&mesh.pVertices[i].y,1);
      Read(&mesh.pVertices[i].z,1);
     }
     cout << "tex coords,";
     // Textur Koordinaten -----------

     int iNumTextureCoords = 0;
     Read(&iNumTextureCoords,1);
     mesh.pTexVertices = new SPoint2D[iNumTextureCoords];
     for(int i=0;i<iNumTextureCoords;i++)
     {
      Read(&mesh.pTexVertices[i].x,1); 
      Read(&mesh.pTexVertices[i].y,1);
     }
     cout << "normals,";
     // Normalen ---------------------

     mesh.pNormals = new SPoint[iNumVertices];
     for(int i=0;i<iNumVertices;i++)
     {
      Read(&mesh.pNormals[i].x,1);
      Read(&mesh.pNormals[i].y,1); 
      Read(&mesh.pNormals[i].z,1); 
     } 
     cout << "enormals,";
     // Enkodierte Normalen ---------- 

     mesh.pEncodedNormals = new char[iNumVertices];
     for(int i=0;i<iNumVertices;i++)
     {
      Read(&mesh.pEncodedNormals[i],1);
     }
     cout << "primitives,";
     // Primitive --------------------

     mesh.iNumPrimitives = 0;
     Read(&mesh.iNumPrimitives,1);
     mesh.pPrimitives = new SPrimitive[mesh.iNumPrimitives];
     for(int i=0;i<mesh.iNumPrimitives;i++)
     {
      Read(&mesh.pPrimitives[i].wFirstElement,1); 
      Read(&mesh.pPrimitives[i].wNumElements,1); 
      Read(&mesh.pPrimitives[i].dwType,1); 
     }
     cout << "indices,";
     // Indices ----------------------

     int iNumIndices = 0;
     Read(&iNumIndices,1);
     mesh.pIndices = new UWORD[iNumIndices];
     for(int i=0;i<iNumIndices;i++)
     {
      Read((WORD*)&mesh.pIndices[i],1);
     } 
     cout << "mindices,";
     // MIndices ---------------------

     int iNumMIndices = 0;
     Read(&iNumMIndices,1);
     mesh.pMIndices = new UWORD[iNumMIndices];
     for(int i=0;i<iNumMIndices;i++)
     {
      Read((WORD*)&mesh.pMIndices[i],1);
     }
     cout << "stuff" << endl;
     // Sonstiges dazu

     Read(&mesh.dwVertsPerFrame,1);
     Read(&mesh.dwFlags,1);
     cout << "END" << endl;
     if( !ReadCheck(++iCheckpoint) ) return 170100+j;     
          
    } // for i <-> m_dwNumMeshes

    
   } // if m_dwNumMeshes > 0

   if( !ReadCheck(iCheckpoint++) ) return 118;


Wie kann das Programm völlig grundlos einfach stehen bleiben?
Es werden nicht einmal irgendwelche besonderen Operationen zu diesem Zeitpunkt ausgeführt. Und der Wert der ausgelesen wird ist ein normaler Integer. ...
Hat einer eine Ahnung was die Ursache sein könnte?

P.S.

Die Funktion Read() liest Daten aus einem ganz normalen 32/16 oder 8 Bit Buffer, je nach Typ des übergebenen Zielpuffers.

2

20.04.2005, 22:26

Wie bleibt das Programm denn stehen? Gibt es eine Access Violation, eine Endlosschleife oder gar ein fehlerloser Programmabbruch?

Ich gehe mal davon aus das es eine Access Violation gibt. Dieser passiert denke ich irgendwo innerhalb von std::cout. Nach deiner Markierung. std::cout ist jedoch fehlerfrei. Daher denke ich das du irgendwo in Speicher hineinschreibst in den man nicht schreiben darf oder ähnliches.

Was sagt denn der Debugger dazu? Prüfe auch einmal ob die Werte in deinem File stimmen. Hast du vieleicht ein fertiges Programm mit dem du das File laden kannst?
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Mathias

Frischling

  • »Mathias« ist der Autor dieses Themas

Beiträge: 29

Wohnort: Berlin

Beruf: Schüler

  • Private Nachricht senden

3

20.04.2005, 22:48

Leider habe ich kein fertiges Programm, welches die Datei laden kann.
Allerdings habe ich den Fehler inzwischen gefunden. Es scheint tatsächlich eine Art
Access Violation zu sein. Es wird zwar in dieser Hinsicht nichts ausgegeben, aber nach dem ich es geschafft hatte die "Ausführungsgrenze" weiter nach hinten zu setzen,
bis kurz vor die Allokierung des Speichers für die Textur-Koordinaten, da habe ich mal die Anzahl der Textur-Koordinaten ausgegeben. Die Zahl hatte weit mehr als 6 stellen.
Das wird wohl der Fehler gewesen sein. Aus irgendeinem Grund wird die Anzahl nicht richtig eingelesen, was komisch ist weil es ja beim ersten Mesh noch problemlos funktioniert.
Wie auch immer, es dann wohl Speicher von beträchtlicher Größe allokiert werden,
und das die Schleife um diese große Zahl abzuarbeiten auch ziemlich lange braucht erklärt sich von selbst.
Ich hab zwar jetzt noch keine Lösung, aber weiß wenigstens wo die Ursache ist.

Danke für die Antwort, trotzdem. :)

Werbeanzeige