Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 28.09.2009, 10:34 Titel: String aufm Heap |
|
|
Strings sind ja was seltsames.. An der Addresse wo ein String liegen soll, findet man eine Addresse zum ZString welcher wiederrum aufm heap liegt..
d.H. der Datentyp "String" ist strenggenommen nur ein pointer auf einen ZString der wiederrum dynamisch alloziiert wird..
Das bringt aber leider auch den Umstand mit sich, das man Strings von Haus aus nicht zu laufzeit dynamisch komplett im heap erstellen kann:
Code: |
dim a as string = new string
|
das funktioniert also nicht.
Was aber funktioniert, ist einen pointer auf einen pointer mittels function oder type zu erstellen:
Code: |
function NewString(s as string = "") as string ptr
return @s
end function
dim a as string ptr
a = NewString
*a = "Hallo"
print *a
sleep
|
oder
Code: | type StringType
s as string
end type
Dim a As String Ptr
a = cast(string ptr, new StringType)
*a = "Hallo"
print *a
sleep |
Nun habe ich aber noch eine erweiterte lösung:
Code: | type StringType
s as string
declare operator cast() as string
declare operator let(v as string)
declare constructor()
declare constructor(v as string)
end type
constructor StringType()
end constructor
constructor StringType(v as string)
s = v
end constructor
operator StringType.Cast() as string
return s
end operator
operator StringType.let(v as string)
s = v
end operator
dim a as StringType ptr = new StringType("Hallo")
*a = "Hallo"
print *a
sleep |
In meiner erweiterten Lösung klappen einfache abfragen und zuordnungen so wie sie funktionieren sollen...
Nur die MID-Anweisung klappt nicht wie sie soll:
Code: |
dim a as StringType ptr = new StringType("Hallo")
*a = "Hallo"
mid(*a,2,1) = "e"
print *a
sleep
|
DA MUSS ICH LEIDER SO ARBEITEN:
Code: |
dim a as StringType ptr = new StringType("Hallo")
*a = "Hallo"
mid(a->s,2,1) = "e"
print *a
sleep
|
Kann mir jemand da weiterhelfen? Warum funktioniert die MID-Anweisung nicht so, wie ich es erwartet hatte? |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 28.09.2009, 12:51 Titel: |
|
|
Nur so nebenbei. Strings pointen NICHT auf einen ZString, sondern auch einen Speicher, der NICHT mit ASCII:0 abschliesst.
Aus diesem grunde ist im Type neben der Alloc-Grösse und dem pointer auch lie länge des Strings hinterlegt.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 28.09.2009, 13:46 Titel: |
|
|
Zitat: | Strings variabler Länge werden intern über einen descriptor (dt: Bezeichner) gehandhabt. Dieser Bezeichner enthält einen Pointer zum eigentlichen String und der Länge des STRINGs. |
Soll doch heissen, dass bei der Addresse, wo der Datentyp STRING im speicher liegt, erstmal ein Pointer steht, der auf den eigentlichen String zeigt. Und der eigentliche String ist ein ZString, der wiederrum nur in verbindung mit der längenangabe zum dynamischen string wird.. Die längenangabe steht vom String-Pointer aus gesehen 4 bytes weiter im speicher.
Sehr schön kann man das im Beispiel zum Datentyp "STRING" sehen:
Code: |
DIM a AS STRING, b AS STRING * 11 ' Strings erstellen
a = "hello World" ' und befüllen
PRINT a ' auf dem Bildschirm ausgeben
.
.
DIM aa AS UINTEGER PTR, ab AS UBYTE PTR ' Zwei Pointer zur Analyse...
aa = @a ' die Adresse des Bezeichners
.
.
PRINT aa ' Adressen ausgeben
.
.
PRINT PEEK(UINTEGER, aa + 4) ' Beide Male die Länge des Strings
|
aa + 4 = @a +4
d.h. Von dort aus gesehen, wo der Pointer zum ZString steht, steht 4 bytes weiter die längenangabe des ZStrings.
(ich gehe mal davon aus, das es der Typ ZSTING ist, auf den gezeigt wird, denn er hat eine feste länge)
Für meine eigentliche fragestellung sollte die längenangabe allerdings nicht entscheident sein oder? |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 28.09.2009, 17:13 Titel: |
|
|
NEIN! Der eigentliche String ist kein ZString. ZString sind c-style Strings (char*) die mit \0 terminiert werden. Der dynamische String wird NICHT mit \0 terminiert, sonst bräcuhte er ja die Längenangabe nicht! |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 28.09.2009, 17:22 Titel: |
|
|
Nagut, für mich sah es so aus... aber bitte zurück zur frage  |
|
Nach oben |
|
 |
|