2016-07-10 17 views
6

Quindi mi piacerebbe creare una matrice in una funzione con la dimensione impostata da un numero che entra come parametro. Ecco un esempio:Creare una matrice in una funzione in C++ senza una variabile globale

void temp_arr (const int array_size) { 
    int temp_arr[array_size]; //ERROR array_size needs to be a constant value 
    //Then do something with the temp arr 
} 

Anche se il parametro è const const, non funzionerà. Mi piacerebbe non usare un const globale e non usare i vettori. Sono solo curioso mentre sto imparando il C++. Vorrei che facesse in modo che la dimensione dell'array fosse diversa ogni volta che viene chiamata la funzione. C'è una soluzione a questo o sono io a creare una variabile const e l'array prima che la funzione venga chiamata?

+0

'int * temp_arr = new int [ARRAY_SIZE]; ... cancella [] temp_arr; ' – songyuanyao

+0

@songyuanyao Non è proprio lo stesso visto che andrebbe dall'assegnazione statica all'assegnazione dinamica. – user2296177

+1

* e non utilizzare i vettori. Sono solo curioso mentre sto imparando il C++.* - Quindi pensi che 'std :: vector' non sia C++? Che cosa è con 'vector' perché tanti principianti pensano che non dovrebbero o non possono usarlo? – PaulMcKenzie

risposta

7

Utilizzando una funzione template:

template<std::size_t array_size> 
void temp_arr() 
{ 
    int temp_arr[ array_size ]; 
    // ...work with temp_arr... 
} 

È quindi possibile chiamare la funzione con la seguente sintassi:

temp_arr<32>(); // function will work with a 32 int statically allocated array 

Nota

Ogni chiamata con un diverso valore di array_size istanzierà una nuova funzione.

+2

Cosa succede se la dimensione proviene da una variabile? – Dmitri

+0

@Dmitri Solo se è un 'constexpr':' constexpr std :: size_t sz {32}; temp_arr (); 'funzionerà. Il punto è che deve essere disponibile alla compilazione. – user2296177

+0

Questo ha funzionato per me. Sto usando un const int per passare nel template. – kingcobra1986

2

Quando si passa un valore in questa funzione, il valore non è una costante. La definizione di un array deve essere eseguita con un valore costante. Sebbene sia stato utilizzato const int array_size, viene creato solo un numero costante all'interno della funzione. Quindi in un certo senso, se si passa un valore variabile nella funzione, lo prende come variabile. In questo modo produce un errore. Sì, devi creare una costante e passarla durante la chiamata di funzione.

+0

Sono stanco di avere un const int in main e di passarlo nella funzione. E ho anche provato ad aggiungere un const int che è uguale a array_size all'interno della funzione. Stai dicendo che dovrei creare una variabile globale? – kingcobra1986

+0

@ kingcobra1986 Non è necessario creare una variabile globale, vedere la mia risposta. – user2296177

+0

@ kingcobra1986 Come mostrato nella risposta dell'utente2296177, non è necessario creare una variabile globale. –

0

È possibile utilizzare:

int const size = 10; 
int array[size]; 

per creare un array in C++. Tuttavia, non è possibile utilizzare

void temp_arr (const int array_size) { 
    int temp_arr[array_size]; 
} 

per creare un array a meno che il compilatore supporta i VLA come estensione. Lo standard non supporta VLA.

Il qualificatore const in un tipo di argomento rende semplicemente la variabile const nella funzione - non è possibile modificarne il valore. Tuttavia, il valore non può necessariamente essere determinato al momento della compilazione.

Ad esempio, è possibile richiamare la funzione utilizzando:

int size; 
std::cout << "Enter the size of the array: "; 
std::cin >> size; 
temp_arr(size); 

Poiché il valore può non essere necessariamente essere determinato in fase di compilazione, non può essere usato per creare una matrice.

+2

Il qualificatore 'const' nel tipo di argomento non è" inutile " –

0

Se non si dispone di problema con la memoria lasciate che vi dica un modo semplice: -

void temp_arr (const int array_size) 
    { 
     //lets just say you want to get the values from user and range will also be decided by the user by the variable array_size 

     int arr[100]; //lets just make an array of size 100 you can increase if according to your need; 
     for(int i=0; i<array_size ; i++) 
     { 
     scanf("%d",&arr[i]); 
     } 
    } 

So che questo non è una soluzione perfetta, ma solo un modo facile per i principianti.

+1

È necessario includere del codice per evitare buffer overflow quando danno la dimensione maggiore di 100 –

+0

totalmente d'accordo @ M.M era solo per dare l'idea ai principianti. – dreamBegin

+0

Sono anche sulla mia strada per imparare la programmazione voglio solo condividere le cose che conosco. – dreamBegin

0

È possibile utilizzare uno std :: unique_ptr:

void temp_arr(int array_size) 
{ 
    auto temp_arr = std::make_unique<int[]>(array_size); 
    // code using temp_arr like a C-array 
}