Partage
  • Partager sur Facebook
  • Partager sur Twitter

[ADA] Exception dû à valeur incohérente sur enum

L'exception n'est pas levée

Sujet résolu
    3 juillet 2019 à 13:16:03



    Bonjour,

    Pour des raisons de confidentialité je ne posterai pas le code, mais un exemple qui illustre tout aussi bien mon soucis.

    Ci-dessous la déclaration d'un type Gender

    type Gender is (Male, Female); 

    La déclaration d'une variable de type Gender

    Toto : Gender :=  Male; 

    Dans la suite du programme, Toto est amené à être modifié et à recevoir (par le biais d'un simulateur) la valeur "XXXX" (donc ni Male ni Female). A la compilation, la valeur n'est pas connue. C'est à l'exécution, sur plateforme qu'une manipulation est faite et qui amène la modification de la variable. Aucune exception n'est levé. Le programme continue son bout de chemin. Pourquoi ? Pour être honnête je m'attendais à avoir une exception "Constraint_Error" dû au fait qu'on souhaite mettre une valeur incohérente au type et donc l'arrêt brutal du programme.

    A savoir que je ne souhaite pas nécessairement faire une gestion d'exception à cet endroit, mais plutôt comprendre et uniquement comprendre pourquoi il n'y a pas d'exception relevée dans ce cas.

    Merci à vous.

    A+

    -
    Edité par Didy7 4 juillet 2019 à 11:35:36

    • Partager sur Facebook
    • Partager sur Twitter
      3 juillet 2019 à 20:04:43

      Coucou,

      Si je comprend bien, tu affecte à Toto à un moment dans ton programme une chaine de caractères reçu par une lecture d'une IO (clavier, socket, n'importe quoi d'autre) ?

      • Partager sur Facebook
      • Partager sur Twitter
      Ensemble créons l'avenir !
        4 juillet 2019 à 11:28:05

        Bonjour,

        Merci pour ta réponse. Si je reprends l'exemple :

        type Gender is (Male, Female); 
        Toto : Gender :=  Male; 

        De ce que je comprends, ici les valeurs "possibles" seraient 0 (Male) et 1 (Female).

        Pour mieux illustrer l'exemple, ci-dessous la déclaration de Tata (de même type que Toto).

        Tata : Gender := Female;
        ...
        Modification de Tata par le simulateur (=200)
        ...
        Toto := Tata; 

        Tata est ici modifiée par un simulateur (qui simule un composant extérieur à celui sur lequel je bosse).

        Donc en résumé, et pour répondre à ta question, le type coïncide bien (il ne s'agit pas d'une chaine de caractère) mais la valeur quant à elle n'est pas correcte (200 alors que de mémoire, si aucune contrainte n'est posée, les valeurs possibles devraient être 0 ou 1). Toutefois, je remarque que si je souhaite récupérer la position de 200 dans l'enum, une exception est levée car elle n'est pas trouvée. Mais ce que je ne comprends pas c'est que cette exception devrait être levée à l'affection (Toto := Tata).

        Dans l'attente de votre réponse, merci.

        A+

        -
        Edité par Didy7 4 juillet 2019 à 11:29:14

        • Partager sur Facebook
        • Partager sur Twitter
          5 juillet 2019 à 20:35:58

          Bonsoir,

          Désolé pour le temps de réponse.

          Alors, je n'ai toujours pas saisie ce que fait rélement ton simulateur… en soit, il simule quelque chose, certe, ce que je veux comprendre c'est qu'est ce qu'il fait réellement à Tata, c'est à dire, comment il affecte la valeur (affectation simple, par position, par Unchecked_Conversion ?) ?

          Toutefois, il faut bien distinguer le fait que Male et Female sont des litéraux de ton énumération, tout comme '0', '1'… '42' qui sont des litéraux de Integer.

          Lorsque tu parle de 0 et de 1 pour ton enumération, tu parle en réalité de la position du litéral. Mais tu ne peux donc pas faire de truc du genre :

          Tata := 0;

          Ceci est illégal, en revanche tu peux faire ceci :

          Tata := Gender'Val (1);

          Ensuite, dans le cas d'un :

          Toto := Tata;

          Aucun exception n'est levé car Ada ne va pas s'amuser à vérifier à chaque affectation que la valeur est valide. Elle est supposé valide quand affecter (Si tu fait de l'Uncheck_Conversion, tu assume le fait de jouer avec le feu).



          -
          Edité par Heziode 5 juillet 2019 à 20:37:18

          • Partager sur Facebook
          • Partager sur Twitter
          Ensemble créons l'avenir !
            8 juillet 2019 à 13:16:51

            Salut,

            Merci pour ta réponse. Ne t'inquiète pas, le temps de réponse est parfaitement acceptable :D.  

            Heziode a écrit:

            Aucun exception n'est levé car Ada ne va pas s'amuser à vérifier à chaque affectation que la valeur est valide. Elle est supposé valide quand affecter (Si tu fait de l'Uncheck_Conversion, tu assume le fait de jouer avec le feu).

            Je pense que du coup cette phrase répond parfaitement à ma problématique.

            Heziode a écrit:

            Toutefois, il faut bien distinguer le fait que Male et Female sont des litéraux de ton énumération, tout comme '0', '1'… '42' qui sont des litéraux de Integer.

            Lorsque tu parle de 0 et de 1 pour ton enumération, tu parle en réalité de la position du litéral. Mais tu ne peux donc pas faire de truc du genre :

            Tata := 0;

            Ceci est illégal, en revanche tu peux faire ceci :

            Tata := Gender'Val (1);

            En effet, je ne suis pas du tout expert en ADA, merci de ces quelques explications et effectivement ça me parait beaucoup plus logique.

            Heziode a écrit:

            Alors, je n'ai toujours pas saisie ce que fait rélement ton simulateur… en soit, il simule quelque chose, certe, ce que je veux comprendre c'est qu'est ce qu'il fait réellement à Tata, c'est à dire, comment il affecte la valeur (affectation simple, par position, par Unchecked_Conversion ?) ?

            Le problème étant que moi même, je ne le sais pas réellement. Pour être honnête avec toi, le problème est rencontré par un collègue qui (je pense) ne sait pas vraiment ce que fait le simulateur.

            Mais en tout cas, tes explications sont précieuses et tu sembles avoir répondu à son (notre) interrogation. Merci ! 

            -
            Edité par Didy7 8 juillet 2019 à 13:17:49

            • Partager sur Facebook
            • Partager sur Twitter

            [ADA] Exception dû à valeur incohérente sur enum

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown