Autor Beitrag
breezen
Hält's aus hier
Beiträge: 5

W2k
DE, Delphi 7
BeitragVerfasst: Di 15.11.05 17:11 
Hallo

Also, ich schreibe gerade ein Programm, in dem oft der Typ Variant vorkommt.
Nun bin ich auf einen ganz merkwürdiges Verhalten gestossen, welches mir gar nicht passt.

Folgender Code löst eine Exception vom Typ EVariantOverflowError mit der Meldung "Overflow while converting variant of type (Double) into type (Integer)." aus.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  A, B: Variant;
begin
  A := 0;
  B := 0;
  while (A < 100000do begin
    Inc(A);
    B := B + A;
  end;
  ShowMessage(VarTypeAsText(VarType(B)));
  ShowMessage(IntToStr(B));


Das Resultat der Berechnung "B + A" ist vom Typ Double, sobald das Ergebnis keinen Platz mehr in einem Integer hat.

Wenn ich den Code nun wie folgt ändere (beachte die Berechnung):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
...
  while (A < 100000do begin
    Inc(A);
    B := Integer(B) + Integer(A);
  end;
...


Dann ist auch das Resultat zwingend ein Integer und der Fehler tritt nicht mehr auf.
Leider kann ich das in meinem Programm nicht so einfach lösen, weil die Typen unvorhersehbar sind.

Gibt es irgendeine Möglichkeit, das Verhalten der Variants zu beeinflussen? Ich weiss mir leider im Moment überhaupt nicht zu helfen... :(

Gruss und Danke
Breezen
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 15.11.05 17:44 
prüf doch, ob es double ist, ansonsten rundest du einfach nochmal, ist die ausgabe dann immer integer als string oder float ? weil sonst könntest du ja einfach runden :wink:
breezen Threadstarter
Hält's aus hier
Beiträge: 5

W2k
DE, Delphi 7
BeitragVerfasst: Di 15.11.05 18:28 
Titel: Danke
Hi

Danke für deine Antwort.

Das Problem ist eben, dass ich eine eigene ScriptSprache entwickle, inspiriert von den TDelphiWebScript-Komponenten von www.dwscript.com .
Intern arbeitet die ScriptSprache mit Variants, allerdings ist sie nach Aussen vollständig typisiert (meine Version jedenfalls, die von dwscript.com leider nicht)! Ich konnte das Problem jetzt lösen, indem ich die verschiedenen Möglichkeiten berücksichtige und dann per If-Statement entsprechende Casts durchfüre. Allerdings bremst das den Interpreter leider etwas aus...

Aber naja, man kann halt nicht alles haben... :)

Gruss Breezen