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 :

Faute de segmentation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut Faute de segmentation
    Bonjour,

    Pour mon application GTK, je fais appel à une fonction de concaténation en C dont le code est le suivant :
    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
    char *concat (int Nombre_Args, ...)
    {
        //Liste -variable- de chaînes de caractères à traiter
        va_list Liste_A_Traiter;
        //Compteur d'arguments
        int Compteur_Args;
        //Taille de la chaîne résultat
        size_t Taille;
        //Chaîne résultat
        gchar *Resultat_Concatene;
     
        //Initialisation de la liste à traiter, avec "Nombre_Args" variables
        va_start(Liste_A_Traiter, Nombre_Args);
        for (Taille = Compteur_Args = 0; Compteur_Args < Nombre_Args;
                Compteur_Args++)
            //Ajoute "Taille" et longueur de l'argument "Chaine de caractères"
            //courant à "Taille"
            Taille += strlen(va_arg(Liste_A_Traiter, gchar *));
        //Fin de traitement de la liste
        va_end(Liste_A_Traiter);
     
        //Réservation d'un bloc de taille "Taille + 1" en char
        Resultat_Concatene = (gchar *) malloc(Taille + 1);
        //Si la réservation s'est bien passée
        if (NULL != Resultat_Concatene)
        {
            //Initialisation de la liste à traiter, avec "Nombre_Args" variables
            va_start(Liste_A_Traiter, Nombre_Args);
            //On copie "" dans la chaine "Résultat_Concatene"
            strcpy(Resultat_Concatene, "");
            //Pour "Compteur_Args" allant de 0 à "Nombre_Args", et + 1
            for (Compteur_Args = 0; Compteur_Args < Nombre_Args; Compteur_Args++)
                //"Resultat_Concatene" recevra la copie des
                //différents éléments de la liste à traiter
                strcat(Resultat_Concatene, va_arg(Liste_A_Traiter, gchar *));
            //Fin de traitement de la liste
            va_end(Liste_A_Traiter);
        }
        //Renvoi de la chaine concaténée
        return Resultat_Concatene;
    }
    Je l'appelais par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nom_Complet = concat(2, Nom_Dossier, Nom_Fichier);
    Et là, d'un coup, il me dit SegFault. Y'a quelque chose qui m'échappe. Pouvez-vous me donner des indices ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ne t'avais-je pas conseillé de séparer cette fonction en deux?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tiens, essaie cette version corrigée:
    Code C : 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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    char *vconcat(int Nombre_Args, va_list Liste_A_Traiter)
    {
    	/*Copie du curseur de liste d'arguments,
    	  (ou selon la plate-forme, de la liste entière)
    	  pour mesurer la taille (oui, il faut deux parcours)*/
    	va_list Liste_Comptage;
     
    	/*Index de l'argument courant*/
    	int Index_Arg;
    	/*Longueur de la chaîne résultat, en caractères
    	  ("taille" signifie qu'on compte le zéro terminal avec)*/
    	size_t Longueur = 0;
    	/*Chaîne résultat*/
    	gchar *Resultat_Concatene;
     
    	/*Crée la copie*/
    	#ifdef va_copy
    	va_copy(Liste_Comptage, Liste_A_Traiter);
    	#else
    	Liste_Comptage = Liste_A_Traiter;
    	#endif
     
    	/*Pour chaque argument de la copie*/
    	for (Index_Arg=0; Index_Arg < Nombre_Args ; Index_Arg++)
    		/*Ajoute longueur de l'argument "Chaine de caractères"
    		  courant au total de longueur*/
    		Index_Arg += strlen(va_arg(Liste_Comptage, gchar const*));
     
    	/*Fin de traitement de copie:
    	  Nettoie la copie.*/
    	va_end(Liste_Comptage);
     
     
    	/*Réservation d'un bloc de "Longueur + 1" caractères*/
    	Resultat_Concatene = /*(gchar *)*/ malloc(Longueur + 1);
    	/*Si la réservation s'est bien passée*/
    	if (NULL != Resultat_Concatene)
    	{
    		/*Initialise le buffer de résultat à une chaîne vide*/
    		strcpy(Resultat_Concatene, "");
    		/*Pour chaque argument*/
    		for (Index_Arg=0; Index_Arg < Nombre_Args; Index_Arg++)
    			/*Concatène l'argument courant au résultat*/
    			strcat(Resultat_Concatene, va_arg(Liste_A_Traiter, gchar const*));
    	}
    	/*Retour de la chaine concaténée*/
    	return Resultat_Concatene;
    }
     
    char *concat(int Nombre_Args, ...)
    {
    	/*Liste -variable- de chaînes de caractères à traiter*/
    	va_list Liste_A_Traiter;
    	/*Chaîne résultat*/
    	gchar *Resultat_Concatene;
     
    	/*Initialisation de la liste à traiter, 
    	  avec les arguments suivant Nombre_Args*/
    	va_start(Liste_A_Traiter, Nombre_Args);
    	/*Appel de la fonction qui prend une va_list*/
    	vconcat(Nombre_Args, Liste_A_Traiter);
    	/*Fin de traitement de la liste*/
    	va_end(Liste_A_Traiter);
     
    	/*Retour de la chaine concaténée*/
    	return Resultat_Concatene;
    }
    Ça compile, mais je n'ai pas testé.

    Quand au code d'avant, il a quand même l'air correct. Vérifie que les chaînes que tu lui passes sont valides (notamment, aucun des deux pointeurs ne doit être nul).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ne t'avais-je pas conseillé de séparer cette fonction en deux?
    Je le reconnais et bats ma coulpe sur la place du Capitole...
    (mais ton bout de code me provoque : "Program received signal SIGABRT, Aborted.")
    Et je re-bats ma coulpe, j'avais un des deux qui était initialisé à NULL.

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/03/2009, 17h55
  2. Faut de segmentation
    Par cyberjoac dans le forum C++
    Réponses: 2
    Dernier message: 30/09/2007, 19h29
  3. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 16h15
  4. [TASM] Déclarer le segment de pile
    Par cipher dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 01/10/2002, 03h58
  5. angle entre 2 segments
    Par tane dans le forum Mathématiques
    Réponses: 4
    Dernier message: 25/09/2002, 16h47

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