Neuigkeiten in C++

Na ja. Mit "jedes" hast du natürlich recht. Man durfte in C viel Mist machen, was einem heute ein guter C++ Compiler nicht mehr durchgehen lässt.

Wenn du widersprechen möchtest, sieh deine eventuellen Gegenbeispiele als das an, was ich unter Mist verstehe.

Ich widerspreche!
Und nein, ich sehe sie nicht als Mist an.
C hat sich unabhängig von C++ weiter entwickelt.
Fortschritte gemacht.
So leid es mir tut, aber Fortschritte in die richtige Richtung zu machen kann ich nicht als Mist ansehen.

Eins der Gegenbeispiele, welche du als Mist klassifizieren möchtest:
Die Struktur initialisierung!

struct Test
{
  int wert;
  float andererWert;
};

struct Test testc = {
                     .wert=5,
                     .andererWert=3.14
                   };
       

Diese Art der Initialisierung ist viel deutlicher, als die Initialisierung in C++ .


struct Test
{
  int wert;
  float andererWert;
};

Test testcpp = {
                     5,
                     3.14
               };

In den Punkt ist C ganz klar fortschrittlicher als C++
C++ kennt die "designated initializers" nicht

Freundlicher weise schenkt uns der gnu Compiler dann doch eine Alternative:

Test testcpp = {
                   wert:  5,
                   andererWert: 3.14
               };

Und jetzt die Gretchen (eher rhetorische) Frage:
Gehört ein besser lesbarer Quelltext in die Kategorie Mist?

Einspruch, Euer Ehren!
"Mist" kannst Du in fast jeder Programmiersprache veranstalten. Selbst wenn sie einigermaßen typsicher ist, können geübte Dilettanten jeden Zuwachs an Hardware-Performance wieder zunichte machen und/oder komplett nicht überschaubare und wartbare Konstrukte erzeugen.

C ist für mich - in Verbindung mit ein paar geschickten Libraries - flapsig formuliert sowas wie ein sehr komfortabler Macro-Assembler. Volle Kontrolle und damit einhergehend auch volle Verantwortung.

C++ -- hmmm, da muss ich mich noch entscheiden, weil ich es zu wenig kann und anders sozialisiert wurde (eben mit FORTRAN77 und diversen Maschinensprachen).
Klassen, Interfaces, Vererbung und Templates erlauben nach meiner unbedeutenden Ansicht erhöhte Flexibilität und Wiederverwendbarkeit, allerdings nur bei korrekter Architektur. Und das ist eine der schwersten und verantwortungsvollsten Aufgaben im ganzen Business.

Warum sollten wir die Vorteile von C++ auf dem Arduino nicht nutzen?

Danke,. @combie Wenn ich noch C benutzen würde, den Compiler upgedated hätte und dieses Feature dabei nicht bemerkt, hätte ich jetzt was gelernt :slight_smile:

Klar ist das prima lesbar und evtl./vermutlich wird die gnu-spezifische Erweiterung auch mal C++ - Standard.

Auch FORTRAN hat sich nach FORTRAN77 noch weiterentwickelt, aber nachdem ich mal mindestens ein halbes Jahr damit verbracht habe, FORTRAN-Programme nach C zu portieren, war mir das egal.

Ab C++20 dann doch :wink:

2 Likes

Ich danke dir!
c++20 gerade getestet, dann kann mein AVR gcc das doch

Was dann ein gutes Beispiel dafür ist, dass alte Meinungen, Konzepte und Erkenntnisse manchmal nur eine begrenzte Haltbarkeitsdauer haben.

Oben auf meiner Wunschliste steht die Gcc Erweiterung für Flash.
Welche C kann und C++ noch nicht.
Noch schöner, das gleiche nochmal fürs EEPROM

#include <Arduino.h>

const __flash int var = 4711;

int main()
{
  DDRB = _BV(PB5);
  PORTB = 0 ; // aus

  if(4711 == var)
    PORTB = _BV(PB5); // ein

  
  for(;;);
  
}

Das würde einem das ganze Rumgehackel mit dem PROGMEM ersparen.

Ist dann aber weniger C++ als eher plattformspezifisch.

Ja! Kann man so sehen.
Allerdings, AVR Gnu C kann es, AVR Gnu C++ kann es nicht.
Die Plattform alleine ist es also nicht.

Das war mir jetzt auch neu. Coole Sache. Danke auch von mir.

Ich bin auch anders sozialert.
Z80 Assembler, Forth, Pascal(Turbo und Delphi)
Beruflich auch recht viel C

Wirklich zu C++ bin ich auch erst durch Arduino gekommen.
Eben, als ich hier eingeschlagen bin.

Mir auch, ist mir bei den C++20 Features durch die Lappen gegangen.

Leider:
Für die Allgemeinheit auch eher uninteressant. Die IDE dümpelt noch auf C++11 im Auslieferungszustand.

Eine Frage in der Runde:
Wer hat denn seine IDE auf modernere C++ Versionen aufgerüstet?
So das man z.B. die C++20 Features testen kann....
(@Doc_Arduino , du ja auf jeden Fall)

Aber auch C++11 bietet einiges an Features, welche keinen Speicher und auch keine Laufzeit fressen.
Ich mag z.B. die "user defined literals" nicht mehr missen.
Und das "using", in all seinen Facetten.

Ein Beispiel für Beides:

#include <CombieTypeMangling.h> 
using namespace Combie:: Millis;

const Millis interval {333_ms};



void setup() 
{
}

void loop() 
{
  delay(interval);
  delay(1.5_hr);
  delay(17_Sekunden + 1_Minute);
}

So ist es erst mal nur faszinierend klar im Ausdruck.
Ein großes Plus an Typesicherheit bringt es so noch nicht, außer, dass Berechnungen mit solchen Zeiten immer auch unsigned long durchgeführt werden. Die versehentliche evtl. störende Aufweitung der Zeiten auf Vorzeichenbehaftet ist damit aus dem Rennen.

Ich finde das ist auch ein gutes Beispiel dafür, wie (relativ) modernes C++ den Code lesbarer und sicherer macht.
Für kostenlos.

Das erinert mich jetzt sehr stark an Forth, und also statt using.

Durchaus...
Ist es doch auch Teil der Forth Philosophie, die Sprache/System soweit zu modifizieren, dass sich das Problem optimal darin abbilden lässt.

Beispiel (sinngemäß aus einem meiner Forth Codes):

scheibe 30 grad rechts drehen

Klarer kann man kaum zum Ausdruck bringen, was man vom System will.

Ja, Forth war für mich ein Quell der Erkenntnisse, Denkweisen, von dem ich immer noch zehre.
Wenn ich einen Schuldigen suche, wenn ich mich frage, warum ich so bekloppt bin, wie ich bin, dann zeige ich auf Forth.
Ich glaube, ein bis zwei Jahrzehnte Forth, daran wird jeder "anders".

Hallo,

mit den user defined literals habe ich auch schon rumgemacht und bspw. meinen Timer/Uhr ausgestattet. Erspart lästige Umrechnungen. Ist wirklich eine coole Sache. Vor paar Wochen habe ich mit Type Traits angefangen mich da reinzudenken. Das muss aktuell alles pausieren. Auf alle Fälle merke ich daran wie schnell Code veraltet wenn man neue Möglichkeiten entdeckt. Mich würde auch einmal interessieren wer eine neuere Toolchain verwendet.

Mit Datentypen arbeiten, fast so als wären es Daten.
Auch so eine faszinierende Geschichte, und zudem Laufzeit kostenlos.

Zu dem Themenkomplex gehört auch noch eine weitere Erkenntnis.

Unser Kompiler besteht ja aus 2 Sprachen, der Präprozessor und halt die eigentliche Sprache.

Der Präprozessor ist flapsig gesagt: Stocken doof.
Oder in Informatik Sprech: Er ist nicht Turing Vollständig
C selber und auch C++ sind es sehr wohl

Irgendwann wurden mal Templates an C++ dran geklebt.
Eine Templatemaschine erfunden.

Dann, einige Zeit später, kam ein kluges Köpfchen auf die Erkenntnis:
Die Templatemaschine selber ist auch Turing Vollständig.

Wir haben also mit C++ zwei recht unterschiedliche Turing Maschinen in einem Paket.
C++ selber zur Laufzeit und die Templateengine zur Kompilezeit.
Darin steckt offensichtlich große Macht. Auch wieder kostenlos dazu zum eigentlichen C++.
Da kratze ich allerdings auch bisher nur an der Oberfläche, ohne wirklich zu wissen, wie weit der Eisberg in die Tiefe reicht.

Hei

Ich glaube ich habe mich Gestern etwas von meiner Begeisterung, hin und weg, reißen lassen.

Aber der Grundsatz ist unverändert.
Es gibt eine gefühlte Million an C++ Features/Möglichkeiten, die C nicht zu bieten hat. Dazu gehört eben auch, dass man vieles in die Compilezeit verlagern kann.

Gut, dann soviel, wie die Fähigkeiten des Programmierers zulassen!

Ein paar Beschränkungen gibts auf Grund der geringen Speichergröße.
Ein paar, weil das STL Gedönse nicht beim AVR gcc dabei ist.

Dem:

stimme ich also voll zu.

Die eigentlichen Grenzen liegen in einem selber.

Hallo,

ich habe mal die Links rausgesucht wo es mit Templates losging. Jeden Montag gibts einen neuen Beitrag. Entweder verfolgt man das auf heise oder trägt sich bei Rainer Grimm in den Newsletter ein. Das .pdf Päckchen gibts allerdings nur per Newsletter. Falls das jemanden näher interessiert oder irgendwann vor hat sich damit zu beschäftigen.

Links vom Zeitraum 26.04.2021 - 06.12.2021
https://heise.de/-6027028
https://heise.de/-6033521
https://heise.de/-6041663
https://heise.de/-6052426
https://heise.de/-6057082
https://heise.de/-6062972
https://heise.de/-6069388
https://heise.de/-6110476
https://heise.de/-6118187
https://heise.de/-6121736
https://heise.de/-6124700
https://heise.de/-6140991
https://heise.de/-6146819
https://heise.de/-6151298
https://heise.de/-6157802
https://heise.de/-6165404
https://heise.de/-6182100
https://heise.de/-6189541
https://heise.de/-6195143
https://heise.de/-6200578
https://heise.de/-6205933
https://heise.de/-6212495
https://heise.de/-6219623
https://heise.de/-6226085
https://heise.de/-6233576
https://heise.de/-6237233
https://heise.de/-6266012
https://heise.de/-6273014
https://heise.de/-6277964
https://heise.de/-6283615

2019-10-22 Concurrency.zip (349,3 KB)
2021-06-14 Coroutines.zip (959,1 KB)
2021-09-15 Modules.zip (764,3 KB)

(Links repariert)

2 Likes

@Doc_Arduino
Ich möchte dir ja keinen Vorwurf machen, im Gegenteil, bin Dankbar für den Kram.
Arbeite es gerade durch.....

Vermute allerdings, dass das eher abschreckend, auf die Gegner von Jammertälern, wirkt.

Hallo,

Template/Meta-Programmierung zu denen ja Type Traits gehört ist schwere Kost. Ist nun einmal so. Nur was ist schon leicht? Zum Threadthema passt das, denn Arduino verträgt fast alles, DrDiettrich wollte wissen was geht und hat "STL" ins Spiel gebracht. Meistens sind es, für mich jedenfalls, genau solche Randthemen die plötzlich auftauchen und einen Thread richtig interessant machen. Ich bearbeite und lerne das auch nicht nebenbei. Vielleicht muss man auch nicht alles im Detail verstehen. Später nutzt man es bestimmt sowieso "nur noch". Und ob das jemand abschreckend findet? Gute Frage. Klassen haben mich früher auch abgeschreckt und später für gut befunden. Ich sage mal so. Wer es gebrauchen kann nimmt es mit, wer es nicht will lässt es links liegen. Also der normale Wahnsinn. Alle Unterthemen werde ich sicherlich auch nicht beackern. In diesem Sinne ...

Moin Doc,
sage mal... ich war neugierig und dachte mal mit vector zu spielen...
Bin auf Wie kann man vector nutzen? - #4 by Doc_Arduino von Dir gestossen.

Leider kompiliert der Code nicht:

/Arduino/libraries/ArduinoSTL-master/src/del_opnt.cpp:25:56: error: 'nothrow_t' in namespace 'std' does not name a type
 _UCXXEXPORT void operator delete(void* ptr, const std::nothrow_t& ) throw() {
                                                        ^~~~~~~~~
/arduino-1.8.15/hardware/tools/avr/bin/avr-g++ -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10815 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR -I/arduino-1.8.15/hardware/arduino/avr/cores/arduino -I/arduino-1.8.15/hardware/arduino/avr/variants/mega -I/Arduino/libraries/ArduinoSTL-master/src /Arduino/libraries/ArduinoSTL-master/src/del_opv.cpp -o /tmp/arduino_build_634719/libraries/ArduinoSTL-master/del_opv.cpp.o
/Arduino/libraries/ArduinoSTL-master/src/del_ops.cpp:25:50: error: 'std::size_t' has not been declared
 _UCXXEXPORT void operator delete(void* ptr, std::size_t) throw(){
                                                  ^~~~~~
/Arduino/libraries/ArduinoSTL-master/src/ArduinoSTL.cpp: In function 'int arduino_putchar(char, FILE*)':
/Arduino/libraries/ArduinoSTL-master/src/ArduinoSTL.cpp:54:42: warning: unused parameter 'f' [-Wunused-parameter]
 static int arduino_putchar(char c, FILE* f) {
                                          ^
/Arduino/libraries/ArduinoSTL-master/src/ArduinoSTL.cpp: In function 'int arduino_getchar(FILE*)':
/Arduino/libraries/ArduinoSTL-master/src/ArduinoSTL.cpp:65:34: warning: unused parameter 'f' [-Wunused-parameter]
 static int arduino_getchar(FILE *f) {
                                  ^
Bibliothek ArduinoSTL-master in Version 1.1.0 im Ordner: /Arduino/libraries/ArduinoSTL-master  wird verwendet
exit status 1
Fehler beim Kompilieren für das Board Arduino Mega or Mega 2560.

:sob:
Ne Idee was klemmt?
Bib ist die aktuelle von hier: GitHub - mike-matera/ArduinoSTL: An STL and iostream implementation based on uClibc++ that supports my CS-11M class.