![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк компилятора? [D6, WinXP]
Yuri Btr © (2002-08-20 17:53:00)Что то в конце дня случилось то ли со мной, то ли с Delphi - пишу:
procedure TForm1.Button1Click(Sender: TObject);
var
k:integer;
begin
for k:=1 to 16
do ;
end;
ставлю breakpoint на for k:=1 to 16 и пари первом вхождении получаю k=16 - что за глюк????
У меня из за этого процедура не работает! Помогите!!!
Yuri Btr (2002-08-21 10:57:00) [1]to Digitman, MBo
я тут подумал.... Так помоему изящнее.
procedure Initilize;
var
i, k, t:integer;
captions: Array [1..16] of Integer;
begin
for i:=0 to 15
do
captions[i+1]:=i;
for i:=1 to 16
do
begin
k:=captions[i];
t:=RandomRange(1,16);
captions[i]:=captions[t];
captions[t]:=k;
end;
end;
Digitman (2002-08-21 10:28:00) [2]>MBo
))) ...Как будто с одного букваря "сдули" мы с тобой код)
Digitman (2002-08-21 10:17:00) [3]Зацикливается она у тебя по иной причине - ошибке в алгоритме.
А почему не поступить проще ?
var SrcList,
DstList: TList; // результирующий список
...
SrcList.Clear;
DstList.Clear;
for i:= 0 to 15 do
SrcList.Add(Pointer(i));
while DstList.Count > 0 do
begin
i:= Random(DstList.Count);
DstList.Add(SrcList[i]);
SrcList.Delete(i);
end;
Yuri Btr (2002-08-21 10:08:00) [4]Всем большое спасибо...
Теперь я понял корявость своего кода.
Дело в том, что когда я свои алгоритмы пишу, у меня получается уж очень нестандартный код, т.к. я к сожалению нигде не читал и не видел примеры похожих алгоритмов, вот и приходится изобретать велосипед.. Извините.
Wild Wizard (2002-08-21 10:00:00) [5]а нельзя сначала вставить в массив числа по порядку, а потому случайные ячейки менять местами Н раз? :))
*это к слову о извращениях*
MBo (2002-08-21 09:50:00) [6]procedure TForm1.Button1Click(Sender: TObject);
var i,k:integer;
l:tlist;
a:array[1..16] of integer;
begin
l:=tlist.create;
for i:=0 to 15 do
l.add(pointer(i));
randomize;
for i:=1 to 16 do begin
k:=random(l.count);
a[i]:=integer(l[k]);
l.delete(k);
end;
for i:=1 to 16 do
memo1.lines.add(inttostr(a[i]));
end;
Yuri Btr (2002-08-21 09:41:00) [7]Хорошо, приведу код процедуры полностью. Задача - заполнить массив из 16 Integer случайными неповторяющимися значениями от 1 до 15 (одна ячейка равна 0). При первом вхождении в цикл for k:=1 to 16 - k - становится равной 16 и не уменьшается. Процедура зацикливается...
procedure Initilize;
var
i, k, blank:integer;
is_there:boolean;
captions: Array [1..16] of Integer;
begin
FillChar(captions,SizeOf(captions),0);
blank:=RandomRange(1,16);
for i:=1 to 16
do
if not (blank=i)
then
begin
is_there:=true;
repeat
captions[i]:=RandomRange(1,15);
for k:=1 to 16
do
if captions[i]=captions[k]
then
break
else
is_there:=false;
until is_there=false;
end;
end;
Anatoly Podgoretsky (2002-08-20 18:16:00) [8]Какая разница в каком порядке искать и даже во втором варианте
Ученик (2002-08-20 18:09:00) [9]>Yuri Btr © (20.08.02 18:03)
В первом варианте k не используется, во втором должно быть с 1
Yuri Btr (2002-08-20 18:03:00) [10]Ничего себе оптимизатор - а вот и кусок моего кода
for k:=1 to 16
do
if captions[i]=captions[k]
then
break
else
is_there:=false;
Digitman (2002-08-20 17:58:00) [11]Никакого "глюка".
Результат работы оптимизатора для "бестолковых" for-циклов, ничего полезного не делающих