char

char - C - Programmation

Marsh Posté le 03-12-2005 à 23:15:56    

Bonjour j'ai un probleme lié à une chaine de caractere :
 
char blabla();
 
 
main()
{
char x[8];
 
x=blabla();
}
 
char blabla()
{
char z[8];
printf("Saisir z \n" );
scanf("%s",z);
return z;
}

 
J'ai comme erreur : return makes integer from pointer without a cast
 
si quelqu'un pouvait m'aider sa serai cool  :hello: Merci d'avance

Reply

Marsh Posté le 03-12-2005 à 23:15:56   

Reply

Marsh Posté le 03-12-2005 à 23:27:06    

Code :
  1. main()


 
int main (void) tu veux dire ?

Message cité 1 fois
Message édité par Tamahome le 04-12-2005 à 09:38:42
Reply

Marsh Posté le 03-12-2005 à 23:54:32    

L'erreur classique du débutant consite à croire que les paramètres entrants (in) doivent être mis en arguments de la fonction, et que les paramètres sortants (out) doivent être retournés par un return. Malheureusement, l'instruction return ne retourne que le contenu du registre EAX, donc juste 4 octets. C'est très pratique pour retourner un code d'erreur, mais pas pour retourner une chaine de caractères. Il faut mettre les paramètres sortants dans la liste des arguments de la fonction, mais bien sûr en les passant par référence et non pas par valeur (autrement dit en passant l'adresse au lieu de la valeur).
 
Il faut aussi comprendre ce qu'est la pile (stack), et pour cela, il est très utile de faire un petit peu d'assembleur avant d'apprendre le C. Cela éviterait sans doute l'erreur grossière des lignes suivantes :

char blabla()  
{  
   char z[8];  
   printf("Saisir z \n" );  
   scanf("%s",z);  
   return z;  
}

z est une zone de 8 octets réservés sur la pile. Mais cet espace n'est garanti qu'à l'intérieur de la fonction. Il sera écrasé quand le programme appellera une autre fonction.
La solution est de passer z en paramètre :


int blabla(char *z)  
{  
   printf("Saisir z \n" );  
   scanf("%s",z);  
   return 0;  
}  
 
int main(void)
{
   char z[8];
   blabla(z);
...
}

Reply

Marsh Posté le 04-12-2005 à 00:03:23    

Splinter_7 a écrit :

Bonjour j'ai un probleme lié à une chaine de caractere :


char blabla()
{
   char z[8];
   printf("Saisir z \n" );
   scanf("%s",z);
   return z;
}


J'ai comme erreur : return makes integer from pointer without a cast


  • C'est pas 'i' qu'il faut mettre mais 'code' ou 'fixed'...
  • z est un tableau local de char.  Le type retourné est char. Il y a donc une erreur de type. On pourrait éventuellement retourner l'adresse du premier élément du tableau (z) via un retour de type char *, mais comme c'est l'adresse d'une variable locale, elle n'est plus valide après l'exécution.


Il faut soit

  • retourner l'adresse d'un bloc statique (déconseillé pour des problèmes de réentrance)
  • retourner l'adresse d'un bloc alloué (malloc(), par exemple)
  • passer à la fonction l'adresse d'un tableau existant.



---------------
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 04-12-2005 à 00:04:00    

Tamahome a écrit :

Code :
  1. main()


 
int main void () tu veux dire ?


Ou plutôt

int main (void)


---------------
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 04-12-2005 à 00:04:57    

olivthill a écrit :

La solution est de passer z en paramètre :


Une solution...


Message édité par Emmanuel Delahaye le 04-12-2005 à 00:05:10

---------------
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 04-12-2005 à 00:22:08    

Je vous remercie sa marche jai passé ma variable en paramètre et sa fonctionne. Je pensais que comme il s'agissait d'un tableau de caractere, il se passait automatiquement en parametre.

Reply

Marsh Posté le 04-12-2005 à 00:48:12    

Splinter_7 a écrit :

Je pensais que comme il s'agissait d'un tableau de caractere, il se passait automatiquement en parametre.


Non. Un tableau seul ne se passe jamais en paramètre. On peut

  • soit passer l'adresse de son premier élément via un pointeur du même type. T*p ou  T p[]
  • soit passer l'adresse du tableau via un pointeur sur un tableau de même taille et d'élements de même type  : T(*p)[SIZE]


static void f(int a[])
{
}
 
static void g(int *a)
{
}
 
static void h (int (*a)[123])
{
}
 
int main(void)
{
    int a[123];
    f (a);
    g (a);
    h (&a);
     
    return 0;
}


Nota : dans les deux premiers cas, il est recommandé de passer un parametre 'taille', car celle-ci ne peut pas être déduite par la fonction.


Message édité par Emmanuel Delahaye le 04-12-2005 à 01:01:26

---------------
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 04-12-2005 à 00:55:49    

merci Emmanuel D elahaye pour l'expllication. J'ai encore du boulot avant de maitriser le C lol

Reply

Marsh Posté le 04-12-2005 à 09:38:29    

Emmanuel Delahaye a écrit :

Ou plutôt

int main (void)



 
oui, vala, il etait tard...

Reply

Sujets relatifs:

Leave a Replay

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