problème avec variables chaines de caractères

problème avec variables chaines de caractères - C++ - Programmation

Marsh Posté le 13-09-2002 à 22:53:49    

Salut à tous,  
 
impossible de compiler cet algorithme, j'aimerai avoir votre aide pour me dépaner je (débute en C).
 
Il s'agit d'une fonction verif() qui reçoit en entrée un flottant et retourne une chaine de caractères :
 
char verif(float nombre)
{
 
 char signe[8];
 
 if (nombre < 0)
 {
  signe[] = "positif" ;
 }
 else
 {
  signe[] = "négatif" ;
 }
 
 return signe[] ;
}
 
dans mon esprit ça semble juste mais syntaxiquement ça ne va pas du tout dixit gcc :)
 
merci d'avance !!!

Reply

Marsh Posté le 13-09-2002 à 22:53:49   

Reply

Marsh Posté le 13-09-2002 à 23:19:51    

zluman a écrit a écrit :

Salut à tous,  
 
impossible de compiler cet algorithme, j'aimerai avoir votre aide pour me dépaner je (débute en C).
 
Il s'agit d'une fonction verif() qui reçoit en entrée un flottant et retourne une chaine de caractères :
 
char verif(float nombre)
{
 
 char signe[8];
 
 if (nombre < 0)
 {
  signe[] = "positif" ;
 }
 else
 {
  signe[] = "négatif" ;
 }
 
 return signe[] ;
}
 
dans mon esprit ça semble juste mais syntaxiquement ça ne va pas du tout dixit gcc :)
 
merci d'avance !!!




 
Déjà la fonction telle que l'as écrite ne renvoie pas une chaîne de caractères, mais un seul caractère.
 
Ensuite tu t'es planté dans le sens de ton if...
 
Et puis t'as pas besoin d'autant de lignes pour faire ça :
 
 

Code :
  1. char* verif(float nombre) {
  2.   return (nombre>0)?"positif":"négatif";
  3. }


 
 
(J'ai pas vérifié mais ça doit être correct)

Reply

Marsh Posté le 13-09-2002 à 23:32:09    

ok merci pour le prototype de la fonction .
 
return (nombre>0)?"positif":"négatif";  
   >> j'aimerai retourner une variable (qui contiendrait ici en valeur pos ou neg) et pas une valeur direct, avec un jeu de if-else si possible. Je sais que ça semble bizarre pour cet exemple mais c'est pour le mettre en pratique sur de plus gros algo.
 
 
merci

Reply

Marsh Posté le 13-09-2002 à 23:37:20    

tu as fait du php avant de faire du C ?
 
>> char signe[8];  
 
ici, ta variable est déclarée comme locale à la fonction et sera donc détruite en sortie. il ne faut JAMAIS retourner de variables locales, il faut en allouer de nouvelles.
 
>> j'aimerai retourner une variable (qui contiendrait ici en valeur pos ou neg)  
 
une variable de signe ? tu renvoies alors un entier (int), tu remplaces les return "positif" par return 1, return -1, etc.
 
>> avec un jeu de if-else si possible. Je sais que ça semble bizarre pour cet exemple  
 
je comprends pas du tout ...

Reply

Marsh Posté le 13-09-2002 à 23:37:41    

zluman a écrit a écrit :

 
  signe[] = "positif"




 
heu ça tu peux pas faire en C
tu fois faire
 
strcpy(signe, "positif" )


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 13-09-2002 à 23:46:00    

antp a écrit a écrit :

heu ça tu peux pas faire en C
tu fois faire


tu peux le faire si c'est un pointeur : char* str = "hello";

Reply

Marsh Posté le 13-09-2002 à 23:48:51    

ok merci,
 
sinon j'ai un peuavancé sur un autre cas que voici et cela semble marcher :
 
char*  donnerMention(float note)
{
 
    char *mentionCorrespondante;
 
 if (note < 10)
 {
  mentionCorrespondante = "Echec";
 }
 else if (note >= 10 && note < 12)
 {
  mentionCorrespondante = "Passable";
 }
 else if (note >= 12 && note < 14)
 {
  mentionCorrespondante = "Assez-bien";
 }
 else if (note >= 14 && note < 16)
 {
  mentionCorrespondante = "Bien";
 }
 else
 {
  mentionCorrespondante = "Très bien";
 }
 
 return mentionCorrespondante;
 
}
 
est-ce corret niveau clarté du code ?

Reply

Marsh Posté le 13-09-2002 à 23:49:04    

youdontcare a écrit a écrit :

tu peux le faire si c'est un pointeur : char* str = "hello";




 
:heink: je sais mais je voulais dire que suite à une déclaration telle que  char signe[8]; on peut pas... enfin spabien quoi


Message édité par antp le 13-09-2002 à 23:49:24

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 13-09-2002 à 23:53:11    

antp a écrit a écrit :

:heink: je sais mais je voulais dire que suite à une déclaration telle que  char signe[8]; on peut pas... enfin spabien quoi


vi. mais désambigutise tes dires :D

Reply

Marsh Posté le 13-09-2002 à 23:55:43    

zluman a écrit a écrit :

est-ce corret niveau clarté du code ?


yep. tu peux encore améliorer lorsque tu n'as qu'une seule instruction dans un bloc :
 
char*  donnerMention(float note)
{
  char *mentionCorrespondante;
 
       if (note < 10) mentionCorrespondante = "Echec";
  else if (note >= 10 && note < 12) mentionCorrespondante = "Passable";
  else if (note >= 12 && note < 14) mentionCorrespondante = "Assez-bien";
 
etc. le tout à bien aligner, impossible à faire sur le forum ...

Reply

Marsh Posté le 13-09-2002 à 23:55:43   

Reply

Marsh Posté le 13-09-2002 à 23:56:12    

<< ok merci,  
 
sinon j'ai un peu avancé sur un autre cas que voici et cela semble marcher :  
 
char*  donnerMention(float note)  
{  
 
   char *mentionCorrespondante;  
 
if (note < 10)  
{  
 mentionCorrespondante = "Echec";  
}  
else if (note >= 10 && note < 12)  
{  
 mentionCorrespondante = "Passable";  
}  
else if (note >= 12 && note < 14)  
{  
 mentionCorrespondante = "Assez-bien";  
}  
else if (note >= 14 && note < 16)  
{  
 mentionCorrespondante = "Bien";  
}  
else  
{  
 mentionCorrespondante = "Très bien";  
}  
 
return mentionCorrespondante;  
 
}  
 
est-ce corret niveau clarté et qualité du code ?  >> merci !

Reply

Marsh Posté le 14-09-2002 à 00:07:56    

youdontcare a écrit a écrit :

yep. tu peux encore améliorer lorsque tu n'as qu'une seule instruction dans un bloc :
 
char*  donnerMention(float note)
{
  char *mentionCorrespondante;
 
       if (note < 10) mentionCorrespondante = "Echec";
  else if (note >= 10 && note < 12) mentionCorrespondante = "Passable";
  else if (note >= 12 && note < 14) mentionCorrespondante = "Assez-bien";
 
etc. le tout à bien aligner, impossible à faire sur le forum ...



 
les balises [ cpp] et [ /cpp] ça sert pas à ça ?  :D


Message édité par _john_doe_ le 14-09-2002 à 00:08:15
Reply

Marsh Posté le 14-09-2002 à 00:09:47    

_john_doe_ a écrit a écrit :

les balises [ cpp] et [ /cpp] ça sert pas à ça ?  :D


j'aligne à coups de TABs, qui ne sont pas très actifs dans un textarea ... ;)


Message édité par youdontcare le 14-09-2002 à 00:10:08
Reply

Marsh Posté le 14-09-2002 à 00:13:28    

Ou comme ça aussi :
 

Code :
  1. char* donnerMention(float note) { 
  2.   char *mentionCorrespondante;
  3.   if (note >= 16) mentionCorrespondante = "Très bien";
  4.     else if (note >= 14) mentionCorrespondante = "Bien";
  5.       else if (note >= 12) mentionCorrespondante = "Assez bien";
  6.         else if (note >= 10) mentionCorrespondante = "Passable";
  7.           else mentionCorrespondante = "Echec";
  8.   return mentionCorrespondante;
  9. }

 

Reply

Marsh Posté le 14-09-2002 à 00:17:36    

:non: l'indentation est là pour signifier un niveau supplémentaire de hiérarchie de bloc (gniiii), pas pour faire joli ...

Reply

Marsh Posté le 14-09-2002 à 00:20:32    

youdontcare a écrit a écrit :

:non: l'indentation est là pour signifier un niveau supplémentaire de hiérarchie de bloc (gniiii), pas pour faire joli ...




 
C'est à moi que tu m'exprimes  :??:

Reply

Marsh Posté le 14-09-2002 à 00:21:45    

_john_doe_ a écrit a écrit :

C'est à moi que tu m'exprimes  :??:


[:yaisse]

Reply

Marsh Posté le 14-09-2002 à 00:23:42    

youdontcare a écrit a écrit :

[:yaisse]




 
:D
[/elie semoun]
 
 
Bon et sinon, fallait indenter comment alors ?

Reply

Marsh Posté le 14-09-2002 à 00:31:32    

Espace rulez pour l'identation :D
les tabs ça sux
 
[:dehors2]
 
dans ce genre de cas je mets tous les else au même niveau...


Message édité par antp le 14-09-2002 à 00:32:21

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-09-2002 à 00:33:04    

si tu indentes c'est pour signifier un nouveau bloc :
 
if (...)
{
  // nouveau bloc d'instructions
}
 
là, vu que ce ne sont que des if / else enchaînés, il font partie du même bloc donc sont tous indentés pareil :
 
if (...)
else if (...)
else if (...)
etc.
 
et on peut aligner le premier if sur les suivants (comme ça toutes les expressions (...) sont alignées).

Reply

Marsh Posté le 14-09-2002 à 00:34:10    

antp a écrit a écrit :

Espace rulez pour l'identation :D
les tabs ça sux


:o
 
on t'a pas élu modo pour troller :D

Reply

Marsh Posté le 14-09-2002 à 00:36:02    

:/
et encore, je me retiens, je pourrais troller nettement plus :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-09-2002 à 00:36:11    

et comme ca :
 

Code :
  1. char* donnerMention(float note) { 
  2. char *mentionCorrespondante;
  3. if (note >= 16) mentionCorrespondante = "Très bien";
  4. else if (note >= 14) mentionCorrespondante = "Bien";
  5. else if (note >= 12) mentionCorrespondante = "Assez bien";
  6. else if (note >= 10) mentionCorrespondante = "Passable";
  7. else mentionCorrespondante = "Echec";
  8. return mentionCorrespondante;
  9. }


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 14-09-2002 à 00:38:44    

ceci dit je comprends pas comment on peut faire :
 
mentionCorrespondante = "Très bien";  
mentionCorrespondante = "Bien";  
 
etc
 
sans allouer d'espace mémoire pour mentionCorrespondante.
Normalement t'es obligé de faire
 
mentionCorrespondante = malloc(sizeof(char) * 11);  
 
non :??:


Message édité par joce le 14-09-2002 à 00:38:53

---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 14-09-2002 à 00:41:23    

joce a écrit a écrit :

et comme ca :


l'important est de pas indenter chaque nouveau if, après c'est personnel ... j'aime bien tout espacer pour que les expressions A et B d'un if (A) B soient au même niveau.

Reply

Marsh Posté le 14-09-2002 à 00:42:06    

joce a écrit a écrit :

ceci dit je comprends pas comment on peut faire :


ce sont des données statiques du programme, rien ne t'empêche de pointer dessus.

Reply

Marsh Posté le 14-09-2002 à 00:46:19    

joce a écrit a écrit :

ceci dit je comprends pas comment on peut faire :
 
mentionCorrespondante = "Très bien";  
mentionCorrespondante = "Bien";  
 
etc
 
sans allouer d'espace mémoire pour mentionCorrespondante.
Normalement t'es obligé de faire
 
mentionCorrespondante = malloc(sizeof(char) * 11);  
 
non :??:




 
 
Je viens de tester la fonction comme je l'ai écrite, apparemment ça marche ( :sol: ), mais maintenant je trouve que c'est louche, effectivement... :D
 
Si qqu'un pouvait m'expliquer... :D
 
 
Edit : Bonne nuit  :sleep:


Message édité par _john_doe_ le 14-09-2002 à 00:49:05
Reply

Marsh Posté le 14-09-2002 à 01:05:24    

_john_doe_ a écrit a écrit :

Si qqu'un pouvait m'expliquer... :D


déjà fait dans ce topic : http://forum.hardware.fr/forum2.ph [...] =10&page=3

Reply

Marsh Posté le 14-09-2002 à 02:14:42    

_john_doe_ a écrit a écrit :

 
 
 
Je viens de tester la fonction comme je l'ai écrite, apparemment ça marche ( :sol: ), mais maintenant je trouve que c'est louche, effectivement... :D
 
Si qqu'un pouvait m'expliquer... :D
 
 
Edit : Bonne nuit  :sleep:  




Ch'uis pas sur qu'un run sous purify soit d'accord avec toi :D
encore si tu écrivais  
 
char *mentionCorrespondante = "Assez-bien";  
 
au départ ca irait à mon avis, puisque tu alloues de la mémoire en même temps que tu déclares le pointeur (tous les autres chaines de caractères sont plus courtes que "assez-bien" ).


Message édité par joce le 14-09-2002 à 02:16:14

---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 14-09-2002 à 09:14:05    

joce a écrit a écrit :

 
Ch'uis pas sur qu'un run sous purify soit d'accord avec toi :D
encore si tu écrivais  
 
char *mentionCorrespondante = "Assez-bien";  
 
au départ ca irait à mon avis, puisque tu alloues de la mémoire en même temps que tu déclares le pointeur (tous les autres chaines de caractères sont plus courtes que "assez-bien" ).




 
 
Je connais pas purify, c'est quoi ? (là j'ai essayé sous Dev-C++ sous windows)
 
youdontcare> merci pour le lien
(ton pseudo il a un rapport avec une chanson de Mercury ?)
 

Reply

Marsh Posté le 14-09-2002 à 13:22:56    

ca checke si t'as leakage memory, si t'as des array boundary read, array boundary write, uninitialised memory read, etc etc etc etc
à mon avis ce programme t'as des ABR et des ABW


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 14-09-2002 à 14:33:35    

joce a écrit a écrit :

ca checke si t'as leakage memory, si t'as des array boundary read, array boundary write, uninitialised memory read, etc etc etc etc
à mon avis ce programme t'as des ABR et des ABW




 
[:mlc]

Reply

Marsh Posté le 15-09-2002 à 03:34:48    

Naaan !
En C, les chaînes "littérales" pré-existent à l'exécution du code, comme des variables globales.
C'est correct de faire simplement pointer un pointeur dessus, c'est même recommendé.
 
Sinon, on fait:

Code :
  1. const char *pointeur= "littérale"; //const, c'est mieux car les "..." sont const
  2. char tableau[SUFFISAMMENT];
  3. strcpy(tableau,pointeur);
  4. char* dynamique= (char*)malloc(SUFFISAMMENT);
  5. strcpy(dynamique,pointeur);


C'est le jour des débutants qui posent la même question: http://www.developpez.net/forums/viewtopic.php?t=32271
 
Et puis d'abord, joce, tu devrais déboguer le forum au lieu d'apprendre le C :D.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 15-09-2002 à 04:02:30    

Musaran a écrit a écrit :

Naaan !
En C, les chaînes "littérales" pré-existent à l'exécution du code, comme des variables globales.
C'est correct de faire simplement pointer un pointeur dessus, c'est même recommendé.
 
Sinon, on fait:

Code :
  1. const char *pointeur= "littérale"; //const, c'est mieux car les "..." sont const
  2. char tableau[SUFFISAMMENT];
  3. strcpy(tableau,pointeur);
  4. char* dynamique= (char*)malloc(SUFFISAMMENT);
  5. strcpy(dynamique,pointeur);


C'est le jour des débutants qui posent la même question: http://www.developpez.net/forums/viewtopic.php?t=32271
 
Et puis d'abord, joce, tu devrais déboguer le forum au lieu d'apprendre le C :D.




ah tient je savais pas, merci pour l'info :D


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 16-09-2002 à 06:05:56    

J'ai oublié de mentionner que les chaînes "littérales" sont des constantes.
 
C'est pas parce que les compilateurs permettent (pourquoi ?) d'avoir un pointeur-sur-variable dessus qu'on peut (essayer de) les modifier.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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