Seite 1 von 3
Adressen von Prozedur-Parametern
Verfasst: 21.03.2009 16:00
von Little John
Hallo zusammen,
manchmal ist es ganz praktisch auf Prozedur-Parameter mittels ihrer Speicheradressen zuzugreifen, wie beispielsweise in diesem Codefragment:
Code: Alles auswählen
Procedure Show (count, v1.s="", v2.s="", v3.s="", v4.s="", v5.s="", v6.s="")
Protected *p, i
Debug "-- Debug"
Debug "*p1 = " + Str(@v1)
Debug "*p2 = " + Str(@v2)
Debug "*p3 = " + Str(@v3)
Debug ""
Debug "-- Tiere"
*p = @v1
For i = 1 To count
Debug PeekS(*p)
*p + 24 ; PB 4.30 unter Windows XP x86
Next
EndProcedure
Show(3, "Katze", "Hund", "Fisch")
Kann mir bitte jemand sagen, wie groß der Abstand der Speicheradresen unter Windows x64 ist? Und ist das irgendwo offiziell dokumentiert?
Gruß, Little John
Verfasst: 21.03.2009 16:04
von cxAlex
Abstand zwischen Speicheraddressen?
Die Addressen auf die die Pointer zeigen müssen nicht hinterreinander sein, theoretisch kann der 1. auf 9999999 zeigen und der 2. auf 47.
Da gibt es keinen "Standartabstand"
Verfasst: 21.03.2009 16:06
von ts-soft
Deinen merkwürdigen Code verstehe ich zwar nicht
Wo kommt die 24 her?
Der Abstand sind SizeOf(Integer)!
// edit
der Abstand der Stringadressen ist natürlich variable, die 24 nur Zufall
Verfasst: 21.03.2009 16:07
von STARGÅTE
scheinbar doch,
wenn man nur LONGs übergibt so liegen die Longs alle 4Byte nebeneinander
Code: Alles auswählen
Procedure Show (count, v1.l=0, v2.l=0, v3.l=0, v4.l=0, v5.l=0, v6.l=0)
Protected *p, i
Debug "-- Debug"
Debug "*p1 = " + Str(@v1)
Debug "*p2 = " + Str(@v2)
Debug "*p3 = " + Str(@v3)
Debug ""
Debug "-- Tiere"
*p = @v1
For i = 1 To count
Debug PeekL(*p)
*p + 4 ; PB 4.30 unter Windows XP x86
Next
EndProcedure
Show(3, 125, 275, 370)
Bei String habe ich bis jetzt nix gefunden, aber scheinfach ist es die 24Bytes von LJ ...
Verfasst: 21.03.2009 16:10
von cxAlex
@Stargate:
Das ist Zufall, in 99% der Fälle wird bei so kleinen Übergaben der Abstand passen, weils der SpeicherManager von Windows einfach so regelt, aber es gibt keine Garantie dafür.
Verfasst: 21.03.2009 16:13
von STARGÅTE
jo, ich habe deswegen bei meinem
DimP
lieber "perHand" ausgelesen, anstatt eine Schleife zu nutzen die dann immer +4Byte macht
Verfasst: 21.03.2009 16:16
von ts-soft
Code: Alles auswählen
Procedure Show (count, v1.l=0, v2.l=0, v3.l=0, v4.l=0, v5.l=0, v6.l=0)
Protected *p, i
Debug "-- Debug"
Debug "*p1 = " + Str(@v1)
Debug "*p2 = " + Str(@v2)
Debug "*p3 = " + Str(@v3)
Debug ""
Debug "-- Tiere"
*p = @v1
For i = 1 To count
Debug PeekL(*p)
*p + SizeOf(Integer) ; PB 4.30 unter Windows XP x86
Next
EndProcedure
Show(3, 125, 275, 370)
Funktioniert so auch unter X64, ist aber trotzdem Zufall
Das Beispiel von LittleJohn funktioniert nach Anpassung z.B. nie!
Verfasst: 21.03.2009 16:26
von Little John
ts-soft hat geschrieben:Deinen merkwürdigen Code verstehe ich zwar nicht

Das ist spezieller Spezialcode.
ts-soft hat geschrieben:Wo kommt die 24 her?
Aus dem ersten Teil meiner kleinen Prozedur mit der Überschrift "Debug". Da ist mir aufgefallen, dass der Abstand einheitlich 24 Bytes zu sein scheint.
ts-soft hat geschrieben:Der Abstand sind SizeOf(Integer)!
Wenn die Parameter vom Typ Integer sind, ja.
ts-soft hat geschrieben:// edit
der Abstand der Stringadressen ist natürlich variable, die 24 nur Zufall
Ich hatte angenommen, dass nur die String
pointer als Parameter übergeben werden. Aber jetzt fällt mir ein dass das wohl nicht stimmt. Wenn ich wie in meinem Beispiel mit
an den Inhalt der Strings komme, kann es ja nicht sein dass *p auf den Stringpointer zeigt.
Gruß, Little John
Verfasst: 21.03.2009 16:27
von Deeem2031
Das es mit Longs funktioniert ist kein Zufall, schließlich müssen die nacheinander aufm Stack liegen. Bei Strings ist das aber anders, schließlich liegen die nichts direkt aufm Stack sondern nur der Pointer zum String. @v1 gibt nun aber nicht den Pointer zum Pointer zum String sondern nur den Pointer zum String, und das ist irgendeine beliebige Adresse.
Verfasst: 21.03.2009 16:30
von Little John
cxAlex hat geschrieben:Das ist Zufall, in 99% der Fälle wird bei so kleinen Übergaben der Abstand passen, weils der SpeicherManager von Windows einfach so regelt, aber es gibt keine Garantie dafür.
Woher weißt Du das so genau?
Ich glaube es nämlich nicht. Die Parameter werden doch nacheinander auf dem Stack übergeben, oder nicht? Und da greift der Speichermanager von Windows ein?
//edit: 2
Deeem2031
Unsere Postings haben sich leider überschnitten. Was Du schreibst ist genau das, was ich inzwischen auch denke.
Gruß, Little John