J'ai une fonction qui est sencée retourner une chaîne de caractères.
Mais je me suis rendu compte assez vite que ça ne fonctionnait pas,
voire même que "retourner" une chaîne ne signifiait as grand chose,
puisque mon tableau de char est une variable interne à ma fonction, et
que donc retourner le pointeur qui pointe sur le premier élément est
inutile, étant donné que mon tableau disparait quand la fonction se
termine.
J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait
être correcte, mais je voulais demander un avis avant de l'implémenter :
Il s'agirait, dans la fonction, de définir la chaîne non pas comme une
variable, mais de façon dynamique avec malloc. Ainsi, retourner un
pointeur vers ce tableau serait possible (et surtout utilisable).
Je ne sais pas trop ce que ça vaut, ou si il y a mieux.
Qu'en pensez vous ?
Merci d'avance,
Noé F.
--
"Je ne deteste que les bourreaux" -- Albert Camus
Pour m'écrire un mail, veuillez retirer PASDEPUB de mon adresse ;)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Pierre Maurette
Noé Falzon a écrit:
Bonjour,
J'ai une fonction qui est sencée retourner une chaîne de caractères. Mais je me suis rendu compte assez vite que ça ne fonctionnait pas, voire même que "retourner" une chaîne ne signifiait as grand chose, puisque mon tableau de char est une variable interne à ma fonction, et que donc retourner le pointeur qui pointe sur le premier élément est inutile, étant donné que mon tableau disparait quand la fonction se termine.
J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait être correcte, mais je voulais demander un avis avant de l'implémenter :
Il s'agirait, dans la fonction, de définir la chaîne non pas comme une variable, mais de façon dynamique avec malloc. Ainsi, retourner un pointeur vers ce tableau serait possible (et surtout utilisable).
Je ne sais pas trop ce que ça vaut, ou si il y a mieux. Qu'en pensez vous ? Pas de raison que ça ne fonctionne pas. Il suffit d'être attentif au
fait que pour libérer le malloc(), il faut garder la valeur du pointeur retourné. Donc pas de: printf("%s", machaine(argumets));
Ou alors: char* tempo; printf("%s", tempo = machaine(argumets)); free(tempo); -- Pierre
Noé Falzon <noe.falzonPASDEPUB@tiscali.fr> a écrit:
Bonjour,
J'ai une fonction qui est sencée retourner une chaîne de caractères.
Mais je me suis rendu compte assez vite que ça ne fonctionnait pas,
voire même que "retourner" une chaîne ne signifiait as grand chose,
puisque mon tableau de char est une variable interne à ma fonction, et
que donc retourner le pointeur qui pointe sur le premier élément est
inutile, étant donné que mon tableau disparait quand la fonction se
termine.
J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait
être correcte, mais je voulais demander un avis avant de l'implémenter :
Il s'agirait, dans la fonction, de définir la chaîne non pas comme une
variable, mais de façon dynamique avec malloc. Ainsi, retourner un
pointeur vers ce tableau serait possible (et surtout utilisable).
Je ne sais pas trop ce que ça vaut, ou si il y a mieux.
Qu'en pensez vous ?
Pas de raison que ça ne fonctionne pas. Il suffit d'être attentif au
fait que pour libérer le malloc(), il faut garder la valeur du
pointeur retourné. Donc pas de:
printf("%s", machaine(argumets));
Ou alors:
char* tempo;
printf("%s", tempo = machaine(argumets));
free(tempo);
--
Pierre
J'ai une fonction qui est sencée retourner une chaîne de caractères. Mais je me suis rendu compte assez vite que ça ne fonctionnait pas, voire même que "retourner" une chaîne ne signifiait as grand chose, puisque mon tableau de char est une variable interne à ma fonction, et que donc retourner le pointeur qui pointe sur le premier élément est inutile, étant donné que mon tableau disparait quand la fonction se termine.
J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait être correcte, mais je voulais demander un avis avant de l'implémenter :
Il s'agirait, dans la fonction, de définir la chaîne non pas comme une variable, mais de façon dynamique avec malloc. Ainsi, retourner un pointeur vers ce tableau serait possible (et surtout utilisable).
Je ne sais pas trop ce que ça vaut, ou si il y a mieux. Qu'en pensez vous ? Pas de raison que ça ne fonctionne pas. Il suffit d'être attentif au
fait que pour libérer le malloc(), il faut garder la valeur du pointeur retourné. Donc pas de: printf("%s", machaine(argumets));
Ou alors: char* tempo; printf("%s", tempo = machaine(argumets)); free(tempo); -- Pierre
Marc Boyer
Noé Falzon wrote:
J'ai une fonction qui est sencée retourner une chaîne de caractères. Mais je me suis rendu compte assez vite que ça ne fonctionnait pas, voire même que "retourner" une chaîne ne signifiait as grand chose, puisque mon tableau de char est une variable interne à ma fonction, et que donc retourner le pointeur qui pointe sur le premier élément est inutile, étant donné que mon tableau disparait quand la fonction se termine.
Oui.
J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait être correcte, mais je voulais demander un avis avant de l'implémenter :
Il s'agirait, dans la fonction, de définir la chaîne non pas comme une variable, mais de façon dynamique avec malloc. Ainsi, retourner un pointeur vers ce tableau serait possible (et surtout utilisable).
Je ne sais pas trop ce que ça vaut, ou si il y a mieux. Qu'en pensez vous ?
En général, on évite de retourner des choses allouées dans une fonction par peur que les utilisateurs oublient le free(). On préfère alors que l'utilisateur fournisse la chaine dans laquelle on écrit le résultat, et précise sa taille. Bien sur, si l'utilisateur est incapable de borner la taille nécessaire, c'est impossible.
Est-ce qu'une méthode est mieux que l'autre ? Ben, ça dépend du critère...
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
Noé Falzon wrote:
J'ai une fonction qui est sencée retourner une chaîne de caractères.
Mais je me suis rendu compte assez vite que ça ne fonctionnait pas,
voire même que "retourner" une chaîne ne signifiait as grand chose,
puisque mon tableau de char est une variable interne à ma fonction, et
que donc retourner le pointeur qui pointe sur le premier élément est
inutile, étant donné que mon tableau disparait quand la fonction se
termine.
Oui.
J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait
être correcte, mais je voulais demander un avis avant de l'implémenter :
Il s'agirait, dans la fonction, de définir la chaîne non pas comme une
variable, mais de façon dynamique avec malloc. Ainsi, retourner un
pointeur vers ce tableau serait possible (et surtout utilisable).
Je ne sais pas trop ce que ça vaut, ou si il y a mieux.
Qu'en pensez vous ?
En général, on évite de retourner des choses allouées
dans une fonction par peur que les utilisateurs oublient le
free().
On préfère alors que l'utilisateur fournisse la chaine dans
laquelle on écrit le résultat, et précise sa taille.
Bien sur, si l'utilisateur est incapable de borner la
taille nécessaire, c'est impossible.
Est-ce qu'une méthode est mieux que l'autre ? Ben, ça
dépend du critère...
Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.
J'ai une fonction qui est sencée retourner une chaîne de caractères. Mais je me suis rendu compte assez vite que ça ne fonctionnait pas, voire même que "retourner" une chaîne ne signifiait as grand chose, puisque mon tableau de char est une variable interne à ma fonction, et que donc retourner le pointeur qui pointe sur le premier élément est inutile, étant donné que mon tableau disparait quand la fonction se termine.
Oui.
J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait être correcte, mais je voulais demander un avis avant de l'implémenter :
Il s'agirait, dans la fonction, de définir la chaîne non pas comme une variable, mais de façon dynamique avec malloc. Ainsi, retourner un pointeur vers ce tableau serait possible (et surtout utilisable).
Je ne sais pas trop ce que ça vaut, ou si il y a mieux. Qu'en pensez vous ?
En général, on évite de retourner des choses allouées dans une fonction par peur que les utilisateurs oublient le free(). On préfère alors que l'utilisateur fournisse la chaine dans laquelle on écrit le résultat, et précise sa taille. Bien sur, si l'utilisateur est incapable de borner la taille nécessaire, c'est impossible.
Est-ce qu'une méthode est mieux que l'autre ? Ben, ça dépend du critère...
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
Emmanuel Delahaye
Noé Falzon wrote on 03/11/04 :
J'ai une fonction qui est sencée retourner une chaîne de caractères.
Censée...
On ne sait pas passer ou retourner un tableau en C. On ne fait que passer ou retourner son adresse.
Mais je me suis rendu compte assez vite que ça ne fonctionnait pas, voire même que "retourner" une chaîne ne signifiait as grand chose,
Exact.
puisque mon tableau de char est une variable interne à ma fonction, et que donc retourner le pointeur qui pointe sur le premier élément est inutile, étant donné que mon tableau disparait quand la fonction se termine.
Si tu veux dire "retourner l'adresse", oui effectivement elle doit être valide après être sortie de la fonction. (L'adresse d'une variable locale est invalide)
J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait être correcte, mais je voulais demander un avis avant de l'implémenter :
Il y en a 3
1 - Passer l'adresse de la chaine en paramètre (fgets() ...) et la retourner 2 - Allouer la chaine dynamiquement et retourner l'adresse (strdup(), fonction Posix bien connue) 3 - Retourner l'adresse d'une chaine statique. Utile si elle est constante, sinon, c'est une source de problèmes (strftime()).
Il s'agirait, dans la fonction, de définir la chaîne non pas comme une variable, mais de façon dynamique avec malloc. Ainsi, retourner un pointeur vers ce tableau serait possible (et surtout utilisable).
C'est une bonne méthode (#2). Il faut une syntaxe claire. Personnellement, j'ajoute '_dyn' en suffixe à la fonction, ça veux dire "attention, allocation dynamique, libérer le bloc après usage".
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html
"C is a sharp tool"
Noé Falzon wrote on 03/11/04 :
J'ai une fonction qui est sencée retourner une chaîne de caractères.
Censée...
On ne sait pas passer ou retourner un tableau en C. On ne fait que
passer ou retourner son adresse.
Mais je me suis rendu compte assez vite que ça ne fonctionnait pas,
voire même que "retourner" une chaîne ne signifiait as grand chose,
Exact.
puisque mon tableau de char est une variable interne à ma fonction, et
que donc retourner le pointeur qui pointe sur le premier élément est
inutile, étant donné que mon tableau disparait quand la fonction se
termine.
Si tu veux dire "retourner l'adresse", oui effectivement elle doit être
valide après être sortie de la fonction. (L'adresse d'une variable
locale est invalide)
J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait
être correcte, mais je voulais demander un avis avant de l'implémenter :
Il y en a 3
1 - Passer l'adresse de la chaine en paramètre (fgets() ...) et la
retourner
2 - Allouer la chaine dynamiquement et retourner l'adresse (strdup(),
fonction Posix bien connue)
3 - Retourner l'adresse d'une chaine statique. Utile si elle est
constante, sinon, c'est une source de problèmes (strftime()).
Il s'agirait, dans la fonction, de définir la chaîne non pas comme une
variable, mais de façon dynamique avec malloc. Ainsi, retourner un
pointeur vers ce tableau serait possible (et surtout utilisable).
C'est une bonne méthode (#2). Il faut une syntaxe claire.
Personnellement, j'ajoute '_dyn' en suffixe à la fonction, ça veux dire
"attention, allocation dynamique, libérer le bloc après usage".
--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html
J'ai une fonction qui est sencée retourner une chaîne de caractères.
Censée...
On ne sait pas passer ou retourner un tableau en C. On ne fait que passer ou retourner son adresse.
Mais je me suis rendu compte assez vite que ça ne fonctionnait pas, voire même que "retourner" une chaîne ne signifiait as grand chose,
Exact.
puisque mon tableau de char est une variable interne à ma fonction, et que donc retourner le pointeur qui pointe sur le premier élément est inutile, étant donné que mon tableau disparait quand la fonction se termine.
Si tu veux dire "retourner l'adresse", oui effectivement elle doit être valide après être sortie de la fonction. (L'adresse d'une variable locale est invalide)
J'ai essayé de trouver des solutions, et je n'en vois qu'une qui parait être correcte, mais je voulais demander un avis avant de l'implémenter :
Il y en a 3
1 - Passer l'adresse de la chaine en paramètre (fgets() ...) et la retourner 2 - Allouer la chaine dynamiquement et retourner l'adresse (strdup(), fonction Posix bien connue) 3 - Retourner l'adresse d'une chaine statique. Utile si elle est constante, sinon, c'est une source de problèmes (strftime()).
Il s'agirait, dans la fonction, de définir la chaîne non pas comme une variable, mais de façon dynamique avec malloc. Ainsi, retourner un pointeur vers ce tableau serait possible (et surtout utilisable).
C'est une bonne méthode (#2). Il faut une syntaxe claire. Personnellement, j'ajoute '_dyn' en suffixe à la fonction, ça veux dire "attention, allocation dynamique, libérer le bloc après usage".
-- Emmanuel The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html The C-library: http://www.dinkumware.com/refxc.html