Anfängerproblem: Umgang mit Strings (String vs. String[50]) / return aus Funktion
-
Moin,
programmiere mit Arduino IDE.
Ich möchte einer Funktion einen Zahlenwert übergeben und einen (unterschiedlich großen) String (Buchstaben) zurückbekommen.Es gelingt mir, innerhalb der Funktion das Ergebnis in einem String[50] zusammenzubauen, aber die Übergabe (return) klappt nicht, weil angeblich die Datentypen nicht zusammenpassen (error: could not convert 'strErg' from 'String [50]' to 'String')
Hier die (bis zur Sinnlosigkeit!!!) gestrippte Funktion zur Veranschaulichung:
String FNum2Pulscode(int intNum){ String strErg[50]; strErg[1] = "L"; strErg[2] = "A"; return strErg; }
Zuvor hatte ich versucht, den Ergebnisstring ausgehend von einer leeren Hülle Zeichen um Zeichen durch Konkatenieren (+) aufzubauen, das hat aber auch nicht geklappt, darum habe ich die Variante gewählt, in der ich jedes Zeichen einzeln adressieren kann. Jetzt bekomme ich zwar mein Ergebnis aufgebaut, kann es aber nicht zurückgeben.
Mir scheint, ich habe das Konzept String hier noch nicht verstanden. Auf jeden Fall ist es ganz anders als in z.B. VBA.
-
Ich kenne mich zwar mit Arduino IDE nicht aus und kann das auch nicht testen, aber meinst Du nicht sowas:
String FNum2Pulscode(int intNum){ String strErg = "LA"; return strErg; }
?
-
std::string FNum2Pulscode(int num) { std::string result; result += 'L'; result += 'A'; return result; }
-
PS:
String
mit großem S ist wohl eine eigene Arduino IDE Klasse, die man aber tunlichst nicht nutzen sollte.
-
-
@zeropage Danke für Deine Antwort. Im Prinzip ja, nur dass ich das Ergebnis aus Einzelergebnissen (Einzelbuchstaben) zusammensetzen muss, was mein Konvertierungsproblem nur verlagert.
Und "string" wird bei mir gar nicht akzeptiert, aber möglicherweise liegt da auch irgendwo (ein Teil) des Problems. Ich verstehe noch viel zu wenig, welche Standardklassen und -bibliotheken "einfach da" sind, und welche ich wie auch immer einbinden muss.
-
@Swordfish Aha, ich habe meine Info von hier:
https://forum.arduino.cc/t/strings-und-stringverarbeitung/116194
-
@Swordfish Danke für Deine Antwort. Das ist im Prinzip der Ansatz, den ich zunächst versucht hatte. Ich werde mir mal ansehen, was es mit std:: auf sich hat, und inwiefern das mein Ergebnis verändert.
-
@N00bzilla Dann mach das, wie @Swordfish vorgeschlagen. Vorher noch ein
#include <string>
natürlich.
-
Zwischenstand: Der Ansatz von @Swordfish kompiliert zumindest (das ist gut), aber ich kann meine neuen std::string nicht einmal im seriellen Monitor ausgeben, weil ich die nicht in ein String-Format konvertiert bekomme, mit dem die Umgebung klarkommt.
Das ist wohl nicht unbedingt die einsteigerfreundlichste Ecke aus dem C++-Universum, in der ich da gelandet bin...
Werde eine Lösung posten, wenn ich sie gefunden habe, bin für weitere Tipps zu haben. Jetzt erstmal gute Nacht!
-
Wenn Du einen
std::string
namensfoo
hast kannst Du die Methodefoo.c_str()
benutzen um davon einchar const[]
, also ein Array aus konstantenchar
s zu bekommen.
-
@zeropage sagte in Anfängerproblem: Umgang mit Strings (String vs. String[50]) / return aus Funktion:
PS:
String
mit großem S ist wohl eine eigene Arduino IDE Klasse, die man aber tunlichst nicht nutzen sollte.Die Arduino-Umgebung ist auch für kleine Mikrocontroller ((sehr) wenig RAM und ROM)
Darum gibt es dort die etwas sparsamere String-Klasse.Dieser String kann mehr als ein C-String (char Array) aber auch weniger als std::string.
Man kann Teilstrings auch einzeln ausgeben/übertragen.
Mitprint("Hallo"); print(" Welt!\n");
komt auch Hallo Welt! raus.
PS: Die Methoden der String-Klasse: https://www.arduino.cc/reference/de/language/variables/data-types/stringobject/
-
@N00bzilla sagte in Anfängerproblem: Umgang mit Strings (String vs. String[50]) / return aus Funktion:
Zwischenstand: Der Ansatz von @Swordfish kompiliert zumindest (das ist gut),
Der Ansatz funktioniert genauso mit String.
Das ist wohl nicht unbedingt die einsteigerfreundlichste Ecke aus dem C++-Universum, in der ich da gelandet bin...
Eine sehr komplexe Sprache (C++) auf einem eingeschränktem System (Mikrocontroller) muss Abstriche machen.
Du sollst dort auch nicht C++ nutzen (kannst es aber)Das System ist einsteigerfreundlich, darum versteckt es jede Menge vor dir.
Du must ja nur setup() und loop() programmieren. Wie die aufgerufen werden und was außerhalb von loop() passiert weißt du nicht.Und mit dem String[50] hast du irgendwie noch C mit rein gebracht.
-
@DirkB Danke auch Dir für Deinen Beitrag.
@ alle
Heute habe ich mich mal wieder rangesetzt, und inzwischen verhält sich die IDE komplett anders. Ich habe wieder alles auf Standard-String zurückgerüstet, und auf einmal läuft der Code, der bislang nur Abstürze verursacht hat.
Das ist offensichtlich eine Komponente, die man ebenfalls berücksichtigen muss in dieser, wie Dirk richtig schreibt, hardwareseitig sehr eingeschränkten Welt. Jetzt komme ich also weiter...Lösung: IDE neu starten
Hilfreiche Doku: Die Methoden der String-Klasse: ttps://www.arduino.cc/reference/de/language/variables/data-types/stringobject/
-
Folgende Lösung habe ich noch gefunden, um Daten aus einem String-Array in einen String zu bekommen.
Im Array (hier gstrCode) ist jeweils nur ein Zeichen gespeichert (adressiert über die 0).
Zusammenfassen in einen String dann wie folgt:gstrNachrichtKomplett = gstrNachrichtKomplett + gstrCode[intSum].charAt(0);
-
@N00bzilla Warum wird da ein String-Array benutzt?
-
@DirkB Die Antwort findest Du im Ausgangspost:
"Zuvor hatte ich versucht, den Ergebnisstring ausgehend von einer leeren Hülle Zeichen um Zeichen durch Konkatenieren (+) aufzubauen, das hat aber auch nicht geklappt, darum habe ich die Variante gewählt, in der ich jedes Zeichen einzeln adressieren kann. Jetzt bekomme ich zwar mein Ergebnis aufgebaut, kann es aber nicht zurückgeben."Das war zu dem Zeitpunkt die einzige Variante, die ich lauffähig bekommen habe. Vielleicht kann ich das redesignen, wenn ich etwas mehr Trittsicherheit erlangt habe, denn vermutlich wird aktuell unheimlich viel Speicher belegt für nichts. Aber das habe ich auch noch nicht durchdrungen, und Speicher ist im Moment noch kein Problem. Erstmal soll es funktionieren...
-
Dann solltest du uns den Code dazu zeigen - und genau schreiben, was nicht geklappt hat.
-
@N00bzilla Du meinst, ein String-Array sei die Lösung und versuchst jetzt Alles, das zum laufen zu bekommen.
Das String-Array ist aber schon der falsche Weg. (soweit die Salamischeiben das hergeben)
-
@DirkB Falsch wäre er, wenn er nicht funktionieren würde.
Aber er ist ganz sicher nicht elegant oder ressourcenschonend...@Th69 Was ich alles probiert habe, weiß ich nicht mehr, aber ich poste gerne das Ergebnis, wenn ich eine "schöne" Variante gefunden habe. Dann können die Cracks immer noch erklären, was man daran verbessern kann.