管理された環境 (VS2008 C++/CLI Win Forms アプリ)でコードを動作させるのに問題があります。問題は、マネージコード内でアンマネージ構造体を宣言できないことです (それは可能ですか?)、マネージ構造体を宣言しましたが、バッファからその構造体にバイトをコピーする方法に問題があります。明らかに期待どおりに動作する純粋な C++ コードを次に示します。
typedef struct GPS_point {
float point_unknown_1;
float latitude;
float longitude;
float altitude; // x10000
float time;
int point_unknown_2;
int speed; // x100
int manually_logged_point; // flag (1 --> point logged manually)
} track_point;
int offset = 0;
int filesize = 256; // simulates filesize
int point_num = 10; // simulates number of records
int main () {
char *buffer_dyn = new char[filesize]; // allocate RAM
// here, the file would have been read into the buffer
buffer_dyn[0xa8] = 0x1e; // simulates the speed data (1e 00 00 00)
buffer_dyn[0xa9] = 0x00;
buffer_dyn[0xaa] = 0x00;
buffer_dyn[0xab] = 0x00;
offset = 0x90; // if the data with this offset is transfered trom buffer
// to struct, int speed is alligned with the buffer at the
// offset of 0xa8
track_point *points = new track_point[point_num];
points[0].speed = 0xff; // (debug) it should change into 0x1e
memcpy(&points[0],buffer_dyn+offset,32);
cout << "offset: " << offset << "\r\n";
//cout << "speed: " << points[0].speed << "\r\n";
printf ("speed : 0x%x\r\n",points[0].speed);
printf("byte at offset 0xa8: 0x%x\r\n",(unsigned char)buffer_dyn[0xa8]); // should be 0x1e
delete[] buffer_dyn; // release RAM
delete[] points;
/*
What I need is to rewrite the lines 29 and 31 to work in the managed code (VS2008 Win Forms C++/CLI)
What should I have after:
array<track_point^>^ points = gcnew array<track_point^>(point_num);
so I can copy 32 bytes from buffer_dyn to the managed struct declared as
typedef ref struct GPS_point {
float point_unknown_1;
float latitude;
float longitude;
float altitude; // x10000
float time;
int point_unknown_2;
int speed; // x100
int manually_logged_point; // flag (1 --> point logged manually)
} track_point;
*/
return 0;
}
これはcodepad.org への貼り付けです。コードが正常であることを確認できます。
必要なのは、次の 2 行を書き直すことです。
track_point *points = new track_point[point_num];
memcpy(&points[0],buffer_dyn+offset,32);
管理されたアプリケーションで機能するものに。私が書いた:
array<track_point^>^ points = gcnew array<track_point^>(point_num);
現在、構造体を介してバッファからデータをコピーする方法を再現しようとしていますが、どのように行うべきかわかりません。
または、コードに示されているのと同じ方法でアンマネージド構造体を使用する方法がある場合は、マネージド構造体の操作を避けたいと思います。