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 :

Bug de la fonction system en C :-(


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Par défaut Bug de la fonction system en C :-(
    Bonjour tout le monde !

    En cours, je suis sur des petits projets pour mon BTS... Or l'un d'eux va me rendre zinzin

    Je pense que la commande system () en est la source, mais comment résoudre ce problème ? Je n'ai pas la réponse. C'est pourquoi je viens à vous

    Mon programme permet de gérer les ordinateurs d'un réseau : il stock dans un fichier les données (adresse IP, nom du poste etc.) et l'une de ses fonctions consiste à effectuer un ping pour connaître l'état de la machine (en ligne / hors ligne).

    Pour cela, j'utilise la fonction system... Mais quelque chose de pas cool se produit ; explications :

    Voici mon code source :
    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
    void tester (char* fichierIP, char* fichierOK, char* fichierNOK)
    {
        Ordi* TabOrdi = chargerFichier(fichierIP);
        Ordi TabOrdiok[100];
        Ordi TabOrdiNok[100];
        int i = 0;
        int resultat = 0;
        char cmd[50];
     
        for (i=0;i <= nbreElement;i++) // nbreElement contient le nombre d'enregistrement du fichierIP
        {
            printf("---------------\n");
     
            // Je crée ma commande de ping et la stock dans cmd
            sprintf(cmd, "ping -n 1 %d.%d.%d.%d > NULL", TabOrdi[i].IPOrdi.ip1, TabOrdi[i].IPOrdi.ip2, TabOrdi[i].IPOrdi.ip3, TabOrdi[i].IPOrdi.ip4);
     
            // Je test
            printf("cmds : %s\n", cmd);
     
            // J'exécute ma commande et récupère dans "resultat" le code retourné par system()
            resultat = system (cmd);
     
            // J'affiche ce code résultat (pour voir si tout fonctionne)
            printf("resultat : %d\n", resultat);
        }
    }
    Et là, voici le résultat ! Pas très jolie ...

    ---------------
    cmds : ping -n 1 123.12.123.10 > NULL
    resultat : 0
    ---------------
    cmds : ping -n 1 4980802.1999633846.1988581918.48 > NULL
    resultat : 1
    ---------------
    cmds : ping -n 1 0.0.2679004.1988581993 > NULL
    resultat : 1
    ---------------
    cmds : ping -n 1 0.0.0.0 > NULL
    resultat : 1
    ---------------
    cmds : ping -n 1 1988583728.88.1988583756.0 > NULL
    resultat : 1
    ---------------
    cmds : ping -n 1 0.2678220.0.0 > NULL
    resultat : 1
    ---------------
    cmds : ping -n 1 0.0.0.0 > NULL
    resultat : 1
    Comme on peut voir mes adresses IP sont pas très... Bref ! Y'a un souci !

    Je commente la ligne où je fais mon system ()

    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
    void tester (char* fichierIP, char* fichierOK, char* fichierNOK)
    {
        Ordi* TabOrdi = chargerFichier(fichierIP);
        Ordi TabOrdiok[100];
        Ordi TabOrdiNok[100];
        int i = 0;
        int resultat = 0;
        char cmd[50];
     
        for (i=0;i <= nbreElement;i++) // nbreElement contient le nombre d'enregistrement du fichierIP
        {
            printf("---------------\n");
     
            // Je crée ma commande de ping et la stock dans cmd
            sprintf(cmd, "ping -n 1 %d.%d.%d.%d > NULL", TabOrdi[i].IPOrdi.ip1, TabOrdi[i].IPOrdi.ip2, TabOrdi[i].IPOrdi.ip3, TabOrdi[i].IPOrdi.ip4);
     
            // Je test
            printf("cmds : %s\n", cmd);
     
            // J'exécute ma commande et récupère dans "resultat" le code retourné par system()
            //resultat = system (cmd);
     
            // J'affiche ce code résultat (pour voir si tout fonctionne)
            printf("resultat : %d\n", resultat);
        }
    }
    Et là, miracle tout s'affiche correctement ! Mais je n'ai pas de ping de fait !

    ---------------
    cmds : ping -n 1 123.12.123.10 > NULL
    resultat : 0
    ---------------
    cmds : ping -n 1 192.168.12.3 > NULL
    resultat : 0
    ---------------
    cmds : ping -n 1 192.168.13.4 > NULL
    resultat : 0
    ---------------
    cmds : ping -n 1 192.168.12.6 > NULL
    resultat : 0
    ---------------
    cmds : ping -n 1 192.168.14.5 > NULL
    resultat : 0
    ---------------
    cmds : ping -n 1 192.168.14.8 > NULL
    resultat : 0
    ---------------
    cmds : ping -n 1 192.168.1.96 > NULL
    resultat : 0
    Bizarre n'est-ce pas ?

    Avez-vous une idée pour solutionner mon problème ?


    Merci d'avance

  2. #2
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Vérifie que les tableaux que tu utilise pour remplir cmd soit bien remplis.

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Par défaut
    Bien... Je dirais qu'ils sont bien remplis vu que lorsque je commente system (), on voit bien les valeurs =) (d'où mon expérience de mise en commentaire de system ())

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Essaye de remettre ta chaine à zéro après ton system:
    Je ne sais pas si ca va changer quelque chose mais apparemment dans les deux cas le premier passage est bon. Or le point commun entre les deux cas c'est qu'au premier passage dans ta boucle, cmd est vide. Donc peut-être qu'en la réinitialisant à chaque fois ça résoudra ton problème.

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Par défaut
    Ben pas très concluant ...

    Déjà avec bzero, j'ai une erreur de compil : undefined fonction (alors que j'ai bien string.h d'inclu !)

    J'ai fait un :
    Et le résultat :
    ---------------
    cmds : ping -n 1 123.12.123.10 > NULL
    resultat : 0
    ---------------
    cmds : ping -n 1 4980802.1999633846.1988581918.48 > NULL
    resultat : 1
    ---------------
    cmds : ping -n 1 0.0.2679004.1988581993 > NULL
    resultat : 1
    ---------------
    cmds : ping -n 1 0.0.0.0 > NULL
    resultat : 1
    ---------------
    cmds : ping -n 1 1988583728.88.1988583756.0 > NULL
    resultat : 1
    ---------------
    cmds : ping -n 1 0.2678220.0.0 > NULL
    resultat : 1
    ---------------
    cmds : ping -n 1 0.0.0.0 > NULL
    resultat : 1
    Visiblement, ça ne change rien :-(
    J'ai fait un test entre temps (qui ne résoud rien mais qui peut faire réfléchir !)

    j'ai légèrement modifier mon code pour vérifier si je pingais une ip prédéfini dans un tableau de char genre 192.168.10.1 : et là l'ip ne bouge pas.

    Je me suis dis, bon bah je vais mettre mon ip dans un tableau de char à chaque fois ... donc "ip" reçoit TabOrdi[i].IPOrdi.ip1, TabOrdi[i].IPOrdi.ip2, TabOrdi[i].IPOrdi.ip3, TabOrdi[i].IPOrdi.ip4 (grossièrement) ; et là je fais un ping sur le tableau de char "ip"

    Et bah même problème que précédemment =( l'ip est complêtement modifiée !

    Je ne comprend pas la relation qu'il peut exister entre system () et les int de ma structure :'-(

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    A tout hasard :
    Quel compilateur utilises-tu ? Quelles sont tes options de compilation ? Diminue le niveau d'optimisation (s'il y en a).

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

Discussions similaires

  1. fonction system et probleme d'arobase
    Par yerome dans le forum Langage
    Réponses: 3
    Dernier message: 08/07/2005, 16h53
  2. Réponses: 10
    Dernier message: 08/02/2005, 16h04
  3. Réponses: 1
    Dernier message: 20/08/2004, 09h16
  4. Réponses: 2
    Dernier message: 30/03/2004, 11h31
  5. Réponses: 13
    Dernier message: 20/03/2003, 08h11

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