Wo ist hier der Fehler? [error: expected primary-expression before '[' token|]



  • Hallo,

    Habe in kommentierter Zeile [55] einen Fehler, den ich nicht verstehe. Der selbe Ausdruck funktioniert an anderer Stelle im Code [89] einwandfrei. Da ich nun gar keinen Ansatz zur Behebung habe, zeige ich den gesamten Code, weil ich ja nicht weiß, wo und wie die Ursache/n sein könnte/n.

    Die Fehlermeldung:

    ... |55|error: expected primary-expression before '[' token|
    ... |55|error: expected primary-expression before '[' token|
    

    Compiler ist mingw32.

    //#include <iostream>
    #include <cmath>
    #include <conio.h>
    #include <windows.h>
    
    const unsigned int Block = 219, lGrey = 176, mGrey = 177, dGrey = 178, lBlock = 254;
    const unsigned int Width = 80, Height = 24;
    
    struct Charakter
    {
        int col;
        int form;
    };
    
    /*
    void point(HANDLE set, int x, int y)
    {
        COORD pos;
        pos.X = x;
        pos.Y = y;
        SetConsoleCursorPosition(set, pos);
    }
    
    void out_(HANDLE set, int col, int cha)
    {
        SetConsoleTextAttribute(set, col);
        DWORD char_number = 1;
        char output = char(cha);
        WriteConsole(set, &output, 1, &char_number, NULL);
    }
    */
    
    void setChar_(HANDLE set, int x, int y, int col, int cha)
    {
        COORD pos;
        pos.X = x;
        pos.Y = y;
        SetConsoleCursorPosition(set, pos);
        SetConsoleTextAttribute(set, col);
        DWORD char_number = 1;
        char output = char(cha);
        WriteConsole(set, &output, 1, &char_number, NULL);
    }
    
    void showColors_1(HANDLE set, int cha_number, struct palette[])
    {
        for(size_t x=0; x<Width; x++)
        {
            for(size_t y=0; y<Height; y++)
            {
                int color = int((cha_number/2) + ((cha_number/2) * sin(x / 8.0)));
                //setChar_(set, x, y, palette[color].col, palette[color].form); //Fehlermeldung
            }
        }
    }
    
    int main()
    {
        HANDLE set = GetStdHandle(STD_OUTPUT_HANDLE);
    
        int form_number = 7;
        int col_number = 12;
        int cha_number = form_number * col_number; //84
        int col_[12] = {4,6,14,10,2,11,3,9,1,5,13,12};
        int form_[7] = {lGrey, mGrey, dGrey, Block, dGrey, mGrey, lGrey};
        Charakter palette[cha_number];
    
        int counter = 0;
        for (int j=0; j<col_number; j++)
        {
            for (int k=0; k<form_number; k++)
            {
                palette[counter].form = form_[k];
                palette[counter].col = col_[j];
                counter ++;
            }
        }
    
        for (int i=0; i<cha_number; i++)
        {
            setChar_(set, 0, i, palette[i].col, palette[i].form); //kein Fehler
        }
    
        SetConsoleTextAttribute(set, 15);
        getch();
    
    }
    


  • Beachten: Wie man Probleme nachstellbar und nachvollziehbar macht
    Insbesondere hättest Du Deine Code eindampfen sollen bis zum Minimum:

    void func(struct whatever[]){ whatever[0]; }
    
    int main(){ }
    

    Von hier können wir diskutieren. Aber müssen wir noch?



  • Wäre ganz nett, weil ich nicht verstehe, worauf Du hinauswillst 😉

    Ich hatte den Link schon gelesen. Und im Nachhinein hätte ich wohl bloß die Funktion zeigen sollen. Nur war ich mir bis dahin noch gar nicht bewusst, in welche Richtung der Fehler liegt. Deswegen hatte ich oben geschrieben, ich zeige lieber den gesamtem Code (der natürlich selbst aus einem größeren Zusammenhang kommt).



  • Der Fehler liegt in der Deklaration von showColors() , was soll denn der dritte Parameter sein? Und wie heißt er?



  • Ach danke, jetzt bin ich dahinter gekommen 🙂 Der struct musste noch in der Funktion definiert/deklariert werden.

    Das hatte ich eigentlich mal beherrscht, aber schon nach drei/vier Jahren ist vieles verloren gegangen 😞



  • lemon03 schrieb:

    Das hatte ich eigentlich mal beherrscht, aber schon nach drei/vier Jahren ist vieles verloren gegangen 😞

    Und weil das so ist, gleich ähnlich gelagerte Frage: Wie rufe ich die Funktion auf?

    showColors_1(set, cha_number, palette);
    

    gibt Schwierigkeiten mit

    cannot convert 'Charakter*' to 'palette*' for argument '3' to 'void showColors_1(HANDLE, int, palette*)'
    

  • Mod

    lemon03 schrieb:

    Ach danke, jetzt bin ich dahinter gekommen 🙂 Der struct musste noch in der Funktion definiert/deklariert werden.

    Ich glaube, du hast das falsch verstanden. struct palette[] ist, so wie du das schreibst, ein Datentyp. palette ist kein Bezeichner für eine Variable.

    Aus dem Zusammenhang nehme ich mal stark an, dass der Datentyp hier struct Charakter sein soll (oder einfach nur Charakter , falls das wirklich C++ und kein C sein soll) und der Name des Parameters palette sein soll. Also

    void showColors_1(HANDLE set, int cha_number, struct Charakter palette[])
    

    Das löst dann auch dein Folgeproblem, denn du versuchst einen Zeiger vom Typ struct Charakter* an die Funktion zu übergeben. Falls du aber stattdessen einen Parameter vom Typ struct palette* erwartest, passt das logischerweise nicht.



  • Hachajeh, danke :), auch für die Erklärung 😉



  • Ich merke, das ich scheinbar noch grundsätzlich mehr Schwierigkeiten mit Strukturen habe. Kann sein, das ich mich noch mal melden muss 😞



  • Hallo,

    tja, ich bin wieder an einer Stelle angelangt, wo ich nicht weiter weiß.

    Wieso wird mir palette[] nicht korrekt zurück gegeben?

    struct Character
    {
        int form;
        int col;
    };
    
    Character makePalette(std::vector <int> &char_form, std::vector <int> &char_col)
    {
        char_form = {lGrey, mGrey, dGrey, Block, dGrey, mGrey, lGrey};
        char_col = {4,6,14,10,2,11,3,9,1,5,13,12};
    
        int cha_number = char_form.size() * char_col.size();
        Character palette[cha_number];
        int counter = 0;
        for (int j=0; j<char_col.size(); j++)
        {
            for (int i=0; i<char_form.size(); i++)
            {
                palette[counter].form = char_form.at(i);
                palette[counter].col = char_col.at(j);
                counter ++;
            }
        }
    
        return palette[cha_number];
    }
    
    std::vector <int> char_form; 
    std::vector <int> char_col; 
    
    Character palette = makePalette(char_form, char_col);
    
    std::cout << palette[13].col << "  " << palette[13].form << std::endl; //fehler
    

    fehler:

    error: no match for 'operator[]' in 'palette[13]'
    


  • Weil du nur ein Character zurückgibst und kein Array von Characters. Wenn du wirklich das ganze Array zurückgeben willst wäre das ein Fall für std::vector, den du ja scheinbar kennst. Eigentlich dürfte die Zeile

    Character palette[cha_number];
    

    auch gar nicht compilieren. Variable length Arrays sind ein Feature aus C und gibt es in C++ eigentlich nicht. Auch ein Fall für vector.



  • Ok, dann werde ich das mal versuchen 😉



  • Danke 🙂

    Hätte ich das gleich mal versucht, hätte ich mir viele Stunden Fummelei und Frust sparen können 😉


Anmelden zum Antworten