Brauche Hilfe bei Lösungen



  • Hallo,
    ich hätte da gerne mal ein paar fragen zu Aufgaben aus meinem C++ Buch.

    Aufgabe: typedef für folgende variablentypen benutzen:

    unsigned char
    const unsigned char
    Zeiger auf Integer
    Zeiger auf Zeiger auf Char
    Zeiger auf Feld von Char
    Feld von 7 Zeigern auf Integer
    Zeiger auf Feld von 7 Zeigern auf Integer
    Feld von 8 Feldern von 7 Zeigern auf Int
    

    Das habe ich nun so gelöst:

    typedef unsigned char uchar; // unsigned char
    typedef const unsigned char conuchar; // const unsigned char
    typedef int* iPtr; // Zeiger auf Integer
    typedef char** cPtrPtr; // Zeiger auf Zeiger auf Char
    typedef char*(*CharArrayPtr)[] ; // Zeiger auf Feld von Char
    typedef int* sevenIntPtr [7]; // Feld von 7 Zeigern auf Integer
    typedef int* (*ptrToArrayOfSevenInt[7] ); // Zeiger auf Feld von 7 Zeigern auf Integer
    typedef int* ((*WeirdVar[7])[8]) []; //Feld von 8 Feldern von 7 Zeigern auf Integer
    

    Nun möchte ich von euch wissen, ob ich die Variablen richtig ausgeschrieben habe (besonders bei den letzten 2 war ich mir unsicher).



  • Schummel einfach. (link von SeppJ geklaut)



  • typedef int* ((*WeirdVar[7])[8]) []; //Feld von 8 Feldern von 7 Zeigern auf Integer
    Nee.
    Typelesen geht so:

    Man liest den Bezeichner
    int* ((*WeirdVar[7])[8]) [];
    WeirdVar ist...

    Und dann immer rechts vor links, außer eine überraschende runde Klammern zwingt einen, erst drinnen zu bleiben.

    Also gehts nach rechts.
    int* ((*WeirdVar[7])[8]) [];
    WeirdVar ist ein Array von 7...

    Ah, die Klammer.

    int* ((*WeirdVar[7])[8]) [];
    WeirdVar ist ein Array von 7 Zeigern auf...

    So, in der Klammer ist alles gelesen, kann weg.
    int* ((*WeirdVar[7])[8]) [];

    Rechts gehts weiter, rechts vor links.
    int* ((*WeirdVar[7])[8]) [];
    WeirdVar ist ein Array von 7 Zeigern auf Array von 8...

    Überraschende klammer, ich suche also links, oh, da ist nix mehr, diese Klammer war wohl gar nicht nötig.

    int* *((WeirdVar[7])[8]) [];

    Weiter rechts.

    int* ((*WeirdVar[7])[8]) [];
    WeirdVar ist ein Array von 7 Zeigern auf Array von 8 Arrays von...

    int*** ((*WeirdVar[7])[8]) []**;
    WeirdVar ist ein Array von 7 Zeigern auf Array von 8 Arrays von Zeigern auf...

    int ((*WeirdVar[7])[8]) []*;
    WeirdVar ist ein Array von 7 Zeigern auf Array von 8 Arrays von Zeigern auf int.

    Also das Lesen geht ganz mechanisch. Das Schreiben nicht, aber egal, kannst ja ein wenig fummeln und es ja immer durch Lesen prüfen.



  • Trampeltier schrieb:

    Hallo,
    ich hätte da gerne mal ein paar fragen zu Aufgaben aus meinem C++ Buch.

    Aufgabe: typedef für folgende variablentypen benutzen:

    unsigned char
    const unsigned char
    Zeiger auf Integer
    Zeiger auf Zeiger auf Char
    Zeiger auf Feld von Char
    Feld von 7 Zeigern auf Integer
    Zeiger auf Feld von 7 Zeigern auf Integer
    Feld von 8 Feldern von 7 Zeigern auf Int
    

    Das habe ich nun so gelöst:

    typedef unsigned char uchar; // unsigned char
    typedef const unsigned char conuchar; // const unsigned char
    typedef int* iPtr; // Zeiger auf Integer
    typedef char** cPtrPtr; // Zeiger auf Zeiger auf Char
    typedef char*(*CharArrayPtr)[] ; // Zeiger auf Feld von Char
    typedef int* sevenIntPtr [7]; // Feld von 7 Zeigern auf Integer
    typedef int* (*ptrToArrayOfSevenInt[7] ); // Zeiger auf Feld von 7 Zeigern auf Integer
    typedef int* ((*WeirdVar[7])[8]) []; //Feld von 8 Feldern von 7 Zeigern auf Integer
    

    Nun möchte ich von euch wissen, ob ich die Variablen richtig ausgeschrieben habe (besonders bei den letzten 2 war ich mir unsicher).

    Die letzten beiden kannst Du einfacher schreiben, indem Du dich auf das drittletzte beziehst:

    typedef sevenIntPtr *ptrToArrayOfSevenInt;
    typedef sevenIntPtr WeirdVar[8];
    

  • Mod

    typedef char*(*CharArrayPtr)[] ; // Zeiger auf Feld von Char
    

    Nein, Zeiger auf ein Array von Zeigern auf char.



  • Trampeltier schrieb:

    typedef const unsigned char conuchar; // const unsigned char
    

    Es wäre keine überaus törichte Idee, Dir das const gleich an der neuen Stelle anzugewöhnen.

    Nach Typenleseregel, vom Beizericher aus loslesen nach außen:
    int const * px;
    px ist ein Zeiger auf konstanten int.
    Also *px=5 geht nicht, aber px=&y.

    int * const px;
    px ist konstanter Zeiger auf int.
    Also *px=5 geht, nicht aber px=&y.

    int const * const px;
    px ist konstanter Zeiger auf konstanten int.
    Beides geht nicht.

    Die alte Schreibweise
    const int * const x;
    x ist konstanter Zeiger auf int, der konstant ist, ist doch unhüsch.

    void foo(Auto const& a);
    //Ein Auto wird genommen, und zwar als Übergabe per const&. Die const&-Übergabe ist zu sehen wie Wertübergabe, nur schneller (wenn das a nicht kaputtgemacht werden darf). Als Übergaben haben wir
    (Auto a)//Kopie, evtl in Sachen C++11 fürs wegmoven optrimiert
    (Auto* a)//Die Aufgerufene soll ändern können
    (Auto const* a)//verwende ich nicht
    (Auto &a)//Die Aufgerufene soll ändern können, und &a ist nicht NULL//verwende ich auch nicht
    (Auto const& a)//Fühlt sich an wie Kopie, keine move-Optimierung

    Mit dem neuen const steht auch die Aufrufweise zusammen, statt daß man sie sich von vor und hinter dem Auto zusammensuchen muss.


  • Mod

    const int * const x;
    

    Verboten 🤡

    (Auto const* a)//verwende ich nicht
    

    Na, aber das ist doch "optionales Argument das konstant ist". Oder nutzt man in diesem konkreten Fall sowieso nie const ? soweit ich mich erinnere "will man ja keine Information ueber die Implementierung nach aussen geben"(?)

    (Auto &a) //verwende ich auch nicht
    

    Wieso nicht!? Wie nimmst du sonst eine veraenderbare Referenz eines Objektes? Doch nicht standardmaessig mit Zeigern?

    (Auto const& a)//Fühlt sich an wie Kopie, keine move-Optimierung

    Das Problem ist, dass es zwei Moeglichkeiten gibt, was passiert, wenn ich eine Const-Referenz initialisiere: Entweder sie bindet direkt (weder Move noch Kopie), oder es wird eine Temporary erstellt, welche mit dem Initializer der Referenz kopierinitialisiert wird, das passiert aber nur bei prvalues - und das fuehrt zu Moves (wenn moeglich, sonst Kopie). Also muss nichts kopiert werden (wenn Moves moeglich sind).



  • volkard schrieb:

    typedef int* ((*WeirdVar[7])[8]) []; //Feld von 8 Feldern von 7 Zeigern auf Integer
    Nee.
    Typelesen geht so:

    Man liest den Bezeichner
    int* ((*WeirdVar[7])[8]) [];
    WeirdVar ist...

    Und dann immer rechts vor links, außer eine überraschende runde Klammern zwingt einen, erst drinnen zu bleiben.

    Also gehts nach rechts.
    int* ((*WeirdVar[7])[8]) [];
    WeirdVar ist ein Array von 7...

    Ah, die Klammer.

    int* ((*WeirdVar[7])[8]) [];
    WeirdVar ist ein Array von 7 Zeigern auf...

    So, in der Klammer ist alles gelesen, kann weg.
    int* ((*WeirdVar[7])[8]) [];

    Rechts gehts weiter, rechts vor links.
    int* ((*WeirdVar[7])[8]) [];
    WeirdVar ist ein Array von 7 Zeigern auf Array von 8...

    Überraschende klammer, ich suche also links, oh, da ist nix mehr, diese Klammer war wohl gar nicht nötig.

    int* *((WeirdVar[7])[8]) [];

    Weiter rechts.

    int* ((*WeirdVar[7])[8]) [];
    WeirdVar ist ein Array von 7 Zeigern auf Array von 8 Arrays von...

    int*** ((*WeirdVar[7])[8]) []**;
    WeirdVar ist ein Array von 7 Zeigern auf Array von 8 Arrays von Zeigern auf...

    int ((*WeirdVar[7])[8]) []*;
    WeirdVar ist ein Array von 7 Zeigern auf Array von 8 Arrays von Zeigern auf int.

    Also das Lesen geht ganz mechanisch. Das Schreiben nicht, aber egal, kannst ja ein wenig fummeln und es ja immer durch Lesen prüfen.

    Also ist folgendes korrekt?:

    typedef int* ((WeirdVar[])[8]) [7]; //Feld von 8 Feldern von 7 Zeigern auf Integer
    

    Ich weiß nicht, was mit "Feld von 8 Feldern von 7 Zeigern auf Integer" gemeint ist.
    Entweder obriges oder möglicherweise dies?:

    typedef int* WeirdVar[8][7];
    

    Wobei das Zweite ein zweidimensionaler Array ist.
    Die Aufgabe ist möglicherweise etwas schlecht formuliert, das fällt mir bei dem Buch auch insgesamt ein bisschen auf. Es heißt "Die C++ Programmiersprache von Bjarne Stroustrup".
    Das Originale Buch im Englischen ist wahrscheinlich verständlicher, da ich mir vorstellen kann, dass so ein Buch über eine Programmiersprache ziemlich schwer ist, zu übersetzen.


Anmelden zum Antworten