IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

return un pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Par défaut return un pointeur
    Je suis pas sur que mon titre soit exact mais bon, voila j'ai une fonction qui s'appelle :
    int remplissage_contenu_fichier1(int argc,char* argv [])

    Je déclare dedans :
    char **contenu_fichier1=(char**)malloc((10000)*sizeof(char*));

    Et à la fin je voudrais faire un "return contenu_fichier1;" (?), c'est un tableau de char, seulement j'ai le droit à "return makes integer from pointer without a cast" :s

    Mon programme marche si je le met en tant que main, avec un return 0...En gros je voudrais faire de ce programme un "sous programme" >.<

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Si c'est un tableau de "char", je ne comprends pas pourquoi tu utilises un pointeur de pointeur. Il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char * tafonction ( ... .. ... )
    {
    char *contenu_fichier1 =  malloc( 10000 ); /* 10000 caracteres maxi */
    (...)
    return contenu_fichier1;
    }
    Ta fonction doit retourner un pointeur sur "char" et non un "int".
    Une fois que tu n'as plus besoin de ton tableau, n'oublie pas de libérer l'espace mémoire avec "free", et de mettre à NULL le pointeur que tu utiliseras pour stocker l'adresse retournée par ta fonction.

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Bonjour,

    Quand tu écris une fonction comme:
    Citation Envoyé par mailbox Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int remplissage_contenu_fichier1(int argc,char* argv []);
    le "int" de début de ligne est le type de retour de la fonction. Ici le compilateur s'attend à ce que tu retournes un entier.
    Si tu souhaites retourner un tableau de chaine de caractères (char**) ta fonction doit être de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char** ma_fonction (/* mes paramètres */);

  4. #4
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Citation Envoyé par mailbox Voir le message
    Je suis pas sur que mon titre soit exact mais bon, voila j'ai une fonction qui s'appelle :
    int remplissage_contenu_fichier1(int argc,char* argv [])

    Je déclare dedans :
    char **contenu_fichier1=(char**)malloc((10000)*sizeof(char*));
    Il ne faut pas faire le cast du retour de malloc() en C. Et puis avez-vous vraiment besoin de 10000 pointeurs sur chaîne ? Ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char** contenu_fichier1 = malloc(argc * sizeof(char*));
    ne conviendrait-il pas ?

    Et à la fin je voudrais faire un "return contenu_fichier1;" (?), c'est un tableau de char, seulement j'ai le droit à "return makes integer from pointer without a cast" :s

    Mon programme marche si je le met en tant que main, avec un return 0...En gros je voudrais faire de ce programme un "sous programme" >.<
    (un tel sous-programme s'appelle une fonction). La réponse a déjà été donnée. Le prototype de votre fonction doit être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char** remplissage_contenu_fichier1(int argc,char* argv [])
    avec libération du pointeur de retour dans l'appelant. Attention, vous allez récupérer un char**, ou d'un tableau de char*. Il est fort possible que vous ayez à écrire une boucle pour libérer préalablement ces 10000 (ou argc) pointeurs, s'ils ont été alloués dans la fonction.
    Je suis un peu étonné du nom de votre fonction et je me demande si elle ne renvoie pas une bête copie de argv. Ne serait-ce pas plutôt un truc comme ça que vous cherchez à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef char* chaine;
     
    char* remplissage_contenu_fichier1(int argc, char* argv []){
        size_t lens[argc];
        int i, offset = 0, longueur = 0;
        for(i = 0; i < argc; i++){
    	lens[i] = strlen(argv[i]) + 1;
    	longueur += lens[i];
        }
        char* contenu_fichier1 = malloc(longueur + 1);
        if(contenu_fichier1 != NULL){
    	for(i = 0; i < argc; i++){
    	    strcpy(contenu_fichier1 + offset, argv[i]);
    	    offset += lens[i];
    	    contenu_fichier1[offset - 1] = '\n';
    	}
    	contenu_fichier1[offset] = '\0';
        }
        return contenu_fichier1;
    }
     
    int main(int argc, char* argv []) {
        char* chaine = remplissage_contenu_fichier1(argc, argv);
        FILE* fichier = fopen("test.txt", "w");
        puts(chaine);
        if(fichier != NULL){
    	fprintf(fichier, chaine);
    	fclose(fichier);
        }
        free(chaine);
        return EXIT_SUCCESS;
    }
    A tester en faisant par exemple test zorglub frunobulax.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 40
    Dernier message: 15/05/2014, 21h51
  2. return d'un pointeur
    Par awalter1 dans le forum C
    Réponses: 6
    Dernier message: 29/08/2007, 13h54
  3. probleme de pointeur ? return array
    Par Funraill.net dans le forum C
    Réponses: 23
    Dernier message: 05/06/2006, 16h52
  4. Pointeur intelligent boost : return NULL ->comment faire?
    Par choinul dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 21/12/2005, 16h24
  5. Réponses: 9
    Dernier message: 19/12/2005, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo