Bonjours tout le monde, j'ai un problème sur un mini programme que je fais juste pour me faire un rappel sur les vector que j'utilise plus depuis longtemps (vu que j'apprend la POO), j'avais pas envie de créer un topic juste pour ça ![]()
c'est en c++, le programme est sensé faire une liste des cours donné par un établissement (histoire, math,...)
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
int main()
{
vector <string> listeCours(5,"pas encore de nom");
string encore("oui");
while(encore != "non")
{
int nbrCours(0);
nbrCours += 1;
cout<<"introduisez le nom d'un cours donné dans votre etablissement "<<endl;
cin>>listeCours[nbrCours];
if(nbrCours>4)
{
listeCours.push_back(listeCours[nbrCours])
}
cout<<"y a t il encore des cours?"<<endl;
cin>>encore;
}
cout<<"il y'a au total "<<nbrCours<<" cours "<<endl;
int nbrPassage(0);
while(nbrPassage != nbrCours)
{
cout<<listeCours[nbrPassage]<<endl;
nbrPassage += 1;
}
}
return 0;
}
J'ai du faire une bête faut quelque part puisque quand je veux compiler le programme trouve trois erreurs et me dit "nbrCours was not declared in this scope" "expected inqualified-id before 'return' " et à la dernière ligne : "expected declaration before ' } ' token"
Voilà ça doit être une bête faute mais je trouve pas, merci d'avance. ![]()
nbrCours est déclaré dans une boucle while, la variable n'existe donc qu'à l'intérieur de cette boucle et pas au-delà, or tu l'utilises plus loin.
Déclare-le avant la boucle ![]()
aaah voilà
merci beaucoup mais il doit y avoir une autre faute quelque part puisque le compilateur affiche toujours :
"expected inqualified-id before 'return' " et à la dernière ligne : "expected declaration before ' } ' token".
J'en ai marre de pas être foutu de faire un programme pareil . ![]()
Tu as un } de trop (avant le return 0)
Voilà cette fois ça marche
merci !
En fait je ne suis pas le seul à devenir agressif dans les textes imprimés à l'écran quand mon programme ne marche pas correctement ? ![]()
Au début: System.out.println("La réponse est" + res);
Après quelques heures: System.out.println("La putain de réponse est" + res);
Non tes pas le seul Despé ![]()
Pareil quand je fais des fichiers prototypes. Les premiers ont un nom du genre protoUart.c pour de la comm sérielle, après une heure ou deux de galère c'est bullshit.c et autres ![]()
Godrik, j'ai vu sur un topic que tu utilisais Valgrind. Une fois que t'as éliminé toutes les fuites de mémoire tu élimines toutes les erreurs, ou il y en aura toujours ?
Parce que là j'en ai principalement une, j'ai pas l'impression que ce soit réellement un problème potentiel. Ca t'es déjà arrivé que les erreurs soient pas pertinentes ?
C'est plutôt une question générale mais si besoin je peux donner l'erreur et les bouts de code concernés.
Ce qu'il faut voir c'est si l'erreur est un faux positif. Ca oeut arriver que certaines libs fassent des trucs pas nettes, souvent en accedant du materiel.
Tout le reste sont de vraies erreurs qu'il faut imperativement corriger. au mieux ce sont des bombes en devenir, au pire ca fait faire n'importe quoi a une lib ou a la pile.
Ce qu'il faut voir c'est que souvent il y a plein d'acces dansles choux, mais valgrind ne reporte que ceux qui sont hors des zones mallocees. Donc potentiellement il y en a plein d'autres qui changent l'etat du programme sans logique aucune.
Ou pire tu as les lectures de variables pas ecrites, en general ca derape dur ce trucs.
Non ça vient pas d'une librairie, le truc c'est que je sais pas si valgrind peut à ce point comprendre mon code. J'ai comme erreur "Conditional jump or move depends on uninitialised value(s)" sur cette ligne :
while(*(wordsPlayed+wordPos) == true);(Donc après un do { ... }).
wordsPlayed est un tableau de booléens (défini avec un simple 'typedef int bool;' et 0 et 1 pour true et false en min et maj) que j'initialise bien avant cette boucle. Il s'agit d'un pointeur déclaré en global et initialisé avec un malloc() avec la taille adéquate par rapport à ma liste de mots (dans un pendu). Je vérifie bien entendu que le pointeur soit non-NULL sans quoi je quitte le programme proprement (en désallouant tout ce qui a été alloué). wordPos est une variable générée pseudo-aléatoirement entre 0 et le nombre de mots dans ma liste.
Je comprends pas trop cette erreur valgrind étant donné que je vérifie que le pointeur soit non-NULL. Je me demande si valgrind va chercher à savoir si un offset d'adresse généré aléatoirement entre deux bornes pose problème ou pas, ou si dans le doute il met une erreur.
Le passage en question :
//Search a word unplayed
do
{
// Randomly chose a number within 0 and the number of words in 'words.txt'
wordPos = randNumb(0,nbLines);
} while(*(wordsPlayed+wordPos) == true);nbLines est trouvé plus haut dans le code en lisant le fichier words.txt et en comptant les lignes jusqu'à la fin du fichier. Le programme est bien sûr quitté proprement en cas d'échec à la lecture du fichier.
Ca va presque de soi mais randNumb est faite comme ça : int randNumb(int a, int b)
{
int min, max;
min = minVal(a,b);
max = maxVal(a,b)+1;
return ( (double)rand()/(double)RAND_MAX ) * (max-min) + min;
}
Tikim, ne t'inquiete pas valgrind comprends ton code. C'est un emulateur basiquement qui execute les instructions assembleur une par une et qui regarde si les access sont autorises ou si tu ne lis pas une valeur qui n'a jamais ete ecrite. Ici, c'est exactement ce qu'il te dit, tu fait un jump a partir d'une valeur pas initialise.
Donc valgrind dit que soit wordsplayed n'est pas initialise, soit wordpos n'est pas initialise siot wordsplayed[wordpos] n'est pas initialise.
Compte tenu que ce n'est pas "segmentation fault" qui te derange, j'imagine que tu es dans le dernier cas wordsplayed[wordpos] n'est pas initialize. Et ca ca sens que tu as fais un malloc, mais que tu n'as pas initialise les cases du tableau a false.
OK merci pour le renseignement ! C'est fou comme tu trouves ça vite.
J'avais pensé à l'initialiser mais j'ai du me tromper en écrivant ma boucle, je parcourais de 0 à 'sizeWord' au lieu de 'nbLines'. La fatigue sûrement. La ou c'est cocasse c'est que sizeWord n'est pas initialisé à cet endroit (c'est aussi une variable globale), pourtant je n'ai jamais eu de segmentation fault. Peut-être qu'il valait 0 de base. J'ai exécuté le programme avec ce bout de code plus d'une centaine de fois et j'ai jamais eu de plantage.
En tout cas cette fois c'est bon, plus d'erreur ni de memory leak. C'était un petit jeu donc rien de critique mais je suis content d'avoir découvert valgrind, c'est bien utile. Un peu surpris tout de même de pas en avoir entendu parler plus tôt étant donné que je suis en fin de formation en Systèmes embarqués, typiquement un domaine où du code C va tourner pendant suffisamment longtemps pour que la moindre fuite de mémoire ait des conséquences. Merci pour l'aide ![]()
pas de soucis. c'est exactement pour ca que je dis que les erreurs de valgrind sont toujours importantes. ici tu avais peut etre de la chace et sizeword se trouvait etre egal a 0. Mais si le code change (ou le compilateur, ou l'os, ou ...) tu te retrouverais avec une segfault incomprehensible.
Et en effet, je ne sais pas pourquoi les gens ne parlent pas plus de valgrind (ou des memchecker en general). Tu peux vouloir regarder electricfence aussi, c'est rigolo. http://en.wikipedia.org/wiki/Electric_Fence
Mais quesqui arrive au forum omg ![]()
Bah ya ce débile qui a posté le même message sur ~20 topics rouges donc ils sont remontés tous en même temps.
J'ai fait des signalements pour flood de masse, j'encourage quiconque a le temps à faire pareil en boostant mes signalements, ça devrait accélérer le traitement.
NdM: je suis entrian de faire le menage, j'efface plein de message inutile a droite a gauche.
Merci bien ![]()
J'ai boosté la DDB ![]()
bonjour, a la rentrée je serais éleve en BTS SN EC (systeme numerique, option électronique et communication) je comptais commencer un travail de préparation en programmation mais avant cela je voulais savoir si c'etais pertinent, je pensais au C++, came sera utile dans la mesure ou je risque de concevoir et programmer des automates ou logiciels interactif? ![]()
voila pour mon premier post sur ce fofo ![]()