[Tutorial] #pragma
#1

Yo.

C'est un petit tuto assez simple qui vous explique а quoi servent chacune des directives pragma disponibles et utiles.

La directive #pragma

La directive #pragma est l'une des directives les plus complexes du PAWN puisqu'au mкme titre que #emit, interagit directement avec le compilateur (certes, d'une autre faзon qu'en P-Code).
Ce tutoriel vous prйsentera toutes les directives #pragma utilisables pour SA-MP et leur utilitй.

#pragma amxlimit value

Cette directive permet de mettre а value la taille totale du fichier amx а ne pas dйpasser (а voir si elle peut кtre йgalйe toutefois).

Exemple d'utilisation :

[pawn]
#pragma amxlimit 3000000
[/pawn]

Effet : Fait en sorte que la taille du fichier amx soit de 3Mb au maximum


#pragma amxram value

Cette directive permet de mettre а value la taille que les enregistreurs DATA et STACK (STK) sont autorisйs а utiliser. Par extension, elle fixe la limite de RAM allouйe au script (puisque seuls le STACK et les variables locales font appel а de la mйmoire RAM supplйmentaire).
Pour ceux qui ne le sauraient pas, l'enregistreur DATA est l'enregistreur qui contient toutes les variables locales et statiques locales. L'enregistreur STACK, quand а lui, reprйsente la "pile" de la mйmoire du script. Chaque argument de fonction, pour кtre utilisй, est "pushй" (ajoutй au sommet de la pile). Grвce а cette directive, vous pouvez contrфler la taille maximale de la pile pour йviter les collisions entre le stack et le heap.

Exemple d'utilisation :

[pawn]

#pragma amxram 470000

[/pawn]

Effet: Fixe la taille maximale de DATA et de STK (STACK) а 470'000 bytes (470Kb)

#pragma codepage name/value

Cette directive aura pour effet de changer le charset utilisй pour le script (par dйfaut, ANSI/Western/1252).

Thйoriquement, un serveur franзais n'aura jamais besoin de cette directive puisque le charset par dйfaut fait trиs bien l'affaire.
Toutefois, voici quelques exemples d'utilisation de la directive :

[pawn]

#pragma codepage Arabic // Йquivalent а #pragma codepage 1256 sous Windows

[/pawn]

Effet : Passera le charset utilisй а "Arabic". Les caractиres utilisйs dans le script mais ne figurant pas sur le charset "Arabic" seront saquйs et transformйs en code illisible avec des carrйs, des '?' etc.

[pawn]

#pragma codepage Western // Йquivalent а #pragma codepage 1252 sous Windows

[/pawn]

Effet : Remettra le charset ANSI (utilisй par dйfaut).

Une petite recherche ****** vous donnera tous les noms de charset utilisables (et leur valeur). Pour ma part, j'utilise celle de Sublime Text 3 qui est celle-ci :

[Image: 487270charset.png]

#pragma compress value (0/1)

Cette directive aura pour effet d'activer ou non la compression, effectuйe post-compilation, qui permet de rendre plus petit le fichier AMX final. Activйe par dйfaut
Le seul intйrкt de cette directive est de pouvoir mieux comprendre le code AMX. Ne jamais compiler un gamemode pour un serveur ou que vous partagez avec #pragma compress 0.
Un code AMX dйcompressй peut кtre explorй avec un йditeur hexadйcimal.

Exemple :

[pawn]

#pragma compress 0

[/pawn]

Effet: Dйsactive la compression du fichier AMX.

#pragma ctrlchar caractиre

Cette directive aura pour effet de dйfinir le caractиre de contrфle а caractиre.
Le caractиre doit кtre un caractиre ascii. Vous pouvez donc utiliser la valeur dйcimale du nombre ET son symbole ascii.
Par dйfaut, le caractиre de contrфle est '\' (backslash).

Exemple :

[pawn]

#pragma ctrlchar '$' // Йquivalent de #pragma ctrlchar 36

[/pawn]

Effet: Dira au compilateur que le caractиre de contrфle n'est plus '\' mais '$'.
Ce qui fait que le caractиre '\n' deviendra '$n', que '\r\n' deviendra '$r$n', et que '\"' deviendra '$"', etc.



#pragma deprecated symbol

Cette directive dira au compilateur que l'utilisation de "symbol" (qui peut кtre une fonction (publique ou non) ou une variable (locale ou globale)) est obsolиte, et gйnйrera un warning.
La principale utilisation de cette directive est pour indiquer а l'utilisateur que son script utilise une ancienne version de la librairie.

Exemples:

[pawn]

#pragma deprecated variable

new variable = 26;
printf("%d", variable);
new dest[3];
valstr(dest, variable);

[/pawn]

Effet: Le compilateur gйnйrera un warning а chaque fois que "variable" sera utilisйe (deux fois ici).

[pawn]

#pragma deprecated strtok

// dans OnPlayerCommandText

if(!strcmp(cmdtext, "/acheter", true))
{
new tmp[128], idx;
tmp = strtok(cmdtext, idx);
if(tmp[0] == 0) return SCM(playerid, -1, "SYNTAXE : /acheter [Item]");
}[/pawn]

Effet: Le compilateur gйnйrera un warning а chaque fois que la fonction "strtok" sera utilisйe (une fois ici).


#pragma dynamic value

Cette directive aura pour effet de changer la quantitй de mйmoire allouйe au stack (donc aux donnйes dynamiques). Si vous utilisez la directive #pragma amxram en parallиle et que la valeur spйcifiйe ici est supйrieure а la valeur spйcifiйe pour #pragma amxram, votre script va juste planter lamentablement.

Cette directive doit кtre utilisйe dans deux cas bien prйcis :

Code:
Code size:            24836 bytes
Data size:           253260 bytes
Stack/heap size:      16384 bytes; estimated max. usage=128 cells (512 bytes)
Total requirements:  296108 bytes

• Vous rйcupйrez un message de ce type а la compilation alors que vous n'avez spйcifiй aucune compilation en d2 ou d3

• Vous savez exactement ce que vous faites en manipulant la mйmoire allouйe au PAWN


Exemple:

[pawn]

#pragma dynamic 16000

[/pawn]

Effet: Limitera la quantitй de mйmoire allouйe au stack а 16'000 bytes (16 Kb).


#pragma library name

Cette directive demandera au compilateur de chercher dans le dossier plugins une librairie au format .so ou .dll appelйe name. Cette directive doit кtre utilisйe avant chaque dйclaration native de code provenant d'un plugin. Notez qu'elle ira directement chercher dans le dossier plugins, puisque SA-MP utilise une version modifiйe du compilateur PAWN.
Elle doit кtre йgalement utilisйe si vous devez apporter des modifications du type hook, remplacement ou vйrifications de base а vos natives de plugin avant de les utiliser.

Exemple:

[pawn]

#pragma library monPlugin

native monPlugin_native1();
native monPlugin_native2(playerid);
native monPlugin_native3(...);

[/pawn]

Effet: Demandera au compilateur d'aller chercher des informations (ici, natives) dans la librairie "monPlugin".


#pragma pack value(1/0)

Cette directive йchangera la signification de " et de !" pour dйclarer des string.
Par dйfaut, cette valeur est а zйro je crois et veut dire : " dйclare des string normales et !" des packed string.
Si passй а 1, ce paramиtre voudra dire !" dйclare des string normales et " des packed string.
Ca n'est utile que dans le cas oщ vous utilisez plus (+) les packed string que les string normales.

Exemple:

[pawn]

#pragma pack 1

[/pawn]

Effet: " dйclare des string normales et !" des packed string.


#pragma rationnal tagname(value)

Cette directive changera le tag utilisй pour les nombres rationnels а tagname. Si le paramиtre optionnel value est spйcifiй, cela limitera le nombre de dйcimales possibles pour un nombre rationnel а value. Dans le cas contraire, les nombres rationnels auront le droit au nombre de dйcimales spйcifiй dans la norme IEEE 754 (9, je crois).
La configuration par dйfaut du SA-MP PAWN est la suivante : #pragma rationnal Float:, au cas oщ vous feriez de mauvaises manipulations.

Exemples:

[pawn]

#define flottants:

#pragma rationnal flottants:

[/pawn]

Effet: Les nombres flottants devront maintenant кtre dйclarйs avec le tag flottants: et non plus le tag Float:


[pawn]

#define float:

#pragma rationnal float:(6)

[/pawn]

Effet : Les nombres flottants devront maintenant кtre dйclarйs vec le tag float: et ne devront pas avoir plus de 6 dйcimales.

[pawn]

#pragma rationnal Float:(6)

[/pawn]

Effet : Les nombres flottants ne devront dorйnavant plus avoir que 6 dйcimales au maximum.


#pragma semicolon value (0/1)

Cette directive modifiera le fait que les ';' soient obligatoires pour exйcuter une instruction si et seulement si cette instruction est seule sur une ligne. Les ';' seront toutefois obligatoires pour sйparer plusieurs instructions sur la mкme ligne.
Par dйfaut, le paramиtre est а 1. Le mettre а zйro signifiera rendre les ';' optionnels.
C'est utile si vous venez d'un autre langage de programmation, qui lui n'utilise pas de ';' (le Python par exemple).

Exemple:

[pawn]

#pragma semicolon 0

[/pawn]

Effet : Rendra optionnel l'usage de point-virgules а la fin d'une instruction seule sur sa ligne.


#pragma tabsize value

On ne prйsente plus cette directive, heureusement de moins en moins utilisйe actuellement, qui permet de modifier la valeur du nombre d'espaces d'une pression sur la touche "TAB".
Elle est surtout utile dans le cas oщ le code est indentй avec des espaces (tapйs а la main) et avec des tabulations.
Par dйfaut, cette valeur est а 8.
La mettre а zйro aura pour effet de "dйsactiver" l'indentation (compile-time йvidemment).

Dans tous les cas, cette directive a йtй crййe pour йviter (de la faзon la plus intelligente ou non) de subir des warnings 217 а cause d'un code mal indentй.

Exemples:

Utilisation intelligente

[pawn]

#pragma tabsize 6

stock fonction()
{
printf("Cette ligne a йtй indentйe avec des espaces.");
printf("Cette ligne a йtй indentйe avec une pression sur TAB.");
}

[/pawn]

Utilisation de fainйant

[pawn]

#pragma tabsize 0

stock fonction()
{
new str[35];
strcat(str, "Ce code ");
strcat(str, "n'est pas");
strcat(str, "indentй");
strcat(str, "correctement !");
printf(str);
return;
}

[/pawn]

Effet: Dans les deux exemples, l'utilisation de la directive йvitera de se retrouver avec des warnings de code mal indentй.


#pragma unused symbol

Cette directive, autrefois autant utilisйe par les fainйants que #pragma tabsize 0, permet de ne plus avoir de warnings а cause d'un symbol (fonction/variable) dйclarйe mais non utilisйe.
Les gens pensant а l'optimisation ne dйclareront que des variables qui sont nйcessaires et prйfйreront utiliser stock que #pragma unused, mais il y a un cas oщ cette directive s'avиre nйcessaire, c'est si un paramиtre de fonction n'est pas utilisй.

Exemples:

Utilisation intelligente :

[pawn]

CMD:bonjour(playerid, params[])
{
#pragma unused playerid, params
return SendClientMessageToAll(-1, "Bonjour");
}

CMD:monnom(playerid, params[])
{
#pragma unused params
new name[21];
GetPlayerName(playerid, name, 21);
return SendClientMessageToAll_(-1, "Je m'appelle %s !", name);
}
[/pawn]

Utilisation de fainйant

[pawn]

new variable;

#pragma unused variable
[/pawn]

Effet: Dans les deux exemples, la directive permettra de ne pas avoir de warnings 203 "symbol is never used" а cause d'une variable non utilisйe.

Remerciements

• pawn_lang.pdf
• wiki SA-MP

J'ai volontairement omis deux directives : #pragma overlay et #pragma align. La raison est simple : le compilateur pawn modifiй utilisй par SA-MP ne supporte pas ces directives pour la bonne raison que le SA-MP n'aura jamais besoin de ces deux directives. Pour plus d'informations а leur sujet, lisez pawn_lang.pdf (****** it)
Reply
#2

bg. mici t trop fort mnt.
Reply
#3

Pour le #pragma tabsize:
"Par dйfaut, cette valeur est а 8."
Quand j'appuis sur tab зa me fait une distance de 4 espaces pour ma part !

Sinon merci pour le reste !
Tu travailles dans la programmation ? Tu en connais un paquet en tout cas ;)
Reply
#4

Trиs bon tuto.
Reply
#5

@Damien :

Pour ta 1re remarque, le compilateur voit 8 espaces si #pragma tabsize n'est pas utilisй. Ce que tu vois а l'йcran n'est que purement "design".
Pour ta 2e remarque, je vais seulement passer en 1re.

@Noliax, Dark_Rider : Merci.
Reply
#6

T'йtais qu'en seconde au lycйe?
Woaw.
J'passe en terminal SEN et j'y connais pas grand chose comparй а toi ;)
Reply
#7

Il suffit de s'y mettre et d'кtre curieux dans l'domaine. Il y a tellement de ressources sur le net qu'on peut presque tout apprendre sans passer dans des йcoles.
Reply
#8

suffit d'кtre un sacrй fils de pute avec une grosse paire de couille !

gg fwatй
Reply
#9

Merci du tuto !
Reply
#10

Trиs utile et bien expliquй, merci!
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)