C lernen oder C++ ?



  • ;fricky schrieb:

    Icematix schrieb:

    Wo muss man in C++ viel Speicher per Hand verwalten?

    du meinst wohl auch, new und delete (gleich beides in zweifacher ausführung, delete[] und new(), 'displacement new', oder wie das heisst), sind nur zum spass da, damit c++ programme schöner aussehen? *fg*
    🙂

    STL und boost regeln.



  • ;fricky schrieb:

    Icematix schrieb:

    Cler die C++ schreiben haben meist einen fürchterlichen Stil.

    ja, sie neigen zu vereinfachungen, machen immer gleich kurzen prozess, alles ganz direkt und so. pfui, das macht man doch nicht. *fg*
    🙂

    Nein, es geht nicht um Vereinfachungen, in manchen Fällen ist C eleganter in manchen C++. Und in C wird anders programmiert, als in C++ (Denkansatz ist anders), und nein, ich spiele dabei nicht auf OO an.

    Ich persönlich habe jedenfalls die Erfahrung gemacht, das jemand der von C kommt, in C++ selten das gleiche Programmierverständnis entwickelt, wie jemand der mit C++ angefangen hat (Selbst bei gleichlanger C++ Erfahrung). Dies mag vielleicht daran liegen, das man ungern gelerntes ignoriert, oder einfach weil man leichter in vorhandenen Bahnen denkt.

    Ich habe nichts gegen sauberen C-Code, ebenso wenig wie gegen sauberen C++ Code, aber das schlimmste ist für mich schlechter C++ Code von C-Entwicklern (Die mit aller Macht versuchen C zu programmieren, unter der Verwendung von C++ Schlüsselworten & Klassen).

    Zudem habe ich erlebt das ex-C-Entwickler gerne alles neu erfinden, selbst wenn es das ganze bereits in der C++ Bibliothek gibt (und letztere deutlich besser getestet ist). Und meinen, alles mit Performance erklären zu müssen, selbst wenn sich herausstellt das ihr Konstrukt um Klassen langsamer und schwerer zu warten ist. Gleichzeitig (das mag daran liegen, das in der Regel als Umsteiger älter sind) sperren sie sich gegen alles Neue in C++, selbst dann wenn es die Programmierung nachweislich verbessert (Ich verstehe dies nicht, also ist es schlecht).

    Wenn man mit einer Sprache anfängt, sollte man versuchen auch ihre Denkansätze zu verstehen. Selbst wenn dies im Gegensatz zu Paradigmen steht, die in einer vorher gelernten Sprache gelten. So wie ein C-Programmierer C++ nicht die C-Paradigmen aufzwingen sollte, sollte ein C++ Programmierer C nicht die C++ Paradigmen aufzwingen.

    cu André



  • Ich habe mit Java extrem schlechte Erfahrungen gemacht und würde jedem dringend davon abraten. Hauptsächlich weil die Fehlermeldungen so miserabel sind dass man kein Ahnung hat was man falsch gemacht haben könnte und man deshalb nach jeder Zeile kompilieren muss. Eigentlich kommt immer ein "In letzter Zeile ein } vergessen", was offensichtlich nicht der Fehler ist sodass man lustig den gesammten Quellcode nach Fehlern durchsuchen darf.

    Alternativ der Spaß mit if und else.

    if (i==3) return 42;
    else return 23;
    

    Das Ganze am Ende einer int-Funktion führt zu "error: int-Funktion ohne Returnwert". 😕 Es steht doch offensichtlich ein return da.
    Fein, wenn Java drauf besteht:

    if (i==3) return 42;
    else return 23;
    return 0;
    

    "error: unreachable statement" ....

    Natürlich kriegt man es irgendwann zusammengehackt sodass es sogar Java schluckt, aber der Aufwand um selbst die simpelsten Programme zu schreiben ist enorm.

    Java wird gern zu Lehrzwecken verwendet weil es objektorientierte Programmierung erzwingt. Ich halte es für Quatsch, erstens ist Objektorientierung nicht die Antwort auf alles, zweitens gehört mehr zu Objektorientierung als absolut alles in eine Klasse zu packen um davon ein Objekt zu erzeugen.

    Du könntest dir noch Python ansehen. Ist extrem leicht zu lernen, sehr leicht darin auch komplexe Programme zu schreiben weil Python praktisch alles für dich macht. Die Laufzeit ist nicht gerade toll, aber es ist meist eh egal ob das Programm in 0.001 oder 0.0001 Sekunden fertig ist. Die Fehlermeldungen sind sehr gut, da dich die mitgelieferte sofort funktionierende IDE im Falle eines Fehlers die Zeile und die genaue Stelle sagt wo der Fehler aufgetreten ist und eine sinnvolle Fehlermeldung ausgibt die ganz gut erklärt was du falsch gemacht hast.
    Aufgrund der Einfachheit von Python kannst du schlechten Spaghetticode schreiben und eine Weile kontrollieren, was sich aber irgendwann rächt.



  • Athar schrieb:

    Um new kommt man nicht immer herum, gilt aber z.B. auch in Java (und dort gilt das sogar immer).

    naja, Java hat doch 'nen GC, der sorgt dafür, dass sich programmierer in 99% der fälle keine gedanken um speichermanagement machen müssen. einfach 'new' aufrufen, benutzen und wieder vergessen. die chance, dabei etwas falsch zu machen, ist äusserst gering (aber nicht ausgeschlossen).

    Athar schrieb:

    Ums Freigeben muss man sich in C++ aber praktisch nie kümmern, da das einige wenige Containerklassen für einen erledigen.

    und was ist, wenn man keine containerklassen verwendet? du versteckst deine news, new()s, deletes und delete[]s hinter einer abstraktionsschicht, die der manuellen speicherverwaltung eine andere semantik überstülpt. letztendlich wird dadurch auch nichts besser, aussen hui und innen pfui.

    Blue-Tiger schrieb:

    STL und boost regeln.

    gleich zwei sätze von regeln, wahrscheinlich vertragen sich die noch nicht mal. *fg*

    asc schrieb:

    Zudem habe ich erlebt das ex-C-Entwickler gerne alles neu erfinden, selbst wenn es das ganze bereits in der C++ Bibliothek gibt ...

    dieses 'immer wieder alles neu machen' ist ein typisches anfängerproblem und ist eigentlich nicht programmiersprachenbezogen. ich schätze mal, einige leute trauen fertigen bibliotheken wohl nicht über'n weg und denken sich, wenn sie alles selber machen, haben sie mehr kontrolle über alles. oder sie empfinden es als abstrengend, sich in eine library einzuarbeiten und glauben, dass selbermachen einfacher ist. ich bin z.b. vom anderen extrem: ich benutze unglaublich viel fertiges zeug, bin fast sowas wie ein 'copy-und-paste programmierer'.
    🙂



  • nwp2 schrieb:

    Ich habe mit Java extrem schlechte Erfahrungen gemacht...
    Alternativ der Spaß mit if und else.

    if (i==3) return 42;
    else return 23;
    

    Das Ganze am Ende einer int-Funktion führt zu "error: int-Funktion ohne Returnwert". 😕 Es steht doch offensichtlich ein return da.

    kann nicht sein, du musst woanders einen fehler gemacht haben.

    int test (int i)
        {
            if (i==3) return 42;
            else return 23;
        }
    

    ^^geht ohne probleme.

    nwp2 schrieb:

    Fein, wenn Java drauf besteht:

    if (i==3) return 42;
    else return 23;
    return 0;
    

    "error: unreachable statement" ....

    stimmt, sowas lässt Java allerdings nicht durch.
    🙂



  • ;fricky schrieb:

    Athar schrieb:

    Ums Freigeben muss man sich in C++ aber praktisch nie kümmern, da das einige wenige Containerklassen für einen erledigen.

    und was ist, wenn man keine containerklassen verwendet?

    Dann verwendet man C++ schlecht. Mit Deiner Argumentation kann man auch zeigen, daß ein Lamborghini schlecht ist, weil man damit Probleme bekommt, wenn man kein Benzin benutzt.



  • ;fricky schrieb:

    Athar schrieb:

    Ums Freigeben muss man sich in C++ aber praktisch nie kümmern, da das einige wenige Containerklassen für einen erledigen.

    und was ist, wenn man keine containerklassen verwendet? du versteckst deine news, new()s, deletes und delete[]s hinter einer abstraktionsschicht, die der manuellen speicherverwaltung eine andere semantik überstülpt. letztendlich wird dadurch auch nichts besser, aussen hui und innen pfui.

    Ich finde den C++ weg persönlich besser, als immer den GC aufgezwungen zu bekommen. Davon abgesehen das new[] und delete[] der C-Kompatibilität zu verdanken sind (C-Arrays passen sich irgendwie nicht wirklich in die restliche C++ Welt ein).

    ;fricky schrieb:

    Blue-Tiger schrieb:

    STL und boost regeln.

    gleich zwei sätze von regeln, wahrscheinlich vertragen sich die noch nicht mal. *fg*

    Wenn man keine Ahnung hat, sollte man einfach mal den Mund halten.

    ;fricky schrieb:

    asc schrieb:

    Zudem habe ich erlebt das ex-C-Entwickler gerne alles neu erfinden, selbst wenn es das ganze bereits in der C++ Bibliothek gibt ...

    dieses 'immer wieder alles neu machen' ist ein typisches anfängerproblem...

    Was ich deutlich häufiger von alten Hasen, als Anfängern her kenne... (10+ Jahre in der Programmierung und mindestens 5+ Jahre davon in "C++" [zumindest meinen sie letzteres]). Ich sehe dies also NICHT als Anfängerproblem.

    ;fricky schrieb:

    ich bin z.b. vom anderen extrem: ich benutze unglaublich viel fertiges zeug, bin fast sowas wie ein 'copy-und-paste programmierer'.
    🙂

    Nur das du C++ grundsätzlich ablehnst und dennoch mitredest wenn es auch um C++ geht (Betriebsblindheit nenne ich dies). Ich lehne z.B. VB ab, halte mich aber weitgehend zurück wenn VB angesprochen wird.



  • Den satz sollte man sich auf der Zunge zergehen lassen. "Wenn man keine Containerklassen verwendet, verwendet man C++ schlecht" . Seid ihr echt zu faul um delete zu benutzen?



  • ;fricky schrieb:

    naja, Java hat doch 'nen GC, der sorgt dafür, dass sich programmierer in 99% der fälle keine gedanken um speichermanagement machen müssen. einfach 'new' aufrufen, benutzen und wieder vergessen. die chance, dabei etwas falsch zu machen, ist äusserst gering (aber nicht ausgeschlossen).

    Ja und C++ hat Containerklassen, die sorgen dafür, dass sich der Programmierer in 99% der Fälle keine Gedanken ums Speichermanagement machen muss. Zudem können Objekte meist auch ohne new erzeugt werden, in diesem Fall braucht man nicht einmal Container.

    ;fricky schrieb:

    und was ist, wenn man keine containerklassen verwendet? du versteckst deine news, new()s, deletes und delete[]s hinter einer abstraktionsschicht, die der manuellen speicherverwaltung eine andere semantik überstülpt. letztendlich wird dadurch auch nichts besser, aussen hui und innen pfui.

    Hä? Wieso soll dadurch nichts besser werden? Du musst dich um Speichermanagement nicht mehr kümmern und darum geht es ja.



  • Wenn's doch nur allein um den Speicher ginge...
    http://de.wikipedia.org/wiki/Ressourcenbelegung_ist_Initialisierung



  • ;fricky schrieb:

    kann nicht sein, du musst woanders einen fehler gemacht haben.

    int test (int i)
        {
            if (i==3) return 42;
            else return 23;
        }
    

    ^^geht ohne probleme.

    Komisch, mir hat javac gesagt das geht nicht. Vielleicht wurde es ja in neueren Versionen geändert. Ich glaube der Java-Weg ist dieser:

    if (i==3) return 42;
    return 23;
    

    Man müsste mal die Javaner fragen.



  • volkard schrieb:

    ;fricky schrieb:

    Athar schrieb:

    Ums Freigeben muss man sich in C++ aber praktisch nie kümmern, da das einige wenige Containerklassen für einen erledigen.

    und was ist, wenn man keine containerklassen verwendet?

    Dann verwendet man C++ schlecht. Mit Deiner Argumentation kann man auch zeigen, daß ein Lamborghini schlecht ist, weil man damit Probleme bekommt, wenn man kein Benzin benutzt.

    nö, mit dem argument kann man zeigen, dass man nass wird, wenn es regnet und man nicht in seinen lamborghini einsteigt. containerklassen implementieren eigentlich datenstrukturen für verschiedene zwecke (stacks, queues, listen, usw.) und keine speichermanager, so wie ein lamborghini ein fahrzeug für die rennstrecke und weniger ein regenschirm-ersatz ist. aber ok, unter C++ ist das offensichtlich ein und dasselbe, alles eben sehr seltsam *fg*

    asc schrieb:

    Ich finde den C++ weg persönlich besser, als immer den GC aufgezwungen zu bekommen.

    das sagst du jetzt, aus deiner perspektive als C++ progger. unter Java hat man mit dem GC keine probleme, ohne hätte man die allerdings.

    asc schrieb:

    ;fricky schrieb:

    ich bin z.b. vom anderen extrem: ich benutze unglaublich viel fertiges zeug, bin fast sowas wie ein 'copy-und-paste programmierer'.

    Nur das du C++ grundsätzlich ablehnst und dennoch mitredest wenn es auch um C++ geht

    es muss ja wenigstens einen geben, der gegen diese ständigen lobhudeleien betreffend C++ angeht. *fg*

    nwp2 schrieb:

    Man müsste mal die Javaner fragen.

    ich bin ja so'n halber 'javaner', ich kenne dieses verhalten nicht. aber vielleicht war deine funktion ja sehr komplex und hast du 'nen bug im compiler gefunden.
    🙂



  • also mein Java-Compiler (jdk 6u14) übersetzt das auch ohne probleme



  • ;fricky schrieb:

    es muss ja wenigstens einen geben, der gegen diese ständigen lobhudeleien betreffend C++ angeht. *fg*

    Warum mußt Du das tun?



  • volkard schrieb:

    ;fricky schrieb:

    es muss ja wenigstens einen geben, der gegen diese ständigen lobhudeleien betreffend C++ angeht. *fg*

    Warum mußt Du das tun?

    Damit dein böser Plan alle an C++ verzweifeln zu lassen und dann mit C die Weltherrschaft an dich zu reißen fehlschlägt :p
    ... Sorry.



  • Erstmal danke für das ganze Feedback!

    So wie ich das hier rauslesen konnte, ist es nicht zwingend mit C anzufangen bzw. vorteilhafter mit C++ zu beginnen. Was mich nun interessiert ist folgendes:
    Wir gehen nunmal von "Standardprojekten" aus, sprich keine " Konsolen-Lern-'Programme' ", sondern das, was man eher als "alltäglich" ansieht, wie WebAnwendungen, GUI's etc. - was ist da "besser", sprich einfacher,effektiver,schneller?

    Meine Meinung dazu: Ich hab mit C begonnen und fand das gut so - man weiß wie was abläuft. Doch wie schon genannt wurde ist der Denkansatz etwas anders - bin aber noch in der Lernphase habe daher nicht allzuviel zu melden 😉 .

    Vielen Dank für die ganzen Antworten,ich hoffe es werden nochmer :xmas1:



  • volkard schrieb:

    Wenn's doch nur allein um den Speicher ginge...
    http://de.wikipedia.org/wiki/Ressourcenbelegung_ist_Initialisierung

    was ja nix neues ist. ein simples:

    if (acquireRessource() == OK)
    {
       useRessource();
       freeRessource();
    }
    

    ^^wird in C++ in einen konstruktor/destruktor-mechanismus verpackt und als die wunderwaffe schlechthin angepriesen *gg* was soll man dazu noch sagen?

    volkard schrieb:

    ;fricky schrieb:

    es muss ja wenigstens einen geben, der gegen diese ständigen lobhudeleien betreffend C++ angeht. *fg*

    Warum mußt Du das tun?

    weil C++ von einigen (heute noch, ca. 30 jahre nach seiner entstehung) als innovativ und fortschrittlich bezeichnet wird, dabei gehört es zu den grössten verirrungen der IT-geschichte überhaupt. aber zum glück ist C++ ja so langsam am entschlummern. C++0x beschleunigt die sache sogar noch *fg*

    KornChief schrieb:

    Wir gehen nunmal von "Standardprojekten" aus, sprich keine " Konsolen-Lern-'Programme' ", sondern das, was man eher als "alltäglich" ansieht, wie WebAnwendungen, GUI's etc. - was ist da "besser", sprich einfacher,effektiver,schneller?

    naja, für GUI-kram könnteste C und C++ gut nehmen, aber webanwendungen (mit hilfe von CGI und so) sind ja nicht mehr state-of-the-art. wenn du webprogrammierung vorhast, dann schau dir lieber sprachen wie Java, PHP, C#, usw. an. die haben unterstützung für viele webtechnologien schon mit dabei.
    🙂



  • ;fricky schrieb:

    volkard schrieb:

    Wenn's doch nur allein um den Speicher ginge...
    http://de.wikipedia.org/wiki/Ressourcenbelegung_ist_Initialisierung

    was ja nix neues ist. ein simples:

    if (acquireRessource() == OK)
    {
       useRessource();
       freeRessource();
    }
    

    ^^wird in C++ in einen konstruktor/destruktor-mechanismus verpackt und als die wunderwaffe schlechthin angepriesen

    Du vergißt das

    if (acquireRessource() == OK)
    {
       useRessource();
       if(bla) return foo;
       freeRessource();
    }
    

    In C hatte man Ressourcenlöcher einfach ignoriert oder zum Nutzcode noch 100% Fehlerbehandlungscode schreiben müssen. Dagegen *ist* RAII die Wunderwaffel.



  • ;fricky schrieb:

    if (acquireRessource() == OK)
    {
       useRessource();
       freeRessource();
    }
    

    Übrigens ist das Müll. Wie vor Kurzem auch aus Deiner Tastatur

    ;fricky schrieb:

    void rotate_right (int *array, int size, int num) 
    { 
      int *tmp = malloc (num*sizeof(int));  // zwischenspeicher 
      if (tmp) 
      { 
        num = num % size;  // drehungen / size wiederholen sich 
        memmove (tmp, array+size-num, num*sizeof(int));     // rechten teil retten 
        memmove (array+num, array, (size-num)*sizeof(int));  // linken teil ueber rechten kopieren 
        memmove (array, tmp, num*sizeof(int));              // rechten teil vorne dran 
        free (tmp); 
      } 
    }
    

    Wenn kein RAM mehr da ist, geht das Feature halt nicht. Jetzt weiß ich auch, warum Du nur für embedded Systems schreiben darfst. :xmas1:



  • volkard schrieb:

    Du vergißt das

    if (acquireRessource() == OK)
    {
       useRessource();
       if(bla) return foo;
       freeRessource();
    }
    

    ^^anfängerfehler. der code muss in 'useRessource' rein.
    (mist, ich hab 'resource' doch tatächlich wieder mit zwei 's' geschrieben)

    volkard schrieb:

    ... Müll. Wie vor Kurzem auch aus Deiner Tastatur

    ;fricky schrieb:

    ...
    

    ja, das ist suboptimal. aber schau mal 4 oder 5 postings tiefer, da ist ein link zu 'ner scheinbar vielversprechenden lösung.
    🙂


Anmelden zum Antworten