Was ist für euch guter Programmcode?



  • groovemaster schrieb:

    Warum meckert nun der Compiler nicht? Ganz einfach, eine Mehrfachdefinition ist nur dann zulässig, wenn der Bezeichner exakt den selben Wert (bzw Ersetzung) hat, wie zuvor. Und da das bei der Einbindung der selben Header normalerweile 🙂 der Fall ist, ist das Programm nicht ill-formed.

    Genau das habe ich ja gemeint.

    Mecnels schrieb:

    Irgendwie seid ihr komische Käuze, die einen verteufeln es, Microsoft Code als Vorbild zu nehmen, ist ja klar, er wird ja auch nur von den bestbezahlten Spitzenprogrammierern der Welt entwickelt

    Ich glaub schon dass ich meinen Neffen noch kenne. So alt bin ich auch wieder nicht.

    ROFL schrieb:

    Wenn Du guten Code sehen willst, dann guck Dir z. B. Linux, POSIX, Boost und co. an.

    Willst du dich dem Niveau von Mecnels anpassen? (bitte keine Beschwerden bzgl. boost 😃 )[/quote]

    Soll er sich etwa 20 Jahre Erfahrung aus dem Hut zaubern? Das ist nicht fair, was Du da verlangst.

    Eine kleine Aufgabe für Euch, bin gespannt wer das von Euch schafft:

    Ein C++ Programm enthalte die folgende Anweisung:

    choose ("hour") (2,3);
    

    Das war's schon. Wie ist diese Codezeile zu verstehen - rein syntaktisch betrachtet?
    Alltag bei mir, für Euch wahrscheinlich eine harte Nuss.
    Ein kleiner Tip, es hat etwas mit Zeigern zu tun.

    Schönen Tag noch.



  • @Shade

    Ich würde von mir nie behaupten C++ zu beherrschen (außer einem Personalchef gegenüber )

    Bitte würdige Dich nicht soweit herunter. Ich will mich demnächst auch bewerben und komme mir sonst wie ein Betrüger wenn ich dem Personaler was von meinen C++ - Kenntnisen erzähle. 🙂

    @Hume

    Deine Klasse fühlt sich ziemlich STL-like an. Sicher ist es für die Dokumentation sinnvoll trotzdem Funktionen wie size, clear usw. zu kommentieren, aber sicher doch keine Todsünde es nicht zu tun, oder?
    Ich würde von solchen Funktionen ohne Kommentare erwarten, das sie ganau das gleiche tun wie die Funktionen der STL.

    @all

    Ich fand Gregor hat das Thema super auf den Punkt gebracht:

    - wenig Redundanz
    - relativ kurze Methoden
    - aussagekräftige Variablennamen usw.
    - ausgiebige Nutzung der Standardbibliothek (man soll sich keine eigene Liste schreiben, wenn es in der Standardbibliothek schon eine gibt)
    - defensiver Programmierstil
    - Verwendung üblicher Entwurfsmuster, wo diese Sinn machen
    - Verwendung jedes sinnvollen Sprachmittels (der Code soll nicht unnötig kompliziert sein, weil sich der Programmierer nicht gut genug mit der Sprache auskennt)

    alles andere artet schon wieder zu sehr in sprachspeziefische Rumstreitereien aus (auch wenn ich dadurch das erste mal was von explicit gehört habe 🙄 ). Es ging doch ursprünglich um guten Code im Allgemeinen.



  • Java als Lehrsprache zu verwenden, wieder einmal sind sie auf einen kurzlebigen Trend (Hype heisst das heutzutage, oder?) hereingefallen, der sich mittlerweile offensichtlich tot gelaufen hat

    Hihi. Jaja, du kennst die Branche in- und auswendig. Du weißt, was aufm Markt so abgeht.
    Dein Fan 😃 👍



  • TheBigW schrieb:

    - wenig Redundanz
    - relativ kurze Methoden
    - aussagekräftige Variablennamen usw.
    - ausgiebige Nutzung der Standardbibliothek (man soll sich keine eigene Liste schreiben, wenn es in der Standardbibliothek schon eine gibt)
    - defensiver Programmierstil
    - Verwendung üblicher Entwurfsmuster, wo diese Sinn machen
    - Verwendung jedes sinnvollen Sprachmittels (der Code soll nicht unnötig kompliziert sein, weil sich der Programmierer nicht gut genug mit der Sprache auskennt)

    alles andere artet schon wieder zu sehr in sprachspeziefische Rumstreitereien aus (auch wenn ich dadurch das erste mal was von explicit gehört habe 🙄 ). Es ging doch ursprünglich um guten Code im Allgemeinen.

    Dich schickt der Himmel. Wir sollten wirklich wieder zum Thema des Threads zurückkehren, meine Beiträge habt ihr ja jetzt ausgiebig runtergemacht, drum bin ich echt mal auf Beiträge von Euch gespannt (ich freu mich schon wenn ich irgendwo ein define sehe und dann darauf herumhacken kann, auch wenn ich keinen blassen Schimmer habe, welche Funktion es in einem gegebenen Programm hat).

    choose ("hour")(2,3);
    

    Wie ich mir gedacht habe, fällt dazu keinem was ein, drum geb ich noch mal einen kleinen Tip: es hat etwas mit Funktionszeigern zu tun.

    😃



  • MecnelsBekehrt schrieb:

    Ganz kurz zu den Schnittstellen, ein sehr gutes Beispiel ist DirectX:
    Als Programmierer habe ich nun mal nicht wirklich Interesse daran, wie genau ein Funktion implementiert ist, die Oberflächen kopiert, Blitts durchführt, Ein CooperativeLevel für ein Device setzt usw. usf. Trotzdem sind das alles Funktionen, und zwar alles durchweg solche, die NICHT in zehn Zeilen codiert sind!

    Sind sie dass wirklich?
    Keine Ahnung. Ich kenne den DirectX Code leider nicht. Ich kenne nur die Schnittstelle, deshalb kann ich darüber nichts sagen.

    Aber was spricht dagegen, dass DirectX intern eine Menge Funktionen verwendet?

    Bedenke: ein Funktion kann andere aufrufen. Du würdest zB eine verschachtelte Schleife machen, ich würde vielleicht eine einfache Schleife machen, die in der Schleife eine Funktion aufruft, die wiederum eine Schleife beinhaltet.

    Das Interface wäre das selbe. Insofern verstehe ich dein Argument nicht.

    Ärgert Dich die beschränkte Mächtigkeit/Einsetzbarkeit Deiner Minifunktionen denn nicht selber?

    Ne. Es ist ja nicht so, dass ich 100.000 kleine Funktionen der reihe nach aufrufe.

    Ein gutes Beispiel ist hier die Unix Welt:
    wie filtert man bestimmte dateien beim anzeigen eines ordners?
    ls /foo/bar | grep filter

    man baut sich also sein "programm" zusammen.
    ähnlich mache ich es. ich habe ls und grep als Funktion (welche intern wieder aus vielen funktionen bestehen) und wenn ich jetzt beides zusammen machen will, dann kommt ein funktion ls_und_grep die beides macht 🙂

    So baue ich mächtige Funktionen.
    Die Idee dahinter ist leichtere wartbarkeit.

    Alles was Du davon hast ist ein Bezeichnerwildwuchs, der ziemlich leichte Aufgaben plötzlich total kompliziert erscheinen lassen.

    Nein, ist es nicht.

    Beispiel aus meiner aktuellen Arbeit:
    Ich habe die Funktion
    createItemDisplayForm()
    sie erstellt eine Form anhand 2 parameter - name und handle zu der existierenden form.

    sie arbeitet als factory und besteht aus lediglich einem switch()
    in diesem switch wird der name gecheckt und je nachdem an die passende funktion weitergereicht.
    diese funktion, zB CreateFooDisplayForm()
    erstellt ein CreateControls Objekt und ruft pro control einmal AddControl auf (worstcase: 3 zeilen pro control) bei normalen etwa 4 controls hat die funktion etwa 10 zeilen.
    weiters wird noch ein filter gesetzt, nochmals 3 bis 5 zeilen.
    sind in etwa 13 zeilen die diese funktion hat.

    aber AddControl hat sogar nur 7 zeilen code.
    es ruft CreateControl, CreateDataSource und CreateUpdater auf. mehr macht es im prinzip nicht.
    CreateControl, CreateDataSource und CreateUpdate sind ähnlich kurz und erstellen konkrete Objekte.

    wie du siehst ist CreateItemDisplayForm durchaus mächtig und kann sehr viel.
    aber es besteht aus nur wenigen zeilen code, keine 20 zeilen.

    CreateControl und Co kann man nun aber wunderbar erweitern, weil diese alle wieder eine factory sind. man kann also anhand ein paar zeilen änderung die anwendung um ein neues control erweitern, zur zeit etwa 2-3 zeilen code die man dafür braucht.

    das ist schön und wäre mit einer monster funktion nicht so einfach möglich. weil man dadurch ja auch nicht so schön code wiederverwenden könnte...

    Das ist meiner Meinung nach jedenfalls der Sinn der Objektorientierung:
    Die Möglichkeit, kompliziertere Datentypen als einfache Zahlen und kompliziertere Operationen als einfache Additionen aus der Sicht des Programmierers mit ihrem Namen anzusprechen, das meinte ich mit Baukastenprinzip: Du baust Dir die Objekte, die Du brauchst, aus den einfachen ganzzahligen Datenobjekten allmählich zu einem sehr großen, die Problemstellung lösendes Objekt, zusammen.

    Ich gehe hier einen Schritt weiter und baue mir selber "einfache" Datenobjekte und aus diesen Baue ich weiter auf.
    Ich habe also eine Pyramide wenn du so willst.

    Denn jedenfalls lösen wir trotz aller Unterschiede unsere Problemstellungen doch immer zufriedenstellend für unsere Chefs.

    Jo, das ist das wichtigste.

    Erstens: Linux ist Vodoo. Die Anhänger schwärmen, dass man damit alles machen KANN, sagen aber nicht dazu, dass man damit auch alles selber machen MUSS, um dem Rechner Vernünftiges zu entlocken.

    Stimmt nicht. Installier Mepis, Suse, Mandrake, RedHat,... die sind vollwertige Desktopbetriebssysteme wo ein laie nur merkt, dass die farben anders aussehen, aber sonst zu windows keinen unterschied kennt.

    Lustigerweise findet da wo ich gerade arbeite momentan eine umstellung auf linux statt 🙂
    es ist also nicht so, dass es vollkommen praxisfern ist, linux kenntnisse zu haben.

    schon gar nicht, wenn auf 90% aller Rechner sowieso das selbe OS werkelt.

    Du vergisst die Zielgruppe zu erwähnen, sonst ist diese Aussage falsch.

    Mecnels schrieb:

    groovemaster schrieb:

    Warum meckert nun der Compiler nicht? Ganz einfach, eine Mehrfachdefinition ist nur dann zulässig, wenn der Bezeichner exakt den selben Wert (bzw Ersetzung) hat, wie zuvor. Und da das bei der Einbindung der selben Header normalerweile 🙂 der Fall ist, ist das Programm nicht ill-formed.

    Genau das habe ich ja gemeint.

    Kapiere ich nicht. groovemaster hat gemeint, dass du Konstanten auch mehrmals definiert darfst. Und genau das war doch dein vorteil für #define oder?

    Ein C++ Programm enthalte die folgende Anweisung:

    choose ("hour") (2,3);
    

    Das war's schon. Wie ist diese Codezeile zu verstehen - rein syntaktisch betrachtet?

    choose ist eine variable und es wird der op() davon aufgerufen, dieser liefert ein objekt und davon wird der op() aufgerufen.

    Oder etwa nicht?

    C++ Syntax ist kontextabhängig, deshalb bringt diese zeile nichts.

    es könnte auch eine funktion choose sein, die einen funktionszeiger returned, der dann aufgerufen wird.

    oder choose ist eine klasse...
    ach, das führt zu nix.

    ich kann leider keinen obfuscated code pasten, denn bei mir gibt es sowas idr nicht 😞

    btw: Java wird idr nicht interpretiert
    die wenigsten system interpretieren wirklich. auch PHP macht das nicht 😉

    @TheBigW:
    :p



  • Optimizer schrieb:

    Java als Lehrsprache zu verwenden, wieder einmal sind sie auf einen kurzlebigen Trend (Hype heisst das heutzutage, oder?) hereingefallen, der sich mittlerweile offensichtlich tot gelaufen hat

    Hihi. Jaja, du kennst die Branche in- und auswendig. Du weißt, was aufm Markt so abgeht.
    Dein Fan 😃 👍

    Wir können ja einen Fanclub gründen - der wird bestimmt riesig 😃

    Mecnels schrieb:

    choose ("hour")(2,3);
    

    Da wird wohl keiner wissen. 🙄



  • Mecnels schrieb:

    choose ("hour")(2,3);
    

    Wie ich mir gedacht habe, fällt dazu keinem was ein, drum geb ich noch mal einen kleinen Tip: es hat etwas mit Funktionszeigern zu tun.

    😃

    also tut mir leid, aber langsam machst du dich lächerlich. Du bist hier vermutlich der einzige im Thread, der die grundlegende C++ Syntax noch nicht so richtig drauf hat.

    Aber diese Diskussion führt echt zu nix. Du bist zu alt 😃 😉



  • Mecnels schrieb:

    Ein C++ Programm enthalte die folgende Anweisung:

    choose ("hour") (2,3);
    

    Das war's schon. Wie ist diese Codezeile zu verstehen - rein syntaktisch betrachtet?
    Alltag bei mir, für Euch wahrscheinlich eine harte Nuss.
    Ein kleiner Tip, es hat etwas mit Zeigern zu tun.
    Schönen Tag noch.

    dafür gibt's 1000 möglichkeiten. zum beispiel

    class FBase{
    public:
    	virtual int operator()(int,int){
    		throw "unknown function";
    	}
    };
    class Hour:public FBase{
    public:
    	int operator()(int a,int b){
    		return a+b;
    	}
    };
    
    FBase& choose(string const& key){
    	static Hour hour;
    	if(key=="hour") return hour;
    	static FBase fbase;
    	return fbase;
    }
    
    int main(){
    	int i=choose("hour")(2,3);
    	cout<<i<<endl;
    

    aber was hat das bitte mit zeigern zu tun?

    außerdem hast du ausreichend oft gezeigt, daß du neicht gut coden kannst. diese kinkerlitzchen sind kein zeichen für gutes coden. sie sind halt grundlagen. in den ersten jahren ist man sogar stolz drauf. früher hab ich auch tief in templates gewühlt. hier was von 1997.

    template<int P,int T=2>
    struct Prim
    {
    	enum{v=Prim<(P%T==0)?0:((P>=T*T)?P:0),(P%T==0)?0:((P>=T*T)?T+1:P>2)>::v};
    };
    

    oder hier was von 1998

    class DownLoop
    {
    private:
    	int max;
    public:
    	DownLoop(int _max)
    	:max(_max)
    	{};
    	template<class X,class E>
    	void forEach(X &x,E e)
    	{
    		int i=max;
    		while(--i>=0)
    		{
    			x.set(i);
    			e();
    		};
    	};
    };
    void main()
    {
    	DownLoop l(5);
    	int summe=0;
    	{
    		Var<int> s(summe);
    		Temp<int> x;
    		l.forEach(x,assign(s,x+s));
    	};
    	cout<<summe<<'\n';
    	cout<<sizeof(Var<int>)<<'\n';
    };
    

    und heute mach ich das vor dem frühstück. aber das macht micht nicht stolz, sondern stolz macht es mich, wenn ich sachen lösen kann, ohne daß der code kompliziert wird. deswegen kriegste hier mit deinen argumenten auch keinen fuß auf den boden. weil du gar nicht weißt, um was es geht beim programmieren. wenn ich bei einer eitwas größeren funktion zu gregor sage "was ist denn hier passiert?" und er sagt "jo, hab ja auch ein schlechtes gewissen deswegen", dann ist das bereits ein gespräch, dem du offensichtlich nicht folgen kannst.
    deine aussagen, was du alles könntest, werden dir hier von keinem geglaubt.



  • volkard schrieb:

    Mecnels schrieb:

    Ein C++ Programm enthalte die folgende Anweisung:

    choose ("hour") (2,3);
    

    Das war's schon. Wie ist diese Codezeile zu verstehen - rein syntaktisch betrachtet?
    Alltag bei mir, für Euch wahrscheinlich eine harte Nuss.
    Ein kleiner Tip, es hat etwas mit Zeigern zu tun.
    Schönen Tag noch.

    dafür gibt's 1000 möglichkeiten.

    Endlich hab ich Gewissheit, wo ihr steht, wenn nicht einmal die elementarsten Dinge klar sind. Es gibt nämlich nur eine einzige, eindeutige Interpretation (genauer: muss es geben - kein Compiler akzeptiert mehrdeutige Anweisungen, sind nämlich nicht übersetzbar), nämlich dass choose eine Funktion ist, die einen Zeiger auf eine andere Funktion zurückgibt. War aber auch tückisch gestellt, die Frage, also kann auch einem Haudegen wie Dir passieren, drauf rein zu fallen.

    Ich bin immer wieder erstaunt, wie schnell Altersunterschiede polarisieren,
    und damit das hier wieder zur Ruhe kommt, spiel ich ab jetzt nur mehr den Beobachter, ist auch amüsant genug.



  • ROFL schrieb:

    Zu Linux: Tja, für die früheren Programmierer 1970-1995 war das selbstverständlich

    Ich muss zugeben, dass ich nicht so der grosse Linux Kenner bin, aber wurde Linux nicht erst Anfang der 90er ins Leben gerufen?

    ROFL schrieb:

    Glaubst DU bei Windows war das schon immer so? Soundkarte rein, Plug'n Play und alles klappt? Das ist kein Verdienst der MS Programmierer, sondern der Hardware Industrie!

    Natürlich. Ich frag mich nur, was die Hardware Hersteller ohne passende BS Schnittstelle machen. Ach was solls, die ist ja in ein paar Minuten gemacht. 🙄

    ROFL schrieb:

    Linux ist ein Unix und Unix == System für versierte Anwender 😉

    Mach nur weiter so, dann endet das hier in einem 50 Seiten langen Linsux vs. Windoof Thread. 👎

    Mecnels schrieb:

    drum bin ich echt mal auf Beiträge von Euch gespannt (ich freu mich schon wenn ich irgendwo ein define sehe und dann darauf herumhacken kann, auch wenn ich keinen blassen Schimmer habe, welche Funktion es in einem gegebenen Programm hat).

    Bei mir wirst du sowas nur in plattform- und build-abhängiger Verwendung finden, aber sicher nicht für Konstanten.

    Mecnels schrieb:

    drum geb ich noch mal einen kleinen Tip: es hat etwas mit Funktionszeigern zu tun

    Dann tipp ich mal auf Shades letzten Vorschlag. choose ("hour") wählt aus einer Map mit Id "hour" einen Wert (Funktionszeiger). Diese Funktion wird mit den Parametern (2,3) aufgerufen? 🙄 Aber wie bereits gesagt wurde, dafür gibt verschiedene Möglichkeiten. Und ohne die Implementierung zu kennen, ist dieses Rätselraten absoluter Unsinn. Und um bei den kindischen Spielereien zu bleiben, das ist nicht mal 1337.



  • Mecnels schrieb:

    kein Compiler akzeptiert mehrdeutige Anweisungen

    Bist du so blöd, oder tust du nur so? Die Rede war nicht von einer mehrdeutigen Anweisung, sondern dass dies je nach Kontext mehrere verschiedene eindeutige Anweisungen sein können.
    Und hör mal besser auf das, was volkard sagt. Was volkard sagt, hat Gewicht, denn er ist der Meister. Was du sagst, hat überhaupt kein Gewicht, weil du weder begründen kannst, noch hat mich dein Code überzeugt (ach, ich verstehe ich ja nur nicht), noch bist du ein langjähriges Mitglied so dass ich sagen kann "jo, was der sagt, kling eigentlich meistens sehr einleuchtend".
    Nicht jeder wird im Alter so starrsinnig und uneinsichtig wie du, aber dir ist definitiv nicht mehr zu helfen. Du bist (grundlos) eingebildet ohne Ende ("Endlich hab ich Gewissheit, wo ihr steht, wenn nicht einmal die elementarsten Dinge klar sind.") und deine weltfremde Ignoranz ("Java ist tot") setzt dem nur die Krone auf.



  • Mecnels schrieb:

    Endlich hab ich Gewissheit, wo ihr steht, wenn nicht einmal die elementarsten Dinge klar sind. Es gibt nämlich nur eine einzige, eindeutige Interpretation (genauer: muss es geben - kein Compiler akzeptiert mehrdeutige Anweisungen, sind nämlich nicht übersetzbar)

    Nein, du verstehst nicht. Wie das ein Compiler interpretiert, hängt von der Implementierung ab. choose ("hour") kann genauso gut ein Objekt mit überladenem op() sein. 😉



  • Mecnels schrieb:

    volkard schrieb:

    Mecnels schrieb:

    Ein C++ Programm enthalte die folgende Anweisung:

    choose ("hour") (2,3);
    

    Das war's schon. Wie ist diese Codezeile zu verstehen - rein syntaktisch betrachtet?
    Alltag bei mir, für Euch wahrscheinlich eine harte Nuss.
    Ein kleiner Tip, es hat etwas mit Zeigern zu tun.
    Schönen Tag noch.

    dafür gibt's 1000 möglichkeiten.

    Endlich hab ich Gewissheit, wo ihr steht, wenn nicht einmal die elementarsten Dinge klar sind. Es gibt nämlich nur eine einzige, eindeutige Interpretation (genauer: muss es geben - kein Compiler akzeptiert mehrdeutige Anweisungen, sind nämlich nicht übersetzbar), nämlich dass choose eine Funktion ist, die einen Zeiger auf eine andere Funktion zurückgibt.

    kk
    Kannst du mir dann bitte verraten, warum volkards Beispiel dann funktioniert, obwohl es nix mit Funktionszeigern zu tun hat? 😃 👍



  • groovemaster schrieb:

    ROFL schrieb:

    Zu Linux: Tja, für die früheren Programmierer 1970-1995 war das selbstverständlich

    Ich muss zugeben, dass ich nicht so der grosse Linux Kenner bin, aber wurde Linux nicht erst Anfang der 90er ins Leben gerufen?

    Ja, gilt aber allgemein für Unices.

    groovemaster schrieb:

    ROFL schrieb:

    Glaubst DU bei Windows war das schon immer so? Soundkarte rein, Plug'n Play und alles klappt? Das ist kein Verdienst der MS Programmierer, sondern der Hardware Industrie!

    Natürlich. Ich frag mich nur, was die Hardware Hersteller ohne passende BS Schnittstelle machen. Ach was solls, die ist ja in ein paar Minuten gemacht. 🙄

    Komisch, als ich damals meine Gamecard eingebaut hab, lief sie nicht. Nicht kompatibel zu Windows 3.1.

    Falsch, der Hersteller liefert Treiber. Das Problem von Linux/BSD ist, daß die Hardware Hersteller keine Treiber schreiben. Schnittstellen hat so ziemlich jedes OS 😉



  • guyondrugs schrieb:

    Kannst du mir dann bitte verraten, warum volkards Beispiel dann funktioniert, obwohl es nix mit Funktionszeigern zu tun hat? 😃 👍

    Der Compiler hat nen Bug. Ist doch ganz klar. 🤡 👍



  • ROFL schrieb:

    Komisch, als ich damals meine Gamecard eingebaut hab, lief sie nicht. Nicht kompatibel zu Windows 3.1.

    LOL. Dir ist aber schon klar, dass Win 3.1 kein BS ist?

    ROFL schrieb:

    Falsch, der Hersteller liefert Treiber. Das Problem von Linux/BSD ist, daß die Hardware Hersteller keine Treiber schreiben. Schnittstellen hat so ziemlich jedes OS 😉

    Es ging mir aber nicht um die Treiber. Dass die vom Hersteller kommen ist schon klar. Nur nützt das nix, wenn du keine Schnittstelle zwischen Treiber und OS hast. Und sowas ist nicht etwas, was man mal so nebenbei für ein BS bereitstellt.



  • groovemaster schrieb:

    Nur nützt das nix, wenn du keine Schnittstelle zwischen Treiber und OS hast. Und sowas ist nicht etwas, was man mal so nebenbei für ein BS bereitstellt.

    äh, wie war das... wenn man keine Ahung hat, ...



  • Mecnels schrieb:

    Endlich hab ich Gewissheit, wo ihr steht, wenn nicht einmal die elementarsten Dinge klar sind. Es gibt nämlich nur eine einzige, eindeutige Interpretation

    Wenn du von C redest, hast du natürlich recht. Weil man dort den op() nicht überladen kann.

    Aber in C++ ist das nicht der Fall, da kann man richtig kranke sachen machen.

    zB wenn choose eine KLasse ist, dann erstellt choose() ein Objekt
    ist choose eine Variable wird der op() aufgerufen
    das sind 2 grundverschiedene sachen.

    (genauer: muss es geben - kein Compiler akzeptiert mehrdeutige Anweisungen, sind nämlich nicht übersetzbar),

    Ich sagte ja auch: kontextabhängig.
    Und C++ _ist_ kontext abhängig.

    denn niemand kann mir verraten was

    foo();
    

    macht.
    wird eine funktion aufgerufen? wird der op() eine variablen foo aufgerufen oder ist foo eine Klasse, dann wird hier ein temporäres Objekt erstellt.

    weiters wird es kompliziert wenn der PP hier rein kommt, aber das lassen wir lieber, weil damit nichts mehr auch nur annährend vorhersehbar wäre.

    nämlich dass choose eine Funktion ist, die einen Zeiger auf eine andere Funktion zurückgibt. War aber auch tückisch gestellt, die Frage, also kann auch einem Haudegen wie Dir passieren, drauf rein zu fallen.

    Schau dir volkards Code an. In C++ ist es nicht eindeutig.
    in C wüsste ich jetzt auf die schnelle auch keine situation wo etwas anderes als funktionszeiger möglich wären.

    Ich bin immer wieder erstaunt, wie schnell Altersunterschiede polarisieren,
    und damit das hier wieder zur Ruhe kommt, spiel ich ab jetzt nur mehr den Beobachter, ist auch amüsant genug.

    Verstehe ich nicht. Was hat das alter damit zu tun? Es ist leicht zu beweisen dass der Code ohne kontext mehrdeutig ist, dass kann auch ein 10 jähriger 😉



  • Optimizer schrieb:

    guyondrugs schrieb:

    Kannst du mir dann bitte verraten, warum volkards Beispiel dann funktioniert, obwohl es nix mit Funktionszeigern zu tun hat? 😃 👍

    Der Compiler hat nen Bug. Ist doch ganz klar. 🤡 👍

    Nene, volkard hat das mit dem GCC kompiliert. Da dieser nicht von bestbezahlten Spitzenprogrammierern geschrieben wurde, kompiliert der alles.



  • #define doChoose(A,B) {int i,j;for(i=0;i<B;++i){for(j=0;j<A;++j) printf("%s ",str);printf("\n");}}}
    #define choose(STR) {char* str=STR;doChoose
    
    int main(){
    	choose("hour")(2,3);
    

    ist nicht mehr so extrem sinnvoll, daß choose("hour")(2,3); ein 2x3 grid malt, wo in jedem feld "hour" steht. aber ist ohne c++.


Anmelden zum Antworten