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 :

Conversion d'une fonction C


Sujet :

Free Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut Conversion d'une fonction C
    Hello,

    je sèche sur une fonction dans un entête C (linux). Comme c'est la première fois que je fais ça et je ne connais pas le C, je un peu. Voici la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern int get_devices (const Device *** device_list, int local_only);
    Ce qui me pose le problème, c'est le 1er paramètre. La doc dit :
    stores a pointer to a NULL terminated array of pointers to Device structures in *device_list
    . Il me faut donc un pointeur vers un tableau de pointeurs d'enregistrements de type Device. Je ne sais pas trop comment interprérer le "NULL terminated array".

    La structure Device en C et la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef const char *String_Const;
     
    typedef struct
      {
        String_Const name;	
        String_Const vendor;
        String_Const model;
        String_Const type;
      }
    Device;
    ce que je traduis en pascal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    type
         String_Const = PChar;
     
         Device = record
              name : String_Const; 
              vendor : String_Const; 
              model : String_Const;  
              _type : String_Const;  
         end;
     
         Device  = ^Device;
         DeviceArray = array of Device;
         PDeviceArray = ^DeviceArray;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function get_devices(
            out device_list: PDeviceArray; 
            local_only     : integer)
            : integer; cdecl; external External_library;
    Mais j'ai un out of range quand j'accède au tableau et sur ce projet comme beaucoup d'autres le débugeur ne se lance pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var Devicelist: PDeviceArray;
     
    ...
    get_devices(Devicelist,1);
    x := 0;
    while Devicelist^[x] <> nil do
    Est-ce que déjà au niveau de l'analyse de la fonction en C ça parait correct ?

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Par défaut
    Je déclarerais plutôt les types ainsi, pour plus de clarté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         PDevice  = ^Device;
         DeviceArray = array of PDevice;
    Le problème des tableaux en Pascal, à la différence du C où il y a un délimiteur de fin qui est souvent 0, c'est qu'il n'y a pas de délimiteur. Donc, tu dois avoir une variable associée à ce tableau qui stcoke le nombre de valeurs qu'il y a dans ce tableau. Tu peux donc modifier le type DeviceArray en record et y inclure une variable de comptage.

    Ta boucle devient de facto incorrecte

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 137
    Par défaut
    Oops,

    je suis abonné au fil mais j'ai pas vu l'alerte.

    Merci, je vais essayer ça.

  4. #4
    ALT
    ALT est déconnecté
    Membre Expert
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 343
    Par défaut
    J'ajoute que le
    NULL terminated array
    peut se traduire par "Tableau terminé par un NULL.
    En C, le NULL est le caractère 0 (caractère nul, à ne pas confondre avec le '0' : ils n'ont pas le même code ASCII, ce qui est d'ailleurs vrai dans tous les systèmes de codage des caractères [ANSI, ISO, UTF...])
    Le caractère nul termine donc les chaînes de caractères comme certains tableaux, ce qui est le cas ici.

Discussions similaires

  1. [Compiler] conversion d'une fonction .m vers C/C++
    Par granbapt dans le forum MATLAB
    Réponses: 5
    Dernier message: 06/06/2012, 15h31
  2. conversion d'une Fonction du C++ ->C
    Par hissokaaaa dans le forum C
    Réponses: 2
    Dernier message: 24/02/2011, 11h58
  3. Conversion d'argument d'une fonction en hashtable
    Par gremlinsy dans le forum VB.NET
    Réponses: 9
    Dernier message: 23/07/2010, 10h30
  4. Conversion de l'adresse d'une fonction
    Par neerylka dans le forum C++
    Réponses: 2
    Dernier message: 13/09/2007, 09h05
  5. Réponses: 6
    Dernier message: 24/05/2007, 17h18

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