4Byte - ArraySort
-
Baue eine Funktion, die dir ein Array von 4 Byte umdreht. Wende diese Funktion auf jeden 4-Byte-Block deines Arrays an. Beispielsweise*:
void inv4byte(char* a) { char a0 = a[0]; char a1 = a[1]; char a2 = a[2]; char a3 = a[3]; a[0] = a3; a[1] = a2; a[2] = a1; a[3] = a0; } ... // benutzen char a[1024]; for(int i = 0; i < 1024; i += 4) inv4byte(a+i);
* auf die schnelle und ungetestet
-
Vielen Dank, funzt
-
knivil schrieb:
Baue eine Funktion, die dir ein Array von 4 Byte umdreht. Wende diese Funktion auf jeden 4-Byte-Block deines Arrays an. Beispielsweise*:
void inv4byte(char* a) { char a0 = a[0]; char a1 = a[1]; char a2 = a[2]; char a3 = a[3]; a[0] = a3; a[1] = a2; a[2] = a1; a[3] = a0; } ... // benutzen char a[1024]; for(int i = 0; i < 1024; i += 4) inv4byte(a+i);
* auf die schnelle und ungetestet
Lahm.
Denn bei großen Arrays ist für jedes 4 Byte ein Funktionsaufruf notwendig.
Besserer Vorschlag:
Schreib eine Funktion, die ein Array als Parameter annimt, und ein Array zurückliefert, bei dem die Werte umgedreht sind.
Das ist viel effizienter, weil so nur ein Funktionsaufruf notwendig ist.
-
Vorschlag schrieb:
Lahm.
Denn bei großen Arrays ist für jedes 4 Byte ein Funktionsaufruf notwendig.
Eigentlich falsch. Und zwar seit 20 Jahren schon.
Vorschlag schrieb:
Besserer Vorschlag:
Schreib eine Funktion, die ein Array als Parameter annimt, und ein Array zurückliefert, bei dem die Werte umgedreht sind.
Das ist viel effizienter, weil so nur ein Funktionsaufruf notwendig ist.Ja, das war die Aufgabe. Bis auf die Rückgabe.
-
Man darf auch
inline
verwenden, was der Compiler wahrscheinlich sowieso macht.
-
Eine Frage noch, wenn ich vier Puffer mit je 1024Byte hätte und würde diese ebenfalls sequentiell durchlaufen wollen. Das geht ja mit einer if Abfrage, welchen Puffer man gerade bedient muss, aber kriegt man das auch mit einem Zeiger hin?
bin schon am rumprobieren, kriegs aber nicht so ganz hin...habt ihr noch ne Idee?
-
volkard schrieb:
Vorschlag schrieb:
Lahm.
Denn bei großen Arrays ist für jedes 4 Byte ein Funktionsaufruf notwendig.
Eigentlich falsch. Und zwar seit 20 Jahren schon.
Erläutere!
Vorschlag schrieb:
Besserer Vorschlag:
Schreib eine Funktion, die ein Array als Parameter annimt, und ein Array zurückliefert, bei dem die Werte umgedreht sind.
Das ist viel effizienter, weil so nur ein Funktionsaufruf notwendig ist.Ja, das war die Aufgabe. Bis auf die Rückgabe.[/quote]
Ah, dann war knivils Beschreibung falsch, denn er schrieb:
Wende diese Funktion auf jeden 4-Byte-Block deines Arrays an.
-
Vorschlag schrieb:
volkard schrieb:
Vorschlag schrieb:
Lahm.
Denn bei großen Arrays ist für jedes 4 Byte ein Funktionsaufruf notwendig.
Eigentlich falsch. Und zwar seit 20 Jahren schon.
Erläutere!
inline
Vorschlag schrieb:
Besserer Vorschlag:
Schreib eine Funktion, die ein Array als Parameter annimt, und ein Array zurückliefert, bei dem die Werte umgedreht sind.
Das ist viel effizienter, weil so nur ein Funktionsaufruf notwendig ist.Ja, das war die Aufgabe. Bis auf die Rückgabe.[/quote]
Ah, dann war knivils Beschreibung falsch, denn er schrieb:
Wende diese Funktion auf jeden 4-Byte-Block deines Arrays an.
[/quote]
Und drumherum eine Funktion, das hat er niemals ausgeschlossen. Aber darum ging es auch nie.
-
Erläutere!
Der Compiler sieht dass die Schleife 256 mal durchlaufen wird. Da die Funktion winzig ist, inlined er sie einfach.
Der Bloat ist absolut minimal, sowas wird praktisch immer inlined, selbst wenn es nicht in einem Loop-Body ist.
-
SanDi3go schrieb:
Inhalt Array
[ A | B | C | D | E | F | G | H |...] ==Sort==> [ D | C | B | A | H | G | F | E |...]Du kannst htonl (POSIX,winsock für Windows) für little endian Systeme verwenden: