Bonjour;
Voila je galère un peu. Depuis quelque temps j'ai un problème redondant que je n'arrive pas à résoudre...
Code :
$$Pièce jointe 446913
Pièce jointe 446914
Pièce jointe 446916
Pièce jointe 446917
Pièce jointe 446920
Version imprimable
Bonjour;
Voila je galère un peu. Depuis quelque temps j'ai un problème redondant que je n'arrive pas à résoudre...
Code :
$$Pièce jointe 446913
Pièce jointe 446914
Pièce jointe 446916
Pièce jointe 446917
Pièce jointe 446920
Salut, et bienvneue sur le forum.
Avant de répondre à ta question, je vais me permettre quelques remarques d'ordre générale :
1- au lieu d'utiliser une capture d'écran pour nous présenter ton code, pourrais tu simplement faire un copier coller du code lui-même et nous le transmettre au travers du bouton en forme de # :question:
C'est plus facile pour tout le monde : pour toi, parce que que la création de capture d'écran et la transmission d'image sur le forum représente des manipulations fastidieuses, pour nous parce que cela nous permet -- le cas échéant -- de copier ton code plus facilement (sans devoir le taper nous même) au travers d'un autre copier coller :D
2- tu ne dois inclure dans un fichier que les fichiers d'en-tête qui te sont absolument indispensables :
Dans toute la liste des fichiers d'en-tête que tu as inclus, les seuls qui soient réellement indispensables seraient <vector> et <iostream>. Et encore : car
3- L'idéal, quand tu te trouve face à une situation dans laquelle la fonction que tu développe n'est pas en mesure de fournir le résultat attendu, est toujours de mettre fin purement et simplement au processus en cours, car, autrement, c'est toute la suite des opérations qui risque de provoquer des résultats incohérents.
Selon le cas, tu peux le faire au travers d'une assertion si le problème est forcément du à une erreur de logique de la part de celui qui fait appel à la fonction ou en lançant une exception, si l'erreur est "indépendante de la volonté du développeur".
ton codeest très loin d'être suffisant en l'espèce, car il se contente d'effectuer un affichage, alors qu'il devrait obliger le développeur qui fait appel à la fonction à vérifier la logique qui mène à l'appel de la fonction, et qu'il faudrait donc utiliser -- idéalement -- au moins une assertion.Code:
1
2
3 if(start>n || dest>n || start<0 || dest<0){ cout<<"erreur"<<endl; }
Ce qui, du coup, implique que l'affichage ne serait même pas nécessaire et donc que l'inclusion de <iostream> n'aurait aucun intérêt dans le cas présent (par contre, l'inclusion de <cassert> ou de <stdexcept> serait nécessaire, selon que tu décide de recourir à une assertion ou à une exception).
4- On n'utilise JAMAIS la directive using namespace std;...
Cette directive a été proposée dans les tous premiers temps de la normalisation, quand il a été décidé de placer le contenu de la bibliothèque standard dans l'espace de noms std, pour permettre au code écrit avant la normalisation de continuer de compiler avec "un minimum de modifications".
On peut difficilement prétendre qu'un code écrit dans les années 2000 et quelques date d'avant la normalisation, qui date des année 1990 :P
5- Enfin, ton code est fondamentalement buggué, parce que new risque de lancer une exception et qu'un code proche de
peut donc lancer "n'importe quand" une exception en (1), en (2) et en (3).Code:
1
2
3
4
5 visited = new bool[n]; // (1) adj = new int* [n]; //(2) for(int i=0;i<n;i++){ adj[i] = new int[n]; // (3) }
Si une exception survient en (1), tu n'auras pas trop de problème. Si elle survient en (2) ou en (3), ce sera la catastrophe :P
Pour répondre à ta question, il faut comprendre que std::vector est une classe, qui dispose de fonctions membres que les développeurs ont définies pour lui permettre de fournir les services auxquels les utilisateurs sont en droit de s'attendre de sa part.
Parmi les fonctions membres en question, se trouvent les fonction begin(), qui fournit l'accès à un itérateur donnant accès au premier élément de la liste et la fonction end() qui donne accès à un itérateur sur "ce qui suit" le dernier élément de la liste.
De plus, cette directive pose pas mal de problème. Pour t'en convaincre, essaye simplement d'afficher une donnée nommée cout (de type entier, par exemple) en utilisant cette directive, tu seras surpris du résultat ;)
La donnée membre adj n'est pas une instance de classe : c'est un pointeur de pointeur sur un entier. C'est à dire : l'adresse mémoire à laquelle nous trouverons une autre adresse mémoire à laquelle nous trouverons (normalement) une donnée de type int. Or, le type int n'est pas une classe : c'est un type primitif qui est directement manipulable par le langage, qui ne dispose donc d'aucune fonction membre.
Au mieux, un pointeur de pointeur peut il être considéré comme étant un ensemble de pointeurs (sur entier) contigus en mémoire, auquel nous pourrons accéder au travers de l'opérateur [] et l'élément auquel nous accédons au travers de adj[x] peut il être considéré comme... un ensemble d'entier contigus en mémoire, pour lequel il sera possible d'accéder aux différents entiers qui le composent au travers de l'opérateur [].
C'est, en gros, ce que te dis le compilateur au travers de son message (qu'il faut apprendre à décrypter, je te l'accorde):A l'heure actuelle, on n'utilise pour ainsi dire plus jamais new (ou delete), car on préfère utiliser des classes qui s'occupent elles-mêmes de gérer correctement la mémoire qu'elles utilisent comme std::vector ou std::string, par exemple.Code:error: request for member begin in <snip> wich is non-class type int *
De manière générale, si tu as besoin de tableaux, surtout s'ils s'agit de tableau dont la taille ne sera connue qu'à l'exécution, utilise std::vector: c'est une classe spécifiquement prévue à cet effet. Cela t'évitera bien des soucis par la suite (en plus d'être une classe qui dispose d'un grand nombre de fonctions membres adaptées aux différentes situations)
De la même manière, au lieu d'utiliser un tableau C style sous une forme proche de int tab[3];, nous préférerons utiliser la classe std::array, qui est également une classe spécifiquement dédiée à cet usage, et qui permet également d'utiliser les fonctions membres begin() et end() ;)
En résumé :
Tu es, de toute évidence, un débutant qui se heurte à un très mauvais cours.
Ne prends pas les remarques que j'ai faites comme une attaque personnelle, mais comme le "résultat logique" de ce mauvais cours.
Dis toi au contraire que nous avons tous été débutants à un moment ou à un autre, et que nous avons tous été confrontés à des problèmes similaire, mais que tu as "la chance" de pouvoir profiter de notre expérience, et de corriger les mauvaises habitudes que ton cours est occupé à te donner.
Pour notre part, nous avons pour certains du changer des habitudes prises depuis beaucoup plus longtemps, et nous avons du le faire "à la dure". Si l'on peut t'éviter ce genre de piège, ce sera tout bénéfice pour toi ;)