• 締切済み

1つのグローバル変数構造体に複数ポインタはできる?

通信機能を常時チェックして、データが来るとそのデータを受信したら構造体の配列に一旦入れるというプログラムを行っております。 typedef struct _new_txfifo_data_ { u8 length; u8 idfy_id[3]; u16 dst_id[2]; u16 src_id[2]; u8 Packet_type; u8 Packet_version; u8 setup_mode; u8 Device_type; u8 version_major; u8 version_sub; u8 bat_val; u8 rssi; u8 lqi; u8 reg[20]; f_option_t opt; u8 s_rssi; u8 s_lqi; }fifo_t; 通常はこのデータ配列を受信するのですが、時々この構造体とは別のデータを受信することがあります。次のような構造体です。 typedef struct _ADJUST_ { packet_hdr_t hdr; u8 bat_val; u16 adc_temperature; u8 prog_ver_sub; u8 prog_ver_major; u8 Device_type; u8 adj_freq; u8 adj_temper; u8 freq_add_sub; u8 temper_add_sub; u8 level[7]; u8 rssi; u8 lqi; u8 id[3]; // f_option_t f_option; }adjust_t; このため次のようなプログラムを作成しました。 void main(void) { -------(中略)-------------------------------------------- fifo_t * fifo; adjust_t * pDD; fifo = &gClient.fifo; pDD = &gClient.fifo; -------(中略)-------------------------------------------- while(1) { length = cc1101_rx((u8 *)fifo,1); if(length > 0 ) { if(pDD->id[0] == 0x6d && pDD->id[1] == 0x65 && pDD->id[2] == 0x32) { OK++; } } -------(中略)-------------------------------------------- } } このプログラムをAVR Studio6.2の環境で作成しています。 しかし、このプログラムはビルドは成功するのですが、 fifo_t * fifo;側は&gClient.fifoのグローバル変数のアドレスをポイントできているようで、fifoの変数をマウスクリックすると入力支援を受けることができるのですが、adjust_t * pDD側はアドレスをポイントできていないようです。入力支援も受けられません。 pDDとfifoをwatch機能で見てみると ・pDD Optimized away Error ・fifo 0x01fa fifo_t*{data}@0x04e1 ([R28]+1) pDDは”Optimized away Error”と出てきます。 また、受信されたデータには pDD->id[0] = 'm' pDD->id[1] = 'e' pDD->id[2] = '2' というデータが入っているので、このデータでadjust_tのデータであるかを識別したいのですが、TRUEのOK++にブレイクしません。 C言語のポインタでは1つのグローバル変数に対して複数のポインタを設定するということはできないのでしょうか? また、このような受信されたデータの型が複数のある場合の良い対処法などご教授頂きますよう、お願い致します。

みんなの回答

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

構造体のfifo_t, adjust_tは、あなたの想定している構造になってますか? 各メンバのアライメントの事とか忘れていませんか?

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

コンパイル時に何らかの最適化オプションを有効にされているのなら全て無効にしてコンパイルしてみてください。 最適化オプションが有効だとデバッガーが必要とする情報がなくなったりすることがあります。

関連するQ&A