![]() |
Delphi-Version: 5
Funktion gibt falschen Typ zurück
Hallo DP'ler,
wir haben eine Funktion:
Delphi-Quellcode:
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.
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; 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 |
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; |
AW: Funktion gibt falschen Typ zurück
Zitat:
|
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 |
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. |
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. |
AW: Funktion gibt falschen Typ zurück
Delphi-Quellcode:
INVHEXB gibt bestimmt ein Byte zurück?
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; Da dein Delphiprogramm 32 Bit ist, wird standardmäíg maximal mit Integer gerechnet, wenn man nix anderes anibt. :stupid: Zitat:
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-Quellcode:
StrToInt64('$0' + a)
|
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. |
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:
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? |
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 20:48 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