Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Глюк альтернативных модулей для Delphi (https://forum.antichat.xyz/showthread.php?t=117053)

slesh 21.04.2009 19:50

Глюк альтернативных модулей для Delphi
 
некоторым из нас инода приходилось использовать альтернативные системные модули для Delphi (sysinit и system).
Кто незнает для чего они, то отвечаю - с помощью их можно очень сильно уменьшить размер программы написанных без VCL. Порядком в 2 раза уменьшается минимальное приложение.
Код:

program test;
{$APPTYPE CONSOLE}
begin
 writeln('hello');
end.

Весит 7 кил. Со стандартными модулями - 15 кил.
Так что использовать их выгодно.
В инете очень часто встречаются эти модули.
Но случайно был замечен в них один глюк.

Глюк связан с генератором случайных чисел.
к функции random притензий нет. А вот randomize была жестоко убита.
Т.е. randomize задает начальное состояние ГСЧ.
Фактически эта функция заносит значение системного времяни в переменную RandSeed
Но в альтернативных модулях походу дела это значение статическое.
т.е.
Код:

for y:=1 to 10 do
 begin
  randomize;
  for x:=1 to 10 do write(random(10));
  writeln;
 end;

Даст 10 одинаковых строк.
Чтобы избавиться от этого глюка достаточно самому задать значение RandSeed.
Чтобы сильно не увеличивать размер функцией получения времяни, для инициализации будим использовать количество тактов сделаннх процессором после ребута/включения.

Сделать это можно просто:
Код:

procedure myrandomize;assembler;
asm
 rdtsc
 add eax,edx
 mov RandSeed,eax
end;

P.S. Из-за этого гюкнутового randomize стока хрени херовой было.

De-visible 21.04.2009 20:35

+1, не раз замечал, но причину выяснять даже не задумывался), вообщем гуд +5


Время: 03:34