C lernen oder C++ ?



  • ;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.
    🙂



  • ;fricky schrieb:

    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)

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


  • volkard schrieb:

    if (acquireResource() == OK)
    {
       if(useResource()==ERROR_FOO)
          return ERROR_FOO;
       freeResource();
    }
    

    nein, menno, programmierst du erst seit heute, oder versuchst du jetzt mit aller gewalt eine existenzberechtigung für RTTI zu konstruieren? *fg*
    so muss das:

    ...
    if (acquireResource() == OK)
    {
       err = useResource();
       freeResource();
       return err;
    }
    ...
    

    🙂



  • ;fricky schrieb:

    RTTI

    RAII meinte ich.
    🙂



  • ;fricky schrieb:

    volkard schrieb:

    if (acquireResource() == OK)
    {
       if(useResource()==ERROR_FOO)
          return ERROR_FOO;
       freeResource();
    }
    

    nein, menno, programmierst du erst seit heute, oder versuchst du jetzt mit aller gewalt eine existenzberechtigung für RTTI zu konstruieren? *fg*
    so muss das:

    ...
    if (acquireResource() == OK)
    {
       err = useResource();
       freeResource();
       return err;
    }
    ...
    

    🙂

    Und bei fünf benötigten Ressourcen und sieben möglichen Fehlern wird's eine goto-Orgie oder fünf verschachtelte Wrapper-Funktionen oder oder oder, nur ja nichts Vernünftiges mehr.
    RAII machts einfach und harmonisch.



  • volkard schrieb:

    Und bei fünf benötigten Ressourcen und sieben möglichen Fehlern wird's eine goto-Orgie oder fünf verschachtelte Wrapper-Funktionen oder oder oder, nur ja nichts Vernünftiges mehr. RAII machts einfach und harmonisch.

    naja, fehler beim ressource-locking und unlocking etc. können sehr vielschichtig und individuell sein. genauso wie die behandlung von fehlern. es gibt kein patentrezept, mit dem sich das alles erschlagen liesse. auch in C++ können destruktoren und konstruktoren scheitern, exceptions innerhalb von exception-handlern, destruktoren und konstruktoren auftreten und..und...und. du hast selbst (in einem thread hier im C-forum) geschrieben, dass generalisierungen beim programmieren nichts bringen (oder hab ich das geträumt?). man kann mit einem künstlich geschaffenen konstruktor/destruktor/softwareexception-system wenig erreichen, wenn die wirklichkeit nicht mitspielt (siehe stackoverflow-thread in RudP, röchelbärchens C++-problematik mit stackoverflows in destruktoren, die unter C überhaupt nicht existiert). wenn RAII so perfekt geeignet fürs speichermanagement usw. ist, warum gibt es dann zig verschiedene sogenannte 'smartpointer'-typen in C++? nee, also wirklich: C++ fügt zusätzliche komplexität hinzu, wo überhaupt keine sein muss. und ich behaupte mal, dass c++-programmierer viel zeit investieren, um eine aufgabenstellung in ein C++-korsett zu zwängen. und dass sie sich grösstenteils mit C++ selber beschäftigen, anstatt an realen problemlösungen zu arbeiten. ganz nach dem motto: http://en.wikipedia.org/wiki/Golden_hammer
    🙂



  • ;fricky schrieb:

    volkard schrieb:

    Und bei fünf benötigten Ressourcen und sieben möglichen Fehlern wird's eine goto-Orgie oder fünf verschachtelte Wrapper-Funktionen oder oder oder, nur ja nichts Vernünftiges mehr. RAII machts einfach und harmonisch.

    naja, fehler beim ressource-locking und unlocking etc. können sehr vielschichtig und individuell sein. genauso wie die behandlung von fehlern. es gibt kein patentrezept, mit dem sich das alles erschlagen liesse. auch in C++ können destruktoren und konstruktoren scheitern, exceptions innerhalb von exception-handlern, destruktoren und konstruktoren auftreten und..und...und. du hast selbst (in einem thread hier im C-forum) geschrieben, dass generalisierungen beim programmieren nichts bringen (oder hab ich das geträumt?). man kann mit einem künstlich geschaffenen konstruktor/destruktor/softwareexception-system wenig erreichen, wenn die wirklichkeit nicht mitspielt (siehe stackoverflow-thread in RudP, röchelbärchens C++-problematik mit stackoverflows in destruktoren, die unter C überhaupt nicht existiert). wenn RAII so perfekt geeignet fürs speichermanagement usw. ist, warum gibt es dann zig verschiedene sogenannte 'smartpointer'-typen in C++? nee, also wirklich: C++ fügt zusätzliche komplexität hinzu, wo überhaupt keine sein muss. und ich behaupte mal, dass c++-programmierer viel zeit investieren, um eine aufgabenstellung in ein C++-korsett zu zwängen. und dass sie sich grösstenteils mit C++ selber beschäftigen, anstatt an realen problemlösungen zu arbeiten. ganz nach dem motto: http://en.wikipedia.org/wiki/Golden_hammer
    🙂

    Ist im Prinzip alles richtig. Aber beim Ressourcen-Management glänzt C++ wirklich und ist Gold in 95% der Aufgabenstellungen. Bei den anderen gehe ich in meinem Vorgehen halt nach C runter oder nach Lisp hoch oder verbasele das Problem im Basic-Stil.



  • volkard schrieb:

    Aber beim Ressourcen-Management glänzt C++ wirklich und ist Gold in 95% der Aufgabenstellungen.

    die '9' stört mich ein wenig. wenn ich annehme dass viele C++ codes RAII ausgiebig nutzen, dürfte eine hohe acquire...free frequenz üblich sein (rechenzeit-verbraterei, sinnloser speicher- und energieverbrauch), wenn z.b. der C++ progger gedankenlos mit seinen STL-objekten rumfummelt. genauso wie viele überflüssige kopieraktionen (weshalb c++ fans selbst als for-schleifenzähler lieber ++i statt i++ bevorzugen, *fg*).

    volkard schrieb:

    Bei den anderen gehe ich in meinem Vorgehen halt nach C runter oder nach Lisp hoch oder verbasele das Problem im Basic-Stil.

    oder du benutzt C++ ohne RAII, ohne destruktoren und konstruktoren, ohne cin/cout und ohne operatorüberladung, ganz vorsichtig mit templates sein, ohne die STL, ohne C++0x-features und ohne boost sowieso (if you end up using c++, don't try to fix it or even boost it *fg*). ich weiss, dass sowas schwer ist für euch hartgesottene c++ freaks, aber als belohnung winken einfacher, übersichtlicher code, kleine schnelle executables, maximale portabilität, usw.
    🙂



  • ;fricky schrieb:

    die '9' stört mich ein wenig. wenn ich annehme dass viele C++ codes RAII ausgiebig nutzen, dürfte eine hohe acquire...free frequenz üblich sein (rechenzeit-verbraterei, sinnloser speicher- und energieverbrauch), wenn z.b. der C++ progger gedankenlos mit seinen STL-objekten rumfummelt. genauso wie viele überflüssige kopieraktionen (weshalb c++ fans selbst als for-schleifenzähler lieber ++i statt i++ bevorzugen, *fg*).

    Wer sagt, daß man in C++ jemals mehr Arbeit dem Prozessor aufbürden muß als es in C ginge?
    Muß man nämlich nicht. Die STL ist auch gar nicht teuer. Einige potentielle überflüssige Kopieraktionen entstehen durch Mittel, die C halt gar nicht hat, und auch da nur, wenn man C++ falsch verwendet.

    ;fricky schrieb:

    oder du benutzt C++ ohne RAII, ohne destruktoren und konstruktoren, ohne cin/cout und ohne operatorüberladung, ganz vorsichtig mit templates sein, ohne die STL, ohne C++0x-features und ohne boost sowieso (if you end up using c++, don't try to fix it or even boost it *fg*). ich weiss, dass sowas schwer ist für euch hartgesottene c++ freaks, aber als belohnung winken einfacher, übersichtlicher code, kleine schnelle executables, maximale portabilität, usw.
    🙂

    Hier ein schmerzloser Schummel-Speedtest. Schmerzlos in dem Sinne, daß die main genauso aussieht, wie mit klassischem C++.
    http://www.file-upload.net/download-2088733/prime.exe.html (Ist kein Trojaner drin, keine Bange. Aus dem Alter bin ich raus.)
    Die wird auffallen, daß er dreimal so schnell wie

    #include <stdio.h>
    int main(){
    	int i;
    	for(i=0;i<=664579;++i)
    		printf("%d %d\n",i,i);
    	return 0;
    }
    

    ist und dazu noch 664579 Primzahlen berechnet. Ich hab halt cout ein wenig aufgebohrt. Kennst Du so ein Spiel auch in C?



  • volkard schrieb:

    Hier ein schmerzloser Schummel-Speedtest. Schmerzlos in dem Sinne, daß die main genauso aussieht, wie mit klassischem C++.
    http://www.file-upload.net/download-2088733/prime.exe.html (Ist kein Trojaner drin, keine Bange. Aus dem Alter bin ich raus.)

    poste doch mal den quelltext. keine bange, ich bin zwar nur ein blöder C-programmierer, aber vielleicht bekomme ich's ja hin, deinen code durch einen C++ compiler zu jagen.

    volkard schrieb:

    Ich hab halt cout ein wenig aufgebohrt. Kennst Du so ein Spiel auch in C?

    naja, ein C compiler kann halt keine templates, da müsste man wohl was von hand umformen, aber geht bestimmt.
    🙂



  • ;fricky schrieb:

    oder du benutzt C++ ohne RAII

    Nee, das wäre törich, fürchte ich.

    ;fricky schrieb:

    ohne destruktoren und konstruktoren

    dito.

    ;fricky schrieb:

    ohne cin/cout

    Die Standardimplemetierung gefällt mir nicht. Mit c++0x könnte man statt

    cout<<"Der Elefant "<<lpszName<<" wiegt "<<dMasse<<" Kilogramm.";
    

    auch ohne Performanceverlust

    print("Der Elefant ",lpszName," wiegt ",dMasse," Kilogramm.");
    

    schreiben. Aber printf mit seinem Laufzeitgeparse muß langsamer sein. Außer natürlich man blödelt ein wenig rum beim Bauen von cout, da war wohl ein Ballmer-Peak.

    ;fricky schrieb:

    und ohne operatorüberladung

    Für mathematische Sachen ganz praktisch und triviale Sachen wie Array-KLassen, die [] anbieten und Iteratoren, die ++ und * anbieten. Der << von cout ist recht egal, da ich viel VB und C++/CLI mache, hab ich mich ans WriteLine auch wieder gewöhnt.

    ;fricky schrieb:

    ganz vorsichtig mit templates sein

    Außer natürlich, wo sie offensichtlich gut sind, sagen wie mal swap, min, max, und alle Container.

    ;fricky schrieb:

    ohne die STL

    Die verwende ich in der Tat sparsam. Aber die Container sind klasse.

    ;fricky schrieb:

    ohne C++0x-features

    foreach!

    ;fricky schrieb:

    und ohne boost sowieso

    Verwende ich nicht.

    ;fricky schrieb:

    als belohnung winken einfacher, übersichtlicher code, kleine schnelle executables, maximale portabilität, usw.

    Och, Standard-C++ ist mir ausreichend portabel. Schnell ist mein Code eigentlich auch. Bei gelegentlichen Programmierwettbewerben war ich nicht immer auf den hinteren Rängen. Klein ist so ein Ding, da werfen die GCC-Macher einem Felsbrocken in den Weg. Zum Beispiel zahlt man für die erste Exception 30k (voller Nullbytes) an reserviertem Speicher für Exception-Objekte. Die erste virtuelle Funktion hat AFAI dieselben Kosten. der default-terminate-handler will immer den Namen der Exceptionklasse ausgeben, haben wir gleich RTTI (nicht RAII) drin. Zusammen so um die 50k Speicher als Fixkosten, das sind fast 0,0025% von meinen 2G auf dem Hauptrechner. Es wäre alle vermeidbar, aber die GCC-Leute haben es nicht vorgesehen, daß man eigene sparsame Implementierungen reinlinkt, weshalb man den Compiler tunen müßte. Ist zwar einfach, aber für die 50k mache ich mir keine Mühe. Rate, weshalb die prime.exe 64000 Bytes braucht. :xmas1:


Anmelden zum Antworten