|
#1
|
|||
|
|||
Вопрос по TEdit
Почему может вываливаться код Count:= strtoint(edit1.Text);
в edit1.text находится '300'. Проверял через ватчер. |
#2
|
|||
|
|||
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; Const MaxSize=MaxInt; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; Edit1: TEdit; Label3: TLabel; Edit2: TEdit; Label4: TLabel; Edit3: TEdit; Label5: TLabel; Label6: TLabel; Edit4: TEdit; Label7: TLabel; Edit5: TEdit; Label8: TLabel; Label9: TLabel; Edit6: TEdit; Label10: TLabel; Edit7: TEdit; Label11: TLabel; Label12: TLabel; Edit8: TEdit; Label13: TLabel; Edit9: TEdit; Label14: TLabel; Label15: TLabel; Edit10: TEdit; Label17: TLabel; Label16: TLabel; Edit11: TEdit; Label18: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; terminal = record // Тип для терминала time:byte; // время inwork: boolean; // работает ли терминал end; computer = record // Тип для компьютера time:byte; // время inwork: boolean; // работает ли компьютер end; var Form1: TForm1; implementation {$R *.dfm} procedure compare(var t1,t2,t3:terminal); var a:array[1..3]of integer; k:integer; begin a[1]:=t1.time; // запоминаем время работы для 3 терминалов a[2]:=t2.time; a[3]:=t3.time; if a[3] if a[2] case k of // выбираем нужный терминал 1: if not t1.inwork then t1.inwork:=true else // если он не занят то загружаем его if (t3.time begin if not t3.inwork then t3.inwork:=true else t2.inwork:=true; end else begin if not t2.inwork then t2.inwork:=true else t3.inwork:=true; end; 2: if not t2.inwork then t2.inwork:=true else // если он не занят то загружаем его if (t3.time begin if not t3.inwork then t3.inwork:=true else t1.inwork:=true; end else begin if not t1.inwork then t1.inwork:=true else t3.inwork:=true; end; 3: if not t3.inwork then t3.inwork:=true else // если он не занят то загружаем его if (t2.time begin if not t2.inwork then t2.inwork:=true else t1.inwork:=true; end else begin if not t1.inwork then t1.inwork:=true else t2.inwork:=true; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var users:array[1..MaxSize] of byte; // время прихода пользователей terminal1:array[1..MaxSize] of terminal; // время обработки задания на терминале 1 terminal2:array[1..MaxSize] of terminal; // время обработки задания на терминале 2 terminal3:array[1..MaxSize] of terminal; // время обработки задания на терминале 3 computer1, computer2: computer; // время обработки программы на ЭВМ 1 и ЭВМ 2 i,j,k,l,otkaz:integer; Count,TimeOfWorkOfComputer1,TimeOfWorkOfComputer2,TimeUser, DeltaTimeUser,TimeTerminal1,DeltaTimeTerminal1,TimeTerminal2, DeltaTimeTerminal2,TimeTerminal3,DeltaTimeTerminal3: integer; begin Count:= strtoint(edit1.Text); // количество пользователей TimeOfWorkOfComputer1:= strtoint(edit10.Text); // время работы ЭВМ1 TimeOfWorkOfComputer2:= strtoint(edit11.Text); // время работы ЭВМ2 TimeUser:= strtoint(edit8.Text); // среднее время ожидания пользователя DeltaTimeUser:= strtoint(edit9.Text); // разброс времени ожидания пользователя TimeTerminal1:= strtoint(edit2.Text); // среднее время работы терминала 1 DeltaTimeTerminal1:= strtoint(edit3.Text); // разброс времени работы терминала 1 TimeTerminal2:= strtoint(edit4.Text); // среднее время работы терминала 2 DeltaTimeTerminal2:= strtoint(edit5.Text); // разброс времени работы терминала 2 TimeTerminal3:= strtoint(edit6.Text); // среднее время работы терминала 3 DeltaTimeTerminal3:= strtoint(edit7.Text); // разброс времени работы терминала 3 randomize; for i:=1 to Count do begin users[i]:=TimeUser+random(DeltaTimeUser*2)-DeltaTimeUser; // время прихода пользователей: 10+/-2 terminal1[i].time:=TimeTerminal1+random(2*DeltaTimeTerminal1)-DeltaTimeTerminal1; // время обработки задания на терминале 1: 20+/-2 terminal1[i].inwork:=false; // терминал 1 не в работе terminal2[i].time:=TimeTerminal2+random(2*DeltaTimeTerminal2)-DeltaTimeTerminal2; // время обработки задания на терминале 2: 40+/-10 terminal2[i].inwork:=false; // терминал 2 не в работе terminal3[i].time:=TimeTerminal3+random(2*DeltaTimeTerminal3)-DeltaTimeTerminal3; // время обработки задания на терминале 3: 40+/-20 terminal3[i].inwork:=false; // терминал 3 не в работе end; computer1.time:=TimeOfWorkOfComputer1; // время обработки программы на ЭВМ 1: 15 computer1.inwork:=false; // ЭВМ 1 не в работе computer2.time:=TimeOfWorkOfComputer2; // время обработки программы на ЭВМ 2: 30 computer2.inwork:=false; // ЭВМ 2 не в работе i:=1; j:=1; k:=1; l:=1; otkaz:=0; while (i<=Count) do begin dec(users[i]); // уменьшаем время ожидания прихода пользователя if (users[i]=0) then // если пользователь пришел begin if (terminal1[j].inwork and terminal2[k].inwork and terminal3[l].inwork) then inc(otkaz) // если все терминалы заняты то отказ else compare(terminal1[j],terminal2[k],terminal3[l]); // выбираем неработающий терминал с наименьшим временем inc(i); // переходим к следующему пользователю end; if terminal1[j].inwork then dec(terminal1[j].time); // уменьшаем время обработки задания если оно есть if terminal2[k].inwork then dec(terminal2[k].time); // уменьшаем время обработки задания если оно есть if terminal3[l].inwork then dec(terminal3[l].time); // уменьшаем время обработки задания если оно есть if computer1.inwork then dec(computer1.time); // уменьшаем время обработки программы если оно есть if computer2.inwork then dec(computer2.time); // уменьшаем время обработки программы если оно есть if (terminal1[j].time=0) then // если на терминале уже обработано if not computer1.inwork then // если ЭВМ1 не занят begin inc(j); // переходим к следующему времени обработки задания computer1.inwork:=true; // ЭВМ1 занят end else inc(terminal1[j].time); // продлеваем занятость терминала на 1 минуту if (terminal2[k].time=0) then // если на терминале уже обработано if not computer1.inwork then // если ЭВМ1 не занят begin inc(k); // переходим к следующему времени обработки задания computer1.inwork:=true; // ЭВМ1 занят end else inc(terminal2[k].time); // продлеваем занятость терминала на 1 минуту if (terminal3[l].time=0) then // если на терминале уже обработано if not computer2.inwork then // если ЭВМ2 не занят begin inc(l); // переходим к следующему времени обработки задания computer2.inwork:=true; // ЭВМ2 занят end else inc(terminal3[l].time); // продлеваем занятость терминала на 1 минуту if (computer1.time=0) then // если программа обработана на ЭВМ1 переходим к следующему времени обработки программы begin computer1.time:=TimeOfWorkOfComputer1; computer1.inwork:=false; end; if (computer2.time=0) then // если программа обработана на ЭВМ2 переходим к следующему времени обработки программы begin computer2.time:=TimeOfWorkOfComputer2; computer2.inwork:=false; end; end; label1.Caption:='Вероятность отказа = '+inttostr(otkaz)+' из '+inttostr(Count)+' ('+floattostr(round(100*otkaz/count))+'%)'; end; end. |
#3
|
||||
|
||||
Если TEdit пуст или там не число, используй StrToIntDef.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Ivan3635 (22.12.2011)
|
#4
|
|||
|
|||
Цитата:
вываливается даже при s:=edit1.text; s:string; |
#5
|
|||
|
|||
С какой ошибкой вываливается?
|
#6
|
|||
|
|||
Цитата:
|
#7
|
||||
|
||||
Код:
Count:= strtoint(edit1.Text); // количество пользователей Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
|||
|
|||
Цитата:
|
#10
|
||||
|
||||
Чудес ведь не бывает, сейчас гляну исходники.
Как и говорил чудес не бывает, вот твоя ошибка: Код:
Const MaxSize=MaxInt; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 22.12.2011 в 00:55. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Ivan3635 (22.12.2011)
|
#11
|
|||
|
|||
Цитата:
|
#12
|
||||
|
||||
На всякий "дурной" случай, всё же используй StrToIntDef вместо StrToInt.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |