Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2833 connectés 

  FORUM HardWare.fr
  Programmation
  C

  char

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

char

n°1258267
Splinter_7
Posté le 03-12-2005 à 23:15:56  profilanswer
 

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

mood
Publicité
Posté le 03-12-2005 à 23:15:56  profilanswer
 

n°1258269
Tamahome
⭐⭐⭐⭐⭐
Posté le 03-12-2005 à 23:27:06  profilanswer
 

Code :
  1. main()


 
int main (void) tu veux dire ?

Message cité 1 fois
Message édité par Tamahome le 04-12-2005 à 09:38:42
n°1258275
olivthill
Posté le 03-12-2005 à 23:54:32  profilanswer
 

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);
...
}

n°1258279
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-12-2005 à 00:03:23  profilanswer
 

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/
n°1258280
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-12-2005 à 00:04:00  profilanswer
 

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/
n°1258282
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-12-2005 à 00:04:57  profilanswer
 

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/
n°1258287
Splinter_7
Posté le 04-12-2005 à 00:22:08  profilanswer
 

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.

n°1258293
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-12-2005 à 00:48:12  profilanswer
 

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/
n°1258297
Splinter_7
Posté le 04-12-2005 à 00:55:49  profilanswer
 

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

n°1258331
Tamahome
⭐⭐⭐⭐⭐
Posté le 04-12-2005 à 09:38:29  profilanswer
 

Emmanuel Delahaye a écrit :

Ou plutôt

int main (void)



 
oui, vala, il etait tard...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  char

 

Sujets relatifs
[Reflectoin] doublons avec GetMethods pour le type Charchar, signed char et unsigned char et les références
concatener des "phrases" dans un char*System.Char[]
atl/com consomateur ole db, % char dans dba propos de char **
Fonction qui modifie un char *[batch] longueur d'une chaine de char
Convertir un char en int ?!PB: Fonction de conversion Unicode->char
Plus de sujets relatifs à : char


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)