array of String Probleme beim Zugriff



  • Moin,

    eigendlich sollte ich in das Arduino-Forum posten, da warte ich aber immer noch auf die Freigabe dort posten zu dürfen......

    Da es eher ein banales Problem ist hoffe ich hier auf Hilfe.

    Ich benötige ein Array of String (Zeile33):

    char* subscribe_topic[]={"/30/SensorID", "/30/AktorID"};
    

    jetz möchte ich die Strings in einer Schleife ausgeben (Zeile 62-66):

    for (int i = 0; i < sizeof(subscribe_topic) - 1; i++){
            mqtt_client.subscribe(subscribe_topic[i]);
            Serial.print("subscribe: ");
            Serial.println(subscribe_topic[i]);
          }
    

    der Arduino Compiler meldet:

    AktSen.ino:34:55: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
    AktSen.ino:34:55: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
    AktSen_routines.ino: In function 'void start_mqtt()':
    AktSen_routines.ino:63:48: warning: iteration 2u invokes undefined behavior [-Waggressive-loop-optimizations]
    AktSen_routines.ino:62:7: note: containing loop

    Danke für eure Unterstützung
    Pf@nne



  • Stringliterale haben den Typen const char*.
    sizeof liefert die Größe in Bytes, die musst du durch die Größe eines Elementes (Zeiger) teilen, sonst läuft die Schleife zu weit.



  • Und die ersten beiden Warnungen sagen dir, daß du "const char*" für dein Array benutzen solltest.


  • Mod

    Nathan schrieb:

    Stringliterale haben den Typen const char*.

    Tatsächlich haben sie einen Arraytyp von angemessener Länge für den Inhalt. Welcher hier natürlich direkt in einen Zeiger auf den Anfang zerfällt.



  • Klasse, das erste Problem ist beseitigt, vielen Dank.
    Hätte ich auch sehen können...... 🙄

    Wie teile ich denn sizeof(subscribe_topic) durch einen Zeiger?
    bzw. wie bekomme ich die Anzahl der Element raus?

    EDIT:
    (sizeof(subscribe_topic)/sizeof(int))

    👍


  • Mod

    Pf@nne schrieb:

    Wie teile ich denn sizeof(subscribe_topic) durch einen Zeiger?

    Nicht durch einen Zeiger, sondern durch die Größe eines Zeigers.

    Oder allgemeiner, damit dein Code nicht abhängig ist von dem Typen der im Array gespeichert ist: Teile die Gesamtgröße des Arrays durch die Größe des ersten Elements.

    Oder benutze std::array, da entfällt solches Gefrickel komplett (und vor allem entfallen die ganzen Schwierigkeiten mit Arrays, die du später haben wirst, die hier noch gar nicht aufgetreten sind).

    sizeof(subscribe_topic)/sizeof(int))

    😮



  • SeppJ schrieb:

    Nathan schrieb:

    Stringliterale haben den Typen const char*.

    Tatsächlich haben sie einen Arraytyp von angemessener Länge für den Inhalt. Welcher hier natürlich direkt in einen Zeiger auf den Anfang zerfällt.

    Handy, Tippen und so 😉


Log in to reply