Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.08.2009, 13:23
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию перемешать массив

Доброго времени суток уважаемые форумчане !
Я хочу перемешать числа в массиве (для того, чтоб получился неупорядоченный массив неповторяющихся чисел)
делаю так :
Создаю упорядоченный массив
Код:
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  
Старый 21.08.2009, 14:27
Аватар для AND_REY
AND_REY AND_REY вне форума
Активный
 
Регистрация: 31.03.2009
Адрес: Украина, г.Днепропетровск
Сообщения: 324
Версия Delphi: Delphi7
Репутация: 3877
По умолчанию 1

При динамическом массиве for i:=0 to n-1, при статическом for i:=1 to n. random(x) = 0..x-1.
Ответить с цитированием
  #3  
Старый 21.08.2009, 14:38
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

первое понятно , а random(x) = 0..x-1, что за запись ,
если делаю так :random(n-1) то возникает таже ошибка но вместо 0 элементу массива назначается значение = 10627456
Ответить с цитированием
  #4  
Старый 21.08.2009, 17:18
Аватар для AND_REY
AND_REY AND_REY вне форума
Активный
 
Регистрация: 31.03.2009
Адрес: Украина, г.Днепропетровск
Сообщения: 324
Версия Delphi: Delphi7
Репутация: 3877
По умолчанию 2

z:= random(n)+1; для статического массива.
z:= random(n); для динамического.
Ответить с цитированием
  #5  
Старый 21.08.2009, 17:36
kaizer131 kaizer131 вне форума
Начинающий
 
Регистрация: 01.11.2008
Сообщения: 112
Репутация: 10
По умолчанию

О, большое спасибо,всё работает
интересно, а почему всё заработало с z:= random(n)+1 ведь по-сути в значение переменной z может попасть элемент за границей массива. Или я ошибаюсь ?
Ответить с цитированием
  #6  
Старый 21.08.2009, 17:46
Аватар для AND_REY
AND_REY AND_REY вне форума
Активный
 
Регистрация: 31.03.2009
Адрес: Украина, г.Днепропетровск
Сообщения: 324
Версия Delphi: Delphi7
Репутация: 3877
По умолчанию 3

Вы ошибаетесь, неможет. Пример random(10); выдаёт значения от 0 до 9.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:51.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter