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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

8回答

4838閲覧

C++で処理を戻したいです。再帰ではなく。

akaka2

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

0クリップ

投稿2018/11/16 04:40

前提・実現したいこと

C++で関数の中に関数を呼び出したいです。

例えば下のようなプログラムがあるとします。
変数aが定義していないとか色々突っ込みたい部分があると思いますが、簡潔に書いてあります。
test1の文でif(b == INT_MAX)になったらtest1の最初に戻る文を書きたいのですが、
どのようにすればよいでしょうか。

if(b == INT_MAX){
test
}
みたいな再帰にしてしまっては、ifの中のtest1が終わったらifの次の文からスタートしてしまうのですよね。
それは困ります。
ifに当てはまったらvoid test1に戻ってほしいです。
どのような書き方をすればいいですか。

お願いします。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

void test1
{
・・・・・・・・・
・・・・・・・・
・・・・・・・・・
if(b == INT_MAX){
tes1に戻るようにしたい。
}
・・・・・・
・・・・・
}

void test2
{
・・・・・
・・・・・
}

int main(void)
do {
test1;
test2;
}while(a == 1);

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

cateye

2018/11/16 07:26 編集

>test1の最初に戻る・・・は、関数の頭(スタックも何も初期状態)でしょうか? それとも関数の先頭(test1の1行目)ですか?
guest

回答8

0

処理全体をループ構造にしてcontinueでしょうか。

c

1while(1){ 2 ・・・・・・・・・ 3 ・・・・・・・・ 4 ・・・・・・・・・ 5 if(b == INT_MAX){ 6 continue; 7 } 8 ・・・・・・ 9 ・・・・・ 10 break; 11}

そもそも関数の途中で関数の先頭に戻すという処理構造はあまり良い作りとは思えません。
本当にそういう作りをする必要があるのか、検討してみたほうがよいかと思います。

投稿2018/11/16 05:16

ttyp03

総合スコア16998

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

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

0

イレギュラーな制御をしたいのなら、gotoも1つの選択肢です。

投稿2018/11/16 05:11

maisumakun

総合スコア145184

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

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

0

ベストアンサー

他の回答者とかぶりますが、

C

1do { 2 // 処理1 3 // 処理2 4 // 処理3 5} while(b == INT_MAX);

または

C

1label: 2 // 処理1 3 // 処理2 4 // 処理3 5 6 if (b == INT_MAX) goto label; 7

です

投稿2018/11/17 15:27

ai_2013_dev

総合スコア338

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

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

0

せいぜい数回しか発生しないのならば
あえて再帰という手もあります。

c++

1if(b == INT_MAX){ 2 test1(); 3 return; 4}

投稿2018/11/16 07:08

asm

総合スコア15147

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

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

0

あれやこれやあるのはおいといて。

test1()の戻り値に処理を継続するか返すようにして
ループの中ではtest1()の戻り値を見て継続しない場合は
continue;してしまえばいいんではないでしょうか。

投稿2018/11/16 04:47

kopio

総合スコア487

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

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

0

再帰的呼び出しでも、
if(b == INT_MAX){
test();
return;
}
とreturn;を付ければif文の次に制御は移りません。
ただ、スタックを無駄に浪費する可能性はあります。
やりたいことがよくわからないのですが、そのようなことをするとしたら、もっと見通しの良い設計がないか考え直すことも必用かと思います。

投稿2018/12/18 18:24

myoon

総合スコア100

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

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

0

gotoで簡単に実現可能です。
条件とかは変えていませんので、判定が正しいかどうかはご自身で判断ください。

cpp

1void Test1( Context *pC ) 2{ 3reset: 4 std::cout << "Test1" << std::endl; 5 if( !(rand() % 5) ){ pC->B = 0; } //※(仮)いつか終わるように 6 7 if( pC->B == INT_MAX ) 8 { 9 pC->pNextWork = Test1; 10 goto reset; 11 } 12 13 pC->pNextWork = Test2; 14}

投稿2018/11/16 05:52

moonphase

総合スコア6621

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

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

0

void Test1() { do { ... } while( b == INT_MAX ); ... }

都度Test1()から抜けたいなら,どこかに情報を覚えておいて,Test1()を呼び出す側で分岐するとかで.

//情報 struct Context { int B; void (*pNextWork)( Context* ); }; // void Test2( Context *pC ) { std::cout << "Test2" << std::endl; pC->pNextWork = nullptr; } // void Test1( Context *pC ) { std::cout << "Test1" << std::endl; if( !(rand() % 5) ){ pC->B = 0; } //※(仮)いつか終わるように if( pC->B == INT_MAX ) { pC->pNextWork = Test1; return; } pC->pNextWork = Test2; } // int main(void) { Context Ctxt; Ctxt.B = INT_MAX; Ctxt.pNextWork = Test1; while( Ctxt.pNextWork ) { Ctxt.pNextWork( &Ctxt ); } return 0; }

投稿2018/11/16 05:19

編集2018/11/16 05:39
fana

総合スコア11658

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問