Ce doit être la fonction la plus courante pour ce que tout le monde a un extrait de code quelque part, mais j'ai effectivement dépensé au moins 1,5 heure la recherche de la recherche sur les autres sites C ++ et n'a pas trouvé de solution.
Je voudrais jusqu'à présent , voici ma dernière version, ce qui donne une erreur de compilation: p> L'erreur de compile est: p> Erreur C3861: 'Accumuler': identifiant non trouvé p>
blockQuote> Pouvez-vous me dire comment corriger cette fonction? Que signifie cette erreur compilée? p> Si j'utilise Pourquoi "accumuler" n'est-il pas membre de "STD"? p> ps: je sais que je peux faire 'somme + = matrice [i]' Way et ne pas utiliser s'accumuler, mais je voudrais comprendre ce qui se passe ici et comment puis-je faire mon exemple de travail . em> p> p> double tableau [] code> à l'aide d'une fonction forte>. Je voudrais transmettre la matrice à la fonction comme une référence
std :: accumuler code> (sur le
déjà défini à l'aide de namepace std code>), alors je reçois l'erreur suivante: p> < PRE> XXX PRE>
4 Réponses :
essayer d'ajouter Il apportera la fonction "std :: accumulant" que vous recherchez. P> aller plus loin, vous allez avoir Un problème pour connaître le nombre d'éléments dans votre tableau. En effet, un tableau ne peut pas être transmis à une fonction dans l'espoir que la fonction sera capable de connaître la taille de la matrice. Il se décomposera à un pointeur. Par conséquent, votre calcul code> code> sera faux. Si vous souhaitez pouvoir passer une matrice spécifiée de taille réelle, vous devez utiliser une fonction modélisée. P> template <int N>
double mean_array( double ( & array )[N] )
{
return std::accumulate( array, array + N, 0.0) / (double)(N);
}
Je ne sais pas si cette fonction modélise peut être appelée dans un procédé de l'objectif-c (wrapper). @ Didier-Trosset: Pouvez-vous élaborer comment le modèle aide avec le compte? Si je dois appeler la fonction C ++ de l'objectif-C où j'ai déjà le compte, seriez-vous d'accord pour dire que la modélisation ne serait plus nécessaire depuis que le compte est passé comme deuxième argument de cette fonction?
@Kushalashok correct. Soit vous passez un pointeur et un nombre à une fonction non modèles; Ou vous n'acceptez que un tableau à une fonction modélisée (qui devinera le compte).
merci de confirmer. J'ai passé le pointeur et comptez et je n'ai pas pu trouver de fuites de mémoire lors de la course à pied des instruments
double mean_array( double *array, size_t count ) { double sum = 0.0; double *pastLast = array + count; while (array < pastLast) { sum += *array; array++; } return sum / count; }
Mais je ne comprends pas, ne travaille-t-il pas avec int compte = Tailleof (matrice) / Tailleof (tableau [0]); code>?
Quelle partie de si vous passez une matrice à une fonction, vous "perdez" sa taille, vous devez donc la transmettre en tant que paramètre code> n'est pas clair?
Taillef (tableau) est == Taillef (double *) code> à ce point. La taille de la matrice est perdue si vous le transmettez à une fonction. Si vous ne me faites pas confiance, essayez de le déboguer.
@zsero: Lorsque vous passez un tableau en tant que paramètre de fonction, il se désintègre à un pointeur. Ce n'est plus un type de tableau et "perd" la taille. En règle générale, vous passeriez également la taille en tant que paramètre séparé comme des exemples de Xanatos.
Ok, maintenant c'est clair. Je ne savais pas que ça se désigne à un pointeur. Merci pour le code et l'explication.
utiliser std :: accumuler code> Vous devez inclure l'en-tête approprié. Ajoutez les éléments suivants à votre fichier source.
#include <numeric>
Ok, il semble que ce soit celui que j'avais manqué. J'ai beaucoup d'inclure, j'ai raté celui-là.
Ce n'est pas tout à fait la question que vous avez posée, mais il existe un bogue facile à faire dans votre échantillon de code. La valeur initiale dans accumule code> est modélisée et dans votre code son modèle à des entiers. Si vous le transmettez un ensemble de doubles, ceux-ci seront lancés vers des entiers et vous obtiendrez les mauvaises réponses. Après avoir fait cette erreur, je me suis fait une garantie rapide comme suit:
double mean_array( double *array, size_t count )
{
double sum = accumulate_checked(array,array+count,0.0)
return sum / count;
}
Je ne suis pas sûr, mais je me demandais simplement, avez-vous ajouté le fichier nécessaire?
Soyez prudent:
accumulez (tableau, matrice + comptage, 0,0); code> Notez le 0.0 - Vous accumulez des entiers dans votre extrait de code.
Donc, si je commence par 0,0 ça marche bien? Dois-je passer sur le compte, ou je peux le calculer de taille de taille?
Vous ne pouvez pas utiliser
tailleOf (tableau) code> car la taille de la matrice n'est pas connue. Voir @xanatos Répondez ci-dessous pour une meilleure manière dans ce cas.
Par la façon dont il est bon d'utiliser STD :: accumuler ici. Si votre tableau est très gros, il peut être trivialement parellélisé avec, pour_example, __gnu_parallel :: accumuler.