![]() |
Variablen werden überschrieben!?
Hallo,
ich steh vor einem komischen Problem. Und zwar scheint es als würden die Werte meiner Variablen auf Grund eines Methodenaufruf's überschrieben werden. Jedenfalls konnte ich das im Debugger beobachten. Hat jemand eine Idee?
Delphi-Quellcode:
PS: Dazu ist noch zu sagen das "BTGetRec" eine Methode von BTreeFiler ist.
procedure TDemoForm.Button1Click(Sender: TObject);
var CurrentRow: Integer; maxExport : Integer; Next : Boolean; A: PersonDef; Current: PersonDef; RefNr: LongInt; Key: IsamKeyStr; begin CurrentRow := 0; maxExport := 0; Next := true; while ((Next = true) and (maxExport < 100)) do begin Next := NextRecord(A, RefNr, 1, Key, true); if (Next = true) then BTGetRec(PersFB, RefNr, Current, False); //nach dem Aufruf dieser Methode ist "Next" z.B "false", warum? Inc(CurrentRow); Inc(maxExport); end; end; |
AW: Variablen werden überschrieben!?
Entferne dringend mal das
Delphi-Quellcode:
und probiere es nochmal
= true
BTW Ist
Delphi-Quellcode:
eine Funktion oder Procedure?
BtGetRec
|
AW: Variablen werden überschrieben!?
Zitat:
Delphi-Quellcode:
(Aus der Doku)
procedure BTGetRec;(IFBPtr : IsamFileBlockPtr; RefNr : LongInt; var Dest; ISOLock : Boolean);
|
AW: Variablen werden überschrieben!?
Ob du
Delphi-Quellcode:
vergleichst oder einfach nur
Next = true
Delphi-Quellcode:
ist gehopst wie gesprungen.
Next
Next ist True Next = true ergibt True Next ergibt True Next ist False Next = true ergibt False Next ergibt False Vergleiche mit True oder False kannst du dir also sparen. Die Boolean-Variable reicht für sich allein. |
AW: Variablen werden überschrieben!?
Zitat:
|
AW: Variablen werden überschrieben!?
Zitat:
Delphi-Quellcode:
und
Next = true
Delphi-Quellcode:
können unterschiedliche Ergebnisse liefern.
Next
Delphi-Quellcode:
ist wie
if Next
Delphi-Quellcode:
und
if Next <> False
Delphi-Quellcode:
stimmt nur dann, wenn in
if Next = true
Delphi-Quellcode:
eine 1 enthalten ist.
Next
Das ist auch der Grund, warum man nie auf true prüfen soll Zitat:
Delphi-Quellcode:
dann liest sich das viel besser und das (fehlerträchtige)
HasNext
Delphi-Quellcode:
sieht irgendwie komisch aus, was es halt auch ist. ;)
= true
|
AW: Variablen werden überschrieben!?
Zitat:
Aber jetzt doch bitte back2topic :) |
AW: Variablen werden überschrieben!?
Bist du mit dem Debugger denn schon mal durch diese Routine BTGetRect gelaufen und hast geschaut, ab wann in Next auf einmal False steht?
Irgendwann muss das dort ja passieren |
AW: Variablen werden überschrieben!?
So wie ich das gemeint habe stimmt es schon. Ich hab es später konkretisiert. In dem ersten Fall habe ich gemeint, dass wenn Next True ist, es gehopst wie gesprungen ist ob man mit
Delphi-Quellcode:
vergleicht oder einfach nur mit
Next = true
Delphi-Quellcode:
. Ich dachte es wird so verstanden.
Next
Ob man es prüft oder nicht ist so eine Sache. In Visual Basic hat man es geprüft. Ich bin von VB Programmieren ständig drauf hinweisen, dass ich da was vergessen habe. Wenn es in einer Sprache üblich ist, kann es in einer anderen nicht falsch sein, höchstens unnötig. |
AW: Variablen werden überschrieben!?
Zitat:
Delphi-Quellcode:
Procedure BTGetRec ( IFBPtr : IsamFileBlockPtr;
RefNr : LongInt; Var Dest; ISOLock : Boolean ); {-Gets the specified record from the given reference} Edit: Moment, habe noch eine Filer.inc gefunden. Muss mal schauen wie ich die einbinden, sodass ich über den Debugger drauf zugreifen kann. |
AW: Variablen werden überschrieben!?
Zitat:
|
AW: Variablen werden überschrieben!?
:gruebel: klingt ein bisschen wie ein Stackfehler in/um die Prozedur ....
|
AW: Variablen werden überschrieben!?
Zitat:
Delphi-Quellcode:
var
TmpNext: Boolean; //<<< ... begin ... Next := NextRecord(A, RefNr, 1, Key, true); TmpNext := Next; //<<< if (Next = true) then BTGetRec(PersFB, RefNr, Current, False); if Next = TmpNext then ShowMessage('Gleich: ' + BoolToStr(Next)) else ShowMessage('Ungleich'); //<<< ... end; |
AW: Variablen werden überschrieben!?
Zitat:
Delphi-Quellcode:
Next := NextRecord(A, RefNr, 1, Key, true);
|
AW: Variablen werden überschrieben!?
Ich habe mal alles überflüssige und evtl. Seiteneffekte erzeugende entfernt.
Schau mal, ob das funktioniert, wie gewünscht:
Delphi-Quellcode:
procedure TDemoForm.Button1Click( Sender : TObject );
var CurrentRow : Integer; A : PersonDef; Current : PersonDef; RefNr : LongInt; Key : IsamKeyStr; begin CurrentRow := 0; while ( CurrentRow < 100 ) and NextRecord( A, RefNr, 1, Key, true ) do begin BTGetRec( PersFB, RefNr, Current, False ); Inc( CurrentRow ); end; end; |
AW: Variablen werden überschrieben!?
Delphi-Quellcode:
Das ist der Code Der Procedure. Das Debuggen scheint sehr schwierig zu sein. Im Verlauf öffnen sich weitere 10Include Files in denen ca. 50 mal hin und her geswitched wird. :shock:
procedure BTGetRec(IFBPtr : IsamFileBlockPtr;
RefNr : LongInt; var Dest; ISOLock : Boolean); {-Gets the specified record from the given reference} var Options : Word; begin if ISOLock then begin Options := NoOptions; end else begin Options := OptReadPrefix; end; IsamEntryCode(IFBPtr, Options); if IsamOK then IsamGetRec(IFBPtr, RefNr, Dest); if IsamOK then begin {!!.50} IFBPtr^.CharConvProc(@Dest, IFBPtr^.DIDPtr^[0]^.LenRec, {!!.50} True, IFBPtr^.CCHookPtr); {!!.50} end; {!!.50} IsamExitCode(IFBPtr); end; Zitat:
Mfg, -187- Edit: Ich bekomme auch eine Access Violation nach dem ersten Durchlauf der while Schleife. Ich versuche das mal zu debuggen. |
AW: Variablen werden überschrieben!?
Aber dann liefert NextRecord doch ein False zurück, was bedeutet, es gibt keine weiteren Records mehr, bzw. es werden keine weiteren gefunden.
Somit würde ich die Parameter, bzw. diese Funktion mal untersuchen |
AW: Variablen werden überschrieben!?
Zitat:
Delphi-Quellcode:
Festgestellt habe ich das beim Versuch den zweiten Eintrag zu finden "PersFB" nicht mehr existiert. Was Die Access Violation erklären würde. Fragt sich nur warum. Und warum es bei der anderen DB funktioniert.
function TDemoForm.NextRecord(var P : PersonDef;
var RefNr : LongInt; KeyNr : Integer; var Key : IsamKeyStr; Next : Boolean) : Boolean; begin NextRecord := False; BTNextKey(PersFB, KeyNr, RefNr, Key); if (IsamError = 10250) then Exit; NextRecord := True; end; |
AW: Variablen werden überschrieben!?
Liste der Anhänge anzeigen (Anzahl: 1)
Also irgendwie läuft hier einiges schief. Bereits nach dem ersten Durchlauf der Schleife hat meine lokale Variable einen seltsamen Wert angenommen. Siehe Anhang!
|
AW: Variablen werden überschrieben!?
Laß dir mal den Wert dieser Variable in einer MessageBox oder Logdatei ausgeben.
Manchmal schafft es der Debugger einfach nicht den Wert richtigen anzuzeigen ... also sicherheitshalber, um zu sehn, ob es am Debugger liegt, oder doch am Code. Und wenn es nicht der Debugger ist, dann wirst du wohl mal in diese Prozedur reinsehn müssen, was die nun falsch macht. |
AW: Variablen werden überschrieben!?
ShowMessage() liefert den selben Wert.
|
AW: Variablen werden überschrieben!?
Sobald die Funktion NextPrevRecord durchgelaufen ist, enthält PersFB keinen Wert mehr. Allerdings ist der Wert vor dem letzten end der Funktion noch verfügbar, jedoch im begin Teil der while- Schleife nicht mehr. Woran kann das liegen? :roll:
Ich hab mal ein kleines Video gemacht weil's schwierig zu erklären wäre: (Leider ist die Qualität nicht so gut aber man kann es erkennen.) ![]() |
AW: Variablen werden überschrieben!?
An welcher Stelle wird der Speicher für "PersFB" angefordert und erforderlichenfalls initialisiert, an welcher Stelle wieder freigegeben?
|
AW: Variablen werden überschrieben!?
Zitat:
![]() Zum Thema: da scheint es einen wilden Zeiger zu geben, siehe Blups Frage. Außer in der Assigned-Abfrage habe ich persönlich nichts von PersFB zu Gesicht bekommen, das erscheint mir komisch. |
AW: Variablen werden überschrieben!?
Zitat:
|
AW: Variablen werden überschrieben!?
Zitat:
Form.Show() ruft InitDataBase (Funktion) auf. InitDataBase ruft OpenTheFile (Funktion) auf. In OpenTheFile steht:
Delphi-Quellcode:
BTOpenFileBlock sieht so aus:
BTOpenFileBlock (PersFB, FBlock, False, False, False, True);
Delphi-Quellcode:
Im Form Close wird diese Prozedur aufgerufen:
procedure BTOpenFileBlock(var IFBPtr : IsamFileBlockPtr;
FName : IsamFileBlockName; ReadOnly, AllReadOnly, Save, Net : Boolean);
Delphi-Quellcode:
BTCloseFileBlock(PersFB);
procedure BTCloseFileBlock(var IFBPtr : IsamFileBlockPtr); {-Closes a fileblock} begin IsamEntryCode(IFBPtr, NoOptions); if IsamOK then IsamCloseFileBlock(IFBPtr); IsamExitCode(Pointer (NotAFileBlockPtr)); end; |
AW: Variablen werden überschrieben!?
Eine kleine Frage. Vielleicht steht das auch irgendwo und ich habe es nur überlesen. Die Frage ist - funktioniert dein Code nicht so wie du es dir vorstellst oder interessiert es dich nur wieso Next False ist? Denn darauf kann es zwei verschiedenen Antworten geben.
|
AW: Variablen werden überschrieben!?
Es scheint, als ob zwischen dem BTOpenFileBlock und dem BTCloseFileBlock der Pointer PersFB bzw. die dahinterstehenden Daten irgendwie verloren geht/gehen. Ein FreeMem oder dergleichen hast Du nicht eingebaut?
|
AW: Variablen werden überschrieben!?
Zitat:
Zitat:
Edit: Ich habe in der Doku einen anderen Weg gefunden alle Einträge abzufragen und damit scheint es etwas besser zu klappen. Ich probier erstmal weiter, vielleicht hat sich das Problem hier erledigt. |
AW: Variablen werden überschrieben!?
Liste der Anhänge anzeigen (Anzahl: 1)
Ok die anfänglichen Probleme des Zugriffs scheinen fürs Erste überwunden. Jedoch stell ich jetzt fest, dass ich seltsame Zeichen in den Datensätzen habe. Erst dachte ich das Delphi 2010 mit btreefiler nicht klar kommt und hab D7 installiert, jedoch hat das nichts verändert. Im Anhang mal ein Bild aus dem Debug Mode wie ein Datensatz beispielsweise aussieht. Jemand eine Idee?
|
AW: Variablen werden überschrieben!?
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm bin eigentlich noch nicht weitergekommen. Das Problem ist, wenn ich die Werte der Datenbank in einem Memo Feld darstellen möchte, wird nur ein Teil des Wertes angezeigt da dieser "Null Terminated Characters" enthält und der Wert nach diesem Character abgeschnitten wird. Jedoch sind es nicht nur #0 Werte sondern auch Sonderzeichen die da eigentlich nicht hingehören.
Ich hab keine Idee. :| |
AW: Variablen werden überschrieben!?
Nach wiederholtem Lesen der Dokumentation hab ich festgestellt das ich die Struktur der DB ursprünglich falsch verstanden habe. Naja, jetzt funktioniert es und das Thema kann geschlossen werden.
Danke nochmals für eure Unterstützung. -187- |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 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