Developpement Amateur de SpixSh@dow |
|
| [Cours 01] Presentation d'un code source. | |
| | Auteur | Message |
---|
Sekoda Admin
Nombre de messages : 1631 Date d'inscription : 04/01/2007
| Sujet: [Cours 01] Presentation d'un code source. Dim 11 Fév - 21:27 | |
| Bonjour,nous allons commencer notre cours par la presentation d'un code source et de tout les elements qui le constituent. Ainsi que ce que j'appelle la norme de presentation (pour eviter d'avoir des codes chaotiques et indebuggables ). Voici un code source de base. - Code:
-
/* ** cours_01.c for Cours 01 in /u/ept1/my_docs/cours_01 ** ** Made by Sekoda MasGaNo. ** Login <Sekoda> ** ** Started on Sun Feb 11 17:26:20 2007 sekoda masgano ** Last update Sun Feb 11 17:26:20 2007 sekoda masgano */
int main(int ac, char **av) { return (0); }
Dernière édition par le Dim 18 Fév - 20:10, édité 5 fois | |
| | | Sekoda Admin
Nombre de messages : 1631 Date d'inscription : 04/01/2007
| Sujet: Re: [Cours 01] Presentation d'un code source. Dim 11 Fév - 21:27 | |
| HeaderLa premiere partie est ce qu'on appelle le Header. Il constitue toutes les informations relatives au fichier code source, avec deja le nom du fichier, le nom du projet et sa destination dans vos dossiers. Puis il y a le nom de la personne qui s'est occupe de ce fichier (cela permet notamment de la contacter en cas d'incomprehension du code dans un projet d'equipe). Pour finir, il y a la date de creation et de modification. A savoir ce header est genere automatiquement par mon Editeur de texte. Sur d'autre programme, la presentation peut differer. Par contre si vous voulez faire un header manuel, je vous conseille de mettre au moins le nom du fichier, le nom du projet pour eviter la confusion et le nom du createur du code. (pour les projets d'equipe). Je vous recommande de vous habituez a le faire des maintenant . A savoir, les symboles - Code:
-
/* ** ** */
representent des commentaires. Entre "/*" et "*/", vous pouvez ecrire ce que vous voulez afin de vous informer vous ou vos equipiers sur ce que vous voulez (notamment le header ). Les "**" sont la pour rendre plus lisible le code. Ils sont a places en debut de ligne, afin de bien montrer que nous sommes toujours dans un commentaire. Remarque : Si jamais votre commentaire ne depasse pas une ligne, vous pouvez utiliser : - Code:
-
//
Dernière édition par le Dim 11 Fév - 22:02, édité 4 fois | |
| | | Sekoda Admin
Nombre de messages : 1631 Date d'inscription : 04/01/2007
| Sujet: Re: [Cours 01] Presentation d'un code source. Dim 11 Fév - 21:28 | |
| MainEnsuite, plus bas dans le code, nous pouvons voir - Code:
-
int main(int ac, char **av) Quand vous developper un jeu, il n'est pas rare (ca arrive tout le temps, a vrai dire...) que vous possedez plusieurs fichiers avec tous plein de fonctions differentes et avec des noms qui vous sont propres. Ainsi, le compilateur ne sait pas par ou commencer. C'est pourquoi, il existe la fonction - Code:
-
main C'est magique . Le compilateur commencera a compiler a partir de cette fonction C'est pour cette raison, qu'il doit toujours avoir cette fonction de creer et UNE seule par programme. Autrement le pauvre compilateur ne saura plus par ou commencer (retour a la case depart ).
Dernière édition par le Dim 11 Fév - 21:32, édité 2 fois | |
| | | Sekoda Admin
Nombre de messages : 1631 Date d'inscription : 04/01/2007
| Sujet: Re: [Cours 01] Presentation d'un code source. Dim 11 Fév - 21:28 | |
| Fonctions Que dites-vous ? C'est quoi une fonction J'ai ete un peu rapide a ce niveau-la. Une fonction est la partie du code qui va realiser toutes les operations que vous allez lui demander. Il est donc evident que si vous demander des operations en-dehors des fonctions, ne vous attendez pas a ce qu'il le fasse (et encore, c'est seulement si vous arrivez a compiler ) Tout est fonction donc ! Le programme voyage de fonction en fonction pour faire ce qu'il a a faire Par contre eviter de creer une fonction inutile du genre : - Code:
-
int add(int a, int b) { int a; int b;
return (a + b); }
Qu'ai-je fait Je viens de creer une fonction inutile qui additionne deux variables (je vous expliquerai ce que c'est ). Les additions peuvent tres bien se faire directement dans votre code . A savoir, passer d'une fonction a une autre ralentis le programme (bon ce n'est pas visible mais quand meme ). Creer une fonction est utile si jamais vous voulez qu'une operation soit repetee plusieurs fois dans votre programme et pour eviter de recoder le meme code a tout bout de champs, creez la qu'une seule fois dans une fonction, et cette operation ne fera plus qu'une seule ligne dans votre code . - Code:
-
int main(int ac, char **av) { return (0); } Donc en gros, nous venons de creer une fonction main, de type int et qui contient entre ses "{ }" toutes les operations qu'elle doit realiser, a savoir, retourner la valeur 0. Fantastique ! Ne jamais creer deux fonctions differentes avec le meme nom. C'est la meme histoire que pour le "main" : le programme ne saura pas ou aller ! Les fonctions sont aussi utiles pour aerer votre code. Il est tout a fait exclue que vous developper tout votre programme dans la fonction "main" !. Cela deviendrait trop illisible, et le jour ou vous avez un bug, soit je ne serais plus la et vous etes bons pour recommencer , soit vous etes tres tres fort et vous arriver a trouver la fameuse aiguille dans une botte de foin . Personnellement, je me limite a maximum 40-50 lignes par fonctions. 25 seraient l'ideal On appelle prototype la partie qui déclare la fonction en donnant son type, son nom et ses arguments. Ainsi : - Code:
-
int add(int a, int b) est le prototype de la fonction "add".
Dernière édition par le Mar 6 Mar - 5:00, édité 7 fois | |
| | | Sekoda Admin
Nombre de messages : 1631 Date d'inscription : 04/01/2007
| Sujet: Re: [Cours 01] Presentation d'un code source. Dim 11 Fév - 21:35 | |
| Types Qu'est-ce qu'un type Ce qu'il faut retenir, c'est que toutes les valeurs qu'on manipule sont stockees dans des boites appelees "Variable". Exemple : votre horloge. Elle contient 3 variables. Qu'est-ce qu'il raconte ? Mon horloge n'a pas trois boites en elles Exacte ! Car ces boites la sont virtuelles Ce sont tout simplement les Heures, Minutes et Secondes. Ainsi, a minuit, nous avons quelque chose du genre : - Code:
-
heures = 0; minutes = 0; secondes = 0;
Toutes les 1 seconde, secondes = secondes + 1; Si jamais secondes = 60, alors secondes = 0 et minutes = minutes + 1; Si jamais minutes = 60, alors minutes = 0 et heures = heures + 1; Si jamais heures = 24, alors heures = 0;
C'est assez clair ? Donc en gros, une variable est une petite information temporaire qu'on stocke dans la RAM. . Tout simplement. (ça c'est pour la partie materielle). On dit qu'elle est "variable" car c'est une valeur qui peut changer pendant que le programme s'éxécute ou se déroule. Exemple: Dans un Space Invader, ou un Zelda, on devra definir un nombre de vie au debut du jeu. Disons qu'au debut du jeu vie = 3. Au fur et à mesure du jeu, ce nombre peut diminuer (si on se prend des coups) ou augmenter (si on trouve des bonus). Si il atteint 0, on a donc vie = 0, notre personnage meurt. Dans le code, on aura donc une condition, qui dit : "Si on a vie = 0, alors le jeu s'arrete, et on envoie le Game Over". Donc pour retenir : une variable est faite de deux choses : ---> Elle a une valeur : c'est le nombre qu'elle stocke, par exemple 3. ---> Elle a un nom : c'est ce qui permet de la reconnaître, par exemple vie. Pour resumer : Une variable est une information qui change, varie pendant que le programme se deroule. Il faut donc nommer cette variable et lui attribuer une valeur. Cepedant, on a plusieurs sortes de valeurs existantes en C : - Code:
-
int : valeur entiere (nombre entier) char : valeur alphanumerique (caracteres) float : valeur reele (nombre a virgules) long : int avec une plus grande portee double : float avec une plus grande portee unsigned + type : on ne garde que la valeur positive de la variable, augmentant ainsi sa portee.
Je ne vous parlerais pas des combinaisons de type car ce n'est pas utile ici . Qu'est-ce que tu veux dire par portee Ben, comme toute chose, les variables ont leur limite. En effet, un int ne pourra contenir des valeurs entre "-2147483648" et "2147483647", par exemple. Donc selon le type de variable, vous ne pourrez mettre qu'une valeur plus ou moins grande. Le "unsigned int" contiendra donc des valeurs entre "0" et "4294967295". Mais je vous rassure, c'est largement suffisant pour 90% des programmes Vous vous imaginez, un personnage ayant 4294967295 de force Pourquoi utiliser des "int" et des "float" si on peut utiliser des "long" et des "double" tout simplement parce que cela a un prix Bon, ne regardez pas votre compte en banque, car ce n'est pas ce prix la dont je parlais (pour une fois... ). C'est au niveau de la RAM . En effet, si les "long" ou les "double" ont plus de portee, c'est tout simplement parce qu'ils prennent plus de memoire vive . Donc une utilisation judicieuse des variables est recommandee si vous faites du developpement sur DS, car elle n'en possede pas beaucoup contrairement au pc . - Code:
-
int : 4 octets char : 1 octet (-128 a 127, ca ne vous rappelle pas quelque chose ? ^^) float : 4 octets long : 4 octets double : 8 octets
Vous me direz que ce n'est pas beaucoup, mais je peux vous assurez que vous vous trompez On a rapidement fait appel un nombre de fois incroyable de ces variables, ce qui explose la memoire. Sans oublier les images, les sons etc... Alors, c'est si peu que ca ?
Dernière édition par le Mer 10 Oct - 1:18, édité 6 fois | |
| | | Sekoda Admin
Nombre de messages : 1631 Date d'inscription : 04/01/2007
| Sujet: Re: [Cours 01] Presentation d'un code source. Dim 11 Fév - 21:36 | |
| Type de Fonction Bon d'accord, ce sont des types pour les variables. Alors tu nous expliques pourquoi tu as mis un "int" a ta fonction "main" Je vous ai dit tout a l'heure, qu'une fonction realisait des operations. Cependant le resultat de ces operations doit etre renvoye si on veut en profiter, non ? Pour cela, on utilise la commande : - Code:
-
return ();
C'est elle qui va se charger de transmettre l'information a la fonction qui l'a appelee. Cependant, pour qu'elle puisse renvoyer sa valeur, il faut que le type de la valeur de retour soit definie. Exemple : - Code:
-
/* ** cours_01.c for Cours 01 in /u/ept1/my_docs/cours_01 ** ** Made by Sekoda MasGaNo ** Login <sekoda> ** */
int add (int a, int b) { int resultat;
resultat = a + b; return (resultat); }
int main(int ac, char **av) { int a; int b; int resultat;
a = 5; b = 5; resultat = add(a, b); return (0); }
La vous pouvez voir que la fonction "main" fait appel a la fonction "add" pour calculer son addition entre "a" et "b". Pour cela, la fonction "add" cree une variable "resultat" de type "int" (valeur entiere), afin de stocker le resultat. On voit ensuite, qu'elle retourne la variable "resultat". Quel est le type de la variable "resultat" C'est une variable "int", donc la fonction "add" doit egalement etre de type "int" afin de renvoyer une valeur de ce type Mais pourquoi la fonction "main" doit etre de type "int" vu que personne ne l'appelle Oui et non en fait. La fonction "main" est appelee par le systeme dans lequel repose le programme. Dans le cas d'un PC, c'est le systeme d'exploitation qui le fait. Dans le cas de la NDS, c'est son firmwire. Donc elle est effectivement appelee. Elle est de type "int" car elle renvoit "0". Pourquoi, me direz-vous. C'est tout simplement pour donner l'etat du programme au systeme, afin de determiner si le programme a bien quitte ou s'il a crashe. Il est vrai que dans le cas de la NDS, cela n'est pas tres utile car on coupe la console sans quitter le jeu ! Mais ne faisons pas de maniere et prennons les bonnes habitudes . P.S. Il existe aussi le type "void" qui peut etre tout et rien. Mais je vous en parlerais bien plus tard
Dernière édition par le Dim 11 Fév - 21:48, édité 2 fois | |
| | | Sekoda Admin
Nombre de messages : 1631 Date d'inscription : 04/01/2007
| Sujet: Re: [Cours 01] Presentation d'un code source. Dim 11 Fév - 21:37 | |
| Parametres C'est quoi les variables entre "( )" qu'il y a a cote de la fonction Bonne remarque ! C'est ce qu'on appelle des parametres . C'est de ce dont a besoin une fonction pour realiser l'operation souhaitee. Dans l'exemple ci-dessus, nous avons cree une fonction addition (inutile, mais tres pratique pour des exemples ). Pour faire une addition, il faut minimum deux valeurs. D'ou les parametres "a" et "b" . Cependant, les variables passees a la fonction doivent etre du meme type que les parametres de la fonction. Il y a le cas de la promotion, mais on va eviter d'aborder ce sujet qui risque de compliquer la comprehension du foncitonnement du programme. Gardez en tete, que si vous voulez faire une addition entre deux "int", la fonction ne devra pas recevoir autre chose que des "int". Je vous expliquerais plus tard comment creer vos propres types. Voici un exemple : - Code:
-
/* ** cours_01.c for Cours 01 in /u/ept1/my_docs/cours_01 ** ** Made by Sekoda MasGaNo ** Login <sekoda> ** */
t_perso deplacer_perso(t_perso heros) { heros.x = heros.x + 5; heros.y = heros.y + 5; return (heros); }
int main(int ac, char **av) { t_perso heros;
heros.x = 120; heros.y = 120; heros = deplacer_perso(heros); return (0); }
J'ai cree ici, une variable du type "t_perso", qui contiendra tous les elements de mon personnage "heros". En fait, j'ai cree ici ne structure, mais je vous expliquerai son fonctionnement dans un cours prochain N'utilisez surtout pas ce code pour faire deplacer votre personnage, c'etait juste un exemple tout moche et tres peu optimise . Je vous expliquerai une methode plus simple avec les pointeurs (dans un cours prochain ^^). Et les parametres de la fonction "main", ils servent a quoi En temps normal, a beaucoup de chose . Ils permettent par exemple de modifier le comportement du programme si on l'a developper de cette facon. Ou alors de calculer des valeures entres elles. Bref, tout ce que vous voulez Mais ici, ces parametres ne servent completement a rien En effet, la NDS fait juste appel a la fonction "main" pour lancer votre jeu. Mais elle n'est pas abilite a demander autre chose a votre programme. Donc mettez-les pour garder l'habitude, mais ne cherchez pas une autre utilisation avec le developpement DS .
Dernière édition par le Dim 11 Fév - 21:49, édité 2 fois | |
| | | Sekoda Admin
Nombre de messages : 1631 Date d'inscription : 04/01/2007
| Sujet: Re: [Cours 01] Presentation d'un code source. Dim 11 Fév - 21:37 | |
| Divers Mais il n'y a pas tout les elements dans ce que tu nous as presente C'est vrai . Revoyons un code : - Code:
-
/* ** cours_01.c for Cours 01 in /u/ept1/my_docs/cours_01 ** ** Made by Sekoda MasGaNo ** Login <sekoda> ** */
#include <PA9.h>
int main(int ac, char **av) { PA_Init(); // Les fameux appels de fonctions ^^ PA_InitVBL(); while (1) { } return 0; }
Il y a en plus dans ce code, "#include <PA9.h>" Les includes signifient en fait, qu'il faut inclure certaines fonctions qui appartiennent a d'autres fichiers. Je pense notamment a la librairie de Palib. Cependant, le compilateur n'est pas assez malin pour chercher la provenance de la fonction. C'est pourquoi, il faut un fichier Header (*.h) qui contiendra toutes les fonctions utilisees par le programme. Ainsi, en compilant, il saura ou piocher ses fonctions. Je reviendrai plus tard dessus . Il y a encore bien d'autre element, tels que les "#define" ou autre. Mais je vous expliquerais en temps et en heure . Incrementation et DecrementationVoici une notion que vous n'etes pas pret d'y echapper A savoir, c'est une chose qu'un developpeur utilise pas mal de fois (moi en tout cas ), et qui arrange pas mal les choses. A coup sur, vous serez tres souvent amenes a utiliser ceci : - Code:
-
c += 1; c -= 1; C'est une action qu'on rencontrera souvent car elle permet la manipulation de nombreux types de valeurs . Ainsi, pour simplifier l'ecriture, il y a une formule magique (ou du moins une ecriture simplifiee ) qui est : - Code:
-
c++; c--; Voila Avec ca, vous direz a votre programme "Passe a la valeur suivante" ou "Passe a la valeur precedente". Ainsi : - Code:
-
int i;
i = 20; i++; i vaudra 21 , car c'est la valeur suivant 20 ou alors - Code:
-
char c;
c = 'b'; c--; c contiendra la lettre 'a', car c'est le caractere qui precede le caractere 'b' (cf. Table ASCII)
Dernière édition par le Sam 24 Mar - 21:11, édité 4 fois | |
| | | Sekoda Admin
Nombre de messages : 1631 Date d'inscription : 04/01/2007
| Sujet: Re: [Cours 01] Presentation d'un code source. Dim 11 Fév - 21:38 | |
| Les utilisations -A savoir, c'est que le C ne fait pas le rapport entre la fonction "main" et la fonction "mAIN". Idem pour les variables. C'est pour cela, que je vous demanderai de TOUJOURS ecrire en minuscule. La majuscule ne sera reserve uniquement pour les MACRO. Mais je vous expliquerai ce qu'est une MACRO plus tard. Donc toujours ecrire en minuscule et SANS espace ! En effet, mettre un espace marquera une distinction entre les deux elements de part et d'autre de cet espace. -De plus, ne mettez pas de commentaires a tout bout de champs. Vous pouvez en mettre avant une fonction, apres une fonction, a la limite a cote d'une operation ou d'une declaration de variable. Mais pas en plein milieu d'un code. - Code:
-
PA_InitParallaxY(0, //screen 0, //Parallax speed for Background 0. 0 is no parallax (will scroll independently with BGScroll) 256, // Normal speed for Bg1 192, // 3/4 speed 128); // Half speed
A eviter On ne comprend plus rien... C'est utile pour la documentation du site, mais ne pas reprendre tel quel une fois qu'on a compris comment ca marche. A la limite : - Code:
-
PA_InitParallaxY(0, 0, 256, 192, 128); /* ** Le premier parametre initialise le choix de l'ecran ** Les autres parametres definissent la vitesse de defilement des 4 Backgrounds. ** Les vitesses vont de 0 (nulle) a 256 (normale) ** Exemple : SuperMario Bros 3 avec les differents plans qui defilent a vitesse differente (cf.: Documentation de la NDS) */
En autant de ligne, je pense avoir mieux explique que ces commentaires et j'ai meme rajoute un petit bonus -Comme je l'ai dit a l'instant, les variables, avant d'etre utilisee, doivent toujours etre declaree. Ce n'est pas comme le Basic ou autre, ou on pouvait utiliser des variables inconnues au bataillon (en fait, quand vous compilez, le programme declare automatiquement les variables ). Donc toujours les declarer avant utilisation (comme votre salaire ) -Enfin, pour faciliter la lecture, toujours ecrire ses fonctions de cette facon : - Code:
-
int main(int ac, char **av) { int i; // Partie Declarative int j;
i = 5; // Partie Initialisation j = 10;
while (i > 0) // Partie Executive { j--; } return (0); //Fin de la fonction }
En aucun cas, je veux voir des declaration de variable en plein milieu d'une fonction. Voila, c'est tout pour les conseils
Dernière édition par le Dim 18 Fév - 18:29, édité 1 fois | |
| | | Sekoda Admin
Nombre de messages : 1631 Date d'inscription : 04/01/2007
| Sujet: Re: [Cours 01] Presentation d'un code source. Dim 11 Fév - 21:55 | |
| Initialisation C'est quoi cette partie initialisation Ah oui ! Essayez d'utiliser une variable sans l'initialiser, vous aurez de drole de surprise Pour faire simple : -quand vous declarez une variable, le systeme alloue un espace memoire dans la ram pour stocker votre variable. -cependant, la ram n'est pas propre. Il reste des informations dessus qui ne sont pas effacees MEME en coupant le PC ou la console. -la declaration n'efface pas les vieilles informations de la RAM. -la declaration ne prends pas le risque de fixer une valeur par default d'une variable car ce n'est pas necessairement voulue. -c'est donc a vous de fixer une valeur par default que prendra la variable. D'ou la partie initialisation que je vous recommande de faire en debut de fonction, juste apres la declaration. -en prennant cette habitude, vous eviterez de vous mettre dans la situation d'un developpeur qui n'initialisait pas d'emblee ses variables et qui se retrouve perdu dans un bug parmi un code de quelques milliers de lignes. - Code:
-
int main(int ac, char **av) { int i;
i = i + 10; return (0); }
Ce code donnera un resultat totalement aleatoire, en fonction de ce qui etait dans la RAM avant son passage. - Code:
-
int main(int ac, char **av) { int i;
i = 0;
i = i + 10; return (0); }
"i" possedera la valeur 10 a la fin du code. | |
| | | Sekoda Admin
Nombre de messages : 1631 Date d'inscription : 04/01/2007
| Sujet: Re: [Cours 01] Presentation d'un code source. Dim 11 Fév - 21:58 | |
| ConclusionVoila pour la presentation d'un code source J'espere avoir ete suffisament clair ^^' Je reprendrais regulierement le cours en fonction de vos appreciations et de mes relectures, car la, j'avoue etre epuise Certains me diront surement qu'on peut faire beaucoup plus simple pour les declarations ou la presentation. Cependant, je leur repondrai que cette methode, est l'une des plus propres qui soit. Faire une relecture d'un code presente de cette facon est beaucoup plus agreable que celui ou tout est mis en vrac. Donc gardez donc en tete : -Header -Fonction "main" -Declaration des variables -Initialisation des variables -Operation -Resultat de la fonction Le prochain cours sera consacre aux structures de controle, qui vous permettra de commencer a gerer des programmes interessant . N'hesitez pas a reagir . | |
| | | Contenu sponsorisé
| Sujet: Re: [Cours 01] Presentation d'un code source. | |
| |
| | | | [Cours 01] Presentation d'un code source. | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |
|