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

Ada Discussion :

Conversion dans un package generic


Sujet :

Ada

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Conversion dans un package generic
    Bonjour, mon problème est relativement simple mais je ne trouve pas comment le résoudre.

    Je dispose d'un package ou le type des éléments est en integer. Une fonction de saisi permet à l'utilisateur de saisir les éléments (au format string) qui sont ensuite converti en integer. L'élément saisi doit obligatoirement être une string à la base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    valeur_int : integer;
    begin
    valeur_int := Integer'Value(valeur_saisi);
    Je souhaiterais en faire un package generic mais je ne parviens pas à résoudre le problème de la conversion du type string à mon type generic TypeElement.

    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
     
    procedure saisi(l: IN OUT T_Arbre) is
            valeur_saisi : string(1..1);
            valeur_int : TypeElement;
    begin
            loop
                Put("Donnez un element (espace pour finir) : ");
                get(valeur_saisi);
                exit when (valeur_saisi = " ");
                valeur_int := TypeElement(valeur_saisi);
                ajout(l, valeur_int);
                affiche(l);
                new_line;
            end loop;
    end saisi;
    J'ai une erreur invalid conversion, not compatible with subtype of "Standard.String". Je suppose qu'il doit y une solution pour convertir la string au format generic TypeElement.

    Si quelqu'un a une solution ou une piste, je suis preneur !

    Merci

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 9
    Points : 19
    Points
    19
    Par défaut
    Voici un exemple de conversion générique avec l'attribut 'value pour un type générique numérique flottant. J'ai mis en commentaires d'autres déclarations pour couvrir les types génériques entiers, modulaires, fixed-point et decimal fixed-point. Le code compile et s'exécute bien.

    la conversion par Unchecked_Conversion doit aussi bien compiler mais n'a pas trop de sens pour traduire une chaîne de caractères.

    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
    20
    21
    22
    23
    24
    25
    26
    with Ada.Integer_Text_Io;
    use Ada.Integer_Text_IO;
     
    with Ada.Long_Float_Text_Io;
    use Ada.Long_Float_Text_IO;
     
     
    procedure Demo is
       generic
          type Type_Element is  digits  <>  ;
       --   type Type_Element is  delta  <>  ;
       --   type Type_Element is delta <> digits <> ; 
       --   type Type_Element is  range  <>  ;
       --   type Type_Element is  mod  <>  ;
       function Conversion_generique(S : String) return Type_Element;
     
       function Conversion_generique (S : String) return Type_Element is
         begin
    	return Type_Element'Value(S);
         end Conversion_generique;
     
    function Conversion is new Conversion_generique(Type_Element => long_float);		     	     
     
    begin
       Put(Conversion("123.5689"));
     end Demo;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci pour ta réponse RedBlackTree.

    Le problème est que comme le type peut être soit un integer soit un string, je suis obligé de mettre type T_Element is private; dans la définition du package generic. Je ne peux donc plus faire de Type_Element'Value car le type n'est plus un scalaire.

    J'ai cru comprendre qu'on ne peut pas instancier un package avec le type string (car il faut définir la taille), mais c'est possible avec les Unbounded_String.

    Cependant je ne comprends pas comment réaliser ma fonction de saisi qui se chargera de caster/convertir vers Type_Element.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 9
    Points : 19
    Points
    19
    Par défaut Il faut peut être clarifier le besoin
    Quand je lis la phrase : "Le problème est que comme le type peut être soit un integer soit un string, je suis obligé de mettre type T_Element is private; dans la définition du package generic.", je comprend que tu veux pouvoir faire au choix les deux choses suivantes :
    1) transformer un string en integer (ce que fait le générique de ma réponse)
    2) transformer un string en string (ce qui n'est pas très compliqué à réaliser ! y compris en passant par une fonction de même nom)

    Maintenant si en fait le passage doit se faire d'un string vers un type réellement quelconque (record, array, pointeur ...) alors effectivement il faut beaucoup mieux spécifier en quoi consiste ce passage et cela aucun compilateur ne peut le deviner.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Oui RedBlackTree, c'est exactement ça (le 1 et le 2). Le programme se limite a utiliser des integers ou des strings pour instancier le package. J'ai finalement utiliser des unbounded string et ça marche.

    L'instanciation du package :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    package aB is new packageTest(integer, false, afficheInteger);
    --package aB is new packageTest(Unbounded_String, true, afficheUnbounded);
    La fonction de saisi :

    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
    20
    21
     
    procedure saisi(l: IN OUT T_Arbre) is
        valeur_saisi : Unbounded_String;
        valeur_integer : integer;
        function ConvertStringToType is new Ada.Unchecked_Conversion (Source => Unbounded_String, Target => T_Element);
        function ConvertIntegerToType is new Ada.Unchecked_Conversion (Source => Integer, Target => T_Element);
    begin
        loop
            Put("Donnez un element (vide pour finir) : ");
            valeur_saisi := Ada.Strings.Unbounded.Text_Io.Get_Line;
            exit when (valeur_saisi = "");
            if(isString) then
                ajout(l, ConvertStringToType(valeur_saisi));
            else
                valeur_integer := Integer'Value(to_string(valeur_saisi));
                ajout(l, ConvertIntegerToType(valeur_integer));
            end if;
            affiche(l);
            new_line;
        end loop;
    end saisi;
    Merci beaucoup pour l'aide !

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

Discussions similaires

  1. Dans quel package se trouve les fonctions C ??
    Par red210 dans le forum Linux
    Réponses: 9
    Dernier message: 18/12/2005, 20h16
  2. [vbnet] problème de conversion dans une datagrid
    Par Jsh dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/09/2005, 12h40
  3. Problème déclaration de variable dans un package
    Par LE NEINDRE dans le forum Modules
    Réponses: 3
    Dernier message: 23/08/2005, 18h26
  4. [3.0.2]Détection des erreurs dans le Package Explorer
    Par willowII dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 18/08/2005, 18h46
  5. [VB.NET] Inclure MSDE dans le package
    Par SergeF dans le forum EDI/Outils
    Réponses: 4
    Dernier message: 24/06/2004, 21h18

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