Форум: "Потрепаться";
Текущий архив: 2003.02.13;
Скачать: [xml.tar.bz2];
ВнизИнициализация полей формы (D4, Win9x) Найти похожие ветки
← →
Паша (2003-01-28 16:01) [0]Есть форма с полем ddd: double. При создании формы, по идее, ddd=0. Под отладчиком это прекрасно работает, впрочем, без отладчика тоже. Запускаю на другой машине и при попытке ddd:= ddd+ 1 имею "Invalid floating point" (правда не всегда и не на всех машинах)! Что происходит?
P.S. Конечно, переменные надо инициализировать, так что эту тему можно не поднимать...
← →
Паша (2003-01-28 18:02) [1]> http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1043750317&n=3
>- Исправляет программу путем правки исполнимых файлов
>- Знает, какой вопрос вы хотите задать, и сразу отвечает на него
Что, все Гуру пошли на пенсию? Или спят уже... :)
← →
Pat (2003-01-28 19:24) [2]>При создании формы, по идее, ddd=0
СТранные идеи у вас...мусор там пока валяется. И, наверняка, компилятор хинт выдал, что переменная might not have been initialized
← →
Oleg_Gashev (2003-01-28 19:33) [3]При создании формы, по идее, ddd=0
Только static. Иначе мусор.
← →
Ketmar (2003-01-28 20:16) [4]>Oleg_Gashev © (28.01.03 19:33)
разве? как мне помнится, все инитится в нули. о чем, кажись, и в справке написано...
упс. кажется, мусор...
Satanas Nobiscum! 28-Jan-XXXVIII A.S.
← →
Oleg_Gashev (2003-01-28 21:28) [5]> как мне помнится, все инитится в нули
Даже если это так в этой версии. Не уверен, что будет также в следующей. Проще предупредить, чем лечить.
← →
Anatoly Podgoretsky (2003-01-28 21:29) [6]А чего тебе отвечать, если ты даже обхявление не привел, не мы подождем.
← →
wicked (2003-01-28 21:56) [7]
> Есть форма с полем ddd: double. При создании формы, по идее,
> ddd=0. Под отладчиком это прекрасно работает, впрочем, без
> отладчика тоже. Запускаю на другой машине и при попытке
> ddd:= ddd+ 1 имею "Invalid floating point" (правда не всегда
> и не на всех машинах)! Что происходит?
все что я скажу - имхо....
под отладчиком или когда ты запускаешь программу из под delphi ide, она автоматически для тебя обнуляет область памяти (включая heap), куда будет записан image программы... потом, когда обьект формы создается и под него выделяется память в куче, с ней ничего не происходит, она уже забита нулями... отсюда и значение переменной...
а если запустить программу НЕ из-под отладчика, этого для неё никто и не сделает и там будет мусор....
кстати, неплохая идея для random seed... ;)
← →
Паша (2003-01-29 11:31) [8]Доброе утро!
>Anatoly Podgoretsky © (28.01.03 21:29)
Я же сказал, что облажался, чего же ждать-то? Мне непонятны причины сего явления. Пусть бы там мусор был все время, так нет же, на одной тачке мусор (причем только при первом вызове, дальше работает), на другой - все в порядке. Хочется понять, из-за чего.
>wicked © (28.01.03 21:56)
Мусор там, конечно. Пробуйте:
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
ddd: double;
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
ddd:= ddd+1;
Button1.Caption:= FloatToStr(ddd);
end;
procedure TForm1.Button2Click(Sender: TObject);
type
bb = record
a, b: double
end;
var
rr: bb;
begin
rr.a:= rr.a+ 0.01;
Button2.Caption:= FloatToStr(rr.a);
end;
rr.a тоже инициализируется 0, только вся эта бяка годика с два поработала, и начала гнать пургу, пришлось инициализировать. Может, размеры программы влияют?
← →
Anatoly Podgoretsky (2003-01-29 11:47) [9]rr.a не инициализируется, в нем случайная величина
← →
DiamondShark (2003-01-29 12:00) [10]
> Паша © (29.01.03 11:31)
Ну, блин, ты дал!
Одно дело объект, а другое -- запись.
У объекта есть метод такой, InitInstance, из конструктора вызывается. Метод этод весь объект нулями заполняет, вот так примерно:
class function TObject.InitInstance(Instance: Pointer): TObject;
// EAX -- адрес VMT
// EDX -- Instance
asm
PUSH EBX
PUSH ESI
PUSH EDI
MOV EBX,EAX
MOV EDI,EDX
STOSD
MOV ECX,[EBX].vmtInstanceSize
XOR EAX,EAX
PUSH ECX
SHR ECX,2
DEC ECX
REP STOSD
POP ECX
...
Такое поведение объектов от версии к версии не изменится (подумайте сами почему).
Записи, если они содержат только скалярные типы, ничем не инициализируются. Если же запись содержит поля string, widestring, variant, interface, dynamic array то такие записи (точнее, эти поля) инициализируются (подумайте сами почему). Поля скалярных типов не инициализируются в любом случае.
← →
Ketmar (2003-01-29 12:38) [11]>DiamondShark © (29.01.03 12:00)
тю. я тоже хотел этот код намедни привести, но не нашел. наверное, самогон помешал %-)
Satanas Nobiscum! 29-Jan-XXXVIII A.S.
← →
Паша (2003-01-29 12:54) [12]Anatoly Podgoretsky © (29.01.03 11:47)
DiamondShark © (29.01.03 12:00)
Все понял.
Хинты включил, и они радуют глаз своим изобилием. Мнээ...
Спасибо!
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.02.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c