
dsPICで配列を使用する際、他の変数もその配列の存在するメモリ領域に配置されてしまいます。
プログラムにはC言語を用いています。環境は「MPLAB C30 v3.31」、「MPLAB LINK30 v3.31」「MPLAB v8.85」です。
状況としてはunsigned char型で要素数320の配列をグローバル宣言します。そしてmain関数やその他の関数内でローカル変数を宣言するとその変数が配列の中に存在することになってしまうというものです。色々試したところ、そのローカル変数をstaticで宣言するとそのような症状は出なくなりました。
この現象には、初期化をする関数内でカウンタとしてローカル変数を宣言し、for文で配列を0でクリアさせようとしたところ、MPLABSIMでデバッグすると永久ループしたことから気づきました。Watchを用いて確認したところ配列の中にそのカウンタ変数が配置されていたため最終的に自分自身を0でクリアしてしまうことで永久ループしてしまうことがわかりました。
なぜこうなるのかよくわかりません。この配列以外にはおおきな領域を必要とする変数は宣言していませんのでData memoryの容量的な問題ではないと思っています。staticで宣言すれば何とかなりますが、これでは無駄なメモリを消費してしまいます。また、絶対アドレス指定をする方法もありますが、「ignoring address attribute applied to automatic 変数名」というwarningがでて結局出来ませんでした。
。
このような現象を起こさせない様にするため,、確実にメモリを確保するためにはどうすればよいのでしょうか。
この問題のために先に進めず、大変困っております。どうかご教授ください。
もう一つ、変数の生存期間について質問なのですが、ある関数内で宣言したローカル変数をカウンタとして使い、指定の回数だけ他の関数を繰り返し実行する場合、他の関数に飛んだ時もそのローカル変数は確実に生存しているのでしょうか。重ねてお願いします。
不足がございましたら補足しますのでお教え下さい。
No.2ベストアンサー
- 回答日時:
>ある関数内で宣言したローカル変数をカウンタとして使い、
>指定の回数だけ他の関数を繰り返し実行する場合、
>他の関数に飛んだ時もそのローカル変数は確実に生存しているのでしょうか。
要するに
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が表示されます。
この回答への補足
tadysさんと重ねて補足させていただきます。
回答ありがとうございました。説明不足でしたが、今回私が試みているのは指定の回数だけ関数を繰り返すというものですので呼び出す関数内でそのカウンタとしての変数を参照することはありません。確認したかったのは他の関数に飛んだ時もその変数は開放されたりせず、存在しているかどうかです。
tadysさんとhitomuraさんとで意見が異なるようなのですがどちらが正しいのでしょうか?
No.5
- 回答日時:
>何度も失敗しながらも取り組んでいけば得られるものもあると思っているのでこれからも頑張っていくつもりです。
失礼いたしました。向学心に水を指すようなことを言ってしまいました。頑張って習得してください。
No.4
- 回答日時:
関数A から関数B を呼んだ場合, 関数A の中で定義された変数は「関数B からアクセスすることはできないが値は保存される」が正解. #1 の「抜け出した」は「関数が終わったら」って意味じゃないかな.
本題については, とりあえず #3 で指摘されているところを確認するくらいかなぁ. あとは, メモリマップを見て「変数がどこに割り当てられているか調べる」とか.
お礼が遅くなって申し訳ありません。
結局、様々な方法を試しましたが解決できず、諦めて実際のハード(PIC)に書き込んで実行した所、特に問題なく動くことが確認できました。原因はわかりませんが、永久ループも起こっていないですし、ビットのズレなどのエラーも起こっていません。最終的にはMPLABSIM側の問題かと思っています。
ご多忙の所お付き合いくださってありがとうございました。他の回答者様と重ねて御礼申し上げます。
No.3
- 回答日時:
PICには詳しくないので、外してたらすみませんが、これは多分文法とかの問題ではないでしょう。
自動変数は、通常、スタックに生成されるものが多いと思います。
リンカでの指定がちゃんと行われているか?
スタートアップ部で、スタックポインタや、スタックセグメントがちゃんと設定されているか?
そういった所を確認してみてはいかがでしょうか?
最後の質問の内容から見ると、いきなり組み込み系の開発は難しいんじゃないでしょうか?
この回答への補足
回答ありがとうございました。おっしゃるとおり私はまだまだ未熟なので勉強が必要だと思っています。最後の質問に関しては今まで当たり前のようにしてきましたが、うまくいっていたのは偶然だったのではないかと思い立ったためです。PICは簡単なことをするのであれば初心者向けでインターネット上に情報がたくさんあるために勉強しています。何度も失敗しながらも取り組んでいけば得られるものもあると思っているのでこれからも頑張っていくつもりです。
ご指摘いただいた部分に関しては改めて確認したいと思います。
No.1
- 回答日時:
>他の関数に飛んだ時もそのローカル変数は確実に生存しているのでしょうか。
C言語のローカル変数は、その関数の中だけで有効です。
関数から抜けだした時点で死んでいます。
死なないようにするにはstatic宣言をするか、グローバル宣言をするしか方法は有りません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- C言語・C++・C# 競技プログラミングに関する質問です。 3 2022/04/03 19:51
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
【C言語】配列の中に配列を入れ...
-
複数のボタンを配列で扱う方法...
-
先頭アドレスとは何ですか?
-
9枚の写真がA4 1枚に印刷できま...
-
std::listの代入について
-
配列を使わずに、変数名を動的...
-
C言語初心者 構造体 課題について
-
乱数ってなんですか?
-
計算結果がものすごく多いんで...
-
MFC、ダイアログベースでのモー...
-
C言語で特定列だけを抽出して配...
-
配列の制限について
-
C# Listを使わずに2次元配列の...
-
自販機での金銭収受を想定した...
-
配列を含む構造体の初期値について
-
【速いブラインドタッチ】手を...
-
配列をEraseしてもメモリが開放...
-
配列で格納したものをmsgboxで...
-
ExcelVBAで質問です。離れた二...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
C# Listを使わずに2次元配列の...
-
【速いブラインドタッチ】手を...
-
配列をEraseしてもメモリが開放...
-
テキストファイルから文字列を...
-
先頭アドレスとは何ですか?
-
配列で格納したものをmsgboxで...
-
複数の選択範囲の行番号を個別...
-
C# 配列の変数宣言について。
-
C++ vectorに配列をプッシュしたい
-
配列を含む構造体の初期値について
-
VBで構造体の配列を関数に渡す...
-
C言語で特定列だけを抽出して配...
-
キーボードのキー配列について
-
ExcelVBAで質問です。離れた二...
-
2次元配列を戻り値とする関数?
-
unsigned char配列への入力の仕方
-
【C言語】配列の中に配列を入れ...
-
Redimした動的配列はEraseする...
おすすめ情報