GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Tutoriels et références SA:MP => Discussion démarrée par: Xartrick le 16 Mai 2011, 21:53:26
-
Salutations.
Dans ce tutoriel qui ne sera d'ailleurs JAMAIS fini, je vais, ou plutôt nous allons vous apprendre ou du moins, vous aidez à programmer dans les meilleurs conditions.
Le nous fait référence à vous, à moi, car tous le monde peux y participer, à condition d'être dans le sujet et que votre contribution soit utile !
Pour commencer, je vais faire une petite introduction pour vous expliquez, de mon point de vue, la programmation optimisée.
Une bonne partie des notions de ce tutoriel ont déjà était abordé sur le forum par Syg ou encore Sim, je vous encourage d'ailleurs d'aller consulter leurs tutoriels !
Introduction
La programmation optimisée est avant tous, une gestion correct de son code, j'entends par cela, la bonne aération de son code et la compréhension de ce dernier.
Les premiers articles seront consacrés à la programmation dans les meilleurs conditions.
Ce tutoriel sera dédié à tous le monde, car dans ce tutoriel, nous allons essayer de reprendre certaines bases pour bien se comprendre.
Je vous préviens, certaines notions seront misent de côté, car il ne faut pas non plus ne rien connaître.
Donc, le sujet de ce tutoriel, vous l'aurez compris, est la programmation optimisée.
L'indentation
L'indentation permet d'aérer son code pour le rendre plus fluide à la lecture, bien des erreurs peuvent être éviter grâce à cette pratique, qui est d'ailleurs vital si vous voulez travailler dans les meilleurs conditions possibles !
Bien, maintenant que cela est dit, comment indentons-nous un code ? Eh bien, un exemple, puis une explication !
main()
{
new a;
new b;
new c;
a = 1;
b = 2;
c = d(a, b);
}
public d(e, f)
{
return e + f;
}
main()
{
new a;
new b;
new c;
a = 1;
b = 2;
c = d(a, b);
}
public d(e, f)
{
return e + f;
}
Comme vous pouvez le voir, les deux codes suivants sont similaires, ils ne servent pas à grand chose, certes, mais sont un très bon exemple !
Ce qui change, c'est que nous ajoutons une tabulation à chaque fois que nous entrons dans une accolade, donc plus généralement, dans une fonction, une condition, ou encore, une boucle.
Cela permet de rendre plus agréable un code qui est généralement une chose pas très comestible.
À part cela, l'indentation n'a aucun effet sur la compilation du code !
Mais maintenant, un problème se pose !
C:\Documents and Settings\Xartrick\exemple.pwn(40) : error 030: compound statement not closed at the end of file (started at line 3)
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
1 Error.
Voici le code ...
main()
{
new a;
new b;
new c;
a = 1336;
b = 1337;
c = 1338;
if(a == b)
{
if(b == c)
{
if(c == a)
{
}
if(a > b)
{
if(b > c)
{
if(c > a)
{
}
}
}
if(a < b)
{
if(b < c)
{
if(c < a)
{
}
}
}
}
}
Ici, j'ai malencontreusement oublié une accolade, mais où cela ?!
Pour le trouver, nous allons ranger le code !
main()
{
new a;
new b;
new c;
a = 1336;
b = 1337;
c = 1338;
if(a == b)
{
if(b == c)
{
if(c == a)
{
}
if(a > b)
{
if(b > c)
{
if(c > a)
{
}
}
}
if(a < b)
{
if(b < c)
{
if(c < a)
{
}
}
}
}
}
Et oui, il manquait une accolade à la fin, d'un seul coup d'œil, nous l'avons vue !
Pour l'indentation, cela sera tout !
L'espacement
L'espacement du code, tous comme l'indentation, n'a aucun intérêt si ce n'est que d'avoir un code clair et compréhensible.
Pour cette exemple, je vais combiner l'indentation et l'espacement du code !
main(){new a;new b;new c;
a=1;b=2;c=d(a,b);
}
public d(e,f){return e+f;}
Je prends bien évidement un cas extrêmes, mais des personnes programmes comme ceci, et c'est pas joli à voir !
Et maintenant, une forme correct de ce code avec l'indentation et l'espacement correct !
main()
{
new a;
new b;
new c;
a = 1;
b = 2;
c = d(a, b);
}
public d(e, f)
{
return e + f;
}
Donc, l'espacement du code demande seulement d'espacer au maximum les choses qui sont différente, ici, nous séparons les déclarations des affectations.
Les opérateurs sont également espacé !
Il faut savoir que certains programmeur pousse le vice jusqu'au bout, voyez cet exemple !
main ()
{
new a ;
new b ;
new c ;
a = 1 ;
b = 2 ;
c = d ( a , b ) ;
}
public d ( e , f )
{
if ( e > f )
{
return e + f ;
}
else if ( f < e )
{
return f + e ;
}
return 0 ;
}
La déclaration des variables
L'appellation
Cette partie est seulement une préférence personnelle, ceci n'est pas à appliquer obligatoirement !
Comme vous le savez surement déjà, le nom d'une variable doit être alpha-numérique (A-Za-z0-9) et doit toujours commencer par une lettre
Voici quelques déclaration de variable ...
new a; // Déclaration correct
new 8; Déclaration incorrect (commence par un nombre)
new a8; // Déclaration correct
new 8a; // Déclaration incorrect (commence par un nombre)
new a8é; // Déclaration incorrect (é)
new a8e; // Déclaration correct
Pour ma part, j'ai adopté un petit système d'appelation des variables pour pouvoir les identifier au mieux.
J'utilise un système de préfixe pour identifier les différents types de variables, les voici.
i = Integer = Nombres
b = Boolean = Booléen (0 ou 1)
f = Float = Nombres à virgule
s = String = Tableau de char (chaîne de caractères)
a = Array = Tableau
Ainsi, voici plusieurs déclarations de variables et les affectations associés.
new iVariable = 1337; // Variable contenant un nombre entier
new bVariable = 0; // Variable booléene
new fVariable = 13.37; // Variable contenant un nombre à virgule
new sVariable[100] = "Xartrick"; // Variable contenant une chaîne de caractère
new aVariable[100] = 1; // Variable contenant plusieurs valeurs (numéral)
Le nom d'une variable n'affecte pas la façon dont elle fonctionne, elle n'est utilise que visuellement !
L'affectation
Cette partie est facultative étant donné que cette partie n'est que d'ordre général.
Maintenant, la partie la plus intéressante, l'affectation d'une valeur à une variable.
Ici, voici un tableau de taille 10000.
new aArray[10000];
Beaucoup de langage n'affecte pas de valeur de base à leurs variables, ceci est très générant car nous pouvons trouver des valeurs que nous ne souhaitons pas !
Pour m'en rendre compte, j'ai simplement codé un code qui créer un tableau de cette taille et qui vérifie toutes les valeurs de ce tableau et si elle n'est pas égal à 0, on l'inscrit sur la console.
#include <a_samp>
main()
{
new aArray[10000];
new i = 0;
for (i = 0; i < 10000; i++)
{
if (aArray[i] != 0)
{
printf("L'indice %i du tableau vaut %i !", i, aArray[i]);
}
}
}
Résultat, aucune entré, donc toutes la variables sont initialisés à 0 lors de leurs déclarations !
C'est le cas pour le PAWN mais ceci n'est pas la cas pour le C, par exemple !
Exemple de code optimisé et non-optimisé
Code non-optimisé: Pastebin GTAOnline.fr - Outil de collaboration dans le développement (http://pastebin.gtaonline.fr/pastebin.php?show=1156)
Code optimisé: Pastebin GTAOnline.fr - Outil de collaboration dans le développement (http://pastebin.gtaonline.fr/pastebin.php?show=1157)
Participants
- Xartrick
- La déclaration des variables
-
GG pour le tuto
PS : Si on le met sa fait quoi de plus ? LOL
-
Cela permet de rendre plus agréable un code qui est généralement une chose pas très comestible.
Appart cela, l'indentation n'à aucun effet sur la compilation du code !
Sinon, le tutoriel n'est absolument par terminé !
-
idée trés originale Gg
je commence a mieux comprendre ton text perso "Perfectionniste" on va t'appeler the Perfectionniste :p
temps que je te tien ^^ est t'il mieux de faire cela
ou alors cela
???
-
Eu ouais mais j'ai toujours pas pigé cela sére à quoi :lmfao
-
C'est surtout pour toi, quant tu lis ton code tu t'y retrouveras plus facilement par exemple, ou même si tu le partage sa permet au autre de mieux le lire.
-
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(122) : warning 219: local variable "b" shadows a variable at a preceding level
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(123) : warning 219: local variable "c" shadows a variable at a preceding level
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(159) : warning 217: loose indentation
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(159) : error 029: invalid expression, assumed zero
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(159) : error 017: undefined symbol "d"
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(161) : error 017: undefined symbol "e"
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(161) : error 079: inconsistent return types (array & non-array)
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(164) : warning 225: unreachable code
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(164) : error 029: invalid expression, assumed zero
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(164) : error 017: undefined symbol "SetPlayerToTeamColor"
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(165) : error 029: invalid expression, assumed zero
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(165) : error 017: undefined symbol "SetupPlayerForClassSelection"
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(166) : error 029: invalid expression, assumed zero
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(166) : error 017: undefined symbol "SetPlayerTeamFromClass"
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(167) : error 029: invalid expression, assumed zero
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(167) : error 017: undefined symbol "KillsInfo"
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(172) : error 029: invalid expression, assumed zero
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(172) : error 004: function "OnFilterScriptExit" is not implemented
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(174) : error 079: inconsistent return types (array & non-array)
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(179) : warning 225: unreachable code
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(180) : error 001: expected token: ";", but found "{"
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(188) : error 029: invalid expression, assumed zero
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(188) : error 004: function "OnGameModeInit" is not implemented
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(218) : warning 217: loose indentation
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(273) : warning 217: loose indentation
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(454) : error 079: inconsistent return types (array & non-array)
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(457) : warning 225: unreachable code
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(457) : error 029: invalid expression, assumed zero
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(457) : error 004: function "OnGameModeExit" is not implemented
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(464) : error 079: inconsistent return types (array & non-array)
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(467) : warning 225: unreachable code
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(467) : error 029: invalid expression, assumed zero
C:\Users\Miguel\Desktop\Nouveau dossier\gamemodes\cod.pwn(467) : error 004: function "OnPlayerRequestClass" is not implemented
Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
26 Errors.
Marche pas trop le truc :P
-
relit le tuto a moin qu'il y est trop de mot dans ce cas on peu tenter d'en sortir un en image ....
-
Lis la signification de tes warnings, et tu pourra régler tes problèmes seuls ^^
Sympa de ta part Xartrick, je déplace le topic dans Tuto mais pour qu'il y reste tu doit un peu plus l'étoffer ^^
-
Ssk il a juste a lire ^^
Ici, j'ai malencontreusement oublié une accolade, mais où cela ?!
Pour le trouver, nous allons ranger le code !
-
Xartrick,
Je réponds ici, un peu crument, à la question que tu me poses dans un autre topic (Je cite : "j'aimerais bien avoir un retour de ta part.")
Je veux pas faire mon chieur mais j'ai déjà dit l'essentiel sur l'indentation (et d'autres sujets) dans ce topic (http://www.gtaonline.fr/forums/index.php/topic,6250.0.html (http://www.gtaonline.fr/forums/index.php/topic,6250.0.html)) il y 2 ans et demie environs.
Et le perfectionnisme que tu semble affectionner aurait du te pousser à te relire pour corriger les abominables fautes d'orthographe que tu as laissées un peu partout.
Et enfin, pour en venir au sujet, la programmation optimisée n'a rien à voir avec l'indentation (ou les autres sujets dont je parle dans le topic que je cite).
Le sujet est bon car il n'a pas été abordé dans cette partie du forum et car c'est un sujet intéressant.
Quand j'ai vu le titre, j'ai cru que j'allais me régaler .... mais j'ai été déçu.
Ce que tu aurais pu faire, c'est trouver tes propres exemples d'optimisation ou encore rechercher dans le forum ceux qui ont été donnés par Sim, Ssk (Sasuke), ... au fil des posts et en faire une compilation et non te lancer dans un vulgaire plagiat d'un autre sujet.
Mais surtout, si je me permet de faire mon chieur, c'est que la programmation est mon métier depuis plus de 15 ans (sans compter les 15 ans où j'ai fait ça pour mon plaisir).
Donc, gardons le sujet (qui risque d'être passionnant) et repartons sur de bonnes base.
Et d'ailleurs, je me ferais une joie d'être un des participants.
++
Syg
-
Je pense pas quil es tenter de plagier le tien mais en gros il va tout reunir en un seul topic je pense qua la suite il va parler des factorisation puis lutilisation des string ect ect jespere juste quil a vu tes tuto ce de raf et sim ainsi que vos astuce et les recommandation de Ssk dans plusieurs topic
peu etre aussi voir a interpreter les recopandation de Yless
-
Salut,
c'est un peu l'idée que j'avais en tête quand j'ai commencé à écrire ce topic (que je n'ai jamais fini hélas) : http://www.gtaonline.fr/forums/index.php/topic,9575.0.html (http://www.gtaonline.fr/forums/index.php/topic,9575.0.html) (conseils de codage ... )
Le but de départ était de donner des trucs et des conseils pour mieux coder.
Des exemples simples etc.. et aussi parlé des fonctions du langage qui ne sont pratiquement jamais exploitées.
Je serais ravi de contribuer à ce topic.
++Sim++
-
Pour commencer, merci à vous pour déjà vouloir participer à cette expérience.
@cristab: Je note ton intervention, je l'inclurais au plus vite !
@Syg: Comme je le dis dans les premières lignes, ceci n'est pas de la programmation avancé mais des pré-requis pour travailler dans les meilleurs conditions.
Pour mon orthographe, excuse-moi, cela n'est pas mon fort.
Je tiens également à te dire que je n'ai en aucun cas plagié ton tutoriel, et comme je l'ai dis, ces notions ont déjà certainement était déjà vue par toi et bien d'autres.
Une bonne partie des notions de ce tutoriel ont déjà était abordé sur le forum par Syg ou encore Sim, je vous encourage d'ailleurs d'aller consulter leurs tutoriels !
-
Le plagiat n'est pas forcément intentionnel, c'était juste un constat de ma part. Et ce n'est pas la peine de répété ce qui a déjà été dit.
Ensuite, ce topic s'intitule "La programmation optimisée". Il sera donc bien d'en parlé.
Un cours dur l'indentation ou sur les fonctions ne font pas partie de la programmation optimisée.
Je vais essayer de trouver une exemple de programmation optimisée.
++
Syg
-
abandonner :( ??
-
A priori oui, je n'ai pas pris le temps de trouver un exemple comme je l'avais dit et Xartick semble avoir laissé tomber.
++
Syg
-
J'ai un peu perdu l'envie de faire ce tutoriel, et je n'étais pas très présent ces derniers jours.
-
J'ai ajouté un exemple qui montre parfaitement l'intérêt de l'optimisation.