Arrays und andere Datentypen



  • Hallo,

    und war ist es zumindestens was für mich das Thema angeht etwas komplizierter. 🙂

    Ich schicke einfach mal die Aufgabe durch und schreib die Stelle an der ich nicht weiter komme.

    Und zwar geht es erst einmal darum die Ziffern als "Pixelblöcke" also in einer Matrix von 5x8 Zeichen darzustellen.
    Bsp:

    111
    1   1
    1  11
    1 1 1
    1 1 1
    11  1
    1   1
     111
    

    So jetzt die eigentliche Aufgabenstellung:

    Definieren Sie in der Datei pixel_font.h einen Datentyp pixel_font_t, der
    jeweils eine 5×8-Pixel-Matrix für die Anzeige einer Ziffer aufnehmen
    kann (siehe Bild oben). Legen Sie dann in pixel_font.cpp ein globales
    Array an, in der die oben dargestellten Pixelmatrizen für die Ziffern
    '0'…'9' für einen bequemen Indexzugriff konstant gespeichert sind. Wie
    Sie mit den Pixel-Darstellungen des Schrägstrichs und des Minuszeichens
    verfahren, mögen Sie selbst entscheiden. Diese könnten wahlweise mit in
    das Array aufgenommen oder in Einzelvariablen des Typs pixel_font_t
    abgelegt werden. Beziehen Sie in die Entscheidung vor allem die
    Arbeitsweise der nachfolgend geforderten Funktion ein.
    Erstellen Sie dann in der Datei pixel_font.cpp eine Funktion
    getPixelsForChar(char aChar), die für ein als Parameter übergebenes
    Zeichen aChar einen Zeiger auf das zugehörige Pixelmuster zurückgibt,
    wenn aChar eines der Zeichen '0', …, '9', '/', '-' ist, anderenfalls
    den Zeiger NULL. Warum ist pixel_font_t* dafür der geeignete
    Rückgabetyp?

    So mein problem ist nun 1. wie ich erstmal überhaupt diesen Datentyp darstelle,
    ich hatte ja gedacht über ein struct welches ein 2D Array enthält, und dann das ganze damit es für jede zahl gültig ist wieder in ein Array gepackt.
    Allerdings kenne ich mich noch nicht sogut mit Arrays aus.
    Also die das man es mit array[5][8] definiert ist mir klar.
    aber wenn ich es infolgenden Code packen würde:

    //pixel_font.h:
    
    struct arr{
    bool number[5][8];
    };
    
    //pixel_font.cpp
    
    // die frage ist wie kann ich das jetzt aufrufen?
    // also die zahlen für jedes arr vordefinieren. Konstant definiern!
    // also ich würde es so machen, aber funktioniert ja nicht...
    
    arr numberarray[9]; // 9 mal das struct in einem Array
    
    numberarray[0].number = {{...},{...}...};
    
    // oder müsste ich number über einen pointer ansteuern?
    // das oben sozusagen " bool number** " steht?
    

    Also wie ihr wahrscheinlich seht bin ich doch ziemlich verwirrt was die Aufgabe angeht und würde mich über jegliche hilfe freuen.
    Außerdem soll das ganze noch ne Konstante sein und Global gültig, muss ich das dann über #define machen, wenn ja wie schreibe ich das überhaupt?

    MfG



  • Wenn du konstant definieren willst, musst du initialisieren. Momentan machst du nichts anderes als zuzuweisen.

    Nehmen wir mal ein Array der Länge N mit Elementen vom Typ T, dann sieht eine Initialisierung wie folgt aus:

    T anyarray[N] = {...};
    

    Innerhalb der geschweiften Klammern stehen dann die Ausdrücke für die Werte der einzelnen Elemente. Es ist praktisch das, was du bereits in deinem Code stehen hast. Nur gehört das direkt zur Definition. Übrigens, wenn du die Ziffern von 0 bis 9 speichern willst, muss das Array 10 Elemente haben, nicht 9. Du kannst die Grössenangabe auch weglassen. Dann wird sie vom Compiler anhand der Initialisierung automatisch ermittelt.



  • ich würd anstatt der x-dimension an bools ein unsigned char nehmen, das ist um einiges platz sparender.

    struct arr{  // <- hat das einen grund, dass das nochmal in eine structur verpackt ist, die zudem einen dummen namen hat?
    unsigned char number[8];
    };
    


  • Hallo Studienkollege ^^

    Die Konstanten hab ich im folgenden so definiert:

    typedef char pixel_font_t[8][5];
    const pixel_font_t number1={	
    			{' ',' ',' ','#',' '},
    			{' ',' ','#','#',' '},
    			{' ','#',' ','#',' '},
    			{' ',' ',' ','#',' '},
    			{' ',' ',' ','#',' '},
    			{' ',' ',' ','#',' '},
    			{' ',' ',' ','#',' '},
    			{' ',' ',' ','#',' '}};
    
    //usw...
    

    Dann geht es ja darum es in die Funktion:

    const pixel_font_t* getPixelsForChar(char aChar);
    

    zu schreiben.

    Also die Ausgabe von einer Zahl stellt jetzt noch nicht das Problem dar.
    Ich glaube so war es gewesen:

    const pixel_font_t* getPixelsForChar(char aChar)
    {
        for(int i=0;i<8;i++)
        {
          for(int j=0;j<5;j++)
          {
             switch(aChar)
             {
                 case '1':
                    cout<<number1[i][j];
                    break;
             };
           if(j==4)
           cout<<endl;
           }
        }
    
        return NULL;
    }
    

    Mir ist so als war das so gewesen. Später änderst du die Funktion so ab dass für den benötigten Parameter die richtige Konstante zurückgegeben wird. Das NULL soll am Ende nur zur Sicherheit übertragen werden um im späteren Verlauf eventuelle Fehler abzudecken. Später ändert sich die Sache nämlich ein wenig ab wenn es darum geht die Zahlen hintereinander auszugeben.

    Hoffe ich konnte dir ein wenig helfen.

    mfg frock. 😉



  • danke an groovemaster und frock, ps schreib mal mal durch wer du bist ^^, kann deinen nick nich zuordnen,
    also die ausgabe war nich so mein problem und die zuordnung, allein das schreiben der constanten und arrays, wie auch immer, war mein problem, trotzdem danke :), jetzt hab ich zumindestens einen ansatz.
    werd mir das morgen nochma genauer anschauen und bei frauen nochma rückmelden.

    an vlad_tepesch:
    ja ich fand es auch nicht reichlich sinnvoll das ganze nochma in ein struct einzupacken aber irgendwie hab ich es so aus der aufgabe herausgelesen du kannst sie dir gerne noch zu gemühte führen bevor du nicht wirklich brauchbare kommentare dazu ablässt, und der name mag dumm sein ich hab ihn mir in dem augenblick auch nur aus dem ärmel geschüttelt (arr für array, soll zeigen das da ein array reingepackt ist)

    //edit
    ohh entschuldigung jetzt hab ich doch tatsächlich nicht den hinweis über dem "code" gelesen, auch danke dafür!



  • vlad_tepesch schrieb:

    ich würd anstatt der x-dimension an bools ein unsigned char nehmen, das ist um einiges platz sparender.

    Implementationsspezifisch. Wenn bool lediglich 1 Byte gross ist, wird auch nicht mehr Platz benötigt. Ob bool oder direkt char sollte man besser entsprechend der Aufgabenstellung entscheiden.



  • Wenn man Platz sparen will, ist die spezialisierte Templateklasse std::vector<bool> zu empfehlen.


Anmelden zum Antworten