problème avec variables chaines de caractères - C++ - Programmation
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 :
|
(J'ai pas vérifié mais ça doit être correct)
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
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 ...
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" )
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";
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 ?
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"; |
je sais mais je voulais dire que suite à une déclaration telle que char signe[8]; on peut pas... enfin spabien quoi
Marsh Posté le 13-09-2002 à 23:53:11
antp a écrit a écrit : 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
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 ...
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 !
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 ?
Marsh Posté le 14-09-2002 à 00:09:47
_john_doe_ a écrit a écrit : les balises [ cpp] et [ /cpp] ça sert pas à ça ? |
j'aligne à coups de TABs, qui ne sont pas très actifs dans un textarea ...
Marsh Posté le 14-09-2002 à 00:13:28
Ou comme ça aussi :
Code :
|
Marsh Posté le 14-09-2002 à 00:17:36
l'indentation est là pour signifier un niveau supplémentaire de hiérarchie de bloc (gniiii), pas pour faire joli ...
Marsh Posté le 14-09-2002 à 00:20:32
youdontcare a écrit a écrit : 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
Marsh Posté le 14-09-2002 à 00:21:45
_john_doe_ a écrit a écrit : C'est à moi que tu m'exprimes |
Marsh Posté le 14-09-2002 à 00:23:42
youdontcare a écrit a écrit : |
[/elie semoun]
Bon et sinon, fallait indenter comment alors ?
Marsh Posté le 14-09-2002 à 00:31:32
Espace rulez pour l'identation
les tabs ça sux
dans ce genre de cas je mets tous les else au même niveau...
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).
Marsh Posté le 14-09-2002 à 00:34:10
antp a écrit a écrit : Espace rulez pour l'identation les tabs ça sux |
on t'a pas élu modo pour troller
Marsh Posté le 14-09-2002 à 00:36:02
et encore, je me retiens, je pourrais troller nettement plus
Marsh Posté le 14-09-2002 à 00:36:11
et comme ca :
Code :
|
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
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.
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.
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 ( ), mais maintenant je trouve que c'est louche, effectivement...
Si qqu'un pouvait m'expliquer...
Edit : Bonne nuit
Marsh Posté le 14-09-2002 à 01:05:24
_john_doe_ a écrit a écrit : Si qqu'un pouvait m'expliquer... |
déjà fait dans ce topic : http://forum.hardware.fr/forum2.ph [...] =10&page=3
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 ( ), mais maintenant je trouve que c'est louche, effectivement... Si qqu'un pouvait m'expliquer... Edit : Bonne nuit |
Ch'uis pas sur qu'un run sous purify soit d'accord avec toi
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" ).
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 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 ?)
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
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 |
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 :
|
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 .
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:
|
ah tient je savais pas, merci pour l'info
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.
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 !!!