[C++] (2) Une histoire de vector

Une histoire de vector [C++] (2) - C++ - Programmation

Marsh Posté le 24-03-2011 à 17:53:39    

Bonjour tout le monde,
 
Bon, m'etant lance dans C++, j'ai actuellement encore du mal a gerer les histoire de pointeurs. Par exemple dans mon main j'ai :

Code :
  1. struct tm * tm_today_date1 = EXCEL_SERIAL_DATE_TO_DMY((int)today_date1);
  2. struct tm * tm_today_date2 = EXCEL_SERIAL_DATE_TO_DMY((int)today_date2);


Avec comme fonction que j'ai code :

Code :
  1. struct tm * EXCEL_SERIAL_DATE_TO_DMY(int nSerialDate)
  2. {
  3. /* Variables */
  4. int nDay, nMonth, nYear;
  5. struct tm * timeinfo;
  6. time_t datetime;
  7. /* Convert serial date to days/months/years */
  8.     int l = nSerialDate + 68569 + 2415019;
  9.     int n = int(( 4 * l ) / 146097);
  10.         l = l - int(( 146097 * n + 3 ) / 4);
  11.     int i = int(( 4000 * ( l + 1 ) ) / 1461001);
  12.         l = l - int(( 1461 * i ) / 4) + 31;
  13.     int j = int(( 80 * l ) / 2447);
  14.     nDay = l - int(( 2447 * j ) / 80);
  15.  l = int(j / 11);
  16.     nMonth = j + 2 - ( 12 * l );
  17.     nYear = 100 * ( n - 49 ) + i + l;
  18. /* Get current timeinfo and modify it according to the function's serial date */
  19. time ( &datetime );
  20. timeinfo = localtime ( &datetime );
  21. timeinfo->tm_year = nYear - 1900;
  22. timeinfo->tm_mon = nMonth - 1;
  23. timeinfo->tm_mday = nDay;
  24.  /* Call mktime: tm_wday, tm_yday, ... will be set */
  25. mktime ( timeinfo );
  26. return timeinfo;
  27. }


Comme tu t'en doutes, tm_today_date1 est aussi modifie quand il passe au second calcul soit au final, date1 identique a date2. Qu'est ce que je dois faire pour changer ce fait ? Je sens qu'il y a peu a faire mais je bloque sur 'quoi'.
 
Merci d'avance.


Message édité par Profil supprimé le 25-03-2011 à 01:17:40
Reply

Marsh Posté le 24-03-2011 à 17:53:39   

Reply

Marsh Posté le 24-03-2011 à 18:21:59    

Tu veux stocker deux dates (struct tm), tu dois donc creer deux structures.  
 
De deux choses l'une, soit tu alloues dynamiquement dans ta fonction une nouvelle structure a chaque appel. Dans ce cas, il faudra penser a liberer la memoire.
 
L'autre solution (qui est meilleur imho), est de passer en paremeter un pointeur vers une structure tm:
 

Code :
  1. struct tm date1;
  2. EXCEL_SERIAL_DATE_TO_DMY((int)today_date1, &date1);
  3. /* ... */
  4. void EXCEL_SERIAL_DATE_TO_DMY(int nSerialDate, struct tm * timeInfo) {
  5. /* ...*/
  6. }


Message édité par mr simon le 24-03-2011 à 18:22:34
Reply

Marsh Posté le 24-03-2011 à 18:42:13    

Je viens de faire ta deuxieme technique. Tout se passe bien sauf qu'a l'exit de la fonction, il n'update pas les valeurs et l'objet date1 est toujours a son status initial.

 

J'ai rate une etape ?

 

Edit: Je commence a piger ces histoires de pointers. timeinfo = localtime ( &datetime ); faisait qu'il prenait aussi l'adresse de datetime qui est une variable locale (donc detruite a la fin de la fonction). *timeinfo = *localtime ( &datetime ); a regle le probleme. Merci encore :)


Message édité par Profil supprimé le 24-03-2011 à 18:55:55
Reply

Marsh Posté le 24-03-2011 à 20:17:33    

Autant pour moi, j'ai oublie que localtime utilisait une variable statique ...
 
Tu dois donc faire une copie de la struct tm:

Code :
  1. memcpy(timeinfo, localtime ( &datetime ), sizeof(*timeinfo));

Reply

Marsh Posté le 25-03-2011 à 01:20:12    

Bon je reviens avec un autre probleme cette fois-ci :D :

 

http://img534.imageshack.us/img534/8831/99885493.png

 

Je n'arrive pas a trouver la bonne ecriture pour pouvoir acceder (si c'est possible ?) a l'information que j'ai souligne sachant que l'appelle a la base dans la fonction est

Code :
  1. std::vector<Cstring> instruments
 

J'ai beau aller sur http://www.cplusplus.com/reference/stl/vector/ il n'y a que quelques fonctions qui marchent comme instrument.size() qui retourne bien 26. Seulement, j'aimerais bien acceder a la valeur '1D' et tous les instruments[0], instruments.at(0) etc. ne marchent pas :/


Message édité par Profil supprimé le 25-03-2011 à 01:21:26
Reply

Sujets relatifs:

Leave a Replay

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