Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

Код:

...
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, 12:29   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 561
Репутация: 422
По умолчанию

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

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

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

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

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

Цитата:
Сообщение от Аватар Посмотреть сообщение
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, 12:47   #6
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 16,800
Репутация: 5909
По умолчанию

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

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

Код:

...
setlength(digitarray,n)
...

goto ∞ вне форума   Ответить с цитированием
Старый 13.08.2017, 14:18   #8
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 303
Репутация: 59
По умолчанию

Я не понял Вы исправили ошибку или нет? Просто я тут подумал, что у Вас ошибка может быть вот здесь:
Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Код:

for k := 0 to i-1 do

- если i = 0(приходит из вышестоящего цикла), то получается что k идет от 0 до какого-то большого числа - максимальное значение i, зависит от типа i.
Cuprum5 вне форума   Ответить с цитированием
Старый 13.08.2017, 14:47   #9
eoln
Профессионал
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,633
Репутация: 2191

icq: 421277094
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
ошибка может быть вот здесь: ... k идет от 0 до какого-то большого числа - максимальное значение i, зависит от типа i.
Нет, i там определяется верхним циклом
Код:

for i := 0 to n-1 do

и ограничено
eoln вне форума   Ответить с цитированием
Старый 13.08.2017, 14:53   #10
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Адрес: 0x0000-0x9FFFFF
Сообщений: 113
Репутация: 9
По умолчанию

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

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

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


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



Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Датчик случайных чисел генерирует числа от 0 до 255. Нужно перевести числа в их символьное представление. Остановка программы - любая клавиша. julu199 Помощь студентам 2 19.09.2016 13:24
Датчик случайных чисел генерирует числа от 0 до 255. Нужно перевести числа в их символьное представление. Остановка программы – появление символа «*». Сколько символов было напеч julu199 Помощь студентам 1 19.09.2016 13: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




10:17.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru