Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 2 ПерваяПервая 1 2
Показано с 11 по 14 из 14
  1. #11
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    То есть, тут тоже не верно выведено сообщение на экран? Именно, элемент


  2. #12
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Bublik_Public Посмотреть сообщение
    То есть, тут тоже не верно выведено сообщение на экран? Именно, элемент

    Скорее всего, просто забыли знак "№" или "#".
    Либо пропустили специально, чтобы не путать новичков, и без того слабо разбирающихся в синтаксисе языка (хотели, как лучше, а получилось...)
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. #13
    Аватар для Mazzilla
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.11.2013
    Адрес
    Нижневартовск
    Сообщений
    256
    Репутация:
    63 ±
    Вопрос к знатокам:
    будет ли плох вариант с рекурсией?
    PHP код:
    SearchValueInElemetsArray(array[], search_value0array_size sizeof(array))
    {
        if(
    >= && array_size)
        {
            if(array[
    i] == search_value)
                return 
    i;
            else
                return 
    SearchValueInElemetsArray(array, search_valuei+1array_size);
        }
        else
                return -
    1;

    Последний раз редактировалось Mazzilla; 24.07.2015 в 08:29.

  4. #14
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Mazzilla Посмотреть сообщение
    Вопрос к знатокам:
    будет ли плох вариант с рекурсией?
    PHP код:
    SearchValueInElemetsArray(array[], search_value0array_size sizeof(array))
    {
        if(
    >= && array_size)
        {
            if(array[
    i] == search_value)
                return 
    i;
            else
                return 
    SearchValueInElemetsArray(array, search_valuei+1array_size);
        }
        else
                return -
    1;

    А вы думаете, вариант с насилованием стека должен быть чем-то лучше?

    Во-первых, рекурсия в 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-х годов. Все его возможности оптимизации ограничены простым asshole peephole optimizer, который заменяет по нескольку инструкций, и то лишь в пределах одного выражения. Говорить об автоматической замене одних конструкций языка другими здесь и вовсе нет смысла.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. 2 пользователя(ей) сказали cпасибо:
    $continue$ (24.07.2015) [ForD] (25.07.2015)
 

 
Страница 2 из 2 ПерваяПервая 1 2

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •