déterminer la taille de la table si elle est transmise à la fonction
Est-il possible de déterminer la taille d'un tableau si il était passé à une autre fonction (la taille n'est pas passé)? Le tableau est initialisé comme int tableau[] = { XXX } ..
Je comprends qu'il n'est pas possible de faire sizeof puisqu'il sera de retour de la taille du pointeur de la souris .. Pourquoi je demande, c'est parce que j'ai besoin d'exécuter une boucle for à l'intérieur de la 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 proche de la matrice, tableau[i] contient parfois des ordures des valeurs comme 758433 qui n'est pas une valeur spécifiée dans l'initialisation de la matrice..
Vous devez vous connecter pour publier un commentaire.
Autres réponses donnent sur une fonction de c++. Vous pouvez passer des tableaux par référence, et utiliser des modèles de:
ensuite, vous pouvez faire ceci:
mais attention, cela ne fonctionne que pour tableaux, pas de pointeurs.
Cependant, comme d'autres réponses ont noté, en utilisant
std::vector
est un meilleur choix.template <int N> int max_(int (&arr)[N]);
, lors de l'appel de cette fonction avec un tableau (comme dansint foo [2] = {1, 2}; max_(foo);
), le compilateur dit qu'il ne peut pas en déduire le modèle argument, carvariable-sized array type 'long int' is not a valid template argument
Si c'est à l'intérieur de votre contrôle, l'utilisation d'un conteneur STL comme un vecteur ou deque au lieu d'un tableau.
Non, c'est pas possible.
Une solution: placer une valeur spéciale à la dernière valeur de la matrice de sorte que vous pouvez le reconnaître.
Une solution évidente consiste à utiliser la STL. Si ce n'est pas une possibilité, c'est mieux de passer de la matrice de longueur de manière explicite.
Je suis sceptique sur l'utilisation de la sentinelle de la valeur astuce, pour ce cas particulier. Il fonctionne
mieux avec des tableaux de pointeurs, car la valeur NULL est une bonne valeur pour les sentinelles. Avec
tableau d'entiers, il n'est pas facile - vous devez avoir
une "magie" sentinelles de la valeur, qui est
pas bonne.
Côté remarque: Si votre tableau est défini et initalized comme
dans le même champ d'application que votre boucle, puis
sizeof(tableau) renvoie la taille en octets, et non pas la taille du pointeur. Vous pouvez obtenir la longueur du tableau comme
Toutefois, dans le cas général, si vous obtenez tableau comme un pointeur, vous ne pouvez pas utiliser cette astuce.
Vous pouvez ajouter un indicateur de fin de votre tableau int puis suivez les étapes du tableau manuellement pour découvrir la taille à l'intérieur de la méthode.
Ce programme imprime:
C'est un O(n) le temps de la complexité de l'opération qui est mauvais. Vous ne devriez jamais marcher à travers un tableau juste de découvrir sa taille.
Si vous ne pouvez pas passer la taille, vous avez besoin de distinguer sentinelle valeur à la fin (et vous avez besoin de le mettre là-même -- comme vous l'avez trouvé, vous ne pouvez pas faire confiance C++ pour le faire automatiquement pour vous!). Il n'y a pas moyen d'avoir de la fonction appelée par magie divine de la taille, si ce n'est pas passé et il n'est pas explicite, fiable sentinelle en cours d'utilisation.
Pouvez-vous essayer d'ajouter un caractère null
\0
vers le tableau et ensuite l'envoyer? De cette façon, vous pouvez vérifier pour le \0 dans la boucle.Fait Mandrins liste des
for( int i = 0; tableau[i] != NULL; i++) {
........
}
Un sizeof avant chaque appel, c'est du gaspillage et il est nécessaire de savoir ce que vous obtenez.
Fonctionne très bien si vous mettez une valeur NULL à la fin des tableaux.
Pourquoi?? Avec des conceptions intégrées passage d'un sizeof dans chaque routine chaque appel très grande par rapport à une valeur NULLE à chaque tableau. J'ai un 2K PIC16F684 puce et il faut jusqu'à 10 pour cent de la puce avec 12 appels à l'aide d'un passé sizeof ainsi que le tableau. Avec juste le tableau et les Mandrins de code avec des valeurs NULL om, chaque tableau... je reçois 4 pour cent nécessaire.
Un vrai cas.. merci chuck bon appel.