Hallo zusammen,
eine Frage zu C und C++, lohnt es sich eigentlich C und C++ gleichzeitig
zu lernen oder besteht da die Gefahr Dinge zu verwechseln? Ich möchte C
lernen um "Windows-Programmmierung" zu betreiben (zB nach dem Buch von
Charles Petzold).
wulga schrieb:> Ich möchte C lernen um "Windows-Programmmierung" zu betreiben
Herr, unseren täglichen Flamewar gib uns heute...
C ist für Windows-Programmierung denkbar schlecht geeignet.
Nimm lieber C# mit .NET (WPF oder WinForms) oder C++ mit Qt.
Wenn du sowieso C++ lernen willst, ist es am sinnvollsten C++ "normal"
zu lernen, und dir danach anzuschauen was davon in C geht. Das ist dann
ziemlich einfach.
Anders herum ist eher schlecht, weil du dann erstmal alle schlechten
C-Angewohnheiten wieder vergessen musst...
Wenn du onehin C++ kannst brauchst du C eigentlich nicht mehr außer für
obskure Plattformen für die es keinen C++ Compiler gibt. C Code lesen
ist für C++ Könner auch kein Problem.
wulga schrieb:
> lohnt es sich eigentlich C und C++ gleichzeitig zu lernen
Ich würde mich erst einmal mit C beschäftigen und erst danach mit C++.
Neben der Gefahr Dinge durcheinander zu bringen, dürfte der Umfang von
C++ doch gewaltig sein.
C ist immer empfehlenswert und danach kannst Du ja C++ mal antesten.
Sollte es Dir nicht gefallen, wird Dir Dein durch C erworbenes Wissen
jedenfalls nicht schaden, auch mit einer anderen Programmiersprache
zurecht zu kommen.
Matthias schrieb:> Sollte es Dir nicht gefallen, wird Dir Dein durch C erworbenes Wissen> jedenfalls nicht schaden, auch mit einer anderen Programmiersprache> zurecht zu kommen.
Eben doch. C bzw. viele C-Bücher bringen einem einen sehr prozeduralen,
nicht-typsicheren, OOP-feindlichen Programmierstil bei. Den muss man
erst einmal wieder un-lernen bevor man modernere Sprachen wie C++ lernt.
Daher lieber nicht mit C anfangen.
Matthias schrieb:> dürfte der Umfang von> C++ doch gewaltig sein.
Man muss ja nicht sofort alles lernen. Wenn richtig beigebracht, kann
man C++ zu Beginn leichter lernen.
wulga schrieb:> Ich möchte C> lernen um "Windows-Programmmierung" zu betreiben
warum?
win32 API geraffel ist von gestern und ein Zopf, den MS in den nächsten
Versionen sicherlich abschneiden wird.
Es macht imho mehr Sinn sich mit platform-abstrahierenden Frameworks
auseinander zu setzen.
Dann muss ich mir mal anschauen was Qt ist, danke auf alle Fälle mal für
den Hinweis.
C kann ich im Nachhinein immer noch lernen, von dem her ist es sicher
nicht schlimm wenn ich mich zuerst auf C++ konzentriere, ich will ja
auch GUI-Anwendungen machen (mit OpenGL) da komme ich an C++ ohnehin
nicht vorbei.
Sebastian V. O. schrieb:
> OpenGL hat eine C API.
Habe ich vergessen, ein nicht unwesentlicher Aspekt.
Programmierer schrieb:
>Eben doch. C bzw. viele C-Bücher bringen einem einen sehr prozeduralen,>nicht-typsicheren, OOP-feindlichen Programmierstil bei.
Könnte aber auch ein Vorteil sein, da man sich tiefer mit der Materie
und dem, was hinter der glitzernden GUI-Welt so stattfindet, auseinander
setzen muss.
Sicher, um Fenster und dergleichen zu erstellen gibt es
besseres/einfacheres, aber da er sich auf den Petzold bezogen hat, der
ja soweit ich weiß C genutzt hat, wird er sich schon etwas dabei gedacht
haben.
Anderenfalls hätte er vermutlich einen neueren Titel zu
GUI-Programmierung gewählt.
Sebastian V. schrieb:> OpenGL hat eine C API
Die Autoren von "OpenGL Superbible" schreiben man solle mit C++ vertraut
sein, das verstehe ich jetzt nicht. Es werden dort auch gleich im ersten
Beispiel Klassen genutzt.
wulga schrieb:> Die Autoren von "OpenGL Superbible" schreiben man solle mit C++ vertraut> sein, das verstehe ich jetzt nicht. Es werden dort auch gleich im ersten> Beispiel Klassen genutzt.
Weil der in den Beispielen erstellte Code C++ ist. Man könnte auch alles
in C machen aber die Autoren des Buchs haben sich hier eben für C++
entschieden.
Im Endeffekt ist es doch vollkommen wumpe, wie man anfängt. C++ ist vom
Design her darauf ausgelegt, verschiedene Programmierparadigmen zu
unterstützen. Soll heißen, du kannst prozedural, objektorientiert und in
begrenztem Maße sogar funktional programmieren und sogar auf statischer
Typebene (also während des Compilevorgangs) imposante Dinge betreiben
(http://blog.mattbierner.com/stupid-template-tricks-super-template-tetris/).
Möchtest Du also C++ in jeder Facette beherrschen, gehen auf jeden Fall
einige Jahre ins Land. Ohne Witz.
Einfacher hast du es mit C, weil einfach der Sprachumfang viel niedriger
ist. Solltest du objektorientierte Ansätze überhaupt noch nicht kennen -
bitte nimm Java, C#, Objective-C oder Python um die Vorzüge von
vollständig polymorphen Sprachen zu lernen.
Sind diese Voraussetzungen allerdings erfüllt, so kannst Du mit guten
OOP-Bibliotheken wie QT in C++ anfangen um dir von vornherein einen
ordentlichen Stil anzugewöhnen - das ist gerade bei der breiten Palette
an Paradigmen in C++ besonders schwierig einzuhalten, da immer die
Versuchung da ist, mal diesen und mal jenen "Trick" anzuwenden. Als
Einsteiger solltest du aber nicht unbedingt lernen, trickreich, sondern
sauber zu programmieren. Da hilft QT extrem.
wulga schrieb:> Die Autoren von "OpenGL Superbible" schreiben man solle mit C++ vertraut> sein, das verstehe ich jetzt nicht. Es werden dort auch gleich im ersten> Beispiel Klassen genutzt.
Klar, OOP drängt sich in diesem Bereich geradezu auf. Das hat ja nichts
damit zu tun, dass OpenGL eine C-API hat. Außen C++, innen u.a.
Verwendung der OpenGL-C-API.
Ich bin übrigens mit C++ angefangen zu programmieren. Wobei ich das im
Nachhinein eher als C mit ein wenig C++ bezeichnen würde. So habe ich
z.B. die cout und cin Objekte benutzt um Text auf der Konsole auszugeben
und einzulesen. Ansonsten habe ich auch eher wenig C++ Features genutzt
und für Strings mit strcpy/strcat gearbeitet. Mit der Zeit sind dann
immer mehr C++ Features dazu gekommen. Am Ende hat es dazu geführt, dass
ich lange Zeit nicht wusste welche Features es in C nicht gibt
(mittlerweile nachgeholt) und ich mir immer noch nicht die format
specifiers von printf merken kann (den für int kriege ich gerade noch
hin).
Man kann auch gut in C objektorientiert denken. Es müssen ja nicht alle
APIs so seltsam geraten sein wie die Win32-API mit Funktionen wie
CreateWindow(), MessageBox(), SystemParametersInfo() und so. Ganz schön
geraten sind z.B. die APIs von cairo und 0mq. Objektorientiert ohne den
ganzen Pattern-Wasserkopf, etc. Gtk+, hab' ich hier jetzt mal nicht
genannt, die haben mit GObject durch grässlich viel Boilerplate OOP an C
angeflanscht. Die API ist ganz bequem zu benutzten, nur eigene GObjects
möchte ich nicht schreiben.
Danke für eure Hilfe. Ich denke ich beginne damit C++ gründlich zu
lernen, dann GUI(FLTK für einfache Dinge, OpenGL für komplexe
3D-Anwendungen) und dann C, glaube das ist eine vernünftige Reihenfolge.
Habe auch schon ein gutes Buch vom C++ Erfinder selbst, das hier ist es
ISBN-13: 978-3868940053
Vlad T. schrieb:> win32 API geraffel ist von gestern und ein Zopf, den MS in den nächsten> Versionen sicherlich abschneiden wird.
Falsch
> Es macht imho mehr Sinn sich mit platform-abstrahierenden Frameworks> auseinander zu setzen.
Richtig, macht dennoch Sinn.
wulga schrieb:> Danke für eure Hilfe. Ich denke ich beginne damit C++ gründlich zu> lernen, dann GUI(FLTK für einfache Dinge, OpenGL für komplexe> 3D-Anwendungen) und dann C, glaube das ist eine vernünftige Reihenfolge.> Habe auch schon ein gutes Buch vom C++ Erfinder selbst, das hier ist es> ISBN-13: 978-3868940053
So, jetzt auch noch mein Senf dazu (könnte länger werden):
Zuerst mal möchte ich diesen Thread als solchen loben, weil er so schön
sachlich blieb. Hat man ja nicht so oft hier...
Ich möchte hier mal meinen Lieblingsspruch loswerden:
"Programmiersprachen sind wie Frauen. Kennst du eine, kennst du alle.
Nur im Geschmack sind sie unterschiedlich..."
(freiwillig 5€ in die Chauvikasse)
Meine persönliche Meinung (und eine andere wirst du von niemandem
hören...) ist diese:
Es kommt zunächst auch sehr darauf an, was man machen will. Den Plan,
zuerst C++ zu lernen und danach C sehe ich als problematisch an. C ist
-wie böse Zungen behaupten- ein besserer Macroassembler. Genau deswegen
schreibe ich meine ATMega-Bastelprogramme in C, weil ich zwar auch
ATMega-Assembler kann und auch schon viel damit gemacht habe, allein es
kostet unendlich viel mehr Zeit, den ganzen ItziBitzi-Kram, den man
immer wieder braucht, in Assembler zu programmieren. Auf so einem
'kleinem Eisen' braucht man trotzdem die Kontrolle über jeden
Prozessortakt, und den hat man in C.
Sobald die Probleme komplexer werden, braucht man mächtigere Werkzeuge,
die einem die ganze Basisarbeit abnehmen (oder man bastelt es sich
selber wie ehedem in C 'objektorientierte' Programmierung mit structs
und Funktionspointern schon erfunden wurde) und in eine gefälligere und
schneller zu schreibende Syntax fassen.
Steigt man an diesem Punkt ein, ist es natürlich sehr leicht möglich,
daß man Programme schreibt, die zwar funktionieren, aber man nicht mehr
so genau weiß, wie, weil ein Großteil der Funktionalität von der Sprache
oder gar von benutzten Libraries gekapselt wird. Von dort aus kann man
sich das Leben noch einfacher machen, und Sprachen benutzen, in denen
man noch nicht einmal die Datentypen genau kennen muß, die man
verwendet. Ab da wird es dann auch dem Vollspacko möglich, Programme zu
schreiben...
BTDT, ich habe neulich ein bash-script geschrieben, das trigonometrische
Funktionen verwendet. Das geht, und meine Kollegen von der Konsolenfront
haben mir den goldenen Bash-Orden am Seitenband verliehen...
Und dieser Stunt hätte in C ca. 50 mal mehr Codezeilen erfordert.
Und hat nur deswegen das Erstaunen meine Konsolenkollegen erregt, weil
sie das Programmieren nicht von der Pike auf gelernt haben.
(bash als alternatives Mittel der Wahl, ich traue mich kaum, es
'Programmiersprache' zu nennen, kenne ich erst seit ca. 2 Jahren...)
Um zum Thema zurück zu kommen:
Wenn du C nach C++ lernen willst, dann wirst du ganz viele Dinge von C++
vermissen. Wenn du mit C anfängst, wirst du über viele Möglichekeiten
von C++ erfreut sein...
Am Ende ist es sowieso egal, Hauptsache man fängt irgendwo an. Und da
sind C, C++ und Java gute Ansätze. Von Perl, Python, Javscript und PHP
hätte ich dringend abgeraten, aber das werde ich nicht weiter begründen,
weil das dann wirklich in einen Glaubenskrieg ausarten würde :-)
Vor allem, weil ich in all diesen Sprachen auch schon größere Programme
geschrieben habe. Und es mir sowas von überhaupt nicht gefallen hat...
IdS!
C oder C++ lernen!
Meiner Meinung nach: Erst C, dann ++. Andersrum wird dich verwirren
Meint
Baku
Lukas K. schrieb:> Man kann auch gut in C objektorientiert denken.
Die Frage ist eher, warum man das tun sollte, ausser als Notnagel. Die
meisten OOP-Ideen sind nur aufwendig und fehleranfällig mit einer
nicht-OOP-Sprache nachzubauen. Ich denke z.B. an (virtuelle) Vererbung,
eines der absoluten Kernkonzepte der OOP. Und bei den absolut simpelsten
Konzepten (Instanzen einer Klasse mit Members und Methoden, ohne
Vererbung) kann man eigentlich noch nicht von OOP sprechen.
P. M. schrieb:> Lukas K. schrieb:>> Man kann auch gut in C objektorientiert denken.>> Die Frage ist eher, warum man das tun sollte, ausser als Notnagel.
Weil es auch in C voneinander abhängige Datenstrukturen haben kann. Wenn
ich daten von einem BMW und einem Lastwagen in structs speichere,
erstelle ich zusätzlich ein struct Auto mit einem enum autoTyp als
erster member, das struct Lastwagen und das strukt BMW bekommen dann den
ersten member base mit type struct Auto. Wozu das gut ist? Dadurch muss
ich funktionen für Autos nicht zweimal schreiben.
> Die meisten OOP-Ideen sind nur aufwendig und fehleranfällig mit einer> nicht-OOP-Sprache nachzubauen.
Erfahrungssache. Wenn man Functionspointer und normale Pointer, sowie
die grundsätze des Speicherlayouts von structs und unions verstanden
hat, ist es in c oft kein mehraufwand mehr. Über andere nicht-OOP als c
kann ich jedoch nicht berichten.
Zum lernen empfehle ich mit C99 oder C90 anzufangen. Dann von C90 zu C99
zu C11 zu C++99 zu C++11 zu C++14
Alle C featurs die nicht in C++ vorkommen: (ich schliesse hiermit gnu
extensions explizit als teil von c/c++ aus)
1) Compound literale: (type){wert}
2) Designated initializers: struct type identifier={.member=value};
PS: Ich empfehle jedem beim compilieren einen c/c++ Standard anzugeben
und die warnungen auf Maximum zu stellen. Ich verwende bei gcc immer die
optionen -Wall -Wextra -Werror -pedantic -std=c11
Daniel A. schrieb:> Zum lernen empfehle ich mit C99 oder C90 anzufangen. Dann von C90 zu C99> zu C11 zu C++99 zu C++11 zu C++14
Nein. Genau das eben nicht.
Objektorientiertes Programmieren sollte man direkt und von Anfang an
lernen, und das geht nur mit C++.
Oliver
Stroustrup meint selbst, dass man mit C++ beginnen soll, da es zu keinen
guten Programmierstil führt mit C zu beginnen, es spricht dann aber auch
nichts dagegen beides parallel zu lernen (außer der
Verwechslungsgefahr).
Ich hätte die gleiche Frage,
ich kann bereits ganz passables Java; Und C habe ich ein Semester in der
Uni gehabt. Also alles bis einschließlich Zeiger sitzt. (Zumindest wenn
ich mich da mal für 2 Tage nochmal dran setzen würde)
Die Frage ist:
Mit C++ anfangen oder C Kenntnisse vertiefen?
Ich möchte mit den Kenntnissen in die µC-Programmierung (AVR)
einsteigen.
Mit dem Arduino habe ich bereits herum experimentiert, jedoch besteht
das Programmieren des Arduinos ja praktisch nur aus dem Finden der
passenden Libery für ein Modul, paar if/while-Blöcken und dem Einsetzen
von vorgefertigten Methoden. Da bleibt der große Lerneffekt aus.
Außerdem lässt sich ein Arduino nicht so einfach irgendwo einbetten und
wird auch in der Industrie nicht benutzt. Deswegen auch mein Interesse
am AVR.
Außerdem sollen noch Treiber programmiert werden um die AVRs mit dem PC
(primär Windows) kommunizieren zulassen. (Zb. Einen Controller bauen und
damit den PC fernsteuern)
lg
Dax schrieb:> Mit C++ anfangen oder C Kenntnisse vertiefen?
Nicht so einfach zu beantworten. Da du einen AVR programmieren möchtest
würde ich dir eher zu C raten, da man viele praktische Sachen aus der
Standardlibrary von C++ auf einem kleinen AVR nicht wirklich nutzen
kann. Andererseits ist der Umfang von C nicht so groß und in der Uni
Vorlesung hast du vermutlich jedes Feature wenigstens einmal kurz
gesehen. Es gibt da also möglicherweise nicht mehr viel zu vertiefen was
Features von C angeht (in das Programmieren von Algorithmen und gute
Strukturierung von Programmen kann man sich dagegen sehr lange
vertiefen). Es kommt also drauf an was dein Ziel ist. Wenn es das
fertige Programm in kurzer Zeit ist, dann bleibt bei C. Wenn du mal was
Neues ausprobieren möchtest und längere Entwicklungszeit OK ist, dann
schau dir ruhig C++ an.
Dax schrieb:> Ich möchte mit den Kenntnissen in die µC-Programmierung (AVR)> einsteigen.
C
> Außerdem sollen noch Treiber programmiert werden um die AVRs mit dem PC> (primär Windows) kommunizieren zulassen. (Zb. Einen Controller bauen und> damit den PC fernsteuern)
Meinst du wirklich Treiber oder "nur" Anwendungen, die über die üblichen
Schnittstellen und APIs mit dem Controller kommunizieren? Neben den
technischen Hürden würde bei Treibern nämlich u.a. die Zertifizierung
auf dich zukommen, wenn du sie weitergeben willst. Mal ganz abgesehen
von Sachen wie USB VID/PID.
Vielen Dank für die Antworten
Sebastian V. schrieb:> Andererseits ist der Umfang von C nicht so groß und in der Uni> Vorlesung hast du vermutlich jedes Feature wenigstens einmal kurz> gesehen
Also das waren im groben die Themen:
https://dl.dropboxusercontent.com/u/19641113/ThemenC.pngEisenberg schrieb:> Neben den> technischen Hürden würde bei Treibern nämlich u.a. die Zertifizierung> auf dich zukommen
Mir geht es nur um den Privatgebrauch. Jedoch sollte es wirklich ein
Treiber sein, sodass man sich praktisch eine USB-Tastaturerweiterung
bauen und benutzen kann oder eben über eine Anwendung das Gerät steuern,
wobei ein Treiber dazwischen sein soll und keine extra API.
Daniel A. schrieb:> Welches C?
c89/c90
wulga schrieb:> Hallo zusammen,>> eine Frage zu C und C++, lohnt es sich eigentlich C und C++ gleichzeitig> zu lernen oder besteht da die Gefahr Dinge zu verwechseln?
Es ist immer besser, sowas nacheinander zu machen.
Du lernst also zuerst das Laufen und dann später vielleicht mal das
Autofahren.
Und nich umgekehrt.
... und das spricht dann dafür, erst C und dann C++ zu lernen.
Denn in diesem Fall ist Laufen ein wesentlicher Teil vom Autofahren,
also ähnlich wie bei englischen oder italiensichen Modellen.
C++ ohne Verständnis für C ist kein C++.