То есть, тут тоже не верно выведено сообщение на экран? Именно, элемент
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Вопрос к знатокам:
будет ли плох вариант с рекурсией?
PHP код:
SearchValueInElemetsArray(array[], search_value, i = 0, array_size = sizeof(array))
{
if(i >= 0 && i < array_size)
{
if(array[i] == search_value)
return i;
else
return SearchValueInElemetsArray(array, search_value, i+1, array_size);
}
else
return -1;
}
Последний раз редактировалось Mazzilla; 24.07.2015 в 08:29.
А вы думаете, вариант с насилованием стека должен быть чем-то лучше?
Во-первых, рекурсия в Pawn не нужна абсолютно. Даже компилятор не полностью умеет с ней работать и не способен определить управляемость рекурсии и рассчитать требуемый размер стека.
Во-вторых, сам стек не резиновый, и если не использовать быдлокодерскую #pragma dynamic, его размер так и будет 16Кб (а компилятор и вовсе останется в пролёте: как я уже говорил, он не умеет рассчитывать требования к стеку при рекурсии).
При каждом вызове функции расходуется как минимум 3 ячейки (12 байт) в стеке: передаётся точка возврата (CIP+cellbits/charbits), текущее значение указателя на начало фрейма стека (регистр FRM) и суммарный размер аргументов функции (чем-то напоминает конвенцию вызова cdecl).
Прибавим 4 аргумента из вашей функции и получим 3+4 = 7 ячеек (28 байт).
А теперь рассчитаем максимальное количество рекурсивных вызовов.
Представим, что ваша функция вызывается прямиком из функции main, там всегда самый наименьший расход стека: всего 2 ячейки (8 байт) - функция не принимает аргументов, а потому суммарный размер аргументов не сохраняется в стеке (по сути для main действует отдельная конвенция вызова, по этой же причине это единственная функция, в которой для возврата используется инструкция ret вместо retn).
Итого получаем: (16384 - 8) / 28 = 584 рекурсивных вызова.
Если в массиве будет больше 584 элементов, ваша рекурсия сфейлится из-за переполнения стека.
В-третьих, тратится лишнее время на копирование аргументов через стек и вызов функции из самой себя.
Некоторые компиляторы высокоуровневых языков (MSVC и Clang, например) умеют заменять рекурсию на цикл, но такой фичи нет в компиляторе Pawn. Этот компилятор разрабатывался всего одним человеком и, на момент выхода версии 3.2.3664, всё ещё находился по развитию на уровне 90-х годов. Все его возможности оптимизации ограничены простымassholepeephole optimizer, который заменяет по нескольку инструкций, и то лишь в пределах одного выражения. Говорить об автоматической замене одних конструкций языка другими здесь и вовсе нет смысла.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
$continue$ (24.07.2015) [ForD] (25.07.2015)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)