Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Parameterübergabe an Prozedur (https://www.delphipraxis.net/170191-parameteruebergabe-prozedur.html)

Lemmy 4. Sep 2012 18:58

Delphi-Version: 7

Parameterübergabe an Prozedur
 
Hallo,

habe eine Prozedur mit folgendem symbolischen INhalt:

Delphi-Quellcode:

procedure DatenPruefen(const ID: Integer; VAR Bezeichnung: String; VAR Datum:TDateTime; VAR ID2: Integer; VAR ID3: Integer; Var Vektor: Array of Integer);
begin
...
end;

procedure DatenEintragen(ID: Integer; Bezeichnung: String; ID2: Integer, Datum: TDateTime);
begin
..
..
  DatenPruefen(ID, Bezeichnung, Datum, ID2, ID3, Vektor);
..
..
end;
Das Problem: WEnn ich am Prozeduraufruf DatenPruefen() den Inhalt und die Speicheradressen der Parameter anschaue, ist alles in Ordnung. WEnn ich mit F7 einen Schritt weiter gehe, sind die Parameter nach dem Daten Datum SChrott und die Speicheradressen sind anders (also innerhalb der Prozedur).

Was ich herausgefunden habe:
Die Speicheradresse von ID2 hat sich geändert. DIese zeigt beim EIntritt in die Prozedur auf die Speicheradresse des Datums +16 (vorher Speicheradresse Datum +76). Die Speicheradresse von ID3 zeigt nun auf die Adresse von ID2 und damit auch auf deren Inhalt, die restlichen Adressen zeigen auch auf andere Bereiche.

Was ich geprüft habe:
1. die Prozedur DatenPruefen ist nur intern in der Unit aufrufbar, es gibt im Projekt / Sourcenverzeichnis keine weitere solche Methode.
2. Es gibt keine doppelten (globalen) Variablen.
3. die Reihenfolge der Parameter sind korrekt
4. dcus sind gelöscht, d.h. neu kompiliert, keine doppelten Units im Bereich der Suche
5. die VAR und CONST in der Methodendeklaration entfernt
6. Position der Parameter verändert

An den letzten beiden Punkten sieht man, dass mir an der Stelle eine Idee fehlt, wie ich da weiter kommen kann. Hat jemand eine Idee was ich machen kann? Kann leider kein Demosource zur Verfügung stellen, das geht nur in dem Projekt so (Delphi 7) und lässt sich aber auf anderen EntwicklerPCs nachvollziehen.

Grüße

Christian Seehase 4. Sep 2012 19:32

AW: Parameterübergabe an Prozedur
 
Moin Lemmy,

ich habe, offen gestanden, nie darauf geachtet, ob sich die Adressen von Variablen ändern, aber:
Stimmen denn die Inhalte noch?
Wenn nicht, wäre der Inhalt der Prozedur interessant.

Was ich nicht verstehe ist folgender Satz:

Zitat:

Zitat von Lemmy (Beitrag 1181558)
...sind die Parameter nach dem Daten SChrott...

Was heisst nach dem Daten?

Lemmy 4. Sep 2012 19:46

AW: Parameterübergabe an Prozedur
 
Hi,

nein, die Inhalte stimmen auch nicht mehr, deshalb habe ich auch erst nach den SPeicheradressen geschaut.

Das Datum ist noch korrekt, der INhalt von ID2 ist eine bel. Integerzahl, der Inhalt von ID3 ist der ehem. Inhalt von ID2 (weil wie gesagt der Zeiger auf den Bereich von ID2 zeigt).

Korrektur:

Zitat:

WEnn ich mit F7 einen Schritt weiter gehe, sind die Parameter nach dem Daten SChrott und die Speicheradressen sind anders (also innerhalb der Prozedur).
sollte

Zitat:

WEnn ich mit F7 einen Schritt weiter gehe, sind die Parameter nach dem Datum SChrott und die Speicheradressen sind anders (also innerhalb der Prozedur).
heißen

himitsu 4. Sep 2012 20:12

AW: Parameterübergabe an Prozedur
 
Zitat:

Delphi-Quellcode:
 Var Vektor: Array of Integer

Offene Array-Parameter sind so eh nicht möglich, bzw. das ist nicht grade optimal und wenn da Fehler auftreten, dann wundert es mich nicht.

Aber warum sind die Parameter einer Prüffunktion VAR-Parameter?
Ich denke die prüft nud den Inhalt ... von Ändern wird da nichts gesagt.

Lemmy 4. Sep 2012 20:27

AW: Parameterübergabe an Prozedur
 
Hi,

die Geschichte mit den Var-Parametern hängt daran, dass bei der Prüfung diese ggf. doch geändert werden können. Hängt an der Stelle mit der Fachlogik zusammen und ist nicht so schnell erklärt. Dass hier die Benennung und im Grunde der gesamte Ablauf nicht optimal ist, ist mir klar, aber ich bin leider nicht in der Position das komplett zu überarbeiten.
[edit: Nachtrag]zudem wie oben geschrieben: wenn ich die Vars und Consts aus der Deklaration entferne ändert sich nix am Problem...[/edit]


Aber sag doch noch ein paar Worte zu dem Array:

Warum ist das Array so nicht möglich (Zuweisungsproblematik ist mir bekannt)? Was für Fehler könnten da auftreten die zu so einem Verhalten führen? Zudem, das Array kommt doch erst nach den problematischen Daten?

Um das auszuschließen könnte ich aber sicherlich das Array mal kurz deaktivieren und schauen ob das Problem dann immer noch auftritt...

GRüße

[edit]

so gemacht, Array raus geworfen, ändert nix an der Verschiebung der Speicheradressen..

himitsu 4. Sep 2012 20:44

AW: Parameterübergabe an Prozedur
 
Hmm, ich hab derartige Probleme eigentlich auch noch nie bemerkt.

Eventuell bist ja doch auf einen Compiler-Bug gestoßen.


Wir können hier aber auch nicht viel helfen, da das Problem hier nicht auftritt.


Tja, was passiert, wenn du allen Code innerhalb der Prüfprozedur auskommentierst?

Ansonsten kannste nur
- debuggen und rausfinden wann/wo es sich verändert
- aus dem Projekt alles entfernen, bis möglichst nur noch der Fehler übrig bleibt und uns den dann zeigen

Lemmy 4. Sep 2012 21:20

AW: Parameterübergabe an Prozedur
 
Hi,

Du bist ab sofort und offiziell mein Held!

das Deaktivieren der Sourcen hat mich auf die Zielgerade gebracht. Neben div. Inlineprozeduren hat der Entwickler auch ein tolles Label definiert gehabt. Wenn ich das deaktiviere, dann passt das. Habe die entsprechenden Sourcne in eine weitere Inlinemethode gepackt und funktioniert immer noch...

Und da behaupten immer noch welche "goto" sein nicht böse.....

Grüße und dir vielen Dank für die SChützenhilfe....

shmia 5. Sep 2012 14:53

AW: Parameterübergabe an Prozedur
 
Delphi-Quellcode:
procedure DatenPruefen(const ID: Integer; VAR Bezeichnung: String; VAR Datum:TDateTime; VAR ID2: Integer; VAR ID3: Integer; Var Vektor: Array of Integer);

Sooo viele VAR-Parameter?
Wäre es vielleicht nicht sinnvoll die Parameter zu einem Record zusammenzufassen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:00 Uhr.

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