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
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.
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.
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.
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".
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.
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.
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.
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 ...
/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.