- ベストアンサー
配列と他の変数のメモリ領域重複の問題について質問
- dsPICで配列を使用する際、他の変数もその配列の存在するメモリ領域に配置されてしまいます。
- この現象に対しては、ローカル変数をstaticで宣言することで解決することができますが、無駄なメモリを消費してしまいます。
- また、絶対アドレス指定をする方法もありますが、警告が出てしまい実装できませんでした。メモリを確保するためにはどうすればよいのか困っています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>ある関数内で宣言したローカル変数をカウンタとして使い、 >指定の回数だけ他の関数を繰り返し実行する場合、 >他の関数に飛んだ時もそのローカル変数は確実に生存しているのでしょうか。 要するに int i; for (i=0;i < 10; i++){ some_func(); } ということをやった場合、some_func内の処理を実行中でもiは存在しているか?ということでしょうか? その意味ではiは存在しています。 ただし、そのiへのポインタを何らかの方法でsome_funcが知ることができなければ、そのiに直接アクセスできません。 some_funcの引数としてiを渡した場合は、関数呼び出し時のiの値が別の変数にコピーされてくるため、その値を変更しても元の値に影響を与えません。つまり void other_func(int j) { j = 10; } … int j=1; other_func(j); printf("%d", j); という処理では10ではなく1が表示されます。
その他の回答 (4)
- KAZUMI2003
- ベストアンサー率37% (77/208)
>何度も失敗しながらも取り組んでいけば得られるものもあると思っているのでこれからも頑張っていくつもりです。 失礼いたしました。向学心に水を指すようなことを言ってしまいました。頑張って習得してください。
- Tacosan
- ベストアンサー率23% (3656/15482)
関数A から関数B を呼んだ場合, 関数A の中で定義された変数は「関数B からアクセスすることはできないが値は保存される」が正解. #1 の「抜け出した」は「関数が終わったら」って意味じゃないかな. 本題については, とりあえず #3 で指摘されているところを確認するくらいかなぁ. あとは, メモリマップを見て「変数がどこに割り当てられているか調べる」とか.
お礼
お礼が遅くなって申し訳ありません。 結局、様々な方法を試しましたが解決できず、諦めて実際のハード(PIC)に書き込んで実行した所、特に問題なく動くことが確認できました。原因はわかりませんが、永久ループも起こっていないですし、ビットのズレなどのエラーも起こっていません。最終的にはMPLABSIM側の問題かと思っています。 ご多忙の所お付き合いくださってありがとうございました。他の回答者様と重ねて御礼申し上げます。
- KAZUMI2003
- ベストアンサー率37% (77/208)
PICには詳しくないので、外してたらすみませんが、これは多分文法とかの問題ではないでしょう。 自動変数は、通常、スタックに生成されるものが多いと思います。 リンカでの指定がちゃんと行われているか? スタートアップ部で、スタックポインタや、スタックセグメントがちゃんと設定されているか? そういった所を確認してみてはいかがでしょうか? 最後の質問の内容から見ると、いきなり組み込み系の開発は難しいんじゃないでしょうか?
補足
回答ありがとうございました。おっしゃるとおり私はまだまだ未熟なので勉強が必要だと思っています。最後の質問に関しては今まで当たり前のようにしてきましたが、うまくいっていたのは偶然だったのではないかと思い立ったためです。PICは簡単なことをするのであれば初心者向けでインターネット上に情報がたくさんあるために勉強しています。何度も失敗しながらも取り組んでいけば得られるものもあると思っているのでこれからも頑張っていくつもりです。 ご指摘いただいた部分に関しては改めて確認したいと思います。
- tadys
- ベストアンサー率40% (856/2135)
>他の関数に飛んだ時もそのローカル変数は確実に生存しているのでしょうか。 C言語のローカル変数は、その関数の中だけで有効です。 関数から抜けだした時点で死んでいます。 死なないようにするにはstatic宣言をするか、グローバル宣言をするしか方法は有りません。
補足
tadysさんと重ねて補足させていただきます。 回答ありがとうございました。説明不足でしたが、今回私が試みているのは指定の回数だけ関数を繰り返すというものですので呼び出す関数内でそのカウンタとしての変数を参照することはありません。確認したかったのは他の関数に飛んだ時もその変数は開放されたりせず、存在しているかどうかです。 tadysさんとhitomuraさんとで意見が異なるようなのですがどちらが正しいのでしょうか?