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 zur Laufzeit

 
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: 27.04.2009, 11:17    Titel: String zur Laufzeit Antworten mit Zitat

Wie erstelle ich einen String zur Laufzeit?
Mit:
Code:

dim test as string ptr
test = new string

gehts ja nun mal nicht :-/
Ich wollte mir eine verkettete Liste programmieren, die verschiedene Datentypen über einen ANY PTR aufnehmen kann. Mit Integer und anderen Zahlen-Datentypen klappt das wunderbar. Die Strings könnte ich höchstens in einer weiteren TYPE kapseln, aber das seh ich nicht als sinnvoll an.. wäre in sehr unelegantes workarround.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 27.04.2009, 11:37    Titel: Antworten mit Zitat

die strings werden genauso preallokiert wie alle ints und doubles und sonst was, was genau ist dein problem? Oo

suchst du sowas?
DIM bla AS STRING = "Hallo"
test=STRPTR(bla)?
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 27.04.2009, 11:51    Titel: Antworten mit Zitat

Wie man den Pointer zu einem String rausfindet weiss ich.

Mein problem ist, dass ich zur laufzeit neue strings anlegen und löschen möchte.
wie gesagt, ich möchte eine verkettete liste programmieren die verschiedene Datentypen aufnehmen kann! (Bzw. auf sie zeigt)

wenn ich schreibe

dim bla as string = "hallo"
dann steht die Variable bla fix im Speicher. Das ist aber nicht dass was ich haben möchte! die Variable soll zur LAUFZEIT speicher belegen und auch wieder löschbar sein.

folgendes funktionert (SIEHT ABER TOTAL HÄSSLICH AUS!):
Code:

type stringtype  'Hier wird der String in eine TYPE gepackt
    content as string
end type

dim test as stringtype ptr  'Hier wird der Zeiger angelegt

test = new stringtype  'Hier wird die UDT zur laufzeit angelegt
test->content = "Hallo"  'Hier wird der String in den Speicher geschrieben, der zur Laufzeit angelegt wurde.
delete test
'Hier wird der Speicher, der vom String verbraucht wurde, wieder freigegeben und damit ist der String im prinzip gelöscht (auch wenn er noch im speicher verweilt, bis er evtl. überschrieben wird)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 29.04.2009, 12:49    Titel: Antworten mit Zitat

keiner einer eine idee?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 29.04.2009, 16:24    Titel: Antworten mit Zitat

Geht nicht allocate?
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 29.04.2009, 18:09    Titel: Antworten mit Zitat

@elektronix: wie würde das dann aussehen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 29.04.2009, 19:07    Titel: Antworten mit Zitat

so von der Theorie her: mit ALLOCATE einen Speicherbereich anlegen und in ihn den Inhalt des Strings ablegen. Die Speicheradresse dann in deine Liste speichern.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 29.04.2009, 19:14    Titel: Antworten mit Zitat

Das würde vorraussetzen dass ich den inhalt des strings schon kenne bevor ich den speicherplatz anlege, richtig? .. und wenn ich den inhalt nicht kenne oder der string sich in der länge des inhalts nachträglich ändert? (vergrößert?)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 29.04.2009, 19:25    Titel: Antworten mit Zitat

OneCypher hat Folgendes geschrieben:
und wenn ich den inhalt nicht kenne oder der string sich in der länge des inhalts nachträglich ändert? (vergrößert?)

Mit REALLOCATE lässt sich die Größe eines mit ALLOCATE belegten Speicherbereichs im Nachhinein verändern.
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 29.04.2009, 20:47    Titel: Antworten mit Zitat

Dann müsste ich aber vorher irgendwie feststellen das sich der stringinhalt geändert hat und das kann und will ich eigentlich nicht. ich möchte "einfach" neue strings zur laufzeit in eine verkette liste einbinden können.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



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

BeitragVerfasst am: 30.04.2009, 08:03    Titel: Antworten mit Zitat

aus meiner alten LL
Code:

Function ColAdd(ByRef V_Collection as Integer PTR, V_Value as String, V_ToItem as UInteger = -1) as Integer PTR
Dim NID as Integer PTR = ColAddX(V_Collection, V_ToItem)
If NID = 0 Then Return 0
Dim TID as Integer PTR
TID = CAllocate(Len(V_Value) + sizeof(integer))
*Cast(integer ptr, TID) = Len(V_Value)
memcpy(TID + 1, strptr(V_Value), Len(V_Value))
NID[1] = Cast(Integer, TID)
Return NID
End Function


Code:

Function ColSet(ByRef V_Collection as Integer PTR, V_Item as UInteger, V_Value as String) as UByte
If V_Collection = 0 Then Return 2
If V_Item < 0 Then Return 3
Dim NID as Integer PTR = ColGetItemX(V_Collection, V_Item)
Dim AID as String PTR = Cast(String PTR, NID[1])
If AID = 0 Then
   AID = CAllocate(Len(V_Value))
Else: AID = REALLOCATE(AID, Len(V_Value))
End If
NID[1] = Cast(Integer, AID)
*AID = V_Value
Return 0
End Function


Code:

Function ColGetStr(ByRef V_Collection as Integer PTR, V_Item as Integer) as String
If V_Collection = 0 Then Return ""
If V_Item < 0 Then Return ""
Dim NID as Integer PTR = ColGetItemX(V_Collection, V_Item)
If NID <> 0 Then
   Dim XLen as Integer ptr = Cast(Integer ptr, NID[1])
   Dim T as String = Space(*XLen)
   memcpy(strptr(T), Cast(integer ptr, NID[1]) + 1 , *XLen)
   Return T
Else: Return ""
End If
End Function



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: 30.04.2009, 09:09    Titel: Antworten mit Zitat

Ok, vielen Dank, aber ich habs mir noch einfacher gemacht. Ich zeige auf den String mittels "STRING PTR" und erstelle neue Strings über einen UDT:

Code:

type stringobjekt
    tmp as string = "Hallo!"
end type

dim test as string ptr = cast(string ptr, new stringobjekt)

print "Vorher: " & *test & " Laenge " & len(*test)
*test = "Welt!1234"
print "Nachher: " & *test & " Laenge " & len(*test)
sleep


Diese Methode funktioniert weil "stringobjekt" genau da im speicher anfängt wo der "STRING PTR" den string erwartet.
Ich finds aber nach wie vor merkwürdig warum " = new string" nicht funktioniert...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



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

BeitragVerfasst am: 30.04.2009, 10:37    Titel: Antworten mit Zitat

das funzt nicht, weil du nur nen speicher erstellst. dieser aber nicht richtig erzeugt wurde

versuche einfahc mal mit CAllocate.


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: 30.04.2009, 11:04    Titel: Antworten mit Zitat

"das funzt nicht, weil du nur nen speicher erstellst. dieser aber nicht richtig erzeugt wurde "
->
Bezieht sich das auf mein "Ich finds aber nach wie vor merkwürdig warum " = new string" nicht funktioniert" ?

Wenn ich versuche per "= new string" einen string zur laufzeit anzulegen, dann gibt mir bereits der compiler das hier aus:

error 174: The NEW operator cannot be used with strings, before ''' in 'dim test as string ptr = new string'

Und kompiliert dann nicht weiter. was soll ich mit callocate versuchen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



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

BeitragVerfasst am: 30.04.2009, 12:47    Titel: Antworten mit Zitat

Nun .. New wird wohl Allocate und nicht CAllocate verwenden. Da kann vorallem beim späteren zugriff zu problemen führen (wenn dem so ist. Das ist leider nicht explizit angegeben. Jedoch lässt ein Satz in der Ref darauf Deuten: "The New operator dynamically allocates memory and constructs a specified data type.")

Wenn du Allocate Verwendest (was hier NEW mit einschliessen würe), dann wird der SPeicherbereich nicht geleert (auf 0 gesetzt). Da der String Datentyp ein spezieller Datentyp ist (vergleichbar mti einem UDT mit ein paar informationen zum speicher), stehen jetzt in diesem Header" Informationen drin, die nicht "Valid" sind. Beim Zugriff auf den Speicher mit *bla kommt es jetzt zu einem missverständniss. Das System geht davon aus Das sich laut Header daten an einer speicherstelle stehen, die eine länge von x haben, die jedoch nciht existieren. (hervorgerufen durch falsche Werte in diesem Header). Das führt zu einem Crash.

Darum sollten solche SPeicherbereiche entweder Vordefiniert werden, z.B. mit einer entsprechenden NEW (parameter) Liste, oder über ein CAllocate expliziet als 0 Gesetzt.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
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