Speicherbereich in ein 2D-Array kopieren
-
Ich möchte einen Speicherbereich in ein 2D-Array kopieren.
Das Array heisst Array[x][y][0]; und ist vom Typ Byte.
X und Y sollen gefüllt werden. Die dritte Dimension ist eine Kostante.In der Variable "Data" liegt der Start des Bereichs, der in Array[x][y][0] hinein soll. Die Daten liegen dort linear. Das heisst zuerst kommen alle x für eine y Dimension usw. Wie bei einer verschachtelten Schleife.
Wie geht so was?
Ich krieg den Syntax von memcpy nicht hin. Geht das überhaupt mit einem 2D (3D) Arry?
-
Etwa so?
memcpy(Array[0], Data, Anzahl_der_Elemente * sizeof(datentyp));
-
Evy schrieb:
Ich möchte einen Speicherbereich in ein 2D-Array kopieren.
Das Array heisst Array[x][y][0]; und ist vom Typ Byte.
X und Y sollen gefüllt werden. Die dritte Dimension ist eine Kostante.In der Variable "Data" liegt der Start des Bereichs, der in Array[x][y][0] hinein soll. Die Daten liegen dort linear. Das heisst zuerst kommen alle x für eine y Dimension usw. Wie bei einer verschachtelten Schleife.
Ich krieg den Syntax von memcpy nicht hin. Geht das überhaupt mit einem 2D (3D) Arry?
Hallo Evy,
mit memcpy ist dies nicht möglich, da Dein Ziel-Memory nicht fortlaufend im Speicher liegt. Wenn die dritte Dimension des Array's nicht 1 ist, so liegen die Bytes einzeln mit Unterbrechungen im Speicher, wenn Du die dritte Laufvariable konstant hälst.
Angenommen Dein Array wäre mit
char Array[2][3][2];
definiert.
Dann ist das Speicherabbild (zeilenweise fortlaufend):
Array[0][0][0] Array[0][0][1] Array[0][1][0] Array[0][1][1]
Array[0][2][0] Array[0][2][1] Array[1][0][0] Array[1][0][1]
Array[1][1][0] Array[1][1][1] Array[1][2][0] Array[1][2][1]Wenn Du jetzt alle Bytes markierst, die hinten eine ..][0] haben, so siehst Du, dass die nicht fortlaufend sind.
Trotzdem kann man so etwas natürlich kopieren.#include <iostream> int main() { using namespace std; const int X = 2; const int Y = 3; char Data[X*Y]; char Array[X][Y][2]; // Data füllen int i = 0; for( int x=0; x<X; ++x ) for( int y=0; y<Y; ++y ) Array[x][y][0] = Data[i++]; return 0; }Gruß
Werner
-
Hallo Werner,
das sind üble News für mich. So wie du es vorschlägst, verfahre ich im Moment.
Das ist aber zu langsam für meine Applikation.Der Quellspeicher liegt auf einer Framegrabber-Karte.
Der Zielspeicher ist eben dieses Array unter C++Nun verstehst du das Problem. Ich brauche die Daten schnell in C++
Ich habe einen Pointer zur Startadresse zum Quellspeicher, wo die Daten linear liegen.
Würde es gehen, wenn die dritte Dimension nicht da wäre. Also Array[x][y] ??
-
Du kannst aber in einem 1 Dimensionalen Array ein mehrdimensionales Simulieren.
Dann kannst du es auch auf einmal kopieren.
Also statt int array[4][4] int arry [16];Devil
-
Hmm, aber wenn die Dimensionen unterschiedlich gross sind????
Also z.B. BYTE Array[100][300][konst]
Im Quellspeicher liegen also z.B. 100 Bereiche nacheinander, die jeweils 300 BYTEs lang sind.
-
naja, dann machst du folgendes:
byte Array[30000]; inline byte get_from_arr(int erster_index, int zweiter_index) { return Array[erster_index*100 + zweiter_index]; } inline void set_to_arr(int erster_index, int zweiter_index, byte arg) { Array[erster_index*100 + zweiter_index] = arg; return; }In C++ wäürde mans natürlich als Klasse mit Memberfunktionen schreiben, aber da du schon bei Optimierungen bist musst du selbst wissen ob du noch methoden mit rumschleppen willst...
-
Evy schrieb:
Das ist aber zu langsam für meine Applikation.
Der Quellspeicher liegt auf einer Framegrabber-Karte.
Der Zielspeicher ist eben dieses Array unter C++Nun verstehst du das Problem. Ich brauche die Daten schnell in C++
Ich habe einen Pointer zur Startadresse zum Quellspeicher, wo die Daten linear liegen.
Hallo Evy,
besteht für Dich die Möglichkeit das Array von
char Array[X][Y][konst];
nach
char Array[konst][X][Y];
umzuändern. Dann kannst Du mit memcpy arbeiten.int main() { const int X = 3; const int Y = 5; char Daten[X*Y]; // Daten füllen char Array[2][X][Y]; memcpy( &Array[1][0][0], Daten, X*Y ); return 0; }Gruß
Werner