質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

653閲覧

sleepを使ったタイマーのプログラム

langhtorn

総合スコア104

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/22 03:30

編集2020/05/22 03:39

###実現したいこと
指定された時間が経過したことを知らせるプログラムを作りたい。
sleepを使う
###問題点

タイマーの部分がうまく動かない。 指定した時間と違う時間を刻み始める。。

###コード

C++

1#include<iostream> 2#include<chrono> 3#include<thread> 4#include<cstdlib> 5void sleep(double sec); 6int main(int argc,char* argv[]) 7{ 8 int i; 9 std::cout<<"0% 10 20 30 40 50 60 70 80 90 100\n"; 10 std::cout<<"|----|----|----|----|----|----|----|----|----|----|\n"; 11 std::cout<<"^"<<std::flush; 12 for(i=0;i<50;i++){ 13 sleep(std::atof(argv[i])/50); 14 std::cout<<"\b"; 15 std::cout<<"~"; 16 std::cout<<"^"; 17 std::cout<<std::flush; 18 } 19 std::cout<<"\n"; 20 std::cout<<std::atof(argv[1])<<"秒経過しました\n"; 21 return 0; 22} 23void sleep(double sec) 24{ 25 int msec=sec*1000; 26 std::this_thread::sleep_for(std::chrono::milliseconds(msec)); 27}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2020/05/22 04:31

質問のプログラムは、どのような引数を指定して起動するのですか?  for(i=0;i<50;i++){ sleep(std::atoi(argv[i])/50); となっているので、50個もの引数を指定するのだと思うのですが、そんなに大量の引数で何を指定するのですか?
guest

回答2

0

そもそも引数いくつ受け取るプログラムでしょうか?

C++

1 sleep(std::atof(argv[i])/50);

もし引数一個だけなら、ここがargv[1]になると思いますが、iだとへんな場所を参照すると思います。
あと、何度もstd::atofするより、一回double型の変数に受けて使いまわした方がいいです。

投稿2020/05/22 04:38

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

推測ですが、test.exe 10 のようにタイマーの秒数を引数に指定して、プログレスバーのような形で指定した時間分カウントするプログラムが作りたかったのではないでしょうか。
だとすると、指定した秒数は argv[1] で参照できるので、sleep(std::atof(argv[i])/50); の部分は sleep(std::atof(argv[1])/50); とするべきではないでしょうか。

diff

1- sleep(std::atof(argv[i])/50); 2+ sleep(std::atof(argv[1])/50);

argc, argv の仕様

  • test.exe: argc = 1, argv[0] = "test.exe"
  • test.exe 10: argc = 2, argv[0] = "test.exe", argv[1] = "10"
  • test.exe 10 20: argc = 3, argv[0] = "test.exe", argv[1] = "10", argv[2] = "20"

修正後のコード

cpp

1#include <chrono> 2#include <cstdlib> 3#include <iostream> 4#include <thread> 5 6void sleep(double sec); 7 8int main(int argc, char *argv[]) 9{ 10 double time_secs = std::atof(argv[1]); 11 12 std::cout << "0% 10 20 30 40 50 60 70 80 90 100\n"; 13 std::cout << "|----|----|----|----|----|----|----|----|----|----|\n"; 14 std::cout << "^" << std::flush; 15 16 for (int i = 0; i < 50; i++) { 17 sleep(time_secs / 50); 18 std::cout << "\b"; 19 std::cout << "~"; 20 std::cout << "^"; 21 std::cout << std::flush; 22 } 23 std::cout << "\n"; 24 std::cout << time_secs << "秒経過しました\n"; 25 26 return 0; 27} 28 29void sleep(double sec) 30{ 31 int msec = sec * 1000; 32 std::this_thread::sleep_for(std::chrono::milliseconds(msec)); 33} 34

投稿2020/05/22 04:01

編集2020/05/22 06:17
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHOMI

2020/05/22 04:17

説明文の方argv[1]ではなくargv[0]になっていますよ
tiitoi

2020/05/22 04:42

修正しました。ご指摘ありがとうございます。
langhtorn

2020/05/22 15:17

できました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問