Xin hat geschrieben:Und bevor ich das jetzt kompiliere, weiß ich, dass das falsch ist, weil es das beliebte Beispiel ist, um das Chaos von Variablendeklarationen mit dem Standard-Konstruktor, bzw. verkorksten Funktionszeigerdefinitionen.

Richtig. Warum dann die Frage?
Xin hat geschrieben:Wirklich nicht schön - aber nicht wirklich ein Problem.
Oder auch einfach A a{B{}}; oder A a{{}}; , wie im ersten Thread beschrieben.
Das Problem - die Funktionszeigerdeklarationen, die jeder ja jeden Tag benötigt, könnte man durch einen Kompatiblitätsmodus aus C herausoperieren. Macht man aber nicht.
Stattdessen bevorzugt man, dass man laufend diese Quizfrage gestellt bekommt.
Dieses Problem wurde mit den Braces als Initialisierung gelöst (siehe oben).
Die Syntax zur Definition von Funktionszeigern zu Ändern ist heute nicht mehr möglich, da zu viel (C *und* C++)-Code darauf beruht.
Mag sein, dass das in Genesys anders sein wird, bitte erkläre das aber an
der richtigen Stelle.
Xin hat geschrieben:fat-lobyte hat geschrieben:Xin hat geschrieben:Du legst temporäre Objekte an, um sie zu kopieren.
Eben nicht! Das musste ich bisher, jetzt kann ich sie statt zu kopieren in das Objekt "hineinmoven".
Und das konntest Du vorher nicht?
Nein, RValues gabs damals noch nicht und man konnte außer per Zeiger keine Objekte "bewegen", nur kopieren.
Xin hat geschrieben:Hier wird es schwierig, denn was ein Compiler aus einer Initialisierungsliste macht ist nicht zwangsläufig das, was die Sprache semantisch hergibt. Sich darauf zu verlassen, dass der Compiler das Problem löst/wegoptimiert, obwohl die Sprache das semantisch gar nicht ausdrückt, kann zu interessanten Unterschieden zwischen Debug und Releaseversion führen.
Ich sehe hier keinen "Move".
Hier nicht, der Overhead fürs kopieren entspricht dem Kopieren von zwei Variablen. Wenn du noch nicht ganz verstanden hast, was Move-Konstruktoren sind, lies dir bitte diesen Thread durch:
http://www.proggen.org/forum/viewtopic.php?f=21&t=4522
Dort ist auch ein Beispiel zu finden, wie so ein "Move" funktioniert.
fat-lobyte hat geschrieben:Aber hier gleich mal mein Hauptkriterium für eine gute Sprache:
Ich will ausdrücken können was ich denke. Die Konzepte will ich mit möglichst wenig Syntaktischem Overhead aufs papier bringen. Was ich nicht will ist es mit dem Compiler zu spielen, damit er tut was ich will oder mich in die Hardware einarbeiten wo ich für ein Paar Optimierungen den "Kopf brechen" muss - das soll verdammt noch mal der Compiler machen, dafür gibts ihn ja.
C++ mit seinen Templates ist (zumindest auf der Bibliotheks-Anwenderseite) verdammt gut darin. Kannst du das toppen?
Ja.
Dann bin ich mal gespannt. Seit C++11 sind meine Anforderungen an eine Sprache extrem hoch. Wenn du bereit bist, zeig mal was du hast.
Xin hat geschrieben:Du und ich benutzen Linux. Wenn jemand C oder C++ lernen möchte, dann ist sein primäres Ziel C und C++ zu lernen. Eventuell unter Windows.
Ich benutze aktuell den GCC 4.4. Meine Programme kompilieren auch mit VC2010.
Das ist klar, wenn man nicht die Möglichkeiten der Sprache ausreizt.
Xin hat geschrieben:In der Firma habe ich das Problem, dass einige Programmteile mit VC6 kompilieren müssen. Das ist schon leicht extrem, aber alte Compiler unterstützen zu müssen ist in Firmen ein recht übliches Problem.
Das ist Schade für dich, aber für mich wäre das inakzeptabel. In einem Privaten Projekt würde ich mir nie einfallen lassen VC 6 oder GCC < 4 zu unterstützen. Wenn ich dafür bezahlt werden würde, wäre das erste was ich machen würde meinen Chef dazu zu drängen, dass man die VC 6 Unterstützung aufgibt.
Xin hat geschrieben:Ich lasse weiterhin jeden meiner Schüler mit C-Strings und selbstgeschriebenen Listen arbeiten, sowie Klassen dafür entwickeln und am Schluss Templates dafür entwickeln. Danach dürfen sie std::string oder std::vector verwenden. Auch strlen() ist verboten, bevor sie es nicht selbst geschrieben haben.
Das ist eine Möglichkeit. Aber hast du dir überlegt, dass sie in der Zeit, in der sie sich mit strlen() abplagen auch andere Dinge höherer Abstraktion lernen könnten?
Nicht jeder der Programmieren lernt, wird später Programmierer. Es gibt genug Physiker, Biologen, Chemiker, und viele andere Wissenschaftler die Programmieren können müssen. Außerdem gibt es auch genug leute, die mit ihrem Computer einfach Dinge effizienter erledigen wollen, ansonsten sich aber nicht viel für Informatik interessieren.
Solchen leuten würde ich vieles nicht zumuten wollen, und ihnen aber auch nicht das Programmieren verwehren. Nicht in C, aber gerade in C++ kann man einige Aufgaben mit höher abstrahierten Methoden erledigen.
Der Weg programmieren zu lernen ist heute länger als vor 20 oder 30 Jahren, weil 20-30 Jahre Weiterentwicklung stattgefunden hat. Das Ziel 'Programmieren zu können' ist weiter weg. Aber um ans Ziel zu kommen gibt es keine Autobahn, keine Abkürzung und kein Wurmloch.
Das ist Blödsinn. Die 20-30 Jahre Entwicklung, die stattgefunden haben müssen nicht von jedem Schüler erneut durchgemacht werden. Leider wird das aber oft so unterrichtet, weil die Lehrenden diesen Weg eben selbst miterlebt haben.
Das Wurmloch und die Abkürzung nennt man dann "Reflexion" - nachdenken darüber was sinnvoll ist und was nicht.
Abgesehen davon - die richtige Verwendung "alter" Techniken ist die Zukunft. Dafür sollte man nicht nur kennen, was zurzeit in Mode ist oder gehypt wird. Ansonsten wäre ich nämlich jetzt Ex-Delphi, Ex-Java, gegenwärtiger C#-Entwickler, statt seit bald 20 Jahren C++-Entwickler.
Natürlich braucht man auch low-level Menschen, das ist gar keine Frage. Die Frage ist: wie viele braucht man? Soll man jeden Programmierer dazu ausbilden zuerst seine eigene strlen() funktion zu Programmieren? Wie viele implementierungen gibt es, würdest du schätzen? Ich bin mittlerweile etwas lockerer mit C#/Java, da ich akzeptiert habe dass es auch in Ordnung ist, auch vorgefertigte Frameworks zu verwenden um (schnell!) sein Ziel zu erreichen.
Wer nur einen Hammer hat, sieht überall nur Nägel. C++ ist mein Hammer - das ist auch keine gute Sache. Deswegen habe ich Java versucht und Python gelernt (aber auch x86-Assembler).
Alte Techniken sind in der Regel schneller als moderne
Das kann man so nicht stehenlassen. Wenn man Abstraktionsschichten dazwischenschiebt, dann vielleicht (aber nicht zwangsläufig).
Wenn das Problem aber richtig angegangen wird, sind manche "moderne" Techniken sogar schneller. Vergleiche std::sort<>() mit qsort(). Kleine herausforderung: schreibe eine schnellere und gleich generische Klasse als std::vector<>. Dann lassen wir sie im Test gegen die Implementierung von Visual Studio oder libstdc++ antreten.
Ich denke, dass man sich vieles nochmal genau anschauen sollte und statt alternativer Lösungen sich vielleicht Gedanken machen kann, ob die alten Techniken nicht semantisch abgesichert werden können.
Und da geht einiges.

Da ist vl. was dran.
Auch wenn das durch Optimierung des Codes teils sicherlich obsolete ist, so wird eine Sprache damit eindeutig. Denn wenn jeder Konstruktor eine statische Variable hochzählt, dann stimmt entweder die statische Variable nicht bei allen Compilern oder die Optimierung wird dafür ausgeschaltet, obwohl der Entwickler gar kein zusätzliches, temporäres Objekt wünscht. Was der Entwickler wirklich will, muss er sagen können - unabhängig von der Optimizerstufe.
Das ist ein konstruirtes Problem. Was ich will ist, dass mein Objekt initialiert ist. Was ich will ist, dass mein Computer das erledigt was ich will, in absehbarer Zeit. Dafür gibt es C überhaupt - eine Abstraktion weg von assembler. Mir ist egal wie und was da passiert, solange a) das Ergebnis das gleiche und b) die Laufzeit kurz ist. Für a) gibt es Standardisierungen, für b) gibt Compiler mit guten Optimizern. Klar hilft es, wenn man eine ungefähre Ahnung von den Laufzeiten seiner algorithmen hat (O(n), O(ln n), O(n^2), oder wie sie heißen...) Aber es heißt NICHT dass man seinen Code auf eine CPU schreibt und sich dann wundert, warums auf anderen Systemen auf einmal langsmer läuft.
[quote="Xin]
fat-lobyte hat geschrieben:Xin hat geschrieben:Machst Du bei GDB/GIT weiter?
Ja, kann ich machen. Was ich nicht machen kann ist dir ein Versprechen abzugeben wann das geschieht. Leider.
Kein Problem, solange es so schnell wie möglich ist.

Ich will proggen.org ja auch zum lernen nutzen.

[/quote]
Versteh ich. Aber ich sollte auch mal langsam an Prüfungen und meine Bachelorarbeit denken.
Haters gonna hate, potatoes gonna potate.