powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вопрос к программерам
25 сообщений из 59, страница 1 из 3
Вопрос к программерам
    #40061217
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я балуюсь vbscript, не программер. Иногда сталкиваюсь с такими странностями поведения кода,
что ну прям бесит... Может ли кто-нибудь объяснить такое:

Есть код, запишу примерно, чтобы был ясен смысл.

Function N1(...)

d = ставим к.-н. число

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
For x = 1 To d - 2
  For y = x + 1 To d - 1
    For z = y + 1 To d
    'Здесь идет вызов другой функции, которая собственно и делает то, что требуется
    Call N2(...)
    Next
  Next
Next


Модератор: Учимся использовать тэги оформления кода - FAQ

А теперь собственно вопрос: как может быть так, что подставляя в d одно целое положительное число
все прекрасно работает, а подставив другое - возникает петля?!

Из второй функции не возвращаются x, y, z или d - там тупо другие имена переменных.
Что это вообще за бред происходит???
Как может число предела цикла d как-то повлиять на функцию N2?
Понятное дело, я конечно разберусь в итоге в чем дело (наверное) или
как-то иначе решу проблему.. мне просто неясно вообще как такое может быть???

А с какими "необъяснимыми" вещами в vbscript сталкивались вы?)
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061219
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с приведенным кодом никаких проблем нет
почему бы не привести код, в котором проблему можно воспроизвести?

Причины могут быть от передачи переменных byref до изменения глобальных переменных x,y,z за пределами цикла

Что подразумевается под петлёй - тоже неясно. Бесконечный цикл? Ну так надо посмотреть динамику изменения переменных цикла и станет ясно.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061221
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Да, бесконечный цикл. Переменные в фенкции N2 имеют свои имена, так что по идее никак
не могут повлиять на d или x, y, z. Т.е. грубо говоря я ставлю d = 40 - все работает от начала до конца. Если выборку ставлю больше, типа d = 252 - виснет на определенном месте - т.е. прога доходит до обработки конкретных x,y,z и все.)) При d=40 при тех же x,y,z все пролетает на раз. Только зарегался - не судите строго за теги.))
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061223
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, еще раз.
В приведенном коде проблемы нет.
Проблема в функции значит.
Ее код ты не приводишь
Чем мы можем помочь?

user-77
бесконечный цикл
user-77
виснет на определенном месте
так ты определись, виснет или бесконечный цикл. Это же не одно и то же
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061228
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

На 95% уверен, что бесконечный цикл (виснуть там нечему вроде). В целом вопрос скорее не о том, как мне найти ошибку и ее исправить, а более глобальный. Суть вопроса в том, что КАК отлаживать код, если в итоге обнаружить ошибку можно только случайно? А на тупой перебор всех вариантов, чтобы подтвердить работоспособность кода на все 100% уйдут месяцы или вообще жизни не хватит? Читал такую статью по математическим вычислениям или точнее поиску алгоритмов тупым перебором - суть которой в том, что код становится своего рода черным ящиком - когда время выполнения становится таким, что уже невозможно определить работает ли программа или она зависла или с ней что-то произошло непредвиденное и т.д. Как же программировать в таком случае? Как убедиться в его работоспособности, если ты просто не можешь проверить все. Допустим здесь действительно все относительно легко - 40-250 можно проверить, а когда вариантов запредельное число? В конце-концов здесь (в моем случае) я могу вообще начать с проблемной строки и думаю в чем дело станет ясно, но такая лафа может быть не всегда... и что делать тогда? Советы, идеи?..
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061230
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77,

Надо пройтись по-коду отладчиком и посмотреть что происходит.
Тогда станет понятно в каком месте ошибка.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061232
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос настолько общий, что ответом может быть например "декомпозиция", "модульное тестирование" и еще какие-то практики. Перебором обычно не проверяют, проверяют крайние и выборочные значения.
Кроме того, программы не пишут на vbscript - это просто для каких-то вспомогательных вещей язык. А у серьезных систем разработки существуют и достаточно мощные средства тестирования, и достаточно хорошие практики, и например, статический анализ.
Я думаю, что твоя ошибка довольно банальна, типа переполнения вкупе с On error resume next или что-то такое. Для отлова такой ошибки не нужно проверять все возможные варианты, достаточно проверить крайние. Вообще, зацикливание - достаточно редкая ошибка для опытного программиста, чтобы можно было о ней всерьез говорить.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061241
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переполнения там точно не может быть, т.к. она остановится с ошибкой. В данном случае модульное тестирование как раз-таки в пролете я так думаю. Изначально был скрипт, который просто строил заданную последовательность на основании вводных данных. Все работало. А потом я решил обращаться к этому коду через цикл, чтобы получить ответ какие из последовательностей удовлетворяют заданным условиям. Я уже писал, что не программер, а любитель. Изучать какой-нибудь паскаль желания особого нет, тем более что большинство моих вопросов можно решить и на vbs. Вопрос в том, что один код у меня выполнялся больше недели. Но в тот раз я точно знал, что там ошибок быть не может. И таки дождался завершения. А в других случаях, я могу не быть уверенным, что какая-нибудь байда не приключится и соответственно даже не буду знать работает она или уже нет.)) Конечно можно писать лог, в который записывать вообще каждый переход программы к следующей операции.. не знаю, может быть это и вариант, но тоже как-то не очень. В общем не знаю, спасибко.. ))
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061254
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Древний анекдот, но как-то ложится в тему

Пьяный мужик что-то ищет под фонарем. Тут к нему под ходит милиционер и
спрашивает: "Что вы тут делаете?" Мужик отвечает: "Ключи от квартиры
ищу". "А где потерял?". "В парке". "А зачем здесь ищешь?".
"А здесь светлее ".
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061259
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Ну да.)) Все правильно.. а у кого я еще должен спрашивать? На самом деле может быть много странного.. ну я надеюсь, что не в vbs. А так бог его знает че там происходит.. оно может своей жизнью жить. А виноват в этом двоичный код и пакости вроде IEEE754.

Сейчас ищу проблемное место. Постепенно суживаю область.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061261
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
а у кого я еще должен спрашивать?
так ты спрашивай, тогда ответ получишь. А нет вопроса - нет и ответа.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061264
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Основная моя проблема вот в чем... у меня не выходит рассчитать время выполнения. Пока мои попытки были безуспешны.. почему-то так происходит, что на первый взгляд зависимость должна быть просто линейной (в другом скрипте), но почему-то это не так.. происходит сильная деградация. Я пытался по первой минуте рассчитывать (типа сколько надо сделать, а сколько сделано за минуту), но результат оказался в 27 раз меньше реально затрачиваемого времени. Вот наверное реальная проблема для меня. То, что я не вижу там нелинейной зависимости и не могу производить более точный расчет времени.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061267
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. я хочу сказать, что возможно у меня нет ошибки.. я просто не могу дождаться, потому что мне кажется, что при если при d=40 пролетает относительно быстро, то и и при d=252 будет как-то так. Я просто вчера ждал час и эта ерунда так и не перешла к следующей позиции, хотя при d=40 она за 1,5 минуты выполнялась. Я поэтому и решил, что наверное в коде какая-то ошибка. Но я только сейчас вспомнил, что там есть одна особенность из-за чего может быть действительно все долго. Блин.(
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061268
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А точно этот код нельзя запустить в VBA вместо VBS? Поставить там debug.print для переменной x и все сразу будет наглядно
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061271
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так как у вас три вложенных цикла, то, по порядку, число выполнений N2 растет с ростом d как d^3=d*d*d
В точных значениях цикл первого уровня выполнится (d-1) раз, второго d/2 и третьего - тоже d/2

То есть общее число вызовов k процедуры N2 определяется так k = (d*d*d)/8 - (d*d)/4

Для d = 40 k = 7600, обозначим время работы этого случая за t
тогда для d = 252 k = 1984500, значит в таком случае код будет выполнятся за время 261*t

это ответ на вопрос
user-77Как может число предела цикла d как-то повлиять на функцию N2
При условии, что время работы N2 не зависит от "номера вызова" , общее время работы программы здесь определяется числом вызовов N2,
а это число вызовов пропорционально кубу d.
Вот и всё. Это ребенок лет 8 обязан понимать.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061273
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Думаю, без проблем можно. Точно, это же можно в экселе? Ну чтобы visual studio не ставить? Я вот тут не очень разбираюсь. У меня есть еще pascal.abc net но я его пока не осваивал. Думал там можно просто как-нибудь интерфейсы делать, но оказалось все плохо. Я вообще не понимаю, почему до сих пор нет нормальных шаблонов виндовых интерфейсов с готовыми кодами, типа вот кнопка "Открыть", вот "сохранить" и т.д. Все же программы они в принципе стандартизированы. У всех есть настройки, опции, какие-то общие часто встрчающиеся вещи. Но не.. все какое-то кривое пипец. В том же экселе вроде более-менее сделано, но дальше то никуда..(
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061274
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

пардон, соврамши число вызовов = d^3/4 - d^2/2
для d = 40 k = 15680, время = t
для d = 252 k = 3988051 время= 251*t

порядка роста это не меняет.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061275
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

boobyПри условии, что время работы N2 не зависит от "номера вызова"
ладно пусть так будет.

Там есть зависимость. Но ее проследить невозможно вообще.
Т.е. время выполнения конкретного варианта вычислить нельзя. Как я не пытался.

Если точнее, то она должна перебрать больше 2 млн. вариантов. С этим проблем нет.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061279
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77,

главное состоит в том, что во втором случае число вызовов N2 в 251 раз больше, чем в первом.
Это значит, что программа во втором случае должна работать как минимум в 251 раз дольше, если только работа N2 стабильно не ускоряется, волшебным образом, с увеличением значения d, да так, чтобы кубический рост числа вызовов оказался скомпенсированным.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061282
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
Точно, это же можно в экселе?
обычно да
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061283
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Я согласен. О моей проблеме времени выполнения я писал про корневой если так можно выразиться скрипт, похожий на тот, который работает сейчас как N2 к которому я обращаюсь в цикле, только чуть сложнее. Там ты просто задаешь конкретные условия, перебора нет. Никаких вариантов (как с циклом) там нет. Однако, вот именно там и не получается (пока) разобраться с временем выполнения. Именно там процесс сильно деградирует, а почему неясно. Причем первые (не помню уже, 3 вроде) минуты выполнения делают 25% от всей так сказать длины. Но видимо длина (или сумма) на которую я ориентировался, здесь не помощник. Я пытаюсь найти другую "опору", но найти универсальную математическую формулу для расчета пока никак. В части случаев формула правильная, в других нет. Хотя там уже значения ближе и может быть, когда я буду опираться на них, то расчет времени станет точнее, но и здесь пока нет никакой в этом уверенности. Возможно, если бы я был математиком, то смог бы найти формулу, но не факт. Потому что один математик вроде попытался, но ни к чему не пришел. А я пока продолжаю искать, но уже другими методами.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061285
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Я пока пробую сузить область (если там все же ошибка). Но все больше склоняюсь, что просто оно так долго. Действительно, раньше у меня было 6500 вариантов, а теперь больше 2 млн. Блин. Я изначально думал, выставить d = 1000. А так ведь можно и не дожить.)) Я только сейчас стал осознавать насколько это может быть долгим. И даже не в 300 раз. Хотя посмотрим, если 1,5 - 6500, то 2 млн. - 7,5 часов. Потом, когда буду делать 1000 если решу все-таки, то буду запускать эту хрень на серваке. Благо, есть где можно без проблем держать процесс неделю.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061287
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя все равно все очень странно. Потому что последнее, что она записывает это когда x=3, y=10, z=14 т.е. все что ДО выполняется быстро (в пределах 2 минут) несмотря на d=252!, а все что ПОСЛЕ оооочень долго. Но при этом msg на 3,100 она все-таки выдала спустя ... 40 минут.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061288
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для того, чтобы провести замеры и оценить характер зависимости времени обработки следующего отрезка той же длины,
математиком быть не требуется.

Вы рассказываете о том, что что у вас нелинейная зависимость "скорости продвижения" от позиции "ползунка".
это значит, что на каждом следующем шаге работы выполняется не просто больше действий, чем на предыдущем, а нелинейно больше.

Для грубой оценки времени точные формулы не нужны.
при квадратичной зависимости следующие 25% процентов потребуют в 4 раза большего времени, а при кубической - в 8 раз большего.
Если, например, окажется, что зависимость кубическая, то после обработки первых 25% вы, за то же время, за которое обработались первые 25% получите в восемь раз меньшую длину продвижения - то есть, около 3.5%., а при квадратичной в 4 раза меньшую - около 6%.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061292
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ох ты ж...)) Во она понаписала.) Все-таки похоже код работает. Она перевалила отметку из-за которой я решил, что с кодом проблема. Просто тупо не дождался. Процесс идет себе дальше и пишет результаты. Вот только комп надо выключать и ложиться спать. Так что в следующий раз видимо буду колбасить его. Там вся фигня в том, что она пишет в файл, только то, что удовлетворяет заданным критериям, а в некотором диапазоне от 3,10,14 она ничего не находит, потому ничего в файл и не пишет. Вот так бывает. Сам себя обманул. Думал, что ошибка какая-то. Но такое тоже бывает вообще. Непредвиденное.
...
Рейтинг: 0 / 0
25 сообщений из 59, страница 1 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вопрос к программерам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]