2017-01-27 12 views
0

ダイナミックリンク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{...}; 

答えて

0

です。問題は解決しました。すべての奇妙な行動の理由は記憶管理であった。アライメントとパディングは違っていました!

typedef struct __attribute__(packed) MyStruct{ ...}; 

を詰めように私の構造体を宣言した後、問題が解決したので、私は

typedef struct __attribute__(packed,align(1)) MyStruct{...}; 

はまた、私はLLVM打ち鳴らすCompilter

のための#pragma pack(1)を加え、したがって、解決策を波平試していないました
#pragma pack(1) 
typedef struct __attribute__(packed,align(1)) MyStruct{...}; 

私は理由を知らないが、LLVMコンパイラは、パック(1)指令に従うつもりはなかったが、最終的な解決策は、2バイトアライメントにすべてを変更することでした、すべてを削除しましたプラグマ除く:

#pragma pack(2) 
typedef struct MyStruct{...}; 

そして今、すべてが

:-)魔法のように動作します
関連する問題