ページ 1 / 1
テロップのように流して表示させる
Posted: 2014年9月04日(木) 17:15
by ジェリナゲ
ABCDEFGを同一行内で右から左へテロップのように流すプログラム(柴田望洋 著 解きながら学ぶC言語 p203) を以下の様に作成したのですが、実行しても何も表示されません。
22行目を消すとしっかりと実行されます。 22行目がおかしいと思いテストプログラムを作り試してみましたが、しっかりと動作しました。
なにがいけないのでしょうか。
コード:
#include <stdio.h>
#include <time.h>
#include <string.h>
int main(void){
char str[]="ABCDEFG "; //表示する文字列
time_t t;
int len = strlen(str); //表示する文字列の文字数
int cnt=0;
while(1){
int i;
putchar('\r'); //カーソルを行の先頭へ
for(i=0;i<len;i++){
if(cnt+i<len){
putchar(str[cnt+i]);
}else{
putchar(str[cnt+i-len]);
}
}
for(t = time(NULL); difftime(time(NULL), t) <= 3; ); //3秒間を置く
if(cnt<len-1){
cnt++;
}else{
cnt=0;
}
}
return 0;
}
テストプログラム
コード:
#include <stdio.h>
#include <time.h>
int main(void){
time_t t;
printf("start\n");
for(t = time(NULL); difftime(time(NULL), t) <= 3; ); //3秒間を置く
printf("goal\n");
return 0;
}
Re: テロップのように流して表示させる
Posted: 2014年9月04日(木) 18:08
by みけCAT
コンパイラのバグかもしれません。
http://stackoverflow.com/questions/2101 ... e-in-mingw
difftime(time(NULL), t)の代わりに、単純に(double)(t - time(NULL))とするか、
#include <time.h>の前に#define _USE_32BIT_TIME_T 1という行を追加してみてください。
そもそも、パソコンで「3秒間を置く」というだけの処理で、あまり精度を要求しないなら、
わざわざtimeやdifftimeを用いなくても、usleep関数を用いればいいのではないでしょうか?
コード:
#include <stdio.h>
#include <unistd.h>
void wait_for_ms(int ms) {
int i;
for (i = 0; i < ms; i++) usleep(1000);
}
int main(void){
printf("start\n");
wait_for_ms(3000); //3秒間を置く
printf("goal\n");
return 0;
}
Re: テロップのように流して表示させる
Posted: 2014年9月04日(木) 18:11
by みけCAT
ジェリナゲ さんが書きました:22行目を消すとしっかりと実行されます。 22行目がおかしいと思いテストプログラムを作り試してみましたが、しっかりと動作しました。
「しっかりと実行される」「しっかりと動作する」とはどのような状態でしょうか?
自分の環境でコード中の全角スペースを半角スペースに置換したコードを実行した結果、
最初のコードでは表示が高速で切り替わり、次のコードはstartとgoalが一瞬のうちに表示されて終了しました。
これとは違う症状の場合、上の方法ではうまくいかないかもしれません。
特に、「実行しても何も表示されません。」とのことなので、ウェイトが無い問題ではなく、もっと別の問題が疑われます。
Re: テロップのように流して表示させる
Posted: 2014年9月04日(木) 22:40
by ジェリナゲ
[/quote]
「しっかりと実行される」「しっかりと動作する」とはどのような状態でしょうか?
[/quote]
しっかりと実行されるは、ABCDEFGがテロップのように流れて表示されますが、とても早いです。
動作するのほうは、startと表示されて3秒後にgoalと表示されるということです。
ほかにも時間を置く関数があることは初めて知りました。
Re: テロップのように流して表示させる
Posted: 2014年9月04日(木) 22:49
by みけCAT
ジェリナゲ さんが書きました:[/quote]
「しっかりと実行される」「しっかりと動作する」とはどのような状態でしょうか?
[/quote]
しっかりと実行されるは、ABCDEFGがテロップのように流れて表示されますが、とても早いです。
動作するのほうは、startと表示されて3秒後にgoalと表示されるということです。
ほかにも時間を置く関数があることは初めて知りました。
うーむ、正常動作ですか。
とりあえず、各putcharの直後にfflush(stdout);を入れてみてください。
Re: テロップのように流して表示させる
Posted: 2014年9月04日(木) 23:24
by ジェリナゲ
各putcharの直後にfflush(stdout); をいれたらしっかりと3秒ごとにテロップのように流れるように実行されました! どういうことなのでしょうか?
Re: テロップのように流して表示させる
Posted: 2014年9月04日(木) 23:32
by みけCAT
ジェリナゲ さんが書きました:各putcharの直後にfflush(stdout); をいれたらしっかりと3秒ごとにテロップのように流れるように実行されました! どういうことなのでしょうか?
バッファリングの影響で、出力が画面に反映されていなかったと考えられます。
Re: テロップのように流して表示させる
Posted: 2014年9月05日(金) 00:05
by ジェリナゲ
どういう原理でとかはあまり気にしない方がいいでしょうか、
Re: テロップのように流して表示させる
Posted: 2014年9月05日(金) 00:09
by みけCAT
ジェリナゲ さんが書きました:どういう原理でとかはあまり気にしない方がいいでしょうか、
気にしない方がいいことは無いと思います。
例えば、長い計算の進捗状況を出力したいとき、バッファリングに邪魔されることがあるかもしれません。