2010-03-17 22 views

cevap

9

Yapamazsınız. Bir işaretçi sadece bir bellek konumudur ve boyutu belirleyebilecek özel bir şey içermez.

bu C++ olduğundan, ne yapmak, böylece gibi referans olarak dizi geçmesine geçerli:

template <typename T, size_t N> 
void handle_array(T (&pX)[N]) 
{ 
    // the size is N 

    pX[0] = /* blah */; 
    // ... 
    pX[N - 1] = /* blah */; 
} 

// for a specific type: 
template <size_t N> 
void handle_array(int (const &pX)[N]) // const this time, for fun 
{ 
    // the size is N 

    int i = pX[0]; // etc 
} 

Ama aksi takdirde, Alok anlaşılacağı gibi, bir çıkarma geçmesi & ucunu başlatmak ve yapılacak bir başlangıca ihtiyacımız & Size önerdiğiniz gibi, boyut, ya da statik bir dizi hendek ve Tyler'ın önerdiği gibi bir vektör kullanın. Eğer çalışıyor olacağım dizinin boyutunu biliyorsanız

, önceden birer typedef: Kullandığım

template <typename T, size_t N> 
size_t countof(T (&pX)[N]) 
{ 
    return N; 
} 

template <typename T, size_t N> 
T* endof(T (&pX)[N]) 
{ 
    return &pX[0] + N; 
} 

// use 
int someArray[] = {1, 2, 6, 2, 8, 1, 3, 3, 7}; 

size_t count = countof(someArray); // 9 
std::for_each(someArray, endof(someArray), /* ... */); 

:

typedef int int_array[10]; 

void handle_ten_ints(int_array& pX) 
{ 
    // size must be 10 
} 

Ve sadece boyutu için Bu yardımcı program zaman zaman çalışır.

+0

Bir dizi türü oluşturmak için "typedef" komutunu kullanmaktan daha iyidir ve bu yöntemler bir başlık dosyasında olmayacak ve dizi boyutu aslında değişmeyecek (şablonda), "template" i ortadan kaldırmak için bir referans kabul edin. derleme zamanı determinist). – Potatoswatter

+0

@Potatoswatter: Böyle bir yazım yapmanın bir yolunun farkında değilim. N, bir çağrıyla örnekleninceye kadar işlev bilinmemektedir. Bir typedef örneği ekleyeceğim, demek istediğin bu mu? – GManNickG

+0

Evet, eklediğiniz yazım örneği de benim kastettiğim şey. 'template ', auto-sized' int ary [] = {…}; 'ile güzeldir, ancak örnekleme uygunsuz/kafa karıştırıcı olabilir ve dizi bu şekilde bildirilmedikçe yarar çok az AFAIK olabilir. Veya kullanıcı birkaç sabit boyutta çalışıyor olabilir. – Potatoswatter

15

Bunu yapamazsınız. Dizi uzunluğunu dizi işaretçisiyle birlikte geçirmeniz veya std::vector gibi bir kapsayıcı nesnesini kullanmanız gerekir. ne son işaretçi dereferences bilmek sürece, Yapamazsın

int a[10]; 
int *start = a; 
int *end = a + 10; 
size_t n = end - start; /* pointers! :-) */ 
+0

Ve yakında std :: dizi :) – coelhudo

+2

Bu noktada C++ 4x sonuçlandırıldığında sosyal güvenliği toplamayı bekliyorum. –

+0

Büyük sorunun ne olduğunu göremiyorum: şu anda boost :: array'i kullanabilirsiniz. –

3

Sen gibi bir şey yani. Char dizileri durumunda, '\ 0', bu yüzden uzunluğunu anlamak için bu karakteri okuyana kadar döngü yapabilirsiniz.

+2

Hayır, bir "son" işaretçisi geleneksel olarak bir-son-bitiyor (hangisi yasaldır) özellikle bu yüzden son - başlangıç ​​= uzunluk, ve böylece (int * i = start; i! = end; ++ i) 'gibi şeyler yapabilirsiniz. –

+0

@Tyler: teşekkürler. –

0

:

+1

* dizeleri durumunda * geleneksel olarak \ 0'dır. Her char dizisi bir dizedir. – Potatoswatter