Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Parameterübergabe an externe .exe Datei
Gehe zu Seite 1, 2, 3, 4  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 03.11.2013, 03:08    Titel: Parameterübergabe an externe .exe Datei Antworten mit Zitat

Ich habe eine Datei in der man zum Beispiel bestimmte Wörter als Befehl eingeben kann.

Ich möchte, wenn möglich dieser .exe Datei mit einem in Freebasic geschriebenen Programm jene Befehle mitteilen bzw. übermitteln.

Ich rufe das in Freebasic geschriebene Programm auf und das andere Programm erhält Befehle und führt sie aus, so als wenn ich die direkt in das andere Programm eingebe!

Mein Plan: http://www.shredderchess.de/schach-info/features/uci-universal-chess-interface.html

Wie geht das?
Ich weiß im Moment noch nicht wie der .exe Datei Befehle mitteilen kann?

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 03.11.2013, 13:21    Titel: Antworten mit Zitat

Ein Blick in die Interface Beschreibung auf der verlinkten Seite und evt. ein weiterer in die Befehlsreferenz hätte deine Frage großteils beantwortet:
Interface Beschreibung hat Folgendes geschrieben:

* all communication is done via standard input and output with text commands
; sprich: die Kommunkation läuft über stdin und stdout.
In FB werden allerdings bidirektionale Pipes nicht unterstützt, siehe http://www.freebasic-portal.de/befehlsreferenz/open-pipe-552.html
Ich würde es mit den Funktionen der C-RTL versuchen, ansonsten kannst du auch auf die Win32 API zurückgreifen (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231.aspx als Anfang).
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 03.11.2013, 20:15    Titel: Antworten mit Zitat

St_W hat Folgendes geschrieben:
Ein Blick in die Interface Beschreibung auf der verlinkten Seite und evt. ein weiterer in die Befehlsreferenz hätte deine Frage großteils beantwortet:
Interface Beschreibung hat Folgendes geschrieben:

* all communication is done via standard input and output with text commands
; sprich: die Kommunkation läuft über stdin und stdout.
In FB werden allerdings bidirektionale Pipes nicht unterstützt, siehe http://www.freebasic-portal.de/befehlsreferenz/open-pipe-552.html
Ich würde es mit den Funktionen der C-RTL versuchen, ansonsten kannst du auch auf die Win32 API zurückgreifen (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683231.aspx als Anfang).


Ich glaube nicht, dass ein Blick meine Fragen beantwortet hätte!
Stehe noch immer auf den Schlauch! Mal schauen wie sich das realisieren lässt! Habe es noch nicht probiert!

Vielen herzlichen Dank für die Hilfe!

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 04.11.2013, 02:20    Titel: Antworten mit Zitat

Hallo,

ich habe gerade ein ähnliches Problem mit dem (Kommandozeilen-)Brennprogramm "cdrdao.exe" (Windows-Version), das sich standhaft weigert, seine Bildschirmausgabe woanders hinzuschicken als an sein eigenes Konsolenfenster. Es ignoriert sowohl den "... > G:\test\ausgabe.txt" - Parameter auf der Kommandozeile (erzeugt nur eine leere Datei) als auch den "Open Pipe..." - Befehl. Gibt es noch andere Möglichkeiten, die Ausgabe umzuleiten?

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Roland Chastain



Anmeldungsdatum: 05.12.2011
Beiträge: 192
Wohnort: Frankreich

BeitragVerfasst am: 04.11.2013, 07:56    Titel: Antworten mit Zitat

Hallo ! Hier es gibt ein FB Schachprogramm (mit Quellcode) wer verwendet Winboard Protokol :

Numpty chess

Es gibt also diese Code Beispiel wer verwendet UCI Protokol :

Fruit
English Forum
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 04.11.2013, 12:19    Titel: Vielleicht stderr statt stdout Antworten mit Zitat

grindstone hat Folgendes geschrieben:
Es ignoriert sowohl den "... > G:\test\ausgabe.txt" - Parameter auf der Kommandozeile (erzeugt nur eine leere Datei)

Vielleicht macht das Programm seine Statusausgaben auf der Standardfehlerausgabe stderr und nicht nach stdout. Von daher könntest du noch probieren, ob es mit
Code:
....exe 2> G:\test\ausgabe.txt

vielleicht funktioniert.
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 05.11.2013, 01:36    Titel: Antworten mit Zitat

Roland Chastain hat Folgendes geschrieben:
Hallo ! Hier es gibt ein FB Schachprogramm (mit Quellcode) wer verwendet Winboard Protokol :

Numpty chess

Es gibt also diese Code Beispiel wer verwendet UCI Protokol :

Fruit
English Forum


In der einen .bi Datei steht folgendes drin:

Code:
Îøèáêà óñòàíîâêè ïðàâà íå íàñëåäîâàíèÿ äåñêðèïòîðîâ äëÿ 1 ïàéïà

da soll man sich auskennen!
Vielleicht kann das einer entziffern?

Mit dem Winboard-Protokoll kann ich nicht so viel anfangen!
Mein Ziel ist das UCI Protokoll!

So richtig schlau werde ich noch nicht draus?

Danke für den Link, der hilft mir schon ein wenig weiter!
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 05.11.2013, 02:38    Titel: Antworten mit Zitat

@Sebastian: Volltreffer, es funktioniert! Vielen Dank für den Tip. lächeln

Jetzt müsste ich nur noch wissen, wie ich die Ausgabe statt in eine Datei in ein laufendes FB-Programm umleiten kann. Mit "Open Pipe..." geht das ja offensichtlich nicht. Und das Workaround über ein Auslesen der Ausgabedatei, während sie noch geschrieben wird, funktioniert zwar, ist aber nicht besonders elegant.
Hintergrund: Ich bastle gerade an einer "verify" - Funktion für "cdrdao" und möchte die Ausgabe des Programms in einer Ecke meines Fensters anzeigen.
(Entschuldigung, daß ich hier so vom Thema abschweife, aber ich möchte dafür nicht extra einen neuen Thread aufmachen).

Gruß
grindstone

EDIT: Ziehe nach gründlicher Lektüre des angegebenen Links meine letzte Frage reumütig zurück. peinlich Das Programm macht jetzt genau das, was ich möchte. Vielen Dank noch mal an Sebastian.
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!


Zuletzt bearbeitet von grindstone am 05.11.2013, 23:22, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 05.11.2013, 08:52    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
Mit dem Winboard-Protokoll kann ich nicht so viel anfangen!
Mein Ziel ist das UCI Protokoll!
Danke für den Link, der hilft mir schon ein wenig weiter!

Warum kannst du mit dem Winboard-Protokoll nichts anfangen? Es gibt ja Polyglot
http://wbec-ridderkerk.nl/html/details1/PolyGlot.html

Dann brauchst du eigentlich nur das Winboard Protokoll implementieren.
Das Grundgerüst für die Kommunikation über bidirectionale Pipes ja ist bei beiden das gleiche.

Winboard:
http://www.gnu.org/software/xboard/engine-intf.html
http://www.open-aurec.com/wbforum/WinBoard/engine-intf.html

UCI:
http://wbec-ridderkerk.nl/html/UCIProtocol.html
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 05.11.2013, 12:43    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:
In der einen .bi Datei steht folgendes drin:

Code:
Îøèáêà óñòàíîâêè ïðàâà íå íàñëåäîâàíèÿ äåñêðèïòîðîâ äëÿ 1 ïàéïà

da soll man sich auskennen!
Vielleicht kann das einer entziffern?

Das ist Text, der in einer kyrillischen ANSI-Codepage verfasst wurde, auf deinem System aber mit einer mitteleuropäischen Codepage dargestellt wird. "Übersetzen" in die richtigen Zeichen kann man das mit diesem Tool, raus kommt dabei "Ошибка установки пава не наследования дескиптоов для 1 пайпа"
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 05.11.2013, 23:10    Titel: Antworten mit Zitat

RockTheSchock hat Folgendes geschrieben:
ALWIM hat Folgendes geschrieben:
Mit dem Winboard-Protokoll kann ich nicht so viel anfangen!
Mein Ziel ist das UCI Protokoll!
Danke für den Link, der hilft mir schon ein wenig weiter!

Warum kannst du mit dem Winboard-Protokoll nichts anfangen? Es gibt ja Polyglot
http://wbec-ridderkerk.nl/html/details1/PolyGlot.html

Dann brauchst du eigentlich nur das Winboard Protokoll implementieren.
Das Grundgerüst für die Kommunikation über bidirectionale Pipes ja ist bei beiden das gleiche.

Winboard:
http://www.gnu.org/software/xboard/engine-intf.html
http://www.open-aurec.com/wbforum/WinBoard/engine-intf.html

UCI:
http://wbec-ridderkerk.nl/html/UCIProtocol.html


Ich kann deswegen nichts anfangen weil alle Schachengines UCI sind. Und ich will nicht extra Programme verwenden, nur damit diese letztendlich mit dem Programm laufen!

Ich weiß nicht, ob ich es schaffe, so ein Programm zu schreiben, dass Schachengines gegeneinander antreten? Aber ich werde es versuchen!

@Jojo: Danke für die Info, wusste nicht was das bedeuten soll! Habe es mir schon gedacht, dass das irgendwie mit Russisch zusammenhängt! Man lernt nie aus!

Edit:

Code:
ReadEngineInfo("id name")
Schachmotor = ReadEngineInfo()

LOCATE 5,5
PRINT Schachmotor


Wenn ich obigen Code mit reinschreibe in das Programm, dann erhalte ich folgende Fehlermeldung:

Zitat:
Build error(s)
C:\Program Files (x86)\FreeBASIC\fbc -s gui "gui.bas"
gui.bas(216) error 7: Expected ')', found 'id name \n' in 'READENGINEINFO("id name")'


Warum nur? Wollte den Namen der Engine auslesen!

Laut UCI Protokoll müsste das gehen:

Code:
Engine to GUI:
--------------

* id
   * name
      this must be sent after receiving the "uci" command to identify the engine,
      e.g. "id name Shredder X.Y\n"
   * author
      this must be sent after receiving the "uci" command to identify the engine,
      e.g. "id author Stefan MK\n"

_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 06.11.2013, 10:24    Titel: Antworten mit Zitat

@ALWIM: So wie ich das Protokoll verstanden habe, schickst du von der GUI aus den String "uci \n" zur Engine und bekommst dann von der Engine "id name [Enginename]" und noch etliche andere Informationen zurückgeschickt. Wie der String an die Engine übermittelt wird, entzieht sich leider meiner Kenntnis.
Ich habe mal drei nicht-russische Open Source - Engines herausgesucht,
http://www.glaurungchess.com/
http://arctrix.com/nas/chess/fruit/
https://github.com/Kojirion/blackWolf
vielleicht gibt die Analyse des Quelltextes ja irgendwelchen Aufschluss.

Ansonsten: Falls jemand mitliest, der darüber näheres weiß: Bitte melden, es würde mich auch interessieren.

Wenn die Engine per Tastatur gesteuert wird, kann dir vielleicht auch die WinApi-Funktion SendInput(... weiterhelfen, mit der sich Tastendrücke simulieren lassen.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 07.11.2013, 03:46    Titel: Antworten mit Zitat

In der einen C++ Datei steht drin:
Code:
void Engine::waitForOk()
{
    toEngine("isready");


    while (fromEngine()!="readyok"){
    }
}


Der Befehl
Code:
toEngine("uci");

ist bei dem Freebasicprogramm:
Code:
WriteEngineInfo("uci")


So sieht das Gegenstück in C++ aus:
Code:
(fromEngine()!="readyok")


Bei meinem Programm funktioniert dies nicht:
Code:
ReadEngineInfo("id name")


Der entsprechende C++ Quellcode: https://github.com/Kojirion/blackWolf/blob/072b873cc6fdee7d4f23f1ea3cee55f32965f792/Engine.cpp

(Die Befehle) toEngine und fromEngine sind nirgendswo definiert in den Dateien.
Vielleicht habe ich da was übersehen?

Ich kann den Namen der Schachengine nicht auslesen? Keine Ahnung was man da schreiben muss, damit das funktioniert!
Ich wollte den Namen der Schachengine auslesen und mit Print auf dem Bildschirm anzeigen lassen.

http://free-basic.ru/chess_fruit.html
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 07.11.2013, 10:35    Titel: Antworten mit Zitat

ALWIM hat Folgendes geschrieben:

(Die Befehle) toEngine und fromEngine sind nirgendswo definiert in den Dateien.
Vielleicht habe ich da was übersehen?

Ja, hast du:
Code:
    void toEngine(const std::string toPut);
    std::string fromEngine();
in "Engine.hpp".

Aber es ist eigentlich unnötig, sich durch die ganzen C++ - Sources zu kämpfen. Ich habe das "Fruit"-Paket einmal heruntergeladen und es mir angesehen. Der russische Kollege hat zwar einen etwas eigenwilligen Programmierstil, die Arbeitsweise des Programms ist aber recht gut nachvollziehbar.

ALWIM hat Folgendes geschrieben:

Bei meinem Programm funktioniert dies nicht:
Code:
ReadEngineInfo("id name")
Natürlich funktioniert das nicht. Mit "ReadEngineInfo()" wird Text nicht geschrieben, sondern gelesen. Versuch es mal so:
Code:
Dim As String g
WriteEngineInfo("uci")
g = ReadEngineInfo()
Print g
Zum tieferen Verständnis solltest du dir die "connect_engine.bi" einmal genauer ansehen (oder sollte ich besser sagen: durcharbeiten?).

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 07.11.2013, 11:37    Titel: Antworten mit Zitat

Zitat:
Natürlich funktioniert das nicht. Mit "ReadEngineInfo()" wird Text nicht geschrieben, sondern gelesen. Versuch es mal so:


Das ist ja genau das was ich will! Lesen. Namen der Engine auslesen!

Code:
Dim As String g
WriteEngineInfo("uci")
g = ReadEngineInfo()
Print g


Damit zeigt er auch keinen Namen an. Auch wenn ich "id Name" reinschreibe. Auf dem Bildschirm wird nur err angezeigt. Auch den Namen des Programmierers kann ich nicht auslesen.

Das muss doch zum schaffen sein?
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 07.11.2013, 12:03    Titel: Antworten mit Zitat

Gemäß UCI-Standard sollte die Engine auf "uci" hin ihre id und ihren Namen zurückmelden. Tut sie aber nicht, zumindest nicht die "Fruit-2-3-1.exe". Die anderen Befehle scheinen zu funktionieren, zumindest soweit ich sie ausprobiert habe. Vielleicht solltest du es mal mit einer anderen Engine probieren.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 07.11.2013, 13:29    Titel: Antworten mit Zitat

Das macht keine der Engines die ich habe!

mit
Code:
WriteEngineInfo("uci")
kann man auch keinen Enginenamen auslesen! Laut UCI-Protokoll kann man das nur mit ReadEngineInfo?
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 08.11.2013, 01:23    Titel: Antworten mit Zitat

Ich beziehe mich auf die Angaben in http://wbec-ridderkerk.nl/html/UCIProtocol.html. Danach bedeutet
Code:
WriteEngineInfo("uci")
soviel wie: "Schalte in den uci-modus und mir sage mir, wer du bist". Und mit
Code:
Print = ReadEngineInfo()
kann man dann abrufen, was die Engine daraufhin antwortet.
Wenn sie das nicht tut, gibt es zwei Möglichkeiten: Entweder das Protokoll wurde geändert (wofür ich nirgendwo einen Anhaltspunkt gefunden habe) oder die Engine wurde unsauber programmiert.
Du könntest die "Fruit-2-3-1.exe" mal in einen Hex-Editor laden und nach einem entsprechenden Namensstring suchen, der muß ja irgendwo im Programm drinstehen.
Ansonsten könntest du dir auch den Quellcode einer Open-Source-Engine vornehmen, um herauszufinden, mit welchem Befehl man sie eventuell dazu bewegen könnte, ihren Namen preiszugeben.

Für mich sieht es jedenfalls so aus, als ob die "Fruit-2-3-1.exe" den Befehl "uci" überhaupt nicht kennt.

EDIT: Wenn du die "Fruit-2-3-1.exe" normal als Programm in einem DOS-Fenster startest und dann "uci" eintippst, bekommst du die gewünschten Informationen - und noch eine Menge mehr. Vielleicht hilft dir das ja weiter.

EDIT 2: Der Fehler liegt eindeutig in der "connect_engine.bi". Die Pipes funktionieren nicht, auch nicht mit anderen Programmen.

EDIT 3: Der Fehler liegt in der "ReadEngineInfo()".
Wenn du sie durch
Code:
Function ReadEngineInfo() As String
   Dim As Integer iTotalBytesAvail,iNumberOfBytesWritten
   Dim As String sRet,sBuf
   sBuf = String(10000,Chr(0))
   PeekNamedPipe(hReadPipe,NULL,NULL,NULL,@iTotalBytesAvail,NULL)
   If iTotalBytesAvail Then
      ReadFile(hReadPipe,StrPtr(sBuf),iTotalBytesAvail,@iNumberOfBytesWritten,NULL)
   EndIf
   Return sBuf
End Function
ersetzt, bekommst du eine Rückmeldung von der Engine (und wirst feststellen, daß sie ziemlich geschwätzig ist). Die Formatierung der Ausgabe überlasse ich dir. Viel Spaß damit. grinsen

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 08.11.2013, 14:11    Titel: Antworten mit Zitat

Zitat:
Für mich sieht es jedenfalls so aus, als ob die "Fruit-2-3-1.exe" den Befehl "uci" überhaupt nicht kennt.
Fruit muss den Befehl UCI kennen, da ich die im Fritz 12 verwenden kann! Das geht nur mit UCI Engines!

Zitat:
Du könntest die "Fruit-2-3-1.exe" mal in einen Hex-Editor laden und nach einem entsprechenden Namensstring suchen, der muß ja irgendwo im Programm drinstehen.
Ansonsten könntest du dir auch den Quellcode einer Open-Source-Engine vornehmen, um herauszufinden, mit welchem Befehl man sie eventuell dazu bewegen könnte, ihren Namen preiszugeben.

Brauche ich nicht, da ich den Quellcode von Fruit auf meinem Rechner irgendwo habe!

Zitat:
Der Fehler liegt eindeutig in der "connect_engine.bi". Die Pipes funktionieren nicht, auch nicht mit anderen Programmen.

Das habe ich mir schon gedacht!

Zitat:
EDIT 3: Der Fehler liegt in der "ReadEngineInfo()".
Wenn du sie durch
Code:
 Code:
Function ReadEngineInfo() As String
   Dim As Integer iTotalBytesAvail,iNumberOfBytesWritten
   Dim As String sRet,sBuf
   sBuf = String(10000,Chr(0))
   PeekNamedPipe(hReadPipe,NULL,NULL,NULL,@iTotalBytesAvail,NULL)
   If iTotalBytesAvail Then
      ReadFile(hReadPipe,StrPtr(sBuf),iTotalBytesAvail,@iNumberOfBytesWritten,NULL)
   EndIf
   Return sBuf
End Function

ersetzt, bekommst du eine Rückmeldung von der Engine (und wirst feststellen, daß sie ziemlich geschwätzig ist). Die Formatierung der Ausgabe überlasse ich dir. Viel Spaß damit. grinsen

Gruß
grindstone

Dann werde ich das mal probieren! Hoffentlich sehe ich jetzt mehr. Am UCI-Protokoll wurde nichts mehr geändert! Das ist die aktuelle Version!

Vielen herzlichen Dank schon mal für die Hilfe!

Edit: Funktioniert das bei dir? Ich bekomme eine Fehlermeldung bzw. es werden keine Züge mehr ausgeführt! Gui (Programm) wird geschlossen!
Angezeigt wird bei mir auch nichts. Welchen Quellcode hast du, damit er was anzeigt?

verwundert Hmmm.... ??????
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 08.11.2013, 17:27    Titel: Antworten mit Zitat

Entschuldigung, das hätte ich dazuschreiben sollen: Der angegebene Code ist kein funktionierender Ersatz für die Original-Function, sondern nur ein "quick and dirty" zusammengestellter Notbehelf, um die Startmeldung der Engine auslesen zu können. Im Augenblick ist z.B. jeder zurückgegebene String 10000 Zeichen lang. Sieh es dir am besten selbst an. Füge dazu die Zeilen
Code:
Dim As String g
Do
   WriteEngineInfo("uci")
   Sleep 1000
   g = ReadEngineInfo()
   Print Left(g,InStr(g,Chr(0))-1);
   Sleep
Loop
am Anfang der "gui.bas" zwischen "Using fb" und "ScreenRes 640,480,32" ein. Dann setze die Bildpuffergröße deines DOS-Fensters auf 250 Zeilen und kompiliere und starte die "gui.bas" als Konsolenprogramm.

Und dann mach dir in aller Ruhe Gedanken darüber, wie man diesen Datenwust bändigen kann. zwinkern

Die ursprüngliche "ReadEngineInfo()" gibt -soweit ich das beurteilen kann- immer nur die 5 Zeichen zurück, die auf das Wort "bestmove " folgen - oder eben ein "err". Wenn du eine vollständige normgerechte Kommunikation möchtest, mußt du also noch etwas Arbeit in die Neuprogrammierung der Funktion investieren. Das überlasse ich dir, da du dich mit dem uci - Protokoll wesentlich besser auskennen dürftest als ich (Schließlich wußte ich vor einer Woche nicht einmal, daß es sowas überhaupt gibt).

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2, 3, 4  Weiter
Seite 1 von 4

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz