Die Strings sollen nur als Argumente übergeben und in der Funktion nicht
verändert werden. Wie macht mans richtig?
a) alle Strings am Anfang deklarieren und belegen vor dem
Funktionsaufruf statt im Kopf?
b) char strName[100], char strSend[100] usw. im Funktionskopf?
c) irgendwie pointer übergeben?
Ich will eigentlich nur die Strings in der Funktion weiter verarbeiten
können..
Zeiger auf C Strings übergeben.
Überhaupt, das ganze Programm auf Strings im C Stil umstellen.
ci schrieb:> Dann habe ich gelesen, dass die String-Klasse großer Mist> ist:
Naja...
Randy B. schrieb:> ci schrieb:>> Wie macht mans richtig?>> Erst mal ein C++-Buch zur Hand nehmen.
Genau. Schau Dir mal Parameterübergabe per Referenz an, ggf. Move-ctor
und Move-op= sowie std::string_view.
Randy B. schrieb:> Da drin wird auch noch strcpy(...) statt strncpy(...) und generell der> Umstieg auf C-Strings empfohlen. Würde sagen: vergiss den Artikel!
Oh ha!
Randy B. schrieb:> Würde sagen: vergiss den Artikel!
Aber meine Strings werden verändert im Programmlauf, ohne dass ich das
will - zumindest probieren kann ich es ja..
ci schrieb:> ich habe am Programmanfang geschrieben> char strTmp[100] = "";> strcpy(strTmp, "jetzt steht was drin");>> kann ich dann in der Funktion schreiben> void irgendwas(*strTmp) { strcpy(strLokal, strTmp); }>> um strTmp in strLocal zu kopieren?
Kauf Dir ein C-Buch.
Wilhelm M. schrieb:> sowie std::string_view.AVR?
Dann:
Nix STD Lib.
Auch nix STL
Wilhelm M. schrieb:> Schau Dir mal Parameterübergabe per Referenz an
Richtig.
Würde Falle des Beispiels im Eingangsposting einen Haufen Gehampel im
Hintergrund einsparen.
Mein Rat:
Bevor irgendwelche String Klassen verurteilt werden, sollte man die
Sprache lernen, welche mal da verwendet.
Im Falle Arduino, ist das in erster Linie C++.
Vorher zu Urteilen, ist unter anderem mit dem "Dunning Kruger Effekt"
verwandt.
Arduino Fanboy D. schrieb:> Wilhelm M. schrieb:>> sowie std::string_view.>> AVR?> Dann:> Nix STD Lib.> Auch nix STL
STL ist Geschichte.
Oh man; string_view ist doch wirklich nicht schwer. Zudem,: stdlibc++
ist OSS.
Arduino Fanboy D. schrieb:> AVR?
Also es ist für Arduino Nano = nicht so viel Ram.
Ich glaub ich spare mir den ganzen Mist und mache alle Arrays global,
dann brauch ich auch nur 1x Speicher dafür.
Habe gerade gelesen, dass ich je nach Übergabe auch noch die Länge
mitgeben müsste, damit ich in der Funktion dann die Länge wieder habe -
tut mir leid, aber das ist mir für mein mini-Programm zu akademisch.
Bevor ich das gelernt hab bin ich fertig.
ci schrieb:> Ich glaub ich spare mir den ganzen Mist und mache alle Arrays global,> dann brauch ich auch nur 1x Speicher dafür.
Auf µC durchaus ein probates Mittel.
ci schrieb:> Habe gerade gelesen, dass ich je nach Übergabe auch noch die Länge> mitgeben müsste,
In deinem C++ kannst du die Arraygröße ermitteln.
In C musst du sie wohl übergeben.
Vorsicht:
Du vermischt Äpfel mit Birnen.
Man kann dem Compiler auch ein const für Parameter mitgeben, wenn diese
in der Funktion nicht verändert werden. Dann kann der Compiler
optimieren.
Ein gutes Buch zu C++ würde evtl helfen.
PittyJ schrieb:> Man kann dem Compiler auch ein const für Parameter mitgeben, wenn diese> in der Funktion nicht verändert werden. Dann kann der Compiler> optimieren.
s.o.
PittyJ schrieb:> Ein gutes Buch zu C++ würde evtl helfen.
s.o.
PittyJ schrieb:> Ein gutes Buch zu C++ würde evtl helfen.
das sagen Viele und ich verstehe das auch, nur
welches Buch ist gut?
Früher kannte ich einige Gute aus dem Sybex Verlag unter C
aber ich hatte auch viele Schrottbücher gekauft für ca. 1000 DM, das
muss ich nicht in € wiederholen.
Joachim B. schrieb:> welches Buch ist gut?
Hat auch mit den Zielen/Vorwissen zu tun.
Für den Einstig in C++ halte ich dieses für recht geeignet.
http://www.cppbuch.de/
ca 50% Sprachgrundlagen
ca 50% befassen sich mit der STL und PC Anwendungen
Randy B. schrieb:> Da drin wird auch noch strcpy(...) statt strncpy(...) und generell der> Umstieg auf C-Strings empfohlen.
da wird gesagt das es die strn Versionen gibt mit denen man
Pufferüberläufe verhindern kann:
1
Now, when it comes to buffer overruns, there is a special variation of all the string handling functions available. Every C string function has an n variant available, for instance strcpy has strncpy. These variations will perform on up to n characters. That allows you to limit the maximum number of characters you will work with, and thus help you to prevent buffer overruns from existing.
Ich habe Arduino Code gesehen in dem beim seriellen Empfang Zeichen für
Zeichen an einen String gehangen wurde. Das führt mit jedem Zeichen zu
einem realloc(), ist also äusserst ungeschickt.
Ich finde den Luxus der std::string gut, man muss nur üben wie man damit
umgeht und mal prüfen was es kostet. Dazu kann man auch gut
Onlinecompiler wie https://www.onlinegdb.com/online_c_compiler benutzen.
Johannes S. schrieb:> Ich habe Arduino Code gesehen in dem beim seriellen Empfang Zeichen für> Zeichen an einen String gehangen wurde. Das führt mit jedem Zeichen zu> einem realloc(), ist also äusserst ungeschickt.
1) strcpy statt strncpy ist Blödsinn
2) Ein realloc() ist Blödsinn
Das RAM braucht man sowieso, also macht man einen statischen Buffer, mit
der maximalen Größe, die sinnvoll und machbar ist:
Arduino Fanboy D. schrieb:> Um das Problem zu mildern gibt es String::reserve(); in der Arduinowelt.
ja, man muss es nur kennen und auch benutzen :)
Ich möchte damit auch nur darauf hinweisen das es Sinn macht kritisch in
den Quellcode zu schauen. Der Luxus kann eben zu Problemen führen die
sich erst nach einiger Laufzeit bemerkbar machen. Genau das beschreibt
der Eingangs erwähnte Artikel auch.
Nun ja, auf nem Mikrocontroller mit 2kB RAM mit nem Heap zu arbeiten ist
schon mutig - wenn man da nicht genau weiß, was man tut (z.B. nen
Anfänger), fliegt einem das irgendwann um die Ohren. Selbst in den
alten Basic-Interpretern mit dynamischen Strings haben sie einen
moving-garbage-collector eingebaut, damit das funktioniert.
foobar schrieb:> Nun ja, auf nem Mikrocontroller mit 2kB RAM mit nem Heap zu arbeiten ist> schon mutig
Auf die ist das Arduino Universum aber nicht mehr beschränkt. Und für
komplexere Programme nutze ich lieber C++ Klassen, die C str Funktionen
sind potentiell sehr gefährlich und wenn dann benutze ich auch strn
Funktionen.
MS hatte sogar mal wegen der vielen Fehler in Windows Programmen die str
Funktionen 'geblockt', man musste die per Macro erst aktivieren.
foobar schrieb:> fliegt einem das irgendwann um die Ohren.
Das ist aber immer so....
Beim wilden Stochern im Nebel, kann man schon mal einen Löwen wecken
oder ein Hornissennest finden.
Es ist oft sehr hilfreich, dass man lernt/weiß, was man da tut.
Es ist ein Prozess, bis dahin. Ein evtl. recht langer.
Arduino Fanboy D. schrieb:> Joachim B. schrieb:>> danke, eben bestellt> Danke, für dein Vertrauen!> Und dann bin ich ja mal gespannt, wie dir das schmeckt.
Geiles Buch.
> Und für komplexere Programme nutze ich lieber C++ Klassen, die C str> Funktionen sind potentiell sehr gefährlich
Das geb ich zurück: C++-Strings sind unter dem Demoklesschwert eines
Out-of-Memory-Errors sehr gefährlich - bei C Strings hab ich die
Gefahren zumindest unter Kontrolle ;-) Auf großen Systemen mit (fast)
beliebig viel Speicher relativiert sich das - dafür wurden die
C++-Libraries auch ausgelegt.
Johannes S. schrieb:> die C str Funktionen> sind potentiell sehr gefährlich
wieso das denn, wer weiss was er tut bei dme funktioniert es und bei mir
immer besser :)
Johannes S. schrieb:> C++ Klassen
kann ich ja offensichtlich nicht mal in eine andere INO verschieben,
ich hänge immer noch bei LIB Nutzung Nokia von nano zu esp32
Einzeln funktioniert ja alles, beim Nano schön sauber in verschiedene
Ino, beim ESP nur wenn alles in einer ino steckt! WTH
na mal sehen vielleicht hilft das Buch
F. F. schrieb:> Geiles Buch.Arduino Fanboy D. schrieb:> http://www.cppbuch.de/
Joachim B. schrieb:> kann ich ja offensichtlich nicht mal in eine andere INO verschieben,> ich hänge immer noch bei LIB Nutzung Nokia von nano zu esp32> Einzeln funktioniert ja alles, beim Nano schön sauber in verschiedene> Ino, beim ESP nur wenn alles in einer ino steckt! WTH>> na mal sehen vielleicht hilft das Buch
Die INOs sind eine Arduino Erfindung, da wird das Buch nicht helfen. Ich
auch nicht, weil ich mbed bevorzuge :)
Aber hier ist beschrieben wie man eine Arduino Library (da dann wieder
Standard cpp/h) erstellt, das sollte helfen:
https://www.arduino.cc/en/Hacking/LibraryTutorial
Arduino Fanboy D. schrieb:> Auch wenn nicht ein einziges mal das Wort "Arduino" darin vor kommt?
So weit hatte ich das damals gar nicht gelesen. Hatte mich dann doch
erst für C entschieden.
Aber das war entweder so gut geschrieben, dass sogar ich das auf Anhieb
alles verstanden habe oder aber C++ liegt mir.
Wird sicher irgendwann, aber spätestens zur Rente (wenn ich das noch
erleben darf) durchgearbeitet.
So langsam habe ich das mit meinem Sohn in den Griff bekommen und auch
wieder Kopf und Lust zur Elektronik und Mikrocontrollern.
Wobei das dann wohl eher auf dem Computer laufen würde.
Joachim B. schrieb:> na mal sehen vielleicht hilft das Buch>> F. F. schrieb:>> Geiles Buch.>> Arduino Fanboy D. schrieb:>> http://www.cppbuch.de/
Buch ist angekommen, gebraucht
Gesamtsumme: 29,81 €
na mal sehen ob mir das hilft :)
Wilhelm M. schrieb:> Markus schrieb:>> Wilhelm:>>>STL ist Geschichte.>>>> Durch was wurde es ersetzt?>> Ist alles in die Standard-C++-Bibliothek eingeflossen:>> https://de.wikipedia.org/wiki/Standard_Template_Library
Und immer noch nicht für AVR User nutzbar.
Also ist das Problem noch NICHT Geschichte.
Vielleicht aus deiner absurd abstrakten Sicht.
Aber in meiner kleingeistigen Arduino Welt sieht das anders aus.
Arduino Fanboy D. schrieb:> Und immer noch nicht für AVR User nutzbar.
Wie schon zigmal gesagt: die Implementierung der C++-Standard-Bibliothek
des gcc oder auch clang ist OSS. Man kann da also problemlos
reinschauen. Man kann für Hobbyzwecke den Code auch einfach kopieren. Es
ist also gar kein Problem. Man holt sich das, was man braucht.
Arduino Fanboy D. schrieb:> Also ist das Problem noch NICHT Geschichte.
Das hat aber nun nichts damit zu tun, dass die STL (als Standard
template library von HP) eben Geschichte ist, weil sie schon lange nicht
mehr gepflegt wird und vollkommen in der C++-Std-Lib aufgegangen ist,
Arduino Fanboy D. schrieb:> Vielleicht aus deiner absurd abstrakten Sicht.
Wo ist der Bezug? Was hat die Entwicklungsgeschichte eines
Softwareartefaktes mit eine abstrakten Sichtweise zu tun?
Wilhelm M.
>Ist alles in die Standard-C++-Bibliothek eingeflossen:>https://de.wikipedia.org/wiki/Standard_Template_Library
Danke für den Hinweis. Mit dem Arduino Framework für den ESP32 geht
std::vector, auf dem AVR nicht. Extra für den AVR musste ich wieder
malloc verwenden.
Wilhelm M. schrieb:> weil sie schon lange nicht> mehr gepflegt wird und vollkommen in der C++-Std-Lib aufgegangen ist,
in einem anderen Thread hattest du die ETL
(https://www.etlcpp.com/home.html) verwendet.
Ich hatte das überflogen, soll ja ein Ersatz sein und gerade für
Embedded Anwendungen optimiert. Ist das ein brauchbarer Ersatz? Auf CM
kann ich die Std Lib einsetzen, von ETL hatte ich bisher nichts gelesen.
Johannes S. schrieb:> Wilhelm M. schrieb:>> weil sie schon lange nicht>> mehr gepflegt wird und vollkommen in der C++-Std-Lib aufgegangen ist,>> in einem anderen Thread hattest du die ETL> (https://www.etlcpp.com/home.html) verwendet.> Ich hatte das überflogen, soll ja ein Ersatz sein und gerade für> Embedded Anwendungen optimiert. Ist das ein brauchbarer Ersatz? Auf CM> kann ich die Std Lib einsetzen, von ETL hatte ich bisher nichts gelesen.
Ich denke, ja.
Allerdings habe ich dort keine wirkliche Erfahrung mehr mit - ist zu
lange her.
Wilhelm M. schrieb:> Arduino Fanboy D. schrieb:>> Ich meinte eher "abgehoben".>> Nochmal: was hat diese Geschichtsbetrachtung mit Abgehobenheit zu tun?
Ich weiß, du darfst Sinn verzerrend zitieren, daraus eine geschichtliche
Abhandlung machen, die praktischen Gesichtspunkte unter den Tisch fallen
lassen, und mir dummen Arduino gläubigen dann einen vorwurfsvollen
Strick draus drehen.
Alles ok, weil wohl zutiefst menschlich.
Vielleicht etwas unreflektiert, aber das ist auch menschlich/üblich.
Arduino Fanboy D. schrieb:> Wilhelm M. schrieb:>> Markus schrieb:>>> Wilhelm:>>>>STL ist Geschichte.>>>>>> Durch was wurde es ersetzt?>>>> Ist alles in die Standard-C++-Bibliothek eingeflossen:>>>> https://de.wikipedia.org/wiki/Standard_Template_Library> Und immer noch nicht für AVR User nutzbar.>> Also ist das Problem noch NICHT Geschichte.> Vielleicht aus deiner absurd abstrakten Sicht.> Aber in meiner kleingeistigen Arduino Welt sieht das anders aus.
Hier ist der Anfang von Dir.
Arduino Fanboy D. schrieb:> Ich weiß, du darfst Sinn verzerrend zitieren, daraus eine geschichtliche> Abhandlung machen, die praktischen Gesichtspunkte unter den Tisch fallen> lassen, und mir dummen Arduino gläubigen dann einen vorwurfsvollen> Strick draus drehen.
Ich habe also weder sinnentstellend zitiert noch drehe ich Dir einen
Strick daraus.
Du hast lediglich nicht verstanden, was die STL ist. Und das diese
Bibliothek eben das Zeitliche gesegnet hat.
Und Du vermischt eine fehlende Implementierung mit der
Referenzbeschreibung der Standard-C++-Bib.
Wilhelm M. schrieb:> Hier ist der Anfang von Dir.
Unter Realitätsverzerrungen leidest du auch...
Interessant.
Hier ist der Anfang:
Beitrag "Re: Strings in Arduino ersetzen"
Deine verzerrte Sicht auf die Dinge.
Dann mein Einwand:
Beitrag "Re: Strings in Arduino ersetzen"
Aus dem du dann die für AVR Nutzer völlig irrelevante
Geschichtsabhandlung über die Integration der STL in die STD Lib
begonnen hast.
Wilhelm M. schrieb:> noch drehe ich Dir einen> Strick daraus.
Auch hier hast du den Sinn verzerrt!
Denn ich sprach ausdrücklich von "vorwurfsvollen".
Und die Vorwürfe und Abwertungen folgen dann promt auf dem Fuße.
Wilhelm M. schrieb:> Du hast lediglich nicht verstanden, was die STL ist. Und das diese> Bibliothek eben das Zeitliche gesegnet hat.>> Und Du vermischt eine fehlende Implementierung mit der> Referenzbeschreibung der Standard-C++-Bib.
Ahnst du jetzt, was ich mit "abgehoben" meine?
Und nein, das macht keinen Spaß mit dir.