1 名前:デフォルトの名無しさん [2012/05/04(金) 04:05:26.52 ] C言語の入門者向け解説スレッドです。 ★前スレ C言語なら俺に聞け(入門編)Part 100 toro.2ch.net/test/read.cgi/tech/1333108892/ ★過去スレ 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++の宿題片付けます 157代目 toro.2ch.net/test/read.cgi/tech/1335517816/ ★C++言語については避けてください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 長くなりそうなコードはcodepadに貼り付けてもいいでしょう codepad.org/ ideone.com/
511 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 12:44:34.07 ] >>510 それだけ提示されても何のことやら。めんどくさいから全部貼れ。 ついでに質問もよく判らん。 まぁ、g_で始まっているからにはグローバル変数とでも言いたいのではないかと思うが。
512 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 12:52:00.02 ] 変数名とタグ名の区別がついてない
513 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 12:57:17.48 ] タグ名はImagesだぞ。目は大丈夫か?
514 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 13:16:51.40 ] 標準ライブラリの質問はココで質問してもいいですか?
515 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 13:54:09.79 ] >>510 構造体はただの鋳型 使うにはそこから変数などの形で実体を作る必要がある たぶんソースのどっかでg_を付けた名前で変数宣言してるだろ? >>514 おk
516 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 15:34:27.50 ] お前らのおかげですっげーお手軽なお遊びゲームできたwwww 数字の1を入力するだけで戦闘できて、しかも自分のHPは減らない、うは面白www これで毎日暇潰せるwww お前ら本当ありがとうwww しんでくる
517 名前:デフォルトの名無しさん [2012/05/18(金) 16:04:56.62 ] argvの内容を4番目以降消して、 (argvの要素数は4以上あるものとする) 後でその領域を使えるようにしたいです。 void main(int argc, char* argv[]) { while (argc>3) argv[--argc]=NULL; } これでは文字列の内容がちゃんと消去されてないし、 指していたメモリが開放されていないと思うのですが、 正しい方法を教えてください。
518 名前:デフォルトの名無しさん [2012/05/18(金) 16:19:08.24 ] 二次元配列を渡す時の仮引数の書き方を教えてください。 二次元配列を渡す時、受ける側はポインタの配列で受けるのでしょうか。 また、二次元配列を渡す時の実引数は、何を渡したらいいのでしょうか。
519 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 16:25:00.64 ] typedef struct{int hairtsu[SIZE][SIZE2];}hairetsu2jigen; void f(hairetsu2jigen a);
520 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 16:31:21.48 ] >>517 汎用性のある手段はない。一般的には、メモリ解放を意識する必要もない。 >>518 配列を渡したいのか配列へのポインタを渡したいのか要素へのポインタを渡したいのかはっきりしろ。 つーか、その辺りが判らないなら具体的にやりたいことを書け。
521 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 16:33:05.66 ] >>517 検索して調べてみた感じだと、 argvがどういうふうに確保されるかは環境依存だから、 freeしようとするのはやめとけって感じでした。 freeしないとしたら空文字列を代入すればいいのかな?
522 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 16:34:56.28 ] >>520 ありがとう。 逆にいうとargvのために確保された領域が 勝手に他から読まれる心配はしなくていいってことですか? セキュリティの観点からも気になるんだけど。
523 名前:デフォルトの名無しさん [2012/05/18(金) 16:37:25.05 ] >>519 それだったら始めからグローバルな二次元配列を書きます >>520 上位の関数で二次元配列を宣言して、下位の関数にアドレスを渡して、下位の関数で二次元配列の処理をしたいのです。
524 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 16:37:46.05 ] >>521 の質問は、 while (argc>3) argv[--argc]=NULL; と while (argc>3) argv[--argc]=""; だったらどっちがまとも? っていう内容です。
525 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 16:48:19.96 ] 519に対してグローバルがどうとか言い出すあたり全然わかってない割合の方が高そうだな
526 名前:デフォルトの名無しさん [2012/05/18(金) 17:00:08.05 ] >>519 さんのやりたいことがわからないのですが。 構造体を返そうとしてるつもりなのでしょうか。 そうだとしたら何故return値がvoidなのでしょう。 Cは値渡ししかできないですよね。 もしそうでないとしても、それなら何故仮引数が構造体を指すポインタじゃないのでしょうか。 構造体はreturn出来るから構造体のメンバーに二次元配列を宣言したのでしょうが、何をしたいのかわかりません。 教えてください>>525 さん
527 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 17:06:44.15 ] 自分の中の理屈で逆切れかます欠陥人格
528 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 17:07:58.93 ] >>526 二次元配列とか、そこらの本見れば書いてあるだろ。 人のミスにつけこむような、つまんない議論やめれ。
529 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 17:10:08.70 ] void f(int a[2][2]); void f(int a[][2]); void f(int (*a)[2]);
530 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 17:11:44.88 ] 「仮引数の書き方」の話が「値を返す書き方」に変わっているような気がする。 自分の無知を棚に上げて挑発的な態度を取っているように見えるのは気のせいか?
531 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 17:13:19.55 ] >>526 >525じゃないけど答えてみる。 >518では「二次元配列を渡す」と書いてあって二次元配列を参照渡しした意図はどこにも書いてない。 従って、値渡ししている>519のやりたいことは自明。 配列を戻すことを考慮する必要がないのだから、戻り値がvoidなのも至極当然。
532 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 17:15:34.50 ] フルボッコw
533 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 17:16:27.80 ] >>524 どっちもまともじゃない。 引き数リストは使用しないのなら放っておけばいい。 「勝手に他から読まれる」のは何を想定しているのか判らないが、 それを心配するなら>524のどちらであろうとも全く無意味だ。
534 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 17:17:21.17 ] >>531 s/参照渡しした意図は/参照渡ししたいとは/
535 名前:デフォルトの名無しさん [2012/05/18(金) 17:25:03.78 ] >>520 さんに指摘されたように、もっとはっきりとやりたいことを書くべきでした。すみません。 本買って勉強してきます。 プログラミングの本と常識の本を。
536 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 17:33:53.77 ] >>535 一転して素直で、今度は人格が心配になる。 まあガンバレ。
537 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 17:41:36.59 ] ふう
538 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 17:53:23.75 ] >>533 argv[1]=argv[3] argv[2]=argv[4] の後に、argv[1]とargv[2]を使った操作 をやるので、argv[3]とかargv[4] をどっかでいじられると困るわけです。 strcpy使えばいいのか?
539 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 17:59:43.92 ] 判らん人だなぁ。何の保証もないコードを幾ら捻っても詮無いだろうに。 関数に渡すために無駄な心配をしているのなら、 オリジナルのargvを渡さずローカルにコピーしたlocalArgVでも渡せばいいだろうよ。
540 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 18:01:49.16 ] いじろうとしてるのはお前だけのような気がするが
541 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 18:09:53.74 ] >>538 勘違いかもしれんが、それだとコピーじゃなくてポインタのすげ替えにしかなってないんじゃね? たしかに危なっかしいな。
542 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 18:15:49.03 ] >>538 誰から守ろうとしてるの? デバッガでアタッチされて改変とかの心配?
543 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 18:20:50.50 ] >>542 mainを起動した本人以外が文字列の内容を読む心配。 argv[3]='\0' したところで、argv[3][1]以降に入ってた文字は残骸としてメモリに残ってるんでしょ? C++だと勝手にデストラクタが発動するからライブラリの責任だけど、 Cだとゼロ埋めとか自分でするの?
544 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 18:23:27.19 ] 543だけど、C初心者なんで、まずは慣習的な方法を教えて欲しいだけなんだ。 うっとうしかったらすまん。
545 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 18:27:59.13 ] んなつまらん事気にするなら main/argvじゃなくてmainCRTstartupをまづ如何にかしようとするべきだな
546 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 18:40:57.46 ] >>545 やっぱC系はわけがわからんな。危ない橋をわたらされてる感が・・・。 嫌味じゃなくて素朴な疑問なんだけど、不安で夜も眠れないとかならないの?
547 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 18:49:20.37 ] argvに書きこみなんてしないのが慣習 自分でゼロ埋めたって、埋める前に読まれたらおしまい プロセスの保護とかOSの話 言語関係ないだろ
548 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 18:55:48.65 ] >>547 ふむふむ、argvに関しては納得。 いろいろ見てたら memset(str,'\0',sizeof(str)) ってのが出てきた。 たしかにゼロ埋めじたいはやるみたいね。
549 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 19:00:06.56 ] strcpyってセキュリティホールの源泉みたいね。 機会があったら使わせてもらうわ(笑)。
550 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 19:09:36.21 ] (馬鹿は)何使っても一緒だから心配すんな
551 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 19:10:40.57 ] argvに入ってるってことはプロセス起動した側も同じものを持っているということ。 受け取り側だけどうこうしても片手落ち。 送り側にも手を入れられるのならコマンドライン引数では渡さない。 受け取り側のプログラム差し替えられたらダダモレでしょ?
552 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 19:20:07.91 ] おまえらってC言語どのくらい出来るの?
553 名前:デフォルトの名無しさん [2012/05/18(金) 19:29:29.24 ] 質問お願いします。 入力された金額に対して、最も少ない紙幣と硬貨の数になるように計算せよ。 という課題に取り組んでいるのですが、なかなかうまくいきません。 現状では以下のようにしているのですが何が間違っているのか分かりません。 アドバイスをいただけたら幸いです。 codepad.org/JVbJI7BZ
554 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 19:40:01.33 ] javascriptでいう var d = new Date(); d.getFullYear(); みたいなオブジェクトとメソッドをピリオドで結んだ形で書くのはどうやって書けますか?
555 名前: ◆QZaw55cn4c mailto:sage [2012/05/18(金) 19:41:08.25 ] >>501 %g がいかなるものか正確無比に把握できているのであれば %g を使用すること、%gの方がわかりやすい結果を出力するという事実に依存はない。 しかし、%g が、あるときは固定小数点表示、あるときは浮動小数点表示に切り替わる、その切り替わりタイミングは正確に記述されているのだろうか? あるいは正確に記述されているとしてパンピーに把握できる内容だろうか? 凡人の私には codepad.org/9vnPdoW3 の結果をあらかじめ予想することは不可能。ましてや自分のコード変更がめぐりめぐってどこぞのコードに影響することなど、把握不可能。 したがって、あるときから素性が比較的わかる %f にしておくのが無難という考え方に組することにしている。 この問題、wsprintf() 等で現実に直面する場合もあると思う。 どこかのだれかがなんの理由かしらないが、すべての実数値に 1e7 をプラスすることにしたために、めぐりめぐって泣ごにょごにょごにょ
556 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 19:41:48.00 ] >>553 プログラミング以前に、中学・高校あたりの数学からやり直したらどうかな。 あなたは、数学的に物事を考える能力が無いよ。
557 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 19:43:06.96 ] >>554 「構造体 ドット演算子」でggる
558 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 19:44:38.77 ] >>554 structのフィールドに関数ポインタぶっこめば可能は可能だけど 結局a.foo(&a);とself/this相当を引数で渡さないといけないアホなことになるw
559 名前: ◆QZaw55cn4c mailto:sage [2012/05/18(金) 19:45:35.32 ] >>517 posix/execv*() 群を使用するとき、「argv を malloc() していいの?malloc() した argv はどうなるの?free() しなくていいの?」とこちらできいたことがある。 答えは、「ほっとけ」。 なぜだろう?
560 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 19:50:02.01 ] >>559 えっ 質問者本人だけど、まだ見てるから回答ヨロ。
561 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 19:59:36.84 ] exec()系は自分自身は存在しなくなるのだからfree()できるわけないじゃん。 malloc()したポインタをexec()する先に引き継げるなら別だけど、普通そんなことしない。 従って、exec()した先のプロセスがお亡くなりになるときにOS側に引き取って貰えばいいよ。
562 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 20:03:20.63 ] >>561 一理あるけど、現代的なプログラミング言語しか触ったことのない俺にとっては、 Cの常識ってお行儀悪いなーって思う。 ただ、それだけ。べつに歯向かおうとは思ってない(笑
563 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 20:07:19.56 ] >>555 そうか? 実に判り易いと思うが。 6桁で丸めた結果が整数なら小数点を省略する。それだけだ。 まさかとは思うが、製品版のアプリにまで適応する話と思ってないだろうな。 製品版なら、値域を厳密に判断してから出力するからそれこそ適材適所だ。 学習目的で実験的に使うと言う前提だからこそ、必ず小数点以下6桁も0が並ぶ方が不自然だろ。 そうそう、極小値で割った結果をそのままsprintf()で%fを使って出力するプログラムがあったよ。 結果は、スタックを食い潰して落ちる最悪なものだったがね。
564 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 20:09:22.40 ] >>562 それはあんたが低レベルの振る舞いに慣れていないからだろ。 システムコールを直接扱おうとしたらその手の問題にはしばしば直面するぞ。
565 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 20:14:02.96 ] >>564 それは自覚している。 ハイレベルのことだけやってて困らない。 だから唯一困るのがargvとかIOまわりなんだよね。 そこでどうしてもCと相互作用しないといかんくて。 これから勉強しようと思うんだ。 ヘネシー・パターソンとか読めばいい?
566 名前: ◆QZaw55cn4c mailto:sage [2012/05/18(金) 20:19:06.93 ] >>563 製品でなくても >値域を厳密に判断してから出力するからそれこそ適材適所だ に深く同意します。
567 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 20:39:05.78 ] >>556 確かに、私は数学が苦手で数学的に考える能力は乏しいです。 おっしゃる通り、プログラミング以前の問題だと思います。 しかし、学校の授業の関係でやらなければならないので困っております。 また、これからもこの課題の考え方が必要になってくると思うので この掲示板に書き込みさせてもらいました。
568 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 20:42:19.30 ] まずはこの板の宿題スレを探しだすんだ
569 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 20:43:54.33 ] 枚数はxを割って求める
570 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 20:45:47.61 ] >>568 ワロタ 「どこですか?」ってきそうw
571 名前: ◆QZaw55cn4c mailto:sage [2012/05/18(金) 20:49:23.26 ] >>563 >極小値で割った結果をそのままsprintf()で%fを使って出力するプログラムがあったよ。 %f といえども大きいほうには無限にひろがるから‥‥
572 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 20:57:46.86 ] 無限に広がるわけないだろ。
573 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 21:01:43.21 ] 事前に値をチェックすることなしに、バッファオーバフローを避けられないのが%fの宿命。
574 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 21:05:16.20 ] いまさらだけど、なんだ、 strcpy(argv[1],argv[3]) って普通にヤバイじゃんw argv[1]=argv[3] でargv[3]を消さずに放置するのが正解だな。 このスレ的にはargvをいじるなボケ、という感じだろうが、許してくれぃ。
575 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 21:05:52.40 ] >>567 ttp://codepad.org/aIaYJhvH
576 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 21:07:19.70 ] 演算を細切れにして都度OF見ればいいだけの話し
577 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 21:08:06.12 ] >>568 宿題スレに丸投げしたら答えだけ分かりそうで、意味は理解できない かなと思ったのでこちらに書きましたが、556さんの言う通り数学的 思考力がないと意味がない気がしてきました・・・。 >>569 ありがとうございます。割り算を使ってこれから試行錯誤してみます。
578 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 21:09:40.37 ] しかし、つくづく2000円札って影薄いな。
579 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 21:28:30.62 ] >>578 誤爆かと思ったら553からかw
580 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 21:43:54.34 ] ゲームボーイアドバンスのゲームをC言語で作りたいと思うのですが 一般のC言語入門の本を読んでも全くわかりません。 何を学べばいいですか。
581 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 21:46:15.52 ] gbspec.txt
582 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 21:58:35.09 ] 僕らのゲームボーイとかいう本が出てるからそれ買え 組み込み系の良い教材になるよ
583 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 22:16:22.63 ] >>582 その本は持ってますが、入門書とその本とのギャップが大きすぎてサッパリ。 その間のギャップを埋めるにはどうしたらいいでしょうか。
584 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 22:33:17.86 ] 割り込みとかレジスタを叩くあたりは組み込み系の入門書を読まないと分からないかもしれないな リンカとかローダあたりの知識もあったほうがいいなそれはエキスパートCプログラミングあたりに書いてあった気がする グラフィック処理はインデックスカラー形式だからそれはファミコンのプログラミングとか調べたら分かるかもしれない あとはネット上でサンプルコードを漁ったり試行錯誤するといいんじゃね
585 名前:デフォルトの名無しさん [2012/05/18(金) 23:23:46.91 ] 思うんだが、ネットってプログラミングの知識ですら書籍に適わないよな。 ネットは浅く広過ぎ。
586 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 23:26:07.87 ] ソレは >>585 自身が語録不足だからだと思うよ
587 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 23:27:10.64 ] ひょっとして語彙のことか?
588 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 23:27:36.54 ] 語彙
589 名前:デフォルトの名無しさん [2012/05/18(金) 23:32:07.93 ] >>586 体系的に教えているサイトは浅い。 深い事載せてるサイトは、単にユーザーが気になって 実験してみました的な事。 定説的に深い事言ってるサイトって無い。
590 名前:デフォルトの名無しさん [2012/05/18(金) 23:35:28.31 ] 定説的ってなんだ。
591 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 23:40:54.52 ] 詳しい事ほどヒットしないからな だいたいネットに情報載せたら本売れなくなるじゃん。 専門的な事や創造的な事はネットに書くわけ無い。
592 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 23:41:09.11 ] >>587-588 は586の指摘に痛みを感じた者供
593 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 23:41:41.00 ] 質問がないなら帰ってくれないか
594 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 23:44:00.07 ] 語録ww
595 名前:デフォルトの名無しさん [2012/05/18(金) 23:49:57.57 ] アホスwww
596 名前: ◆QZaw55cn4c mailto:sage [2012/05/18(金) 23:59:39.36 ] 末尾再帰について教えてください。 宿題スレにて、toro.2ch.net/test/read.cgi/tech/1335517816/497 が末尾再帰でないとの指摘があり、いろいろと考えていました。 思うに、toro.2ch.net/test/read.cgi/tech/1335517816/505 を理由に末尾再帰でない、ということになれば、よくある階乗の再帰関数 int f(int n) { return (n == 0) ? 1 : n * f(n - 1); } ですら末尾再帰ではないことになるのでしょうか? 末尾再帰であるために int f(int n, int i, int p) { return (n == i) ? p : f(n, i + 1, p * (i + 1)); } codepad.org/OSvQa0ni と書かねばならないのでしょうか? 主観的な表現になりますが、なんだかつまらなくなってしまいました。 コメントをいただけるとうれしいです。よろしくお願いいたします。
597 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 00:30:30.91 ] >>584 組み込み系の専門書読んだけど10pくらいで挫折した。 もっと分かりやすく書いて欲しいな。
598 名前:デフォルトの名無しさん [2012/05/19(土) 00:35:48.28 ] >>596 アホスwww
599 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 00:44:08.10 ] なんで末尾再帰を区別するのか、理由すら考えたことがないんだろうね。
600 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 03:22:05.75 ] >>596 >int f(int n) { >return (n == 0) ? 1 : n * f(n - 1); >} > >ですら末尾再帰ではないことになるのでしょうか? 末尾再帰では有りません。 「ループに変換可能か」と言うより 「ジャンプ最適化可能か」です。 なお、c言語では末尾再帰最適化を行わない処理系も多いので、 処理系依存度を下げたいなら、末尾再帰に拘る必要は有りません。 >末尾再帰であるために > >int f(int n, int i, int p) { >return (n == i) ? p : f(n, i + 1, p * (i + 1)); >} >codepad.org/OSvQa0ni >と書かねばならないのでしょうか? Yes。 ただしgccなどの一部の処理系では上記部分を関数内関数で書けるので、 呼び出し側からはint f(int n)で済ませることが出来ます。
601 名前: ◆QZaw55cn4c mailto:sage [2012/05/19(土) 06:39:29.09 ] >>600 >「ループに変換可能か」と言うより「ジャンプ最適化可能か」です。 call A end A: ... ret ... call A ret ならば A: ... ret .... jmp A になるということですか。昔、せこいことに call A / A: ... call B ret / B: ..... call C ret / C: ... ret を call A / A .. jmpB / B: ... jmp C / C: ... ret にしていた、というやつですね。 もう少し考えて見ます。コメントありがとうございました。
602 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 08:28:12.59 ] a
603 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 08:55:21.96 ] >>556 >>553 は日本語もやり直した方が良いひとだろ。 質問をお願いしますとか…
604 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 08:56:32.25 ] >>580 まずは任天堂と開発者ライセンスの契約を結ぶところからかなー
605 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 09:25:04.60 ] >>601 Schemeの継続の考え方が参考になると思う。
606 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 09:39:58.58 ] >>584 ありがとうございました。 ただそういった知識を身に付けても、例えばDSだったりPSPだったり 対象が変わるとまたARM9とかMIPSとか調べないといけないですよね? C言語というのは文法とか構文みたいなのは同じでもそういう ハードウェアの知識が必要なのですか?
607 名前: ◆QZaw55cn4c mailto:sage [2012/05/19(土) 09:40:51.15 ] >>605 コメントありがとうございます。
608 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 09:47:21.70 ] ハードウェアの知識がまったく必要とされない分野で Cを使うのはあまりにも生産効率が悪すぎる。
609 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 09:52:41.35 ] >>606 C言語自体は本当に言語としての土台の部分しか規定してない その土台の上に何が乗っかるかで学ぶべきことが変わるなんてザラよ とは言え、その土台がしっかり出来てりゃ乗っかるモノが変わっても対応しやすいけどね
610 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 09:53:53.23 ] 外人が作った開発環境があったような気がするけど それの使い方調べればハードのこと考えなくても作れた気がするけど
611 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 10:33:52.66 ] #include<stdio.h> int main(void) { char h1[4][3] = {"あ","い","あ","い"}; char h2[2][3] = {"い","あ"}; int a=2,b=1; if(h1[a]==h2[b]){ printf("成功! [%s],[%s]",h1[a],h2[b]);} else{ printf("失敗! [%s],[%s]",h1[a],h2[b]);} return 0; } 配列使って文字の比較やりたいんだけど エラーはでないものの「あ」「あ」の組み合わせでも 「失敗!」になってしまって困ってます。 配列使っての文字の比較ってどうすればいいでしょうか?