0

Visual Studio 2015 に、ソケットに書き込む LabWindows CVI のアプリケーションからいくつかのフィールドを含む特定の構造体をメモリ ポインターとして受け取るアプリケーションがあります。次に、メモリをアプリケーションの同じ構造体に再キャストします。コードは次のようになります。

DT_ULLong data;
wait_msg(...,...,&data);
XC_GEN_MSG* gen_msg = (XC_GEN_MSG*)data;
float var = gen_msg->varFloat;
//var has trash values
...

構造:

typedef struct _XC_GEN_MSG
{
XC_SERVER_MSG_HEADER   Header;   
DT_ULong               data; //unsigned long long int
} XC_GEN_MSG;


typedef struct
{
unsigned char word[8];
unsigned int num_image;
unsigned int num_pixels_az;
unsigned int num_pixels_dist;
unsigned int rawtime_ms;
unsigned int rawtime_time_t;
unsigned int PW;
unsigned int PRI;
unsigned int Range;
unsigned int PW_Digit;
unsigned int Integrated_pulses_AZ;
unsigned int Rotation_time;
unsigned int bytes_per_pixel;
unsigned int bytes_digit;
DT_UEncoder  UD_AZ_RESOLUTION; // typedef unsigned short DT_UEncoder;
float                       f_az_resolution;
unsigned int Status_bitfield;
float                      Lat;
float                      Long;
float                      wind_speed;
float                      wind_direction;
float                      speed;
float                      course;
unsigned int comand;
unsigned int valor_comand;
} XC_SERVER_MSG_HEADER;

すべてのフィールドが正しくキャストされ、適切な値が表示されますが、float フィールド (この場合は varFloat) には常にゴミが含まれています (通常は 0 に近いですが、たとえば 2*e24 の場合もあります)。これはコンパイルの問題またはメモリ コピーの問題が原因である可能性がありますが、興味深い点は、アプリケーションの 32 バージョンでは機能するが、64 バージョンでは機能しないことです。

どこに問題があり、どうすれば解決できますか?

ありがとう!

4

0 に答える 0