C++ non ha lo stesso membro di array flessibile dell'ultimo elemento di c99. Dovresti usare un std::vector
se non sai quanti elementi o dovresti specificare quanti se lo fai.
MODIFICA: Nella modifica si è detto che la matrice è una costante di runtime, quindi specificare la dimensione e dovrebbe funzionare correttamente. g ++ non ha alcun problema con il seguente codice:
struct TestStruct { // note typedef is not needed */
int length;
int values[3]; // specified the size
};
TestStruct t = {3, {0, 1, 2}};
int main() {
// main implicitly returns 0 if none specified
}
EDIT: per affrontare il tuo commento, è possibile utilizzare i modelli come questo:
template <int N>
struct TestStruct {
int length;
int values[N];
};
TestStruct<3> t3 = {3, {0, 1, 2}};
TestStruct<2> t2 = {2, {0, 1}};
int main() {}
L'unico problema è che non v'è alcun modo semplice per inserisci t2 e t3 in un contenitore (come una lista/vettore/pila/coda/ecc perché hanno dimensioni diverse. Se vuoi, devi usare std::vector
. Inoltre, se lo fai, allora non è necessario per memorizzare la dimensione (è associata al tipo), quindi puoi farlo invece:
template <int N>
struct TestStruct {
static const int length = N;
int values[N];
};
TestStruct<3> t3 = {{0, 1, 2}};
TestStruct<2> t2 = {{0, 1}};
int main() {}
Ma ancora una volta, non è possibile inserire t2 e t3 in una "raccolta" insieme facilmente.
EDIT: Tutto sommato, sembra che tu (a meno che non memorizzare più dati rispetto a solo alcuni numeri e le dimensioni) non hanno bisogno di una struttura a tutti, e non si può semplicemente utilizzare una pianura vecchio vettore .
Quale consentirebbe di avere sia t2 che t3 in una raccolta insieme. Sfortunatamente lo std::vector
non ha (ancora) la sintassi di inizializzatore dello stile dell'array, quindi ho usato un collegamento. Ma è abbastanza semplice scrivere una funzione per popolare i vettori in un modo piacevole.
MODIFICA: OK, quindi non è necessario un insieme, ma è necessario passarlo a una funzione, è possibile utilizzare modelli per questo per preservare la sicurezza del tipo!
template <int N>
struct TestStruct {
static const int length = N;
int values[N];
};
TestStruct<3> t3 = {{0, 1, 2}};
TestStruct<2> t2 = {{0, 1}};
template <int N>
void func(const TestStruct<N> &ts) { /* you could make it non-const if you need it to modify the ts */
for(int i = 0; i < N; ++i) { /* we could also use ts.length instead of N here */
std::cout << ts.values[i] << std::endl;
}
}
// this will work too...
template <class T>
void func2(const T &ts) {
for(int i = 0; i < ts.length; ++i) {
std::cout << ts.values[i] << std::endl;
}
}
int main() {
func(t2);
func(t3);
func2(t2);
}
Questo non è il codice legale C++. C++ non supporta matrici di lunghezza variabile o membri di array flessibili. – rlbond
In realtà, funziona in gcc - hai un errore irrilevante nel tuo codice, hai dimenticato il nome della struct dopo averlo ottenuto 'typedef'ed. Però, dato che hai taggato la domanda come C++ - non vedo perché lo faresti anche tu. Le strutture typedeff sono state utilizzate per superare una limitazione di C * (rispetto a C++) *, in cui non consentiva di dichiarare una variabile struct senza la parola chiave 'struct' non necessaria. –