Adressen von Prozedur-Parametern

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Deeem2031 hat geschrieben:Das es mit Longs funktioniert ist kein Zufall, schließlich müssen die nacheinander aufm Stack liegen.
Die Pointer auf die Addressen stehen nacheinander aufm Stack, wo der Speicher wirklich ist auf den sie zeigen ist iirc Zufall.
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
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

cxAlex hat geschrieben:
Deeem2031 hat geschrieben:Das es mit Longs funktioniert ist kein Zufall, schließlich müssen die nacheinander aufm Stack liegen.
Die Pointer auf die Addressen stehen nacheinander aufm Stack, wo der Speicher wirklich ist auf den sie zeigen ist iirc Zufall.
Die Longs werden aber nicht als Pointer übergeben, sondern direkt auf den Stack gepusht. Von daher ist der Speicher der Stack und der ist nicht zufällig angeordnet.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Little John

Beitrag von Little John »

cxAlex hat geschrieben:Die Pointer auf die Addressen stehen nacheinander aufm Stack, wo der Speicher wirklich ist auf den sie zeigen ist iirc Zufall.
Es werden aber keine Pointer auf Adressen übergeben, sondern die Adressen selbst.

Gruß, Little John
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.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 + 32        ; PB 4.30 unter Windows XP x64
   Next
EndProcedure

Show(3, "Katze", "Hund", "Fisch")
aber wieso 32 und zuverlässig ist das bestimmt nicht :lol:
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
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Kommando zurück, ich hab Sch*** verzapft:

http://de.wikipedia.org/wiki/Aufrufkonvention

Stimmt schon, der Abstand ist konstant. Außer bei Strings. Aber das ändert sich vlt. auch bald, SSE 4.2 soll ja native ASM String Operationen beherrschen.
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
Little John

Beitrag von Little John »

ts-soft hat geschrieben:aber wieso 32 und zuverlässig ist das bestimmt nicht :lol:
Ja, nee ... ist mir inzwischen klar, dass ich das mit Strings lieber nicht machen sollte. :oops:
Aber wenn die Parameter z.B. alle Integer sind sollte es keine Probleme geben, oder?

Gruß, Little John
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag von cxAlex »

Little John hat geschrieben: Aber wenn die Parameter z.B. alle Integer sind sollte es keine Probleme geben, oder?
Sollte (lt. Wikipedia) klappen.
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 »

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 + 2 * SizeOf(Integer) + 4 * SizeOf(Long)        ; PB 4.30 unter Windows XP x64 und x86
   Next
EndProcedure

Show(3, "Katze", "Hund", "Fisch")
Das funzt, zumindest bei mir :mrgreen:
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: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

jo lol, sobald die Strings aber länger sind (zB als 20Bytes) kommt murks raus :

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 x64 
   Next 
EndProcedure 

Show(3, "KatzeKatzeKatzeKatze", "HundHundHundHund", "FischFischFischFisch")
Fazit !
Es ist zwar "hintereinander" hat aber iregnd eine unbekannte Bezihung zur Länge
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 »

@ts:
Jo, aber nur bis zur nächsten PB Version falls sich was am String-Manager ändert :twisted: .

Ich frag mich sowieso warum man so was machen will, übergib doch einfach ne Liste oder ein Array:

Code: Alles auswählen

Procedure Show(List Tiere.s())
  ForEach Tiere()
    Debug Tiere()
  Next
EndProcedure

NewList MeineTiere.s()

AddElement(MeineTiere()) : MeineTiere() = "Katze"
AddElement(MeineTiere()) : MeineTiere() = "Hund"
AddElement(MeineTiere()) : MeineTiere() = "Fisch"

Show(MeineTiere())
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
Antworten