ça marchait ce matin mais plus maintenant!

marieinthesky Messages postés 11 Date d'inscription vendredi 8 octobre 2004 Statut Membre Dernière intervention 20 juillet 2006 - 18 juil. 2006 à 17:06
marieinthesky Messages postés 11 Date d'inscription vendredi 8 octobre 2004 Statut Membre Dernière intervention 20 juillet 2006 - 20 juil. 2006 à 18:17
Bonjour à tous,
j'essaye d'écrire une fonction qui va faire la moyenne de plusieurs données lues dans des fichiers, ça marchait ce matin puis j'ai voulu faire "plus joli" et enlever des trucs inutiles, et maintenant ça ne marche plus et je n'arrive pas à savoir pourquoi! Si ça ce trouve, c'est juste une erreur débile que n'importe qui pourra détecter, alors si ça dit à quelqu'un de relever le challenge et de trouver pourquoi ça ne marche pas, je lui serais éternellement reconnaissante!


les fichiers contenant les données sont nommés temp001.txt à temp999.txt (on peut en avoir moins que 999 : on en a nbrep) et contiennent
- une ligne d'entête
- plusieurs lignes contenant:  t    N1    I1    N2    I2   N3   I3...jusqu'à N10    I10 maximum
pour t allant de 1 à 300
et ce que je voudrais c'est, pour chaque t, calculer la moyenne des N1 entre tous les fichiers, la moyenne des I1 entre tous les fichiers....
donc mon idée c'était
d'ouvrir le premier fichier, de lire la première ligne, de mettre les valeurs dans un tableau de moyennes, de fermer le fichier,
d'ouvrir le second fichier, de lire la première ligne et de calculer la moyenne avec les valeurs déjà dans le tableau de moyennes,
faire pareil pour le troisième fichier...
puis de passer à la deuxième ligne pour tous les fichiers...jusqu'à la dernière ligne (un tableau permet de garder , pour chaque fichier, la position où on en est).


voilà la fonction :


int computemeans (int records, int nbrep, TABCHAR* outfile )
{ int n ; //numéro du fichier
  int c, d , u ; //chiffres des centaines, dizaines, unités du numéro de fichier
   int line ; // numero de la ligne
  int lev ; //numero des N et I
  int N, I, t ; //données
  float formermean ; //variable intermédiaire : ancienne moyenne avant prise en compte de la donnée lue
  float meantot[10] ;
  float meandis [10] ; // tableaux contenant les moyennes de N et I
  char header[255] ;
  char buffer[1000] ; //tampons de lecture (une ligne)
  char** next ; //emplacement du prochain chiffre dans le tampon de lecture
  TABCHAR tempfile ;
  streamsize nbchar, sumchar ; //nombre de caractères lus dans le fichier ce coup-ci et en tout
  streamsize* positions = new streamsize[nbrep+1] ;
  //array that will keep track of the positions in each file
  //(by summing the counts of characters read because tellg has a bug)   
  ifstream entree ;
  ofstream sortie ;
   
  cout << "computing means of "<< nbrep<< " repetitions on "<<records <<" lines"<<endl ;
 /*----------------------------initialize--------------------------*/
  sortie.open (*outfile, ios::app) ;
  tempfile[0] = 't' ;
  tempfile[1] = 'e' ;
  tempfile[2] = 'm' ;
  tempfile[3] = 'p' ;
  tempfile[7] = '.' ;
  tempfile[8] = 't' ;
  tempfile[9] = 'x' ;
  tempfile[10] = 't' ;
  tempfile[11] = '\0' ;
  for (n=1; n<=nbrep; n++) positions[n]=0 ;
/*---------------starts reading the first record in each file
                       then the second record in each file etc...----------*/
  for (line=0; line<=records;line++) /*for each record (i.e. time)*/
  { for (lev=0; lev<maxsize ; lev++) {meantot[lev] = 0 ; meandis[lev] = 0 ;}
    for (n=1; n<=nbrep; n++) /* for each file (i.e. repetition)*/
    { c = int(n/100) ; /*hundreds digit*/
      d = int((n-100*c)/10) ; /*tens digit*/
      u = (n - 100*c - 10*d) ; /*units digit*/
      tempfile[4] = chiffres + c ;
      tempfile[5] = chiffres + d ;
      tempfile[6] = chiffres + u ;
      entree.open (tempfile, ios::in) ;
      entree.clear();
      entree.seekg(positions[n], ios::beg) ;
      if (line == 1978)
      { entree.get(header, 255) ;
        nbchar = entree.gcount() ;
        sumchar = nbchar + positions[n] ;
        positions[n] = sumchar +1;
      }
      else
      { lev = 0 ;
        entree.get(buffer, 1000) ;
        nbchar = entree.gcount() ;
        sumchar = nbchar + positions[n] ;
        positions[n] = sumchar +1 ;
        t= int(strtod(buffer, next)) ;
        N = int(strtod(*next, next)) ;
        while (N>0) /* while the end of the line is not reached*/
        { I = int(strtod(*next,next)) ;
          lev += 1 ;
          formermean = meantot[lev] ;
          meantot[lev] = (formermean * (n-1) + N) / n ;
          formermean = meandis[lev] ;
          meandis[lev] = (formermean * (n-1) + I) / n ;
          //cout <<" N"<<lev<<"="<<N<<" I" <<lev<<"=" <<I ;
          N = int(strtod(*next, next)) ;
        } // end of the line is reached
      } // end if not header
      entree.close() ;
    } // end "n" files
    if (line==0)
    { sortie<<header ;
    } else
    { sortie << "\n" << t << "\t" ;
      for (lev=1; lev<maxsize ; lev++)
      { sortie <<  meantot[lev] << "\t" << meandis[lev] << "\t" ;
      }
    } // end if line != 0
  } // end "line" records    
  sortie.close() ;
  delete positions ;
  return (0) ;
}  


et un exemple de fichier :
 t    N1    I1    N2    I2   N3   I3   N4   I4   N5   I5   N6    I6    N7    I7   N8   I8   N9   I9   N10   I10
0   10   0   100   0   1000   0
1   10   1   100   3   1000   30
2   10   1   100   4   1000   60


merci 10000 fois d'avance!
Marie


P.S. : je sais que ce serait plus pratique d'utiliser tellg pour avoir la position du curseur de lecture dans le fichier, mais après avoir passé une journée à tester tellg dans tous les sens, j'en ai déduit qu'il avait un bug donc j'utilise gcount à la place.

13 réponses

dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
18 juil. 2006 à 17:33
Salut,

Tout d'abord avant de lire le code, on peut dire qu'il y a un manque d'efficacité dans la methode...puisque ca fait bcp bcp d'ouverture et de fermeture de fichiers et c'est pas l'operation la plus rapide...
Je sais pas combien tu as de fichiers a ouvrir masi moins le prog e nouvre mieux il se porte, donc je te conseillerais (si ca te dis) de refaire le programme en chargeant dans des tableaux l'ensemble des valeurs de chaque fichier d'un seul coup. Et là tu ouvre seulement le nombre de fichiers presents....
A toi de voir.

Bon je vasi essayer de regarder le code.
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
18 juil. 2006 à 17:54
Oups j'ai pas fais gaffe, tu donne bien le nb de fichiers donc au pire tu as 998*300=299 400 ouvertures et fermetures alors qu'avec la methode efficace seulment 998!

Bon sinon j'aierais bien savoir où tu initialise la variable: maxsize qui sert de borne dasn une boucle for...Si tu l'initialise nul part ca peut venir de la.

Et ne le prends pas mal mais je trouve que tes boucles for son super mal présentées...et meme le reste d'ailleurs ( au niveau de l'indentation) (a moins que ca vienne de cppfrance)
Sinon je vois pas d'erreurs enormes dans le reste...
Mais si c'est un probleme au niveau de la gestion des fichiers, a mon avis la 2nde methode sera bcp plus simple et plus sure a ce niveau la, puisque qu'ensuite tu n'as plus qu'a manipuler des tableaux.
0
marieinthesky Messages postés 11 Date d'inscription vendredi 8 octobre 2004 Statut Membre Dernière intervention 20 juillet 2006
19 juil. 2006 à 09:46
merci pour le conseil, je vais essayer d'utiliser un tableau.
Pour maxsize, c'est une constante qui est déclarée dans le fichier .h que j'utilise pour mon projet (car à priori, ça devrait toujours être 10 mais si un jour je dois modifier mon modèle, je saurais où changer maxsize).
Je te tiendrai au courant quand j'aurais réussi à programmer cette $¤@*# de fonction, qui était sensée être faite en deux coups de cuillère à pot mais sur laquelle j'ai passé presque deux jours.
0
marieinthesky Messages postés 11 Date d'inscription vendredi 8 octobre 2004 Statut Membre Dernière intervention 20 juillet 2006
19 juil. 2006 à 09:46
merci pour le conseil, je vais essayer d'utiliser un tableau.
Pour maxsize, c'est une constante qui est déclarée dans le fichier .h que j'utilise pour mon projet (car à priori, ça devrait toujours être 10 mais si un jour je dois modifier mon modèle, je saurais où changer maxsize).
Je te tiendrai au courant quand j'aurais réussi à programmer cette $¤@*# de fonction, qui était sensée être faite en deux coups de cuillère à pot mais sur laquelle j'ai passé presque deux jours.
0

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

Posez votre question
marieinthesky Messages postés 11 Date d'inscription vendredi 8 octobre 2004 Statut Membre Dernière intervention 20 juillet 2006
19 juil. 2006 à 09:47
merci pour le conseil, je vais essayer d'utiliser un tableau.
Pour maxsize, c'est une constante qui est déclarée dans le fichier .h que j'utilise pour mon projet (car à priori, ça devrait toujours être 10 mais si un jour je dois modifier mon modèle, je saurais où changer maxsize).
Je te tiendrai au courant quand j'aurais réussi à programmer cette $¤@*# de fonction, qui était sensée être faite en deux coups de cuillère à pot mais sur laquelle j'ai passé presque deux jours.
0
marieinthesky Messages postés 11 Date d'inscription vendredi 8 octobre 2004 Statut Membre Dernière intervention 20 juillet 2006
19 juil. 2006 à 09:47
merci pour le conseil, je vais essayer d'utiliser un tableau.
Pour maxsize, c'est une constante qui est déclarée dans le fichier .h que j'utilise pour mon projet (car à priori, ça devrait toujours être 10 mais si un jour je dois modifier mon modèle, je saurais où changer maxsize).
Je te tiendrai au courant quand j'aurais réussi à programmer cette $¤@*# de fonction, qui était sensée être faite en deux coups de cuillère à pot mais sur laquelle j'ai passé presque deux jours.
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
19 juil. 2006 à 17:27
Ya pas de quoi! :)
Bon courage pour la réecriture, tu verras ca va sans doute etre plus simple.
Décidement je sais pas ce qui se passe avec tes posts mais tout est en triple mmeme quadruple a chaque fois!
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
19 juil. 2006 à 17:27
Ya pas de quoi! :)
Bon courage pour la réecriture, tu verras ca va sans doute etre plus simple.
Décidement je sais pas ce qui se passe avec tes posts mais tout est en triple mmeme quadruple a chaque fois!
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
19 juil. 2006 à 17:28
A tiens moi aussi! :)
0
marieinthesky Messages postés 11 Date d'inscription vendredi 8 octobre 2004 Statut Membre Dernière intervention 20 juillet 2006
20 juil. 2006 à 17:22
tu as raison, c'est bcp + simple avec des tableaux...ça a même marché, jusqu'au moment où j'ai fait "rebuild all" pour reconstruire tout le projet depuis le début et là, ça s'est remis à ne plus marcher ; mon éditeur de code (dev-c++ de bloodshed) ayant commencé à quitter inopinément, j'ai décidé de le désinstaller et de le réinstaller et maintenant, il ne veut même plus compiler le programme (j'ai un message d'erreur disant :
undefined reference to '__gxx_personality_v0'
et
undefined  reference to _Unwind_Resume').
Une idée de ce que ça peut vouloir dire? Et de pourquoi ça marchait avant de faire "rebuild all" et pas après?
merci d'avance (et désolée de t'embêter encore)
0
marieinthesky Messages postés 11 Date d'inscription vendredi 8 octobre 2004 Statut Membre Dernière intervention 20 juillet 2006
20 juil. 2006 à 17:43
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>
tu as raison, c'est bcp + simple avec des tableaux...ça a même marché, jusqu'au moment où j'ai fait "rebuild all" pour reconstruire tout le projet depuis le début et là, ça s'est remis à ne plus marcher ; mon éditeur de code (dev-c++ de bloodshed) ayant commencé à quitter inopinément, j'ai décidé de le désinstaller et de le réinstaller et maintenant, il ne veut même plus compiler le programme (j'ai un message d'erreur disant :
undefined reference to '__gxx_personality_v0'
et
undefined  reference to _Unwind_Resume').
Une idée de ce que ça peut vouloir dire? Et de pourquoi ça marchait avant de faire "rebuild all" et pas après?
merci d'avance (et désolée de t'embêter encore)
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
20 juil. 2006 à 17:51
lol non c'est pas grave , si ca m'embetait je ne repondrais pas!

Oui alors devcpp est tres enervant des fois (je developpe aussi avec cet editeur) il a la facheuse manie de bousiller des projets, mais pas le code source je te rassure!
Le mieux c'est de reconstruire un projet tout neuf, vide ( empty dans devcpp) et d'y inclure tes sources.
L'erreur que tu as la vient du fait que devcpp ne trouve pas la (ou les) librairie(s) qui contiennent certaines fonctions que tu utlise dans ton projet. Il ne faut pas oublier de les ajouter dasn les options du projet\parametres\linker.

L'erreur de lien que tu as la peut aussi provenir du fait que tu n'as pas paramétrée devcpp a la reinstallation ( qui n'etait pas necessaire je pense) au niveau des repertoires ou il doit aller chercher les libs includes etc...Ca se trouve dans: tools\compiler options\directories.

Voila j'espere que ca suffira! :) Bon courage cette fois ci ca devrais etre la bonne!
0
marieinthesky Messages postés 11 Date d'inscription vendredi 8 octobre 2004 Statut Membre Dernière intervention 20 juillet 2006
20 juil. 2006 à 18:17
merci, j'essayerais de voir ça à mon retour de vacances
0
Rejoignez-nous