Puis-je le faire sans passer? Pas de. Voir ma réponse ci-dessous. Paul, votre réponse est correcte pour le C, mais en C++, vous pouvez définir un modèle de fonction qui ne "découvrir" de la taille d'un tableau statique. Nice! référence.. pas de. Voir msdn.microsoft.com/en-us/library/0w557fh7(SV.80).aspx pour la confirmation.
Utiliser un modèle de fonction plutôt qu'a un non-type de paramètre de modèle:
template<size_t N>void func(char(&a)[N]){for(int i =0; i < N;++i){
cout <<"a["<< i <<"] = "<< a[i]<< endl;//Or whatever you want to do}}
L'appel de:
char myArray[500];//Or "static char myArray[500]", if you want
func(myArray);
Une nouvelle copie de cette fonction sera instancié pour chaque taille de tableau qu'il est appelé avec, donc si vous l'appelez, avec beaucoup de différentes tailles de matrices, vous obtiendrez une augmentation du code. Mais ce n'est pas susceptible d'être le cas.
Quelle bonne idée! merci. Nice! template<typename T, size_t N> size_t elments_of_array( T (&arr)[N] ) { return N; } Dans ce cas, vaut mieux aller sur le temps de compilation - voir question.
Pas. Ne pas utiliser des tableaux. L'utilisation d'un vecteur lieu. Ces jours, il est presque pas d'excuse à l'aide de tableaux, car ils sont dangereux. Autant que je sache, ils sont l'une des principales raisons pour les problèmes de logiciel parce qu'il est si facile de par inadvertance de dépassement de capacité de la fin du tableau.
À l'aide d'un vecteur, vous n'avez pas à vous inquiétez plus au sujet des dépassements de mémoire tampon. Et la fonction que vous pouvez trouver facilement la taille de la vecor.
int array_size = sizeof(Tableau) /sizeof(Tableau[0]);
c'est très sujettes à erreur, quelqu'un pourrait-elle remplacer le tableau avec un pointeur, à l'origine de la taille incorrecte. Je voudrais utiliser j_random_hacker de la méthode qu'il refuse de compiler dans ces situations.
Vous ne pouvez pas. Les tableaux en C++ sont des pointeurs, et c'est tout ce que vous avez: le pointeur vers le début du tableau. Si elle arrive à être une chaîne de caractères, vous pouvez utiliser strlen pour mesurer sa longueur. Si ses autres format connu, vous pouvez calculer la longueur en fonction de ce format.
Considérer ce code:
staticchar str[]="hello world";
foo(str);
bar(str);void foo(char* str){//length of str is unknown}void bar(char str[]){//length of str is still unknown}
Peu importe si votre paramètre de la fonction est un char[] ou un char*, vous ne connaissez pas la taille.
Je suggère de passer à la taille comme un paramètre individuel.
Votre réponse est correcte pour le C, mais en C++, vous pouvez définir un modèle de fonction qui ne "découvrir" de la taille d'un tableau statique.
Une autre option que vous avez est la création d'une chaîne de caractères de la classe qui gère la chaîne. Je suis sûr que quelqu'un a déjà fait cela. La version plus primitif est une structure avec un char * et la longueur de la mémoire tampon, où vous devez gérer manuellement la taille de chaque changement. L'autre extrémité du spectre, on trouve la mise en oeuvre intégrale de la chaîne de classe, avec la surcharge d'opérateur et de la manupulation des fonctions.
Ensuite passer cette classe de votre fonction et il sait déjà la taille. Il n'est pas vraiment différent puis, passant comme paramètre; c'est tout simplement un moyen plus facile de la gestion des chaînes si elles sont toutes différentes longueurs.
Vous êtes sur la bonne voie, mais pourquoi inventer votre propre classe string quand std::string existe déjà et fait exactement ce qui est nécessaire? Aussi vrai. Il a été un moment...
Vous auriez à passer à la fonction. Vous pouvez utiliser sizeof() pour obtenir la taille d'un tableau.
Ce Page MSDN a explique plus sur sizeof et a un plus grand exemple.
Edit: * voir j_random_hacker réponse pour une intrigante technique à l'aide de modèles... *
Pas de. Voir ma réponse ci-dessous.
Paul, votre réponse est correcte pour le C, mais en C++, vous pouvez définir un modèle de fonction qui ne "découvrir" de la taille d'un tableau statique.
Nice! référence..
pas de. Voir msdn.microsoft.com/en-us/library/0w557fh7(SV.80).aspx pour la confirmation.
OriginalL'auteur Paul Dixon
Utiliser un modèle de fonction plutôt qu'a un non-type de paramètre de modèle:
L'appel de:
Une nouvelle copie de cette fonction sera instancié pour chaque taille de tableau qu'il est appelé avec, donc si vous l'appelez, avec beaucoup de différentes tailles de matrices, vous obtiendrez une augmentation du code. Mais ce n'est pas susceptible d'être le cas.
Nice! template<typename T, size_t N> size_t elments_of_array( T (&arr)[N] ) { return N; }
Dans ce cas, vaut mieux aller sur le temps de compilation - voir question.
OriginalL'auteur j_random_hacker
Pas. Ne pas utiliser des tableaux. L'utilisation d'un vecteur lieu. Ces jours, il est presque pas d'excuse à l'aide de tableaux, car ils sont dangereux. Autant que je sache, ils sont l'une des principales raisons pour les problèmes de logiciel parce qu'il est si facile de par inadvertance de dépassement de capacité de la fin du tableau.
À l'aide d'un vecteur, vous n'avez pas à vous inquiétez plus au sujet des dépassements de mémoire tampon. Et la fonction que vous pouvez trouver facilement la taille de la vecor.
OriginalL'auteur Rocketmagnet
int array_size = sizeof(Tableau) /sizeof(Tableau[0]);
OriginalL'auteur
Vous pouvez également utiliser
std::size()
à partir de C++17https://en.cppreference.com/w/cpp/iterator/size
Pour pré c++17 copie des implémentations échantillon 😉
OriginalL'auteur Dawid Drozd
Vous ne pouvez pas. Les tableaux en C++ sont des pointeurs, et c'est tout ce que vous avez: le pointeur vers le début du tableau. Si elle arrive à être une chaîne de caractères, vous pouvez utiliser strlen pour mesurer sa longueur. Si ses autres format connu, vous pouvez calculer la longueur en fonction de ce format.
Considérer ce code:
Peu importe si votre paramètre de la fonction est un char[] ou un char*, vous ne connaissez pas la taille.
Je suggère de passer à la taille comme un paramètre individuel.
OriginalL'auteur abelenky
Une autre option que vous avez est la création d'une chaîne de caractères de la classe qui gère la chaîne. Je suis sûr que quelqu'un a déjà fait cela. La version plus primitif est une structure avec un char * et la longueur de la mémoire tampon, où vous devez gérer manuellement la taille de chaque changement. L'autre extrémité du spectre, on trouve la mise en oeuvre intégrale de la chaîne de classe, avec la surcharge d'opérateur et de la manupulation des fonctions.
Ensuite passer cette classe de votre fonction et il sait déjà la taille. Il n'est pas vraiment différent puis, passant comme paramètre; c'est tout simplement un moyen plus facile de la gestion des chaînes si elles sont toutes différentes longueurs.
Aussi vrai. Il a été un moment...
OriginalL'auteur lc.