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

Pascal Discussion :

Comment lit-on des champs flags ?


Sujet :

Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Par défaut Comment lit-on des champs flags ?
    Bonjour,

    Depuis un programme Pascal, j'appelle une fonction C (API Mac OS x) qui me renvoie une structure de ce type :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct GetVolParmsInfoBuffer {
       short vMVersion;
       long vMAttrib;
       Handle vMLocalHand;
       long vMServerAdr;
       long vMVolumeGrade;
       short vMForeignPrivID;
       long vMExtendedAttributes;
       void * vMDeviceID;
       UniCharCount vMMaxNameLength;
    };
    typedef struct GetVolParmsInfoBuffer GetVolParmsInfoBuffer;

    L'info qui m'intéresse c'est le champ vMExtendedAttributes, décrit en C de cette façon:
    Code C : 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
    Extended Volume Attributes
    Describe a volume’s extended attributes.
    enum {
       bIsEjectable = 0,
       bSupportsHFSPlusAPIs = 1,
       bSupportsFSCatalogSearch = 2,
       bSupportsFSExchangeObjects = 3,
       bSupports2TBFiles = 4,
       bSupportsLongNames = 5,
       bSupportsMultiScriptNames = 6,
       bSupportsNamedForks = 7,
       bSupportsSubtreeIterators = 8,
       bL2PCanMapFileBlocks = 9,
       bParentModDateChanges = 10,
       bAncestorModDateChanges = 11,
       bSupportsSymbolicLinks = 13,
       bIsAutoMounted = 14,
       bAllowCDiDataHandler = 17,
       bSupportsExclusiveLocks = 18,
       bSupportsJournaling = 19,
       bNoVolumeSizes = 20,
       bIsOnInternalBus = 21,
       bIsCaseSensitive = 22,
       bIsCasePreserving = 23,
       bDoNotDisplay = 24,
       bIsRemovable = 25,
       bNoRootTimes = 26,
       bIsOnExternalBus = 27,
       bSupportsExtendedFileSecurity = 28
    };

    Je récupère bien mon champ dans une variable Pascal de type longint.
    Maintenant, comment faire pour connaître la valeur effective de chaque flag ? En C, je vois ce genre de code :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
               if     (vMExtendedAttributes & (1L << bIsEjectable)) != 0 ...
    Comment diable traduire ça en Pascal ???

    André

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    Comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if   (vMExtendedAttributes and (1 shl bIsEjectable)) <> 0 then

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Par défaut
    J'ai vu que 1L signifiait que c'était 1 sur 32 bits. Dans ce cas, ne dois-je pas déclarer une variable de type LongInt et y mettre 1, plutôt que 1 directement ?

    Quant à vMExtendedAttributes, ne faut-il pas utiliser Byte(vMExtendedAttributes) ? J'ai trouvé ce genre de chose sur un autre forum.

    Merci.

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Par défaut
    Ton vMExtendedAttributes est de type long en C. Si tu fais Byte(vMExtendedAttributes) tu perd tous les bits de poids fort au dessus du 8 eme donc tu ne peux plus tester que les bits 0 à 7.

    En ce qui concerne le 1L je pense que tu peux le remplacer par un simple 1. Si vraiment tu veux montrer dans ton code que c'est une valeur 32 bits je pense que tu peux utiliser LongInt(1).

    Dernière chose le type long en C ne fait pas forcement 32 bits. Si tu utilises FreePascal il existe un unité ctypes qui définit des types equivalents à ceux du C. Donc pour traduire le 'long' du C tu utilises le types 'clong' de l'unité ctypes.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Par défaut
    Merci pour toutes ces infos

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/08/2010, 19h52
  2. Réponses: 5
    Dernier message: 07/05/2008, 16h14
  3. comment récupérer le liste des tables et des champs
    Par sekaijin dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 26/07/2006, 16h26
  4. comment recuperer le nom des champs ?????
    Par e11137 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 09/01/2004, 10h00
  5. [langage] Comment rajouter des champs dans une liste
    Par toto_titi dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2003, 14h09

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