Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention. Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé. Pour plus d'informations, nous vous invitons à lire les règles générales du forum
Merci de colorer votre code à l'aide du bouton Code
Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.
Merci de modifier votre message d'origine en fonction.
Salut quelques conseils en vracs, copie/colle tes messages d'erreurs plutôt que de faire une capture d'écran. Chez moi les images ne s'affichent pas et même si ça s'affiche on peut pas copier ton erreur dans google si on veut vérifier
Evite d'utilser using namespace std, tu trouveras une explication détaillée ici
A la place il faut utiliser le nom complet des fonctions ou des objets ==> std::cout à la place de cout / std::string à la place de string / std::vector à la place de vector ect ...
Comme l'a dit MO9845, utilise plutôt std::vector que les vieux tableaux à la C. Globalement, privilégie toujours les éléments de la bibliothèque standard pour construire ton code
Pour passer un tableau en paramètre d'une fonction (ou n'importe quel type "complexe" ie autre que les types de bases) il faut (sauf cas particuliers) les passer par référence et même par référence constante si possible. Lorsque tu ne passes pas l'argument par référence, on dit qu'il est passé par "valeur" ou par "copie" parce que ta fonction travaillera en réalité sur une copie locale de ton tableau. En plus d'être couteux en ressource de faire la copie d'un tableau, si tu changes une valeur du tableau dans ta fonction tu perdras cette modification en dehors de ta fonction.
Je te laisse creuser un petit ce sujet mais en attendant tu peux run ce morceaux de code et essayer de comprendre ce qu'il se passe entre un passage par référence et un passage par valeur, tu as ici tout ce qu'il faut pour voir la différence entre les deux. A toi de creuser pour bien comprendre
#include <iostream>
#include <vector>
void afficherTableau(const std::vector<int>& tab)
{
for (const auto elem : tab)
std::cout << elem << std::endl;
std::cout << "------------------" << std::endl;
}
void multiplieParDeuxReference(std::vector<int>& tab) // Passage par référence avec '&'
{
for (std::size_t i = 0; i < tab.size(); ++i) {
tab[i] *= 2;
}
}
void multiplieParDeuxValeur(std::vector<int> tab) // Passage par valeur sans le '&'
{
for (std::size_t i = 0; i < tab.size(); ++i) {
tab[i] *= 2;
}
std::cout << "Dans la fonction par valeur : j'affiche tab" << std::endl;
afficherTableau(tab);
}
int main() {
std::vector<int> exempleTab{ 1,2,3,4,5,6,7,8,9 };
afficherTableau(exempleTab);
multiplieParDeuxValeur(exempleTab);
std::cout << "Apres la fonction par valeur : j'affiche exempleTab" << std::endl;
afficherTableau(exempleTab);
multiplieParDeuxReference(exempleTab);
afficherTableau(exempleTab);
return 0;
}
Lorsque tu ne passes pas l'argument par référence, on dit qu'il est passé par "valeur" ou par "copie" parce que ta fonction travaillera en réalité sur une copie locale de ton tableau. En plus d'être couteux en ressource de faire la copie d'un tableau, si tu changes une valeur du tableau dans ta fonction tu perdras cette modification en dehors de ta fonction.
C'est faux ! Pour le cas des tableaux c'est toujours l'adresse du tableau qui est passé en argument. Mais bien sûr on évite de les utiliser en C++, on privilégie les vector ou array à la place.
Oui tu as raison merci de ta correction, utilisant rarement les tableaux C-style j'ai rédigé mon message en ayant en tête les tableaux types std::array et std::vector
Oui tu as raison merci de ta correction, utilisant rarement les tableaux C-style j'ai rédigé mon message en ayant en tête les tableaux types std::array et std::vector
My bad pour cette erreur !
J'en profite pour poser un petite question. Quelle est la différence entre std::vector, std::list et std::array ?
Pour la solution, innoce_nda, tu peux essayer :
#include <vector>
#include <string>
#include <iostream>
void printVector(std::vector<std::string> values)
{
for (std::string value : values) // récupérer toutes les valeurs
std::cout << value; // rajouter std::endl pour revenir à la ligne
}
int main()
{
std::vector<std::string> values = {"Le", " C++", ", c'est", " bien"}; // créer un tableau
printVector(values); // appeler la fonction
}
Il y a un petit piège avec std::list : Lorsque que l'on supprime un noeud avec un itérateur, on ne devrait pas continuer de poursuivre la liste avec cet itérateur. En plusieurs années de programmation je n'ai jamais eu de warning ou de message SIGSEGV en session de débuggage avec MingW / Gcc. Par contre avec le compilateur de Visual Studio , j'ai pu comprendre que j'avais fait cette erreur , car j'avais un avertissement pendant une session de debuggage.
En dehors des considérations citées plus haut, il y a quelques autres erreurs dans le code: + le return n'est pas à la bonne place dans la fonction + le type du tableau n'est pas mentionné dans les paramètres + somme n'est pas initialisé + le tableau est initialisé à l'exécution, ce n'est pas une erreur mais une mauvaise pratique. (avec std::vector ça peut avoir un certain sens si on fait un push_back) + on se demande pourquoi on refait la somme encore sans initialiser la somme à 0 ... + est-ce voulu que la somme partielle soit affichée dans la boucle? J'aurais personnellement préféré std::array à std::vector et avec un type int si on ne gère que des entiers.
Le Tout est souvent plus grand que la somme de ses parties.
+ le tableau est initialisé à l'exécution, ce n'est pas une erreur mais une mauvaise pratique. (avec std::vector ça peut avoir un certain sens si on fait un push_back)
Les VLA ne font pas partis de la norme C++, et certains compilateurs se feront une joie de cracher une erreur.
Je n'ai pas parlé de VLA. Si on ne sait pas la longueur du tableau à l'avance, il vaut mieux utiliser std::vector avec push_back Sinon on peut faire: std::array<int, 3> = {15, 10, 45};
Le Tout est souvent plus grand que la somme de ses parties.
Passer un tableau en fonction
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Mon site web de jeux SDL2 entre autres : https://www.ant01.fr
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.