Adressen von Prozedur-Parametern

Für allgemeine Fragen zur Programmierung mit PureBasic.
Little John

Adressen von Prozedur-Parametern

Beitrag 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
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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"
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
Zuletzt geändert von ts-soft am 21.03.2009 16:07, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

jo, ich habe deswegen bei meinem DimP
lieber "perHand" ausgelesen, anstatt eine Schleife zu nutzen die dann immer +4Byte macht
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Little John

Beitrag 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
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Little John

Beitrag 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
Zuletzt geändert von Little John am 21.03.2009 16:33, insgesamt 1-mal geändert.
Antworten