C言語なら俺に聞け 161at TECH
C言語なら俺に聞け 161 - 暇つぶし2ch985:デフォルトの名無しさん
23/10/30 10:15:21.12 xnp7PI6ya.net
>>973-974
Nim の defer 良いよね

986:デフォルトの名無しさん
23/10/30 10:15:44.95 xnp7PI6ya.net
>>973-974
Nim の defer 良いよね

987:デフォルトの名無しさん
23/10/30 10:17:23.47 hHEGE8Ol0.net
正常ルートは終わる時 q==NULL なのに、その前の
defer free(q) したときのqの値でfree() するんですね
うへぇ…
誤解釈してバグ出しそう
てかこれは、ひねり出された意地悪サンプルで…実際のプログラミングでdefer式が効果的となる使用例ではない、ですよね?

988:デフォルトの名無しさん
23/10/30 10:34:41.68 hHEGE8Ol0.net
この話で改めてあぶり出されるのは、
あるプログラミング言語を深く理解して「書ける」「読める」ようになることには「自分なりの 上手なエラー処理の書き方 を探して身に付ける」事が含まれる、って事ですよね。
それは人類の資産なんだけど、実際の存在場所は あまたのプログラマー達の脳内 であって、一朝一夕に書き換えられる物じゃない。
だから言語仕様を改定して新機能を足すのは、新言語を作る時よりは慎重になる必要がある、と解釈しました

989:デフォルトの名無しさん
23/10/30 11:45:07.40 Ccd5zWuDd.net
nullptrはもっと早く入れるべきだった。

990:はちみつ餃子
23/10/30 11:57:46.53 I7fISnX+0.net
>>984
Go でどうだか知らんけど C に defer を入れたとしたらというテーマでの話なら
malloc と free を対応づけるのは考えられる用途の筆頭でしょ。
逆にこういう変則的な評価規則を持ち込まないとしたら、
つまり defer 文に書いたものが単に return の直前に評価されるだけということにしたら
途中で書き換えられる可能性が出てきて
前準備と後始末が対応づいているかどうか一目瞭然とはいかなくなる。
どこかしらでなんか汚い感じにはなるよ。
そういう汚さを受け入れてもなお欲しいほどの利便性かというとやっぱり疑問は残る。
汚さを受け入れていいなら goto の汚さを受け入れるのとそんなに差があるとも思えないし。

991:デフォルトの名無しさん
23/10/30 12:40:32.59 2SouKz/I0.net
>>980
意地でもgoto使いたくない時にはそれでもいいけど、それの欠点は中にswitch文を書くと、breakで抜けれるのはswitch文からだけになる事だな
自分ではwhileを抜けた気になって実は抜けてないという、微妙なバグを生み出す可能性があるなw

992:デフォルトの名無しさん
23/10/30 16:19:29.96 hHEGE8Ol0.net
>>988
do {...} while(0)
なので、必ず1回実行し、2回目はないです

993:デフォルトの名無しさん
23/10/30 16:52:46.78 bW5EQkS/0.net
>>989
適当だけどこういうことでは?
{int rc=0; do{ ★始め
 処理1
 siwtch(x){
  case 0: rc=1; break; ★失敗した  ※siwtchから抜けるだけでwhileからは抜け出せていない
  case 1: break; ★成功だけど処理2は実行しない ※siwtchから抜けるだけでwhileからは抜け出せていない
  case 2: break; ★成功で処理2も行う
 }
 処理2
 break; ★成功した
 } while(0); if(rc) { ★
 異常時処理
}} ★終り

994:デフォルトの名無しさん
23/10/30 16:58:35.91 hHEGE8Ol0.net
>>990
おっしゃる事、分かります。具体的に書いてくれてありがとうm(_ _)m

995:デフォルトの名無しさん
23/10/30 17:01:08.71 hHEGE8Ol0.net
>>987
はい…
mallocとfreeを確保と解放の例とするのは異論ないです
deferより一つ上位の話は、エラー処理をバグなく、分かりやすく書こうというテーマだ、で合ってますよね。
その上で、deferがないとこんな面倒なのが、deferがあるとこんなに分かりやすい 例がよいのです
確保と解放の書き方検討で、私が検討するのは例えばこんな感じです:
■(1)ある意味のある処理単位が、リソースを 2個以上使う 場合を考えると、1個の場合より検討がよく進む。特に、
■■(1a)初期化が途中で失敗した場合、すでに確保が成功してしまった資源をどう解放するか
■■(1b)資源の変数は最初に、確保処理のエラー戻り値と同じ値で初期化をすると、スッキリする事が多い
■(2)正常ルートでの解放と、エラールートでの解放で、コードを共通とするか、別とするか。
■■(2a)確保、主、開放 の処理を、同じ「関数」で書くのと、別の「関数」に分けるのはどちらが良いか
■■(2b)「goto エラーラベル;」を好きか嫌いか
■(3)プログラマーによる解放処理の前の 「if(確保済みなら)」のガードが、必要なもの(fcloseなど)と、不要なもの(free)があるので、マニュアル確認は要る
もっと語りたいけど、レス分けます、というか時間を置きます。あまり一人が語りすぎると、嫌がる人もいますよね

996:デフォルトの名無しさん
23/10/30 17:09:39.89 hHEGE8Ol0.net
てかキータで書いて、皆さんの意見を聞いて修正していったり、してみようかな…

997:デフォルトの名無しさん
23/10/30 17:17:16.34 hHEGE8Ol0.net
とりあえず次スレ立てました。即死防止の保守書き込みは要らない、で良いのかな?
C言語なら俺に聞け 162
スレリンク(tech板)

998:デフォルトの名無しさん (スプッッ Sd73-cQ99)
23/10/30 18:42:32.58 Ccd5zWuDd.net
>>994
乙。
あなたの男気に女気に惚れました。

999:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b3e-g5YV)
23/10/30 22:27:42.13 I7fISnX+0.net
Golang の defer はあくまで関数の終わりまで遅延させる (ブロックの終わりではない) ので
呼び出される defer の個数が動的になりうるんだな。
URLリンク(go.dev)
この挙動も C には馴染まなさそうだな。

1000:デフォルトの名無しさん (ワッチョイ 1379-JwVi)
23/10/30 22:37:34.66 n3VNJX5I0.net
俺は某画像ライブラリのリソーストラッカーみたいに開放が必要な物を全部紐付けて後で開放する仕掛けを使ってる
まあCには何にも縛られないのが良いんだし好きにしたらいいよ

1001:デフォルトの名無しさん (ワッチョイ d95d-kYJB)
23/10/30 23:34:44.67 2SouKz/I0.net
構文的にはC#っぽく
using (double* p = malloc(...); free(p)) {
p を使う
}
でも良いかも知れない
これだと1ループのforに似ててCに良く馴染むな
もちろんreturnとかexitで脱出してもfreeは呼ばれる

1002:デフォルトの名無しさん (ワントンキン MM53-wL8D)
23/10/31 10:19:02.32 i2gAy2CGM.net
そんなもんが規格に入るわけないんだから無駄話だろ

1003:デフォルトの名無しさん (ワントンキン MM53-wL8D)
23/10/31 10:19:24.66 i2gAy2CGM.net
うめ

1004:1001
Over 1000 Thread Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 192日 20時間 14分 5秒

1005:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch