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 :

renvois de pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut renvois de pointeur
    salut. dans l'ennuis on peut apprendre des trucs plutot que de glander
    bref j'ai decider de faire en C une fonction split(char s[],char ss[])
    a utiliser comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       ptr = split("bonjour les amis"," ");
    et ptr est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     *ptr[4];
      ptr[0] = "bonjour"
      ptr[1] = "les"
      ptr[3] = "amis"
      ptr[3] = NULL;
    mon probleme? c'est que j'arrive pas a renvoyer le bon pointeur. je presente la fonction:
    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
     
    type_de_retour split(char s[],char ss[])
    {
      int mots = occurence(s,ss);
      if(mots==0)
          return NULL;
     
       mots++;// dans notre cas il y a 2 espaces donc 3 mots
       char *p[mots+1];
       p[mots]=NULL //pour signaler la fin
     
       int i,debut=0;
       for(i=0;i<mots;i++)
       {
           char *str = extract(s,&debut,ss); //debut=extraction a partire de.
           int l = strlen(str)+1;
           p[i] = (char *) malloc(sizeof(char *)*l);
           strcpy(p[i],str);
       }
     
    }
    bon le probleme c'est comment renvoyer p? et deuxieme question est-il necessaire de faire a la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void release(char *p[])
    {
         int i=0;
         while(p[i]!=NULL)
              free(p[i]0;
    }

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    P devrait plutôt être de type char **.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    char ** split(char s[],char ss[])
    {
       /* ... */
       char ** p = malloc(mots + 1);
       p[mots] = NULL;
       for(i=0;i<mots;i++)
       {
           char *str = extract(s,&debut,ss); //debut=extraction a partire de.
           p[i] = strdup(str);
       }
       return p;
    }
    Dans ce cas, release devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void release(char p**)
    {
        char *pp = *p;
        while(pp != NULL) {
            free(pp);
            ++pp;   
        }
        free(p);
    }

    Sinon, tu peux aussi faire une fonction qui ne fasse qu'une allocation mémoire.
    En effet, les éléments de p pourraient pointer vers le premier paramètre passé. Dans ce cas, la fonction release devient inutile (un free suffit).
    Mais cela dépend du but final de ton code.

  3. #3
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    je crois avoir compris dis moi si je me trompe : tu me demande de declarrer **p plutot que *p[] car le tableau sera considerer comme variable locales? donc si je renvois p il risquerait d'y avoir un boxon?

    merci pour l'instant ca marche. je continue apres je passe a une autre fonction. j'attend un peu avant de mettre resolut au cas ou...

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    En fait ce qui ne va pas dans ton code, c'est le
    C'est effectivement un tableau de pointeurs qui n'est donc valable que dans ta fonction.

    De plus, créer un tableau dont la taille est variable (je ne parle pas de dynamisme) n'est pas possible en C. (peut-être en C99, et encore).

  5. #5
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    Bon ca marche comme sur des roulettes apres correction , merci pour l'info.

  6. #6
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    desole de revenir la dessus mais la j'ai un probleme que je ne comprend pas:
    voici le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    char **p1 = split1();
    char **p2 = split("ca /sent /pas /bon"," /");
     
    int i =0;
    while(p1[i]!=NULL)
        printf("%s\n",p1[i++]);
     
    i =0;
     
    while(p2[i]!=NULL)  //ici la boucle ne s'arrete pas j'ai  une erreur de segmentation.
        printf("%s at %X\n",p2[i],p2[i++]);
    // et les adresses a 0,1,2,3 sont du genre f2f070 mais a 4 aulieu d'avoir un 0 j'ai une valeur.
    voyons la difference etre le split1 et le split:
    split1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char **split1(void)
    {
        char **p=malloc(sizeof(char)+4);
        p[0] = malloc(sizeof(unsigned char)*6);strcat(p[0],"bonjour");
        p[1] = malloc(sizeof(unsigned char)*11);strcat(p[1],"les");
        p[2] = malloc(sizeof(unsigned char)*4);strcat(p[2],"amis");
        p[3] = NULL;
     
        return p;
    }
    et la fonction split:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    char **splitStr(const char *s,const char *mask)
    {
    	int words = 0;
     
    	words = occurStr(s,mask); //recupere le nombre de mots
     
    	if(words==0)
    		return NULL;
     
    	words++;
     
     
    	int i,pos=0,d=0,k,j;
    	char **w = (char **) malloc(sizeof(char)*(words+1));
     
    	if(w==NULL)
    		return NULL;
     
    	w[words] = NULL;
    	for(i=0;i<words;i++)
    	{
    		if(i<words-1) //temps que on a pas attend l'avant dernier mot
    		{
     
    			pos = findStr(s,mask,d); //position du debut du separteur de mots
    			w[i] = (char *) malloc(sizeof(char) *(pos+2-d));
    		}
    		else  //pour le dernier mot
    			w[i]=(char *)malloc(sizeof(char)*(lenStr(s)-(pos+lenStr(mask)))+2));
     
    		if(w[i]==NULL)
                    {   
    			release(w);
                            return NULL;
                    }
     
    		j = d;
    		k = 0;
     
    		while(s[j]!='\0')
    		{
    			if((i<words-1)&&(j==pos))
    				break;
    			w[i][k] = s[j];
    			k++;j++;
    		}
     
    		d=pos+lenStr(mask); //position du debut du prochain mot
    		w[i][pos] = '\0';
    	}
    	return w;
    }
    d'ailleur meme si je mets la boucle d'affichage dans la fonction split. j'ai la meme erreur car le w[words] n'est jamais ==NULL comme je demande.
    je vois pas vraiment la difference entre les deux fonctions

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/01/2011, 15h33
  2. Réponses: 1
    Dernier message: 22/12/2009, 11h40
  3. Fonction qui renvoie un pointeur de fonction
    Par RaphAstronome dans le forum C++
    Réponses: 11
    Dernier message: 20/08/2006, 14h06
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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