Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

String aufm Heap

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 28.09.2009, 10:34    Titel: String aufm Heap Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 28.09.2009, 12:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 28.09.2009, 13:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 28.09.2009, 17:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 28.09.2009, 17:22    Titel: Antworten mit Zitat

Nagut, für mich sah es so aus... aber bitte zurück zur frage zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz