Erreur bizzare

Erreur bizzare - C - Programmation

Marsh Posté le 22-02-2005 à 23:20:20    

Voila j'ai le code suivant qui compile nickel sous gcc avec les warning et ansi mais sous MS-VC++ 6.0 ca me sort une erreur de syntaxe ... :heink:
 

Code :
  1. char ff[10]="dgjkdgj";
  2.   ff[0]='a';
  3.   ff[1]='b';
  4.   ff[2]='c';
  5.   free(&ff);
  6.  
  7.   ff[0]='a';
  8.  
  9.   printf("%s    ", ff);


 
Il me sort "syntax error : missing ';' before 'type'" pour la ligne ou je declare ff. C'est quoi ce binz ?


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 22-02-2005 à 23:20:20   

Reply

Marsh Posté le 22-02-2005 à 23:31:29    

free(&ff); ??? oh la coquille !
 
sinon, l'erreur est probablement à la ligne précédant ta ligne 1.

Reply

Marsh Posté le 22-02-2005 à 23:42:27    

Pour l'erreur c'est un vieux beug ... je sais pas :  

Code :
  1. FILE* fp = fopen("source.txt", "rw" );
  2.  
  3.   int x=0;
  4.   int size=0;
  5.   char ff[10]="lkjhlkjh";
  6.  
  7.   while(x!=FIN || size<2){
  8.     ++size;
  9.     x = lexer(fp);
  10.     if (x==ERROR) printf("Erreur! " );
  11.     switch (x)
  12.       {
  13.       case IDENTIFICATEUR:
  14. printf("ident " );
  15. break;
  16.       case MOTCLE :
  17. printf("mot-cle " );
  18. break;
  19.       case SENS :
  20. printf("sens " );
  21. break;
  22.       case OPERATEUR :
  23. printf("operateur " );
  24. break;
  25.       case ANGLE :
  26. printf("angle " );
  27. break;
  28.       case NOMBRE :
  29. printf("nombre " );
  30. break;
  31.       }
  32.   }
  33.  
  34.   ff[0]='a';
  35.   ff[1]='b';
  36.   ff[2]='c';
  37.   //free(&ff);
  38.  
  39.   ff[0]='a';
  40.  
  41.   printf("%s    ", ff);


 
Et là plus de bug ... va savoir.
 
Et pour le free(&ff), comment je peux faire pour vider le contenu d'un pointeur constant ?


Message édité par Chronoklazm le 22-02-2005 à 23:43:54

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 23-02-2005 à 00:00:01    

il faut déclarer les variables en début de bloc (si tu suis la norme C99, ce n'est pas obligatoire). Donc si tu déclares une variable à la suite d'instructions qui ne sont pas des déclarations, ça couine.
 
free sert à libérer de la mémoire allouer sur le tas. Dans ton cas, attends tranquillement le dépilement en fin de bloc, c'est tout ce que tu peux faire.
 
Il manque le test pour vérifier l'ouverture du fichier.
printf("blabla" ) --> puts("blabla" );  
ou fputs("blabla",stdout); (sans sauter de lignes)

Reply

Marsh Posté le 23-02-2005 à 00:00:43    

En gros y a pas une fonction toute jolie pour faire ça, faut que je face :

Code :
  1. void vide(char chaine[]){
  2. int taille=strlen(chaine);
  3. int i=0;
  4. for(i=0;i<taille;i++){
  5.  chaine[i]=NULL;
  6. }
  7. }


C'est ça ?


Message édité par Chronoklazm le 23-02-2005 à 00:02:31

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 23-02-2005 à 00:01:20    

Ca marche meme pas :(
 
EDIT : ah si


Message édité par Chronoklazm le 23-02-2005 à 00:04:16

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 23-02-2005 à 00:03:31    

et ça sert à rien

Reply

Marsh Posté le 23-02-2005 à 01:11:58    

[quote=990625,0,1,175659]Voila j'ai le code suivant qui compile nickel sous gcc avec les warning et ansi mais sous MS-VC++ 6.0 ca me sort une erreur de syntaxe ... :heink:
 

Code :
  1. char ff[10]="dgjkdgj";
  2.   ff[0]='a';
  3.   ff[1]='b';
  4.   ff[2]='c';
  5.   free(&ff);
  6.  
  7.   ff[0]='a';
  8.  
  9.   printf("%s    ", ff);


 
Il me sort "syntax error : missing ';' before 'type'" pour la ligne ou je declare ff. C'est quoi ce binz ?[/quote]
 
char ff[10]="dgjkdgj";
 
C'est quoi ce machin ?
Je ne suis pas sûr que ce soit vraiment ce que tu veuille faire...

Reply

Marsh Posté le 23-02-2005 à 01:57:16    

Je crois que tu nous a pondu un paté de code plus que douteux... !
 

Code :
  1. char ff[10]="dgjkdgj";


printf> c'est tout à fait valide, c'est un tableau de 10 char avec une valeur initiale. Enfin, ptet que ta remarque signifie : "à quoi ça sert" et dans ce cas je suis d'accord...
Au lieu de mettre une valeur initiale aussi inutile, autant ne rien mettre du tout.
 
Chronoklazm> Ce n'est PAS un pointeur constant. C'est un tableau, point.
 
Un free() s'applique à un pointeur, pas à un tableau, et encore moins à quelque chose alloué sur la pile et non sur le tas (par malloc ou autres).
Ensuite, je suis pas très sûr de comprendre ce que tu entends par "vider".
Soit tu veux écraser ce qu'il y a dedans (quel interêt ?), auquel cas tu écrases avec ce que tu veux, mais pas avec NULL, c'est totalement absurde. NULL c'est un pointeur, ton tableau n'est pas fait de pointeurs.
 
Soit tu veut le virer de la mémoire, ben c'est bête, tu peux pas : il est en mémoire automatique (sur la pile) : soit tu attends sagement la fin de ta fonction, ça se fera tout seul, soit tu fais une allocation programmée avec une fonction comme malloc et t'es libre de libérer la mémoire quand tu veux (aucun interêt ici je crois).
 
Franchement je comprends pas grand chose à ton truc.

Reply

Marsh Posté le 23-02-2005 à 08:11:41    

Chronoklazm a écrit :


Code :
  1. char ff[10]="dgjkdgj";
  2.   free(&ff);




free() sert à libérer un bloc alloué par malloc()  ou un de ses frères. Libérer un tableau local n'a aucun sens et provoque un comportement indéfini.


Message édité par Emmanuel Delahaye le 23-02-2005 à 08:21:42

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-02-2005 à 08:11:41   

Reply

Marsh Posté le 23-02-2005 à 08:17:30    

Chronoklazm a écrit :

Et pour le free(&ff), comment je peux faire pour vider le contenu d'un pointeur constant ?


Ca veut dire quoi "vider le contenu d'un pointeur constant" ?  

  • Un pointeur constant ne peut être modifié.  
  • Un pointeur 'tout court' est une variable. Comme toute variable, elle a toujours un contenu. Celui ci peut avoir un sens ou non, c'est une autre histoire.


char *p = malloc(123);
 
if (p != NULL)
{
   /* la valeur de p est definie.  
    * C'est l'adresse d'un bloc memoire valide.  
    */
 
 
   free (p);
   /* la valeur de p est definie.  
    * C'est l'adresse d'un bloc memoire invalide.  
    */
 
   p = NULL;
   /* la valeur de p est definie (NULL).  
    * C'est la valeur qui signifie 'pointeur invalide'.  
    */
}


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-02-2005 à 08:20:30    

printf a écrit :

char ff[10]="dgjkdgj";
C'est quoi ce machin ?


C'est du code C parfaitement valide. Ca crée un tableau de 10 char initialisé comme suit:

{'d', 'g', 'j', 'k', 'd', 'g', 'j', 0, 0, 0}


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-02-2005 à 08:32:34    

Certes, mais pourquoi l'initialiser pour ensuite réécrire un morceau dessus et tenter une libération plus que douteuse de l'ensemble ?
 
(même si il est vrai qu'au début j'avais pas fait gaffe que c'était une déclaration et pas une bête affectation, qui d'ailleurs est tout aussi valide)
 
EDIT: OK, le deuxième programme n'est pas le même que le premier y'a des lignes qui sont arrivées en renfort :D Faut faire gaffe parce que les balises code rajoutent les numéros de ligne...


Message édité par printf le 23-02-2005 à 08:33:36
Reply

Marsh Posté le 23-02-2005 à 16:38:26    

printf a écrit :

Certes, mais pourquoi l'initialiser pour ensuite réécrire un morceau dessus et tenter une libération plus que douteuse de l'ensemble ?


 
Je pensais que c'était possible, je voulais un simple tableau de taille statique et non un char * et si je l'initialisai (ce qui n'est pas interdit) je voulais le reutiliser par la suite mais en ayant "effacer" son contenu auparavent ...
 

Code :
  1. char ff[10]="dgjkdgj";


 
A quoi ca sert ? A rien de special juste faire des tests dessus.
 
EDIT: En gros si j'ai bien compris je ne peux pas le faire moi meme, donc si je veux le faire moi il faut passer par un char *ff; puis des malloc ?


Message édité par Chronoklazm le 23-02-2005 à 16:41:58

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 23-02-2005 à 17:31:59    

Chronoklazm a écrit :

un simple tableau de taille statique <...> je voulais le reutiliser par la suite mais en ayant "effacer" son contenu auparavent ...


Ca veut dire quoi 'effacer' ? Mettre un pattern fixe dedans ? memset() est ton ami...

Citation :


En gros si j'ai bien compris je ne peux pas le faire moi meme, donc si je veux le faire moi il faut passer par un char *ff; puis des malloc ?


Oui.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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