25

私は現在、Arduino Uno、9DOF、およびXBeeを使用しています。シリアル経由でバイトごとに送信し、構造体に再構築できる構造体を作成しようとしていました。

これまでのところ、次のコードがあります。

struct AMG_ANGLES {
    float yaw;
    float pitch;
    float roll;
};

int main() {
    AMG_ANGLES struct_data;

    struct_data.yaw = 87.96;
    struct_data.pitch = -114.58;
    struct_data.roll = 100.50;

    char* data = new char[sizeof(struct_data)];

    for(unsigned int i = 0; i<sizeof(struct_data); i++){
        // cout << (char*)(&struct_data+i) << endl;
        data[i] = (char*)(&struct_data+i); //Store the bytes of the struct to an array.
    }

    AMG_ANGLES* tmp = (AMG_ANGLES*)data; //Re-make the struct
    cout << tmp.yaw; //Display the yaw to see if it's correct.
}

ソース: http://codepad.org/xMgxGY9Q

このコードは機能していないようで、何が間違っているのかわかりません。

これを解決するにはどうすればよいですか?

4

4 に答える 4

40

次のコードで問題を解決したようです。

struct AMG_ANGLES {
    float yaw;
    float pitch;
    float roll;
};

int main() {
    AMG_ANGLES struct_data;

    struct_data.yaw = 87.96;
    struct_data.pitch = -114.58;
    struct_data.roll = 100.50;

    //Sending Side
    char b[sizeof(struct_data)];
    memcpy(b, &struct_data, sizeof(struct_data));

    //Receiving Side
    AMG_ANGLES tmp; //Re-make the struct
    memcpy(&tmp, b, sizeof(tmp));
    cout << tmp.yaw; //Display the yaw to see if it's correct
}

警告: このコードは、送信と受信が同じエンディアンアーキテクチャを使用している場合にのみ機能します。

于 2012-12-08T08:56:52.963 に答える
7

あなたは間違った順序で物事を行います、表現

&struct_data+i

のアドレスを取得し、構造体のサイズの倍にstruct_data増やします。i

代わりにこれを試してください:

*((char *) &struct_data + i)

struct_dataこれは のアドレスを aに変換し、char *次にインデックスを追加し、逆参照演算子 (単項*) を使用してそのアドレスの "char" を取得します。

于 2012-12-08T08:48:49.937 に答える
4

常にデータ構造を最大限に活用する..

union AMG_ANGLES {
  struct {
    float yaw;
    float pitch;
    float roll;
  }data;
  char  size8[3*8];
  int   size32[3*4];
  float size64[3*1];
};
于 2016-05-09T20:01:47.383 に答える
1
for(unsigned int i = 0; i<sizeof(struct_data); i++){
    // +i has to be outside of the parentheses in order to increment the address
    // by the size of a char. Otherwise you would increment by the size of
    // struct_data. You also have to dereference the whole thing, or you will
    // assign an address to data[i]
    data[i] = *((char*)(&struct_data) + i); 
}

AMG_ANGLES* tmp = (AMG_ANGLES*)data; //Re-Make the struct
//tmp is a pointer so you have to use -> which is shorthand for (*tmp).yaw
cout << tmp->yaw; 
}
于 2012-12-08T08:53:26.803 に答える