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

Aktuelle Zeit: Mi Jul 16, 2025 16:45

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Mär 13, 2004 17:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Hi,
folgende Procedure:
Code:
  1.  
  2. procedure TForm1.DrawScene;
  3. begin
  4.   RenderScene;
  5.   glColor3f(1,1,1);
  6.   MyGLFont.BeginFont;
  7.   MyGLFont.Print(8,12,PChar(ToPrint));
  8.   MyGLFont.Print(8,28,'Press left, right, up or down to rotate and + or - to zoom.');
  9.   MyGLFont.EndFont;
  10.   SwapBuffers(h_DC);
  11. end;
  12.  


Wenn ich nun die Zeilen
Code:
  1.  
  2.   glColor3f(1,1,1);
  3.   MyGLFont.BeginFont;
  4.   MyGLFont.Print(8,12,PChar(ToPrint));
  5.   MyGLFont.Print(8,28,'Press left, right, up or down to rotate and + or - to zoom.');
  6.   MyGLFont.EndFont;
  7.  

als letzte Zeilen vor dem abschließenden end; in die procedure RenderScene packe, dann crasht das Programm mit einer Access Violation bei der Adresse 00000000, sobald ich das Formular anklicke.
Wobei die OnClick Procedure eigentlich nichts kritisches macht. Die Selection-Funktion ist die, aus dem Tutorial:
Code:
  1.  
  2. var
  3.   SelectedCard, TX, TY: Integer;
  4. begin
  5.   SelectedCard := Selection(X,Y);
  6.   if SelectedCard = 0 then exit;
  7.   TX := 1 + (SelectedCard - 1) mod MyGameField.XCount;
  8.   TY := 1 + (SelectedCard - 1) div MyGameField.XCount;
  9.   MyGameField.Flip(TX, TY);
  10. end;
  11.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 13, 2004 17:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das sieht für mich nach nem "Random-Fehler" aus, also einem Fehler der nicht direkt mit deiner oben geschilderten Änderung zu tun hat. Das kommt gerne vor wenn man irgendwo was mit Zeigern falsch macht oder Array-Grenzen verletzt. Von daher mal alle Debugging-Optionen einschalten und im Einzelschritt durchgehen und auch ggf. verdächtige Variablen in dein Watchfenster nehmen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 13, 2004 17:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Wo setz ich da an bei der Fehlersuche? Diese Fehlerart ist nun komplett neu für mich. :( Es scheinet keine Indizen zu geben, wo der Fehler auftritt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 13, 2004 17:45 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Eine Idee wäre nicht den ganzen Block zu verschieben, sondern immer nur einzelnen Anweisungen. Vielleicht gibt dir die kritische Anweisung dann irgendeinen Hinweis. Wenn man z.B. mit dynamischen Arrays Fehler macht, dann wird es nacher vermutlich wieder bei einem Befehl der Speicher belegt einen Fehler geben. Dann würde ich nochmal einen Haltepunkt direkt auf das Begin setzen und schauen, wie die OnClick Prozedure ausgeführt werden kann. Vielleicht sind auch irgendwelche Objekte nicht initialisiert oder der Zeiger wurde überschrieben. Dann bringt es auch immer was einzelne Zeilen auszukommentieren und sich Stück für Stück voranzuarbeiten, so daß man nacher genau feststellen kann welche Befehl für den Fehler verantwortlich ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 13, 2004 17:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Dass der Crash mit der Procedure .Print zusammenhängt, soweit war ich, aber in der geschieht meines errachtens nichts böses. :/
Ich hab mal die glFont.pas angehängt...


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 13, 2004 18:04 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ersetz mal in der print Funktion pchar durch String. Vielleicht geht das was mit den Strings, die ja auch ähnlich wie dynamische Arrays verwaltet werden, durcheinander. Das dürfte dann aber nicht der einzelne Fehler sondern nur ein Nebeneffekt sein.

Code:
  1. procedure TglFont.Print(x, y: integer; const Text: String);
  2. begin
  3.   if (text = '') then
  4.     exit;
  5.   glRasterPos2i(x, y);
  6.   glCallLists(Length(Text), GL_UNSIGNED_BYTE, @Text[1]);
  7. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 13, 2004 18:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Danke, hat aber den Crash nicht behoben.
Hier wäre noch die (Ziemlich aus dem Tutorial übernommene) Funktion Selection:

Code:
  1.  
  2. function Selection(xs, ys: Double) : integer;
  3. var
  4.   Puffer       : array[0..256] of GLUInt;
  5.   Viewport     : TVector4i;
  6.   Treffer,i    : Integer;
  7.   Z_Wert       : GLUInt;
  8.   Getroffen    : GLUInt;
  9. begin
  10.   glGetIntegerv(GL_VIEWPORT, @viewport);      //Die Sicht speichern
  11.   glSelectBuffer(256, @Puffer);                                 //Den Puffer zuordnen
  12.   glRenderMode(GL_SELECT);                              //In den Selectionsmodus schalten
  13.   glmatrixmode(gl_projection);                //In den Projektionsmodus
  14.   glPushMatrix;                                        //Um unsere Matrix zu sichern
  15.   glLoadIdentity;                                      //Und dieselbige wieder zurückzusetzen
  16.  
  17.   gluPickMatrix(xs, viewport[3]-ys, 1.0, 1.0, viewport);
  18.   gluPerspective(45.0, Form1.ClientWidth/Form1.ClientHeight, 1, 1000);
  19.  
  20.   Form1.RenderScene;                                                     //Die Szene zeichnen
  21.   glmatrixmode(gl_projection);                //Wieder in den Projektionsmodus
  22.   glPopMatrix;                                          //um unsere alte Matrix wiederherzustellen
  23.  
  24.   treffer := glRenderMode(GL_RENDER);         //Anzahl der Treffer auslesen
  25.  
  26.   Getroffen := High(GLUInt);                  //Höchsten möglichen Wert annehmen
  27.   Z_Wert := High(GLUInt);                     //Höchsten Z - Wert
  28.   for i := 0 to Treffer-1 do
  29.   if Puffer[(i*4)+1] < Z_Wert then
  30.   begin
  31.     getroffen       := Puffer[(i*4)+3];
  32.     Z_Wert := Puffer[(i*4)+1];
  33.   end;
  34.  
  35.   Result := getroffen;
  36. end;
  37.  


Der Crash tritt Form1.RenderScene; auf.
Und jop, der Aufruf von einer Funktion der Klasse Form1 aus der Funktion Selection ist ziemlich unelegant und wird noch beizeiten geändert. \";)\"

Und noch die Procedure Renderscene:
Code:
  1.  
  2. procedure TForm1.RenderScene;
  3. begin
  4.   glMatrixMode(GL_MODELVIEW);
  5.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  6.   glLoadIdentity;
  7.   glInitnames;
  8.   glPushname(0);
  9.  
  10.   glPushMatrix;
  11.   glRotateF(globalangle,1,1,1);
  12.   glTranslatef(-500,-500,-500);
  13.   DrawTexCube(Room,RoomTex);
  14.   glPopMatrix;
  15.  
  16.   glPushMatrix;
  17.   MyGameField.Draw;
  18.   glPopMatrix;
  19.  
  20.   glColor3f(1,1,1);
  21.   MyGLFont.BeginFont;
  22.   MyGLFont.Print(8,12,ToPrint);
  23.   MyGLFont.Print(8,28,'Press left, right, up or down to rotate and + or - to zoom.');
  24.   MyGLFont.EndFont;
  25. end;
  26.  


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 16 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]