probleme sur calcul de temps

probleme sur calcul de temps - C - Programmation

Marsh Posté le 15-06-2004 à 10:49:20    

Bonjour.
 
10/01/04,00:07:45;080,02;Ko.                       (1)
10/01/04,00:08:58;080,02;Ok,ReceptionDM.           (2)
 
 
ci dessus les 2 lignes extraites du fichier.
 
je recupere les differents champs de la ligne1 et de la ligne2 afin de verifier leur compatibilitees. Puis je voudrais effectuer un calcul de difference de temps entre les 2 lignes. mais la je suis bloque.
J'ai d'abord essayer avec difftime mais je n'arrive pas a la mettre en oeuvre et ne sais pas si cela convient a ce que je veux effectuer (sachant que je veux ensuite inclure le resultat dans un fichier (ce resultat devant se trouver au milieu d'une chaine de caracteres))
 
j'ai pense faire un parcours de la ligne a partir de la premiere virgule et jusqu'a un indice valant 8, afin de mettre chaque caracteres dans un tableau puis pareil pour la 2 ieme lignes et pour finir une soustraction ( (2) - (1) ).
 
voila mon code :(pour la 1ere ligne)
char *calculTemps(int ind1,int ind2,char *chaine){
char *resultat;
 
int i,j;
ind2 = 8;
i=0;
j=ind1;
resultat=malloc(100);
strchr(phras,',');
 while (j <= ind2){
  tab[i] = chaine [j];
  i++;
  j++;
 }
strcpy(resultat,tab);
 
}return resultat;
 
 
 j' ai besoin d'aide.  :??:  
 
Merci a tous ceux qui liront mon post et surtout un un grand merci a ceux qui vont m'eclairer. :jap:

Reply

Marsh Posté le 15-06-2004 à 10:49:20   

Reply

Marsh Posté le 15-06-2004 à 11:08:11    

tu peux arrêter de poser 36 fois la même question ?

Reply

Marsh Posté le 15-06-2004 à 11:13:04    

c la meme question certes mais la derniere fois j'avais pose plusieur question est celle ci avait ete completement zappe.
J'ai refait un post non pas par impatience mais plutot pour que ceux qui vont lire mon post n'ai pas a lire tout ce que l on ma conseille concernant les autres questions.
C 'etait pout plus de clarte. Je pensais pas enerver.


Message édité par bombyce le 15-06-2004 à 11:14:15
Reply

Marsh Posté le 15-06-2004 à 11:14:46    

Bombyce a écrit :

Je pensais pas enerver.


 
Avec Taz, ne pas "énerver", c'est une quête d'absolu...  :D


Message édité par Hermes le Messager le 15-06-2004 à 11:14:57
Reply

Marsh Posté le 15-06-2004 à 11:17:06    

LOL
mais bon, c'est pas ça qui va m'aider.
 
A+

Reply

Marsh Posté le 16-06-2004 à 10:00:32    

bon probleme regle.
 
A+

Reply

Marsh Posté le 16-06-2004 à 10:03:10    

Tu as fait comment ?

Reply

Marsh Posté le 16-06-2004 à 15:28:52    

Je pensai mon probleme completement regle mais j'ai encore quelques petites erreurs.
 
J'ai recuperer les champs contenant les heures , les min , les secondes.
avec:

Code :
  1. char *buff11;
  2. |
  3. |
  4. fgets(caracteres,TAILLE-1,lignes);
  5. HEURE_1=calculTemps(9,10,caracteres);
  6. //dont le corps est :
  7. char *calculTemps(int ind1, int ind2, char phras[TAILLE] ){
  8. char tab[TAILLE]="init";
  9. char *resultat;
  10. int j,i;
  11. i=0;
  12. j = ind1;
  13. resultat=malloc(100);
  14. while (j <= ind2){
  15. tab[i] = phras[j];
  16. i++;
  17. j++;
  18. }
  19. tab[i]='\0';
  20. strcpy(resultat,tab);
  21. return (resultat);
  22. }


 
je fais ce traitement sur une ligne1,je change de ligne puis refais le meme traitement avec la ligne2.
ensuite il faut effectuer le calcul de la difference entre HEURE_1 et HEURE_2 .
 
Pour cela il faut que faire une conversion en 'int'.
j'utilise la fonction atoi,mais la j'ai un probleme.
 

Code :
  1. buf11=HEURE_1 ;
  2. resultat1= atoi (buf11);


 
idem pour la ligne2:
 

Code :
  1. buf21=HEURE_2 ;
  2. resultat1= atoi (buf21);


 
et la , j'ai des erreurs ,je dois mal utilise 'atoi' . :pt1cable:  
Pouvez vous m'aider? :??:  
 
A+


Message édité par bombyce le 16-06-2004 à 15:29:38
Reply

Marsh Posté le 16-06-2004 à 15:37:48    

atoi ne te permet pas de détecter des erreurs. utilise strtol / strtoul

Reply

Marsh Posté le 16-06-2004 à 16:29:55    

le atoi("Taz" ) marche aléatoirement, ca dépend de son humeur lol :-)

Reply

Marsh Posté le 16-06-2004 à 16:29:55   

Reply

Marsh Posté le 16-06-2004 à 19:27:53    

Daccord TAz je vais suivre ton conseil.
 
A+
 
p.s : je vois souvent le nom d un livre (T&K).
Pourriez vous me donner son nom complet , l'editeur/la collection et si possible son prix.
Merci.

Reply

Marsh Posté le 16-06-2004 à 19:34:55    

K&R
 
Kernighan & Ritchie

Reply

Marsh Posté le 17-06-2004 à 09:48:51    

OK merci
 
A+

Reply

Marsh Posté le 17-06-2004 à 11:05:29    

ça marche nikel mais ensuite pour concatennerle reultat du calcul au reste des données misent dans le fichier je dois zeffectuer une conversion inverse c'est a dire transformer un int en caractere.
Existe t il une autre fonction que 'itoa'?
(Comme elle ressemble beaucoup a atoi, je me demande si elle ne serait pas deconseille elle aussi).
 
Merci pour votre aide.
 
A+  

Reply

Marsh Posté le 17-06-2004 à 11:07:47    

non. utilise sprintf

Reply

Marsh Posté le 17-06-2004 à 14:12:21    

pourrais tu m'expliquer ou est mon erreur:
 
je fais ce code:
 

Code :
  1. void transforme(char phras[TAILLE]){
  2. char *temp;
  3. //etude de la ligne
  4. //traitement date  
  5.    recupmot(',',phras,1);
  6.    strcat(phrase,"," );
  7. //traitement temps  
  8.    temp=strchr(temp,',');
  9.    sprintf(phrase, "%s" ,dureeHeures);
  10.    strcat(phrase,":" );
  11.    sprintf(phrase, "%s" ,dureeMinutes);
  12.    strcat(phrase,":" );
  13.    sprintf(phrase, "%s" ,dureeSecondes);
  14.    strcat(phrase,";" );
  15. //traitement du noeud      
  16.    temp=strchr(temp,';');
  17.    recupmot(',',temp,0);
  18.    strcat(phrase,"," );
  19. //traitement de la ligne
  20.    temp=strchr(temp,',');
  21.    recupmot(';',temp,0);
  22.    strcat(phrase,"." );
  23.    strcat(phrase,"\n" );
  24. }


exemple de ce que je veux avoir pour resultat:  
0/01/04,00:09:24;080,02.


Message édité par bombyce le 17-06-2004 à 14:12:56
Reply

Marsh Posté le 17-06-2004 à 14:27:20    

si tu fais du sprintf après du strcat, t'as écrasé tout ce qu'il y avait précédemment ..
 
n'utilise que sprintf(), en faisant un truc du genre :
 
char *p = phrase;
 
p += sprintf( p, ...);

Reply

Marsh Posté le 17-06-2004 à 14:36:34    

c'est une blague ce truc ?
 
sprintf(phrase, "%s" ,dureeHeures);
        strcat(phrase,":" );
        sprintf(phrase, "%s" ,dureeMinutes);
        strcat(phrase,":" );
        sprintf(phrase, "%s" ,dureeSecondes);
        strcat(phrase,";" );  
 
 ?

Reply

Marsh Posté le 17-06-2004 à 15:03:41    

Voila mon code avec les 'sprintf' mais je comprends pas ou est mon erreurs car mon prog plante a l'execution quand j'arrive a ce code. :pt1cable:  
 
 

Code :
  1. /*******traitementChaineDeCaractere**********/
  2. void transforme(char phras[TAILLE]){
  3. char *temp;
  4. //etude de la ligne
  5. //traitement date  
  6.      recupmot(',',phras,1);
  7.      sprintf(phrase,"," );
  8. //traitement temps  
  9.      sprintf(phrase, "%s" ,dureeHeures);
  10.      sprintf(phrase,":" );
  11.      sprintf(phrase, "%s" ,dureeMinutes);
  12.      sprintf(phrase,":" );
  13.      sprintf(phrase, "%s" ,dureeSecondes);
  14.      sprintf(phrase,";" );
  15. //traitement du noeud      
  16.      temp=strchr(temp,';');
  17.      recupmot(',',temp,0);
  18.      sprintf(phrase,"," );
  19. //traitement de la ligne
  20.      temp=strchr(temp,',');
  21.      recupmot(';',temp,0);
  22.      sprintf(phrase,"." );
  23.      sprintf(phrase,"\n" );
  24. }
  25. /*******************recupmot*******************/
  26. //fonction pour retourner un mot
  27. void recupmot(char fin, char *phras,int type){
  28. char mot[TAILLE]="init";
  29. int i,j;
  30. j=0;
  31. if(type==1)
  32. i=0;
  33. else
  34. i=1;
  35. while(phras[i]!=fin)
  36. {
  37. mot[j]=phras[i];
  38. j++;
  39. i++;
  40. }
  41. mot[j]='\0';
  42. if(type==0)
  43. sprintf(phrase,mot);
  44. else
  45. strcpy(phrase,mot);
  46. }


 
 
 
Pouvez vous m'expliquer? :jap:  
 
A+

Reply

Marsh Posté le 17-06-2004 à 15:36:10    

Bombyce a écrit :

Voila mon code avec les 'sprintf' mais je comprends pas ou est mon erreurs car mon prog plante a l'execution quand j'arrive a ce code. :pt1cable:  
 
 
sprintf(phrase, "%s", mot);
 
 
 
Pouvez vous m'expliquer? :jap:  
 
A+


 
Et ensuite c'est phrase ou phras le nom de ta chaine?


Message édité par fodger le 17-06-2004 à 15:37:29
Reply

Marsh Posté le 17-06-2004 à 15:58:02    

Quelle est la valeure de taille? Ensuite pqoi tu cumules les sprintf quand tu peux tout faire en une instruction?

Reply

Marsh Posté le 17-06-2004 à 18:46:58    

vi, c'est n'importe nawak ça ...
Et temp qui pointe sur queud, tu m'étonne que ça vautre ...  :non:

Reply

Marsh Posté le 17-06-2004 à 22:32:20    

c la fete ici :D
 
ta raison met des sprintf le programme va plus vite

Reply

Marsh Posté le 17-06-2004 à 23:25:18    

On s'en fout ici, de la vitesse. Le programme ne marche pas et ne risque pas de marcher avant un moment vu comme il est gaulé.

Reply

Marsh Posté le 18-06-2004 à 00:11:25    

el muchacho a écrit :

On s'en fout ici, de la vitesse. Le programme ne marche pas et ne risque pas de marcher avant un moment vu comme il est gaulé.


 
il a rien compris  [:yamusha]

Reply

Marsh Posté le 18-06-2004 à 08:34:28    

eho on se calme je debute, ça fait mainteneant a peu pres 4 semaines que je fais du C...
alors un peu d'indulgence et montrez moi un exemple de 'sprintf'

Reply

Marsh Posté le 18-06-2004 à 09:20:22    

Code :
  1. sprintf( phrase, "%s:%s:%s.\n", dureeHeures, dureeMinutes, dureeSecondes);


En supposant que tes variables dureeTruc soit déjà des chaines, si ce sont des entiers faut utiliser %d

Reply

Marsh Posté le 18-06-2004 à 09:24:45    

Mon dieu que je suis C.. , ahlala j'ai l'impression d'etre un boulet avec mes questions idiotes.

Reply

Marsh Posté le 18-06-2004 à 09:26:28    

duree* c'est bien des char* ou assimilés ?

Reply

Marsh Posté le 18-06-2004 à 09:34:19    

Ce sont des int car j'ai d'abord effectuer une conversion de la chaine de caracteres que j'ai recupere precedement afin de pouvoir effectuer un calcul numerique.
J'ai tous d'abord cru que je devais ensuite effectuer une nouvelle conversion des int en char afin de pouroir les concatener a la suite des autre elements.
 
Mais 'dapres ce que je comprends ds messages precedents avec sprintf ,il n'y a pas besoin d'effectuer une conversion.
Je me trompe ?
 
A+

Reply

Marsh Posté le 18-06-2004 à 09:40:06    

... ben alors le format il est pas bon :o
 
%d :o

Reply

Marsh Posté le 18-06-2004 à 10:00:27    

Vi, dans sprintf faut tout de même que tu lui donne le format dans lequel tu veux qu'il te traite variable pour qu'il fasse le boulot ...

Reply

Marsh Posté le 18-06-2004 à 10:01:12    

Peut on combiner des sprintf et des strcat?
 
car avec une fonction 'recupmot' je recuperes des mots  :D  , puis fait une copie, ensuite je concatene les elements suivant a la suite.
 
Mais pour rajouter les elements de calcul je dois utiliser sprintf et la mon programme plante et cela juste quand arrive le deuxieme recupmot qui utilise un strcat.
 
 

Code :
  1. void transforme(char phras[TAILLE]){
  2. char *temp;
  3. recupmot(',',phras,1);
  4. strcat(phrase,"," );
  5. temp=strchr(temp,',');
  6. sprintf( phrase, "%d:%d:%d;\n", dureeHeures, dureeMinutes, dureeSecondes);
  7. recupmot(',',temp,0);    //ici cela plante
  8. strcat(phrase,"," );
  9. temp=strchr(temp,',');
  10. recupmot(';',temp,0);
  11. strcat(phrase,"." );
  12. strcat(phrase,"\n" );
  13. }


Message édité par bombyce le 18-06-2004 à 10:02:56
Reply

Marsh Posté le 18-06-2004 à 10:03:43    

aucun intérêt

Reply

Marsh Posté le 18-06-2004 à 10:04:14    

je t'ai déjà répondu là dessus ...
 

Citation :

char *p = phrase;
 
p += sprintf( p, ...);


 

Citation :

Et temp qui pointe sur queud, tu m'étonne que ça vautre ...  

Reply

Marsh Posté le 18-06-2004 à 13:26:24    

Merci pour votre patience.  
Et j'avais bien vu ton precedent post mais etais reste bloque sur mon idee qui etait d'ailleur une idee de merde puisque ça marche pas.
Enfin bon maintenant ça marche. Du moins ça ne plante plus.
 
A+

Reply

Marsh Posté le 22-06-2004 à 14:46:16    

Voici une partie de mon code pour trier les lignes d un fichier texte.
exmple de lignes:
10/01/04,00:07:45;080,02;Ko.
10/01/04,00:08:58;080,02;Ok,ReceptionDM.
10/01/04,00:09:24;080,02;Ko,PasDeReponseSurLiaison.
10/01/04,00:09:32;080,02;Ok,ReceptionDM.
10/01/04,00:09:42;080,02;Ko,ExcesRetransmission.
10/01/04,00:09:49;080,02;Ok,ReinitLiaison.
 
 

Code :
  1. parcour2 = 1;
  2. parcour1 = 0;
  3. fgets(caracteres,TAILLE-1,lignes);
  4. do{
  5.    test1=strstr(caracteres,"Ok" );
  6.      if( parcour2==1){
  7. if(test1==NULL){
  8.          transforme1(caracteres);
  9.   buffer11=calculTemps(9,10,caracteres);       HEURES_1=strtol(buffer11,0,10);
  10.  buffer12=calculTemps(12,13,caracteres); 
  11.  MINUTES_1=strtol(buffer12,0,10);
  12.  buffer13=calculTemps(15,16,caracteres);            SECONDES_1=strtol(buffer13,0,10);
  13.                 JOURS_1=strtol(calculTemps(0,1,caracteres),0,10);     MOIS_1=strtol(calculTemps(3,4,caracteres),0,10);
  14.  ANNEES_1=strtol(calculTemps(6,7,caracteres),0,10);
  15.  parcour1 = 1;
  16.   fgets(caracteres,TAILLE-1,lignes);     test2=strstr(caracteres,"Ko" );
  17. }
  18.      }
  19.      if (parcour1 == 1){
  20. if (test2 == NULL) {
  21.    transforme2(caracteres);         buffer21=calculTemps(9,10,caracteres);
  22.    HEURES_2=strtol(buffer21,0,10);
  23.    buffer22=calculTemps(12,13,caracteres);
  24.    MINUTES_2 =strtol(buffer22,0,10);
  25.    SECONDES_2 =strtol(calculTemps(15,16,caracteres),0,10);     JOURS_2 = strtol(calculTemps(0,1,caracteres),0,10);
  26.    MOIS_2 = strtol(calculTemps(3,4,caracteres),0,10);
  27.            ANNEES_2 = strtol(calculTemps(6,7,caracteres),0,10);
  28.               if((strcmp(DATE1,DATE2)==0)&&(strcmp(NUMNOEUD1,NUMNOEUD2)==0)&& (strcmp(NUMLIGNE1,NUMLIGNE2)==0)){   
  29.  dureeHeures = HEURES_2 - HEURES_1 ;     dureeMinutes = MINUTES_2 - MINUTES_1 ;
  30.  dureeSecondes = SECONDES_2 - SECONDES_1 ;
  31.  dureeJours = JOURS_2 - JOURS_1;
  32.  dureeMois = MOIS_2 - MOIS_1;
  33.  dureeAnnees = ANNEES_2 - ANNEES_1;
  34.  p +=sprintf(p,"%s , ",DATE1);      p +=sprintf( p, "%d:%d:%d ; ", dureeJours, dureeMois, dureeAnnees);
  35.         p +=sprintf( p, "%d:%d:%d ; ", dureeHeures, dureeMinutes, dureeSecondes);
  36.  p +=sprintf(p,"%s , ",NUMNOEUD1);
  37.  p +=sprintf(p,"%s , ",NUMLIGNE1);
  38.  if (test5 != NULL){        p +=sprintf(p,"%s . \n",CAUSE2);    }
  39.  fputs(phrase,duree);       parcour2 = 1;
  40.  fgets(caracteres,TAILLE-1,lignes);
  41.     }else{
  42.           if (strcmp(DATE1,DATE2)!=0){
  43.   if((temporaire=fopen(temporaire_fic,"wt" ))==NULL){
  44.    printf("\n Erreur d'ouverture du fichier %s",nomfich);
  45.   }else{
  46.    transformeCasParticulier(caracteres);     fputs(phrase,temporaire);
  47.   }
  48.           }
  49.  parcour2 = 0;        fgets(caracteres,TAILLE-1,lignes);
  50.  test2=strstr(caracteres,"Ko" );
  51.      }
  52.         }
  53.     }
  54. }while(fgets(caracteres,TAILLE-1,lignes)!= NULL)

 
 
 
Mon probleme est que je recupere dans le fichier definitif une repetitions des lignes precedentes, c'est a dire :
 
10/01/04 , 0:0:0 ; 0:1:13 ; 080 , 02 , ReceptionDM .  //1er resultat
10/01/04 , 0:0:0 ; 0:1:13 ; 080 , 02 , ReceptionDM .  //1er resultat
10/01/04 , 0:0:0 ; 0:0:8 ; 080 , 02 , ReceptionDM .   //2eme resultat
10/01/04 , 0:0:0 ; 0:1:13 ; 080 , 02 , ReceptionDM .  //1er resultat
10/01/04 , 0:0:0 ; 0:0:8 ; 080 , 02 , ReceptionDM .   //2eme resultat
10/01/04 , 0:0:0 ; 0:0:7 ; 080 , 02 , ReinitLiaison   //3eme resultat
 
 
J'imagine faire une erreur de parcour avec mes boucles mais ça fait un moment que je cherche et je bloque  :cry:  
J'abuse peut etre de donner une partie de mon code comme ça et d'esperer que vous trouverez mon/mes erreur(s) mais la je seche vraiment et ça me prend la tete. :pt1cable:  
Merci de votre aide.


Message édité par bombyce le 22-06-2004 à 14:54:31
Reply

Marsh Posté le 22-06-2004 à 14:49:29    

déjà jète ton feof de merde qui marchera jamais
 
while(fgets() != NULL)  
{
 // action
}

Reply

Marsh Posté le 22-06-2004 à 14:56:09    

bon c modifie  
mais une petite question, si je fais :
while((fgets(caracteres,TAILLE-1,lignes)!= NULL){  
//action
}
 
cela va t il me faire changer de ligne?

Reply

Marsh Posté le 22-06-2004 à 16:00:18    

sizeof caractères et pas TAILLE-1
 
ça va pas te faire changer de ligne sytématiquement, ça va lire jusqu'à TAILLE-1 caractères, '\n' compris si la fin de ligne a été atteinte, et ça mettra __toujours__ un 0 final

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed