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 :

passage de tableau dynamique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut passage de tableau dynamique
    salut,
    j'ai écrit un bout de script simplifié au maximum pour comprendre pourquoi je n'arrive pas à passer un tableau de caractère dans une fonction.
    voici mon code :
    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
    #include "libecoPCR/ecoPCR.h"
    #include <stdio.h>
    #include <string.h>
    #include <getopt.h>
     
    void printpattern(char *pattern, int p){
    	int i;
    	for(i=0;i<p;i++){
    		printf("%s\n",pattern[i]); // warning: format '%s' expects type 'char *', but argument 2 has type 'int'
    	}
    }
     
    int main(int argc, char **argv){
     
    	char 	**pattern	= MALLOC(sizeof(char *),"error pattern initialisation");
    	int 	p			=0;
     
    	for (p=0 ; argc > optind ; optind++, p++){
    		pattern[p] = MALLOC(strlen(argv[optind])+1,
    								"Error on pattern allocation");
    		pattern[p] = argv[optind];
    	}
     
    	printpattern(*pattern,p); 
     
    	return 0;
     
    }
    Mon compilateur me met un warning et j'ai un bus error à l'execution. J'ai essayé différentes solutions, mais je n'arrive pas à récupérer le contenu de mon tableau pattern.
    Merci du coup de main

  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 !


    Tu veux passer un pointeur de pointeur sur un argument qui n'est qu'un simple pointeur... normal, change l'argument de ta fonction au moins en pointeur de pointeur sur char !

    L'appel n'est pas bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printpattern(*pattern,p);
    Fait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printpattern(pattern,p);
    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
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    ok, ça marche.
    merci beaucoup, je commençais à chauffer sérieusement

  4. #4
    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
    Citation Envoyé par julien.63
    ok, ça marche.
    merci beaucoup, je commençais à chauffer sérieusement
    Bin faut juste rester logique c'est tout. Tu utilises un pointeur de pointeur alors il est normal que ton argument de la fonction soit au moins du même type !
    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 !

  5. #5
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par julien.63
    salut,
    j'ai écrit un bout de script....
    ATTENTION à l'usage des mots.. Tu es en informatique, chaque mot a un sens...

    Ce n'est pas un script, mais un programme, que tu as écrit..

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    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 julien.63
    salut,
    j'ai écrit un bout de script simplifié au maximum pour comprendre pourquoi je n'arrive pas à passer un tableau de caractère dans une fonction.
    voici mon code :
    <...>Mon compilateur me met un warning et j'ai un bus error à l'execution. J'ai essayé différentes solutions, mais je n'arrive pas à récupérer le contenu de mon tableau pattern.
    Bah, il faut être simple, logique et cohérent :
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    void printpattern (char **pattern, int p)
    {
       int i;
       for (i = 0; i < p; i++)
       {
          printf ("%s\n", pattern[i]);
       }
    }
     
    int main (int argc, char **argv)
    {
       char **pattern = malloc (sizeof *pattern * (argc - 1));
       if (pattern != NULL)
       {
          int r = 1;
          int w = 0;
          while (r < argc)
          {
             pattern[w] = strdup (argv[r]); /* POSIX.1 */
             r++;
             w++;
          }
          printpattern (pattern, w);
          free (pattern);
       }
       return 0;
    }
    Pose des questions si tu ne comprends pas (et adapte ce code à getopt())

    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    * monappli -s10 -d -a12 -c15
    ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    -s10
    -d
    -a12
    -c15
     
    Press ENTER to continue.

  7. #7
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    voici une version avec getopt
    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
    #include <stdio.h>
    #include <string.h>
    #include <getopt.h>
    #include <stdlib.h>
     
    void printpattern(char **pattern, int p){
    	int i;
    	for(i=0;i<p;i++){
    		printf("%s\n",pattern[i]);
    	}
    }
     
    int main(int argc, char **argv){
     
    	char 	**pattern	= malloc(sizeof *pattern * (argc -1));
    	int 	p			= 0;
     
    	while (getopt(argc, argv, "a:b:c:") != -1) {
     	   pattern[p] = strdup(optarg);
    	   p++;
    	}
     
    	printpattern(pattern,p);
    	free(pattern);
     
    	return 0;
     
    }
    donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SANCY:~/Documents/c $ ./ecotest -asdf -boii -cppe
    # sdf
    # oii
    # ppe

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    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 julien.63
    voici une version avec getopt
    Attention à libérer ce qui a été alloué avec strdup() :
    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 <string.h>
    #include <getopt.h>
    #include <stdlib.h>
     
    void printpattern (char **pattern, int p)
    {
       int i;
       for (i = 0; i < p; i++)
       {
          printf ("%s\n", pattern[i]);
       }
    }
     
    int main (int argc, char **argv)
    {
       char **pattern = malloc (sizeof *pattern * (argc - 1));
       int p = 0;
       while (getopt (argc, argv, "a:b:c:") != -1)
       {
          pattern[p] = strdup (optarg);
          p++;
       }
       printpattern (pattern, p);
     
       {
          int i;
          for (i = 0; i < p; i++)
          {
             free (pattern[i]);
          }
       }
       free (pattern);
       return 0;
    }

  9. #9
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    Est qu'on pourrait imaginer une fonction pour libérer la mémoire?
    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 <string.h>
    #include <getopt.h>
    #include <stdlib.h>
     
    void freememory(char **tab, int num){
    	int i;
    	for (i=0;i<=num;i++)
            {
    		free(tab[i]);	
    	}
    	free(tab);
    }
     
    void printpattern (char **pattern, int p)
    {
       int i;
       for (i = 0; i < p; i++)
       {
          printf ("%s\n", pattern[i]);
       }
    }
     
    int main (int argc, char **argv)
    {
       char **pattern = malloc (sizeof *pattern * (argc - 1));
       int p = 0;
       while (getopt (argc, argv, "a:b:c:") != -1)
       {
          pattern[p] = strdup (optarg);
          p++;
       }
       printpattern (pattern, p);
       freememory (pattern, p);
       return 0;
    }

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    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 julien.63
    Est qu'on pourrait imaginer une fonction pour libérer la mémoire?
    Absolument. La prochaine étape, la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct tab_string
    {
       char **tab;
       int num;
    };
    la suivante, l'ADT (TAD) :

    http://emmanuel-delahaye.developpez.com/tad.htm

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/03/2007, 09h40
  2. Réponses: 4
    Dernier message: 01/01/2007, 10h26
  3. Réponses: 4
    Dernier message: 19/12/2006, 20h06
  4. passage par paramètre d'un tableau dynamique bidimensionnel
    Par shaftJackson dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 17/07/2006, 13h28
  5. Passage de tableau dynamique en paramètre
    Par Didier L dans le forum Langage
    Réponses: 3
    Dernier message: 08/09/2005, 23h04

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