int f() {
return 5;
}
int main(int argc, char *argv[])
{
// Stack (nota lo stack di solito è 1-8 Mb a seconda del S.O. o anche molto meno)
int data[f()][f()];
// Heap / dinamica -> Probabilmente nel tuo caso dovresti fare così
int * dataPointer = new int[f()*f()];
}
// Allocazione Statica, non possiamo usare f() perchè il valore di f() deve essere definito a "compile time"
int data[5][5];
constexpr int g() {
//funzioni constexpr possono chiamare solo cose che a loro volta sono costanti o comunque definibili compile time
return 5;
}
// Allocazione Statica, con funzione constexpr
int data2[g()][g()];
Ciao.
Per andare un po' più nel dettaglio devi capire i vari tipi di allocazione della memoria.
Quando fai un'allocazione statica della memoria come nel tuo caso il compilatore deve sapere a "compile time" lo spazio da allocare.
Nel tuo caso il valore dipende dalla funzione GetSystemMetrics() e quindi non può essere calcolato finche il programma non è avviato.
Per aggirare il problema puoi usare un'allocazione che avviene a runtime (dinamica): stack o heap;
oppure definire la funzione come "constexpr" il che implica che il valore della funzione viene calcolato in fase di compilazione se possibile, ma probabilmente se usi constexpr sposterai solo il problema a qualche altra chiamata.
Lo stack solitamente è piuttosto limitato, massimo qualche MB di default. Nel tuo caso il sistema migliore sarebbe l'allocazione dinamica dato che occuperai molta memoria.
PS1: Se opti per l'allocazione dinamica dai un'occhiata agli smart pointer di c++: std::unique_ptr e std::shared_ptr
PS2: Probabilmente le componenti dei colori sarebbe meglio definirle come tipo <uint8_t>
PS3: Usare variabili allocate staticamente è quasi sempre una cattiva idea dal punto di vista dell'architettura.