Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2010, 10:47   #11
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Все равно не работает код:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

const random_seed	= 12345678;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  procedure WRandom; stdcall;
  procedure WIRandom(rmin:dword; rmax:dword); stdcall;
  procedure WRandomInit; stdcall;

implementation

{$R *.dfm}

{ ;---------------------------------------------
  ; Park Miller random number algorithm
  ; Получить случайное число 0 ... 99999
  ; stdcall WRandom
  ; на выходе EAX - случайное число
  ;--------------------------------------------- }
procedure WRandom; stdcall;
asm
        push edx 
        push ecx
        mov eax,[random_seed]
        xor edx,edx
        mov ecx,127773
        div ecx
        mov ecx,eax
        mov eax,16807
        mul edx
        mov edx,ecx
        mov ecx,eax
        mov eax,2836
        mul edx
        sub ecx,eax
        xor edx,edx
        mov eax,ecx
        mov [random_seed],ecx
        mov ecx,100000
        div ecx
        mov eax,edx
        pop ecx
        pop edx
        ret
end;
 
{ ;---------------------------------------------
  ; Получить случайное число в нужном интервале
  ; Требуется процедура WRandom
  ; stdcall WIRandom,min,max
  ; на выходе EAX - случайное число
  ;--------------------------------------------- }
procedure WIRandom(rmin:dword; rmax:dword); stdcall;
asm
        push edx
        push ecx
        mov ecx,[rmax]
        sub ecx,[rmin]
        inc ecx
        stdcall WRandom // [Pascal Error] Unit1.pas(76): E2003 Undeclared identifier: 'stdcall'
        xor edx,edx
        div ecx
        mov eax,edx
        add eax,[rmin]
        pop ecx
        pop edx
        ret
end;

{ ;---------------------------------------------
  ; Инициализация генератора случайных чисел
  ; stdcall WRandomInit
  ;--------------------------------------------- }
procedure WRandomInit; stdcall;
asm
        push edx
        push ecx
        rdtsc
        xor eax,edx
        mov [random_seed],eax
        pop ecx
        pop edx
        ret
end;

end.
Где еще могут быть ошибки? Спасибо
SkAndrew вне форума Ответить с цитированием
Старый 19.04.2010, 11:26   #12
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Исправил код вот так:

Код:
function WIRandom(rmin:dword; rmax:dword): Integer; stdcall;
asm
  push edx
  push ecx
  mov ecx,[rmax]
  sub ecx,[rmin]
  inc ecx
  call WRandom // исправил здесь stdcall на call
..........................
но сейчас проект не компилируется, компилятор выдает листинг следующих ошибок:

[7636FBAE]{kernel32.dll} RaiseException + $58
[20006D23]{rtl100.bpl } System.@HandleAnyException (Line 9963, "sys\system.pas" + 13) + $0
[0C8574ED]{IndySystem100.bpl} IdGlobal.SetThreadName (Line 2433, "IdGlobal.pas" + 17) + $D
(0002B141){IndyCore100.bpl} [0C98C141]
[20007435]{rtl100.bpl } System.InitUnits (Line 11397, "sys\system.pas" + 21) + $0
[200074A6]{rtl100.bpl } System.@PackageLoad (Line 11418, "sys\system.pas" + 8) + $0
[0C6612E1]{dclIndyCore100.bpl} SysInit.@PackageLoad (Line 535, "SysInit.pas" + 0) + $5
[0C665EE5]{dclIndyCore100.bpl} .dclIndyCore.@PackageLoad + $5
[02172E57]{DelphiSpeedUp105.dll} PackageLoadingOptimize.HookedInitia lizePackageEx (Line 403, "PackageLoadingOptimize.pas" + 4) + $0
[2001A34F]{rtl100.bpl } SysUtils.LoadPackage (Line 16207, "sys\sysutils.pas" + 18) + $5
[20D243EC]{designide100.bpl} ToolUtils.ForEach (Line 93, "ToolUtils.pas" + 8) + $10
[02172C8E]{DelphiSpeedUp105.dll} PackageLoadingOptimize.HookedLoadPa ckageEx (Line 324, "PackageLoadingOptimize.pas" + 18) + $4
[2000A264]{rtl100.bpl } System.@IntfClear (Line 17824, "sys\system.pas" + 7) + $0
[2165CD37]{delphicoreide100.bpl} PasCppPakMgr.TIDEDesignPackage.Clea rModules (Line 714, "PasCppPakMgr.pas" + 14) + $10
[2093A148]{coreide100.bpl} PakLoad.TPackage.DoLoadPackage (Line 143, "PakLoad.pas" + 0) + $8
[2093A2BD]{coreide100.bpl} PakLoad.TPackage.Load (Line 217, "PakLoad.pas" + 7) + $7
[20A090DD]{coreide100.bpl} PakMgr.TDesignPackage.Load (Line 575, "PakMgr.pas" + 2) + $2
[2165D0F4]{delphicoreide100.bpl} PasCppPakMgr.TIDEDesignPackage.Load (Line 829, "PasCppPakMgr.pas" + 4) + $3
[201431C9]{vcl100.bpl } Controls.TWinControl.Update (Line 8834, "Controls.pas" + 1) + $12
[2013B354]{vcl100.bpl } Controls.TControl.Update (Line 4525, "Controls.pas" + 1) + $B
[20003DC4]{rtl100.bpl } System.@FreeMem (Line 2699, "sys\system.pas" + 2) + $0
[20007A19]{rtl100.bpl } System.@LStrArrayClr (Line 12266, "sys\system.pas" + 16) + $0
[20006BA9]{rtl100.bpl } System.@AfterConstruction (Line 9520, "sys\system.pas" + 2) + $5
[2165CED9]{delphicoreide100.bpl} PasCppPakMgr.TIDEDesignPackage.Dela yLoad (Line 749, "PasCppPakMgr.pas" + 11) + $4
[2165BFE2]{delphicoreide100.bpl} PasCppPakMgr.LoadDesignPackage (Line 373, "PasCppPakMgr.pas" + 10) + $5
[2165C2BD]{delphicoreide100.bpl} PasCppPakMgr.LoadProjectPackages (Line 444, "PasCppPakMgr.pas" + 52) + $11
[2165C3CF]{delphicoreide100.bpl} PasCppPakMgr.LoadProjectPackages (Line 478, "PasCppPakMgr.pas" + 86) + $5
[21679BD4]{delphicoreide100.bpl} BasePasProjOpts.TProjOptsManager.Do LoadPackages (Line 2032, "BasePasProjOpts.pas" + 22) + $6
[02172ECA]{DelphiSpeedUp105.dll} PackageLoadingOptimize.LoadPackages (Line 424, "PackageLoadingOptimize.pas" + 10) + $2
[2167E76D]{delphicoreide100.bpl} BasePasProjOpts.TProjectOptions.Loa dPackages (Line 3282, "BasePasProjOpts.pas" + 0) + $5
[21D04545]{delphide100.bpl} DelphiProject.TDelphiProjectCreatio nTrait.LoadDefaultLibraries (Line 263, "DelphiProject.pas" + 0) + $5
[209D5771]{coreide100.bpl} ProjectGroup.TDefaultProjectWrapper .LoadDefaultLibraries (Line 3140, "ProjectGroup.pas" + 5) + $31
[209DDE66]{coreide100.bpl} Desktop.LoadDefaultDesktopState (Line 947, "Desktop.pas" + 3) + $9
[209DE687]{coreide100.bpl} Desktop.LoadDesktop (Line 1082, "Desktop.pas" + 75) + $0
[0041399C]{bds.exe } AppMain.TAppBuilder.CMPostCreateIni t (Line 1885, "ui\AppMain.pas" + 51) + $0
[00413A9E]{bds.exe } AppMain.TAppBuilder.CMPostCreateIni t (Line 1917, "ui\AppMain.pas" + 83) + $9
[2013C527]{vcl100.bpl } Controls.TControl.WndProc (Line 5146, "Controls.pas" + 83) + $6
[201406A7]{vcl100.bpl } Controls.TWinControl.WndProc (Line 7304, "Controls.pas" + 111) + $6
[20159E7F]{vcl100.bpl } Forms.TCustomForm.WndProc (Line 3512, "Forms.pas" + 136) + $5
[2013FDD0]{vcl100.bpl } Controls.TWinControl.MainWndProc (Line 7073, "Controls.pas" + 3) + $6
[20040E4C]{rtl100.bpl } Classes.StdWndProc (Line 11583, "common\Classes.pas" + 8) + $0
[0216515D]{DelphiSpeedUp105.dll} SystemOptimize.DMTSearch (Line 198, "SystemOptimize.pas" + 4) + $7
[201625F0]{vcl100.bpl } Forms.TApplication.ProcessMessage (Line 8105, "Forms.pas" + 23) + $1
[2016262A]{vcl100.bpl } Forms.TApplication.HandleMessage (Line 8124, "Forms.pas" + 1) + $4
[2016291F]{vcl100.bpl } Forms.TApplication.Run (Line 8223, "Forms.pas" + 20) + $3
[0042297A]{bds.exe } bds.bds (Line 195, "" + 7) + $7

Спасибо за помощь
SkAndrew вне форума Ответить с цитированием
Старый 19.04.2010, 11:45   #13
Crusher
Пользователь
 
Регистрация: 13.12.2008
Сообщений: 27
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  random_seed : dword = 12345678;

  procedure WRandom; stdcall;
  procedure WIRandom(rmin:dword; rmax:dword); stdcall;
  procedure WRandomInit; stdcall;

implementation

{$R *.dfm}

{ ;---------------------------------------------
  ; Park Miller random number algorithm
  ; Получить случайное число 0 ... 99999
  ; stdcall WRandom
  ; на выходе EAX - случайное число
  ;--------------------------------------------- }
function WRandom: integer; stdcall;
asm
        push edx 
        push ecx
        mov eax,random_seed
        xor edx,edx
        mov ecx,127773
        div ecx
        mov ecx,eax
        mov eax,16807
        mul edx
        mov edx,ecx
        mov ecx,eax
        mov eax,2836
        mul edx
        sub ecx,eax
        xor edx,edx
        mov eax,ecx
        mov random_seed,ecx
        mov ecx,100000
        div ecx
        mov eax,edx
        pop ecx
        pop edx
end;
 
{ ;---------------------------------------------
  ; Получить случайное число в нужном интервале
  ; Требуется процедура WRandom
  ; stdcall WIRandom,min,max
  ; на выходе EAX - случайное число
  ;--------------------------------------------- }
function WIRandom(rmin,rmax:dword): integer; stdcall;
asm
        push edx
        push ecx
        mov ecx,rmax
        sub ecx,rmin
        inc ecx
        call WRandom
        xor edx,edx
        div ecx
        mov eax,edx
        add eax,rmin
        pop ecx
        pop edx
end;

{ ;---------------------------------------------
  ; Инициализация генератора случайных чисел
  ; stdcall WRandomInit
  ;--------------------------------------------- }
procedure WRandomInit; stdcall;
asm
        push edx
        push ecx
        rdtsc
        xor eax,edx
        mov random_seed,eax
        pop ecx
        pop edx
end;

end.

Последний раз редактировалось Crusher; 19.04.2010 в 16:41.
Crusher вне форума Ответить с цитированием
Старый 19.04.2010, 15:15   #14
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо за ответ, но так тоже не работает. Может все эти процедуры и функцию надо в dll оформить и оттуда вызывать? как правильно? компилятор пишет что не находит exe файла и не запускается проект. Что посоветуете? Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 19.04.2010, 16:43   #15
Crusher
Пользователь
 
Регистрация: 13.12.2008
Сообщений: 27
По умолчанию

Все теперь код рабочий, исправил процедуры на функции
Crusher вне форума Ответить с цитированием
Старый 21.04.2010, 16:28   #16
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо за помощь.
SkAndrew вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
random в С++ Swool Общие вопросы C/C++ 21 18.02.2012 21:55
Random Febreze Общие вопросы Delphi 2 28.04.2008 14:17
Random Constellation БД в Delphi 2 10.01.2008 21:37