c++: Array mit struct => ich steh auf dem Schlauch

  • Hallo Jungs,


    Ich steh auf dem Schlauch: Hab nun schon Monate nix mehr mit C++ gemacht, nun knete ich gerad etwas für den ESP8266 / Arduino zusammen:


    liefert mit dem gcc:


    Code
    g++    -c -g -MMD -MP -MF "build/Debug/GNU-Linux/TestArrayWithStruct.o.d" -o build/Debug/GNU-Linux/TestArrayWithStruct.o TestArrayWithStruct.cc
    TestArrayWithStruct.cc:18:1: error: ‘mbusData’ does not name a type
     mbusData[0] = {"Voltage", 3, 2,"V"};
     ^


    Ich knete da schon den halben Nachmittag dran herum...


    Was mach ich da falsch?

  • Hallo Jungs,

    und Mädels :stumm:


    Was mach ich da falsch?

    Zu viel Knete :lol:


    Mal im Ernst: https://forum.arduino.cc/index…80086.msg604973#msg604973


    Also:

    C
    #define MAX_KANALNAME 40
    #define MAX_UNITLENGTH 8
    typedef struct {
    char kanalName[MAX_KANALNAME];
    int port;
    int digits;
    char unit[MAX_UNITLENGTH];
    } mbusDataStrct;
    mbusDataStrct mbusData[30];
    mbusData[0] = {"Voltage", 3, 2,"V"};

    oder

    C
    #define MAX_KANALNAME 40
    #define MAX_UNITLENGTH 8
    struct mbusDataStrct {
    char kanalName[MAX_KANALNAME];
    int port;
    int digits;
    char unit[MAX_UNITLENGTH];
    };
    struct mbusDataStrct mbusData[30];
    mbusData[0] = {"Voltage", 3, 2,"V"};

    (ungetestet, ich habe ja von C eher wenig Ahnung, kann aber suchen)

  • C
    #define MAX_KANALNAME 40
    #define MAX_UNITLENGTH 8
    typedef struct {
    char kanalName[MAX_KANALNAME];
    int port;
    int digits;
    char unit[MAX_UNITLENGTH];
    } mbusDataStrct;
    mbusDataStrct mbusData[30];
    mbusData[0] = {"Voltage", 3, 2,"V"};

    oder

    C
    #define MAX_KANALNAME 40
    #define MAX_UNITLENGTH 8
    struct mbusDataStrct {
    char kanalName[MAX_KANALNAME];
    int port;
    int digits;
    char unit[MAX_UNITLENGTH];
    };
    struct mbusDataStrct mbusData[30];
    mbusData[0] = {"Voltage", 3, 2,"V"};

    (ungetestet, ich habe ja von C eher wenig Ahnung, kann aber suchen)

    Nope :-(


    Beide Varianten liefern letztlich den gleichen Fehler....


    Code
    TestArrayWithStruct.cc:18:1: error: ‘mbusData’ does not name a type
    mbusData[0] = {"bla", 3, 2,"V"};
    ^

    :conf::conf::conf:

  • Und was meint der Compiler dazu:


    Code
    #define MAX_KANALNAME 40
    #define MAX_UNITLENGTH 8
    typedef struct {
    char kanalName[MAX_KANALNAME];
    int port;
    int digits;
    char unit[MAX_UNITLENGTH];
    } mbusDataStrct;
    mbusDataStrct mbusData[30] = { {"Voltage", 3, 2,"V"} } ;
  • nur so gehts


    Code
    mbusDataStrct mbusData[30];
    strcpy(mbusData[0].kanalName, "Voltage");
    strcpy(mbusData[0].unit, "V");
    mbusData[0].port = 3;
    mbusData[0].digits = 2;

    geschweifte Klammern als Array Zuweisung darf man nur als statisch const erstmalig und einmalig einzeln im Quellcode haben das klappt nur bei der Erstinitialisierung mit Array of char, nicht für struct soweit meine bescheidenen Kenntnisse reichen


    den Code den ich zeige der wurde soeben getestet klappt

    lasst die PIs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Tell : ja, das hab ich jetzt so drin

    (hatte es dann gestern auch gefunden, im Prinzip reicht es mir, weil ich dort quasi einen "Dictionary" - ähnlichen, konstanten Wertepool benötige.)


    jar:

    Damit hatte ich angefangen und bin gescheitert (was ich NICHT verstehe, weil der Code genau so gehen sollte(!):

    Das Problem ist, dass der Compiler Zeile 1 (bei dir) macht, jedoch dann mit der im Ursprungsbeitrag von mir gezeigten FM abbricht.


    Die darauffolgenden strcpy - Befehle hat der Compiler gar nicht erreicht,


    Ich untersuche das heute Abend weiter (und melde mich dann wieder).


    Hier habe ich nur Windows-Büchsen und C#:

    Das Zeug in C# einzukippen bringt nix... die Visual Studio IDE pampert ja alles mögliche...


    Edit:

    jar: womit hast du compiliert? und unter welchem OS ?

  • Und was meint der Compiler dazu:

    funktioniert, nur werden alle 30 gleich initialisiert?

    ist das sinnvoll?


    das klappt jedenfalls nicht

    Code
    mbusDataStrct mbusData[30] = { {"Voltage", 3, 2,"V"} } ;
    // erste Zeile: "mbusDataStrct mbusData[30] = { {"Voltage", 3, 2,"V"} } ;"
    // klappt, weiteres klappt nicht:
    mbusData[0] = {"Voltage", 3, 2,"V"};
    mbusData[1] = {"Voltage", 4, 5,"V"};

    lasst die PIs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • funktioniert, nur werden alle 30 gleich initialisiert?

    ist das sinnvoll?

    Durchaus.


    Es soll eine (konstante) Liste von Strukturen werden, welche die Parameter der ModBus-Datenpunkte eines Smart-Meters beinhaltet

    (Mal konkret den Sinn "vons janze" beschrieben.)


    Ursprünglich wollte ich den Code im ESP8266 ganz dünn halten und die Daten für die einzelnen Smartmeter per WLAN kurz vor der Messung zuführen:

    Am angeschlossenen RS485-ModBus sind mehrere Geräte (Smartmeter unterschiedlicher Bauart) angeschlossen, welche ich ursprünglich alle mit einem ESP nacheinander auslesen wollte...

    Und um flexibel zu sein, sollte vom zentralen Daten-Broker das ModBus-Profil jeweils passend zum auszulesenden Gerät geschickt werden.


    Ich mach es jetzt anders: Jedes SM bekommt SEINEN ESP...

  • jar: nur werden alle 30 gleich initialisiert?

    Nein, nur der erste.


    Zentris: Das Problem ist, dass der Compiler Zeile 1 (bei dir) macht, jedoch dann mit der im Ursprungsbeitrag von mir gezeigten FM abbricht.

    Der Code von jar funktioniert, aber er gehoert in eine Funktion:


  • Tell : Ok, das teste ich heute Abend !


    Könnte wirklich das Problem sein, dass ich die Initialisierung "zu früh" machen wollte...


    Mein Code ist aktuell noch sehr rudimentär... (Start war vor ca. 1 Woche)

    Ich baue das modulweise auf und klöpple das erst nach und nach zusammen...

  • Es sieht danach aus, dass Du nicht den kompletten Quellcode gepostet hast. Im Post #1 hat Dein Quellcode 12 Zeilen aber die Compiler-Meldung bezieht sich auf Zeile 18. Da passt was nicht zusammen. Daher mein Vorschlag, dass Du mal den kompletten Quellcode hier postet. Den kann man dann herunterladen und durch den eigenen Compiler schicken.

    Mein Github-Repository ist hier zu finden.