0

これらの と以下の値が与えられtypedefた場合:

typedef void  GTVOID;
typedef GTVOID *PARAM_VALUE;
typedef unsigned long UDGT32 
typedef UDGT32 PARAM_CONST;
typedef signed long DGT32;
typedef DGT32 RESULT_FUNC;

DWORD value = 1; // given from a define

C++ でそのデバイス SDK 関数のニーズを満たすように変換するにはどうすればよいですか?

RESULT_FUN RSetParam( PARAM_CONST DeviceParameter, PARAM_VALUE value);

サンプルの C 参照コードは次のとおりです。

RSetParam( R_SOME_PARAM_CONST, (PARAM_VALUE)value );

以下で試してみましたが、変です。それは問題なくコンパイルされ、一日中動作し、不気味な運によって、アクセス違反が突然発生し始めます。

RSetParam(R_SOME_PARAM_CONST, reinterpret_cast<void*> (value));

私が間違っていることは何ですか?

4

1 に答える 1

0

1値をアドレスとして再解釈しようとしました。関数がこのアドレス (値) を使用して何RSetParamを行っているかによって、プログラムはセグメント フォールトを起こす可能性があります。特に、このアドレスに書き込もうとすると。

RSetParam関数は、2 番目の引数として変数へのアドレスを待機していると思います。変数の型は、他の何か、つまり、アドレスを として渡す必要がある理由に依存する場合がありますvoid *

したがって、番号 1 を DWORD として渡したい場合は、まずスタックに変数を割り当ててから、そのアドレスを渡す必要があります。

DWORD tmp = 1; // given from define
RSetParam( R_SOME_PARAM_CONST, (PARAM_VALUE) &tmp ); // note the '&' !
于 2015-11-28T00:13:21.307 に答える