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

Bibliothèques Discussion :

[API MySQL] Segmentation fault


Sujet :

Bibliothèques

  1. #1
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut [API MySQL] Segmentation fault
    Bonjour à tous,

    Je suis un peu (beaucoup) perplexe suite à l'apparition de l'erreur Segmentation fault dans mon appli.

    En effet, voilà un code qui fonctionne :

    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
    #include </usr/local/mysql/include/mysql.h>
    #include <stdio.h>
     
    #define CFG_HOTE "monhote"
    #define CFG_BASE "mabase"
    #define CFG_USER "monuser"
    #define CFG_PWD  "monpwd"
     
    int main(void) {
     
       MYSQL       mysql;
       MYSQL_RES * resultat;
       MYSQL_ROW   enr;
     
       char sql[250];
     
       mysql_connect(&mysql, CFG_HOTE, CFG_USER, CFG_PWD);
     
       mysql_select_db(&mysql, CFG_BASE);
     
       strcpy(sql, "SELECT * ");
       strcat(sql, "FROM _suppliers ");
       strcat(sql, "WHERE isActive = 1");
     
       mysql_query(&mysql, sql);
     
       resultat = mysql_use_result(&mysql);
     
       while ((enr = mysql_fetch_row(resultat))) {
          printf("%s %s %s\n", enr[0], enr[1], enr[2]);
       }
     
       mysql_free_result(resultat);
     
       mysql_close(&mysql);
     
       return(0);
     
    }
    Seulement, j'aimerais déporter toute la requête SQL dans une nouvelle fonction suppliers().

    Je modifie donc la fonction main comme suit :

    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
    #include </usr/local/mysql/include/mysql.h>
    #include <stdio.h>
     
    #define CFG_HOTE "monhote"
    #define CFG_BASE "mabase"
    #define CFG_USER "monuser"
    #define CFG_PWD  "monpwd"
     
    int main(void) {
     
       MYSQL       mysql;
     
       mysql_connect(&mysql, CFG_HOTE, CFG_USER, CFG_PWD);
     
       mysql_select_db(&mysql, CFG_BASE);
     
       suppliers();
     
       mysql_close(&mysql);
     
       return(0);
     
    }
    et créé ma fonction suppliers() comme tel :

    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
    int suppliers(void) {
     
       MYSQL       mysql;
       MYSQL_RES * resultat;
       MYSQL_ROW   enr;
     
       char sql[250];
     
       strcpy(sql, "SELECT * ");
       strcat(sql, "FROM _suppliers ");
       strcat(sql, "WHERE isActive = 1");
     
       mysql_query(&mysql, sql);
     
       resultat = mysql_use_result(&mysql);
     
       while ((enr = mysql_fetch_row(resultat))) {
          printf("%s %s %s\n", enr[0], enr[1], enr[2]);
       }
     
       mysql_free_result(resultat);
     
       return(1);
     
    }
    C'est à ce moment-là que le Segmentation fault apparaît à l'exécution de l'appli .. et je n'arrive pas à savoir pourquoi un simple copié/collé de mon traitement dans une autre fonction peut provoquer cette erreur.

    J'essaie donc de savoir d'où peut venir le problème et dans ma phase de debug, je me rends compte qu'il me suffit de commenter la boucle while pour ne plus avoir cette erreur.

    Je tiens à préciser que ça fait seulement deux jours que je fais du C et que je capte pas toujours tout.

    Quelque chose m'aurait échappé lors de l'externalisation de mon traitement ?


  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       resultat = mysql_use_result(&mysql);
     
       while ((enr = mysql_fetch_row(resultat))) {
          printf("%s %s %s\n", enr[0], enr[1], enr[2]);
       }
    A mon avis, il y a un problème dans la requête et resultat vaut NULL.
    Ce qui coinciderait avec ton segmentation fault dans la boucle.

    Teste au retour de mysql_use_result resultat==NULL.


    Il est aussi en général bon de vérifier que la connexion s'est bien faite, ça fait souvent planter l'application

  3. #3
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut
    Citation Envoyé par millie
    A mon avis, il y a un problème dans la requête
    Citation Envoyé par millie
    Teste au retour de mysql_use_result resultat==NULL.
    Je viens de tester ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (!(resultat = mysql_use_result(&mysql))) {
       printf("Erreur requete !\n");
       return(1);
    }
    en effet, ce message apparaît et je n'ai plus l'erreur de segmentation, mais c'est justement ça qui me laisse perplexe étant donné qu'elle fonctionne dans le main. :/

    Citation Envoyé par millie
    Il est aussi en général bon de vérifier que la connexion s'est bien faite, ça fait souvent planter l'application
    Je l'avais fait au début, mais je me suis dit que je pourrais gagner quelques millièmes de secondes d'exécution si j'enlevais la condition. ^^

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     int suppliers(void) {
     
       MYSQL       mysql;
    .....
     
       mysql_query(&mysql, sql);
    mysql est local et n'a pas été initialisé. Le mieux est sans doute de le passer en paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int suppliers(MYSQL* mysql) {
     
    .....
     
       mysql_query(mysql, sql);
    ....
    int main(void) {
     
       MYSQL       mysql;
        mysql_connect(&mysql, CFG_HOTE, CFG_USER, CFG_PWD);
        mysql_select_db(&mysql, CFG_BASE);
        suppliers(&mysql);
    ....

  5. #5
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut


    Parfait, merci beaucoup pour cette aide !

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

Discussions similaires

  1. C, mysql.h et "Segmentation fault" :/
    Par Havran dans le forum C
    Réponses: 12
    Dernier message: 28/01/2008, 19h56
  2. API MySQL - Connexion réseau
    Par klael dans le forum Bases de données
    Réponses: 3
    Dernier message: 18/03/2004, 09h25
  3. Utilisation des API MySQL // ADO ou BDE ? (sujet 2)
    Par rohstev dans le forum C++Builder
    Réponses: 8
    Dernier message: 07/11/2003, 10h50
  4. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43
  5. [DevC++]Installation de l'API MySQL
    Par Nasky dans le forum Dev-C++
    Réponses: 22
    Dernier message: 24/07/2003, 22h40

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