Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
NB не поддерживает рекурсивные функции? Сделал рекурсивную функцию, в тестовом режиме все нормально, при компиляции NeoBook гнется и закрывается без предупреждения.
При компиляции или после запуска скомпилированной проги? Если последнее то. Скорее дело не в поддержке рекурсивности а ты как програмер чего то накосячил, рекурсивность это вызов функции самой себя. Надо представлять что делает твой скрипт в течении времени, при запуске в десинге, прога работает немного медленней чем после компиляции, и то что успевало в десинге вполне может неуспевать после.
NB выкидывает при нажатии "Компилировать". Довольно-таки простой пример рекурсивной функции:
Code
SetVar "[test]" "[test]+1" If "[%1]" "<" "5" Call "test" "[test]" Else AlertBox "Рекурсивная функция" "Работает! Маленький код только для теста." EndIf
В режиме теста все работает прекрасно, никакого бесконечного цикла нет. А вот при компиляции выкидывает, сначала зависает, в правом нижнем углу пишет что-то типа этого, потом закрывается:
Я как то знаеш не разбираюсь в синтаксисе нб, и не могу определить где пределы твоей функции, меня смущает что имя твоей функции совпадает с именем переменной глубины рекурсии, к чему ты добавляеш 1 к имени функции или к переменной.
Довольно-таки простой пример рекурсивной функции: Code
Несмотря на то, что у меня большие сомнения в работоспособности указанной конструкции, не мешало бы приложить ещё и исходник самой функции "test" для проверки. В принципе, связи между тем, что написано в скриптах NeoBook и процессом компилляции файла проекта нет никакой. Я проверил: даже в таком (кастрированном) варианте всё компилится совершенно исправно. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
А вот при компиляции выкидывает, сначала зависает, в правом нижнем углу пишет что-то типа этого, потом закрывается:
Значит не поддерживает, я давно делал проект, и у меня в результате ошибки получилось рекурси, на 40% вылетало с ошибкой, я поковырялся и нашел что функция вызывает саму себя и при компиле не компилится, но с подпрограммами эта фишка работает, но возможно функция на НБ это не что другое чем просто функция в нашем понимании. Ведь не знаем как она присоединяется к проекту при компиляции, может это и не функция вовсе после компиля! Я имею ввиду функцию Call. Я в НБ полный ламо, и толком сказать не могу. Подождем, что скажет гуру-Петр и просветит нас по этому сабжу.
Добавлено (27 Май 2010, 16:49) --------------------------------------------- пока писал, Петр уже ответил
Сейчас попробовал создать "пустую" функцию "test"... Всё компилится без проблем.
Добавлено (27 Май 2010, 16:59) --------------------------------------------- Сделал НЕ пустую функцию "test" с указанным автором сабжа параметром... Проблем с компилляцией нет!
Добавлено (27 Май 2010, 17:05) ---------------------------------------------
Quote (Сергей)
Ведь не знаем как она присоединяется к проекту при компиляции
Очевидно очень просто - файл функции "приклеивается" к файлу проекта (точно так же как и вложенные файлы), а при запуске код функции считывается и распаковывается в память. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Следует иметь ввиду, что (в отличие от Delphi) при компилляции проекта NeoBook НЕ производит проверку на правильность синтаксиса, и ЧТО там напахано в скриптах необушному компиллятору по-барабану!
При тестировании проекта ошибку обнаружит отладчик, и то только при обращении к части кода, содержащей ошибку, а в конечном (скомпиллированом) файле на эту ошибку укажет уже сам проект при "обращении" к ней. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
короче, я покидаю форум, нервы дороже... Лучше фильм смотреть буду(Поршивые овцы) это ппц, грузится неимоверно
Сергей, подожди кино смотреть! Похоже ты был прав и не все тут просто... Проверил вой вариант - у меня тоже с ошибкой! Но у меня функция была принципиально другая, не рекурсивная.
И вот, что интересно: ошибка вылетает не только при попытке комплляции, но и при проверке файлов проекта , т.е NB (как обычно перед компилляцией) проверяет все ли файлы на месте (целостность проекта), и вот в этом месте зацикливается, если в функции идет обращение к себе самой. Видимо, все же тексты функций прочитываются пр проверке, что вполне логично, т.к. в функции может содержаться обращение к внешним файлам, а тут получается, что функция ищет саму себя...
Бред какой-то получается... Возможно зависание идет потому-что файл функции в этот момент открыт.. Значит Сергей прав, и оформлять рекурсию надо ввиде подпрограмм. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Вот пример проекта использования моей функции, который не компилируется
Да, всё верно - НЕ компиллируется! А точнее - не столько не компилируется, а сколько не проходит проверку на целостность файлов проекта, и похоже по той причине на которую я указывал, птому и не компиллируется, т.к. NB входит в ступор!
В проектном режиме проверка файлов (при тестовом запуске проекта) не производится. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Скорее всего нет. Подоплека такого поведения NB очень проста - при компилляции проекта NB собирает в единое целое все внешние файлы проекта, а их она получить может только на основе анализа текстов скриптов и внешних функций.
Выход, пожалуй, (пока) один - оформляйте рекурсию в виде подпрограммы. В принципе, на работоспособности проекта это никак не сказывается, разьве только придется в каждом новом проекте заново (всего-то один раз!) прописывать подпрограмму. Или вы планируете использовать одну и ту же рекурсию постоянно и непрерывно, в каждом проекте?
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
да с фильмом я обламался, ходил в гости племяшку поздравлять, я и забыл про это день Ну ладно хоть мамка предупредила, успел поздравить
Quote (Alien)
А подпрограмму использовать - это как?
это GoSub "программа"
Code
:test SetVar "[test]" "[test]+1" If "[test]" "<" "5" GoSub "test" Else AlertBox "Рекурсивная функция" "Работает! Маленький код только для теста." EndIf return .вызываешь эту подпрограмму командой --> GoSub "test"
в посте 7 есть пример, я там закоментировал команду, тока функцию закоментируй
Добавлено (27 Май 2010, 19:28) ---------------------------------------------
Quote (Peter)
Выход, пожалуй, (пока) один - оформляйте рекурсию в виде подпрограммы.
в принципе я так и делаю(и никакого дискомфорта), а на функцию упор делаю, когда использую код постоянно в проектах, типа на проверку файлов или еще всяких постоянно использующихся фич
Сообщение отредактировано Сергей - Чт, 27 Мая 2010, 20:10
Рекурсия это вызов ПОДПРОГРАММЫ самой себя. Рекурсия сходна с циклом, разница только в том что при рекурсивном вызове создается копия подпрограммы, столько раз сколь определена глубина рекурсии.
Quote (Peter)
Сделал НЕ пустую функцию "test"
Счетчик глубины рекурсии передается из одной копии подпрограммы в другую, при этом уменьшаясь или увеличиваясь, в зависимости от того по какому условию вы прекращаете рекурсивный вызов. Ну и естественно все должно присутствовать и подпрограмма и условие выхода. Иначе умрет ваш комп, использует всю доступную память или впадет в безконечный цикл. Надо просто понимать что вы делаете.
Quote (Alien)
А подпрограмму использовать - это как?
отдельно находящийся и использующийся участок кода, даж не знаю синтаксиса нб- Call "test" "[test]" обращение к подпрограмме, в общем случае это выглядит так уровень1- тест начало подпрограммы(глубина=2) условие выхода из рекурсии достигнуто - выйти глубина=1? не достигнуто вызвать себя ------------------------------- уровень2 тест начало подпрограммы(глубина=1) условие выхода из рекурсии достигнуто - выйти глубина=1? не достигнуто вызвать себя ------------------------------- ............................ -------------------------------
конец попрограммы, тут должен быть возврат к тому месту откуда ее вызвали вданном случае возврат на уровень1 ------------------------------- конец попрограммы, тут должен быть возврат к тому месту откуда ее вызвали это представление как работает рекурсия ну а сам код, естественно без вложения самого себя. Суть в том что при рекурсии сначала заканчивается самый глубокая копия, а потом все последовательно.
Сергей, ну это уже похоже А в алерт бокс поставь индекс рекурсии, тогда будет видно с какого уровня от идет.
Добавлено (27 Май 2010, 19:54) --------------------------------------------- Классический пример рекурсивной проги-ханойская башня, перекидывание колец с палки на палку, монахи играют в нее уж не одну сотню лет, как закончат игру будет конец света глубина рекурсии в той игре что то в райне 8 или 9 палок. Была такая игрушка на компе, ну с 3 я еще как то справлялся.
Добавлено (27 Май 2010, 19:57) --------------------------------------------- Да, один из методов получения дерева справочника рекурсивный, если на папке стоит крестик, показывающий что в ней есть еще папки, и они действительно там есть, то испльзовался рекурсивный поиск, если крестик стоит но там ничего не вложено- использовался линейный алгоритм.
причем тут шаблоны?! го суб, это и есть подпрограмма и ни чего другого! не надо искажать названия вещей, есть необукеры, которые открыли программу в первый раз и они будут искать шаблон, т.е. то чего нет...
Quote (Alex3A)
Рекурсия это вызов ПОДПРОГРАММЫ самой себя.
Alex3A в НБ кроме подпрограммы есть еще и вызов функции. Вот в ней то рекрусия и не пашет, а в подпрограмме идет нармально
Сообщение отредактировано Сергей - Чт, 27 Мая 2010, 20:09
причем тут шаблоны?! го суб, это и есть подпрограмма
Это я так в первых русификаторах обозвал "Subroutines", хотя, конечно, "подпрограммы" будет правильнее. В пследних русиках это было поправлено, но, видимо, ещё пользует народ старые версии NB, где это звучит как "шаблон".
Quote (Сергей)
Вот в ней то рекрусия и не пашет
Не рекурсия не пашет, а NB зависает на стадии проверки проекта перед компилляцией, или созданием списка файлов проекта. И именно поэтому:
Quote (Сергей)
и также в архив не сбрасывается
А сама по-себе рекурсия в скриптах работает. Вот только в "функции" её запихивать не следует. - А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Это я так в первых русификаторах обозвал "Subroutines"
а точно, забыл Ну пора народу обновить прогу, че на старых сидеть?!
Quote (Peter)
А сама по-себе рекурсия в скриптах работает.
ну да работает, только в тестовом режиме. Да короче, кому надо имено рекрусию, пусть в Subroutines используют, тем более такое редко в проектах используется... Интересно а русик не повлиял? на английском тоже виснет? Надо у Омара спросить, он вроде на оригинале сидит...
Это я так в первых русификаторах обозвал "Subroutines", хотя, конечно, "подпрограммы" будет правильнее. В пследних русиках это было поправлено, но, видимо, ещё пользует народ старые версии NB, где это звучит как "шаблон".
Чего-то я не догоняю - это что, рекурсия в головах началась, что ли?
Quote (Сергей)
ну да работает, только в тестовом режиме.
Отчего же? Оформи её как подпрограмму и будет работать в конечном ЕХЕ.
Quote (Alien)
я к "шаблонам сценария" привык, приелось как-то
Ну это ещё у многих "проскакивает по-старинке"...
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
Не рекурсия не пашет, а NB зависает на стадии проверки проекта перед компилляцией, или созданием списка файлов проекта.
А ведь по идее должна работать. По хорошему то. Peter, может есть смысл довести сей несправедливый факт до чуткого уха создателей NeoBook? От лица, так сказать, другой стороны планеты? Например, компилятор мог бы, обнаружив рекурсию, выдавать месагу с вопросом - рекурсия умышленная или по неосторожности? Бум компилить или таки править? "Выделить маркером блок кода, содержащий рекурсию"... ну что-нибудь в таком роде можно же сделать.
По хорошему то. Peter, может есть смысл довести сей несправедливый факт до чуткого уха создателей NeoBook?
Мысль неплохоя. Теоретически. Но в NeoBook полно других недоработок и персепктивных дополнений, гораздо более актуальных, чем эта мелочь! Учитывая относительную неповоротливость разработчиков, рассчитывать на "своевременную" реакцию не следует.
Впрочем, никто не запрещает желающим отписАть письмо в адрес NeoSoft с пожеланием исправления данной "ошибки"!
А ошибки ли?...
Добавлено (27 Май 2010, 22:01) --------------------------------------------- А вообще (если по уму), то конечно же надо их "бомбить" сообщениями о найденных глюках, ошибках и т.д. Это тоже поможет улучшить программу. Несомненно!
- А вам какую операционку поставить - экспи, семерку или висту? - Это ты сейчас о чем? - Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный? - Ну, конечно, надежный! - Вот, значит - экспи, без вопросов! Сейчас сделаем...
(Улицы разбитых фонарей, сезон 10, серия 17)
Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!
При модном втюхе модоподдающимся начинает нравиться
да я имел ввиду функция работает только в тестовом, и ничего сверх того Да и вообще уже разобрались, тему можно на полку, до обнаружения других обстоятельств...