Wie zeichnet man Daten mit einem C-Programm?

Lesezeit: 6 Minuten

Benutzer-Avatar
Verrücktes Pferd

Ich bin Maschinenbauingenieur und habe nur begrenzte Kenntnisse in der C-Programmierung. Ich habe Code geschrieben, um Simulationen durchzuführen, und ich möchte die Simulationsergebnisse visualisieren. Im Moment benutze ich Dev-C für das Schreiben meiner Codes. Mit fopen und fprintf Befehle erzeuge ich a .dat Datei, die die Ergebnisse enthält. Dann öffne ich GNUPLOT Programm und importiere meine .dat Datei zum Plotten der Ergebnisse. Das kostet Zeit und ich muss bis zum Ende der Simulation warten. Gibt es eine einfache Möglichkeit, meinen Plotter mit zu verbinden? Dev-C, also beginnt mein Plotter während der Simulation mit dem Plotten von Daten? Irgendeine Bibliothek oder etc. ?

  • Haben Sie Daten zum Plotten, wenn die Simulation nicht durchgeführt wird?

    – Jakob Schwarz

    14. Januar 2013 um 2:34 Uhr

  • Was genau braucht Zeit? Manuell ausführen gnuplot und Importieren der Daten? Oder tut gnuplot sich viel Zeit nehmen, es zu plotten? Wenn es das erste ist, können Sie es leicht durch Ausführen loswerden gnuplot vom Simulator selbst. zB in POSIX-likes gibt es die exec Funktion.

    – ArjunShankar

    14. Januar 2013 um 2:38 Uhr


  • Ich frage mich, ob Sie nicht eine Pipe anstelle einer Datei verwenden könnten.

    – Heiße Licks

    14. Januar 2013 um 3:14 Uhr

  • Wie ich weiß, müssen bei so beliebten Plotbibliotheken wie gnuplot und mathGL alle Daten vor dem Plotten bereit sein.

    – Eddy_Em

    14. Januar 2013 um 5:58 Uhr

  • Hallo zusammen, danke für die Antwort. Ich gebe schnelle Auskunft. Was Zeit kostet, ist jedes Mal, die gnuplot-Befehle manuell zu schreiben. Durch einige Befehle, die ich in meinen C-Programmen geschrieben habe, möchte ich, dass gnuplot meine Daten automatisch zeichnet. Da es schwer ist, ist es nicht wirklich wichtig, ob während oder am Ende der Simulation … Da die anderen Dinge, die ich hier lese, arbeite ich am “_popen” -Befehl. Aber irgendwie sagt das Programm durch: “popen undeclared (first use in this function)”. (Ich verwende win7 und habe #include hinzugefügt) Irgendwelche Ideen?

    – Verrücktes Pferd

    20. Januar 2013 um 3:32 Uhr

Da Sie gnuplot bereits kennen, ist es am einfachsten, einfach gnuplot aus Ihrem Programm aufzurufen und die Daten dorthin zu leiten:

FILE *gnuplot = popen("gnuplot", "w");
fprintf(gnuplot, "plot '-'\n");
for (i = 0; i < count; i++)
    fprintf(gnuplot, "%g %g\n", x[i], y[i]);
fprintf(gnuplot, "e\n");
fflush(gnuplot);

  • Ich habe dieses in einer Unix-Umgebung und bei der Verwendung von Cygwin unter Windows verwendet. Bei mir hat es immer funktioniert :).

    – Mgilson

    14. Januar 2013 um 13:43 Uhr

  • @Edgar Hallo Edgar, danke für die Antwort. Gnuplot aus meinem Programm aufzurufen und die Daten dorthin zu leiten, ist genau das, was ich tun möchte. Ich habe Ihren Code in mein Programm eingefügt (natürlich habe ich auch X geändert[i] Andy[i]). Aber ich habe diesen Kompilierungsfehler erhalten: “‘popen’ undecleared (first use in this function). Ich verwende Win 7, haben Sie eine Idee, warum ich diesen Fehler bekommen habe? Danke.

    – Verrücktes Pferd

    20. Januar 2013 um 2:37 Uhr

  • Da popen() POSIX ist, können Sie es unter Windows mit einem Unterstrich versuchen: _popen().

    – Edgar Bonett

    21. Januar 2013 um 17:48 Uhr

  • @Edgar, das geht auch nicht. Der Code, den Sie geschrieben haben, scheint der einfachste Ansatz für mein Ziel zu sein, aber ich kann ihn nicht kompilieren 🙂

    – Verrücktes Pferd

    23. Januar 2013 um 14:33 Uhr

  • Vorangestellt set nokey; zu plotten entfernt die lästige Legende.

    – Sitilge

    23. März 2017 um 9:15 Uhr


OK, eine Lösung, da Sie in eine Datei schreiben, wäre, einfach eine zu erstellen system() rufen Sie auf, wenn Sie in die Datei schreiben, und rufen Sie gnuplot auf.

Aber das bedeutet, dass Sie den Dateinamen jedes Mal ändern sollten, aber ich fürchte, wenn Sie das tun, wird es nicht richtig aussehen, da Sie jedes Mal kleine Datenmengen senden.

http://www.gnu.org/software/libc/manual/html_node/System-Calls.html

Ich habe gnuplot noch nie benutzt, aber wenn Sie sich diese Seite ansehen (http://gnuplot-tricks.blogspot.com/) finden Sie möglicherweise einige Tricks, mit denen dies gut funktioniert.

Aber ich denke, wenn Sie nicht alles selbst planen und gnuplot überspringen, müssen Sie möglicherweise einfach warten, wie Sie sind.

Möglicherweise hilft Ihnen die C-Schnittstelle zu gnuplot:

http://ndevilla.free.fr/gnuplot/

Ich habe verwendet PLPlot zum Plotten von C und fand es sowohl effektiv als auch einfach. Es ist plattformübergreifend, Open Source und unterstützt eine Vielzahl von Plot-Funktionen. Ich würde empfehlen, einen Blick auf die Beispiele zu werfen, um loszulegen.

pbPlots ist sehr einfach zu bedienen und funktioniert mit allen C-Compilern.

Laden Sie pbPlots.c/h und supportLib.c/h von der github-Seite und fügen Sie sie in Ihren Build ein.

Hier ist ein vollständiges Beispiel, das einen Plot in einer PNG-Datei erzeugt.

#include "pbPlots.h"
#include "supportLib.h"

int main(){

    double x [] = {-1, 0, 1, 2, 3, 4, 5, 6};
    double y [] = {-5, -4, -3, -2, 1, 0, 1, 2};

    RGBABitmapImageReference *imageRef = CreateRGBABitmapImageReference();

    DrawScatterPlot(imageRef, 600, 400, x, 8, y, 8);

    size_t length;
    double *pngData = ConvertToPNG(&length, imageRef->image);
    WriteToFile(pngData, length, "plot.png");

    return 0;
 }

das generierte Diagramm

Es stehen noch viel mehr Optionen zur Verfügung, diese sind auf der Github-Seite beschrieben.

Ich habe mich ein wenig umgesehen, um zu sehen, was andere Leute in Bezug auf das Echtzeit-Plotting in gnuplot getan haben, und habe Folgendes gefunden:

http://users.softlab.ntua.gr/~ttsiod/gnuplotStreaming.html

Es gibt ein kleines Perl-Skript, das das Plotten steuern kann, und Sie geben einfach Ihre Informationen ein.

Da Ihre Daten in eine Datei geschrieben werden, möchten Sie dies vielleicht tun tail -f yourdata.dat und leiten Sie das in den Echtzeit-Plotter.

Da Sie die stdio-Dateiaufrufe verwenden, müssen Sie außerdem regelmäßig leeren (durch Aufrufen von fflush)

Offensichtlich läuft Ihre Simulation im Hintergrund oder in einer anderen Shell. So können Sie jederzeit aus dem Plot ausbrechen, ohne die Simulation zu unterbrechen.

Hoffe, das nützt dir etwas.

  • Hallo Paddy, danke für die Antwort. Ich habe die von Ihnen verlinkte Seite überprüft. Eigentlich habe ich diese Methode (Vorbereitung von Make-Datei, Bash-Datei) während meiner Masterarbeit in einem Unternehmen verwendet. Dort haben wir Linux verwendet und die Programme wurden alle von der IT festgelegt. Jetzt verwende ich auf meinem PC Windows, also muss ich dieses Mal alles (mit meinen geringen Kenntnissen) für die Windows-Plattform lernen. Gibt es überhaupt, diese Dinge in Windows zu tun?

    – Verrücktes Pferd

    20. Januar 2013 um 2:57 Uhr

  • Der vielversprechendste Weg ist die Installation von Cygwin, aber Sie könnten sich an der Installation von Perl für Windows versuchen. Es gibt eine portierte Version. Es ist schön, wenn Sie sich an die Tools und Methoden halten können, die Sie kennen, anstatt ein ganz neues (im Fall von Windows verkrüppeltes) Toolset zu lernen.

    – Reisfeld

    20. Januar 2013 um 5:41 Uhr

Für wissenschaftliche Zwecke gibt es eine umfangreiche Bibliothek namens DISLIN. Auch in Fortran-Sprache verfügbar.

Sie können Beispiele auf der offiziellen Website überprüfen.

Sie können es kostenlos in erhalten DISLIN-Homepage

  • Hallo Paddy, danke für die Antwort. Ich habe die von Ihnen verlinkte Seite überprüft. Eigentlich habe ich diese Methode (Vorbereitung von Make-Datei, Bash-Datei) während meiner Masterarbeit in einem Unternehmen verwendet. Dort haben wir Linux verwendet und die Programme wurden alle von der IT festgelegt. Jetzt verwende ich auf meinem PC Windows, also muss ich dieses Mal alles (mit meinen geringen Kenntnissen) für die Windows-Plattform lernen. Gibt es überhaupt, diese Dinge in Windows zu tun?

    – Verrücktes Pferd

    20. Januar 2013 um 2:57 Uhr

  • Der vielversprechendste Weg ist die Installation von Cygwin, aber Sie könnten sich an der Installation von Perl für Windows versuchen. Es gibt eine portierte Version. Es ist schön, wenn Sie sich an die Tools und Methoden halten können, die Sie kennen, anstatt ein ganz neues (im Fall von Windows verkrüppeltes) Toolset zu lernen.

    – Reisfeld

    20. Januar 2013 um 5:41 Uhr

1363360cookie-checkWie zeichnet man Daten mit einem C-Programm?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy