dynamisch Arrays erweitern ...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Dim alleine kannst du schon mehrmals benutzen, dabei wird aber der
Inhalt gelöscht, ReDim löscht den Inhalt nicht, sondern ändert nur die
Grösse des Arrays -> dynamisches Array!

Listen sind ein wenig ein anderes Konzept, da arbeitet man sehr selten
mit Indizes!

Code: Alles auswählen

 ; --- rein 
  AddElement(etwas()) 
  etwas() = "irgendwas" 
  ; --- raus 
  das = etwas()
wäre richtiger. Das Auffinden von Daten ist etwas mühsamer jedoch
musst du hier wirklich die Nummerierung der Elemente vergessen, sie
haben nur eine Reihenfolge!
Sieh dich einfach nach ein paar Beispielen um.

greetz
Remi
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Hi,
Ich nutze LinkedList für alles wo ich nicht weiss wie viele Elemente/Datensätze am ende herauskommt. Ist im ersten moment etwas ungewöhnlich ohne Indizen zu arbeiten. Möchte es aber nicht mehr missen. Etwas mehr mit LinkedList beschäftigen und schon sind einige Problem die man mit Array´s hat gelöst.

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag von jear »

@der-sigi

Code: Alles auswählen

Dim aa.l(1000000)

For ix.l = 0 To 1000 ; 000
  aa(ix) = 12345 + ix
Next

MessageRequester("ArrayTest", "Test", #MB_OK|#MB_ICONQUESTION)
End 
Mache mal den nachfolgenden einfachen Test.
Wenn ich 1000 Elemente des Arrays fülle, nimmt die Exe 2468 KBytes ein, wenn ich die volle Million fülle, 6328 KBytes.

Bei String-Arrays liegen die String-Inhalte sowieso an anderer Stelle.

Es lohnt sich also kaum. bei der Dimensionierung zu geizen, denn sie verbraucht als solche noch keinen (wenig) Platz.
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

der-sigi hat geschrieben:hallodri: Ist korrekt, bedeutet aber eine zusätzliche DB Abfrage, die Zeit kostet. Darauf wollte ich gerne verzichten.
Ob die eine zusätzliche DB-Abfrage wirklich so viel Zeit kostet?
Gäbes es in PB dynamische Arrays ... müsstest Du noch ab-checken, ob du damit nicht die Zeit (welche Du durch eine gesparte DB-Abfrage gewonnen hast), durch dynamische Arrays wieder verlierst. Denn dynamische Arrays sind meines Erachtens logischer Weise langsamer als Arrays fester Größe.

cu, helpy


Ansonsten hier eine Möglichkeit für PB4 (auch wenn Du das noch nicht verwendest):

Code: Alles auswählen

Macro Ubound(array)
  (PeekL(@array - 8) - 1)
EndMacro 

Structure DBDataType
  Name.s
  Aktiv.l
EndStructure

Procedure AppendToDBData(array.DBDataType(1),index,Name.s,Aktiv.l)
  If Ubound(array()) < index
    ReDim array.DBDataType(index)
    ; zur Beschleunigung könnte man das Array gleich etwas größer machen,
    ; damit das ReDim nicht jedes Mal ausgeführt wird.
    ; ReDim array.DBDataType(index+10)
  EndIf
  array(index)\Name = Name
  array(index)\Aktiv = Aktiv
EndProcedure

Dim DBData.DBDataType(0)

...
  While NextDatabaseRow()
    AppendToDBData( DBData(), GetDatabaseString(0), GetDatabaseLong(6) )
  Wend
  ; Size of Array:  Ubound(DBData())
... 
Antworten