Funktions Rückgabewert in Variable speichern
-
Hallo zusammen,
ich versuche in einem Projekt die Ausgabe der system() Funktion in eine Variable zu speichern aber warum auch immer wird der Int. nicht initialisiert/befühlt.
Hier ein Beispiel:#include <iostream> #include <stdlib.h> using namespace std; int main(){ int x = system("xdotool getmouselocation | cut -d: -f2 | cut -d' ' -f1"); cout << x; return 0; }
Hier das Resultat:
1413 0
Der erste Wert ist der Korrekte Rückgabe wert der Funktion aber der Zweite ist der Int. und dieser möchte einfach nicht, in diesem fall, 1413 anehmen .
was ist mein Fehler?
mfg Hermann und danke für jede Antwort.
-
Sir Hermann schrieb:
was ist mein Fehler?
Dein Problem ist, daß du die Dokumentation zu
std::system()
nicht gelesen hast.Notes
Related POSIX function popen makes the output generated by command available to the caller.
-
Sir Hermann schrieb:
was ist mein Fehler?
Du verstehst nicht den Unterschied zwischen dem Rückgabewert eines Programms und seiner Ausgabe.
int main() { cout << 1234; // Ausgabe "1234" return 5678; // Rückgabe 5678 }
oder auch:
int main() { cout << "Hallo"; // Ausgabe "Hallo" }
Spätestens bei letzterem sollte dir auffallen, dass das wohl kaum in einem int gespeichert werden kann.
An die Ausgabe eines Unterprogramms kannst du mit system nicht kommen (oder nur mit umständlichen Hacks). Die übliche Art und Weise dies zu erreichen (unter Linux-artigen Systemen) ist eine Kombination von fork, exec und Pipes. Hier in diesem Fall ist wohl die Funktion man: popen angesagt, die eine vorgefertigte Kombination dieser Konzepte darstellt für eben den Fall, den du beschreibst (Aufruf eines einfachen Kommandos und Rückgabe der Ausgabe), weil dieser recht häufig vorkommt.
Die ganzen Linux-Systemkommandos sind leider allesamt mit C-Schnittstellen ausgestattet. Wenn du das zurück gegebene FILE-Objekt in einem C++-Stream haben möchtest, sind ein paar Verrenkungen nötig. Es gibt meines Wissens nach aber schon einen fertigen Wrapper in der Boost-Bibliothek für diesen Zweck.
PS: stdlib.h heißt cstdlib in C++.
PPS: Um die Mausposition zu erhalten gibt es wesentlich bessere Methoden als die Auswertung eines Shellkommandos.
-
Ich werde versuchen die Antworten umzusetzen...
PPS: Um die Mausposition zu erhalten gibt es wesentlich bessere Methoden als die Auswertung eines Shellkommandos.
ein Beispiel wäre reitzend...
Nach dem ich alle Dokumentationen durchgelesen und sämtliche befehle verinnerlicht habe werde ich dies Thema als geschlossen markieren, außer ich habe noch etwaige fragen.
Und nochmals danke für die vielen, umfangreichen und vor allem schnellen Antworten.
-
Sir Hermann schrieb:
Ich werde versuchen die Antworten umzusetzen...
PPS: Um die Mausposition zu erhalten gibt es wesentlich bessere Methoden als die Auswertung eines Shellkommandos.
ein Beispiel wäre reitzend...
-
-
SeppJ schrieb:
Sir Hermann schrieb:
ein Beispiel wäre reitzend...
Swordfish schrieb:
Zumindest reitzender als die Xlib ...
-
system
oderpopen
ist fast immer die falsche Lösung. Sie sind sehr ineffizient. Schliesslich wird da ein Prozess gestartet, was zu hunderten von Systemaufrufen führt. In Deinem Fall sind es sogar insgesamt 4 Prozesse. Nämlich einmalxdtool
, zwei malcut
und eine shell, die die|
-Zeichen interpretiert. Oft kommt nochmal eine weitere Ineffizienz, da die Ausgabe erst mal geparst werden muss.So nebenbei sind sie auch noch Fehleranfällig, da die Fehlererkennung sehr eingeschränkt ist. Wenn
system
einen Wert ungleich 0 zurück liefert, weist Du nicht, was schief gelaufen ist.Also sollte man sich schon ein wenig Mühe machen, die entsprechenden API-Aufrufe heraus zu finden. Das ist in der Regel auch gar nicht so schwer, wenn man es ein paar mal gemacht hat. Hilfreich ist hier übrigens häufig das Tool
strace
welches die Systemaufrufe eines Prozesses anzeigt. Hätte hier zwar nicht geholfen, aber bei solchen Sachen wiels
oderifconfig
erleichtert das Tool die Suche.