- ベストアンサー
引数に'1'を設定したのに関数内の変数では'0'として扱われてしまう
- 引数に'1'を設定したのに関数内の変数では'0'として扱われてしまう現象についての質問です。
- デバッガで確認したところ、引数に'1'を渡したはずの変数がなぜか'0'になってしまっていて、if文のTRUEの条件に行かないことが困っています。
- このような現象に遭遇した場合、どのような点を確認していったら良いでしょうか?
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#4です。 >あと、呼び出し側の関数プロトタイプの確認ですかね。まずは。 こちらが本題なのですが、確認されましたか?
その他の回答 (7)
- jacta
- ベストアンサー率26% (845/3158)
みんな関数原型(プロトタイプ)のことを指摘しているわけですが、実際のところどうなのでしょうか? あと、BYTEやWORDなどのユーザー定義型ばかりなので正確な振る舞いがコード片からだけでは読み取れません。これらの型の定義も補足してください。
お礼
回答頂きありがとうございます。お返事大変遅くなり、大変申し訳ございません。 現在のプログラムを確認したところ、この ”void card_data_proc(WORD data,BYTE group,WORD num,BYTE add02);” この関数のプロトタイプ宣言が、このソースファイルのヘッダーファイルで宣言しているのを忘れていることがわかりました。 ヘッダーにプロトタイプ宣言してみたところ、引数の値が予定通りの値で渡されるのを確認しました。 コンパイル時のエラーなのですが、ちょっと特定出来ていません。
- tadys
- ベストアンサー率40% (856/2135)
#5です。 プロトタイプ void card_data_proc(WORD data,BYTE group,WORD num,BYTE add) 引数 WORD data; BYTE MenuCardGroup; int cardindex; card_data_proc(data,MenuCardGroup,cardindex,1); なので cardindexの型がプロトタイプと一致していないですね。 この辺が原因かもしれません。 cardindexの代わりに直接数値(0とか1)を指定したらどうなりますか。 関数の記述より先にプロトタイプ宣言はしているのですよね。 コンパイル時にワーニングはでていませんか。
お礼
回答頂きありがとうございます。お返事大変遅くなり、大変申し訳ございません。 現在のプログラムを確認したところ、この ”void card_data_proc(WORD data,BYTE group,WORD num,BYTE add02);” この関数のプロトタイプ宣言が、このソースファイルのヘッダーファイルで宣言しているのを忘れていることがわかりました。 ヘッダーにプロトタイプ宣言してみたところ、引数の値が予定通りの値で渡されるのを確認しました。 コンパイル時のエラーなのですが、ちょっと特定出来ていません。
- tadys
- ベストアンサー率40% (856/2135)
TRUEの値が1とは限りません。(-1かもしれないし、0かもしれない) if(add == TRUE) とするのであれば card_data_proc(data,MenuCardGroup,cardindex,1);は card_data_proc(data,MenuCardGroup,cardindex,TRUE);とすべきです。 デバッガで1に見えないというのはデバッガの都合で起きる事があります。 変数がレジスタに割り当てられている時には必要な時にならなければ正しい値がセットされないことがあります。 その間は別の変数のために使用されていたりします。
お礼
回答頂きありがとうございました。 >card_data_proc(data,MenuCardGroup,cardindex,TRUE);とすべきです。 このやり方をやってみましたが、やはり現象は変わりませんでした。 一応この”TRUE”を検索してみたところ、 ”#define TRUE 1” という風に宣言されていました。 また、デバッガでのステップ実行ではなく、printf文を入れて、 if(add == TRUE){ printf("0402 TRUE\n\r"); pSCard->cad[group].data[num] = data; } else{ printf("0402 FALSE\n\r"); pSCard->cad[group].data[num] = 0x0000; } というように設定してみたのですが、 "printf("0402 FALSE\n\r");"このprintfを必ず通過してしまいます。
- titokani
- ベストアンサー率19% (341/1726)
とりあえず、 if(add == TRUE) ここは if( add ) のほうがよいでしょう。 あと、呼び出し側の関数プロトタイプの確認ですかね。まずは。
お礼
回答頂きありがとうございました。 この”if( add )”というのをやってみたのですが、やはり結果は変わりませんでした。
- jacta
- ベストアンサー率26% (845/3158)
#1さんの回答を見て、自分の書き方がやや不親切だったことに気付いたので補足しておきます。 > 呼び出し元のコードや 正しい関数原型がある状態で呼び出したのか、関数原型なしで呼び出したのか、間違った関数原型で呼び出したのかによって状況が変わります。 正しい関数原型がある状態で呼び出したのであれば、実引数と仮引数の型が異なることは問題ではありません。
- jacta
- ベストアンサー率26% (845/3158)
> なぜこのようになるのか御存じの方いらっしゃいませんでしょうか? 呼び出し元のコードやコンパイルオプションなど、正確な情報がないのではっきりしたことはいえませんが... addは4つめの引数ですので、レジスタではなくスタックに積まれるはずです。デバッガによっては、正確に値をウォッチできない場合がありますので、それで一見間違った振る舞いをしているように見えるということはありませんか? if文のコードは、おそらくFALSEの条件でdataに相当するレジスタに0をセットし、pSCard->cad[group].data[num]に代入するように展開されると思いますので、ステップ実行するとTRUE側でなくFALSE側が実行されているように見える場合があります。 > このような現象に遭遇した場合はどのような点を確認していったらよいのでしょうか? 逆アセンブルしながら、実際はどうなのかを追跡してください。
お礼
回答頂きありがとうございました。 >逆アセンブルしながら、実際はどうなのかを追跡してください。 うーん、大変そうな作業ですねぇ
- f272
- ベストアンサー率46% (8477/18146)
呼び出された方では void card_data_proc(WORD data,BYTE group,WORD num,BYTE add) 呼び出す方では WORD data; BYTE MenuCardGroup; int cardindex; card_data_proc(data,MenuCardGroup,cardindex,1); というように変数の型が一致していませんね。まずはそこから
お礼
回答頂きありがとうございます。 一応、”int cardindex;”という変数の型と void card_data_proc(WORD data,BYTE group,WORD num,BYTE add) この関数の”WORD num”の変数型があっていなかったので、”WORD cardindex;”というように 変数型を合わせてみました。 これで、テストしてみたんですけど、 if(add == TRUE) pSCard->cad[group].data[num] = data; else pSCard->cad[group].data[num] = 0x0000; このif文の分岐では必ずelse側に行ってしまいます。
お礼
回答頂きありがとうございます。お返事大変遅くなり、大変申し訳ございません。 現在のプログラムを確認したところ、この ”void card_data_proc(WORD data,BYTE group,WORD num,BYTE add02);” この関数のプロトタイプ宣言が、このソースファイルのヘッダーファイルで宣言しているのを忘れていることがわかりました。 ヘッダーにプロトタイプ宣言してみたところ、引数の値が予定通りの値で渡されるのを確認しました。 コンパイル時のエラーなのですが、ちょっと特定出来ていません。