#include <stdio.h>
struct CPU{
char name;
int syuuhasuu;
double chokkei;
double takasa;
};
struct CPU first;
int main(void)
{
printf(それぞれに値を入力してください。\n);
printf(名前-->); scanf(%s, &first.name);
printf(周波数-->); scanf(%d, &first.syuuhasuu);
printf(直径-->); scanf(%lf, &chokkei);
printf(高さ-->); scanf(%lf, &takasa);
return (0);
}
なんですか直径までうまくいくんですがそのあとEnterを押すと
デバッグエラーと出てしまいまいます。
なぜでしょうか?
printf(直径-->); scanf(%lf, &first.chokkei);
printf(高さ-->); scanf(%lf, &first.takasa);
構造体についてもう少し理解を深めた方が・・・
ちなみに、それってコンパイルできたんでしょうか?
すいません。
保存前のを載せてしまいました。
printf(直径-->); scanf(%lf, &first.chokkei);
printf(高さ-->); scanf(%lf, &first.takasa);
で実行してもだめなんですよ。
> printf(名前-->); scanf(%s, &first.name);
も変ですね。
すいません。
具体的にどこがおかしいのでしょうか?
おねがいします。
first.nameはたった1文字分の領域しかありません。
>first.nameはたった1文字分の領域しかありません。
struct CPU{
char name[2];
.
.
.
にしても
>printf(直径-->); scanf(%lf, &first.chokkei);
でランタイム エラー出るみたいですね
昔はコンソール上に「R6002 」なんて出たんですけど
今はWindowsがただ「ランタイム エラー」メッセージ出すだけで
エラーナンバーわかりゃしない
でも、それ+
>first.chokkei
を初期化すると
>first.takasa
を初期化しなくても
>printf(高さ-->); scanf(%lf, &first.takasa);
も通るね
どうも私も、この辺の理解度が低くて誰かフォローお願いします
#include <stdio.h>
struct CPU{
char name[8];
int syuuhasuu;
double chokkei;
double takasa;
};
struct CPU first;
int main(void)
{
printf(それぞれに値を入力してください。\n);
printf(名前-->); scanf(%s, first.name); <-ここ直しました
printf(周波数-->); scanf(%d, &first.syuuhasuu);
printf(直径-->); scanf(%lf, &first.chokkei);
printf(高さ-->); scanf(%lf, &first.takasa);
return (0);
}
でエラーが出なくなりましたが???
でも、最初ソースをコピーしてRUNしたら「ランタイム エラー」が出てましたね~?
アイススケーターさんが直してくれていますが・・・
> struct CPU{
> char name;
> int syuuhasuu;
> double chokkei;
> double takasa;
> };
この構造体だと意図通りに動いてくれないと思います。
構造体は通常各要素が4バイト境界で切れていなければなりません。
ちょっと説明が難しいのですが次のようなプログラムを動かして頂ければ
分かると思います。
#include <stdio.h>
struct CPU{
char name;
int syuuhasuu;
double chokkei;
double takasa;
};
struct CPU first;
int main(void)
{
printf(0x%X , &first.name);
printf(0x%X , &first.syuuhasuu;
printf(0x%X , &first.chokkei;);
printf(0x%X\n, &first.takasa;);
return (0);
}
このプログラムは構造体の各要素のアドレスを表示するものですが実行すると
0x0 0x4 0x8 0x10
※便宜上オフセットで書いています。
のようになります。通常nameが1バイトですから二番目のアドレスは0x1に成らなければ
いけないのですがsyuuhasuuが4バイト境界をまたがっているためこのように4バイト境界
で切れるようにnameのあとに3バイト詰め物されます。このせいで最後のtakasaにアクセ
スしようとすると構造体の領域外にアクセスしてしまいメモリ破壊を起こすこともあります。
良く考えるとこの構造体もちょっと引っかかりますね。
> struct CPU{
> char name[8];
> int syuuhasuu;
> double chokkei;
> double takasa;
> };
この場合、chokkeiが境界に引っかかります。double型の場合8バイト区切りに収まる
ように構造体を作らなければなりません。なのでこの場合
struct CPU {
char name[8];
int syuuhasuu;
int dummy;
double chokkei;
double takasa;
};
のようにダミーの要素を追加することでこの問題を回避します。
え?え? このコンテキストでアラインメントが影響するかしら?
> wood 2003/02/05(水) 05:04:44
Release 版でビルドするとエラーメッセージが出るみたいです。
runtime error R6002
- floating point not loaded
C-FAQ の 14.13 が関係ありそうです。
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/c/C-faq/C-faq-
00.html#contents
私の環境では、単に
#include <stdio.h>
void main(void)
{
double d;
scanf(%lf, &d);
}
としても、ランタイムエラーが発生します。
WinMe, VC++6.0SP5
> え?え? このコンテキストでアラインメントが影響するかしら?
すみません。ちょっと書き方が悪かったですね。
この場合関係ないけど気を付けたほうがいいよということで(^^;
私自身アライメント関係で昔苦労したものでこの問題について過敏になりすぎてまして。