Je suis novice en terme de fonctions en c++. Mon problème est simple, j'ai crée un alias d'un tableau de N entier :
int N = 10;
using tab = int[N];
tab tableau ;
Ensuite, je remplis ce tableau par des "-1" et je veux l'afficher dans une procédure "affichage". Or, j'ai comme erreur "tab was not declared in this scope".
Voilà le code entier :
#include <iostream>
using namespace std;
void affichage(tab tableau, int N);
int main(){
int N = 10;
using tab = int[N]; //déclaration du tableau de N entiers
tab tableau ;
for(int i=0;i<N;i++){ //Remplissage du tableau par "-1"
tableau[i]=-1;
}
affichage(tableau, N); //fonction d'affichage
return 0;
}
void affichage(tab tableau, int N){
for (int i=0;i<N;i++){
cout << tableau[i] << endl;
}
}
Merci d'avance pour votre aide !
- Edité par MaximeLefebvre32 10 avril 2022 à 22:32:58
Les déclarations et définitions sont mémorisées dans leur ordre d'apparition. Là... ce n'est pas dans le bon sens. En plus, la déclaration est locale, et donc non visible à l'extérieur.
Je ne sais pas ce que tu essais de tester, mais le compilateur lit le code de haut en bas et quand il arrive sur la ligne 4 il ne connait pas le type tab puisqu'il n'est pas encore défini. De plus tu le défini à l’intérieur d'une fonction, ce qui le rend inaccessible aux autre fonctions.
PS : de nos jours, on évite l'utilisation de using namespace std; et aussi des tableaux venu du C.
Pour commencer, merci beaucoup pour vos retours rapide !
En effet lmghs, c'est ma faute d'avoir mal organisé l'ordre d'initialisation. Par contre, on m'avait dit que toutes les variables dans le main sont globales et donc utilisables partout, c'est faux ?
Rouloude, c'est aussi mon professeur qui nous conseille d'utiliser "using namespace std" pour une simplicité de lecture, tu as une meilleure option à me conseiller ? D'ailleurs qu'entends-tu par "tableaux en C" ? Cela veut dire que la déclaration des tableaux en c++ est différentes ?
Par ailleurs, j'ai reformulé mon code et il fonctionne désormais, le voici :
#include <iostream>
using namespace std;
using tab = int[10]; //déclaration du tableau de N entiers
void affichage(tab tableau, int N);
int main(){
int N = 10;
tab tableau ;
for(int i=0;i<N;i++){ //Remplissage du tableau par "-1"
tableau[i]=-1;
}
affichage(tableau, N); //fonction d'affichage
return 0;
}
void affichage(tab tableau, int N){
for (int i=0;i<N;i++){
cout << tableau[i] << endl;
}
}
Le seul soucis que j'ai est le suivant : je voulais faire using tab = int[N]; avec N un nombre qu'on définie arbitrairement, or à chaque fois que j'essaie de déclarer l'entier N avant, il me mets une erreur. Avez-vous une solution ?
- Edité par MaximeLefebvre32 10 avril 2022 à 23:54:07
Par contre, on m'avait dit que toutes les variables dans le main sont globales et donc utilisables partout, c'est faux ?
Ahh, je ne sais pas qui a pu te raconter ce genre d’ânerie, mais oui, c'est totalement faux.
La fonction main est une fonction tout à fait ordinaire, qui fonctionne exactement de la même manière que les autres.
Il n'y a que trois différences qui en font une fonction "spéciale"
C'est la seule fonction qui ne doit pas être déclarée
C'est la seule fonction qui ne puisse pas être appelée dans le code
C'est la seule fonction qui sera automatiquement recherchée par l'éditeur de liens lors de la génération de l'exécutable final, afin de permettre au système d'exploitation de l'appeler au lancement du programme
(bon, je simplifie un peu, l'idée est malgré tout bien là )
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
> Le seul soucis que j'ai est le suivant : je voulais faire using tab = int[N]; avec N un nombre qu'on définie arbitrairement, or à chaque fois que j'essaie de déclarer l'entier N avant, il me mets une erreur. Avez-vous une solution ?
Seules des constantes connues au moment de l'exécution sont autorisée. Pas des variables qui seront acquises au dernier moment.
Si tu veux introduire de la dynamique, alors il te faudra utiliser des structures dédiées. Dans le monde professionnel, et dans le monde éducatif à jour, le type dédié c'est std::vector.
Pour ce qui est des tableaux C, il est aujourd'hui recommandé d'utiliser std::array<type, nbr_elements>. Jusqu'au C++17 (comme dans la norme de 2017), on pouvait trouver de bonnes raisons de préférer les tableaux C, depuis le C++17 il n'y en a aucune.
Et si je peux donner un petit truc si on trouve lourd d'écrire: std::vector Avec un bon éditeur, tu fais sxxvector et tu remplaces sxx par std:: une fois que tu as tout écrit. Note que je ne le fais plus, ça devient un automatisme que d'écrire std::
Le Tout est souvent plus grand que la somme de ses parties.
Rouloude, c'est aussi mon professeur qui nous conseille d'utiliser "using namespace std" pour une simplicité de lecture, tu as une meilleure option à me conseiller ?
Ce qui facilite la lecture c’est de voir tout de suite d’où vient la classe ou fonction. Peut être que sur 20 lignes ça pose pas de problème mais dans un vrai projet c’est pas clair du tout. Il ne faut pas écouter les profs qui ne codent pas.
Et si je peux donner un petit truc si on trouve lourd d'écrire: std::vector Avec un bon éditeur, tu fais sxxvector et tu remplaces sxx par std:: une fois que tu as tout écrit. Note que je ne le fais plus, ça devient un automatisme que d'écrire std::
J'ai des raccourcis dans mon environnement de dev (vim) - Alt-S m'ajoute "std::" - et ve(ctor) + tab étend non seulement avec std:: et les chevrons, mais en plus ça rajoute le #include s'il n'est pas présent dans le fichier courant...
A l'inverse quand j'enseigne le C++, je me force à mettre std:: au maximum (au tableau/velleda c'est lourd), pour son pouvoir d'auto-documentation: au moins l'élève sait d'où vient le symbole qu'on lui fait manipuler.
Rouloude, c'est aussi mon professeur qui nous conseille d'utiliser "using namespace std" pour une simplicité de lecture
Ah, parce que trouve réellement beaucoup plus simple de lire vector, string, set ou cin que de lire std::vector, std::string, std::set ou std::cin ?
C'est peut être le cas, personnellement, je ne suis pas convaincu par cet argument
Par contre, ce que ton prof oublie de dire, c'est que les espaces de noms (les namespace) servent de "boite de rangement" dans lesquelles on place "tout ce qui fait partie du même groupe", un peu comme si tu avais une boite "outils", dans laquelle tu pourrais tout aussi bien trouver une boite "outils jardin", une boite "outil électricité", une boite "outil bricolage" ou une boite "outils charpente", et que ces boites permettent d'éviter la confusion si plusieurs éléments portant le même nom devaient apparaitre dans différents rangements.
Ainsi, si tu es occupé à changer une lampe, et que tu as donc besoin d'un tourne vis, tu ira "naturellement" le chercher dans la boite "outil électricité", dans laquelle tu aura la certitude de trouver quelque chose ressemblant à ceci:
Alors que si tu vas dans la boite "outils charpente" le tournevis que tu trouveras ressemblera d'avantage à ceci (même si c'est une version "vintage" ) :
Mais, pour ne pas repartir sur une diatribe forcenée, je te conseille de lire ==>ICI<==
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
Le seul soucis que j'ai est le suivant : je voulais faire using tab = int[N]; avec N un nombre qu'on définie arbitrairement, or à chaque fois que j'essaie de déclarer l'entier N avant, il me mets une erreur. Avez-vous une solution ?
Après ça dépend si N est défini avant la compilation ou en cours d'exécution. Car si c'est avant tu peux le faire en déclarant la taille comme constante :
constexpr size_t tabsize = 10;
using tab = int[tabsize];
Si c'est lors de l'exécution ce n'est pas possible de la sorte. Il faudra passer par un std::vector.
J'avais supposé que tu faisais ce code pour tester le fonctionnement de "using". Ce n'est peut-être pas le cas. (C'est bien aussi de décrire ce que l'on souhaite faire quand on pose une question sur le forum. Ça évite que l'on fasse des suppositions).
MaximeLefebvre32 a écrit:
Rouloude, c'est aussi mon professeur qui nous conseille d'utiliser "using namespace std" pour une simplicité de lecture, tu as une meilleure option à me conseiller ?
La solution de nos jours, c'est de ne pas le mettre et de mettre le nom de l'espace de noms avant les fonctions ex std::cout au lieu de cout. après tu fais comme tu veux.
MaximeLefebvre32 a écrit:
qu'entends-tu par "tableaux en C" ? Cela veut dire que la déclaration des tableaux en c++ est différentes ?
Ce type de tableau est celui qu'on utilise en C. ils sont aussi utilisable en C++, mais de nos jours on utilise plutôt les std::array pour ceux de taille fixe et std::vector pour ceux à taille variable.
...
Alias en tant que paramètre de 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.
Le Tout est souvent plus grand que la somme de ses parties.