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

Turbo Pascal Discussion :

[TP]Différences Far call <-> Near Call


Sujet :

Turbo Pascal

  1. #1
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut [TP]Différences Far call <-> Near Call
    salut tlm

    voilà je vois souvent passer des morceaux de code avec des {$F+} à tout va ; j'arrive à les utiliser, mais je n'arrive pas à voir la différence entre ces deux modèles. Kkun pourrait-il m'aider ou m'orienter vers une doc ?

    par avance merci et à bientôt
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

  2. #2
    Membre averti Avatar de charly
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 329
    Points : 358
    Points
    358
    Par défaut
    le mieu est de consuleter l aide de tp7 en appuyant sur F1 sur la directive de compilation sinon, google est ton ami
    6*8 =42

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 939
    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 939
    Points : 59 421
    Points
    59 421
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Par défaut, le compilateur choisit automatiquement un appel long ("FAR", avec changement de segment de code) lorsqu'il doit appeler une routine contenue dans une autre unité et un appel court ("NEAR", dans le même segment de code) pour les routines contenues dans la même unité.

    {$F+} force simplement le compilateur à créer une procédure ou fonction FAR là où il devrait automatiquement créer une NEAR.

    Un exemple : on peut écrire une petite routine pour modifier le comportement par défaut du programme en cas d'erreur d'allocation de mémoire dynamique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {$F+}
    Function ERREUR_ALLOCATION (Taille : Word) : Integer;
    Begin
      ERREUR_ALLOCATION:=1;
    End;
    {$F-}
    L'adresse de cette routine doit être chargée dans la variable HeapError de l'unité System :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HeapError:=@ERREUR_ALLOCATION;
    Eh bien, si l'on ne précise pas {$F+}, le compilateur va créer une fonction NEAR et ton programme va se planter immédiatement à la 1ère erreur d'allocation car il aura exécuté un appel FAR de cette fonction NEAR.
    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]

  4. #4
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Tout ce que dit Alcatiz est juste, mais ça n'explique pas grand chose au final !

    Je ne vais parler ici que du mode réel 16 bits (dos réel standard)

    Turbo Pascal génère des fichiers au format EXE. Contrairement au format COM, les EXE peuvent stocker leur code et leurs données sur plusieurs segments (zones mémoires) différents. Il faut savoir qu'un segment fait au maximum 64 Ko. Et pour un exe, c'est parfois un peu juste.
    Je ne sais pas si tu as déjà rencontré ce problème, mais si on ne crée pas d'unité pour son programme, alors il arrive un moment où Turbo Pascal nous dit clairement que le code ne tient plus dans un segment : il faut le répartir sur d'autres segments. C'est ce qui se fait d'office quand on se sert des unités.

    Maintenant, où intervient le principe des appels near ou far ?

    Par défaut, le processeur sait "sauter" rapidement d'un point à un autre d'un même segment : c'est un appel near. Quand on lui demande d'exécuter une routine, alors on ne fait que lui donner une adresse relative, sans repréciser dans quel segment on est, puisqu'on en change pas.
    Pour prendre un exemple concrêt. Tu te trouves dans un département. On te dit d'aller à Villefranche (nom de ville courant !). A supposer qu'il n'y ait qu'un seul Villefranche dans le départ', tu t'y rends, sans qu'on te redonne le nom du département.

    A présent, imagine que tu doivent atteindre Villefranche dans le département voisin. Alors à ce moment là, on devra te dire "va à Villefranche, dans le département n°X". C'est l'appel far : en info, il faut préciser au processeur l'adresse du segment que l'on souhaite atteindre.

    Bon, a priori, Turbo Pascal est grand, et il sait gérer ça tout seul. Enfin presque ! Il sait que quand un programme doit appeler une procédure dans une unité, il va falloir faire un appel far, changement de segment oblige. Mais il ne sait pas forcément quand nous nous voulons effectuer un appel far, pour peu que ce soit un peu "masqué".

    Par exemple, quand on passe une procédure X en paramètre d'une autre procédure Y. Par défaut, la procédure X sera en appel near pour peu qu'elle ne soit pas explicitement appelée dans un autre segment. Or, si on passe son adresse à Y, alors cette dernière va appeler X en suivant le mode d'appel suivant lequel X a été déclarée. Et si on se trouve dans un autre segment que celui où X a été déclarée, c'est la catastrophe ! Car on va effectuer un saut relatif au segment en cours, sans passer dans le segment de X. Bref, on exécute un code au hasard (cf principe de la roulette Russe )

    Par conséquent, à chaque fois qu'une procédure est destinée à être passé en paramètre, ou bien à être appelée par son adresse, il faut TOUJOURS la déclarer en appel far, pour éviter toute erreur malencontreuse. D'où le fleurissement des {$F+}


    A+ (et désolé pour la longueur du mini-mini-exposé)
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  5. #5
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    non non t'inquiètes pas ta réponse me convient parfaitement
    je vois bien l'intérêt des far call maintenant maintenant

    merci à bientôt
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

Discussions similaires

  1. call far en 16 bits
    Par parki2013 dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 11/12/2013, 14h23
  2. [BASM] Comment faire un "Far Call" ?
    Par - Robby - dans le forum Langage
    Réponses: 3
    Dernier message: 03/09/2003, 08h56
  3. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  4. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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