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

Free Pascal Discussion :

Fonctionnement des relations UNIT, INCLUDE, USES [Free Pascal]


Sujet :

Free Pascal

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut Fonctionnement des relations UNIT, INCLUDE, USES
    Bonjour,

    Je suis nouveau sur le Free Pascal, et j'aurais souhaité des précisions sur le comportement et l'utilisation du système UNIT et USES.

    En effet, comme sous chaque langage de programmation, j'utilise des modules pour pouvoir constituer des fonctions ou des objets. J'en ai des communs et d'autres spécifiques pour chaque plateforme.

    J'étais parti sur le fait de créer un module (en FPC c'est UNIT), qui rassemble d'autre sous-modules permettant de découper les différentes catégories de fonctions ou de classes par thèmes.

    Malheureusement, je n'arrive pas à maîtriser la notion de module, qui est assez floue pour moi.

    En effet, j'aimerais à chaque programme que je crée pouvoir juste ajouter un fichier de tête qui rassemblerait l’ensemble de mes sous-modules.

    Dans ce fichier de tête, du coup, j'aimerais charger en fonction des plateformes des sous-modules spécifiques pour Windows, Linux, Mac, Raspberry.

    J'ai essayé plusieurs combinaisons mais je n'ai jamais le résultat obtenu car il faut toujours spécifier le même nom que le fichier.


    Donc plusieurs questions me viennent à l'esprit :

    Comment peut-on faire pour faire un décalage de chemin dans l'insertion d'un fichier Module (UNIT) ?
    Y a-t-il un autre équivalent que Unit comme un "namespace" par exemple ?
    Comment, avec ce comportement, le fait de charger plusieurs fichiers avec des fonctions inutilisées, est-ce que le compilateur fait une différence entre fonction ou procédure utilisée ou non ?
    Est-il possible de faire une Unit sur plusieurs fichiers ?


    Merci d'avance pour l'aide

    [MAD]

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 415
    Points
    59 415
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Pour appréhender la philosophie générale, je te conseille la lecture du chapitre 16 de la référence du langage de Free Pascal.

    Comment peut-on faire pour faire de décalage de chemin dans l'insertion d'un fichier Module (UNIT) ?
    L'utilisation d'une hiérarchie de répertoires est possible, avec la mention du répertoire dans la déclaration d'une unité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    uses
      myunit in './subdirectoryxxx';
    Y'a t'il un autre équivalent que Unit comme un "namespace" par exemple ?
    La notion de namespace peut être simulée en Pascal. Un nom d'unité peut être composé de deux parties :
    Comment se comportement le fait de charger plusieurs fichier avec des fonctions inutilisé, es ce que le compilateur fait une différence entre fonction ou procédure utilisé ou non ?
    Le compilateur optimise cela et expurge de l'exécutable le code des fonctions non utilisées.

    Est'il possible de faire un Unit sur plusieurs fichiers ?
    Oui, en utilisant la directive include :
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

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

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Bonjour Alcatîz,

    Merci pour tes réponses utiles. Je vais surtout récupérer le PDF, que j'ai loupé sur le site.

    En revanche, pour la directive include, c'est plus compliqué ou je n'ai pas encore compris le concept.
    a
    En effet dans un module il y a la partie public où l'on déclare les fonctions ou procédure et privé où l'on définie ces dernières.

    En revanche il faudrait que je fasse deux "include", un dans la partie déclarative (interface) et l'autre dans la définition.

    Si je comprend il n'est donc pas possible de faire un module sur plusieurs fichiers, avec le même nom d'unité qui viendrais se compléter en fonction du chargement en "include" des fichiers.

    J'ai regardé la doc, pour les namespace, peu-t’on faire la même avec des "_" plutôt que des "." où y'a t'il une opération de contrôle sur les "dot units" ?

    Merci par avance des tes réponses.

    [MAD]

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 415
    Points
    59 415
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par madndf Voir le message
    En revanche, pour la directive include, c'est plus compliqué ou je n'ai pas encore compris le concept.
    En effet dans un module il y a la partie public où l'on déclare les fonctions ou procédure et privé où l'on définie ces dernières.
    En revanche il faudrait que je fasse deux "include", un dans la partie déclarative (interface) et l'autre dans la définition.
    Si je comprend il n'est donc pas possible de faire un module sur plusieurs fichiers, avec le même nom d'unité qui viendrais se compléter en fonction du chargement en "include" des fichiers.
    A n'importe quel endroit de l'unité, la directive {$I INCLUDE xxx} demande au compilateur d'ajouter le contenu du fichier xxx comme si ce contenu faisait partie du code source de l'unité. Cela n'a rien à voir du tout avec, par exemple, la directive INCLUDE du C. Tu peux avoir des directives INCLUDE n'mporte où dans le code source de ton unité, dans la partie interface et dans la partie implémentation. Même au milieu d'une instruction.

    Citation Envoyé par madndf Voir le message
    J'ai regardé la doc, pour les namespace, peu-t’on faire la même avec des "_" plutôt que des "." où y'a t'il une opération de contrôle sur les "dot units" ?
    "Dotted" unit porte bien son nom, le nommage se fait avec un ".".

    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Citation Envoyé par madndf Voir le message
    Dans ce fichier de tête, du coup, j'aimerais charger en fonction des plateformes des sous-modules spécifiques pour Windows, Linux, Mac, Raspberry.
    Ça se fait généralement à coup de codes de compilation conditionnelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    uses
      CommonUnits
    {$IFDEF WIN32}
      , WinUnits
    {$ENDIF}
    {$IFDEF UNIX}
     , LinuxUnits
    {$ENDIF};

  6. #6
    Membre éclairé

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Points : 807
    Points
    807
    Par défaut
    Citation Envoyé par Alcatîz Voir le message
    ...Même au milieu d'une instruction.
    Pas tout à fait ! Il y a dans le fichier des messages du compilateur, que je suis en train de traduire, un message d'erreur (fatale ! ) libellé comme suit :

    scan_f_end_of_file=02000_F_Unexpected end of file
    % This typically happens in one of the following cases:
    % \begin{itemize}
    % \item The source file ends before the final \var{end.} statement. This
    % happens mostly when the \var{begin} and \var{end} statements are not
    % balanced;
    % \item An include file ends in the middle of a statement.
    % \item A comment was not closed.
    % \end{itemize}

  7. #7
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 415
    Points
    59 415
    Billets dans le blog
    2
    Par défaut
    Pourtant, ceci par exemple compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      if a > b
         then
           begin
             WriteLn('a est plus grand que b.');
             WriteLn('Voici leur différence : ', {$I Include.inc} a + b);
           end;
      ReadLn;
    end.
    Avec comme fichier Include.inc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a - b, ' - Voici leur somme : ',
    Étant donné que le compilateur rapatrie le contenu du fichier include dans le source avant de compiler, il n'y a pas de raison qu'il émette une erreur.

    Ceci compile aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if a > b
         then
           begin{$I Include.inc}ReadLn;
    end.
    Avec comme include :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             WriteLn('a est plus grand que b.');
             WriteLn('Voici leur différence : ', a - b, ' - Voici leur somme : ', a + b);
           end;
    Mais bon, qui va s'amuser à torcher ainsi son code source ?
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  8. #8
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Fonctionnement des relations UNIT, INCLUDE, USES
    Bonjour,

    Beaucoup de détails intéressants, et peu cités. Deux questions simplement:

    1°) À propos du nom des unités:
    Citation Envoyé par Alcatîz Voir le message
    ... La notion de namespace peut être simulée en Pascal. Un nom d'unité peut être composé de deux parties :
    ...
    Les chaînes 'xxx.yyy' et 'xxx.zzz' se rapportent-elles à deux unités distinctes, ou deux identificateurs de la même unité 'xxx' ?

    2°) L'inclusion d'un fichier:
    Citation Envoyé par Alcatîz Voir le message
    ... en utilisant la directive include :
    ...
    peut-elle remplacer avantageusement celle d'une unité, quand elle ne contient qu'un petit nombre d'instructions ? Je pense à des consignes de routine: renommage de types, opérations mathématiques élémentaires (incrémentation d'un réel ou d'un entier au format Comp) ...

    Merci pour les infos !

    PS: C'est en finalisant le message que je m'aperçois que le sujet remonte à bientôt huit semaines .
    Cela m'avait totalement échappé.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  9. #9
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 415
    Points
    59 415
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    1°) À propos du nom des unités:

    Les chaînes 'xxx.yyy' et 'xxx.zzz' se rapportent-elles à deux unités distinctes, ou deux identificateurs de la même unité 'xxx' ?
    Il s'agit d'unités distinctes.

    Si l'on prend l'exemple d'une architecture 3-tiers, on peut nommer toutes les unités de la couche data "DAO.xxx", celles de la couche métier "Business.xxx", celles de l'IHM "UI.xxx".

    Citation Envoyé par wiwaxia Voir le message
    2°) L'inclusion d'un fichier:

    peut-elle remplacer avantageusement celle d'une unité, quand elle ne contient qu'un petit nombre d'instructions ? Je pense à des consignes de routine: renommage de types, opération mathématiques élémentaires (incrémentation d'un réel ou d'un entier au format Comp) ...
    Le code source de Free Pascal contient énormément de fichiers .inc : certains ne contiennent que des directives, d'autres des déclarations de types ou de constantes, d'autres encore des routines en Assembleur... C'est un bon moyen pour isoler des portions de code source et éviter d'accumuler des milliers de lignes dans un seul fichier source.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  10. #10
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Fonctionnement des relations UNIT, INCLUDE, USES
    Cela fonctionne effectivement avec Free Pascal, et peut contribuer à une meilleure présentation du programme source.
    Je retiens ces détails.

    Par contre, cela ne marche pas en Virtual Pascal, qui refuse la présence d'un point dans le nom de l'unité - ce n'est pas très grave.
    Un blocage déjà constaté depuis longtemps est cependant réapparu, et j'en reparlerai sur un autre sous-forum.

    Merci pour toutes les explications


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

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

Discussions similaires

  1. fonctionnement des include en php et référencement
    Par Leaffy dans le forum Langage
    Réponses: 3
    Dernier message: 22/03/2012, 20h47
  2. Réponses: 2
    Dernier message: 22/07/2005, 12h06
  3. Fonctionnement des fichiers.
    Par phoenix440 dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 29/05/2005, 15h36
  4. Tables avec des relations & procédures dynamiques
    Par JustMe dans le forum Débuter
    Réponses: 5
    Dernier message: 15/12/2004, 09h58
  5. [langage] fonctionnement des Processus
    Par GMI3 dans le forum Langage
    Réponses: 3
    Dernier message: 19/09/2003, 11h12

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