[過去ログ] C言語なら俺に聞け 151 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
387
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)08:54 ID:3EWrT4Pn0(1/22)調 AAS
>>378
それは無駄な代入が発生するでしょう?
388
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)09:01 ID:3EWrT4Pn0(2/22)調 AAS
>>380
余裕で三重ポインタなどほいほいと使いますよ
2chスレ:tech
void prep_exe(char *sttp, char **path, char ***argv)
char **argv を使うことが理解できるのだったら「argv のアドレスを渡す」みたいな場合に渡された関数側では三重ポインタを使うことになるでしょう
390: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)09:08 ID:3EWrT4Pn0(3/22)調 AAS
>>389
無論使いさえすればいい、というわけではなく、この例では小さなシェルを実装しており、シェルのパイプ機能を実装するのに三重ポインタを使ったのです
392
(2): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)09:47 ID:3EWrT4Pn0(4/22)調 AAS
>>391
代入命令が増えるという意味ではなく、「同じ値」なのに代入してしまう、という作業が >>378「戻り値でポインタを返」す方式の書き方だと不可避です
395: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)10:29 ID:3EWrT4Pn0(5/22)調 AAS
>>393
前者
>ptr = func1(ptr, opt); 
は初心者用で、>>392 のいう無駄な代入が含まれています、二重ポインタがわかるのなら後者にするべきです
396
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)10:30 ID:3EWrT4Pn0(6/22)調 AAS
>>394
シンプルな記述ができるのに、わざと複雑な書き方にするのは問題なのでは?
398
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)10:33 ID:3EWrT4Pn0(7/22)調 AAS
>>397
その場合無駄な代入が発生しますね、>>393 がいい例を示しています
403
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)11:25 ID:3EWrT4Pn0(8/22)調 AAS
>>400
ちがいます
代入するのか代入しないのかは malloc() したかしなかったかにかかっています。
代入は malloc() したとききだけにすればよく それが >>393 の func2(&ptr, opt); の書き方
一方 >>393 ptr = func1(ptr, opt); は malloc() したかしないかにかかわらず代入を行います、これは無駄な代入を含みます
405
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)11:37 ID:3EWrT4Pn0(9/22)調 AAS
>>404
着目点はそこにはありません。関数による記述で内部を隠蔽するのが目的ではありません
問題は、malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…?、にかかっており
>>393 ptr = func1(ptr, opt); は?を記述できる可能性が皆無、一方
>>393 func2(&ptr, opt); は?を記述できる可能性がある、というわけです
407
(4): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)11:44 ID:3EWrT4Pn0(10/22)調 AAS
>>406
非常に大きな二分木(ノートが1億個)があって、そのはるか先端で malloc() してそこで代入すればいいだけなのに、
その先端から root に戻ってくる途中の30箇所ほどで、軒並み全部のノードで「必要のない無駄な代入」をするのですか?

>それしか使えない場面でのみ使うべき

この二分木を実装する、というのがまさしく「それしか使えない場面」なのですよ
410
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)11:53 ID:3EWrT4Pn0(11/22)調 AAS
>>408
>>393 func2(&ptr, opt); では
malloc() して null が返ってきたときは、例えば何もしない、ということはできますね

でも >>393 ptr = func1(ptr, opt);
は、malloc() しようがしまいが代入してしまいますね、これは「やる必要のない無駄な代入」が含まれることになり、好ましくないです
>>393 ptr = func1(ptr, opt); の記述法は二分木を最初に習うときに、この記述法で理解を促すという意味では有用であっても、
いつまでもこれで書いているようでは進歩していない、もっといえば怠惰である、と考えています
411
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)11:55 ID:3EWrT4Pn0(12/22)調 AAS
>>409
しかし無駄な代入を放置してよいというわけではないでしょうね、削れるところは削るべきです
単純二分木よりさらに改良された平衡二分木(AVL木、赤黒木等)を紹介する書籍では、最初から >>393 func2(&ptr, opt); で記述されていますよ
414
(2): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)12:05 ID:3EWrT4Pn0(13/22)調 AAS
>>412
ちがいますね
問題は、malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…?、にかかっています。

>>413
>>407 に書いておきました、1億ノードの二分木にて各ノードが最適に配置されているとして、削ることのできる代入は malloc() 一回に対して 30 個の代入になります
>>393 ptr = func1(ptr, opt); では 1億ノードの二分木にノードを追加する際、30個の無駄な代入が発生します
代入のコストは大したことがない、にしても、アルゴリズムを正確に記述できないのは問題ですね
洗練された記述とはそういうものではないでしょうか
417
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)13:12 ID:3EWrT4Pn0(14/22)調 AAS
>>415
malloc() が成功したか失敗したかは、今の話には関係ありません
今関係があるのは、
malloc() したときだけ代入し、malloc() しなかったときには代入しない、という記述を正確にかけるかどうか…?
です
419
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)13:51 ID:3EWrT4Pn0(15/22)調 AAS
>>418
malloc() したときは代入しますよ、でも malloc() しないときは代入なんかせず、そのまま呼び出し元に返るだけです
それが>>393 ptr = func1(ptr, opt); 方式と絶対的に違うのです
421
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)14:02 ID:3EWrT4Pn0(16/22)調 AAS
>>420
>>393 func2(&ptr, opt); 式なら void もありえます
423
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)14:11 ID:3EWrT4Pn0(17/22)調 AAS
>>422
いいえ、実際に実装するならば、エラーを伝達する手段として返り値を準備することは大いにありえるでしょうね
void が必須ではありません
必要な代入なら使えばいい、でも
>>393 ptr = func1(ptr, opt);
方式は不必要な代入があり、単に二重ポインタを使用して記述すればこれは除去できるので、
>>393 ptr = func1(ptr, opt);
を書くのは問題だし、これを書く人は頭を使っていない、と判断します
426: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)15:03 ID:3EWrT4Pn0(18/22)調 AAS
>>424
そのパターンでは、異常値 NULL をうっかりノードに登録してしまうと、そのノードより下が浮いてしまい危ないですね、ま、異常系をミスったままリリースしてしまうことも私はよくやりますけど
428: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)17:54 ID:3EWrT4Pn0(19/22)調 AAS
>>427
言葉尻を捕らえて攻めたつもりになっているようですね
「すべての代入を消去できる」なんていってませんよね

>>393 ptr = func1(ptr, opt);

この代入は不要な代入を含むので、

>>393 ptr = func1(ptr, opt);

は不適当な書き方だ、とこれまで首尾一貫して述べているのです
432: ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)19:00 ID:3EWrT4Pn0(20/22)調 AAS
>>430
どんな代入もだめだとは主張していませんね…

>>393 ptr = func1(ptr, opt);
方式は不必要な代入があり、単に二重ポインタを使用して記述すればこれは除去できるので、
>>393 ptr = func1(ptr, opt);
の代入が駄目だとはいってきていますけれども
435
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)20:16 ID:3EWrT4Pn0(21/22)調 AAS
>>434
>性能上の無駄という意味ではないんだね?
性能の上で分析するとなると、間接参照にてデータをロード、ストアするコストと値をストアするコストを天秤にかける、ことになりますね
なるほど、その点を言いたくて、でも言いたくなくて、しつこく絡んでいたのですか…

私は二重ポインタでの表現の方がトータルでお得だ、とは思ってはいますが、これまで表に出ている私の発言は、あえてそこには踏み込まず(だって性能の話はうかつに断言できませんからね…)、
おっしゃるとおり「アルゴリズムの表現の上では不要なことをしている」に留まっています
437
(1): ◆QZaw55cn4c (ワッチョイ 8247-R0y6) 2019/05/05(日)21:02 ID:3EWrT4Pn0(22/22)調 AAS
>>436
>「ポインタが無い言語では表現できない」というわけではないよ。
それは理解しています、なぜなら
Java での二分木の実装を検討したことがある(探せば2ch過去ログにあるかもしれません)
Java にはポインタはありませんが、実装できるかできないか、といえば「できる」の方に入りますね
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.055s