こんにちは。SUZUKIです。
RL78/G14用のプログラムをCS+で開発中に良く分からない現象に遭遇しました。
プログラムは
void test(char a){
char b = 0;
b = a+10;
}
という簡単なものです。
この時に変数a,bをウォッチするとアドレスがそれぞれ[L:REG][H:REG]となっており、変数bの値は0のままでした。
動作する条件としては下記3つありました。
1.変数bの宣言をグローバルで行った場合
2.別の変数(使用しない)を関数内で宣言した場合
3.変数bの型をint型にした場合
これらの時は変数a,b共にアドレスが割り当てられ正常に動作しました。
これはどのような事が起きているのでしょうか。
宜しくお願い致します。
SUZUKIさん、こんにちは。NoMaYです。再び自己フォローです。初心者向けフォーラムで、うかつなことを言ってしまったかも知れないと気になったので、補足しておこうと思います。今回、volatile云々の話をしたのは、コンパイラのオプションで最適化ありにしてコンパイル(*1)したプログラムを、やむにやまれずデバッグ(*2)しなければならなくなった状況で無理矢理に変数をウォッチ出来るようにするためのテクニックです。C言語の文法上そうしなければならない、ということは全くありません。*1: CS+で(一般的に他のデバッガでも)ソースレベルデバッグする時には最適化無しにする(fujita nozomuさん、わわいさん、アドバイス)のが原則です。*2: とは言っても、最適化無しにするとバグが発生しなくなる、こともありますので、その時は今回のウォッチのような現象も含むCS+の(一般的に他のデバッガでもの)謎な振る舞い(わわいさんアドバイス)に泣きたくなるような思いをしながら、最適化ありにしたままデバッグすることもあります。*2': ですが、正直に言うと、私は過去の投稿で、単に文章/説明を書くのが面倒だったから、という理由で手抜きをする為にvolatileを付けたことがあります、、、それと、以前にIKUZOさんという人がCC-RXの最適化で困惑していた時の投稿を読み直していて、今回の件で思い当てることがありましたので、少し調べて後で投稿します。(本日中)もうひとつ、ジェネレーションギャップ(?)を感じましたが、コンパイラのバージョンを尋ねた時にCS+のビルドプラグインのバージョンが返事として返って来たのですが、本来は何を(CS+のどこに表示されるバージョンを)返答すべきかなのか、少し確認して後で投稿します。(本日中)ちなみに、ひょっとして、個人ユーザさん(趣味としての電子工作)でしょか? (最近は、会社の先輩/上司から、もしくは新入社員教育で、教えて貰えないのかなと気になったものですから。)