Gast
#5660625
In C/C++ kriege ich keine einfachen Stringverknüpfungen hin. Bin Laie. Dachte aber, es geht so wie in anderen Sprachen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Auch mit "&" geht es nicht. Für einen Tipp danke ich.
|
Anzeige
|
Stringverknüpfung C/C++
Gast
#5660625
In C/C++ kriege ich keine einfachen Stringverknüpfungen hin. Bin Laie. Dachte aber, es geht so wie in anderen Sprachen:
Auch mit "&" geht es nicht. Für einen Tipp danke ich. Boa Constructor schrieb: > In C/C++ kriege ich keine einfachen Stringverknüpfungen hin. > > Bin Laie. Dachte aber, es geht so wie in anderen Sprachen: Mit std::string geht das. Die "" sind in C oder C++ keine Strings, sondern char arrays und etwas eigen. Du musst eine Funktion wie strcat benutzen und dich zudem um das Reservieren neuen Speichers kümmern. > Serial.println("Boa" + "Constructor");
std::string hat den operator +:
z.B.
Serial.println(std::string("Boa") + "Constructor");
...falls die Funktion std::string als Argument akzeptiert.
Ansonsten:
(std::string("Boa") + "Constructor").c_str()
Boa Constructor schrieb: > Dachte aber, es geht so wie in anderen Sprachen: Das solltest du bei C nicht machen. Mikro 7. schrieb: > (std::string("Boa") + "Constructor").c_str() Fraglicher Pattern, das funktioniert genau wenn es direkt als Argument einer Funktion benutzt wird (die es sich zudem nicht merken darf) und ansonsten nicht.
Gast
#5660654
Mikro 7. schrieb: > Serial.println(std::string("Boa") + "Constructor");
Gast
#5660656
Sven B. schrieb: > Mikro 7. schrieb: >> (std::string("Boa") + "Constructor").c_str() > > Fraglicher Pattern, das funktioniert genau wenn es direkt als Argument > einer Funktion benutzt wird (die es sich zudem nicht merken darf) und > ansonsten nicht. was? Boa Constructor schrieb: > Mikro 7. schrieb: >> Serial.println(std::string("Boa") + "Constructor"); > >
#include <string>
Gast
#5660664
> Serial.println("Boa" + "Constructor"); > > Auch mit "&" geht es nicht. Für einen Tipp danke ich. Serial.println("Boa" "Constructor"); HTH
Boa Constructor schrieb: > Sven B. schrieb: >> Mikro 7. schrieb: >>> (std::string("Boa") + "Constructor").c_str() >> >> Fraglicher Pattern, das funktioniert genau wenn es direkt als Argument >> einer Funktion benutzt wird (die es sich zudem nicht merken darf) und >> ansonsten nicht. > > was? Das baut einen temporären std::string, und gibt dir dann einen Pointer auf dessen interne Daten. Sobald der temporäre std::string zerstört wird (was bei diesem Konstrukt quasi immer sofort passiert, außer es ist Argument einer Funktion -- dann bleibt es am Leben, bis die Funktion ausgeführt wurde) ist der Pointer ungültig. Folgendes ist also ok: func((std::string("Foo") + "Bar").c_str()); aber das nicht: char* a = (std::string("Foo") + "Bar").c_str(); func(a);
Gast
#5660690
-------------
-----------
---------
Gast
#5660700
g457 schrieb: > Serial.println("Boa" "Constructor"); geht. Mikro 7. schrieb: > Boa Constructor schrieb: >> Mikro 7. schrieb: >>> Serial.println(std::string("Boa") + "Constructor"); >> >>
> > #include <string> Ändert nichts. In allen Varianten nicht, auch nicht mit string.h
Gast
#5660718
Boa Constructor schrieb: > Ändert nichts. In allen Varianten nicht, auch nicht mit string.h Was verwendest Du denn. C oder C++?
Gast
#5660721
Dirk B. schrieb: >
Dies habe ich bis jetzt getan. Nur mit mehr Strings. Gab irgendwann Performanceprobleme, daher will ich davon weg. Das einzige, was bis jetzt geht, ist das hier.
Bei der anderen Variante kriege ich leider immer
Danke bisher Boa Constructor schrieb: > g457 schrieb: >> Serial.println("Boa" "Constructor"); > > geht. Das funktioniert, solange du Literals benutzt. Mit Variablen gehts es aber nicht. >> #include <string> > > Ändert nichts. In allen Varianten nicht, auch nicht mit string.h
Gast
#5660727
Brummbär schrieb: > Boa Constructor schrieb: >> Ändert nichts. In allen Varianten nicht, auch nicht mit string.h > > Was verwendest Du denn. C oder C++? k. Ahn., die Arduino IDE. ich denke C++ ist drin
Gast
#5660730
Mikro 7. schrieb: > Boa Constructor schrieb: >> g457 schrieb: >>> Serial.println("Boa" "Constructor"); >> >> geht. > > Das funktioniert, solange du Literals benutzt. Mit Variablen gehts es > aber nicht. > >>> #include <string> >> >> Ändert nichts. In allen Varianten nicht, auch nicht mit string.h > >
Das funzt leider auch nicht. Oder bin ich zu blöd dazu, kann das sein?
Gast
#5660738
Boa Constructor schrieb: > Dies habe ich bis jetzt getan. Nur mit mehr Strings. Gab irgendwann > Performanceprobleme, daher will ich davon weg. Performanceprobleme? Glaube ich nicht! Hier noch eine Variante:
Boa Constructor schrieb: > Das funzt leider auch nicht. Oder bin ich zu blöd dazu, kann das sein? > #include <string> Bei der AVR ToolChain ist die STL nicht dabei.
Gast
#5660743
mhh. Niemand hat eine Idee? Dann brauche ich meine 2. Frage gar nicht zu stellen, wie ich Zahlenwerte in den Ausgabestring hinein bekomme. Arduino Fanboy D. schrieb: > Bei der AVR ToolChain ist die STL nicht dabei. Habe ich auch gerade gesehen. Also kein vollst. C++ Support. @Boa: Dann ignoriere mein Postings.
Gast
#5660746
Mikro 7. schrieb: > Arduino Fanboy D. schrieb: >> Bei der AVR ToolChain ist die STL nicht dabei. > > Habe ich auch gerade gesehen. Also kein vollst. C++ Support. > > @Boa: Dann ignoriere mein Postings. keine Ursache. Danke trotzdem.
Gast
#5660747
Arduino hat eine eigene String Klasse, die ist hier dokumentiert: https://www.arduino.cc/reference/en/language/variables/data-types/string/ Die einzig sinnvolle Antwort hat hier jedoch Dirk gegeben: Man soll die Strings nicht zusammenfügen, wenn es vermeidbar ist. Und zwar schlicht und ergreifend deswegen, weil man dann zumindest zeitweise doppelt so viel RAM belegt. Die beiden Quell-Strings belegen bereits Speicher und das Ergebnis der Zusammenfügung belegt nochmal Speicher. Dazu kommt, dass man durch String-Manipulation Ratz-Fatz einen fragmentierten Heap produziert, der zu einem Heap/Stack Überlauf führt. https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/
Gast
#5660755
> wie ich Zahlenwerte in den Ausgabestring hinein bekomme. Wenn keine besondere Formatierung notwendig ist, dann fülle einen Puffer (char[]) mit atoi() oder atol(). Siehe https://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html Wenn du Formatieroptionen brauchst, dann nimm printf(). Siehe https://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html Die Serial Klasse von Arduino hat auch Funktionen für formatierte Ausgabe: https://www.arduino.cc/reference/en/language/functions/communication/serial/print/
Gast
#5660757
Stefanus F. schrieb: > Arduino hat eine eigene String Klasse, die ist hier dokumentiert: > https://www.arduino.cc/reference/en/language/variables/data-types/string/ > > Die einzig sinnvolle Antwort hat hier jedoch Dirk gegeben: Man soll die > Strings nicht zusammenfügen, wenn es vermeidbar ist. > > Und zwar schlicht und ergreifend deswegen, weil man dann zumindest > zeitweise doppelt so viel RAM belegt. Die beiden Quell-Strings belegen > bereits Speicher und das Ergebnis der Zusammenfügung belegt nochmal > Speicher. > > Dazu kommt, dass man durch String-Manipulation Ratz-Fatz einen > fragmentierten Heap produziert, der zu einem Heap/Stack Überlauf führt. > > https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/ Ist schon klar. Ob der uC Garbage Collection kann (?) ist ja auch egal, lags will ich nicht provozieren. Momentan habe ich aber zuweilen eine Rekursion im ISR, wenn dort zu viele Serial.print ausgegeben werden. Was soll ich machen ohne Debugger. Es ist wie bei armen Leuten
Gast
#5660761
Boa Constructor schrieb: > Ob der uC Garbage Collection kann (?) Dafür bräuchtest du ein Betriebssystem, welches das steuert, und eine Memory Mapping Unit. AVR sind davon sehr weit entfernt.
Gast
#5660762
Stefanus F. schrieb: > Arduino hat eine eigene String Klasse, die ist hier dokumentiert: > https://www.arduino.cc/reference/en/language/variables/data-types/string/ ja das geht, danke schonmal. Kann ich auch Zahlen in den String integrieren? Keine Literale, sondern Variablen. also wer VB kennt, ist beeindruckt von dem Aufwand in c. Soll aber keine Wertung sein, aber Stringverarbeitung ist (m.E.,) ein Kreuz
Gast
#5660763
Stefanus F. schrieb: > Boa Constructor schrieb: >> Ob der uC Garbage Collection kann (?) > > Dafür bräuchtest du ein Betriebssystem, welches das steuert, und eine > Memory Mapping Unit. AVR sind davon sehr weit entfernt. Habe ich vermutet. Die Andeutung war auch eher theoretisch.
Gast
#5660771
Boa Constructor schrieb: > Kann ich auch Zahlen in den String integrieren? Du hast die Seite nicht wirklich gelesen. Ich zitiere: " For more details on the String object, which gives you more functionality at the cost of more memory, see the String object page." Da hättest du nur drauf klicken brauchen. https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/
Gast
#5660797
Die "Garbage Collection" von C++ nennt sich Smart Pointer. Natürlich ist das keine Garbage Collection im eigentlichen Sinne sondern nur die automatisierte Freigabe von Resourcen gebunden i.d.R. an die Destruktion des Smart Pointers (ein Objekt das eine Referenz auf die Resource besitzt). Eine Garbage Collection im klassischen Sinn muss die Sprache selbst unterstützen. Das ist bei C und C++ nicht der Fall (und auch nicht wünschenswert). Eine Memory Management Unit + OS sind hilfreich aber eigentlich keine Voraussetzung. Die Garbage Collection ist bei (teil)interpretierten Sprachen eng mit der VM gekoppelt.
Gast
#5660808
Stefanus F. schrieb: > Boa Constructor schrieb: >> Kann ich auch Zahlen in den String integrieren? > > Du hast die Seite nicht wirklich gelesen. Ich zitiere: > Ehrlich gesagt noch gar nicht. English quält mich immer so, da muss ich Zeit+Ruhe haben. Bin gerade i.d. Küche am kochen :)
Gast
#5660812
Programmieren ohne Englisch ist wie Kochen ohne Feuer. Weit kommt man ohne Englisch nicht, da musst du durch. Die Zeiten, wo man sich dicke Bücher auf deutsch kaufen konnte, sind vorbei.
Gast
#5660814
Boa Constructor schrieb: > Momentan habe ich aber zuweilen eine > Rekursion im ISR, wenn dort zu viele Serial.print ausgegeben werden. Niemals in einer ISR Strings ausgeben. Das macht man nicht. Eine ISR hat immer, bis auf ganz wenige Ausnahmen, so kurz wie möglich zu sein. Keine Ausgaben, keine (großen) Berechnungen, keine Delays.
Gast
#5660824
Brummbär schrieb: > Boa Constructor schrieb: >> Momentan habe ich aber zuweilen eine >> Rekursion im ISR, wenn dort zu viele Serial.print ausgegeben werden. > > Niemals in einer ISR Strings ausgeben. Das macht man nicht. > Eine ISR hat immer, bis auf ganz wenige Ausnahmen, so kurz wie möglich > zu sein. Keine Ausgaben, keine (großen) Berechnungen, keine Delays. Ja Brummbär, entspann dich wieder :) Boa Constructor schrieb: > Was soll ich machen ohne Debugger. Es ist wie bei armen Leuten Boa Constructor schrieb: > Dies habe ich bis jetzt getan. Nur mit mehr Strings. Gab irgendwann > Performanceprobleme, daher will ich davon weg. Bei Strings sollte man sich erstmal ein einheitliches Format überlegen, denn meistens sind Ausgaben recht ähnlich aufgebaut. Das erleichert es auch, die Ausgaben konsistent und ohne Schreibfehler zu halten. Obenrdrein spart es auch massig Speicher. Ich hab da schon die dollsten Sache erlebt, wenn alle Ausgaben einzeln definiert werden, z.B.: "Error xxx\n" "error xxx\n" "Eror xxx\n" "Error: xxx\n" "Error xxx!\n" "Erorr: xxx !\n" Beim AVR muß man etwas tricksen, damit Stringkonstanten nicht im RAM dupliziert werden.
header, footer können auch als Array mit fester Stringlänge im PROGMEM definiert werden.
Gast
#5660830
Peter D. schrieb: > Ich hab da schon die dollsten Sache erlebt, wenn alle Ausgaben einzeln > definiert werden, z.B.: Aber kein "Errör"?
Gast
#5660835
Konkretisiert schlägt der Wachhund an, wenn ich (testweise) 2 Meßreihen
a' 5 Werte ausgebe. Das sind 2x 5 Werte mit 2x4 Tabs ("\t") dazwischen,
also insg. 18 Serial.print. Das ist zuviel Last, weiß ich. Der ISR
taktet mit 160 Hz.
Boa Constructor schrieb: > Konkretisiert schlägt der Wachhund an Der Watchdog hat in der Entwicklungsphase inaktiv zu sein. Man will ja alle Fehler sehen und sie nicht verstecken.
Gast
#5660843
Peter D. schrieb: > Boa Constructor schrieb: >> Dies habe ich bis jetzt getan. Nur mit mehr Strings. Gab irgendwann >> Performanceprobleme, daher will ich davon weg. > > Bei Strings sollte man sich erstmal ein einheitliches Format überlegen, > denn meistens sind Ausgaben recht ähnlich aufgebaut. Das erleichert es > auch, die Ausgaben konsistent und ohne Schreibfehler zu halten. > Obenrdrein spart es auch massig Speicher. > Ich hab da schon die dollsten Sache erlebt, wenn alle Ausgaben einzeln > definiert werden, z.B.: > "Error xxx\n" > "error xxx\n" > "Eror xxx\n" > "Error: xxx\n" > "Error xxx!\n" > "Erorr: xxx !\n" > > Beim AVR muß man etwas tricksen, damit Stringkonstanten nicht im RAM > dupliziert werden. > >
> > header, footer können auch als Array mit fester Stringlänge im PROGMEM > definiert werden. ich mache das bis jetzt so:
aber das ist natürlich nicht performant, nur ein Workarround. Ich muss das jetzt verfeinern. Ansonsten ist das auch nicht kritisch, wenn der Ticker den lfd. Prozess einholt, nur unschön.
Gast
#5660847
Peter D. schrieb: > Boa Constructor schrieb: >> Konkretisiert schlägt der Wachhund an > > Der Watchdog hat in der Entwicklungsphase inaktiv zu sein. Man will ja > alle Fehler sehen und sie nicht verstecken. Ist doch kein Watchdog. Nur mein persönlicher "Wachhund" :-) Am ISR-Eingang wird, solange dort drin Code ausgeführt wird, abgefragt, ob der Event erneut aufgerufen wird. sei() ist natürlich immer aktiv, sonst geht das nicht. Ein rekursiver (oder wie sagt man hier..?) Aufruf wird mit "return" abgeblockt, so dass der Ticker nicht blockiert wird, solange im ISR code läuft.
Gast
#5660851
Stefanus F. schrieb: > Programmieren ohne Englisch ist wie Kochen ohne Feuer. Weit kommt man > ohne Englisch nicht, da musst du durch. Ich kanns ja, es quält mich nur. Und glaube mir, kochen ohne Feuer geht. Ich bin doch gerade in der Küche, am Kochen :) Boa Constructor schrieb: > ich mache das bis jetzt so: Define ist kein Funktionsaufruf, d.h. der Code wird bei jeder Verwendung dupliziert. Mach ne Funktion draus, nur dann spart man auch.
Gast
#5660876
Peter D. schrieb: > Boa Constructor schrieb: >> ich mache das bis jetzt so: > > Define ist kein Funktionsaufruf, d.h. der Code wird bei jeder Verwendung > dupliziert. Mach ne Funktion draus, nur dann spart man auch. Lohn nicht. Prints gibts nur i.d. entwicklung, als Debugger für arme. So, habe ein wenig i.d. reference gestöbert u. 1 Lösung gefunden. Es scheint auch zu funktionieren, auch wenn es einfach aussieht https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/
Gast
#5660884
Ob das jetzt performanter ist, weiß ich nicht. Heute werde ich das nicht mehr testen. Habs nur geschrieben, falls jemand dasselbe Problem hat, kann er/sie hier fündig werden. Danke an alle.
Gast
#5660902
Noch eine Info für die Nachwelt: Habe mich noch mal eingelesen. String (mit großem 'S') ist als Speicher-Fragmentierer verpönt. Das sollte man dann wissen. Mir macht's nichts, weil es nur zur Entwicklungszeit verwendet wird. Au jeden Fall will ich den tipp nicht gegeben haben, ohne darauf zu verweisen.
Gast
#5660912
Diese String Objekt Verwirrung will keiner. Nutze das Streaming!
Gast
#5660927
Arduino Fanboy D. schrieb: > Diese String Objekt Verwirrung will keiner. häh, Altersheimer? diese Verwirrung hast du doch selber eingestreut ^^ .. Arduino Fanboy D. schrieb: >
> > ----------- >
> > --------- usw
Gast
#5660939
Boa Constructor schrieb: > usw Ist klar! Boa Constructor schrieb: > Noch eine Info für die Nachwelt: > > Habe mich noch mal eingelesen. String (mit großem 'S') ist als > Speicher-Fragmentierer verpönt. Das gilt ganz besonders, wenn man es so benutzt wie in deinem Beispiel > Das sollte man dann wissen. Mir macht's nichts, weil es nur zur > Entwicklungszeit verwendet wird. Das hat nicht viel damit zu tun. Entweder der Speicher (und die Rechenzeit) reicht für dein Programm mit diesen ganzen Strings, dann stört es auch in der Release-Version nicht, oder es reicht nicht, dann funktioniert aber deine Entwickler-Version nicht. wie schnell ist die serielle Schnittstelle eingestellt?
Gast
#5660954
Arduino Fanboy D. schrieb: > Ist klar! Ja du lässt die Leut' ins offene Messer laufen. Ein toller Ratgeber, muss ich schon sagen, Respekt. Rolf M. schrieb: > Boa Constructor schrieb: >> Noch eine Info für die Nachwelt: >> >> Habe mich noch mal eingelesen. String (mit großem 'S') ist als >> Speicher-Fragmentierer verpönt. > > Das gilt ganz besonders, wenn man es so benutzt wie in deinem Beispiel Was konkret ? Nur zum lernen, Speicher ist noch genug frei
Gast
#5660965
Boa Constructor schrieb: > Ja du lässt die Leut' ins offene Messer laufen. Ein toller Ratgeber, > muss ich schon sagen, Respekt. Du irrst! (etwas plemplem heute?) Boa Constructor schrieb: > 18 Serial.print. Das ist zuviel Last, weiß ich. Der ISR > taktet mit 160 Hz Das ist kein Problem der 18 Funktionsaufrufe (von Serial.print) Es sind zuviel Daten für deine 160 Hz. bei 9600 Baud / 10 (Bits pro Zeichen) / 160 Hz komme ich auf 6 Zeichen die vernünftig rüber kommen. Und da wird nichts anderes mehr ausgeführt. Boa Constructor schrieb: > Rolf M. schrieb: >> Boa Constructor schrieb: >>> Noch eine Info für die Nachwelt: >>> >>> Habe mich noch mal eingelesen. String (mit großem 'S') ist als >>> Speicher-Fragmentierer verpönt. >> >> Das gilt ganz besonders, wenn man es so benutzt wie in deinem Beispiel > > Was konkret ? Nur zum lernen, Speicher ist noch genug frei Jedesmal, wenn du den Operator + verwendest, wird für das Ergebnis ein neuer Speicherblock allokiert, der natürlich auch jedesmal etwas größer ist, als der davor. Da werden dann die beiden Strings reinkopiert. Erst ganz am Schluss wird alles wieder freigegeben. Das da kostet also erstens jede Menge Rechenzeit, zweitens jede Menge Speicher: Boa Constructor schrieb: > Serial.println(String(i1) > + String("\t") > + String(i2) > + String("\t") > + String(i3) > + String("\t") > + String(i4) > + String("\t") > + String(i5)); Auf die Schnelle hab ich dazu auch die folgende ausführlichere Erklärung gefunden: https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/
Gast
#5660990
Dirk B. schrieb: > Boa Constructor schrieb: >> 18 Serial.print. Das ist zuviel Last, weiß ich. Der ISR >> taktet mit 160 Hz > > Das ist kein Problem der 18 Funktionsaufrufe (von Serial.print) > Es sind zuviel Daten für deine 160 Hz. > > bei 9600 Baud / 10 (Bits pro Zeichen) / 160 Hz komme ich auf 6 Zeichen > die vernünftig rüber kommen. > Und da wird nichts anderes mehr ausgeführt. Ja kann sein. Vermutlich hast du recht. Die Baudrate lässt sich vielleicht hochsetzen.
Gast
#5660993
Rolf M. schrieb: > Jedesmal, wenn du den Operator + verwendest, wird für das Ergebnis ein > neuer Speicherblock allokiert, der natürlich auch jedesmal etwas größer > ist, als der davor. Da werden dann die beiden Strings reinkopiert. Erst > ganz am Schluss wird alles wieder freigegeben. OK, danke. Ja das leuchtet mir ein,
Gast
#5661001
..... also dann Strings via Array vor-verketten und den (char)Pointer an Serial.print übergeben? Nur mal so dahingedacht, bin kein c Profi
Gast
#5661011
Boa Constructor schrieb: > ..... > also dann Strings via Array vor-verketten und den (char)Pointer an > Serial.print übergeben? Nur mal so dahingedacht, bin kein c Profi Wie gesagt ist der beste Weg, die Strings gar nicht zu verketten. Besser jeden Teilstring einzeln ausgeben. Durch die serielle Schnittstelle kommt das hinten als ein Datenstrom heraus, egal wie viele "Serial.print" Aufrufe dazu nötig waren.
Gast
#5661030
OK. Also bleibt es so, wie gehabt Boa Constructor schrieb: > ich mache das bis jetzt so: >
Ich ging bisher davon aus, die vielen print wären das Problem. Aber wenn man nachrechnet, die Baudrate, dann ergibt sich der Rest.
Gast
#5661034
Rolf M. schrieb: > Auf die Schnelle hab ich dazu auch die folgende ausführlichere Erklärung > gefunden: > https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/ @ Rolf M. gute Seite, sehr aufschlußreich. danke Wie schnell ist dein Controller? ca. 10 MHz? Der kann eine Million Funktionsaufruf pro Sekunde machen, bekommt aber nur 100 Zeichen in der Zeit weg.
Gast
#5661039
Boa Constructor schrieb: > https://hackingmajenkoblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/ > @ Rolf M. gute Seite, sehr aufschlußreich. danke Ich war derjenige, der den Artikel vorgeschlagen hat.
Gast
#5661058
Dirk B. schrieb: > Wie schnell ist dein Controller? ca. 10 MHz? 16MHz Stefanus F. schrieb: > Ich war derjenige, der den Artikel vorgeschlagen hat. wos? brauche ich Brille? nö, es steht 2x oben. Dann danke an euch beide :))
Gast
#5661076
Boa Constructor schrieb: > Dann danke an euch beide :)) Jetzt bin ich zufrieden :-)
Gast
#5661407
Den Speicherverbrauch kann man während er Laufzeit sichtbar machen: https://playground.arduino.cc/Code/AvailableMemory Das würde ich mal tun, um die verschiedenen Theorien hier bezüglich der Stringfunktionen zu überprüfen.
Gast
#5661444
Diese Funktion ermittelt (auf den ersten Blick) die Summer aller freier Speicherblöcke. Fragmentierung bemerkt man damit nicht. Die folgende Funktion testet mit einer in 10er Schritten aus, wie viel Speicher man an einem Stück belegen kann.
Man kann auch einfach plain C verwenden und mit strcat Strings aneinander kopieren. Dann wird kein unnützer Speicher alloziert. Man ist dann aber selber dafür verantwortlich, daß der Zielstring genügend groß ist. Malloc wird nicht benötigt. Mit strncat kann man absichern, daß der Zielstring nicht überläuft. Was man zuviel reinschreiben will, wird abgeschnitten.
Gast
#5661459
Peter D. schrieb: > und mit strcat Strings > aneinander kopieren. Habe ich dem Roth gezeigt! Aber dazu sagte er: Boa Constructor schrieb: > du lässt die Leut' ins offene Messer laufen.
Gast
#5661470
Stefanus F. schrieb: > Die folgende Funktion testet mit einer in 10er Schritten aus, wie viel > Speicher man an einem Stück belegen kann. > unsigned short function_freememory(char* buffer) { Die Funktion ist krank oder sehr unsauber. Gibt offensichtlich einen Zeiger zurück, ist aber als unsigned short deklariert. Das passt nicht. Es wäre voll ausreichend, wenn sie nur ein size_t zurückgeben würde. Die Stringgenerierung kann man doch anderen Zuständigkeiten überlassen. Die korrekte Funktion der Funktion habe ich (noch) nicht getestet.
Gast
#5661477
PeDa >Man kann auch einfach plain C verwenden und mit strcat Strings >aneinander kopieren. Dann wird kein unnützer Speicher alloziert. Das ist schon wahr, aber die Arduino-String-Funktionen sind so unglaublich bequem: https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/ Wirklich, bis man das alles mit C zusammen hat, ist man eine Weile unterwegs. Ich vermute, Arduino-String ist ein Versuch, sich der Java-API zu nähern: https://www.dpunkt.de/java/Referenz/Das_Paket_java.lang/68.html
Gast
#5661485
Arduino Fanboy D. schrieb: > Die Funktion ist krank oder sehr unsauber. > Gibt offensichtlich einen Zeiger zurück, ist aber als unsigned short > deklariert. Sie gibt die Anzahl der Zeichen zurück, die in den Buffer geschrieben wurden. Ich bin ein bisschen erstaunt, dass du nicht mit der Funktion sprintf_P() vertraut bist. > Es wäre voll ausreichend, wenn sie nur ein size_t zurückgeben würde. > Die Stringgenerierung kann man doch anderen Zuständigkeiten überlassen. Ja kann man. Ich habe das aus einem Programm heraus kopiert, wo es so gebraucht wurde. Ich erlaube Dir hiermit ausdrücklich, den kopierten Code nach deinen Bedürfnissen anzupassen. Zufrieden?
Gast
#5661489
Cornelius schrieb: > Ich vermute, Arduino-String ist ein Versuch, sich der Java-API zu > nähern: Das vermute ich auch. Denn die ursprüngliche Basis/Vorbild soll wohl Processing sein. Cornelius schrieb: > Das ist schon wahr, aber die Arduino-String-Funktionen sind so > unglaublich bequem: Noch bequemer ist wohl das Streaming. Zumindest bei den einfachen Ausgaben die in diesem Thread zu sehen sind. Siehe: Beitrag "Re: Stringverknüpfung C/C++"
Gast
#5661500
Stefanus F. schrieb: > Sie gibt die Anzahl der Zeichen zurück, die in den Buffer geschrieben > wurden. > > Ich bin ein bisschen erstaunt, dass du nicht mit der Funktion > sprintf_P() vertraut bist. Sorry. Den Punkt nehme ich zurück.... Es ist kein Zeiger, sondern die Anzahl Zeichen. Allerdings wäre hier int der richtige Datentype. > On failure, a negative number is returned. Da ist unsigned sicherlich gänzlich falsch.
Gast
#5662257
Arduino Fanboy D. schrieb: > Da ist unsigned sicherlich gänzlich falsch. Na also. Klappt doch. Weiter so. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|