Seite 1 von 2

Array am schnellsten füllen??

Verfasst: 07.04.2021 12:04
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....

Re: Array am schnellsten füllen??

Verfasst: 07.04.2021 15:26
von NicTheQuick
Sollte nach der 7 nicht 21 kommen? Sonst verstehe ich das mit der Schlangenlinie nämlich nicht.

Re: Array am schnellsten füllen??

Verfasst: 07.04.2021 16:31
von Then
:oops:

Re: Array am schnellsten füllen??

Verfasst: 07.04.2021 16:32
von Then
Klar, hab's geändert. (Hatte aus dem Kopf am handy geschrieben :freak: )

Re: Array am schnellsten füllen??

Verfasst: 07.04.2021 16:42
von NicTheQuick
Wie ist die Tabelle denn gespeichert?

Re: Array am schnellsten füllen??

Verfasst: 07.04.2021 16:53
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

Re: Array am schnellsten füllen??

Verfasst: 07.04.2021 16:57
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.

Re: Array am schnellsten füllen??

Verfasst: 07.04.2021 17:38
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:

Re: Array am schnellsten füllen??

Verfasst: 07.04.2021 18:22
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.

Re: Array am schnellsten füllen??

Verfasst: 07.04.2021 19:29
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