Seite 2 von 3
Verfasst: 21.03.2009 16:31
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.
Verfasst: 21.03.2009 16:36
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.
Verfasst: 21.03.2009 16:36
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
Verfasst: 21.03.2009 16:37
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

Verfasst: 21.03.2009 16:39
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.
Verfasst: 21.03.2009 16:42
von Little John
ts-soft hat geschrieben:aber wieso 32 und zuverlässig ist das bestimmt nicht

Ja, nee ... ist mir inzwischen klar, dass ich das mit Strings lieber nicht machen sollte.

Aber wenn die Parameter z.B. alle Integer sind sollte es keine Probleme geben, oder?
Gruß, Little John
Verfasst: 21.03.2009 16:44
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.
Verfasst: 21.03.2009 16:44
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

Verfasst: 21.03.2009 16:46
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
Verfasst: 21.03.2009 16:49
von cxAlex
@ts:
Jo, aber nur bis zur nächsten PB Version falls sich was am String-Manager ändert

.
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())