【问题标题】:DMC compiler - "Floating point not loaded" error in CDMC 编译器 - C 中的“未加载浮点”错误
【发布时间】:2020-05-06 06:09:57
【问题描述】:

当我尝试在我的程序中输入floatdouble 时,它给了我运行时错误“未加载浮点数”... 我正在使用 DMC 编译器

在这个程序中,我试图从用户那里获取输入,一切正常。我没有输入价格,而是在 double 类型的结构中定义了价格,程序给了我 floating point not loaded 的运行时错误。我搜索了互联网,但没有找到任何东西。

是什么导致了这个错误,我该如何解决?

这是错误屏幕:

这是代码:-

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct node {
    char isbn[16];
    char title[60];
    char author[40];
    double price;
    int issueSTATUS;
    long count;
    struct node *next;
};

struct node *bookdb;

void display();

void main() {
    bookdb = NULL;
    append();
    display();
    getch();
}

void append() {
    struct node *temp = (struct node *) malloc(sizeof(struct node));
    printf("Enter the Book ISBN : ");
    scanf("%s", temp->isbn);
    printf("Enter the Book Name : ");
    scanf("%s", temp->title);
    printf("Enter the Book Author Name : ");
    scanf("%s", temp->author);
    printf("Enter the Book Price : ");
    scanf("%f", &temp->price); //<--------------------------here's the problem---------------------
    temp->issueSTATUS = 0;
    temp->next = NULL;

    if(bookdb == NULL) {
        bookdb = temp;
        bookdb->count++;
    } else {
        struct node *iterator = bookdb;
        while(iterator->next != NULL) {
            iterator = iterator->next;
        }
        iterator->next = temp;
    }
}

void display() {
    struct node *temp = bookdb;
    while(temp->next != NULL) {
        printf("|%-16s|%-60s|%-20s|$%-5.2f|");
        if(temp->issueSTATUS == 1) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
        temp = temp->next;
    }
    printf("|%-16s|%-60s|%-20s|%-5.2f|");
    if(temp->issueSTATUS == 1) {
        printf("YES\n");
    } else {
        printf("NO\n");
    }

}

【问题讨论】:

  • -Wall -Wextra编译,编译器会告诉你
  • 请不要添加不相关的标签。如果您使用 C 编程,则不要添加 C++ 标签(它们是两种截然不同的语言)。并且dmcs 标签与 Mono C# 编译器的联系可能比“DMC 编译器”更紧密(无论是什么编译器,您是指 Digital Mars C 编译器吗?)。
  • 如果您使用 Digital Mars C 编译器(为什么?您的目标是旧的 DOS 系统?否则它似乎非常过时)那么this reference 应该会很有帮助。查看-f-fd-ff 开关。
  • 请使用复制和粘贴将文本输出作为文本添加到问题中。无需显示几乎是空白屏幕的图形。
  • 我不知道你的编译器。但是一些编译器提供了不同版本的 C 标准库,支持或不支持浮点类型。看来您的程序是使用如此小的有限库构建的。您应该查阅编译器手册以检查正确的设置。

标签: c floating-point runtime-error scanf


【解决方案1】:

首先,检查您的 DMC 版本是否启用了浮点类型的使用。根据文档,这很可能会导致问题:

浮点数未加载

程序尝试执行浮点运算,但浮点运行时系统未链接。对目标文件运行 OBJ2ASM 以确保生成了外部引用 _fltused。否则,去掉浮点运算。

来源:https://digitalmars.com/ctg/runtime.html

其次,如果启用了浮点类型,请考虑:

scanf("%f", &temp->price);

scanf() 中的%f 格式说明符需要* float 类型的参数,但&amp;temp-&gt;price 的类型为*double

使用%lf 代替double

scanf("%lf", &temp->price);

旁注:

  1. display() 中的printf("|%-16s|%-60s|%-20s|%-5.2f|"); 的用途是什么?格式化字符串攻击? printf 的这种用法是不正确的。每个格式说明符都需要有一个适当的对应参数。

  2. main 的返回类型应为int,而不是void

  3. 考虑更新到更新的编译器,例如 f.e.在 Windows 上使用 MingW-w64 的 GCC。

【讨论】:

  • 一般来说是这样,但这怎么会导致错误呢?还没输入号码
  • @Gerhardh 我猜,它不必输入。由于对scanf() 的调用因格式说明符与参数的不匹配而损坏,因此执行本身会导致错误。但这当然只是一个假设。我不知道DMC是如何构建的。至少 OP 会尝试是否有效。很有可能会。
  • 我知道这是UB,理论上一切皆有可能。但是出于实际目的,没有理由在没有转换任何输入值的情况下取消引用该指针。当然,OP 应该解决这三个问题。但这并不能解决问题。
  • 如果它确实是 Digital Mars C 编译器,它的文档突出地提到了 x87 协处理器,并且需要特殊的命令行开关才能为其生成代码。虽然您的答案是正确的,但我认为编译器更有可能根本没有在生成的代码中启用浮点处理,并且scanf 在检测到非浮点以及%f 格式时才退出。
  • @Someprogrammerdude 是的,你们两个都是对的。我找到了 Digital Mars 的文档,该诊断消息属于编辑中引用的未链接的浮点运行时系统。
猜你喜欢
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 2019-07-08
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多