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 :

Fonction retournant un tableau de chaines de caractères


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut Fonction retournant un tableau de chaines de caractères
    Bonjour,

    j'ai besoin d'être éclairé sur les fonctions retournant un tableau de chaine de caractère. Je m'explique, la fonction en question récupère dans un fichier des chaines de caractères qui sont stockées dans un tableau. Etant donné qu'il est impossible de retourner un tableau, je demande à la fonction de retourner un pointeur sur un tableau de chaines.

    J'utilise la synthaxe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char * fonction(...)
    {
    ...
    return (tab);
    }
    pourtant j'ai un problème de compilation de "conversion integer from pointer" avec un " précédente déclaration de fonction était ici ...", j'ai du mal saisir quelque chose !

    Merci d'avance..

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Salut et bienvenue sur les forums de developpez.com


    Ton code me paraît bien légé pour t'aider Où as-tu vu qu'on ne peut pas retourner un tableau de chaînes ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ** retourne_tab (void);
    Par exemple hein Mais ceci ne me paraît pas juste en tous cas:
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par thomass
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char * fonction(...)
    {
    ...
    return (* tab);
    }
    Si tab est un pointeur sur T, que représente *tab, à ton avis ?

    http://emmanuel-delahaye.developpez....ourner_tableau

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Je pensais qu'au même titre qu'on a pas le droit de passer en argument un tableau à une fonction, celle ci ne pouvait pas renvoyer un tableau.

    Pour revenir à ma question, si par exemple je prends le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    main()
    {
             char * tab;
             tab = fonction();
    }
     
    char * fonction()
    {
             char * nom[2]={"toto","titi"};
             return (* nom);
    }
    J'avoue que rien que sur l'affectation de tab j'ai un doute :s

    Edit : super merci pour ton lien, c'est exactement ce que je recherchais ! tab représente un pointeur de pointeur sur T non ?

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par thomass
    Pour revenir à ma question, si par exemple je prends le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    main()
    {
             char * tab;
             tab = fonction();
    }
     
    char * fonction()
    {
             char * nom[2]={"toto","titi"};
             return (* nom);
    }
    J'avoue que rien que sur l'affectation de tab j'ai un doute :s
    ce code est correct[1], mais comprends-tu exactement ce qu'il fait ?

    ------------------------
    [1] mais il serait préférable de le coder
    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
     
    #include <stdio.h>
     
    char const *fonction (size_t n)
    {
       char const *s = NULL;
       char const *nom[] = { "toto", "titi" };
       if (n < sizeof nom / sizeof *nom)
       {
          s = nom[n];
       }
       return s;
    }
     
    int main (void)
    {
       size_t i;
       for (i = 0; i < 3; i++)
       {
          char const *tab = fonction (i);
          if (tab != NULL)
          {
             printf ("tab = '%s'\n", tab);
          }
          else
          {
             printf("index %d : ERREUR\n", i);
          }
       }
       return 0;
    }

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Oui j'ai bien saisi, il ne fait rien, c'est un exemple stupide mais c'était uniquement pour illustrer ce sur quoi j'avais un doute !
    Merci de votre aide.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par thomass
    Oui j'ai bien saisi, il ne fait rien, c'est un exemple stupide mais c'était uniquement pour illustrer ce sur quoi j'avais un doute !
    Merci de votre aide.
    C'est pas ça ma question. C'est "comprends-tu comment il fonctionne ?" (sous entendu, bien sûr, alors explique ...)

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Eh bien il retourne un pointeur sur le premier élément d'un tableau de chaines de caractères. Ensuite on affecte tab à cette adresse.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Mais je vais revenir à mon cas, voici la source sur laquelle je travaille :

    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
    fonction (int nb_adh)
    { 
    	fiche *pt;
    	int i;
    	char *ptr, * *adr;
    	fgets(ptr,2,stdin);	
    	rewind (pfile);
    	for (i = 0; i < nb_adh; i++)
    	{
    		if ((ptr = malloc (sizeof (pt->nom)))!=NULL)
    		{
    			adr [i] = ptr;
    			fread (pt, sizeof (fiche), 1, pfile);
    			strcpy (adr[i], pt->nom);
    		}
    		else
    		{
    			printf ("\n		* ERREUR D'ALLOCATION DYNAMIQUE DE MEMOIRE *\n");
    			break;
    		}
    	}
    }
    fiche est une structure quelconque et nom qui en fait partie est un : Le fichier en question est déjà ouvert, ce que je cherche à faire c'est à retourner un pointeur sur le tableau de chaines de caractères adr qui contient le noms.

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    déjà ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		if ((ptr = malloc (sizeof (pt->nom)))!=NULL)
    est faux..

    Il faut réserver la place du '\0' à la fin, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		if ((ptr = malloc (sizeof (pt->nom)+1))!=NULL)

    Ensuite, que veux-tu retourner ?

    Enfin, tu déclares :

    qui est un POINTEUR, mais ensuite tu utilises sizeof (pt->nom) qui suppose que tu aies à disposition une STRUCTURE référencée par un pointeur... Or je n'ai pas vu de malloc ou de passage de paramètre. Donc ce pointeur ne pointe sur rien...

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Effectivement pour le pt j'avais pas fait toutes ces considérations (pourtant j'obtenais le résultat voulu).

    Je veux retourner adr

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    euh.......

    adr[i] ou adr ???

    Parce que là tu ne t'arrêtes pas à i.. tu stockes tout dans un tableau de chaînes, si je comprend bien.

    Donc tu veux retourner une chaîne en particulier, ou le tableau de toutes les chaînes ???

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Je veux retourner le tableau de toutes les chaines justement et non une chaine en particulier !

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    primo ton tableau adr n'est jamais alloué.... Donc ça risque pas de marcher quand tu fais adr[i]...

    Ensuite, pour faire ce que tu veux, c'est simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char **fonction (int nb_adh)
    { 
      char **adr=NULL ;
     
    .....
     
    return adr ;
    }

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Comment ca mon tableau n'est jamais alloué ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ((ptr = malloc (sizeof (pt->nom)))!=NULL)
    		{
    			adr [i] = ptr;
    			fread (pt, sizeof (fiche), 1, pfile);
    			strcpy (adr[i], pt->nom);
    		}
    J'utilisais la même synthaxe que celle que tu m'as donné avant de poser ma question et j'obtiens des erreurs de compilation : conversion integer from pointer puis il me renvoie à la précédente déclaration de la fonction (lors de l'appel) ...

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    NON il n'est jamais alloué...

    Là tu alloues une chaîne, et tu veux stocker le pointeur de cette chaîne dans adr[i]...

    Mais pour faire référence à adr[i], il faut déjà que adr soit alloué...

    et en ce qui concerne ta dernière remarque, il faudrait voir l'appel. Car cette déclaration est correcte.

  17. #17
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par thomass
    Mais je vais revenir à mon cas, voici la source sur laquelle je travaille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fonction (int nb_adh)
    { 
    	char *ptr, * *adr;
    	fgets(ptr,2,stdin);
    Stop. Ceci est extrêmement faux.

    - ptr n'est pas initialisé
    - sa valeur est donc indéterminée.
    - cette valeur est donnée à une fonction (fgets())
    Comportement indéterminé. Inutile d'aller plus loin pour le moment.

    D'autre part, une fois ce problème réglé, une valeur 2 pour la taille maximale à saisir est très faible. Elle permet de saisir un caractère, en laissant le '\n' trainer dans le flux, ou un '\n' tout seul. Quel est le but de cette opération ?

Discussions similaires

  1. Réponses: 10
    Dernier message: 31/05/2007, 16h10
  2. [C] tableau de chaines de caractères
    Par kitsune dans le forum C
    Réponses: 18
    Dernier message: 01/04/2006, 19h18
  3. PB avec fonction retournant un tableau
    Par T-B dans le forum Langage
    Réponses: 2
    Dernier message: 27/01/2006, 23h01
  4. fonction retournant un tableau
    Par Jero13 dans le forum C
    Réponses: 7
    Dernier message: 22/11/2005, 12h14

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