marieinthesky
Messages postés11Date d'inscriptionvendredi 8 octobre 2004StatutMembreDernière intervention20 juillet 2006
-
18 juil. 2006 à 17:06
marieinthesky
Messages postés11Date d'inscriptionvendredi 8 octobre 2004StatutMembreDernière intervention20 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.
dletozeun
Messages postés546Date d'inscriptionvendredi 13 février 2004StatutMembreDernière intervention 9 janvier 20081 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.
dletozeun
Messages postés546Date d'inscriptionvendredi 13 février 2004StatutMembreDernière intervention 9 janvier 20081 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.
marieinthesky
Messages postés11Date d'inscriptionvendredi 8 octobre 2004StatutMembreDernière intervention20 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.
marieinthesky
Messages postés11Date d'inscriptionvendredi 8 octobre 2004StatutMembreDernière intervention20 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
marieinthesky
Messages postés11Date d'inscriptionvendredi 8 octobre 2004StatutMembreDernière intervention20 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.
marieinthesky
Messages postés11Date d'inscriptionvendredi 8 octobre 2004StatutMembreDernière intervention20 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.
dletozeun
Messages postés546Date d'inscriptionvendredi 13 février 2004StatutMembreDernière intervention 9 janvier 20081 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!
dletozeun
Messages postés546Date d'inscriptionvendredi 13 février 2004StatutMembreDernière intervention 9 janvier 20081 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!
marieinthesky
Messages postés11Date d'inscriptionvendredi 8 octobre 2004StatutMembreDernière intervention20 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)
marieinthesky
Messages postés11Date d'inscriptionvendredi 8 octobre 2004StatutMembreDernière intervention20 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)
dletozeun
Messages postés546Date d'inscriptionvendredi 13 février 2004StatutMembreDernière intervention 9 janvier 20081 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!