2015-05-06 11 views
5

Una funzione normale (ad esempio printArray) accetta la matrice e le sue dimensioni (2 argomenti) per stampare elementi di una matrice.Eccezione C++: Matrici di lancio e acquisizione della dimensione dell'array nella cattura

Come fare lo stesso utilizzando le eccezioni? Più esattamente, come passare la dimensione dell'array per catturare il gestore? (supponendo che non abbia un const int SIZE dichiarato al di fuori del try-catch) es.

//void printArray(int* foo ,int size); 
    int foo[] = { 16, 2, 77, 40, 12071 }; 
    //printArray(foo,5); //OK, function call using array accepts size=5 
    try{ 

     //do something 
     throw foo; 

    } 
    catch (int* pa) 
    { 
     //I have to get array size to loop through and print array values 
     // How to get array size? 
    } 

Grazie in anticipo

+0

Se la funzione accetta array perché all'interno del blocco try l'hai inizializzato? int foo [] = {16, 2, 77, 40, 12071}; –

+3

Lancia un 'std :: vector'. –

+0

@Ashot: scusa, supponiamo int foo [] = {16, 2, 77, 40, 12071}; giace in fila prima di provare {. Ho modificato il codice sopra. Grazie Jerry, sì, il vettore funziona, ma sono interessato a sapere se è possibile ottenere le dimensioni dell'array usando l'array C++ di base – Sree

risposta

6

Si può buttare sia array e la sua dimensione come una coppia nel seguente modo:

throw std::make_pair(foo, 5); 

e ottenere questi due valori come questo:

catch(std::pair<int*, int>& ex) 
{ 
... 
} 
+0

Nel 'catch 'si vogliono parentesi angolari. – celtschk

+1

È inoltre necessario ricordare un modo tipico per determinare una dimensione di array fissi tramite 'sizeof foo/sizeof * foo'. Se usato come secondo argomento su 'std :: make_pair', * non * sarà' int', e quindi non si qualifica per la tua cattura. Non si può comunque fare nulla con quel puntatore se la matrice è dichiarata nel blocco try. – WhozCraig

0

Grazie a tutti per i commenti. esempio di coppia funziona (probabilmente userà quando si usa arr in heap, e quando gettato, preso in funzione chiamata). celtschk ref, è stato molto utile. Userò queste informazioni per l'array locale non statico sullo stesso scope

int main() 
{ 
    int foo[] = { 16, 2, 77, 40, 12071 }; 
    int size = sizeof(foo)/ sizeof(int); 
    try{ 
     //throw foo; 
     throw (pair<int*,int>(foo,size)); 
    } 
    catch (int* foo) 
    { 
     for (int i = 0; i < size; i++) 
      cout << foo[i] << ","; 
    } 
    catch (pair<int*, int>& ip) 
    { 
     cout << "pair.." << endl; 
     for (int i = 0; i < ip.second; i++) 
      cout << ip.first[i] << ","; 
    } 
    cout << endl; 
}