Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2017, 11:14   #1
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию иногда зависает кусок кода который генерирует случайные числа без повторений

Вот кусок кода который генерить случайные числа без повторений:

Код:
...
label z;                                       // Служебная метка для генерации без повторений
begin
  randomize;                                // Включаем возможность рандомизации
  n := 4 + random(7);                    // Генерируем число объектов в наборе чисел, вариации от 4 до 10
  setlength(digitarray,n-1);             // Устанвливаем размер массива равной числу объектов
  for i := 0 to n-1 do                      // Генерируем цифры в диапазоне от 0 до 9 без повторений
          begin
            z : digitarray[i] := Random(9);
            for k := 0 to i-1 do
                if digitarray[k] = digitarray[i] then goto z;
          end;
 ...
Иногда временами программа зависает иногда нет.

Попробовал написать без использования меток все равно зависает, значит метки здесь не при чем, а также проверил убрав код до цикла, значит предустановки массива тоже не при чем.
Проблема именно в теле цикла. Возможно какая то ошибка самого компилятора.
Попробовал прогонять программу через F7, это отладка и всегда при отладке возникает ошибка:
Проект вызвал класс исключения 'External:SIGSEV'. В файле 'include\application.inc ' на строке 249

Ну и строка в этом файле:
function TApplication.GetExename: String;
Begin
Result := ParamStrUTF8(0);
end;


иде Lazarus
goto ∞ вне форума Ответить с цитированием
Старый 13.08.2017, 11:29   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Random(9) генерит 0..8 - всего 9 цифр.
А размер массива по максимуму может быть 10
Black Fregat вне форума Ответить с цитированием
Старый 13.08.2017, 11:32   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

setlength(digitarray,n-1); // элемненов в массиве n-1
for i := 0 to n-1 do //чегойто цикл за пределы массива?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.08.2017, 11:34   #4
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Random(9) генерит 0..8 - всего 9 цифр.
А размер массива по максимуму может быть 10
Боженьки какой я глупец, значит ошибка вызывалась когда число объектов в наборе превышала возможное количество вариации а значит хоть какая нибудь цифра всегда повторялась, итог бесконечный цикл. Какая классика.

Спасибо. Не внимательность!!!.

Последний раз редактировалось goto ∞; 13.08.2017 в 11:44.
goto ∞ вне форума Ответить с цитированием
Старый 13.08.2017, 11:40   #5
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
setlength(digitarray,n-1); // элемненов в массиве n-1
for i := 0 to n-1 do //чегойто цикл за пределы массива?
Почему за пределы, нумерация начинается с нуля же. Генерим число в диапазоне от 4 до 10 и устанавливаем массив такой размерности

например n = 4 + random(7) = 4 + 2 = 6 - шесть элементов
Первый элемент имеет индекс 0
...
Шестой элемент имеет индекс 5
goto ∞ вне форума Ответить с цитированием
Старый 13.08.2017, 11:47   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

for i := 0 to n-1 - для n элементов, а у тебя в массиве n-1 элементов
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.08.2017, 11:57   #7
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
for i := 0 to n-1 - для n элементов, а у тебя в массиве n-1 элементов
Понял, исправил

Код:
...
setlength(digitarray,n)
...
goto ∞ вне форума Ответить с цитированием
Старый 13.08.2017, 13:18   #8
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

Я не понял Вы исправили ошибку или нет? Просто я тут подумал, что у Вас ошибка может быть вот здесь:
Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Код:
for k := 0 to i-1 do
- если i = 0(приходит из вышестоящего цикла), то получается что k идет от 0 до какого-то большого числа - максимальное значение i, зависит от типа i.
Cuprum5 вне форума Ответить с цитированием
Старый 13.08.2017, 13:47   #9
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
ошибка может быть вот здесь: ... k идет от 0 до какого-то большого числа - максимальное значение i, зависит от типа i.
Нет, i там определяется верхним циклом
Код:
for i := 0 to n-1 do
и ограничено
eoln вне форума Ответить с цитированием
Старый 13.08.2017, 13:53   #10
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Я не понял Вы исправили ошибку или нет? Просто я тут подумал, что у Вас ошибка может быть вот здесь:
- если i = 0(приходит из вышестоящего цикла), то получается что k идет от 0 до какого-то большого числа - максимальное значение i, зависит от типа i.
Я исправил то что подсказали выше, ошибка из за которой зависала программа заключается в бесконечном цикле.

А бесконечный цикл возникал не всегда а только когда переменная n (n := 4 + random(7) ) равнялась 10,
и в этот десять элементный массив пыталась занести 9 элементов без повторений что в принципе невозможно, отсюда и бесконечный цикл.

И вторая ошибка но не критичная в данном случае выход за пределы массива, но она всплыла все равно где нибудь


А то что i = 0
Это сам алгоритм, заносим в массив первый элемент, потом второй и только потом начинается проверка вторго элемента с первым что бы они не были одинаковыми по условию задачи, тут все норм.
goto ∞ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Датчик случайных чисел генерирует числа от 0 до 255. Нужно перевести числа в их символьное представление. Остановка программы - любая клавиша. julu199 Помощь студентам 2 19.09.2016 12:24
Датчик случайных чисел генерирует числа от 0 до 255. Нужно перевести числа в их символьное представление. Остановка программы – появление символа «*». Сколько символов было напеч julu199 Помощь студентам 1 19.09.2016 12:20
есть код который генерирует md5. Но не пойму как его вызывать pompiduskus Общие вопросы C/C++ 30 18.08.2014 00:03
Записать в файле g все числа файлов c и d без повторений и в порядке возрастания imeugene Помощь студентам 0 23.05.2013 16:30
Delphi. random, случайные числа без повторений MerCY Помощь студентам 8 10.05.2010 15:19