Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Andorra 2D] unbekanntes Problemchen ;) (https://www.delphipraxis.net/92754-%5Bandorra-2d%5D-unbekanntes-problemchen-%3B.html)

incubus_v 25. Mai 2007 11:38


[Andorra 2D] unbekanntes Problemchen ;)
 
Einen schönen guten Morgen,

ich habe ein Problem mit Andorra 2D. Es passt perfekt zu meinen Vorhaben und ich hatte bis jetzt auch noch keine Probleme. Nun versuche ich Andorra in mein bereits bestehendes Programm einzubinden und dann ist dann leider auch schon ende... Bei meinem Spiel handelt es sich um ein Echtzeit-Strategiespiel, welches auf Sql aufbaut. Was ich mit Andorra anfangen möchte lassen wir einfach mal in den Raum gestellt ;) - Ist auch alles nicht so wichtig...

Nun zu meinem Problem: Wenn ich eine neue Anwendung erstelle und diese laufen lasse, funktioniert dies Problemlos. Wenn ich jetzt allerdings eine neue Form in meiner bestehenden Anwendung erzeuge treten Problme an den seltsamsten Stellen auf....
Also habe ich versucht des Wurzels Übel zu finden und erst einmal alles weggelassen und nach und nach wieder aufgebaut, bis zu folgender Stelle

Delphi-Quellcode:
  AdDraw := TAdDraw.Create(self);
  AdDraw.DllName := 'AndorraDX93D.dll';
funktioniert es ohne Fehler, doch sobald

Delphi-Quellcode:
  if AdDraw.Initialize then
aufgerufen wird, gibt es lauter Fehlermeldungen sobald ich im Ursprünglichen Programm etwas verändere. Das Initialisieren selbst macht keine Probleme.

Das Problem selbst ist das seltsamste... Es werden lauter Zahlen erzeugt, die keinen Sinn ergeben...
Folgendes lässt vielelicht klar werden was passiert:

Zitat:

['14:10:02']
System Message:='11,000000514569' ist kein gültiger Integerwert
Adresse:=0000741A
Unit:=
Method:=
Line:=0
BugPos:=g3_2
['14:14:24']
System Message:='11,000000514569' ist kein gültiger Integerwert
Adresse:=0000741A
Unit:=
Method:=
Line:=0
BugPos:=g3_2
['15:28:40']
System Message:=''TabSheet0,99999998430675'' ist kein gültiger Komponentenname
Adresse:=0001B28D
Unit:=
Method:=
Line:=0
BugPos:=m_u_6
['12:27:58']
System Message:='5,9999999058405' ist kein gültiger Integerwert
Adresse:=00007342
Unit:=
Method:=
Line:=0
BugPos:=g3_2
Nun, woher kommen diese Zahlen!? Hat vielleicht jemand eine Idee wo ich weiter ansetzen kann oder gar einen Lösungsvorschlag?

Vielen Dank schon einmal...

incubus_v

igel457 25. Mai 2007 13:55

Re: [Andorra 2D] unbekanntes Problemchen ;)
 
Hallo,

Welche Delphiversion hast du?
Welche Version von Andorra verwendest du (CVS oder die Downloadversion)?
Hast du die DLL nochmal selbst kompiliert?

Wenn du die CVS version verwendest musst du auf jeden fall die DLL neu kompilieren. Das gleiche gilt wenn du eine Delphiversion kleiner als BDS2005 nimmst. Wenn das nicht hilft, dann setzte mal einen Haltepunkt auf die "initialize" Zeile und steppe das Ganze mal durch und sag mir, wo genau der Fehler kommt.

Igel457

incubus_v 25. Mai 2007 17:05

Re: [Andorra 2D] unbekanntes Problemchen ;)
 
Guten Abend,

danke für die schnelle Hilfe, benutze BDS 2005 PE und die Andorra Version 2.0a. Leider habe ich aber heute Abend keine Zeit um weiter zu probieren, melde mich dann noch einmal.

incubus_v 26. Mai 2007 13:00

Re: [Andorra 2D] unbekanntes Problemchen ;)
 
Also,

dll kompilieren wollt ich versuchen, allerdings wird alles möglcihe rot unterstrichen zB fehlt eine dcu (d3dx9, Direct3D9).

Nun, ohne das initialisieren von Andorra sind alle Werte richtig, doch sobald es initialisiert wird, spielen alle Werte verrückt...

Als Beispiel nehm ich einmal folgende Stelle:
Delphi-Quellcode:
 
IF id <> 0 THEN
    BEGIN
      p := floattostr(id);
      where := 'id';
    END
  ELSE
    BEGIN
      p := koord;
      where := 'koord';
    END;
Der Fehler scheint jedoch einen tieferen Grund zu haben, denn es passiert anscheind bei allen möglichen integer werten...

Wenn ich mir mittels Debugger die Werte des Beispiels angucke ist das etwas, wie soll ich sagen, seltsam.
"id" hat jederzeit den richtigen Wert zB "11", doch p bekommt den Wert "11,000000514569"... Ich versteh einfach nicht was das soll. p ist lokal deklariert, die procedur selbst ist public und die form, welche andorra benutzt, steht noch nicht direkt mit dem hauptprogramm in verbindung... selbst wenn ich der variable einen namen gebe, mit der sich bestimmt nichts überschneidet, tritt der gleiche fehler auf. jedoch nur wenn AdDraw.Initialize aufgerufen wird ;)
Irgendwie werd ich nicht schlau daraus.

inherited 26. Mai 2007 13:05

Re: [Andorra 2D] unbekanntes Problemchen ;)
 
*Hokuspokuskristallkugelfidibus*
koord ist eine Reelle Zahl? Die haben immer gewisse Ungenauigkeiten. Ich denke 11,000000514569 its genau genug ;)
Sonst nimm, wenn du keine nachkommastellen braucht, Integer.

incubus_v 26. Mai 2007 13:36

Re: [Andorra 2D] unbekanntes Problemchen ;)
 
nun, koord erfüllt noch keinen zweck :D wird erst später benötigt... außerdem tritt es bei allen möglcihen integer werten an jeder stelle des programms auf. koord wäre in diesen fall auch ein string, id ist jedoch nur integer und dort ist auch der fehler!

igel457 26. Mai 2007 13:45

Re: [Andorra 2D] unbekanntes Problemchen ;)
 
Ich kann mir nicht vorstellen, das Integerwerte plötzlich Nachkommastellen bekommen. Bei Singles und Doubles ist es mit aber durchaus aufgefallen, das mit dem DirectX Plugin die genauigkeit abnimmt. Versuche einfach mal die Werte mit "round" zu runden.

inherited 26. Mai 2007 13:59

Re: [Andorra 2D] unbekanntes Problemchen ;)
 
Wenn id eh ein Integer ist, solltest du IntToStr nehmen und nicht FloatToStr.

incubus_v 27. Mai 2007 11:50

Re: [Andorra 2D] unbekanntes Problemchen ;)
 
tja, aber es treten nachkommastellen auf... und diese anscheind komplett zufällig, jedoch auch immer die gleichen.

und ob ich jetzt inttostr oder floattostr nehme bzw round benutze, es liefert doch letztlich keine erklärung für das problem. ich meine gut ist es bestimmt nicht, wenn ich es so unterdrücke... ich werd einfach weiter probiern vielleicht find ich ja noch etwas

inherited 27. Mai 2007 12:45

Re: [Andorra 2D] unbekanntes Problemchen ;)
 
Wenn id Float, Real oder eine sonstiger Typ von Zahl ist, der Nachkommastellen kann, gibt es, wie gesagt, immer eine gewisse ungenauigkeit. Was ist denn id für ein Typ?

incubus_v 27. Mai 2007 13:44

Re: [Andorra 2D] unbekanntes Problemchen ;)
 
nun id wird aus der sql datenbank ausgelesen und ist ein reiner integerwert. wie ich im ersten post schon geschrieben hab, hat dieser zB den wert 11, wird auch so aus der datenbak ausgelesen und an die an die procedur, aus der der ausschnitt stammt übergeben. id selbst ist auch 11 nur, nachdem floattostr diesen an p übergibt, ist dieser dann plötzlich 11,000000514569... wenn ich an der besagten stelle strtoint verwende, bekomm ich keine fehlermeldung. doch wenn ich so vorgehe, kann ich mir nicht sicher sein, das alles korrekt ist und das ist bei einem strategiespiel extrem wichtig....

so wie es aussieht, muss ich wohl oder übel zwei getrennte programme schreiben oder einfach versuchen alles was ich benötige mit der delphi canvas zu zeichnen...

Waldteufel 27. Mai 2007 17:04

Re: [Andorra 2D] unbekanntes Problemchen ;)
 
Hallo.

Incubus, diese Ungenauigkeit bekommst du einfach nicht weg. Glaub's uns doch endlich. Das hängt damit zusammen, dass der Computer die Zahlen intern imho als a*2^b speichert.

Vereinfachtes Beispiel

2^(ln(11)/ln(2)) ist 11 (ln = natürlicher Logarithmus)

ln(11)/ln(2) ist etwa 3,459431618 (auf 9 Nachkommastellen gerundet)

Wenn wir jetzt zum Beispiel nur 3,459432 nehmen (also auf 6 Nachkommastellen gerundet) kommt aber (2^3,45) etwa 11,00000290 heraus und das ist nicht 11.

Ähnlich entsteht auch der Fehler bei dir. Aber nur, wenn du nicht mit Ganzzahlen (integer), sondern mit Kommazahlen arbeitest. Daher: Kommazahlen nur verwenden, wenn es unbedingt sein muss.

Also nimm IntToStr, wenn es doch sowieso schon eine Zahl ohne Nachkommastellen ist.
FloatToStr wandelt nämlich erst in eine Kommazahl um und dabei entstehen dann Ungenauigkeiten.

Gruß,
Waldteufel

PS: Im Übrigen wird diese Ungenauigkeit nie dafür sorgen, dass aus 11 mal 10 oder 12 wird. So genau sind Computer dann doch schon... ;-)

inherited 27. Mai 2007 20:47

Re: [Andorra 2D] unbekanntes Problemchen ;)
 
Zitat:

wenn ich an der besagten stelle strtoint verwende, bekomm ich keine fehlermeldung. doch wenn ich so vorgehe, kann ich mir nicht sicher sein, das alles korrekt ist und das ist bei einem strategiespiel extrem wichtig....
Hä? Ich denke du meinst IntToStr... und wieso kannst du da nicht sicher sein?
FloatToStr ist für Fließkommazahlen da, IntToStr für Integer. Wenn du also einen Integer hast, dann nimm gefälligst auch IntToStr

incubus_v 28. Mai 2007 12:59

Re: [Andorra 2D] unbekanntes Problemchen ;)
 
@Waldteufel

Danke, so versteh ich das wenigstens ;) Hab mir Delphi komplett selbst beigebracht und sowas wie plötliche nachkommastellen soll man dann erst einmal verstehen...

@inherited

Sry, meinte natürlich IntToStr ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz