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 :

Type non scalaire ?


Sujet :

C++

  1. #1
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut Type non scalaire ?
    Bonjour,

    J'ai un pb avec une liste chainée dont le type à manipuler
    est définit avec typedef:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef (le type a manipuler) TYPE;
    Lorsque TYPE est de type non scalaire ça ne compile plus avec
    les fonction de retour de valeur au niveau de la vérification ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TYPE List::returnData()
    {
       if(emptyList()) return 0; //error: convertion from 'int' to non scalar type 'TYPE' requested
      return list->data;
    }
    La solution que j'ai trouvée c'est d'instancier (dans le if) un objet TYPE de l'initialiser à zéro (avec memset) et de renvoyer l'objet.
    Bon, ça marche mais je sais pas si c'est la meilleur solution, c'est peut être un peu lourd non ?
    Est ce quelqu'un aurait une autre idée ?
    Peut être faudrait-il revoir la conception ?

    Merci

  2. #2
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Vouloir retourner une valeur hardcodée alors qu'on ne connaît pas le type, c'est de toute façon voué à l'échec de compilation.

    La solution à base de memset n'est pas mieux : qui te dit que remplir l'espace mémoire d'un objet avec des zéros te donnera quelque chose de correct ? Et comment utiliserais-tu / testerais-tu une telle instance après l'appel à la fonction ?

    Si ta liste est vide et que l'utilisateur demande une valeur, renvoie lui simplement une exception.

  3. #3
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Si ta liste est vide et que l'utilisateur demande une valeur, renvoie lui simplement une exception.
    Ok. merci
    Est ce que un simple throw suffirait ? ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    throw printf("la liste est vide!");
    ou est ce qu'il vaudrait mieux récupérer l'erreur ?
    (mais si la liste est vide, à part dire qu'elle est vide je vois pas trop quoi faire de plus, sinon la remplir )

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Il existe aussi une solution sans exception:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    bool List::returnData(TYPE& x)
    {
      if(emptyList())
        return false;
      x = list->data;
      return true;
    }

  5. #5
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Est ce que un simple throw suffirait ? ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw printf("la liste est vide!");
    Oui, tu sais il n'y a pas 50 façons de lever une exception
    Par contre même si tu peux lancer n'importe quoi, mieux vaut utiliser une vraie classe d'exception. Je ne sais pas ce que tu comptais faire avec printf, mais en général on lève une exception en passant les infos utiles à son constructeur, infos que l'on peut ainsi récupérer lorsqu'on rattrape l'exception.

    ou est ce qu'il vaudrait mieux récupérer l'erreur ?
    Si tu lèves une exception tu dois traiter l'erreur (même si c'est dans ton main). Globalement pour une liste vide, je dirais que tu dois être capable de la traiter assez tôt sans remonter trop haut.

    Mais bon idéalement le parcours de la liste ne serait pas intrusif, et ce genre de situation n'arriverait jamais... Prends exemple sur std::list ; il y a également un exemple dans la FAQ si je me souviens bien.

  6. #6
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Je ne sais pas ce que tu comptais faire avec printf, mais en général on lève une exception en passant les infos utiles à son constructeur, infos que l'on peut ainsi récupérer lorsqu'on rattrape l'exception.
    J'avoue que je n'y connais pas grand chose aux exceptions, j'ai juste fait un tour trés rapide sur la FAQ.
    Je pense qu'il est temps pour moi d'y retourner.

    Prends exemple sur std::list ;
    J'ai testé le cas de figure où l'on veut récupérer une valeur dans une liste vide. (j'ai testé avec vector, mais bon c'est le même principe).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int main()
    {
        std::vector<int> v;
        //v.push_back (12);
        int first = v.front ();
        printf("%d\n", first);
       return 0;
    }
    He ben j'ai été trés surpris.
    Non seulement je n'ai aucun warning ni error à la compilation, mais en plus
    quand je lance l'appli c'est le crash pur et simple

    Je pensais que dans la stl tout avait été prévu et qu'avec ce cas de figure on avait un warning ou une erreur de compilation, mais non rien, juste un beau plantage.

    nb: Comme je connais trés peu la stl (je m'en suis servi que 2 ou 3 fois) peut être c'est moi qui est fait une erreur ?

  7. #7
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Non aucune erreur, simplement la fonction membre front suppose que l'utilisateur est certain que sa liste n'est pas vide lorsqu'il veut récupérer le premier élément. Càd que le test "liste vide ?" est géré par l'utilisateur et non par la liste.

  8. #8
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Ah d'accord!
    Merci de m'avoir éclairé

    Donc finalement c'est peut être pas trés utile de vouloir faire un test à tout prix dans ma fonction, je n'ai qu'a faire comme la stl.

Discussions similaires

  1. Conversion vers un type non-scalaire
    Par Gamall dans le forum C
    Réponses: 7
    Dernier message: 08/07/2011, 02h31
  2. convertir un type non managé en type managé.
    Par poporiding dans le forum MFC
    Réponses: 6
    Dernier message: 22/05/2006, 10h49
  3. convertir un type non managé en type managé.
    Par poporiding dans le forum C++
    Réponses: 3
    Dernier message: 22/05/2006, 09h44
  4. Réponses: 7
    Dernier message: 15/02/2006, 09h58
  5. certains types non documentés?
    Par hansaplast dans le forum wxWidgets
    Réponses: 5
    Dernier message: 02/02/2006, 13h15

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