Hallo zusammen, bin noch Einsteiger und habe ein kleines problem
ich möchte einen String in ein char convertieren.
diesen char möchte ich dann ausgeben.
Am Seriellen Monitor sehe ich aber nichts.
String input = "Hallo test";
int input_len = input.length() + 1;
char char_array[input_len];
input.toCharArray(char_array, input_len);
Serial.println(char_array);
Woran liegt das?
Eva T. schrieb:> MaWin schrieb:>> Welche Sprache?>> Arduino
Arduino ist keine Sprache!
Diese es heißt C++, und auch ein bisschen C und ASM gibts da ebenfalls.
Warum nicht einfach:
Eva T. schrieb:> ich möchte zu dem input noch etwas dazu schreiben.Eva T. schrieb:> ich möchte zu dem input noch etwas dazu schreiben.
Was hindert dich?
Strings kannst du direkt verketten:
https://myhomethings.eu/de/arduino-string-objekte/
Für eine Ausgabe ist aber selbst das Verketten unnötig kompliziert.
Mache einfach zwei Ausgaben nacheinander:
Serial.print(input)
Serial.println(char_array)
EAF schrieb:> Arduino ist keine Sprache!
"Die Programmierung selbst erfolgt in einer C- bzw. C++-ähnlichen
Programmiersprache, wobei technische Details wie Header-Dateien vor den
Anwendern weitgehend verborgen werden"
https://de.wikipedia.org/wiki/Arduino_(Plattform)
https://arduinogetstarted.com/de/reference/arduino-string-tochararray
Extra für den TO gegoogelt :) Bin lieb heute ;)
Wieso können die Kiddys nicht mehr google benutzen.
google starten.
arduino string to char array <- eingeben (wird zu hälfte vorgeblendet)
Dann !!! Suchfilter = Seiten auf Deutsch.
Bei mir der erste Treffer.
Ich bin echt lieb heute. tztztz
Schlaumaier schrieb:> Wieso können die Kiddys nicht mehr google benutzen.
Muss man das?!?
Können die anderen heute nicht mehr miteinander Kommunizieren und
googeln nur noch!? ;-)
Denk mal drüber nach:-)
Eigentlich ist dieser Weg doch der bessere, meinst Du nicht? Egal wie
oft eine Frage schon gestellt wurde.
Würdest Du Deinem Kind, wenn es dich fragst, ach so antworten" Google es
doch, kannst du das nicht"
Nenene
Peter K. schrieb:> Können die anderen heute nicht mehr miteinander Kommunizieren und> googeln nur noch!? ;-)> Denk mal drüber nach:-)
Habe ich.
Und ich halte mich an den alten Spruch meiner Mutter "Hilf dir selbst,
dann hilft dir Gott". !!!
Das nennt man selbstständiges Denken und recherchieren. !!!! Und das
kann keiner mehr.
Klar es gibt Fragen wo auch eine längere Suche im Netz o. Büchern keine
Antwort bringt. Dann muss man Fachleute suchen.
Aber wie ich immer sage : "Wenn ich wirklich mal ein Problem habe und
nicht weiter weiß ist es sehr schwer ein zu finden, der da wirklich Plan
hat."
Was NICHT bedeutet das ich alles weiß. Nur 99% der Infos die man braucht
kann man sich selbst beschaffen. Und das 1 % ist das Problem. Oder wie
man im Wilden Westen sagte : "Es gibt sicher ein der schneller ist wie
ich, aber denn muss man erst finden". ;)
Ach nur so Nebenbei. Ich habe so 22 Jahre auf der Firma allein
gearbeitet. Der Chef o. wer auch immer, kam in mein Büro und schilderte
das Problem. Ich arbeitete die Lösung aus. Und JA ich habe dafür viel
Telefoniert und später google + Co. benutzt.
"Das nennt man selbstständiges Denken und recherchieren. !!!! Und das
kann keiner mehr."
Vielleicht schlussfolgerst Du das nur?
Und die Generation sucht einfach wieder meh den zwischenmenschlichen
Kontakt
Aber so oder so, ist es ja auch nicht schlimm, wenn man einfach fragt
und nicht recherchiert.
Der eine so, der Andere so.
Die Welt ist ja nicht nur S/W, abgesehen tut es keine Weh, es entsteht
keinerlei Schaden.
Also, sei's drum
Georg M. schrieb:> EAF schrieb:>> Wie kann ich dir das beweisen?
Ich habe dich gefragt, wie ich dir das beweisen kann.....
Ich habe dich nicht aufgefordert irgendwelchen Blödsinn nach zu
plappern.
Hier ein Nachweis:
1
#include<Streaming.h> // die Lib findest du selber ;-)
2
Print&cout=Serial;// cout Emulation für "Arme"
3
4
voidsetup()
5
{
6
Serial.begin(9600);
7
cout<<__cplusplus<<endl;
8
}
__cplusplus ist KEIN Arduinobestandteil, sondern stammt aus der GCC
Toolchain
Das Programm sagt bei mir: 202100
(das kann bei dir was anderes zeigen)
Dieter schrieb:> Denken die Leute jetzt tatsächlich schon,> "Arduino" wäre eine eigene Sprache?
Offensichtlich!
Ich finde die Aussage in der Arduino Doku schon arg bedenklich.
Leute : Ihr habe BEIDE Recht.
Ist das selbe wie BASIC.
Basic gibt es ein Ewigkeiten. ABER !!. In jeder Compilerversion werden
Dinge verändert.
Einer meiner Lieblingsbefehle war RIGHT$(y,x).
z.b. tx$ ="hundeklo" : a$ = right(tx$,3)
dann ist a$ "klo"
Der Befehl wurde in VB-2010 abgeschafft, und ich habe ihn via Funktion
nachbilden müssen.
Mit Arduino-C und "richtigen" C ist es das selbe.
Grundsätzlich ist C = C , wie Basic = Basic ist.
Aber viele Funktionen/ Befehle werden in Arduino-C nicht unterstützt.
Also ist die Aussage auf der Homepage richtig.
Wenn ich ein BASCOM - Programm in mein VB lade, sagt der Compiler auch
nur "WOT" ?!?! :;)
Die Syntax ist zwar innerhalb der Programmiersprache gleich aber der
Rest .......... .
Schlaumaier schrieb:> Aber viele Funktionen/ Befehle werden in Arduino-C nicht unterstützt.
Welche?
Sowohl C und auch C++ stehen vollständig zur Verfügung.
Einzig auf AVR fehlt die libstc++, aber das ist eine Einschränkung der
Toolchain, welche genauso für alle anderen IDEs zutrifft, welche AVR-GCC
verwenden.
Schlaumaier schrieb:> Also ist die Aussage auf der Homepage richtig.
Ja?
Woran machst du das fest?
Peter K. schrieb:> Schlaumaier schrieb:>> Wieso können die Kiddys nicht mehr google benutzen.>> Muss man das?!?
Sollte man heutzutage auf jeden Fall können, ja. Früher gingen die
Menschen in eine Buchhandlung und haben da versucht, Bücher zu finden,
die die Informationen enthalten und diese dann gekauft. Das war mühsam,
umständlich und kostete Geld. Heute ist es einfacher denn je, kostenlos
an fast alle erdenklichen Informationen zu kommen, und ich habe den
Eindruck, dass es gerade z.B. in Foren wie hier sehr viele Menschen
gibt, die dazu dennoch nicht in der Lage sind und stattdessen alles
nachfragen müssen.
> Können die anderen heute nicht mehr miteinander Kommunizieren und> googeln nur noch!? ;-)
Darum geht es doch gar nicht. Natürlich kann und soll man kommunizieren,
aber das heißt doch nicht, dass man sich jetzt selbst die simpelsten
Dinge von anderen erklären lassen muss. Als 6-jähriges Kind macht man
sowas, aber doch nicht als Erwachsener.
> Eigentlich ist dieser Weg doch der bessere, meinst Du nicht? Egal wie> oft eine Frage schon gestellt wurde.
Nein.
> Würdest Du Deinem Kind, wenn es dich fragst, ach so antworten" Google es> doch, kannst du das nicht"
Es geht nicht um Kinder.
Dieter schrieb:> Ist es wirklich schon soweit? Denken die Leute jetzt tatsächlich schon,> "Arduino" wäre eine eigene Sprache?
Das ist eben das, was die Arduino-Hompeage versucht, ihnen einzureden.
Da wird sehr gut versteckt, dass es eigentlich C++ ist.
Wenn jemand so seinen ersten Kontakt mit dem Thema Programmierung hat
und dort überall nur von der "Arduino programming language" liest, wie
soll der auf die Idee kommen, dass es sich in Wirklichkeit um C++
handelt?
"Sollte man heutzutage auf jeden Fall können,"
Noch mal....kann es sein das Du hier übereilt falsche Schlussfolgerungen
ziehst?
Niemand sagt, dass er es nicht könnte und Du weißt es nicht, im Grunde
kann es dir auch völlig egal sein.
Wenn Du einfach mal Googeln benutzen würdest...dort steht
"Ist Arduino C oder C++?
Syntaktisch basiert Arduino auf C, wodurch die Einbindung von C
Libraries möglich ist. Dennoch befindet sich die Sprache Arduino eine
Ebene höher als C/C++ und ermöglicht eine direkte Einbindung von
Hardware Komponenten ohne den Einsatz von Hardwareadressen."
Und wenn Du jetzt behauptest das diese Aussage falsch wäre, dann seihst
Du, weshalb direkte Kommunikation besser ist, als stundenlang von A nach
B zu goggeln um die antworten von Googel erst verifizieren zu müssen...
Da schreiben wieder irgendwelchen Marketing Menschen einen Blödsinn
zusammen.
Diese "Arduino programming language" ist einfach ein Hardware
Abstraction Layer ("HAL") die in C/C++ geschrieben ist.
Und es erlaubt die gleichen C/C++ Funktionen auf unterschiedlicher
Arduino Hardware zu verwenden.
z.B. AVR (Uno/Leonardo/Mega,... ), ARM (Due), Xtensa LX6 (ESP) oder auch
x86 (Genuino 101).
Jepp, mir ist das klar und Dir, aber der Neuling der danach googelt
bekommt diese Antwort.
Mir ging es nu um dieses "Kann die Jugend nicht mehr selber googeln"
Ich hoffe, jetzt wird klarer, wieso es auch noch andere Lösung als
Google gibt:-)
Peter K. schrieb:> Syntaktisch basiert Arduino auf C, wodurch die Einbindung von C> Libraries möglich ist.
Das klingt unlogisch.
Denn:
Die meisten Arduino Libraries sind in C++ abgefasst.
Kann man C++ Quellcode/Libs direkt in C einbinden?
Nein! (nicht ohne Wrapper zu bauen)
Anders rum allerdings, durchaus ja.
Peter K. schrieb:> Dennoch befindet sich die Sprache Arduino eine> Ebene höher als C/C++ und ermöglicht eine direkte Einbindung von> Hardware Komponenten ohne den Einsatz von Hardwareadressen."
Das ist eben so unlogisch!
Wie will man irgendeine Hardware ansprechen können, ohne sie zu
"adressieren"?
Ja, für Furz und Feuerstein gibt es Libraries, in der Arduino Welt.
Diese sind in den allermeisten Fällen in C++ abgefasst und adressieren
sehr wohl die Hardware. Das ist ihr Job.
Es gibt einen einzigen Punkt, wo man evtl. ansetzen können um Arduino
als eigene Sprache zu betrachten:
Der Builder ist nicht nur ein Make Ersatz/Äquivalent, sondern klebt auch
alle *.ino Dateien aneinander und jagt noch einen Präprozessor über das
Resultat.
In dem Resultat wird ein
1
#include<Arduino.h>
an den Anfang gesetzt.
Es werden Vorwärtsreferenzen für die Funktionen angelegt (Prototypen),
welche in den INO Dateien definiert sind.
Das sind die einzigen Änderungen, die eine *.ino Datei von einer *.cpp
Datei unterscheidet. Oder anders: So wird eine *.ino zu einer *.cpp.
*.h, *.c, *.cpp und *.S Dateien werden dem Compiler/Assembler
unverändert übergeben.
Peter K. schrieb:> Dennoch befindet sich die Sprache Arduino eine> Ebene höher als C/C++ und ermöglicht eine direkte Einbindung von> Hardware Komponenten ohne den Einsatz von Hardwareadressen."
Das ist Marketing Geschwurbel. Denn das geht sowohl in C als auch in C++
mit ganz normalen Bibliotheken. Die Arduino Bibliotheken sind ganz
normale Bibliotheken.
EAF schrieb:> Der Builder ist nicht nur ein Make Ersatz/Äquivalent, sondern ...
So sehe ich das auch. Arduino hat einen Build Prozessor gebaut, aber
keine neue Programmiersprache eingeführt.
Wer belastbare Informationen über den Build Process haben möchte sollte
dieses lesen:
https://arduino.github.io/arduino-cli/0.20/sketch-build-process/
Des weiteren finden sich dort, hinter den anderen Menüpunkten,
umfangreiche Informationen über den Aufbau von Libs und
Hardwaredefinitionen usw.
Ich kann nur jedem raten, wer sich etwas tiefer mit Arduino beschäftigen
möchte, das alles einmal durchzulesen.
Schlaumaier schrieb:> Ist das selbe wie BASIC. Basic gibt es ein Ewigkeiten.> ABER !!. In jeder Compilerversion werden Dinge verändert.
Ist es nicht, Arduino hat den Compilern absolut gar nichts verändert.
Eva T. schrieb:> ich möchte zu dem input noch etwas dazu schreiben.> Also eigentlich> ausgabe = input + char_array
String input;
char x[] = "123";
input = "Hallo ";
input += x;
input += 456;
Serial.println(input.c_str());
Ausgabe: Hallo 123456
Schau dir mal die Arduino Doku an
Peter schrieb:> So:>> String input = "Hallo test";> Serial.println(input.c_str());
Neee!!!!
Serial.println(input);
Reicht voll kommen!
Aber:
Eva T. schrieb:> ich möchte zu dem input noch etwas dazu schreiben.
Also:
Serial.println(input + " was anderes");
EAF schrieb:> Serial.println(input + " was anderes");
Aber so belegt du einen temporären Puffer, der die beiden Teilstrings
aufnimmt. Wenn man sie einzeln ausgibt (mit print() und println()),
spart man sich das. Je nach dem wie wenig RAM der Mikrocontroller hat,
lohnt sich das.
Stefan F. schrieb:> Aber so belegt du einen temporären Puffer, der die beiden Teilstrings> aufnimmt.
Ja und?
Ja es wird ein Buffer auf dem Heap angelegt!
Aber dank RAII auch wieder abgebaut.
Also: Nullsumme, in Sachen Speicher.
Stefan F. schrieb:> Wenn man sie einzeln ausgibt (mit print() und println()),> spart man sich das.
Finde ich unschön, bevorzuge darum sowas:
1
Stringinput="Hallo test";
2
cout<<input<<" space "<<" was anderes"<<endl;
3
4
oderauch:
5
char*input="Hallo test";
6
cout<<input<<" space "<<" was anderes"<<endl;
Das ganze kann man noch mit F() PSTR und PROGMEM usw. garnieren, wenn
man denn RAM freischaufeln will.
EAF schrieb:> Ja und?> Ja es wird ein Buffer auf dem Heap angelegt!> Aber dank RAII auch wieder abgebaut.
Mache das mal mit einer HTML Seite, dann lernst du schnell die Grenzen
der kleinen AVR Mikrocontroller kennen. Daran sind sogar schon Leute auf
ESP8266 gescheitert. Ich habe nicht umsonst geschrieben:
"Je nach dem wie wenig RAM der Mikrocontroller hat, lohnt sich das."
Dein Vorschlag mit cout ist meinem ähnlich, weil dabei ebenfalls die
Teile nacheinander ausgegeben werden, anstatt sie erst temporär zusammen
zu kopieren.
Stefan F. schrieb:> Mache das mal mit einer HTML Seite, dann lernst du schnell die Grenzen> der kleinen AVR Mikrocontroller kennen.
Das ist doch gar nicht das Thema hier!
Im Eingangsposting wird ein Buffer angelegt
Und auch alle anderen hier gezeigten Vorschläge mit memcpy() und
strcpy() usw. benötigen Buffer!
Klar du willst mal wieder recht haben, verstehe ich auch.
Allerdings braucht "Textverarbeitung" IMMER Buffer.
Auf µC und auch auch dickeren Kesseln.
Nur Magier kommen immer ohne aus.
Z.B. du.
Am Rande:
String belegt den Buffer auf dem Heap, drum passt da z.B. beim ESP32
viel mehr rein, als man auf dem Stack unterbringen kann.
FreeRTOS begrenzt den Stack
Im Eingangsposting wird Stack belegt, ist somit kritischer.
EAF schrieb:> Allerdings braucht "Textverarbeitung" IMMER Buffer.
Aber die Textausgabe mittel Serial.print() und println() ist bereits
gepuffert. Man gewinnt nichts damit, noch einen weiteren puffer davor zu
packen. Man verschwendet nur RAM, der eventuell (kommt auf die Anwendung
an) knapp ist.
EAF schrieb:> Im Eingangsposting wird Stack belegt, ist somit kritischer.
Da stimme ich dir zu.
Stefan F. schrieb:> Aber die Textausgabe mittel Serial.print() und println() ist bereits> gepuffert. Man gewinnt nichts damit, noch einen weiteren puffer davor zu> packen.
Du möchtest HTML über Serial ausliefern?
Interessant, wie du doch fleißig die Problemstellung deiner
Argumentation anpassen kannst.
Bewundernswert!
Im ernst:
Ist doch schön, wenn du auf jegliche Buffer verzichten kannst.
Meine Glückwünsche, und meinen Segen!
PS:
Du könntest mir jetzt auch noch erzählen, dass die Erde kugelig ist, und
keine Scheibe!
Da hat zwar keiner nach gefragt, und ich auch nie was gegenteiliges
behauptet...
Aber sowas hält dich ja nicht von einer Belehrung ab, oder?
EAF schrieb:> Klar du willst mal wieder recht haben, verstehe ich auch.> Allerdings braucht "Textverarbeitung" IMMER Buffer.> Auf µC und auch auch dickeren Kesseln.> Nur Magier kommen immer ohne aus.> Z.B. du.
Ich finde jetzt nicht, dass es Magie ist, wenn jemand zwei Strings vor
der Ausgabe nicht erst zu einem zusammen kopiert, sondern direkt separat
ausgibt. Und er hat doch Recht: man spart sich bei der zweiten Variante
den sonst nötigen Speicher für den zusätzlichen String, was auf µCs je
nach Typ schon sinnvoll sein kann. Das hat auch nichts damit zu tun, ob
für den seriellen Port irgendwo ein Puffer existiert.
>> Aber die Textausgabe mittel Serial.print() und println() ist bereits>> gepuffert. Man gewinnt nichts damit, noch einen weiteren puffer davor zu>> packen.EAF schrieb:> Du möchtest HTML über Serial ausliefern?> Interessant, wie du doch fleißig die Problemstellung deiner> Argumentation anpassen kannst.> Bewundernswert!
Du lenkst ab. Es geht um einen Ratschlag, wie er RAM sparen kann,
falls er es braucht. Für euch ewigen Nörgler haben ein konkretes
Beispiel genannt, dass direkt einleuchtet.
Kennst du etwa nicht diese Boards mit AVR und ESP8266, wo die beiden
seriell kommunizieren?
https://www.elektormagazine.de/news/mein-weg-ins-iot-10-das-pretzel-boardhttps://forum.arduino.cc/t/atmega328p-esp8266-wifi-tutorial/944380
Na egal, dann halt nicht. Unkenntnis ist jedoch kein Grund, sich über
andere Lächerlich zu machen. Dein Verhalten ist lächerlich, zudem es
deutlich offenbart, dass du kein erfahrener Programmierer bist.
Auch in anderen Szenarien muss man manchmal sparsam mit RAM umgehen und
kann nicht einfach beliebig lange Zeilen zusammen kopieren um sie an
einem Stück auszugeben.
Rolf M. schrieb:> Ich finde jetzt nicht, dass es Magie ist, wenn jemand zwei Strings vor> der Ausgabe nicht erst zu einem zusammen kopiert, sondern direkt separat> ausgibt. Und er hat doch Recht: man spart sich bei der zweiten Variante> den sonst nötigen Speicher für den zusätzlichen String, was auf µCs je> nach Typ schon sinnvoll sein kann.
Hast du vielleicht gesehen, dass ich genau so ein Beispiel auch
vorgeführt habe?
Nein?
Dann bitte Augen auf!
Habe ich irgendwo gesagt, man(oder Frau) müsse unbedingt unnötige Buffer
anlegen?
Man man man....
Im Eingangsposting wird nach der Verknüpfung 2er Strings gefragt, vor
der Ausgabe.
Dazu kamen viele Aussagen, die String völlig unnötig zu C-strings
konvertieren wollten, sogar mit memcpy() usw.
Dadrauf bezieht sich mein erstels Beispiel, auf dem das Stefan Dingen
dann angesprungen ist um mein mich kritisieren zu müssen.
Stefan F. schrieb:> Du lenkst ab. Es geht um einen Ratschlag, wie er RAM sparen kann,> falls er es braucht.
Offensichtlich nicht ER, sondern SIE!
Und warum ist der "Vorschlag" dann an mich adressiert, in Form eine
Kritik?
Weil du Streit haben willst?
Stefan F. schrieb:> Na egal, dann halt nicht. Unkenntnis ist jedoch kein Grund, sich über> andere Lächerlich zu machen. Dein Verhalten ist lächerlich, zudem es> deutlich offenbart, dass du kein erfahrener Programmierer bist.
Ich danke dir dafür!
Zu Belohnung, hast du mich ernsthaft sauer gemacht.
Wenn du das erreichen wolltest, dann hast du damit Erfolg!
Tipp:
Genieße deine momentanen Glücksgefühle, die werde ich dir schon noch
austreiben.
Und zwar fachlich und gewürzt mit einer gehörige Ladung Verachtung.
Das möchtest du doch.....
EAF schrieb:> Dadrauf bezieht sich mein erstels Beispiel, auf dem das Stefan Dingen> dann angesprungen ist um mein mich kritisieren zu müssen.
Korrektur:
Darauf bezieht sich mein Beispiel, auf dem das Stefan Dingen dann
angesprungen ist um mich kritisieren zu wollen.
EAF schrieb:> Zu Belohnung, hast du mich ernsthaft sauer gemacht.> Wenn du das erreichen wolltest, dann hast du damit Erfolg!>> Tipp:> Genieße deine momentanen Glücksgefühle, die werde ich dir schon noch> austreiben.> Und zwar fachlich und gewürzt mit einer gehörige Ladung Verachtung.> Das möchtest du doch.....
Ich glaube fast, hier ist Testosteron im Spiel.
- face plant -
EAF schrieb:> Nicht ähnlich.> Sondern C++!> Wie kann ich dir das beweisen?
Mir fällt dazu ein Dialog aus "Kingdom o Magic" ein:
Thidney trifft einen Ork und sagt "Oh, ein Goblin".
Der Ork drauf (zornig); "Ich bin kein Goblin, sndern ein ORK!".
Darauf Thidney: "Ist doch dasselbe, nur größer und häßlicher!"
Hier gab's ja auch Leute, die nicht in Pascal, sonden in Delphi
programmierten.
Frohe Weihnacht!
W.S.
W.S. schrieb:> Hier gab's ja auch Leute, die nicht in Pascal, sonden in Delphi> programmierten.
Das sind immerhin zwei weit auseinander liegende Versionen mit
unterschiedlichen Features.
Arduino hat aber weder eine eigene Sprache noch einen eigenen
abgespeckten Compiler. Es ist der Ork in seiner vollen Größe.
Eva T. schrieb:> Hallo zusammen, bin noch Einsteiger und habe ein kleines problem> ich möchte einen String in ein char convertieren.
Versuche vorher, mal das Ganze zu verstehen.
Also ein char ist gemeinhin irgend ein Textzeichen, also irgend etwas
Druckbares. In C kann man damit auch rechnen, weil die Erfinder von C
unter 'char' eigentlich das Byte verstehen wollten und es somit als
kleinstes Integerformat gilt.
Strings gibt es in C nicht. Punkt. Stattdessen gibt es Felder von Bytes,
wo man Bytes aka char's hineintun kann und um das Ende davon zu
kennzeichnen, fügt man anschließend ein Nullbyte dran.
Das, was du als String betrachtest, ist also eine Folge von Bytes,
gefolgt von einem Byte, was 0 ist. Und das sind mehrere Bytes (aka
char's) und nicht bloß ein char. So eine von dir beabsichtigte
Konvertierung kann also prinzipiell nicht funktionieren.
Eva T. schrieb:> String input = "Hallo test";
Versuche mal, auch das zu verstehen. Du deklarierst also eine Variable,
die folglich ins RAM kommt (wir sind hier ja bei den Mikrocontrollern)
und die soll die Zeichenfolge Hallo test enthalten. Wer bittesehr soll
das in den RAM stopfen? Vielleicht sagst du jetzt "der Startup-Code soll
mir das machen", also schau in den Startupcode, ob der sich wirklich
darum kümmert und schau in die von deiner Toolchain erzeugte Datei, ob
da wirklich die Anweisungen dazu drinstehen. Willst du nicht, weil es
dir zu kompliziert ist? Dann verlaß dich nicht drauf, sondern mache es
anders. Ohne solche Umwege wie Kopieren von einem RAM-Bereich in einen
anderen.
Was passiert bei dir eigentlich, wenn du folgendes schreibst:
Serial.println("Hallo test");
Das wäre doch wohl das, was du von deinem Programm haben willst.
W.S.
Es geht um das Verketten von Strings und Zeichenketten in Arduino, um
sie zusammen am Stück auszugeben. Strings sind C++ Objekte. Auf die
zugehörige Dokumentation wurde bereits verwiesen. Mehrere Möglichkeiten
wurden erörtert, und die Notwendigkeit der Verkettung wurde hinterfragt.
Und dann kommst du:
W.S. schrieb:> Das, was du als String betrachtest, ist also eine Folge von Bytes,> gefolgt von einem Byte, was 0 ist.
Du hast mal wieder Null Ahnung von der Sache und zudem nicht gelesen,
was andere vor dir schrieben. Die Frage des TO hast du nicht einmal ein
bisschen beantwortet. Den unpassender Beitrag stiftet nur Verwirrung.
Ich hatte mal eine hohe Meinung von dir, aber deine Beiträge werden
immer sinnloser. Was ist los?
EAF schrieb:> Rolf M. schrieb:>> Ich finde jetzt nicht, dass es Magie ist, wenn jemand zwei Strings vor>> der Ausgabe nicht erst zu einem zusammen kopiert, sondern direkt separat>> ausgibt. Und er hat doch Recht: man spart sich bei der zweiten Variante>> den sonst nötigen Speicher für den zusätzlichen String, was auf µCs je>> nach Typ schon sinnvoll sein kann.>> Hast du vielleicht gesehen, dass ich genau so ein Beispiel auch> vorgeführt habe?
Ich sehe von dir das hier:
EAF schrieb:> Eva T. schrieb:>> ich möchte zu dem input noch etwas dazu schreiben.>> Also:> Serial.println(input + " was anderes");> Habe ich irgendwo gesagt, man(oder Frau) müsse unbedingt unnötige Buffer> anlegen?
Nein, aber du hast gesagt, dass es egal sei, wenn man das tut:
EAF schrieb:> Ja und?> Ja es wird ein Buffer auf dem Heap angelegt!> Aber dank RAII auch wieder abgebaut.> Also: Nullsumme, in Sachen Speicher.
Es stimmt zwar in dem Sinne, dass nach der Aktion nicht mehr Speicher
belegt ist als davor, aber darum ging es nicht. Es ging darum, dass
während ihr zusätzlicher Speicher unnötig belegt wird.
> Im Eingangsposting wird nach der Verknüpfung 2er Strings gefragt, vor> der Ausgabe. Dazu kamen viele Aussagen, die String völlig unnötig zu> C-strings konvertieren wollten, sogar mit memcpy() usw.
Ja, die waren unsinnig, brauchen aber auch nicht mehr Platz als dein
Beispiel oben mit dem Operator +.
W.S. schrieb:> Strings gibt es in C nicht. Punkt.
Es gibt in C keinen eigenen Datentyp für Strings. Strings an sich gibt
es natürlich schon, denn sonst könnte man keinen Text ausgeben.
> Stattdessen gibt es Felder von Bytes, wo man Bytes aka char's hineintun> kann und um das Ende davon zu kennzeichnen, fügt man anschließend ein> Nullbyte dran.
Genau das ist in C ein String: Ein Array aus char, das mit einem
Nullbyte endet.
> Das, was du als String betrachtest, ist also eine Folge von Bytes,> gefolgt von einem Byte, was 0 ist.
Nein, da es hier gar nicht um C geht und der TO mit "String" kein Array
aus char, sondern die Arduino-Klasse String gemeint hat.
> Versuche mal, auch das zu verstehen. Du deklarierst also eine Variable,> die folglich ins RAM kommt (wir sind hier ja bei den Mikrocontrollern)> und die soll die Zeichenfolge Hallo test enthalten. Wer bittesehr soll> das in den RAM stopfen? Vielleicht sagst du jetzt "der Startup-Code soll> mir das machen",
Wer das macht, ist egal. Das abstrahiert die Sprache/die API, damit man
sich selbst nicht drum kümmern muss. Worum man sich allerdings kümmern
muss ist, dass man nicht zu viel Speicher braucht.
> also schau in den Startupcode, ob der sich wirklich darum kümmert und> schau in die von deiner Toolchain erzeugte Datei, ob da wirklich die> Anweisungen dazu drinstehen.
Ich hab ja schon bemerkt, dass du zu glauben scheinst, jeder C-Compiler
enthielte einen Zufallsgenerator, der dafür sorgt, dass irgendwas
passiert, statt dem, was man in den Code geschrieben hat. Aber langsam
nimmt diese Paranoia doch bedenkliche Züge an.
Rolf M. schrieb:> Genau das ist in C ein String
Es ist kein String, sondern bloß etwas, das jemand derart genannt hat.
Im Grunde sind das bloß aneinander gereihte Zeichen mit abschließendem
Nullbyte - ohne jetzt auf den C typischen Mischmasch zwischen Zeichen
und numerischen Dingen eingehen zu wollen. Und C++ hat das alles von C
geerbt. Aber auf C++ bin ich nicht eingegangen und tu es auch jetzt
nicht. Nur am Rande: in Pascal reicht es nicht aus, den Platz für ein
Objekt zu reservieren, es muß auch mit seinem Konstruktor erstmal
eingerichtet worden sein, bevor man mit ihm irgend etwas anstellen kann,
z.B. irgend etwas ihm zuzuweisen.
Für Strings würde es auch Funktionalität zum Behandeln und Verknüpfen
geben, abe keine Methoden eines Objektes sondern so etwa wie:
jetzt:= '18'+':'+'24'+' Uhr';
oder
if name = 'Meier' then ...
Aber bei C gibt es sowas eben nicht, sondern lediglich Funktionen str...
zum Behandeln, die in C geschrieben sind bzw. sein können. Eben deshalb,
weil es in C keinen Datentyp String gibt.
Das, was gerade Anfänger immer wieder vor den Kopf stößt und sie damit
verwirrt, ist der Umstand, daß vieles in C sehr salopp benannt wird und
die betreffende Bezeichnung inhaltlich nicht sauber definiert ist.
Allenfalls so etwa: "das ist hier eben SO!"
Stefan F. schrieb:> W.S. schrieb:>> Hier gab's ja auch Leute, die nicht in Pascal, sonden in Delphi>> programmierten.>> Das sind immerhin zwei weit auseinander liegende Versionen mit> unterschiedlichen Features.
OMG - noch so einer. Du scheinst mittlerweile öfter als üblich sämtliche
Dinge zu verwechseln. Sprache und Entwicklungsumgebung wie man hier
sieht. Damit du dir das mal merken kannst: Pascal = Sprache, Delphi =
Entwicklungsumgebung. Das sind zwei ganz verschiedene Dinge, obwohl sie
miteinander zu tun haben.
Mal ganz grundsätzlich: Man kann durchaus mit so lala geeigneten Worten
die Kommunikation untereinander flüssiger machen, vorausgesetzt, alle
wissen Bescheid und wollen unter der Bezeichnung das Gleiche verstehen.
Für den Disput mit einem Neuankömmling ist das hingegen unangebracht, da
ist sprachliche und sachliche Präzision eher nötig. Sonst
verselbständigt sich das Besprochene und es entstehen falsche
Schlußfolgerungen daraus. Und daraus dann Hilferufe wie dieser Thread
hier.
W.S.
W.S. schrieb:> Aber auf C++ bin ich nicht eingegangen
Das ist halt määh, weil Eva lange vor deinem Beitrag klar gestellt hat,
dass sie Arduino C++ verwendet. Korrekte Sprache hilft nicht, wenn man
damit vollkommen am Thema vorbei antwortet. Deine C Kenntnisse sind hier
vollkommen irrelevant.
Stefan F. schrieb:> Das ist halt määh, weil Eva lange vor deinem Beitrag klar gestellt hat,> dass sie Arduino C++ verwendet.
Das ist egal, weil das, was sie da schrieb, ganz offensichtlich in C
genauso wie in C++ auf falschen Vorstellungen beruht. Schließlich ist
das Verhältnis zwischen C und C++ wie oben scherzeshalber geschrieben so
wie zwischen Goblin und Ork.
Du hast dummes Zeug erzählt und willst dich jetzt irgendwie
herauswinden. Ist geschenkt, ich bin dir deswegen nicht nachtragend.
Allerdings sollte jeder (ja JEDER!), der mit C++ auf dem PC
herumprogrammiert, sorgfältig nachsehen, was es da für Haken geben kann,
wenn man das so einfach auf einen Mikrocontroller überträgt. Hier hat
man kein OS, was einem die ganze Vorarbeit erledigt und keinen
ubiquitären RAM. Bei Zeugs, was man als const hinschreibt wie z.B.
const char meldung[] = "ottokar ist hier";
kann man davon ausgehen, daß sowas im Flash landet, während man bei
Variablen, die im RAM vereinbart sind, sich immer fragen sollte, ob und
von wem die gewünschte Vorbelegung erledigt werden soll oder ob man bei
einem Objekt nach dem Reservieren des Platzes auch noch dessen
Konstruktor aufrufen sollte und so. Es gibt also ein paar Unterschiede
bei der Programmierung zwischen PC und µC. Und ein Compiler macht
(meistens) das, was man ihm hingeschrieben hat und nicht das, was man
damit gemeint hat. Ausnahme GCC bisweilen.
W.S.
W.S. schrieb:> Rolf M. schrieb:>> Genau das ist in C ein String>> Es ist kein String, sondern bloß etwas, das jemand derart genannt hat.
Natürlich ist es ein String. Ganz allgemein gesprochen ist ein String
einfach eine Zeichenkette. Dass C dafür keinen eigenen Datentyp hat,
sondern ein Array aus Zeichen nutzt, ändert daran nichts.
> Aber auf C++ bin ich nicht eingegangen und tu es auch jetzt nicht.
Das ist es aber, worum es hier geht. Es ist wenig sinnvoll, auf eine
Frage zu einer Programmiersprache als Antwort zu erklären, warum das in
einer anderen Programmiersprache nicht geht. Und der Unterschied ist an
der Stelle durchaus signifikant.
> Nur am Rande: in Pascal reicht es nicht aus, den Platz für ein> Objekt zu reservieren, es muß auch mit seinem Konstruktor erstmal> eingerichtet worden sein, bevor man mit ihm irgend etwas anstellen kann,> z.B. irgend etwas ihm zuzuweisen.
In C++ werden Konstruktoren automatisch beim Erzeugen des Objekts
aufgerufen.
> Für Strings würde es auch Funktionalität zum Behandeln und Verknüpfen> geben, abe keine Methoden eines Objektes sondern so etwa wie:> jetzt:= '18'+':'+'24'+' Uhr';
Genau die gibt es für die Klasse, die im ursprünglichen Posting
verwendet und benannt wurde.
https://docs.arduino.cc/built-in-examples/strings/StringAdditionOperator
In C gibt es die natürlich nicht, aber da das hier nicht zum Einsatz
kommt, ist das vollkommen irrelevant.
W.S. schrieb:> Du hast dummes Zeug erzählt und willst dich jetzt> irgendwie herauswinden.
Ich glaube du verwechselst mich mit jemand anderen. Ich war derjenige,
der auf den RAM Bedarf hinwies. Ich war derjenige, der die Relevanz
dessen verteidigte. Ich rede mich aus gar nichts heraus. Worauf beziehst
du dich?
Jetzt erzählst du mir, dass Mikrocontroller weniger RAM haben und ihn
anders verwalten, als PC. Ach was! Genau das war doch der Grund meines
Beitrages.
Stefan F. schrieb:> Ich war derjenige, der die Relevanz> dessen verteidigte.
Bla bla...
Stefan F. schrieb:> und genau das war doch der Grund meines Beitrages.
Nein der Grund der meisten deiner Beiträge ist die Selbstprästation.
Narzisstisches Verhalten.
Hier wolltest du wieder einen Thread kapern und mit deinen Ansichten
fluten.
Ist dir fast gelungen.
Stefan F. schrieb:> Das sind immerhin zwei weit auseinander liegende Versionen mit> unterschiedlichen Features.
Ach Stefan Du beweist gerade mal wieder das Du so gar keine Anhnung
hast, zuminsdest nicht von Pascal und Delphi.
Es wurde hier schon x-mal im Forum erläutert, das Delphi keine
Programmiersprache und auch kein Pascaldialekt ist.
Delphi ist schlichtweg die Programmierumgebung, also die IDE. Die
Programmiersprache die klassisch in Zusammenhang mit Delphi benutzt
wird, ist halt Pascal oder besser Objektpascal, eine Erweiterung des
klassischen Pascals von Wirth. Es ist auch nicht erforderlich, die
Objectpascalprogramme mit Hilfe der Delphi-IDE zu kompilieren. Das
funktioniert genauso gut scriptgesteuert und/oder unter Einbeziehung von
make. Auch hinter der Delphi-IDE steckt am Ende nur die DCCxx.EXE der
eigentliche Kompiler.
Allerdings ist die Delphi IDE auch nicht nur auf (Object)Pascal
beschränkt. Spätestens nach Delphi 7 ist das anders. Das nachfolgendende
Delphi2005 konnte neben Pascal (mit und ohne .NET) auch C#. In der
Folgeversion wurde aus Delphi dann das BORLAND Developer Studio. In der
Version 2006 war dann auch noch die vollständige C++ Umgebung von
Borland enthalten. Später dann bei XE kam dann auch noch PHP dazu.
Es gibt auch immer noch Delphi zu kaufen, darunter wird aber immer noch
die IDE verstanden und nicht die Programmiersprache.
Mit Delphi & Pascal ist es eben genauso wie mit Arduino & C++. Letzteres
ist genau genommen ein Konglomerat aus HW & SW. Auf der SW-Seite bedient
man sich halt der Programmiersprache C++ und zum Erstellen der Programme
benutzt man halt die Arduino-IDE, aber man schreibt am Ende C++
Programme, auch wenn das auf den ersten Blick nicht ersichtlich ist.
>> Das (Pascal und Delphi) sind immerhin zwei weit auseinander>> liegende Versionen mit unterschiedlichen Features.Zeno schrieb:> Ach Stefan Du beweist gerade mal wieder das Du so gar keine Anhnung> hast, zuminsdest nicht von Pascal und Delphi.
Zwischen Pascal und Delphi liegen noch Turbo Pascal und Object Pascal.
Weißt du, was wir gemeinsam haben? Eine katastrophale Rechtschreibung.
Wir sind uns ähnlicher, als du denkst.
Ich habe in Borlands Turbo Pascal 6 und 7 meine beiden ersten größeren
Auftragsarbeiten programmiert. Eine Datenbank samt GUI für ein
medizinisches Institut, sowie eine Partnervermittlung, die danach so gut
lief, dass der Kunde sein bisheriges Hauptgeschäft (Immobilienmakler)
aufgab. Danach bin ich auf C++ umgestiegen, habe die Entwicklung von
Delphi aber noch am Rande mit bekommen, weil Kollegen damit arbeiteten.
Du solltest nicht so voreilig über Leute urteilen, die du gar nicht
kennst.
Falls noch jemand nach treten möchte, bitte beeilen. Denn wenn das so
weiter geht wird der Thread bald gesperrt.
Stefan F. schrieb:> Zwischen Pascal und Delphi liegen noch Turbo Pascal und Object Pascal.
Wie kann man man nur so viel gequirlte Scheiße erzählen. Wenn Du Dich
nicht wirklich auskennst, dann solltest Du einfach mal Griffel still
halten. Ja es wissen alle hier das Du das nicht kannst und überall
Deinen Senf dazugeben mußt.
Turbo Pascal ist eben auch kein Pascaldialekt sondern ebenfalls eine
Entwicklungsumgebung/Compiler, zu neudeutsch IDE. Turbopascal ist
praktisch das DOS-Äquivalent zu Delphi. Beide Entwicklungsumgebungen
können sowohl Pascal als auch Object Pascal kompilieren. Turbo Pascal
kann dies seit Version 5.5 , da wurde nämlich die Objektorientierung bei
Turbo Pascal eingeführt, ab Version 6 gab's dann Turbo Vision eine
objektorientiert GUI-Bibliothek für DOS.
Nach Turbo Pascal kam dann Borland Pascal und danach Delphi. Das mit
jeder neuen Compilerversion auch neue Features in Pascal/Object Pascal
Einzug gehalten haben ist eine andere Sache.
Stefan F. schrieb:> Du solltest nicht so voreilig über Leute urteilen, die du gar nicht> kennst.
Ich urteile nicht voreilig. Du hast etwas sachlich völlig falsch
dargestellt und ich habe es korrigiert. Und was machst Du? An statt
noch einmal über das nachzudenken was Du da schreibst, legst Du noch
einmal nach und vermengst wieder Programmiersprache und
Entwicklungsumgebung. Das sind 2 völlig unterschiedliche Dinge, auch
dann noch wenn sie sich gegenseitig in gewissem Maße beeinflussen. Ich
schreibe ja auch nicht, ich programmiere eine Anwendung in Visual
Studio. Ich programmiere sie mit Visual Studio und benutze zum
Programmieren z.B. C#.
Stefan F. schrieb:> Falls noch jemand nach treten möchte, bitte beeilen. Denn wenn das so> weiter geht wird der Thread bald gesperrt.
Das ist auch nicht getreten, ich habe lediglich gesagt das Deine Aussage
bezüglich Pascal vs. Delphi falsch ist. Du hattest da auf einen Post von
W.S. geantwortet und so wie Du geantwortet hast liest sich das für mich,
das es da bei Dir keinen Unterschied zwischen Pascal und Delphi gibt.
W.S. schrieb:>> Hier gab's ja auch Leute, die nicht in Pascal, sonden in Delphi>> programmierten.Stefan F. schrieb:> Das sind immerhin zwei weit auseinander liegende Versionen mit> unterschiedlichen Features.Zeno schrieb:> so wie Du geantwortet hast liest sich das für mich,> das es da bei Dir keinen Unterschied zwischen Pascal und Delphi gibt.
Kann es sein, dass du kein Deutsch verstehst?
"zwei weit auseinander liegende Versionen mit unterschiedlichen
Features" bedeutet keinesfalls, dass es da bei mir "keinen Unterschied
zwischen Pascal und Delphi gibt".
Zeno schrieb:> Wie kann man man nur so viel gequirlte Scheiße erzählen.
Ja, wie kannst du nur?
Stefan F. schrieb:> Kann es sein, dass du kein Deutsch verstehst?
Kann es sein das Du Dich nicht richtig in Deutsch ausdrücken kannst und
man Dich deshalb nicht richtig versteht?
Zeno schrieb:> Wie kann man man nur so viel gequirlte Scheiße erzählen.Zeno schrieb:> solltest Du einfach mal Griffel still> halten. Ja es wissen alle hier das Du das nicht kannst und überall> Deinen Senf dazugeben mußt.Stefan F. schrieb:> Zeno, du hast Recht.
endlich (ich glaube aber nicht wirklich an Einsicht)
fred schrieb:> was für ein cooler thread ... LOL ... schade ums forum :(
Das ist hier schon immer so. Da muß man auch mal einstecken können -
mußte ich auch schon.
@Joachim:
Mir geht es doch gar nicht um die Einsicht. Da wurde ein Sachverhalt
nach meinem Verständnis nicht richtig dargestellt und ich wollte es
lediglich gerade rücken - mehr nicht. Habe halt nicht berücksichtigt,
daß das einer Majetätsbeleidigung gleich kommt - mein Fehler, damit
werde ich jetzt wohl leben müssen.
Zeno schrieb:> Da wurde ein Sachverhalt> nach meinem Verständnis nicht richtig dargestellt und ich wollte es> lediglich gerade rücken - mehr nicht.
Schwerlich möglich!
Die IchPerson benötigt Aufmerksamkeit.
Davon ernährt sie sich.
Diese erhält sie über das kapern von Threads, auslösen von Streit usw.
Die größte Freude scheint zu sein, wenn diese Threads daraufhin
geschlossen werden. Darum wohl auch die Ankündigung.
Das vermittelt wohl sowas wie AllMachtGefühle.
Irgendwas gerade rücken zu wollen, ist der ideale Nährboden für
Eskalationen mit der IchPerson.
Mein Rat:
Lass die IchPerson kommen... wenn sie nicht genug
Aufmerksamkeit(Sparflamme) bekommt, vergisst sie Realität und Wahrheit.
Dann kann man sie packen und der Lüge überführen.
So erreicht man keine Heilung, hat aber den Rest des Threads seine Ruhe.
Alles in allem, sind es Minderwertigkeitsgefühle und der Schrei nach
Liebe, welcher die IchPerson zu solchem Tun verleitet. Irgendwas mit
"früher Kindheit"
Übrigens:
Für IchPerson ist auch eine Tracht Prügel, sowas wie eine Zuwendung.
IchPerson ist zudem, kaum bis gar nicht, in der Lage/willens die
Situation von einee Ausßenperspektive zu betrachten. Denn es gibt kein
relevantes Außen für die IchPerson. Nur das Ich und die Aufmerksamkeit
die dem Ich gegeben wird.
Schön wäre wenn es hier eine Baumstruktur gäbe, dann würden die
Nebendiskussionen es einem Zweig geführt und das Thema selber nicht
stören.
Irgendwie war damals jedes Forum sinnvollerweise so aufgebaut
, wiesi jetzt nicht mehr?
Nur der TO sollte Beiträge bewerten können. Und schlecht bewertete
Beiträge sollten ausgeblendet werden und erst auf Anforderung
erscheinen. My 2ct.
LG, Sebastian
Sebastian schrieb:> Nur der TO sollte Beiträge bewerten können. Und schlecht bewertete> Beiträge sollten ausgeblendet werden und erst auf Anforderung> erscheinen. My 2ct.
Was passiert, wenn die Beiträge des TO selbst schlecht sind?
Peter K. schrieb:> Irgendwie war damals jedes Forum sinnvollerweise so aufgebaut
Weil solche Diskussions-Systeme damals überwiegend von
Computerspezialisten verwendet wurden (glaube ich). Durch die
Vereinfachung werden sie für andere User attraktiver.
Schau dir Apple Software an (oder Whatsapp), die haben mit der Methode
Erfolg.