Array über DataSection

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Array über DataSection

Beitrag von Josh »

Kann ich eine Array irgendwie über eine DataSection legen? Irgendwie in der Art wie:

Code: Alles auswählen

DataSection

  MyDataSection:
  
  Data.i 00, 01, 02, 03, 04
  Data.i 10, 11, 12, 13, 14
  Data.i 20, 21, 22, 23, 24
  Data.i 30, 31, 32, 33, 34
  Data.i 40, 41, 42, 43, 44

EndDataSection

Dim *x (4,4)
*x = ?MyDataSection
;*x() = ?MyDataSection

Debug *x (2,2)
Bei Lists und Maps funktioniert es ja auch, dass eine List/Map nur aus Pointern besteht.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Array über DataSection

Beitrag von STARGÅTE »

>> Bei Lists und Maps funktioniert es ja auch, dass eine List/Map nur aus Pointern besteht.
Das geht bei Array ja auch, aber das willst du hier ja garnicht.

Du willst ja ein Array auf Integers. Hier kannst du zB ein static array benutzten:

Code: Alles auswählen

DataSection

  MyDataSection:
  
  Data.i 00, 01, 02, 03, 04
  Data.i 10, 11, 12, 13, 14
  Data.i 20, 21, 22, 23, 24
  Data.i 30, 31, 32, 33, 34
  Data.i 40, 41, 42, 43, 44

EndDataSection


Structure IntegerArray
	i.i[0]
EndStructure


Define *x.IntegerArray = ?MyDataSection

Debug *x\i[2+5*2]
Ansonsten musst du das Array einfach mit CopyMemory befüllen.

Code: Alles auswählen

DataSection

  MyDataSection:
  
  Data.i 00, 01, 02, 03, 04
  Data.i 10, 11, 12, 13, 14
  Data.i 20, 21, 22, 23, 24
  Data.i 30, 31, 32, 33, 34
  Data.i 40, 41, 42, 43, 44

EndDataSection

Dim x.i(4,4)
CopyMemory(?MyDataSection, @x(), 5*5*SizeOf(Integer))


Debug x(2,2)


PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Array über DataSection

Beitrag von mk-soft »

Etwas angepasst <)

Code: Alles auswählen

DataSection

  MyDataSection:
  
  Data.i 00, 01, 02, 03, 04
  Data.i 10, 11, 12, 13, 14
  Data.i 20, 21, 22, 23, 24
  Data.i 30, 31, 32, 33, 34
  Data.i 40, 41, 42, 43, 44

EndDataSection


Structure IntegerArrayColumns
  col.i[5]
EndStructure

Structure IntegerArray
  row.IntegerArrayColumns[0]
EndStructure


Define *x.IntegerArray = ?MyDataSection

Debug *x\row[1]\col[4]

Debug *x\row[4]\col[2]
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Array über DataSection

Beitrag von Josh »

Danke euch für den Hinweis mit der Struktur. Hatte ich nicht bedacht.
STARGÅTE hat geschrieben:>> Bei Lists und Maps funktioniert es ja auch, dass eine List/Map nur aus Pointern besteht.
Das geht bei Array ja auch, aber das willst du hier ja garnicht.
Eigentlich will ich schon genau das. Eine *MyList() besteht halt zwangsweise aus einem Pointer je Listeintrag.

Trotzdem bleibt für mich die Frage, was macht Dim *x (4,4) eigentlich. Sieht für mich so aus, als ob Pb ein ganz normales Array anlegt, was es eigentlich nicht sollte. In diesem Fall würde ich das sogar als Bug einstufen.
Zuletzt geändert von Josh am 03.03.2018 22:44, insgesamt 1-mal geändert.
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Array über DataSection

Beitrag von mk-soft »

Dim fordert immer ein zusammenhängenden Speicher an

Somit ist: Dim x(4,4) ein Bereich von x(0..4, 0..4), somit ein Bereich von 25 Integer.
Der Zugriff auf die richtige Adresse wird dann berechnet.

Ein Dim *x(4,4) ist ein Speicherbereich von 25 Pointern
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Array über DataSection

Beitrag von Josh »

mk-soft hat geschrieben:Ein Dim *x(4,4) ist ein Speicherbereich von 25 Pointern
Eigentlich auch klar *schäm*
Antworten