- ベストアンサー
ポインター引数の関数でコンパイルエラーが出る理由
- ATmega88というアトメル社製のマイコンのプログラミングを行っています。
- 現在void tx_test(cc1101_client * client)というcc1101_clientポインターを引数とした関数を作成したのですが、この関数内でu16 tx_fifo_set(txfifo_data * txfifo)という txfifo_dataポインターを引数とする関数を呼び出したいと思っています。
- しかし、この呼び出し部分において、引数の型が 'txfifo_data *' であるため、'cc1101_client *' のポインターを渡すことができず、コンパイルエラーが発生しているようです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
struct _cc1101_client_ で、 > txfifo_data txfifo; と定義されてるんだから、client->txfifoはtxfifo_data*じゃなくてtxfifo_dataでしょう。 > tx_fifo_set(&client->txfifo); とすればいいのでは? > これらのポインター構造を乗せさせて頂きます。 という言い回しも意味不明だし、ポインターについての理解が不足しているのではないですか?
その他の回答 (4)
- nitho_t
- ベストアンサー率49% (44/89)
#1です。 もう他の方が回答なさっておられるので、正解は tx_fifo_set(&(client->txfifo)); になります。 client内のtxfifoは実体、すなわち、 txfifo_dataであってtxfifo_data*ではないですから。 したがって、client内のtxfifoのアドレスを引き渡す必要があります。 たぶん学生さんだと思いますが、 1)エラーメッセージの読み方を学ぶ からはじめて 「ポインタの概念を理解する」 までたどり着けば問題ないと思います。 蛇足ながら、 初心者向けには日経BPの「プログラムはなぜ動くのか」がおすすめです。 (というか、学生さんには無関係ですが、このくらいも知らないで仕事(組み込み系)はまともにできないと思いますので)
お礼
回答頂きありがとうございました。コンパイルエラーを回避することができました。ポインターについての理解を早急に行いたいと思います。助かりました。 ご紹介頂きました書籍も参考にさせて頂きます。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
tx_fifo_set(client); tx_fifo_set(&client); tx_fifo_set(client->txfifo); これが全部だめだったなら、次にやってみるのは、 tx_fifo_set(&client->txfifo); 多分、 strcut cc1101_client { // この中で、 txfifo_data txfifo; // とか書いているのでしょう(憶測) } もしも、 txfifo_data *txfifo; と書かれていたら、 tx_fifo_set(client->txfifo); で通るはずだし。 と思ったら、そのとおりだったようで。
お礼
回答頂きありがとうございました。コンパイルエラーを回避することができました。ポインターについての理解を早急に行いたいと思います。助かりました。
- nora1962
- ベストアンサー率60% (431/717)
> tx_fifo_set(client->txfifo); の「client->txfifo」が本当に「cc1101_client」型のポインタなのかですかね。 後、本題には全然関係ないんですが、構造体の名称に「cc1101_client」とかつけて分かりにくくありませんか?
お礼
回答頂きありがとうございます。ちょっとポインタの名称の付け方についても勉強不足で簡単に考え過ぎているかもしれないです。その点も考え直してみたいと思います。
補足
なお、こちらのサイトより現在問題になっているATmega88のプロジェクトとソースコードがダウンロードできるようになっております。もしよろしければ、おつきあいどうぞよろしくお願い致します。
- nitho_t
- ベストアンサー率49% (44/89)
Cの標準規格に沿っていると仮定しても、cc1101_clientの(たぶん構造体?)中身が書いていないことには回答できないと思いますよ。あまり一般的なものでもなさそうだし。 ありそうなのは、中身が実体かポインタのポインタでつけるべき記号がついていない、辺りがくさいと思いますが。 というか、メッセージがそのまま回答だと。
お礼
回答頂きありがとうございます。 一応、今回みて頂いた txfifo_data cc1101_client これらのポインター構造を乗せさせて頂きます。 typedef struct _ctl_data_ { u8 adj_freq; u8 add_sub; u8 sleep_transmit_time; }ctl_data; typedef struct _rtc_time_ { u8 chk_hour; u8 chk_min; u8 curt_hour; u8 curt_min; }rtc_time; typedef struct _txfifo_data_ { //u8 length; uint16_t length; u8 data[20]; }txfifo_data; typedef struct _rxfifo_data_ { //u8 length; uint16_t length; u8 data[20]; u8 rssi; u8 lqi; }rxfifo_data; typedef struct _client_status_ { //u8 tx_length; u8 type; u8 serial[6]; u8 sessionflag; u8 ivent_flag; u8 bat_val; //u8 master_rssi; //u8 master_lqi; u8 reserve[8]; }client_status; typedef struct _cc1101_client_ { u8 i; client_status status; txfifo_data txfifo; rxfifo_data rxfifo; rtc_time rtc; ctl_data ctl; }cc1101_client; 書き方に問題があるだけなのではということなので、 u16 tx_fifo_set(txfifo_data * txfifo) この関数の書き方についても今一度見直してみるつもりです。 助かります。
補足
なお、こちらのサイトより現在問題になっているATmega88のプロジェクトとソースコードがダウンロードできるようになっております。もしよろしければ、おつきあいどうぞよろしくお願い致します。 URL書き忘れてしまい補足をこちらで書かせて頂きます。失礼しました。 http://sourceforge.jp/projects/cc1101driver/svn/view/trunk/?root=cc1101driver ATmega88のフォルダが今回の問題になっているソースコードです。
お礼
回答頂きありがとうございました。コンパイルエラーを回避することができました。ポインターについての理解を早急に行いたいと思います。助かりました。