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

    Статус
    Оффлайн
    Регистрация
    25.01.2015
    Сообщений
    3
    Репутация:
    0 ±

    Использование #pragma

    Использование #pragma

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

    Что такое #pragma

    На самом деле #pragma используется для изменения настроек компилятора, эта директива не как не устраняет ошибки или предупреждения отправляемые компилятором.

    Я часто замечаю советы людей использовать #pragma, для устранения предупреждений или ошибок, посылаемые компилятором.
    С помощью директивы #pragma вы можете только скрыть некоторые предупреждения и ошибки, на самом деле проблемы останутся в вашем коде, и не исчезнут волшебным способом.

    В своем уроке я расскажу все что знаю о #pragma и как избежать её использовать.

    #pragma dynamic

    Самая популярная из всех существующих.

    PHP код:
    #pragma dynamic 1000000 
    Динамически устанавливает параметр размера стека.
    Иногда вы можете получить при компилировании своего скрипта такое уведомление:

    PHP код:
    Pawn compiler 3.2.3664              Copyright (c1997-2006ITB CompuPhase

    Header size
    :          19036 bytes
    Code size
    :          1327124 bytes
    Data size
    :         43915204 bytes
    Stack
    /heap size:      16384 bytesestimated maxusageunknowndue to recursion
    Total requirements
    :45277748 bytes 
    Это предупреждение связано с редкими массивами, ненужных размеров и строк с использованием большого объема данных.

    Например вы выделяете под стринговую область 2000 ячеек, а вам нужно всего 256:

    Пример не правильного использования области памяти.
    PHP код:
    new string[2024];
    format(string,sizeof(string),"%s, игрок зашел на сервер. По-приветствуем игрока."GetPlayerNameEx(playerid)); 
    Пример правильно использования.
    PHP код:
    new string[50+MAX_PLAYER_NAME+1];
    format(string,sizeof(string),"%s, игрок зашел на сервер. По-приветствуем игрока."GetPlayerNameEx(playerid)); 
    Так же рассмотрим пример с большим не нужным выделением слотов в массиве.

    Пример не правильного использования
    PHP код:
    #define MAX_CARS 1000
    #define MAX_CAR_ITEMS 100
    new CarItem[MAX_CARS][MAX_CAR_ITEMS][CAR_ITEM_DATA]; 
    Спросите себя: Действительно ли вы должны использовать все это пространство?

    Этот массив примерно 400 килобайт, не включая данные счетчиков.
    Это очень много по сравнению с сегодняшним меркам, конечно все это можно сократить в 10 или даже 50 раз.

    Пример правильно использования.
    PHP код:
    #define MAX_CARS 1000
    new CarItem[MAX_CARS 40][CAR_ITEM_DATA]; 
    Размер этого массива теперь 40 килобайт, в отличие от 400 килобайт другого массива.

    1 ячейка - 4 байта.

    #pragma tabsize

    Так же самая популярная директива среди рлсбыдлокдеров

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

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

    Пример плохой табуляции
    PHP код:
    Dialog:ElectricRadio(playeridresponselistiteminputtext[])
    {
    if (
    response)
        {
    new 
    vehicleid GetPlayerVehicleID(playerid);

            if (
    GetPlayerState(playerid) != PLAYER_STATE_DRIVER || !IsEngineVehicle(vehicleid))
                  return 
    0;

    switch (
    listitem)
    {
    case 
    0SetVehicleRadio(vehicleid"http://72.13.83.151/");
    case 
    1SetVehicleRadio(vehicleid"http://173.192.207.51:8062/");
    case 
    2SetVehicleRadio(vehicleid"http://212.83.60.202:8000/");
    }
        }
        return 
    1;

    Пример правильной табуляции
    PHP код:
    Dialog:ElectricRadio(playeridresponselistiteminputtext[])
    {
        if (
    response)
        {
            new 
    vehicleid GetPlayerVehicleID(playerid);

            if (
    GetPlayerState(playerid) != PLAYER_STATE_DRIVER || !IsEngineVehicle(vehicleid))
                  return 
    0;

            switch (
    listitem)
            {
                case 
    0:
                    
    SetVehicleRadio(vehicleid"http://72.13.83.151/");

                case 
    1:
                    
    SetVehicleRadio(vehicleid"http://173.192.207.51:8062/");

                case 
    2:
                    
    SetVehicleRadio(vehicleid"http://212.83.60.202:8000/");
            }
        }
        return 
    1;

    Вывод

    Не используйте #pragma для исправления предупреждений и ошибок компилятора.

    Если я что то упустил или не правильно написал укажите об этом, так же я указал только основные проблемы, если кто то предложить еще варианты я могу дополнить тему.

    Автор: makarov (Некоторые материалы были взяты у Emmet_).
    Последний раз редактировалось makarov; 08.05.2015 в 17:20.

  2. #2
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    #pragma - функция? Я всегда считал ее директивой.

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

    Статус
    Оффлайн
    Регистрация
    25.01.2015
    Сообщений
    3
    Репутация:
    0 ±
    Цитата Сообщение от Darge Посмотреть сообщение
    #pragma - функция? Я всегда считал ее директивой.
    Спасибо за поправку.

  4. #4
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Вот лично мне бы хотелось услышать об #pragma rational
    PHP код:
    #pragma rational Float /* floating point format */
    #pragma rational Fixed(3) /* fixed point, with 3 decimals */ 
    Я про них вычитал в оф. документации, пытался понять, но ничего не понял.

    Оф. документация, стр. 89

  5. #5
    Аватар для makarov
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.01.2015
    Сообщений
    3
    Репутация:
    0 ±
    Цитата Сообщение от Darge Посмотреть сообщение
    Вот лично мне бы хотелось услышать об #pragma rational
    PHP код:
    #pragma rational Float /* floating point format */
    #pragma rational Fixed(3) /* fixed point, with 3 decimals */ 
    Я про них вычитал в оф. документации, пытался понять, но ничего не понял.

    Оф. документация, стр. 89
    Это не для этой темы и вообще не рекомендуется, для новичков и даже опытных, изменять этот параметр, он по умолчанию задан во float.inc.

    // Тутор обновлен были неточности
    Последний раз редактировалось makarov; 05.05.2015 в 19:48.

  6. #6
    Аватар для Paradox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.06.2015
    Адрес
    Запорожье
    Сообщений
    117
    Репутация:
    1 ±
    ну не скажи, если говорить конкретно про #pragma и не уточняя какую, то вот эта все же #pragma tabsize исправляет предупреждения табуляции.

  7. #7
    Аватар для #Vito
    #define

    Статус
    Оффлайн
    Регистрация
    14.09.2013
    Адрес
    Одесса
    Сообщений
    129
    Репутация:
    38 ±
    Цитата Сообщение от Paradox Посмотреть сообщение
    ну не скажи, если говорить конкретно про #pragma и не уточняя какую, то вот эта все же #pragma tabsize исправляет предупреждения табуляции.
    Она их не исправляет, а просто скрывает.
    Skype: vitya.saveliev


  8. #8
    Аватар для Niko_Grey
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.03.2014
    Сообщений
    40
    Репутация:
    1 ±
    Цитата Сообщение от #Vito Посмотреть сообщение
    Она их не исправляет, а просто скрывает.
    Она устанавливает размер табуляции, вроде..

  9. #9
    Аватар для NewGreen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    По большей части, подобные мануалы просто вводят в заблуждение, читайте книги

    1. #pragma dynamic

    PHP код:
    Stack/heap size:      16384 bytesestimated maxusageunknowndue to recursion 
    Это предупреждение связано не только с лишними массивами и т.п., по большей части выводится из за рекурсии типа:

    PHP код:
    stock helloRecursion(num)
    {
         
    helloRecursion(num 1);

    2. С чего вы взяли что массив стал меньше ?
    если за место выражения MAX_CARS * 40 поставить результат этого выражения получится CarItem[40000][100] что равно 16 миллионов байт! Скомпилируйте этот код и взгляните на строку уведомления Data size: чтобы убедится.
    PHP код:
    #define MAX_CARS 1000 
    new CarItem[MAX_CARS 40][CAR_ITEM_DATA]; 
    Лучше вместо этого изменить размер константы MAX_CARS установив меньшее значение.
    Подсчитать занимаемый размер двумерного массива можно так:

    array[x][y] => x * y * 4 = array[MAX_CARS][CAR_ITEM_DATA] = (1000 * 100) * 4 = 100000 * 4 = 400000 байт = 390 КБайт

    array[x][y] => x * y * 4 = array[MAX_CARS * 40][CAR_ITEM_DATA] = (40000 * 100) * 4 = 4000000 * 4 = 16000000 байт = 15625 КБайт = 15 МБайт.

    15 Мегабайт - это память занимаемая вашей переменной!
    Последний раз редактировалось NewGreen; 16.06.2015 в 13:48. Причина: Убрал лишнее

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    2. Зачем заставлять сервер каждый раз, при объявлении переменной, определять её размер через сложение заранее известных константных значений ?
    PHP код:
    new string[50+MAX_PLAYER_NAME+1]; 
    рациональнее сразу сложить и задать нужный размер:
    PHP код:
    new string[75]; 
    А теперь докажите, что вычислением константных выражений занимается сервер, а не компилятор.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 
Страница 1 из 3 1 2 3 ПоследняяПоследняя

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

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

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

Ваши права

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