• 締切済み

記憶クラス(関数の引数をなくして外部変数を利用しての書き換え)

/*入力した価格の合計とその税込価格を求めるプログラム*/ #include<stdio.h> #define TAX 0.05 float Getsyouhizeigaku(float); void main(void) { float price, total = 0.0; float zeigaku; while(1){ printf("Price? (finish -> -1)\n"); scanf("%f", &price); if(price == -1.0) break; total += price; } zeigaku = Getsyouhizeigaku(total); printf("価格 %.0f 円の場合, 消費税込み価格は %.0f 円\n", total, zeigaku); } float Getsyouhizeigaku(float kakaku) { float zeikomikakaku; zeikomikakaku = kakaku * (1.00 + TAX); return(zeikomikakaku); } このプログラムを関数の引数(価格を表す実数)をなくし、外部変数を利用して同じ処理を行うようにプログラムを変更せよ。 という問題で #include<stdio.h> #define TAX 0.05 float Getsyouhizeigaku(void); void main(void) { float price, total = 0.0; float zeigaku; while(1){ printf("Price? (finish -> -1)\n"); scanf("%f", &price); if(price == -1.0) break; total += price; } zeigaku = Getsyouhizeigaku(); printf("価格 %.0f 円の場合, 消費税込み価格は %.0f 円\n", total, zeigaku); } float Getsyouhizeigaku(void) { extern float total; float zeikomikakaku; zeikomikakaku = total * (1.00 + TAX); return(zeikomikakaku); } と変更してコンパイルしたところ「'_total'が未解決です」と出ました。何が問題なのかわかりません。 わかる方いましたらよろしくお願いします。

みんなの回答

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.5

>#4 > mainとGetsyouhizeigakuのtotalの宣言は不要です。 「不要」ではなく「消さなければならない」ですね。 同名の変数はローカルスコープ優先なので残してあるとせっかく宣言した外部変数が使われないためです。

k1ngk1z3
質問者

お礼

ありがとうございました。 おかげ様で成功しました。

  • min_is
  • ベストアンサー率25% (1/4)
回答No.4

外部変数として変数を宣言するには #include<stdio.h> #define TAX 0.05 float Getsyouhizeigaku(void); /* ここで外部変数を宣言します */ float total = 0.0; void main(void) { .... mainとGetsyouhizeigakuのtotalの宣言は不要です。 (totalの実体が変数の外で定義されているので不要になります。)

k1ngk1z3
質問者

お礼

ありがとうございました。 おかげ様で成功しました。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

元ソースと課題内容を読む限り外部宣言するのはpriceであってtotalではないように見えるのですが、まぁそれはさておき。 > どのように修正すれば良いかわからない 「実体がない」のだから「実体を宣言すればいい」のですよ。 #1へのお礼を読む限り「外部変数の宣言」に対して誤った覚え方をしています。 外部変数というのは非常に大雑把な言い方をすれば「関数の外で宣言された変数」のことです。 extern宣言は外部変数の宣言ではなく、#2でも言った通り(どこかにある外部変数への)参照宣言でしかありません。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

> extern float total; を解決する外部変数totalがないのが原因です。 externによる変数宣言は「宣言した型・名前を持つ外部変数を参照する」という意味だけで変数の実体を作りません。 また、main()で宣言されている > float price, total = 0.0; は一時変数なので上記totalの実体にはなりません。

k1ngk1z3
質問者

お礼

回答ありがとうございます。 コンパイルエラーの理由はわかりましたが どのように修正すれば良いかわからないので 教えていただけませんか?

  • min_is
  • ベストアンサー率25% (1/4)
回答No.1

extern の使い方誤っています。 関数Getsyouhizeigakuで宣言している、 extern float total; の実体がいないためにエラーになっていると思われます。 extern は自分より外側のスコープで変数の本体が定義されている ことを宣言するための指定子です。 この修正例には変数totalの本体が、Getsyouhizeigaku より外側のスコープでは定義されていません。 関数mainで定義している float total = 0.0; の定義をグローバル変数にしてみてください。 (そうするとGetsyouhizeigakuのextern 宣言自体不要になりますが その理由はご自分で考えてみてください。)

k1ngk1z3
質問者

お礼

回答ありがとうございます。 指定が外部変数でexternを使うはずなんですが totalが定まっていないのも確かでどうすれば いいか迷っています。 priceをキーボードから入力し、かつtotalが外部 変数として有効になるようなプログラムを作るに はどうすれば良いですか?

関連するQ&A