Forum: Compiler & IDEs Ja ja, Arduino, C++ und die Strings.


von Christian M. (Gast)


Lesenswert?

Hallo Programmierer,

ich quäle mich hier schon seit Stunden mit diesem unsäglichen Arduino 
ab. Kurz die Randbedingungen: Arduino Nano 3.0, Arduino IDE, 
ENC28J60-Modul über SPI, UIPEthernet-Library. Lib schon erfolgreich 
eingesetzt, also funktioniert!

Bei dieser Zeile:
1
Serial.write(client.read());

bei der die ankommenden Daten (byteweise?) direkt zur seriellen 
Schnittstelle schickt, möchte ich einzelne Zeichen durch andere ersetzen 
(konkret "$" durch ","). Dafür habe ich schon folgendes probiert:
1
client.read(string2send);
2
string2send.replace("$", ",");
3
Serial.write(string2send);

sowie auch:
1
string2send = client.read();
2
string2send.replace("$", ",");
3
Serial.write(string2send);

bekomme aber nur Fehlermeldungen in der ersten Zeile. Ich weiss, ich 
vermische irgendwas mit Klassen und Variablen, aber ich habe keine 
Ahnung von diesem unsäglichen C. Und wieso sind Strings einmal einfach 
Variablen und einmal (char-)Arrays?

Mit folgendem Code bringe ich die Fehlermeldung in der ersten Zeile weg:
1
String string2send = String(client.read());
2
string2send.replace("$", ",");
3
Serial.write(int(string2send));

Scheint irgendwie logisch, obwohl ich es nicht zu 100% verstehe. Aber 
jetzt hängt er in der dritten Zeile. Und auch ein:
1
Serial.write(int(string2send));

bringt nichts. Irgendwie schaft er die "Typenrücktransformation" nicht. 
Was kann man da machen?

Gruss Chregu

von Don (Gast)


Lesenswert?

C++ lernen. Rumraten bringt nichts.

von Pic T. (pic)


Lesenswert?

Serial.write(client.read());


{ char ch=client.read();
if (ch=='$') h=',';
Serial.write(ch);}

von Christian M. (Gast)


Lesenswert?

Ach weisst Du wie mir der Unterschied zwischen C++ und chinesisch 
vorkommt?
Das eine ist eine unlogische, unstrukturierte Aneinanderreihung von 
Buchstaben, und das Andere ist eine von vielen Chinesen gesprochene 
Sprache!

Gruss Chregu

von Christian M. (Gast)


Lesenswert?

Pic T. schrieb im Beitrag #4556244 (+1c):
> { char ch=client.read();
> if (ch=='$') ch=',';
> Serial.write(ch);}

Ja, das funktioniert tatsächlich perfekt! Danke!

Chregu

von Rolf M. (rmagnus)


Lesenswert?

Christian M. schrieb:
> Ach weisst Du wie mir der Unterschied zwischen C++ und chinesisch
> vorkommt?
> Das eine ist eine unlogische, unstrukturierte Aneinanderreihung von
> Buchstaben, und das Andere ist eine von vielen Chinesen gesprochene
> Sprache!

Und weißt du, was die Gemeinsamkeit ist? Wenn man keine Ahnung davon 
hat, kommt man nicht wirklich mit wildem rumraten und irgendwas 
hinschreiben voran. In beiden Fällen muss man die Sprache lernen, um sie 
zu verstehen.

von Christian M. (Gast)


Lesenswert?

Ach Don und Rolf,

Ihr wart noch nie im Ausland in den Ferien, denke ich. Denn da muss man 
die Sprache beherschen um sich zu verständigen. Ein bisschen wichtige 
Sätze lernen und mit Handzeichen bringt gar nichts.

Vielen Dank für Eure konstruktiven Beiträge. Entspricht genau dem Wind 
im Forum!

Gruss Chregu

von Der Andere (Gast)


Lesenswert?

Christian M. schrieb:
> Entspricht genau dem Wind im Forum!

Entspricht meist dem Wind, den der Fragesteller fahren lässt.
Bei dir stinkt der Wind nach Faulheit.

von Bernd K. (prof7bit)


Lesenswert?

Christian M. schrieb:
> Ein bisschen wichtige Sätze lernen und mit Handzeichen


Probier doch mal aus ob der Compiler intelligent genug ist deine 
Handzeichen richtig zu deuten.


> Entspricht genau dem Wind
> im Forum!

Nein, das ist der Kälte Wind der erbarmungslosen Realität. Wenn du dir 
den Pelz waschen willst musst du akzeptieren dabei nass zu werden. Wenn 
du einen Computer programmieren willst dann musst du seine Sprache 
lernen. Wenn du keine Zeit dafür hast musst du jemanden der das bereits 
kann dazu motivieren das für dich zu tun, so einfach ist das.

von Keiner N. (nichtgast)


Lesenswert?

Christian M. schrieb:
> Ihr wart noch nie im Ausland in den Ferien, denke ich. Denn da muss man
> die Sprache beherschen um sich zu verständigen. Ein bisschen wichtige
> Sätze lernen und mit Handzeichen bringt gar nichts.

Hä?

tut mir leid, bisher habe ich nie die Sprache des Landes gelernt. Könnte 
ich auch gar nicht, denn ich hab für Sprachen kein guten Händchen.

Du glaubst gar nicht, wie weit man mit Händen und Füßen und ein wenig 
guten Willen kommt. Im schlimmsten Fall tun es auch ein paar brocken 
Englisch.

von Bedeutungschwangere Fehlermeldung (Gast)


Lesenswert?

ich kann de, it, fr, en, es, hr, dumm und einfältig.
Aber ich kann deine Fehlermeldungen nicht raten.
Wie lauten deine Fehlermeldungen genau?

von The D. (thedaz)


Lesenswert?

Glaubt hier jemand ernsthaft, dass der TO die empörten posts noch liest 
?

von Howlin Wolf (Gast)


Lesenswert?

The D. schrieb:
> Glaubt hier jemand ernsthaft, dass der TO die empörten posts noch liest
> ?

Nein, warum auch? Er hat eine konstruktive Antwort bekommen, die ihm 
half. Dafür hat er sich bedankt. Damit ist die Sache erledigt.

von Oliver S. (oliverso)


Lesenswert?

Howlin Wolf schrieb:
> Er hat eine konstruktive Antwort bekommen, die ihm
> half.

Christian M. schrieb:
> ENC28J60-Modul über SPI, UIPEthernet-Library.
> ...
> ich habe keine
> Ahnung von diesem unsäglichen C



Die einzige Antwort, die ihm wirklich weiterhilft, ist diese:

Don schrieb:
> C++ lernen. Rumraten bringt nichts.

Oliver

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Howlin Wolf schrieb:
> Er hat eine konstruktive Antwort bekommen, die ihm
> half. Dafür hat er sich bedankt. Damit ist die Sache erledigt.

Aber für wie lange? Beim nächsten Problem schlägt er wieder hier auf.

Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre 
einen Mann zu fischen und du ernährst ihn für sein Leben.
Konfuzius

Er wird also um das Lernen nicht herumkommen.

: Bearbeitet durch Moderator
von Der Andere (Gast)


Lesenswert?

Frank M. schrieb:
> Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre
> einen Mann zu fischen und du ernährst ihn für sein Leben.

Das ist zu hoch für die Guttenberg Generation.

von Howlin Wolf (Gast)


Lesenswert?

Frank M. schrieb:
> Gib einem Mann einen Fisch und du ernährst ihn für einen Tag.

Bitteschön:

><((((*>

Frank M. schrieb:
> Er wird also um das Lernen nicht herumkommen.

Christian M. schrieb:
> Ach weisst Du wie mir der Unterschied zwischen C++ und chinesisch
> vorkommt?
> Das eine ist eine unlogische, unstrukturierte Aneinanderreihung von
> Buchstaben, und das Andere ist eine von vielen Chinesen gesprochene
> Sprache!

Volltreffer!
Nur: Wer zwingt Dich, mit diesem Kram zu arbeiten? Nimm eine Sprache, in 
der die Syntax nicht so ein verworrenes Zeug ist. Es bringt nur Verdruß, 
in 5 Minuten ein Programmgerüst in Pseudocode zu Papier zu bringen und 
sich dann 5 Tage mit der Syntax einer Zeile Quelltext herumärgern zu 
müssen.

von Der Andere (Gast)


Lesenswert?

Howlin Wolf schrieb:
> Es bringt nur Verdruß,
> in 5 Minuten ein Programmgerüst in Pseudocode zu Papier zu bringen

Du glaubst doch nicht dass der TO weiss was Pseudocode ist.

von Oliver S. (oliverso)


Lesenswert?

Howlin Wolf schrieb:
> Nimm eine Sprache, in
> der die Syntax nicht so ein verworrenes Zeug ist.

Auf deine Vorschläge bin ich jetzt aber gespannt. Die praktische 
Einschränkung "Arduino Nano 3.0" sollte allerdings schon beachtet 
werden...

Oliver

von Howlin Wolf (Gast)


Lesenswert?

Oliver S. schrieb:
> Auf deine Vorschläge bin ich jetzt aber gespannt.

Um die Spannung nicht in's Unermeßliche zu steigern ;-)

-Bascom
-Assembler

Oliver S. schrieb:
> Die praktische
> Einschränkung "Arduino Nano 3.0" sollte allerdings schon beachtet
> werden...

Das ist keine Einschränkung. Dem Kontroller ist es gleichgültig, womit 
die .hex-Datei erstellt wurde, mit der er geflasht wird.
Man kann die Arduino-Programmierumgebung nutzen -/muß/ man aber nicht.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Howlin Wolf schrieb:

> -Assembler

Du glaubst ernsthaft, dass der TE, der schon mit ein bisschen
Stringverarbeitung in C++ überfordert ist, ein auch nur ansatzweise
benutzbares Assemblerprogramm aus dem Boden gestampft bekäme?

Eher lernt Moby C++. :-)

von W.S. (Gast)


Lesenswert?

Howlin Wolf schrieb:
> Um die Spannung nicht in's Unermeßliche zu steigern ;-)
>
> -Bascom
> -Assembler

Tja.. merkt ihr was?

Merkt ihr inzwischen was - oder wirklich noch immer nix?

Die Liste der Alternativen ist wirklich ein bissel kurz, gelle?

Ja, wir haben uns das selber zu verdanken, daß wir heutzutage nur noch 
zwischen C, C++ und Assembler oder auf wenigen Systemen BASCOM wählen 
können.

Aber wir waren ja jahrzehntelang alle so unendlich klug, so daß wir auf 
jede Alternative mit vollster Verachtung herabgeschaut haben und sie 
nicht benutzten.

So sind die Alternativen inzwischen eingegangen, vertrocknet wie die 
Primeln und die Szene ist eben nicht entwicklerfreundlicher geworden, 
sondern das Gegenteil.

Selbst sowas einfaches wie ein HW-Register:
1
"#define SYSTICK_CTRL     (*(volatile unsigned long*) 0xE000E010)"

hätte man leserlicher als
1
var
2
  SYSTICK_CTRL : dword absolute $E000E010;
haben können. Aber wer nicht gewollt hat, kriegst's nimmermehr (IAR 
lassen wir mal vorab.)


Ätsch, selber dran schuld. Das ist ziemlch genauso wie beim Autokauf, wo 
man nur noch Mercedes, BMW und Audi zu je 30% im Markt hat (Passat als 
Rest) und beim Aufrufen der Preise für's Blechle einem schlecht wird.

Ebenfalls ätsch.

Es ist durch alle Sparten hindurch das gleiche Schema.

W.S.

von The D. (thedaz)


Lesenswert?

Erstens sehe ich keine Äquivalenz zwischen deinen beiden Beispielen und 
zweitens: glaubst du wirklich, daß Millionen von Entwicklern zu dumm 
sind zu begreifen, was sie falsch oder richtig machen?

: Bearbeitet durch User
von avr (Gast)


Lesenswert?

W.S. schrieb:
> Selbst sowas einfaches wie ein HW-Register:"#define SYSTICK_CTRL
> (*(volatile unsigned long*) 0xE000E010)"
>
> hätte man leserlicher alsvar
>   SYSTICK_CTRL : dword absolute $E000E010;
> haben können. Aber wer nicht gewollt hat, kriegst's nimmermehr (IAR
> lassen wir mal vorab.)

Was ist denn daran überhaupt logisch? Die obere Zeile ist normales C und 
wenn man das Prinzip verstanden hat einfach und simpel. Dein 
Geschreibsel dagegen ist kein C und man müsste die Syntax modifizieren. 
Abgesehen davon dass ich nicht weiß was das absolute soll, fehlt in 
deiner Version das unsigned und volatile.

C ist alles andere als komplziert, wenn man das Prinzip verstanden hat. 
C++ setzt noch eins obendrauf, das Design ist trotzdem logisch 
aufgebaut, hat aber eine gewisse Komplexität. Über Bascom und Assembler 
müssen wir hier gar nicht erst sprechen. Die Möglichkeiten in den beiden 
Sprachen sind im Vergleich zu C++ verschwindend gering.

Auch wenn es dir nicht gefällt: C bzw. C++ hat sich eben etabliert, weil 
damit effektive Hardwarenahe Programmierung möglich ist. Der Trend geht 
sogar inzwischen in Richtung C++. Nur weil du damit nicht zurecht 
kommst, trifft das nicht auf den Rest der Welt zu.

von Carl D. (jcw2)


Lesenswert?

W.S. schrieb:
> Selbst sowas einfaches wie ein HW-Register:"#define SYSTICK_CTRL
> (*(volatile unsigned long*) 0xE000E010)"
>
> hätte man leserlicher alsvar
>   SYSTICK_CTRL : dword absolute $E000E010;
> haben können. Aber wer nicht gewollt hat, kriegst's nimmermehr (IAR
> lassen wir mal vorab.)

Volatile braucht eben nur ein C(++)-Compiler, denn das andere Zeugs kann 
mit diesem Hinweis eh nix anfangen. Das braucht man nur, wenn man soweit 
optimieren kann, daß man den Unterschied "zwischen jederzeit (von der 
HW) änderbar" oder "nur von aktuellen Code abhängig" überhaupt bemerkt. 
Hochsprachen ohne C im Namen ahnen davon meist nichts.

von Programmiersprachentheaterintendant (Gast)


Lesenswert?

avr schrieb:
> W.S. schrieb:
>> Selbst sowas einfaches wie ein HW-Register:"#define SYSTICK_CTRL
>> (*(volatile unsigned long*) 0xE000E010)"

> Die obere Zeile ist normales C und

Die obere Zeile ist eben kein C.
C ist leider so arm, dass trotz aller 
"Vielseitigkeit"/"Mächtigkeit"/"Systemnähe" nicht auf eine separate 
Präprozessor-/Makrosprache verzichtet weden kann.
Die obere Zeile ist Präprozessor (CPP)

M.M.n. ist Arbeitsmässig (sog. Professionell) nur so überwältigend viel 
C/C++ vorhanden, weil damit dermassen viele Böcke geschossen wurden dass 
eben Unmengen an Nacharbeit, Reimplementationen, Redesigns, 
Folgeprodukte usw. nötig wurden.
Hat sich also zum Selbstläufer entwickelt - aber eben nicht weil es 
"gut" ist (für viele Metriken von "gut").

von The D. (thedaz)


Lesenswert?

Programmiersprachentheaterintendant schrieb:
> avr schrieb:
>> W.S. schrieb:
>>> Selbst sowas einfaches wie ein HW-Register:"#define SYSTICK_CTRL
>>> (*(volatile unsigned long*) 0xE000E010)"
>
>> Die obere Zeile ist normales C und
>
> Die obere Zeile ist eben kein C.
> C ist leider so arm, dass trotz aller
> "Vielseitigkeit"/"Mächtigkeit"/"Systemnähe" nicht auf eine separate
> Präprozessor-/Makrosprache verzichtet werden kann.

Falsch. Geht auch ohne #define. Z.B. als Konstante.

> Die obere Zeile ist Präprozessor (CPP)
>
> M.M.n. ist Arbeitsmässig (sog. Professionell) nur so überwältigend viel
> C/C++ vorhanden, weil damit dermassen viele Böcke geschossen wurden dass
> eben Unmengen an Nacharbeit, Reimplementationen, Redesigns,
> Folgeprodukte usw. nötig wurden.
> Hat sich also zum Selbstläufer entwickelt - aber eben nicht weil es
> "gut" ist (für viele Metriken von "gut").

Da lehnst du dich zu weit aus dem Fenster. Es werden auch jede Menge 
Neuentwicklungen damit gemacht und das nicht nur, weil es eine breite 
Skillbasis dafür gibt. Die ist auch bei anderen Sprachen vorhanden. Man 
darf halt nicht stur immer das gleiche tun sondern muß bewusst die 
Werkzeuge wählen, die die meisten Anforderungen abdecken.

: Bearbeitet durch User
von Programmiersprachentheaterintendant (Gast)


Lesenswert?

>> C ist leider so arm, dass trotz aller
>> "Vielseitigkeit"/"Mächtigkeit"/"Systemnähe" nicht auf eine separate
>> Präprozessor-/Makrosprache verzichtet werden kann.
>
> Falsch. Geht auch ohne #define. Z.B. als Konstante.

Ein Symbol für einen Wert definieren: ja, sehr gerne - ist schliesslich 
der vorzuziehene Weg.

Ein "include guard": na dann mach Du das mal als Konstante, oder 
sonstwie ohne CPP...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Programmiersprachentheaterintendant schrieb:
> Ein "include guard": na dann mach Du das mal als Konstante, oder
> sonstwie ohne CPP...

Ohne CPP hast du gar keine #includes.

von Rolf M. (rmagnus)


Lesenswert?

Programmiersprachentheaterintendant schrieb:
> Die obere Zeile ist eben kein C.
> C ist leider so arm, dass trotz aller
> "Vielseitigkeit"/"Mächtigkeit"/"Systemnähe" nicht auf eine separate
> Präprozessor-/Makrosprache verzichtet weden kann.
> Die obere Zeile ist Präprozessor (CPP)

Der Präprozessor ist Teil von C. Er ist in jedem C-Compiler enthalten 
und hat eine in der C-Norm genau definierte Syntax. Jedes C-Programm, 
das etwas erkennbares tut, nutzt den Präprozessor. Zu behaupten, das sei 
kein C, ist Unsinn.

avr schrieb:
> Auch wenn es dir nicht gefällt: C bzw. C++ hat sich eben etabliert, weil
> damit effektive Hardwarenahe Programmierung möglich ist. Der Trend geht
> sogar inzwischen in Richtung C++. Nur weil du damit nicht zurecht
> kommst, trifft das nicht auf den Rest der Welt zu.

Es ist auch ganz normal, dass technische Dinge, die man nicht versteht, 
wahlweise wie Magie oder wie konfuses Zeug wirken. Man hat dann drei 
Möglichkeiten, damit umzugehen: Man lernt es, man beschäftigt sich 
einfach mit was anderem, oder man macht sich in einem Forum lächerlich.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rolf M. schrieb:
> Es ist auch ganz normal, dass technische Dinge, die man nicht versteht,
> wahlweise wie Magie oder wie konfuses Zeug wirken. Man hat dann drei
> Möglichkeiten, damit umzugehen: Man lernt es, man beschäftigt sich
> einfach mit was anderem, oder man macht sich in einem Forum lächerlich.

Das ist signaturverdächtig. ;-)

von Der Andere (Gast)


Lesenswert?

Rolf you made my day :-)

von Mike (Gast)


Lesenswert?

Rolf M. schrieb:
> Der Präprozessor ist Teil von C. Er ist in jedem C-Compiler enthalten
> und hat eine in der C-Norm genau definierte Syntax. Jedes C-Programm,
> das etwas erkennbares tut, nutzt den Präprozessor. Zu behaupten, das sei
> kein C, ist Unsinn.

...und auf Grund der Unzulänglichkeit von C/C++ muss der 
Präprozessor/Makroprozessor auch entsprechend mächtig sein. Das ist 
nichts weiter als ein aufgepeppter Makro-Assembler.

Gottseidank das C auf dem absteigenden Ast ist, finde heutzutage mal 
noch gute C/C++ Entwickler, die Meisten machen doch schon längst in Java 
und anderem Sprachmatsch. Das Einzige was die neuen Sprachen mit C 
gemeinsam haben ist die geschweifte Klammer und das Semikolon.

von Bernd K. (prof7bit)


Lesenswert?

Mike schrieb:
> ...und auf Grund der Unzulänglichkeit von C/C++ [..] die Meisten
> machen doch schon längst in Java und anderem Sprachmatsch.[...]
> Das Einzige was die neuen Sprachen [...] geschweifte Klammer

Und was schlägst Du nun vor nach dieser vernichtenden allumfassenden 
Kritik?

von Rolf M. (rmagnus)


Lesenswert?

Mike schrieb:
> ...und auf Grund der Unzulänglichkeit von C/C++ muss der
> Präprozessor/Makroprozessor auch entsprechend mächtig sein.

In C++ gibt es für die meisten Stellen, an denen in C Makros benötigt 
werden, Alternativen.

> Das ist nichts weiter als ein aufgepeppter Makro-Assembler.

Und was ist daran schlimm?

> Gottseidank das C auf dem absteigenden Ast ist, finde heutzutage mal
> noch gute C/C++ Entwickler, die Meisten machen doch schon längst in Java
> und anderem Sprachmatsch.

Auf µCs? Ich kann da nicht viel absteigendes bei C erkennen, und Java 
spielt dort keine Rolle.

von Matthias K. (mkeller)


Lesenswert?

Normalerweise beteilige ich mich nicht an solchen Threads wie, "C/C++ 
ist blöd" oder "C/C++ ist die tollste Programmiersprache".

Trotzdem würde ich gern ein paar alternative Vorschläge zu C bzw. C++ 
hören und zwar für den embedded Bereich (8-32bit Mikrocontroller wie ARM 
Cortex M0..M4  STM8  AVR).

Mir fallen da wirkliche keine ein.

Java in dem Bereich war wohl als Witz gemeint. In welche Sprache wird 
denn die VM für Java geschrieben?

Die Sprache sollte nicht platformspezifisch sein wie z.B. BASCOM.

von Bernd K. (prof7bit)


Lesenswert?

Matthias K. schrieb:
> Trotzdem würde ich gern ein paar alternative Vorschläge zu C bzw. C++
> hören und zwar für den embedded Bereich (8-32bit Mikrocontroller wie ARM
> Cortex M0..M4  STM8  AVR).

Es gibt wohl den einen oder anderen real existierende Pascal Compiler 
und auch bei FPC gibts wohl ein paar angefangene aber noch unfertige 
Backends für einige Controller, ARM-Cortex scheint wohl am weitesten 
fortgeschritten zu sein: http://wiki.freepascal.org/TARGET_Embedded

> Mir fallen da wirkliche keine ein.

Ja, leider recht wenig bis gar keine Auswahl.

: Bearbeitet durch User
von Matthias K. (mkeller)


Lesenswert?

Danke für den Hinweis.

Naja das ganze scheint aber wirklich noch am Anfang zu stehen...

Ich persönlich finde Pascal hat ein paar Merkmale die die Sprache 
"besser" bzw. sicherer macht (Zuweisung mit ":=" statt "="), aber einige 
Eigenschaften sind halt echte Einschränkungen, wenn man C++ kennt 
(Bitoperationen, direkte Zuweisung wie z.B. i += a; oder i &= 1).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.