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

Ada Discussion :

Problème liaison C / Ada


Sujet :

Ada

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 66
    Points
    66
    Par défaut Problème liaison C / Ada
    Bonjour
    J'ai utilisé une liaison entre C et ADA pour des procédures ADA et ça fonctionne.
    Or quand j'essaie d'exporter une fonction ADA, le programme plante totalement, le retour de variable pose un problème.
    Quelqu'un aurait-il une idée de comment faire.
    PS: j'utilise la méthode indiquée dans la doc trouvée sur developpez.com et le tuto sur adacore pour faire la liaison. (avec utilisation de adanit et adafinalize (runtime ada)).
    merci

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Bonsoir,

    Tout d'abord, quel profil à la fonction Ada que tu exportes ?
    Si c'est un problème de convention de représentation des données, c'est primordial.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    Bonjour,
    J'ai apparement résolu mon probleme.
    La fonction ADA que je veux exporter est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function maFonction return C.int;
    Or j'ai essayé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function maFonction return C.int is
    begin
    return C.int(0);
    end;
    Mais en essayant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function maFonction return C.int is
    temp : Integer := 0; 
    begin
    return C.int(temp);
    end;
    Cela fonctionne sans problème.
    Pour info je n'avais pas fait d'ADA avant. Effectivement, en y récléhissant un peu 0 peut etre vu comme n'importe quoi.

  4. #4
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    Bonjour,
    maintenant je me retrouve confronté à un problème.
    Comment peut on exporter une structure C en Ada. (Cette structure contient des chaines de caracteres et des floats).
    J'ai bien vu le principe page 2 et 3 du cours 14 du cours de l'iut mais je me demandais si on ne pouvais pas importer la structure automatiquement.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Le problème (en général) avec les structures C ou C++ est qu'elles ne sont pas compatibles de la représentation Ada des records. Pour les passer de C vers ADA, on utilise souvent un pointeur sur la donnée (System.address) plutôt que la donnée brute.

    Puis, dans le code ADA, on mappe une structure équivalente à celle du C à l'adresse passée en paramètre.

    Pour revenir au cas de Ada vers C, en fait, le 0 que tu passais en dur était sans doute vu comme l'adresse 0x0 qui était ensuite déréférencer et .
    Alors que dans l'autre codage, on utilisais l'adresse de temp qui référence la valeur 0 : je suis pas très sûr mais j'ai déjà connu des pb comme celui-là, d'où la réponse ci-dessus.

  6. #6
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    Donc c'est le principe de la doc.
    Par contre c'est assez chiant puisqu'il faut mappé la structure dans le bon ordre et que si on modifie le c on doit modifier l'ada en parrallèle (de toute façon aurait du le faire mais ca rajoute du code a gérer en plus).

    J'avais cru lire que l'adresse etait dans access et pas dans address.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    En fait, en Ada, un access cache une adresse. L'access est là pour typer les pointeurs, ce que ne fait pas C par exemple (* désigne un pointeur sur un truc qui peut très bien etre affecter à un pointeur sur un machin).

    Il existe un paquetage générique ADA 95 (celui-là) qui permet de convertir l'un dans l'autre : System.Address_To_Access_Conversions.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    Merci pour les infos.
    Si je réussi à faire le mappage je rajouterai résolu.

  9. #9
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    Re bonjour,
    Je viens de découvrir un petit problème supplémentaire.
    Supposons une fonction en C de prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int function machin (montype * pmavariable);
    où on modifie pmavariable dans la fonction.
    Lors de l'importation dans ADA on ne peut en faire une procédure puisqu'on a un retour
    ni une fonction puisque pmavariable est modifié donc ca devrait être un parametre in out voir out pour de l'ADA95(impossible pour une fonction).
    Donc on est obligé de faire une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void function machinversAda(montype * pmavariable,int * retour);
    pour pouvoir l'importer en tant que procédure.
    J'aimerais donc avoir une confirmation ou mieux une infirmation pour me dire qu'on peut faire plus simple.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Bonjour,

    Et non Dieu Ada 95 est passé par là : il existe un 4eme mode de passage de paramètres : le mode access qui est autorisé pour les fonctions.
    int function machin (montype * pmavariable);
    devient en Ada 95 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     function machin (pmavariable : access  montype) return int;
    Une méthode alternative (Souvent appliquer en Ada 83) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     function machin (pmavariable : in System.Address) return int is
    localvariable : montype;
    for localvariable'Address use pmavariable;
    begin 
    ...
    Une autre méthode plus "sale" (et à utiliser que si on ne peut pas faire autrement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function machien (pmavariable : in montype) return int is
    localvariable : montype;
    for localvariable'Address use pmavariable 'Address;
    begin 
    ...
    Mais on ne maitrise pas forcement ce que fait le compilo et ca peut foirer suivant le type de pmavariable.

  11. #11
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    Je ne dirais que merci mon Dieu .
    Je teste tout ça de suite.
    Il manque vraiment une super documentation sur Ada. J'ai beau cherché je trouve rien de transcendant .

  12. #12
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    Effectivement ça marche bien xD
    Lowelace, je te remercie pour tous tes précieux renseignements.

  13. #13
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    Bonjour,
    Je continue mon petit bonhomme de chemin et je retombe encore sur une petite epine :
    Je n'arrive pas à passer en ada une fonction du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char * function machin ( params ...);
    En effet, j'ai bien essayé un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    machin return c.char_array;
    mais lorsque je m'en sers je me retrouve avec des exceptions CONSTRAINT_ERROR voir des EXCEPTION_ACCESS_VIOLATION;
    J'aimerais donc savoir si il y a un moyen en Ada pour faire ça.

    La possibilité de faire une fonction C qui envoit un buffer avec sa taille m'est passée par la tête mais je me doute qu'une meilleure solution existe.

    Voila en esperant avoir une reponse pouvant m'eclairer.
    Merci d'avance.


    [EDIT]
    En essayant de definir des access c.char_array, je n'ai pas d'erreur sauf quand j'essaie d'utiliser ce dernier

  14. #14
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Points : 66
    Points
    66
    Par défaut
    Apres une instance recherche et reflexion : je viens de trouver la solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char * function machin ( params ...);
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    machin return Interfaces.C.Strings.chars_ptr;
    Et pour transformer le retour en String Ada
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Interfaces.C.To_Ada(Interfaces.C.Strings.Value(ValeurDeRetour))
    Voila.
    J'espere que ca pourra servir à d'autres personnes ses petites réflexions .
    Et encore merci pour tout lowelace !!!

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

Discussions similaires

  1. Problème liaison C/C++ avec PLUSIEURS libs so ADA
    Par bineuronne dans le forum Ada
    Réponses: 2
    Dernier message: 27/02/2008, 13h29
  2. Problème liaison VB-WORD
    Par cameleon33 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 26/12/2006, 13h27
  3. [VBA-P] Problème liaisons powerpoint-Excel
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/07/2006, 15h07
  4. Problème liaison plusieurs à plusieurs
    Par Anthony17 dans le forum Access
    Réponses: 16
    Dernier message: 22/05/2006, 17h12
  5. problème Liaison ADOconnection avec AdoQuery
    Par Vodkha dans le forum Bases de données
    Réponses: 4
    Dernier message: 08/09/2005, 16h11

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