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

Prolog Discussion :

Probleme de création d'une librairie d'interface C sous linux


Sujet :

Prolog

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Probleme de création d'une librairie d'interface C sous linux
    Bonjour tout le monde.

    J'ai besoin, dans le cadre d'un projet professionnel, de créer une interface C d'appel à Prolog (j'utilise SWI-prolog), sous linux.

    J'ai donc tenté de m'entraîner en créant un petit ".pl" qui retourne la somme de plusieurs paramètres d'entrée.

    J'ai ensuite créé une interface C qui appelle les prédicats de mon ".pl".

    Si je créé un exécutable avec plld, tout va bien:
    "plld somme.c somme.pl -o somme"

    Maintenant, si je créé une librairie dynamique et que je la lie avec un programme C censé l'appeler, j'obtiens les messages d'erreurs suivants :
    "ERROR : Undefined procedure : initialiser/1"
    "ERROR : Undefined procedure : somme/7"
    initialisre/1 et somme/7 étant mes prédicats.

    Les commandes que j'ai utilisées sont:
    "plld -shared -o somme somme.c somme.pl libpl.a -lm -lncursesw -lgmp -ldl -lrt"

    Ensuite:
    "gcc -o test_somme test_somme.c somme.so"

    J'espère que quelqu'un aura une idée.

    Merci.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    A mon avis c'est plus un problème C que Prolog, il faudrait voir ton code.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Salut! Merci pour ta réponse rapide.

    Voici mon code.

    somme.pl :
    :-dynamic (i/1).

    initialiser(Init) :-
    asserta(i(Init)).

    somme(X1,X2,X3,Sum1,Sum2,Sum3,Sum4):-
    i(Y),
    write('Y = '),
    write(Y),nl,
    Y1 is Y + 1,
    write('Y1 = '),
    write(Y1),nl,
    retract(i(Y)),
    asserta(i(Y1)),
    Sum1 is X1 + X2,
    Sum2 is X1 + X3,
    Sum3 is X2 + X3,
    Sum4 is X1 + X2 + X3.
    somme.c :
    #include <stdio.h>
    #include <SWI-Prolog.h>


    int SommeProlog(int argc, char **argv)
    {
    int liste[3];
    int i;
    int retour;
    int somme;
    char **argv2;
    int argc2;

    predicate_t pred1;
    predicate_t pred2;
    term_t h0;
    term_t h1;


    if (!PL_initialise(argc,argv))
    {
    PL_halt(1);
    printf ("ERREUR\n");
    }

    /*retour = PL_is_initialised(&argc2, &argv2);*/

    for (i=0;i<3;i++)
    {
    printf ("Entrer le numéro d'indice %d : ",i+1);
    scanf ("%d",&liste[i]);
    printf ("\n");
    }

    h1 = PL_new_term_refs(1);
    PL_put_integer(h1,1);
    pred1 = PL_predicate ("initialiser",1,"user");
    PL_call_predicate(NULL,PL_Q_NORMAL,pred1,h1);


    h0 = PL_new_term_refs(7);
    PL_put_integer(h0, liste[0]);
    PL_put_integer(h0 + 1, liste[1]);
    PL_put_integer(h0 + 2, liste[2]);
    pred2 = PL_predicate ("somme",7,"user");

    for (i=0;i<10;i++)
    {
    somme = 0;

    PL_call_predicate(NULL,PL_Q_NORMAL,pred2,h0);

    PL_get_integer(h0 + 3, &somme);
    printf ("somme1 = %d\n",somme);
    PL_get_integer(h0 + 4, &somme);
    printf ("somme2 = %d\n",somme);
    PL_get_integer(h0 + 5, &somme);
    printf ("somme3 = %d\n",somme);
    PL_get_integer(h0 + 6, &somme);
    printf ("somme4 = %d\n",somme);
    sleep (1);
    }

    PL_halt(1);

    return (1);
    }
    et enfin test_somme.c
    #include <stdio.h>

    #include "SWI-Prolog.h"
    #include "SWI-Stream.h"



    int main(int argc, char **argv)
    {
    SommeProlog(argc,argv);
    }

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Peut-être une piste, je n'ai pas testé.
    Il faut initialiser avec le programme qui lance prolog, or ici, ce n'est pas test_somme qui lance prolog mais le module "somme.o"

    Tu devrais peut-être initialiser (!PL_initialise(argc,argv)) avec "somme" et nom pas les argc, argv du programme test_somme. (suis-je clair ?!).
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonne idée mais ça ne fonctionne pas.
    Pourtant tu dois avoir raison sur le probleme de l'initialisation.
    Reste plus qu'à trouver comment faire.
    Si tu as une autre idée je suis preneur.

  6. #6
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Problème résolu

    Tu avais bien raison pour le nom de l'appelant lors de l'initialisation.

    Seulement il ne suffit pas de mettre la librairie dans le même répertoire que l'exécutable et de passer uniquement son nom en argument("somme").

    En fait il faut aussi passer le chemin (absolu ou relatif).

    Merci beaucoup pour ton aide.

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Un petit clic sur alors
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/03/2008, 09h09
  2. Réponses: 1
    Dernier message: 20/06/2007, 12h34
  3. [VB.NET] Probleme de création d'une picturebox dans le code
    Par stringman62 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 07/02/2006, 16h56
  4. Création d'une librairie ???
    Par Mike888 dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 10/10/2004, 12h16
  5. création d'une librairie dynamique
    Par bilo2000 dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 26/08/2004, 15h17

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