• ベストアンサー

C言語プログラムエラーについて

C言語(CCS)でPICに書き込むためのプログラムを書いているのですが、 main関数内でfloat a[10]と宣言するとエラーは出ないのでが、 float a[100]にするとエラーが出てしまいます。 実数の配列を100個以上宣言したいのですが、doubleは使えないので どうすれば良いのかわかりません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.3

SOKUTEI1.C のエラー行近辺のソースはどうなっていますか?

hiro-333
質問者

お礼

a[20]までなら実行できたのでこれで測定することにしました。 お返事ありがとうございました。

hiro-333
質問者

補足

プログラムはPICのAD変換を使って電圧測定を行うもので エラー行近辺のソースは #include<16f877.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP #device ADC=10 #use delay(CLOCK=20000000) #use rs232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7) void main() { float a[10],ave,bunsan; int i; char cmd; setup_adc_ports(RA0_ANALOG); setup_adc(ADC_CLOCK_DIV_32); このようになっています。

その他の回答 (2)

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.2

>float a[100]にするとエラーが出てしまいます。 どんなエラーメッセージが出ていますか?

hiro-333
質問者

補足

お返事ありがとうございます。float a[100]にすると Building SOKUTEI1.HEX... Compiling SOKUTEI1.C: Command line: "C:\PROGRA~1\PICC\CCSC.EXE +FM +t C:\PROGRA~1\MPLAB\E14043\SOKUTEI1\SOKUTEI1.C" Error[45] C:\PROGRA~1\MPLAB\E14043\SOKUTEI1\SOKUTEI1.C 11 : Subscript out of range MPLAB is unable to find output file "SOKUTEI1.HEX". This may be due to a compile, assemble, or link process failure. Build failed. このようなエラーメッセージが出てきます。

回答No.1

非常にタイトな環境でスタック領域が非常に小さいか、 ローカルに配列を作れない制限があるのでしょうか。 静的にする(static)とか動的にする(malloc())など、 環境に応じて試してみてはいかがでしょう。

関連するQ&A

  • c言語 関数宣言

    c言語で書かれたプログラムを見ていると、ちょっとわからない関数宣言がでてきました。 関数宣言をしているのだと思うのですが、これはいったいどういうことなのでしょうか。 grad_pf(x, a, yfit, dyda, ma) float x; float a[]; float *yfit; float dyda[]; int ma; {            処理・・・・・・・・ } 中括弧の前で宣言された変数はどういったものなのでしょうか。 よろしくお願いいたします。

  • どなたか、教えていただけませんでしょうか(C言語)?

    皆様のお知恵を拝借したく思いまして 投稿させていただきました C言語についての質問なのですが (1)文字配列の引数を一度mainからプロトタイプ関数へ渡し 関数で宣言して表示。 (2)さらにその関数内で、値を変更して mainで表示する 方法を教えていただきたく思いますので、宜しくお願い致します

  • C言語のポインタによる関数の引数の書き方について教えてください。

    C言語を今勉強中の大学生です。 一気に複数の値をmainに返せる、参照による呼び出しによる関数の引数の書き方で困っています。配列を自作関数に引き渡したいのですが、どう書けばいいのでしょうか。 下の3つは、それぞれ(1)mainからの呼び出し、(2)自作関数での引数の引き受け、です。どこをどう変えたらエラーが出なくなるのか、分かる方、お願いいたします! (1)school(&m,h); (2)void school(int *m, float *h){ ※ちなみに変数は int m,float h[10][10]

  • PICプログラム C言語とアセンブラ言語

    PIC18シリーズを使用して、プログラミングをしています。コンパイラはCCS-Cです。今まではすべてC言語で書いてきたのですが、アセンブラでしか設定ができない部分があり、今までのC言語のソースに加えてアセンブラを組み合わせようと思っているのですが、C言語とアセンブラを組み合わせることは可能なのでしょうか?

  • C言語

    以下のC言語のプログラムを教えてください。 お願いします。 (1)標準入力から文字列(2 文字以上)を入力し,文字数を計上すると共に,入力された文字列の逆順に入れ替える処理を実現してください.なお,以下の要件を満たしたプログラムを作成してください. ・ 入力された文字列は,char 型の配列(要素数50)で受け取ること ・ 文字数を計上するcount 関数(引数:配列のアドレス,戻り値:文字数)を定義 し,main 関数より呼び出すこと ・ 文字列を逆順に入れ替えるreverse 関数(引数:配列のアドレス,戻り値:無し) を定義し,main 関数より呼び出すこと ・ 標準出力の処理は,main 関数で記述すること 【プロトタイプ宣言】 int count(char *str); void reverse(char *str); 【実行結果】 文字列を入力してください(2 文字以上) apple 文字数 = 5 入れ換え前 apple 入れ換え後 elppa (2)char 型の配列(要素数50)を2 つ宣言し,標準入力から2 つの文字列を入力してください.そして,格納した字列を入れ替える関数(swapstr 関数)を作成し,入れ替え前と入れ替え後の配列内の値(文字列)を配列名とともに標準出力するプログラムを作成してください. 【プロトタイプ宣言】 void swapstr(char *str1, char *str2); 【実行結果】 2 つの文字列を入力してください apple strawberry 入れ換え前 配列str1 = apple 配列str2 = strawberry 入れ換え後 配列str1 = strawberry 配列str2 = apple

  • C言語について。

    C言語プログラマとしては、スタートアップコードは・・・ ・自分が書いたプログラムを、直接動かすために必要なライブラリ ・それはコンパイル後、リンカによって追加されるライブラリこれは、 どういう意味でしょうか?分かりやすく教えていただけると幸いです。すみません。で、 以下のかぶくんまんさんの回答です。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11247611941 で、 C言語におけるプログラミングとは「main関数を書くこと」に他ならない。なぜ「main関数を書く」ことがC言語におけるプログラミングに他ならないのかと言えば、それは偏に「C言語のコンパイラはmain関数を呼び出すプログラムを生成するから」です。それがmain関数を求めるので結果的にmain関数がリンクされ、そしてmain関数が求めるままに他の関数もリンクされていくわけです。 で、その「main関数を呼び出すプログラム」こそが、C言語における「スタートアップコード」。 という回答で、main関数以降は、プログラマが書くのですよね?プログラマが関数をリンクさせる様なプログラムを書くということでしょうか?教えていただけると幸いです。すみません。 という所が分かりません。教えていただけると幸いです。すみません。以下のURL https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12247932542

  • 秋月PA.exe用のCプログラム

    現在PIC(16F84A)へ書き込むプログラムを作成しています。 プログラムはC言語にしたいのですが、以下のようなプログラムで PA.exeにドラッグするとエラーがでます。(まだテスト段階です)  #include<16f84.h> void main(void) { }     *ファイル名は『test.c』です  -- エラーメッセージ -- Error C:\PIC_C\test.c:Devicename not selected. どなたか、解決法を教えてください。 C言語プログラムのサンプル等、どこかにないものでしょうか??

  • C言語でのコマンドライン引数の内部での処理のされ方

    C言語でint main(int argc, char *argv[])とメイン関数を宣言します。 2番目の引数はC言語の文法的にいうと文字列へのポインタの配列だとおもいますが、一般的な関数でこの引数に値を渡すとすると、以下のように宣言されたポインタ配列を渡すことになるとおもいます。 ・宣言 char *pa[]; ・関数への渡し func(pa); 話が元に戻りますが、main関数でもらう場合は、プログラム外部から与えられた引数は(正確に言うとアドレス)、メモリ上ではC言語で書かれたexeファイルの外から実行時にプログラムファイルのメモリ上にコピーされるのでしょうか? 自分でもうまく表現できないのですが、 ・コマンドプロンプトで引数を与えて実行         ↓ ・プログラムファイルのメモリ上に引数がロードされる ということでいいんでしょうか? 自分でもなんだかうまく表現できないので、お暇な方でよろしいので、気が向いた人、回答ください。 よろしくお願いします。

  • C言語のポインタのプログラムについての質問です。

    C言語のポインタについて質問です。 nこの配列データaを受け取り、それらの値をもとに、2つのデータを引数で受け取って交換する関数void swap(double *a,*b)を用いることにより最終的に降順に並べ替えて出力したのち、それらを平均(average)と標準偏差(standard deviation)を引数で受け渡す関数 void calc_ave_stddev(int n,double a[],double *ave,double*stddev)を利用して出力されるプログラムを教えてほしいです。 main関数内での書式は printf("enter n:"); scanf("%d,&n"); for(i=0;i<n;i++){ printf("enter a[%d]:",i); scanf("%lf"&a[i]); } main関数での結果の出力は、 for(i=0;i<n;i++){ printf("a[%d]=%lf\n",a[i]); } printf("ave=%lf stddev=%lf\n",ave,stddev); です。

  • C言語の実数型の足し算

    C言語初心者です。関数の勉強していて、実数型計算に出くわしました。 #include <stdio.h> float add(float a, float b) { return a+b; } int main(void) { float x=10.5,y=20.3; printf("%f %f\n",x,y); printf("%f\n",add(x,y)); return 0; } としたら、 10.500000 20.299999 30.799999 という結果になりました。今のところint型でずーっと勉強していたので、20.3の20.299999表記が怪しく感じられ、結果も同様に怪しく感じられます。どうして、10.5+20.3=30.8とすっっきり表示してくれないのでしょうか。

専門家に質問してみよう