Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 27.04.2009, 11:17 Titel: String zur Laufzeit |
|
|
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 |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 27.04.2009, 11:37 Titel: |
|
|
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 |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 27.04.2009, 11:51 Titel: |
|
|
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 |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 29.04.2009, 12:49 Titel: |
|
|
keiner einer eine idee? |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 29.04.2009, 16:24 Titel: |
|
|
Geht nicht allocate? _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 29.04.2009, 18:09 Titel: |
|
|
@elektronix: wie würde das dann aussehen? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 29.04.2009, 19:07 Titel: |
|
|
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 |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 29.04.2009, 19:14 Titel: |
|
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 29.04.2009, 20:47 Titel: |
|
|
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 |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 30.04.2009, 08:03 Titel: |
|
|
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 |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 30.04.2009, 09:09 Titel: |
|
|
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 |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 30.04.2009, 10:37 Titel: |
|
|
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 |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 30.04.2009, 11:04 Titel: |
|
|
"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 |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 30.04.2009, 12:47 Titel: |
|
|
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 |
|
 |
|