problème de durée avec mktime()

problème de durée avec mktime() - C++ - Programmation

Marsh Posté le 06-08-2009 à 15:53:17    

Bonjour,
 
J'ai un problème sur une fonction de date comme dit dans mon titre.
 
Je ne comprend pas pourquoi le mktime me renvoie -1
 
C'est pour faire un calculateur de temps pour un jeu en ligne.
 
Voici le code :  
 

Code :
  1. #include <iostream>
  2. #include "math.h"
  3. #include "time.h"
  4. using namespace std;
  5. double calculateur(int coor_vivi_attaquant_x, int coor_vivi_attaquant_y, int coor_vivi_cible_x, int coor_vivi_cible_y, char unite[15]);
  6. int main()
  7. {
  8.     // Déclarations des variables
  9.     char village_cible[40], village_attaquant[40];
  10.     int coor_vivi_cible_x, coor_vivi_cible_y, coor_vivi_attaquant_x, coor_vivi_attaquant_y;
  11.     char unite[15];
  12.     double resultat = 0, resultat_soustra = 0, resultat_heure = 0, resultat_min = 0, resultat_sec = 0;
  13.     double resultat_floor = 0;
  14.     int resultat_floor_int = 0;
  15.     struct tm temps = { 0 };
  16.     // Phase de demande
  17.     cout << "Quel est le nom du village attaquant ?" << endl;
  18.     cin >> village_attaquant;
  19.     cout << "Quels sont ses coordonnees en X ?" << endl;
  20.     cin >> coor_vivi_attaquant_x;
  21.     cout << "Quels sont ses coordonnees en Y ?" << endl;
  22.     cin >> coor_vivi_attaquant_y;
  23.     cout << "Quel est le nom du village cible ?" << endl;
  24.     cin >> village_cible;
  25.     cout << "Quels sont ses coordonnees en X ?" << endl;
  26.     cin >> coor_vivi_cible_x;
  27.     cout << "Quels sont ses coordonnees en Y ?" << endl;
  28.     cin >> coor_vivi_cible_y;
  29.     cout << "Quelle est l'unite la plus lente ?" << endl;
  30.     cin >> unite;
  31.    
  32.     //mise en place du resultat dans une structure tm
  33.     resultat = calculateur(coor_vivi_attaquant_x, coor_vivi_attaquant_y, coor_vivi_cible_x, coor_vivi_cible_y, unite);
  34.     resultat_floor = floor(resultat);
  35.     temps.tm_mday = resultat_floor;
  36.     resultat_soustra = resultat - resultat_floor;
  37.     resultat_heure = resultat_soustra * 24;
  38.     resultat_floor = floor(resultat_heure);
  39.     temps.tm_hour = resultat_floor;
  40.     resultat_soustra = resultat_heure - resultat_floor;
  41.     resultat_min = resultat_soustra * 60;
  42.     resultat_floor = floor(resultat_min);
  43.     temps.tm_min = resultat_floor;
  44.     resultat_soustra = resultat_min - resultat_floor;
  45.     resultat_sec = resultat_soustra * 60;
  46.     resultat_floor = floor(resultat_sec);
  47.     temps.tm_sec = resultat_floor;
  48.     //affichage
  49.     cout << temps.tm_mday << "/" << temps.tm_mon << "/" << temps.tm_year << "  ";
  50.     cout << temps.tm_hour << " : " << temps.tm_min << " : " << temps.tm_sec << endl;
  51.     cout << "Soit : " << temps.tm_mday << " jour(s), " << temps.tm_hour << " heure(s), " << temps.tm_min << " minute(s) et "
  52.          << temps.tm_sec << " seconde(s)." << endl;
  53.     time_t epoch = mktime(&temps);
  54.     cout << epoch << endl;
  55.     return 0;
  56. }
  57. double calculateur(int coor_vivi_attaquant_x, int coor_vivi_attaquant_y, int coor_vivi_cible_x, int coor_vivi_cible_y, char unite[15])
  58. {
  59.     double valeur = 0, valeur2 = 0, result_valeur = 0, absolue = 0, absolue2 = 0;
  60.     double puissance = 0, puissance2 = 0, racine = 0, valeur_calculee = 0;
  61.     int unites_const = 0;
  62.     char comte[15] = "Comte", templier[15] = "Templier", ecuyer[15] = "Ecuyer", sauvage[15] = "Sauvage", grand_arc[15] = "Grand Arc";
  63.     char eclaireur[15] = "Eclaireur", croise[15] = "Croise", chevalier_noir[15] = "Chevalier Noir", belier[15] = "Belier";
  64.     char trebuchet[15] = "Trebuchet";
  65.     if (strcmp(unite, comte) == 0)
  66.         unites_const = 35;
  67.     if (strcmp(unite, templier) == 0)
  68.         unites_const = 22;
  69.     if (strcmp(unite, ecuyer) == 0)
  70.         unites_const = 18;
  71.     if (strcmp(unite, sauvage) == 0)
  72.         unites_const = 18;
  73.     if (strcmp(unite, grand_arc) == 0)
  74.         unites_const = 18;
  75.     if (strcmp(unite, trebuchet) == 0)
  76.         unites_const = 30;
  77.     if (strcmp(unite, eclaireur) == 0)
  78.         unites_const = 9;
  79.     if (strcmp(unite, croise) == 0)
  80.         unites_const = 10;
  81.     if (strcmp(unite, chevalier_noir) == 0)
  82.         unites_const = 11;
  83.     if (strcmp(unite, belier) == 0)
  84.         unites_const = 30;
  85.     valeur = coor_vivi_cible_x - coor_vivi_attaquant_x;
  86.     valeur2 = coor_vivi_cible_y - coor_vivi_attaquant_y;
  87.     absolue = fabs(valeur);
  88.     absolue2 = fabs(valeur2);
  89.     puissance = pow(absolue, 2);
  90.     puissance2 = pow(absolue2, 2);
  91.     result_valeur = puissance + puissance2;
  92.     racine = sqrt(result_valeur);
  93.     valeur_calculee = racine * unites_const * 60 / 86400;
  94.     return valeur_calculee;
  95. }


 
Si quelqu'un peut m'aider je lui en serais très reconnaissant je galère dessus depuis pas mal de temps.

Reply

Marsh Posté le 06-08-2009 à 15:53:17   

Reply

Marsh Posté le 06-08-2009 à 16:31:53    

Joli C.
 
Au pif, tes mois tu les numérotes comment ?
Elle ressemble à quoi ta struct tm que tu donnes à mktime ?

Reply

Marsh Posté le 06-08-2009 à 16:40:00    

je ne met pas de mois, les attaques (ici c'est de cela qu'il s'agit), ont une durée maximum de plusieurs jours tout au plus.
Donc je ne met pas de mois dans la structure tm.
Mais si j'en met ils sont numérotés de 0 -> 11.
La strucure tm prend tous les résultat des floor().
exemple,  
  temps.tm_mday = 1;
  temps.tm_hour = 12;
  temps.tm_min = 36;
  temps.tm_sec = 22;

Reply

Marsh Posté le 06-08-2009 à 16:58:37    

J'ai peut-être pas tout pigé dans ta logique, mais il y a un truc qui me parait bizarre dans ton code.
 
Ta fonction calculateur() semble manipuler des secondes, que tu transformes en struct tm pour passer à mktime, qui te renverra des secondes à nouveau ?
 
C'est quoi l'intérêt  [:opus dei] ?

Reply

Marsh Posté le 06-08-2009 à 17:07:48    

oui, j'étais en train de relire, et effectivement ma logique d'il y a deux semaines me paraissais bizarre aujourd'hui, surtout après avoir relu les prtotypes ;)
Mais en faite, ce que je veux faire, c'est arrivé a mettre les secondes que j'ai calculées dans un time_t pour pouvoir ensuite faire un difftime() et afficher le résultats.
Parce que le résultat que j'obtiens, c'est le nombre de secondes qu'il faut retrancher a une date que l'utilisateur rentrera.
 
Donc je ne sais pas comment on met les secondes dans un time_t.

Reply

Marsh Posté le 06-08-2009 à 18:11:35    

sinon boost::date_time

Reply

Marsh Posté le 06-08-2009 à 18:36:41    

heu...
Cela provient d'ou cette fonction ??

Reply

Marsh Posté le 06-08-2009 à 18:55:10    

Reply

Marsh Posté le 06-08-2009 à 19:16:55    

Oui cela je l'avais compris ce que je demandais, c'est si cela était du standart (librarie)?

Reply

Marsh Posté le 06-08-2009 à 19:20:21    

Bon, c'est bon je viens de regarder, escusez-moi le post inutile d'au-dessus, est-ce que tu pourrais m'expliquer comment fonction cette fonction ?

Reply

Marsh Posté le 06-08-2009 à 19:20:21   

Reply

Marsh Posté le 06-08-2009 à 19:30:28    

Tout est dans le lien. Jeff a ecrit une tres bonne doc.

Reply

Marsh Posté le 06-08-2009 à 19:50:58    

OK, merci, mais le lien, je ne le vois pas. Mais j'ai quand même trouvé.
Une dernière question, est-ce que cette instruction est valide :  
  time_t essai = xxxxxxxxx; //x représentant des chiffres.

Reply

Marsh Posté le 06-08-2009 à 21:45:57    

lien : truc bleu clickable dans le post du dessu :o
 
http://www.boost.org/doc/libs/1_39 [...] _time.html

Reply

Marsh Posté le 07-08-2009 à 10:00:24    

Oki escuse moi je ne l'avais pas vu, il étais bien caché :)
Merci.

Reply

Sujets relatifs:

Leave a Replay

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