Глюк альтернативных модулей для Delphi

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by slesh, 21 Apr 2009.

  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    некоторым из нас инода приходилось использовать альтернативные системные модули для Delphi (sysinit и system).
    Кто незнает для чего они, то отвечаю - с помощью их можно очень сильно уменьшить размер программы написанных без VCL. Порядком в 2 раза уменьшается минимальное приложение.
    Code:
    program test;
    {$APPTYPE CONSOLE}
    begin
     writeln('hello');
    end.
    
    Весит 7 кил. Со стандартными модулями - 15 кил.
    Так что использовать их выгодно.
    В инете очень часто встречаются эти модули.
    Но случайно был замечен в них один глюк.

    Глюк связан с генератором случайных чисел.
    к функции random притензий нет. А вот randomize была жестоко убита.
    Т.е. randomize задает начальное состояние ГСЧ.
    Фактически эта функция заносит значение системного времяни в переменную RandSeed
    Но в альтернативных модулях походу дела это значение статическое.
    т.е.
    Code:
    for y:=1 to 10 do
     begin
       randomize;
       for x:=1 to 10 do write(random(10));
       writeln;
     end;
    
    Даст 10 одинаковых строк.
    Чтобы избавиться от этого глюка достаточно самому задать значение RandSeed.
    Чтобы сильно не увеличивать размер функцией получения времяни, для инициализации будим использовать количество тактов сделаннх процессором после ребута/включения.

    Сделать это можно просто:
    Code:
    procedure myrandomize;assembler;
    asm
     rdtsc 
     add eax,edx
     mov RandSeed,eax
    end;
    
    P.S. Из-за этого гюкнутового randomize стока хрени херовой было.
     
  2. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    +1, не раз замечал, но причину выяснять даже не задумывался), вообщем гуд +5