2015-05-06 18 views
5

A Normal işlev (printArray gibi) diziyi ve bir dizinin öğelerini yazdırmak için boyutunu (2 argümanı) alır.C++ Özel Durum: Dizileri Atma ve yakalamada dizi boyutunu alma

Aynı istisnayı kullanarak nasıl yapılır? Daha tam olarak, işleyici yakalamak için dizi boyutunu geçmek nasıl? (Bir dış SIPE'nin dışarıdan denemeyi beyan ettiğine varsayarak) örn.

//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? 
    } 

şimdiden teşekkürler

Sen şu şekilde bir çift olarak diziyi ve boyutunu hem atabilir
+0

Bu işlev dizinin içinde neden denemeyi denediniz? int foo [] = {16, 2, 77, 40, 12071}; –

+3

Bir std :: vektörü atın. –

+0

@Ashot - özür dilerim, int foo [] = {16, 2, 77, 40, 12071}; denemeden önce satırda yatıyor {. Yukarıdaki kodu düzenledim. Teşekkürler Jerry, evet vektör işe yaramıyor, ama temel C++ dizi – Sree

cevap

6

:

throw std::make_pair(foo, 5); 

ve bunun gibi bu iki değeri olsun:

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

'Yakalama'da açılı ayraçlar istersiniz. – celtschk

+1

Ayrıca, sabit dizi büyüklüğünü belirlemenin tipik bir yolunu "sizeof foo/sizeof * foo" ile hatırlamanız gerekir. Std :: make_pair' için ikinci argüman olarak kullanıldığında, * int değil * olur ve bu nedenle yakalamanız için yeterli olmaz. Dizi deneme bloğunda bildirilmişse, o işaretçiyle herşeyi yapabileceğinizden değil. – WhozCraig

0

Yorumlar için hepinize teşekkür ederiz. çift ​​örnek çalışır (muhtemelen yığın üzerinde arr kullanırken ve atıldığında, arama işlevine yakalanır). celtschk ref, çok yardımcı oldu. Bu bilgiyi yerel kapsam dışı statik dizi için kullanacağım

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; 
} 
İlgili konular