индекс находится за границами массива

1. user1345957 05.04.20 23:58 Сейчас в теме
Создал список значений, генератором случайных чисел пытаюсь получить рандомное число. ГСЧ работает отлично. Но вот проблема:

	СПЗ =  Новый СписокЗначений;
	СПЗ.Добавить(1,Элементы.Декорация2);  //индекс 0
	СПЗ.Добавить(2,Элементы.Декорация3);
    СПЗ.Добавить(3,Элементы.Декорация4);
	СПЗ.Добавить(4,Элементы.Декорация5);
	СПЗ.Добавить(5,Элементы.Декорация6);
    СПЗ.Добавить(6,Элементы.Декорация7);
	СПЗ.Добавить(7,Элементы.Декорация8);
	СПЗ.Добавить(8,Элементы.Декорация9);
    СПЗ.Добавить(9,Элементы.Декорация10);
	СПЗ.Добавить(10,Элементы.Декорация11);
	СПЗ.Добавить(11, 11);
	СПЗ.Добавить(12, 12);
	

	ГСЧ = Новый ГенераторСлучайныхЧисел();
    СЧ = ГСЧ.СлучайноеЧисло(1,СПЗ.Количество());
    Сообщить(СЧ);
    Массив = Новый Массив(10);

	Для  ч = 1 По 10 Цикл
	Массив[ч] = СПЗ.Получить(СЧ);		
	КонецЦикла;
	СПЗ.Удалить(СЧ);
Показать
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user856012 13 06.04.20 00:10 Сейчас в теме
(1)
Для ч = 1 По 10 Цикл
Нумерация массивов в 1С начинается с нуля:
 Для  ч = 0 По 9 Цикл
3. user1345957 06.04.20 00:19 Сейчас в теме
(2) а как потом перемешивать значения ?
ошибка с индексом осталась, я сделал ровно 9 значений и задал от 0 до 9 в цикле..
4. user856012 13 06.04.20 00:37 Сейчас в теме
(3)
а как потом перемешивать значения ?
Понятия не имею: я не анализировал весь ваш код, показал только причину ошибки.
5. user1345957 06.04.20 00:39 Сейчас в теме
(4)я ему как не задам в цикле значения он всё равно выдаёт ошибку про индекс.
6. user856012 13 06.04.20 00:41 Сейчас в теме
(5)
как не задам в цикле значения он всё равно выдаёт ошибку про индекс.
У вас в массиве десять значений: 1-9 и 0!

Попробуйте исходить из этого.
8. user1345957 06.04.20 00:51 Сейчас в теме
(6)
та же ошибка поправил код

СПЗ =  Новый СписокЗначений;
	СПЗ.Добавить(1,Элементы.Декорация2);  //индекс 0
	СПЗ.Добавить(2,Элементы.Декорация3);
    СПЗ.Добавить(3,Элементы.Декорация4);
	СПЗ.Добавить(4,Элементы.Декорация5);
	СПЗ.Добавить(5,Элементы.Декорация6);
    СПЗ.Добавить(6,Элементы.Декорация7);
	СПЗ.Добавить(7,Элементы.Декорация8);
	СПЗ.Добавить(8,Элементы.Декорация9);
    СПЗ.Добавить(9,Элементы.Декорация10);
	СПЗ.Добавить(10,Элементы.Декорация11);
	

	ГСЧ = Новый ГенераторСлучайныхЧисел();
    СЧ = ГСЧ.СлучайноеЧисло(1,СПЗ.Количество()-1);
    Массив = Новый Массив;

	Для  ч = 0 По 11 Цикл
	Массив[ч] = СПЗ.Получить(СЧ);		
	КонецЦикла;
	СПЗ.Удалить(СЧ);
Показать


Индекс находится за границами массива
{ОбщаяФорма.НаСколькоДолгийМарафон.Форма(23)}: Массив[ч] = СПЗ.Получить(СЧ);
7. user856012 13 06.04.20 00:49 Сейчас в теме
(3)
как потом перемешивать значения ?
Кстати, а что вы там собрались "перемешивать"? У вас генератор случайных чисел вызывается вне цикла, то есть один раз. И потом в цикле используется сгенерированное один раз СЧ - одно и то же.
9. user1345957 06.04.20 00:52 Сейчас в теме
(7) у картинок свои значения, я их пытался перемешивать, тем самым каждый раз меняя порядок картинок на случайный.
10. user856012 13 06.04.20 00:59 Сейчас в теме
(9)
я их пытался перемешивать, тем самым каждый раз меняя порядок картинок на случайный.
Как я посмотрю, вы совсем не пытаетесь понять - как работает программа?

Если я правильно понял ваши хотелки, то код должен быть примерно таким:
ГСЧ = Новый ГенераторСлучайныхЧисел(); 
Массив = Новый Массив(10); 
Для ч = 0 По 9 Цикл 
   СЧ = ГСЧ.СлучайноеЧисло(0,СПЗ.Количество()-1); 
   Сообщить(СЧ); 
   Массив[ч] = СПЗ.Получить(СЧ);	
   СПЗ.Удалить(СЧ);
КонецЦикла; 
11. user1345957 06.04.20 01:00 Сейчас в теме
(10) блин, я ж не знал что везде нужен 0... А метод сообщить использовал для проверки гсч
12. user856012 13 06.04.20 01:05 Сейчас в теме
(11)
я ж не знал что везде нужен 0...
Во-первых, не везде: список значений вы заполняете чем угодно, хоть единицами, хоть тысячами. Пожалуй, более правильный код будет таким:
ГСЧ = Новый ГенераторСлучайныхЧисел(); 
Массив = Новый Массив(10); 
Для ч = 1 По 10 Цикл 
   СЧ = ГСЧ.СлучайноеЧисло(1,СПЗ.Количество()); 
   Сообщить(СЧ); 
   Массив[ч-1] = СПЗ.Получить(СЧ);    
   СПЗ.Удалить(СЧ);
КонецЦикла;


Во-вторых, вы неправильно строили алгоритм, заполняя массив одним и тем же значением из списка - вот ваша главная ошибка.
13. user1345957 06.04.20 01:06 Сейчас в теме
(12) и как это исправить ? Я про заполнение одним и тем же значением.
14. user856012 13 06.04.20 01:17 Сейчас в теме
(13)
и как это исправить ? Я про заполнение одним и тем же значением.
вы не видите отличий моего кода от вашего? К сожалению, тогда ничем помочь не могу...
15. user1345957 06.04.20 01:20 Сейчас в теме
(14) вижу, я по всякому пробовал. Новая ошибка, по вашему коду:

Значение индекса выходит за границы диапазона
{ОбщаяФорма.НаСколькоДолгийМарафон.Форма(22)}: Массив[ч-1] = СПЗ.Получить(СЧ);

по причине:
Значение индекса выходит за границы диапазона
16. user856012 13 06.04.20 01:22 Сейчас в теме
(15)
Новая ошибка, по вашему коду:
Уже исправил - проморгал нижнюю границу диапазона СЧ: скопипастил с 0, а надо было с 1. Пробуйте.
17. user1345957 06.04.20 01:23 Сейчас в теме
(16) 1,СПЗ.Количество()
Да знаю, я сам бываю невнимателен(
Исправил, ошибка та же, может с 2 начать отсчёт ?
	СЧ = ГСЧ.СлучайноеЧисло(1,СПЗ.Количество());
	Массив[ч-1] = СПЗ.Получить(СЧ);


{ОбщаяФорма.НаСколькоДолгийМарафон.Форма(22)}: Ошибка при вызове метода контекста (Получить)
Массив[ч-1] = СПЗ.Получить(СЧ);
по причине:
Значение индекса выходит за границы диапазона
Значение индекса выходит за границы диапазона
18. user856012 13 06.04.20 01:33 Сейчас в теме
(17)
ошибка та же, может с 2 начать отсчёт ?
Не надо гадать, надо смотреть - чему равно СЧ непосредственно перед ошибкой? Сообщить() верните в цикл.
19. user1345957 06.04.20 01:41 Сейчас в теме
(18) вернул, но он же просто будет рандомные числа давать..
8 чисел дал отличных от нуля: 9,4,8,3,1,2,4,4.
Прикрепленные файлы:
20. user856012 13 06.04.20 01:59 Сейчас в теме
(19)
и вроде бы пустое значение
Вот из-за этого "пустого значения" у вас и ошибка индекса. Разбирайтесь, откуда и почему оно "пустое".
21. user1345957 06.04.20 02:00 Сейчас в теме
(20) я исправил, оно не пустым было, а конец в списке случайных чисел, убрал я из кода:
СПЗ.Удалить(СЧ);
ошибка осталась, не в нём было дело. а ошибка опять трындит про эту строку

Массив[ч-1] = СПЗ.Получить(СЧ);



Значение индекса выходит за границы диапазона
{ОбщаяФорма.НаСколькоДолгийМарафон.Форма(25)}: Массив[ч-1] = СПЗ.Получить(СЧ);

по причине:
Значение индекса выходит за границы диапазона
23. user856012 13 06.04.20 02:40 Сейчас в теме
(21)
оно не пустым было, а конец в списке случайных чисел
Я не знаю, что это за "конец", но получить надо число: просто потому что индекс - это число.
убрал я из кода:
СПЗ.Удалить(СЧ);
Оно там было не случайно - теперь у вас в массиве наверняка окажутся дубли картинок.
Значение индекса выходит за границы диапазона
Неудивительно, только сейчас обратил внимание:
(19)
8 чисел дал отличных от нуля: 9,4,8,3,1,2,4,4.
Какого хрена у вас в конце этой последовательности делает четверка??? Ведь верхняя граница диапазона СЧ устанавливается по количеству оставшихся элементов в списке значений - их на этот момент будет только 3!

Вот тут у вас собака явно порылась.
24. user1345957 06.04.20 02:44 Сейчас в теме
(23) Ага, картинки только жалко не перемешиваются...
25. user1345957 06.04.20 02:53 Сейчас в теме
(23) я может чего-то не понимю, но наверное код не дописан чтобы порядок картинок всегда был разным или что сделать чтобы они наконец-то перемешивались бы ?
22. user1345957 06.04.20 02:38 Сейчас в теме
(20) Код переписал полностью, ошибку про индекс исправил, гсч работает. Но картинки не перемешиваются, в этом то и проблема, которую я не знаю как исправить.

	СПЗ =  Новый СписокЗначений;
	СПЗ.Добавить(1,Элементы.Декорация2);  //индекс 0
	СПЗ.Добавить(2,Элементы.Декорация3);
    СПЗ.Добавить(3,Элементы.Декорация4);
	СПЗ.Добавить(4,Элементы.Декорация5);
	СПЗ.Добавить(5,Элементы.Декорация6);
    СПЗ.Добавить(6,Элементы.Декорация7);
	СПЗ.Добавить(7,Элементы.Декорация8);
	СПЗ.Добавить(8,Элементы.Декорация9);
    СПЗ.Добавить(9,Элементы.Декорация10);
	СПЗ.Добавить(10,Элементы.Декорация11);
	
	ГСЧ = Новый ГенераторСлучайныхЧисел();
   	
	Массив = Новый Массив(10);
	Для  ч = 1 По 10 Цикл
	
	СЧ = ГСЧ.СлучайноеЧисло(1,СПЗ.Количество()-2);
	Сообщить(СЧ);
	Массив[ч-1] = СПЗ.Получить(СЧ);
	КонецЦикла;
Показать
26. burgomister 59 06.04.20 04:55 Сейчас в теме
(22) Что значит не перемешиваются? На форме? В цикле заполняете другой массив и выводите его на форму.
27. user1345957 06.04.20 14:19 Сейчас в теме
 // Исходный массив картинок
МассивКартинок = Новый Массив (10);
МассивКартинок[0] = Элементы.Декорация2;
МассивКартинок[1] = Элементы.Декорация3;
МассивКартинок[2] = Элементы.Декорация4;
МассивКартинок[3] = Элементы.Декорация5;
МассивКартинок[4] = Элементы.Декорация6;
МассивКартинок[5] = Элементы.Декорация7;
МассивКартинок[6] = Элементы.Декорация8;
МассивКартинок[7] = Элементы.Декорация9;
МассивКартинок[8] = Элементы.Декорация10;
МассивКартинок[9] = Элементы.Декорация11;

// Перемешивание осуществляем с помощью списка значений,
// где Значение - картинка, а Представление - случайное число.

ГенераторЧисел = Новый ГенераторСлучайныхЧисел();

СписокКартинок = Новый СписокЗначений;
СписокКартинок.ЗагрузитьЗначения(МассивКартинок)

Для каждого ЭлементСписка Из СписокКартинок Цикл

СлучайноеЧисло = ГенераторЧисел.СлучайноеЧисло(, 99999);
ЭлементСписка.Представление = Формат(СлучайноеЧисло, "ЧЦ=5; ЧН=; ЧВН=; ЧГ=");

КонецЦикла;

// Отсортировав случайные числа по порядку
// мы получим исходный массив картинок в случайном порядке.

СписокКартинок.СортироватьПоПредставлению();

МассивКартинок = СписокКартинок.ВыгрузитьЗначения();
Показать


Пробую другой код: не работает...
28. user856012 13 06.04.20 17:38 Сейчас в теме
(27)
Пробую другой код: не работает...
Ффух! Даже я, закоренелый семерочник, уже разобрался (вроде бы), а вы до сих пор путаете представление и значение списка значений!

Да еще лепите лишние массивы и прочую хрень.

Проверяйте:
    ГСЧ = Новый ГенераторСлучайныхЧисел();
    СПЗ = Новый СписокЗначений;
    СПЗ.Добавить(Элементы.Декорация2,Строка(ГСЧ.СлучайноеЧисло(1000,9999)));
    СПЗ.Добавить(Элементы.Декорация3,Строка(ГСЧ.СлучайноеЧисло(1000,9999)));
    СПЗ.Добавить(Элементы.Декорация4),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
    СПЗ.Добавить(Элементы.Декорация5),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
    СПЗ.Добавить(Элементы.Декорация6),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
    СПЗ.Добавить(Элементы.Декорация7),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
    СПЗ.Добавить(Элементы.Декорация8),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
    СПЗ.Добавить(Элементы.Декорация9),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
    СПЗ.Добавить(Элементы.Декорация10),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
    СПЗ.Добавить(Элементы.Декорация11),Строка(ГСЧ.СлучайноеЧисло(1000,9999));

    СПЗ.СортироватьПоПредставлению();

    Массив = СПЗ.ВыгрузитьЗначения();
Показать
29. user1345957 06.04.20 18:01 Сейчас в теме
(28)
ГСЧ = Новый ГенераторСлучайныхЧисел();
СПЗ = Новый СписокЗначений;
СПЗ.Добавить(Элементы.Декорация2,Строка(ГСЧ.СлучайноеЧисло(1000,9999)));
СПЗ.Добавить(Элементы.Декорация3,Строка(ГСЧ.СлучайноеЧисло(1000,9999)));
СПЗ.Добавить(Элементы.Декорация4),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация5),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация6),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация7),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация8),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация9),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация10),Строка(ГСЧ.СлучайноеЧисло(1000,9999));
СПЗ.Добавить(Элементы.Декорация11),Строка(ГСЧ.СлучайноеЧисло(1000,9999));

СПЗ.СортироватьПоПредставлению();

Массив = СПЗ.ВыгрузитьЗначения();
Показать


А картинки на форме перемешиваются ?
30. user856012 13 06.04.20 18:09 Сейчас в теме
(29)
А картинки на форме перемешиваются ?
Это не ко мне, это - к хозяину казино. :-P
31. user1345957 06.04.20 18:13 Сейчас в теме
(30) нет я серьёзно, смысл то в том чтобы картинки на форме перемешивались...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот