Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с форматом в CString  (Прочитано 28365 раз)
0 Пользователей и 10 Гостей смотрят эту тему.
Kuzmich
Гость
« : 24-10-2003 05:45 » 

Код:
int n = 1;
double d = 1.11;
CString str;
str.Format)"%.nf", d:;

Падает Жаль
Записан
sh_m
Гость
« Ответ #1 : 24-10-2003 06:00 » 

Цитата: Kuzmich
Код:
int n = 1;
double d = 1.11;
CString str;
str.Format)"%.nf", d:;

Падает Жаль


С CString я никогда не работал, но попробуй в кавычках явно указать 1, а не через переменную n: эта запись у тебя точно очень странная.
Записан
Kuzmich
Гость
« Ответ #2 : 24-10-2003 06:45 » 

Ну я понимаю, что странная, но мне нужна именно переменная n.
А если поставить 1, то все работает.
Пока отвечаете, пишу свою функцию для отображения точности Я шокирован!
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 24-10-2003 07:17 » 

Напиши в каком виде хочешь ответ получить?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 24-10-2003 07:24 » 

А понял ты хочешь double с точностью n вывести? Долблюсь с утра, с мороза.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 24-10-2003 07:48 » 

Код:
int n = 1;
double d = 1.11;
CString str,tmp;
tmp.Format)"%%.%df",n:;
str.Format)tmp, d:;

Вот так нужно.
Только в последней строчке может быть ошибка: "как из объекта CString tmp получить указатель на строку".
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 24-10-2003 08:15 » 

Да я то же бы так сделал, с временной форматной строкой.

Цитата: RXL
Только в последней строчке может быть ошибка: "как из объекта CString tmp получить указатель на строку".

Не понял. Кастинг происходит автоматически. Ну или tmp.GetBuffer()
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 24-10-2003 08:28 » 

Джон, Это хорошо
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kuzmich
Гость
« Ответ #8 : 24-10-2003 09:28 » 

RXL, все работает.
Всем спасибо.
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #9 : 24-10-2003 09:37 » 

Вообще то, это можно сделать проще:
int n = 1;
double d = 1.11;
CString str;
str.Format("%.*lf", n, d);
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 24-10-2003 10:24 » 

ysv_, оно и верно - все умное давно до нас придумали...

You can also specify a precision of '*'. This means that the next argument in the argument list (befor the actual value to be printed) is used as the precision. The value must be an 'int', and is ignored if it is negative. If you specify '*' for both the width and precision, the field width argument precedes the precision argument.

Только я не понял зачем 'l' в "%.*lf"? У CString::Format() иной синтаксис чем у sprintf()?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 24-10-2003 10:26 » 

Век живи - век учись, дураком помрёшь. Это я про себя.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ysv_
Помогающий

ua
Offline Offline

« Ответ #12 : 24-10-2003 10:34 » 

Цитата

Только я не понял зачем 'l' в "%.*lf"? У CString::Format() иной синтаксис чем у sprintf()?

Вообще-то я по памяти писал. Насколько помню f - float, lf - double. Или это уже устарело?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 24-10-2003 10:56 » 

Не знаю устарело или как, но у нас, в gnu libc, f - это double, а float преобразовывается в double автоматически. Есль еще long double Lf (80бит).
Я подозреваю, что в продуктах MS может быть все иначе.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Migmile
Помогающий

ru
Offline Offline

« Ответ #14 : 24-10-2003 11:17 » 

RXL, Sorry, не понял, в функцию с variable length argument list like Format дляна аргументов определяется по типу. Соответственно в format - по списку формата. Отсюда вопрос - как функция во время выполнения определяет  что у нее на входе - float or double. Единственный вариант - компилятор на  ее вход всегда подает double - но это вряд-ли!
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #15 : 24-10-2003 11:42 » new

Вообщето CStrinf.Format работает 100% как printf стандарт Улыбаюсь Улыбаюсь
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 24-10-2003 11:44 » 

Migmile, я сам был удивлен, но в доках написано так. Кстати, gcc проверяет строку формата и список параметров для printf-подобных ф-ий - видимо он и конвертит.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Migmile
Помогающий

ru
Offline Offline

« Ответ #17 : 24-10-2003 11:56 » 

RXL, на самом деле не сложно проверить, посмотрев сколько байт кладется в стек. У меня под руками нет *Nix, да и не знаю как там смотреть - наверное есть опция в компиляторе...
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #18 : 24-10-2003 11:58 » 

Небольшое исследование в MinGW (использует MSCRT.DLL) показало, что:
1. sizeof(float)=4, sizeof(double)=8, sizeof(long double)=12  Быть такого не может  (ожидал 10).
2. В printf Независимо от модификатора для f (l, L, h) - double обрабатывается корректно. Аналогично для float.
3. long double обрабывался во всех случаях некорректно Жаль.
Я шокирован!.

Впечатление - при вызове функций, которые получают float, аргумент помещается в стек как double.
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #19 : 24-10-2003 12:39 » 

Вирізка з доки по GCC:
Цитата

Traditional K&R C promotes all floating point operations to double precision, regardless of the sizes of the operands.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 24-10-2003 13:39 » 

Цитата: ysv_
Небольшое исследование в MinGW (использует MSCRT.DLL) показало, что:
1. sizeof(float)=4, sizeof(double)=8, sizeof(long double)=12  Быть такого не может  (ожидал 10).
Выравнивание на 4 байта - такие требования оптимизации для Pentium 1..4. Хотя для long double для x86 выравнивание 8 байт
Цитата
2. В printf Независимо от модификатора для f (l, L, h) - double обрабатывается корректно. Аналогично для float.
3. long double обрабывался во всех случаях некорректно Жаль.
Я шокирован!.

Впечатление - при вызове функций, которые получают float, аргумент помещается в стек как double.
MinGW - это все же не glibc
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
ysv_
Помогающий

ua
Offline Offline

« Ответ #21 : 24-10-2003 20:34 » 

Цитата

Выравнивание на 4 байта - такие требования оптимизации для Pentium 1..4.

Давайте не смешивать выравнивание и размер объектов. Для i387 длина long double - 10 соответсвовала размерам регистров. А вот откуда взялось 12? Неужели в новых процессорах размер регистров FPU - 12?
Кстати в bcc32 5.5 - размер long double - 10.
А в gcc есть опция -m96bit-long-double
Цитата

Set the size of long double to 96 bits as required by the i386 application binary interface. This is the default.

А вот опции для 80 битового длинного double - нет Жаль
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 24-10-2003 21:07 » 

Цитата: ysv_
Давайте не смешивать выравнивание и размер объектов. Для i387 длина long double - 10 соответсвовала размерам регистров. А вот откуда взялось 12? Неужели в новых процессорах размер регистров FPU - 12?

Код:

long double a[10(;

Назави размер "a". По твоему sizeof() должен быть 120.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kuzmich
Гость
« Ответ #23 : 27-10-2003 06:32 » 

Цитата: ysv_
Вообще то, это можно сделать проще:
int n = 1;
double d = 1.11;
CString str;
str.Format("%.*lf", n, d);
Прекрасно работает, спасибо.
Цитата: Джон
Век живи - век учись, дураком помрёшь.
Чем больше я знаю, тем больше я незнаю Улыбаюсь
Записан
NetRaider
Гость
« Ответ #24 : 27-10-2003 06:44 » 

Цитата

Отсюда вопрос - как функция во время выполнения определяет что у нее на входе - float or double. Единственный вариант - компилятор на ее вход всегда подает double - но это вряд-ли!


Цитата

Впечатление - при вызове функций, которые получают float, аргумент помещается в стек как double.


При вызове функции с переменным чилом параметров, аргумент типа float всегда преобразуется к double (5.2.2/7)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines