2017-08-16 1 views
-5

J'essaie de calculer le nombre d'opérations effectuées dans la boucle pendant 1 sec. Pour cela, je me souviens du moment où j'ai commencé à calculer la boucle et à vérifier l'heure à chaque itération. Mon idée - quand les nombres de secondes sont différents pour ces deux moments, j'imprime combien d'itérations de boucles ont été faites.Erreur avec une référence C++

Voici mon code:

#include <ctime> 
int main() 
{ 
    // For timing 
    time_t t, tstep; 
    struct tm* now, *step; 

    // this time will change at every iteration 
    t = time(0); 
    now = localtime(&t); 

    // save time of the start moment 
    tstep = t; 
    step = localtime(&tstep); 

    // counter of loop cycles 
    int count = 0; 

    for (size_t i = 0; i < 1e100 ; i++) 
    { 
     // ... here is some calculations  
     t = time(0); 
     now = localtime(&t); 
     count++; 

     if (now->tm_sec != step->tm_sec) 
     { 
      tstep = time(0); 
      step = localtime(&tstep); 
      //printf("number of lines %i \n", count); 
      count = 0; 
     } 
    } 
    return 0; 
} 

Quel est le problème: chaque fois que je rafraîchisse nowstep est devenu la même valeur! Alors que t et tstep sont les différents!

On dirait que c'est à cause de références: peut-être quand j'utilise tstep = t cela signifie que les adresses de ces variables se réfèrent à t les deux. Donc, en changeant t change now et tstep.

Comment résoudre ce problème? Comment copier juste la valeur de t à step? Ou il y a une autre manière réelle?

+0

Si vous downvote, pouvez-vous expliquer pourquoi? –

+5

"_Comme ceci, c'est à cause de references_" Vous ** n'utilisez ** pas de références n'importe où dans le code présenté. –

+1

En outre, ce n'est pas un [exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve) – kim366

Répondre

6

La fonction localtime n'est pas adaptée aux threads et, plus important encore, n'est pas réentrante.

Le pointeur qu'il renvoie est probablement un pointeur vers un tampon interne static. Cela signifie que chaque appel localtime renvoie le même pointeur sur le même "buffer" (structure). En fait, si vous lisez la référence liée, la mémoire tampon (structure) peut être partagée entre plusieurs fonctions.

Cela peut être facilement vérifié en utilisant un débogueur et comparer les pointeurs retournés par la fonction.

Si vous avez besoin de valeurs différentes, vous devez copier les données au lieu de copier le pointeur. Ceci est simplement fait en faisant now et step structure instances au lieu de pointeurs. Puis déréférencer le pointeur retourné par localtime:

struct tm now, step; // Note: Not pointers! 

... 

now = *localtime(&t); // Dereference returned pointer 
+1

Merci pour votre sympathie! J'ai été désagréablement surpris par la quantité de négativité qui a été déversée sur moi par des notes et des commentaires, c'est bien que quelqu'un pense à la façon d'aider, et non pas à la merde :) –