printf関数の表示が

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ずんずん

printf関数の表示が

#1

投稿記事 by ずんずん » 8年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: printf関数の表示が

#2

投稿記事 by softya(ソフト屋) » 8年前

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;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

maru
記事: 150
登録日時: 8年前

Re: printf関数の表示が

#3

投稿記事 by maru » 8年前

ずんずん さんが書きました:

コード:

	// 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関数の表示が

#4

投稿記事 by ずんずん » 8年前

本当ですね!%lldでちゃんと表示されました。
どうもありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る