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:XX4FB8lc0570デフォルトの名無しさん (ワッチョイ 232d-E0Ep)
2018/07/31(火) 13:45:59.26ID:j6W8yzMq0571デフォルトの名無しさん (ワッチョイ 378a-qjVX)
2018/07/31(火) 13:49:32.57ID:hTiFVqvS0 質問内容によるとソート対象は実数値なんだが
572デフォルトの名無しさん (ワッチョイ e3bb-53i4)
2018/07/31(火) 13:49:52.96ID:NZiCEZHW0573デフォルトの名無しさん (ワッチョイ 6fe5-FeqO)
2018/07/31(火) 14:44:47.46ID:riS9l2jZ0 値をいれる必要はない。
各要素を出現回数のカウンタにすれば重複数も記録できる。
だがこれができるのは入力が整数で表せる場合だけ。
各要素を出現回数のカウンタにすれば重複数も記録できる。
だがこれができるのは入力が整数で表せる場合だけ。
574デフォルトの名無しさん (アウアウカー Saef-2Ess)
2018/07/31(火) 14:46:44.33ID:UZkSYp0La ま、しかし、普通の数値で100しかデータがないと今時のPCだとどんなアルゴリズム使っても人間が感じられないぐらいのスピードで実行しちゃうと思う。
わざとsleepとかするなら別だが。
わざとsleepとかするなら別だが。
575デフォルトの名無しさん (ワッチョイ 4b8a-vSp+)
2018/07/31(火) 14:57:40.88ID:PCFGvven0 今は熱対策が必要だな
576デフォルトの名無しさん (スップ Sd52-fKXU)
2018/07/31(火) 17:49:39.11ID:xftY0DAGd577デフォルトの名無しさん (アウアウカー Saef-2Ess)
2018/07/31(火) 17:55:01.37ID:UZkSYp0La あー。1万桁のデータが100個とか。w
578デフォルトの名無しさん (アウアウカー Saef-zedw)
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;
}
クラスのメンバ関数ポインタを渡そうとしたんですがエラーになります。
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;
}
579デフォルトの名無しさん (ワッチョイ 9f50-fKXU)
2018/07/31(火) 18:03:58.43ID:Yh1Yhi2x0 最近はC言語にクラスがあるの?
580デフォルトの名無しさん (ワッチョイ e3bb-53i4)
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++の構造体でも同じように書ける
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++の構造体でも同じように書ける
582さまよえる蟻人間 ◆T6xkBnTXz7B0 (スフッ Sd32-HzQc)
2018/07/31(火) 20:29:50.71ID:qpn2fVfCd ばかばっか
583デフォルトの名無しさん (ワッチョイ 129f-lgLX)
2018/07/31(火) 20:29:50.72ID:V319xmHP0 >>578
節子それc言語やないで
節子それc言語やないで
584デフォルトの名無しさん (ワッチョイ 232d-E0Ep)
2018/07/31(火) 20:33:19.91ID:j6W8yzMq0585デフォルトの名無しさん (アウアウオー Saea-zedw)
2018/07/31(火) 21:00:04.51ID:YzKZx0BTa586デフォルトの名無しさん (ワッチョイ 6f9f-53i4)
2018/07/31(火) 23:06:10.75ID:ljgZb1RQ0 次からはC++の質問はC++のスレへ。
587デフォルトの名無しさん (ワッチョイ 1681-2QVD)
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ではオーバーフローしてしまう」のオーバーフローする場合がまったくわかりません。
教えていただけますか。
【value_type tmp, pivot = med3(a[i], a[i + (j - i) / 2], a[j]); /* (i+j)/2 ではオーバーフローしてしまう */】
と書いてあるのですが、「(i+j)/2ではオーバーフローしてしまう」のオーバーフローする場合がまったくわかりません。
教えていただけますか。
588さまよえる蟻人間 ◆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が時間がかかるって
コンパイラが最適化してくれるだろうに
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 【サッカー】驚異の42得点0失点 中国を怒涛の5連勝に導いた日本人指揮官がまさかの退任か。協会対応に国民激怒 [征夷大将軍★]
- 【テレビ】25年ぶり復活「炎のチャレンジャー」南原清隆&菊池風磨がMC 懐かし「電流イライラ棒」も [湛然★]
- 【音楽】BARBEE BOYS・KONTAが事故で四肢麻痺を公表、新体制で活動は継続 [少考さん★]
- 【画像】童貞は絶ッッッ対"4"を選ぶバレー部J Kが寮でパンパンの集合写真見つけちゃったwwwwwwwwwwwwww [904880432]
- ( ・᷄ὢ・᷅ )あ?
- ブタをぶったたく
- こんな自転車乗ってたやつがいたら?
- 高校球児が大相撲入り。悪そうな顔しとるw [737440712]
- キムタク主演のドラマに山下の曲つければ爆売れ間違いなしだよな
