テロップのように流して表示させる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ジェリナゲ
記事: 17
登録日時: 11年前

テロップのように流して表示させる

#1

投稿記事 by ジェリナゲ » 10年前

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


 

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: テロップのように流して表示させる

#2

投稿記事 by みけCAT » 10年前

コンパイラのバグかもしれません。
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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: テロップのように流して表示させる

#3

投稿記事 by みけCAT » 10年前

ジェリナゲ さんが書きました:22行目を消すとしっかりと実行されます。 22行目がおかしいと思いテストプログラムを作り試してみましたが、しっかりと動作しました。
「しっかりと実行される」「しっかりと動作する」とはどのような状態でしょうか?
自分の環境でコード中の全角スペースを半角スペースに置換したコードを実行した結果、
最初のコードでは表示が高速で切り替わり、次のコードはstartとgoalが一瞬のうちに表示されて終了しました。
これとは違う症状の場合、上の方法ではうまくいかないかもしれません。
特に、「実行しても何も表示されません。」とのことなので、ウェイトが無い問題ではなく、もっと別の問題が疑われます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ジェリナゲ
記事: 17
登録日時: 11年前

Re: テロップのように流して表示させる

#4

投稿記事 by ジェリナゲ » 10年前

[/quote]
「しっかりと実行される」「しっかりと動作する」とはどのような状態でしょうか?
[/quote]

しっかりと実行されるは、ABCDEFGがテロップのように流れて表示されますが、とても早いです。
動作するのほうは、startと表示されて3秒後にgoalと表示されるということです。

ほかにも時間を置く関数があることは初めて知りました。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: テロップのように流して表示させる

#5

投稿記事 by みけCAT » 10年前

ジェリナゲ さんが書きました:[/​quote]
「しっかりと実行される」「しっかりと動作する」とはどのような状態でしょうか?
[/​quote]

しっかりと実行されるは、ABCDEFGがテロップのように流れて表示されますが、とても早いです。
動作するのほうは、startと表示されて3秒後にgoalと表示されるということです。

ほかにも時間を置く関数があることは初めて知りました。
うーむ、正常動作ですか。
とりあえず、各putcharの直後にfflush(stdout);を入れてみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ジェリナゲ
記事: 17
登録日時: 11年前

Re: テロップのように流して表示させる

#6

投稿記事 by ジェリナゲ » 10年前

各putcharの直後にfflush(stdout); をいれたらしっかりと3秒ごとにテロップのように流れるように実行されました! どういうことなのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: テロップのように流して表示させる

#7

投稿記事 by みけCAT » 10年前

ジェリナゲ さんが書きました:各putcharの直後にfflush(stdout); をいれたらしっかりと3秒ごとにテロップのように流れるように実行されました! どういうことなのでしょうか?
バッファリングの影響で、出力が画面に反映されていなかったと考えられます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ジェリナゲ
記事: 17
登録日時: 11年前

Re: テロップのように流して表示させる

#8

投稿記事 by ジェリナゲ » 10年前

どういう原理でとかはあまり気にしない方がいいでしょうか、

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: テロップのように流して表示させる

#9

投稿記事 by みけCAT » 10年前

ジェリナゲ さんが書きました:どういう原理でとかはあまり気にしない方がいいでしょうか、
気にしない方がいいことは無いと思います。
例えば、長い計算の進捗状況を出力したいとき、バッファリングに邪魔されることがあるかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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