2015-04-17 147 views
1

我在visual studio中编写了一个计算器程序。但我需要它与DEVC++一起运行。但我的代码不能在gcc编译器上工作。这是代码的一小部分不起作用。在gcc上无法运行的代码

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <stdbool.h> 

int main(){ 

    long double var1 = 0, var2= 0, memory, result; 
    char wordInput[50] = { 0 }; 
    char *endPtr1, *endPtr2; 

    printf("Enter an input: "; 
    scanf("%[^\n]%*c", wordInput); 

    var1 = strtold(wordInput, &endPtr1); 
    printf("%.4f", var1); 

} 

这是代码块,我得到输入并将其转换为double并赋值给var1。当我编译视觉工作室它工作(它打印输入的数字),但与devC++它不(它打印0.0000)。我能做些什么来解决它?

+1

此代码不能编译。 'error'expected')'before';'令牌 printf(“输入一个输入:”; ' –

+0

'您在第一个'printf'处有一个缺失的右括号' – Andrea

+0

不确定您使用的是什么版本的Dev C++,但http://sourceforge.net/projects/orwelldevcpp/是你想使用的,这不会修复你的代码,但是Orwell Dev C++是最好的“Dev C++”。 –

回答

3

试试这个

#define __USE_MINGW_ANSI_STDIO 1 
#include <stdio.h> 

.... 

    printf("%.4Lf", var1); 
+0

非常感谢你,它的工作原理。你能解释一下这个代码的简要内容吗?我试图学习 –

+0

@TolgaŞengcc的一些参数是在标准设置为使用Windows的VC库无法正常工作。有一个宏切换到不使用VC的库的模式。 – BLUEPIXY

+0

另请参阅我的答案(它解释了问题,但并未提供最佳解决方案,与您的解决方案一样)。 –

2

UPDATE:我的回答解释了这个问题。 BLUEPIXY's answer提供了可能是最好的解决方案。


DevC++使用gcc的MinGW端口。 MinGW默认使用gcc编译器和Microsoft的运行时库。

问题是gcc和微软的运行时间库对long double类型的表示方式有不同的想法。当您打印的var1值:

printf("%.4f", var1); 

你传递一个gcc式long double值微软的printf,这需要一个微软式long double。 (其中一个是64位,与double的大小和表示方式相同;另一个更大,范围和精度更高)。而且您也使用了不正确的格式。 %.4f需要double类型的参数;您需要%.4Lf来打印long double。不幸的是,由于MinGW中的错误,这在这种情况下并没有帮助。

作为一种变通方法,可以从long doublevar1值转换为double,其中GCC和微软的运行时库手柄一致:

printf("%.4f", (double)var1); 

(这不是GCC或微软的运行时库中的错误,其中每一个都是内部一致的,long double的大小是实现定义的,并且两个实现都做出了有效的选择,这是MinGW集成这两个组件的一个bug。)

+0

感谢您的解释。我想我明白了。对不起,因为问题已经解决了,所以不要回答。但非常感谢你的解释 –