Retour de fonction

Fermé
naimor49 - Modifié par naimor49 le 27/01/2014 à 18:45
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 29 janv. 2014 à 09:31
Bonsoir,

Je souhaite implémenter une fonction qui retourne un tableau de caractère, j'ai donc écris:

char* FONTION()
{
int N;
char tab[N];
/...../
return tab[N];
}


Ma fonction compile bien, mais quand je l'appelle dans le main, comment puis je faire pour réutiliser ce tab[N]? Le main me dit que je ne l'ai jamais définit.. Je dois donc le définir dans le main avant d'appeler ma fonction FONCTION , ce qui me permettra de l'utiliser par la suite ? Cela me semble bizarre, puisque je le défini déjà dans FONCTION ...

2 réponses

Utilisateur anonyme
27 janv. 2014 à 20:41
Bonjour,

Ton tab[N] est un char, je m'étonne donc que tu n'aies pas d'erreur à la compilation.
Es-tu bien sûr de ce que tu as écrit?
Pour en récupérer la valeur de retour il suffirait de la mettre dans une variable sinon, tout simplement.

Autrement merci d'utiliser les balises de code à l'avenir pour faciliter la lisibilité du programme.

Cdt,
Orinym
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
28 janv. 2014 à 10:22
Salut naimor49,

1.

S'agissant de ton code.

char* FONTION()
n'est sans doutes pas le bon prototype pour ta fonction. Voir en 2.

int N;
tu déclares N, mais tu le l'initialises pas. Tu ne sais donc pas quelle valeur est affectée à N.

char tab[N];
tu déclares une variable locale tableau à longueur variable de N caractères, mais la valeur de N étant imprévisible, tu ne sais pas quelle longueur. Les tableaux à longueur variable sont utilisables en C99. Pour des raisons de portabilité, tu devrais éviter ce type d'usage, sauf si tu sais ce que tu fais.

return tab[N];
cela devrait être
return tab
pour retourner un pointeur sur le premier élément du tableau. Cependant, tu as un problème, car tu veux retourner un pointeur sur un espace mémoire alloué localement à ta fonction. Dès que ta fonction retourne, la variable n'existe plus et son espace mémoire non plus.

2.

Il y a plusieurs façons de faire, et la façon la plus appropriée peut dépendre de la façon dont tu veux appeler ta fonction, ou de ce que fait la fonction.

Une façon habituelle en C est de passer en paramètre le pointeur vers le premier élément du tableau à modifier, ainsi que le nombre d'éléments du tableau.

#include <stdio.h>

void fill_string_with_zeros(char * st, size_t len)
{
    int n;
    for (n = 0; n < len - 1; n++)
    {
        st[n] = '0';
    }
}

int main(void)
{
    char st[11] = "";

    fill_string_with_zeros(st, sizeof(st));
    printf("st contient maintenant : %s\n", st);

    return 0;
}


Dans cet exemple, c'est la fonction appelante (main) qui est responsable de l'allocation de la mémoire nécessaire au tableau
st
.
st
ainsi passé en paramètre, sans crochets indiquant autre chose, passe à la fonction le pointeur vers le premier élément du tableau.

3.

stp, quand tu postes du code, essaye avant de le compiler avec tous les warnings (avec gcc l'option -Wall est déjà un bon début), et avant de poster, corrige toutes les erreurs de syntaxe empêchant la compilation, et comprend la raison des warnings émis par le compilateur et fais ce qu'il faut pour y remédier et faire taire tous les warnings. Si tu ne sais pas comment les corriger, vois ton cours de C, un manuel, cherche par toi même, et si tu n'y arrives pas pose la question ici :-)

Plusieurs erreurs mentionnées en 1. sont signalées par un compilateur tel que gcc avec les warnings activés.

Sur le forum, les balises de code aident à la lecture, car elles préservent l'indentation de ton code et font une coloration syntaxique. Mets ton code entre balises :
<code c>
--> ton code ici <---
<
/code>.


Dal
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
28 janv. 2014 à 10:40
Autre remarque, en général, le style de programmation en C veut que l'on n'utilise des mots en lettres CAPITALES que pour les constantes ou macros définies pour le préprocesseur. Les utiliser autrement peut rendre le code déroutant pour un programmeur C.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
28 janv. 2014 à 21:29
for (n = 0; n < len - 1; n++)
Je mettrais plutôt n<len; en condition. Enfin, c'était juste pour lui donner un exemple donc pas bien grave.

Sinon parfait pour le reste.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
29 janv. 2014 à 09:31
Salut fiddy :-)

à la réflexion, je garde
n < len - 1;
en condition, mais je ferai ma fonction comme cela :

void fill_string_with_zeros(char * st, size_t len)
{
    int n;
    for (n = 0; n < len - 1; n++)
        st[n] = '0';
    /* Ajout ci-dessous. A ce stade n vaut 10 et donc 
     * permet d'accéder au 11ème et dernier caractère 
     * pouvant être stocké par st, on s'en sert donc
     * pour terminer la chaîne */
    st[n] = '\0';   
}


...histoire d'être sûr de terminer la chaîne

Dans mon exemple st a une taille de 11 et peut donc contenir 10 caractères plus le caractère de fin de chaîne. Donc une fonction qui remplit la chaîne de zéros doit bien remplir de 11 - 1 caractères, et réserver le 11ème au '\0' (ce que j'avais, honte à moi, omis de faire :-P).


Dal
0