Hallo Zusammen,
ich weiß einige Leute hier mögen keine Strings, aber dennoch ermöglichen Sie häufig eine schnelle und bequeme Problemlösung.
Meine Frage lautet, ob es etwas bringt Variablen wieder mit "NULL" zu beschreiben? Damit meine ich, ob dadurch wieder dynamischer Speicher frei wird?
Beispiel: Ich habe den String code; und lade aus dem Internet ca. 2000 Textzeichen in den String und verarbeite diesen. Anschließend leere ich die Variable wieder code = "";
In Systemen wie Java würde eine Garbage Collection hinter Dir aufräumen. Die gibt es beim Arduino nicht.
Es kann etwas bringen, muss aber nichts.
Viel wichtiger (wenn man schon mit String arbeiten will, was sich immer umgehen lässt) ist es, immer den gleichen String für die gleiche Aufgabe zu nutzen und ihm mit reserve() im Setup die maximal zu erwartende Länge zu reservieren.
A+7+C mit Strings ist der Gau, der irgendwann zum Absturz führt.
magie004:
Ich arbeite dran alle Strings aus dem Code zu entfernen, aber das dauert halt
Die Größe kann ich zu beginn leider nicht definieren, da diese unbekannt ist und zwischen einem und vielen Tausend Zeichen liegen kann
Statt den Code umzuarbeiten könntest Du einen eigenen String-Container programmieren. So irre schwer ist das nicht, gerade für jemanden, der nicht so neu in der Materie ist.
Die andere Möglichkeit ist, mit C-Strings zu arbeiten. Auch dafür muss man kein Hexenmeister sein.
auf kleinen AVR ist die Stringklasse fast immer sehr kritisch.
Da Du aber von einem 2000 Zeichen String und Internet sprichst: von welchem Arduino reden wir denn?
Also welche CPU mit wieviel Ram?
magie004:
Ich arbeite dran alle Strings aus dem Code zu entfernen, aber das dauert halt
Die Größe kann ich zu beginn leider nicht definieren, da diese unbekannt ist und zwischen einem und vielen Tausend Zeichen liegen kann
Dann gib ihm die vielen tausend Zeichen!
Sieh es so: Es ist allemal besser, der Compiler reklamiert dass du die die vielen Tausend Zeichen nicht zur Verfügung hast, als dass im laufenden Betrieb die vielen tausend tatsächlich mal auftauchen und es unvorgesehen bumm macht!
auf dem ESP nutze ich die String-Klasse eigentlich mit Vorliebe...
Die Verhältnisse auch beim Ram sagt Dir doch die IDE schon beim compilieren.
4MB Flash hast Du auch nicht direkt für das Programm, nur 1MB. Davon belegen die ESP-Geschichten schon rund 245kB. Bleiben Dir also ca. 750kB für Deinen programmcode. Den Bereich über 1MB kannst Du z.B. für SPIFFS nutzen.
Ram sind rund 81kB, davon für die ESP-Sachen rund 24kB beleht, bleiben Dir also rund 54kB verfügbar.
Als Bespiel: Webserver, html-Seite mit 6kB aus dem SPIFFS geladen und dann ca. 15 Stringersetzungen drübergejagt und anschließen ausgeliefert, ist grenzwertig, aber noch stabil wenn parallel keine Aktionen mit größeren Strings genutzt werden.
Real sind da bei mir keine Seiten, die größer als 2kB sind und das ist auch langzeitstabil.
Parallel laufen noch MQTT, ein Display am MCP23S17 und Empfang/ Auswertung von 6 Eigenbau-433MHz Sensoren. In diesen Teilen werden aber nur kleine Strings (max. vielleicht 50 Byte Einzelstrings).
Mein Bekannter nutzt fast immer C-Strings, auch da bekommt man durchaus den Speicher fragmentiert, wenn man nicht aufpasst.
Laß Dir an kritischen Stellen mit ESP.getFreeHeap() den noch freien Speicher ausgeben und gehe es geziehlt an.
Es kommt ja auch darauf an, was Du da empfängst und was Du damit machen willst, man kann ja auch schon dort parsen und vorsortieren.