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

Langage Delphi Discussion :

absolute en Delphi


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 16
    Points : 11
    Points
    11
    Par défaut absolute en Delphi
    En Tp7 j'utilisais cette syntaxe pour lire les matrice de points définissant les caractères.


    var table: array[0..127] of array [1..8] of byte absolute $F000:$FA6E;

    Cela ne fonctionne plus en Delphi, probablement car la gestion de la mémoire à changée.
    Mais comment convertir l'addresse?
    De plus, peut on esperer une pérennité de la présence de cette table dans les nouveaux PC

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 839
    Points : 11 257
    Points
    11 257
    Billets dans le blog
    6
    Par défaut
    la directive absolute existe toujours, pour faire pointer une seconde variable au même endroit qu'une première :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var 
     c : char;
     b : byte absolute c;
    tu peux donc essayer de faire pointer ta structure sur la variable table de caractères
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Oui bien sur sous cette forme...Mais pas pour pointer à une adresse précise en mémoire

    Merci pour la réponse
    ADMR

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 839
    Points : 11 257
    Points
    11 257
    Billets dans le blog
    6
    Par défaut
    pour pointer sur une adresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var 
     table : array[1..10] of word;
    begin
     table := Pointer($F000FA6E); 
    end;
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Cela ne fonctionne pas, le probleme semble etre la conversion de l'adresse. A l'époque j'utilisais sans comprendre ces histoire d'offset et de segment .
    Le code suivant plante brutalement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.Button1Click(Sender: TObject);
    type  table= array[0..127] of array [1..8] of byte;
    var ta:^table;
        co,li:integer;
    Begin
      ta:= ptr($F000FA6E);
      For li:=1 to 8 do for co :=1 to 8 do
         If &#40;ta^&#91;36,li&#93; and  &#40;$100 shr co&#41;&#41; <>0 then form1.memo1.lines&#91;li&#93;&#58;=form1.memo1.lines&#91;li&#93;+'*' else   
    form1.memo1.lines&#91;li&#93;&#58;=form1.memo1.lines&#91;li&#93;+' ';
     
    end;
    [Modération]
    Merci d'utiliser les balises code ou quote, Laurent Dardenne
    [/Modération]

  6. #6
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    mais la vraie question, c'est pourquoi veut-tu pointer à un endroit précis de la mémoire ?
    Dans le monde dos effectivement, il y avait des zones mémoires ou trainaient des tables diverses et variées sytème, ou bien pour adresser la mémoire vidéo (avec l'histoire des segments et offset pour palier à l'augmentation de la mémoire qui dépassait 64Ko).
    Maintenant sous Windows, je ne connais pas l'organisation précise, mais l'adressage se fait sur 32bits, (donc plus vraiment d'offset nécessaire), et de surcroit, les zones mémoires de ton prog. sont attribués automatiquement par windows, il n'y a pas de raison pour l'adresse directement. Sauf à récuperer l'adresse d'une allocation faite de manière standard:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      T&#58; array&#91;0..128&#93; of byte
      p&#58; pointer;
    begin
      p &#58;= @&#40;T&#91; 0 &#93; &#41;;
    p est le début de ta zone mémoire de ton tableau, mais finalement, l'endroit précis n'est pas important
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Le but est de réaliser un afficheur ASCII et hexadécimal dans un logiciel de simulation logique pour simplification de ceux existants (Logi). Je veux récupérer la génération des caractères ASCII.A priori il doit etre possible de lire n'importe quel octet en mémoire en Delphi (Rom ou Ram) ?

  8. #8
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Je ne comprend toujours pas...

    Réaliser un afficheur ASCII ou HEXA OK

    Dans un logiciel de simulation logique.... que tu as fais ?

    Récupérer la génération des car. ASCII ... ? depuis le log de simul ?
    c'est donc une function ?

    Non vraiment je capte pas le probleme, désolé
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  9. #9
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Citation Envoyé par ADMR
    Le but est de réaliser un afficheur ASCII et hexadécimal dans un logiciel de simulation logique pour simplification de ceux existants (Logi). Je veux récupérer la génération des caractères ASCII.A priori il doit etre possible de lire n'importe quel octet en mémoire en Delphi (Rom ou Ram) ?
    Non. XP va te l'interdire...
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Merci pour les réponses. J'ai repris mon Tp7 , sauvegardé la table des caractères dans un fichier et ensuite je l'ai intégré à mon programme.

    Voila le résultat pour $


    __$$____
    _$$$$$__
    $$______
    _$$$$___
    ____$$__
    $$$$$___
    __$$____
    ________

  11. #11
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 187
    Points : 65
    Points
    65
    Par défaut
    Bonjour tous le monde

    si par exemple j'ai l'exemple suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    c:char;
    b:byte absolute c;
    que'es ce que je dois faire pour remplacer cette syntaxe par une autre ?!!

    veut dire : remplacer le absolute par une autre syntaxe !!

  12. #12
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    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
     
    type
      TByteChar = packed record
        case integer of
          0: (C : AnsiChar);
          1: (B : Byte);
      end;
     
     
    type
      TBytesChars = packed record
        case integer of
          0: (Cs : array[Byte] of AnsiChar);
          1: (Bs : array[Byte] of Byte);
      end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  13. #13
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 187
    Points : 65
    Points
    65
    Par défaut
    merci pour votre reponse
    j'ai essayé de proposer cette solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
     var
          c: char;
          b: ^byte;
     
          begin
          b := @c;
          ...
    juste pour éviter d'utiliser absolute... je sais qu'il existe plusieurs solution, mais es-ce que ma solution est juste ?

    mon but est de préparer un help à mon projet, qui traite les bonne pratique de Delphi, parmis eux une qui parle sur "absolute", donc je dois proposer un exemple à l'utilisateur

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 659
    Points : 13 032
    Points
    13 032
    Par défaut
    Tu ne peux pas simplifier absolute puisque c'est la solution ultime pour interpréter une zone mémoire de plusieurs façons différentes tout en restant évolutif en fonction des besoins.

    Le record avec case de Dr. Who est très bien mais requière dés la déclaration dans connaître toutes les variantes. C'est cependant ce qui se rapprocherait le plus d'absolute dans la gestion de l'adressage. Quant à ton exemple, il requière une assignation. La déclaration ne suffit pas .

    ps: Propose un autre exemple qu'un char en byte qui ne fonctionnera que jusqu'à D2007...

  15. #15
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 187
    Points : 65
    Points
    65
    Par défaut
    Merci pour votre aide

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/05/2013, 12h39
  2. Différences entre Delphi et Visual Basic ?
    Par Anonymous dans le forum Débats sur le développement - Le Best Of
    Réponses: 75
    Dernier message: 30/03/2009, 21h09
  3. Equivalent C++Builder du "absolute" de Delphi ?
    Par pdgnr dans le forum C++Builder
    Réponses: 4
    Dernier message: 11/11/2006, 20h49
  4. Réponses: 4
    Dernier message: 27/03/2002, 12h03
  5. Réponses: 2
    Dernier message: 21/03/2002, 00h01

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