Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Глюк компилятора? [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-циклов, ничего полезного не делающих


Наверх

Титульная страница Поиск, карта сайта Написать письмо