C言語関係掲示板

過去ログ

No770 floating point not loaded エラー

[戻る] [ホームページ]
No.196

エラーの原因を教えてください。
投稿者---take(2003/07/06 20:33:05)


第15章の構造体の使用例の(1)scanf()を用いてのデータ入力 を実行したところ、コンパイルはできるのですが、実行ができません。
3つのデータを入力後にエラーがおきます。原因がわかりません。

実行後のエラー
runtime error R6002
- floating point not loaded

環境: WindowsXP Professional
コンパイラー: Borland C++5.5

よろしくお願いします。

No.198

Re:エラーの原因を教えてください。
投稿者---ともじ(2003/07/06 21:29:48)


こんばんは。

>第15章の構造体の使用例の(1)scanf()を用いてのデータ入力 を実行したところ、コンパイルはできるのですが、実行ができません。
>3つのデータを入力後にエラーがおきます。原因がわかりません。
>
>実行後のエラー
>runtime error R6002
>- floating point not loaded

Windows XP Home Edition で Borland C++5.5 を使って確認しましたが、
エラーは再現しません。
けれども、このエラーは、C FAQ 14.13の説明にあるものだと思います。
http://www.catnet.ne.jp/kouno/c_faq/c14.html

回避方法も記されているので試していただけますか。
結果を知りたいので、お手数ですが報告をお願いします。

No.200

Re:エラーの原因を教えてください。
投稿者---take(2003/07/06 22:07:59)


ご返答ありがとうございます。
FAQ 14.13での説明どうりみたいですが。
どこを変えていいのかがよくわかりません。
double型での入力後にだけエラーが起こります。



No.201

Re:エラーの原因を教えてください。
投稿者---ともじ(2003/07/06 22:49:08)


>FAQ 14.13での説明どうりみたいですが。
>どこを変えていいのかがよくわかりません。

Borlandのヘルプにも説明がありました。
http://www.borland.co.jp/qanda/lang/l0000116.html

でも、このヘルプ通りに
extern unsigned _floatconvert;
#pragma extref _floatconvert
と記述すると、<stdio.h>に
extern int _floatconvert;
とあるので、型の不一致でコンパイルエラーになります。
#pragma extref _floatconvert
と記述するだけでもいいのかもしれません。

少し調べてみましたが、単に
seito1.average = 0.0;
と書くだけでも、浮動小数点数を使ったとみなされ、浮動小数点数ルーチン
がリンクされるようです。こちらも、試していただけますか。



No.203

Re:エラーの原因を教えてください。
投稿者---take(2003/07/06 23:11:10)


助言ありがとうございました。

#pragma extref _floatconvert
と記述すると、
warning C4068: 不明なプラグマがありました。
と言われてダメでしたが、

seito1.average=0.0;
を記述したらちゃんと動作しました。
助かりました。




No.205

Re:エラーの原因を教えてください。
投稿者---ともじ(2003/07/07 00:02:42)


>#pragma extref _floatconvert
>と記述すると、
>warning C4068: 不明なプラグマがありました。
>と言われてダメでしたが、

そうですか。私の方はコンパイルも実行もできるのですが・・・。

念のために確認したいのですが、printfを使って入力内容を表示した
場合にはどうなりますか。その場合にも同様のエラーが検出されますか。
もし、printfを使うことで回避できるのでしたら、元のソースを直そうと
思います。お手数ですが、もう一度ご確認ください。

No.208

Re:エラーの原因を教えてください。
投稿者---take(2003/07/07 21:23:23)


printf分を加えて実行してみました。うまく出力されませんでした。
--------------------------------------------------------------------
seito1.average=0.0;

/* 構造体配列に scanf()でデータを入力 */
for(i = 0; i < 3; i++) {
scanf("%d", &seito2[i].no);
scanf("%s", seito2[i].name);
scanf("%lf", &seito2[i].average);
}
printf("出力結果\n");
for(j =0; j < 3; j++)
printf(" %d %s %lf\n",
seito2[j].no,seito2[j].name,seito2[j].average);
--------------------------------------------------------------------
入力では、
1
take
1.1
2
take2
2.3
3
take3
4.5
4
take4
6.7
と入力しました。
--------------------------------------------------------------------
出力結果
2 take2 2.300000
3 take3 4.500000
4 take4 6.700000
--------------------------------------------------------------------
何故か1番目に入力したものが出力されてませんでした。
わかりません。

No.209

Re:エラーの原因を教えてください。
投稿者---ともじ(2003/07/07 21:42:24)


こんばんは。

>printf分を加えて実行してみました。うまく出力されませんでした。
>何故か1番目に入力したものが出力されてませんでした。
>わかりません。

最初のソースにある、seito1への入力をそのままにしていませんか。
そこへ、1番目を入力しているんだと思います。

ところで、確認していただきたかったのは、
seito1.average=0.0;
を記述しないで、最初のソースにprintfでの出力を行ったものです。
つまり、以下のものなので、よろしくお願いします。
#include <stdio.h>

struct seiseki {    /* 構造体の宣言 */
    int no;
    char name[20];
    double average;
};

int main(void)
{
    int i;
    struct seiseki seito1, seito2[20];    /* 構造体変数と構造体配列の宣言 */

    /* 構造体変数に scanf()でデータを入力 */
    scanf("%d", &seito1.no);
    scanf("%s", seito1.name);
    scanf("%lf", &seito1.average);
    
    /* 構造体配列に scanf()でデータを入力 */
    for(i = 0; i < 3; i++) {
        scanf("%d", &seito2[i].no);
        scanf("%s", seito2[i].name);
        scanf("%lf", &seito2[i].average);
    }
    
    printf("%d\n", seito1.no);
    printf("%s\n", seito1.name);
    printf("%f\n", seito1.average);
    
    for(i = 0; i < 3; i++) {
        printf("%d\n", seito2[i].no);
        printf("%s\n", seito2[i].name);
        printf("%f\n", seito2[i].average);
    }
    
    return 0;
}




No.210

Re:エラーの原因を教えてください。
投稿者---take(2003/07/07 22:19:35)


言われたとおり実行してみた結果うまく動作しました。
なにが原因だったんでしょうか。
--------------------------------------------------------------------
入力
5
KASAHARA
83.5
1
SAKURAI
78.6
2
NAGANO
57.3
3
TAKESHITA
66.4
--------------------------------------------------------------------
出力
5
KASAHARA
83.500000
1
SAKURAI
78.600000
2
NAGANO
57.300000
3
TAKESHITA
66.400000
--------------------------------------------------------------------

No.211

Re:エラーの原因を教えてください。
投稿者---ともじ(2003/07/07 23:48:43)


お手数お掛けしました。

>言われたとおり実行してみた結果うまく動作しました。
>なにが原因だったんでしょうか。

FAQ14.13にも「たまたま不十分なようである。」とあるので、特定する
のは難しいような気がします。でも、scanf部分だけのソースを使った
のが、「必要がなさそうにみえるときは浮動小数点への対応を実行しない」
という要因を作り出してしまったのでしょうね。

ソースは修正しておきます。いろいろとありがとうございました。

No.212

Re:エラーの原因を教えてください。
投稿者---take(2003/07/07 23:59:38)


こちらこそ、いろいろと助かりました。
また掲示板を活用させていただく機会があるかもしれませんので、よろしくお願いします。
独学では相談する相手がいないので助かりました。
ありがとうございました。