C++ oder Java?
-
Und für Arbeiten am Linux-Kernel wäre C auch ganz ratsam. Also am besten nimmste zu C++ und Java das noch mit rein.
-
Brainfuck
-
Wenn man C++ kann, ist es ja kein Problem auf C umzusteigen. Wobei ich definitiv erst C++ und dann C lernen würde.
-
kingruedi schrieb:
Wenn man C++ kann, ist es ja kein Problem auf C umzusteigen. Wobei ich definitiv erst C++ und dann C lernen würde.
Sag das nicht, habe letzten Sommer zum Spaß mal nen kleines Text-RPG-Framework (Steuerung dann über ne Skriptsprache) gebastelt mit Ansi-C89/90 und das macht mal sowas von keinen Spaß. Vor allem die ganzen Stringmanipulationen, wenn man C++-Streams und std::string-verwöhnt ist.
-
User--- schrieb:
kingruedi schrieb:
Wenn man C++ kann, ist es ja kein Problem auf C umzusteigen. Wobei ich definitiv erst C++ und dann C lernen würde.
Sag das nicht, habe letzten Sommer zum Spaß mal nen kleines Text-RPG-Framework (Steuerung dann über ne Skriptsprache) gebastelt mit Ansi-C89/90 und das macht mal sowas von keinen Spaß. Vor allem die ganzen Stringmanipulationen, wenn man C++-Streams und std::string-verwöhnt ist.
Ich finde auch, dass der Weg low-lvl => high-lvl besser als high-lvl => low-lvl ist.
-
simon.phoenix schrieb:
User--- schrieb:
kingruedi schrieb:
Wenn man C++ kann, ist es ja kein Problem auf C umzusteigen. Wobei ich definitiv erst C++ und dann C lernen würde.
Sag das nicht, habe letzten Sommer zum Spaß mal nen kleines Text-RPG-Framework (Steuerung dann über ne Skriptsprache) gebastelt mit Ansi-C89/90 und das macht mal sowas von keinen Spaß. Vor allem die ganzen Stringmanipulationen, wenn man C++-Streams und std::string-verwöhnt ist.
Ich finde auch, dass der Weg low-lvl => high-lvl besser als high-lvl => low-lvl ist.
Weil?
Halte ich für totalen Quatsch. Zum einsteigen sollte es erstmal einfach sein.
Und ein
string name; cout << "Wie heißt du?\n"; cin >> name;
ist deutlich einfacher, als das C-Equivalent.
Zeiger, etc. sind in C von Anfang an total unverzichtbar, da sie ja selbst zur Stringmanipulation unabdingbar sind. Aber Zeiger sind ein Thema, mit dem Anfänger erfahrungsgemäß große Probleme haben.
In C++ brauche ich natürlich auch irgendwann mal Zeiger, kann es aber weiter aufschieben, wodurch erstmal ein grundsätzliches Verständnis für's Programmieren aufgebaut werden kann. Außerdem hat man dann schonmal vergleiche. Man kann einfach sagen: "Betrachten wir Zeiger erstmal, als sowas, wie die Iteratoren, die du schon von den Containern kennst, nur eben für die spracheigenen Arrays."Dann wird das ganze gleich viel eifnacher.
-
Helium schrieb:
Halte ich für totalen Quatsch. Zum einsteigen sollte es erstmal einfach sein.
Objektorientierung ist alles andere als einfach. Es ist bequemer, keine Frage, aber mit Sicherheit nicht einfacher. Schon mal ein Buch "Prozedurale Programmierung für Dummies" gesehen? Dagegen gibt es einige Bücher, die sich nicht damit beschäftigen, eine Sprache zu vermitteln sondern ausschließlich mit dem Konzept der OOP. Das sollte schon ein klarer Hinweis sein, was hier einfacher und was schwerer ist ...
Zeiger, etc. sind in C von Anfang an total unverzichtbar, da sie ja selbst zur Stringmanipulation unabdingbar sind. Aber Zeiger sind ein Thema, mit dem Anfänger erfahrungsgemäß große Probleme haben.
Zeiger kann man aber in drei Sätzen so erklären, dass es jeder kapiert hat. Das OOP-Konzept dagegen nicht. Und ...
Außerdem hat man dann schonmal vergleiche. Man kann einfach sagen: "Betrachten wir Zeiger erstmal, als sowas, wie die Iteratoren, die du schon von den Containern kennst, nur eben für die spracheigenen Arrays."
... die STL schon gleich gar nicht.
-
sarfuan schrieb:
Helium schrieb:
Halte ich für totalen Quatsch. Zum einsteigen sollte es erstmal einfach sein.
Objektorientierung ist alles andere als einfach. Es ist bequemer, keine Frage, aber mit Sicherheit nicht einfacher. Schon mal ein Buch "Prozedurale Programmierung für Dummies" gesehen? Dagegen gibt es einige Bücher, die sich nicht damit beschäftigen, eine Sprache zu vermitteln sondern ausschließlich mit dem Konzept der OOP. Das sollte schon ein klarer Hinweis sein, was hier einfacher und was schwerer ist ...
Ich sehe leider keinerlei Zusammenhang mit dem Thema. OOP soll sowieso irgendwann gelernt werden. Deswegen ist es total egal, ob OOP einfacher oder schwerer als irgend ein anderes Paradigma ist.
Den Anfang wirst du in C und in C++ rein prozedural machen. OOP ist also hier absolut nicht von belang.Es geht lediglich darum ob es einfacher ist etwas so zu schreiben:
string foo = "Hallo"; string bar = ", Welt!"; string zusammen = foo + bar; cout << "Zusammen ergibt das: " << zusammen << '\n';
(ohne jegliches Verständniss von Klassen operatorüberladung, etc.!)
oder so:char[] foo = "Hallo"; char[] bar = ", Welt!"; char[20] zusammen; strcpy (zusammen, foo); strcat (zusammen, bar); printf ("Zusammen ergibt das: %s\n", zusammen);
(ohne jegliches Verständniss für den inneren Aufbau der printf-Funktion, etc.!)
sarfuan schrieb:
Zeiger, etc. sind in C von Anfang an total unverzichtbar, da sie ja selbst zur Stringmanipulation unabdingbar sind. Aber Zeiger sind ein Thema, mit dem Anfänger erfahrungsgemäß große Probleme haben.
Zeiger kann man aber in drei Sätzen so erklären, dass es jeder kapiert hat. Das OOP-Konzept dagegen nicht. Und ...
OOP ist irrelevant. Erklär mit in genau drei Sätzen Zeiger, so dass ich sie als Anfänger verstehe (inklusive Zeigerarythmetik, versteht sich).
sarfuan schrieb:
Außerdem hat man dann schonmal vergleiche. Man kann einfach sagen: "Betrachten wir Zeiger erstmal, als sowas, wie die Iteratoren, die du schon von den Containern kennst, nur eben für die spracheigenen Arrays."
... die STL schon gleich gar nicht.
Ach, glaubst du? Ich hab es geschafft jemand, der ziemlich am Anfag stand die absoluten Grudlagen der STL zu vermitteln. War gar nicht schwer. Im Ggenteil.
Du gehst erstmal nur auf eine Container (in meinem Fall std::vector ein). Zeigst ein bischen, wie du Elemente hinzufügst oder Wegnimmst und wie man mit hilfe von Iteratoren den Container in einer Schleife durchläuft. Damit spielt er dann ein bischen rum. Wenn er damit ein wenig erfahrung gesammelt hat kann man anfangen auch ein paar andere Container zu zeigen und das alles (und jetzt kommts) bevor er jemals etwas nähres über Klassen erfahren hatte!Er konnte mit std::string umgehen, wusste auch, das String-Literale den Typ cahr * haben, damit sich ein paar Dinge, wie "foo" + "bar" erschließen lassen, wusste aber nichts näheres über Zeiger. Kommt alles später.
Natürlich kann man nicht am Anfang die Komplette STL erklären. Das wäre auch Unfug, aber der Einstieg in die STL ist kinderleicht, deutlich leichter, als sich selbst mit Zeigern und dynamisch allokierten Datenfeldern irgendwas zusammenzuschustern. Natürlich muss das auch vermittelt werden, aber erst hinterher.
In C verwendest du auch einfach printf von anfang an, ohne jemals erklärt zu haben, wie der String, der als erstes Argument übergeben wird, geparsed wird, oder ähnliches. Ohne das Wissen darüber, wie die Innereien genau funktionieren kann man das Ganze dennoch bewuem benutzen.
-
Java ist scheiße.
-
Wdh. schrieb:
Java ist scheiße.
Du bist mein Held. Wiedermal ein total sinnloses und unpassendes Kommentar. Kann mir zumindest ein Troll mal erklären, was daran soviel Spaß macht?
-
Java _ist_ scheiße.
-
Helium schrieb:
Ich sehe leider keinerlei Zusammenhang mit dem Thema. OOP soll sowieso irgendwann gelernt werden. Deswegen ist es total egal, ob OOP einfacher oder schwerer als irgend ein anderes Paradigma ist.
Zeiger sollen auch irgendwann gelernt werden. Deswegen ist es total egal, ob Zeiger einfacher oder schwerer als irgendein anderes Sprachkonstrukt sind.
Den Anfang wirst du in C und in C++ rein prozedural machen. OOP ist also hier absolut nicht von belang.
Bei dir vielleicht. Aber dann sag das auch dazu. Ich kann dir versichern, dass das nicht selbstverständlich ist.
Wenn man bei deinem C++ Beispiel "nicht wissen muss", was Klassen sind, warum muss man dann bei dem ohnehin gekünstelten C-Beispiel plötzlich Zeigerarithmetik beherrschen?
Wenn du dich nur an strcpy und strcat störst - nicht dass man für sie Zeigerarithmetik betreiben müsste -, hindert dich keiner daran, diese Funktionen auch wegzulassen:char foo[] = "Hallo"; char bar[] = ", Welt!"; char zusammen[20]; sprintf(zusammen,"%s%s", foo, bar); printf ("Zusammen ergibt das: %s\n", zusammen);
Wenn printf kein Problem darstellt, sollte sprintf ebenfalls keins sein, nicht wahr? Und dass "zusammen" genug Platz braucht, damit man foo und bar hineinstecken kann, leuchtet auch jedem Anfänger ein.
Aber wie gesagt ist dein Beispiel eh gekünstelt. Den Anfängerkurs möchte ich sehen, der sofort beginnt Strings zusammenzuschachteln und nicht einfach erstprintf ("Zusammen ergibt das: %s%s\n", foo, bar)
schreibt. Denn genau das macht ein Anfänger und ein Anfängerkurs am Anfang.
OOP ist irrelevant. Erklär mit in genau drei Sätzen Zeiger, so dass ich sie als Anfänger verstehe (inklusive Zeigerarythmetik, versteht sich).
Ich kenne keine Zeigerarythmetik.
1. Satz: Ein Computer hat einen Speicher, der durchnummeriert ist, damit die Kiste sich auch zurechtfindet und weiß, wo was steht.
2. Satz: Diese Nummern nennt man Adressen und eine Variable, die keinen "normalen" Wert sondern so eine Adresse als Wert speichert, nennt man Zeiger.
3. Satz: Mit dieser Adresse im Zeiger kann der Computer jetzt direkt Stellen im Speicher finden, ohne "den Namen" der Speicherstelle wissen zu müssen.Was genau ist da jetzt das unglaublich fiese und unverständliche Problem an Zeigern?
-
Hallo,
Was genau ist da jetzt das unglaublich fiese und unverständliche Problem an Zeigern?
die Anwendung ist imho ein großes Problem.
Aber zum Thema: Ich persönlich war recht angepisst, als ich mir als damaliger Java-only Programmierer C angeschaut hab. Das ist echt nicht lustig. Das hat mich auch schnell abgeschreckt und zu C++ getrieben, was sich inzwischen als Vorteil rausgestellt hat, da ich mir so wenigstens nie das reine C-Programmieren angewöhnt habe.
OOP mag schwerer sein als prozedurale Programmierung, aber nur die Programmierung bzw. Modellierung. Das Anwenden wird erleichtert (oder warum treiben wir das denn überhaupt?).Mfg
GPC
-
sarfuan schrieb:
1. Satz: Ein Computer hat einen Speicher, der durchnummeriert ist, damit die Kiste sich auch zurechtfindet und weiß, wo was steht.
2. Satz: Diese Nummern nennt man Adressen und eine Variable, die keinen "normalen" Wert sondern so eine Adresse als Wert speichert, nennt man Zeiger.
3. Satz: Mit dieser Adresse im Zeiger kann der Computer jetzt direkt Stellen im Speicher finden, ohne "den Namen" der Speicherstelle wissen zu müssen.Was genau ist da jetzt das unglaublich fiese und unverständliche Problem an Zeigern?
Diese drei Sätze bringen dir nur was, wenn du eh schon längst weißt was Zeiger sind. Ein Anfänger kann damit nichts anfangen.
-
GPC schrieb:
die Anwendung ist imho ein großes Problem.
Kann ich durchaus nachvollziehen. Allerdings bestimmt man die Größe dieses Problems noch immer selber. Das, was man wissen *muss*, ist nicht mehr als die drei Sätze von vorher.
Aber zum Thema: Ich persönlich war recht angepisst, als ich mir als damaliger Java-only Programmierer C angeschaut hab. Das ist echt nicht lustig.
Genau darum geht es mir, denn das ist das Problem. Deswegen halte ich die Richtung C -> C++ ebenfalls für besser. Dass der C++-Stil dann angeblich versaut sein soll, gründet doch nur darauf, dass die Leute OOP nie gelernt haben. Das liegt aber nicht an C, sondern an "ich hab mir jetz paar tutz zu c++ angeschaut" ...
Wer erfolgreich mit C angefangen hat, bringt schon ein viel grundlegenderes und imho auch besseres Verständnis mit. Darauf aufbauend kann man wunderbar andere Sprachen und Paradigmen lernen. Das und dass C auch einfacher (!= bequemer) ist, sind die Gründe, weswegen ich einen Anfang mit C keinesfalls verteufeln würde.interpreter schrieb:
Diese drei Sätze bringen dir nur was, wenn du eh schon längst weißt was Zeiger sind. Ein Anfänger kann damit nichts anfangen.
Die Sätze sind alles, was man braucht, um Zeiger zu verstehen. Dass man sich das auch erst mal durchdenken muss, nun, dagegen kann ich nichts tun. Denken muss man noch immer selber.
-
sarfuan schrieb:
Helium schrieb:
Ich sehe leider keinerlei Zusammenhang mit dem Thema. OOP soll sowieso irgendwann gelernt werden. Deswegen ist es total egal, ob OOP einfacher oder schwerer als irgend ein anderes Paradigma ist.
Zeiger sollen auch irgendwann gelernt werden. Deswegen ist es total egal, ob Zeiger einfacher oder schwerer als irgendein anderes Sprachkonstrukt sind.
Nein, denn Zeiger sind in der C-Progammierung von Anfang an essenziell. Du kannst nichtmal scanf verwenden ohne Adressen.
sarfuan schrieb:
Den Anfang wirst du in C und in C++ rein prozedural machen. OOP ist also hier absolut nicht von belang.
Bei dir vielleicht. Aber dann sag das auch dazu. Ich kann dir versichern, dass das nicht selbstverständlich ist.
Wer bitte erklärt erstmal, wie man tolle OO-Modelle aufbaut, bevor er beigebracht hat, wie man ein "Hallo Welt" programmiert?
sarfuan schrieb:
Wenn man bei deinem C++ Beispiel "nicht wissen muss", was Klassen sind, warum muss man dann bei dem ohnehin gekünstelten C-Beispiel plötzlich Zeigerarithmetik beherrschen?
Muss man nicht.
sarfuan schrieb:
Wenn du dich nur an strcpy und strcat störst - nicht dass man für sie Zeigerarithmetik betreiben müsste -, hindert dich keiner daran, diese Funktionen auch wegzulassen:
char foo[] = "Hallo"; char bar[] = ", Welt!"; char zusammen[20]; sprintf(zusammen,"%s%s", foo, bar); printf ("Zusammen ergibt das: %s\n", zusammen);
Wenn printf kein Problem darstellt, sollte sprintf ebenfalls keins sein, nicht wahr? Und dass "zusammen" genug Platz braucht, damit man foo und bar hineinstecken kann, leuchtet auch jedem Anfänger ein.
Das ausreichen Speicher dasein muss ja, aber ist das nicht in jeder Situation so einfach sicherzustellen, wie hier.
Es ist einfach Erfahrung, dass Anfänger den Umgang mit std::string als deutlich einfacher empfinden, als den mit char *. Und um mit Strings vernümftig arbeiten zu können braucht man Zeigerarithmetik.sarfuan schrieb:
Aber wie gesagt ist dein Beispiel eh gekünstelt. Den Anfängerkurs möchte ich sehen, der sofort beginnt Strings zusammenzuschachteln und nicht einfach erst
printf ("Zusammen ergibt das: %s%s\n", foo, bar)
schreibt. Denn genau das macht ein Anfänger und ein Anfängerkurs am Anfang.
Warum macht der Anfänger das? Weil der Aufwand zum Aneinanderhängen in C viel zu groß ist. Was, wenn ein aneinandergehängter Text weiterverarbeitet werden muss?
sarfuan schrieb:
OOP ist irrelevant. Erklär mit in genau drei Sätzen Zeiger, so dass ich sie als Anfänger verstehe (inklusive Zeigerarythmetik, versteht sich).
Ich kenne keine Zeigerarythmetik.
1. Satz: Ein Computer hat einen Speicher, der durchnummeriert ist, damit die Kiste sich auch zurechtfindet und weiß, wo was steht.
2. Satz: Diese Nummern nennt man Adressen und eine Variable, die keinen "normalen" Wert sondern so eine Adresse als Wert speichert, nennt man Zeiger.
3. Satz: Mit dieser Adresse im Zeiger kann der Computer jetzt direkt Stellen im Speicher finden, ohne "den Namen" der Speicherstelle wissen zu müssen.Was genau ist da jetzt das unglaublich fiese und unverständliche Problem an Zeigern?
[/quote]
Das ist das Prinzip, das hinter Zeigern steht. Nach den Sätzen kann ich Zeiger nichtmal annähernd praktisch einsetzen.
Was ist mit Null-Zeigern? Was ist mit Arithmetik.Das sind jetzt aber auch alles nur irgendwelche einzelfall-Beispiele.
Wenn du die ersten Schritte in C als einfacher empfindest, als die in C++, dann ist das dein Ding. Ich empfinde es anders und meine Erfahrung mit Anfängern bestätigt mich.
-
Wieso macht ihr immer wieder bei diesen flamewars mit?
-
sarfuan schrieb:
interpreter schrieb:
Diese drei Sätze bringen dir nur was, wenn du eh schon längst weißt was Zeiger sind. Ein Anfänger kann damit nichts anfangen.
Die Sätze sind alles, was man braucht, um Zeiger zu verstehen. Dass man sich das auch erst mal durchdenken muss, nun, dagegen kann ich nichts tun. Denken muss man noch immer selber.
Imho völlig weltfremd. Um die ganze Zeigerarithmetik oder Funktionszeiger zu verstehen bedarf es schon ein bißchen mehr.
-
interpreter schrieb:
Imho völlig weltfremd. Um die ganze Zeigerarithmetik oder Funktionszeiger zu verstehen bedarf es schon ein bißchen mehr.
Natürlich bedarf es dafür (etwas, aber nicht viel) mehr. Hab ich irgendwo etwas anderes behauptet?
Helium schrieb:
(...) Zeiger sind in der C-Progammierung von Anfang an essenziell. du kannst nichtmal scanf verwenden ohne Adressen.
Richtig. Und um scanf oder gets verwenden zu können, bedarf es Arrays - die bringst du deinem C++ Anfänger auch bei - und eben die drei Sätze zu Zeigern. Keine Zeigerarithmetik, keine Funktionszeiger.
-
sarfuan schrieb:
interpreter schrieb:
Imho völlig weltfremd. Um die ganze Zeigerarithmetik oder Funktionszeiger zu verstehen bedarf es schon ein bißchen mehr.
Natürlich bedarf es dafür (etwas, aber nicht viel) mehr. Hab ich irgendwo etwas anderes behauptet?
Helium schrieb:
(...) Zeiger sind in der C-Progammierung von Anfang an essenziell. du kannst nichtmal scanf verwenden ohne Adressen.
Richtig. Und um scanf oder gets verwenden zu können, bedarf es Arrays - die bringst du deinem C++ Anfänger auch bei - und eben die drei Sätze zu Zeigern. Keine Zeigerarithmetik, keine Funktionszeiger.
Du willst ihnen Arrays beibringen ohne Zeigerarithmetik. Soso