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

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 или кнопку "Обновить" в браузере.
Рекламное место пустует