C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
前
C言語なら俺に聞け 144
https://mevius.5ch.net/test/read.cgi/tech/1514025223/
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
-
※前スレ
C言語なら俺に聞け 145
http://mevius.5ch.net/test/read.cgi/tech/1519046038/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
探検
C言語なら俺に聞け 146
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 839f-AnMQ)
2018/04/30(月) 04:47:37.50ID:XX4FB8lc0588さまよえる蟻人間 ◆T6xkBnTXz7B0 (スフッ Sd32-HzQc)
2018/08/01(水) 17:40:34.16ID:TGp/sEuFd i, jがどんな値かによる。
i == 0x7fffffff && j == 0x7fffffff
で、i + jがどんな整数値になるか考えたまえ。
i == 0x7fffffff && j == 0x7fffffff
で、i + jがどんな整数値になるか考えたまえ。
589デフォルトの名無しさん (ワッチョイ 1681-2QVD)
2018/08/01(水) 18:09:35.03ID:9yb7YrdQ0 ありがとうございます。理解出来ました。
下限上限への理解がまだまだでした…
下限上限への理解がまだまだでした…
590デフォルトの名無しさん (ガックシ 06de-fBTW)
2018/08/01(水) 18:20:26.56ID:edgaccID6591デフォルトの名無しさん (ワッチョイ e3bb-53i4)
2018/08/01(水) 19:46:12.42ID:xh0kKqMn0 >>578が578のやり方でtest.Callのアドレスを渡せないのはなんでなん?理由が知りたい。
592デフォルトの名無しさん (ワッチョイ 232d-E0Ep)
2018/08/01(水) 20:21:01.54ID:jfFEYUCE0 >>591
まず瑣末だけど、 test.call じゃなくて &Test::Call でメンバ関数のポインタを取らなきゃいけないってのはあるけど それはいいとして
ざっくり言えば「メンバ関数の型はクラスの型を含んでて、普通の関数とは型違うから」ってとこかねー
# g++
エラー: cannot convert ‘void (TestClass::*)()’ to ‘void (*)()’ in assignment
info.pfunc = &TestClass::Call;
スレチなので 解答が不足ならば「C++相談室」か「スレ勃てるまでもないC/C++の質問はここで」辺りで願います
詳しい人いるだろうし
まず瑣末だけど、 test.call じゃなくて &Test::Call でメンバ関数のポインタを取らなきゃいけないってのはあるけど それはいいとして
ざっくり言えば「メンバ関数の型はクラスの型を含んでて、普通の関数とは型違うから」ってとこかねー
# g++
エラー: cannot convert ‘void (TestClass::*)()’ to ‘void (*)()’ in assignment
info.pfunc = &TestClass::Call;
スレチなので 解答が不足ならば「C++相談室」か「スレ勃てるまでもないC/C++の質問はここで」辺りで願います
詳しい人いるだろうし
593デフォルトの名無しさん (ワッチョイ e3bb-53i4)
2018/08/01(水) 20:28:43.32ID:xh0kKqMn0 >>592
そのざっくりな説明だけでもわかりやすい。なるほどありがとう。
そのざっくりな説明だけでもわかりやすい。なるほどありがとう。
594デフォルトの名無しさん (ワッチョイ e3bb-53i4)
2018/08/01(水) 20:34:52.96ID:xh0kKqMn0 ググったら安定のロベールさん出てきた。買った方がいいなこれ基礎力でえらい差が出てしまう気がしてきた
595デフォルトの名無しさん (アウアウウー Sa43-53i4)
2018/08/01(水) 20:52:58.87ID:WDXOLOCva C++の話はC++スレでやれ。
596デフォルトの名無しさん (ワッチョイ 129f-lgLX)
2018/08/01(水) 21:33:20.86ID:jJEMbL0b0 なんだ結局ロベールのステマかよしょうもねえな
597デフォルトの名無しさん (アウアウカー Saef-zedw)
2018/08/01(水) 22:23:36.11ID:ArWxfDp8a >>592
分かりやすい説明
分かりやすい説明
598デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/02(木) 00:25:44.59ID:6TeXhDWV0 オーバフロー以前に
ポインタ同士の足し算なんかしないからな(Cでは普通のやりかたではできない仕様になってる)
ポインタ同士の足し算なんかしたらおもいっきりオーバーフローすることがあるからな
つまり簡単にオーバーフローはおきうる
ポインタにはアドレスが入ってるからな
やってることは
基準になるオフセット(ここでは左端)に距離を足すだけといっていい
距離は通常ポインタの引き算で求める
距離は左端と右端の距離の半分の距離に
基準になるオフセットに足す
すると中間点になる
つまり中間点固定
しかしピボットが中間点固定だと最悪のケースの場合
クイックソートはものすごく遅くなる
で、ピボットを乱数で選択することで
その最悪のケースを回避するというやりかたもある
実際の現実のデータでそんな最悪のケースはほぼないといっていい
ポインタ同士の足し算なんかしないからな(Cでは普通のやりかたではできない仕様になってる)
ポインタ同士の足し算なんかしたらおもいっきりオーバーフローすることがあるからな
つまり簡単にオーバーフローはおきうる
ポインタにはアドレスが入ってるからな
やってることは
基準になるオフセット(ここでは左端)に距離を足すだけといっていい
距離は通常ポインタの引き算で求める
距離は左端と右端の距離の半分の距離に
基準になるオフセットに足す
すると中間点になる
つまり中間点固定
しかしピボットが中間点固定だと最悪のケースの場合
クイックソートはものすごく遅くなる
で、ピボットを乱数で選択することで
その最悪のケースを回避するというやりかたもある
実際の現実のデータでそんな最悪のケースはほぼないといっていい
599デフォルトの名無しさん (スプッッ Sd47-XO19)
2018/08/02(木) 00:29:26.39ID:c3/ck1cgd すいません初心者です、質問なんですが・・・
for文を使うときにfor(i = 1 ;i <= 5 ;i++ )でiが5より増えたときにループを抜けるようにiを1ずつ増やすというのは分かるんですが
何故ループするときにfor文のi = 1の代入の部分は無視されるんでしょうか・・・
for文を使うときにfor(i = 1 ;i <= 5 ;i++ )でiが5より増えたときにループを抜けるようにiを1ずつ増やすというのは分かるんですが
何故ループするときにfor文のi = 1の代入の部分は無視されるんでしょうか・・・
600デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/02(木) 00:39:59.52ID:6TeXhDWV0 そういう制御文だからな
そういう仕様だ
for ( [ループ前に行う演算]; [ループが処理される条件]; [次のループが処理される前に行う演算] )
i = 1;
whlle (i <= 5) {
・・・
i++
}
と同じ
どれもすべて入れても入れなくてもいい
for (;;) こう書くと無限ループになる
そういう仕様だ
for ( [ループ前に行う演算]; [ループが処理される条件]; [次のループが処理される前に行う演算] )
i = 1;
whlle (i <= 5) {
・・・
i++
}
と同じ
どれもすべて入れても入れなくてもいい
for (;;) こう書くと無限ループになる
601デフォルトの名無しさん (スプッッ Sd47-XO19)
2018/08/02(木) 00:43:35.36ID:c3/ck1cgd なるほどそういう仕様だったんですね・・・
丁寧にありがとうございますこれでようやく眠れる
丁寧にありがとうございますこれでようやく眠れる
602デフォルトの名無しさん (ブーイモ MM67-3qOU)
2018/08/02(木) 01:18:26.80ID:4HyEhcJnM >>600
continueがあるとちょっと書き換えが必要だけどね
continueがあるとちょっと書き換えが必要だけどね
603デフォルトの名無しさん (ドコグロ MM47-6jVY)
2018/08/02(木) 06:45:33.31ID:S4Pms+eVM604デフォルトの名無しさん (ワッチョイ 6350-3fy2)
2018/08/02(木) 07:13:00.94ID:PxPZ0mdd0605デフォルトの名無しさん (ワッチョイ d3d7-Xflc)
2018/08/02(木) 09:43:21.84ID:NSwKZwuS0 for文でのcontinueの挙動を最近知ったばかりで自慢したかったんだろ
606デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/02(木) 09:48:48.46ID:Bu8RCR+yd if
for
while
do while
goto
break
continue
このくらいしか無いんだから全部覚えとけ
なぜかgotoの使い方を知らんヤツが多い
多重ループを抜けるのにわざわざフラグを使うアホとか
for
while
do while
goto
break
continue
このくらいしか無いんだから全部覚えとけ
なぜかgotoの使い方を知らんヤツが多い
多重ループを抜けるのにわざわざフラグを使うアホとか
607デフォルトの名無しさん (ワッチョイ d3d7-Xflc)
2018/08/02(木) 10:51:33.79ID:NSwKZwuS0 使い方を知らんというより
絶対使うなと刷り込まれているのが多い
なぜだと聞いても答えられないやつ全員
絶対使うなと刷り込まれているのが多い
なぜだと聞いても答えられないやつ全員
608デフォルトの名無しさん (アウアウカー Sa07-iFcb)
2018/08/02(木) 12:55:13.95ID:Cp7uV85Za gotoは悪という教義のある宗教の信者だから仕方がない。
609デフォルトの名無しさん (スップ Sd1f-rhtP)
2018/08/02(木) 13:54:18.40ID:4fjj7SMLd 大体使わなくて済むし
使う必要がある時に
さりげなく使うもの
使う必要がある時に
さりげなく使うもの
610デフォルトの名無しさん (ワッチョイ 63ea-47xK)
2018/08/02(木) 14:17:14.48ID:TfLreE+60 全く使わない 脱出用途なら使う 飛び込みでも使う
611デフォルトの名無しさん (アウアウカー Sa07-iFcb)
2018/08/02(木) 16:25:02.06ID:SFe9zIxEa 脱出時だけ使ってるな。
関数の途中で複数エラーが出る可能性がある場合とかは関数の最後の方にgotoさせてそこでまとめてメモリ解放などをする。
他の言語だと例外投げて try catch でなんとかするようなやつだな。
関数の途中で複数エラーが出る可能性がある場合とかは関数の最後の方にgotoさせてそこでまとめてメモリ解放などをする。
他の言語だと例外投げて try catch でなんとかするようなやつだな。
612デフォルトの名無しさん (ブーイモ MM67-2iw7)
2018/08/02(木) 18:05:39.94ID:QNpgl+2ZM 飛び込みはやめーや
613デフォルトの名無しさん (ガックシ 067f-8ycx)
2018/08/02(木) 18:57:08.60ID:yzfiTIk96 脱出はreturnにすればいい
614デフォルトの名無しさん (ワッチョイ 5381-Xflc)
2018/08/02(木) 19:01:34.31ID:xZR22mJ60 returnが複数あるのを嫌がる宗派があるからなあ
615デフォルトの名無しさん (スッップ Sd1f-3fy2)
2018/08/02(木) 19:11:54.12ID:1EegAYN5d >>613
宗教の信者さん?
宗教の信者さん?
616デフォルトの名無しさん (ワッチョイ e3b3-47xK)
2018/08/02(木) 19:12:56.06ID:jJ76BOdj0 初期化(1) if (エラー) goto E1;
初期化(2) if (エラー) goto E2;
初期化(3) if (エラー) goto E3;
:
return おっけー
E3: (3) の後始末
E2: (2) の後始末
E1: (1) の後始末
return エラーじゃ
初期化(2) if (エラー) goto E2;
初期化(3) if (エラー) goto E3;
:
return おっけー
E3: (3) の後始末
E2: (2) の後始末
E1: (1) の後始末
return エラーじゃ
>>614
確かに、misra が全力でそれを嫌うのは、なにか理由があってのことでしょうか?
確かに、misra が全力でそれを嫌うのは、なにか理由があってのことでしょうか?
618デフォルトの名無しさん (ワッチョイ ff73-lyTv)
2018/08/02(木) 19:20:08.81ID:zwgkA1lD0 >>616
俺もこれ派だわ
俺もこれ派だわ
619デフォルトの名無しさん (スッップ Sd1f-3fy2)
2018/08/02(木) 19:26:51.94ID:1EegAYN5d ○○派とか言うと他の方法を知らないように感じる
臨機応変に色々の方法を使い分けるのが良い
臨機応変に色々の方法を使い分けるのが良い
620デフォルトの名無しさん (ワッチョイ 5381-Xflc)
2018/08/02(木) 19:33:21.75ID:xZR22mJ60 コーディング規約を決める偉い人の信仰心に依存する、か
621デフォルトの名無しさん (ワッチョイ ff73-lyTv)
2018/08/02(木) 19:35:06.17ID:zwgkA1lD0622デフォルトの名無しさん (スッップ Sd1f-3fy2)
2018/08/02(木) 19:41:55.73ID:1EegAYN5d コーディング規約を偉い人が決めるような会社は嫌だな
623デフォルトの名無しさん (スッップ Sd1f-3fy2)
2018/08/02(木) 19:43:01.73ID:1EegAYN5d 偉い人はもっと大きな事を考えて
624デフォルトの名無しさん (ワッチョイ 6fe7-Mv1r)
2018/08/02(木) 20:10:50.62ID:Cjo1mv3c0 エラー起こす前にちゃんと検査しろ。
625デフォルトの名無しさん (ブーイモ MM67-xnas)
2018/08/02(木) 20:30:01.75ID:1NEFWSVpM retryとoutは使うわ
後始末不要ならその場でreturn
後始末必要なら最後にreturn
まあこの辺の書き方より関数名、変数名、変数の数を気にして欲しいと思う今日この頃
後始末不要ならその場でreturn
後始末必要なら最後にreturn
まあこの辺の書き方より関数名、変数名、変数の数を気にして欲しいと思う今日この頃
626デフォルトの名無しさん (ワッチョイ d3d7-Xflc)
2018/08/02(木) 22:24:28.26ID:NSwKZwuS0 Cのgotoが関数から出られない、という時点で
悪しきgotoの大部分が封じられているんだけど
せっかくそうなっているのに1関数で数千行なんてやらかす
何というか吹っ切れたやつが暗黒面に墜ちていると
とんでもねえんだよ
悪しきgotoの大部分が封じられているんだけど
せっかくそうなっているのに1関数で数千行なんてやらかす
何というか吹っ切れたやつが暗黒面に墜ちていると
とんでもねえんだよ
628デフォルトの名無しさん (ワッチョイ 5381-Xflc)
2018/08/02(木) 22:43:04.03ID:xZR22mJ60 longjmpでイスカンダルまで飛びたいんですけど
何故か地球に戻ってしまいます
何故か地球に戻ってしまいます
629デフォルトの名無しさん (ワッチョイ ff12-gYkF)
2018/08/03(金) 02:01:51.21ID:TY6Sib0f0 イスカンダルのトーフ屋
630デフォルトの名無しさん (ワッチョイ ff73-lyTv)
2018/08/03(金) 05:37:20.02ID:o9dqmONZ0 孫悟空はsetjmp/longjmpの使い手
631デフォルトの名無しさん (ワッチョイ 6fe7-Mv1r)
2018/08/03(金) 09:55:27.36ID:UvsVeV1Q0 組込み人は状態変数でワープする。
632デフォルトの名無しさん (ワッチョイ 5381-Xflc)
2018/08/03(金) 10:02:42.04ID:8VyIMXmS0 スタック上の戻りアドレスを自分で操作して、好きな場所にワープさせてた奴いたっけな
633デフォルトの名無しさん (ワッチョイ d3d7-Xflc)
2018/08/03(金) 10:12:18.20ID:9KGEdKKU0634デフォルトの名無しさん (ワッチョイ d3d7-Xflc)
2018/08/03(金) 14:40:50.79ID:9KGEdKKU0 悪しきgotoの大部分を封じるときに
巻き添えで封じられた悪しくないgotoを救う
アイテムがlongjmpだろうがよ
巻き添えで封じられた悪しくないgotoを救う
アイテムがlongjmpだろうがよ
635デフォルトの名無しさん (ワッチョイ 6fe7-Mv1r)
2018/08/03(金) 19:36:07.75ID:4c00FTp80 gotoの効率の良さは取立ての生うにの味
636デフォルトの名無しさん (アウアウカー Sa07-iFcb)
2018/08/03(金) 20:15:47.20ID:X+nM2ZWla gotoは良く切れる刀のようなもの。
その怪しい魅力に取り憑かれダークサイドに堕ちた者は数知れず。
その怪しい魅力に取り憑かれダークサイドに堕ちた者は数知れず。
637デフォルトの名無しさん (ブーイモ MM67-3qOU)
2018/08/03(金) 20:42:44.92ID:6lqoN/6FM 昔のBASICはその鋭い刃しかなかったってことか
638デフォルトの名無しさん (ワッチョイ 6350-3fy2)
2018/08/03(金) 20:43:55.37ID:I1YZhHYF0 GOSUBとかなかった?
639デフォルトの名無しさん (ワッチョイ 5381-Xflc)
2018/08/03(金) 20:49:49.72ID:8VyIMXmS0 fortranからの伝統芸
640デフォルトの名無しさん (ワッチョイ ffd2-ej6N)
2018/08/03(金) 21:11:54.24ID:1LNshpyd0 その昔サブルーチンの存在を知らなかった頃
gotoだけでスタックオーバーフロー的な
破綻をさせないで組んだのは結構自分の糧になってる
大人になってコーディング規約を作る側になった時
脱出のみ使用可能ってルールを作ったら
頑なに拒否するメンバーがいて仕事を外れてもらったことがる
宗教じみた反応でちょっと怖かった
gotoだけでスタックオーバーフロー的な
破綻をさせないで組んだのは結構自分の糧になってる
大人になってコーディング規約を作る側になった時
脱出のみ使用可能ってルールを作ったら
頑なに拒否するメンバーがいて仕事を外れてもらったことがる
宗教じみた反応でちょっと怖かった
641デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/03(金) 22:31:36.61ID:yp/iEsny0 gotoなんかよほどの理由がない限り使わない
適切に構造化できないアホが使うとロクなことにならない
原則禁止でいい
適切に構造化できないアホが使うとロクなことにならない
原則禁止でいい
642デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/03(金) 23:20:08.07ID:yp/iEsny0 >>616なんかではgoto使うケースなんかほぼない
普通にコード書いてればgotoなんかなくなる
後始末の仕方が判定できないコードを書くと
初期化が終わったあと、その初期化がむしろ不要になった場合その後始末が大変になる
知恵遅れほどいちいち不要なgotoを使いたがるからな
#define ERROR_INIT_AHO0 -1
#define ERROR_INIT_AHO1 -2
#define ERROR_INIT_AHO2 -3
#define ERROR_INIT_AHO3 -4
typedef struct tag_aho { char* p1; int fd2; FILE* fp3; } t_aho_t;
int 初期化(t_aho_t** ppt_aho) {
t_aho_t* pt_aho;
*ppt_aho = NULL;
if ((pt_aho = malloc(sizeof(t_aho_t)) == NULL) { return ERROR_INIT_AHO0; }
*ppt_aho = pt_aho;
if ((pt_aho->p1 = malloc()) == NULL) { 後始末(pt_aho); return ERROR_INIT_AHO1; }
if ((pt_aho->fd2 = open()) < 0) { 後始末(pt_aho); return ERROR_INIT_AHO2; }
if ((pt_aho->fp3 = fopen()) == NULL) { 後始末(pt_aho); return ERROR_INIT_AHO3; }
return 0;
}
void 後始末(t_aho_t* pt_aho) {
if (pt_aho == NULL) return;
if (pt_aho->p1 != NULL) { free(pt_aho->p1); }
if (pt_aho->fd2 > 2) { close(pt_aho->fd2); }
if (pt_aho->fp3 != NULL) { fclose(pt_aho->fp3); }
free(pt_aho);
}
普通にコード書いてればgotoなんかなくなる
後始末の仕方が判定できないコードを書くと
初期化が終わったあと、その初期化がむしろ不要になった場合その後始末が大変になる
知恵遅れほどいちいち不要なgotoを使いたがるからな
#define ERROR_INIT_AHO0 -1
#define ERROR_INIT_AHO1 -2
#define ERROR_INIT_AHO2 -3
#define ERROR_INIT_AHO3 -4
typedef struct tag_aho { char* p1; int fd2; FILE* fp3; } t_aho_t;
int 初期化(t_aho_t** ppt_aho) {
t_aho_t* pt_aho;
*ppt_aho = NULL;
if ((pt_aho = malloc(sizeof(t_aho_t)) == NULL) { return ERROR_INIT_AHO0; }
*ppt_aho = pt_aho;
if ((pt_aho->p1 = malloc()) == NULL) { 後始末(pt_aho); return ERROR_INIT_AHO1; }
if ((pt_aho->fd2 = open()) < 0) { 後始末(pt_aho); return ERROR_INIT_AHO2; }
if ((pt_aho->fp3 = fopen()) == NULL) { 後始末(pt_aho); return ERROR_INIT_AHO3; }
return 0;
}
void 後始末(t_aho_t* pt_aho) {
if (pt_aho == NULL) return;
if (pt_aho->p1 != NULL) { free(pt_aho->p1); }
if (pt_aho->fd2 > 2) { close(pt_aho->fd2); }
if (pt_aho->fp3 != NULL) { fclose(pt_aho->fp3); }
free(pt_aho);
}
643デフォルトの名無しさん (アウアウカー Sa07-KE4L)
2018/08/03(金) 23:26:42.29ID:Fao22p7ya gote使う前にそのループを関数化で分ける
644デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/03(金) 23:29:40.43ID:yp/iEsny0 正解!
645デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/03(金) 23:34:32.92ID:yp/iEsny0 >>642の簡単な例なら最初のmallocのあと
pt_aho->p1 = NULL;
pt_aho->fd2 = -1;
pt_aho->fp3 = NULL;
と初期化しておくだけでどう後始末すれば判定できる
pt_aho->p1 = NULL;
pt_aho->fd2 = -1;
pt_aho->fp3 = NULL;
と初期化しておくだけでどう後始末すれば判定できる
646デフォルトの名無しさん (ワッチョイ 5381-Xflc)
2018/08/03(金) 23:44:52.51ID:8VyIMXmS0647デフォルトの名無しさん (ワッチョイ 539e-e/QH)
2018/08/04(土) 00:39:50.00ID:iUNKVgUH0 Linux は、goto でエラー処理をまとめてる
return も、2箇所以上で使っている。
関数の冒頭で、処理しないものを、return ではじいたりしてる
MISRA-C のルール違反
トヨタなんか、MISRA-C で、5/100点とか聞くw
ルールの95% に違反w
return も、2箇所以上で使っている。
関数の冒頭で、処理しないものを、return ではじいたりしてる
MISRA-C のルール違反
トヨタなんか、MISRA-C で、5/100点とか聞くw
ルールの95% に違反w
648デフォルトの名無しさん (ワッチョイ a39f-Xflc)
2018/08/04(土) 04:04:56.84ID:2zclIjyW0 >>642
それだと毎回その関数用の構造体を作らねばならなくなっていまいち面倒ではないか?俺は>>616とその方式組み合わせたような感じにしてるよ。
int func()
{
int r = -1;
char *p1 = NULL;
int fd2 = -1;
FILE *fp3 = NULL;
if ((p1 = malloc()) == NULL) goto func_exit;
if ((fd2 = open()) == -1) {
r = -2;
goto func_exit;
}
if ((fp3 = fopen()) == NULL) {
r = -3;
goto func_exit;
}
/* 処理 */
// ここで p1, fd2, fp3 を使い終わった場合は func_exit より後でメモリ開放や
// クローズされないようにするために -1 や NULL を代入する。
r = 0; // 成功
func_exit:
if (p1) free(p1);
if (fd2 != -1) close(fd2);
if (fp3) fclose(fp3);
return r;
}
それだと毎回その関数用の構造体を作らねばならなくなっていまいち面倒ではないか?俺は>>616とその方式組み合わせたような感じにしてるよ。
int func()
{
int r = -1;
char *p1 = NULL;
int fd2 = -1;
FILE *fp3 = NULL;
if ((p1 = malloc()) == NULL) goto func_exit;
if ((fd2 = open()) == -1) {
r = -2;
goto func_exit;
}
if ((fp3 = fopen()) == NULL) {
r = -3;
goto func_exit;
}
/* 処理 */
// ここで p1, fd2, fp3 を使い終わった場合は func_exit より後でメモリ開放や
// クローズされないようにするために -1 や NULL を代入する。
r = 0; // 成功
func_exit:
if (p1) free(p1);
if (fd2 != -1) close(fd2);
if (fp3) fclose(fp3);
return r;
}
649デフォルトの名無しさん (ワッチョイ d3d7-Xflc)
2018/08/04(土) 05:10:46.07ID:YA1hWK5Y0 >>641
適切に構造化できないアホさん乙
適切に構造化できないアホさん乙
650デフォルトの名無しさん (アウアウカー Sa07-KE4L)
2018/08/04(土) 05:53:52.28ID:I5yMWHTla >>648
goto使わず普通に関数呼べばいいだけでは
goto使わず普通に関数呼べばいいだけでは
651デフォルトの名無しさん (ワッチョイ d3d7-Xflc)
2018/08/04(土) 07:40:44.39ID:YA1hWK5Y0 int func()
{
int r = 1;
//無駄な初期化はしない
char *p1;
int fd2;
FILE *fp3;
p1 = malloc(); if(p1 == NULL) goto malloc_failure;
fd2 = open(); if(fd2 == -1) goto open_failure;
fp3 = fopen(); if(fp3 == NULL) goto fopen_failure;
r = 0; // 成功
//フラグの類は極力使わない
fclose(fp3);
fopen_failure:
close(fd2);
open_failure:
free(p1);
malloc_failure:
return r;
}
{
int r = 1;
//無駄な初期化はしない
char *p1;
int fd2;
FILE *fp3;
p1 = malloc(); if(p1 == NULL) goto malloc_failure;
fd2 = open(); if(fd2 == -1) goto open_failure;
fp3 = fopen(); if(fp3 == NULL) goto fopen_failure;
r = 0; // 成功
//フラグの類は極力使わない
fclose(fp3);
fopen_failure:
close(fd2);
open_failure:
free(p1);
malloc_failure:
return r;
}
652デフォルトの名無しさん (ワッチョイ 6350-3fy2)
2018/08/04(土) 08:12:49.13ID:mQQzn2Q+0653デフォルトの名無しさん (ワッチョイ 6350-3fy2)
2018/08/04(土) 08:15:22.02ID:mQQzn2Q+0 わざわざ専用構造体と専用後始末関数と専用エラーコードをつくってわざわざ複雑にしてるアホもいるし
変数名で自己紹介してるから自覚はあるんだろうけど
変数名で自己紹介してるから自覚はあるんだろうけど
654デフォルトの名無しさん (ワッチョイ 6350-3fy2)
2018/08/04(土) 08:22:18.05ID:mQQzn2Q+0 初期化と後始末を包んだ関数もいるね
十数行で済むシンプルな関数に
何十行使うつもりだか
十数行で済むシンプルな関数に
何十行使うつもりだか
655デフォルトの名無しさん (ブーイモ MM67-xnas)
2018/08/04(土) 08:32:14.97ID:cyc8bEPyM Ok, so I'm looking at your code and your code is pure and utter *shit*.
656デフォルトの名無しさん (ワッチョイ cf81-Xflc)
2018/08/04(土) 08:42:16.32ID:+vznLLf60 goto hell
657デフォルトの名無しさん (ワッチョイ ffb3-6jVY)
2018/08/04(土) 09:32:53.84ID:AH7fLvgn0 >>647
MISRAの話だとそういう制御の話がよく取り上げらてて俺もほとんど守ってないけど、データ変換の話はよく考えられててなかなか為になるよ
MISRAの話だとそういう制御の話がよく取り上げらてて俺もほとんど守ってないけど、データ変換の話はよく考えられててなかなか為になるよ
658デフォルトの名無しさん (ワッチョイ ffb3-6jVY)
2018/08/04(土) 09:33:52.60ID:AH7fLvgn0659デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/04(土) 10:21:26.55ID:CpwGeL+S0 アホは後始末しないのもわかったわ
初期化がおわったあと
ファイルあけたらずーっとあけっぱなし
ヒープ作ったら作りっぱなし
なにがおきようが関数抜けたらずーっと放置
まずその部分で完結したコードが書けない
だいたいどんな知恵遅れがコード書いてんのか分かった
アホが自己紹介のコード書いてるしな
初期化がおわったあと
ファイルあけたらずーっとあけっぱなし
ヒープ作ったら作りっぱなし
なにがおきようが関数抜けたらずーっと放置
まずその部分で完結したコードが書けない
だいたいどんな知恵遅れがコード書いてんのか分かった
アホが自己紹介のコード書いてるしな
660デフォルトの名無しさん (ワッチョイ cf81-Xflc)
2018/08/04(土) 10:43:47.43ID:+vznLLf60 それは時代遅れの化石言語Cのせい
661デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/04(土) 11:02:01.24ID:CpwGeL+S0 やはりな
Cはオレみたいにエレガントなコード書けるヤツでないと使えない
オレみたいなプロフェッショナルでないとムリ
Cは言語規格が非常にシンプルで非常に優れている言語だからな
シンプルなせいで敷居も低い
そのせいでアホでも酷いコードが簡単に書けてしまう
非常に根が深い問題といっていい
Cはオレみたいにエレガントなコード書けるヤツでないと使えない
オレみたいなプロフェッショナルでないとムリ
Cは言語規格が非常にシンプルで非常に優れている言語だからな
シンプルなせいで敷居も低い
そのせいでアホでも酷いコードが簡単に書けてしまう
非常に根が深い問題といっていい
662デフォルトの名無しさん (スッップ Sd1f-sMWb)
2018/08/04(土) 11:09:25.30ID:tEqwX/6gd C11で開発してる人はいる?
663デフォルトの名無しさん (アウアウカー Sa07-KE4L)
2018/08/04(土) 11:14:47.57ID:/DYnKp4Pa fp = fopen(filen, "rb+");
if(fp == null) {
return 0;
}
func(fpやら処理する価);
fclose(fp);
ファイルオープンに失敗したらもどるし
関数呼び出しの結果がどうだろうと解放されるしgoto使う前にint func(void){return 0;}でわければいい
if(fp == null) {
return 0;
}
func(fpやら処理する価);
fclose(fp);
ファイルオープンに失敗したらもどるし
関数呼び出しの結果がどうだろうと解放されるしgoto使う前にint func(void){return 0;}でわければいい
664デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/04(土) 12:43:49.90ID:2dadGiC9d 小さな機能の関数でgotoを避ける為に関数を分けるとか
665デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/04(土) 12:44:20.27ID:2dadGiC9d まさしく宗教ですね
666デフォルトの名無しさん (アウアウカー Sa07-KE4L)
2018/08/04(土) 12:51:53.82ID:6FzZ70UGa goto使った方が見易いコードがとかいって関数分けた方が見やすいし戻る場所も関数呼んだ場所で分かりやすい
逆にgotoじゃなきゃ絶対駄目って宗教にはいってるんだろうか
逆にgotoじゃなきゃ絶対駄目って宗教にはいってるんだろうか
667デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/04(土) 13:03:02.54ID:CpwGeL+S0 gotoをさけるためじゃない
適切な初期化と適切な後始末ができる機能を提供している
しかもオレが書いたコードは
全部眺めなくても初期化のしかたと後始末の仕方が分かるエレガントなコードだからな
コードの見通しもよくなる
int void func() {
t_aho_t* pt_aho;
int i_ret;
// 初期化処理
if ((i_ret = 初期化(&pt_aho)) < 0) {return i_ret; }
if (read(pt_aho->fd, p_mem, 1) < 0) { 後始末(pt_aho); return ERROR_INIT_AHO4; }
if (fprintf(pt_aho->fd, "%c\n", *p_mem) < 0) { 後始末(pt_aho); return ERROR_INIT_AHO5; }
// 終了
後始末(pt_aho)
}
なんの処理をやってるコードかすぐに分かる
初期化処理と後始末ばっかりが何行も続くコードなんかだれも読みたくないからな
適切な初期化と適切な後始末ができる機能を提供している
しかもオレが書いたコードは
全部眺めなくても初期化のしかたと後始末の仕方が分かるエレガントなコードだからな
コードの見通しもよくなる
int void func() {
t_aho_t* pt_aho;
int i_ret;
// 初期化処理
if ((i_ret = 初期化(&pt_aho)) < 0) {return i_ret; }
if (read(pt_aho->fd, p_mem, 1) < 0) { 後始末(pt_aho); return ERROR_INIT_AHO4; }
if (fprintf(pt_aho->fd, "%c\n", *p_mem) < 0) { 後始末(pt_aho); return ERROR_INIT_AHO5; }
// 終了
後始末(pt_aho)
}
なんの処理をやってるコードかすぐに分かる
初期化処理と後始末ばっかりが何行も続くコードなんかだれも読みたくないからな
668デフォルトの名無しさん (ワッチョイ 5381-Xflc)
2018/08/04(土) 13:06:33.93ID:F7vd0ILk0 何年か前、一連のファイル群を読み、内容の検査をするプログラム書いたことがあった
複数Diskに跨がって処理を行っていたが、このDiskの検査はここで打ち切っていいとなったとき
三重ループから一気に抜けるのにgoto使ったな
goto next_disk;
使わないとそうしないと何分も時間を無駄にすることになるのでね
禁止しても良いけど、処理時間が掛かります、我慢してくれますか?ってことだな
複数Diskに跨がって処理を行っていたが、このDiskの検査はここで打ち切っていいとなったとき
三重ループから一気に抜けるのにgoto使ったな
goto next_disk;
使わないとそうしないと何分も時間を無駄にすることになるのでね
禁止しても良いけど、処理時間が掛かります、我慢してくれますか?ってことだな
669デフォルトの名無しさん (アウアウカー Sa07-KE4L)
2018/08/04(土) 13:17:16.66ID:uWq17v08a 三十ループなんてやるのだったら間違い無く関数わけする
しかし、関数分けたら処理hourが時間がかかるって
コンパイラが最適化してくれるだろうに
しかし、関数分けたら処理hourが時間がかかるって
コンパイラが最適化してくれるだろうに
670デフォルトの名無しさん (ワッチョイ ffb3-6jVY)
2018/08/04(土) 14:02:50.07ID:AH7fLvgn0671デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/04(土) 14:16:48.41ID:2dadGiC9d >>669
小さな小さな3重ループでも
3重ループという理由だけで
わざわざ関数を分けるの?
関数を分けるべきか分けないべきかは
内容に大きく依存する
分けないべきな時に
gotoの使い方を知らないという理由で
わざわざ複雑にするのがアホだ
小さな小さな3重ループでも
3重ループという理由だけで
わざわざ関数を分けるの?
関数を分けるべきか分けないべきかは
内容に大きく依存する
分けないべきな時に
gotoの使い方を知らないという理由で
わざわざ複雑にするのがアホだ
672デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/04(土) 14:34:30.00ID:CpwGeL+S0 むしろそんなループは関数で分けるほうが適切だからな
だいたいそういうソースは知恵遅れしか追えないようなコードになってる
そして知恵遅れもどういう動きしてるか分からないようなコードになってる
だいたいそういうソースは知恵遅れしか追えないようなコードになってる
そして知恵遅れもどういう動きしてるか分からないようなコードになってる
673デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/04(土) 14:34:45.90ID:2dadGiC9d674デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/04(土) 14:49:05.09ID:CpwGeL+S0 だいたいこの程度の制御文で十分なハズだからな
バカはいちいちgoto使って追えないようなコードにするワケ
int ahoaho_exam() {
for (int i = 0; i_disk_count; ++i) {
switch (i_ret = ahoaho_exam_disk()) {
case SKIP_ALL: return SKIP_ALL;
case SKIP_DISK: continue;
default: break;
}
・・・(ここでもSKIP_ALLが返却かもしれない)
}
return 0;
}
int ahoaho_exam_disk() {
for (int i = 0; i_dir_count; ++i) {
switch (i_ret = ahoaho_exam_dir()) {
case SKIP_ALL: return SKIP_ALL;
case SKIP_DISK: return SKIP_DISK;
case SKIP_DIR: continue;
default: break;
}
・・・(ここでもSKIP_ALL、SKIP_DISKが返却かもしれない)
}
return 0;
}
バカはいちいちgoto使って追えないようなコードにするワケ
int ahoaho_exam() {
for (int i = 0; i_disk_count; ++i) {
switch (i_ret = ahoaho_exam_disk()) {
case SKIP_ALL: return SKIP_ALL;
case SKIP_DISK: continue;
default: break;
}
・・・(ここでもSKIP_ALLが返却かもしれない)
}
return 0;
}
int ahoaho_exam_disk() {
for (int i = 0; i_dir_count; ++i) {
switch (i_ret = ahoaho_exam_dir()) {
case SKIP_ALL: return SKIP_ALL;
case SKIP_DISK: return SKIP_DISK;
case SKIP_DIR: continue;
default: break;
}
・・・(ここでもSKIP_ALL、SKIP_DISKが返却かもしれない)
}
return 0;
}
675デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/04(土) 14:50:14.72ID:CpwGeL+S0 (続き)
int ahoaho_exam_dir() {
for (int i = 0; i_file_count; ++i) {
switch (i_ret = ahoaho_exam_file()) {
case SKIP_ALL: return SKIP_ALL;
case SKIP_DISK: return SKIP_DISK;
case SKIP_DIR: return SKIP_DIR;
case SKIP_FILE: continue;
default: break;
}
・・・(ここでもSKIP_ALL、SKIP_DISK、SKIP_DISKが返却かもしれない)
}
return 0;
}
int ahoaho_exam_file() {
・・・(ここでもSKIP_ALL、SKIP_DISK、SKIP_DISK、SKIP_FILEが返却かもしれない)
return 0;
}
簡単にループなんか制御できる
こんなもんにgoto使うとか愚の骨頂
int ahoaho_exam_dir() {
for (int i = 0; i_file_count; ++i) {
switch (i_ret = ahoaho_exam_file()) {
case SKIP_ALL: return SKIP_ALL;
case SKIP_DISK: return SKIP_DISK;
case SKIP_DIR: return SKIP_DIR;
case SKIP_FILE: continue;
default: break;
}
・・・(ここでもSKIP_ALL、SKIP_DISK、SKIP_DISKが返却かもしれない)
}
return 0;
}
int ahoaho_exam_file() {
・・・(ここでもSKIP_ALL、SKIP_DISK、SKIP_DISK、SKIP_FILEが返却かもしれない)
return 0;
}
簡単にループなんか制御できる
こんなもんにgoto使うとか愚の骨頂
676デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/04(土) 15:17:23.18ID:CpwGeL+S0 まず処理を小さな単位に分割する能力がない
初期化処理は初期化処理
終了処理は終了処理
基本的にgoto濫用するヤツは知能に著しい欠陥がある傾向がある
複雑な問題を簡単な単純な問題に分割する能力もない
複雑な問題を簡単な問題へと段階的に詳細化していく能力もない
オツムに致命的な欠陥があるとそうなるワケ
初期化処理は初期化処理
終了処理は終了処理
基本的にgoto濫用するヤツは知能に著しい欠陥がある傾向がある
複雑な問題を簡単な単純な問題に分割する能力もない
複雑な問題を簡単な問題へと段階的に詳細化していく能力もない
オツムに致命的な欠陥があるとそうなるワケ
677デフォルトの名無しさん (ワッチョイ a39d-10BI)
2018/08/04(土) 16:00:07.62ID:rXNKJXgT0 goto くらいで混乱するような頭が不思議でならない。
gotoもlongjmpも普通に使う。
まあでも一つの関数はA4一枚くらいにはまとめて書くようには言っているが、1mくらい
の長いコードを書くやつもいるし俺も2mくらいなら十分ついていける。
gotoもlongjmpも普通に使う。
まあでも一つの関数はA4一枚くらいにはまとめて書くようには言っているが、1mくらい
の長いコードを書くやつもいるし俺も2mくらいなら十分ついていける。
678デフォルトの名無しさん (ワッチョイ c3c3-wqW+)
2018/08/04(土) 16:03:48.29ID:d5qEm5S/0 50行で辛い
100行以上は無理
100行以上は無理
679デフォルトの名無しさん (ワッチョイ 5381-Xflc)
2018/08/04(土) 16:06:56.87ID:F7vd0ILk0 >>677
昔、ソースが2万行、各関数が200行〜400行と言うプログラムをメンテしてた
しかも、それぞれがグローバル変数とスタティック変数を使いまくり
一つの関数がそのスタティック変数の値で自在に動きが変わるという
昔、ソースが2万行、各関数が200行〜400行と言うプログラムをメンテしてた
しかも、それぞれがグローバル変数とスタティック変数を使いまくり
一つの関数がそのスタティック変数の値で自在に動きが変わるという
680デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/04(土) 16:20:59.53ID:CpwGeL+S0 あの程度の初期化処理で重いとか軽いとかいってる時点で
もうね知能の程度がしれるワケ
そんなミジンコ未満の検出できないようなレベルの差よりな
オマエが書いたクソコードのボトルネックになってるアルゴリズムを見直したほうがいいわ
なにがボトルネックになってるか検証する能力がまずないからな
前のクイックセレクトのときも知恵遅れの程度がしれたからな
知恵遅れは目的に応じた適切なアルゴリズムの選択もできない
知恵遅れにテキトーにコード書かかせるとだいたいガッカリするような結果になる
もうね知能の程度がしれるワケ
そんなミジンコ未満の検出できないようなレベルの差よりな
オマエが書いたクソコードのボトルネックになってるアルゴリズムを見直したほうがいいわ
なにがボトルネックになってるか検証する能力がまずないからな
前のクイックセレクトのときも知恵遅れの程度がしれたからな
知恵遅れは目的に応じた適切なアルゴリズムの選択もできない
知恵遅れにテキトーにコード書かかせるとだいたいガッカリするような結果になる
681デフォルトの名無しさん (ブーイモ MM67-xnas)
2018/08/04(土) 16:33:39.62ID:WQN/l48RM gotoの有無なんかより関数の行数、変数の数、ネストの方を気にして欲しいわ
プログラムなんぞ如何にエントロピー抑えるかだけだからな
プログラムなんぞ如何にエントロピー抑えるかだけだからな
682デフォルトの名無しさん (ドコグロ MM47-6jVY)
2018/08/04(土) 16:40:55.55ID:eIBb6soGM 半角カナ使う奴がドヤッてて笑うわ
683デフォルトの名無しさん (ワッチョイ a39f-Xflc)
2018/08/04(土) 18:18:57.70ID:2zclIjyW0684デフォルトの名無しさん (ワッチョイ cf80-gYkF)
2018/08/04(土) 18:40:31.54ID:CpwGeL+S0 例えば、このコード
https://ideone.com/SGwLK0
turnaround time ::= 0.0290 sec
turnaround time ::= 3.9219 sec
この差はなにに起因してるか
この差を解消する必要があるならどうすればいいか
そういったことを検証や分析できないからダメなワケ
もうねレスしてることがトンチンカンすぎるワケ
https://ideone.com/SGwLK0
turnaround time ::= 0.0290 sec
turnaround time ::= 3.9219 sec
この差はなにに起因してるか
この差を解消する必要があるならどうすればいいか
そういったことを検証や分析できないからダメなワケ
もうねレスしてることがトンチンカンすぎるワケ
685デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/04(土) 19:22:28.12ID:2dadGiC9d 遅いコードしか書けないヤツが何言っても説得力ゼロ
686デフォルトの名無しさん (ワッチョイ d3d7-Xflc)
2018/08/04(土) 19:30:28.40ID:YA1hWK5Y0 gotoを宗教とか言ってるバカに説得力なんてあったのかw
687デフォルトの名無しさん (スップ Sd1f-3fy2)
2018/08/04(土) 19:34:25.24ID:2dadGiC9d■ このスレッドは過去ログ倉庫に格納されています
