C++相談室 part140

■ このスレッドは過去ログ倉庫に格納されています
2019/01/13(日) 05:56:22.70ID:9RrR7Arz
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2019/02/05(火) 19:59:18.98ID:IbtcjqwQ
結局、関数をまともに書けというプログラムの真髄に到達する。
2019/02/05(火) 20:18:48.97ID:jcSIAavk
つCOBOL
2019/02/05(火) 20:27:12.09ID:S2UV61Jd
関数を書くのがプログラムの真髄w

基本中の基本だろうがw
真髄w
2019/02/05(火) 20:32:17.06ID:4ASLK4cx
>>512
私は、スタックが穢れない方法ならば、直接 return もあり、という美意識です
例外は断固 sjlj で実装すべきだと思っています
2019/02/05(火) 20:58:34.40ID:qTZt50kC
処理を関数に切り出すとそれまでローカルだったものがグローバルな世界に曝け出されるのが
ちょっと気持ち悪いと思うことがある。
pascalみたいなローカル関数が定義できるといいんだけどね。
526デフォルトの名無しさん
垢版 |
2019/02/05(火) 21:01:56.73ID:g0g9sCQz
>>525
ローカルクラスをファンクタにするのは?
2019/02/05(火) 21:12:38.61ID:FmL0gboT
ぶっちゃけ再利用しないものは関数化しない
2019/02/05(火) 21:23:59.05ID:4twphg+x
プログラム自体が関数だしな
529デフォルトの名無しさん
垢版 |
2019/02/05(火) 21:39:46.18ID:YX6xJwJ1
精々2重ループまでしか書かない。
3重超えるときは、前処理で跳ねるわ。
530デフォルトの名無しさん
垢版 |
2019/02/05(火) 21:50:04.80ID:YX6xJwJ1
>>525
Pimpl, 関数のスコープ内にクラス定義できるし、ラムダ式もある。
2019/02/05(火) 22:03:16.15ID:B24ls1Z9
クラスって全部ファンクタでいいよね
2019/02/05(火) 22:17:00.68ID:ttk98JAj
>>525
どうしてグローバルになると思った?
まずその認識から直したほうがよさそうだ
2019/02/05(火) 22:41:27.49ID:XWcjjk28
そりゃ素朴にやればヘッダに書くことになるからだろ
つっこむところか?
2019/02/05(火) 22:58:22.32ID:IbtcjqwQ
>>523
基本が真髄です。
まあ本当に当たり前のことが当たり前にできないプログラマなんて腐る程いるよ。
2019/02/05(火) 23:20:37.88ID:ttk98JAj
>>533
ヘッダに書くとグローバルの繋がりは無いぞ
可視性について調べてごらん
536デフォルトの名無しさん
垢版 |
2019/02/05(火) 23:30:36.12ID:g0g9sCQz
やだなあ冗談やんけ。
そんなお尻真っ赤にして怒るなよ。
2019/02/05(火) 23:55:24.87ID:J4pnNQ65
>>516
ラベルの次には文が要る(「;」で良いが

>>533
多分クラスXのメソッドX::Foo()をX::Foo()と関数bar()に分けるとしたら、
bar()がXとは直接関係を持たない関数になってXのメンバに簡単にはアクセスできなくなるか、
あるいはbar()をXのメソッドにせねばならいという面倒が生じる
と感じる…
2019/02/06(水) 00:00:34.27ID:xEjOz3Cc
bar()が独立した関数とするにふさわしい他との依存性が小さい処理内容なら別に分けても良いが、
フローの見かけを簡単にしたいという目的で>>520式の切り出しを乱発したらたちまち債務超過に…
2019/02/06(水) 00:07:33.57ID:8+AMOzIa
>>538
フローの見かけを変えたいなどというつまらない目的では無い
責務の切り出しだと最初から言っとるだろーが
責務を適切に見極められないから5重ループなんていう悪魔的なコードを平気で書いちゃうんだよ
2019/02/06(水) 00:14:56.50ID:8+AMOzIa
>>537
メソッドでいいんだよ
めんどくさくねえよ
5重ループのほうが扱いメンドクセーって
2019/02/06(水) 00:18:52.55ID:xEjOz3Cc
5組の集合の総当りとかなら5重ループで書くのがいちばん自然で速い
n組の集合の総当りとか可変になってくるなら数え上げのアルゴリズムを変える
どっちにせよ関数を増やすことは必須ではない
2019/02/06(水) 00:27:22.81ID:8+AMOzIa
内側のループで明らかに何らかの判断を行ってその結果を外側のループが利用してる
ここで行ってる何らかの判断が責務に該当するわけだ
ならばそれをメソッドの切り出して何をしてるのか明らかな名前を付けてやればいい
プログラムってのはこうやって書くんだぜ
もしこれをメソッドにしなければ何らかの判断をすることとその結果を見て何かすることという複数の責務がメソッドに割り当てられたダーティなプログラムになってしまう
2019/02/06(水) 00:33:36.55ID:xEjOz3Cc
>内側のループで明らかに何らかの判断を行ってその結果を外側のループが利用してる
外側の債務を肩代わりする内側への資金供与はどうするんじゃ…
事実上の5重ループのもっとも内側(もっとも数多く繰り返し実行される)で、事実上引数が5個あるも同然の関数をもっとも数多く繰り返し実行するのか…

ループ構造をのまま関数の構造に変換するのはあんま筋のいいアイデアではないと思うワケ
第一なんか変更があったとき直しにくい
2019/02/06(水) 00:36:02.10ID:AKR+nTaH
そりゃコードレベルで考えてるからだろう
意味を考えずにコードだけをこねくり回すから後で変更が入るんだよ
意味のある単位で関数化しろ
2019/02/06(水) 00:37:56.91ID:xEjOz3Cc
意味を考えれ、という為らば過度の多重ループは数え上げのアルゴリズムを変えた(>>543)方が…
2019/02/06(水) 00:39:50.29ID:8+AMOzIa
>>543
いつになったらループ構造を関数化しただけって勘違いを止めれるんだ?
責務で分割ってなんどいえばわかるんだろな君は
2019/02/06(水) 01:10:17.64ID:TluxhF2l
深いネスト書くやつと長い関数・クラス書くやつはダメプログラマ
2019/02/06(水) 01:14:36.80ID:LZQuj/e3
わしらじじいの時代は関数ごとに1ファイルの.cに分けて書け、と言われたもんじゃった・・・
・・今考えたらアホやな
2019/02/06(水) 01:14:44.26ID:ynCNotXu
関数型言語だとループ使わねえもんな
2019/02/06(水) 01:19:14.37ID:TVvP4aoc
全部ファンクタにしてループを抹消しよー
2019/02/06(水) 01:54:02.43ID:1PkYZi2l
C++の殆どのコンパイラはループ自体の最適化はそこそこイケるけど再帰のループへの最適化は多用できるほど強くはない印象ある
functorがマイブームっぽい人が見受けられるけどC++2aに期待かねぇ
552デフォルトの名無しさん
垢版 |
2019/02/06(水) 02:10:57.61ID:tVubCuJx
抽象化してアルゴ切り替えとか便利だし>ファンクタ。
ループ抹消は新興宗教だわ。
2019/02/06(水) 02:17:29.94ID:3iJRb7MF
C++自体もはや宗教だろ
2019/02/06(水) 05:02:26.66ID:e/w8DpDR
>>527
これ

「ループを関数として切り出せ」とか言ってる奴は身障やな!
2019/02/06(水) 05:06:05.76ID:e/w8DpDR
あと、明らかに「5重ループ」は例えに過ぎないのにここに引っかかってる奴も完全バカ
2019/02/06(水) 07:00:55.30ID:2YrOaQLS
現実のプログラムを書いたことがない奴が机上の空論言ってるんだよね

5重ループのループ変数を外側からijkmnとして
jとkとnを使ってXを計算して
iとjとnを使ってYを計算して
XとYの比較と、kとmとnを使った条件式で分岐して
一方ではXとYとiとnを使った処理をして結果をnのレベルで宣言した配列に入れる
他方ではXとYとjとkとmとnを使った処理をして結果をmのレベルで宣言した別の配列に入れる
そして2つの配列でなんやかんやして結果をさらに別の配列に入れて以下省略

無理矢理分ければ変数と配列のポインタを大量に取る醜くて意味不明な物にしかならない
関数とは「計算」や「処理」や「なんやかんや」を切り出すものであって、ループ構造を破壊して読みにくくするためのものではない
これは現実の例だ
2019/02/06(水) 07:42:14.42ID:PYjwZV54
5重ループで必死過ぎ
2019/02/06(水) 08:42:11.48ID:dLN9y6Lw
まさに関数使うべきところじゃね?
2019/02/06(水) 09:25:14.44ID:TVKvnrTY
関数に切り出すのは再利用するためだけじゃない
読みやすいコードにするためにも超重要
これが身に染みてわかるようになったら脱初心者
わかってないやつは優れたオープンソースのコードとかもっと読め
五重ループなんてまぁプルリクでrejectされるさ
もちろん捨てコードならどうでもいいけど
2019/02/06(水) 12:16:09.08ID:gpBlA5Jy
エディタ次第だけど関数化するくらいならブロックに入れてたたんでおけばよくね
2019/02/06(水) 12:29:59.92ID:1tCLVB4W
本質的に五層の繰り返し構造をとる処理は五重のループで書くのが正しいんだよ
外側の二層と内側の三層が意味的に分かれてるなら、そりゃ関数に切るのは当たり前だし正しいさ
しかし互いに絡み合った五層繰り返しを行うアルゴリズムは、そのありのままの姿をコードに落とすべきなんだよ
そういうものを見かけのループ階層を減らすために強引に切り刻むの行為はリファクタリングではなくスパゲッティ化と言うんだ
絶対にやってはいけない
2019/02/06(水) 12:33:42.12ID:5DsLQSpR
ケースバイケース
>>541みたいな例なら5重ループの方がいいだろうし各ループの意味付が違うなら関数化もあり
>>559みたいに関数でないとダメとか言ってる自称初心者卒が一番使えない
2019/02/06(水) 12:37:20.54ID:gjOdQxAx
>>561
ループの抽象化というのは貴方が思っている以上に至るところで行われている
数えてみたらいいが、何気なく書いていたコードが意外に深いループにネストされていたというのは珍しくない
2019/02/06(水) 12:40:59.66ID:CtZpHCTy
絡み合った層ってそれほんとに層なの?
2019/02/06(水) 12:47:26.83ID:gjOdQxAx
糞をいくら切り刻んでも糞
それでいいだろもう
2019/02/06(水) 14:09:03.30ID:9JAqyHM+
cppコーダーのコードは汚い。5重ループとか平気で書く無神経さ
一回でいいからJavaやC#、ruby、などクリーンな言語を学んだほうがいい
2019/02/06(水) 14:13:54.24ID:QvJUH+Yd
ΣΣΣΣΣ
と書く代わりに
Σ_{i,j,k,lm}
と書けってか?
どーでいい
議論するだけ無駄だろwwww
C++にとって可読性なんてもはや関係ない
2019/02/06(水) 14:17:48.99ID:2YrIvpU1
そして過度にLinqを使いまくって遅くなるのでした
569デフォルトの名無しさん
垢版 |
2019/02/06(水) 14:35:47.42ID:tVubCuJx
正規化されたDB使うかな、ガチの5重ループやるなら。
計算量O(log n)~O(n)位を目安にシステム設計する。
570デフォルトの名無しさん
垢版 |
2019/02/06(水) 15:30:17.65ID:kcXvzDdu
>>567
いや
そこは
ΠΠΠΠΠ
やろ
2019/02/06(水) 16:16:53.27ID:QvJUH+Yd
>>570
マジレスしようか?
5重ループも重ねるなら、πが必要な箇所だとダイナミックレンジが大きくなりすぎる。
logとってダイナミックレンジを圧縮した後Σに変えるべきなんだよ
2019/02/06(水) 18:49:37.81ID:1tCLVB4W
>>563
コンテナを舐めて順番に処理するとか検索するとかシーケンスを比較するとか
そんなのをどんどん処理単位に切って抽象化して行くことは素晴らしいし誰も反対しないね


有害なのはループは全部そう出来るというエアプログラマーの思い込み
2019/02/06(水) 18:57:19.55ID:cXGNS95r
>>572
もっとも有害なのはごく稀な場合を引き合いに出して一般論を否定しようとするやつ
2019/02/06(水) 18:58:32.19ID:ytX3d0vu
江添さんディスってやるなよw
2019/02/06(水) 19:15:14.64ID:1tCLVB4W
ほらね
「ごく稀」というまさに思い込み
しょっちゅうとは言わないが、無視できるほど少なくもないよ
分野にもよるだろうけどさ

プログラムって結局現実の問題を解決するツールなんだから
現実世界の汚さも表現しないといけないんだよ
汚物を表すコードは汚物に見えるべきであって、見せかけで綺麗なフリしようとしたって失敗するしいいことは何もない
2019/02/06(水) 19:18:24.90ID:cXGNS95r
>>575
残念ながら全体から見れば極々稀なのだよ
偶然君の関わったとこがやりにくかっただけだろう(それか単に分析スキル不足)
2019/02/06(水) 19:27:52.65ID:JChC73Df
ID:cXGNS95rが言ってる稀ってのは、
「処理単位に切れる再利用しやすいループ」でない、依存性の強いループが稀だと言いたいのか?
2019/02/06(水) 19:33:09.12ID:Uzc23Z4W
実際のところ、5重ループってインデントが深くなる以外に何か問題あるの?
579デフォルトの名無しさん
垢版 |
2019/02/06(水) 19:53:38.31ID:tVubCuJx
五つの状態変数を把握しないといけない所。
不定のタイミングでバグが起きて、他人の書いたそれを時間に追われて読まねばならん。
2019/02/06(水) 20:06:21.69ID:cXGNS95r
>>577
単一の責務で何重にもループすることは稀と言ってる
2019/02/06(水) 20:07:36.88ID:Uzc23Z4W
それ、関数に切り出して5重ループを無くしたら解消するものなの。
2019/02/06(水) 20:08:15.91ID:cXGNS95r
するよ
2019/02/06(水) 20:40:44.38ID:Uzc23Z4W
いや、すまん。お前に聞いたんじゃねぇ。
2019/02/06(水) 20:44:39.52ID:y0lrsHx+
ここまで意固地になって関数化することを否定する意味がわからん。
2019/02/06(水) 20:56:05.35ID:3iJRb7MF
書きたいように書け

以上
2019/02/06(水) 21:10:48.59ID:M+a7jld1
ループの深さだけじゃないよねジッサイの判断ってのは
幅というか
リズムが単調で深いだけなら
for (int i = 0; i < a; i++)
 for (int j = 0; j < b; j++)
  for (int k = 0; k < c; k++) foo(i, j, k);
こーいうのはたぶん許容されるでしょ

そうじゃなくてよくあるのは
for (int i = 0; i < a; i++) {
 // 何行も何行もうじゃうじゃ
 for (int j = 0; j < b; j++) {
  // 色んな変数散らかしつつうじゃうじゃ
  for (int k = 0; k < c; k++) {
   // ifとか入りながら行数増やしつつうじゃうじゃ
  }
 }
}
こーいうのが我々を苦しめるわけで
2019/02/06(水) 21:45:43.76ID:JChC73Df
関数化するかどうかというのはループの深さがどうこうという基準ではないだろう、と
>>586みたいなのも、再利用しようがなく、アルゴリズムの単純化もそれ以上出来ないならそのままであるべきだろ
関数化すりゃいいってもんじゃない
2019/02/06(水) 22:07:06.24ID:TVKvnrTY
fooって関数だろ
2019/02/06(水) 22:07:14.67ID:HAC9I//j
どうしようもなく分割統治できない感じのアルゴリズムの例って何かあるのかね。
2019/02/06(水) 22:40:02.49ID:cXGNS95r
>>587
だから何度も言ってるが責務次第なんだよ
君みたいにループの形式だけ見てメソッド化するしないを判断するのはダメ
君はまだ表面的なことしか見えてない
2019/02/06(水) 23:09:01.70ID:JChC73Df
>君はまだ表面的なことしか見えてない
何様だよお前
>>587読んだ上で言ってんのか
2019/02/06(水) 23:11:42.95ID:JChC73Df
ループの深さがどうこうじゃないと言ってんのにループの形式だけで判断?
お前偉そうに人を初心者呼ばわりしたいだけだろ
2019/02/06(水) 23:11:46.32ID:3iJRb7MF
C++は宗教だから異なる宗派同士がわかりあえることはない
不毛な議論
2019/02/06(水) 23:58:01.47ID:ytX3d0vu
せやな
2019/02/07(木) 00:29:29.04ID:jeiltBqQ
>>504
ありがとうございます。たしかにできました。ただそれだけでな呼び出しも
return Class<T, U>::f2<E>(x, y);
から
return Class<T, U>::template f2<E>(x, y);
に変更する必要がありました。
template ←これがどういう役割なのかわかりませんが。
f2が何かと曖昧さを回避する役割があるのかと思いますが、
何と曖昧なのかよくわからないところです。
2019/02/07(木) 00:36:56.13ID:FsbblVW+
この板の1日の訪問者数って、学校の1クラス程度なの?
2019/02/07(木) 00:43:20.80ID:BE/93ARs
>>595
テンプレート内では、型の後の::に続くテンプレートがテンプレートであると
示してやらないといけないらしい
非テンプレートな関数内なら省略できる
>>384も同じ理由
2019/02/07(木) 00:47:59.60ID:EjTN/ClM
>>579
おまえ状態変数の意味分かってないだろwwww
2019/02/07(木) 01:15:09.76ID:jeiltBqQ
>>597
なるほど。何をしなければいけないかはわかりました。ありがとうございます。
しかし、どうしてこうなっているんでしょうね。
2019/02/07(木) 01:28:48.78ID:YGlzE19V
>>599
テンプレートの展開結果は実際に展開されるまでわからん。
Class クラスに <T, U> 型を適用した結果として
出来る f2 が型なのか変数なのかテンプレートなのかは f を定義した時点ではまだわからんし、
わからんのでは構文解析できん。

もし f がテンプレートではないのであれば、
f の定義時点で Class の展開はされるから、
f2 が何であるかはわかる。
2019/02/07(木) 02:06:35.36ID:b+LBP2oh
700重ループなら次のように書いたらええ
int cn[701] = { ... };  // [0..699]: ループ回数(ここでは全部0より大きいとする)、[700]: 番兵
int ci[701] = { 0 };  // [0..700]: ループ変数
cn[700] = 2; // 番兵
do {
 (ci[0..699]に依存する処理)
 ci[0]++;
 for (int i = 0; ci[i] >= cn[i]; i++) {
  ci[i] = 0;
  ci[i + 1]++;
 }
} while (c[700] == 0);

いや知らんけど多分、
2019/02/07(木) 02:12:21.12ID:jeiltBqQ
>>600
そういうことすか。親切にありがとうございました。
2019/02/07(木) 12:06:02.32ID:FsbblVW+
【製作中 の wasm(WebAssembly)/MS Windows 共通の Window System】

http://nowsmartsoft.atwebpages.com/

このサイトを訪れたユニークユーザー数は、「1」だ。おいらのことだよ。
ひきこもりの L より。
2019/02/07(木) 17:20:28.22ID:YGlzE19V
>>603
L って LightCone 氏だったの?
2019/02/07(木) 17:21:14.65ID:fRacvqu0
DeathNoteの作者によれば、別人らしい。
2019/02/07(木) 17:22:57.71ID:fRacvqu0
まだ、ユニークユーザー数は、5 だ。
reddit という世界最大の掲示板(?)にも書いてきたけど、時差の問題で
まだなのかな。でも、テレビなんかとは全然視聴者数が違うみたいだ。
607デフォルトの名無しさん
垢版 |
2019/02/07(木) 18:39:38.68ID:86zgFFA7
見てきたけど、これはもしかして良いものなのでは?
2019/02/07(木) 19:08:50.57ID:fRacvqu0
wasm に興味を持つ人が増えるといいな。
609デフォルトの名無しさん
垢版 |
2019/02/07(木) 19:30:41.56ID:86zgFFA7
ブラウザで普通に動いてびっくり。
2019/02/07(木) 19:52:59.41ID:Y+oxZntz
何がすごいのか教えてくれないか‥
2019/02/07(木) 20:01:39.01ID:hAIKTwic
CPU で直接実行してこその asm であって、ブラウザ上の仮想マシーンで実行するとかいう asm に何の意味があるのか?
612デフォルトの名無しさん
垢版 |
2019/02/07(木) 20:02:49.47ID:86zgFFA7
同じソースコードがウィンドウズとブラウザで動くらしい。
613デフォルトの名無しさん
垢版 |
2019/02/07(木) 20:04:39.28ID:86zgFFA7
C++ユーザーがウェブにリーチできるのは凄いのでは。
2019/02/07(木) 20:05:17.04ID:Y+oxZntz
>>612
確かにそれはすごいけど、このブラウザで動いてるやつがどう凄いのか理解できない
2019/02/07(木) 20:06:42.02ID:ln/cuVF1
何に使うのか知らんけど選択肢が増えるのは良い
2019/02/07(木) 20:07:52.71ID:e0jRAAR5
なにかにつけてwebは再発明の歴史だよな
2019/02/07(木) 20:10:25.85ID:ln/cuVF1
>>613
Qtがhttpサーバー作ってたからそれでよくね
2019/02/07(木) 20:21:51.16ID:+esGdO37
いちいちユニークユーザーを監視されるのが嫌だら見てないけど
emscripten と何がちがうんだ?
2019/02/07(木) 22:10:43.10ID:fRacvqu0
ユニークユーザー数は、13人。その内オイラが2人分にカウントされている。

実は、プログラム技術板は、1日20人くらいしか来てない事は誰にも知られ
ちゃいけない秘密・・・。
2019/02/07(木) 22:13:04.24ID:fRacvqu0
そしてこのスレは、1日15人も来てない・・・。
むむむ。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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