Schnittstelle VC++ und Prolog



  • Hallo,

    ich hab jetzt sehr viel gegoogelt und kein ausführbares Ergebnis
    gefunden, also schreib ich einfach mal hier:

    Ich hab folgendes Problem. Ich habe ein GUI in VC++ gegeben
    und muss einen Dijkstra in Prolog schreiben. Beide Dinge arbeiten
    einzeln super. Nur finde ich einfach keine Möglichkeit meine
    Prologfunktion aus VC++ heraus aufzurufen. Ich kann Prolog öffnen,
    aber keine Funktion mit Parametern aufrufen.

    dijkstra(start, end).
    Berechnet den kürzesten Weg, schreibt ihn in eine .txt und schließt
    Prolog selbständig. Also brauch ich nur einen Befehl der mir in
    VC++ den oben beschriebenen Befehl auslöst. Alles andere ist schon
    geklärt...

    Hat hier jemand eine Idee oder hat das schonmal gemacht?
    Vielen Dank schojn mal für Ideen und Hinweise.



  • ShellExecute!?



  • Ich seh schon in google, dass das Thema sicher nicht
    zum ersten Mal aufkam... Aber ich bekomm es dennoch nicht
    hin.

    string pfad = "C:\\Pfad\\Beispiel.pl";
    ShellExecute(NULL,"open",pfad.c_str(),NULL,NULL,SW_SHOWNORMAL);

    Der Befehl zum öffnen. Ok. Der ging schon mal nicht durch...
    Also hab ich den Header shellapi.h eingebunden... ging auch nicht.
    Dann hab ich windows.h und shellapi.h eingebunden und ich bekomm
    es kompiliert. Aber meine Beispiel.pl macht er nicht auf.

    Vielleicht kannst du mir etwas detaillierter sagen, wo mein
    Problem liegt? Aber danke für den Hinweis. Ich werd es weiter
    probieren. (Ich benutzt gerade nur C++ vielleicht macht das einen
    Unterschied? VC++ hab ich nur in der Uni drauf)



  • ShellExecute(NULL,"open",pfad.c_str(), ?Parameters? ,NULL,SW_SHOWNORMAL);

    So jetzt macht diese Zeile da oben mir zwar mein Prolog-Programm auf,
    aber selbst wenn ich in die Parameters-stelle was reinschreibe wird
    meine Prolog-Funktion ?-dijkstra(start, end). nicht ausgeführt.

    Ist diese Art ein Prolog-Programm zu öffnen überhaupt die sinnvollste?
    Bzw. kannst du mir vielleicht ein bisschen detaillierter schreiben, wie
    du denkst, dass es funktioniert?



  • Es muss doch einen Prolog-Interpreter geben, oder wer soll das Prolog Programm ausführen?

    Versuch das ganze zuerst mal aus einer Batch-Datei aufzurufen. Wenn Du das geschafft hast, dann machst Du das ganze mit Shell Execute...



  • Welchen Prologinterpreter benutzt du? SWI-Prolog hat z.B. glaube ich eine C Schnittstelle um es aus C/C++ Programmen heraus rufen zu können. Aber die Variante von Jochen find ich besser. Erweitere dein Prologprogramm so, dass es das Ergebnis in eine Datei schreibt (solche Prädikate müsste es glaub ich geben). Dann kannst du dieses Programm starten (vorher mit batchfile probieren, dann mit shellexecute) und das Ergebnis aus der Datei herauslesen. Und schon brauchst du dich nicht mit dem Einbinden des Prologinterpreters in ein C/C++ Programm beschäftigen.



  • Ich benutzt SWI-Prolog und das mit dem Datei beschreiben
    ist ja realisiert. Nur wenn ich Prolog aufrufe, muss ja
    manuel noch der Befehl ?-dijkstra(start, ziel). eingegeben
    werden. Das pure öffnen von Prolog bringt deshalb nichts.
    Nur wie kann ich denn die Funktion in Prolog über
    C++ oder VC++ aufrufen? Über Shellexecute hab ich keine
    Möglichkeit gefunden...



  • Schau mal hier http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%272.4%27,swi%28%27/doc/Manual/cmdline.html%27%29%29. Du könntest in dem Befehl für die Kommandozeile das zu ladende Skript und das auszuführende "goal" angeben. (Das ganze in ein Batchfile und dieses per ShellExecute ausführen)



  • Am einfachsten die Doku zu SWI Prolog lesen 😉

    http://www.swi-prolog.org/pldoc/package/clib.html

    On Windows this call is an interface to the CreateProcess() API. The commandline consists of the basename of Exe and the arguments formed from Args. Arguments are separated by a single space. If all characters satisfy iswalnum() it is unquoted. If the argument contains a double-quote it is quoted using single quotes. If both single and double quotes appear a domain_error is raised, otherwise double-quote are used.

    The CreateProcess() API has many options. Currently only the CREATE_NO_WINDOW options is supported through the window(+Bool) option. If omitted, the default is to use this option if the application has no console. Future versions are likely to support more window specific options and replace win_exec/2.

    Examples

    First, a very simple example that behaves the same as shell('ls -l'), except for error handling:

    ?- process_create(path(ls), ['-l'], []).


Log in to reply