Имя: Пароль:
1C
1С v8
Не удаляются элементы массива
0 Нач программист
 
16.08.16
08:56
Процедура Задача_11_156_а(Команда)
    Строка="";
    Строка1="";
    МассивН=Новый Массив(20);
    Для Счетчик=0 По 19 Цикл
        ГСЧ=Новый ГенераторСлучайныхЧисел(Счетчик);
        СлучайноеЧисло=ГСЧ.СлучайноеЧисло(0,20);
        Если СлучайноеЧисло%2=0 Тогда
            А=СлучайноеЧисло*1;
        ИначеЕсли СлучайноеЧисло%2=1 Тогда
            А=случайноеЧисло*(-1);
        КонецЕсли;
        МассивН[Счетчик]=А;
        Строка=Строка+А+" ";
    КонецЦикла;
    Сообщить("МассивН: "+Строка);
    Для Счетчик=0 По МассивН.Количество() Цикл
        Если МассивН.Получить(Счетчик)<0 Тогда
            МассивН.Удалить(Счетчик);    
        КонецЕсли;    
    КонецЦикла;        
    Сообщить("Количество массива после удаления: "+МассивН.Количество());
    
КонецПроцедуры



Выдает ошибку:

{Форма.Форма.Форма(71)}: Ошибка при вызове метода контекста (Получить)
        Если МассивН.Получить(Счетчик)<0 Тогда
по причине:
Значение индекса выходит за границы диапазона
1 DDwe
 
16.08.16
08:58
Ну, так читайте соответствующую литературу раз начинающий. Или учитесь поиском пользоваться, короче трудитесь, труд из обезьяны человека создал, а вы обратно стремитесь.
2 Горогуля
 
16.08.16
09:00
(0) сто раз у меня так было
3 Mauser
 
16.08.16
09:00
(0) чорт побери, действительно ошибка!
4 vicof
 
16.08.16
09:00
Нач - это начинающий? начитанный? начальник?
5 Лохматые Уши
 
16.08.16
09:02
У тебя в переменной Счетчик значение 20, а должно быть 19, т.к. с 0 начинаешь.
6 Горогуля
 
16.08.16
09:02
(4) начаток
7 Mauser
 
16.08.16
09:02
(4) Точки нет - значит не сокращение.
8 DDwe
 
16.08.16
09:03
(5) Вот мало того, что ты ему рыбу дал, так еще и тухлую подсунул. Лучше бы ничего не говорил.
9 Eternium
 
16.08.16
09:06
(0) Включи остановку по ошибке и посмотри, чему у тебя равны МассивН.Количество() и Счетчик перед тем, как крашнуться.
10 Горогуля
 
16.08.16
09:10
без толку. тут надо через назад работать или как с коллекцией
11 DDwe
 
16.08.16
09:10
(10) Бота тестируешь?
12 Горогуля
 
16.08.16
09:12
таа. пота. тестируема.
13 DDwe
 
16.08.16
09:15
Всё, спугнули ТС.
14 Лохматые Уши
 
16.08.16
09:21
(8) Отчего ж тухлая? Программист запулял в массив 20 значений, а потом пытается удалить 21 значение.
15 DDwe
 
16.08.16
09:23
(14) То, что ты ему сунул одноразовое решение, в следующий раз, когда массив у него будет 10 элементов, он по твоей наводке будет 19 подставлять.
16 Генератор
 
16.08.16
09:38
Там еще и сдвиг элементов будет, удалит он 10-й элемент например, и 11-й станет 10-м, следующий элемент будет пропущен, и количество будет меняться в процессе удалений. Надо с конца обходить элементы, циклом пока
17 Mauser
 
16.08.16
09:38
(14) От того, что он удаляет из массива, который обходит. И что у него в счетчике - ведомо только Аллаху, да святится имя его.
18 singlych
 
16.08.16
09:43
(14) он до 21-го может и не дойти
19 Лохматые Уши
 
16.08.16
09:46
Методика удаления неверная, с этим я согласен.
20 _stay true_
 
16.08.16
09:54
ТС, дай хоть условие задачи, что нужно реализовать в твоём коде. Мы к тебе в отладчики работать не нанимались
21 Mauser
 
16.08.16
09:57
(20)  А ты при регистрации оферту внимательно читал?
22 Нач программист
 
16.08.16
10:02
Удалить из массива:
а) все отрицательные элементы;
23 Горогуля
 
16.08.16
10:11
(22) благословляю
24 Mauser
 
16.08.16
10:14
(23) Судя по всему там есть буква "б"
25 Горогуля
 
16.08.16
10:15
(24) есть такая буква! крутите барабан
26 DDwe
 
16.08.16
10:16
(22) Сказал "а", говори другие буквы алфавита.
27 _stay true_
 
16.08.16
10:19
(22) Отрицательные элементы это типа -1,-2,-10,-44?

Если да, то проще всего будет Перебрать весь массив в цикле, можешь даже завести счётчик(только помни, что первый элемент массива имеет индекс 0, следовательно, до тела цикла Счетчик=-1),увеличивать счётчик с каждой итерацией цикла, сравнить значение каждого элемента с нулём, и если тек.элемент меньше нуля - Массив.Удалить(Счетчик)
28 _stay true_
 
16.08.16
10:23
А вообще:

Для Счетчик=0 По МассивН.Количество()-1 Цикл
        Если МассивН.Получить(Счетчик)<0 Тогда
            МассивН.Удалить(Счетчик);    
        КонецЕсли;    

Если хочешь так, хотя бы сделай так

Если МассивН[Счетчик]<0 Тогда
МассивН.Удалить[Счетчик];
КонецЕсли;
29 DDwe
 
16.08.16
10:30
(28) Что ж вы трудные такие, не будет это работать, зачем бред советуешь, спец диванный.
30 Mauser
 
16.08.16
10:31
(29) Спокойно. У них тоже своя лига. Пока неназываемая
31 DDwe
 
16.08.16
10:32
(30) +100500 ))) Лига Неназываемых.
32 _stay true_
 
16.08.16
10:35
(29) (31) Дык, посоветуйте что-то работающее, умники и умницы.
33 Горогуля
 
16.08.16
10:36
(32) можно я больше не буду?
34 DDwe
 
16.08.16
10:37
(32) Так нахрена ты неработающий код с грубейшими ошибками сюда выкладываешь?
35 singlych
 
16.08.16
10:38
(32) уже посоветовали в (16)
36 _stay true_
 
16.08.16
10:38
(34) Люблю вас, милаффки:)
37 DDwe
 
16.08.16
10:40
(36) Еще одно. )))
38 Горогуля
 
16.08.16
11:05
39 aka AMIGO
 
16.08.16
11:18
ТС"у советовали обход массива с конца к началу?
Если нет - я первый... еси чё..

Ну это типа так, прверять не буду, уж как-нибудь сами:

Для -МассивН.Количество()+1 По Счетчик = 0 Цикл
...

ЗЫ. Стандартная ошибка, её сообщение полностью подсказывает решение..
40 aka AMIGO
 
16.08.16
11:19
+39 не забыть только поменять знак у "Счетчик" при получении элемента массива.
С минуса на плюс :)
41 Timon1405
 
16.08.16
11:20
(39)
Для Сч = -м.ВГраница() по 0 Цикл
    Если М[-Сч] <0 тогда м.Удалить(-Сч); КонецЕсли;
КонецЦикла
42 aka AMIGO
 
16.08.16
11:20
(41) Во! поэлегантнее решение нашлось :)
43 Нач программист
 
31.08.16
13:51
(41) Спасибо!

        //Удалить из массива:
    //а) все отрицательные элементы;
    //б) все элементы, большие данного числа n;
    //в) все элементы, начиная с n1-го по n2-й (n1 n2).
    
    МассивЧиселВСтроку="";
        
    МассивЧисел=Новый Массив(20);
    ГСЧ=Новый ГенераторСлучайныхЧисел(20);
    
    Для Счетчик=0 По 19 Цикл
        СлучайноеЧисло=ГСЧ.СлучайноеЧисло(0,40);
        СлучайноеЧислоДляМинуса=ГСЧ.СлучайноеЧисло(0,1);
        
        Если СлучайноеЧислоДляМинуса=0 Тогда
            СлучайноеЧисло=СлучайноеЧисло*1;
        ИначеЕсли СлучайноеЧислоДляМинуса%2=1 Тогда
            СлучайноеЧисло=случайноеЧисло*(-1);
        КонецЕсли;
        
        МассивЧисел[Счетчик]=СлучайноеЧисло;
        МассивЧиселВСтроку=МассивЧиселВСтроку+МассивЧисел[Счетчик]+" ";
    КонецЦикла;
    
    Сообщить("Массив Чисел: "+МассивЧиселВСтроку);
    
    Для Счетчик=-МассивЧисел.ВГраница() По 0 Цикл
        Если н1<=-Счетчик И -Счетчик<=н2 И н1<=н2 Тогда
            МассивЧисел.Удалить(-Счетчик);
        КонецЕсли;
    КонецЦикла;
    
    Сообщить("Количество массива после удаления: "+МассивЧисел.Количество());
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан