プロが教えるわが家の防犯対策術!

角錐の底面積と高さを整数値で入力し,その体積を小数点第1位まで表示する 
  角錐の体積は以下の式で求める
   角錐の体積 = 底面積 * 高さ / 3
 処理
  底面積と高さを入力
  底面積と高さがどちらも0より大きい値ならば
  角錐の体積を求めて、表示する
  どちらかが0以下ならば
  "入力された値が正しくありません" のメッセージを出力する

底面積と高さはint型とする
  体積はdouble型とする
 イメージ
  底面積 5  高さ 2 の時、体積は 3.3 と表示される

という問題で僕は以下の様に作りました。#include <stdio.h>

void main(void)
{
int teimennseki takasa;
double taiseki

printf("角錐の底面積を入力して下さい(整数値):");
scanf("%d",&teimennseki);

printf("高さを入力して下さい(整数値):");
scanf("%d",&takasa);

if (teimennseki <= 0 ){
printf("入力された値が正しくありません");
}
else if (takasa <= 0 ){
printf("入力された値が正しくありません");
}
else{
taiseki = teimennseki * takasa / 3.0
printf("底面積 %d 高さ %d の時、体積は %.1f\n",teimennseki,takasa,taiseki);
}

return 0;
}

すると、エラー7(記憶領域制御ブロックが壊れていました。) がでます。これはどういうエラーで、原因はどこでしょうか?

A 回答 (6件)

> エラー7(記憶領域制御ブロックが壊れていました。

) がでます

他の方が指摘された細かいこと以外に、コンパイラによって問題が出そうなところ
がひとつあります。

> void main(void)
省略
> return 0;
> }

規格云々の話もありますが、少なくとも、戻り値を void で宣言した関数で、
return 0; と値を返してはいけませんね。

本来なら、コンパイルエラーにして欲しいところですが、これを通してしまう
コンパイラーなのでしょう。

で、戻り値用の領域を用意してないのに、戻り値を入れたことが「記憶領域制御
ブロックを壊す」ことにつながったのでしょう。
    • good
    • 0

プログラムの記述については皆さんの回答されている通り。


エラーについても正確なところはわかりませんが
> 記憶領域制御ブロックが壊れていました。
という表現から受ける印象は、「OSが壊れているんじゃないの?」
というところですね。
    • good
    • 0

何のエラーかは分かりませんが、、


どのような環境(OSやコンパイラ)でどの時点でのエラーなのか(コンパイル、実行時)ぐらいは示された方が良いと思います。

taiseki = teimennseki * takasa / 3.0
の行に ; が抜けているのは関係ないですよね?^^;

後、本題とはそれますが、
if (teimennseki <= 0 ){
printf("入力された値が正しくありません");
return 1;
}
else if (takasa <= 0 ){
printf("入力された値が正しくありません");
return 1;
}

taiseki = teimennseki * takasa / 3.0
printf("底面積 %d 高さ %d の時、体積は %.1f\n",teimennseki,takasa,taiseki);

と言うようなコードの方が読みやすくなるかと^^;
好みの問題かも知れませんが、、
    • good
    • 0

このソースは、コピペされたものでしょうか?


もし、そうなら、下の2行のセミコロン;が抜けています。

double taiseki
taiseki = teimennseki * takasa / 3.0

プログラムは正しく作動すると思いますよ!
OS、コンパイラーなども補足されますと
後の方の回答がやり易いのではないでしょうか?
    • good
    • 0

>double taiseki



>taiseki = teimennseki * takasa / 3.0

こちらもそれぞれ、

double taiseki;

taiseki = teimennseki * takasa / 3.0;

ですね。(ただのセミコロン付け忘れ)

それから

>return 0;

とするのであればint main(void)であるべきです。

これって元のソースのコピーじゃありませんね?
写し間違いが多い気がしますので…。(^_^;
    • good
    • 0

>int teimennseki takasa;



これは正しくは

int teimennseki,takasa;

ですよね。
元のソースはこうなっているのかな?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!