bug-prolog
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

GNU Prolog and C mixing problem


From: Charles Christophe Thomart
Subject: GNU Prolog and C mixing problem
Date: Thu, 5 Jun 2003 15:06:51 +0200

Hello,

I've got some problems when trying to build a GNUProlog engine as a shared 
library.

##### Here's my main program (main.c) :
#include <stdio.h>
#include "libCtoProlog.h"

int main(int argc, char *argv[]) {
    printf("In main!\n");
    doPrologDistribution("distribute", "prologdistribution.dist");
    return 0;
}

##### The library header (libCtoProlog.h) :
#include <stdio.h>
#include <string.h>
#include "gprolog.h"

//void saveDistribution(FILE *outstream, PlTerm *List);
int doPrologDistribution(char *PrologFileName, char *distributionfile);
void testlib(void);

##### The library source code (libCtoProlog.c) :
#include <stdio.h>
#include <string.h>
#include "gprolog.h"
#define MAX_ELEMENT_NUMBER 200

/*
void saveDistribution(FILE *outstream, PlTerm *List) {
    ...
}
*/

int doPrologDistribution(char *PrologFileName, char *distributionfile) {
    int distribute, loadMyFile;
    WamWord args[3];
    PlTerm *solution;
    long solduration = 0;
    Bool res;
//    FILE *outputfile;

    printf("Launching prolog engine...\n");
    printf("Number of directives loaded : %d\n", Start_Prolog(0, NULL)); 

    // Initialisation
    loadMyFile = Find_Atom("consult");
    printf("Launching request...\n");
    Pl_Query_Begin(FALSE);
    args[0] = Mk_String(PrologFileName);
    printf("Arguments : %ld\n", args[0]);

    res = Pl_Query_Call(loadMyFile, 1, args);
    printf("Initialisation check : %d\n", res);
    Pl_Query_End(PL_CUT);

    if(res == 2)
    { //Case of an exception
        printf("Cannot find file %s.pl\n", PrologFileName);
        Stop_Prolog();
        return res;
    }

    distribute = Find_Atom("distribute");

    Pl_Query_Begin(FALSE);
    args[0] = Mk_Variable();
    args[1] = Mk_Variable();

    res = Pl_Query_Call(distribute, 2, args);
    printf("Request result : %d\n", res);

    if(res == 2)
    { //Cas of an exception
        printf("Terms are of type PLV:%d FDV:%d INT:%d FLT:%d ATM:%d LST:%d 
STC:%d\n", PLV, FDV, INT, FLT, ATM, LST, STC);
        printf("Exception of type %d\n", Type_Of_Term(Pl_Get_Exception()));;
        Stop_Prolog();
        return res;
    }

    solution = Rd_List_Check(args[0]);
    solduration = Rd_Integer(args[1]);

    Pl_Query_End(PL_CUT);

    printf("Solution founded with a maximum of %ld\n", solduration);
/*
    outputfile = fopen(distributionfile, "w+t");
    saveDistribution(outputfile, solution);
    fclose(outputfile);
*/

    Stop_Prolog();
    return 0;
}

void testlib(void) {
    printf("Testing library...\n");
}

##### The distribute.pl file could be as :
% Empty file

##### The called distribution.pl file :
distribute([[a, b]], 10).

##### The Makefile :
CC = g++ -g2
PROLOGCOMPILER = gplc

PROLOG_LIBS_BEFORE = -L${GNUPROLOGHOME}/lib ${GNUPROLOGHOME}/lib/obj_begin.o
PROLOG_LIBS_AFTER = ${GNUPROLOGHOME}/lib/all_pl_bips.o 
${GNUPROLOGHOME}/lib/all_fd_bips.o ${GNUPROLOGHOME}/lib/top_level.o 
${GNUPROLOGHOME}/lib/debugger.o -lbips_fd -lengine_fd -lbips_pl 
${GNUPROLOGHOME}/lib/obj_end.o -lengine_pl -llinedit -lm
PROLOG_FLAGS = ${GNUPROLOGHOME}/lib/obj_begin.o 
${GNUPROLOGHOME}/lib/all_pl_bips.o ${GNUPROLOGHOME}/lib/all_fd_bips.o 
${GNUPROLOGHOME}/lib/top_level.o ${GNUPROLOGHOME}/lib/debugger.o 
${GNUPROLOGHOME}/lib/libbips_fd.a  ${GNUPROLOGHOME}/lib/libengine_fd.a 
${GNUPROLOGHOME}/lib/libbips_pl.a ${GNUPROLOGHOME}/lib/obj_end.o 
${GNUPROLOGHOME}/lib/libengine_pl.a ${GNUPROLOGHOME}/lib/liblinedit.a -lm

all: libCtoProlog.so CtoProlog

CtoProlog: libCtoProlog.h distribution.o main.o libCtoProlog.so
        ${CC} ${PROLOG_LIBS_BEFORE} \
         main.o distribution.o -o CtoProlog \
        -L. -lCtoProlog ${PROLOG_LIBS_AFTER}

main.o: main.c
        ${CC} -Wall -c $^ -o main.o ${PROLOG_FLAGS}

distribution.o: distribution.pl
        ${PROLOGCOMPILER} -c distribution.pl

libCtoProlog.o: libCtoProlog.c
        ${CC} -Wall -c $^ `./gprolog.conf --cflags`

libCtoProlog.so: libCtoProlog.o distribution.o
        ${CC} -shared -o libCtoProlog.so \
        ${PROLOG_LIBS_BEFORE} $^ \
        ${PROLOG_LIBS_AFTER}

clean:
        rm -f distribution.o main.o libCtoProlog.o CtoProlog *~
        rm -f libCtoProlog.so*

############################################

The compilation seems to work : no errors, links look ok (with ldd), the 
library has the requested function (nm).
But, when executing, I've got a "Global stack overflow (size 8193Kb)" error 
message, which sounds strange, since there's quite nothing to load.

Using gdb, we see that the libraries are loaded, but the libCtoProlog.so 
hasn't got any start adress.
The testlib() function is there only to test if the library is loaded, and 
seems to work.

In fact, the error occurs during the Start_Prolog() call, or, to be precise, 
just after. This functions returns correctly, but the error appear a bit 
later (you can see it by putting a pause).

Any ideas?
Thanks in advance.

Andalariel.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]