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'], []).