2017-08-16 24 views
-5

ループを通した操作の回数を1秒間に計算しようとしました。 これは私がループを計算し、繰り返しを行うたびに時間をチェックする時を思い出します。 私のアイデア - この2つの時代の秒数が異なる場合、ループ反復が何回行われたかを表示します。ここで参照のエラーC++

は私のコードです:

#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; 
} 

問題は何です:私はnowstepを更新するたびに同じ値になりました! ttstepは異なります!

参照のためにこのように見えます:tstep = tを使用した場合、これはこの変数のアドレスがtの両方を指していることを意味します。したがって、tを変更すると、nowtstepが変更されます。

この問題を解決するにはどうすればよいですか? tの値をstepにコピーするにはどうすればよいですか?それとも別の実際の方法がありますか?

+0

downvoteの場合、理由を説明できますか? –

+5

"このような_Looksは参考文献のためです:"あなたが提示されたコードのどこにでも参照を使用していません**。 –

+1

また、これは[Minimal、Complete、Verifiableの例](https://stackoverflow.com/help/mcve)ではありません。 – kim366

答えて

6

localtime関数はスレッドセーフではなく、より重要なのはリエントラントではありません。

それが返すポインタは、おそらく内部のstaticバッファへのポインタです。これは、各localtime呼び出しが非常に同じ "バッファ"(構造体)へのポインタを返すことを意味します。実際には、リンクされた参照を読み込むと、バッファ(構造体)を複数の関数間で共有することができます。

これは、デバッガを使用して簡単にチェックし、関数が返すポインタを比較することができます。

異なる値が必要な場合は、ポインタをコピーする代わりにデータをコピーする必要があります。これは、ポインタの代わりにnowstepの構造のインスタンスをにするだけで簡単に行えます。次に、localtimeによって返されたポインタを参照解除します。

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

... 

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

あなたの同情に感謝します!私は嫌悪感に驚いていました。否定的な感情は、声質低下と解説によって私に吹き込まれました。誰かがどのように助けてくれるのかと思っていいですね。 –