Erreurs C2065 et C2143

Résolu
cs_thomas71 Messages postés 13 Date d'inscription mercredi 29 juin 2005 Statut Membre Dernière intervention 4 juillet 2012 - 7 mars 2012 à 00:02
cs_thomas71 Messages postés 13 Date d'inscription mercredi 29 juin 2005 Statut Membre Dernière intervention 4 juillet 2012 - 7 mars 2012 à 09:19
Bonjour,

J'ai un petit problème avec le bout de code ci-dessous. Je travaille sous Visual Studio 2010. Deux erreur apparaissent lors de la compilation : C2065 et C2143

#include <stdlib.h>
#include <stdio.h>


int main(int nbarg, char *argv[])
{

char toto[] =  "aaaa";
toto[2]='b';
printf("%s\n",toto);


char *tata = "bbbb";
printf("%s\n",tata);


system("pause");
return 0;
}


Si je ne commente QUE
char toto[]  = "aaaa";
toto[2]= 'b';
printf("%s\n",toto);

la compilation se fait sans erreur et produit l'effet attendu.

Idem si je ne commente QUE
char *tata  = "bbbb";
printf("%s\n",tata);


Merci de votre aide!

6 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
7 mars 2012 à 09:09
La réponse est dans mon premier message:
Si tu es en "pedantic" (version strict du C), alors pense à bien mettre tes déclarations au début d'un block (en C standard, on ne peux mélanger code et déclaration).

En C "strict" (C89), on ne peut mélanger code et déclaration. Il te faut activer l'option C99 pour pouvoir le faire.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
7 mars 2012 à 08:38
Bonjour.

Quelles sont les erreurs de compilation que tu as ? Je ne voit rien de choquant au niveau de la syntaxe. Et ton code compile parfaitement chez moi. Si tu es en "pedantic" (version strict du C), alors pense à bien mettre tes déclarations au début d'un block (en C standard, on ne peux mélanger code et déclaration).
En revanche, au niveau exécution, je vois une erreur potentielle.

Ceci est valide:
char toto[] = "aaaa";
toto[2]='b';
printf("%s\n",toto);

En effet, on peut écrire dans un char[] = "...".

Ceci ne le serait pas:
char *tata = "bbbb";
tata[2]='b'; // Attention !
printf("%s\n",tata);

Un char* "...", contrairement au char[] "...", est constant. Toute écriture dans tata provoquera un segfault.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
cs_thomas71 Messages postés 13 Date d'inscription mercredi 29 juin 2005 Statut Membre Dernière intervention 4 juillet 2012
7 mars 2012 à 08:45
Quand je compile le programme complet, j'obtiens les erreurs :

error C2143: erreur de syntaxe : absence de ';' avant 'type' c:\users\thomas\documents\visual studio 2010\projects\test1\test1\main.c 13 1 test1

error C2065: 'tata' : identificateur non déclaré c:\users\thomas\documents\visual studio 2010\projects\test1\test1\main.c 14 1 test1
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
7 mars 2012 à 09:00
Et avec ceci ?
#include <stdio.h>

int main(void)
{
  char toto[] = "aaaa";
  char* tata = "bbbb";

  toto[2]='b';
  printf("%s\n", toto); /* Ok */

  tata[2]='b';
  printf("%s\n", tata); /* Segfault ! */

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_thomas71 Messages postés 13 Date d'inscription mercredi 29 juin 2005 Statut Membre Dernière intervention 4 juillet 2012
7 mars 2012 à 09:06
En fait ça fonctionne quand les déclarations des 2 variables sont faites au début! Merci de votre aide! Vous pensez que cette particularité est propre à VS étant donné que vous êtes parvenu à le compiler?

#include <stdlib.h>
#include <stdio.h>


int main(int nbarg, char *argv[])
{
char toto[] = "aaaa";
char *tata = "bbbb";

toto[2]='b';
printf("%s\n",toto);
printf("%s\n",tata);

system("pause");
return 0;
}
0
cs_thomas71 Messages postés 13 Date d'inscription mercredi 29 juin 2005 Statut Membre Dernière intervention 4 juillet 2012
7 mars 2012 à 09:19
Désolé j'avais lu trop vite le message précédent...
Merci en tout cas!
0
Rejoignez-nous