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 :

Debugger et strlen


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut Debugger et strlen
    Bonjour,

    J'ai une double boucle. La première permet de changer de chaine de caractères et la deuxième parcourt cette chaine. Ma deuxième boucle imbriquée varie donc de 0 à strlen(string)+1 si on prend une inégalité stricte.

    Mon problème est le suivant : quand je lance la compilation, le programme s'execute et j'obtiens le résultat attendu.
    Pourtant, et c'est là que ça devient intéressant, quand je lance la compilation avec le debugger, je reçois le signal SIGSEV.
    En effet, à un moment donné, strlen retourne une valeur plus grande que celle prévue.

    Sans utiliser le debugger, strlen retourne les bonnes valeurs.
    Avec le debugger, strlen retourne une mauvaise valeur pour une chaine bien précise.
    D'ailleurs, je note qu'il renvoie le double de la valeur en question. Je ne sais pas si ça à son importance...

    Voici ce que j'obtiens :

    Avec le debugger


    Sans le debugger


    La chaine qui devrait faire 8 caractères en possède apparemment 17-1 avec le debugger !

    La fonction qui me pose problème avec la ligne en rouge qui est le lieu de l'erreur :

    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
    t_adjacencyMatrix *getAdjacencyMatrixStructure( t_csv *csv )
    {
        /* Création de la structure de stockage des données */
        t_adjacencyMatrix *adjacencyMatrix = createAdjacencyMatrixStructure( csv->line-csv->firstDataLine+1 );
    
        /* La boucle commence à la 4ème ligne dans le fichier csv soit la 3ème ligne dans le tableau */
        size_t i_start = csv->firstDataLine-1;
    
        size_t atoiv = 0;
        /* On parcourt chaque ligne de la matrice d'adjacence */
        size_t i;
        for ( i=i_start ; i< csv->line ; i++ )
        {
            /* Chaine de caractères pour stocker le sommet (colonne) dont le sommet courant (ligne) est adjacent */
            char valueIsString[5];
    
            /* Variable pour compter le déplacement dans valueIsString */
            size_t offset = 0;
    
            /* Pour chaque sommet, on regarde les sommets qui lui sont adjacents */
            size_t size = stringLength(csv->spreadSheet[i][csv->adjacencyDataRow-1])+1;
            printf("\n size = %d", size);
            //getchar();
            size_t j;
            for ( j=0 ; j<size ; j++ )
            {
                if ( csv->spreadSheet[i][csv->adjacencyDataRow-1][j] != ',' )
                {
                    valueIsString[offset] = csv->spreadSheet[i][csv->adjacencyDataRow-1][j];
                }
    
                if ( csv->spreadSheet[i][csv->adjacencyDataRow-1][j] == ',' || csv->spreadSheet[i][csv->adjacencyDataRow-1][j] == '\0')
                {
                    valueIsString[offset] = '\0';
                    offset=-1;
                    atoiv = atoi(valueIsString)-1;
                    //printf("\n %s %d %d", valueIsString, i-i_start, atoi(valueIsString)-1);
                    adjacencyMatrix->matrix[i-i_start][atoi(valueIsString)-1] = 1;
                }
    
                offset++;
            }
        }
    
        /* On renvoie la structure */
        return adjacencyMatrix;
    }
    Merci d'avance.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Ta chaine ne se termine par par un '\0'. A toi de comprendre pourquoi. Peut-être qu'à un moment tu copies strlen() octects au lieu de strlen() + 1 ?

  3. #3
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Je viens de vérifier et je copie bien le '\0'. En témoigne le debugger :



    J'ai un triple pointeur sur caractère : char ***tab (csv->spreadSheet dans le code)
    tab[x][y] représente la chaine de caractères à la ligne x et la colonne y.
    tab[x][y][z] représente le z_ième caractères de la chaine de caractères se trouvant à la ligne x et la colonne y.

    A la ligne (x=7) 7, à la colonne (y=6) 6 et au caractère (z=7) numéro 7 :
    La chaine qui fait 7 caractères + 1 pour '\0' donne 8 caractères.
    A z=7 ( ie le 8ème caractères ), je mets bien '\0' dans tab[x][y][z].
    Donc strlen(tab[x][y])+1 devraient bien me renvoyer 8 non et non 17 ?

  4. #4
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    J'ai du tricher parce que je ne trouve vraiment pas l'origine de cette erreur. J'avais un tableau qui stockait la taille de chaque chaine de caractères pour faire l'allocation du triple pointeur sur char. Je l'ai réutilisé ici. J'aurais préféré trouver cette erreur mais bon là je ne sais plus quoi faire.

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

Discussions similaires

  1. [TP]debugger
    Par mmm dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 07/12/2003, 22h07
  2. [BPW]Exécution du debugger Windows sur un OS 32 bits
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 28/11/2003, 22h55
  3. [VB6] Comment Debugger une activeX ??
    Par Berns dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/05/2003, 17h34
  4. Debugger sous Linux
    Par Shadow Blade dans le forum Choisir un environnement de développement
    Réponses: 6
    Dernier message: 29/11/2002, 18h54
  5. Debugger 16-32 bits
    Par Mat dans le forum Assembleur
    Réponses: 4
    Dernier message: 28/06/2002, 11h34

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