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

Aktuelle Zeit: Sa Jul 12, 2025 19:46

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Delphi kaputt???
BeitragVerfasst: So Sep 02, 2007 14:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
In der Roten Zeile ist das Problem wenn ich dort nen Haltpunkt setzte und dann mir den Wert von i angucke ist er beim ersten mal 8...Kann das überhaupt durch einen Fehler im Quellcode verursacht werden wenn ja wäre nett wenn ihr mir den Fehler sucht

Code:
  1. var TempNodes : array[1..8] of PG3DEOctreeNode;
  2.     h, i, j : Integer;
  3. begin
  4.   NumC := 0;
  5.  
  6.   for h := 1 to 8 do
  7.     Begin
  8.       New(TempNodes[h]);
  9.       TempNodes[h].pos    := pos;
  10.       TempNodes[h].Height := Height/2;
  11.       TempNodes[h].Width  := Width/2;
  12.       TempNodes[h].Depth  := Depth/2;
  13.     End;
  14.  
  15.   TempNodes[2].Pos.X := TempNodes[2].Pos.X + TempNodes[2].Width;
  16.  
  17.   TempNodes[3].Pos.Z := TempNodes[3].Pos.Z + TempNodes[3].Depth;
  18.  
  19.   TempNodes[4].Pos.X := TempNodes[4].Pos.X + TempNodes[4].Width;
  20.   TempNodes[4].Pos.Z := TempNodes[4].Pos.Z + TempNodes[4].Depth;
  21.  
  22.   TempNodes[5].pos.Y := TempNodes[5].Pos.Y + TempNodes[5].Height;
  23.  
  24.   TempNodes[6].Pos.X := TempNodes[6].Pos.X + TempNodes[6].Width;
  25.   TempNodes[6].pos.Y := TempNodes[6].Pos.Y + TempNodes[6].Height;
  26.  
  27.   TempNodes[7].pos.Y := TempNodes[7].Pos.Y + TempNodes[7].Height;
  28.   TempNodes[7].Pos.Z := TempNodes[7].Pos.Z + TempNodes[7].Depth;
  29.  
  30.   TempNodes[8].Pos.X := TempNodes[8].Pos.X + TempNodes[8].Width;
  31.   TempNodes[8].pos.Y := TempNodes[8].Pos.Y + TempNodes[8].Height;
  32.   TempNodes[8].Pos.Z := TempNodes[8].Pos.Z + TempNodes[8].Depth;
  33.  
  34.   for i := 1 to 8 do
  35.     begin
  36.       // Nachfolge Zeile ist die Besagte
  37.       TempNodes[i].NumT := 0;
  38.       for j := low(PTriangles) to high(PTriangles) do
  39.         Begin
  40.           if TempNodes[i].TriangleIn(PTriangles[j]) then inc(TempNodes[i].NumT);
  41.         End;
  42.       if TempNodes[i].NumT > 0
  43.         then
  44.           begin
  45.             inc(NumC);
  46.             setLength(children,NumC);
  47.             children[numc-1] := TempNodes[i];
  48.             SetLength(Children[numc-1].PTriangles,NumT);
  49.             for j := low(PTriangles) to high(PTriangles) do
  50.               Begin
  51.                 if Children[numc-1].TriangleIn(PTriangles[j]) then Children[numc-1].PTriangles[j] := PTriangles[j];
  52.               End;
  53.             if children[numc-1].NumT < MAX_TRIANGELS_IN_NODE
  54.               then
  55.                 Begin
  56.                   children[numc-1].smallest := TRUE;
  57.                  
  58.                 End;
  59.           End
  60.         Else
  61.           Begin
  62.             Dispose(TempNodes[i]);
  63.           End;
  64.     end;
  65.   for i:=0 to NumC-1 do
  66.     Begin
  67.       if Children[i].smallest = FALSE then Children[i].Divide;
  68.     End;


MFG FrenK

// Edit Lossy: Pascaltags hinzugefügt und Zeile anders markiert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 02, 2007 14:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. Funktioniert der Code denn?

Ich tippe mal darauf, dass du Optimierungen im Delphi aktivierst hast? Dadurch optimiert Delphi den Code und stellt diesesn Mitunter etwas um. Schleifen gehen dann intern häufiger von Max bis 0 oder so. Und wenn du dir das jetzt im Debugger anschaust, dann kann es sein, dass einige Werte nicht verfügbar sind, weil sie sich nur noch im Prozessorregister befinden oder halt so komisch umgeformt wurden.

Wenn du die Optimierung deaktivierst, dann bildet Delphi deinen Code genau so ab wie du ihn geschrieben hast. Mitunter ist dieser dann aber durchaus langsamer.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 02, 2007 16:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 08:25 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Die Schleife wird aber nicht wirklich umgedreht, die Laufvariable läuft nur rückwärts. In der Schleife werden die Indexe dann anders berechnet. Das liegt daran, dass durch das Umdrehen a) ein einfacher Counter in der CPU benutzt werden kann (Register C) und ein JZ (JumpZero) einer der schnellsten Microcodes ist. Wenn die Schleife nicht umgedreht würde, müsste jedesmal die Abbruchbedingung nach A geladen werden und mit einem JE (JumpEqual) die Schleife verlassen werden. Dieser JE braucht ein Vielfaches von JZ (Prozessortakte), da hier intern (ALU) eine Differenz gebildet und ein JZ durchgeführt wird. Dieses Verhalten ist also völlig normal und der Compiler tut dies mbMn auch ohne Optimierung.
Ein ähnliches Verhalten lässt sich übrigens bei Case-Anweisungen feststellen. Die Cases werden aufsteigend ihrer Wertigkeit nach geordnet. Das ist auch der Grund warum in Delphi anders als in C die Anweisung nach Abarbeitung des Cases grundsätzlich verlässt.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.008s | 14 Queries | GZIP : On ]