1 名前:デフォルトの名無しさん [2013/04/22(月) 04:47:19.70 ] C言語の入門者向け解説スレッドです。 ★前スレ C言語なら俺に聞け(入門編)Part 113 toro.2ch.net/test/read.cgi/tech/1362824689/ ★過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000 ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 164代目 toro.2ch.net/test/read.cgi/tech/1364700745/ ★C++言語については避けてください。C++対応明記スレへどうぞ。 ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。 # サイズが大きい場合はアップローダ等を利用してください。 codepad.org/ ideone.com/ ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
159 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 15:03:38.86 ] 再帰なんか滅多に使わない 見にくくなるしアルゴリズムの練習くらいでしか使わねーよ
160 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 15:05:41.52 ] void narabe(char *d, int n) { int i, j, len = strlen(d); char c; if (n <= 1) { kekka_shori(d); return; } for (j = 0; j < n; j++) { narabe(d, n - 1); c = d[len - n]; for (i = 0; i < n - 1; i++) d[len - n + i] = d[len - n + i + 1]; d[len - n + i] = c; } } ここなんだけど 一直線じゃないなforでn回呼び出してる。 どういうこと?
161 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 15:09:17.57 ] >>159 木構造扱う場合に普通に使うだろ サブフォルダ全検索とかツリービューとか
162 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 15:13:31.47 ] ポインタより再帰のほうがよっぽど躓くよね
163 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 15:15:41.97 ] 再帰なんて簡単だよ したい処理が自分自身なら自分自身を使えばいいだけの話
164 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 15:35:31.13 ] フォルダ全部舐めたい場合とか 再帰じゃないとめんどくさくね
165 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 15:58:32.70 ] >>164 だな
166 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 16:38:25.53 ] 再帰は下手をするとスタックを食いつぶす 再帰の深さが決まってるとか、知って使っているならよいが と、組み込みのみの感覚ですかね
167 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 16:52:47.81 ] 製品ではありえん
168 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 17:18:06.56 ] >>166 だな
169 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 17:23:13.63 ] 実装に使うことはあまり無いけど、アルゴリズムの設計時検証とかには良く使うかな。 後は、ディレクトリ構成された複数のファイルに何かしらの機械処理を施すような捨てプログラムとか。 perlとかjavascriptとかで。
170 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 18:50:14.32 ] 再帰も扱えないプログラマって……
171 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 19:09:00.68 ] >>166 ナイーブな再帰を組込みで使うのは確かに贅沢。 尤も、再帰が必要かもという複雑度なら継続相当の実装が吉。 オフィス系業務プログラムなら、PCのメモリに余裕あるから、よほど酷いコーディングでなければ再帰もあり。 ハイパフォーマンス向けなら、コンパイラを選べば再帰レベルは気にしなくていい。 実際は、再帰に展開されるか否か以外の問題の方が大きい。
172 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 19:43:56.09 ] 再帰は終了条件とか最大ネスト回数とか考えないといけないから あんまり使いたくはないけどね。
173 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 19:53:50.41 ] まあ明らかに深くなる場合は 非再帰化するけどね
174 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 20:05:52.83 ] そうそう。 再帰を使うのは、パパっと組むのにその方が簡単だから。 それを製品とかに使うかどうかはまた別の話。
175 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 21:46:14.61 ] むしろ再起って簡単なのよね ループのがよほど難しいけど、ループのが効率的だからループが使われるのであって 難しいってのが実は最大の勘違い、多分慣れの問題でしかない
176 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 21:52:59.01 ] 基本的にスタックを自分で用意するだけだから 非再帰化もそう難しいわけじゃない ただ美しくない
177 名前:デフォルトの名無しさん [2013/04/27(土) 22:04:04.16 ] 再帰よく分かりませんね昨日の者です。 void abc(int n) { @ abc(n-1); A } x番目に格納されてるabc関数の@とAの場所でnの値が変わったりする事 ありますかね?
178 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 22:15:10.80 ] @とAで変えたりnのアドレスをグローバルに置いて他で無理矢理変えたりしない限り変わらない
179 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 22:18:35.56 ] >>175 再起
180 名前:デフォルトの名無しさん [2013/04/27(土) 22:31:09.89 ] >>178 abcを呼び出したことによって@とAで変わってることってなんなんですか? これが理解できません。
181 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 22:37:01.89 ] >>180 その関数ではあまり意味がないよ まずは簡単な階乗計算とかを見た方が良いと思うよ
182 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 23:06:11.23 ] >>180 printfとかしてりゃ出力内容は変わるわな そういう事してなけりゃ何も変わらない 再帰関数で戻り値の型がvoidなのは そういう副作用を伴う場合しか意味が無い 階乗を求める関数を考えてみる unsigned int factorial(unsigned int n) { if (n <= 1) { return 1; } else { unsigned int tmp = factorial(n - 1); return n * tmp; } } factorial の再帰の前後で何か状態が変わるかと言うと、全く変わらない 状態は変わらないけど、新たに戻り値が得られる 戻り値は関数への引数が変われば異なる値になる この関数は数式の 0! = 1 1! = 1 n! = n * (n-1)! を素直にそのまま関数にしたもの 数式が理解できるならCのコードも理解できなければおかしい事に気付くこと
183 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 23:33:01.02 ] >>171 組み込みで再帰は基本禁忌
184 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 23:39:11.08 ] スタックが128バイトしかないとかザラだしな
185 名前:デフォルトの名無しさん mailto:sage [2013/04/27(土) 23:59:21.68 ] 組み込みって一言で言っても広いから何とも言えない 豪勢な環境もあるし
186 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 00:57:12.79 ] 何ぼ豪勢でも、再帰と動的メモリ確保はダメだ 理由は組み込みだから、としか言えないが
187 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 01:06:04.89 ] >>183 まあ確かに入門書にはそう書いてあるな。
188 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 01:13:24.62 ] 組込みにかぎらず、C用コンパイラは、末尾再帰最適化できないものが未だ多いから要注意だな。
189 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 01:54:27.30 ] 末尾再帰なんてどうでもいいだろ
190 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 01:55:58.87 ] 単純なループに直せるものを再帰の例としてあげるアホが多過ぎ
191 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 02:44:57.59 ] 66C33 (二項係数) = 0x64308FE91AE4E60C をunsigned long longで正確に計算する方法を教えて下さい
192 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 03:40:39.80 ] 順列(空の集合)=空 順列(集合)=集合の各要素(但し同じ物は除く)と順列(残りの集合)
193 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 09:36:58.26 ] 一桁ごとに配列に入れて繰り上げ繰り下げを手動で行う
194 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 09:40:51.45 ] >>191 多倍長演算ライブラリ使え 結果がunsigned long longに収まっているなら、正確にもとまる。
195 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 10:16:18.38 ] >>191 #include <stdio.h> long long gcd(long long a, long long b){ long long c; while((c=a%b)) a=b, b=c; return b; } void cdiv(long long *a, long long *b){ long long t; t=gcd(*a, *b); *a/=t; *b/=t; } long long nCr(int n, int r){ long long u=1, l=1, mu, ml, i; for(i=1;i<=r;i++){ mu=n-(i-1); ml=i; cdiv(&u, &ml); cdiv(&l, &mu); u*=mu; l*=ml; cdiv(&u, &l); } return u; } int main(void){ printf("%I64X\n", nCr(66, 33)); return 0; }
196 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 10:20:39.77 ] >>195 訂正 long long nCr(int n, int r){ long long u=1, mu, ml, i; for(i=1;i<=r;i++){ mu=n-(i-1); ml=i; cdiv(&mu, &ml); cdiv(&u, &ml); u*=mu; } return u; }
197 名前: ◆QZaw55cn4c mailto:sage [2013/04/28(日) 11:49:21.84 ] >>155 大丈夫 あるとき回路が通じて、それ以降は再帰で**しか**書けない体に変身します‥‥多分幸せになれると思います、いやしあわせになれるかな、なれるかもしれない、なれるかどうかわからないけれどもふしあわせじゃないとおもいこめることはたしかだ、たしかか?
198 名前: ◆QZaw55cn4c mailto:sage [2013/04/28(日) 11:52:26.96 ] >>186 ダイナミックに確保も禁忌、というのは、ある意味すごいですね。確かに安産性は向上するような気がしますけれども。 アマチュアには想像すらできない世界なんでしょうね
199 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 11:57:02.08 ] 無職の癖にアマチュア批判とは片腹痛い
200 名前: ◆QZaw55cn4c mailto:sage [2013/04/28(日) 12:01:10.32 ] >>199 ×片腹痛し ○傍痛し
201 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 12:05:59.27 ] どっちでもいいんだよカス プログラムだけでなくて国語まで出来ないのか
202 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 12:07:00.02 ] 人の揚げ足取って喜ぶとか小姑みたいな意地悪さ しかも揚げ足取りになってなくて墓穴を掘ってるし
203 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 12:18:27.56 ] >>201-202 ×片腹痛し ○傍痛し 言葉の意味を十分にappreciateしてないからこんな間違いをする
204 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 12:20:09.02 ] あちこち荒らすな まとめて隔離スレへ引っ込め
205 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 12:34:46.80 ] >>203 だからどっちでも同じ意味なんだって 日本語分からない?
206 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 12:43:46.35 ] >>204 ごめん
207 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 12:45:27.14 ] >>205 通例がそうだから、という理由だけで先人の間違いを無批判にそのまま踏襲してしかもそのことに無自覚‥‥
208 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 13:04:37.01 ] >>207 早く生まれたからと言って無条件に尊敬してもらえると思ってる馬鹿? 通例がそうだからそれでいいじゃん 頭大丈夫?なわけないか 精神科行ってるんだもんな
209 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 13:32:46.19 ] 日本語をまともに理解できないクズがこういう揚げ足取りに必死なのを見ると笑える
210 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 14:04:09.94 ] >>209 だから精神科行って薬飲んでるんじゃね?
211 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 15:41:08.48 ] カスとかクズとかゴミとか連呼してるレスを追っていくと 毎回同じことしか書いてなくて面白いよね。
212 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 15:45:40.99 ] >>211 そりゃあ頭が悪いボキャブラリーが少ない同一人物が書いてるからだろう
213 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 15:50:35.67 ] 同じ人間を罵るのに違うこと書いてたらおかしいだろ
214 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 16:11:55.35 ] Qが精神攻撃に反撃しようとするなら、Q自身も精神医学を勉強しなければならないが、 そうなると勉強の途中で自分自身に大きな精神の歪みがある事を嫌でも自覚せざるを 得ない時期が訪れる それを乗り越えて初めて精神医学が身に付くのだが、恐らくQには無理で、途中で 逃げ出すだろう事が火を見るより明らかだ
215 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 16:18:16.01 ] 次のようなコードがあったのですが、この2行目って要りますか? if (!msg) return -1; if (!(msg[0])) return -1;
216 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 16:20:07.71 ] >>215 要る
217 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 16:24:14.65 ] >>216 ありがとうございます
218 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 16:38:34.94 ] これが思考停止か
219 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 17:46:13.21 ] >>215 msgがポインタか配列かわからないのでどちらでも対応可能にする。 1行目はmsgがNULLポインタだったら-1を返す。 2行目はmsgが仮に配列であっても要素0の値が0なら-1を返す。
220 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 18:50:57.03 ] しかし後の祭りである
221 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 20:50:01.43 ] >>219 なるほど、解説ありがとうございました。
222 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 23:13:52.48 ] >>215 1行目いらなくね?
223 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 23:16:52.33 ] >>186 ん?組み込みはスタックサイズ小さいからメモリ確保は、基本ヒープをつかうときいたことがあるのだけど勘違いか? 昔のcomを作るイメージ
224 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 23:17:07.31 ] >>222 msg == NULL だと二行目で落ちる
225 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 23:18:22.51 ] >>223 いやいやヒープとスタックが衝突するのが怖い(そしてこれを厳密に回避することは困難だ)からヒープすら使わずにべったりstaticなのでは?
226 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 23:32:42.68 ] >>224 msg[0] != 0だったら、msg==NULLってあり得ないかと >>223 基本ヒープ使っちゃダメだよ 昔のメモリ事情だとどうだったんだろうか
227 名前:デフォルトの名無しさん mailto:sage [2013/04/28(日) 23:56:06.84 ] ヒープでもスタックでもなくデータセグメント(セクション)って組み込み怖いなー
228 名前:デフォルトの名無しさん mailto:sage [2013/04/29(月) 00:16:49.37 ] >>226 NULL番地のデータが0でないのがあり得るあり得ないの問題じゃなくて NULL番地のデータを読み出そうとした時点でOSに落とされるからチェックが要るのよ
229 名前:デフォルトの名無しさん mailto:sage [2013/04/29(月) 00:24:21.72 ] >>226 パンツ脱ぐのとうんこ出すのと 順序間違えると大変なことに
230 名前:デフォルトの名無しさん mailto:sage [2013/04/29(月) 01:12:09.61 ] >>228-229 ああ、そういうことね 組み込みだと普通に0番地使うから、分からんかったわ
231 名前:デフォルトの名無しさん mailto:sage [2013/04/29(月) 02:04:05.88 ] >>228 問題のコードではmsgがNULLポインタだったらリターンしてしまうから 2行目が実行されることはあり得ない。
232 名前:デフォルトの名無しさん mailto:sage [2013/04/29(月) 02:44:38.79 ] >>231 msgがchar配列、ポインタが32bitの場合で、msg[0]==0でmsg[1]〜[3]のどれかに0以外が入ってるなら2行目行くんじゃね
233 名前:デフォルトの名無しさん mailto:sage [2013/04/29(月) 07:59:37.32 ] >>231 その問題のコードの1行目が要らなくねってレスがあったから説明したんよ
234 名前:デフォルトの名無しさん mailto:sage [2013/04/29(月) 12:47:06.15 ] >>225-226 ヒープ使っちゃいけなかったのか。 覚えとく、ありがとう
235 名前:デフォルトの名無しさん mailto:sage [2013/04/29(月) 20:52:06.60 ] >>234 ばっかみたいw
236 名前:デフォルトの名無しさん mailto:sage [2013/04/30(火) 08:37:47.67 ] 組み込みってもOSレスからLinuxみたいなものまであるわけで
237 名前:デフォルトの名無しさん mailto:sage [2013/04/30(火) 20:06:32.53 ] 死ねゴミw
238 名前:デフォルトの名無しさん mailto:sage [2013/04/30(火) 21:00:28.73 ] >>236 いきなりわけわかんないレスをするな
239 名前:デフォルトの名無しさん [2013/05/01(水) 03:30:10.77 ] うるさいゴミ
240 名前:デフォルトの名無しさん [2013/05/01(水) 13:09:29.46 ] a=f(x)+g(y); これって、f(x)とg(y)のどっちが先に実行されるかって 仕様で決まってたっけ? それとも不定?
241 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 13:18:02.56 ] 不定です
242 名前:デフォルトの名無しさん [2013/05/01(水) 14:53:33.39 ] >>240 は馬鹿だから間に受けるぞw
243 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 14:54:27.12 ] 現在このスレは閑散としてるがQZがいつ自演質問を再開させるか分からない状態 ここ最近このスレで不正に宿題と思わしき質問が投下されたので注意が必要 監視を続ける
244 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 14:58:04.04 ] >>240 >>241 にはこのコピペが最適↓ ネットでののQ&A見たら、何も勉強してこなかった 日本人の絶望的なほど劣悪なレベルを見せ付けられる想いだ。 質問者の意図も理解できないし、理解する姿勢に欠ける。 自分で確かめもしないで、思いつきで断片だけを回答する。 質問者も自分で解決したら、なにも示さず解決したという コメントで終了する。 甘やかされて低脳さを遺憾なく発揮している。もう理系も絶望 的だから文系はどうかと思へば、悲惨のひとことだ。 もう日本の大学を折りたためよ文部省。 こういう自分でプログラミング言語を開発する極一部の有能な若者が、 浮いてただ利用されるだけで本当に気の毒だね。
245 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 15:30:02.88 ] C言語でレジストリのeipやebp等の動きを表示したいのですが どうやってみればいいでしょう? gcc -S test.cだとアセンブラソースが作られてみれるんですがソースだけで肝心のトレース部分をみることができません eipやebpやスタックの動きを見れるやり方教えてください Windows7です
246 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 15:36:57.37 ] >>245 >教えてください 情報に見あった金額が提示されてないのに誰が答えるの?
247 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 15:52:40.25 ] >>245 Eclipse CDT入れろ デバッガで見れる >>246 カス
248 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2013/05/01(水) 15:53:37.24 ] インラインアセンブラを使うのが簡単かなぁ。 インラインアセンブラで書いても gcc は最適化しちゃうんで、 最適化をオフにするか volatile 指定を付けるのが楽。 プログラム的に必要っていうのではなく、挙動を観察したいという場合ならデバッガを使った方がいいと思う。 gcc と連携しやすいデバッガと言えば gdb だけど Windows なら OllyDBG か Immunity Debugger が人気。
249 名前:245 mailto:sage [2013/05/01(水) 16:07:48.38 ] >>247 わざわざElipseなんていらねーよバカが死ね >>248 やっぱりgdbですか インラインアセンブラはダサいのでデバッガのほうにしてみます
250 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 16:09:44.62 ] >C言語でレジストリのeipやebp等の動きを表示したいのですが レジスタ と読んでの前提 まさかデバッガを作りたい って話じゃないよな?
251 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 16:14:41.28 ] >>247 =基地害
252 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 16:34:30.42 ] QZ急速な勢いで自演レス
253 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 17:28:19.21 ] >>247 が馬鹿の見本みたいで笑えるw いや、馬鹿すぎて笑えないレベル
254 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 18:50:20.97 ] 結局入門書どれがいいんでつか? 高いから数買えないんです。・°°・(>_<)・°°・。
255 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 19:00:49.86 ] eipとebpを見たんですが leaveっていう命令でてこずってます leaveって mov esp,ebp pop ebp これと等価らしいんですが gdbでトレースしてleaveをsiで実行してespを見たけどebpの値になりません ebp=0xbffff4e8 esp=0xbffff4b8 leaveをやったら espはebpの0xbffff4e8になるはずですが espは0xbffff4ecになります 何故ですか?教えてください
256 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 19:14:02.44 ] enter/leaveなんて誰も使わないから忘れてよろしい 遅いだけ
257 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 19:16:31.23 ] popしてるからだろ
258 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 19:17:59.00 ] >>257 popする前に代入してますよね?バカ?
259 名前:デフォルトの名無しさん mailto:sage [2013/05/01(水) 19:21:15.43 ] 中身の分からないバイナリファイルの中身を調べて型に合った変数に代入ことはできるのでしょうか?