Использование #pragma
Всем привет, сегодня я научу вас как правильно использовать #pragma, многие думают что данная директива устраняет ошибки и предупреждения компилятора, но на самом деле это не так.
Что такое #pragma
На самом деле #pragma используется для изменения настроек компилятора, эта директива не как не устраняет ошибки или предупреждения отправляемые компилятором.
Я часто замечаю советы людей использовать #pragma, для устранения предупреждений или ошибок, посылаемые компилятором.
С помощью директивы #pragma вы можете только скрыть некоторые предупреждения и ошибки, на самом деле проблемы останутся в вашем коде, и не исчезнут волшебным способом.
В своем уроке я расскажу все что знаю о #pragma и как избежать её использовать.
#pragma dynamic
Самая популярная из всех существующих.
PHP код:
#pragma dynamic 1000000
Динамически устанавливает параметр размера стека.
Иногда вы можете получить при компилировании своего скрипта такое уведомление:
PHP код:
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
Header size: 19036 bytes
Code size: 1327124 bytes
Data size: 43915204 bytes
Stack/heap size: 16384 bytes; estimated max. usage: unknown, due 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(playerid, response, listitem, inputtext[])
{
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;
}
Пример правильной табуляции
PHP код:
Dialog:ElectricRadio(playerid, response, listitem, inputtext[])
{
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_).