![]() |
Fehler, den ich nicht finde
Delphi-Quellcode:
Mein Problem: an Punkt 1 ist Status im Normalfall 0 (das heißt eigentlich immer), dann drück ich F8/F7 und lande an Punkt 2, dh. der except-Block wird nicht durchlaufen. Aber ab dann ist in "Status" irgend ein Schrott (also ein Wert, zwischen 0 und 255, den ich nicht rekonstruieren kann, scheint zufällig zu sein). Nach weiteren 5-10 Sekunden verabschiedet sich das Programm mit dem Hinweis von Windows, es in Kernel32.dll einen Fehler verursacht, und müsse geschlossen werden... :evil: :shock: :evil:
var
Status: byte; Schluessel: string; Codefile: TFileStream; begin Status := 0; if ansilowercase(LabeledEdit1.Text) = ansilowercase(LabeledEdit2.Text) then Status := 1; try try Codefile := TFileStream.Create(LabeledEdit5.Text, fmOpenRead); VHash.Init; VHash.UpdateStream(Codefile, Codefile.Size); VHash.Final(Schluessel); {Punkt 1} except Status := 5; end; finally Codefile.Free; {Punkt 2} end; Hat irgendwer ne Idee? |
Moin Nailor,
nur so als Idee: Benenne mal Status um, z.B. in bStatus (b für Byte). Die eine oder andere Klasse enthält eine Eigenschaft Status. Eventuell kommt der der Compiler in's trudeln. |
Nein, das ist es nicht...
|
Moin Nailor,
mir fällt noch etwas ein: Passiert der Absturz auch ausserhalb der IDE? Was wird angezeigt, wenn Du mal ein ShowMessage(IntToStr(Status)) in den finally Block einbindest? Wenn nach dem finally Block in der Prozedur nicht mehr auf Status zugegriffen wird kann es durch aus sein, dass Status einen, mehr oder weniger, zufälligen Wert enthält, denn dann wird der Inhalt von Status ja nicht mehr gebraucht. Eventuell legt der Compiler die Variable in ein Register, und das enthält dann "Schrott". |
Status wird auch nachher noch gebraucht, der kann den Wert nicht wegrationalisieren.
Ich habe aber einen anderen kleinen Fehler gefunden, ihn korrigiert, und nun geht alles: und zwar: VHash.Final gibt keinen String zurück, sondern was untypisiertes. Ich habe es einfach in einen String geschrieben, weil ich dachte es geht dann auch in einen String. Jetzt hab ich es in einen array of byte verfrachtet und alles funktioniert. Ich wunder mich nur, warum, wenn ich untypisierten Kram in einen String schreibe, auch andere Variablen zugemüllt werden?!? Na ja, auf jeden Fall klappt es jetzt! |
Moin Nailor,
eine Variable vom Typ String ist erst einmal auch nur ein Pointer. Wird, wie in der Routine, dort nichts initialisiert, wird dahingeschrieben, wohin der Pointer gerade zeigt. Du hättest wahrscheinlich auch beim Typ String bleiben können, wenn Du ihn initialisiert hättest (z.B. mit Schluessel := StringOfChar(#00,xxx)), und dann in der Form
Delphi-Quellcode:
übergeben hättest.
VHash.Final(Schluessel[1]);
|
Help wanted?
Hi Nailor!
Du willst also, dass der
Delphi-Quellcode:
-Block durchlaufen wird. Tritt aber in der zweiten
except
Delphi-Quellcode:
-Schleife überhaupt ein Fehler auf? Denn nur dann springt er zu except.....
try
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 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