Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Код работает правильно ТОЛЬКО при отладке

Код работает правильно ТОЛЬКО при отладке
Я
   Sir Nickname
 
29.08.18 - 10:10
Доброго времени суток.

Проблема очень, очень, очень, очень странная.

Дано:
1) Общий модуль раз (только флаг "Сервер") с процедурой, генерирующей массив случайных чисел.

Код предельно прост и имеет примерно следующий вид:
[CODE]Функция МассивСЧ(Количество, Предел) Экспорт

    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Результат = Новый Массив;

    Для Нум = 1 по Количество Цикл
        Результат.Добавить(ГСЧ.СлучайноеЧисло(1, Предел));
    КонецЦикла;

    Возврат Результат;

КонецФункции
[/CODE]


2) Общий модуль два (флаги "Сервер" и "Вызов сервера"), через который вызывается с клиента предыдущий модуль.

Имеем ситуацию:

Этот код всегда возвращает массив одинаковых чисел.
Но! Если тот же самый код проходить в режиме отладки, то всё работает правильно.

У кого-нибудь есть идеи, почему такое может быть?
 
 
   Cool_Profi
 
1 - 29.08.18 - 10:12
Новуб соль задать при инициализации ГСЧ?
   Cyberhawk
 
2 - 29.08.18 - 10:12
"Этот код всегда возвращает массив одинаковых чисел" // Код-то показывай
   DrWatson
 
3 - 29.08.18 - 10:21
"Генератор случайных чисел инициализируется временем работы операционной системы с момента старта."

Вероятно, вызовы выполняются настолько быстро, что генератор инициализируется одинаково, в следствии чего и выдаёт одинаковый результат.
В отладке же пока вы пройдёте несколько шагов пройдёт сколько-то секунд и следующий вызов будет инициализирован уже другим числом.
   DrWatson
 
4 - 29.08.18 - 10:25
+(3) Конструктор может быть и с параметром. См. справку
   strrike
 
5 - 29.08.18 - 10:28
платформа может.
   Михаил Козлов
 
6 - 29.08.18 - 10:35
(4)+ Использовал конструктор ГСЧ с параметром.
   Sir Nickname
 
7 - 29.08.18 - 10:43
[UPD] Упустил важную деталь.
В силу некоторых причин, ГСЧ инициализируется в другой процедуре, которая вызывается с заданными параметрами на каждой итерации цикла, в котором СЧ пишутся в массив.

[CODE]Функция СгенеритьСЧ(Предел) Экспорт
    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Возврат ГСЧ.СлучайноеЧисло(1, Предел)
КонецФункции

Функция МассивСЧ(Количество, Предел) Экспорт

    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Результат = Новый Массив;

    Для Нум = 1 по Количество Цикл
        Результат.Добавить(СгенеритьСЧ(Предел));
    КонецЦикла;

    Возврат Результат;

КонецФункции[/CODE]

Дорогой (2), выкладывать точно тот же код, что и у меня, смысла нет, так как:
- там полно заморочек, которые не имеют никакого отношения к делу и будут только отвлекать от настоящей проблемы
- которая в коде, приведённом выше, проявляется точно тем же образом (сейчас специально проверил)

Уважаемый (3) - полагаю, что Вы правы, поскольку я только что обнаружил, что если инициализировать ГСЧ перед циклом, и в той же функции генерить СЧ на каждой итерации этого цикла, то всё работает хорошо. А если вынести ГСЧ в отдельную функцию, где он будет инициализироваться и выдавать СЧ на каждой итерации, то почему-то все СЧ в полученном массиве будут совпадать. И да - похоже, что это привязано к времени инициализации ГСЧ.
   Sir Nickname
 
8 - 29.08.18 - 10:47
Другими словами:

Вот это выдаёт массив разных чисел
[CODE]Функция МассивСЧ(Количество, Предел) Экспорт

    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Результат = Новый Массив;

    Для Нум = 1 по Количество Цикл
        Результат.Добавить(ГСЧ.СлучайноеЧисло(1, Предел));
    КонецЦикла;

    Возврат Результат;

КонецФункции[/CODE]

А если делать так, то даже при использовании ГСЧ все числа в массиве будут одинаковыми:

[CODE]Функция СгенеритьСЧ(Предел) Экспорт
    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Возврат ГСЧ.СлучайноеЧисло(1, Предел)
КонецФункции

Функция МассивСЧ(Количество, Предел) Экспорт

    ГСЧ = Новый ГенераторСлучайныхЧисел;
    Результат = Новый Массив;

    Для Нум = 1 по Количество Цикл
        Результат.Добавить(СгенеритьСЧ(Предел));
    КонецЦикла;

    Возврат Результат;

КонецФункции[/CODE]

Мистика, но теперь хотя бы понятная.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует