|
#1
|
|||
|
|||
перемешать массив
Доброго времени суток уважаемые форумчане !
Я хочу перемешать числа в массиве (для того, чтоб получился неупорядоченный массив неповторяющихся чисел) делаю так : Создаю упорядоченный массив Код:
procedure TForm1.FormCreate(Sender: TObject); var i,a:integer; begin a:=1; for I := 0 to n-1 do begin osn_mass[i]:=a; a:=a+1; end; end; затем при показе формы перемешиваю его и вывожу в label : Код:
procedure TForm1.FormShow(Sender: TObject); var i,tmp,j,z:integer; s:string; begin for I := 0 to n-1 do begin Randomize; j:=Random(n); z:=Random(n); tmp:=osn_mass[z]; osn_mass[z]:=osn_mass[j]; osn_mass[j]:=tmp; end; s:=''; for I := 0 to n-1 do begin s:=s+ Inttostr( osn_mass[i])+' '; end; form1.Label1.Caption:= s; end; First chance exception at $7C81EB33. Exception class EAccessViolation with message 'Access violation at address 00465B9D in module '....exe'. Read of address 0000037C'. Process .....exe (15052) и указывает на строку form1.Label1.Caption:= s; Насколько я понимаю проблемы с памятью, при прогоне програппы по строкам (F7) обратил внимание что последний элемент массива всегда принимает значение 0 , и при обращении к нему возможно возникает ошибка . Подскажите в чём может быть проблема ? PS: Изменение условия цикла на for I := 1 to n do и от for I := 1 to n-1 do не помогло |
#2
|
||||
|
||||
1
При динамическом массиве for i:=0 to n-1, при статическом for i:=1 to n. random(x) = 0..x-1.
|
#3
|
|||
|
|||
первое понятно , а random(x) = 0..x-1, что за запись ,
если делаю так :random(n-1) то возникает таже ошибка но вместо 0 элементу массива назначается значение = 10627456 |
#4
|
||||
|
||||
2
z:= random(n)+1; для статического массива.
z:= random(n); для динамического. |
#5
|
|||
|
|||
О, большое спасибо,всё работает
интересно, а почему всё заработало с z:= random(n)+1 ведь по-сути в значение переменной z может попасть элемент за границей массива. Или я ошибаюсь ? |
#6
|
||||
|
||||
3
Вы ошибаетесь, неможет. Пример random(10); выдаёт значения от 0 до 9.
|