2010-03-17 6 views

Répondre

9

Vous ne pouvez pas. Un pointeur est juste un emplacement de mémoire, et ne contient rien de spécial qui pourrait déterminer la taille.

Puisque c'est C++, ce que vous pouvez faire est de passer le tableau par référence comme ceci:

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 
} 

Mais sinon, vous devez passer commencer & fin et faire une soustraction, comme l'indique Alok, un début & taille, comme vous le suggérez, ou fossé un tableau statique et utiliser un vecteur, comme le suggère Tyler.

Si vous connaissez la taille du tableau que vous allez travailler avec, vous pouvez faire une typedef:

typedef int int_array[10]; 

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

Et juste pour la taille:

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), /* ... */); 

J'utilise ces fonctions d'utilité de temps en temps.

+0

Il est préférable d'utiliser 'typedef' pour créer un type de tableau, et d'accepter une référence à cela, pour éliminer le' template', à moins que ces méthodes ne soient dans un fichier d'en-tête et que la taille du tableau varie déterministe à la compilation). – Potatoswatter

+0

@Potatoswatter: Je ne suis pas au courant d'un moyen de faire un typedef comme ça. N n'est pas connu de la fonction tant qu'elle n'est pas instanciée avec un appel. Je vais ajouter un exemple de typedef, c'est ce que vous vouliez dire? – GManNickG

+0

Oui, l'exemple typedef que vous avez ajouté est ce que je voulais dire. 'template ' est sympa avec la taille automatique 'int ary [] = {...};' mais l'instanciation peut être gênante/confuse et le bénéfice est FAIBLE à moins que le tableau ne soit déclaré comme ça. Ou l'utilisateur arrive à travailler avec plusieurs tailles fixes. – Potatoswatter

15

Vous ne pouvez pas le faire. Vous devez transmettre la longueur du tableau avec le pointeur de tableau, ou vous devez utiliser un objet conteneur tel que std::vector.

+0

Et bientôt std :: array :) – coelhudo

+2

À ce stade, je m'attends à la collecte de la sécurité sociale au moment où C++ 4x est finalisé. –

+0

Je ne vois pas quel est le problème: vous pouvez utiliser boost :: array dès maintenant. –

3

Vous voulez dire quelque chose comme:

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

Non, un pointeur "fin" est classiquement un-passé-la-fin (ce qui est légal) spécifiquement pour que end - start = length, et que vous puissiez faire des choses comme 'for (int * i = start; i! = fin; ++ i)'. –

+0

@Tyler: merci. –

0

Vous ne pouvez pas, sauf si vous savez ce que le pointeur de fin déréférence à. Dans le cas des tableaux char, c'est un '\ 0', donc vous pouvez faire une boucle jusqu'à ce que vous lisiez ce caractère pour déterminer la longueur.

+1

Dans le cas de * strings *, c'est classiquement '\ 0'. Tous les tableaux char ne sont pas des chaînes. – Potatoswatter

Questions connexes