Mot :   Pseudo :  
 
 Page :  1  2
Page Suivante 
developpement sur NDS (Palib)
 
n°2456
Profil : Internaute
Posté le 05-05-2008 à 14:11:30   answer
 

Reprise du message précédent :
J'aimerais bien une machine virtuelle Java optimisée et développée spécialement pour la DS et la PSP :)
 
Ca m'inciterait à développer 2 3 trucs sur ces plates-formes.


---------------
Playfrance's Monk of Twilight -> Aru
n°2457
Profil : Internaute
Posté le 05-05-2008 à 19:13:21   answer
 

Mea culpa, le copié coller à partir des navigateurs c'est mal. Surtout quand on rectifie à la va vite comme je l'ai fait.  :sweat:  
Vraiment désolé zell, en fait y'a un else qui a sauté dans le tas, d'où le passage dans le dernier if de mon côté.
 
Sinon de mon côté, je préfère le C/C++ au Java même si cette année, j'ai surtout fait du Java. Pour la préférence, je pense que ça vient surtout du fait que c'est le langage avec lequel j'ai appris à programmer.


Message édité par shadow2 le 05-05-2008 à 19:14:17

---------------
Linux peut être sexy, le preuve :
 
shadow2@shadow2-linux:~$ who | grep -i blonde | talk; cd ~; wine; talk; touch; unzip; touch; strip; gasp; finger; mount; fsck; more; yes; gasp; unmount; make clean; sleep;
n°2458
Profil : Internaute
Posté le 05-05-2008 à 19:19:31   answer
 

J'ai commencé vite fait avec le Basic sur calculatrice.
J'ai réellement commencé à programmer en C à l'IUT, puis en C++ (vite fait).
En deuxième année, on a attaqué Java et c'est là que j'ai été conquis par ce langage :)


---------------
Playfrance's Monk of Twilight -> Aru
n°2459
Profil : Internaute
Posté le 05-05-2008 à 19:24:28   answer
 

Aru a écrit :

J'ai commencé vite fait avec le Basic sur calculatrice.
J'ai réellement commencé à programmer en C à l'IUT, puis en C++ (vite fait).
En deuxième année, on a attaqué Java et c'est là que j'ai été conquis par ce langage :)


J'ai un parcours assez similaire même si j'ai vraiment programmé peu sur ma TI, d'abord C puis C++ et enfin Java. (en passant en vitesse sur du VB que je trouve vraiment affreux)


---------------
Linux peut être sexy, le preuve :
 
shadow2@shadow2-linux:~$ who | grep -i blonde | talk; cd ~; wine; talk; touch; unzip; touch; strip; gasp; finger; mount; fsck; more; yes; gasp; unmount; make clean; sleep;
n°2460
Profil : Internaute
Posté le 05-05-2008 à 21:29:31   answer
 

Aru a écrit :

J'aimerais bien une machine virtuelle Java optimisée et développée spécialement pour la DS et la PSP :)
 
Ca m'inciterait à développer 2 3 trucs sur ces plates-formes.


 
Bande d'hérétiques :o  
Le pire c'est que vu que la famille de procs utilisé par la DS est vachement utilisée dans tout ce qui est embarqué si ca se tu peux trouver une VM fonctionnelle sous DS (du moins sur le proc principal).


---------------
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d.
1f u c4n wr1t3 1t t00.
n°2461
Profil : Internaute
Posté le 05-05-2008 à 23:11:29   answer
 

Sur les PSP Custom, y a un portage de J2ME, mais c'est pas vraiment ça que je veux :p


---------------
Playfrance's Monk of Twilight -> Aru
n°2462
Profil : Internaute
Posté le 07-05-2008 à 16:04:04   answer
 

Aru a écrit :

J'ai commencé vite fait avec le Basic sur calculatrice.
J'ai réellement commencé à programmer en C à l'IUT, puis en C++ (vite fait).
En deuxième année, on a attaqué Java et c'est là que j'ai été conquis par ce langage :)


Moi c'est l'inverse : j'ai commencé à programmer en Basic au lycée, puis en école j'ai commencé par le Java, puis on s'est mis au C/C++.
Résultat : je déteste le C et le C++, et j'adore le Java (et le C# dans une moindre mesure, je n'y ai pas touché depuis un moment) :D
Je pense que c'est parce que j'ai commencé par le Java, le C et le C++ présentent bien plus de contraintes pour quelqu'un qui a l'habitude de laisser la VM gérer la mémoire (pas de pointeurs à gérer, présence du Garbage Collector, ...). Ok, le Java est une usine à gaz (encore que ça s'améliore), mais pour l'écriture du code c'est quand même beaucoup plus rapide je trouve :) (je garde de mauvais souvenirs d'un projet en C++, sur lequel j'ai passé 1 semaine à écrire mon code et 2 semaines à le débugger :D ).

Message cité 1 fois
Message édité par Sn@ke le 07-05-2008 à 16:04:51
n°2463
Profil : Modérateur
Posté le 07-05-2008 à 17:57:23   answer
 

Sn@ke a écrit :

Je pense que c'est parce que j'ai commencé par le Java, le C et le C++ présentent bien plus de contraintes pour quelqu'un qui a l'habitude de laisser la VM gérer la mémoire (pas de pointeurs à gérer, présence du Garbage Collector, ...).


C'est marrant, c'est le Java que je trouve contraignant (et le garbage collector, je ne m'y fais pas, même s'il est disponible en C++ via diverses astuces, je n'aime pas).
 
J'ai fait le parcours Basic / Assembleur / Pascal / C / OCaml / C++ / Java  (plus une trentaine d'autres), ça a du me sensibiliser avec le fonctionnement de la machine, et je n'apprécie pas les langages qui sont à mi-chemin entre le très haut niveau et ceux qui collent au fonctionnement du hard.
 

Sn@ke a écrit :

mais pour l'écriture du code c'est quand même beaucoup plus rapide je trouve :)


Je pense que c'est très relatif, mais si c'est ce que tu cherches, il y a des langages qui sont encore plus adaptés à un codage efficace. Pour le debugging, ça dépend aussi énormément de ta façon de coder...

n°2464
Profil : Internaute
Posté le 08-05-2008 à 18:13:53   answer
 

Désolé pour ma réponse tardive,j'avais des tas de DST à préparer(UML,SQL,Anglais,math proba) :oops:

 

Exact Koren car j'ai appliqué le conseil donné par Shadow qui normalement correct et j'ai toujours le même bug "classé 3eme"

 

Il est fort possible que ton intuition soit la bonne,je devrai revoir le code,car j'ai essayé X techniques et les résultats sont les mêmes

 

Comme dans X FIles la vérité était ailleurs

 
Code :
  1. void Resultat(int score,int ench){
  2. int x=0,y=0,sortie=0;
  3. PA_OutputText(0,5,7,"Score %d",score);
  4. PA_OutputText(0,5,10,"Enchainement %d",ench);
  5. PA_OutputSimpleText(0,13,20, "Retour" );
  6. while(sortie==0){
  7.  if (Stylus.Newpress){
  8.   x=Stylus.X;
  9.   y=Stylus.Y;
  10.  }
  11.  CompareScore(score);
  12.  if (((x>100) && (x<150) && (y>150) && (y<170)) || (Pad.Newpress.A))
  13.   sortie=1;
  14.  PA_WaitForVBL();
  15. }
  16. }
 

CompareScore () se trouve dans un while qui avait comme condition de sortie que le joueur "touche" la sortie.

 

Bref un bug stupide..Bravo Koren pour ta déduction sans avoir vu la fonction résultat ,tu m'étonneras toujours. Chapeau :jap:


Message édité par zell789 le 08-05-2008 à 18:24:40
n°2465
Profil : Modérateur
Posté le 08-05-2008 à 19:09:55   answer
 

23 ans que je chasse des bugs (je me fais vieux :cry:), on finit par avoir l'habitude. Et puis ta fonction n'avait pas d'erreur visible, donc le seul moyen d'afficher deux chaînes était de l'appeler deux fois.

 

D'autant que j'ai fait du level-up à l'époque où j'enseignais l'info... en TP ou en encadrement de projet, on doit trouver en deux minutes un bug que les étudiants cherchent parfois depuis un ou deux jours, c'est un bon entraînement. Mais j'avoue que je ne suis pas insensible au regard de l'étudiant quand je parviens à localiser un bug presque sans regarder le code... Pêché de fierté que j'espère véniel.

 

J'ai fait le coup la semaine dernière, il m'a fallu un peu de temps, mais vous allez comprendre pourquoi :

Code :
  1. test=false;
  2. if (test) {
  3. a=0; b=1;
  4. } else {
  5. a=1; b=0;
  6. }
  7. printf("%d %d\n", a, b);
 

renvoyait

Citation :

0 0

 

A force, je sens venir les problèmes... du coup, j'ai changé ça en

Code :
  1. test=false;
  2. if (test) {
  3. a=0; b=1;
  4. } else {
  5. b=0; a=1;
  6. }
  7. printf("%d %d^n", a, b);


suspectant un débordement de l'inscription du 0 de b dans a (en fait, a et b sont deux éléments d'un même champ de bit) et... ça a marché...

 

Oui, c'est un semi-bug du compilateur. Le problème, c'est que le programme était compilé pour PIC, que le compilateur faisait (quasi à raison) un "Bit Reset" sur une broche d'un port pour effectuer b=0, sauf que... la doc du PIC spécifiait (à ma grande surprise d'ailleurs, les PICs, c'est de la m*** (tm) ) que les instructions Bit Reset pouvaient influer sur les autres bits du même bus (ce qui est profondément stupide).

Message cité 1 fois
Message édité par Koren le 08-05-2008 à 19:12:09
n°2466
Profil : Internaute
Posté le 08-05-2008 à 23:35:36   answer
 

Koren a écrit :


D'autant que j'ai fait du level-up à l'époque où j'enseignais l'info... en TP ou en encadrement de projet, on doit trouver en deux minutes un bug que les étudiants cherchent parfois depuis un ou deux jours, c'est un bon entraînement. Mais j'avoue que je ne suis pas insensible au regard de l'étudiant quand je parviens à localiser un bug presque sans regarder le code... Pêché de fierté que j'espère véniel.
 
[...]
 
Oui, c'est un semi-bug du compilateur. Le problème, c'est que le programme était compilé pour PIC, que le compilateur faisait (quasi à raison) un "Bit Reset" sur une broche d'un port pour effectuer b=0, sauf que... la doc du PIC spécifiait (à ma grande surprise d'ailleurs, les PICs, c'est de la m*** (tm) ) que les instructions Bit Reset pouvaient influer sur les autres bits du même bus (ce qui est profondément stupide).


Mortalité, codez en assembleur... surtout sur du PIC :jap: :whistle:  
Mais dans le cas présent et dans ton exemple, ca se serait vu avec une exécution pas à pas dans un debugger je pense.


---------------
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d.
1f u c4n wr1t3 1t t00.
n°2467
Profil : Modérateur
Posté le 09-05-2008 à 00:44:46   answer
 

Skyfighter a écrit :

Mortalité, codez en assembleur... surtout sur du PIC :jap: :whistle:


Complètement d'accord (et même... ne programmez pas sur du PIC, choisissez de l'Atmel ;) ) Ce n'est pas moi qui les ai poussé à faire du C++ sur PIC, je trouve que c'est une bien drôle d'idée.
 

Skyfighter a écrit :

Mais dans le cas présent et dans ton exemple, ca se serait vu avec une exécution pas à pas dans un debugger je pense.


Certes, mais vu les outils PIC, je ne suis même pas certain qu'il existe un débugger de PIC. Quant au simulateur, je ne suis pas persuadé qu'il aurait donné le bug, surtout quand les instructions assembleurs indiquent "dans ce cas là, on ne sait pas trop ce que ça va faire".

n°2468
Profil : Internaute
Posté le 11-05-2008 à 23:29:17   answer
 

Skyfighter a écrit :


Mortalité, codez en assembleur... surtout sur du PIC :jap: :whistle:  
Mais dans le cas présent et dans ton exemple, ca se serait vu avec une exécution pas à pas dans un debugger je pense.


 
en réalité,je code sous notepad ++ :(
 
Je ne connais pas de logiciel traitant des les programmes palib...du coup je creer une "build.bat" pour compiler tout ça

n°2469
Profil : Internaute
Posté le 12-05-2008 à 00:02:23   answer
 

zell789 a écrit :


 
en réalité,je code sous notepad ++ :(
 
Je ne connais pas de logiciel traitant des les programmes palib...du coup je creer une "build.bat" pour compiler tout ça


 
Logiquement doit y avoir moyen d'utiliser un GDB compilé pour processeur ARM. En tout cas y'a des gens qui bossent là dessus pour DS:
http://masscat.afraid.org/ninds/debug_stub.php
 
Je connais pas PAlib, mais j'ai eu l'occasion de discuter avec des développeurs DS. Ils se débrouillaient pour que le programme compile nativement sous Windows pour pas avoir à passer par une DS pour faire du debug purement algorithmique (dès que ca part dans de l'optimisation t'as pas trop le choix). Mais faut dire aussi qu'ils tapaient directement dans le frame buffer pour faire l'affichage.


---------------
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d.
1f u c4n wr1t3 1t t00.
n°2475
Profil : Internaute
Posté le 27-05-2008 à 15:42:54   answer
 

Désolé j'ai encore besoin d'une petite aide :D
 
Je dois gérer plusieurs highscore car mon jeu est composé de minis jeux. Un high score est composé de 3 scores max
 
Je veux permettre au joueurs de pouvoir réinitialiser n'importe quel minis jeux malheureusement vu que je suis assez faible dans le domaine des "entrées/sorties" en C j'ai bricolé quelque chose d'un peu spécial (qui ne marche)
 

Code :
  1. void RecupScore(){
  2. int position=0;
  3. //type de classement est le type de minijeux
  4. int typclass=0;
  5. int x,y=0;
  6. int sortie=0;
  7. PA_ClearTextBg(0);
  8. //le tableau qui stockera les scores
  9. int score[9]={0};
  10. FILE *fichier = NULL;
  11. fichier = fopen("/score.sav", "r" );
  12. // On ouvre le fichier en mode lecture  
  13. // Si l'ouverture a fonctionné  
  14. if (fichier != NULL) {
  15. // On prend les valeurs des HighScores    
  16.  fscanf(fichier, "%d %d %d %d %d %d %d %d %d", &score[0], &score[1],&score[2],&score[3],&score[4],&score[5],&score[6],&score[7],&score[8]);
  17. // On scan le fichier d'abord, puis on rentre les nombres scannés dans les var du tableau score[0] et score[1]
  18.  fclose(fichier);
  19. // On ferme le fichier  
  20. } // Si l'ouverture n'a pas fonctionné  
  21. else {
  22. // On affiche un message d'erreur
  23.  PA_OutputSimpleText(1, 0, 10, "Fichier: Ouverture du fichier échouée lors de la récupération des HighScores" );
  24. }
  25. while (sortie==0){
  26.  //En fonction de typeclass on affichera les high score des mini jeux
  27.  if(typclass==0){
  28.   PA_OutputText(1, 0, 8, "%d",typclass);
  29.   PA_OutputText(1, 0, 10, "High Score" );
  30.   PA_OutputText(1, 0, 12, "%d",score[0]);
  31.   PA_OutputText(1, 0, 14, "%d",score[1]);
  32.   PA_OutputText(1, 0, 16, "%d",score[2]);
  33.  }
  34.  else if (typclass==1){
  35.   PA_OutputText(1, 0, 8, "%d",typclass);
  36.   PA_OutputText(1, 0, 10, "High Score" );
  37.   PA_OutputText(1, 0, 12, "%d",score[3]);
  38.   PA_OutputText(1, 0, 14, "%d",score[4]);
  39.   PA_OutputText(1, 0, 16, "%d",score[5]);
  40.  }
  41.  else if (typclass==2){
  42.   PA_OutputText(1, 0, 8, "%d",typclass);
  43.   PA_OutputText(1, 0, 10, "High Score" );
  44.   PA_OutputText(1, 0, 12, "%d",score[6]);
  45.   PA_OutputText(1, 0, 14, "%d",score[7]);
  46.   PA_OutputText(1, 0, 16, "%d",score[8]);
  47.  }
  48.  else{
  49.   PA_OutputText(1, 0, 8, "%d",typclass);
  50.   PA_OutputText(1, 0, 10, "High Score" );
  51.   PA_OutputSimpleText(1, 0, 12, "             " );
  52.   PA_OutputSimpleText(1, 0, 14, "             " );
  53.   PA_OutputSimpleText(1, 0, 16, "             " );
  54.  }
  55.  //Navigation de maniere tactile
  56.  if (Stylus.Newpress){
  57.   x=Stylus.X;
  58.   y=Stylus.Y;
  59.  }
  60.  if ((x>65) && (x<170) && (y>65) && (y<75)){
  61.   initHS(typclass,score,9);
  62.  }
  63.  else
  64.   if ( (x>90) && (x<150) && (y>90) && (y<100)){
  65.    sortie=1;
  66.   }
  67.  switch(position){
  68.    case 0:
  69.     PA_SetTextTileCol(0, TEXT_YELLOW);
  70.     PA_OutputSimpleText(0,9,5,"Reinit Score" );
  71.     PA_SetTextTileCol(0, TEXT_WHITE);
  72.     PA_OutputSimpleText(0,12,12,"Retour" );
  73.     if (Pad.Newpress.B){
  74.       initHS(typclass,score,7);
  75.     }
  76.     break;
  77.    case 1:
  78.     PA_SetTextTileCol(0, TEXT_YELLOW);
  79.     PA_OutputSimpleText(0,12,12,"Retour" );
  80.     PA_SetTextTileCol(0, TEXT_WHITE);
  81.     PA_OutputSimpleText(0,9,5,"Reinit Score" );
  82.     if (Pad.Newpress.B){
  83.       sortie=1;
  84.       PA_ClearTextBg(1);
  85.       PA_ClearTextBg(0);
  86.     }
  87.     break;
  88.  }
  89.  //Navigation avec le pad
  90.  if((Pad.Newpress.Up)){
  91.    position=0;
  92.  }
  93.  if((Pad.Newpress.Down)){
  94.    position=1;
  95.  }
  96.  if ((Pad.Newpress.Right) && typclass<3){
  97.   typclass++;
  98.  }
  99.  if ((Pad.Newpress.Left) && typclass>0){
  100.   typclass--;
  101.  }
  102.  PA_WaitForVBL();
  103. }
  104. }

 
 
et voici la fonction ou je réinitialise les scores: Je passe en arguement le type du mini jeu à mettre à jour,le tableau des scores actuel et sa taille..
 

Code :
  1. void initHS(int typeclass,int* score,int tscore){
  2. PA_InitText(1, 0);
  3. FILE* fichier = NULL;
  4. int initscore[9]={50,30,10,70,50,40,60,30,20};
  5. //int initscore[9]={30,20,10,30,20,10,30,20,10};
  6. char texteAffiche[15] = "";
  7. fichier = fopen("/score.sav", "w" );
  8. if (fichier != NULL)
  9. { rewind(fichier);
  10.  if (typeclass==0){
  11.   PA_OutputText(1, 0, 6, "Init du jeu 1" );
  12.   fprintf(fichier, "%%d %d %d %d %d %d %d %d %d",initscore[0],initscore[1],initscore[2], score[3], score[4],score[5], score[6], score[7],score[8]);   
  13.  }
  14.  else if(typeclass==1){
  15.   PA_OutputText(1, 0, 6, "Init du jeu 2" );
  16.   fprintf(fichier, "%d %d %d %d %d %d %d %d %d",score[0], score[1],score[2],initscore[3],initscore[4],initscore[5], score[6], score[7],score[8]);
  17.  }
  18.  else if (typeclass==2){
  19.   PA_OutputText(1, 0, 6, "Init du jeu 3" );
  20.   fprintf(fichier, "%d %d %d %d %d %d %d %d %d",score[0], score[1],score[2],score[3], score[4],score[5],initscore[6],initscore[7],initscore[8]);
  21.  }
  22.  //PA_OutputText(1, 0, 6, "Init HS" );
  23.  //fprintf(fichier, "%d %d %d %d %d %d %d %d %d",initscore[0],initscore[1],initscore[2],initscore[3],initscore[4],initscore[5],initscore[6],initscore[7],initscore[8]);
  24.  fclose(fichier);
  25. }   
  26. else{       
  27.   PA_OutputSimpleText(1, 0, 10, "Fichier : Echec d'ouverture du fichier lors de la sauvegarde du scoreJ1" );
  28. }
  29. }


 
Ma technique est que en fonction de la valeur de typeclass,je ne met qu'a jour le mini jeu concerné pour le reste je réinscris le tableau des scores qui a été donnée en parametre
 

Code :
  1. fprintf(fichier, "%d %d %d %d %d %d %d %d %d",score[0], score[1],score[2],score[3], score[4],score[5],initscore[6],initscore[7],initscore[8]);


 
Par exemple dans ce cas seul le 3eme jeux est maj,les 2 1ers jeux reprennent les valeurs déjà sauvegardés dans le tableau score
 
Je trouve que ma technique semble être cohérente or malheureusement quand je fais ça tout mes scores de tout mes minis jeux passent à 0. Je ne comprend pas le problème,peut être parce que fprintf n'accepte qu'un tableau? :??:
 
Merci de votre aide  

n°2477
Profil : Internaute
Posté le 28-05-2008 à 22:55:42   answer
 

fprintf et fscanf prennent bien un nombre d'arguments variable déterminé à partir de la chaîne de format.
Par contre à la ligne 13 de initHS, y'a un % en trop (ca m'étonne que ton compilateur t'aies pas mis une bonne paire de baffes sur ce coup).

 

Sinon en général quand y'a un problème avec fprintf / fscanf c'est des histoires de bufferisation.
Essaye de rajouter un '\n' à la fin de tes chaînes de format pour frpintf et fscanf, ca devrait forcer le flush des buffers.


Message édité par Skyfighter le 28-05-2008 à 22:56:16

---------------
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d.
1f u c4n wr1t3 1t t00.
n°2478
Profil : Internaute
Posté le 29-05-2008 à 14:06:07   answer
 

Merci Skyfighter,je vais essayer de modifier cela des que j'ai le temps car je dois rendre également un projet en "Théorie de langage/compilation"

 

Maitriser cet outil fort complexe qu'est Bison/Flex :oops: (ou je ne comprend rien de rien en plus je dois le rendre demain ) Je suis dans la............. :(

Message cité 1 fois
Message édité par zell789 le 29-05-2008 à 15:04:06
n°2479
Profil : Internaute
Posté le 29-05-2008 à 22:06:12   answer
 

zell789 a écrit :


Maitriser cet outil fort complexe qu'est Bison/Flex :oops: (ou je ne comprend rien de rien en plus je dois le rendre demain ) Je suis dans la............. :(


Ah, ca c'est des projets marrants :D
On te fait compiler quoi comme langage?


---------------
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d.
1f u c4n wr1t3 1t t00.
n°2480
Profil : Internaute
Posté le 29-05-2008 à 22:21:24   answer
 

Skyfighter a écrit :


Ah, ca c'est des projets marrants :D
On te fait compiler quoi comme langage?

 

bah écoute je suis tellement nul que mes 2 collègues sont surement en train de faire le projet sans moi.. j'ai grave les boules

 

je dois a partir d'un langage inventer le compiler vers le langage C

 

Je dois programmer un "if" ,'else ' mais je cale severe

 
Code :
  1. %%
  2. A: line   {printf("%s;\n",$1);}
  3. |  A line   {printf("%s;\n",$2);}
  4. line : expr NEWLINE  {$$ = $1;}
  5. expr: expr PLUS expr    {$$ = affiche3($1," + ", $3);}
  6. | expr MOINS expr {$$ = affiche3($1," - ", $3);}
  7. | expr MULTIP expr {$$ = affiche3($1," * ", $3);}
  8. | expr DIV expr  {$$ = affiche3($1," / ", $3);}
  9. | INT  {$$=$1;}
  10. | VAR expr2  {$$=$2;}
  11. | SI expr5 {$$=$2;}
  12. expr2: expr2 ENTIER    {$$ = affiche2("int", $1);}
  13. | expr2 REEL    {$$ = affiche2("float", $1);}
  14. | expr2 CHAINE  {$$ = affiche2("char *", $1);}
  15. | expr2 CARACTERE  {$$ = affiche2("char", $1);}
  16. | expr2 BOOL  {$$ = affiche2("int", $1);}
  17. | IDENTIFIANT  {$$=$1;}
  18. | expr2 DEUXP {$$=$1;}
  19. | expr2 PVIRGULE {$$=$1;}
  20. ;
  21. expr5:  expr5 ALORS{$$ = affiche2("if",$1)}
  22. | IDENTIFIANT  {$$=$1;}
  23. ;
  24. %%
 

Je ne sais pas comment faire un "if" dans le fichier bison en effet si il tape un else je dois avoir en résultat "if a else b" or ici je n'arrive que à faire "if a" comment faire pour dire au programme en cas de else d'alleir voir ailleurs en créant un aute expr6 par exemple?

 

m'enfin mes 2 "collègues" me prennent pour un gros con,et font le projet sans moi ca se trouve ils ont bien avancé alors que je perd mon temps


Message édité par zell789 le 29-05-2008 à 22:30:50
n°2481
Profil : Modérateur
Posté le 29-05-2008 à 23:42:18   answer
 

En fait, c'est tout simple, mais il faut piger le truc... Sans la spécification de ton langage, je vais avoir du mal à te répondre sur le IF, mais je peux peut-être t'éclaircir quelques trucs.
 
LEX (flex) prends un fichier qui est une suite (file) de caractères. Il explique comment on doit découper le fichier en "mots". Quand tu lis un texte en français, c'est facile : un mot, c'est une suite de lettres entre a et z (ou A et Z) encadrés par deux caractères qui ne sont pas des lettres. Entre les mots, tu as des signes de ponctuation (. , ! ? : ...) qui t'apportent des informations supplémentaires. Du coup, lex te permet de :
- retrouver les mots-clés (SI, ALORS, VAR, POUR, etc)
- retrouver les groupes de caractères qui ont un sens : un entier, un réel, une chaîne de caractères... Par exemple, un mot en français, c'est défini comme [azAZ]+ (série consécutive de lettres entre a et z ou entre A et Z). Bon, un détail, j'écris peut-être mal ce truc, je ne sais jamais comment écrire correctement les regexp de lex sans vérifier...
 
Après le passage de LEX, tu n'as plus une suite de caractère mais une suite de blocs qu'on appelle généralement "tokens". Par exemple la suite de caractère
 

Code :
  1. SI (a=1) ALORS a := 2 SINON a := 1 FINSI


 
devient la suite de tokens  
 

Code :
  1. MOT_CLE_SI
  2. PARENTHESE_OUVRANTE
  3. VARIABLE (a)
  4. OPERATEUR_EGALITE
  5. CONSTANTE (1)
  6. PARENTHESE_FERMANTE
  7. MOT_CLE_ALORS
  8. VARIABLE (a)
  9. OPERATEUR_ATTRIBUTION
  10. CONSTANTE (2)
  11. MOT_CLE_SINON
  12. VARIABLE (a)
  13. OPERATEUR_ATTRIBUTION
  14. CONSTANTE (1)
  15. MOT_CLE_FINSI


 
 
Fin de LEX.
 
 
Ensuite vient Bison (ou Yacc). Il vise à déterminer dans quel ordre on doit trouver les tokens... (et ensuite ce que l'on doit faire dans chaque situation, on y reviendra ensuite). Je vais prendre un exemple...
 
Qu'est-ce qu'un programme ? C'est une suite d'instructions
 

Code :
  1. Programme : Suite_Instructions


 
Qu'est-ce qu'une suite d'instruction ? C'est une instruction toute seule, ou une suite d'instruction suivie par une instruction... Ca, c'est un peu subtil à comprendre, mais tu ne peux pas dire qu'une suite d'instruction c'est une instruction, ou deux instructions, ou trois instructions, ou quatre instructions... parce que sinon tu ne t'en sors pas. Du coup, c'est la même chose que les récurrences : c'est soit 1 instruction, soit n+1 instructions (et dans le second cas, le n correspond à une suite d'instruction, et on boucle). Donc :
 

Code :
  1. Suite_Instructions :
  2.   Instruction
  3. | Suite_Instructions Instruction


 
Si tes instructions doivent être séparées par des points virgule, par exemple, tu peux mettre :
 

Code :
  1. Suite_Instructions :
  2.   Instruction
  3. | Suite_Instructions  TOKEN_POINT_VIRGULE  Instruction


 
Jusque là ça va ? Bon, ben tu as compris l'essentiel... Ensuite, on définit ce qu'est une instruction, et ainsi de suite jusqu'au niveau le plus bas... On va faire le cas instruction :
 

Code :
  1. Instruction :
  2.   Affectation
  3. | Appel_de_fonction
  4. | MOT_CLE_SI   Booleen  MOT_CLE ALORS  Suite_Instructions  MOT_CLE_FINSI
  5. | MOT_CLE_SI   Booleen  MOT_CLE ALORS  Suite_Instructions  MOT_CLE_SINON  Suite_Instructions  MOT_CLE_FINSI
  6. | MOT_CLE_TANTQUE  Booleen  MOT_CLE_FAIRE  Suite_Instructions  MOT_CLE_FINTANTQUE


 
Puis après, on explique ce que c'est qu'une affectation :
 

Code :
  1. Affectation :
  2.   VARIABLE OPERATEUR_AFFECTATION CONSTANTE
  3. | VARIABLE OPERATEUR_AFFECTATION VARIABLE


Et là, super, il n'y a plus que des tokens, on a fini pour ce bout là ! Tu peux lui dire quoi faire dans cette situation-là : écrire le bout de code c qui range la constante dans la variable...
 
Bon, j'ai un peu triché, car en théorie, ça devrait être :

Code :
  1. Affectation : VARIABLE OPERATEUR_AFFECTATION Expression


 
où expression est une expression mathématique, et devra être explicitée (1) :
 

Code :
  1. Expression :
  2.   PARENTHESE_OUVRANTE Expression PARENTHESE_FERMANTE
  3. | CONSTANTE
  4. | VARIABLE
  5. | Expression OPERATEUR_PLUS Expression
  6. | Expression OPERATEUR_MOINS Expression
  7. | Expression OPERATEUR_FOIS Expression
  8. | Expression OPERATEUR_DIVISE Expression


etc.
 
 
Je crois que ton problème, c'est que tu as perdu le fil, et que tu te focalises sur un détail (le if) qui doit venir en dernier (sauf à avoir BEAUCOUP d'habitude). Si je lis ton code :
 
- un programme doit être A (?)
- A est une suite de lignes
- une ligne est une 'expr' suivie par un retour chariot.
 
Et là, déjà, je pense que ça coince. Je ne connais pas ton langage, mais je ne pense pas qu'une ligne
 

Code :
  1. 1+1


 
ait un sens dans ton langage. Tu devrais avoir au moins, par exemple :  
 

Code :
  1. a=1+1


 
Tu mélanges les "instructions" (comme SI ... ALORS ... SINON ... FINSI ou bien VAR ... ou bien encore VARIABLE OPERATEUR_AFFECTATION Expression) et les expressions mathématiques comme (... PLUS ..., ... MOINS ..., etc.)
 
Déjà, il y a un GROS défaut dans ce que tu nous montre, tu ne devrais jamais avoir des trucs du genre expr3, expr5, mais uniquement des noms clairs, sinon c'est que tu ne vois pas bien où tu vas...
 
 
Après, ça va tout seul, si je reprends ce que je disais plus haut :

Code :
  1. Instruction :
  2.   Affectation
  3. | Appel_de_fonction
  4. | MOT_CLE_SI   Booleen  MOT_CLE ALORS  Suite_Instructions  MOT_CLE_FINSI
  5. | MOT_CLE_SI   Booleen  MOT_CLE ALORS  Suite_Instructions  MOT_CLE_SINON  Suite_Instructions  MOT_CLE_FINSI
  6. | MOT_CLE_TANTQUE  Booleen  MOT_CLE_FAIRE  Suite_Instructions  MOT_CLE_FINTANTQUE


 
Prends le deuxième cas : que faut-il faire ?
- afficher "if"
- laisser Yacc/Bison traiter l'expression booléenne (et écrire tout ce qu'il faut)
- afficher "{" (pour le then)
- laisser Yacc/Bison traiter la suite d'instructions (et écrire tout ce qu'il faut)
- afficher "}"
 
Donc un truc (modulo tes fonctions affiche dont je ne sais pas bien ce qu'elles font, c'est un poil bizarre) :

Code :
  1. $$ = affiche5(  "if" , $2 , "{" , $4 , "}" )


 
Dans le cas d'un SINON (troisième cas dans mon exemple) :

Code :
  1. $$ = affiche7(  "if" , $2 , "{" , $4 , "} else {" , $6 , "}" )


 
Si quelque chose n'est pas clair, n'hésite pas... Mais une fois que tu as pigé le truc, ce genre de code s'écrit en une ou deux heures... et quasiment sans réfléchir avec un minimum d'habitude.
 
 
(1) Bon, là, j'ai pris une liberté, car ça ne devrait pas être Expression OPERATEUR_PLUS Expression, mais Expression OPERATEUR_PLUS Terme, car sinon 1 + 2 + 3 peut être décomposé de deux façons différentes, et il est bon d'éviter les ambiguités. Mais c'est une sutilité qui n'a pas beaucoup d'importance dans ton projet. Maintenant, il y a des informaticiens qui vont me lire, alors je veux éviter les erreurs...

n°2482
Profil : Internaute
Posté le 29-05-2008 à 23:50:05   answer
 

...


Message édité par zell789 le 30-05-2008 à 12:31:54
n°2483
Profil : Internaute
Posté le 30-05-2008 à 00:04:49   answer
 

(voir prochain post)


Message édité par zell789 le 30-05-2008 à 03:47:24
n°2484
Profil : Internaute
Posté le 30-05-2008 à 03:46:52   answer
 

J'ai lu plus attentivement ton explication Koren,cela parait si simple

 

La manière que tu m'expliques est très différente de celle de 2 collgèues. En effet,leur but est de faire  1 par 1 des instructions simples comme : var i entier ==> int i
                                                                                                                                                                                            2 + 3 ===> 2+3

 

Toi,tu pars d'un cas global pour traiter petit à petit tout les cas

 

1) Ayant des lacunes pour rédiger en bison comment faire pour définir par exemple dans la suite d'instruction

 
Code :
  1. # | MOT_CLE_SI   Booleen  MOT_CLE ALORS  Suite_Instructions  MOT_CLE_SINON  Suite_Instructions  MOT_CLE_FINSI
 

il faudrait faire quelques chose du  type

 
Code :
  1. if : SI BOOL  ALORS if SINON
 

Suis je obligé de trjs mettre if pour symboliser la suite d'une instruction : comme tu le vois : je met "expr" pour signifier les arugements

 
Code :
  1. expr : SI expr ALORS expr SINON expr FIN
 

or les expres signifient des instructions différentes comment pourrais-je traiter les différents cas alors que leurs appellations sont les mêmes?

 

2) Je n'arrive pas à saisir l'utilité du  $$ par exemple dans cette partie

 
Code :
  1. | SI expr5 {$$=$2;}
 

Cela signifie t-il que $$ envoit à une sous fonction (si on peut appeller cela ainsi) l'argument 2?

 

3)Comment appeller de détailler une suite d'instruction

 
Code :
  1. expr5: expr5 ALORS expr5 SINON expr5 {$$=affiche5("if",$1,$3,"else",$5);};
 

mon expression ne marche pas par exemple si je met dans $1 a==b je ne peux mettre qu'une lettre or c'est tres loin de la fonction d'un if

 

Il faut donc dans cette expression qu'on rentre plus profondément pour détailler tout les données de (séparé le "a","=","=","b" ) or je ne vois pas comment faire la redirection même si tes exemples me mettent un peu sur la voie...ainsi je dois détailler chaque suite d'instruction.

 

Mes collègue me prenant pour un boulet m'apportent peu d'explication sauf m'insulter de faineant alors que je pourrai me cacher et bosser mes autres partiels. Vu qu'ils travaillent que tout les 2 (je ne reçois même plus les dernières modifs qu'ils ont fait enfin d'après eux ils ont rien modifié) je me retrouve avec comme seul explication "synthax error" alors que mon code est bon mais j'avais oublié un retour chariot dans le fichier de test par exemple .. ou qu'il fallait utiliser "# | IDENTIFIANT  {$$=$1;}" sinon mes expression n'étaient pas qualifié comme terminal. De plus il y a très peu de tuto en français sur bison alors j'ai du énormément de mal à débugger et ainsi progresser.

 

Je joue mon pleurnicheur je l'admet,mais j'ai l'impression que cette situation m'échappe totalement alors que je pensais qu'en m'y penchant dessus sérieusement j'arriverai à faire quelques chose de productif,je n'arrive pour l'instant pas à cerner les reflexes pour flex/bison et il faut le rendre samedi à 00:00  et vu que c'est parti..je doute qu'en 2,3 heures je vais y arriver :D

Message cité 1 fois
Message édité par zell789 le 30-05-2008 à 03:50:26
n°2485
Profil : Modérateur
Posté le 30-05-2008 à 11:31:04   answer
 

Normalement, le Bison, c'est facile. Enfin, surtout pour ce genre d'application...

 
zell789 a écrit :

1) Ayant des lacunes pour rédiger en bison comment faire pour définir par exemple dans la suite d'instruction

 
Code :
  1. # | MOT_CLE_SI   Booleen  MOT_CLE ALORS  Suite_Instructions  MOT_CLE_SINON  Suite_Instructions  MOT_CLE_FINSI


 

En fait, vu ton programme d'exemple, j'ai l'impression que :
- "si .... alors" être sur une ligne
- "sinon" et "finsi" également

 

Donc pour traduire ça en C
- "si .... alors" doit être transformé en "if (...) {"
- "sinon" en "} else {"
- "finsi" en "}"

 

Tout dépend si tu veux une vérification de la syntaxe de ton programme, ou simplement une transformation en supposant qu'il est correct. Tu remarqueras au passage qu'il manque le token pour fin_si. Cela dit, si ça s'arrêtait là, ça irait, mais il y a quantité de trucs qui ne fonctionnent pas sur le bout de code que tu donnes (tu peux l'effacer, si tu préfères... J'en ai gardé une copie si tu as une question précise dessus).

 

Rien que si j'écris

Code :
  1. i:=i+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1


ca va commencer à faire n'importe quoi, et si tu allonges la ligne, ça va faire segfault (les "affiche" utilisent un buffer de 64 octets qui va vite être trop plein).

 
zell789 a écrit :

2) Je n'arrive pas à saisir l'utilité du  $$ par exemple dans cette partie

 
Code :
  1. | SI expr5 {$$=$2;}
 

Cela signifie t-il que $$ envoit à une sous fonction (si on peut appeller cela ainsi) l'argument 2?


Je ne me suis pas étendu là-dessus... Le $$, c'est ce qui doit rester quand on tient compte de la règle. Dans ce cas précis, si tu tombes sur "SI qqchose" :
- le bout de code créé par Bison va décoder "qqchose" et en faire une chaine de caractère qu'il va stocker dans $2
- il te demande ce qu'il doit en faire : là, tu lui dit "remplace [SI qqchose] par le résultat de la règle sur qqchose

 

En gros, ça se lit "tu remplaces la suite de gauche par $2."

 
zell789 a écrit :

mon expression ne marche pas par exemple si je met dans $1 a==b je ne peux mettre qu'une lettre or c'est tres loin de la fonction d'un if


$1 contient une chaîne de caractères (char*) et non un seul caractère... Je ne suis pas certain de bien te suivre...

 
zell789 a écrit :

De plus il y a très peu de tuto en français sur bison alors j'ai du énormément de mal à débugger et ainsi progresser.


En voici un :
http://www.linux-france.org/articl [...] xyacc.html

 

(techniquement, c'est sur Yacc, mais Bison est juste un portage GNU de Yacc - d'où le jeu de mot à la noix - et c'est pareil. D'ailleurs, l'auteur utilise flex/bison à la place de lex/yacc)

 


Effectivement, le travail en groupe, ça peut vite tourner au cauchemar s'il y a des problèmes dans le groupe :(


Message édité par Koren le 30-05-2008 à 11:32:24
n°2486
Profil : Internaute
Posté le 30-05-2008 à 11:44:58   answer
 

Merci Koren  
 
Pour l'instant,je pense qu''ils penchent vers une solution transformation brute comme
 

Citation :

Simplement une transformation en supposant qu'il est correct.


 
Car en effet je pense que en simple traducteur cela passe bien mais il est très facile de le faire planter
 

Citation :

$1 contient une chaîne de caractères (char*) et non un seul caractère... Je ne suis pas certain de bien te suivre...


 
Si $1 contient ma chaine de caractère alors le "a==b" devrait donc pouvoir être traduit,or dans la partie de mon programme j'ai une synthax error si je tape plus de une lettre
 
Merci pour le tutorail,je n'aurai pas pensé à chercher lex/yacc
 

Citation :

Effectivement, le travail en groupe, ça peut vite tourner au cauchemar s'il y a des problèmes dans le groupe :(


 
D'un autre côté,ils sont méga en retard (on doit le rendre ce soir même si pr toi en 2,3 h c'est fait :p ) donc il est "normal" qu'il me laisse de coté,par contre ceux que je n'apprécie pas,c'est me prendre des insultes "quoi t'as que fait ça en 15 minutes t'abuses" alors que je suis sur la touche et que je ne comprend pas grand chose

n°2487
Profil : Modérateur
Posté le 30-05-2008 à 17:51:55   answer
 

zell789 a écrit :

D'un autre côté,ils sont méga en retard (on doit le rendre ce soir même si pr toi en 2,3 h c'est fait :p )


En fait, la pause que j'ai faite ce midi a suffi, donc nettement moins que ça ;)

 

Je t'envoie par MP des fichiers lex/yacc commentés qui ne sont pas la norme complète que vous avez à implémenter, mais qui en couvre une partie suffisante pour que le programme que tu donnais tout à l'heure soit traduit en C sans problème (il me semble). Je n'ai pas fait de tests extensifs, et il y a des ambiguïtés dans ma grammaire (il m'annonce une douzaine d'ambiguités je crois), mais il faut dire que j'ai du mal à comprendre où doivent se placer les points-virgule et les retour chariots dans le langage source...

 

Ce n'est bien évidemment pas une façon de faire le projet à votre place... Il y a plein de trous, c'est pour que tu puisses réfléchir sur une base à peu près propre... J'espère surtout que ça t'aidera à y voir un peu plus clair (après tout, le projet est surtout là pour vous compreniez comment ça fonctionne...). Essaie de voir comment rajouter ce qui manque, ça devrait t'éclairer sur la façon dont Flex/Bison se débrouille (tu verras, ça n'est pas si difficile). Et vois si ça peut t'aider à comprendre suffisamment comment ça marche pour que tu puisses te rendre utile aux deux autres.

Message cité 1 fois
Message édité par Koren le 30-05-2008 à 17:53:35
n°2488
Profil : Internaute
Posté le 31-05-2008 à 18:25:24   answer
 

Le travail de groupe, hors entreprise, si on ne choisit pas les meilleurs élèves de la classe, c'est la galère :/


---------------
Playfrance's Monk of Twilight -> Aru
n°2492
Profil : Internaute
Posté le 05-06-2008 à 22:20:48   answer
 

Koren a écrit :


En fait, la pause que j'ai faite ce midi a suffi, donc nettement moins que ça ;)  
 
Je t'envoie par MP des fichiers lex/yacc commentés qui ne sont pas la norme complète que vous avez à implémenter, mais qui en couvre une partie suffisante pour que le programme que tu donnais tout à l'heure soit traduit en C sans problème (il me semble). Je n'ai pas fait de tests extensifs, et il y a des ambiguïtés dans ma grammaire (il m'annonce une douzaine d'ambiguités je crois), mais il faut dire que j'ai du mal à comprendre où doivent se placer les points-virgule et les retour chariots dans le langage source...
 
Ce n'est bien évidemment pas une façon de faire le projet à votre place... Il y a plein de trous, c'est pour que tu puisses réfléchir sur une base à peu près propre... J'espère surtout que ça t'aidera à y voir un peu plus clair (après tout, le projet est surtout là pour vous compreniez comment ça fonctionne...). Essaie de voir comment rajouter ce qui manque, ça devrait t'éclairer sur la façon dont Flex/Bison se débrouille (tu verras, ça n'est pas si difficile). Et vois si ça peut t'aider à comprendre suffisamment comment ça marche pour que tu puisses te rendre utile aux deux autres.


 
Un grand merci à toi Koren ;)
 
Mes collègues se sont même demandé ou est ce que je trouvais des personnes aussi sympa :D
 
En tout cas j'en resors un peu plus grandi après ce projet même si je doute y retoucher si mon orientation réussi..
 

Citation :

Le travail de groupe, hors entreprise, si on ne choisit pas les meilleurs élèves de la classe, c'est la galère :


 
Ce sont des "amis" enfin après cela je suis un peu plus distant avec eux (enfin je décide aussi de changer d'école même si je suis qu' 20 % d'être pris)
 
Je suis loin d'être 'clean' dans cette affaire,pire je me sentais vraiment un boulet..Je n'ai juste pas apprécier de me bouffer des insultes alors que je tentais ce que je pouvais..

 Page :  1  2
Page Suivante 

Aller à :
     Ajouter une réponse
 




xbox france © 2000-2008, Splitgames Network - Tous droits réservés | Nous contacter
Les News et vidéos microsoft xbox 360 sur Xbox-France.

Conception SplitGames 2008 - Design graphique SplitGames et Cubedesigners 2008