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

Code: Alles auswählen

Dim Test As Interer() = {0,1,2,3,4}
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 ! :D

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 :mrgreen:

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. :wink:

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 :mrgreen:
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 :mrgreen:

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.