Probleme beim pipen von gnuplot



  • Hallo 🙂

    ich habe ein Problem beim Pipen von gnuplot und dazu folgendes demo-Programm geschrieben:

    #include <iostream>
    #include <sstream> 
    using namespace::std; 
    
    void pipeGnuplot(string filename){
    ostringstream convert; 
    
    FILE *gnuplotPipe; 
    gnuplotPipe = popen("GNUPLOT","w");
    if (gnuplotPipe==NULL){ 
    cout<<"Error opening pipe to GNU plot. Check if you have it! \n"<<endl; 
    } 
    
    convert<<"set output '"<<filename<<".eps'"«endl; 
    string setoutput=convert.str(); 
    fprintf(gnuplptPipe, setoutput.c_str());fflush(gnuplotPipe);
    
    fprintf(gnuplotPipe,"load 'plot.plt' \n"); fflush(gnuplotPipe);
    
    cout<<filename<<endl; 
    //—-Closing GNUPLOT Pipe 
    fclose(gnuplotPipe); 
    
    }
    
    int main(int argc, char **argv){ 
    
    pipeGnuplot("test1"); 
    pipeGnuplot("test2"); 
    return 1; 
    
    }
    

    plot.plt

    set terminal postscript eps enhanced color font "Helvetica,12"
    plot sin(x)
    reset
    

    Gnuplot wird einmal ordnungsgemäß ausgeführt, die datei. "test1.eps" wird erzeugt. Beim wiederholten Aufruf der pipe-Funktion werden zwar keine Fehler ausgegeben, gnuplot erstellt jedoch auch nicht die datei "test2.eps".

    Weiß jemand woran das liegen könnte?

    Danke schonmal!! 🙂

    LG


  • Mod

    Ich kann deine Probleme nicht nachvollziehen. Das ist auch kein Wunder, ist doch der Code, den du hier im Forum gepostet hast, nicht identisch mit dem Code, den du bei dir ausführst. Siehe:
    http://www.c-plusplus.net/forum/304133

    fprintf(gnuplptPipe, setoutput.c_str());
    

    Aua! Wenn man C-Funktionen benutzt, dann bitte richtig. Über geschickte Wahl des Dateinamens könnte ich so dein Programm hacken!

    Auch wenn die Frage nahe am Thema Linuxprogrammierung ist, lasse ich sie dennoch vorerst hier im Forum, bis der Threadersteller den eigentlichen Fehlercode gepostet hat, da im Vorhinein nicht klar ist, wo der Fehler nun liegt.

    PS: Weiterhin gibt popen durchaus einen Wert != NULL zurück, wenn zwar die Shell erfolgreich gestartet wurde, aber das aufgerufene Kommando nicht gefunden wurde. Deine Fehlermeldung passt also nicht zu dem Fehler, der gemeldet wird und du prüfst auch nirgends auf den Fehler, den du hier eigentlich abfangen möchtest.



  • Vielen Dank für die schnelle Antwort!

    Mein gepostetes "Beispiel- Programm" ist eine aufs Wesentliche reduzierte Version meines eigentlichen Projekts, die aber das mir unverständliche Verhalten reproduziert.
    Es gibt weder beim Kompilieren, noch beim Ausführen eine Fehlermeldung.

    Führt man das Programm aus, wird von gnuplot "test1.eps" erzeugt, anschließend wird "test1" in der konsole ausgegeben.

    "test2.eps" wird nicht erzeugt, "test2" wird nicht in die konsole geschrieben.

    Ich habe mit einer weiteren Test-Ausgabe überprüft, bis wo das Programm beim. 2. Aufruf der Funktion kommt:

    Ein "cout" vor dem ersten "fprintf" wird ausgeführt, ein "cout" danach nicht mehr beim zweiten Aufruf der Funktion.

    Vielen Dank auch für die Sicherheitswarnung, ich werde das in Zukunft beachten.


  • Mod

    gnuplotter schrieb:

    Es gibt weder beim Kompilieren,

    Doch! Was denkst du denn, woher ich sonst weiß, dass dies nicht deinem Programm entspricht? Dies ist offensichtlich im Foreneditor getippt. Vermutlich unter Entfernung des Fehlers.

    Ich habe mit einer weiteren Test-Ausgabe überprüft, bis wo das Programm beim. 2. Aufruf der Funktion kommt:

    Ein "cout" vor dem ersten "fprintf" wird ausgeführt, ein "cout" danach nicht mehr beim zweiten Aufruf der Funktion.

    Benutz doch einen Debugger. Damit weißt du viel zuverlässiger, was passiert. Bei Konsolenausgaben musst du dir Gedanken machen über eventuelle Puffer oder um Umordnungen durch den Compiler (wobei er ein fprintf nicht an einem cout vorbeiziehen darf aber es geht ums Prinzip).


Anmelden zum Antworten