ページ 11

printf関数の表示が

Posted: 2011年3月02日(水) 15:34
by ずんずん
VC++2008EE Windows7
猫でもわかるプログラミング第1部C言語編 第13章while文のtime関数について教えてほしいです。
エラーも警告もでないのですが実行結果でがおかしくなってしまいます。
僕の環境だけなんでしょうか?原因がわかる方教えてほしいです。
C言語は入門レベルです

コード:

// main.c
#include <stdio.h>
#include <time.h>

int main(void)
{	
	time_t t1, t2;		
	int i = 1;	


	time( &t1 );			// t1に、表示前の秒数を格納

	while( i <= 5000 ){
		printf( "%d, ", i++ );
	}
	time( &t2 );			// t2に、表示後の秒数を格納
	printf( "\n" );


	// time_tは、long型なので%ldとなることに注意!
	printf( "time1 = %ld time2 = %ld\n", t1, t2 );		// この文はtime1 = 1299047160 time2 = 0となってtime2がおかしい
	printf( "time1=%ld ", t1 );				// この文は正しく表示される
	printf( "time2=%ld\n", t2 );				// でもこの文は正しく表示される
	printf( "かかった時間は、%d秒です。\n", t2 - t1 );	// この文は正しく表示される


	return 0;
}

Re: printf関数の表示が

Posted: 2011年3月02日(水) 15:44
by softya(ソフト屋)
C言語にも規格変更の歴史があって最新だと%lldが64bit整数型の正しい書式です。
なので、こうすれば大丈夫だと思います。

コード:

// main.c
#include <stdio.h>
#include <time.h>
 
int main(void)
{   
    time_t t1, t2;      
    int i = 1;  
 
 
    time( &t1 );            // t1に、表示前の秒数を格納
 
    while( i <= 5000 ){
        printf( "%d, ", i++ );
    }
    time( &t2 );            // t2に、表示後の秒数を格納
    printf( "\n" );
 
 
    // time_tは、long型なので%ldとなることに注意!
    printf( "time1 = %lld time2 = %lld\n", t1, t2 );      // この文はtime1 = 1299047160 time2 = 0となってtime2がおかしい
    printf( "time1=%lld ", t1 );             // この文は正しく表示される
    printf( "time2=%lld\n", t2 );                // でもこの文は正しく表示される
    printf( "かかった時間は、%lld秒です。\n", t2 - t1 );  // この文は正しく表示される
 
 
    return 0;
}

Re: printf関数の表示が

Posted: 2011年3月02日(水) 15:57
by maru
ずんずん さんが書きました:

コード:

	// time_tは、long型なので%ldとなることに注意!
これが間違いですね。
VC++2008なら time_t にマウスカーソルをもっていって右クリック、「定義へ移動」で time_t の typedef に飛びます。
多分
typedef __time64_t time_t; /* time value */
の文にジャンプします。
さらに、__time64_t は
typedef __int64 __time64_t; /* 64-bit time value */

time_t を long で使いたい場合は
#define _USE_32BIT_TIME_T
とすればよさそうですが、試していないので、あしからず。

64ビットのままでよければ、softyaさんの回答どおりですね。

Re: printf関数の表示が

Posted: 2011年3月02日(水) 16:01
by ずんずん
本当ですね!%lldでちゃんと表示されました。
どうもありがとうございました。