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 :

Iterateurs null


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut Iterateurs null
    Bonjour, jai un bout de code dans le logiciel que je dois maintenir qui est le suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<CAS_FRONT*>::iterator i,nouveau=NULL;
    Ma question:

    A quoi sert le null?? Par defaut lorsquon fait seulement declarer literateur sans lui dire exemple v.begin() il pointe sur null non???

    Ca fonctionne sous borland mais sous Unix/gcc il dit

    mailleur3d_front.cpp:661: error: conversion from `int' to non-scalar type `__gnu_cxx::__normal_ite rator<CAS_FRONT**, std::vector<CAS_FRONT*, std::allocator<CAS_FRONT*> > >' requested


    Par la suite, pour savoir si literateur pointe sur null est-ce quon peut faire if !(*iterateur) ??

    Merci

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Si l'itérateur pointe sur NULL, *it va lancer une exception.
    Par contre, ( ! it ) devrait renvoyer true, conformément à la norme (qui dit qu'un itérateur doit se comporter comme un pointeur). Cela dit, conformément à la norme,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<machin>::iterator it = NULL;
    devrait compiler. Mieux vaut tester, donc...

  3. #3
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Le hic cest que gcc prend pas le i = NULL;

    Il dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error: conversion from `int' to non-scalar type `__gnu_cxx::__normal_ite rator<CAS_FRONT**, std::vector<CAS_FRONT*, std::allocator<CAS_FRONT*> > >' requested

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    D'abord un rappel.
    Un itérateur n'est pas un pointeur !!!

    Un pointeur est par contre un représentant particulier des itérateurs dits à accès direct.
    Certaines implémentations de vecteur implémentent std::vector<>::iterator comme un pointeur. Mais:
    - c'est un détail d'implémentation
    - cela peut varier d'une implémentation à l'autre (propriétaire)
    - cela ne veut pas dire que l'on puisse en faire quoique ce soit.

    Les itérateurs sont des objets servant à référencer des données "vivant" dans des plages itérables. Ces plages sont, pour 99.99% d'entre elles, définies par deux choses :
    - un itérateur, déréférençable (si la plage est non vide), de début de plage
    - un itérateur, non-déférençable de fin de plage.
    Suivant les notations, on trouve: [debut,fin[ ou [début,fin).

    En sorte de corrolaire, un itérateur est considéré déférençable par rapport à une plage de données. Et un itérateur sera considéré non valide, par rapport à une plage, s'il est "égal" au dernier élément définissant la plage.

    Ainsi, un itérateur peut dans l'absolu pointer vers une donnée valide, mais être considéré comme non-déférençable dans le cadre d'un traitrement. p.ex. une recherche parmi les 4 premiers éléments (soit sur [debut,debut+4[), d'une plus grande collection, qui renverrait debut+4 (le potentiellement 5e élément) signifirait que l'on n'a rien trouvé.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Ouais dans mon cas finalement je set a mon vector.end() au départ. C'est ce qui me permet de remplacer le NULL qui plantait sous gcc.

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Mais. C'est normal que cela plante. Null n'a aucun sens pour un itérateur.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Je sais ca fait aucun sens, je comprend pas pourquoi Borland tolérait cela.

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par vdumont
    Je sais ca fait aucun sens, je comprend pas pourquoi Borland tolérait cela.
    Parce que, comme te l'a dit Luc; il y a des implémentations pour lesquelles vector<T>::iterator n'est qu'un typedef pour T*.

  9. #9
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Sans doute aussi parce que la norme le suggère :
    Citation Envoyé par ISOIEC4882-1998, 24.2
    Since iterators are an abstraction of pointers, their semantics is a generalization of most of the semantics of pointers in C++. This ensures that every template function that takes iterators works as well with regular pointers.
    Rien n'interdit d'ailleurs que "past_the_end" vaille NULL. Reste que dans du code propre, il est effectivement préférable de tester son itérateur vs. end().

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

Discussions similaires

  1. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  2. Comment rediriger la sortie vers /dev/null
    Par dclink dans le forum C
    Réponses: 4
    Dernier message: 24/06/2003, 18h23
  3. Tester si un champ est NULL
    Par titititi007 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/06/2003, 10h17
  4. [VB6] [BDD] Recordset et champ égal à Null
    Par Gr|ppen dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/03/2003, 10h00
  5. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 00h07

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