みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

PICマイコンによる乱数の表示について

度々こちらで、お助け頂いております。
さて、今回の主旨はPICマイコンによりLCD表示器へ6個の数字を
表示する方法についてご質問させていただきました。
プログラミングはPIC用コンパイラCCS社のCコンパイラを使用し、
Micro chip社のMPLABと統合動作させています。
一般的なC言語と異なる部分があり、扱づらい面のあるコンパイラです。
では、問題のソースコードを次に記述します。
細部の設定や定義は省いて記述してあります。
1.void main()
2. {
3.int data,i;
4.srand((unsigned)time(ULL));
5.data = 0;
6.表示器の初期化
7.カーソル位置をHomeへ
8.while(1)
9.{
10.入力信号判定式
11.for(i = 0; i < 6; i++)
12. {
13. data=rand( )%6 + 1;
14. printf(lcd_data"%3d",data);
15. }
16.入力信号判定式
17.break;
18. }
19. }
以上、これだけのソースコードですが、コンパイルすると、
行番4コードがコンパイルエラーとなります。
(※英語のメッセージは読取れません。(勉強不足))
PICに関するrand( )とsrand( )関数について、いろいろと調べてみましたが、
それらに該当する項目が見当たりません。
そこで、行番4の部分をsrand(data);に変更したら、何とかコンパイル成功します。
それをPICに書込み、ターゲットに実装試験してみると、
100回乱数表示のうち、18回同じ組合せの数が出てしまいます。
どうも、srandの初期化が上手く出来てないみたいですが・・・
何処が不具合となっているのでしょうか?
また、同じソースコードをパソコンの標準Cで試してみると、
130回とも全てランダムに画面表示されます。
そこでどなた様か、PICに詳しい方のお知恵を拝借し、
ご指南頂けるなら、大変幸いに思います。
何卒宜しくお願い申し上げます。

投稿日時 - 2011-11-12 22:31:37

QNo.7129497

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

> 行番4コードがコンパイルエラーとなります。
> (※英語のメッセージは読取れません。(勉強不足))

読んでください。それができないなら、そのメッセージをコピーして、ネットで検索したり翻訳したりしてください。
質問するにしても、そのメッセージが無いとなんとも言えません。

> srand((unsigned)time(ULL));
・NULLの打ち間違いですか?ULLのままですか?
・PICマイコンって時計内蔵してるんですか?時計が無ければ、現在時刻を返すtime関数を正常に動作させるのは無理ですよね。
マニュアルちょっと見る限り、time関数は用意されていないようですが。

エラーメッセージを読めば、上の間違いなら、「ULLなんて知らない」とか「timeなんて知らない」とか書いてあるはずです。

> そこで、行番4の部分をsrand(data);に変更したら、何とかコンパイル成功します。
> それをPICに書込み、ターゲットに実装試験してみると、
> 100回乱数表示のうち、18回同じ組合せの数が出てしまいます。

randは、疑似乱数といって、一見バラバラに見えますが、実際はsrandを初期値として使って計算で求めた値です。
なので、srandで指定した「種」が同じだと、乱数の出方も同じになります。
そのため、実行のたびに違う値になって欲しいときは、実行のたびに変わるような種を使います。
time、つまり「現在時刻」を使うのは、そのための手段の一つです。

宣言しただけで、まだ値を代入していない変数dataを使った場合、メモリの内容は不定なので、種として機能することもあるでしょう。しかし、時刻を使った場合にくらべて「前回と同じ」になる可能性が大きいです。

投稿日時 - 2011-11-13 01:35:27

お礼

kmee 様

早速のご回答頂きまして有難うございました。
順を追っていろいろと、検索やら試をしているうち、
お礼と、結果報告が遅くなり申し訳ございません。

PICマイコンとCCS-Cコンパイラは、やはりtime.hが扱われないようですね。
エラーメッセージから、”使用定義されてない機能”と解読できました。

行番4行目の(ULL)は、こちらの記述ミスで、(NULL)が正しいコードです。
time関数が使用できないとなれば、また別の方法がないのか、
考えてみようと思います。

ご親切な解説ありがとうございました。

投稿日時 - 2011-11-13 18:58:59

あなたにオススメの質問