compilateur

compilateur - C - Programmation

Marsh Posté le 19-05-2017 à 21:34:39    

Code :
  1. //<blocvar> ->  VAR<sdecl>FVAR
  2. //<sdecl> -> <decl> | <sdecle>,<decl>
  3. //<decl> -> i<chvar> = <nbrevar>
  4. //<nbrevar> -> <chvar> | <nbrevar><chvar>
  5. //<chvar> -> 0|1|2|3|4|5|6|7|8|9
  6. //<affectation> ? INSTR<sinstruction>SINSTR
  7. //<sinstruction> -> <intruction> | <sinstruction>,<instruction>
  8. //<instruction> -> i<chiffre> =  <oulogique>
  9. //<oulogique> -> <etlogique>| <oulogique> | <etlogique>
  10. //<etlogique> -> <PlusMoins>  | <etlogique> & <PlusMoins>
  11. // <plusmoins> ? <foisdiv> | <plusmoins> + <foisdiv> | <plusmoins> - <foisdiv>
  12. // <foisdiv> ? <opunaire> | <foisdiv> * <opunaire> | <foisdiv> / <opunaire>
  13. //<opunaire> -> <facteur> | - <facteur> | ~ <facteur> | + <facteur>
  14. // <facteur> ? <nombre> | ( <plusmoins> ) |  i<chiffre>
  15. //<nombre>-> <nombredeci> | 0b<nombrebin> | 0x<nombrehexa>
  16. //<nombrehexa> -> <chiffrehexa> | <nombrehexa><chiffrehexa>
  17. //<chiffrehexa> -> 0|1|2|3/4/5/6/7/8/9/A/B/C/D/E/F
  18. // <nombredeci> -> <chiffredeci> | <nombredeci><chiffredeci>
  19. // <Chiffre> -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
  20. // <nombrebin> -> <chiffrebin> | <nombrebin><chiffrebin>
  21. //<chiffrebin> -> 0 | 1
  22. #include <stdio.h>
  23. #include <ctype.h>
  24. #include <string.h>
  25. #include <stdlib.h>
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. //#include <unistd.h>
  29. //#include "SortieErreur.h"  
  30. void PlusMoins();
  31. void FoisDiv();
  32. void Facteur();
  33. void Nombre();
  34. int NombreDeci();
  35. int NombreBin();
  36. int ChiffreBin();
  37. int nombrehexa();
  38. int chiffrehexa();
  39. void CaractereSuivant();
  40. char CaractereCourant();
  41. void etlogique();
  42. void oulogique();
  43. void sinstruction();
  44. void instruction();
  45. void opunaire();
  46. void blocvar();
  47. void decl();
  48. void prog();
  49. int nbrevar();
  50. void sdecl();
  51. void affectation();
  52. char acExpr[500] ;
  53. // "VAR i1=3,i3=8 SVAR INSTR i1=i1*2,i3=i1+i1 SINSTR";//code source dans fichier source
  54.   // expression à compiler
  55. char bCourant = 0; // indice du caractère courant dans l'expression
  56. void main()
  57. {
  58. FILE     *hfF=NULL;
  59. if ((hfF = fopen("F:\\virton\\Bureau\\micro quadri 2\\compilateur\\compilateur\\expression.txt","r+" )) == NULL) 
  60. { printf("(Fichier1) Err. d'ouverture du fichier" ); 
  61. exit(1) ;
  62. }
  63. //fseek(hfF, SEEK_SET, 0);
  64. fread(acExpr,500,1,hfF);/*) != 1)   
  65. { printf("(Fichier14) Err. d'ouverture du fichier" );
  66. exit(1) ;  
  67. }*/
  68. printf("%s\n", &acExpr[0]);
  69. //oulogique(); // démarrer la compilation
  70. //
  71. blocvar();
  72. affectation();
  73. if (CaractereCourant() != 0)
  74.  printf("Le caractere %c a la position %d dans %s est invalide!",
  75.  acExpr[bCourant], bCourant + 1, acExpr);
  76. else
  77.  printf("La compilation s'est tres bien deroulee!" );
  78. fclose(hfF);
  79. }
  80. //<blocvar> VAR<sdecl>FVAR
  81. void blocvar()
  82. {
  83. if (strncmp(&acExpr[bCourant], "VAR",3) == 0)
  84. {
  85. // printf("\nint i%d =\n",CaractereCourant());
  86.  CaractereSuivant();
  87.  CaractereSuivant();
  88.  CaractereSuivant();
  89.  sdecl();
  90.  if (strncmp(&acExpr[bCourant], "SVAR",4) == 0)
  91.     {
  92.   CaractereSuivant();
  93.      CaractereSuivant();
  94.      CaractereSuivant();
  95.   CaractereSuivant();
  96.  }
  97. }
  98. }
  99. //<affectation> ? INSTR<sinstruction>SINSTR
  100. void affectation()
  101. {
  102. if (strncmp(&acExpr[bCourant], "INSTR", 5) == 0)
  103. {
  104.  printf("\nint main()\n{\n\t_asm\n\t{\n" );
  105.  CaractereSuivant();
  106.  CaractereSuivant();
  107.  CaractereSuivant();
  108.  CaractereSuivant();
  109.  CaractereSuivant();
  110.   sinstruction();
  111.  if (strncmp(&acExpr[bCourant], "SINSTR", 6) == 0)
  112.  {
  113.  CaractereSuivant();
  114.  CaractereSuivant();
  115.  CaractereSuivant();
  116.  CaractereSuivant();
  117.  CaractereSuivant();
  118.  CaractereSuivant();
  119.  printf("\n}\n}" );
  120.  }
  121. }
  122. }
  123. //<sinstruction> -> <intruction> | <sinstruction>,<instruction>
  124. void sinstruction()
  125. {
  126. instruction();
  127.  while ( CaractereCourant()== ',' )
  128.     {
  129.      
  130.             CaractereSuivant();
  131.   instruction();
  132.  }
  133. }
  134. //<sdecl> -> <decl> | <sdecl>,<decl>
  135. void sdecl()
  136. {
  137. decl();
  138.  while ( CaractereCourant()== ',' )
  139.     {
  140.      
  141.             CaractereSuivant();
  142.   decl();
  143.  }
  144. }
  145. //<instruction> -> i<chiffre> =  <oulogique>
  146. void instruction()
  147. {
  148. char nbre;
  149. if (CaractereCourant()== 'i')
  150. {
  151.  CaractereSuivant();
  152.  if(isdigit(CaractereCourant()))
  153.  {
  154.   //printf("\t\tpush i%d,eax\n", CaractereCourant());
  155.   nbre=CaractereCourant();
  156.   CaractereSuivant();
  157.   if(CaractereCourant()=='=')
  158.   {
  159.    CaractereSuivant();
  160.     oulogique();
  161.     printf("\t\tpop i%c\n",nbre);
  162.    // printf("\t\tmov i%c,eax\n",nbre);
  163.     //printf("push i1\npush 2\npop  ebx\npop  eax\nimul eax ebx \npush eax\n pop  i1\n" );
  164.         
  165.   }
  166.      }
  167. }
  168. }
  169. //<decl> -> i<chvar> = <nbrevar>
  170. void decl()
  171. {
  172.  char nbre;
  173. if (CaractereCourant()== 'i')
  174. {
  175.  printf("int i" );
  176.  CaractereSuivant();
  177.  if(isdigit(CaractereCourant()))
  178.  {
  179.   //printf("\t\tpush i%d,eax\n", CaractereCourant());
  180.   nbre=CaractereCourant();
  181.   printf("%c ",nbre);
  182.   CaractereSuivant();
  183.   if(CaractereCourant()=='=')
  184.   {
  185.    //printf("=%c\n",CaractereCourant());
  186.    CaractereSuivant();
  187.    printf("= %c;\n",CaractereCourant());
  188.     nbrevar();
  189.         
  190.   }
  191.      }
  192. }
  193. }
  194. // Cette fonction prend en compte les règles de grammaire:
  195. //<opunaire> -> <facteur> | - <facteur> | ~ <facteur> | + <facteur>
  196. void opunaire()
  197. {
  198.  switch(CaractereCourant())
  199.         {
  200.         case '~':
  201.   CaractereSuivant();
  202.            Facteur();
  203.            printf("pop eax\n" );
  204.     printf("not eax\n" );
  205.     printf("push eax\n" );
  206.             break;
  207.         case '-':
  208.   CaractereSuivant();
  209.             Facteur();
  210.            printf("pop eax\n" );
  211.     printf("imul eax,-1\n" );
  212.     printf("push eax\n" );
  213.     break;
  214.  case '+':
  215.   CaractereSuivant();
  216.   Facteur();
  217.   break;
  218.  default:
  219.   Facteur();
  220.   break;
  221. }
  222.    
  223. }
  224. // Cette fonction prend en compte les règles de grammaire:
  225. //<oulogique> -> <oulogique> | <etlogique>
  226. void oulogique()
  227. {
  228.  
  229. etlogique();
  230.     while ( CaractereCourant()== '|' )
  231.     {
  232.      
  233.             CaractereSuivant();
  234.   etlogique();
  235.    printf("\tpop ebx\n" );
  236.              printf("\tpop eax\n" );
  237.              printf("\tor eax, ebx\n" );
  238.              printf("\tpush eax\n" );
  239.         }
  240.    
  241.  
  242. }
  243. // Cette fonction prend en compte les règles de grammaire:
  244. //<etlogique> -> <etlogique> | <PlusMoins> & <PlusMoins>
  245. void etlogique()
  246. {
  247. PlusMoins();
  248. while( CaractereCourant()== '&' )
  249. {
  250.            CaractereSuivant();
  251.   PlusMoins();
  252.    printf("\tpop ebx\n" );
  253.              printf("\tpop eax\n" );
  254.              printf("\tand eax, ebx\n" );
  255.              printf("\tpush eax\n" );
  256. }
  257. // Cette fonction prend en compte les règles de grammaire:
  258. // <plusmoins> ? <foisdiv> | <plusmoins> + <foisdiv> | <plusmoins> - <foisdiv>
  259. void PlusMoins()
  260. {
  261. FoisDiv();
  262. while (CaractereCourant() == '+' || CaractereCourant() == '-')
  263. {
  264.  switch(CaractereCourant())
  265.  {
  266. case '+':
  267. CaractereSuivant();
  268. FoisDiv();
  269. printf("pop ebx\n" );
  270. printf("pop eax\n" );
  271. printf("add eax, ebx\n" );
  272. printf("push eax\n" );
  273. break;
  274. case '-':
  275. CaractereSuivant();
  276. FoisDiv();
  277. printf("pop ebx\n" );
  278. printf("pop eax\n" );
  279. printf("sub eax, ebx\n" );
  280. printf("push eax\n" );
  281.  }
  282. }
  283. }
  284. // Cette fonction prend en compte les règles de grammaire:
  285. // <foisdiv> ? <opunaire> | <foisdiv> * <opunaire> | <foisdiv> / <opunaire>
  286. void FoisDiv()
  287. {
  288. opunaire();
  289. while (CaractereCourant() == '*' || CaractereCourant() == '/')
  290. {
  291.  switch (CaractereCourant())
  292.  {
  293.  case '*':
  294.   CaractereSuivant();
  295.   opunaire();
  296.   printf("pop ebx\n" );
  297.   printf("pop eax\n" );
  298.   printf("imul eax, ebx\n" );
  299.   printf("push eax\n" );
  300.   break;
  301.  case '/':
  302.   CaractereSuivant();
  303.   opunaire();
  304.   printf("pop ebx\n" );
  305.   printf("pop eax\n" );
  306.   printf("cdq\n" );
  307.   printf("idiv ebx\n" );
  308.   printf("push eax\n" );
  309.  }
  310. }
  311. }
  312. // Cette fonction prend en compte les règles de grammaire:
  313. // <facteur> ? ( <plusmoins> ) | <nombre> | <nbrevar>
  314. void Facteur()
  315. {
  316. if (CaractereCourant() == '(')
  317. {
  318.  CaractereSuivant();
  319.  oulogique();
  320.  if (CaractereCourant() == ')')
  321.   CaractereSuivant();
  322. }
  323. else
  324. {
  325.  if (CaractereCourant()== 'i')
  326.  {
  327.   CaractereSuivant();
  328.   if(isdigit(CaractereCourant()))
  329.   {
  330.    printf("\t\tpush i%c\n", CaractereCourant());
  331.    CaractereSuivant();
  332.   }
  333.      }
  334. else
  335.  Nombre();
  336. }
  337. }
  338. // Cette fonction prend en compte les règles de grammaire:
  339. // <nombre> -> <nombredeci> | 0b<nombrebin>
  340. void Nombre()
  341. {
  342. if(strncmp(&acExpr[bCourant], "0b", 2) == 0)
  343. {
  344.  CaractereSuivant();
  345.  CaractereSuivant();
  346.  NombreBin();
  347. }
  348. if(strncmp(&acExpr[bCourant], "0x", 2) == 0)
  349. {
  350.  CaractereSuivant();
  351.  CaractereSuivant();
  352.  nombrehexa();
  353. } else
  354. {
  355.  NombreDeci();
  356. }
  357. }
  358. // Cette fonction prend en compte les règles de grammaire:
  359. // <nombredeci> -> <chiffredeci> | <nombredeci><chiffredeci>
  360. // <Chiffre> -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
  361. int NombreDeci()
  362. {
  363. int iVal = 0;
  364. if (isdigit(CaractereCourant()) != 0)
  365. {
  366.  while (isdigit(CaractereCourant()) != 0)
  367.   {
  368.   iVal = (iVal * 10) + (CaractereCourant() - 0x30);
  369.   CaractereSuivant();
  370.  }
  371.  printf("push %d\n", iVal);
  372. }
  373. return iVal;
  374. }
  375. //<nbrevar> -> <chvar> | <nbrevar><chvar>
  376. int nbrevar()
  377. {
  378. int iVal = 0;
  379. if (isdigit(CaractereCourant()) != 0)
  380. {
  381.  while (isdigit(CaractereCourant()) != 0)
  382.   {
  383.   iVal = (iVal * 10) + (CaractereCourant() - 0x30);
  384.   CaractereSuivant();
  385.  }
  386.  //printf("push %d\n", iVal);
  387. }
  388. return iVal;
  389. }
  390. // Cette fonction prend en compte les règles de grammaire:
  391. // <nombrebin> -> <chiffrebin> | <nombrebin><chiffrebin>
  392. int NombreBin()
  393. {
  394. int iVal = 0;
  395. if (ChiffreBin() != 0)
  396. {
  397.  while (ChiffreBin() != 0)
  398.  {
  399.   iVal = (iVal * 2) + (CaractereCourant() - 0x30);
  400.   CaractereSuivant();
  401.  }
  402.  printf("push %d\n", iVal);
  403. }
  404. return iVal;
  405. }
  406. // Cette fonction prend en compte les règles de grammaire:
  407. // <chiffrebin> -> 0 | 1
  408. int ChiffreBin()
  409. {
  410. if (CaractereCourant() == '0' || CaractereCourant() == '1')
  411.  return 1;
  412. else return 0;
  413. }
  414. // Cette fonction prend en compte les règles de grammaire:
  415. //<chiffrehexa> -> 0|1|2|3/4/5/6/7/8/9/A/B/C/D/E/F
  416. int chiffrehexa()
  417. {
  418. if((CaractereCourant() >= '0' && CaractereCourant() <= '9')|| (CaractereCourant() >= 'A' && CaractereCourant() <= 'F'))
  419.  return 1;
  420. else return 0;
  421. }
  422. // cette fonction prend en compte les règles de grammaire:
  423. //<nombre>-> <nombredeci> | 0b<nombrebin> | 0x<nombrehexa>
  424. //<nombrehexa> -> <chiffrehexa> | <nombrehexa><chiffrehexa>
  425. //<chiffrehexa> -> 0|1|2|3/4/5/6/7/8/9/A/B/C/D/E/F
  426. int nombrehexa()
  427. {
  428. int iVal=0;
  429. if(chiffrehexa() != 0)
  430. {
  431.  while(chiffrehexa() != 0)
  432.  {
  433. if(isdigit(CaractereCourant()))
  434. {
  435.  iVal=(iVal*16)+(CaractereCourant()-0x30);
  436.  CaractereSuivant();
  437. }
  438. else
  439. {
  440.  iVal=(iVal*16)+(CaractereCourant()-55);
  441.  CaractereSuivant();
  442. }
  443.  }
  444. printf("push %d\n", iVal);
  445. }
  446. return iVal;
  447. }
  448. // Cette fonction passe au caractère suivant dans l'expression
  449. void CaractereSuivant()
  450. {
  451. do
  452.  bCourant++;
  453. while (acExpr[bCourant] == ' '); // éliminer les espaces
  454. }
  455. // Cette fonction retourne le caractère courant de l'expression
  456. char CaractereCourant()
  457. {
  458. return acExpr[bCourant];
  459. }
  460. //mettre à jour hexa et chiffre héxa  >>>0x

Message cité 1 fois
Message édité par bjs le 20-05-2017 à 00:20:30
Reply

Marsh Posté le 19-05-2017 à 21:34:39   

Reply

Marsh Posté le 19-05-2017 à 22:20:48    

bjs a écrit :

avec les fichier j'ai un souci

C'est à dire? "un soucis" c'est une très mauvaise description, il faut être précis. :o  
 
Il vient faire quoi ce fflush() ligne 66? :??:  
 
Ton appel de fread() + le if() c'est douteux, tu demandes 500*1 octets alors que d'après le commentaire ligne 59 le fichier en contient beaucoup moins, du coup ton code indique une erreur (avec le mauvais texte d'ailleurs).
Citation du K&R:

Citation :

size_t fread(void *ptr, size_t size, size_t nobj, FILE *stream)
fread reads from stream into the array ptr at most nobj objects of size size.
fread returns the number of objects read; this may be less than the number requested. feof and ferror must be used to determine status.


 
Aussi tu devrais activer les warnings de ton compilateur (ou les prendre en compte :o ):
(Attention les n° de lignes ne correspondent pas forcément à ton code!)

Citation :

> "gcc" "t2.c" -Wall -O3 -std=c99 -o "t2.exe"
t2.c:56:6: warning: return type of 'main' is not 'int' [-Wmain]
t2.c: In function 'main':
t2.c:83:16: warning: array subscript has type 'char' [-Wchar-subscripts]
t2.c: In function 'blocvar':
t2.c:95:5: warning: array subscript has type 'char' [-Wchar-subscripts]
t2.c:102:9: warning: array subscript has type 'char' [-Wchar-subscripts]
t2.c: In function 'affectation':
t2.c:114:5: warning: array subscript has type 'char' [-Wchar-subscripts]
t2.c:123:9: warning: array subscript has type 'char' [-Wchar-subscripts]
t2.c: In function 'Nombre':
t2.c:355:5: warning: array subscript has type 'char' [-Wchar-subscripts]
t2.c:361:5: warning: array subscript has type 'char' [-Wchar-subscripts]
t2.c: In function 'CaractereSuivant':
t2.c:467:5: warning: array subscript has type 'char' [-Wchar-subscripts]
t2.c: In function 'CaractereCourant':
t2.c:472:5: warning: array subscript has type 'char' [-Wchar-subscripts]

Reply

Marsh Posté le 20-05-2017 à 00:13:15    

j'ai réedité le code ça marche maintenant

Reply

Marsh Posté le 20-05-2017 à 00:18:43    

j'ai un seul warning dans mon visual c++ 2010 et on nous a dit d'ignorer ça et je pensais que fread retourne le nombre d'octets lus ??
1>f:\virton\bureau\micro quadri 2\ex1\ex1\exercice1.c(66): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(234) : voir la déclaration de 'fopen'


Message édité par bjs le 20-05-2017 à 00:20:01
Reply

Marsh Posté le 20-05-2017 à 16:59:26    

bjs a écrit :

j'ai réedité le code ça marche maintenant

C'est pas forcément une bonne idée de modifier ton message initial après-coup, ça peut prêter à confusion...
 
Aussi ta solution

Citation :

Code :
  1. //fseek(hfF, SEEK_SET, 0);
  2. fread(acExpr,500,1,hfF);/*) != 1)   
  3. { printf("(Fichier14) Err. d'ouverture du fichier" );
  4. exit(1) ;   
  5. }*/


c'est moche, tu as complètement viré le test plutôt que de le corriger et de faire quelque chose de propre (voir citation du K&R).

Citation :

j'ai un seul warning dans mon visual c++ 2010

alors ton compilateur est mal configuré! Les warnings ne sont pas là pour rien, il faut les activer et les prendre en compte!  
 
Par ailleurs attention aux "magic numbers": Ta taille de buffer (500) apparaît à deux endroits différents, si tu veux changer la valeur et tu oublies de modifier partout bonjour les ennuis. Utiliser des #define!
 
Je viens aussi de penser à un truc: Tu utilises fread() pour lire une chaîne de caractère, sauf que fread() c'est une fonction générique qui ne connaît pas cette notion et va donc pas terminer la chaîne lue par un '\0', ça peut créer des gros problèmes ça aussi. Si tu as un fichier texte qui remplit le buffer jusqu'à la derniere place je dirais que les appels strncmp() risquent de lire en dehors de la mémoire allouée sous certaines conditions, mais j'ai pas la tête suffisamment reposée à vrai dire pour y voir clair... À regarder de près.

Citation :

et on nous a dit d'ignorer ça

On vous a expliqué pourquoi aussi? (Non je ne sais pas, d'où ma question). Il ne faut jamais ignorer un warning à moins de savoir exactement ce qu'on fait.

Citation :

et je pensais que fread retourne le nombre d'octets lus ??

Voir citation du K&R. Ca retourne le nombre d'objets (pas forcément octets!!) lus. Regarde bien ton if() et la taille de ton fichier expression.txt, tu ne remarques rien?

Reply

Marsh Posté le 20-05-2017 à 18:15:17    

je vais essayer de corriger une erreur à la fois  
je voudrais savoir si ce test de fread est juste ou pas ? ça marche chez moi et ça met pas le message d'erreur mais bon je suis pas sur du test ==-1
je pense que fread retourne le nombre d'enregistrements lus et pas le nombre d'octets lus  et comme mon enregistrement fait moins de 500 alors il retourne 0 ??????? si mon fichier faisait 500 octets alors le test se deroulerait bien ?  
 
if(fread(acExpr,500,1,hfF) != 1)  
{ printf("(Fichier14t) Err. d'ouverture du fichier" );
exit(1) ;  
}
// j'ai essayé comme ça et je vois que fread retourne 0 je comprends pas pourquoi pourtant j'ai modifié mon fichier texte et je vois que il est bien lu et il est mis dans le vecteur acExpr donc je comprends pas pourquoi ça marche sans test du fread et quand je mets un test ça marche plus
nbrad= fread(acExpr,500,1,hfF);
printf("%d\n",nbrad);
if (nbrad != 1)
{ printf("(Fichier14t) Err. d'ouverture du fichier" );
exit(1) ;  
}


Message édité par bjs le 20-05-2017 à 19:09:00
Reply

Marsh Posté le 20-05-2017 à 19:12:05    

J'ai été voir la taille réelle du fichier et ça fait 40 octets maintenant. Le test fonctionne mais si j'avais fait une allocation dynamique ça aurait marché je pense??
 
nbrad= fread(acExpr,40,1,hfF);  
printf("%d\n",nbrad);  
if (nbrad != 1)  
{ printf("(Fichier14t) Err. d'ouverture du fichier" );  
exit(1) ;  
}

Message cité 1 fois
Message édité par bjs le 20-05-2017 à 20:36:50
Reply

Marsh Posté le 20-05-2017 à 19:12:26    

Merci de faire un effort au niveau lisibilité: Mettre le code entre balises et faire des phrases qui commencent avec une majuscule et se terminent par un point (ou un point d'interrogation).
 
Oui fread() retourne le nombre d'enregistrements (si on veut appeller ça comme ça) lus, je l'ai dit et c'est très clair dans la citation du K&R. Après ton code montre que tu n'as pas encore bien compris. Juste pour lever un doute, tu comprends l'anglais?
 
Refléchis tranquillement: Quelle est la taille de ton fichier? Que retourne donc fread()? Quel sera donc le résultat du test fread(...)!=1 ? Avant de modifier ton test, pense au fait que ton fichier peut avoir une autre taille. C'est vraiment pas bien compliqué cette histoire. Si on veut vraiment bien faire il faut regarder feof() et ferror(), sinon un simple if(fread(...) ...) avec la bonne condition (que je ne te donnes pas car c'est toi qui doit apprendre) peut suffir.
 
Par ailleurs ton message d'erreur est toujours faux, fread() n'ouvre pas le fichier mais lit le contenu.
 
>vecteur acExpr
Ce n'est pas un vecteur mais un tableau. Il est très important d'utiliser les bon termes (dés le début quand on apprend encore histoire de ne pas créer de mauvaises habitudes) pour éviter les malentendus!
 
EDIT:

bjs a écrit :

j'ai été voir la taille du fichier et ça fait 40 octets maintenant le test fonctionne

Modifie donc ton ficher, p.ex. en changeant le "code" à l'intérieur ou en rajoutant un simple espace et relance ton programme...


Message édité par rat de combat le 20-05-2017 à 19:13:57
Reply

Marsh Posté le 20-05-2017 à 19:24:14    

Je devrais faire une allocation dynamique ? pour que ça marche quelque soit la taille ? et je mets sizeof?


Message édité par bjs le 20-05-2017 à 20:26:05
Reply

Marsh Posté le 20-05-2017 à 20:13:47    

Je voudrais faire une allocation dynamique, comme ça quelque soit la taille du fichier, ça sera ecrit dans acExpr. J'ai modifié le code mais ça ne marche pas et je dois surement avoir une petite erreur. Le ftell me retourne une bonne valeur pour la taille du fichier.  
 

Code :
  1. char *acExpr ;
  2. int nbenreg=0;
  3. // "VAR i1=3,i3=8 SVAR INSTR i1=i1*2,i3=i1+i1 SINSTR";//code source dans fichier source
  4.   // expression à compiler
  5. char bCourant = 0;
  6. int nbrad=0;
  7. // indice du caractère courant dans l'expression
  8. void main()
  9. {
  10. FILE*hfF=NULL;
  11. if ((hfF = fopen("F:\\virton\\Bureau\\micro quadri 2\\compilateur\\compilateur\\expression.txt","r+" )) == NULL) 
  12. {
  13. printf("(Fichier1) Err. d'ouverture du fichier" ); 
  14.     exit(1) ;
  15. }
  16. /*je test avec ftell la taille du fichier.
  17. Je declare un maloc de la taille, ensuit je passe
  18. l'adr du maloc a fread et je lis tout le fichier en un fois
  19. et je passe l adr a acexpr */
  20. fseek(hfF,0,SEEK_END);
  21. nbenreg= ftell(hfF)/sizeof(char);
  22. printf("nbenre=%d\n",nbenreg);
  23. acExpr=(char*) malloc(nbenreg);
  24. nbrad= fread(acExpr,nbenreg,1,hfF);
  25. printf("nbrad = %d\n",nbrad);
  26. if (nbrad != 1)
  27. { printf("(Fichier14t) Err. de lecture du fichier" );
  28. exit(1) ; 
  29. }
  30. printf("%s\n", &acExpr[0]);


Message édité par bjs le 20-05-2017 à 20:43:55
Reply

Marsh Posté le 20-05-2017 à 20:13:47   

Reply

Marsh Posté le 20-05-2017 à 20:15:38    

Citation :

Merci de faire un effort au niveau lisibilité: Mettre le code entre balises et faire des phrases qui commencent avec une majuscule et se terminent par un point (ou un point d'interrogation).

(éditer ta réponse précédente)

Reply

Marsh Posté le 20-05-2017 à 20:49:04    

>fseek(hfF,0,SEEK_END)
Il faut revenir au début du fichier ensuite si tu veux lire quelque chose...
 
Il y a plusieurs d'autres trucs dans ton code qu'on peut critiquer, mais je ne veux pas faire ton boulot. Juste une chose, ton commentaire "je test avec ftell ..." c'est n'importe quoi. ftell() ne teste rien du tout, la fonction malloc qui prend deux 'L' par ailleurs est déclarée dans je ne sais quel header standard, toi tu l'utilises, tu ne passes pas l'adresse de malloc à fread ni à acExpr qui en plus est une variable alors qu'on passe des arguments (p.ex. des adresses) à des fonctions.  
Non, ce n'est pas de la méchanceté de ma part, il est très important de s'exprimer correctement pour éviter les malentendus et surtout pour un débutant histoire de ne pas prendre de mauvaises habitudes et bien comprendre les bases.

Reply

Marsh Posté le 20-05-2017 à 20:59:11    

Merci pour ton aide, tu es un pro. Le programme se compile bien et ça fait les bonnes instructions en assembleur mais j'ai des caractères qui se sont "introduits" à la fin de mon fichier... Je ne comprends pas d'où viennent ces caractères ; ç'est un exposant deux, quatre fois de suite, à la fin du fichier que j'ai crée et pourtant ils sont invisibles. Est ce que je dois rajouter un caractère 0 ? et comment ou bien à quel endroit du code je dois rajouter ce caractère 0 ?

Reply

Marsh Posté le 20-05-2017 à 21:06:51    

bjs a écrit :

Merci pour ton aide, tu es un pro.

Oh non, loin de là!

Citation :

Le programme se compile bien

Tu as activé les warnings et corrigé ces derniers aussi?

Citation :

j'ai des caractères qui se sont "introduits" à la fin de mon fichier... Je ne comprends pas d'où viennent ces caractères ; ç'est un exposant deux, quatre fois de suite, à la fin du fichier que j'ai crée et pourtant ils sont invisibles. Est ce que je dois rajouter un caractère 0 ? et comment ou bien à quel endroit du code je dois rajouter ce caractère 0 ?

Où est-ce que tu vois ces caractères exactement?
Laisse moi deviner: C'est sur l'écran au moment du printf("%s\n", &acExpr[0]); c'est ça? Qu'est ce que je disais plus haut concernant fread() et les chaînes de caractères? Le '\0' c'est la bonne piste.

Reply

Marsh Posté le 20-05-2017 à 21:30:10    

J'ai essayé plusieurs fois de rajouter un caractère '\0' de fin mais je ne sais pas en fait où je dois faire ça. Mon programme bug quand je rajoute un caractère zéro et je sais pas comment le faire ni où le faire.


Message édité par bjs le 20-05-2017 à 21:38:15
Reply

Marsh Posté le 20-05-2017 à 21:40:25    

Essayer au pif c'est pas la bonne solution.
Qu'est-ce que c'est qu'une chaîne de caractère en C? Exact, un tableau avec des codes ASCII et '\0' en dernière position.
Donc si j'ai char str[]="hardware"; en mémoire je vais avoir (quelque part, peu importe l'adresse) une suite d'octets: 104 97 114 100 119 97 114 101 0 (en supposant '\0' == 0). Dans ton code c'est fread qui s'occupe de remplir ton tableau quelque part en mémoire.
 
Donc il faut mettre le '\0' où dans le code et où en mémoire?

Reply

Marsh Posté le 20-05-2017 à 21:50:52    

Je ne sais pas; là je vois pas.

Reply

Marsh Posté le 20-05-2017 à 22:25:45    

Est ce que ça marcherait si je modifie cette fonction ? je rajoute le caractère zéro après INSTR.
//<affectation> ? INSTR<sinstruction>SINSTR

Code :
  1. void affectation()
  2. {
  3. if (strncmp(&acExpr[bCourant], "INSTR", 5) == 0)
  4. {
  5.  printf("\nint main()\n{\n\t_asm\n\t{\n" );
  6.  CaractereSuivant();
  7.  CaractereSuivant();
  8.  CaractereSuivant();
  9.  CaractereSuivant();
  10.  CaractereSuivant();
  11.   sinstruction();
  12.  if (strncmp(&acExpr[bCourant], "SINSTR", 6) == 0)
  13.  {
  14.  CaractereSuivant();
  15.  CaractereSuivant();
  16.  CaractereSuivant();
  17.  CaractereSuivant();
  18.  CaractereSuivant();
  19.  CaractereSuivant();
  20.  acExpr[bCourant]=0;
  21.  printf("\n}\n}" );
  22.  }
  23. }
  24. }


Message édité par bjs le 20-05-2017 à 22:28:25
Reply

Marsh Posté le 20-05-2017 à 22:48:26    

Mais non, c'est pourtant evident, il faut rajouter le '\0' à la fin de acExpr (attention, il faut la place pour!) après le fread()!

Reply

Marsh Posté le 20-05-2017 à 23:06:52    

Comme ça ?

Code :
  1. fseek(hfF,0,SEEK_END);
  2. nbenreg= ftell(hfF)/sizeof(char);
  3. printf("nbenre=%d\n",nbenreg);
  4. acExpr= (char*) malloc (nbenreg+1);
  5. fseek(hfF,0,SEEK_SET);
  6. nbrad= fread(acExpr,nbenreg,1,hfF);
  7. acExpr[nbenreg]=0;
  8. printf("nbrad = %d\n",nbrad);


Message édité par bjs le 20-05-2017 à 23:11:14
Reply

Marsh Posté le 20-05-2017 à 23:26:52    

à première vue c'est bon.

Reply

Marsh Posté le 20-05-2017 à 23:35:02    

Mettre à jour le compilateur pour qu'il puisse lire le programme source depuis un fichier et écrire le programme en assembleur dans un autre fichier dont l'extension est .c  
 
ah ok j'ai compris je dois mettre des fprintf comme ça ça copie mes instructions assembleur dans un fichier que je declare en global ???
J'ai aussi rajouté des lignes pour fermer le fichier et libérer la mémoire à la fin du main.
fclose(hfF);
free(acExpr);
acExpr=NULL;


Message édité par bjs le 21-05-2017 à 00:07:54
Reply

Marsh Posté le 21-05-2017 à 01:12:33    

J'ai modifié juste les printf en fprintf pour copier mon code assembleur généré dans un fichier que j'ai crée en .c et j'ai déclaré un pointeur de fichier en global.
Si tu as le temps tu peux jeter un coup d'oeil, mais je pense que ça marche car j'ai compilé, puis j'ai vu que ça chargeait bien le code assembleur dans le fichier.c que j'ai crée et puis j'ai recompilé et regardé en debogeur pour voir si ça mettait les bon calculs et ç'était ok.
Quelques messages avant celui ci tu m'a écrit : "Il y a plusieurs d'autres trucs dans ton code qu'on peut critiquer, mais je ne veux pas faire ton boulot."
Je voudrais savoir quelles choses sont pas bien dans mon code. Merci de me dire quoi. Je voudrais savoir aussi comment activer les warnings sur visual c++ 2010. J'ai déjà des warnings mais peut être qu'il y a un level supérieur en warnings ??
J'ai mis enable all warnings et ça me rien de spécial en warnings à par ce même warning pour toutes mes fonctions=>
1>f:\virton\bureau\micro quadri 2\ex1\ex1\exercice1.c(453): warning C4255: 'Nombre' : aucun prototype de fonction fourni : conversion de '()' en '(void)'
 

Code :
  1. //<blocvar> ->  VAR<sdecl>FVAR
  2. //<sdecl> -> <decl> | <sdecle>,<decl>
  3. //<decl> -> i<chvar> = <nbrevar>
  4. //<nbrevar> -> <chvar> | <nbrevar><chvar>
  5. //<chvar> -> 0|1|2|3|4|5|6|7|8|9
  6. //<affectation> ? INSTR<sinstruction>SINSTR
  7. //<sinstruction> -> <intruction> | <sinstruction>,<instruction>
  8. //<instruction> -> i<chiffre> =  <oulogique>
  9. //<oulogique> -> <etlogique>| <oulogique> | <etlogique>
  10. //<etlogique> -> <PlusMoins>  | <etlogique> & <PlusMoins>
  11. // <plusmoins> ? <foisdiv> | <plusmoins> + <foisdiv> | <plusmoins> - <foisdiv>
  12. // <foisdiv> ? <opunaire> | <foisdiv> * <opunaire> | <foisdiv> / <opunaire>
  13. //<opunaire> -> <facteur> | - <facteur> | ~ <facteur> | + <facteur>
  14. // <facteur> ? <nombre> | ( <plusmoins> ) |  i<chiffre>
  15. //<nombre>-> <nombredeci> | 0b<nombrebin> | 0x<nombrehexa>
  16. //<nombrehexa> -> <chiffrehexa> | <nombrehexa><chiffrehexa>
  17. //<chiffrehexa> -> 0|1|2|3/4/5/6/7/8/9/A/B/C/D/E/F
  18. // <nombredeci> -> <chiffredeci> | <nombredeci><chiffredeci>
  19. // <Chiffre> -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
  20. // <nombrebin> -> <chiffrebin> | <nombrebin><chiffrebin>
  21. //<chiffrebin> -> 0 | 1
  22. #include <stdio.h>
  23. #include <ctype.h>
  24. #include <string.h>
  25. #include <stdlib.h>
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. //#include <unistd.h>
  29. //#include "SortieErreur.h"  
  30. void PlusMoins();
  31. void FoisDiv();
  32. void Facteur();
  33. void Nombre();
  34. int NombreDeci();
  35. int NombreBin();
  36. int ChiffreBin();
  37. int nombrehexa();
  38. int chiffrehexa();
  39. void CaractereSuivant();
  40. char CaractereCourant();
  41. void etlogique();
  42. void oulogique();
  43. void sinstruction();
  44. void instruction();
  45. void opunaire();
  46. void blocvar();
  47. void decl();
  48. void prog();
  49. int nbrevar();
  50. void sdecl();
  51. void affectation();
  52. char *acExpr ;
  53. int taillefichier=0;
  54. FILE* hfich=NULL;
  55. // "VAR i1=3,i3=8 SVAR INSTR i1=i1*2,i3=i1+i1 SINSTR";//code source dans fichier source
  56.   // expression à compiler
  57. char bCourant = 0;
  58. int nbretourread=0;
  59. // indice du caractère courant dans l'expression
  60. void main()
  61. {
  62. FILE*hfF=NULL;
  63. if ((hfF = fopen("F:\\virton\\Bureau\\micro quadri 2\\ex1\\expression.txt","r+" )) == NULL)  //"F:\\virton\\Bureau\\micro quadri 2\\compilateur\\compilateur\\expression.txt","r+" )) == NULL)   
  64. {
  65. printf("(Fichier1) Err. d'ouverture du fichier" ); 
  66.     exit(1) ;
  67. }
  68. fseek(hfF,0,SEEK_END);
  69. taillefichier= ftell(hfF)/sizeof(char);
  70. printf("//taillefichier=%d\n",taillefichier);
  71. acExpr= (char*) malloc (taillefichier+1);
  72. if(acExpr==NULL)
  73. {
  74. printf("Erreur d'allocation dynamique" );
  75. }
  76. fseek(hfF,0,SEEK_SET);
  77. nbretourread= fread(acExpr,taillefichier,1,hfF);
  78. acExpr[taillefichier]='\0';
  79. printf("//nbrretourread = %d\n",nbretourread);  
  80. if (nbretourread != 1)
  81. { printf("(Fichier14t) Err. de lecture du fichier" );
  82. exit(1) ; 
  83. }
  84. printf("//%s\n", &acExpr[0]);
  85. // démarrer la compilation
  86. //
  87. if ((hfich = fopen("F:\\virton\\Bureau\\micro quadri 2\\ex1\\fichier.c","w" )) == NULL)  //"F:\\virton\\Bureau\\micro quadri 2\\compilateur\\compilateur\\expression.txt","r+" )) == NULL)   
  88. {
  89. printf("(Fichier1) Err. d'ouverture du fichier" ); 
  90.     exit(1) ;
  91. }
  92. blocvar();
  93. affectation();
  94. if (CaractereCourant() != 0)
  95.  printf("Le caractere %c a la position %d dans %s est invalide!",
  96.  acExpr[bCourant], bCourant + 1, acExpr);
  97. else
  98.  printf("La compilation s'est bien deroulee!" );
  99. fclose(hfF);
  100. free(acExpr);
  101. acExpr=NULL;
  102. }
  103. //<blocvar> VAR<sdecl>FVAR
  104. void blocvar()
  105. {
  106. if (strncmp(&acExpr[bCourant], "VAR",3) == 0)
  107. {
  108.  CaractereSuivant();
  109.  CaractereSuivant();
  110.  CaractereSuivant();
  111.  sdecl();
  112.  if (strncmp(&acExpr[bCourant], "SVAR",4) == 0)
  113.     {
  114.   CaractereSuivant();
  115.      CaractereSuivant();
  116.      CaractereSuivant();
  117.   CaractereSuivant();
  118.  }
  119. }
  120. }
  121. //<affectation> ? INSTR<sinstruction>SINSTR
  122. void affectation()
  123. {
  124. if (strncmp(&acExpr[bCourant], "INSTR", 5) == 0)
  125. {
  126.  //printf("\nint main()\n{\n\t_asm\n\t{\n" );
  127.  fprintf(hfich,"\nint main()\n{\n\t_asm\n\t{\n" );
  128.  CaractereSuivant();
  129.  CaractereSuivant();
  130.  CaractereSuivant();
  131.  CaractereSuivant();
  132.  CaractereSuivant();
  133.   sinstruction();
  134.  if (strncmp(&acExpr[bCourant], "SINSTR", 6) == 0)
  135.  {
  136.  CaractereSuivant();
  137.  CaractereSuivant();
  138.  CaractereSuivant();
  139.  CaractereSuivant();
  140.  CaractereSuivant();
  141.  CaractereSuivant();
  142.  //printf("\n}\n}" );
  143.  fprintf(hfich,"\n}\n}" );
  144.  }
  145. }
  146. }
  147. //<sinstruction> -> <intruction> | <sinstruction>,<instruction>
  148. void sinstruction()
  149. {
  150. instruction();
  151.  while ( CaractereCourant()== ',' )
  152.     {
  153.      
  154.             CaractereSuivant();
  155.   instruction();
  156.  }
  157. }
  158. //<sdecl> -> <decl> | <sdecl>,<decl>
  159. void sdecl()
  160. {
  161. decl();
  162.  while ( CaractereCourant()== ',' )
  163.     {
  164.      
  165.             CaractereSuivant();
  166.   decl();
  167.  }
  168. }
  169. //<instruction> -> i<chiffre> =  <oulogique>
  170. void instruction()
  171. {
  172. char nbre;
  173. if (CaractereCourant()== 'i')
  174. {
  175.  CaractereSuivant();
  176.  if(isdigit(CaractereCourant()))
  177.  {
  178.   //printf("\t\tpush i%d,eax\n", CaractereCourant());
  179.   nbre=CaractereCourant();
  180.   CaractereSuivant();
  181.   if(CaractereCourant()=='=')
  182.   {
  183.    CaractereSuivant();
  184.     oulogique();
  185.     fprintf(hfich,"\t\tpop i%c\n",nbre);
  186.     //printf("\t\tpop i%c\n",nbre);
  187.    // printf("\t\tmov i%c,eax\n",nbre);
  188.     //printf("push i1\npush 2\npop  ebx\npop  eax\nimul eax ebx \npush eax\n pop  i1\n" );
  189.         
  190.   }
  191.      }
  192. }
  193. }
  194. //<decl> -> i<chvar> = <nbrevar>
  195. void decl()
  196. {
  197.  char nbre;
  198. if (CaractereCourant()== 'i')
  199. {
  200.  //printf("int i" );
  201.  fprintf(hfich,"int i" );
  202.  CaractereSuivant();
  203.  if(isdigit(CaractereCourant()))
  204.  {
  205.   nbre=CaractereCourant();
  206.   //printf("%c ",nbre);
  207.   fprintf(hfich,"%c ",nbre);
  208.   CaractereSuivant();
  209.   if(CaractereCourant()=='=')
  210.   {
  211.    CaractereSuivant();
  212.    //printf("= %c;\n",CaractereCourant());
  213.    fprintf(hfich,"= %c;\n",CaractereCourant());
  214.     nbrevar();
  215.         
  216.   }
  217.      }
  218. }
  219. }
  220. // Cette fonction prend en compte les règles de grammaire:
  221. //<opunaire> -> <facteur> | - <facteur> | ~ <facteur> | + <facteur>
  222. void opunaire()
  223. {
  224.  switch(CaractereCourant())
  225.         {
  226.         case '~':
  227.   CaractereSuivant();
  228.            Facteur();
  229.           // printf("pop eax\n" );
  230.    // printf("not eax\n" );
  231.    // printf("push eax\n" );
  232.     fprintf(hfich,"pop eax\nnot eax\npush eax\n" );
  233.             break;
  234.         case '-':
  235.   CaractereSuivant();
  236.             Facteur();
  237.            //printf("pop eax\n" );
  238.   //  printf("imul eax,-1\n" );
  239.    // printf("push eax\n" );
  240.     fprintf(hfich,"pop eax\nimul eax,-1\npush eax\n" );
  241.     break;
  242.  case '+':
  243.   CaractereSuivant();
  244.   Facteur();
  245.   break;
  246.  default:
  247.   Facteur();
  248.   break;
  249. }
  250.    
  251. }
  252. // Cette fonction prend en compte les règles de grammaire:
  253. //<oulogique> -> <oulogique> | <etlogique>
  254. void oulogique()
  255. {
  256.  
  257. etlogique();
  258.     while ( CaractereCourant()== '|' )
  259.     {
  260.      
  261.             CaractereSuivant();
  262.   etlogique();
  263.   // printf("pop ebx\n" );
  264.             // printf("pop eax\n" );
  265.            //  printf("or eax, ebx\n" );
  266.             // printf("push eax\n" );
  267.   fprintf(hfich,"pop ebx\npop eax\nor eax, ebx\npush eax\n" );
  268.         }
  269.    
  270.  
  271. }
  272. // Cette fonction prend en compte les règles de grammaire:
  273. //<etlogique> -> <etlogique> | <PlusMoins> & <PlusMoins>
  274. void etlogique()
  275. {
  276. PlusMoins();
  277. while( CaractereCourant()== '&' )
  278. {
  279.            CaractereSuivant();
  280.   PlusMoins();
  281.   // printf("\tpop ebx\n" );
  282.             // printf("\tpop eax\n" );
  283.            //  printf("\tand eax, ebx\n" );
  284.             // printf("\tpush eax\n" );
  285.    fprintf(hfich,"pop ebx\npop eax\and eax, ebx\npush eax\n" );
  286. }
  287. // Cette fonction prend en compte les règles de grammaire:
  288. // <plusmoins> ? <foisdiv> | <plusmoins> + <foisdiv> | <plusmoins> - <foisdiv>
  289. void PlusMoins()
  290. {
  291. FoisDiv();
  292. while (CaractereCourant() == '+' || CaractereCourant() == '-')
  293. {
  294.  switch(CaractereCourant())
  295.  {
  296. case '+':
  297. CaractereSuivant();
  298. FoisDiv();
  299. // printf("pop ebx\n" );
  300. // printf("pop eax\n" );
  301. // printf("add eax, ebx\n" );
  302. // printf("push eax\n" );
  303. fprintf(hfich,"pop ebx\npop eax\nadd eax, ebx\npush eax\n" );
  304. break;
  305. case '-':
  306. CaractereSuivant();
  307. FoisDiv();
  308. // printf("pop ebx\n" );
  309. // printf("pop eax\n" );
  310. // printf("sub eax, ebx\n" );
  311. // printf("push eax\n" );
  312. fprintf(hfich,"pop ebx\npop eax\nsub eax, ebx\npush eax\n" );
  313.  }
  314. }
  315. }
  316. // Cette fonction prend en compte les règles de grammaire:
  317. // <foisdiv> ? <opunaire> | <foisdiv> * <opunaire> | <foisdiv> / <opunaire>
  318. void FoisDiv()
  319. {
  320. opunaire();
  321. while (CaractereCourant() == '*' || CaractereCourant() == '/')
  322. {
  323.  switch (CaractereCourant())
  324.  {
  325.  case '*':
  326.   CaractereSuivant();
  327.   opunaire();
  328. //  printf("pop ebx\n" );
  329. //  printf("pop eax\n" );
  330. //  printf("imul eax, ebx\n" );
  331. //  printf("push eax\n" );
  332.   fprintf(hfich,"pop ebx\npop eax\nimul eax, ebx\npush eax\n" );
  333.   break;
  334.  case '/':
  335.   CaractereSuivant();
  336.   opunaire();
  337.  // printf("pop ebx\n" );
  338.  // printf("pop eax\n" );
  339.  // printf("cdq\n" );
  340.  // printf("idiv ebx\n" );
  341.  // printf("push eax\n" );
  342.   fprintf(hfich,"pop ebx\npop eax\ncdq\nidiv ebx\npush eax\n" );
  343.  }
  344. }
  345. }
  346. // Cette fonction prend en compte les règles de grammaire:
  347. // <facteur> ? ( <plusmoins> ) | <nombre> | <nbrevar>
  348. void Facteur()
  349. {
  350. if (CaractereCourant() == '(')
  351. {
  352.  CaractereSuivant();
  353.  oulogique();
  354.  if (CaractereCourant() == ')')
  355.   CaractereSuivant();
  356. }
  357. else
  358. {
  359.  if (CaractereCourant()== 'i')
  360.  {
  361.   CaractereSuivant();
  362.   if(isdigit(CaractereCourant()))
  363.   {
  364.    //printf("push i%c\n", CaractereCourant());
  365.    fprintf(hfich,"push i%c\n", CaractereCourant());
  366.    CaractereSuivant();
  367.   }
  368.      }
  369. else
  370.  Nombre();
  371. }
  372. }
  373. // Cette fonction prend en compte les règles de grammaire:
  374. // <nombre> -> <nombredeci> | 0b<nombrebin>
  375. void Nombre()
  376. {
  377. if(strncmp(&acExpr[bCourant], "0b", 2) == 0)
  378. {
  379.  CaractereSuivant();
  380.  CaractereSuivant();
  381.  NombreBin();
  382. }
  383. if(strncmp(&acExpr[bCourant], "0x", 2) == 0)
  384. {
  385.  CaractereSuivant();
  386.  CaractereSuivant();
  387.  nombrehexa();
  388. } else
  389. {
  390.  NombreDeci();
  391. }
  392. }
  393. // Cette fonction prend en compte les règles de grammaire:
  394. // <nombredeci> -> <chiffredeci> | <nombredeci><chiffredeci>
  395. // <Chiffre> -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
  396. int NombreDeci()
  397. {
  398. int iVal = 0;
  399. if (isdigit(CaractereCourant()) != 0)
  400. {
  401.  while (isdigit(CaractereCourant()) != 0)
  402.   {
  403.   iVal = (iVal * 10) + (CaractereCourant() - 0x30);
  404.   CaractereSuivant();
  405.  }
  406.  //printf("push %d\n", iVal);
  407. // fprintf(hfich,"push %d\n", iVal);
  408. }
  409. return iVal;
  410. }
  411. //<nbrevar> -> <chvar> | <nbrevar><chvar>
  412. int nbrevar()
  413. {
  414. int iVal = 0;
  415. if (isdigit(CaractereCourant()) != 0)
  416. {
  417.  while (isdigit(CaractereCourant()) != 0)
  418.   {
  419.   iVal = (iVal * 10) + (CaractereCourant() - 0x30);
  420.   CaractereSuivant();
  421.  }
  422.  //printf("push %d\n", iVal);
  423.  //fprintf(hfich,"push %d\n", iVal);
  424. }
  425. return iVal;
  426. }
  427. // Cette fonction prend en compte les règles de grammaire:
  428. // <nombrebin> -> <chiffrebin> | <nombrebin><chiffrebin>
  429. int NombreBin()
  430. {
  431. int iVal = 0;
  432. if (ChiffreBin() != 0)
  433. {
  434.  while (ChiffreBin() != 0)
  435.  {
  436.   iVal = (iVal * 2) + (CaractereCourant() - 0x30);
  437.   CaractereSuivant();
  438.  }
  439.  //printf("push %d\n", iVal);
  440.  fprintf(hfich,"push %d\n", iVal);
  441. }
  442. return iVal;
  443. }
  444. // Cette fonction prend en compte les règles de grammaire:
  445. // <chiffrebin> -> 0 | 1
  446. int ChiffreBin()
  447. {
  448. if (CaractereCourant() == '0' || CaractereCourant() == '1')
  449.  return 1;
  450. else return 0;
  451. }
  452. // Cette fonction prend en compte les règles de grammaire:
  453. //<chiffrehexa> -> 0|1|2|3/4/5/6/7/8/9/A/B/C/D/E/F
  454. int chiffrehexa()
  455. {
  456. if((CaractereCourant() >= '0' && CaractereCourant() <= '9')|| (CaractereCourant() >= 'A' && CaractereCourant() <= 'F'))
  457.  return 1;
  458. else return 0;
  459. }
  460. // cette fonction prend en compte les règles de grammaire:
  461. //<nombre>-> <nombredeci> | 0b<nombrebin> | 0x<nombrehexa>
  462. //<nombrehexa> -> <chiffrehexa> | <nombrehexa><chiffrehexa>
  463. //<chiffrehexa> -> 0|1|2|3/4/5/6/7/8/9/A/B/C/D/E/F
  464. int nombrehexa()
  465. {
  466. int iVal=0;
  467. if(chiffrehexa() != 0)
  468. {
  469.  while(chiffrehexa() != 0)
  470.  {
  471. if(isdigit(CaractereCourant()))
  472. {
  473.  iVal=(iVal*16)+(CaractereCourant()-0x30);
  474.  CaractereSuivant();
  475. }
  476. else
  477. {
  478.  iVal=(iVal*16)+(CaractereCourant()-55);
  479.  CaractereSuivant();
  480. }
  481.  }
  482. //printf("push %d\n", iVal);
  483.  fprintf(hfich,"push %d\n", iVal);
  484. }
  485. return iVal;
  486. }
  487. // Cette fonction passe au caractère suivant dans l'expression
  488. void CaractereSuivant()
  489. {
  490. do
  491.  bCourant++;
  492. while (acExpr[bCourant] == ' '); // éliminer les espaces
  493. }
  494. // Cette fonction retourne le caractère courant de l'expression
  495. char CaractereCourant()
  496. {
  497. return acExpr[bCourant];
  498. }

Message cité 1 fois
Message édité par bjs le 21-05-2017 à 11:51:32
Reply

Marsh Posté le 21-05-2017 à 15:31:48    

bjs a écrit :

Si tu as le temps tu peux jeter un coup d'oeil, mais je pense que ça marche car j'ai compilé, puis j'ai vu que ça chargeait bien le code assembleur dans le fichier.c que j'ai crée et puis j'ai recompilé et regardé en debogeur pour voir si ça mettait les bon calculs et ç'était ok.

J'ai pas les connaissances pour vérifier le code asm généré mais ton programme fonctionne oui.

Citation :

Quelques messages avant celui ci tu m'a écrit : "Il y a plusieurs d'autres trucs dans ton code qu'on peut critiquer, mais je ne veux pas faire ton boulot." Je voudrais savoir quelles choses sont pas bien dans mon code. Merci de me dire quoi.

Désolé. La note que tu vas avoir pour ce travail est censé représenter/évaluer tes compétences/..., pas les miennes. Si je commence à corriger ton code (en t'indiquant ce qui ne va pas) ça va falsifier le truc et puis j'ai pas trop le temps ni l'envie non plus. Il faut aussi dire que bien des choses au niveau code sont subjectives, ton prof ne pense peut-être pas du tout comme moi et je ne connais pas le cahier des charges. Je t'ai aidé à faire fonctionner ton code globalement, je vais m'arrêter là.

Citation :

Je voudrais savoir aussi comment activer les warnings sur visual c++ 2010.

Je ne sais pas et je ne vais pas lire la doc (ou utiliser un moteur de recherche, en anglais c'est mieux) à ta place. Vu le "C++" dans le nom de ce logiciel (que je ne connais pas), ton code est bien dans un fichier .c (et non .cpp) et compilé avec un compilateur C et non C++?

Citation :

J'ai déjà des warnings mais peut être qu'il y a un level supérieur en warnings ??
J'ai mis enable all warnings et ça me rien de spécial en warnings à par ce même warning pour toutes mes fonctions=>
1>f:\virton\bureau\micro quadri 2\ex1\ex1\exercice1.c(453): warning C4255: 'Nombre' : aucun prototype de fonction fourni : conversion de '()' en '(void)'

Il doit y avoir un autre niveau, le compilateur doit au moins te dire que main() doit retourner int. GCC (que j'utilises) avec -Wall parle aussi d'autres trucs, voir en haut, j'ai pas regardé. Concernant le warning C4255, tu as bien des prototypes dans ton code, je pense que le compilateur essaye de te dire que si une fonction ne prend pas d'arguments il faut indiquer (void) et non ().

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed