[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/12 01:51 / Filesize : 317 KB / Number-of Response : 1019
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け 147



1 名前:デフォルトの名無しさん [2018/08/16(木) 23:36:02.22 ID:fOCSKLtw.net]
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
codepad.org/

C11
www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/


C言語なら俺に聞け 146
https://mevius.5ch.net/test/read.cgi/tech/1525031257/

152 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 21:28:19.40 ID:yJL450CM.net]
別にiocccのコードが読めろとか言ってない
int *aryがint ary[100]じゃなきゃ読めないとかぬかしたり
while(1)がfor(;;)じゃなきゃ読めないとかぬかす
想像を絶するアホには付き合ってらんねつってるだけ
lock/doit/unlockを関数化する必要性がわからないアホも含まれる

153 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 21:33:30.14 ID:Jjipv9/i.net]
>>151
「じゃなきゃ読めない」ってどこかに書いてたっけ?
そんな気はしてたが、やっぱり日本語不自由な人だったらしい。

154 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 21:42:00.39 ID:yJL450CM.net]
じゃあ喚くのやめろ
うるせえんだよ

155 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 21:43:08.30 ID:Jjipv9/i.net]
>>153
やっぱり日本語不自由な人なんだw

156 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 21:51:19.93 ID:Vzjpb7lE.net]
何がじゃあなのかわからない
思考がbool値しかないのか

157 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 21:51:23.19 ID:wgajpaTM.net]
アトミックな操作の意味がわかってたらああはならんのですよ

158 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 21:52:48.42 ID:Vzjpb7lE.net]
世の糞コードのほとんどはコミュニケーションの失敗により発生する

159 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 21:54:35.09 ID:Jjipv9/i.net]
C言語以前に日本語もちゃんと理解できない人と議論が噛み合うわけない。
相手しただけ損したわ、アホらしい。

160 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 22:02:56.29 ID:yJL450CM.net]
勝手に損してろ
誰にも賠償請求できない
泣き寝入りだな
アホw バカwww



161 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 22:05:01.83 ID:Jjipv9/i.net]
はいはい、ちゃんとにほんごをべんきょうしてりかいできるようになってから、かきこんでくださいね。

162 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 22:13:51.56 ID:RPMrdt6N.net]
まあ概ね ID:yJL450CM が言っていることは正しい。

>>107のコードは、かなり特殊で、普通はあり得ない。
キモイかと問われれば、キモイと答えるのが正しい。
(必要ならやればいいが)

>>116
それはdo-whileの標準的使い方とは異なるので、混乱を招く。

>>132
check_func()は、107を書き直した場所がすぐに分かる名前にしただけ。
実際、問題なく伝わってるだろ。
本番コードでこの名前はあり得ない。名前が被るから。


ただ、正直、こんなどうでもいいところで拘るのは止めた方がいい。上達しなくなる。
どれでもいいから自分が好きなのを選び、グダグダ言わずにどんどん書いた方がいい。
なお、Goにはwhileが無い。廃止されて、forだけになっている。

ちなみに、俺は
固定長ループ(単純ループ): for … for (int i=0;i<num;i++) 程度の簡単な場合は常にこれ
可変長ループ(複雑なループ): while
無限ループ: while (1)
do-while: 使わない
にしているが、正直、ここら辺は好みだし、自分がどう決めるかだけ。(上記は標準的だとも思っているが)
それよりは、自分の中で統一するほうが重要だ。
(少なくとも自分が書いたコードを読むときに混乱しなくなる)

業務なら、グダグダ言わずコーディングルールに従えばいい。
場所によってはwhileとforのどちらかが禁止とかもある。(どっちかは忘れた)
理由はバグって無限ループにしてしまったときにコード上から判定しづらいとかだったはず。

163 名前:107 mailto:sage [2018/08/22(水) 22:19:27.48 ID:Vm7yolE7.net]
非常にくだらない質問にレス付けてくれてサンクス
なんか荒れる原因つくってスマンかった

やっぱりあの書き方きめえよなあ・・・

164 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 22:57:41.03 ID:RPMrdt6N.net]
>>112
> LOCK, UNLOCKのインデントがズレててキモい
これは諦めろ。
酷い話、インデントがぴったり合ってないと駄目な奴はプログラマに向いてない。
どうやってもずれるからだ。
googleのコーディングルールにも昔は
・インデントを揃える努力は、キリがないしやるだけ無駄だから諦めろ
と書いてあったはず。(今見る限りないが)


ちなみにキモイ理由は、インデントではなくて、完全に入れ子になっていないからだ。
最近はこの「入れ子」の厳密さも増していて、XML(HTML等)では入れ子しか文法的に認めないだろ。
例えば、

<while>
</while>

ならありだが、

<lock>
<while>
</lock>
</while>

は駄目で、

<while>
<lock>
</lock>
</while>

にしなければならない。

165 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 00:15:44.74 ID:wxGNRrqx.net]
>>161
do while の標準的な使い方?
無限ループも標準的な使い方ですよ

do whileはforやwhileに比べてパフォーマンスが良いことがあるので
使える時には積極的に使う人もいます

do whileを一切使わない人もいますが

166 名前:デフォルトの名無しさん [2018/08/23(木) 00:29:51.18 ID:qYtPM3Ou.net]
>>107
対称性保たれてるし、よくあるコードだぞ。
俺はキモイと思わん。

167 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 00:38:41.07 ID:wxGNRrqx.net]
ロックしたい対象がわかりづらい
同じ用途のロック/アンロックが2箇所ずつある

168 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 00:40:13.64 ID:wxGNRrqx.net]
C++の場合だと
無駄にロック期間が長くなる可能性がある

169 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 00:53:05.68 ID:/qY100we.net]
>>167
なんで?

170 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 00:59:32.58 ID:HinwMmX/.net]
頭が良い人ならすぐに意図がくみ取れるけど
メンテする人が必ずしも頭が良いとは限らない
コメント書いてもバグではまって始めて読まれたりするからね
ワザと作られた落とし穴なんて受けとられる危険もありそう

バカでも分かるような書き方をする方が安全かなと思う



171 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 01:59:34.18 ID:y9Wx8uZn.net]
>>164
>>116のコードは、while (1) で開始しても同じだし、(=do-whileを使う意味がない)
そもそも>>113に比べてメリットもないだろ。
そこで do-while 使う奴なんて皆無だと思うぞ。

まあそれでもやりたければやればいい。
個人開発ではメチャやって、その失敗を業務に生かした方がいい。

ただ、上達したければ、ある程度普通のコーディングルールで組んだ方がいい。(世間に合わせる)
自分と相手のルールが一致してたら、相手のコードも読みやすく、
結果、同じ時間、同じ努力でも読める量に違いが出てくるから。

あと、初心者はよく
・色々文法を知ってて、様々な書き方が出来る奴が偉い
と勘違いしがちのようだが、これは明確な間違いだ。(これは他言語では本当に酷い)
こんな糞どうでもいいところを様々な書き方をしているような奴は雑魚だ。
上手い奴は、そいつが決めたやり方に従って、一定の書き方で書く。


172 名前:から、後で読み直すときも楽だってこと。
自分の手書き文字なら相当汚くても読めるだろ。それに近い。

基本的には意味のない手動インライン展開は止めた方がいい。
それは無駄に関数を大きくする。
関数呼び出しのコストが気になるなら、C++なら inline が用意されてる。
そもそもロックなんて糞遅いから、そこでCPU命令数個ケチる意味もないはずだが。

可読性を上げる為に最初にやるべきなのは、関数を分割して小さくすることだ。
呼び出しコストは考えず、分割しまくった方がいい。
結果、抽象度が上がり、読みやすくなる。(全体を読まなくても済むようになる)
[]
[ここ壊れてます]

173 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 03:30:32.78 ID:w8vcpguW.net]
あくまで、プログラマが初心者の場合の話だけど。

いろいろなソースを見てきたけど。
仕事としてやるなら、初心者は、なるべく関数化してほしくないかな。
練習としてなら、いいけどね。

関数化する等して、抽象化した方が見やすいソースになるかというと、
間違いじゃないけど、正しくもない。

有能なプログラマーが書いたソースは素晴らしいし、可読性も申し分ない、うん。
でも、クソなコードは、関数化しちゃいけないものが、関数化されているなどが原因で、
追跡が難くなるんだな。
オブジェクト指向を謳う言語のソースなんか、C以上にプログラマーの手腕によって、
可読性の差が生じてしまう。関数だけでなく、クラスの設計が腐ってて、どうしもないとかね。
そうゆうソースの追跡は辛いわ。

Cの場合、ぐちょくちょなソースの場合、関数化されていない方が、
コードのメンテ等で、強引に追跡する際は苦労が少ない、そんな感じ。

174 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 04:08:27.50 ID:rN/Im7Tc.net]
そんなこたねえよ
関数を作った方がいいしファイルを分けた方がいい
ネストは浅い方がいい

175 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 05:49:50.39 ID:OJr5a4rA.net]
>>116
なぜわざわざbreakなんて使うんだ?
素直にこれでいいでしょ
do {
LOCK
判断結果 = 判断
UNLOCK
} while(判断結果)

176 名前:デフォルトの名無しさん [2018/08/23(木) 06:27:06.53 ID:OG65bZxS.net]
>>173
breakしないと条件が偽の時にも処理が動いてしまうからでは
きっとループの中になんらかの処理があるはず

177 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 06:33:10.57 ID:HkL3Bs+i.net]
>>174
> きっとループの中になんらかの処理があるはず
書いてもないものが見える謎の病気w

178 名前:デフォルトの名無しさん [2018/08/23(木) 07:24:39.71 ID:qYtPM3Ou.net]
>>172
分割しすぎも考えものだけどな。
>>113も視点移動が増える書き方で、可読性やメンテナンス性が悪いという人もいる。

179 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 07:52:07.91 ID:wxGNRrqx.net]
>>170
do while のが軽い場合がある
って常識だと思ったが

>>175
私も当然他の処理があると思った
無いとするとビジーループか?
これだと気持ち悪いとかいう以前の問題になる

180 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 08:12:35.84 ID:wxGNRrqx.net]
>>172
行数やファイルの数で値段が決まる業界の人?



181 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 08:16:18.32 ID:wxGNRrqx.net]
全てのLOCK/UNLOCKのペアはそれだけで関数にする
2重ループやループ内のswitch caseは使わないで関数に分ける

いろんな人がいるね
自分では本当に例外なく実践してるんだろうか

182 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 08:31:20.08 ID:wxGNRrqx.net]
宗教の例

gotoは使ってはいけない
2重ループは使ってはいけない
3項演算子は使ってはいけない
インデントは全て揃える
全てのリテラルは別途定義する
変数名に型情報を埋め込む
関数の途中でreturnしてはいけない
関数は小さいほど良い
条件分の中に関数コールや副作用のある文を書いてはいけない
インクルードファイルをネストしてはいけない
コメントは全て /* */ で (// や #if 0 を使ってはいけない)
全ての演算子のネストに対して ( ) をつける
全てのロック、アンロックのペアは関数に分けなければいけない

183 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 08:38:21.29 ID:NBx27jJF.net]
>>180
宗教の集大成がMISRAだな。
ほとんどがルールにあるわ。

184 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 08:41:48.74 ID:KjqMFLSY.net]
switch caseはは無駄にカラムを消費する。から嫌い。

185 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 09:21:50.49 ID:itriZIP9.net]
>>176
視点移動になるのは下手な関数化だ
サブルーチン呼び出しを1命令と読めるようにするのが
構造化プログラミングの本質

186 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 09:48:06.49 ID:O7XDpWhz.net]
>>183
ある程度の規模の関数になると結局その1命令に見えるはずの処理が正確に何してるかを理解するためには関数内を覗くはめになっちゃう。
覗かないですむほど関数仕様を単純化すると今度は関数が増えて管理の手間が増える矛盾。
後者のほうが正解なんだろうけど、なかなか理想通りには行かないよね。

187 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 09:52:28.00 ID:XUhqK5T4.net]
その方向性の行き着く先がオブジェクト指向

188 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 09:52:54.19 ID:itriZIP9.net]
>>184
ある程度の規模ってLOCK/UNLOCKの話だぜ?

189 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 10:01:30.20 ID:O7XDpWhz.net]
>>186
あ、そなの?
一般論かと思ってた。

190 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 10:11:39.46 ID:rN/Im7Tc.net]
>>178
ファイル数とか初めて聞いたよ。
疎結合高凝集は大抵の場面で正義だよ。トータル1000行のソースだったら好きにすればいいが。
あと関数にもファイルにも「意味のある名前をつける」
ある意味大変難しいんだがこれができれば保守性が全然違う。



191 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 10:34:14.06 ID:3bgfj1QZ.net]
規模は覗かないとわからんよ

1個の関数からしか呼ばれないたった3行の、
ただ単に特定のループの終了条件を示す為の関数
結局両方見ないと意味不明

こんな関数が山ほどあるプロジェクトは悪夢だ

192 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 10:36:26.67 ID:rN/Im7Tc.net]
エディタが悪いんじゃないか?

193 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 10:40:50.31 ID:3bgfj1QZ.net]
たった3行の為に
関数名を考え
関数ヘッダを作成し
プロファイリングや静的解析ツールやMAPの項目も増える

大きく依存した関数なのに
グローバル関数とローカル関数を分けて書くという宗教を理由に
全然別の場所に書く

最悪ですねえ

こういう人は
ifなども含め、複数文からなる全ての条件判断を関数にするんでしょうか
あり得ないですね

もちろん単なる1個のループの終了条件ではなくて
その条件に意味があって
他でも使う可能性があるなら関数に分けるべきですが

194 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 11:09:24.18 ID:itriZIP9.net]
>>187
改めて一般論をしても構わんが

195 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 11:29:56.84 ID:rN/Im7Tc.net]
プロファイリングのときってstaticな関数も同列に扱うもんなの?

196 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 11:40:17.42 ID:HinwMmX/.net]
ある程度の規模、って
サイトによって違うんだし
一般化はできないんじゃ

197 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 12:10:32.95 ID:O7XDpWhz.net]
>>194
地雷臭がするから煽るのやめとけってw

198 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 12:48:09.07 ID:iNuWULI+.net]
>>177
> 私も当然他の処理があると思った
> 無いとするとビジーループか?
> これだと気持ち悪いとかいう以前の問題になる
君のレベルが低いだけ
最近のプロセッサはロック/アンロックをハードウェアレベルで行うようになってるけどビジーループ自体は使われてる
スピンロック でググれ

199 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 15:13:34.14 ID:HinwMmX/.net]
>>195
アリガトス、鼻の敏感なお方

200 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 15:40:21.02 ID:/qY100we.net]
>>191
行数の問題じゃないんだよなあ



201 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 16:15:45.18 ID:rN/Im7Tc.net]
「長いから分割する」という発想で関数作ってる人は割といるんだよ。
そうするとまあコンテクストが広い範囲に分散してつらい。

202 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 16:28:54.58 ID:EgEtgRif.net]
そういえば昔客とソースレビューしてて、
引数チェックのための早期returnしてたら、

客「途中returnはやめてください」
俺「そうするとネストが深くなりすぎますよ?」
客「それなら関数に分けて下さい」
俺「分けた関数の先でも引数チェックするので同じですよ?」
客「それならその先の関数も別の関数に分けて下さい」
俺「…(反論するのめんどくせえ、言うとおりに作ってしまえ)」

結果、思い出すのも恐ろしい意味不明な関数ばかりのコードが出来上がったわ。

203 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 16:54:56.17 ID:rN/Im7Tc.net]
途中リターン禁止ってほんとアホだよね。要はreturnの否定だからな。
最近はMISRAからも外れてるらしいが

204 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 17:00:42.78 ID:itriZIP9.net]
>>191
単なる1個のループの条件に意味がないことなんてあるのか?
たった3行というがlock/unlockという2行で
他のタスクが干渉しないようにガードする必要がある条件だぞ
干渉されるとしたら何でだ? それでも意味がないのか?

205 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 18:14:09.43 ID:wxGNRrqx.net]
>>196
CASもLL/SCもアトミックなR-M-Wも使うけど
どう考えてもそんなコードじゃないだろ
知らない癖に書くなよ

206 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 18:30:50.97 ID:9jasVWpA.net]
そこまでローレベルの話じゃないと思うよ
無関係ではないけど

207 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 19:15:54.01 ID:iNuWULI+.net]
>>203
> 最近のプロセッサはロック/アンロックをハードウェアレベルで行うようになってるけど
って書いてあるのにCASとか出してくるアホ乙

208 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 19:28:43.42 ID:k97Awv43.net]
じゃあハードセマフォか?
それスピンロックじゃないよな

恥の上塗りwww

209 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 19:51:18.42 ID:iNuWULI+.net]
>>206 が必死にググって見つけて来た関係ありそうな(でも全く頓珍漢な)言葉 → ハードセマフォ
自爆志願者かよ w

210 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 19:59:05.89 ID:k97Awv43.net]
>>196自体がとんちんかんなわけだがwww



211 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 19:59:23.06 ID:EgEtgRif.net]
な、ここのスレは読解力が乏しいのにお互いにマウント取り合って傍から見たらアホちゃうのって奴が多いだろ?
よくもまあLOCK/UNLOCK如きで生産性のカケラもない議論できるわ。
よほど暇なんかな?

212 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 20:01:59.92 ID:k97Awv43.net]
LOCK/UNLOCKごとき
だよねえ

213 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 20:17:25.18 ID:e3M4pNLl.net]
ハードセマフォってなに…?

214 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 20:24:14.60 ID:k97Awv43.net]
ハードウェアセマフォ

215 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 20:25:47.93 ID:HinwMmX/.net]
C言語のはなしに戻ってくるのはあと何日先かな

216 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 20:27:03.48 ID:k97Awv43.net]
話題があれば

217 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 20:28:12.68 ID:EgEtgRif.net]
初心者でもベテランでも新しい気付きがあるような内容に早く戻るといいね。

218 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 20:49:36.75 ID:EgEtgRif.net]
400メートルなら連続で泳げるけど、800メートルはよほどペース落とさないと無理だわ。

219 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 20:49:53.03 ID:EgEtgRif.net]
あ、ごめんなさい。
誤爆しましたm(_ _)m

220 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 20:50:49.19 ID:Uo7RxZ0m.net]
400も800も違わんだろう



221 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 21:08:53.97 ID:wxGNRrqx.net]
違うだろ

222 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 21:13:49.03 ID:ZsFwDbjK.net]
>>200
客「(コイツらには二度と仕事頼まんとこ、無能すぎ)」

223 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 21:41:28.27 ID:OJr5a4rA.net]
>>208
ハードセマフォには敵わないよ w

>>211
ググればどんだけ頓珍漢かよくわかる

224 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:03:27.73 ID:ZsGoqTtC.net]
>>220
多分両方ともそれなりに正しい方法を知ってるのに
会話の祖語からとんでもないところに着地するケースだな

225 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:13:17.45 ]
[ここ壊れてます]

226 名前: ID:y9Wx8uZn.net mailto: >>176
> 視点移動が増える書き方で、可読性やメンテナンス性が悪いという人もいる。
それは正しく分割出来てないから。(同じ抽象度で分割する)
読まなくても分かる名前を付けて、結果的に読まないから、視点移動はしない。例えば、以下。

while (1) {
int idx = get_data_idx();
if (idx<0) break;
int* data = prepare_data(idx);
calculate_data(data);
write_back_data(data, idx);
}

この部分はマルチスレッドでのデータ処理だとしよう。
get_data_idxは未演算のデータのインデックスを返し、ない場合は、-1を返すとしよう。
単純に、「インデックスを受け取り、チェックし、データを用意して演算して書き戻す」と読めるだろ。
そこでget_data_idxの中身を見ると、マルチスレッド用だからロックされてる、というだけ。
(余談だが>>107にはこういう具体性が見えないので、
> LOCK/UNLOCKが必要な具体的な場面を想定しての発言には見えない (>>122)
と言われている。これも当たっている)

「視点移動ガー」は読み方を間違っている。
プログラムが階層構造のツリーとして、
縦に掘るのではなく、横に読んで、必要であればその部分だけ縦に読むんだよ。
まず最初は同階層で全体の流れを把握して、必要であればその実装を読む。
実装を読む場合、名前と実装が一致しているかだけのチェックしかしない。

家を建てるとして、
全ての柱が設計図通りに組み上げられているか(全体のチェック)と、
それぞれの柱が設計図通りの仕上がりになってるか(ほぞ穴が正しく加工されてるか)は別にチェックするだろ。
プログラミングも同じで、上位と下位は別にチェックするんだよ。
同時に読まないからいちいち子関数に視点移動なんてしないし、視点移動しなくて済むように同抽象度で分割するんだよ。
[]
[ここ壊れてます]

227 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:16:11.26 ID:y9Wx8uZn.net]
>>177
> do while のが軽い場合がある
> って常識だと思ったが
それはお前が何も知らない初心者だから。

do while は初回のチェックが入らない分速い。(逆に言えば、その分だけしか速くない)
君は「なんだか知らないが do-while は速いんだ!」位の理解しかしてないだろ。
そんな馬鹿はC界隈にはいない。

問題は、この「初回チェックしない分速い」のをいちいち取り上げる必要があるか、という点で、
殆どの場合はどうでもいいから do-while は使われない。
ただし、どうしてもケチりたい場合は使われる。
(ルール等で駄目なら手動で初回部分だけインライン展開しても同じだが、それよりは do-while 使った方がいい)

禁止する必要はないけど、使う局面もない、といったところだと思うよ。

初回のチェックが必要ない=その前か上位で初回チェックが必要ないことを保証している、であって、
全くチェックしていないわけではないんだよ。
結果、処理を整理して集約していくと、while文に吸収されることもある。
或いはそうならないとして、ど頭でチェックだけして不要ならショートカットしたい等の場合、
別にチェック+ do-while になるが、それはメトリックスを増やしてしまう。(静的コールグラフ)
どのパスを通るかがデータ依存になり、それがかなり大きな区画になってしまうだろ。
それよりはショートカット出来ないけどどんなデータでも同じパス、
whileで弾かれて空振りするだけ、のほうがメンテナンスが遙かに楽なんだよ。
ここら辺はさんざんメンテナンスしてれば分かるようになるし、してないうちには分からない。
お前は相当それ以前だが。

「僕はdo-whileの方が速いケースもあるのを知ってるんだ!」ってのは痛いだけだから止めとけ。
自分でアホだと言っているようなものだ。
そんなことはみんな知ってて、その上で議論している。
コード分岐を増やすのが、1回のチェックを端折るのと釣り合うか?なんだよ。

228 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:18:42.67 ID:wxGNRrqx.net]
長文から悔しさがにじみ出てますよ

229 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:19:37.23 ID:ZsGoqTtC.net]
成功するまでリトライみたいなのってdo-while使わない?

230 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:20:37.13 ID:wxGNRrqx.net]
do {
} while (0);

こんなのもごくたまに



231 名前:さまよえる蟻人間 mailto:sage [2018/08/23(木) 22:22:18.83 ID:Z2Fii0dD.net]
do-whileはマクロで文をまとめるのによく使うよ。

232 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:23:48.32 ID:wxGNRrqx.net]
>>227のセミコロンを取ったヤツ

233 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:26:06.91 ID:y9Wx8uZn.net]
ただマジで、初心者はこの手の話に首を突っ込まない方がいい。
時間の無駄で、上達を阻害するだけ。

コードの美しさ/抽象レベル/分割/隠蔽/疎結合が必要なのは少なくとも200-1000行程度であって、
50行程度ならグダグダ言わずにベタで密結合で書き下した方が分かりやすい。
10行のプログラムを動かすにも苦労する初心者にも、
理解に少なくとも200行程度書ける腕前が必要な内容を教えるから空回りする。
(とはいえ、初段階の洗脳は必要悪だ、というのがJava教団であるが。
そしてFizzBuzzはイテレートするクラス、判定クラス、表示クラスに分割され、
イテレータがインタフェースとして活用される、というのが件の悪ノリだった)

1000行程度も書けない初心者は、まず1000行書けることを目指せ。(1000行程度なら勢いで書ける)
コードの美しさその他はその辺になればだんだん分かってくる。
その後に、自分で「コードを減らす」練習をした方がいい。
(コードを「書く」よりも「減らす」方が上達する、と言う奴は居て、俺もそう思う)

それまでは自分でコーディングルールの優劣を判定する頭もないのだから、(これはちゃんと認めた方がいい)
オレオレルールではなくて、コードを書いている連中のルールをそのまま使った方がいい。
俺はgoogleがいいと思うが。
(なお意識高い系C++erはgoogleのルールはもう古い!と言いだした模様。
俺は布教用のルールなんてゴミだと思っているが、まだチェックはしてない)


>>180-181
MISRAは「自分でどのルールが無駄か判断出来る人向け」であって、
お前らみたいな「自分では判断出来ない初心者向け」ではないんだよ。
素直にとりあえずgoogle使っとけ。

234 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:27:16.39 ID:wxGNRrqx.net]
こいつNG

235 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:28:37.43 ID:y9Wx8uZn.net]
>>184
> 覗かないですむほど関数仕様を単純化すると今度は関数が増えて管理の手間が増える矛盾。
管理の手間は増えないと思うが。

もし増えていると感じるのなら、それはCには階層がないことの弊害だ。
関数内関数が普通に使える状況であれば、
関数切り出しは「処理を纏めて名前を付けただけ」でしかなく、
外部からその関数が呼ばれることが文法的にないことを保証出来るから、手間は増えない。

そしてこの点に、妥協的だが現実的なのは「名前に階層も付けてしまう」だ。
つまり、AAA階層内の関数はAAA_get_data_idx()等にし、
もし仮にAAA_get_data_idx内でさらにローカル関数が必要な場合は、AAA_get_data_idx_BBBにしてしまう、というものだ。
関数名が長くなる点を除いて問題はないし、「grep出来るから便利」 by Linus。
OOPも実質同じで、フルパスで呼ぶなら AAA->get_data_idx->BBB()等、_ が -> に代わるだけだが、
実際はオブジェクトポインタ=途中のポインタだから、obj->BBB()となり、長くならずに済む。
(ただし、grep出来なくなる)

俺もCに階層記述能力がないのは問題だと思っているが、
現実的に分割/疎結合化が必要なのは200-1000行単位であり、
ここは「ファイル」(=モジュール)で分割しろ、というのがCだ。
だから不満ではあるが結果的に何とかなってしまうのも事実で、だからこそCがまだ生きながらえている、というのはある。

それにしても「関数内関数」は欲しいんだけどね。あと、ラムダも。
(gccでは前者は標準、後者はマクロで対応出来るが)

236 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:34:14.90 ID:za+Z/fW8.net]
>>230
1000業かけるお題を教えてください(。・´_`・。)

237 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:35:46.52 ID:4VjbPjMt.net]
親切に俺condwaitって書いたのに…

238 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:37:11.87 ID:ZsGoqTtC.net]
関数のレベル感あわせるのむずい
あわないだろ

239 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:49:21.25 ID:OJr5a4rA.net]
>>224
> do while は初回のチェックが入らない分速い。(逆に言えば、その分だけしか速くない)
違う、>>177はコンパイラがあまり賢くない時代の知識で止まってるロートルってだけ

240 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:50:32.61 ID:/xlV6A++.net]
現在通過中
風はそれほどでも無いが雨量がヤバい、尋常じゃない



241 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:50:52.78 ID:/xlV6A++.net]
誤爆した

242 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:50:52.87 ID:wxGNRrqx.net]
「軽い場合がある」

243 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:52:49.79 ID:wxGNRrqx.net]
デメリットは数文字ソースコードが増えるだけ
生成されるバイナリが悪くなることは無い
良くなる可能性はある

244 名前:デフォルトの名無しさん [2018/08/23(木) 22:54:11.95 ID:qYtPM3Ou.net]
>>223
> それは正しく分割出来てないから。
そう。だから、>>113は正しく分割できていない、という人がいると書いたんだが。

245 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:54:57.75 ID:wxGNRrqx.net]
do while を使わない(使えない)人っているよね

246 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 22:57:34.92 ID:wxGNRrqx.net]
常に正しく分割されてるコードしかいじらないわけでも無いだろうし
常に正しく分割出来るとも限らないし
正しいか正しくないかは視点によっても違う

理想だけ語るだけで実際にコードを組んだ事が無さそうな人がいるようだけど

247 名前:デフォルトの名無しさん [2018/08/23(木) 23:01:12.83 ID:FIun2PeI.net]
>>237
気圧申告しないと!

248 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 23:01:58.95 ID:wCnARv+4.net]
ワッチョイないのに結局レスするんか

249 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 23:03:30.31 ID:NMfUyUL+.net]
>>230
>FizzBuzzはイテレートするクラス、判定クラス、表示クラスに分割され、イテレータがインタフェースとして活用される、というのが件の悪ノリだった
どんなコードになるのでしょうか?一度みてみたいものです…

fizzbuzz はこんなコードを書いたことがあります
https://mevius.5ch.net/test/read.cgi/tech/1434079972/25
https://ideone.com/i8wMea

250 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 23:18:47.64 ID:y9Wx8uZn.net]
>>226
具体例あるか?
それ以前に「成功するまでリトライ」自体がよろしくないが。


>>236
do-whileに対して何か特殊な最適化がかかるという話なら、
俺は知らんから突っ込めない。
が、そうだとしても、それでコードを汚すこと自体が間違いだが。


>>241
そう思うんならそれでいい。
平行線だし、議論しても結果は出ない。
君のコードを見て他の人がどう思うかはそれぞれの自由だ。

俺はこの場合関数に括り出す方を選択する。
同様の連中もここにいるだろ。それだけの話さ。

ただそれ以前に、アトミックなんて最初から関数に括り出されていると思うが。
インラインアセンブラを使う気でなければそもそも無理だし。例えば、以下。
https://msdn.microsoft.com/ja-jp/library/dd78zt0c(v=vs.110).aspx


>>245
あー、8は俺だ。
ワッチョイありで立て直してくれればそっち行くわ。
(俺が立て直してもいいが)



251 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 23:43:58.22 ID:y9Wx8uZn.net]
>>246
俺の記憶では、「FizzBuzz Implementation in Java」みたいなタイトルでGitHubに在ったはず。(だが出てこない)
★も2000位ついていたと思った。
クレームついて取り下げるとも思えないから、検索順位下げられたんじゃね?

そんなに見たければ自分で探せよ。多分まだそのまま公開してると思うぜ。

252 名前:デフォルトの名無しさん mailto:sage [2018/08/23(木) 23:45:37.65 ID:Ml8TmHvL.net]
1000行書けるお題を教えてください






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<317KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef