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 :mrgreen:
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 :mrgreen:
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 :mrgreen:
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 Stringpointer als Parameter übergeben werden. Aber jetzt fällt mir ein dass das wohl nicht stimmt. Wenn ich wie in meinem Beispiel mit

Code: Alles auswählen

PeekS(*p)
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: 2Deeem2031
Unsere Postings haben sich leider überschnitten. Was Du schreibst ist genau das, was ich inzwischen auch denke.

Gruß, Little John