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 :

vérification d'existence utilité


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 294
    Points : 128
    Points
    128
    Par défaut vérification d'existence utilité
    Bonjour,

    Je ne comprends pas l'utilité de la condition (a[j] && (v[j] != j)). En particulier, pourquoi vérifie-t'on l"existence de a[j].?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool *a = new bool[n];
     for (int i = 0; i < n; i++)
        a[i] = true;
      for (int j = 0; j < n; j++)
        if (a[j] && (v[j] != j)) // Pourquoi vérifie-t'on que a[j] existe?
    {}
    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    a étant un pointeur vers un tableau de n bool, on ne vérifie ici pas l'existence de l'élément, mais si celui-ci est à true ou non.
    Si oui, on vérifie alors la condition suivante v[j] != j.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Bon, déjà, on ne vérifie pas l'existence de a[j], qui existe toujours (pour j<n).
    On vérifie que sa valeur est true.

    Ensuite, avec le code que tu présentes, cela peut effectivement sembler stupide.

    Mais on peut très ben imagine que le code qui suit fait quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a[j+2] = maFonction(j);
    et alors, 2 itérations plus tard, a[j] pourrait avoir une valeur autre que true.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 294
    Points : 128
    Points
    128
    Par défaut
    Bonsoir,

    A Winjerome en effet, merci.
    Merci à codini pour son explication.
    Mais pour le code suivant, pourquoi vérifie t'on que le i existe?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     for (int i = 0; i < p.n; i++)
        {
          if (i) // Pourquoi vérifier si le i existe?
    	  s << ' ';
          s << p.v[i] + 1;
        }
    Merci.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oublie le terme "existe", if ( condition ) vérifie avant tout si condition est non-nul.
    Donc ici si i est différent de 0 : soit tout sauf la première itération.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    On ne vérifie pas que a[j] existe, on vérifie la valeur de l'élément a[j].

    Ce code correspond trait pour trait (la facilité de lecture en moins à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (a[j]==true && (v[j] != j))
    Voici une petite explication, histoire de fixer les choses :
    a est un tableau de booléen, c'est à dire un ensemble de valeurs qui peuvent valoir true ou false.
    comme il s'agit de valeurs booléennes, elles peuvent parfaitement être utilisées "telles quelle" comme opérande pour l'opérateur logique AND: si a[j] vaut vrai, cela donnera la formule si (vrai ET QUE (v[j] != j)) (le résultat dépendant alors uniquement de la valeur de v[j] et si a[j] vaut false, cela donnera la formule si(faux ET QUE (plus rien à foutre, le résultat est d'office faux ) )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Dis-toi que si i n'existe pas, ça ne compile pas...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En fait, le terme "vérifier l'existence" avec un if, ça me fait penser à javascript. Est-ce de là que vient ton expérience (ou au moins, d'un autre langage de script)?
    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.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 294
    Points : 128
    Points
    128
    Par défaut
    Bonjour,

    Aussi par exemple, dans ce code là, il s'agit bien de "vérifié l'existence" via
    l'utilisation de assert.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A {
    public:
      long n; // taille du tableau
      R * v; // le pointeur sur le tableau 
      A(long m) : n(m), v( new double[n]) { 
        assert(v && n>0 );
      } // un constructeur
    PS:
    J'ai fais un peu de script shell, peut-etre que mon expression "vérifié l'existence" viens de là.

    Par exemple,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    # script plop.sh
     
    if [ ! -e "$1" ]; then
    	echo "$1 n'existe pas"
    Dont l'exécution donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (mando@polgara) (~) $ ./plop.sh dieu
    dieu n'existe pas

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par xavierdestev Voir le message
    Aussi par exemple, dans ce code là, il s'agit bien de "vérifié l'existence" via l'utilisation de assert.
    Non. Le assert en question vérifie que n est différent de 0, et que n est strictement supérieur à 0.

    if (a) signifie implicitement if (a!=0).

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 294
    Points : 128
    Points
    128
    Par défaut
    Merci pour les réponses.

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    En fait, il faut savoir que toute variable déclarée existe forcément.

    Le seul cas où l'on fait un test qui peut être assimilé à un test d'existence, c'est lorsque l'on teste un pointeur.

    Mais commençons par le commencement : Pour comprendre cette explication, il faut savoir ce qu'est un pointeur

    Un pointeur n'est jamais qu'une valeur numérique entière (généralement non signée) qui représente l'adresse en mémoire à laquelle on trouvera un élément du type indiqué (ou d'un type compatible).

    Il arrive que l'on "prévoie qu'il puisse y avoir" un élément, alors qu'il n'y en a pas forcément.

    Or, comme je viens de te le dire, toute variable déclarée existe forcément, entre le moment de sa déclaration et le moment où l'on quitte la portée dans laquelle elle est déclarée(*).

    La seule solution, si l'on veut pouvoir indiquer que "c'est quelque chose qui n'existe pas forcément", c'est d'utiliser l'adresse de ce "quelque chose", et de lui donner une valeur particulière si le quelque chose n'existe effectivement pas.

    L'adresse de ce quelque chose, c'est un pointeur sur ce quelque chose et la valeur particulière que l'on peut lui donner est nullptr (en C++11) ou NULL (avant C++11).

    Cette valeur est définie pour être égale à la valeur booléenne false, ce qui fait que, lorsque l'on fait un test du genre de if(ptr)/* ... */ renverra true toute valeur qui n'est pas égale à nullptr (NULL).

    Ainsi, si tu as une structure proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct ListItem{
        int value;
        ListItem * next;
    };
    qui te permettra de créer une liste chainée d'entiers, chaque élément a d'office une valeur (s'il existe un élément, element.value existe), mais il y a d'office un élément qui n'est pas relié à un élément suivant: le dernier de la liste.

    Il n'y aurait aucun sens (et il serait dangereux) d'essayer d'accéder à la valeur de l'élément suivant le dernier élément de la liste!

    Nous commencerons donc par nous assurer que next contient une adresse valide ( en fait différente de nullptr, c'est le mieux que l'on puisse faire, en espérant que next ait bien été initialisé à nullptr lorsqu'il ne pointait vraiment vers aucun élément ) avant d'essayer d'accéder au champs "value" de next.

    Cela se traduira le plus souvent par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (lePointeur->next ){
        /* next existe, on peut faire ce qu'on veut ici */
    }
    qui correspond strictement à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (lePointeur->next != nullptr){
        /* next existe, on peut faire ce qu'on veut ici */
    }
    Cela pourrait prendre la forme d'une assertion (bien qu'une assertion sert avant tout à vérifier qu'un condition soit remplie, et à éviter d'aller plus loin en débug afin de permettre au développeur de savoir où il s'est planté) sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assert(lePointeur->next);
    Il n'y a que dans un cas similaire que nous aurons effectivement quelque chose qui correspond à un test d'existence

    (*)En fait, c'est ici que je devrais faire la distinction entre la variable d'une part et l'espace mémoire d'en représenter le contenu de l'autre.

    En effet, la variable existe d'office entre le moment où elle est déclarée et le moment où l'on quitte la portée dans laquelle elle a été déclarée.

    Mais si l'on travaille avec un pointeur (qui ne représente que l'adresse mémoire à laquelle on est sensé trouver un objet du type attendu), le pointeur et l'objet réel sont deux éléments clairement distincts
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Vérification d'existence du tuple avant insertion
    Par Juliana dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 11/06/2008, 16h12
  2. Réponses: 1
    Dernier message: 18/04/2008, 16h31
  3. vérification d'existence d'un dossier
    Par Pitou5464 dans le forum Access
    Réponses: 1
    Dernier message: 28/08/2006, 11h11
  4. [VBA-E] vérification fichier existant
    Par MatMeuh dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/06/2006, 07h10
  5. [VB.NET] Vérification d'existance d'une table
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/05/2004, 10h17

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