C言語なら俺に聞け 146

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 839f-AnMQ)
垢版 |
2018/04/30(月) 04:47:37.50ID:XX4FB8lc0
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
2018/07/30(月) 22:06:32.60ID:Ei1MMj+i0
>>554
上位3名に入れそうだね?
2018/07/30(月) 22:17:34.44ID:aSIGzv/D0
quickselectもアホ
上位3個なら原始的なアルゴリズムが一番速い
2018/07/30(月) 22:18:31.28ID:aSIGzv/D0
速くて簡単でリソースも使わない
2018/07/30(月) 22:19:07.01ID:Z5guDo9v0
課題みたいだし
・バブルソートを書けるか
・保持する要素は3つでいいことに気付けるか
をみる定型問題だろね
2018/07/31(火) 08:53:15.13ID:CiY/UjgCK
アルゴリズムもわかってない
まず、問題解決のための適切なアルゴリズムの選択ができない

クイックソートは明らかに適切ではない
ここではクイックセレクトが適切

確かにこのスレには
まともな教育を受けたのはいない

基本的になにも知らなすぎる
白痴に近い
2018/07/31(火) 09:25:34.54ID:quzd6t9e0
クイックセレクトってどんなアルゴリズムなん?
元はクイックソートだけどソートしないで選択するだけって感じ?
561デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/31(火) 09:39:58.84ID:+/oTEV5Ja
>>560
無駄な比較をしない感じ
2018/07/31(火) 11:52:18.67ID:Sty7sRvnH
>>560
パーティショニングして目的の順位を含む方だけ再帰
2018/07/31(火) 12:06:11.93ID:TL2AM5+0M
あー、そういうことか
2018/07/31(火) 12:43:01.65ID:xftY0DAGd
明らかに上位3個の抽出には向かない
2018/07/31(火) 12:45:03.91ID:xftY0DAGd
最大値を探すのにクイックセレクトを使うアホはいない
そういうこと
3個でも同じ
566デフォルトの名無しさん (ワッチョイ 6f02-FeqO)
垢版 |
2018/07/31(火) 13:12:03.24ID:kZi5wZ5a0
入力毎に判定。
3プールのmin以下なら無視。
maxより大きいなら順位シフト。
mid以下ならmin上書き。
それいがいはmidをminにしてmid上書き。
2018/07/31(火) 13:17:53.66ID:xftY0DAGd
そういう原始的なアルゴリズムが最良
2018/07/31(火) 13:21:36.88ID:xftY0DAGd
最悪パターンは小さい順に並んだ時だが
これでもせいぜい数倍になるだけ

クイックセレクトの最悪値は酷い

もちろん典型例でも原始的アルゴリズムの方が速い
元データも変更不要
メモリも3個分だけ
2018/07/31(火) 13:29:26.70ID:NZiCEZHW0
1,ソート対象...data[5, 3, 12 ,8 ,6]
2,メモリをソート対象の最大値個数分確保...a[12]
3,ループでa[5]=data[5], a[3]=data[3]...と全部入れる
4.詰めてオシマイ

史上最速ソートだと思わないか?ループ1回で終わるどw
 
2018/07/31(火) 13:45:59.26ID:j6W8yzMq0
>>569
バケットソートだね〜
値の重複がある場合はリストをつなぐ必要があるし
今回の問題は要素が実数値だから不適になっちゃうけど
2018/07/31(火) 13:49:32.57ID:hTiFVqvS0
質問内容によるとソート対象は実数値なんだが
2018/07/31(火) 13:49:52.96ID:NZiCEZHW0
>>570
あ、そういう名前で実際あるんだね・・・
素晴らしいアイディアだと思ったのに(´・ω・`)
573デフォルトの名無しさん (ワッチョイ 6fe5-FeqO)
垢版 |
2018/07/31(火) 14:44:47.46ID:riS9l2jZ0
値をいれる必要はない。
各要素を出現回数のカウンタにすれば重複数も記録できる。

だがこれができるのは入力が整数で表せる場合だけ。
574デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/31(火) 14:46:44.33ID:UZkSYp0La
ま、しかし、普通の数値で100しかデータがないと今時のPCだとどんなアルゴリズム使っても人間が感じられないぐらいのスピードで実行しちゃうと思う。
わざとsleepとかするなら別だが。
2018/07/31(火) 14:57:40.88ID:PCFGvven0
今は熱対策が必要だな
2018/07/31(火) 17:49:39.11ID:xftY0DAGd
>>574
桁数が異常に長い入力とか
チープなマイコンとか
まあ色々と考えられる
577デフォルトの名無しさん (アウアウカー Saef-2Ess)
垢版 |
2018/07/31(火) 17:55:01.37ID:UZkSYp0La
あー。1万桁のデータが100個とか。w
2018/07/31(火) 17:58:48.84ID:zWbJ6Mhya
スレッドの引数に渡す構造体を↓みたいにして、
クラスのメンバ関数ポインタを渡そうとしたんですがエラーになります。

info.pfunc = test.callの部分はどう書くのが正解ですか?

typedef struct
{
void (*pfunc)();
} TInfo;

class TestClass
{
public:
void Call(void)
{
cout << "呼んだ" << endl;
}
};

main()
{
TestClass test;
TInfo info;

info.pfunc = test.call;
}
2018/07/31(火) 18:03:58.43ID:Yh1Yhi2x0
最近はC言語にクラスがあるの?
2018/07/31(火) 19:15:37.92ID:NZiCEZHW0
static void Call()
581デフォルトの名無しさん (ワッチョイ 1680-1o86)
垢版 |
2018/07/31(火) 20:20:43.19ID:4WdKzGL90
#include <stdio.h>
typedef struct tag_baka_t t_baka_t;
typedef int (*baka_func_t)(t_baka_t const* pt_baka);

typedef struct tag_baka_t {
char* text;
baka_func_t function;
} t_baka_t;

int call_baka1(t_baka_t const* ct_baka) { fprintf(stdout, "baka1:%s\n", ct_baka->text); return 1; }
int call_baka2(t_baka_t const* ct_baka) { fprintf(stdout, "baka2:%s\n", ct_baka->text); return 2; }
int call_baka3(t_baka_t const* ct_baka) { fprintf(stdout, "baka3:%s\n", ct_baka->text); return 3; }

int call(t_baka_t const* ct_baka) {
return ct_baka->function(ct_baka);
}

int main(int argc, char* argv[]) {

t_baka_t baka1 = { "boo", call_baka1 };
t_baka_t baka2 = { "foo", call_baka2 };
t_baka_t baka3 = { "woo", call_baka3 };

fprintf(stdout, "called baka1 -> returned %d\n", call(&baka1));
fprintf(stdout, "called baka2 -> returned %d\n", call(&baka2));
fprintf(stdout, "called baka3 -> returned %d\n", call(&baka3));
return 0;
}

C言語の構造体ならコレでいける
コレならバカでも分かるハズ
C++の構造体でも同じように書ける
2018/07/31(火) 20:29:50.71ID:qpn2fVfCd
ばかばっか
2018/07/31(火) 20:29:50.72ID:V319xmHP0
>>578
節子それc言語やないで
2018/07/31(火) 20:33:19.91ID:j6W8yzMq0
>>578
完全にC++ですやん
https://ideone.com/GkgfzA
とりあえずstd::functionの使いどころかなとは思うけど
2018/07/31(火) 21:00:04.51ID:YzKZx0BTa
>>584
これっぽいですね、ありがとうございます

オブジェクトポインタと関数ポインタを別スレッドに渡して、
スレッドでその関数を定期的にコールすることをしたかったんです
586デフォルトの名無しさん (ワッチョイ 6f9f-53i4)
垢版 |
2018/07/31(火) 23:06:10.75ID:ljgZb1RQ0
次からはC++の質問はC++のスレへ。
2018/08/01(水) 16:42:35.83ID:9yb7YrdQ0
クイックソートのwikipediaに書いてあるc言語のソースに、
【value_type tmp, pivot = med3(a[i], a[i + (j - i) / 2], a[j]); /* (i+j)/2 ではオーバーフローしてしまう */】
と書いてあるのですが、「(i+j)/2ではオーバーフローしてしまう」のオーバーフローする場合がまったくわかりません。
教えていただけますか。
2018/08/01(水) 17:40:34.16ID:TGp/sEuFd
i, jがどんな値かによる。
i == 0x7fffffff && j == 0x7fffffff
で、i + jがどんな整数値になるか考えたまえ。
2018/08/01(水) 18:09:35.03ID:9yb7YrdQ0
ありがとうございます。理解出来ました。
下限上限への理解がまだまだでした…
2018/08/01(水) 18:20:26.56ID:edgaccID6
>>587
unsigned char i=128,j=128,k;
k=i+j;
2018/08/01(水) 19:46:12.42ID:xh0kKqMn0
>>578が578のやり方でtest.Callのアドレスを渡せないのはなんでなん?理由が知りたい。
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++の質問はここで」辺りで願います 
詳しい人いるだろうし
2018/08/01(水) 20:28:43.32ID:xh0kKqMn0
>>592
そのざっくりな説明だけでもわかりやすい。なるほどありがとう。
2018/08/01(水) 20:34:52.96ID:xh0kKqMn0
ググったら安定のロベールさん出てきた。買った方がいいなこれ基礎力でえらい差が出てしまう気がしてきた
595デフォルトの名無しさん (アウアウウー Sa43-53i4)
垢版 |
2018/08/01(水) 20:52:58.87ID:WDXOLOCva
C++の話はC++スレでやれ。
2018/08/01(水) 21:33:20.86ID:jJEMbL0b0
なんだ結局ロベールのステマかよしょうもねえな
2018/08/01(水) 22:23:36.11ID:ArWxfDp8a
>>592
分かりやすい説明
598デフォルトの名無しさん (ワッチョイ cf80-gYkF)
垢版 |
2018/08/02(木) 00:25:44.59ID:6TeXhDWV0
オーバフロー以前に
ポインタ同士の足し算なんかしないからな(Cでは普通のやりかたではできない仕様になってる)
ポインタ同士の足し算なんかしたらおもいっきりオーバーフローすることがあるからな
つまり簡単にオーバーフローはおきうる
ポインタにはアドレスが入ってるからな

やってることは
基準になるオフセット(ここでは左端)に距離を足すだけといっていい
距離は通常ポインタの引き算で求める

距離は左端と右端の距離の半分の距離に
基準になるオフセットに足す
すると中間点になる

つまり中間点固定

しかしピボットが中間点固定だと最悪のケースの場合
クイックソートはものすごく遅くなる

で、ピボットを乱数で選択することで
その最悪のケースを回避するというやりかたもある

実際の現実のデータでそんな最悪のケースはほぼないといっていい
2018/08/02(木) 00:29:26.39ID:c3/ck1cgd
すいません初心者です、質問なんですが・・・
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 (;;) こう書くと無限ループになる
2018/08/02(木) 00:43:35.36ID:c3/ck1cgd
なるほどそういう仕様だったんですね・・・
丁寧にありがとうございますこれでようやく眠れる
2018/08/02(木) 01:18:26.80ID:4HyEhcJnM
>>600
continueがあるとちょっと書き換えが必要だけどね
2018/08/02(木) 06:45:33.31ID:S4Pms+eVM
>>602
書き換え?
i = 1;
whlle (i <= 5) {
 ・・・
 goto CONTINUE;
 ・・・
CONTINUE:
 i++
}
ってやるだけだろ
2018/08/02(木) 07:13:00.94ID:PxPZ0mdd0
それが書き換え

ってのが>>602の主張だろ
2018/08/02(木) 09:43:21.84ID:NSwKZwuS0
for文でのcontinueの挙動を最近知ったばかりで自慢したかったんだろ
2018/08/02(木) 09:48:48.46ID:Bu8RCR+yd
if
for
while
do while
goto
break
continue

このくらいしか無いんだから全部覚えとけ

なぜかgotoの使い方を知らんヤツが多い
多重ループを抜けるのにわざわざフラグを使うアホとか
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
大体使わなくて済むし
使う必要がある時に
さりげなく使うもの
2018/08/02(木) 14:17:14.48ID:TfLreE+60
全く使わない 脱出用途なら使う 飛び込みでも使う
611デフォルトの名無しさん (アウアウカー Sa07-iFcb)
垢版 |
2018/08/02(木) 16:25:02.06ID:SFe9zIxEa
脱出時だけ使ってるな。
関数の途中で複数エラーが出る可能性がある場合とかは関数の最後の方にgotoさせてそこでまとめてメモリ解放などをする。
他の言語だと例外投げて try catch でなんとかするようなやつだな。
612デフォルトの名無しさん (ブーイモ MM67-2iw7)
垢版 |
2018/08/02(木) 18:05:39.94ID:QNpgl+2ZM
飛び込みはやめーや
2018/08/02(木) 18:57:08.60ID:yzfiTIk96
脱出はreturnにすればいい
2018/08/02(木) 19:01:34.31ID:xZR22mJ60
returnが複数あるのを嫌がる宗派があるからなあ
2018/08/02(木) 19:11:54.12ID:1EegAYN5d
>>613
宗教の信者さん?
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 エラーじゃ
2018/08/02(木) 19:15:38.12ID:hFhSdR7O0
>>614
確かに、misra が全力でそれを嫌うのは、なにか理由があってのことでしょうか?
2018/08/02(木) 19:20:08.81ID:zwgkA1lD0
>>616
俺もこれ派だわ
2018/08/02(木) 19:26:51.94ID:1EegAYN5d
○○派とか言うと他の方法を知らないように感じる
臨機応変に色々の方法を使い分けるのが良い
2018/08/02(木) 19:33:21.75ID:xZR22mJ60
コーディング規約を決める偉い人の信仰心に依存する、か
2018/08/02(木) 19:35:06.17ID:zwgkA1lD0
>>619
あとよく使うのがagainだな
ループでagainしたい時に上に飛ぶやつ
2018/08/02(木) 19:41:55.73ID:1EegAYN5d
コーディング規約を偉い人が決めるような会社は嫌だな
2018/08/02(木) 19:43:01.73ID:1EegAYN5d
偉い人はもっと大きな事を考えて
2018/08/02(木) 20:10:50.62ID:Cjo1mv3c0
エラー起こす前にちゃんと検査しろ。
2018/08/02(木) 20:30:01.75ID:1NEFWSVpM
retryとoutは使うわ
後始末不要ならその場でreturn
後始末必要なら最後にreturn

まあこの辺の書き方より関数名、変数名、変数の数を気にして欲しいと思う今日この頃
2018/08/02(木) 22:24:28.26ID:NSwKZwuS0
Cのgotoが関数から出られない、という時点で
悪しきgotoの大部分が封じられているんだけど
せっかくそうなっているのに1関数で数千行なんてやらかす
何というか吹っ切れたやつが暗黒面に墜ちていると
とんでもねえんだよ
2018/08/02(木) 22:30:24.78ID:hFhSdR7O0
>>626
>Cのgotoが関数から出られない、という時点で悪しきgotoの大部分が封じられている
ところがどっこい、setjmp()/longjmp() というものがありまして…
2018/08/02(木) 22:43:04.03ID:xZR22mJ60
longjmpでイスカンダルまで飛びたいんですけど
何故か地球に戻ってしまいます
2018/08/03(金) 02:01:51.21ID:TY6Sib0f0
イスカンダルのトーフ屋
2018/08/03(金) 05:37:20.02ID:o9dqmONZ0
孫悟空はsetjmp/longjmpの使い手
2018/08/03(金) 09:55:27.36ID:UvsVeV1Q0
組込み人は状態変数でワープする。
2018/08/03(金) 10:02:42.04ID:8VyIMXmS0
スタック上の戻りアドレスを自分で操作して、好きな場所にワープさせてた奴いたっけな
2018/08/03(金) 10:12:18.20ID:9KGEdKKU0
>>627
longjmpで悪しきgotoを
やって見せてくれ
ideoneで
2018/08/03(金) 14:40:50.79ID:9KGEdKKU0
悪しきgotoの大部分を封じるときに
巻き添えで封じられた悪しくないgotoを救う
アイテムがlongjmpだろうがよ
2018/08/03(金) 19:36:07.75ID:4c00FTp80
gotoの効率の良さは取立ての生うにの味
636デフォルトの名無しさん (アウアウカー Sa07-iFcb)
垢版 |
2018/08/03(金) 20:15:47.20ID:X+nM2ZWla
gotoは良く切れる刀のようなもの。
その怪しい魅力に取り憑かれダークサイドに堕ちた者は数知れず。
2018/08/03(金) 20:42:44.92ID:6lqoN/6FM
昔のBASICはその鋭い刃しかなかったってことか
2018/08/03(金) 20:43:55.37ID:I1YZhHYF0
GOSUBとかなかった?
2018/08/03(金) 20:49:49.72ID:8VyIMXmS0
fortranからの伝統芸
640デフォルトの名無しさん (ワッチョイ ffd2-ej6N)
垢版 |
2018/08/03(金) 21:11:54.24ID:1LNshpyd0
その昔サブルーチンの存在を知らなかった頃
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);
}
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;
と初期化しておくだけでどう後始末すれば判定できる
2018/08/03(金) 23:44:52.51ID:8VyIMXmS0
>>645
後始末ってエラー時だけじゃなく終了時にも使いたいから
未使用かどうかを分かる様にしとくと色々便利だよね
2018/08/04(土) 00:39:50.00ID:iUNKVgUH0
Linux は、goto でエラー処理をまとめてる

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;
}
2018/08/04(土) 05:10:46.07ID:YA1hWK5Y0
>>641
適切に構造化できないアホさん乙
2018/08/04(土) 05:53:52.28ID:I5yMWHTla
>>648
goto使わず普通に関数呼べばいいだけでは
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;
}
2018/08/04(土) 08:12:49.13ID:mQQzn2Q+0
gotoを使った方がシンプルで見易いコードになるにも関わらず
頑なに使わない信者さん
>>606の振りで始まったにも関わらずたくさん出てくるね
2018/08/04(土) 08:15:22.02ID:mQQzn2Q+0
わざわざ専用構造体と専用後始末関数と専用エラーコードをつくってわざわざ複雑にしてるアホもいるし
変数名で自己紹介してるから自覚はあるんだろうけど
2018/08/04(土) 08:22:18.05ID:mQQzn2Q+0
初期化と後始末を包んだ関数もいるね

十数行で済むシンプルな関数に
何十行使うつもりだか
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況