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

  FORUM HardWare.fr
  Programmation
  C++

  problème avec variables chaines de caractères

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème avec variables chaines de caractères

n°214114
zluman
Posté le 13-09-2002 à 22:53:49  profilanswer
 

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 !!!

mood
Publicité
Posté le 13-09-2002 à 22:53:49  profilanswer
 

n°214125
_john_doe_
Posté le 13-09-2002 à 23:19:51  profilanswer
 

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)

n°214129
zluman
Posté le 13-09-2002 à 23:32:09  profilanswer
 

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

n°214131
youdontcar​e
Posté le 13-09-2002 à 23:37:20  profilanswer
 

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 ...

n°214132
antp
Super Administrateur
Champion des excuses bidons
Posté le 13-09-2002 à 23:37:41  profilanswer
 

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
n°214138
youdontcar​e
Posté le 13-09-2002 à 23:46:00  profilanswer
 

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";

n°214139
zluman
Posté le 13-09-2002 à 23:48:51  profilanswer
 

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 ?

n°214141
antp
Super Administrateur
Champion des excuses bidons
Posté le 13-09-2002 à 23:49:04  profilanswer
 

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
n°214144
youdontcar​e
Posté le 13-09-2002 à 23:53:11  profilanswer
 

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

n°214148
youdontcar​e
Posté le 13-09-2002 à 23:55:43  profilanswer
 

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 ...

mood
Publicité
Posté le 13-09-2002 à 23:55:43  profilanswer
 

n°214149
zluman
Posté le 13-09-2002 à 23:56:12  profilanswer
 

<< 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 !

n°214154
_john_doe_
Posté le 14-09-2002 à 00:07:56  profilanswer
 

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
n°214155
youdontcar​e
Posté le 14-09-2002 à 00:09:47  profilanswer
 

_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
n°214157
_john_doe_
Posté le 14-09-2002 à 00:13:28  profilanswer
 

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

 

n°214158
youdontcar​e
Posté le 14-09-2002 à 00:17:36  profilanswer
 

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

n°214160
_john_doe_
Posté le 14-09-2002 à 00:20:32  profilanswer
 

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  :??:

n°214162
youdontcar​e
Posté le 14-09-2002 à 00:21:45  profilanswer
 

_john_doe_ a écrit a écrit :

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


[:yaisse]

n°214163
_john_doe_
Posté le 14-09-2002 à 00:23:42  profilanswer
 

youdontcare a écrit a écrit :

[:yaisse]




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

n°214165
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-09-2002 à 00:31:32  profilanswer
 

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
n°214166
youdontcar​e
Posté le 14-09-2002 à 00:33:04  profilanswer
 

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

n°214167
youdontcar​e
Posté le 14-09-2002 à 00:34:10  profilanswer
 

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

n°214168
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-09-2002 à 00:36:02  profilanswer
 

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°214169
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 14-09-2002 à 00:36:11  profilanswer
 

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é
n°214170
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 14-09-2002 à 00:38:44  profilanswer
 

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é
n°214171
youdontcar​e
Posté le 14-09-2002 à 00:41:23  profilanswer
 

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.

n°214172
youdontcar​e
Posté le 14-09-2002 à 00:42:06  profilanswer
 

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.

n°214173
_john_doe_
Posté le 14-09-2002 à 00:46:19  profilanswer
 

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
n°214182
youdontcar​e
Posté le 14-09-2002 à 01:05:24  profilanswer
 

_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

n°214190
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 14-09-2002 à 02:14:42  profilanswer
 

_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é
n°214263
_john_doe_
Posté le 14-09-2002 à 09:14:05  profilanswer
 

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 ?)
 

n°214301
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 14-09-2002 à 13:22:56  profilanswer
 

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é
n°214340
_john_doe_
Posté le 14-09-2002 à 14:33:35  profilanswer
 

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]

n°214664
Musaran
Cerveaulté
Posté le 15-09-2002 à 03:34:48  profilanswer
 

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
n°214669
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 15-09-2002 à 04:02:30  profilanswer
 

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é
n°214879
Musaran
Cerveaulté
Posté le 16-09-2002 à 06:05:56  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


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

  problème avec variables chaines de caractères

 

Sujets relatifs
Probleme de session sur freeKézako? Problème avec switch
probleme a faire égaliser un integer avec un double[BUILDER5 ]Probléme de clignotememnt intempestif
[Oracle]Problème de formatage de sortie vers un fichierphp BB problème de date !!
Grave problème de version de PHP !!! 4.2.0 ==> 4.2.3Caractères phonétiques en HTML [résolu]
probleme d'affichage d'imageRécupérer des variables de sessions IIS dans une applet
Plus de sujets relatifs à : problème avec variables chaines de caractères


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR