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

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

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

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

Q&A

解決済

1回答

2301閲覧

【C言語】ぷよぷよ 再帰関数

ringo08

総合スコア8

C

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

0グッド

0クリップ

投稿2018/07/11 17:06

編集2018/07/11 18:33

再帰関数で、連結したぷよの数、ぷよの削除を行っています。

現在、浮いているぷよを落下させることはできましたが、
消そうとした時に画面が落ち、エラーメッセージが出ます。

再帰ではなく末端再帰もしくは、ループ文にした方が良いでしょうか?

またもし末端再帰、ループ文の方が良いというとき
そのコツもしくは手順を教えてください。

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

Segmentation fault: 11

再帰関数のソースコード

コード void Count(int x, int y, int *n){ // ぷよの数を判定するための再帰関数 int c = puyomath[x][y]; // 自分の色 puyomath[x][y]=0; (*n)++; if(x+1<FIELD_W && puyomath[x+1][y]==c) { Count(x+1, y, n); } if(y+1<FIELD_H && puyomath[x][y+1]==c) { Count(x, y+1, n); } if(x-1>=0 && puyomath[x-1][y]==c) { Count(x-1, y, n); } if(y-1>=0 && puyomath[x][y-1]==c) { Count(x, y-1, n); } puyomath[x][y]=c; } void Vanish(int x,int y){ // ぷよを消すための再帰関数 int c = puyomath[x][y]; // 自分の色 puyomath[x][y]=0; HgLClear(field_layer[x][y]); if(x+1<FIELD_W && puyomath[x+1][y]==c) { Vanish(x+1, y); } if(y+1<FIELD_H && puyomath[x][y+1]==c) { Vanish(x, y+1); } if(x-1>=0 && puyomath[x-1][y]==c) { Vanish(x-1, y); } if(y-1>=0 && puyomath[x][y-1]==c) { Vanish(x, y-1); } }
C言語

補足情報 Xcode、Handy Graphicを使用しています

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

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

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

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

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

yumetodo

2018/07/11 17:39

プログラムのコードはMarkdownのコードブロックの記法で記述してください。読めません
ringo08

2018/07/11 18:34

すみません、先ほど修正しました。
guest

回答1

0

ベストアンサー

そもそも再帰の終了条件が見当たらないのですが・・・。

だから配列のbuffer overrunが起こってセグフォッてるのでは?

投稿2018/07/11 17:37

編集2018/07/11 17:38
yumetodo

総合スコア5850

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

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

ringo08

2018/07/11 18:35

終了条件をどこにどういう風に入れるべきでしょうか?
yumetodo

2018/07/11 18:49 編集

それはおかしな質問で、繰り返しには終了条件が必ず伴います。あなたがどのようなプログラムを書きたいのか、それで自ずから決まります。 すくなくとも配列にアクセスするためのindex変数であるx,yについては、配列の要素数を踏まえて範囲外に行かないように終了条件に付け加える必要があります。 それ以外に条件が必要かはあなたが何を書きたいか次第。
ringo08

2018/07/11 18:50

条件としては、配列の要素を超えると終了というような条件でいいでしょうか? 再帰を終了させるには、何を入力すれば終了するかわかりますか?
yumetodo

2018/07/11 18:55

あああ、どうも回答中の脳みそが眠っているようだ・・・。失礼。いずれのifにも引っかからなければ再帰から脱出してますね、落ち着けや、回答時の私。 関数の冒頭、真っ先にindexの範囲確認を行うべきですね。
ringo08

2018/07/11 19:03

関数の冒頭に、範囲確認を入れることでセグフォがなくなりました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問