Segmentation fault, C++

mwoua3 Messages postés 5 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 4 mai 2011 - 4 mai 2011 à 00:03
ismail22425 Messages postés 3 Date d'inscription lundi 8 août 2011 Statut Membre Dernière intervention 8 août 2011 - 9 mai 2011 à 15:44
Bonjour,

J'ai un gros problème. Dans le cadre d'un projet d'informatique, je fais appel à une fonction qui me permet de copier le contenu d'un fichier texte (un dictionnaire, "dico.text") dans une matrice.
Le problème est que mon compilateur ne me renvoie aucune erreur lors de la compilation mais bien lors de l'exécution du programme. Le gros problème est aussi que je n'arrive pas à comprendre l'erreur faite !

En fort (très fort) résumé, voici mon code :

#include ;
#include <ctime>;
#include <cstdlib>;
#include <fstream>;

using namespace std;

const int TAILLE = 25;
const int LENGTH = 361000;
typedef char Word[TAILLE];

int getLenghtDico()
{
int numberOfDicoWords = 0;
Word word;

ifstream dico("dico.txt");

while (!dico.eof())
{
numberOfDicoWords++;
dico >> word;
}
dico.close ();

cout << "Jusque là ok !" << endl;
return numberOfDicoWords;
}

void dicoCopy (char dicoList[][TAILLE])
{
Word lineWord;

ifstream dico("dico.txt");
cout << "Nous pénétrons dans le dico !" << endl;

for (int ligne = 0; ligne<LENGTH; ligne++)
{
dico >> lineWord;
for (int lettre = 0; lineWord[lettre]!='\0'; lettre ++)
{
dicoList[ligne][lettre] = lineWord[lettre];
}
}
dico.close ();
}

int main ()
{
cout << "What the hell! On y va" << endl;
char dicoList[LENGTH][TAILLE];
cout << "Ici, rien à signaler" << endl;

dicoCopy(dicoList);

cout << "Dico.. Done!" << endl;
for (int i = 0; i<LENGTH; i++)
{
for (int j=0; dicoList[i][j]!='\0';j++)
{
cout << dicoList[i][j] << " ";
}
cout << endl;
}
}


Précisions :

- La première fonction, qui me donne la taille du dictionnaire devrait normalement être utilisée pour déterminer la dimension première de la matrice dicoList[longueur Dico] [TAILLE] . J'ai cru d'abord que le problème venait de là, et qu'il fallait une constante dans la première dimension. Mais même comme ça j'y arrive pas.
Cette fonction est correcte et fonctionne bien, je l'ai utilisée avant de faire intervenir la matrice dicoList et elle fonctionnait parfaitement bien...

- Les cout (au message parfois douteux) sont uniquement là pour voir où le programme s'est arrêté de fonctionner... Il s'avère qu'aucun cout (même le premier du main !) ne fonctionne...


Je sais que le code est un peu long mais une aide serait la bienvenue, et ceci le plus rapidement possible !

Merci à tous.

PS : désolé de l'indentation.. Il est possible que le copier coller ne fonctionne pas bien :/

7 réponses

mwoua3 Messages postés 5 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 4 mai 2011
4 mai 2011 à 00:05
Ah oui, comme mis dans le titre, l'erreur est "Segmentation Fault".
Je compile avec Xcode, sur Mac.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 mai 2011 à 10:22
Ça plante parce que la taille de TAILLE est trop grande... (Diminue là et ça passera).

J'ai beaucoup de remarques à faire:
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- #include ne finit pas par un ";"
- Vérifie la réussite de l'ouverture du fichier avec un: "if (!dico) { std::cerr << "Error" << std::endl; return 0; }"
- while(!dico.eof()) => while(dico)
- N'utilise pas de tab[][], utilise du C++, c'est-à-dire: std::vector ou std::list, dont la taille est dynamique.
- Idem pour le chaîne de caractères, à la place de char* ou de char[], utilise std::string.
- "return 0" à ajouter à la fin du main.

Que contient dico.txt ?
Si c'est juste des mots, il te faut un std::vector<std::string> ou un std::list<std::string>. (Ça te prendra 3 lignes à faire :p).

PS: Tu as une balise code dans le forum, pour présenter le code correctement.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 mai 2011 à 10:30
Comme c'est ultra simple, je te propose même une version:
#include 
#include <fstream>
#include <vector>

typedef std::vector<std::string>::const_iterator iter;

bool loadDico(const std::string& filename, std::vector<std::string>& dico)
{
  std::ifstream file(filename.c_str());

  if (!file)
    return false;

  std::string word;
  while (file >> word)
    dico.push_back(word);

  return true;
}

int main()
{
  std::vector<std::string> dico;
  if (!loadDico("dico.txt", dico))
  {
    std::cerr << "Unable to load file" << std::endl;
    return 1;
  }

  // Inutile, juste pour information
  std::vector<std::string> dicoCopy;
  dicoCopy dico; // Pas besoin de dicoCopy(dicoList); Juste un à faire :)

  // Iteration
  std::cout << "Methode 1" << std::endl;
  for (iter it = dico.begin(); it != dico.end(); ++it)
    std::cout << *it << std::endl;

  // Autre méthode, moins bien ! Fonctionne pour std::vector,
  // mais pas les autres commme std::list...
  std::cout << "Methode 2" << std::endl;
  for (size_t i = 0; i < dico.size(); ++i)
    std::cout << dico[i] << std::endl;

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
mwoua3 Messages postés 5 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 4 mai 2011
4 mai 2011 à 20:10
Ah ! Merci bcp :)

Le truc c'est que justement, ils veulent pas qu'on utilise d'autres bibliothèques (j'sais même pas si ça s'appelle comme ça) que les 4 reprises ci-dessus.

Ils veulent aussi qu'on présente absolument notre code de cette manière là, avec des Mat[][] et des Vect[]
De la même manière,
"

#include ; 
#include <ctime>; 
#include <cstdlib>; 
#include <fstream>; 

using namespace std; 

"

C'est le début du code et c'est obligatoire de le présenter comme ça.

Enfin... Merci pour la réponse ! :)
Le but est de faire un pendu et une recherche dichotomique...

Encore merci.
Bye !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mwoua3 Messages postés 5 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 4 mai 2011
4 mai 2011 à 21:19
Ah tiens, j'ai une question :

Mnt ça fonctionne, mais il m'affiche (surtout à la fin) parfois des caractères bizarres :


Z Y K L O N S
Z Y M A S E
Z Y M A S E S
Z Y M O T E C H N I E _ ?
Z Y M O T E C H N I E S
Z Y M O T I Q U E ? ? _ ?
Z Y M O T I Q U E S ? p ?
Z Y T H O N
Z Y T H O N S
Z Y T H U M
Z Y T H U M S


A quoi pourrait être dû ceci ? Ils ne sont pas présents dans le fichier dico.txt... Et jusqu'à la lettre Z y a aucun problème...
0
mwoua3 Messages postés 5 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 4 mai 2011
4 mai 2011 à 22:16
J'ai même des



Z O A N T H R O P I E ? ?
Z O A N T H R O P I E S

Z O B e r s / f r e d e r i c c Z O B S e r / D e s k t o p
Z O B S e r / D e s k t o p
Z O D I A C
Z O D I A C A L

... Je comprends pas.. Ca le fait à chaque fois et pas toujours au même endroit ni de la même façon.
0
ismail22425 Messages postés 3 Date d'inscription lundi 8 août 2011 Statut Membre Dernière intervention 8 août 2011
9 mai 2011 à 15:44
bonour les amis !
quelque peut m'aidé j'ai le meme problème que " mwoua3" sous ns2.34 j'ai develloper une nouveau module sous l'unix avec C++ quant je compile sa marche bien mais quand je lance l'execution a partir de script tcl
il m'affche un erreur fault segmentation???
0
Rejoignez-nous