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 :

Décomposition : compilation unit expected!


Sujet :

Ada

  1. #1
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut Décomposition : compilation unit expected!
    Bonjour,

    J'ai écrit une fonction sous adagide, mais le programme ne passe pas à la compilation..

    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
    WITH Ada.Text_IO, Ada.Integer_Text_IO;
    USE Ada.Text_IO, Ada.Integer_Text_IO;
     
    SUBTYPE Nombres IS Natural RANGE 0..9999;
    TYPE Tableau IS ARRAY(1..4) OF Natural;
     
    FUNCTION Decomposition(N: Nombres) RETURN Tableau IS
     
       T: Tableau;
     
    BEGIN
       FOR I IN T'RANGE LOOP
          T(I) :=N mod 10;
          N:= N/10;
       END LOOP;
     
       RETURN T;
     
    END Decomposition;
    L'erreur semble se trouver lors de la déclaration du sous-type Nombres ainsi que du type Tableau: compilation unit expected. Où est le problème?

    Merci d'avance!

    P.S.: dans ma boucle for, j'ai utilisé T'Range, mais je ne suis pas sûr. En principe, on devrait trouver l'intervalle que doit parcourir ma variable I, c'est-à-dire ici toutes les "cases" de mon tableau. Mais que signifie vraiment T'Range?

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

    les déclarations se font dans la partie déclarative d'une unité de compilation. C'est à dire que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SUBTYPE Nombres IS Natural RANGE 0..9999;
    TYPE Tableau IS ARRAY(1..4) OF Natural;
    devrait se trouver entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FUNCTION Decomposition(N: Nombres) RETURN Tableau IS
    et le begin.

    Range désigne l'interval incluant les borne d'un type discret. Ici, Range désigne l'ensemble des case du tableau T de type Tableau. c'est à dire 4 cases.

  3. #3
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    Bonjour,

    L'ennui, c'est que dans la définition de la fonction, j'utilise le sous-type Nombres et le type Tableau. Du coup, il me semble logique de les définir avant la définition même de la fonction non?

    Et en effet, j'ai essayé de placer les définitions des type et sous-type entre la définition de la fonction et le begin, et comme je m'y attendais, d'autres messages d'erreur apparaissent à la compilation, à savoir:

    "Nombres" is undefined
    "Tableau" is undefined
    assignment to "IN" mode parameter not allowed


    Concernant Range, en fait, ça voudra dire que ma variable parcourra les 4 cases de mon tableau c'est bien cela?

  4. #4
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Bonjour,

    les déclarations se font dans la partie déclarative d'une unité de compilation. C'est à dire que

    Code :
    SUBTYPE Nombres IS Natural RANGE 0..9999;
    TYPE Tableau IS ARRAY(1..4) OF Natural;

    devrait se trouver entre

    Code :
    FUNCTION Decomposition(N: Nombres) RETURN Tableau IS

    et le begin.
    Je dirais même plus :
    ou dans la définition d'un paquetage comme ici dans l'exemple .

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui, pardon. (Pas encore d'aplomb).

    En effet, il est dans ce cas nécessaire de définir les types Nombre (ou T_Nombre) et Tableau ou (T_Tableau) dans un paquetage.

    genre ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Package Mes_Types is
       SUBTYPE Nombres IS Natural RANGE 0..9999;
       TYPE Tableau IS ARRAY(1..4) OF Natural;
    end Mes_Types;
    En suite, dans le fichier utilisant les types, de commencer par

    En suite, on déclare l'unité de compilation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FUNCTION Decomposition(N: Mes_Types.Nombres) RETURN Mest_Types.Tableau IS
    Si on ne souhaite pas utiliser la notation pointée, on ajoute un avant leur utilisation.

    Encore désolé. Merci Blackknight.

    Encore une précision... Comme cette fonction est sensée être appelé par une autre unité de compilation, on doit spécifier l'utlisation de paquetage Mes_Types dans cette autre unité également.

  6. #6
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    Je ne comprends pas pourquoi il est nécessaire de procéder ainsi.. Pourquoi la façon que j'avais présentée au début n'est pas convenable?

  7. #7
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FUNCTION Decomposition(N: Mes_Types.Nombres) RETURN Mest_Types.Tableau IS
    Houlala, pas réveillé du tout !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FUNCTION Decomposition(N: Mes_Types.Nombres) RETURN Mes_Types.Tableau IS
    tu auras remarqué le 'T' en trop

  8. #8
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Je ne comprends pas pourquoi il est nécessaire de procéder ainsi.. Pourquoi la façon que j'avais présentée au début n'est pas convenable?
    Tout comme en Java, par exemple, il est impossible de définir un type comme ça, sans visibilité, hors espace de noms.
    Ca te permet d'avoir des types portant le même nom mais ayant des utilisations différentes, dans des contextes différents.
    D'ailleurs, ça doit bien avoir un intérêt puisque Java a repris la notion de paquetage et que le C++ définit les namespaces

  9. #9
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    N'ayant pas vu dans le cadre de mon cours cette notion de Package, il faudrait que je me débrouille pour m'en sortir autrement. J'ai un tout petit peu rajouté quelques lignes de code, et l'erreur précédente n'est plus présente lors de la compilation, mais d'autres apparaissent... Pouvez-vous m'éclairer une fois encore svp?

    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
    27
    28
    29
    30
    31
    32
    33
    34
    WITH Ada.Text_IO, Ada.Integer_Text_IO;
    USE Ada.Text_IO, Ada.Integer_Text_IO;
     
    PROCEDURE Tableau_de_decomposition IS
     
       SUBTYPE Nombres IS Natural RANGE 0..9999;
       TYPE Tableau IS ARRAY(1..4) OF Natural;
     
     
       FUNCTION Decomposition(N: Nombres) RETURN Tableau IS
     
     
          T: Tableau;
     
    BEGIN
     
       FOR I IN T'RANGE LOOP
          T(I) :=N mod 10;
          N:= N/10;
       END LOOP;
     
       RETURN T;
     
    END Decomposition;
     
    Nb_user: Nombres;
     
    BEGIN
     
       Put("Veuillez rentrer un nombre compris entre 0 et 9999");
       Get(Nb_user);
       Decomposition(Nb_user);
     
    end Tableau_de_decomposition;
    Erreurs à la compilation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    assignment to "IN" mode parameter not allowed
    expect procedure name in procedure call
    Qu'en pensez-vous?

    Merci d'avance!

  10. #10
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Le compilo t'explique tout !!
    Tu n'as pas le droit de modifier un paramètre dont le mode de passage est IN, à savoir en entrée seulement, ce qui est le cas de toute fonction.
    Donc tu n'as pas le droit de trouver dans ta fonction N à gauche d'un opérateur d'affectation.
    C'est écrit ici ou en français dans le texte, .
    L'avantage du premier lien est que cela te permettra de te familiariser avec l'ARM qui est le standard que doit respecter tout compilo Ada digne de ce nom.

  11. #11
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Sinon, j'oubliais, tu as bien contourné le problème de la déclaration de type avant fonction.
    Bien vu !

  12. #12
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Mince, j'ai aussi oublié de te dire que ton code ne compilera toujours pas mais je te le dirai que si tu ne trouves pas par toi-même... Bien que le compilo soit plus difficile à comprendre.
    ...
    ...
    ...
    Allez, je t'aide, Decomposition est une fonction

  13. #13
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    C'est bon, je pense avoir trouvé!

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    WITH Ada.Text_IO, Ada.Integer_Text_IO;
    USE Ada.Text_IO, Ada.Integer_Text_IO;
    
    PROCEDURE Tableau_de_decomposition IS
       
       SUBTYPE Nombres IS Natural RANGE 0..9999;
       TYPE Tableau IS ARRAY(1..4) OF Natural;
       
          
       FUNCTION Decomposition(N_user: Nombres) RETURN Tableau IS
       
    
          T: Tableau;
          N: Nombres := N_user;
       
    BEGIN
       
       FOR I IN T'RANGE LOOP
          T(I) :=N mod 10;
          N:= N/10;
       END LOOP;
       
       RETURN T;
       
    END Decomposition;
    
    Nb_User: Nombres;
    T: Tableau;
    
    BEGIN
       
       Put("Veuillez rentrer un nombre compris entre 0 et 9999:"); new_line;
       Get(Nb_user); skip_line;
       T := Decomposition(Nb_User);
       Put(T(4)); new_line;
       Put(T(3)); new_line;
       Put(T(2)); new_line;
       Put(T(1)); new_line;
       
    end Tableau_de_decomposition;
    Par contre, au début, je n'avais pas mis les lignes Put(T(i)) à la fin pour le test du sous-programme, pensant que le "tableau" de décomposition s'afficherait sans cela. Pour cela ne se fait pas sans ces lignes? Dans la définition de la fonction, j'ai pourtant bien return T?

    Enfin, j'ai donc testé mon programme cette fois-ci avec succès. Je vais un peu chipoter... Dans la fenêtre dos, la décomposition du nombre rentré s'affiche sous forme d'un tableau d'une colonne. Est-il possible d'obtenir une ligne plutôt ou pas? Si oui, comment?

    Merci encore!

  14. #14
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Félicitations

    Juste pour rendre ça plus lisible et comme ça tu pourras annoncer le sujet comme résolu :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    WITH Ada.Text_IO, Ada.Integer_Text_IO;
    USE Ada.Text_IO, Ada.Integer_Text_IO;
    
    PROCEDURE Tableau_de_decomposition IS
       
       SUBTYPE Nombres IS Natural RANGE 0..9999;
       TYPE Tableau IS ARRAY(1..4) OF Natural;
       
          
       FUNCTION Decomposition(N_user: Nombres) RETURN Tableau IS
       
    
          T: Tableau;
          N: Nombres := N_user;
       
    BEGIN
       
       FOR I IN T'RANGE LOOP
          T(I) :=N mod 10;
          N:= N/10;
       END LOOP;
       
       RETURN T;
       
    END Decomposition;
    
    Nb_User: Nombres;
    T: Tableau;
    
    BEGIN
       
       Put("Veuillez rentrer un nombre compris entre 0 et 9999:"); new_line;
       Get(Nb_user); skip_line;
       T := Decomposition(Nb_User);
       for index in T'Range loop
           Put(Natural'Image(T(index)) & " ");
       end loop;
       New_Line;
    end Tableau_de_decomposition;
    Des questions ?

  15. #15
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par m@tix Voir le message
    C'est bon, je pense avoir trouvé!
    Par contre, au début, je n'avais pas mis les lignes Put(T(i)) à la fin pour le test du sous-programme, pensant que le "tableau" de décomposition s'afficherait sans cela. Pour cela ne se fait pas sans ces lignes? Dans la définition de la fonction, j'ai pourtant bien return T?

    Enfin, j'ai donc testé mon programme cette fois-ci avec succès. Je vais un peu chipoter... Dans la fenêtre dos, la décomposition du nombre rentré s'affiche sous forme d'un tableau d'une colonne. Est-il possible d'obtenir une ligne plutôt ou pas? Si oui, comment?

    Merci encore!
    Je viens de me rendre compte que je n'ai pas répondu à ta question.
    Il ne faut pas oublier que la procédure Put n'est pas défini pour les types tableaux (voir l'ARM) mais pour les types caractères, numériques et énumération.
    Ainsi, quand tu définis un nouveau type (pas un sous-type), il te faut définir une procédure pour l'affichage. C'est lourd mais c'est parce qu'Ada ne fournit rien d'implicite et c'est aussi pour ça qu'on fait moins de bug.

    J'espère que cela répond à ta question.

  16. #16
    Membre régulier Avatar de m@tix
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 304
    Points : 76
    Points
    76
    Par défaut
    Ok, merci pour tes précisions!

    Cependant, quelques points m'embêtent encore un peu:

    Citation Envoyé par Blackknight
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for index in T'Range loop
           Put(Natural'Image(T(index)) & " ");
    end loop;
    Je ne saisis pas du tout à quoi correspond cette boucle, ni les commandes utilisées (index, " ", Natural'Image, etc..).

    Citation Envoyé par m@tix
    Enfin, j'ai donc testé mon programme cette fois-ci avec succès. Je vais un peu chipoter... Dans la fenêtre dos, la décomposition du nombre rentré s'affiche sous forme d'un tableau d'une colonne. Est-il possible d'obtenir une ligne plutôt ou pas? Si oui, comment?
    Une idée?

    Enfin, comment met-on qu'un sujet est résolu? Simplement en éditant le sujet du post?

  17. #17
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par m@tix Voir le message
    Ok, merci pour tes précisions!
    Cependant, quelques points m'embêtent encore un peu:
    Je ne saisis pas du tout à quoi correspond cette boucle, ni les commandes utilisées (index, " ", Natural'Image, etc..).


    Une idée?
    C'est parti mon kiki.
    Pour une boucle for, ce que j'ai appelé Index n'est ni plus ni moins que l'index dans la boucle. Cette variable ne nécessite pas de déclaration préalable et permet donc de référencer un à un les éléments du tableau. Cf. l'ARM.
    Natural'Image est ce que l'on appelle un attribut et permet de retourner directement la représentation sous forme de chaînes des nombres. Là encore, l'ARM vient à ton secours.
    Sachant que & est l'opérateur de concaténation de tableaux (Cf comme d'hab), l'expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Natural'Image(T(Index)) & " "
    consiste à prendre la version texte de l'élément du tableau et à lui ajouter un espace.
    L'ensemble est donc une chaîne que je peux inscrire à l'écran sans saut de ligne (Put au lieu de Put_Line).
    On répète pour chaque élément du tableau ce qui permet d'avoir le résultat en ligne. Un dernier saut de ligne pour la route et c'est parti.

    N'hésites surtout pas à garder l'ARM sous la main, il s'agit de LA source d'informations sur le langage lui-même. Si un compilateur ne respecte pas ce qui est écrit dedans (hors pragma et les annexes qui sont normalement facultatives mais c'est à vérifier), il ne s'agit pas d'un compilateur Ada.

    Enfin, comment met-on qu'un sujet est résolu? Simplement en éditant le sujet du post?
    Bonne question mais j'en sais rien ;-)

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

Discussions similaires

  1. [Lazarus] [Ubuntu] Impossible de compiler : unité Interfaces introuvable
    Par SergioMaster dans le forum Lazarus
    Réponses: 6
    Dernier message: 15/09/2009, 17h39
  2. Réponses: 3
    Dernier message: 11/08/2009, 19h41
  3. Problème a la compilation : <identifier> expected
    Par mrfirefunk dans le forum Langage
    Réponses: 8
    Dernier message: 28/06/2007, 11h51
  4. [Dev-Pascal] Syntax error : unit expected but program found
    Par [R]Viper dans le forum Autres IDE
    Réponses: 13
    Dernier message: 05/01/2007, 12h12
  5. [BPW] Problème de compilation unité WinAPI
    Par mannostab dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 10/03/2006, 19h35

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