[過去ログ]
C言語なら俺に聞け 151 (1002レス)
C言語なら俺に聞け 151 http://mevius.5ch.net/test/read.cgi/tech/1554171817/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
387: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 08:54:51.63 ID:3EWrT4Pn0 >>378 それは無駄な代入が発生するでしょう? http://mevius.5ch.net/test/read.cgi/tech/1554171817/387
388: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 09:01:10.92 ID:3EWrT4Pn0 >>380 余裕で三重ポインタなどほいほいと使いますよ https://mevius.5ch.net/test/read.cgi/tech/1434079972/26 void prep_exe(char *sttp, char **path, char ***argv) char **argv を使うことが理解できるのだったら「argv のアドレスを渡す」みたいな場合に渡された関数側では三重ポインタを使うことになるでしょう http://mevius.5ch.net/test/read.cgi/tech/1554171817/388
390: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 09:08:14.08 ID:3EWrT4Pn0 >>389 無論使いさえすればいい、というわけではなく、この例では小さなシェルを実装しており、シェルのパイプ機能を実装するのに三重ポインタを使ったのです http://mevius.5ch.net/test/read.cgi/tech/1554171817/390
392: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 09:47:47.39 ID:3EWrT4Pn0 >>391 代入命令が増えるという意味ではなく、「同じ値」なのに代入してしまう、という作業が >>378「戻り値でポインタを返」す方式の書き方だと不可避です http://mevius.5ch.net/test/read.cgi/tech/1554171817/392
395: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 10:29:23.05 ID:3EWrT4Pn0 >>393 前者 >ptr = func1(ptr, opt); は初心者用で、>>392 のいう無駄な代入が含まれています、二重ポインタがわかるのなら後者にするべきです http://mevius.5ch.net/test/read.cgi/tech/1554171817/395
396: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 10:30:14.08 ID:3EWrT4Pn0 >>394 シンプルな記述ができるのに、わざと複雑な書き方にするのは問題なのでは? http://mevius.5ch.net/test/read.cgi/tech/1554171817/396
398: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 10:33:46.84 ID:3EWrT4Pn0 >>397 その場合無駄な代入が発生しますね、>>393 がいい例を示しています http://mevius.5ch.net/test/read.cgi/tech/1554171817/398
403: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 11:25:51.36 ID:3EWrT4Pn0 >>400 ちがいます 代入するのか代入しないのかは malloc() したかしなかったかにかかっています。 代入は malloc() したとききだけにすればよく それが >>393 の func2(&ptr, opt); の書き方 一方 >>393 ptr = func1(ptr, opt); は malloc() したかしないかにかかわらず代入を行います、これは無駄な代入を含みます http://mevius.5ch.net/test/read.cgi/tech/1554171817/403
405: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 11:37:36.53 ID:3EWrT4Pn0 >>404 着目点はそこにはありません。関数による記述で内部を隠蔽するのが目的ではありません 問題は、malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…?、にかかっており >>393 ptr = func1(ptr, opt); は?を記述できる可能性が皆無、一方 >>393 func2(&ptr, opt); は?を記述できる可能性がある、というわけです http://mevius.5ch.net/test/read.cgi/tech/1554171817/405
407: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 11:44:46.28 ID:3EWrT4Pn0 >>406 非常に大きな二分木(ノートが1億個)があって、そのはるか先端で malloc() してそこで代入すればいいだけなのに、 その先端から root に戻ってくる途中の30箇所ほどで、軒並み全部のノードで「必要のない無駄な代入」をするのですか? >それしか使えない場面でのみ使うべき この二分木を実装する、というのがまさしく「それしか使えない場面」なのですよ http://mevius.5ch.net/test/read.cgi/tech/1554171817/407
410: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 11:53:15.92 ID:3EWrT4Pn0 >>408 >>393 func2(&ptr, opt); では malloc() して null が返ってきたときは、例えば何もしない、ということはできますね でも >>393 ptr = func1(ptr, opt); は、malloc() しようがしまいが代入してしまいますね、これは「やる必要のない無駄な代入」が含まれることになり、好ましくないです >>393 ptr = func1(ptr, opt); の記述法は二分木を最初に習うときに、この記述法で理解を促すという意味では有用であっても、 いつまでもこれで書いているようでは進歩していない、もっといえば怠惰である、と考えています http://mevius.5ch.net/test/read.cgi/tech/1554171817/410
411: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 11:55:53.32 ID:3EWrT4Pn0 >>409 しかし無駄な代入を放置してよいというわけではないでしょうね、削れるところは削るべきです 単純二分木よりさらに改良された平衡二分木(AVL木、赤黒木等)を紹介する書籍では、最初から >>393 func2(&ptr, opt); で記述されていますよ http://mevius.5ch.net/test/read.cgi/tech/1554171817/411
414: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 12:05:45.99 ID:3EWrT4Pn0 >>412 ちがいますね 問題は、malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…?、にかかっています。 >>413 >>407 に書いておきました、1億ノードの二分木にて各ノードが最適に配置されているとして、削ることのできる代入は malloc() 一回に対して 30 個の代入になります >>393 ptr = func1(ptr, opt); では 1億ノードの二分木にノードを追加する際、30個の無駄な代入が発生します 代入のコストは大したことがない、にしても、アルゴリズムを正確に記述できないのは問題ですね 洗練された記述とはそういうものではないでしょうか http://mevius.5ch.net/test/read.cgi/tech/1554171817/414
417: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 13:12:30.38 ID:3EWrT4Pn0 >>415 malloc() が成功したか失敗したかは、今の話には関係ありません 今関係があるのは、 malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…? です http://mevius.5ch.net/test/read.cgi/tech/1554171817/417
419: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 13:51:49.48 ID:3EWrT4Pn0 >>418 malloc() したときは代入しますよ、でも malloc() しないときは代入なんかせず、そのまま呼び出し元に返るだけです それが>>393 ptr = func1(ptr, opt); 方式と絶対的に違うのです http://mevius.5ch.net/test/read.cgi/tech/1554171817/419
421: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 14:02:45.71 ID:3EWrT4Pn0 >>420 >>393 func2(&ptr, opt); 式なら void もありえます http://mevius.5ch.net/test/read.cgi/tech/1554171817/421
423: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 14:11:38.90 ID:3EWrT4Pn0 >>422 いいえ、実際に実装するならば、エラーを伝達する手段として返り値を準備することは大いにありえるでしょうね void が必須ではありません 必要な代入なら使えばいい、でも >>393 ptr = func1(ptr, opt); 方式は不必要な代入があり、単に二重ポインタを使用して記述すればこれは除去できるので、 >>393 ptr = func1(ptr, opt); を書くのは問題だし、これを書く人は頭を使っていない、と判断します http://mevius.5ch.net/test/read.cgi/tech/1554171817/423
426: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 15:03:58.07 ID:3EWrT4Pn0 >>424 そのパターンでは、異常値 NULL をうっかりノードに登録してしまうと、そのノードより下が浮いてしまい危ないですね、ま、異常系をミスったままリリースしてしまうことも私はよくやりますけど http://mevius.5ch.net/test/read.cgi/tech/1554171817/426
428: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 17:54:28.38 ID:3EWrT4Pn0 >>427 言葉尻を捕らえて攻めたつもりになっているようですね 「すべての代入を消去できる」なんていってませんよね >>393 ptr = func1(ptr, opt); この代入は不要な代入を含むので、 >>393 ptr = func1(ptr, opt); は不適当な書き方だ、とこれまで首尾一貫して述べているのです http://mevius.5ch.net/test/read.cgi/tech/1554171817/428
432: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 19:00:00.98 ID:3EWrT4Pn0 >>430 どんな代入もだめだとは主張していませんね… >>393 ptr = func1(ptr, opt); 方式は不必要な代入があり、単に二重ポインタを使用して記述すればこれは除去できるので、 >>393 ptr = func1(ptr, opt); の代入が駄目だとはいってきていますけれども http://mevius.5ch.net/test/read.cgi/tech/1554171817/432
435: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 20:16:09.59 ID:3EWrT4Pn0 >>434 >性能上の無駄という意味ではないんだね? 性能の上で分析するとなると、間接参照にてデータをロード、ストアするコストと値をストアするコストを天秤にかける、ことになりますね なるほど、その点を言いたくて、でも言いたくなくて、しつこく絡んでいたのですか… 私は二重ポインタでの表現の方がトータルでお得だ、とは思ってはいますが、これまで表に出ている私の発言は、あえてそこには踏み込まず(だって性能の話はうかつに断言できませんからね…)、 おっしゃるとおり「アルゴリズムの表現の上では不要なことをしている」に留まっています http://mevius.5ch.net/test/read.cgi/tech/1554171817/435
437: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) [sage] 2019/05/05(日) 21:02:18.49 ID:3EWrT4Pn0 >>436 >「ポインタが無い言語では表現できない」というわけではないよ。 それは理解しています、なぜなら Java での二分木の実装を検討したことがある(探せば2ch過去ログにあるかもしれません) Java にはポインタはありませんが、実装できるかできないか、といえば「できる」の方に入りますね http://mevius.5ch.net/test/read.cgi/tech/1554171817/437
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.035s