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 :

Variables globales et fonctions


Sujet :

Ada

  1. #1
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut Variables globales et fonctions
    Bonjour,

    Je code en ce moment un projet en Ada s'articulant sur le schéma suivant :

    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
    -- with
    -- use
     
    procedure main() is
     
    -- Structure de données
     
    -- Fonctions et procédures du programme
     
    -- Variables main
     
    begin
     
    -- Debut du programme appelant les fonctions ci-dessus
     
    end main;
    Comme vous le voyez, une super procedure contient tout le programme. Je souhaiterais savoir si c'était ainsi qu'il fallait faire en Ada. Ne faut-il pas mettre la structure et les fonctions à part ? Je sais que dans mon projet, je définis un tableau conséquent qui fait visiblement exploser ma pile. On m'a dit qu'il fallait, pour éviter cela, déclarer mon tableau en variable globale car le tas dispose de plus de place.

    Or ici toutes les variables sont locales. Je ne sais pas comment déclarer une variable globale en Ada, car si je déclare quelque chose en dehors de ma super procedure, le compilateur me renvoie "compilation unit expected". De même, un tableau global basé sur ma structure nécessite aussi de faire sortir de ma super procedure la structure de donné ce qui pose le même problème que précèdemment.

    Comment bien articuler son projet et définir des variables globales en Ada ?

    Je vous remercie,

    Steph0

  2. #2
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 120
    Points : 59
    Points
    59
    Par défaut
    Je pense que tu ne connais pas la notion de package en Ada.
    Cela te permet de déclarer variables globales, types et structures de données, et des procédures.

    Le package se compose généralement de deux fichiers qui portent le même nom:

    - monpackage.ads : contient les spécifications des types, variables, procédures
    - monpackage.adb : contient l'implémentation des procédures citées

    On peut rajouter un bloc Begin avec des instructions dans le package même. Cela peut t'être utile, vu que tu as fait allusion à un Main. Ainsi, après avoir compilé ton package : "gnatmake monpackage.adb", tu peux considérer ton package comme un executable et appeler les instructions de ce bloc Begin.

    Voici un exemple simple de package, teste.ads puis teste.adb

    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
     
    package Teste is
     
    type IntegerPtr is access integer;
    type Tab is array (0..15) of IntegerPtr;
     
    Aux : integerPtr;
    T : Tab;
     
    procedure Remplir;
     
    procedure Echanger(I,J : integer);
     
    procedure Affiche;
     
    end;
    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
     
    with Ada.Text_IO;
    use Ada.Text_IO;
     
    package body Teste is
     
    	procedure Remplir is
    	begin
    		for I in T'Range loop
    			T(I) := new integer'(I);
    		end loop;
    	end;
     
    	procedure Echanger(I,J : integer) is
    	begin
    		Aux := T(I);
    		T(I) := T(J);
    		T(J) := Aux;
    	end;
     
    	procedure Affiche is
    	begin
    		for I in T'Range loop
    			Put(Integer'Image(T(I).all) & " ");
    		end loop;
    		New_Line;
    	end;
     
    begin
    	New_Line;
    	Remplir;
    	Affiche;
    	for I in 0..13 loop
    		Echanger(I,I+1);
    		Affiche;
    	end loop;
    	New_Line;
    end Teste;

  3. #3
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Salut,

    Jusqu'ici j'utilisais des packages pour des Get : "package entier is new Integer_Io(Integer);". Je ne savais pas qu'ils servaient aussi à définir des strutures et fonctions.

    Le fichier ads contient donc la structure et les spécifications de fonctions. Et le fichier adb contient le corps des fonctions, c'est bien cela ?

    Par contre, je n'ai pas compris à quoi sert le begin du package en question. Je crois comprendre que, une fois le fichier ads mis en place, le package body contient le reste de mon programme. C'est à dire que je définis le corps des fonctions dont les spécifications sont dans le ads, et le begin du package est le main qui permet d'executer mon programme ?

    Ou faut-il juste que je définisse mes fonctions, et que j'intègre le package dans ma procedure main, qui est dans un autre fichier adb. Si oui, cet appel se fait par un couple "with, use" ou par la définition d'un package dans la procedure ?

    Je pense qu'il s'agit de la première solution si j'ai compris tes explications, mais je préfère être bien sûr.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 120
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par Steph0 Voir le message

    Le fichier ads contient donc la structure et les spécifications de fonctions. Et le fichier adb contient le corps des fonctions, c'est bien cela ?
    -> Exact

    Citation Envoyé par Steph0 Voir le message
    Par contre, je n'ai pas compris à quoi sert le begin du package en question.
    -> il regoupe une suite d'instructions qui sont exécutées lors de l'exécution du package, qu'il soit appelé directement en tant qu'exécutable ou par un fichier extérieur. On l'utilise en général pour initialiser le package, mais certaines personnes s'en servent comme d'une procédure Main en exécutant directement le package.


    Ou faut-il juste que je définisse mes fonctions, et que j'intègre le package dans ma procedure main, qui est dans un autre fichier adb. Si oui, cet appel se fait par un couple "with, use" ou par la définition d'un package dans la procedure ?
    -> Oui, tu peux tout à fait omettre ce Begin et préférer une procédure externe en incluant le Package. C'est préférable s'il y a plusieurs instructions pour la clarté. Et cela peut-être un brin plus facile pour toi pour débugguer ton package à part.

  5. #5
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Salut,

    Je comprends. Je crois que je vais choisir la solution ou le main est à part et que je fais appel au package. Je n'ai pas d'initialisation particulière à faire.

    Je te remercie pour ton aide.

    Steph0

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 120
    Points : 59
    Points
    59
    Par défaut
    De rien ;-)

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

Discussions similaires

  1. 2 Variables globales une fonction c'est possible ?
    Par torquemada dans le forum Débuter
    Réponses: 2
    Dernier message: 01/06/2013, 12h33
  2. [2.3.1] Variables globales et fonctions
    Par peuplier dans le forum BIRT
    Réponses: 14
    Dernier message: 10/02/2009, 17h48
  3. Variable globale et fonctions
    Par Joratois dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 02/01/2009, 23h30
  4. variable globale et fonctions du fichier views
    Par jtadjo dans le forum Django
    Réponses: 1
    Dernier message: 03/03/2008, 13h38
  5. Variables globales dans une fonction?
    Par Death83 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/07/2006, 02h53

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