Array am schnellsten füllen??

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Then
Beiträge: 247
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Array am schnellsten füllen??

Beitrag von Then »

Hallo zusammen,

Ich habe eine Tabelle mit zahlen diese ist 14 Spalten breit und 21 Zeilen hoch.

Code: Alles auswählen

01 02 03 04 05 06 07 08 09 10 11 12 13 14
15 16 17 18 19 20 21 22 23 24 25 26 27 28
29 30 31 32 33 34 35 36 37 38 39 40 41 42
...
Nun muss ich auf schnellsten Wege diese Werte an ein Array übergeben, aber nicht in dieser Reihenfolge, sondern in Schlangenlinie.

Code: Alles auswählen

a.s(1) = "01"
a.s(2) = "02"
a.s(3) = "03"
a.s(4) = "04"
a.s(5) = "05"
a.s(6) = "06"
a.s(7) = "07"
a.s(8) = "21" <<<< !!!
a.s(9) = "20" <<<< !!!
...
Und das bis unten und in der untersten Reihe geht's dann bis nach rechts außen und wieder Zick Zack nach oben.

Code: Alles auswählen

a.s(294) = "14"
Das wäre die letzte Position. Alles einzeln is zu lang.... Ich brauch was richtig schnelles. Wer hat ne Idee ? Die Tabelle lässt sich leider nicht anders verwenden....
Zuletzt geändert von Then am 07.04.2021 16:36, insgesamt 2-mal geändert.
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Array am schnellsten füllen??

Beitrag von NicTheQuick »

Sollte nach der 7 nicht 21 kommen? Sonst verstehe ich das mit der Schlangenlinie nämlich nicht.
Bild
Benutzeravatar
Then
Beiträge: 247
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: Array am schnellsten füllen??

Beitrag von Then »

:oops:
Zuletzt geändert von Then am 07.04.2021 16:34, insgesamt 1-mal geändert.
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
Then
Beiträge: 247
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: Array am schnellsten füllen??

Beitrag von Then »

Klar, hab's geändert. (Hatte aus dem Kopf am handy geschrieben :freak: )
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Array am schnellsten füllen??

Beitrag von NicTheQuick »

Wie ist die Tabelle denn gespeichert?
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Array am schnellsten füllen??

Beitrag von NicTheQuick »

Hier mal die am einfachsten verständliche Variante:

Code: Alles auswählen

EnableExplicit

Dim arr.i(293)

; Definiere Struktur der Tabelle
Structure column
	col.i[14]
EndStructure
Structure table
	row.column[21]
EndStructure

; Weise sie per Pointer zu
Define *table.table = ?table

; Laufe in Schlangenlinien über die Tabelle
Define i.i, x.i, y.i

; Linke Hälfte
For y = 0 To 18 Step 2
	For x = 0 To 6
		arr(i) = *table\row[y]\col[x]
		i + 1
	Next
	For x = 6 To 0 Step -1
		arr(i) = *table\row[y + 1]\col[x]
		i + 1
	Next
Next
; Unterste Zeile
For x = 0 To 13
	arr(i) = *table\row[20]\col[x]
	i + 1
Next
;Rechte Hälfte
For y = 18 To 0 Step -2
	For x = 6 To 0 Step -1
		arr(i) = *table\row[y + 1]\col[x + 7]
		i + 1
	Next
	For x = 0 To 6
		arr(i) = *table\row[y]\col[x + 7]
		i + 1
	Next
Next
	
; Gib nochmal alles aus
For i = 0 To 293
	Debug arr(i)
Next

DataSection
	table:
		Data.i   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14
		Data.i  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28
		Data.i  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42
		Data.i  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56
		Data.i  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70
		Data.i  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84
		Data.i  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98
		Data.i  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112
		Data.i 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126
		Data.i 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140
		Data.i 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154
		Data.i 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168
		Data.i 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182
		Data.i 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196
		Data.i 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210
		Data.i 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224
		Data.i 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238
		Data.i 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252
		Data.i 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266
		Data.i 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280
		Data.i 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294
EndDataSection
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Array am schnellsten füllen??

Beitrag von NicTheQuick »

Wenn es so richtig richtig schnell gehen soll, dann müssten wir noch über genaue Datentypen und Assembler reden, denn es gibt durchaus Instruktionen, die kurze Speicherbereiche umkehren können. Das wäre dann ja für jede zweite Zeile von Nöten. Und wenn alles nur Bytes oder Words sind, dann könnte es auch noch locker in einen Cache-Zeile der CPU passen und wäre mit entsprechendem Alignment auch auf diese Weise schon sehr schnell.
Bild
Benutzeravatar
Then
Beiträge: 247
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: Array am schnellsten füllen??

Beitrag von Then »

Uiui, vielen dank :allright:

Es würde eine CSV Datei werden, mit verschiedenen Inhalten und Komma getrennt. Der ansatz obenist schonmal super. Ich muss testen, ob das schnell genug ist, so ähnlich hatte ichs auch schon probiert, dann hatte ich versucht in die FOR und NEXT Schleife beides einzubauen (die erste Sektion nach unten und gleichzeitig die 2. nach oben) dabei habe ich mich dann komplett verhaspelt und nix ging mehr. :lol:

Assembler kann ich ja mal gar nicht, da bin ich komplett außen vor und brauche dann einen komplett fertigen Code :oops:
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Array am schnellsten füllen??

Beitrag von NicTheQuick »

Ja, die linke und rechte Hälfte kann ich dir gerne auch zusammenfassen. Ich habe es extra nicht gemacht, damit der Code noch übersichtlich ist.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Array am schnellsten füllen??

Beitrag von NicTheQuick »

Hier ist es etwas abgekürzt, aber kaum noch verständlich:

Code: Alles auswählen

EnableExplicit

Dim arr.i(293)

; Definiere Struktur der Tabelle
Structure column
	col.i[14]
EndStructure
Structure table
	row.column[21]
EndStructure

; Weise sie per Pointer zu
Define *table.table = ?table

; Laufe in Schlangenlinien über die Tabelle
Define i.i, x.i, y.i, j.i

; Alles auf einmal
For y = 0 To 18 Step 2
	For x = 0 To 6
		arr(y * 7 + x) = *table\row[y]\col[x]
		arr((y + 1) * 7 + (6 - x)) = *table\row[y + 1]\col[x]
		arr(20 * 14 - y * 7 + (6 - x)) = *table\row[y + 1]\col[x + 7]
		arr(21 * 14 - (y + 1) * 7 + x) = *table\row[y]\col[x + 7]
	Next
Next
For x = 0 To 13
	arr(20 * 7 + x) = *table\row[20]\col[x]
Next

	
; Gib alles aus
For i = 0 To 293
	Debug "i=" + i + ~"\t" + arr(i)
Next

DataSection
	table:
		Data.i   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14
		Data.i  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28
		Data.i  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42
		Data.i  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56
		Data.i  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70
		Data.i  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84
		Data.i  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98
		Data.i  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112
		Data.i 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126
		Data.i 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140
		Data.i 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154
		Data.i 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168
		Data.i 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182
		Data.i 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196
		Data.i 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210
		Data.i 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224
		Data.i 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238
		Data.i 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252
		Data.i 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266
		Data.i 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280
		Data.i 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294
EndDataSection
Bild
Antworten