|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Я балуюсь vbscript, не программер. Иногда сталкиваюсь с такими странностями поведения кода, что ну прям бесит... Может ли кто-нибудь объяснить такое: Есть код, запишу примерно, чтобы был ясен смысл. Function N1(...) d = ставим к.-н. число Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Модератор: Учимся использовать тэги оформления кода - FAQ А теперь собственно вопрос: как может быть так, что подставляя в d одно целое положительное число все прекрасно работает, а подставив другое - возникает петля?! Из второй функции не возвращаются x, y, z или d - там тупо другие имена переменных. Что это вообще за бред происходит??? Как может число предела цикла d как-то повлиять на функцию N2? Понятное дело, я конечно разберусь в итоге в чем дело (наверное) или как-то иначе решу проблему.. мне просто неясно вообще как такое может быть??? А с какими "необъяснимыми" вещами в vbscript сталкивались вы?) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 21:22 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
с приведенным кодом никаких проблем нет почему бы не привести код, в котором проблему можно воспроизвести? Причины могут быть от передачи переменных byref до изменения глобальных переменных x,y,z за пределами цикла Что подразумевается под петлёй - тоже неясно. Бесконечный цикл? Ну так надо посмотреть динамику изменения переменных цикла и станет ясно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 21:27 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Shocker.Pro, Да, бесконечный цикл. Переменные в фенкции N2 имеют свои имена, так что по идее никак не могут повлиять на d или x, y, z. Т.е. грубо говоря я ставлю d = 40 - все работает от начала до конца. Если выборку ставлю больше, типа d = 252 - виснет на определенном месте - т.е. прога доходит до обработки конкретных x,y,z и все.)) При d=40 при тех же x,y,z все пролетает на раз. Только зарегался - не судите строго за теги.)) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 21:34 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Так, еще раз. В приведенном коде проблемы нет. Проблема в функции значит. Ее код ты не приводишь Чем мы можем помочь? user-77 бесконечный цикл user-77 виснет на определенном месте ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 21:51 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Shocker.Pro, На 95% уверен, что бесконечный цикл (виснуть там нечему вроде). В целом вопрос скорее не о том, как мне найти ошибку и ее исправить, а более глобальный. Суть вопроса в том, что КАК отлаживать код, если в итоге обнаружить ошибку можно только случайно? А на тупой перебор всех вариантов, чтобы подтвердить работоспособность кода на все 100% уйдут месяцы или вообще жизни не хватит? Читал такую статью по математическим вычислениям или точнее поиску алгоритмов тупым перебором - суть которой в том, что код становится своего рода черным ящиком - когда время выполнения становится таким, что уже невозможно определить работает ли программа или она зависла или с ней что-то произошло непредвиденное и т.д. Как же программировать в таком случае? Как убедиться в его работоспособности, если ты просто не можешь проверить все. Допустим здесь действительно все относительно легко - 40-250 можно проверить, а когда вариантов запредельное число? В конце-концов здесь (в моем случае) я могу вообще начать с проблемной строки и думаю в чем дело станет ясно, но такая лафа может быть не всегда... и что делать тогда? Советы, идеи?.. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:07 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77, Надо пройтись по-коду отладчиком и посмотреть что происходит. Тогда станет понятно в каком месте ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:11 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Вопрос настолько общий, что ответом может быть например "декомпозиция", "модульное тестирование" и еще какие-то практики. Перебором обычно не проверяют, проверяют крайние и выборочные значения. Кроме того, программы не пишут на vbscript - это просто для каких-то вспомогательных вещей язык. А у серьезных систем разработки существуют и достаточно мощные средства тестирования, и достаточно хорошие практики, и например, статический анализ. Я думаю, что твоя ошибка довольно банальна, типа переполнения вкупе с On error resume next или что-то такое. Для отлова такой ошибки не нужно проверять все возможные варианты, достаточно проверить крайние. Вообще, зацикливание - достаточно редкая ошибка для опытного программиста, чтобы можно было о ней всерьез говорить. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:16 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Переполнения там точно не может быть, т.к. она остановится с ошибкой. В данном случае модульное тестирование как раз-таки в пролете я так думаю. Изначально был скрипт, который просто строил заданную последовательность на основании вводных данных. Все работало. А потом я решил обращаться к этому коду через цикл, чтобы получить ответ какие из последовательностей удовлетворяют заданным условиям. Я уже писал, что не программер, а любитель. Изучать какой-нибудь паскаль желания особого нет, тем более что большинство моих вопросов можно решить и на vbs. Вопрос в том, что один код у меня выполнялся больше недели. Но в тот раз я точно знал, что там ошибок быть не может. И таки дождался завершения. А в других случаях, я могу не быть уверенным, что какая-нибудь байда не приключится и соответственно даже не буду знать работает она или уже нет.)) Конечно можно писать лог, в который записывать вообще каждый переход программы к следующей операции.. не знаю, может быть это и вариант, но тоже как-то не очень. В общем не знаю, спасибко.. )) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:34 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Древний анекдот, но как-то ложится в тему Пьяный мужик что-то ищет под фонарем. Тут к нему под ходит милиционер и спрашивает: "Что вы тут делаете?" Мужик отвечает: "Ключи от квартиры ищу". "А где потерял?". "В парке". "А зачем здесь ищешь?". "А здесь светлее ". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:11 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Shocker.Pro, Ну да.)) Все правильно.. а у кого я еще должен спрашивать? На самом деле может быть много странного.. ну я надеюсь, что не в vbs. А так бог его знает че там происходит.. оно может своей жизнью жить. А виноват в этом двоичный код и пакости вроде IEEE754. Сейчас ищу проблемное место. Постепенно суживаю область. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:19 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 а у кого я еще должен спрашивать? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:23 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Основная моя проблема вот в чем... у меня не выходит рассчитать время выполнения. Пока мои попытки были безуспешны.. почему-то так происходит, что на первый взгляд зависимость должна быть просто линейной (в другом скрипте), но почему-то это не так.. происходит сильная деградация. Я пытался по первой минуте рассчитывать (типа сколько надо сделать, а сколько сделано за минуту), но результат оказался в 27 раз меньше реально затрачиваемого времени. Вот наверное реальная проблема для меня. То, что я не вижу там нелинейной зависимости и не могу производить более точный расчет времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:33 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Т.е. я хочу сказать, что возможно у меня нет ошибки.. я просто не могу дождаться, потому что мне кажется, что при если при d=40 пролетает относительно быстро, то и и при d=252 будет как-то так. Я просто вчера ждал час и эта ерунда так и не перешла к следующей позиции, хотя при d=40 она за 1,5 минуты выполнялась. Я поэтому и решил, что наверное в коде какая-то ошибка. Но я только сейчас вспомнил, что там есть одна особенность из-за чего может быть действительно все долго. Блин.( ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:38 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
А точно этот код нельзя запустить в VBA вместо VBS? Поставить там debug.print для переменной x и все сразу будет наглядно ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:43 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Так как у вас три вложенных цикла, то, по порядку, число выполнений 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 обязан понимать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:55 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Shocker.Pro, Думаю, без проблем можно. Точно, это же можно в экселе? Ну чтобы visual studio не ставить? Я вот тут не очень разбираюсь. У меня есть еще pascal.abc net но я его пока не осваивал. Думал там можно просто как-нибудь интерфейсы делать, но оказалось все плохо. Я вообще не понимаю, почему до сих пор нет нормальных шаблонов виндовых интерфейсов с готовыми кодами, типа вот кнопка "Открыть", вот "сохранить" и т.д. Все же программы они в принципе стандартизированы. У всех есть настройки, опции, какие-то общие часто встрчающиеся вещи. Но не.. все какое-то кривое пипец. В том же экселе вроде более-менее сделано, но дальше то никуда..( ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:59 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, пардон, соврамши число вызовов = d^3/4 - d^2/2 для d = 40 k = 15680, время = t для d = 252 k = 3988051 время= 251*t порядка роста это не меняет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:03 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, boobyПри условии, что время работы N2 не зависит от "номера вызова" ладно пусть так будет. Там есть зависимость. Но ее проследить невозможно вообще. Т.е. время выполнения конкретного варианта вычислить нельзя. Как я не пытался. Если точнее, то она должна перебрать больше 2 млн. вариантов. С этим проблем нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:07 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77, главное состоит в том, что во втором случае число вызовов N2 в 251 раз больше, чем в первом. Это значит, что программа во втором случае должна работать как минимум в 251 раз дольше, если только работа N2 стабильно не ускоряется, волшебным образом, с увеличением значения d, да так, чтобы кубический рост числа вызовов оказался скомпенсированным. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:17 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 Точно, это же можно в экселе? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:34 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, Я согласен. О моей проблеме времени выполнения я писал про корневой если так можно выразиться скрипт, похожий на тот, который работает сейчас как N2 к которому я обращаюсь в цикле, только чуть сложнее. Там ты просто задаешь конкретные условия, перебора нет. Никаких вариантов (как с циклом) там нет. Однако, вот именно там и не получается (пока) разобраться с временем выполнения. Именно там процесс сильно деградирует, а почему неясно. Причем первые (не помню уже, 3 вроде) минуты выполнения делают 25% от всей так сказать длины. Но видимо длина (или сумма) на которую я ориентировался, здесь не помощник. Я пытаюсь найти другую "опору", но найти универсальную математическую формулу для расчета пока никак. В части случаев формула правильная, в других нет. Хотя там уже значения ближе и может быть, когда я буду опираться на них, то расчет времени станет точнее, но и здесь пока нет никакой в этом уверенности. Возможно, если бы я был математиком, то смог бы найти формулу, но не факт. Потому что один математик вроде попытался, но ни к чему не пришел. А я пока продолжаю искать, но уже другими методами. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:34 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Shocker.Pro, Я пока пробую сузить область (если там все же ошибка). Но все больше склоняюсь, что просто оно так долго. Действительно, раньше у меня было 6500 вариантов, а теперь больше 2 млн. Блин. Я изначально думал, выставить d = 1000. А так ведь можно и не дожить.)) Я только сейчас стал осознавать насколько это может быть долгим. И даже не в 300 раз. Хотя посмотрим, если 1,5 - 6500, то 2 млн. - 7,5 часов. Потом, когда буду делать 1000 если решу все-таки, то буду запускать эту хрень на серваке. Благо, есть где можно без проблем держать процесс неделю. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:45 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Хотя все равно все очень странно. Потому что последнее, что она записывает это когда x=3, y=10, z=14 т.е. все что ДО выполняется быстро (в пределах 2 минут) несмотря на d=252!, а все что ПОСЛЕ оооочень долго. Но при этом msg на 3,100 она все-таки выдала спустя ... 40 минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:51 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
для того, чтобы провести замеры и оценить характер зависимости времени обработки следующего отрезка той же длины, математиком быть не требуется. Вы рассказываете о том, что что у вас нелинейная зависимость "скорости продвижения" от позиции "ползунка". это значит, что на каждом следующем шаге работы выполняется не просто больше действий, чем на предыдущем, а нелинейно больше. Для грубой оценки времени точные формулы не нужны. при квадратичной зависимости следующие 25% процентов потребуют в 4 раза большего времени, а при кубической - в 8 раз большего. Если, например, окажется, что зависимость кубическая, то после обработки первых 25% вы, за то же время, за которое обработались первые 25% получите в восемь раз меньшую длину продвижения - то есть, около 3.5%., а при квадратичной в 4 раза меньшую - около 6%. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:56 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Ох ты ж...)) Во она понаписала.) Все-таки похоже код работает. Она перевалила отметку из-за которой я решил, что с кодом проблема. Просто тупо не дождался. Процесс идет себе дальше и пишет результаты. Вот только комп надо выключать и ложиться спать. Так что в следующий раз видимо буду колбасить его. Там вся фигня в том, что она пишет в файл, только то, что удовлетворяет заданным критериям, а в некотором диапазоне от 3,10,14 она ничего не находит, потому ничего в файл и не пишет. Вот так бывает. Сам себя обманул. Думал, что ошибка какая-то. Но такое тоже бывает вообще. Непредвиденное. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 01:13 |
|
|
start [/forum/topic.php?fid=60&msg=40061292&tid=2154731]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 144ms |
0 / 0 |