Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с Dev c++


Автор: HMLd 31.1.2007, 21:42
Такая проблема в Dev c++ 4.9.9.2.
Код

#include <stdio.h>

FILE* in = fopen("input.txt", "r");
FILE* out = fopen("output.txt", "w");

int main()
{
    long double a = 0;
    long double b = 0;
    fscanf(in, "%Lf%Lf", &a, &b);
    fprintf(out, "%Lf", a);
    fprintf(out, "\n%Lf", b);

    _fcloseall();
    return 0;
}

/*
input.txt:
5.000001
1000.0

output.txt:
5.000001
1000.0 */

//---------------------------------------

#include <stdio.h>

FILE* in = fopen("input.txt", "r");
FILE* out = fopen("output.txt", "w");

int main()
{
    long double a = 0;
    long double b = 0;
    fscanf(in, "%Lf%Lf", &a, &b);
    fprintf(out, "%Lf\n%Lf", a, b); // Почему здесь надо 2 функции?..

    _fcloseall();
    return 0;
}

/*
input.txt:
5.000001
1000.0

output.txt:
5.000001
0.000000
*/


Что это - баг?... Можно ли исправить?... В Borland всё нормально.

Автор: cardinal 31.1.2007, 21:56
Цитата(HMLd @  31.1.2007,  19:42 Найти цитируемый пост)
В Borland всё нормально. 

А ты возьми в Borland'e функцию fprintf и замени ту, что сидит в DevCpp директории в каком-нибудь файле типа printf.c ...

Автор: HMLd 31.1.2007, 21:58
Так не получится - мне на Dev'е республику писать...

Автор: cardinal 31.1.2007, 22:00
Цитата(HMLd @  31.1.2007,  19:58 Найти цитируемый пост)
мне на Dev'е республику писать... 

что что писать?

Автор: HMLd 31.1.2007, 22:04
Республиканскую олимпиаду по информатике. А они почнму-то сказали, что в этом году будет не Borland c++ 5.02, a Dev c++ (((

Автор: cardinal 31.1.2007, 22:11
Так блин я же не говорю писать на Borland'e а говорю копирнуть оттуда часть тебе необходимую... Или не брать в голову и написать то, что надо в две строки. Может у DevC другой синтаксис аргументов fprintf. Ты ее нашел у Borland'a и DevC? Сравнил?

Автор: HMLd 31.1.2007, 22:19
Дело в том, что вряд ли жюри даст добро на такое "изменение". А насчёт реализации - разве синтаксис fprintf не должен поддерживать стандарт языка?...

Добавлено @ 22:21 
Я бы не брал в голову - но вдруг там ещё таких багов приятных отыщу?.. 

Автор: archimed7592 31.1.2007, 22:32
если я не ошибаюсь, devcpp - только оболочка...компилируеться всё mingw (gcc)...

Автор: cardinal 31.1.2007, 22:33
Цитата(HMLd @  31.1.2007,  20:19 Найти цитируемый пост)
А насчёт реализации - разве синтаксис fprintf не должен поддерживать стандарт языка?

А ты изучи этот вопрос и если какие проблемы с комиссией, то так и скажешь - функция fprintf не соответсвует ANSI C в DevC.
Цитата(HMLd @  31.1.2007,  20:19 Найти цитируемый пост)
но вдруг там ещё таких багов приятных отыщу?

И что? Раз условия олимпиады такие, то ничего не поделаешь. А вообще о DevC я уже писал:
http://forum.vingrad.ru/index.php?showtopic=121567&view=findpost&p=923319
Цитата(HMLd @  31.1.2007,  20:04 Найти цитируемый пост)
А они почнму-то сказали, что в этом году будет не Borland c++ 5.02, a Dev c++ ((( 

Потому, что "For free".

Добавлено @ 22:34 
Цитата(archimed7592 @  31.1.2007,  20:32 Найти цитируемый пост)
если я не ошибаюсь, devcpp - только оболочка...компилируеться всё mingw (gcc)... 

Это так, но ясно, что речь идет именно о компиляторе и примочках...

Автор: Anikmar 31.1.2007, 22:39
А под отладчиком смотрели? Считывается переменная правильно? Чему равна b перед записью?

Автор: HMLd 31.1.2007, 23:06
Anikmar, всё нормально, перед записью инициализируется нулями.

Автор: Anikmar 31.1.2007, 23:14
Цитата(HMLd @  31.1.2007,  23:06 Найти цитируемый пост)
Anikmar, всё нормально, перед записью инициализируется нулями. 

Походу я не врубился... Ошибка в том, что неправильно записывается b?
А вы говорите, что перед записью инициализируется нулями...

Либо я не понял...

Если в выходной файл b должна записаться как 1000 чему она равна перед функцией записи? т.е. где локальная проблема: неправильно считывается или неправильно записывается?

Автор: V.A.KeRneL 31.1.2007, 23:19
HMLd, во-первых, мне непонятно как ты вообще это в Дэве скомпилил.
У меня он ругается 
Код

1.c:2: initializer element is not constant
1.c:3: initializer element is not constant

уже на эти строччки: 
Код

FILE* in = fopen("input.txt", "r");
FILE* out = fopen("output.txt", "w");

, требуя занести их в тело функции main.

А вообще, у тебя неправильный код, поэтому и не компилится. (Это, имхо, правильно.) И то, что «в Borland всё нормально», как ты говоришь, — скорее баг этого самого Borland'а, чем Dev-C++. Хотя абсолютно согласен, что Dev — самопальная фигня, состряпанная на коленке.

Но, чтобы заметить твою ашипку, надо быть очень внимательным. И предыдущие ответы это подтверждают. smile 
Параметр "%lf" [f]printf'а соответствует типу double (который, [почти] всегда, — 8 char'ов), а не long double (который, обычно, — 12).

Ну, а дальше, думаю понятно: передача [f]printf'у «плавающего» числа параметров через системный стек. Принтф берёт из стека столько байт, сколько описывает %-вые элементы строки формата.

Автор: HMLd 1.2.2007, 00:33
V.A.KeRneL, 
1) Код у меня компилится. Работатет с ошибками. 
2) Указатели на файлы не в main(), т.к. они - глобальные.
3) Вы правы - надо быть очень внимательным: модификатор в коде не l (прописная), а L (строчная), l - да, соответствует double, но L - соответствует long double. В коде ошибок нет, In My Humble Opinion.  smile 

P.S. Какая у Вас версия Дева?

Добавлено @ 00:35 
Anikmar, неправильно записывается - из кода ведь видно.

Автор: V.A.KeRneL 1.2.2007, 01:21
Цитата(HMLd @  1.2.2007, 00:33 Найти цитируемый пост)

1) Код у меня компилится. Работатет с ошибками.

Да эт я понял. У меня не компилился.

Цитата(HMLd @  1.2.2007, 00:33 Найти цитируемый пост)

2) Указатели на файлы не в main(), т.к. они - глобальные.

Ха, а то я не понял! smile Занёс в мэйн, чтоб компилилось.

Цитата(HMLd @  1.2.2007, 00:33 Найти цитируемый пост)

3) Вы правы - надо быть очень внимательным: модификатор в коде не l (прописная), а L (строчная), l - да, соответствует double, но L - соответствует long double. В коде ошибок нет, In My Humble Opinion.  smile 

Вот это да, по существу. Извиняюсь, что-то я на тебя через-чур резко набросился. (Настроение такое...) Мне почему-то казалось, что "l" и "L" в данном контексте равнозначны. (Заглянул в книжку — оказалось нет. smile) Значит, очевидно, что баг Dev'а, т.е. MinGW, вернее gcc под винду из этой сборки, точнее тамошних библиотек, имо.

Цитата(HMLd @  1.2.2007, 00:33 Найти цитируемый пост)

P.S. Какая у Вас версия Дева?

Цитата(About Dev-C++ ;-))

Version 4. Build on: 21.09.2000 23:22:34
Mingw compiler 2.95.2-1 MSVCRT + updates headers and libraries
Cygnus Insight Debugger

Цитата(gcc -v)

Using builtin specs.
gcc version 2.95.2 19991024 (release)

Как более подробно версию самого Дэва (4.x.y.z) посмотреть, не знаю. smile

==========================================================================================

Но проверить на самом деле на основании моего предыдущего поста оень легко: 
Код

// ...
    printf("%d\n", sizeof(double));
    printf("%d\n", sizeof(long double));
    //printf("%Lf\n", a);
    //printf("%Lf\n", b);
    printf("\n%Lf\n%d\n%Lf\n", a, b);
    printf("\n%lf\n%d\n%lf\n", a, b);
// ...

Выдаёт: 
Код

8
12

5.000001
4194304
1000.000000

5.000001
4194304
1000.000000

Да, действительно, тупой Dev думает также как и я несколько десятков минут назад. smile А именно, что "%Lf" равносильно "%lf".

Автор: HMLd 1.2.2007, 01:25
V.A.KeRneL, да ничего, я не в обиде) Просто самому неприятно, что на таком ***** заставляют писать...  smile 

Автор: V.A.KeRneL 1.2.2007, 01:38
Угу, даже в МГУ! Линух, млин, поставить не могут!.. smile

З.Ы. См. репу! ))

Автор: HMLd 1.2.2007, 02:05
V.A.KeRneL, а нам предлагали под Линукс писать)  smile 

Автор: V.A.KeRneL 1.2.2007, 02:18
Цитата(HMLd @  1.2.2007, 02:05 Найти цитируемый пост)

V.A.KeRneL, а нам предлагали под Линукс писать)  smile

И чё, неужто отказался?!. smile

З.Ы. Пометь тему решённой.

Автор: HMLd 1.2.2007, 02:25
V.A.KeRneL, э... да) А что - не стоило?.. Просто я всю жизнь под окнами кодил, а под линухом нет - просто юзал его...

Автор: V.A.KeRneL 1.2.2007, 02:29
Цитата(HMLd @  1.2.2007, 02:25 Найти цитируемый пост)

э... да) А что - не стоило?.. 

Эээ... Ну, вообще-то, да! smile Сейчас бы не геморроился таГ! smile

Автор: sergejzr 3.2.2007, 12:09
Модератор: Название темы должно отражать ее суть!


 Правила форума: http://forum.vingrad.ruhttp://forum.vingrad.ru/act-SR/f-27.html

Автор: Pete 3.2.2007, 16:41
Цитата(HMLd @  31.1.2007,  22:42 Найти цитируемый пост)
Что это - баг?... Можно ли исправить?... В Borland всё нормально. 


Вообще Dev очень не любит long'и. Попробуй, скажем, прочитать число 2^62 (%lld) и распечатать. Получится фигня)) Надо вставлять какой-то кривой маздайный %I64d...

Цитата(V.A.KeRneL @  1.2.2007,  00:19 Найти цитируемый пост)
Хотя абсолютно согласен, что Dev — самопальная фигня, состряпанная на коленке.

Ага! Только сам не брезгуешь в нем писать!  smile 

Автор: V.A.KeRneL 3.2.2007, 17:35
Цитата(Pete @  3.2.2007, 16:41 Найти цитируемый пост)

Только сам не брезгуешь в нем писать!

Другого на соревнованиях, всё равно, не дают. Нам-то под Линукс писать не предлагали!..

Автор: Pete 4.2.2007, 03:12
Цитата(V.A.KeRneL @  3.2.2007,  18:35 Найти цитируемый пост)
Другого на соревнованиях, всё равно, не дают

Пардон, есть Borland. Так что вперед...
 smile 
Цитата(V.A.KeRneL @  3.2.2007,  18:35 Найти цитируемый пост)
Нам-то под Линукс писать не предлагали!..

Ага, мгушники к маздаю приучают  smile 

Автор: HMLd 5.2.2007, 00:50
2 sergejzr: I'm really sorry. Думал, что достаточно точно: т.е. именно про Дев. Всё же учту. Спасибо.

А вот ещё интереснее((
Код

#include <stdio.h>

FILE* out = fopen("output.txt", "w");

int main()
{
    long double a = 1000;
    for (register int i = 0; i < 10; i++)
        fprintf(out, "%Lf\n", a++);
    _fcloseall();
    return 0;
}



Сложная программма, да?... Однако результат таковой:
Код

/*
-453801546776667190000000000000000000000
-72608247484266751000000
-1161731959748268000
...
*/


Блин... Что делать?... Может я неправильно юзаю fprintf ? сейчас cout попробую (

Автор: archimed7592 5.2.2007, 01:31
HMLd, я не припомню олимпиадной задачи в которой не хватало бы точности double...может не стоит так напрягаться из-за этого? smile
тем более, если учесть, что олимпиады такого уровня достаточно хорошо продумываются и задачи там рассчитаны на то, что они будут решаемы на любом из предлагаемых языков...а в том же васике 10-байтных вещественных отродясь не было...советую сконцентрироваться на других аспектах подготовки к олимпиаде smile
тем более, что если ты докажешь жюри, что по стандарту должно быть "так", а получается "вот так", то сможешь отапеллировать недостающие баллы...

Автор: HMLd 5.2.2007, 01:43
Да, может ты прав. Но приятнее было бы, если бы можно было подольше не обращаться к длинной арифметике. Какой там диапозон у long double? Вот так вот...

Автор: Pete 5.2.2007, 20:28
HMLd, ключевое слово register не играет никакой роли при использовании современных компиляторов.

Добавлено @ 20:31 
Цитата(HMLd @  5.2.2007,  01:50 Найти цитируемый пост)
Может я неправильно юзаю fprintf ?

Все правильно. Читай выше, dev (вернее поставляемый с ним gcc) криво обрабатывает long. И long long. Наши однополчане сами погорели на олимпиаде на такой пакости. Просто long double бывает, действительно, довольно редко необходим, а вот без long long порой не обойтись...
 smile 

Автор: HMLd 6.2.2007, 01:45
2 Pete, про register - правда?  smile 
Кому интересно - кинул вопрос на форум разработчиков Dev'a. Ответили.   smile 
http://sourceforge.net/forum/forum.php?thread_id=1665046&forum_id=48211

Добавлено @ 01:49 
V.A.KeRneL, спасибо за репутацию ))) 

Автор: Pete 12.2.2007, 14:09
Цитата(HMLd @  6.2.2007,  02:45 Найти цитируемый пост)
про register - правда?

К гадалке не ходи... (Ссылаюсь на http://www.okc.ru:8080/okc/publish/imag.nsf/book/5-9579-0059-1?OpenDocument&env=11)

Добавлено @ 14:17 
Цитата
The reasons are many and I've explained them before. You can search for them if you want.

Это весь ответ?  smile 

Автор: HMLd 13.2.2007, 00:57
2 
Pete, ага... Но я там поискал - так они прямо и говорят что мол, не юзайте это с лонгами. 
Ещё нашёл там же что-то типа
Цитата

- Use cin and cout from C++ for input and output. 
- Use %I64d for long long and %l64u for unsigned long long. This is non-standard but supported by MSVCRT. 
- Use another compiler. 

%lli or %lld for long long int 
%llu for unsigned long long int 
%Lf (capital L) for long doubles 

Надо попробовать. И разобраться.  smile 

Автор: V.A.KeRneL 13.2.2007, 07:32
Цитата

Use another compiler.

smile

Автор: HMLd 13.2.2007, 13:10
V.A.KeRneL, Неа, нельзя)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)