nama40024
@nama40024

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

C言語でのループ処理を教えてください

Q&A

Closed

解決したいこと

C言語で以下のようなループ処理を実装したいのですがいささか案に行き詰まってしまいました。何か解決策をくださるとありがたいです。

//ループはwhileを使ってくださるとありがたいです。
//条件式はTrueかFalseかで判定してもらいたいです。(ヘッダファイルが使えない環境のため、
//bool型以外で判定してもらいたいです。
int main(){
    while(1){
    //ここでループを実行する。条件が満たせたら次のループ処理へ移行する。
    //ここではaをループ毎ずつ1足していき、10を超えたらこの処理を停止し、次の処理へ移行してください。

    //この下4行で一つのループです。
    //前のループ処理が実行されている間、ここのループは実行しない。
    //前のループが終わり次第、ここのループを実行する。
    //条件が満たせ次第、ループを停止する。
    //ここでの条件は、bをループ毎ずつ1足していき、20を超えたらこの処理を終了してください。
    }
}

追記
ご指摘ありがとうございます。以下にコードを示しますのでご回答いただけると幸いです。
超音波センサを使い、前の障害物との距離を計測し、一定まで近づいたら処理が実行されます。
ev3_ultrasonic、、という関数は超音波センサを使って前の障害物との距離を計測し、int型でその距離を返すものです。

int find = 1;
int Trace;//どちらもグローバル変数です。
while(find){
		int Findwall;
	    Findwall = ev3_ultrasonic_sensor_get_distance(ultraSonic_sensor);
	    if(Findwall <= 10){//前との距離が10cmまで近づいたら
		    Trace = 1;
		    find = 0;
	    }
        else(Findwall > 10){
            continue;
        }
    }
while(Trace){
        //色々な処理。中略してあります。
		int StopWall;
	    StopWall = ev3_ultrasonic_sensor_get_distance(ultraSonic_sensor);
	    if(StopWall <= 10){//前との距離が10cmまで近づいたら
		    Trace = 0;
	    }
    }
0

9Answer

Hello, I translated your question by machine to my native language.

Personally, I consider while (true) is correct.
But while(find) and while(Trace) cannot be put in the same process/thread.
You may establish two peers with producer-consumer mode.

I'm a web developer.
So I think message-queuing is a good choice.

1Like

2つのループが並列であれば、以下のようなコードになると思います。

int main() {
    int a = 0;
    while (a < 10) {
        a += 1;
    }
    int b = 0;
    while (b < 20) {
        b += 1;
    }
    return 0;
}
0Like

Comments

  1. 一応、一つのwhile()だけで完結させることもできますね。
    アルゴリズムは冗長になりますが、多分、c*****e、b***kを使ってプログラムを書いてみようみたいな問題なんだと思います。

  2. while(1)前提でif使って場合分けするということ?

  3. ですね~。
    nakさんの回答の方がずっとスッキリしてていいですけどね。

  4. 後から追加されたコードの、
    一つ目のwhileを抜ける条件「前との距離が10cmまで近づいたら」
    二つ目のwhileを抜ける条件「前との距離が10cmまで近づいたら」が同じため、
    二つ目のwhileは即時に抜けてしまうと思われますが、これは期待する動作なのでしょうか?

いささか案に行き詰まってしまいました。

どのように行き詰りましたか?
「最初このように考えたんだけど、それだとこれがこうなって条件を満たせない」みたいな感じで教えてもらえるとありがたいです。

0Like

Comments

  1. @nama40024

    Questioner

    コードを追加しました。ご回答いただければ嬉しいです

学校の宿題とか研修の課題ですか? であれば、それをこういう場所で丸投げして聞くのはどうかと思いますが、とりあえずそれは置いといて・・・

自分ではどこまでコードが書けていて、どこで躓いていて、何が分かれば解決できるかを、自分が書いたコードを提示して説明してください。

0Like

Comments

  1. @nama40024

    Questioner

    コードを追加しました。ご回答いただければ嬉しいです

  2. 最初の質問にあったコメント、

    //ここでループを実行する。条件が満たせたら次のループ処理へ移行する。
    //ここではaをループ毎ずつ1足していき、10を超えたらこの処理を停止し、次の処理へ移行してください。

    //この下4行で一つのループです。
    //前のループ処理が実行されている間、ここのループは実行しない。
    //前のループが終わり次第、ここのループを実行する。
    //条件が満たせ次第、ループを停止する。
    //ここでの条件は、bをループ毎ずつ1足していき、20を超えたらこの処理を終了してください。

    ・・・に書いてあることを、while(1) で回すのがやりたいことですよね。それと、追加したコードとの内容がまるで違うように見えますけど。一体何がしたいのですか?

  3. @nama40024

    Questioner

    すみません。最初に変な例え話を出したのが悪かったです。

  4. 質問欄を編集して、その旨(最初のコードは無視してほしい旨)追記してください。最初のコードは削除しないで残しておいてください。削除されると質問と回答の話のつじつまが合わなくなって、後でこのスレッドを訪れた人などにとっては訳が分からなくなりますので。

    そして、追加したコードで、何が問題なのか、コードの実行結果が期待とはどう異なるのか、何が分かれば解決できるかなど追記してください。

最初のコードと追加されたコードがまったくの別物ですね、ロボコンのコードかな?
まぁ、それはさておき、

何を聞きたいんですか??

C言語で以下のようなループ処理を実装したいのですが

できてますよ?

案に行き詰まってしまいました。

何に行き詰りましたか?

何か解決策をくださるとありがたいです。

何を解決したいのですか?

0Like

C言語で「ループからの脱出」であれば「break」だと思います。
検索して良さそうなページがありましたので参考にしてください。

C言語入門:break文:Geekなぺーじ

壁待ちループで壁が近づいたらbreakして次のループに入って、また条件が満たされたらbreakして次のループに入ればよいのではないかと思います。

ただし、C言語だとループしている間はそのプロセスは他の処理ができないので、このやり方が使える状況はかなり限定されていると思います。

0Like
#define GET_DISTANCE ev3_ultrasonic_sensor_get_distance(ultraSonic_sensor)

//どちらもグローバル変数です
int find = 1;
int Trace;
int main(void){
     //前との距離が10cmに近づくまで
    while(GET_DISTANCE > 10) { }
    Trace = 1;
	find = 0;
    
    //前との距離が10cmに近づくまで
    while(GET_DISTANCE > 10){
        //色々な処理。中略してあります。
    }
    Trace = 0;
}

中略している処理がどうなってるのかよくわからんから何とも言えんですが、先のループ条件と後のループ条件が同じになってるのが良くない気がします
最初のコードを読んでる感じ、ループ条件は10センチ以内の時と20センチ以内の時じゃないのですか?そもそもの最終目標が知りたいです。

0Like

皆さんありがとうございました。この質問は解決しましたのでクローズします。

0Like

Your answer might help someone💌