Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странное поведение переменной вариантного типа 
:(
    Опции темы
Delphist
  Дата 17.4.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Есть такая ф-ция:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  v: variant;
begin
  v := 2;
  ShowMessage(Format(' %10.*f', [v, 3.14]));
end;

По идеи ShowMessage должен был бы вернуть, 3.14 но возвращает 3, начал отлаживать, смотрим Format:
Код

function Format(const Format: string; const Args: array of const): string;
begin

  FmtStr(Result, Format, Args);
end;


В отладчике видно, что Args[0] хранит не 2, а левые данные. С чем это связано???
Все ОК, если деалать так:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  v: variant;
begin
  v := 2;
  ShowMessage(Format(' %10.*f', [integer(v), 3.14]));
end;



--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Staruha
Дата 19.4.2009, 13:48 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 1
Всего: 27



Наверно это потому ,что массив integer smile 


--------------------
Возмездие настигнет
PM MAIL   Вверх
Rrader
  Дата 19.4.2009, 17:30 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Цитата(Delphist @  17.4.2009,  22:32 Найти цитируемый пост)
а левые данные

Там лежит адрес переменной V. Когда ты пишешь
Код

Integer(V)

то вызывается внутренняя функция _VarToInteger

Это сообщение отредактировал(а) Rrader - 19.4.2009, 17:32


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Delphist
Дата 20.4.2009, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(Rrader @  19.4.2009,  18:30 Найти цитируемый пост)
Там лежит адрес переменной V. Когда ты пишешь

Так почему же она не работает? Баг Format'a или что?



--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Staruha
Дата 21.4.2009, 09:19 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 1
Всего: 27



Variant все таки еще может оказаться String.А в данном случае может быть только число. Поставь Real и нет проблем.


--------------------
Возмездие настигнет
PM MAIL   Вверх
Delphist
  Дата 21.4.2009, 10:03 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(Staruha @  21.4.2009,  10:19 Найти цитируемый пост)
Variant все таки еще может оказаться String.А в данном случае может быть только число. Поставь Real и нет проблем. 

Мне не понятно, почему компилятор ведет себя как пофигист. Выдавал бы какое-нить предупреждение это же ведь неявная ошибка. Да и в Help'e ничего не написано про том, что в Format'e запрещено использовать вариантный тип smile 


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Akella
Дата 21.4.2009, 10:53 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Delphist, читай книжек побольше. Например купи и прочти "О чём не пишут в книгах по Delphi". Там есть неплохое описание твоей проблемы, как мне  кажется.

Цитата

integer(v), 3.14

ты сам что, не видишь, что 3,14 это не целочисленный тип???
PM MAIL   Вверх
Staruha
Дата 21.4.2009, 13:16 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 1
Всего: 27



Цитата

почему компилятор ведет себя как пофигист

Авторам просто в голову не пришло, что сюда могут засунуть что нить кроме числа. А как насчет RoundTo((A*1.32),-2)


--------------------
Возмездие настигнет
PM MAIL   Вверх
Delphist
  Дата 21.4.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(Akella @  21.4.2009,  11:53 Найти цитируемый пост)
ты сам что, не видишь, что 3,14 это не целочисленный тип??? 

Это ты, помоему, не понимаешь как работает Format. Так вот 3.14 и не обязан быть целочисленным smile . В качестве параметров передается следующее - 1-ый параметр собственно маска, 2-ой это последовательность параметров: 1-ый указывает сколько знаков должно быть после запятой, 2-ой собственно число над которым выполняются действия. 
Теперь, если мы откроем официальную документацию по Format'y, то мы не встретим там, информации о том, что запрещено использовать вариантный тир.
Так что, Akella, эт те надо по больше читать букварей smile 

Это сообщение отредактировал(а) Delphist - 21.4.2009, 16:01


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Akella
Дата 21.4.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



smile да, согласен

Добавлено через 54 секунды
получается, что Rrader прав smile ?
PM MAIL   Вверх
mes
Дата 21.4.2009, 18:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(Delphist @  21.4.2009,  09:03 Найти цитируемый пост)
Мне не понятно, почему компилятор ведет себя как пофигист. Выдавал бы какое-нить предупреждение это же ведь неявная ошибка. Да и в Help'e ничего не написано про том, что в Format'e запрещено использовать вариантный тип smile  

зато написано, что спецификатор должен соответствовать типу соответствующего передаваемого аргумента..
в списке спецификаторов нет предназначеного для varianta.
variant не приводится по умолчанию к integer.

Добавлено через 5 минут и 51 секунду
Цитата(Delphist @  21.4.2009,  09:03 Найти цитируемый пост)
Мне не понятно, почему компилятор ведет себя как пофигист

строка формата - отн. к динамическим данным, и фактически известна только в рантайме, так что обвинять компилятор не в чем.
хотя в таких случаях как Ваша запись компилятор мог бы сдеалть предположение, но не обязан smile
(некоторые компиляторы  Cpp делают, про паскалевские не знаю)


--------------------
PM MAIL WWW   Вверх
Delphist
Дата 21.4.2009, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



вообщем, ребята, считаю это небольшим багом.

Это сообщение отредактировал(а) Delphist - 20.1.2012, 09:17


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
mes
Дата 21.4.2009, 23:15 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(Delphist @  21.4.2009,  21:59 Найти цитируемый пост)
вообщем, ребята, считаю это не большим багом. 

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

так что, имхо, это не баг, а отсутствие фичи smile


Это сообщение отредактировал(а) mes - 21.4.2009, 23:19


--------------------
PM MAIL WWW   Вверх
Delphist
Дата 16.2.2010, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(mes @  22.4.2009,  00:15 Найти цитируемый пост)
так что, имхо, это не баг, а отсутствие фичи

баг, баг. вот увидешь современем разработчики delphi внесут поправки


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Delphist
  Дата 19.1.2012, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Ну вот и свершилось. Как я и говорил это был баг, в DelphiXE поправили.
mes, не забудь Delphist'y плюсик поставить

Это сообщение отредактировал(а) Delphist - 19.1.2012, 16:17


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.