web-dev-qa-db-fra.com

déterminer la taille du tableau si passé à la fonction

Est-il possible de déterminer la taille d'un tableau s'il a été passé à une autre fonction (la taille n'est pas passée)? Le tableau est initialisé comme int array [] = {XXX} ..

Je comprends que ce n’est pas possible de faire sizeof, car la taille du pointeur sera renvoyée. La raison pour laquelle je pose cette question est parce que j’ai besoin d’exécuter une boucle for dans l’autre fonction où le tableau est transmis. J'ai essayé quelque chose comme:

for( int i = 0; array[i] != NULL; i++) {
........
}

Mais j'ai remarqué qu'à la fin du tableau, le tableau [i] contient parfois des valeurs parasites telles que 758433, qui n'est pas une valeur spécifiée lors de l'initialisation du tableau. 

32
Charles Khunt

Les autres réponses négligent une caractéristique de c ++. Vous pouvez passer des tableaux par référence et utiliser des modèles:

template <typename T, int N>
void func(T (&a) [N]) {
    for (int i = 0; i < N; ++i) a[i] = T(); // reset all elements
}

alors vous pouvez faire ceci:

int x[10];
func(x);

mais notez que cela ne fonctionne que pour tableaux , pas les pointeurs.

Cependant, comme d'autres réponses l'ont noté, utiliser std::vector est un meilleur choix.

46
Evan Teran

Si c'est sous votre contrôle, utilisez un conteneur STL tel qu'un vecteur ou un deque au lieu d'un tableau.

13
Fred Larson

Non, ce n'est pas possible. 

Une solution de contournement: placez une valeur spéciale sur la dernière valeur du tableau afin de pouvoir le reconnaître.

8
tekBlues

Une solution évidente consiste à utiliser STL. Si ce n'est pas une possibilité, il est préférable de passer explicitement la longueur du tableau. Je suis sceptique quant à l'utilisation de l'astuce valeur sentinelle, dans ce cas particulier. Cela fonctionne mieux avec les tableaux de pointeurs, car NULL est une bonne valeur pour une sentinelle. Avec Tableau de nombres entiers, ce n'est pas si facile - vous devez avoir Une valeur sentinelle "magique", ce qui n'est pas bon .

Note latérale: Si votre tableau est défini et initalisé comme

 int array[] = { X, Y, Z };

dans le même champ que votre boucle, puis

sizeof (array) renverra sa taille réelle en octets, pas la taille du pointeur. Vous pouvez obtenir la longueur du tableau comme

sizeof(array) / sizeof(array[0])

Cependant, dans le cas général, si vous obtenez un tableau comme pointeur, vous ne pouvez pas utiliser cette astuce. 

6
Igor Krivokon

Vous pouvez ajouter un terminateur à votre tableau int, puis parcourir le tableau manuellement pour découvrir la taille de la méthode.

#include<iostream>
using namespace std;

int howBigIsBareArray(int arr[]){
    int counter = 0;
    while (arr[counter] != NULL){
        counter++;
    }
    return counter;
}
int main(){
    int a1[6] = {1,2,3,4,5,'\0'};
    cout << "SizeOfMyArray: " << howBigIsBareArray(a1);
}

Ce programme imprime:

SizeOfMyArray: 5

Il s'agit d'une O(n) opération complexe en temps qui est mauvaise. Vous ne devriez jamais parcourir un tableau simplement pour découvrir sa taille.

3
Ali

Si vous ne pouvez pas dépasser la taille, vous avez besoin d'une valeur distincte sentinel à la fin (et vous devez la définir vous-même. Comme vous l'avez constaté, vous ne pouvez pas faire confiance à C++ pour le faire automatiquement. pour vous!). Il n’ya aucun moyen de simplement diviser la taille de la fonction appelée par magie, si elle n’est pas transmise et qu’aucune sentinelle fiable et explicite n’est utilisée.

3
Alex Martelli

Pouvez-vous essayer d'ajouter un caractère null \0 au tableau puis l'envoyer? De cette façon, vous pouvez simplement vérifier\0 dans la boucle.

1

En fait Chucks liste de 

pour (int i = 0; array [i]! = NULL; i ++) { ........ }

Une taille avant chaque appel est un gaspillage et est nécessaire pour savoir ce que vous recevez.

Fonctionne très bien si vous mettez un NULL à la fin des tableaux.

Pourquoi?? Avec les conceptions intégrées, passer un sizeof dans chaque routine rend chaque appel très volumineux comparé à un NULL pour chaque tableau. J'ai une puce 2K PIC16F684 et cela prend jusqu'à 10% de la puce avec 12 appels en utilisant un sizeof passé avec le tableau. Avec juste le tableau et le code de Chucks avec NULLS dans chaque tableau ... je reçois 4% nécessaires.

Un vrai exemple. Merci Chuck bon appel.

0
Saturn5tony