2015-04-17 7 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); 

} 

Это блок кода, в котором я получаю вход и преобразовываю его в двойное и присваиваю var1. Когда я скомпилирую его с помощью visual studio, он работает (он печатает введенный номер), но с devC++ он не делает (он печатает 0.0000). Что я могу сделать, чтобы исправить это?

+1

Этот код не компилируется. 'error: expected ')' before ';' token printf (" Enter a input: "; ' –

+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Şen Некоторые из параметров gcc - это то, что в стандарт, который он настроил для использования библиотеки VC для Windows, работает неправильно. Существует макрос для переключения в режим, который не использует библиотеку для этого VC. – BLUEPIXY

+0

См. Также мой ответ (который объясняет проблему, но не дает лучшего решения, как это делает ваш). –

2

UPDATE: Мой ответ объясняет проблему. BLUEPIXY's answer обеспечивает наилучшее решение.


DevC++ использует порт MinGW gcc. По умолчанию MinGW использует компилятор gcc вместе с библиотекой времени выполнения Microsoft.

Проблема в том, что gcc и библиотека времени выполнения Microsoft имеют другое представление о том, как представлен тип long double. При печати значение var1:

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

вы передаете значение НКУ стиле long double в компании Microsoft printf, которая ожидает в Microsoft стиль long double. (Один из них - 64 бита, того же размера и представления, что и double, а другой больше, с большим диапазоном и точностью.) И вы также используете неправильный формат. %.4f требует аргумента типа double; вам нужно %.4Lf для печати long double. К сожалению, это не помогает в этом случае из-за ошибки в MinGW.

В качестве обходного пути, вы можете преобразовать значение var1 от long double к double, которые, как GCC и выполнению библиотека ручка от Microsoft последовательно:

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

(Это не ошибка в НКУ или в библиотеке во время выполнения от Microsoft , каждый из которых является внутренне согласованным. Размер long double определяется реализацией, и обе реализации сделали правильный выбор. Это ошибка в интеграции этих двух компонентов в MinGW.)

+0

Спасибо за объяснение. Наверное, я понял. Извините, что не принял ваш ответ, потому что вопрос уже решен. Но большое спасибо за объяснение –

Смежные вопросы