Array Größe

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Array Größe

Beitrag 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 ?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Array Größe

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Array Größe

Beitrag 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   
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Array Größe

Beitrag 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   
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Array Größe

Beitrag 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.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Re: Array Größe

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Array Größe

Beitrag von NicTheQuick »

Bei mir brauchst du nur eine Zeile, wie in VB. :wink:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Array Größe

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Array Größe

Beitrag 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.
Antworten