Seite 1 von 1
Array Größe
Verfasst: 07.06.2010 16:09
von X360 Andy
Hallo
Da ich nun relativ viel mit dem VS Sprachen gearbeitet habe vermisse ich die Möglichkeit eine Array zu befüllen wie es dort so schön war
Damit meine ich folgendes
In VB
Es wird automatisch dimensioniert.
Die Array Test wurde mit 5 dimensioniert.
In PB habe ich mir das gerade dazu geschrieben ( ist zwar nicht genau das gleiche aber kommt eigentlich aufs gleiche hinaus )
Code: Alles auswählen
EnableExplicit
Define ArrayContentSeperator$ = ",", ArrayContent$,ArraySizeCount
Define i
For i = 0 To 999
ArrayContent$ + "test"+Str(i)+ArrayContentSeperator$
Next
Dim ArrayTest.s(0)
; Programm.....
ArraySizeCount= CountString(ArrayContent$,ArrayContentSeperator$ )
ReDim ArrayTest(ArraySizeCount)
For i = 0 To ArraySizeCount
ArrayTest(i) = StringField(Arraycontent$, i,ArrayContentSeperator$ )
Next
Gibt es dazu vielleicht auch eine schönere Lösung in Purebasic ?
Re: Array Größe
Verfasst: 07.06.2010 16:51
von ts-soft
Code: Alles auswählen
; Dim Test As Interer() = {0,1,2,3,4}
EnableExplicit
DataSection
Test:
Data.i 0, 1, 2, 3, 4
EndDataSection
Dim Test.i(4)
CopyMemory(?Test, @Test(), 5 * SizeOf(Integer))
Define i
For i = 0 To 4
Debug Test(i)
Next
Re: Array Größe
Verfasst: 07.06.2010 16:59
von hjbremer
für variable Anzahl in der Datasection
die Stringvariante schreit geradezu nach Verbesserungen !
Code: Alles auswählen
Procedure FillArray(Array feld(1), *a.integer)
Protected j
While *a\i <> 'ende'
j + 1
ReDim feld(j)
feld(j) = *a\i
*a + SizeOf(integer)
Wend
feld(0) = j
EndProcedure
Procedure FillArrayS(Array feld$(1), p)
Protected j, a$
Repeat
a$ = PeekS(p)
If a$ = "ende": Break: EndIf
j + 1
ReDim feld$(j)
feld$(j) = a$
p + Len(a$) + SizeOf(character)
ForEver
feld$(0) = Str(j)
EndProcedure
Dim f(0)
Fillarray(f(), ?arraydaten)
For j = 1 To f(0)
Debug f(j)
Next
Dim s$(0)
FillarrayS(s$(), ?arraydatenS)
For j = 1 To Val(s$(0))
Debug s$(j)
Next
DataSection
arraydaten:
Data.i 1,2,3,34,5,46,888,999
Data.i 'ende'
arraydatenS:
Data.s "Hallo", "Du da"
Data.s "ende"
EndDataSection
Re: Array Größe
Verfasst: 07.06.2010 18:08
von hjbremer
die Stringvariante etwas anders
Code: Alles auswählen
#dataende = Chr(1)
Procedure FillArrayS(Array feld$(1), *p.integer)
Protected j, k
Protected *c.character = *p
Repeat
If *c\c = 0: j + 1: EndIf
*c + SizeOf(character)
Until *c\c = 1
ReDim feld$(j)
For k = 1 To j
feld$(k) = PeekS(*p)
*p + Len(feld$(k)) + SizeOf(character)
Next
feld$(0) = Str(j)
EndProcedure
Dim s$(0)
FillarrayS(s$(), ?arraydatenS)
For j = 1 To Val(s$(0))
Debug s$(j)
Next
DataSection
arraydatenS:
Data.s "Hallo", "beenden", "Du da", #dataende
EndDataSection
Re: Array Größe
Verfasst: 07.06.2010 18:41
von NicTheQuick
Hab noch etwas schickeres mit einer Einschränkung
Code: Alles auswählen
Macro _DQ
"
EndMacro
Macro values(content = ",")
_DQ#content#_DQ
EndMacro
Macro DimArray(name, type, content)
DataSection
ArrayBegin_#name:
Data.type content
ArrayEnd_#name:
EndDataSection
Define ArrayVar_#name.type
Dim name.type((?ArrayEnd_#name - ?ArrayBegin_#name) / SizeOf(ArrayVar_#name) - 3)
CopyMemory(?ArrayBegin_#name + SizeOf(ArrayVar_#name), @name(), ?ArrayEnd_#name - ?ArrayBegin_#name - 2 * SizeOf(ArrayVar_#name))
EndMacro
DimArray(test, i, values(",5, 6,100, -8,")) ;i-Array mit 4 Werten erstellen
DimArray(foo, b, values()) ;b-Array erstellen
Debug "test()"
For i = 0 To ArraySize(test())
Debug test(i)
Next
Debug ""
Debug "foo()"
For i = 0 To ArraySize(foo())
Debug foo(i)
Next
In dem String, der die Werte angibt, müssen vorne und hinten noch Kommas stehen. Anders geht es momentan nicht.
Re: Array Größe
Verfasst: 07.06.2010 19:19
von X360 Andy
Finde ts-soft´s Code am schönsten
Hab jetzt aber nich die Geschwindigkeit der Codes verglichen.
Danke aber dafür, ist zwar alles keineswegs so einfach wie das von VB aber naja.. wäre vieleicht eine Verbesserungsvorschlag Wert für eine der nächsten PB Versionen.
Re: Array Größe
Verfasst: 07.06.2010 19:22
von NicTheQuick
Bei mir brauchst du nur eine Zeile, wie in VB.

Re: Array Größe
Verfasst: 07.06.2010 19:30
von ts-soft
X360 Andy hat geschrieben:Finde ts-soft´s Code am schönsten
Danke
X360 Andy hat geschrieben:Hab jetzt aber nich die Geschwindigkeit der Codes verglichen.
Meine primitive Variante ist mit Sicherheit die schnellste, dafür aber primitiv

Re: Array Größe
Verfasst: 07.06.2010 20:43
von NicTheQuick
Mein Makro baut im Grunde nur automatisch diese DataSection zusammen, die man bei ts-soft selbst schreiben muss. Der Rest ist der selbe. Das heißt von der Geschwindigkeit absolut gleichwertig.