Ungültiger Typ für ein Bitfeld



  • Hallo zusammen.
    Ich habe über Visual Studio 2019 mit Hilfe von koolplot versucht, folgenden Code zu plotten:

    #include "C:\koolplot1_2\include\koolplot.h"
    
    int main()
    {
        plotdata x(-6.0, 6.0);
        plotdata y = sin(x) + x / 5;
        plot(x, y);
        return 0;
    }
    

    Innerhalb der headerDatei PlotData.h jedoch bekomme ich mehrere Fehlermeldungen.
    Hauptsächlich geht es um die beiden Zeilen:

    double min( )const;
    double max( )const;
    

    Anhand der späteren Zeilen wie:

    static void max(const Plotdata &x, const Plotdata &y, double &xMax, double &yMax);
    

    ist mir schon klar, dass min() und max() mit zu wenig (bzw. gar keinen) Argumenten aufgerufen werden. Muss ich diese Grenzen beim Hauptcode mit angeben? Wieso muss man allgemein in einer heruntergeladenen headerDatei noch Sachen ergänzen? 😕
    Ausserdem wird bemängelt, dass für diese beiden Zeilen der falsche Typ für ein Bitfeld vorhanden ist, was sicherlich da mit einhergeht.
    Über einen Tipp würde ich mich freuen. Danke.



  • Nur so ein Bauchgefühl: Wird in deinem Programm irgendwo ein Windows-Header eingebunden? Falls ja, dann versuch es mal mit #define NOMINMAX vor diesem #include.



  • Darauf hin wird mir gesagt:

    Fehler	LNK2019	Verweis auf nicht aufgelöstes externes Symbol "_COLOR" in Funktion ""void __cdecl `dynamic initializer for 'BEIGE''(void)" (??__EBEIGE@@YAXXZ)".	
    Fehler	LNK2019	Verweis auf nicht aufgelöstes externes Symbol ""public: class Plotdata __thiscall Plotdata::operator+(class Plotdata const &)const " (??HPlotdata@@QBE?AV0@ABV0@@Z)" 
    
    

    und noch 4 weitere solche Fehler.



  • Also wurde ein Windows-Header (z.B. Windows.h) tatsächlich eingebunden und #define NOMINMAX hat das Problem gelöst?

    Im Gegensatz zu deinem vorherigen Problem, bei dem es sich um Compiler-Fehler handelte, hast du es jetzt mit Linker-Fehlern zu tun. Das ist eine andere Baustelle.

    Hast du auch die zugehörige Bibliothek in deinem Projekt gelinkt? Nur der Header reicht da nicht aus. Wenn ich mir die ZIP-Datei hier anschaue, dann befindet sich da noch eine libkoolplot.a. Das ist ein ZIP-ähnliches Archiv mit Objektdateien, die letztendlich den kompilierten Maschinencode der "Koolplot"-Bibliothek enthalten. Man muss dem Compiler (bzw. dem Linker) sagen, dass er gegen diese linken soll.

    Der Visual Studio Linker kann aber meines Wissens nicht mit diesen .a-Dateien umgehen, sondern verwendet ein eigenes Format, das üblicherweise die Endung .lib hat.

    .a-Bibliotheken sind für die GCC- oder Clang-Toolchain (unter Windows via MinGW oder MinGW-W64). Entweder du kompilierst dir die Bibliothek selbst aus dem Quellcode mit Visual Studio (könnte etwas pfriemelig werden, da das scheinbar nur ein Makefile-Projekt ist) oder du besorgst dir einen aktuellen "MinGW-w64"-Compiler um dein Programm zu bauen.



  • Zu deiner ersten Frage: ich weiß es nicht. "Gelöst" ist wahrscheinlich das falsche Wort, da nun das Problem wo anders hängst. Was definiert denn eine Windows Header Datei?
    Und ja, diese .a Datei ist nicht mit eingebunden. Jedoch habe ich MinGW bereits downgeloadet.
    Meine Frage: wo muss ich diese dazugehörige Bibliothek einbinden?
    Direkt im Visual Studio unter "Headerdatein" oder als Pfad in meinem koolplot.h?



  • Visual Studio und GCC ist ziemliches Neuland und soweit ich weiss geht das auch nur, wenn man entweder für Linux oder Android kompiliert. Man möge mich korrigieren, aber für Windows-Programme kannst du GCC unter Visual Studio nur mit Krücken benutzen, für die ich leider nicht die Muße habe, dich da durch zu führen (Makefile-Projekt oder CMake mit konfiguriertem GCC-Compiler).

    Ich kann dir aber gerne sagen, wie das in der Kommandozeile geht, wenn man den Compiler direkt aufruft:

    g++ -m32 -I<Koolplot-Include-Pfad> -L<Koolplot-Bibliothekspfad> -I<WinBGIm-Include-Pfad> -L<WinBGIm-Bibliothekspfad> dein_quellcode.cpp -lkoolplot -lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32

    Nicht getestet, aber so in etwa müsste es laufen. Welche MinGW-Version hast du heruntergeladen? Von wo? Vielleicht finde ich ja zumindest die Zeit das hier bei mal auszuprobieren.

    P.S.: Ganz schön angestaubte Software. "WinBGIm, Borland BGI Graphics emulation" eieiei... ganz schön "90er" 😉



  • Danke erstmal für deine ausführliche Antwort. Also ich hab die 32er version runtergeladen. (https://osdn.net/projects/mingw/)
    Der von dir gepostete Befehl ist aber echt lang 😩
    Ich glaub, da bin schneller, wenn ich mir Millimeterpapier schnappe und Punkt für Punkt die Funktion ausrechne und mit Bleistift aufmale.
    Ich hatte mal auf nem LINUX Computer ein Programm für meine Bachelorarbeit geschrieben mit über 2000 Zeilen. Einen einfachen Graphen mit C++ über Windows zu plotten ist für jemanden wie wie mich, dessen Computerwissen überschaubar ist, äußerst benutzerunfreundlich (sehr freundlich ausgedrückt). Ich überlege schon, die Plotdaten einfach abzuspeichern und mit Python auszulesen und zu plotten....
    C++ ist für mich zwar die einfache Programmiersprache, aber in Sachen plotten (gerade für Windows) ne Enttäuschung.
    Andersherum gefragt:
    Was würdest du denn empfehlen, wenn ich plotten will mit c++?



  • @Queiser sagte in Ungültiger Typ für ein Bitfeld:

    Danke erstmal für deine ausführliche Antwort. Also ich hab die 32er version runtergeladen. (https://osdn.net/projects/mingw/)
    Der von dir gepostete Befehl ist aber echt lang 😩
    Ich glaub, da bin schneller, wenn ich mir Millimeterpapier schnappe und Punkt für Punkt die Funktion ausrechne und mit Bleistift aufmale.

    Nein, ich glaube nicht, dass das selbst mit C++ zu machen hier der richtige Ansatz für dich ist ...

    Ich hatte mal auf nem LINUX Computer ein Programm für meine Bachelorarbeit geschrieben mit über 2000 Zeilen. Einen einfachen Graphen mit C++ über Windows zu plotten ist für jemanden wie wie mich, dessen Computerwissen überschaubar ist, äußerst benutzerunfreundlich (sehr freundlich ausgedrückt). Ich überlege schon, die Plotdaten einfach abzuspeichern und mit Python auszulesen und zu plotten....

    ... vor allem, wenn du scheinbar nur an dem Plot interessiert bist und nicht so sehr an der Programmierung dahinter.

    C++ ist für mich zwar die einfache Programmiersprache, aber in Sachen plotten (gerade für Windows) ne Enttäuschung.

    C++ ist keine Sprache, die man als Brot-und-Butter-Tool benutzt, um damit "mal schnell" was zu machen. Ganz im Gegenteil. Wenn man's programmierbar braucht, dann klingt das eher nach einem Fall für Python oder sowas mit ner passenden Plot-Bibliothek.

    Andersherum gefragt:
    Was würdest du denn empfehlen, wenn ich plotten will mit c++?

    Ich habe diesbezüglich nicht genug Erfahrung, um da was empfehlen zu können.

    Das Suchmaschinenorakel sagt mir allerdings, dass du dir vielleicht mal matplotlib für Python ansehen solltest. Gnuplot oder Matlab/Scilab könnten auch eine Lösung sein.

    P.S.: Scheint mir, dass du leztendlich doch keinen Bohrer, sondern vor allem Löcher brauchst 😉


Log in to reply