Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Funktion gibt falschen Typ zurück (https://www.delphipraxis.net/156251-funktion-gibt-falschen-typ-zurueck.html)

R2009 25. Nov 2010 08:21

Delphi-Version: 5

Funktion gibt falschen Typ zurück
 
Hallo DP'ler,

wir haben eine Funktion:
Delphi-Quellcode:
Function INVHEXDW(a:string):int64;
Begin
    If a='' then a:='00000000';
    while length(a)<8 do
        a:='0'+a;
    result:= INVHEXB(a[1]+a[2])* 16777216 + INVHEXB(a[3]+a[4]) * 65536 +
             INVHEXB(a[5]+a[6])* 256 + INVHEXB(a[7]+a[8]);
end;

Aufruf mit:
var n:integer;
  begin
    n:=INVHEXDW(a:string):
  end;
Der Funktionsaufruf funktioniert einwandfre solange ich mit meinen Rückgabewert im Wertebereich des integer bleibe. Leider ist dem bei grossen Hex Zahlen nicht so. Beim casten auf n gibts dann einen rangecheck error.
Gibt es irgendeine Möglichkeit aus der aufgerufenen Funktion heraus festzustellen ob der Übergabetyp stimmt oder nicht?
Oder gibt es eine andere Möglichkeit, von der Funktionsseite diesen Fehler zu verhindern?
Es ist mir nicht möglich jeden Aufruf abzuchecken.

Grüsse
rainer

Jens Hartmann 25. Nov 2010 08:26

AW: Funktion gibt falschen Typ zurück
 
Warum gibst Du deiner Var. im Funktionsaufruf nicht einfach eine höhere Wertigkeit.

Delphi-Quellcode:
var n:int64;
  begin
    n:=INVHEXDW(a:string):
  end;

guinnes 25. Nov 2010 08:39

AW: Funktion gibt falschen Typ zurück
 
Zitat:

Zitat von R2009 (Beitrag 1063884)
Leider ist dem bei grossen Hex Zahlen nicht so. Beim casten auf n gibts dann einen rangecheck error.

Was erwartest du denn, wenn du einer Variablen einen zu großen Wert zuweist ?

R2009 25. Nov 2010 08:50

AW: Funktion gibt falschen Typ zurück
 
Hi,

zumindest erwarte ich eine ordentliche Fehlermeldung. Mir wäre schon geholfen wenn ich das in der Funktion irgendwie abfangen könnte.
Im Moment kriege ich nur die Microsoft Meldung "Schwerer Ausnahmefehler" usw.
Ich habe keine Zeit und auch keine Lust 700000 Zeilen Code durchzusuchen (hat mir ein Vorgänger überlassen)

Grüsse
Rainer

Satty67 25. Nov 2010 08:54

AW: Funktion gibt falschen Typ zurück
 
Eingeschaltete Bereichsprüfung Überlauf-Prüfung reicht nicht aus, um eine Exception von Delphi zu werfen?

Der Fehler ist wie schon bemerkt wurde nicht "Funktion gibt falschen Typ zurück", sondern "Funktionsergebnis wird an falschen (zu kleinen Typ) übergeben"

Ich überlege gerade, ob man das Funktionsergebnis nicht auch einfach überladen kann... notfalls halt mit falschen Werten, aber der Fehler liegt ja am Aufrufer, nicht an der Funktion.

Matze 25. Nov 2010 08:55

AW: Funktion gibt falschen Typ zurück
 
Hast du Jens' Vorschlag umgesetzt?

INVHEXDW() gibt dir einen Int64 zurück. Den versuchst du einem Int (n) zuzuweisen.

Klar, dass da möglicherweise etwas schief geht.

Edit: Da war ich zu langsam.

himitsu 25. Nov 2010 09:18

AW: Funktion gibt falschen Typ zurück
 
Delphi-Quellcode:
Function INVHEXDW(a:string):int64;
Begin
    If a='' then a:='00000000';
    while length(a)<8 do
        a:='0'+a;
    result:= Int64(INVHEXB(a[1]+a[2]))* 16777216 + Int64(INVHEXB(a[3]+a[4])) * 65536 +
             INVHEXB(a[5]+a[6])* 256 + INVHEXB(a[7]+a[8]);
end;
INVHEXB gibt bestimmt ein Byte zurück?
Da dein Delphiprogramm 32 Bit ist, wird standardmäíg maximal mit Integer gerechnet, wenn man nix anderes anibt. :stupid:

Zitat:

Zitat von R2009 (Beitrag 1063888)
zumindest erwarte ich eine ordentliche Fehlermeldung.

Dann Schalte gefälligst mal die Bereichs- und Überlaufprüfungen an, wenn du diese Fehlermeldungen haben willst.

Und die "langsame"/aufwändige Multiplikation würde ich du eine schöne/einfache Bitverschiebung (shl) ersetzen.

PS: Das IF könnte man sich sparen, da das WHILE diesen Fall mit behandelt.

Delphi-Referenz durchsuchenHexToBin oder Delphi-Referenz durchsuchenStrToInt64
Delphi-Quellcode:
StrToInt64('$0' + a)

R2009 25. Nov 2010 10:41

AW: Funktion gibt falschen Typ zurück
 
Hi hinmitsu,

ich glaube ich rede chinesisch, zumindest scheint mich hier keiner zu verstehen.

Die Überlaufprüfung ist eingeschaltet.

Trotzdem wirft das Programm mir, wenn es nicht in der IDE läuft, die Microsoft Katastrophemmeldung.

Trotzdem danke für deine Anregungen, werde ich umsetzen.

Aber trotzdem:
ich hatte nicht gefragt wie man das ganze einfacher machen kann, ich will wissen ob man irgenmdwie
den Übergabetyp, der aufrufenden Funktion, feststellen kann.

Grüsse
Rainer
PS: Ist schon blöd wenn man an Programmen rummurksen muss die andere zusammengebastelt haben.
Ich will so wenig wie möglich ändern, ich will nur, dass eine ordentliche Fehlermeldung erscheint.
Und ich will die MS Katastrophe verhindern.

Satty67 25. Nov 2010 11:21

AW: Funktion gibt falschen Typ zurück
 
Also tut mir Leid, war mir in Verbindung mit dem Betreff nicht ganz klar, nach welcher Lösung gesucht wird.

Zitat:

Zitat von R2009 (Beitrag 1063912)
ich hatte nicht gefragt wie man das ganze einfacher machen kann, ich will wissen ob man irgenmdwie den Übergabetyp, der aufrufenden Funktion, feststellen kann.

Dachte bis eben dann, Du willst innerhalb der Funktion prüfen, an welchen Typ die Funktion Ihr Ergebnis liefert und entsprechend reagieren. Das geht meines Wissens nach nicht.

Der Quote klingt jetzt aber irgendwie so, als ob außerhalb der Funktion der Übergabetyp ermittelt werden kann (was aber nicht sein kann, weil Du ja nicht den ganzen Quelltext mit den ganzen Aufrufen ändern willst).

Überlaufprüfung klingt für mich immer noch noch dem Kompromiss, der eigentlich funktionieren müsste. Zumindest um die Fehlermeldung wieder von Delphi, statt von Windows ausgeben zu lassen. Evtl. als Compiler-Directive in den Units wieder ausgeschaltet?

Jens Hartmann 25. Nov 2010 13:33

AW: Funktion gibt falschen Typ zurück
 
Trotzallem würde ich die Wertigkeit anpassen. Wenn Du schon weißt, das es zu einem Fehler in dem Fall kommen kann, und Du sogar die Stelle im Programm kennst, gibt es eigendlich als erste nur die Lösung die Var. Ihrem Zweck anzupassen. Fehlermeldung hin oder her.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:30 Uhr.
Seite 1 von 2  1 2      

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