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 :

Problème de réallocation d'un tableau de chaine de caractères


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Problème de réallocation d'un tableau de chaine de caractères
    Bonjour, je n'ai pas l'habitude de poster sur les forums mais je suis face à un problème incompréhensible depuis 3 jours, voilà pourquoi je sollicite votre aide.
    Le problème se situe dans la fonction find_ports qui doit renvoyer une structure comprenant un tableau lui même contenant des chaînes de caractères (la liste des ports ttyACM).
    Lorsque je souhaite retourner seulement le "ttyACM0" dans le tableau, aucun soucis, mais lorsque je concatène à l'aide de strcat pour avoir "/dev/ttyACM0" j'obtiens une erreur de segmentation.

    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
     
    typedef struct {
    	char ** COM;	     // tableau contenant la liste des ports COM
    	unsigned int nb_com; // le nombre de ports COM
    }ls_ports;
     
     
    bool commence_par( char * comp,char * a_comp) {
    	int i=strlen(comp)-1;
    	int n;
    	bool check=true;
     
    	if (strlen(a_comp)-1<i) return NULL;
    	else {
    		for (n = i; n >=0 && check; n--)
    			if (comp[n]!=a_comp[n]) check=false;
     
    		return check;
    	}
    }
     
    ls_ports find_ports() {
    	struct dirent *lecture;
    	ls_ports p;
    	p.nb_com=0;
     
    	p.COM=malloc(sizeof(char *));
    	p.COM[0]=NULL;
     
    	DIR *rep;
    	rep = opendir("/dev/" );
    	while ((lecture = readdir(rep))) {
    		if (commence_par("ttyACM",lecture->d_name)) {
    			p.nb_com++;
     
    			if(realloc(p.COM,(p.nb_com)*sizeof(char *))==NULL) { printf("Recherche des ports COM : Erreur lors de la reallocation 1\n"); exit(1); }
     
    			p.COM[p.nb_com-1]="/dev/";
    			strcat(p.COM[p.nb_com-1],lecture->d_name);
    		}
    	}
    	closedir(rep);
    	return p;
    }


    J'ai déjà tenté de modifier ma structure comme ceci, sans aucun succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct {
    	char * COM[14];	     // tableau contenant la liste des ports COM
    	unsigned int nb_com; // le nombre de ports COM
    }ls_ports;
    J'ai aussi tenté d'allouer dynamiquement chaque p.COM[p.nb_ports-1] avec un realloc, sans succès non plus.

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 301
    Points : 4 961
    Points
    4 961
    Billets dans le blog
    5
    Par défaut
    Bonsoir.

    p est une variable locale à find_ports();. Elle est donc détruite lors la fonction se termine. Il te faut aussi allouer p dynamiquement. Ou alors tu passes p en paramètre de la fonction.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Merci pour votre réponse

    je retourne bien p dans ma fonction find_ports() afin de l'utiliser dans le reste du code.
    j'ai tenté d'allouer p :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p=malloc(sizeof(ls_ports));
    sans effet ..

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 301
    Points : 4 961
    Points
    4 961
    Billets dans le blog
    5
    Par défaut
    J'ai répondu un peu à côté de ta question. Mais c'est que ca m'a sauté aux yeux.

    Sinon, pour revenir à ta question première, tu as deux soucis :
    1. Comment sais-tu par avance le nombre de p.COM tu vas avoir besoin,
    2. Il faut allouer assez d'espace pour strcat(); ne dépasses le tampon transmis.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Merci,
    Là est toute la difficulté, le nombre de p.COM dépend du nombre de fichier "ttyACM" que je trouve, voilà pourquoi j'ai fait un realloc pour rajouter de la mémoire à ma variable p.COM au fur et a mesure.
    Effectivement je pourrais faire 2 boucle while : une pour compter le nombre de fichiers et la seconde pour affecter le nom des fichiers avec seulement un malloc (ce que je vais essayer tout de suite d’ailleurs)
    Mais j'aimerais comprendre pourquoi le realloc ne fonctionne pas ..

    Oui c'est certainement le strcat qui cause l'erreur de segmentation, mais comment allouer plus de mémoire ?

    EDIT :
    avec 2 while et le malloc seul, l'erreur de segmentation persiste
    EDIT 2 :
    j'ai oublié de faire un malloc sur p.COM[p.nb_com-1], je n'ai plus d'erreur de segmentation, mais pas de résultat (je cherche)
    EDIT 3 :
    Eh non, mon erreur de segmentation est toujours présente ..

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Étrange, ceci ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    p.COM[p.nb_com-1]="/dev/";
    strcat(p.COM[p.nb_com-1],lecture->d_name);
    Mais ceci fonctionne : (c'est l'inverse que je souhaite)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    p.COM[p.nb_com-1]=lecture->d_name;
    strcat(p.COM[p.nb_com-1],"/dev/");

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 301
    Points : 4 961
    Points
    4 961
    Billets dans le blog
    5
    Par défaut
    Je soupçonne fortement strcat(); d'attendre en argument des chaînes de caractères se terminant par '\0'. Hors, p.COM[0] ne se termine pas de la sorte. J'image que strcat(); utilise ce caractère spécial comme point d'entrée pour ajouter la chaîne suivante.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Le problème était lors de la copie dans le strcat, je m'en suis sortie comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strcpy(p.COM[p.nb_com-1],"/dev/");
    strcpy(&p.COM[p.nb_com-1][5],lecture->d_name);
    à la place du strcat.
    Merci bien !

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

Discussions similaires

  1. problème avec tableau de chaine de caractères
    Par soumti84 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 24/04/2009, 14h07
  2. Problème avec un tableau de chaines de caractères
    Par greg_h19 dans le forum Débuter
    Réponses: 1
    Dernier message: 22/12/2008, 15h31
  3. Réponses: 2
    Dernier message: 11/11/2008, 16h10
  4. Problème avec tableau de chaine de caractères
    Par saubin dans le forum Débuter
    Réponses: 9
    Dernier message: 31/10/2008, 20h11
  5. Réponses: 10
    Dernier message: 31/05/2007, 15h10

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