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 :

Appel C depuis ADA


Sujet :

Ada

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 30
    Points : 15
    Points
    15
    Par défaut Appel C depuis ADA
    Bonjour,

    J'aurais besoin de faire un appel C depuis une procédure Ada.
    En fait je dois écrire des float dans un log file et je voudrais utiliser la
    fonction C printf pour le faire simplement. Si jamais je tiens à préciser que
    je veux utiliser ceci car c'est dans un système embarqué et que j'ai pas forcément toutes les librairies standard disponible donc le plus simple je
    pense et de faire cet appel C.
    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    je pense que tu peux faire un import de printf de la même manière que cet import C de "system" donné par Promu@_ID
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    function System (Cmd : Interfaces.C.Char_Array) return Interfaces.C.int;
    pragma Import (C, System, "system");
    SI printf fait parti de la lib standard C, oops

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Ok merci, mais il faudrait un peu plus développer parce que je suis pas un habitué du Ada
    J'imagine que se serait du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    procedure Printf ( F : Float) ;
    pragma Import (C, Printf, "printf");
    le printf fait partit de stdio.h qui est dans la lib standard C.
    Le prob c'est qu'un printf a plusieurs arguments optionnel dans mon cas
    c'est réduit à cela: printf("%2.3f", my_val_float);

    se qui devrait donner un truc du genre comme implémentation de la fonction d'appel du printf depuis Ada:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure Printf( x : Float)
    begin
         printf ("%2.3f", Double(x));
    end Printf;
    mais j'aimerais être sûr de se qui faut vraiment mettre

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ah mais non, je crois qu'il faut spécifier une procédure à l'image du prototype C, c'est à dire avec les même paramètre formels.


    Pour la fonction "system" la fonction "system" C attend bien une chaine de charactères et retourne bien un entier.

    en l'occurence le prototype de "printf"

    si je ne m'abuse,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <stdio.h>
     
    #int printf( const char *format [, arg [, arg]...]);

    Par contre, là, le C, j'y comprend rien pour le moment.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Oui c'est exactement ça mais le prob c'est que system si je me trompe pas
    permet juste de passer en paramètre un string (tableau de char) contenant une commande system à exécuter!
    Mais dans le cas du printf comme tu l'as écrit il y a des param. optionnels.
    cad que tu peux faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printf("test");
    printf("test %f %D", 3.2, 5);
    printf("%f", 4.3);
    et je sais pas comment tu ferais pour appler ce genre de chose en ada .
    Moi j'ai juste besoin de la dernière possibilité! Sinon je pourrais faire ma propre unité en C contenant l'appel au printf et ayant en paramètre seulement le float à envoyé depuis ada et plus besoin des paramètre optionnels mais il faudrait savoir comment linker tout ça.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Le paramètre peut-être du genre d'un tableau de char ou du genre à modéliser un (argc, argv, argenv) je sais plus quoi);

    Sous Linux, pour linker, un gnatlink avec un pragma import, si c'est dans la lib C standard, ça doit suffire.
    Dernière modification par Alcatîz ; 20/04/2008 à 11h25. Motif: citation inutile du post précédent

  7. #7
    Invité
    Invité(e)
    Par défaut
    A pardon,
    je voulais dire d'une liste de tableau de char.
    Je teste avec String_List de Gnat.Os_Lib :/

  8. #8
    Invité
    Invité(e)
    Par défaut
    Non, vraiment, je sais, pas. je trouve pas comment, désolé. :/

  9. #9
    Invité
    Invité(e)
    Par défaut
    Une autre solution peut consister à faire un bind C

    Si je ne m'abuse

    Alors pour les options de liaison, il faut que je cherche.

  10. #10
    Invité
    Invité(e)
    Par défaut
    pour linker, pardon, teste la ligne

    gnatmake -o cible source -largs C_obj.o

  11. #11
    Invité
    Invité(e)
    Par défaut Désolé
    Désolé, en fait, le problème reste le même, il faut fournir le bon type d'argument je pense.

    Vraiment désolé

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par jovalise Voir le message
    Désolé, en fait, le problème reste le même, il faut fournir le bon type d'argument je pense.

    Vraiment désolé
    et si je fais une unité toto.h (pour l interface) et toto.c (implémentation) qui ont une routine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void function print_float(x : double)
    {
      printf("%2.3f", x);
    }
    et dans le code ada je fais appel à ma fonction print_float se trouvant dans toto.c ?

  13. #13
    Invité
    Invité(e)
    Par défaut
    Si tu sait que tu va afficher que des doubles, c'est possible.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par jovalise Voir le message
    Si tu sait que tu va afficher que des doubles, c'est possible.
    Oui je dois faire que ça!
    Si je reprends donc d'après mon unité que je fais, je devrais avoir:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    procedure Print_float ( F : Float) ;
    pragma Import (C, Print_float, "print_float");
     
    procedure Print_float( F : Float)
    begin
         print_float (Double(F));
    end Printf;
    est-ce correct ?
    Et après dans mon code Ada j'appelle Print_float, j'ai fait une procedure car
    la function C renvoie void mais je sais pas si c'est ok.
    Et le le nom de l'unité C est utilisé que au moment du linkage avec le code ada
    pas besoin de l'introduire dans le code Ada si j'ai bien compris !

  15. #15
    Invité
    Invité(e)
    Par défaut
    essaie ça plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    with Interfaces.C;
    use Interfaces.C;
    procedure Printf is
     
       function Ada_Printf(format : in Char_Array;
                           Long : in Interfaces.C.double ) return Interfaces.C.Int;
       pragma Import(C, Ada_Printf, "printf");
       Res_Printf : Interfaces.C.Int;
     
    begin
     
       Res_Printf := Ada_Printf(To_C("%2.3f"), 6.2);
    end Printf;

  16. #16
    Invité
    Invité(e)
    Par défaut
    Pour ta dernière question, je ne sais pas.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par jovalise Voir le message
    essaie ça plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    with Interfaces.C;
    use Interfaces.C;
    procedure Printf is
     
       function Ada_Printf(format : in Char_Array;
                           Long : in Interfaces.C.double ) return Interfaces.C.Int;
       pragma Import(C, Ada_Printf, "printf");
       Res_Printf : Interfaces.C.Int;
     
    begin
     
       Res_Printf := Ada_Printf(To_C("%2.3f"), 6.2);
    end Printf;
    j'ai les erreurs suivant:
    support_io.adb:143:34: no candidate interpretations match the actuals:
    support_io.adb:143:34: missing argument for parameter "Count" in call to "To_C" declared at i-c.ads:216
    support_io.adb:143:34: missing argument for parameter "Count" in call to "To_C" declared at i-c.ads:174
    support_io.adb:143:34: missing argument for parameter "Count" in call to "To_C" declared at i-c.ads:128
    support_io.adb:143:34: missing argument for parameter "Count" in call to "To_C" declared at i-c.ads:92
    support_io.adb:143:34: too many arguments in call to "To_C"
    support_io.adb:143:48: expected type "Standard.Boolean"
    support_io.adb:143:48: found type "Interfaces.C.double"
    support_io.adb:143:48: ==> in call to "To_C" at i-c.ads:206
    support_io.adb:143:48: ==> in call to "To_C" at i-c.ads:164
    support_io.adb:143:48: ==> in call to "To_C" at i-c.ads:120
    support_io.adb:143:48: ==> in call to "To_C" at i-c.ads:84
    formatted_print.ads:118:16: "Unbounded_String" is undefined

    J'ai modifié un peu l'entête: procedure Printf (F : Float) is
    et j'appelle la procedure comme ça dans une autre fonction où F est un float passer en paramètre de la fonction d'appel:
    Printf(F);

    line d'erreur 143> Res_Printf := Ada_Printf(To_C("%2.3f"), Double(F));

    si j'ai bien compris tu essayerais encore en faisant directement appel au printf standard depuis Ada, sans passer par une unité en C

  18. #18
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par laurent_r Voir le message
    si j'ai bien compris tu essayerais encore en faisant directement appel au printf standard depuis Ada, sans passer par une unité en C

    Bonsoir,
    Oui efectivement, j'utilise l'import directement dans ma procédure printf qui devrai plutôt s'appeler Print_Double_With_Printf



    Non mais, laisse tomber les commentaire.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 30
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par jovalise Voir le message
    Bonsoir,
    Oui efectivement, j'utilise l'import directement dans ma procédure printf qui devrai plutôt s'appeler Print_Double_With_Printf

    Si tu n'utilise pas les lib standard, il va falloir que tu t'adapte.
    Ok et sa marche chez toi, tu as essayé ?
    Aurais-tu une idée de l'erreur qui m'est donnné car j'ai fais comme tu m'as dit ?

    J'ai essayé aussi en faisant appelle à ma propre unité mais là il trouve pas ma
    fonction C

  20. #20
    Invité
    Invité(e)
    Par défaut
    Ben fait péter ton code, si je puis me permettre
    Dernière modification par Alcatîz ; 27/04/2008 à 12h25. Motif: citation du post précédent

Discussions similaires

  1. Appeler Scilab depuis Visual C++
    Par bassabo dans le forum Scilab
    Réponses: 1
    Dernier message: 20/05/2006, 18h22
  2. Réponses: 1
    Dernier message: 14/04/2006, 14h04
  3. [PERL et JAVA] Appeler PERL depuis JAVA
    Par krusty dans le forum Modules
    Réponses: 4
    Dernier message: 05/04/2006, 22h49
  4. Liveconnect avec Opera 8.5 (appel Java depuis JavaScript)
    Par Gregory3000 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/10/2005, 09h32
  5. Appels DCOM depuis une application Unix
    Par Dinaïz dans le forum Windows
    Réponses: 1
    Dernier message: 26/08/2005, 14h53

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