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

Linux Discussion :

comparaisnt entre deux chaines de caractères


Sujet :

Linux

  1. #1
    Membre habitué Avatar de rufa11
    Consultant informatique
    Inscrit en
    Décembre 2007
    Messages
    300
    Détails du profil
    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 300
    Points : 136
    Points
    136
    Par défaut comparaisnt entre deux chaines de caractères
    Bonjour,
    voila mon problèmes et le suivant:
    je doit comparait entre deux chaine de carctères pour dans une boucle,masi je n'arrive pas a trouver la solution, le code source et le suisvant:

    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
    static int bond_xmit_nouveau(struct sk_buff *skb, struct net_device *bond_dev)
    {
           struct bonding *bond = netdev_priv(bond_dev);
           struct slave *slave;
           int i;
           read_lock(&bond->lock);
    
           if (!BOND_IS_OK(bond)) {
                   goto out;
           }
    
           bond_for_each_slave(bond, slave, i) {
           if( *(slave->dev->name) == 'eth0' )    
           printk("\n l'interface est: %s \n", slave->dev->name);                       
           }
    out:
          read_unlock(&bond->lock);
          return 0; 
    }


    char name[IFNAMSIZ]; /* name contient le nom de l'interface */
    #define IFNAMSIZ 16
    slave: et une structure qui contien un champ de type poiteure dev.
    dev: est un poiteure vers une structure de type net_device .
    net_device: est une structure qui contient le champ name déclaré si dessous.

    l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    root@abdelkader-desktop:/usr/src/linux-2.6.29# ./do
    compilation
      CC [M]  drivers/net/bonding/bond_main.o
    drivers/net/bonding/bond_main.c:4373:35: warning: multi-character character constant
     LD [M]  drivers/net/bonding/bonding.o
      Building modules, stage 2.
      MODPOST 1 modules
      CC      drivers/net/bonding/bonding.mod.o
      LD [M]  drivers/net/bonding/bonding.ko
    installation des mises à jours
    Merci d'avance.

  2. #2
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    oulla...
    d'abord il faut baliser ton code pour que ce soit lisible...
    ensuite, on ne compare pas comme ca deux chaine de caractere !

    pour comparer deux chaine: strcmp(const char *, const char *)
    strcmp renvoi 0 si les chaines sont egales


    et 'eth0' ne veut absolument rien dire...si tu veux ecrire une chaine c'es les doubles quotes qu'il faut utiliser: "eth0"

    ecrire un driver avec de telles erreures peut être fatal pour le noyau.
    tu devrai revoir les bases du C avant de te lancer dans le developpement d'un module.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Je présume que ton code est du C (ou C++). Ben le problème c'est que dans ce langage bas niveau, le type "chaine" n'existe pas. Tout ce que le C connait, ce sont "les types simples (char, int, short, float, double)", "les tableaux" et "les pointeurs (adresses de variables)"
    Et donc pour pouvoir traiter une chaine, il faut la stocker dans un tableau de char.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char chaine[]="Bonjour";
    Cependant, malgré cette déclaration, tout ce que tu as en main, ce n'est que l'adresse du premier caractère (l'adresse de la case contenant 'B'). Avec cette adresse tu sais que sur la case suivante, tu auras 'o' puis 'n' etc.

    Donc si tu veux comparer 2 chaines, il te faut boucler sur chaque caractère de la chaine 1 en parallèle avec chaque caractère de la chaine 2 et comparer les caractères un à un.
    Heureusement cet algo a déjà été implémenté par les programmeurs de la librairie et codé dans la fonction strcmp(). Cette fonction reçoit les adresses de début de chaine, s'occupe elle-même de la boucle et renvoie 0 si les chaines sont égales, -1 si la chaine 1 est placée avant la chaine 2 dans l'ordre alphabétique et +1 si c'est l'inverse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (strcmp(chaine, "Bonjour") == 0)
        printf("Chaines égales\n");
    else
        printf("Chaines différentes\n");
    Remarque personnelle: vaut mieux apprendre les bases du C et faire des exercices avant de commencer à coder un truc ressemblant déjà à un vrai projet. Par ailleurs, quand je vois du "goto" j'ai un certain "a priori négatif" sur le codeur...

  4. #4
    Membre habitué Avatar de rufa11
    Consultant informatique
    Inscrit en
    Décembre 2007
    Messages
    300
    Détails du profil
    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 300
    Points : 136
    Points
    136
    Par défaut
    Bonjour, oui strcmp a résolu le problème, je les deja vu dans string.c mais je les complètement oublier, je débute encore dans la programmation kernel, c'est difficile mais tres intéréssent.
    Pour le "goto" je n'est fait que suivre le stile de programmation adopté par le programmeur du module bonding,j'ai pas voulu changer de stile.
    Merci milles foit, vous m'avait fait gagner beacoup de temps.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rufa11 Voir le message
    je débute encore dans la programmation kernel, c'est difficile mais tres intéréssent.
    Whaou. Pour un débutant C, tu te lances de suite dans la haute voltige !!!

    Citation Envoyé par rufa11 Voir le message
    Pour le "goto" je n'est fait que suivre le stile de programmation adopté par le programmeur du module bonding,j'ai pas voulu changer de stile.
    C'est pas forcément négatif... mais avant de le mettre faut quand-même se demander s'il n'y a pas une autre solution.

  6. #6
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    dans ton cas le goto ne sert à rien,
    le goto est generalement utilisé dans les modules lorsqu'une suite d'allocation est realisée pour eviter de reecrire 36000 fois la meme chose:
    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
     
     
    if(!alloc1())
      goto err1;
    if(!alloc2())
      goto err2
    if(!alloc3())
      goto err3
     
    /*...*/
    err3:
    free2();
    err2:
    free1();
    err1:
     
    return -ERRNO;

  7. #7
    Membre habitué Avatar de rufa11
    Consultant informatique
    Inscrit en
    Décembre 2007
    Messages
    300
    Détails du profil
    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 300
    Points : 136
    Points
    136
    Par défaut
    re, oui je voi ce que vous voulais dire, mai comment éviter le bloc dans le ca ou le bond n'est pas pres a la tx si je n'utilise pas le goto? il le faut que le teste soit en premier lieu. Et la fonction n'est pas encore terminée,il reste encore le marquage des paquets ip et le arp monitoring.
    Merci.

  8. #8
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    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
     
     
    static int bond_xmit_nouveau(struct sk_buff *skb, struct net_device *bond_dev)
    {
      struct bonding *bond = netdev_priv(bond_dev);
      struct slave *slave;
      int i;
      read_lock(&bond->lock);
     
      if (BOND_IS_OK(bond)) {
        bond_for_each_slave(bond, slave, i) {
        if( !strcmp(slave->dev->name ,"eth0" ) 
          printk("\n l'interface est: %s \n", slave->dev->name); 
        }
      }
      read_unlock(&bond->lock);
      return 0; 
    }
    par exemple...

  9. #9
    Membre habitué Avatar de rufa11
    Consultant informatique
    Inscrit en
    Décembre 2007
    Messages
    300
    Détails du profil
    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 300
    Points : 136
    Points
    136
    Par défaut
    Bonjour, oui ça a l'aire beaucoup plus optimisant, je vai tenire compte.
    un grand Merci.

  10. #10
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    je n'ai fais que copier ton code et changer le if,
    il reste une grosse erreur dans ton code, je ne sais pas ce que fais exactement bond_for_each_slave mais le pointeur slave n'a pas été alloué !

  11. #11
    Membre habitué Avatar de rufa11
    Consultant informatique
    Inscrit en
    Décembre 2007
    Messages
    300
    Détails du profil
    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 300
    Points : 136
    Points
    136
    Par défaut
    Re, vos conseilles met très précieux Mr.oui moi aussi au début je pensé que make va me le signaler,mais elle ne me la pas signaler,que "slave déclared but uninitialized". je me suis inspiré de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     struct slave *slave;
    int slave_no;   
     slave_no = bond->xmit_hash_policy(skb, bond_dev, bond->slave_cnt);
    bond_for_each_slave(bond, slave, i) 
                    slave_no--;
                    if (slave_no < 0) {
                            break;
                    }
            }
    dans ce ca aussi il na pas initialisé la varible slave et pourtant quand je compile le module il ne me signale pas que slave non intialisé. parcontre si je fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct slave   *slave;
    printk("\n le nom de l'interface est: %s", slave->dev->name);
    il m'affiche un warning et si je lance "ifenslave bond0 ethx" alors la c'est tous le système qui va se planté,et c'est normale vu qu'il n y a rien a afficher.

    La boucle bond_for_each_slave sert a itérer la liste des slave.

  12. #12
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    en fait, bond_for_each_slave est une macro, en regardant dans les source j'ai trouvé que slave était initialisé de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    slave = (bond)->first_slave

  13. #13
    Membre habitué Avatar de rufa11
    Consultant informatique
    Inscrit en
    Décembre 2007
    Messages
    300
    Détails du profil
    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 300
    Points : 136
    Points
    136
    Par défaut
    oui c'est vrai, les pointeurs comme bond->curr_active_slave et bond->first_active_slave sont initialisés dans bond_init().

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

Discussions similaires

  1. comparer entre deux chaines de caractères
    Par anfernus dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/07/2010, 13h45
  2. Réponses: 2
    Dernier message: 17/06/2008, 21h14
  3. requête where entre deux chaines de caractères
    Par soltani1 dans le forum Développement
    Réponses: 2
    Dernier message: 04/10/2007, 09h34
  4. requête where entre deux chaines de caractères
    Par soltani1 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/10/2007, 09h34
  5. espace entre deux chaines de caractères
    Par Pitou5464 dans le forum Access
    Réponses: 2
    Dernier message: 09/08/2006, 12h16

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