ダイナミックリンクDLLの関数でNI LabWindowsアプリケーションのポインタを使用する際に問題が発生しています。コンパイラ固有のポインタ?
- DLLは、MinGWの4.7
- NI LabWindowsという商標は、私の知る限り、特定のDLL関数を呼び出すとき、私は
を言うことができるようにC89規格およびC90の拡張と本当に古いLLVM打ち鳴らすANSI Cコンパイラを使用して使用してビルドしました構造体へのポインタを使用します。問題は、LabWindowsアプリケーションによって与えられたポインタが、DLLが指し示すと予想している1バイト前のメモリ位置を指していることです。
だから今までの私の厄介な解決策までは以下の通りです:
int MyFunction(MyStruct* struct) {
char *ptr = (char*) struct;
ptr--;
struct = (MyStruct*) ptr;
// do stuff
ptr = (char*) struct;
ptr++;
struct = (MyStruct*) ptr;
return 0;
}
私の質問は以下のとおりです。なぜ???そしてそれにはもっと洗練された解決策がありますか?
私はポインタとしての基本的な考え方はコンパイラごとに違いはないと思いますが、おそらくLabWindowsが使うものが古すぎると思います。
編集: 解決策は、両方のコンパイラの正しい方法を構造体に宣言し、パディングとアラインメントを指定することでした。したがって、両方のコンパイラで動作する正しい構造体の定義は、
#pragma pack(2)
typedef struct MyStruct{...};