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

Aktuelle Zeit: Fr Jul 18, 2025 12:40

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Okt 13, 2005 13:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Hallo...

Ich habe ein seltsames Problem, habe mal verfolgt was Delphi da macht...

Result[1] := Game.Level.GetInterpolatedHeight(Result[0],Result[2]);
-> In der Funktion Wird richtig gerechnet, richtiges Ergebnis wird in der Funktion GetInterpolatedHeight errechnet und in Result geschrieben.
test := Result[1];
-> Nicht der Inhalt, der in der Funktion oben errechnet wurde... irgend eine Zahl mit e-39 oder e-302 kommt da raus...

Obwohl der Breakpoint den ich in die Funktion setzte richtige ergebnisse lieferte.
Wo liegt da das Problem? mach ich was falsch?

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 13, 2005 13:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Äh. Ich glaube du solltest mal ein bisschen Code springen lassen. Sonst kann ich dazu nicht viel sagen. Mir passiert es aber auch schon ab und an mal, dass der Debugger von Delphi falsche Ergebnisse anzeigt das fertige Program dann aber richtig rechnet. Ich gehe ja auch mal davon aus, dass Result[1] und Test den gleichen Typ haben. Durch Zuweisungen auf einen Geringer aufgelösten Typ (Double -> Single) verlieren die Daten natürlich an Genauigkeit. Aber das Ergebnis dürfte von so etwas normal kaum beeinflusst werden. Die Abweichungen wären minimal(st).

Außer vielleicht eine Anmerkung die nicht direkt mit dem Thema zu tun hat. Arrays oder Record als Rückgabewerte von Funktionen sind ein wenig kritisch. Nicht wegen der Kompatibilität sondern wegen der Geschwindigkeit. Delphi kopiert dein Ergebnis erst einmal in einen Zwischenbuffer und daraus dann in deine Variable. Praktischer wäre es, wenn du deine Variable als var Parameter an die Funktion übergibst. Dann werden die Daten direkt in den Speicherbereich hinein geschrieben. Du kannst dir vorstellen, dass das bei komplexen Typen einiges an Arbeit ersparen kann. Vorrausgesetzt die werden entsprechend häufig aufgerufen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 13, 2005 16:36 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Da du Debugger erwähnst... Hast du Codeoptimierung ausgeschaltet? Eventuell zeigt dir der Debugger deshalb Mist an.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 13, 2005 20:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Weil ihr code wolltet...

Code:
  1. FUNCTION OldPosRVectorToNewPos( aPos : TGLVectord3; aRichtung : TGLVectord3 ; aSpeed : single ) : TGLVectord3 ;
  2. VAR
  3.   test : single;
  4. BEGIN
  5.   Result[0] := aPos[0] + aRichtung[0] * -aSpeed;
  6.   Result[2] := aPos[2] + aRichtung[2] * -aSpeed;
  7.    Result[1] := Game.Level.GetInterpolatedHeight(Result[0],Result[2]);
  8.    test := Result[1];
  9. END;


Code:
  1. function TLevel.GetInterpolatedHeight(x, y: single): single;
  2. var
  3.   x1, y1, x2, y2: integer;
  4.   fx, fy: single;
  5. begin
  6.  
  7.  if (x > levelsize) or (y > levelsize) then
  8.  begin
  9.   result := 0;
  10.   exit;
  11.  end;
  12.  
  13.   x := abs(x);
  14.   y := abs(y);
  15.   x := x / levelsize * LevelRes;
  16.   y := y / levelsize * LevelRes;
  17.  
  18.   fx := frac(x);
  19.   fy := frac(y);
  20.  
  21.   x1 := trunc(x);
  22.   x2 := x1 + 1;
  23.   y1 := trunc(y);
  24.   y2 := y1 + 1;
  25.  
  26.   Result := (LevelDaten[x1, y1].y * (1 - fx) * (1 - fy) +
  27.     LevelDaten[x1, y2].y * (1 - fx) * fy +
  28.     LevelDaten[x2, y1].y * fx * (1 - fy) +
  29.     LevelDaten[x2, y2].y * fx * fy);
  30. end;


Also in dem letzten da ist der Inhalt von Result noch richtig, kommt dann aber oben (in der ersten) falsch an... :-/ ??

Ja kann ich noch machen, das mit dem als var ... gute idee, weil das passiert in manchen fällen jeden frame und dann sogar mal später evtl. 50 mal pro frame...

EDIT: Hab die Optimierung mal ausgemacht -> gleiche ergebnisse...

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 14, 2005 08:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hmmmm. Also ich kann jetzt so nichts schlimmes feststellen.

Das einzige worauf ich "tippen" würde wäre die Vermischung unterschiedlicher Floattypen. Also auf der einen Seite benutzt du ein Single und dein Vector müsste vom Typ Double sein. Wegen dem d hinten dran. Da Single nun mal eine geringere Auflösung als Double hat müssen beim Konvertieren nach Single natürlich irgendwo Abstriche gemacht werden. Allerdings benutzt du in der GetInterpolatedHeight ja bereits einen Single und den zwischenzeitlich in einem Double zu transportieren ist eigentlich recht ungefährlich. Wobei deine Zahl e-30 oder e-300 sind sehr sehr kleine Zahlen. Also die sind praktisch gesehen gleich 0. (Wenn ich mich da gerade nicht vertue.) Und wenn als Wert eigentlich 0 rauskommen sollte, dann stimmt es ja auch wieder. Bis auf minimalste Abweichungen.

Mir stellt sich auch die Frage ob das evtl nur Delphi so doof darstellt oder ob sie wirklich den Wert haben. Also ich würde mir zur Laufzeit mal über ShowMessage(FloatToString()); den tatsächlichen Wert an den verschiedensten Stellen ausgeben lassen. Kann sein, dass der Debugger da mal spinnt. Kommt schon mal vor so etwas. Oder du benutz einmal in deinen Methoden ein Double oder mal testweise einen SingleVektor.

Sind aber alles nur Vermutungen, wenn ich ehrlich bin. Also kein genauer Plan. :(


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 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 ]