X



C++相談室 part148
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
垢版 |
2020/01/31(金) 20:54:06.26ID:Nt0XFA2s
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part147
https://mevius.5ch.net/test/read.cgi/tech/1576659413/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
0002デフォルトの名無しさん
垢版 |
2020/01/31(金) 21:08:18.93ID:88e+X9K2
>>2
2get乙。
0004デフォルトの名無しさん
垢版 |
2020/01/31(金) 21:28:55.62ID:88e+X9K2
>>1
1get乙。
0005デフォルトの名無しさん
垢版 |
2020/01/31(金) 21:32:42.96ID:aVH6lH01
gotoの話でもするか? それともマクロ? ハード絡みのところなんか俺的にはオモロイが
0006デフォルトの名無しさん
垢版 |
2020/01/31(金) 21:35:23.06ID:yrj+fbAX
前スレ999だけと循環してないよ
仮想アドレス使ったら必ずページフォルトするわけじゃない
MMUの仕組みわかってる?
0009デフォルトの名無しさん
垢版 |
2020/01/31(金) 21:48:37.69ID:88e+X9K2
じゃあ俺も前スレ999です。
0010デフォルトの名無しさん
垢版 |
2020/01/31(金) 21:59:36.62ID:yrj+fbAX
>>7
999へのレスって意味ね
文脈で理解してほしいところだが
で循環論法でないことわかった?
0011デフォルトの名無しさん
垢版 |
2020/01/31(金) 22:13:11.58ID:HzrC4w9c
環境を限定しないならこれ以上続けても無駄
全ての環境を知ってるヤツでない限り
0012デフォルトの名無しさん
垢版 |
2020/01/31(金) 22:16:13.72ID:88e+X9K2
すべての環境を知っている。
0014デフォルトの名無しさん
垢版 |
2020/01/31(金) 22:56:57.70ID:88e+X9K2
>>13
俺はわかった。
0016蟻人間 ◆T6xkBnTXz7B0
垢版 |
2020/01/31(金) 23:38:50.35ID:r/XM8LG1
struct AutoDeleteFile {
const WCHAR *m_file;
AutoDeleteFile(const WCHAR *file) : m_file(file) { }
~AutoDeleteFile()
{ DeleteFileW(m_file); }
};
0018デフォルトの名無しさん
垢版 |
2020/01/31(金) 23:56:13.21ID:v4E0eL1J
ともかく最初に思ってることがあって
要は荒らしてやろうと
今回は結構うまくいった方かな
この前は
「std::deque には begin() end() clear() があるのに
 std::queue と std::stack にそれらが無いのは何故?
 有ったほうが便利なのでは?」
って質問で大分いい感じにスレを流した
そら、有ったほうが便利に違いないし、無いことに合理的な理由など無いわけだから荒れる
そういう、荒れそうなネタ考えるのに毎回結構頭使う
ただ、ちょっと前の goto のやつ、あれはダメ
初心者がワーワー騒いでるだけで、ほとんどのベテラン連中は静観してたと思う
俺の狙いはそれじゃない
あと、妹大好きです
0021デフォルトの名無しさん
垢版 |
2020/02/01(土) 00:03:19.42ID:K9hiSYW1
なんだと!
0025デフォルトの名無しさん
垢版 |
2020/02/01(土) 00:44:51.53ID:K9hiSYW1
でも、もともと主張がおかしかったから、釣りだったのはホントじゃないの。
0026デフォルトの名無しさん
垢版 |
2020/02/01(土) 00:49:11.46ID:pUJoLXPw
釣りっていうかただの構ってちゃんな。何か深い考えがあるというわけでもないし。
0027デフォルトの名無しさん
垢版 |
2020/02/01(土) 00:49:56.15ID:K9hiSYW1
釣りじゃなかったら相当痛い人だし。
釣りならちょっと痛い人で済むよ。
0028デフォルトの名無しさん
垢版 |
2020/02/01(土) 00:52:13.74ID:K9hiSYW1
ところで僕は自分の職業の板ってまったく見ないんだけど。
ここは職業プログラマが多いの?
0029デフォルトの名無しさん
垢版 |
2020/02/01(土) 00:53:02.37ID:K9hiSYW1
なんで見ないかというと得るものが全くないから。
0031デフォルトの名無しさん
垢版 |
2020/02/01(土) 02:05:11.46ID:efnE+DyP
わしも見ない
あそこは仕事のグチを書きこむとこやん
こっちは言語仕様のグチを書きこむとこや
0036デフォルトの名無しさん
垢版 |
2020/02/01(土) 10:19:22.01ID:Bc9LjLbW
ネアンデルタール人はホモサピエンスの基底クラスであったか。

ネアンデルタール人のDNA、アフリカの現生人類からも検出 新研究
https://www.cnn.co.jp/fringe/35148770.html
2020.01.31 Fri posted at 13:15 JST
0037デフォルトの名無しさん
垢版 |
2020/02/01(土) 11:58:10.08ID:YFAnTUnh
多重ループを抜ける方法

ループに名前は名前を考えるのがイヤ
break [数字] は数えるのがイヤ
関数を分けてreturn はもっとイヤ
変数を使ってbreakで抜けるのは論外
でもgotoはなんとなくイヤ

全ての要望に答えたのが >>32
0038デフォルトの名無しさん
垢版 |
2020/02/01(土) 12:17:12.69ID:pUJoLXPw
バカの要望を聞いてさらにロクでもない方向に行ってしまうっていう
わかりやすい例を提供してくれてありがとう。
0040デフォルトの名無しさん
垢版 |
2020/02/01(土) 12:31:58.09ID:YFAnTUnh
ん?
皮肉のつもりで書いたんだけど
真面目な書き込みととらえられるとは思わなかった
0044デフォルトの名無しさん
垢版 |
2020/02/01(土) 13:00:03.90ID:TULylXcw
>>37
おれはおもしろいアイデアと思う
他に考えるとしたら
やはり名前があった方が変更に強いと思うのでその線でいくと
大抵ループにはイテレータやカウンタが紐づいてるから
それを使って
for (auto& x : なんとか) {
 for (auto& y : なんとか) {
  .break x;
 }
}
とかどうだろ?
for以外で使えないしforでも宣言空だとだめだけど
頻繁に使うわけじゃないだろうから妥協できるかなと
0047デフォルトの名無しさん
垢版 |
2020/02/01(土) 13:19:23.65ID:fiLTG5Nb
while(){} や do{}while(); で使えないので却下
0048デフォルトの名無しさん
垢版 |
2020/02/01(土) 15:04:44.31ID:7G0Z2VlM
for(int x = 0; i < ... )
{
 int y = 0;
LOOP:
 a[x][y]...
 ++y;
 if(...){ break; /*多重ループ脱出*/ }
 goto LOOP;
}
0049デフォルトの名無しさん
垢版 |
2020/02/01(土) 16:42:25.84ID:hd+by06W
>>37
何個の break を書くのか、と break の後に書く数字は? で
結局のところ同じように数えなきゃならないでしょ。
0051デフォルトの名無しさん
垢版 |
2020/02/01(土) 17:34:30.73ID:pUJoLXPw
こういうしょーもないシンタックスの話って馬鹿でもしやすいのが盛り上がる理由なんだろうな。
0054デフォルトの名無しさん
垢版 |
2020/02/01(土) 17:55:08.95ID:YFAnTUnh
break 9;
を数えたく無いとか言ってたヤツがいたけど
そういう時は素直にgotoを使えば良い
0056はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/01(土) 18:08:11.40ID:6nnXKMBq
>>55
C++ ではオブジェクトの寿命の管理と辻褄を合わせなきゃならないんだから full continuation は無理だぞ。
0059デフォルトの名無しさん
垢版 |
2020/02/01(土) 18:12:34.25ID:Bc9LjLbW
ループに名前を付け、その名前で離脱や継続を行う。

ループA {
0060デフォルトの名無しさん
垢版 |
2020/02/01(土) 18:16:20.88ID:Bc9LjLbW
途中で送信してしまった。面倒だから書き直さないが、
breakやcontinueはキーワードが紛らわしいのでPerlのlastとnextを拝借する。
last ループA; とか next ループA; みたいな感じ。
0062デフォルトの名無しさん
垢版 |
2020/02/01(土) 18:18:49.32ID:vKrtBnhX
gcc5ぐらいから一気にgcc10にしたらエラー表示とかデフォルトの警告とか色々変わっててわろた
0063デフォルトの名無しさん
垢版 |
2020/02/01(土) 18:19:46.95ID:Bc9LjLbW
>>61
まあね。だけどgotoはフリーダムすぎて良くないでしょ。
0065デフォルトの名無しさん
垢版 |
2020/02/01(土) 18:52:41.69ID:pUJoLXPw
>>52
コンパイラ毎の最適化における癖とか、例外の実装についての差異なんかも語ってもいいんだぞ。
0066はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/01(土) 18:56:33.52ID:6nnXKMBq
>>63
goto は自由すぎるけども、ループを何段階も一気に抜けたいとかいう状況がすでにだいぶん自由だと思うぞ。
そういう状況が生まれたらもう駄目なんだよ。
ごちゃごちゃとした使い分けを考えるよりおとなしく goto した方が「そこが悪い」ってのが目立って良い。
0067デフォルトの名無しさん
垢版 |
2020/02/01(土) 19:01:47.00ID:YFAnTUnh
一番使いたいのは2段break
行列や画像など2次元構造では当たり前のように2重ループになる

2重ループを抜けたい状況は設計が悪い
と思う感覚が全く理解できない
0069デフォルトの名無しさん
垢版 |
2020/02/01(土) 19:04:12.92ID:YFAnTUnh
2次元構造の2個のループを抜ける為に
非常に関連のある2個のループを別関数に分ける

この方が設計が悪い
というのがおれの感覚
0070デフォルトの名無しさん
垢版 |
2020/02/01(土) 19:07:14.52ID:JWECbGc7
>>67
gotoは悪、多重ループは悪、みたいなどこかで聞いたルールを杓子定規に常に遵守すべき絶対ルールのように考える人が少なからずいるんだろうね。声が大きいだけかもしれないけど。
0072デフォルトの名無しさん
垢版 |
2020/02/01(土) 19:10:50.63ID:PjJtYhAX
中カッコ、変数の有効範囲含め
スコープ内に飛び込むジャンプを一切禁止、前方のみと決めれば
なかなか直観的でわかりやすいキーワード
だとおもうのに
0073デフォルトの名無しさん
垢版 |
2020/02/01(土) 19:19:24.65ID:YFAnTUnh
一切禁止とか言うから
それが絶対だと初心者が思って思考停止する
この典型がgoto

使った方が良い時は使う
再帰も生ポもグローバル変数も多重継承も多重ループも
0074はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/01(土) 19:25:00.72ID:6nnXKMBq
>>67
ここでワイが「悪い」って言ってるのは使うなとか別の方法がとれるとかいうほどの強い意味じゃなくてさ、
気を付けなきゃならないポイントとして目立ってもらわなきゃ困るって程度の意味。

だけど、日常的にそこら中でそういうポイントがあるのならやっぱり悪いとは思うけど……。
0079デフォルトの名無しさん
垢版 |
2020/02/01(土) 19:48:45.53ID:7G0Z2VlM
贅沢言いすぎだね
素のPascalなんてreturnすら無いからね
もはやどうやってプログラムを書いたらいいか分からないレベル
0080デフォルトの名無しさん
垢版 |
2020/02/01(土) 19:53:54.21ID:7G0Z2VlM
Pascalは完璧な構造化言語を目指したから
入口と出口を常に一つずつにするというポリシーがあって
それゆえreturnが無いんだよね
returnがあると出口があちこちに散らばるので
構造化じゃない、汚い、という考え

なお、breakは有るもよう
0082はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/01(土) 20:02:08.79ID:6nnXKMBq
抽象的なレベルで考えたら break は
「残りの文が if 式で囲まれていると見なして暗黙のフラグを設定する (そのフラグは暗黙にループの終了条件でもある)」
とも考えられるから、構文糖だといえば構造化は壊れていない。

だけどなぁ、プログラムは人が書くものだし、人にとってどう見えるかも大事なんだよな。
そこらへんは見方によってどうとでも理屈を付けられてしまう。
0083デフォルトの名無しさん
垢版 |
2020/02/01(土) 20:04:46.46ID:+WgC03YT
[&]{
try{
for(){
 for(){
  throw 2;
 }
}
}catch(int d)
{printf("%d段階ジャンプしたお¥n",d);}
}();
0088デフォルトの名無しさん
垢版 |
2020/02/01(土) 20:53:59.21ID:+WgC03YT
[&]{
try{
for(){
 for(){
  throw "リレミト";
 }
}
}catch(const char*s)
{printf("%sの呪文を唱えた¥n",s);}
}();
0092はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/01(土) 21:14:53.51ID:6nnXKMBq
ほんまになぁ。
そんな簡単なことをラベル付き break だのなんだのって面倒なだけとしか思えぬ。
もう構造化は破綻してるんだからおとなしく goto しとけよな!
0093デフォルトの名無しさん
垢版 |
2020/02/01(土) 21:19:44.00ID:dP/tym/A
>>89
日本語が不得意みたいなので英語で説明しますね
Double loop frequently appears to treat a two dimension structure such as matrix or image data,
so "break from double loop"is used by programmers related mathematical or visual product.
>>67 states that is good reason and s not always bad design.
0100はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/01(土) 21:34:56.10ID:6nnXKMBq
>>96
同じだからそれ以上に新しい文法を持ち込んでもそれほど綺麗にならんって! ということを言いたい。
0102デフォルトの名無しさん
垢版 |
2020/02/01(土) 21:38:38.94ID:TULylXcw
>>96
gotoは正しく使えばという但し書きがつくでしょ
そこをなんとかしたいという話だと思ってる
それが論点だとするとgoto使えというのは解にならない
0106デフォルトの名無しさん
垢版 |
2020/02/01(土) 21:48:36.93ID:7G0Z2VlM
危ない操作はできないようにしようってのが言語の進化だからな
それ無視して、安全に使うのが前提とか、正しく使うのが前提とか、それ言っちゃね
なんかおかしな方向へ行くよね
0108デフォルトの名無しさん
垢版 |
2020/02/01(土) 21:50:07.81ID:7G0Z2VlM
gotoを正しくしか使えないように改良したのがreturn、break、continue
ってことも忘れずに
0109デフォルトの名無しさん
垢版 |
2020/02/01(土) 21:54:44.41ID:BhmlSyWc
>>104
構造化プログラミングでは使わない制御構造を
使うべきでない理由が構造化プログラミングって論法に
抜け出せない枠があるとは思わないの?

>>108
continueだけ、それで正解なんだが
他はみんな間違ってるよ
0110デフォルトの名無しさん
垢版 |
2020/02/01(土) 21:57:47.27ID:7G0Z2VlM
見てください皆さん、ID:BhmlSyWc ← ひどいですよ
まず何言ってるか分からない
このレベルはきついな
0112デフォルトの名無しさん
垢版 |
2020/02/01(土) 22:06:43.33ID:vKrtBnhX
まあ1万行ある関数の中で、5千行目ぐらいにgotoがあって、ラベルが関数の先頭付近にあるとか、それに近いのは見たことあるが、あれはどう考えてもgotoの悪い例だからな
包丁で味噌汁食ってるようなもん
0115デフォルトの名無しさん
垢版 |
2020/02/01(土) 22:11:31.06ID:tav2AwxI
不定値や無限ループの危険はgotoに限ったことじゃないし
ループを抜けるgotoには関係ない話

goto特有の危険な場面
何を心配してるんだろう
酸っぱいブドウ?
0117デフォルトの名無しさん
垢版 |
2020/02/01(土) 22:19:01.58ID:7G0Z2VlM
gotoはどこへ飛ぶか分からないから読みにくいんだよ
前に飛ぶのか、後ろに飛ぶのか、それすら分からない
飛び先を分かりやすく改良したのがreturn、break、continue
それぞれ飛び先が決まっているから追うのが楽
その英知が分からんっていうならreturn、break、continueを使わずに
全部gotoでやれば?って話
0119デフォルトの名無しさん
垢版 |
2020/02/01(土) 22:25:22.98ID:tav2AwxI
どこに飛ぶかわかる名前にするってのが普通の発想
意味でも構造でも文章でも好きな名前を付けられる

関数も変数も名前空間も全てそう
0122デフォルトの名無しさん
垢版 |
2020/02/01(土) 22:26:20.90ID:7G0Z2VlM
つまりはそういう話で、追いやすいように飛び先を制限したいよねーってのが根底に有って
(当然そういうのが念頭にあってreturn,break,continueは生まれたわけで、前例に倣いたい所)
それでブロックに名前を付けるだのbreak 2だのって書き込んでいる人がいるわけで
gotoでいいんじゃね?っていうなら、return,break,continueもgotoでいいんじゃね?
むしろforやwhileもgotoでいいんじゃね?gotoを正しく使えばいいんだろ?ってなる
0124デフォルトの名無しさん
垢版 |
2020/02/01(土) 22:28:23.87ID:BhmlSyWc
>>122
どうなっていれば「追いやすい」のかを
まず明らかにしようぜ

俺ルールでもいいし
広く認知されているルールでもいいし
0125デフォルトの名無しさん
垢版 |
2020/02/01(土) 22:31:09.71ID:7G0Z2VlM
巻数はどこに飛ぶか分からないが、必ず元に戻ってくる(のが基本)
行きっぱなしというか、ただのジャンプのgotoやらbreakやらとは違うのだよ
関数のコールは入口と出口が一つになってて非常に構造化されてる好例
こういうところ分からないってのはセンスないよ
0127デフォルトの名無しさん
垢版 |
2020/02/01(土) 22:35:10.84ID:tav2AwxI
使い所でgotoが使えないのはセンス無い
使い所でgptoを使わないのはコードが見にくい
使い所でgotoを使わないのは危険なコード

goto否定派にレベルを合わせた主張をするとこんな感じ
0130デフォルトの名無しさん
垢版 |
2020/02/01(土) 22:45:34.37ID:7G0Z2VlM
本心では誰もgotoは否定していないんじゃないかな
今は多段breakの機能が無いんだからgotoを使えばいいだろう
しかし、もしgotoを使わないで済む多段breakの新機能があったのなら
それを使ったほうがいいだろうし
じゃーその新機能はどんなものが考えられるか?って遊びだろ?
ブロックに名前付けるだとかbreak nだとかは
0131デフォルトの名無しさん
垢版 |
2020/02/01(土) 22:50:41.91ID:wBNP08tW
多段breakは考えた奴は脳味噌が糞すぐる…
ループの深さを変えたとたんにバグるじゃん?
ループの深さは金輪際変えないとか
ループの深さを変えるとき必ずループ全体を机上確認するとかだったら
gotoでも逝けるじゃん??
0132デフォルトの名無しさん
垢版 |
2020/02/01(土) 22:53:08.37ID:vKrtBnhX
ああ、そうだな
break 2だとfor文が3重になったときにバグるな
個人的には面白いと思ったが
0134デフォルトの名無しさん
垢版 |
2020/02/01(土) 22:55:40.65ID:rsRLlL5x
画像処理とかで2重ループ良く書くけど、最近2段階breakしたくなった記憶がないな

実は要らないんじゃね
0136デフォルトの名無しさん
垢版 |
2020/02/01(土) 22:59:11.96ID:7G0Z2VlM
まーC++がプリプロセッサを殺すために進化しているのと同様
Cはgotoを殺すために進化したともいえるわけで
たとえば、関数、for、return、などなど、制御構造にかかわるほとんどの物が
gotoを殺すために有るといってもよい
だから、もっとgotoを殺すにはどうすればよいか、考えるのは自然な発想かと

C++でもテンプレートなどで出来ないことはプリプロセッサでしなければならないし
ただ、同じことがテンプレートとかで出来るならそのほうが良いだろうし
もっとプリプロセッサを殺すためにはどういう機能を追加すればよいか考えるのは自然な事だろう

同じ同じ
0137◆QZaw55cn4c
垢版 |
2020/02/01(土) 23:01:32.69ID:EspH/Y2K
goto とか break とか continue とか、他の言語(javaとか)でもいろいろ小手先的に弄られているけれども、それに何の意味があるのかいつも不思議におもいますね
C/C++ の goto とかはどう頑張っても関数の中でだけしか跳べないのだから、BASIC の GOTO ほどにはスパゲッティ状態を招けないのではと考えます
無論、その関数が異様にデカければ別ですが、そんなデカい関数を書くほうが問題であって goto が問題なのではないかと
0138デフォルトの名無しさん
垢版 |
2020/02/01(土) 23:11:38.33ID:tav2AwxI
ループを抜ける為にだけ使われる変数を使ったループ抜け
世の中にはたくさんこういうコードがある
たくさんのコードを見る機会がある人なら
たくさん見たことがあるはず

gotoネガティブキャンペーンのせいだよ
0139デフォルトの名無しさん
垢版 |
2020/02/01(土) 23:11:46.92ID:JWECbGc7
>>136
gotoが使わないで済むように進化してくのは期待している。
ただ現状として、多重ループを抜ける場合みたいにgotoを使うのがシンプルで分かりやすいならば、毛嫌いしたり盲目的に原則振りかざすよりgoto使えばいいだけのことだと思うよ。
0140デフォルトの名無しさん
垢版 |
2020/02/01(土) 23:32:29.85ID:TULylXcw
>>138
お前ほんとに病気だな
多重ループ脱出でgotoが簡潔なのはみなわかってる
でもgotoは自由度が高すぎて構造を壊す可能性があるわけ
だから改善するとしたら何があるかという話をしてるだけであって
別にgoto禁止とかの話はしてない
好きなだけ使ってろよ
あと構造化プログラミングぐらい知っとけ
0142デフォルトの名無しさん
垢版 |
2020/02/01(土) 23:46:54.20ID:vKrtBnhX
for () {
break label;
} label;

for () {
for () {
break label1
} label2;
} label1;

こういう風にfor文のお尻にラベルを付けられるようにすれば局所化したgoto風のbreakが使えるのでは
0146デフォルトの名無しさん
垢版 |
2020/02/01(土) 23:52:18.24ID:pUJoLXPw
またgotoの話になってんのかよ。。
だからいっそ禁止にと思ったが、それよりもさらにクソな構文の提案が出てたり。。
想定を超えた馬鹿どもばっかりじゃねーか。
0148デフォルトの名無しさん
垢版 |
2020/02/01(土) 23:59:22.03ID:7G0Z2VlM
ただ、凝りに凝った複雑怪奇なテンプレートより
シンプルに作ったマクロの方が読みやすいって事例も当然あるだろうよ
てか、わりと、最近、残念ながらその傾向が・・・で、C++が嫌われる理由にも・・・
だからgotoを殺すのも上手くやらないとむしろ酷くなる
そこが腕の振るいどころで面白い部分でもあるし、言語作ってる連中もそんなことで頭いっぱい
変なゲーム性が有って、逆にそれがまたダメな部分でもあって
あと、妹大好き
0149デフォルトの名無しさん
垢版 |
2020/02/02(日) 00:17:33.29ID:rWwvB4I9
多段breakの使用頻度がそれほど多くないことを加味すれば
break n;方式が妥当だろうね
これだと2重ループを3重ループに書き換えたときにバグる、とか
意味不明なことを言ってる奴もいるが
それは1重ループをbreakで抜けてたのを2重ループに書き換えたらバグった
と言ってるのと同じであって、当たり前の話だし、今でも同じことだ
break n;が一番シンプルで妥当だと思うね
0150デフォルトの名無しさん
垢版 |
2020/02/02(日) 00:32:21.06ID:7b/FZYuN
breakの後にマジックナンバーを書くのが気に入らない
定数には意味のわかる名前を付けたい
0151デフォルトの名無しさん
垢版 |
2020/02/02(日) 00:33:00.49ID:rWwvB4I9
ただし、break n;のnの部分が変数でもOKとかなってたらかなりウザいが
そこはnは定数と定めたいね、でもC++の場合は定数と言っても・・・
複雑にしようと思えばいくらでも複雑にできるわなー
普通に使う分には問題ないかと
明日からbreak n;が入っても、たぶん誰も困らないし、混乱も起きないだろう
割のいい賭けだし、俺はアリだと思うね
0152デフォルトの名無しさん
垢版 |
2020/02/02(日) 00:33:32.69ID:7b/FZYuN
breakとbreak nが同じとか意味不明な主張をなさる御仁がいらっしゃるが
じゃあcontinueがcontinue nになったらどんな地獄が発生するか
考えてみたら良い
0153デフォルトの名無しさん
垢版 |
2020/02/02(日) 00:48:04.23ID:rWwvB4I9
別にcontinue n;
全然ありでしょ
これと同等の事を、何か別の方法でやるよりスマート

for(;;){
 bool do_continue = false;
 for(;;){
  if(...){ do_continue = true; break;}
 }
 if( do_continue ){ continue; }
}



for(;;){
 for(;;){
  if(...){ continue 2; }
 }
}
0154デフォルトの名無しさん
垢版 |
2020/02/02(日) 01:00:22.64ID:7b/FZYuN
do {
 do {
  ...
  if (cond) {
   continue 2;
  }
 } while (副作用の有る式1);
} while (副作用の有る式2);
とから?
0155デフォルトの名無しさん
垢版 |
2020/02/02(日) 01:03:23.27ID:0Gqmr542
break nなんてやるくらいならbreak label で抜けるループを明示的に指定したいな

ループにラベルをつけるとして、先頭では見づらくて邪魔だな

ループの末尾にラベルを付ければ見やすいけど、それだとlabelついたループを抜けると言うよりlabelの指す位置へのジャンプだな

なんだgotoでいいじゃん

個人的には breakto label という記法でループ出口に書いたラベルに飛べるとするのが分かりやすいと思うけど、こんなことに新しい予約語を導入するくらいならgotoで十分だと思う。
0156デフォルトの名無しさん
垢版 |
2020/02/02(日) 01:06:28.34ID:7b/FZYuN
break nが良いとか言ってる椰子は
ついでに行番号も復活してほしいと思っているに違いナス
0157デフォルトの名無しさん
垢版 |
2020/02/02(日) 01:15:40.31ID:rWwvB4I9
do{
 do{
  if(...) goto NEXT;
 }while(...);
NEXT;
}while(...);

と等価だろう
要はこういうgotoを置き換えるために作られたのが
continueなのだから、そのルールに従うのが普通だろうね

もしくはgoto使わずにフラグでやっても、どのみち内側のループの条件式は実行されないわけで

do{
 bool do_continue = false;
 do{
  if(...){ do_continue = true; break; }
 }while(...);
 if(do_continue) continue;
}while(...);

これ以外の解釈ってのは難しい
0160デフォルトの名無しさん
垢版 |
2020/02/02(日) 03:26:54.49ID:EDNK6zQt
そういう機能要望みたいなのここでやる意味ある?
C++Slackでやった方がよくない?
0161デフォルトの名無しさん
垢版 |
2020/02/02(日) 03:45:22.96ID:mzCY/+E0
英語は敷居が高いよ。
0162デフォルトの名無しさん
垢版 |
2020/02/02(日) 05:06:46.10ID:DTIMfhpJ
         ,,-―--、
        |:::::::::::::;;;ノ 
        |::::::::::( 」 <もう構造化は破綻してるんだからおとなしく goto しとけよな!
        ノノノ ヽ_l  
       ,,-┴―┴- 、    ∩_
     /,|┌-[]─┐| \  (  ノ
      / ヽ| |  バ  | '、/\ / /
     / `./| |  カ  |  |\   /
     \ ヽ| lゝ    |  |  \__/
     \ |  ̄ ̄ ̄   |
      ⊂|______|
       |l_l i l_l |
       |   ┬    |
0163デフォルトの名無しさん
垢版 |
2020/02/02(日) 06:40:45.35ID:mzCY/+E0
じゃあswitchも要らないって事じゃないか。
0165デフォルトの名無しさん
垢版 |
2020/02/02(日) 07:37:33.82ID:SWo7Ruqh
>>136
Cはgoto殺すために進化してねえよ
Cのgotoが関数外に飛べないのはスタック巻戻しのような仕掛けが複雑になりすぎるからで
構造化プログラミングで否定されるからという理由ではない
構造化プログラミングで否定される制御構造を持たないことにするなら
breakやlongjmpは存在できないはずだ
0166デフォルトの名無しさん
垢版 |
2020/02/02(日) 07:44:05.46ID:pBPOCWQ5
結論が先にあって理由が後付けだから支離滅裂、一貫性の欠片もない事を書く
もはや宗教
0167デフォルトの名無しさん
垢版 |
2020/02/02(日) 07:46:45.45ID:SWo7Ruqh
ほんと、宗教だね
洗脳されてるやつは強固に思考停止していて
何を言おうが馬の耳に念仏だ
0168デフォルトの名無しさん
垢版 |
2020/02/02(日) 08:06:14.41ID:SWo7Ruqh
>>159
根底がわかってねえやつが多いからだよ
古典的な基本がわかってねえやつは若造と爺のどっちに多いだろうね
頓珍漢なことを書いて袋叩きにされたからって逆恨みする精神性なやつはどっちに多いだろうね
0169デフォルトの名無しさん
垢版 |
2020/02/02(日) 08:18:25.64ID:9aZda2U6
break labelでいいんじゃね
gotoと同じだが、labelがbreak的な位置にない場合コンパイルエラーになれば良い
0171デフォルトの名無しさん
垢版 |
2020/02/02(日) 09:22:07.84ID:mzCY/+E0
gotoは便利なswitchだからね。
便利すぎるわこれ。
これからも積極的に使っていこうと思います。
0173デフォルトの名無しさん
垢版 |
2020/02/02(日) 09:43:27.45ID:mzCY/+E0
アドレス直接指定なのに、テーブル必要ないんじゃないの。
テーブル必要ない分、switchより有利なんじゃないかと思いました。
0174デフォルトの名無しさん
垢版 |
2020/02/02(日) 09:51:12.60ID:7b/FZYuN
(条件分岐無しの素のgotoだけでどうやってswitchの便利な代替品にするつもりなのやら…
0175デフォルトの名無しさん
垢版 |
2020/02/02(日) 09:53:50.90ID:mzCY/+E0
頑張ってひねり出した!!
けどウンコにしか見えない。
納得できるものを頼む。
0176デフォルトの名無しさん
垢版 |
2020/02/02(日) 09:55:31.36ID:0Gqmr542
>>175
お前が何をいってるのか、何を考えてるのか理解できないのに、お前を納得させられる奴なんていないぞw
0177デフォルトの名無しさん
垢版 |
2020/02/02(日) 10:10:20.38ID:o79zkFFu
お尻にラベルつけて break ラベル; がいいとか言ってる奴は構造化の意味がわかってなさ過ぎ
ラベルは飛び先じゃなくてループに付けて break ラベル; でそのループから抜けるんだよ
なので break ラベル が使える言語はたいていループの頭にラベルをつけるようになってる
あと break レベル数 とか言ってる老害は早く滅びろ
0178デフォルトの名無しさん
垢版 |
2020/02/02(日) 10:28:45.43ID:DTIMfhpJ
名前使うならこんな感じか
void main(){
auto scope1 {
for(;;){
 for(){
  break scope1;
 }
}
}
0179デフォルトの名無しさん
垢版 |
2020/02/02(日) 10:29:18.43ID:mzCY/+E0
>>176
俺自身何を言っているのかよくわからないのだが。
0184デフォルトの名無しさん
垢版 |
2020/02/02(日) 11:25:45.57ID:mzCY/+E0
あの、スレとは全然関係ないんだけど。
Boostでデバッグとリリース判別するマクロってありますか?
イテレータを1億回ほど回すのでデバッグだけテストを迂回したいんですが。
0186デフォルトの名無しさん
垢版 |
2020/02/02(日) 11:34:47.86ID:mzCY/+E0
NDEBUGを知らなかったからです。
おまえらおせーよ。
0187デフォルトの名無しさん
垢版 |
2020/02/02(日) 11:39:04.55ID:SWo7Ruqh
NDEBUGってISO/IEC9899やん
おまえさんがboostっていうから
レスポンス鈍かったんだよ
0188デフォルトの名無しさん
垢版 |
2020/02/02(日) 11:48:10.68ID:mzCY/+E0
だよね。
そうだと思いました。
0189デフォルトの名無しさん
垢版 |
2020/02/02(日) 11:49:31.89ID:mzCY/+E0
今度からはよく考えて質問しようと思います。
0190デフォルトの名無しさん
垢版 |
2020/02/02(日) 14:38:02.14ID:rWwvB4I9
今の一重ループを抜けるときの普通のbreakにはラベルを付けないのに
多重ループを抜けるためのbreakにはラベルが無いと読みにくくなるっていう
発想というか対称性というか整合性というか必然性が全く見えないんだが
今ラベル無しの一重breakで誰も発狂することもなく普通に使えているのに
多重breakになった瞬間にラベルが無きゃダメってなるのはなんか弱い
同じことを二回書いたけども
ラベル無しでも別に普通に読めるでしょ、今まで読めてるんだから
大体ラベル付けるんならgotoと手間自体は変わりないしな
0191デフォルトの名無しさん
垢版 |
2020/02/02(日) 14:40:18.63ID:mzCY/+E0
今多発今多動ラ大
読み解けなかった。
0193デフォルトの名無しさん
垢版 |
2020/02/02(日) 14:43:14.46ID:mzCY/+E0
え、わかるんだ。
すげー。
0194デフォルトの名無しさん
垢版 |
2020/02/02(日) 14:47:27.35ID:gXxB23XL
下方向にだけ飛べるgoto相当機能があればgotoは要らなくなるんじゃない?
0195デフォルトの名無しさん
垢版 |
2020/02/02(日) 14:53:57.04ID:7b/FZYuN
>>190は、Cにgoto <label>とbreakがあるのになぜCはbreak nを設けるところまで踏み込まなかったのか、とか
break <n>で即値<n>に行き当たったコード閲覧者が行き先を知るために何をせねばならないかとか、
考えた方が良いので
は…
0196デフォルトの名無しさん
垢版 |
2020/02/02(日) 14:55:47.03ID:0Gqmr542
>>190
break nを勧めている人?
対象が1段なのと複数段とでは大きなギャップがあるでしょ。単純に対称性があると言えるものではないと思う。
ラベルつけるならgotoと手間が変わらないというのは同意。ただ、重要なのは手間が減ることではなく、複数段のループの外に出ることが明示されることだから、gotoと意味が混同されず同じ程度の手間でできる記法があるならそれは嬉しい。
0197デフォルトの名無しさん
垢版 |
2020/02/02(日) 14:56:57.31ID:EDNK6zQt
現実のC++について話せ
ここで新機能の導入について議論しても無駄だ
フォーラムでやれ
0198デフォルトの名無しさん
垢版 |
2020/02/02(日) 14:57:45.57ID:gkoi3ncl
手間が減ることは重要だよ
ラベル名を考える手間をかけて良いならgotoで良い
0199デフォルトの名無しさん
垢版 |
2020/02/02(日) 15:01:24.88ID:rWwvB4I9
大体だよ、多重ループはbreakで抜けれないので、仕方なくgoto使うときの
そのgotoを使う都合で必要になった、そのラベルをだよ
じゃーブロックにラベルをつけましょう、ってなんでそーなんだよ
元々のbreakにはラベルなんかねーのに
breakにラベルが無くて混乱したやつ居るか?

ご飯が無いからパンを食べてた状況なのに
すり替わってパンありきになって、パンが無きゃ話にならないとか言い出す始末
別にパン(ラベル)なんかなくても、ご飯があるならご飯食べろよ

ラヘルラベルって、そのラベルがどこ由来か考えてみろよ、gotoだろ?
もう一度言うが、もともとのbreakにはラベルなんかないし、それでみんな普通に過ごせてるし、混乱も起きてない
ただ、gotoで抜けるためには文法上/機能上ラベルが必要だったねってだけで、そこに着目しても仕方がない
本質的には無くても別に困らない
0200デフォルトの名無しさん
垢版 |
2020/02/02(日) 15:05:16.61ID:jVWLSRwc
ソースコードチェック目的でプログラム読むとき、gotoが出てきたら
そのgotoの使用方法が問題ないものなのか、いちいちチェックしないといけない。
breakならループ抜けるという意図が明白なので、チェックしなくてよい。
0201デフォルトの名無しさん
垢版 |
2020/02/02(日) 15:11:47.92ID:rWwvB4I9
そんなに名前が無いと発狂するんならもうgoto使えば?って思うし
なんなら関数化して正式に名前付ければって思うし
そこまでしたくないってときにbreak nが便利なわけだ
やりたいことは「多重ループから抜けたい」であって
「名前を付けたい」ではない!!
0202デフォルトの名無しさん
垢版 |
2020/02/02(日) 15:11:53.90ID:gkoi3ncl
関数コールも問題のないコールかどうかチェックしないといけないから
使わない方が良い
0203デフォルトの名無しさん
垢版 |
2020/02/02(日) 15:14:22.99ID:EDNK6zQt
それならもうポインタもグローバル変数もマルチスレッドも大量のチェックが必要だから使ってはいけないってことで
0204◆QZaw55cn4c
垢版 |
2020/02/02(日) 15:14:36.78ID:Rn0kkYyt
>>199
私と認識が似ていますね

>>137
>goto とか break とか continue とか、他の言語(javaとか)でもいろいろ小手先的に弄られているけれども、それに何の意味があるのかいつも不思議におもいますね

>>164
java にはラベル付き break が存在して、ほとんど goto です https://www.sejuku.net/blog/20100
0205デフォルトの名無しさん
垢版 |
2020/02/02(日) 15:15:16.61ID:7b/FZYuN
現行のC/C++にはgoto <label>がある一方、break <n>は無い
もしbreak <n>の追加がgoto <label>の実装より難しかったからやらなかったのだとしたら、
break <n>の飛び先がgoto <label>の飛び先より簡単にワカルから優れているという主張は根拠を失う

break <n>はわかりにくいか、さもなくばgoto <label>と同等なんである
0206デフォルトの名無しさん
垢版 |
2020/02/02(日) 15:16:38.00ID:mzCY/+E0
constがスレッドセーフなのも困った。
0207デフォルトの名無しさん
垢版 |
2020/02/02(日) 15:24:46.36ID:jpTipLln
>>201
現実ありえないのは重々承知したうえで書くけど
100重ループを脱出するとき数を数えたくないだろうなって思うじゃん
ほかにも3重ループとかで2ndと3rdのループから共通の脱出先ラベルにもできるわけじゃん
文法を拡張する前提ならそこまで想定すべきだと思うね

粗野な即値の数字じゃなくて意味ごとに名前をつけられるようにしてきたのが
プログラミング言語の進化の歴史なのでおれは自然だと思うよ

というかそういう観点からラベル付きbreakというのは他の言語にはあるわけで
で今話してるのはもっと書きやすく読みやすくできないかというトピックでしょ
break Nは使えるだろうけど洗練されてない感じ
0208デフォルトの名無しさん
垢版 |
2020/02/02(日) 15:27:11.67ID:gkoi3ncl
break [n] はラベル名を考えなくて良い利点がある
使えるなら使いたい

ラベル名を考える必要があるならgotoで良い

ループの先頭で名前を付けるのはgotoより見づらいから使わない
0211デフォルトの名無しさん
垢版 |
2020/02/02(日) 16:20:03.66ID:gXxB23XL
foobarやhogeを超える人気なダミー文字列を考えたほうがよほど建設的だぞ、君たち。
0214デフォルトの名無しさん
垢版 |
2020/02/02(日) 16:50:03.80ID:DTIMfhpJ
関数で置き換える
引数がめんどうならラムダで置き換える
returnが多重breakの代わりになる
0216デフォルトの名無しさん
垢版 |
2020/02/02(日) 17:03:09.93ID:7b/FZYuN
>引数がめんどうならラムダで置き換える ←New!
これは場合による
for (i=0; i<INT_MAX; i++) {
 for (j=0; j<INT_MAX; j++) {
  (何がしかの処理)
 }
}

for (i=0; i<INT_MAX; i++) {
 for (j=0; j<INT_MAX; j++) {
  ((何がしかの処理)を行うラムダ式fを定義)
  f();
 }
}
とするのではご利益が無いが、

((何がしかの処理)を行うラムダ式fを定義)
for (i=0; i<INT_MAX; i++) {
 for (j=0; j<INT_MAX; j++) {
  f();
 }
}
とするのではラムダ式定義時点でループ内の変数を参照できないから場合によっては詰む
結局f()は引数がぞろぞろ並ばねばならない
0219デフォルトの名無しさん
垢版 |
2020/02/02(日) 17:15:36.03ID:SWo7Ruqh
ジーオーティーオーというスペルでなければ
制御構造はそのままでいいと言うクソ論法
0220デフォルトの名無しさん
垢版 |
2020/02/02(日) 17:52:12.55ID:mzCY/+E0
スレとはあまり関係ないんだけど、nodiscard属性を無視するにはどうしたらいいですか?
0221デフォルトの名無しさん
垢版 |
2020/02/02(日) 17:59:47.60ID:MNdu0823
変数で受けといてその変数をガン無視すればいいんじゃないの
未使用変数の警告出るだろうけど
0222デフォルトの名無しさん
垢版 |
2020/02/02(日) 18:00:14.37ID:mzCY/+E0
やってみます。
アリガト。
0223デフォルトの名無しさん
垢版 |
2020/02/02(日) 18:11:02.03ID:o79zkFFu
>>210
お前の言う「他の人」はマジックナンバーの意味わかってないってことか?
このスレ見てたらありえなくもないかと思えてきたわw
0224デフォルトの名無しさん
垢版 |
2020/02/02(日) 18:13:54.31ID:mzCY/+E0
あと三日くらいしたらお前より出来るようになってるから。
0226デフォルトの名無しさん
垢版 |
2020/02/02(日) 18:28:22.08ID:x1m+isRG
>>208
昔のBASICは、行番号を勝手に付けてくれていたのでgotoでもラベル名を考えなくて済んだのでとても便利だった。
0227デフォルトの名無しさん
垢版 |
2020/02/02(日) 18:30:04.52ID:x1m+isRG
>>226
なお、アセンブラでは行番号がなかったのでラベル名を考える必要があったが、
意味のあるラベル名を考え出すのは大変だったので、分かり易い場所以外は、
多くの人が、lab1: lab2: lab3: のような連番を使う傾向があった。
0228デフォルトの名無しさん
垢版 |
2020/02/02(日) 18:30:14.15ID:mzCY/+E0
>>225
メモっときます。
ありがと。
0229◆QZaw55cn4c
垢版 |
2020/02/02(日) 18:31:42.37ID:Rn0kkYyt
>>226
>昔のBASICは、行番号を勝手に
auto 文だったかな…
0233デフォルトの名無しさん
垢版 |
2020/02/02(日) 21:15:29.52ID:GV9CDSqK
すまん俺の聞き方が悪かったのかもしれん
最近プログラミングの勉強始めて、各言語の用途とか調べたんだけど、ここでも一応聞いてみたかったの
何を作ってるって言うより、どんな開発に携わってるかっていうのを聞きたかった
0237デフォルトの名無しさん
垢版 |
2020/02/02(日) 22:06:04.81ID:mzCY/+E0
いまダブルアレイやってる。
0238デフォルトの名無しさん
垢版 |
2020/02/02(日) 22:08:30.12ID:mzCY/+E0
検索はstd::setやstd::unorderd_setより速いけど、挿入が一桁遅い。
静的構築が速いというので、それもやってみたけど、2/3くらいにしかならなかった。
0239デフォルトの名無しさん
垢版 |
2020/02/02(日) 22:10:09.36ID:mzCY/+E0
検索はstd::setの10倍くらい早いな。
0241デフォルトの名無しさん
垢版 |
2020/02/02(日) 22:54:22.23ID:mzCY/+E0
>>240
よろしくお願いします。
0242◆QZaw55cn4c
垢版 |
2020/02/02(日) 23:01:19.98ID:Rn0kkYyt
初学者的な質問です、よろしくお願いいたします。
バイナリーファイルを
std::fstream f;
f.open(filename, std::ios::in | std::ios::out | std::ios::binary);
でオープンし、同一ファイルのオープン中に
f.read(), f.seekg() でガンガン読むと同時に
f.write(), f.seekp() でガンガン書き込む
を試しているのですが、seekg(), tellg() と seekp() tellp() は名前は別でもあるにもかかわらず、実はファイルポインタの実体は両者で同一なのでは?
という疑いが発生しました。つまり、seekg()/tellg() と seekp()/tellp() とは独立でない、と推測しています

@この解釈で正しいですか?
Aこういうのは、C++ iostream レファレンスのどこを見て洞察するべきなのでしょうか?

実際のお題は相変わらずエラトステネスのふるいです https://ideone.com/6Ww9nq
0243◆QZaw55cn4c
垢版 |
2020/02/02(日) 23:18:14.73ID:Rn0kkYyt
>>231,233
私は今のところエラトステネスの篩にご執心、という体たらくです…
0245◆QZaw55cn4c
垢版 |
2020/02/03(月) 00:22:49.42ID:X2PbBOAI
>>244
結構昔から
http://www.asahi-net.or.jp/~KC2H-MSM/pbsb/pbsbm006.htm
にとても興味を持っていたのです、二つの隣り合った素数の差を「素数のギャップ」と呼ぶことにしたとき、

『素数のギャップが取りうる値の頻度。はじめは2、4が多いが、そのうち、6の方が多くなる。』
『6がチャンピオンの座を降りるのはいつか。』
『少なくとも 10^14 以下では6がトップであり、それ以降、いつ、6以外の数がトップになるかは、知られていない。』

10^14 までの数であっても全部、篩としてメモリに載せられないので、さてどうしたものかと思案中です、最終的には年スパンでずっと計算させ続けるのに耐えられるようにしたい、と
0246デフォルトの名無しさん
垢版 |
2020/02/03(月) 00:38:27.28ID:e9E2NTEb
その問題だけなら
2次キャッシュに収まるくらいに分けてふるえば速い
間隔も大して大きくならないので
ヒストグラムはオンメモリで済む

スレッドも簡単に分割出来るので
論理コア数と同じだけスレッドを作って回す
0247◆QZaw55cn4c
垢版 |
2020/02/03(月) 00:44:34.76ID:X2PbBOAI
>>246
コメントありがとうございます

>間隔も大して大きくならないのでヒストグラムはオンメモリで済む
確かに 10^10 まででも最大 354 というのには驚きました、案外密に分布しているんですね

>2次キャッシュに収まるくらいに分けてふるえば速い
constexpr unsigned int windowSize_Default = 30 * 5000000; はでかすぎ、ですか

いただいたアイディアは、どれも私には難易度が高いのですが、ぼちぼち書いていきます…
0248デフォルトの名無しさん
垢版 |
2020/02/03(月) 00:44:55.23ID:e9E2NTEb
AVXレジスタを使って小さな素数の倍数を消して
ビット命令で大きな素数の倍数を消す
大きな素数の倍数は210ずつ処理する

昔素数の数を数えるプログラムを書いたことがあって
記憶に残ってる範囲ではこんな感じ
0249デフォルトの名無しさん
垢版 |
2020/02/03(月) 00:55:53.66ID:jdU9ROmC
>>229
100 WIDTH 80,25:CONSOLE 0,25,0,1:SCREEN 1:CLS 3
110 XXX
120 XXX
130 IF XXX = XXX GOTO 110
のようなもので、最初に入れるときは自分で行番号も手で打つのが基本ではありました。
115 YYY と入れると、110と120の間に行が挿入されると言う仕組みです。
それだと9個以上は挿入できなくなるので RENUM 命令を使うと行番号を自動的に
振り直すことができました。その場合、GOTOやGOSUBの行番号も連動して変わる
仕組みです。
0250◆QZaw55cn4c
垢版 |
2020/02/03(月) 00:55:55.99ID:X2PbBOAI
>>248
コメントありがとうございます!

>大きな素数の倍数は210ずつ処理する
私は、2*3*5 = 30 でわりと満足していましたが、2*3*5*7=210 まで拡張されたのですか!?うーむ…
0251◆QZaw55cn4c
垢版 |
2020/02/03(月) 00:57:46.55ID:X2PbBOAI
>>249
mon に入って、プログラムタイトルのコメントの行番号を手打ちで全部 0 にする、とか…
どうでもいい話でごめんなさい…
0253252
垢版 |
2020/02/03(月) 01:58:12.48ID:YoBHNt10
A = 6n + 1, B = 6n + 5 とすると、

AA の並びなら、差は6
AB なら、4

BA なら、2
BB なら、6

A,B になる確率がランダムとすると、6 になる確率が2倍!
0254はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/03(月) 11:14:43.40ID:HBzF0G80
>>242
たぶんこの一文。
> A joint file position is maintained for both the input sequence and the output sequence.
N3337 だと 27.9.1.1 の第 3 段落にある。

あくまでも std::basic_filebuf ではそうなってるってだけなので、
ストリームバッファ全般に言えるわけではなくて、
独立した位置情報を持つようなものも作れないわけではない。

FILE の fseek のラッピングとして実装することを想定したんじゃないかなぁ。
0256◆QZaw55cn4c
垢版 |
2020/02/03(月) 20:59:04.78ID:X2PbBOAI
>>254
コメントありがとうございます。いまいちよくわかっていない iostream. の全体像を掴めるよう、いただいたヒントも頼りに潜ってみます

>FILE の fseek のラッピングとして実装することを想定したんじゃないかなぁ。

fseek() が 64bit オフセットならいいのですが
あるいは win32api::SetEndOfFile() のような、オフセットを指定して trunc する方法があればいいのですが
>>242 のバイナリファイルは単に uint64_t な素数を突っ込んでいるものですが、ある日末尾が中途半端にちょん切れてしまったのです…
0258はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/03(月) 21:26:54.32ID:HBzF0G80
>>256
巨大なファイルにちょくちょくシークしながらアクセスするなら
メモリマップトファイルを使った方が楽やで。
0259はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/03(月) 22:20:22.51ID:HBzF0G80
>>256
ググってみたら iostream まわりの継承関係を表した図がすぐ見つかったわ。
https://www.ntu.edu.sg/home/ehchua/programming/cpp/cp10_IO.html
だけど継承関係の他にストリームがバッファとロケールを所有しているという関係もあるのが分かり難いかも。
cpprefjp の rdbuf の項目を見たらストリームのバッファを入れ替える例が載ってる。
https://cpprefjp.github.io/reference/ios/basic_ios/rdbuf.html

本当に「入出力」を司っているのはバッファであって、
ストリームはそれに書式化の機能をかぶせている感じ。
0260◆QZaw55cn4c
垢版 |
2020/02/05(水) 22:01:06.74ID:uTOW/8lH
>>257
それはダメでした。win7, 16GB、素数の大きさが10^11 程度でスラッシングが発生して win7 では使い物になりません
GIMPS cli のように、普段は意識することなく3年くらいかけて計算するようにしたいです

>>258
着々と容量が増加するファイルに対して mmap は使えるのですか?win32api::CreateFileMapping では mmap を確立した後にファイルサイズを増やしてはいけない制限がありました
0262はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/05(水) 22:32:01.15ID:85RuEno5
>>260
そんな制限があるんか。

連続した巨大なメモリを予約しておいて、
適当な大きさに区切ってファイルにマッピングすればええで。
ファイルを複数に分けることになるけど、
見かけ上は巨大なメモリとして扱えるし、
容量が増加する都度に新しいファイルを作って割り当てればええ。

というやり方を思いついたので具体的に出来るんかいなと思って調べてみたら
MapViewOfFileEx の最後の要素でアドレスを指定する機能がある。
VirtualAlloc で予約した範囲は MapViewOfFileEx で使えないので、
どうやって空いているメモリ空間を探せばええんやろと思ったら
VirtualAlloc で予約した直後に VirtualFree をつこうたらええんやて。
https://stackoverflow.com/questions/12121843/mapviewoffileex-valid-lpbaseaddress
なんという泥臭い方法や……。

てなわけで、若干の面倒くさい手順が要るけどそれっぽいことは出来る。
この手順をいい感じに抽象化するクラスを作ったら色々と使えそうやな。
期待してるで!
0264はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/05(水) 22:50:53.65ID:85RuEno5
最初からどでかいファイルを作る余裕があるならその方が簡単ではあるわな。
どんくらいデカいのがいるんや?
せいぜい数十ギガとかそんなもんやろ?
ケチらんと行くっちゅうのもアリや。
0266デフォルトの名無しさん
垢版 |
2020/02/06(木) 13:03:55.59ID:sNihMBVC
こんな感じ?
.... 0101 0000 0100 0101 0001 0100 0101 0110
0267デフォルトの名無しさん
垢版 |
2020/02/06(木) 16:50:43.13ID:zCd4f5nI
STLコンテナ (仮にvとする) のサイズの分だけfor文を回したいってときに
for(int i=0; i<v.size(); i++)
と書くことが多いんだが、v.size()はintじゃないので警告が出る。

警告を一つ残らず潰したいタチだから毎回こういうのはintにキャストしてるんだが、キャストのコストってどんなもんなんだろ。
「大したことないからOK」って立場と「そもそもv.size()が毎回呼ばれてる時点でナンセンスだから改善すべき」って立場と「その警告は無視しなさい」って立場などがあると思うが、皆はどうしてる?
逆順にしたいことなどがよくあるので、範囲for文を使えってのは今回はナシで。

特定の環境、コードでのテストはできるが、一般論として、あるいは皆さんのスタンスとしてはどうですか。
0268デフォルトの名無しさん
垢版 |
2020/02/06(木) 17:11:56.16ID:v+RXRHu+
コンパイルの警告のためだけだから
実行時コストは0じゃね
0269デフォルトの名無しさん
垢版 |
2020/02/06(木) 17:13:00.89ID:v+RXRHu+
手でタイプするコストうんぬん言うなら
マクロで #define LEN(s) ((int)s.size())
0270はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/06(木) 17:18:31.70ID:jSrTrJa0
>>267
最も正統派なのはこうかな?
for(decltype(v)::size_type i=0; i<v.size(); i++)
常識的に考えてコンテナの size_type が std::size_t より大きいことはあまりない (大抵は等しい) と思うので、面倒なときは std::size_t を使う。

本当に上限が限られていてその上限が変更されることがあり得ないほどそのプログラムにとって
本質的なものだと判断すれば int でいいやってこともあるといえばあるだろうし、
同じようなパターンが何度も現れるならアダプタを作った上で範囲forというのも考えられる。

状況によるでしょ。
0271デフォルトの名無しさん
垢版 |
2020/02/06(木) 17:24:46.97ID:2fVM4odH
int i = 0; と書かずに size_t i = 0; と書くのはどうだい?
v.size() が本当に size_t を返すか、という問題はあるが。

for (decltype(v.size()) i = 0; i < v.size(); i++)
と書くこともできるね。

i の型が int でないと不味いのかも知れんけど。
0272デフォルトの名無しさん
垢版 |
2020/02/06(木) 17:39:05.78ID:/W9iMVJD
>>267
コスト(性能)最優先か
見やすさ最優先か
タイプ数最優先か
次第

キャストのコストって言うけど
intとv.size()のサイズが違えば
どのみち型変換する

コンテナ使うような場所でこんな微妙なコストを気にしてもしょうがないし
>>270は面倒

(業務外だと)私は警告放置が多い
警告を消したい場合はsize_tにするか
コンパイラの設定を変えるか

業務で集団でのコーディングの場合は
他の部分を見て空気を読む
0274デフォルトの名無しさん
垢版 |
2020/02/06(木) 17:44:41.65ID:v+RXRHu+
for(unsigned int i=0, len=v.size(); i<len; i++)
これもよく見るか
0281デフォルトの名無しさん
垢版 |
2020/02/06(木) 18:09:13.09ID:3IyMYliq
>>274
その形が一番、速度的には良い。
forの第二式は毎回評価されるが、v.size()の部分をコンパイラが自動的に最適化するのは非常に難しい場合があるから。
0282デフォルトの名無しさん
垢版 |
2020/02/06(木) 18:11:29.18ID:3IyMYliq
v.size()の値が、ループ内で変化しない「ループ定数」であると判断するのは
コンパイラにとってはものすごく難しい場合がある。
ループ定数であると判断された場合にのみ、>>274のような最適化が行われる可能性が出てくるが、判定できなければループするたびに毎回評価されてしまうのでループの実行速度が遅くなってしまう。
0283デフォルトの名無しさん
垢版 |
2020/02/06(木) 18:30:55.84ID:F7wYIGq0
マクロってそんなに危険なんですか。
0284デフォルトの名無しさん
垢版 |
2020/02/06(木) 18:33:27.11ID:3IyMYliq
>>283
本人だけが開発していて、記憶力が優れていて絶対に使い方を間違いなければ特に問題ないと思うが、使い方を間違うと危険なことがある。
エラーも出ずに変な動作をしてしまうことがある。
でもそれさえ気を付けていれば特に問題ないとも言える。
0285デフォルトの名無しさん
垢版 |
2020/02/06(木) 18:37:31.86ID:3IyMYliq
>>269
マクロで書く場合、
#define LEN(_s_) ((int)((_s_).size()))
と書いたほうが良い。
特に、s や _s_ を()で囲むのは必須。
sを_s_と書くのは、ミスタイプがあった場合の備え。
例えば、マクロの仮引数にsと書いているのに、マクロの定義部分をtと
書き間違えていて、かつ、マクロを使う場所に t という変数がたまたま使われて
いたとすれば、エラーにならないのに間違った動作をしてしまう。
_s_と書いていれば、_s_という変数は絶対に使われないのでこの心配がない。
そのため、マクロの引数は伝統的に、_s_などのように書くことが推奨されている。
0286デフォルトの名無しさん
垢版 |
2020/02/06(木) 18:50:57.77ID:v+RXRHu+
バッドノウハウ紹介乙

>>285
>>276
0288デフォルトの名無しさん
垢版 |
2020/02/06(木) 19:38:40.11ID:zCd4f5nI
皆さんありがとうごさいます。
結構難しいですね。

>>274
> for(unsigned int i=0, len=v.size(); i<len; i++)
これは
for(int i=0, len=(int)v.size(); i<len; i++)
としても性能上そう変わらないですよね?
ループ変数はintであってほしいと思うので、これが自分には向いているように思いました。
0290デフォルトの名無しさん
垢版 |
2020/02/06(木) 20:10:32.24ID:9e+8kNR/
キャスト一回って機械語4つくらいじゃあないの?
そこまでシビアってのは競技プログラミングか脳手術ロボットでも作ってんの?
0292デフォルトの名無しさん
垢版 |
2020/02/06(木) 20:29:38.17ID:/W9iMVJD
糞コンパイラまで考えてパフォーマンスを考えると>>288だけど
そもそもコンテナ経由でアクセスする時点でそんな事は誤差

そのループに非常に時間がかかるなら
ループ全体で最適化しないと
0293デフォルトの名無しさん
垢版 |
2020/02/06(木) 20:40:31.72ID:3IyMYliq
>>290
同じBIT数やBIT数が少なくなる場合の整数型から整数型へのcastは、マシン語では0命令(命令が出力されない)。
高級言語では違う型でもマシン語レベルでは変わらないため。
BIT数が多くなる場合には、x86の場合は、movzx や movsx が使われる。
0294デフォルトの名無しさん
垢版 |
2020/02/06(木) 20:41:12.62ID:3IyMYliq
>>292
実際には、最適化が上手く行かないことも多いので差が出てくることは多い。
0295デフォルトの名無しさん
垢版 |
2020/02/06(木) 20:42:39.58ID:3IyMYliq
>>293
つまり、符号無しや符号付の区別はマシン語ではないので C/C++言語で
castしても高級言語レベルでの意味が変わるだけでマシン語レベルでは
何の命令も増えることはない。
0296デフォルトの名無しさん
垢版 |
2020/02/06(木) 20:49:08.28ID:VEO7DUBt
素直にrange-based-for
これが出てきたことの影響のでかさがわかってないやつ多すぎ

禿4にはfor_eachを使う前にもっと適した関数を探せとあるが
本当にそうか自分の頭で考えろ
0298デフォルトの名無しさん
垢版 |
2020/02/06(木) 21:03:18.93ID:/W9iMVJD
普通のコンパイラなら
コンパイル単位内の関数は一緒に最適化するので
.size() の中で値を返してるだけなら
ループの外に追い出してくれる
ターゲットがPCなら気にするな

それよりv[i]の方が重い
0300デフォルトの名無しさん
垢版 |
2020/02/06(木) 21:17:40.42ID:X3a4Tx/S
未だindexループよりrange-basedのほうが早い処理系がない件

>>298
v[i]が重いってどんなstlコンテナだよ
0301◆QZaw55cn4c
垢版 |
2020/02/06(木) 22:12:04.60ID:6P0xXhLK
>>267
>警告を一つ残らず潰したいタチだから
ここまでは同感です

>毎回こういうのはintにキャストしてるんだが、
私なら int i を unsigned int i にしますが
0303デフォルトの名無しさん
垢版 |
2020/02/06(木) 22:22:15.30ID:j/UITOXa
とりあえず大きい方に合わせとけば間違いないんだからsize_tでいいじゃん
そのvの要素が将来に渡って21億個を超えない保証がどこにある?
0307デフォルトの名無しさん
垢版 |
2020/02/06(木) 23:03:20.12ID:YUB/hFRs
>>300
range-basedはiterator
c++のiteratorはindexが速くなる連続アドレスのコンテナならpointerと同じコンパイル結果になる

indexアクセスがpointerより遅くないなら、それはコンパイラの最適化のお陰
0308デフォルトの名無しさん
垢版 |
2020/02/06(木) 23:13:46.15ID:/W9iMVJD
>>306
生ポと変わらなきゃ良いんだけど
変わるんだよ
VisualStudioやチープなコンパイラだと

いずれにしろここから先は
具体的な環境とループ回数やループの中身全体で考えないと意味がない
なんせ1クロックレベルのことを気にしてるようなので

実はメモリアクセスが支配的で
他の最適化は全く意味がないとか
0309デフォルトの名無しさん
垢版 |
2020/02/06(木) 23:20:09.64ID:/W9iMVJD
SIMD命令 / DSP命令 / スレッド分け / GPU
他のループと合わせる / ループを分ける
ループアンロール
依存性の削減 / 式変形
アルゴリズムの改善
キャッシュ化 / テーブル化

いろんな最適化がある
0311はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/07(金) 01:10:19.15ID:BIRgOLIs
ところで元々の質問の >>267 は整数の型が合わないのどのくらい気にする?
っていうのを「一般論として」聞いてるので、これに対しての選択肢を派閥系統樹形式にしてみた

├→ きちんと合わせる派
│  ├→ その環境で合ってれば良いよ派 (移植性は気にしない派)
│  ├→ コンパイラの警告は潰す派
│  │  ├→ 理解しなくてもキャストで合わせるので十分派
│  │  └→ 警告される箇所は仕様の詳細を調べる派
│  └→ size_t とか size_type とか使え派 (言語仕様原理主義派)
├→ 問題がなければ気にしない派
│  ├→ 問題に気づかない派 (鈍感派)
│  ├→ 実行コストに敏感派
│  │  ├→ 最適化はあてにする派 (モダン開発環境派)
│  │  └→ 最適化はあてになんないよ派
│  │     ├→ 低レイヤ派
│  │     ├→ 老害派
│  │     ├→ 諦め派
│  │     └→ ベータ開発環境追いかけ派
│  └→ 状況と程度による派 (柔軟派)
└→ えっ、それって駄目だったん? 派
    ├→ 初心者派
    └→ 無知派
0312デフォルトの名無しさん
垢版 |
2020/02/07(金) 02:51:26.03ID:dGY48don
>>278
業務外だと、とは書いてあるけど一応突っ込んでおくと
もしそれがコンパイラの警告レベルを下げるとか小さい型へのキャストの警告を無くすとかなら
それはバッドノウハウだよ、真似しないように
0313デフォルトの名無しさん
垢版 |
2020/02/07(金) 03:23:36.63ID:yxrGSGnH
じゃあ俺、えっ、それって駄目だったん? 派でお願いします。
0314デフォルトの名無しさん
垢版 |
2020/02/07(金) 03:50:27.48ID:yxrGSGnH
テストの品質がすべてを決めるような気がしてきた。
0315デフォルトの名無しさん
垢版 |
2020/02/07(金) 03:57:04.21ID:plErZoHk
>>311
わし、こうみえて「警告される箇所は仕様の詳細を調べる派」や
その上で、問題なければ「状況と程度による派 (柔軟派)」に再度ブランチする派
0316デフォルトの名無しさん
垢版 |
2020/02/07(金) 04:00:36.65ID:yxrGSGnH
Boostは警告を無視する派、GoogleはMicrosoftの問題なので修正する予定はない派。
ってことは、警告だしっぱなしで構わないって事では?
0317デフォルトの名無しさん
垢版 |
2020/02/07(金) 04:01:58.31ID:yxrGSGnH
目grepが難しいので、警告は消すしかないんだけど。
0318デフォルトの名無しさん
垢版 |
2020/02/07(金) 04:04:17.66ID:yxrGSGnH
変数の大きさが変わると同じ値のビット表現が変わるのはしんどいので、符号が一番右端にあったほうが良かったんじゃないの。
右端ならビット表現が変わらない。
0319デフォルトの名無しさん
垢版 |
2020/02/07(金) 05:13:16.79ID:zrCiCWWN
型違い面倒だからautoにしても警告出るから何でやおもたらi=0でintだったでござる派
0320デフォルトの名無しさん
垢版 |
2020/02/07(金) 06:00:43.94ID:yxrGSGnH
HTMLにしろコンパイラにしろ、Microsoft案のほうが合理的と思うけどな。
規格は政治だよね。
0322デフォルトの名無しさん
垢版 |
2020/02/07(金) 06:57:58.73ID:52vnIbYM
> コンパイラの警告は潰す派

キャストつーか、#pragmaを使ったりもするね
もち、規格票で自分が悪いのかコンパイラのお節介かはっきりさせてからだけど
0323デフォルトの名無しさん
垢版 |
2020/02/07(金) 07:21:23.65ID:9DO99WJ1
基本的にはsize_tとかsize_typeとか使え派
面倒でもちゃんとやった方が後のテストや検証は楽なんだよ
まあ無理だったり異様に面倒だったりする場合も現実的にはあるからそこは仕方ないけど
0324デフォルトの名無しさん
垢版 |
2020/02/07(金) 07:52:22.31ID:+bDqT2Wz
i は int にしたいって言ってるんだから

ここの型をsize()に合わせたら
キャストが他に移るだけ
0326デフォルトの名無しさん
垢版 |
2020/02/07(金) 10:49:20.82ID:/rNOv2pQ
>>298
vがグローバルなオブジェクトである場合や、ヒープから確保されたオブジェクトの参照型である場合、コンパイラには v.size() がループ定数であるかどうかを判定するのは難しいことが多い。
このスレでもグローバルに確保された構造体型のメンバを参照する場合、最適化され無い事が指摘されていたが、それと同じことが原因。
C/C++ではポインタや参照があるのでグローバル変数やグローバルなオブジェクトのメンバ変数が変化しないことをコンパイラが見極めるのが難しい。
0329デフォルトの名無しさん
垢版 |
2020/02/07(金) 11:41:09.54ID:jtk/IwGo
64bit/32bitまたぎできるソース汎用性を考えれば、負の数が必要ないなら size_tを使うのが最善でしょ。
0333デフォルトの名無しさん
垢版 |
2020/02/07(金) 12:33:14.78ID:8FC0VQS8
>>326
仮に毎回アクセスしたとしてもv[i]の方が重い
毎回アドレスを計算して毎回メモリアクセスするわけで
0336デフォルトの名無しさん
垢版 |
2020/02/07(金) 13:01:32.69ID:jtk/IwGo
ファイルポインタは4GB越えが当たり前だし。
0337デフォルトの名無しさん
垢版 |
2020/02/07(金) 13:18:28.90ID:8FC0VQS8
ばかでかいループをたくさん作るなら
性能を心配した方が良い

中身にもよるが、ほぼメモリアクセス時間になりかねない
帯域の無駄遣い
ループをまとめるとか細切れにするとか
キャッシュを有効に使う処理にしないと

キャストのコストとか完全に誤差
0339デフォルトの名無しさん
垢版 |
2020/02/07(金) 13:33:10.28ID:52vnIbYM
8086時代の苦しみを知っている人なら
リニアでないポインタやインデックスが
どんなにウザいものかよく知っている

64bit空間なら64bitを使っとけって悪いこと言わないから
0340デフォルトの名無しさん
垢版 |
2020/02/07(金) 13:45:59.17ID:8FC0VQS8
ループの中身も知らないで良く言うね
int変換必須なら問題点の場所を移動させただけ
0341デフォルトの名無しさん
垢版 |
2020/02/07(金) 13:58:09.08ID:jtk/IwGo
今日日4GB越えとかWindowsNT4.0サービスパックですか、と。
0342デフォルトの名無しさん
垢版 |
2020/02/07(金) 14:12:43.62ID:PWhN+bN7
納品したときに
コンパイルで警告出るんですが消してって言われて
それ無視して良い警告ですよって言っても
理解してもらえなかった派
0343デフォルトの名無しさん
垢版 |
2020/02/07(金) 14:19:34.17ID:PWhN+bN7
あと警告が出ないからと言って
正しく動くと保証されている訳でもなんでもないのに
0345デフォルトの名無しさん
垢版 |
2020/02/07(金) 14:34:22.92ID:jtk/IwGo
客先と同じビルド環境で警告対応しないのは落ち度だね。次の仕事なくなるでしょ。
0346デフォルトの名無しさん
垢版 |
2020/02/07(金) 14:40:57.67ID:/rNOv2pQ
>>333
BYTE v[数値];
のような生配列の場合、ループの中のv[i]は、最適化が効いてものすごく効率の良いコードになることが多い。
この場合、vがグローバルに確保されたオブジェクトや参照型であったとしても最適化には余り悪影響はない。
vがstd::vector 型の場合で、かつ、vがグローバル・オブジェクトや、参照型の場合は、コンパイラはv[i]を上手く最適化できないかもしれない。
0349デフォルトの名無しさん
垢版 |
2020/02/07(金) 15:03:24.58ID:jtk/IwGo
客や同僚から使えないプログラマ認定されていることに気づけず独りよがりな考えに凝り固まる人いるよね・・・
かわいそうではあるけど、かかわりたくないタイプの人。
0350はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/07(金) 15:15:12.08ID:BIRgOLIs
標準ライブラリのコンテナのイテレータを sizeof で見ればわかるが、ほとんどの場合で void* と同じ大きさ。
要するにポインタ一個分の情報しかないし、実際ポインタが入ってるし、ポインタの操作になってる。
しいて言えば操作がメンバ関数経由になる分のコストはあるといえばあるけど、
それくらいのインライン展開はするのが普通でしょ。
vector の場合だと領域が連続する保証があるのでインライン展開だけでイテレータはポインタと同じになる。

VC のコンテナだとデバッグモードではイテレータが少し大きい (のと範囲チェックとかする) ってなことらしいんだが、
処理系をインストールしてないから試してない。
0351デフォルトの名無しさん
垢版 |
2020/02/07(金) 15:20:21.87ID:E/TdO4KU
>>349
おまえがきちんとした仕様を提案できないで投げっぱにしてるからそんなことになってんじゃないの?
0352デフォルトの名無しさん
垢版 |
2020/02/07(金) 17:16:18.19ID:52vnIbYM
>>340
64bit空間で64bit以外のインデックスを使うべきループの中身とやらを書かないあんたが悪い
書けないんじゃないのか?
0354デフォルトの名無しさん
垢版 |
2020/02/07(金) 17:31:33.35ID:yxrGSGnH
イテレータよりポインタのほうが速いよ。
ホントだよ。
いまベンチとってるから。
偶然だけど。
0355デフォルトの名無しさん
垢版 |
2020/02/07(金) 17:34:39.39ID:jtk/IwGo
>>351
「無視して良い警告」とか勝手に判断する困ったPGにきちんと仕様を提案しても無駄でしょ。解雇するわ。
0356デフォルトの名無しさん
垢版 |
2020/02/07(金) 17:37:50.00ID:PWhN+bN7
unsigned だと
for(unsigned i = s.size(); --i >= 0; ){...}
みたいなので警告出るんだっけ
0357デフォルトの名無しさん
垢版 |
2020/02/07(金) 17:41:09.31ID:Nrn3Ov0h
警告で指摘された問題点に対処もせずに、キャストやらで無理やり消す位なら、出たまま放置の方が100倍マシ
0358デフォルトの名無しさん
垢版 |
2020/02/07(金) 17:43:22.94ID:yxrGSGnH
ヒープ作るとき、マイナスの値は空きノードのリンクリストに使ったりするので、その手の比較は多発する。
0359はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/07(金) 17:43:55.24ID:BIRgOLIs
うーん、近頃はちょっとした作法レベルのところまで警告として口出しすることがあるからなぁ。
完全に規格に沿って書いてるわ! ってときにはイラッとすることもある。
個別に警告オプションを設定するのも面倒くせぇし、直してしまう方が手っ取り早かったりもするんだけど、
何がなんでも警告をゼロにしろって言われたら警告レベルを低くする対処をしちゃうかも。
0361デフォルトの名無しさん
垢版 |
2020/02/07(金) 17:55:05.15ID:yxrGSGnH
タモリさんは遊びで手を抜くなって言ってた。
0362デフォルトの名無しさん
垢版 |
2020/02/07(金) 17:57:41.44ID:jtk/IwGo
従来cppcheckなどの静的解析ツールが出していた警告をコンパイラも出すようになってくれたのは良い動き。
親切なコンパイラに感謝して警告箇所の修正をやればいい。
修正に工数がかかることが懸念されるなら、依頼主にその旨を伝えればいい。
0365デフォルトの名無しさん
垢版 |
2020/02/07(金) 18:23:59.39ID:yxrGSGnH
カバレッジ測定のツールって安いの無いのかな。
0366はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/07(金) 18:36:35.61ID:BIRgOLIs
>>360
俺はプログラミングについては趣味者だから実務のことは知らんのだわ。
すまんな。

しかしな、必要以上の品質にするくらいなら手抜きで安くしろって言う客の方が多いと思うぞ。

必要より下になったらあかんのでそこを制御していい感じの
手抜き具合にするのが難しいわけだが、そこを上手くやるのが
手抜きしないことよりもプロに必要な資質じゃね?

手抜きしないよりも適切に手を抜く、どうやって手抜きするか知っていることが大事だ。
仕事は経済的に割に合う形でしか継続できないんだからさ。

そりゃあいつも十全な仕事が出来る時間的・経済的余裕があるならうれしいが、
現実はそうではないだろ。
0369デフォルトの名無しさん
垢版 |
2020/02/07(金) 18:51:12.38ID:ZYtSuiu/
DirectX関連使ってるとenumよりenum classを優先しますという警告出るんだけど、ライブラリ変えるわけにもいかなく、どう対応するのが正解なんだろ?
0370デフォルトの名無しさん
垢版 |
2020/02/07(金) 18:58:20.00ID:HVBpNa40
そもそも警告って規格で定められている訳でもなく、コンパイラが独自の基準で勝手に出してくる物だからね

mutableは悪だってconst付いてない変数全てに警告出すコンパイラとか出てきたらどうするんだろう
0371デフォルトの名無しさん
垢版 |
2020/02/07(金) 19:03:54.90ID:jtk/IwGo
>>370
議論のための議論とか、言いがかりのような仮定の話に、いちいち付き合わないことが重要。
0373デフォルトの名無しさん
垢版 |
2020/02/07(金) 19:08:56.34ID:yxrGSGnH
>>372
見てみます。
0374はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/07(金) 19:25:21.94ID:BIRgOLIs
>>371
変な作法が追加されることなんて良くあるんだぞ。
今じゃ gcc や clang で -Wall オプションを付けたら
a || b && c
みたいな式にすら警告が出る。
優先順位を間違えやすいとこだから括弧で明示した方が良いんだと!
演算子の優先順位くらい把握しとるわ!

こんなの警告されるようになると想像したことあったか?
他の演算子でも同様の警告を出すようになることくらいはあるかもしれんぞ?
確かに >>370 は極端な例ではあるが、ようわからんところでしょうもない警告が出るようになる
かもしれんという懸念は無い話ではないぞ。
0379デフォルトの名無しさん
垢版 |
2020/02/07(金) 19:55:08.75ID:yxrGSGnH
はちみつ先生は何を作ってるんですか?
0380はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/07(金) 20:28:02.80ID:BIRgOLIs
>>379
ゲームのチートツールとか。
汎用的な便利なツールは色々とあるけど、個別のソフトをいじるには行き届かないこともあるので。
念のため言っとくけど買い切りの RPG かフリーゲームだけ。 ネットゲームはやってないよ。
ちなみにそのツールは公開してない。

その他に作った有用そうなものは公開してるんで、身バレするから言えない。
0381デフォルトの名無しさん
垢版 |
2020/02/07(金) 20:52:16.35ID:yxrGSGnH
>>380
そうなんですか。
ずいぶん詳しいのに仕事じゃないというから不思議に思ってました。
0382デフォルトの名無しさん
垢版 |
2020/02/07(金) 20:56:00.11ID:jtk/IwGo
つまり、はちみつ某は、なんの思い入れもない他人のソースを読まされる身になった経験が少ないわけか。
0383デフォルトの名無しさん
垢版 |
2020/02/07(金) 21:02:52.46ID:yxrGSGnH
アルゴリズム考えるときは、図を必ず書くと思うんだけど、皆さんは何を使ってますか?
いまは紙と鉛筆使ってるんだけど、探すの大変だから、ソフトに変えたい。
0384はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/07(金) 21:05:36.03ID:BIRgOLIs
>>382
せやな。
そんなわけで、他人のバイナリを見る機会はあるけどソースはそれほどでもって感じかも。
結果的に読まなきゃならないことはあるけど、所詮は趣味だから嫌になったらいつでも止められるし、急がなくてもいいし。
プレッシャーに晒されながらクソみたいなソースを読むってことはない。
0386デフォルトの名無しさん
垢版 |
2020/02/07(金) 21:09:26.55ID:y0pPi+zA
C++なんざ仕事で嫌々書かされるだけの言語だと思ったけど
趣味で使っちゃう子もおるんやな
0387はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/07(金) 21:12:24.23ID:BIRgOLIs
>>383
曖昧なところから思考を整理するなら紙と鉛筆でいいと思うけど、
それなりに書式の整ったようにするなら PlantUML とか。
GUI で自由にってことなら Dynamic Draw くらいが手頃かもしれない。
0390はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/07(金) 21:16:36.84ID:BIRgOLIs
>>386
ゲームのチートとかするために
既存のプロセスに割り込んだりする処理を書こうと思うと C か C++ くらいしかまともな選択肢なくね?
C で足りるなら C で済ませることもあるけど、もうちょっと高級なことがしたくなったら C++
ってのは妥当な選択肢というか、唯一解でしょ。

まあ近頃は Rust にも興味があるけど……。
0391デフォルトの名無しさん
垢版 |
2020/02/07(金) 21:37:46.79ID:yxrGSGnH
>>387
見てみます。
0393デフォルトの名無しさん
垢版 |
2020/02/07(金) 22:14:56.42ID:8FC0VQS8
カッコつけろって人
付ける付けないの基準はコンパイラの警告?

完全に優先順位を覚えてる人から見ると
カッコが多いと見にくいんだよ

a == 0 || b != 0
a * b + 1
*a[i]
*a++

こんなのにカッコつけてたら
えっ?何か意味があるの?って考えてしまう
0394デフォルトの名無しさん
垢版 |
2020/02/07(金) 22:26:24.78ID:52vnIbYM
> えっ?何か意味があるの?

いや、「あーまた面倒くさいやつ来やがった」だよ
0395デフォルトの名無しさん
垢版 |
2020/02/07(金) 22:52:28.44ID:GxNDg+Fe
実務経験1年で月収80万稼げるエンジニアになった理由
https://www.youtube.com/watch?v=DrbbyGsHQic
意識が低いエンジニアこそフリーランスになれ
https://www.youtube.com/watch?v=nSEaAJlgjbQ
フリーランスエンジニアの週3労働ってどんな感じ?
https://www.youtube.com/watch?v=8yjoDCdbzMc
ぼくがスキルのない社畜ならこうやって脱する
https://www.youtube.com/watch?v=aae8xxbUlMM
初めて人を雇ったらもう二度とサラリーマンをやりたくないと思った話
https://www.youtube.com/watch?v=U0OCGRVLFsM
プログラミングは文系でも余裕で出来ます!理由を現役プログラマーが解説
https://www.youtube.com/watch?v=iBOeiSKBIW8
貧乏人こそ社会不適合者
https://www.youtube.com/watch?v=O3BT72BIBJI
元ド貧乏が教える】貧乏を抜け出すための2つの考え方
https://www.youtube.com/watch?v=IRrCgTy3ckc
より良いオファー貰ってるのに転職しないとか何考えてるの?
https://www.youtube.com/watch?v=i0J6uRhlj7o
0396デフォルトの名無しさん
垢版 |
2020/02/07(金) 22:55:11.74ID:NUR9HIfz
優先順位を完全に把握しているなら機能的には意味のない括弧だと理解しているんだろうが
そのうえで疑問に思った「意味」って、どんなものを想定しているんだろう。
「優先順位を完全に把握していない人が間違えないように」くらいの意味しか思いつかないが。
0397デフォルトの名無しさん
垢版 |
2020/02/07(金) 22:59:52.10ID:8FC0VQS8
(a + b + c) + (d + e)

同じ型の整数5個を足すのにこんなカッコが付いてたらどう思う?
0401デフォルトの名無しさん
垢版 |
2020/02/07(金) 23:31:57.60ID:Uosz/SQM
まずプログラム言語っての読み書きする人間のためにあるって大前提忘れてるか自覚してないやつ多いな
0402デフォルトの名無しさん
垢版 |
2020/02/07(金) 23:34:58.95ID:NUR9HIfz
>>399
マイナスが混ざっているならわからんでもないが、>>393で言っている優先順位の話とは関係ないように思うが?
0405デフォルトの名無しさん
垢版 |
2020/02/07(金) 23:41:49.81ID:yMJLmx4v
主観で見やすい表記にする
その為にコンパイラの警告を無視したり切ったりする

何も問題無い
0406
垢版 |
2020/02/08(土) 00:06:08.38ID:Wxs8WSK9
>>374
> >>371
> 変な作法が追加されることなんて良くあるんだぞ。
> 今じゃ gcc や clang で -Wall オプションを付けたら
> a || b && c
> みたいな式にすら警告が出る。
> 優先順位を間違えやすいとこだから括弧で明示した方が良いんだと!
> 演算子の優先順位くらい把握しとるわ!

把握してても間違えやすいからだと思うね
実際にはa,b,cには比較演算子を使った式が入ることが多いだろう
そうするとけっこうな長さになったりする
で全体の構造が見えにくくなる

そりゃ書いてる真っ最中は問題ないさ
しかし後から読んだときにすぐ理解できなかったり、手を加えるときに間違えたりする
warningを出すべきかは議論の余地があると思うけど、
出すべきと考える理由はわかる
0407デフォルトの名無しさん
垢版 |
2020/02/08(土) 00:38:17.76ID:RKzyJDHj
それはエディタの機能でかっこを表示したら良いのでは。
0408デフォルトの名無しさん
垢版 |
2020/02/08(土) 00:57:11.32ID:GuOhFnKw
主観は重要だろう。
重要でないなら全部アセンブラで書けや。
客観的には最も性能の出る言語だぞ。
0409デフォルトの名無しさん
垢版 |
2020/02/08(土) 01:23:28.05ID:Mdfh1mSi
&,|とか&&,||は*,+の関係と同じだから括弧つける方が冗長で分かりづらくなると思うんだが
0410デフォルトの名無しさん
垢版 |
2020/02/08(土) 01:29:21.53ID:zzucbZgG
一度書いた四則演算の数式を書き換えることはほとんどないけど、bool論理演算は頻繁に書き換えるでしょ。
0412デフォルトの名無しさん
垢版 |
2020/02/08(土) 01:45:08.63ID:RKzyJDHj
>>411
プロの意見だとどうなりますか?
0413デフォルトの名無しさん
垢版 |
2020/02/08(土) 01:52:50.03ID:JKzazDKJ
数式を遅延評価するオブジェクトを作れば
演算子のオーバーロードで演算子の優先順位を変えられるも同然
0415デフォルトの名無しさん
垢版 |
2020/02/08(土) 01:54:26.60ID:zzucbZgG
プロなら抽象的な質問には回答しないでしょ。時間泥棒にあう。
「もっと具体的に書いてくれ」と逆質問する義理がないならなおのこと。
0416デフォルトの名無しさん
垢版 |
2020/02/08(土) 02:00:57.81ID:RKzyJDHj
自分の職業の板には一切いかないから、ここも職業プログラマはいないと思う。
ここに書き込む意味が無いと思うんだよな。
0418デフォルトの名無しさん
垢版 |
2020/02/08(土) 02:06:09.28ID:Mdfh1mSi
職業プログラマって?
仕事でソフト作るし、客先に納入したりもするけどプログラマではないな
0419デフォルトの名無しさん
垢版 |
2020/02/08(土) 02:08:10.84ID:RKzyJDHj
たとえば、外科医が匿名の掲示板で効果的な治療法について話し合ったりしないでしょ。
治療法について話し合ってる人は患者だ。
だから、ここにもプログラマはいないはず。
0420デフォルトの名無しさん
垢版 |
2020/02/08(土) 02:28:45.19ID:zzucbZgG
プロの対義語はアマ。素人の対義語は玄人。
今時点のこのスレの回答者が素人同然の低いレベルであることは、否定できない。
例えば一週間後は違うかもしれない。もっともまともな回答者がこのスレに常駐するようになるかもしれない。
0425デフォルトの名無しさん
垢版 |
2020/02/08(土) 08:04:33.44ID:gtTyaGQ0
私も見たことは無い
でも他の演算子でも同じこと

1u << n+1

こんなのは良く使う
いちいちカッコを付けた方が分かりにくい
0426デフォルトの名無しさん
垢版 |
2020/02/08(土) 08:11:34.30ID:gtTyaGQ0
カッコを付けろって結局警告が出るから付けろってことで
見やすさとか無視した意見が多い

if ((a==(b + 1))||(a==(b + 2)))

こんな感じに書くヤツがいるんだよ実際
0427デフォルトの名無しさん
垢版 |
2020/02/08(土) 08:14:44.94ID:ARbKbNEu
警告の出方がコンパイラによって違うわけで
特定のコンパイラの警告に対応するということなら
#pragma使うのと同じだね
0429デフォルトの名無しさん
垢版 |
2020/02/08(土) 08:42:00.85ID:gtTyaGQ0
えっ?
まじで言ってる?

if (a == b+1 || a == b+2)

これだと一瞬で理読める
俺が特殊?
0432デフォルトの名無しさん
垢版 |
2020/02/08(土) 09:10:24.21ID:ktYbgjbO
>>366
手抜きがどうこうと最もらしいこと言ってるけど
>>359で言ってるのは「警告に対処するのが面倒くさい」ってことだろ?
仕事で手を抜くべき場所とそうでない場所、みたいな次元の話じゃない

あと警告レベルは最大にしたりすると標準ライブラリにすら警告出るけど、標準より下げるのは良くない
そういうこと平気でやってると必ず後で本格的に面倒くさい原因不明のバグが頻発する
0434デフォルトの名無しさん
垢版 |
2020/02/08(土) 09:30:03.39ID:GuOhFnKw
if( a == (b+1) || a == (b+2) )
これくらい書いてもバチ当たらんだろ。
しょうもないことでドヤってる馬鹿が開発では一番有害。
0438デフォルトの名無しさん
垢版 |
2020/02/08(土) 10:24:14.91ID:YOfaZC8k
じゃあ次は

bool b;
// 略
if (b == true)

の話でもする?w
俺はこれが一番のキチガイ記法だと思ってる
0441デフォルトの名無しさん
垢版 |
2020/02/08(土) 10:39:25.53ID:yaVA2/v3
if (a = b+1 || a == b+2)
こう書いたとき気づきづらい
手間をかけるのはそれ自体だけでなくいろいろ見る機会になる
0446デフォルトの名無しさん
垢版 |
2020/02/08(土) 11:39:54.89ID:pjdiRHlo
>>445
C/C++ では、b が「非0」、つまり「0 以外」だとすべて真(true) と考えるのが伝統。

なお、余計に混乱を招くだけかもしれないが、
数学的には、b == true とは、単なる数として完全一致であることを調べる演算子ではなく、集合的に、b ∈ {非0} であるかどうかを調べる演算子だとみなすことも出来る。
ところが、C/C++ では、== 演算子は単なる数としての一致を調べる演算子で、
かつ、TRUE は通常 1 にマクロ定義されているので、
b == true が、b が完全に 1 に一致しているかどうかを調べる演算子になっている。

なので、if (b) と書く方が正しく、if ( b == TRUE ) と書くのは間違い。
0447デフォルトの名無しさん
垢版 |
2020/02/08(土) 11:53:39.76ID:yr4lhGWD
>C/C++ では、b が「非0」、つまり「0 以外」だとすべて真(true) と考えるのが伝統。

名前が紛らわしいがBOOLは真偽二値じゃないんだからそれは関係ない。
TRUEかどうか判定する必要があるなら if (b) は明らかに間違い。
0452デフォルトの名無しさん
垢版 |
2020/02/08(土) 12:56:37.29ID:zzucbZgG
>>442,450
対話デバッグでaに応じて実行をブレークしたかった人が残したデバッグの痕跡だろうね。
ソースを他人に公開する際にはブレークポイントの情報はなくなるから、他人には意味不明だけど。
0453デフォルトの名無しさん
垢版 |
2020/02/08(土) 12:58:48.67ID:zzucbZgG
>>451
狂気じゃなくて修正の積み重ね。少しづつ修正していると大ポカに気づけない。
だからこそ親切なコンパイラの警告に従う謙虚さが大切になる。
0455デフォルトの名無しさん
垢版 |
2020/02/08(土) 14:33:50.82ID:pjdiRHlo
BOOL b に対して、正しくはこう :
if ( b )     // 良い
if ( b != 0 )   // 良い
if ( b == TRUE ) // 駄目
0456デフォルトの名無しさん
垢版 |
2020/02/08(土) 14:48:48.31ID:v1IBJgnW
>>383
graphviz / python
0458デフォルトの名無しさん
垢版 |
2020/02/08(土) 14:52:17.78ID:v1IBJgnW
>>403
浮動小数点数なら桁落ちとか気にしてんのかなーとか勘繰る
0459デフォルトの名無しさん
垢版 |
2020/02/08(土) 15:10:32.80ID:pjdiRHlo
>>403
整数の場合だと、括弧を付けてある部分に何らかのまとまった意味があるのかも知れない。

数学や物理学では、計算を減らすために式変形していくが、最終的な式は元々の意味が分からなくなってしまうことがある。

その場合には括弧で囲ったくらいで意味が分かり易くなることは少ない。

しかし、そのケースの場合は、括弧で括ると何か意味が分かり易くなると考えた間ロウ製がある。
0462デフォルトの名無しさん
垢版 |
2020/02/08(土) 15:45:10.44ID:yr4lhGWD
MSDNの書き間違いかもしれないが、Win32 APIの一部にも「成功時はTRUEを返す」という
仕様の関数があるんだよな。
0463デフォルトの名無しさん
垢版 |
2020/02/08(土) 15:54:04.38ID:pjdiRHlo
>>461
そもそも、-1 は TRUE 扱いすると言うのが C/C++ の伝統や文化。
-1 と TRUE を分けて扱うのは、特殊な独自仕様。

>>462
Win32 API の一部どころか、ハンドル値を返す以外のほとんど全ての関数が、
成功すれば TRUE を返す。
0464デフォルトの名無しさん
垢版 |
2020/02/08(土) 16:07:20.11ID:yr4lhGWD
おいおい、#define TRUE 1のTRUEと真(true)の区別がぐちゃぐちゃだぞ。

BOOLを返すWin32 APIの多くは「成功時はFALSE(0)以外の値を返す」という仕様になっている。
0466デフォルトの名無しさん
垢版 |
2020/02/08(土) 16:19:44.70ID:RKzyJDHj
C++にはtrueがあるので積極的に使っていこうと思います。
0467デフォルトの名無しさん
垢版 |
2020/02/08(土) 16:36:41.39ID:pjdiRHlo
>>464
なるほど確かに Win32 の BOOL LineTo(HDC hdc, int nXEnd, int nYEnd)の 戻り値は、

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.

のように、成功時には 1 や TRUE ではなく、「非0」を返すと書いてある。
0468デフォルトの名無しさん
垢版 |
2020/02/08(土) 16:45:19.38ID:RKzyJDHj
キャッシュかキャッシュでないかで速度が変わる。
これは驚き。
0470デフォルトの名無しさん
垢版 |
2020/02/08(土) 17:21:59.80ID:+a4Pmd4C
○ if(b) if(!b)
○ if(b == FALSE) if(b != FALSE)
× if(b == TRUE) if(b != TRUE)

WinAPI使いには常識だと思ってたんだが
0471デフォルトの名無しさん
垢版 |
2020/02/08(土) 17:32:20.19ID:RKzyJDHj
そういうのをみんなで共有しましょうって事で、たらこさんが2chを作ったんですよ。
0472デフォルトの名無しさん
垢版 |
2020/02/08(土) 17:40:43.90ID:yr4lhGWD
>>470
常識というか思い込み。
大半のFALSE/FALSE以外を返す関数なら上で良いが、>>462のようにTRUEを返すなら当然
TRUEと比較しなきゃ正しくない。
0473デフォルトの名無しさん
垢版 |
2020/02/08(土) 17:57:14.84ID:+a4Pmd4C
本当にそんなのあるの?
戻り値BOOLでFALSE(0)とTRUE(1)以外の値をTRUEと違う意味を表現するために意図的に返す奴があるってこと?
具体例どうぞ
0474◆QZaw55cn4c
垢版 |
2020/02/08(土) 18:25:19.22ID:JRIqyhqH
>>446
>C/C++ では、b が「非0」、つまり「0 以外」だとすべて真(true) と考えるのが伝統。
>if ( b == TRUE ) と書くのは間違い。

それは b の型が int だったら、そのとおりだけれども、>>438 をみるかぎり bool b なんでしょう?

はっ!これが老害というやつですか…
0476デフォルトの名無しさん
垢版 |
2020/02/08(土) 18:31:14.43ID:yr4lhGWD
>>462に書いたMSDNのは単にドキュメントの間違いという可能性もあるけどね。
それとは別に、TRUE/FALSe以外に-1を返すAPIがあるのは有名だろう。
いずれにしても仕様をちゃんと確認してそれに従った扱いをすべきで、思い込みは禁物ってこと。
0477はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/08(土) 18:33:32.51ID:2SU4KPt5
>>475
GetMessage の返却値の場合は一応は TRUE の特殊な場合として -1 の状況もある
って感じだから TRUE とは別の場合を意味する第三の状況というわけではないな。
0478デフォルトの名無しさん
垢版 |
2020/02/08(土) 18:34:27.09ID:RKzyJDHj
判定マクロないの。
0479はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/08(土) 18:44:49.18ID:2SU4KPt5
>>466
bool も式にまざるといつのまにか int に暗黙に型変換されちゃったりして、
やっぱりこう、あまりしっかり区別されてる気がしねぇなあと思うことも多いよ。
Windows API で使われている BOOL よりはかなりマシではあるけど。
0481デフォルトの名無しさん
垢版 |
2020/02/08(土) 18:51:51.40ID:+a4Pmd4C
「WM_QUITでない」という条件における真(0以外)の中の特殊な場合(エラー)に-1ってことなのね
理屈はわからんでもないけど変なの
本当はそんなのの戻り値に「BOOL」なんていうtypedefを使うのがそもそもおかしいんだけどWinAPIだから仕方ないな
0482デフォルトの名無しさん
垢版 |
2020/02/08(土) 18:52:06.88ID:RKzyJDHj
>>480
行末の;イイね。
0483デフォルトの名無しさん
垢版 |
2020/02/08(土) 18:52:56.77ID:RKzyJDHj
30年前のAPIだしね。
0484はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/08(土) 18:55:20.75ID:2SU4KPt5
今なら適当なフレームワークをかぶせて使うもんだと思う。
素でメッセージの処理とか面倒くさすぎるし。
0486デフォルトの名無しさん
垢版 |
2020/02/08(土) 20:18:51.44ID:RKzyJDHj
>>485
これ何億円するの?
0488デフォルトの名無しさん
垢版 |
2020/02/08(土) 21:25:19.61ID:RKzyJDHj
正の型の値と負の型の値を比較する場合、ビット幅の大きいほうの型に変換されてから比較されるんですかね?
0491デフォルトの名無しさん
垢版 |
2020/02/08(土) 23:34:23.41ID:jnRyPLnj
>>472
いや。TRUE は、必ず if 式で真と判定されるので、if (b == TRUE) としなくても
if (b) で絶対十分であることは補償されている。
むしろ、if (b == TRUE) と書くのはバグの原因になるので駄目だと言われている。
0492デフォルトの名無しさん
垢版 |
2020/02/08(土) 23:51:17.72ID:jnRyPLnj
なんというか、TRUE は、処理系ごとに変化する値ではなく、C/C++ においては、標準的には必ず 1 に #define されている。
一応分かり易さのために TRUE と書いているだけで、TRUEが2になったりする事は考える必要はない。

ただし、逆に、高速化のために 1 ではなく、非0の値を返してたまたまの値、
例えば、12 とかを返してくる関数が有りえる。
その場合、うっかり間違って if ( b == TRUE ) などと書いてしまっていたら
大変なことになるので、意味的に TRUE を返す場合には、
if ( b ) または、if ( b != 0 ) と書く方が安全だと考えられている。
0493デフォルトの名無しさん
垢版 |
2020/02/08(土) 23:53:58.53ID:jnRyPLnj
非常に古い時代に、TRUE を -1 と定義していた処理系もあったかもしれないが、
現在の C/C++ では、1 に定義するのが基本とされている。
b == TRUE という判定の仕方は、C/C++ の言語仕様から考えれば推奨されない。
0494はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/09(日) 00:57:27.97ID:OoesT11A
>>492-493
言語仕様にある true を避けているのだから、
その環境においては標準と異なる事情があるのだと察するべきじゃないの。
まあそういうことがあったらもっと別の名前を付けるべきだとは思うけど。

C/C++ はその性質上、様々なシステムの仲立ちをする機会があるし、
いろんな事情に左右される。
TRUE を 1 と定義する機会が多いのは確かだろうし、
そのときの習慣が確立されてもいるのもわかってるけど、
それが当たり前かっつーとそうとも言えんのじゃないかな。
0496デフォルトの名無しさん
垢版 |
2020/02/09(日) 01:23:08.88ID:e66sowWB
>>494
TRUE が 1 以外に定義されていても、TRUE の値は、if 文では真と解釈されることだけは保障されているので、if (b) は問題ない。
逆に BOOL b の場合、b が非0であるが、TRUE のマクロ値とは異なった値になっている場合がないとは保障はされない。
なので、if ( b == TRUE ) だと、TRUE ではないが b に真とみなせる値が入っている場合にすり抜けてしまう恐れがあり、重大バグの原因となる。
0500はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/09(日) 02:19:40.02ID:OoesT11A
>>495
ハチミツじゃなくてはちみつな。

>>496
それが真偽値だというのが思い込みで、
実際には様々な可能性が有り得るってことだよ。

普通はこうだからこうみたいな話じゃなくて、
少なくとも言語仕様に無いのはわかってるんだから、
その環境でどうなってるかくらい確認したれやという話。

>>497
私は >>493 からあくまで現代の話だと読み取ったのでそのつもりで返答してるけど、
C/C++ のコードは長期的に使われやすいので現代という範囲の認識に齟齬はあるかもしれん。
0501デフォルトの名無しさん
垢版 |
2020/02/09(日) 02:27:09.56ID:cYNa4VVg
過去と未来の狭間にあるってことかな。
0502デフォルトの名無しさん
垢版 |
2020/02/09(日) 04:25:17.31ID:ids8kf+0
WindowsAPIはC++限定じゃなくCを主軸に捉えてるだろ
クラスとか一切無いしマクロだらけだし
そもそもboolが無かったってのはそういうことやろ
0503デフォルトの名無しさん
垢版 |
2020/02/09(日) 07:14:29.14ID:6++kPC7v
>>462
> MSDNの書き間違いかもしれないが、Win32 APIの一部にも「成功時はTRUEを返す」という
> 仕様の関数があるんだよな。
具体的にどれ?
0507デフォルトの名無しさん
垢版 |
2020/02/09(日) 08:43:40.61ID:J3Qn0niW
>>496
何回ループしてるんだよ。
真(truthy)であることが要求されているなら if (b) だし、TRUEであることが要求されるなら
if (b == TRUE) だ。それを取り違えることがバグだ。
0509デフォルトの名無しさん
垢版 |
2020/02/09(日) 08:59:21.69ID:aEgJYC9i
まあ失敗時はFALSE、とも書いてあるから、こう書くのが正解!
bRet32 = MakeSureDirectoryPathExists("C:\\tmp");
if (bRet == TRUE) {
 // 成功すた
 ...
} else if (bRet == FALSE) {{
 // 失敗すた
 ...
} else {
 assert(0);
}
0510デフォルトの名無しさん
垢版 |
2020/02/09(日) 09:03:53.87ID:aEgJYC9i
あと>>461は、>>455の三択で選ぶならif (b == TRUE)だが
正しくは↓こう書くべき
bRet = GetMessage(...);
if (b == -1) {
 // エラー1が発生すた、
 ....
} else if (bRet == FALSE) {
 // エラー2が発生すた、
 ....
} else if (bRet = TRUE) {
 // 成功すた、
 ...
} else {
 assert(0);
}

つまり出題者>>455の知識と想像力の欠如が諸悪の根源
0512デフォルトの名無しさん
垢版 |
2020/02/09(日) 09:28:45.27ID:PT76WH2y
C89にboolがないことに拒否反応を起こす頭の固い奴に迎合して作られたboolでないBOOL
0513デフォルトの名無しさん
垢版 |
2020/02/09(日) 09:35:18.39ID:aEgJYC9i
先にWindowsがシステムコールとしての素朴な要請からbool型の実装型を定義して、
その後コンパイラメーカーがbool型の実装を別の方式にし出すよりは
よっぽどマシやったろうが!

個人的にはBOOLは好きだがな
TRUE/FALSEを表すのに4バイトも使うところが
いかにもリッチなOSっぽく、使っていてリッチな気分になれる
0515デフォルトの名無しさん
垢版 |
2020/02/09(日) 09:47:29.30ID:Ej5ffr5G
>>510
> } else if (bRet == FALSE) {
>  // エラー2が発生すた、
>  ....
エラーじゃないぞ
人の知識とか想像力とか言う前に自分の知識を見直せよw
0518デフォルトの名無しさん
垢版 |
2020/02/09(日) 10:45:20.17ID:Jw8Rx7z0
>>510
GetMessageのマニュアルをちゃんと読めクソ雑魚
エラーの時は-1、WM_QUITの時はFALSE(0)を返すが、それ以外の時は「nonzeroを返す」としか言ってない
nonzeroというのはたくさんの値の集合であって、その判定をある特定の値と==で行うことはTRUEが1だろうと他の値だろうと完全な間違いだ
つまりお前のその糞プログラムは完全にバグっているし、お前がバカにしてる>>455らが言った通りの間違いをそのままやらかしてる
0519デフォルトの名無しさん
垢版 |
2020/02/09(日) 10:54:04.79ID:Jw8Rx7z0
クソ雑魚>>510はマニュアルを読まない可能性があるので、マニュアルの使用例貼っておきますね
GetMessageがFALSE(0)返したときの何がエラーだって?笑わせんなカス
TRUE以外ならassertで落としていいなんてどこに書いてある?勝手な妄想すんなゴミ

BOOL bRet;

while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)
{
 if (bRet == -1)
 {
  // handle the error and possibly exit
 }
 else
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }
}
0520デフォルトの名無しさん
垢版 |
2020/02/09(日) 11:39:41.09ID:aEgJYC9i
>>519
>TRUE以外ならassertで落としていいなんてどこに書いてある?
それはこちらが聞きたい;
何を見てそう思ったのか?
0521デフォルトの名無しさん
垢版 |
2020/02/09(日) 11:53:18.89ID:PT76WH2y
>>519
変数いらねーから
for(;;)
switch(GetMessage(&msg, hWnd, 0, 0))
{
default:
TranslateMessage(&msg);
DispatchMessage(&msg);
break;

case 0:
return int(msg.wParam);

case -1:
throw std::system_error(std::error_code(int(GetLastError()), std::system_category()), "GetMessage");
}
0522デフォルトの名無しさん
垢版 |
2020/02/09(日) 12:02:53.96ID:Cr/e9GtE
while(GetMessage( &msg, hWnd, 0, 0 ) >0)
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
0523デフォルトの名無しさん
垢版 |
2020/02/09(日) 12:05:04.77ID:aEgJYC9i
とオモタがわかった
GetMessage()は WM_QUIT以外を受け取ったとき非0を返す、としか書かれていないから
bRet32 == TRUEでは正しい判定にならないのねん

使ったのがスゲー昔なので忘れていたが、そのときは多分>>519式に書いたから安心してホスイ
0527はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/09(日) 15:27:19.45ID:OoesT11A
>>506
BASIC というか、古の言語にはビット演算と論理演算の区別がないものが結構あった。
全てのビットが立った状態 (-1) を真ということにしておけば
ビット演算用の AND, OR, NOT がそのまま論理演算のそれとして使える。

昔はこれが気の利いた方法だったんだろう。
0528デフォルトの名無しさん
垢版 |
2020/02/09(日) 16:19:35.32ID:wTv3WydA
#define FALSE 0 ← 正しい
#define TRUE 1 ← 間違い くず! 0点!! 出入り禁止!!!
#define TRUE (!0) ← 正しい
if(b) ← 正しい
if(b != FALSE) ← 正しい
if(b == TRUE) ← 間違い くず! 0点!! 出入り禁止!!!
0534デフォルトの名無しさん
垢版 |
2020/02/09(日) 17:46:22.21ID:cYNa4VVg
ちゃうねん。
0535デフォルトの名無しさん
垢版 |
2020/02/09(日) 17:46:32.42ID:ugWNThcV
>>528
#define TRUE (!0) ← 正しい

C/C++ では、!0 は、必ず1 になることが仕様化されているので、仕様に準拠している
処理系ではこれは必ず、
#define TRUE 1
と書くのと同じになるので、敢えて (!0) と書く意味は無い。
0539デフォルトの名無しさん
垢版 |
2020/02/09(日) 17:55:11.50ID:J3Qn0niW
>>537
マシとか言う以前にそもそも動作が違うんだが。
bがTRUEと一致するかどうか判断するのに他にどういう書き方をするというんだろう?
0540デフォルトの名無しさん
垢版 |
2020/02/09(日) 17:59:01.69ID:cYNa4VVg
>>539
!(b != TRUE)。
0541デフォルトの名無しさん
垢版 |
2020/02/09(日) 18:02:21.32ID:GpaXptWq
普通はTRUEかFALSEしか入ってないんだよ

それ以外が入ってる可能性があるなら
普通TRUEがどうかの判断だけじゃダメじゃないか?
0543デフォルトの名無しさん
垢版 |
2020/02/09(日) 18:07:19.16ID:ugWNThcV
>>539
それは難しくいえば数学の集合論の話になる。
{0} と {非0} の二つの集合が有り、
if の条件式では、前者が偽、後者が真と評価される。
TRUEはどんな処理系であれ、必ず後者の集合の要素(元)になっていることだけは
保障されている。
なので、if ( b != 0 ) や、if (b) は正しいが、
if (b == TRUE) は絶対駄目、ということになる。
0545デフォルトの名無しさん
垢版 |
2020/02/09(日) 18:10:45.32ID:ugWNThcV
if ( b == TRUE ) は、この条件式自体の動作は問題ないが、
b が TRUE ではないが、真である何らかの値を持っていたときに破綻してしまう。
BOOL b と書いた場合、本人が書いたプログラムでは b は、必ず
TRUE か FALSE の二値に限って書くことになろうが、往々にして、
APIなどでは、「真」の意味で「非0」の値を返してくること関数が含まれて
しまっている。
だから、勘違いや混乱が起き易い。
そのため、if ( b == TRUE ) というのは、絶対にやめておいたほうが良い書き方
となる。
0546デフォルトの名無しさん
垢版 |
2020/02/09(日) 18:16:58.01ID:GpaXptWq
TRUE/FALSE以外を想定するなら
時と場合による

TRUE/FALSEしか想定しないなら
if (b) / if (!b)
と書くべき
0547デフォルトの名無しさん
垢版 |
2020/02/09(日) 18:19:53.44ID:TF4jiljH
昔VB6からWinAPI呼ぶときの注意点として本で読んだ気がする
それboolじゃないよね?とは思った
0549デフォルトの名無しさん
垢版 |
2020/02/09(日) 18:29:21.05ID:J3Qn0niW
>>546
排中律が成り立たないからFALSEでないことはTRUEを意味しない。
成功した場合にTRUE、失敗した場合にFALSEを返すという関数がある場合、成功したかどうかは
FALSEでないことではなくTRUEと一致するかどうかで判断しなければならない。
0550デフォルトの名無しさん
垢版 |
2020/02/09(日) 18:29:23.53ID:cYNa4VVg
>>548
!(b != TRUE)。
0551デフォルトの名無しさん
垢版 |
2020/02/09(日) 18:30:08.13ID:aEgJYC9i
>>548
架空のケースについてのお答えは差し控える
つか糞コードかどうかはともかく>>509の方はMSDNの記述に準拠したコードという意味では
非の打ち所が無い(何かあってもMSDNのせいにできる
0552デフォルトの名無しさん
垢版 |
2020/02/09(日) 18:30:08.50ID:6++kPC7v
>>539
> bがTRUEと一致するかどうか判断する
それ自体がまずい(ことが多い)と指摘されてることにそろそろ気づこうよ…
0554デフォルトの名無しさん
垢版 |
2020/02/09(日) 18:42:52.19ID:cYNa4VVg
いやちゃうねん。
0555デフォルトの名無しさん
垢版 |
2020/02/09(日) 18:59:34.88ID:aEgJYC9i
intの取り得る値の集合に対し、TRUEの定義が-93でありかつそれ以外は偽と解釈をせよと仕様に書いてあったら
さすがに(b == TRUE)とか(b != TRUE)書くことを現実の選択肢として考慮せざるおえない
もちろんそんな仕様が糞だが、仕様なのだからしようが無い
数学の本質は自由性にある、
0557デフォルトの名無しさん
垢版 |
2020/02/09(日) 19:15:36.19ID:PT76WH2y
FALSEは定数
TRUEは範囲で観測によって収束する

適性に乏しいやつには厳しいよな
0559デフォルトの名無しさん
垢版 |
2020/02/09(日) 19:16:09.28ID:MeV8oXxA
集合B={FALSE=0,TRUE=1} の場合 !FALSE=TRUE だが
B'={FALSE=0,TRUE1=1,TRUE2=2,TRUE3=3} の場合
!FALSE={TRUE1,TRUE2,TRUE3} となる
しかし TRUE={TRUE1,TRUE2,TRUE3} と定義すると
B''={FALSE=0,TRUE} となり、同型B≡B'が示されるため、B'をboolとみなすことは可能である
ただし、比較演算子は集合として同値であるのか、集合に含まれるのかを示さなければならない
b⊂B'(≡B) のとき、 b=FALSE は一意だが、b=TRUE は b=1∩b=2∩b=3 を示す
0560デフォルトの名無しさん
垢版 |
2020/02/09(日) 19:17:37.19ID:mORiFTgk
数学関係ないのに数学ネタでひっぱってるヤツがいるな
IDは違うけど同じ人?

数学関係ないから
0561デフォルトの名無しさん
垢版 |
2020/02/09(日) 19:18:03.88ID:6++kPC7v
>>553
>>514の話なら>> 509だし、そうでないAPIもたくさんあるから
> それ自体がまずい(ことが多い)と指摘
されてるんだが、まじでわかってないのか?
引っ込みつかなくなってるだけだと思ってたが…
0562デフォルトの名無しさん
垢版 |
2020/02/09(日) 19:18:39.73ID:cYNa4VVg
ちゃうねんちゃうねん。
0564デフォルトの名無しさん
垢版 |
2020/02/09(日) 19:22:41.80ID:qoRTNAXH
グローバル領域にインスタンスを作って、初期化はmain()の中でしたいとします。
で、初期化に必要な情報はmain()の中で初めて分かるとします。

こういうときってそのクラスのコンストラクタとしては何もしないものを作っておいて、初期化用の関数を別途用意するというのが普通ですか?
インスタンスの宣言だけしておいてコンストラクタは後で呼ぶなんてできないですよね?
0566デフォルトの名無しさん
垢版 |
2020/02/09(日) 19:29:17.77ID:J3Qn0niW
>>561
逆に不思議だわ。
「成功時に0以外の値を返す」と「成功時にTRUEを返す」は違うということがなんで理解できないのか。
0574デフォルトの名無しさん
垢版 |
2020/02/09(日) 19:49:14.41ID:VD5bohdG
GetGlyphOutline などで文字画像を取り出そうとすると、フォントが持ってない文字は代わりの文字を出力してくる。
(例えば、昔の毛筆フォントでは「(はしご高)」などはMSゴシックになる。)
これを抑制したいので、そのフォントがグリフデータを持っているかどうか、調べる方法はありますでしょうか?
0580デフォルトの名無しさん
垢版 |
2020/02/09(日) 20:05:21.07ID:J3Qn0niW
多い方に合わせろって話でもないだろう。
>>568の通りそれぞれの仕様に合わせて適切に扱えってこと。
0583デフォルトの名無しさん
垢版 |
2020/02/09(日) 20:20:16.24ID:6++kPC7v
>>580
誰も多い方に合わせろなんて言ってないのに…
単にそういうケースが多いって言うだけの話であることも説明しないとわからんのかな?w
0584デフォルトの名無しさん
垢版 |
2020/02/09(日) 20:30:08.24ID:J3Qn0niW
なら問題ないケースもあることを理解してるわけだ。だとすると>>552で指摘してたのはなんだろうと。
0585デフォルトの名無しさん
垢版 |
2020/02/09(日) 20:34:19.93ID:6++kPC7v
>>584
えっ?
まだ(ことが多い)ってわざわざ書いてる意味がわからんのか?
まともな奴と会話してる時ならいちいち書かないんだが、ネット掲示板なのでわけわからん奴に絡まれないようにわざわざ書いたのに想定外の低能さんなの?
0586デフォルトの名無しさん
垢版 |
2020/02/09(日) 20:46:39.77ID:J3Qn0niW
>>585
つまり>>552は、まずい場合もあるしそうでない場合もあるという意味のない指摘なわけだ。
ようやく>>539に戻れたな。

>>537
マシとか言う以前にそもそも動作が違うんだが。
bがTRUEと一致するかどうか判断するのに他にどういう書き方をするというんだろう?
0587デフォルトの名無しさん
垢版 |
2020/02/09(日) 20:52:41.00ID:mORiFTgk
bがTRUEと一致する条件の話はしてなくて
boolに対するif文をどう書くかの話だろ

APIの使い方なら他スレでやって
0588デフォルトの名無しさん
垢版 |
2020/02/09(日) 20:55:58.33ID:PT76WH2y
余所でやれって、APIと言語仕様のズレの話だろ
正しい理解はどのようなものかという興味は
スレ違いじゃねえぞ
0589デフォルトの名無しさん
垢版 |
2020/02/09(日) 21:03:28.51ID:mORiFTgk
APIの正しい理解ならAPIのドキュメントを見れば良いのでは?

もともとのboolの話とは全く関係ないですね
0590デフォルトの名無しさん
垢版 |
2020/02/09(日) 21:05:18.68ID:6++kPC7v
>>586
> つまり>>552は、まずい場合もあるしそうでない場合もあるという意味のない指摘なわけだ。
お前には意味ないのかもな…
必死になりすぎw
0592デフォルトの名無しさん
垢版 |
2020/02/09(日) 21:06:45.54ID:mORiFTgk
boolの話題でbool以外を語るのはこんな感じ

内部的に固定小数点なfloatライブラリもあるぞ
内部的にvectorなmapライブラリもあるぞ
0594デフォルトの名無しさん
垢版 |
2020/02/09(日) 21:21:02.28ID:J3Qn0niW
>>590
意味のあるなしは主観だからいいとして、結局これ理解できたかな?

>>537
マシとか言う以前にそもそも動作が違うんだが。
bがTRUEと一致するかどうか判断するのに他にどういう書き方をするというんだろう?
0596
垢版 |
2020/02/09(日) 21:32:30.02ID:Z95s67CZ
boolができるまでは

if (!!b)

こういうイディオムもありましてね
0597デフォルトの名無しさん
垢版 |
2020/02/09(日) 21:42:44.86ID:J3Qn0niW
>>576を理解しているなら

>bがTRUEと一致するかどうか判断するのに他にどういう書き方をするというんだろう?

このような判断がが必要な場合があることも理解しているはずだろうが、
結局この質問には答えられない(答えたくない)ようだな。
0600
垢版 |
2020/02/09(日) 22:16:06.44ID:Z95s67CZ
goto、マクロ、BOOL
全部C言語の範疇なんだよなw
おじさんがんばりすぎ
0601デフォルトの名無しさん
垢版 |
2020/02/09(日) 22:18:57.48ID:aEgJYC9i
つか真理値の型であるbool型および
真理値の型としての名前を与えられたBOOL型の議論が
Win32 APIの仕様という現実に汚染されてぐちゃらけてますな
TRUEに幅が有る、なんていうおかしいことを言い出す香具師まで出る始末、!
0603◆QZaw55cn4c
垢版 |
2020/02/09(日) 22:31:58.84ID:mQrdek/f
>>487
え?話の発端は >>438 でしょう?
>>439>>438 の bool を BOOL にすげ替えたミスリードでしょう?

>>491
もう一度いいますが、
>if (b == TRUE) と書くのはバグの原因になる
のは b の型が int であれば、確かにそういえますが、b の型が bool ならばなんの問題もなにのでは?
https://ideone.com/aL3agg

前提条件を全然考慮せず、条件反射的に
>if (b == TRUE) と書くのはバグの原因になる
と判断するのは老害的発想と私は断定しますね
0605デフォルトの名無しさん
垢版 |
2020/02/09(日) 22:33:54.63ID:aEgJYC9i
一般論として、APIの呼び出しが成功しました、という情報にはそれ以上幅も糞も無い(成功した要因など知っても無駄
から、成功=TRUE、失敗=FALSEとする割付の下では、TRUEこそ単一値として規定されるべきブツに他ならない
よって、一般論としては b == TRUEは言うほど糞ではないはずであった、
0606デフォルトの名無しさん
垢版 |
2020/02/09(日) 22:37:13.53ID:aEgJYC9i
まあエラー要因を複数種類返したい、ということなら
成功判定は b == SUCCEEDEDでSUCCEEDEDでなかったらエラーコードが入っている、という
INTかDWORD返しがストレートやったがな!(成功時非0を返す、とか言われるよりは
0607デフォルトの名無しさん
垢版 |
2020/02/09(日) 22:42:00.12ID:VD5bohdG
if( b == TRUE ) って、結局 if( b ) ってことだろ。
0609デフォルトの名無しさん
垢版 |
2020/02/10(月) 00:02:35.66ID:SkPzv01G
>>555
ヘッダファイルの中で TRUE の値が -93 に #define で定義されていたとしても、C/C++ の仕様だと、0だけが偽で、0以外は真であることだけはANSI Cで決まっているので、それはない。
0611デフォルトの名無しさん
垢版 |
2020/02/10(月) 00:07:32.18ID:SkPzv01G
>>548
その場合で、かつ、b が TRUE に一致するもの以外を除去したいなら
if ( b == TRUE ) と書く以外には無い。
しかし、Win32 API の仕様でも、そのようなことを判定する必要があることはない
ように通常、作られている。
何人かが指摘しているように、FALSE との判定は良いのだ。
TRUE との判定はまずい。
0617デフォルトの名無しさん
垢版 |
2020/02/10(月) 01:35:35.28ID:SkPzv01G
>>614
というか、JSやJavaは、ちゃんと学んだ人も多いだろうが、
Pythonを実際に使ったことのある人はかなり少数派だと思う。
0618デフォルトの名無しさん
垢版 |
2020/02/10(月) 01:38:59.61ID:SkPzv01G
>>617
Javaは、GUIも出来たしブラウザ上でも動いたし、他に代わるものがなかったので
それしか選択肢がなかったために実際に使った人は多かったはず。
JSも、HTMLを使おうとした際にそれしか動的言語は無かったから同様。

一方で、Pythonに関しては、似たようなものは他にたくさんあるし、
自分以外の人に使ってもらうにも実行環境のインストールが必要だし、
Javaと違って互換性にも問題あるので使いにくい。
0620デフォルトの名無しさん
垢版 |
2020/02/10(月) 03:53:35.38ID:rxX2x5Pb
んなわけない。
0622デフォルトの名無しさん
垢版 |
2020/02/10(月) 08:01:35.21ID:staO5LAL
ごちゃごちゃいうよりまずはいっぺんオッPythonで
そこそこの規模のプログラム(最低1000行以上)かいてみりゃわかる
はっきりいってクソだよ
あんなもんで巨大なプログラムはとても書けたもんじゃない
0623デフォルトの名無しさん
垢版 |
2020/02/10(月) 08:53:11.04ID:GJT/1Bxa
自分で1000行も書かなくても、どこかの誰かが書いてくれたライブラリを呼び出せば
望んだ仕事をやってくれるって部分がPythonの好まれる理由じゃないのん?

C++を使う人は、Pythonの流行を裏から支えてる感じで。
0624デフォルトの名無しさん
垢版 |
2020/02/10(月) 10:10:17.80ID:hDJC6jsQ
pythonで1000行くらいで根をあげてるようじゃ
どんなコード見ても文句言い出すだろ。。仕事にならんわ。
0625デフォルトの名無しさん
垢版 |
2020/02/10(月) 10:24:50.55ID:JgTqubiS
インデントをきっちり合わせないといけないので、Cの適当なインデントにうんざりしてる人にはむしろ合うかもしれない
でも関数やブロックが大きくなると、同一階層を探すのがつらくなるので、適切なブロック、関数分けが必須になる
いずれにしても、神経質な人には合ってるのかもしれない
0626デフォルトの名無しさん
垢版 |
2020/02/10(月) 10:46:13.48ID:oMyz9pGE
機械学習ならpythonほぼ必須なんだが
いまだにやったことないとか
ロートルなのを白状してるようなもん
0628デフォルトの名無しさん
垢版 |
2020/02/10(月) 11:25:16.00ID:8A84p9rG
pythonがいいとは思わないけど、perlがクソすぎるので相対的にマシだから流行ってる
それ以上の理由はないと思う
0630デフォルトの名無しさん
垢版 |
2020/02/10(月) 11:50:23.10ID:SkPzv01G
Pythonは、スマホで動かすのは難しいらしい。
少なくともスクリプト言語として動かすのは困難。

デスクトップマシンですら、
・互換性の問題がある。Ver 2系と Ver 3系で大幅に異なると聞いた。
・Windowsですらどの処理系が標準か不明。
・GUIがちゃんとまともに使えるかどうか不明。
0631デフォルトの名無しさん
垢版 |
2020/02/10(月) 11:55:31.13ID:SkPzv01G
>>630
Pythonのせいではなく、Perlのようなスクリプト言語がそもそも使えないという
スマホの限界だとは思う。
スマホでも使えることは使えても、IDEのような専用環境だけで使えるだけでは
本来のスクリプト言語としては使い物にならない。
このスマホの時代に Perl, Python, Ruby は合わないかも。
0632デフォルトの名無しさん
垢版 |
2020/02/10(月) 11:58:33.88ID:SkPzv01G
iOS, Android 共通にスクリプト的なことをやりたいなら、もう、スクリプト言語は諦めて、
C++で書いておいて iOSではSwift とリンクし、Androidでは、JNIを使ってJavaから
呼び出すほうがずっと簡単。
なお、AndroidならシェルスクリプトがPythonなんかより遥かに簡単に使える。
0633はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/10(月) 12:13:49.40ID:gblDkkh1
>>625
- 括弧などに従って自動でインデントが付く
- 手動 (あるいは半自動) でインデントの位置を合わせる

これの二択だったら前者の方が「きっちり」してると思うわ。
まあインデントの付け方にいくつかの選択肢がある点はやりづらい面も
あるかもしれんが、自由度と統一性は両立できないもんだしな。

Python はいじったことないからよう知らんけど、 (インデントで構造を表す系統の文法である) Haskell を書くのはつらかった。
Haskell ではインデントと改行の替わりに波括弧とセミコロンも使えるけど、Python にそういうのないの?
0634デフォルトの名無しさん
垢版 |
2020/02/10(月) 12:34:04.03ID:oMyz9pGE
pythonをswift, javaなんかと比較してる人は
隔離された世界で誰にも使われないアプリを細々と作ってる感じがするわw
学習系を含むデータ解析のツールとして環境が優れてるからpythonが人気なんだよ
c++でテンプレートいじってるよりビッグデータ解析してビジネス提案できる方がはるかに収入高い
0637デフォルトの名無しさん
垢版 |
2020/02/10(月) 14:18:49.02ID:SkPzv01G
>>633
ブロック開始終了記号とインデントを両方組み合わせたものが一番分かり易くて間違いにくい。
インデントだけでやると、個人的には見間違いそうで神経をすり減らすので辛い。
0638デフォルトの名無しさん
垢版 |
2020/02/10(月) 17:30:56.95ID:rxX2x5Pb
研究者が使うのにPythonは良い選択なんじゃないの。
事務作業にVBAが良い選択なのと同様に。
0639デフォルトの名無しさん
垢版 |
2020/02/10(月) 17:40:26.33ID:pqZ9DEAl
今さらですが、そもそもWin32のFALSEって、0であることは保証されてるんですか?

BOOL b = FALSE;
if (b)
{
  ここに来ないことは保証されてるんですか?
}
0642デフォルトの名無しさん
垢版 |
2020/02/10(月) 17:52:19.21ID:M5G7J8Pl
>>639
規格書のようなレベルで規定されているかどうかは知らないけど、公式ドキュメントの至るところで
FALSEは0である前提で書かれているものが見つかるから、そこを疑う必要はないと思う。

>>640
FALSEはWindows SDKの定義であってC/C++とは直接関係ないんだが。
0643はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/10(月) 18:04:03.15ID:gblDkkh1
>>640
現実にはそうだってのならわかるが、質問は保証があるかどうかなんだから、根拠を添えろよ。

少なくとも現状の WinDef.h では FALSE は 0 、 TRUE は 1 と定義されているのはわかったし、
常識的に考えればこれが変更されることはないが、
私はマイクロソフトのドキュメントからこれを裏付けるような文言を見つけられなかった。

BOOL が int であることは発見できた。
https://docs.microsoft.com/en-us/windows/win32/winprog/windows-data-types

should be TRUE or FALSE って書いてあるのにこれに反するような API があるのはアレだよな……。
0644デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:06:40.24ID:AZ4KAaI2
システムハンガリアンもそうだけど明白な違反が堂々と放置されているからなあ
0645デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:08:58.46ID:SkPzv01G
>>642 >>643
[根拠]
数学的に以下の根拠となる:

1. FALSE は、if ( FALSE ) とすると、偽として処理されることは絶対に保障される。
2. if (x) で x が偽として評価されるのは、ANSI C も、古い C でも必ず 0 という1つの値のみであり、他の値はすべて真と評価される。

1, 2 を両方成り立たせるためには、FALSE は必ず 0 でなければならないことが
証明される。
0646デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:10:00.98ID:SkPzv01G
数学が大事です。
今の場合、仕様書に書いてなくても、数学的に考えれば絶対であることが証明できます。
0647デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:13:48.89ID:M5G7J8Pl
昨日の奴かw
BOOLとboolは別物だということが結局最後まで理解できなかったんだな。
0649デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:21:23.11ID:1D/jLqBa
>>645
頭が悪いとか話が通じないってよく言われない?
言われる度に相手の方が間違ってると思ってるだろうけど、話が通じてないのはお前が自分の間違いを認識できてないからだぞw
0650デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:22:28.83ID:SkPzv01G
このスレには、失礼ですが、はちみつさんも含め、数学に弱い人が多いようです。
0651デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:23:02.20ID:SkPzv01G
>>649
いや、むしろ逆に現実では天才と呼ばれています。
0652デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:25:05.67ID:SkPzv01G
仕様書にすべては書いてなくても、数学で考えれば絶対であることが証明できる事柄があるのです。
今回のもその一例です。
0653はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/10(月) 18:25:15.66ID:gblDkkh1
ああ、荒らしに来ただけか。
まぜっかえすにしてももうちょっとマシなこと言えよ。
0655デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:27:37.23ID:rxX2x5Pb
マクロはほとんど書く必要なくなったよね。
0656デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:27:43.95ID:SkPzv01G
失礼ですが、はちみつ氏は、C++の仕様には詳しいですが、それ以外は結構間違っています。
0658デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:29:40.36ID:SkPzv01G
>>654
でも現実に私は天才と言われています。
0660デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:31:14.06ID:SkPzv01G
>>1
私は、東大数学科の人とは意見が一致することが多いです。
よく考えてみてください。
もし分からないようなら、多分、あたなは東大数学科ではないか、レベルが落ちてしまったと思われます。
0662デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:33:32.23ID:M5G7J8Pl
まとめるとこう。

1. BOOL型およびTRUE/FALSEは真偽値として用いるために*Windowsで独自に定義*されたものだが
 厳密には真偽値と振る舞いが異なる
2. 具体的には、FALSEでなれければTRUE、TRUEでなければFALSE、という排中律が成り立たない
3. 排中律が成り立たない以上、FALSEとの比較、TRUEとの比較はそれぞれ意味がある
0663デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:34:10.03ID:SkPzv01G
ここは、学歴も実績も嘘を付けてしまうので参考になりません。
東大数学科と言うのもたぶんデタラメでしょう。
0665デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:37:31.54ID:rZ6GQco7
排中律君も数学君と同じ人かと思った
違うのかな?

普通の言葉で書こうよ
書けるでしょ
0666はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/10(月) 19:01:26.22ID:gblDkkh1
>>664
TRUE を持つ内では皆が共通に論じられるほど広く知られたもののひとつだからでしょ。
反例としてはひとつあれば充分。
ちなみに「TRUE と比較するべきではない」に対する反例ね。

true であれ TRUE であれ、それと == で比較するのが罠になりやすいっつーのは
罠になりやすい部分として有名すぎて逆によく知られている常識だが、
絶対不変の定理みたいに言い始めたやつがいたから変なことになってるんだよ。

現実はそんな綺麗なもんじゃねーよっていうのに Windows はうってつけだろ?
0667デフォルトの名無しさん
垢版 |
2020/02/10(月) 19:02:19.07ID:VRCQc/iz
BOOLはWindows APIでしか使わないと思ってるから話が通じないんだな

数学君はなぜ話が通じない?
BOOLがTRUE, FALSE, UNKNOWN, ERROR
からなる集合だったら?
0669デフォルトの名無しさん
垢版 |
2020/02/10(月) 19:06:03.16ID:VRCQc/iz
BOOLは非常に広い環境で使われていて
その多くはTRUE/FALSEの2値を示す型として使われる

こういう普通の環境では
if (b) / if (!b)
で判断するのが最良

そうではない特殊な環境(Windows APIなど)は
個々のAPI別に語らないと意味が無い
0671デフォルトの名無しさん
垢版 |
2020/02/10(月) 19:33:07.36ID:M5G7J8Pl
つまり、Windowsで>>439のように書いていたのをWindowsのBOOLを知らずに否定しちゃう人、
というネタそのものを体現してくれたわけだな。
0672デフォルトの名無しさん
垢版 |
2020/02/10(月) 19:35:42.65ID:Ro8qON5e
BOOLについて議論するならどのBOOLか限定しないと
enum BOOL {TRUE,FALSE};
みたいなのかもしれないし

負論理の入出力ポート読み書きする値だとかで順番も重要だったりして
0673デフォルトの名無しさん
垢版 |
2020/02/10(月) 19:47:34.98ID:VRCQc/iz
>>671
何が「つまり」だか

Windows APIが色々と特殊なのは知ってるよ
Windows 2.0から組んでるし

特殊事情はあくまで特殊事情
0674デフォルトの名無しさん
垢版 |
2020/02/10(月) 19:56:01.41ID:M5G7J8Pl
そもそも、特殊じゃない「普通の環境」のBOOLって何ぞ?
typedef bool BOOL; とかw
0675デフォルトの名無しさん
垢版 |
2020/02/10(月) 20:01:48.67ID:rxX2x5Pb
https://ideone.com/T9gWWT
こうなるので、負の型にキャストするのが良いんですかね?
0677デフォルトの名無しさん
垢版 |
2020/02/10(月) 20:46:16.46ID:te1zn0Q+
標準にはboolと_Boolしかないんだからそれ以外はどこぞの馬の骨が好き勝手に決めただけの独自定義
そのライブラリのマニュアル熟読しろでこの話は終わり
0681◆QZaw55cn4c
垢版 |
2020/02/10(月) 21:33:51.78ID:3bnN/FFY
>>680
私には正常な書き方に思えますよ
その書き方のどこが異常なのでしょうか?
0682デフォルトの名無しさん
垢版 |
2020/02/10(月) 21:37:09.03ID:AZ4KAaI2
if (b) で済むのを
if (b == true) と書くのは
if (b == true == true) と書く異常者と同じ
きりねえって話
0684デフォルトの名無しさん
垢版 |
2020/02/10(月) 21:49:47.77ID:rxX2x5Pb
>>678
ちゃうねん。
0686デフォルトの名無しさん
垢版 |
2020/02/10(月) 21:51:26.11ID:M5G7J8Pl
bool b;
if (b == true) // コードスメルではあるがバグではない

BOOL b;
if (b == TRUE) // 正しいか正しくないかは状況による
0689◆QZaw55cn4c
垢版 |
2020/02/10(月) 21:55:45.19ID:3bnN/FFY
>>682
バグにならなければ問題ないのでは?
>if (b == true == true)
とは私も書きませんが、だからといって異常だとは思わない

というか、あなたの「異常」の定義が異常なのでは?
0690◆QZaw55cn4c
垢版 |
2020/02/10(月) 21:56:36.80ID:3bnN/FFY
>>688
いちびり、とは、あなた、関西人ですなぁ
0696デフォルトの名無しさん
垢版 |
2020/02/10(月) 22:07:56.51ID:M5G7J8Pl
>>692
その定義を出してみなよ。
標準の仕様じゃないんだからその環境ごとの特殊な定義であることは変わらんだろ。
0700デフォルトの名無しさん
垢版 |
2020/02/10(月) 22:24:53.62ID:M5G7J8Pl
もう自分で何を言っているのかわからなくなっているんだろうな。
BOOLやTRUEの定義が環境によって異なる場合があると認めた時点で

if (b == TRUE)

これが正しいと言えるかどうかはその定義次第だということになるのに。
0701デフォルトの名無しさん
垢版 |
2020/02/10(月) 22:29:19.34ID:TAH0RZ5f
俺の狭い経験だと
BOOLはintで、TRUEは1、FALSEは0
しか見たことないけど、他の定義の環境ってあるのかな?
0708デフォルトの名無しさん
垢版 |
2020/02/11(火) 01:20:55.07ID:wwgXq7Q5
もしかしたら、Rubyが、0をtrueと解釈してしまうことから変なことを思ってる
人がいるのかもしれないが、C/C++においては、言語仕様的に条件式で偽と
解釈されるのは、古くから、唯一、整数の 0 しかないなかったので、言語仕様が
修正されない限り TRUE が 0 以外の値にマクロ定義されることは絶対に無い。
0711デフォルトの名無しさん
垢版 |
2020/02/11(火) 02:43:47.12ID:wwgXq7Q5
>>708
スマン:
誤:修正されない限り TRUE が 0 以外の値にマクロ定義されることは絶対に無い。
正:修正されない限り FALSE が 0 以外の値にマクロ定義されることは絶対に無い。
0712デフォルトの名無しさん
垢版 |
2020/02/11(火) 02:58:41.73ID:f/mZFEPY
>>681
if(b)で十分なのにif(b==true)と書くのはif((a==b)==true)と書くのと同じで冗長なんだよ
これがすぐに理解できないなら論理を簡潔にする能力が欠如してるのでプログラミングの才能はないね
0713デフォルトの名無しさん
垢版 |
2020/02/11(火) 03:04:36.42ID:wwgXq7Q5
>>712
しかも、b は、少なくとも見かけ上は int 型ではなく、BOOL 型だし。
それに他の言語の場合、if の条件式に入れられるのは唯一 bool 型の
場合があり、一番 if の条件式に入れ易い型。
0714デフォルトの名無しさん
垢版 |
2020/02/11(火) 03:08:16.20ID:wwgXq7Q5
>>713
他の言語の場合、例えば x, y が整数型の場合、
x == y
とした結果の型が bool 型。
そして、if の条件式に入れられるのは bool 型のみだったりする。
だから、もともと b が bool 型なのに、敢えて b == true と判定して
また bool 型に「直して」しまうのはとても奇妙な感じになる。
その文化との兼ね合いから、C/C++ でも、b が BOOL 型の場合は、
if (b) とするのが美しく見える。
0715デフォルトの名無しさん
垢版 |
2020/02/11(火) 03:33:01.69ID:AiNLffgv
MISRA-C でも、if( 変数 )で、変数が実質的にブール型の場合は、これでOK

int a = ( 5 < 10 );
printf( "%d", a ); /* 1 */

if( 5 < 10 ) と、if( a ) は同じ意味。
a は、実質的にブール型
0717◆QZaw55cn4c
垢版 |
2020/02/11(火) 08:01:59.71ID:Sh/x76Zj
>>695
異常を「コンパイラがコンパイルできない」と定義していますから
0718◆QZaw55cn4c
垢版 |
2020/02/11(火) 08:02:50.77ID:Sh/x76Zj
>>712
コンパイルが通るんだったら異常ではないのでは?
0719◆QZaw55cn4c
垢版 |
2020/02/11(火) 08:03:52.59ID:Sh/x76Zj
>>712
>論理を簡潔にする能力が欠如してる
簡潔すぎてわかりにくいのも困りますね、プログラミングはまず他人への分かりやすさを優先するべきでは?
0720デフォルトの名無しさん
垢版 |
2020/02/11(火) 08:29:09.76ID:lXsf9fbV
簡潔過ぎて分かりにくいって何?

if (b) で分かりにくいなら
変数名が適切でないとかそもそも分かりにくい作りとか
他に問題があるんじゃないの?
0721デフォルトの名無しさん
垢版 |
2020/02/11(火) 08:33:12.52ID:lXsf9fbV
もしかして
if (a ==b)
よりも
if ( (a == b) == true )
の方が見やすいとかいっちゃう?
0722デフォルトの名無しさん
垢版 |
2020/02/11(火) 08:56:04.07ID:tUwi24Vl
そりゃ
if (a == 42)
よりも
if (a == 42 == true)
のほうが見やすいし
if (a == 42 == true != false)
のほうがさらに見やすいのが異常者
0725デフォルトの名無しさん
垢版 |
2020/02/11(火) 09:15:23.55ID:oAfdlMqH
QZは変なこだわりに固執するやつだから、一般的な感覚とか常識とかについて議論しようとしてもそもそも議論が噛み合わないし、スレを無駄に汚すだけ
0726デフォルトの名無しさん
垢版 |
2020/02/11(火) 09:21:24.68ID:tUwi24Vl
if (true == true == true == b == true)
if (true == b == true == b == true)
int *p = &*&*(int *)&*&*&*&*&*(int *)&a;
0728デフォルトの名無しさん
垢版 |
2020/02/11(火) 10:19:17.04ID:G5APdl5q
異常とは、普通じゃないことだよ
少数派のこと
if (b == true == true) は明らかに異常
if (b == true) はたまに見るけど、まぁ異常かな
0732デフォルトの名無しさん
垢版 |
2020/02/11(火) 11:01:53.65ID:u3DUqgh+
if(b==true)
はifのなかには比較入れないとダメだと思っているんじゃね

そう言う言語もあるし
0733デフォルトの名無しさん
垢版 |
2020/02/11(火) 11:09:22.66ID:IotAbjtu
「rust が c++ を超えた!! 神!!」みたいな記事をよく見ますけど、今後c++がrustから学んでもっと良くなることって期待して良いですよね?
rustに勉強のコストを割くか迷っています
0735デフォルトの名無しさん
垢版 |
2020/02/11(火) 11:29:50.94ID:Ci+AyeA2
なぜ

if (a == true)

と書くやつがでてくるのか
それは条件式に食わせるためには比較演算子で値から「真偽値」に変える必要があると
思っていてそれがboolと同値と理解していないからだろ
だからそういうやつは

if (a == 42 == true)

とは書かない
この例はむしろboolを理解してるやつからしか出てこない発想
やつらはいったん「真偽値」になればあとは論理演算子でつなげると理解している
ある意味、条件式を作るときのイディオムに馬鹿正直に従っているわけで別に
異常だと騒ぐほどひどくはない

別の見方をすればboolを特別視しないで書いてるわけで、
冗長にはなるが共通のフォーマットで書ききるってことはほかでもあることだ
そう思えばやっぱりひどくはない
実際おれは特別読みにくいとは感じないし、この無駄は最適化で消える
何かの機会にこれ冗長だよねと教えてやるぐらいで十分
0737デフォルトの名無しさん
垢版 |
2020/02/11(火) 11:38:29.11ID:KQZ3+5BK
冗長な書き方をする人の真意なんて測りようもないし理由が一つに決められるわけもないだろう。
想像するだけ無駄。
0738はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/11(火) 12:17:11.73ID:GpQNLMm4
>>715
そう書くべきだしそれが普通ってことはわかってんだって。
自分で書く分にはそう書くよ。
でも、他者が書いたコードを読むときや利用するときは
> 変数が実質的にブール型の場合は
っていう前提を確信できない場合がある。

整数型で真偽値の代用にすることがある C/C++ では
型で判断できないことがあるから罠だよねって話をしてるんだよ。
真っ当なデザインではない場合があるから思い込まずにちゃんと確認しようねってこと。
0740デフォルトの名無しさん
垢版 |
2020/02/11(火) 15:15:33.26ID:Gt4Evnq6
> この例はむしろboolを理解してるやつからしか出てこない発想

そりゃそうだ
ifの制御式は比較でなければならないと言い張るやつへの皮肉なわけで
0742デフォルトの名無しさん
垢版 |
2020/02/11(火) 15:21:35.11ID:IKSpGnXe
>>596
あったあった

今はわざわざそれ使う理由忘れた
0743デフォルトの名無しさん
垢版 |
2020/02/11(火) 15:25:53.55ID:Uk2CrnAG
Cだとそれで必ず0か1になるからTRUEと比較しても大丈夫!っていうクソみたいなバッドノウハウ
0744デフォルトの名無しさん
垢版 |
2020/02/11(火) 15:28:40.66ID:QCVkc9h/
operator ==(BOOL value){
 if(this->value == 0){
  if(this->value == value){
   return TRUE;
  }
 }
 else{
  if(value==1||value==2||...){
   return TRUE;
  }
 }
}
0745デフォルトの名無しさん
垢版 |
2020/02/11(火) 15:38:44.74ID:KQZ3+5BK
>>743
そもそもTRUEと比較する必要はないしWindowsから出てきたイディオムでもないと思うが。
どちらかというとtruthyな値からtrueを得るイディオムとして使われているような。
よく見かけるのはJavaScriptとか。
0747◆QZaw55cn4c
垢版 |
2020/02/11(火) 17:36:36.42ID:Sh/x76Zj
>>725
あなたのいう「一般的」というものが、実はそれほど一般的ではなかった、という可能性はありませんかね?
というか、まずあなたのいう「一般的」をあなたの言葉で定義するべきでしょう

あなたに定義できますか?
0748デフォルトの名無しさん
垢版 |
2020/02/11(火) 18:04:17.83ID:G5APdl5q
単語の意味は辞書引けよ
APIの仕様はヘルプ読め、と同様だな
なんで個人が定義するんだよ
0750はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/11(火) 18:40:23.65ID:GpQNLMm4
true と比較したけりゃすればいいじゃないの。
そのプロジェクト内で一貫したポリシーがあるのならそれでいいよ。
0751デフォルトの名無しさん
垢版 |
2020/02/11(火) 18:49:13.60ID:TuMeiRsT
ちゃうねん。
0752デフォルトの名無しさん
垢版 |
2020/02/11(火) 18:52:49.99ID:TuMeiRsT
ストリーム遅いな。
0753デフォルトの名無しさん
垢版 |
2020/02/11(火) 20:44:57.22ID:f/mZFEPY
コード規約「if(bool)はif(bool==true)と書かなければならない」
やだよ、そんな規約ww
規約決めるまでに紛糾してプロジェクト始められねぇよw
0755デフォルトの名無しさん
垢版 |
2020/02/11(火) 22:08:40.56ID:Pk2ehCPz
explicit operator boolだとラムダとかの戻り値強制したいときそうなっちゃわない?

value() && true か value() || false
static_cast<bool>(value())は好きじゃない
0757デフォルトの名無しさん
垢版 |
2020/02/11(火) 22:21:59.64ID:ggTX+OPA
意味的にboolの型であればboolにキャスト
そうじゃないなら意味通りにboolに変換
0758◆QZaw55cn4c
垢版 |
2020/02/11(火) 22:23:23.42ID:Sh/x76Zj
>>258
mmap を確かめています、なんだかすごく時間がかかってしまいました…
ideone はファイルを作らせてくれないみたいですね… https://ideone.com/zXFtEY

fd と fd に紐付いた mmap をつくっておいて、
@fd 側にデータを追加すれば mmap でも見えるのですが、
Ammap 側からデータを追加しても fd は増量しないようですね

今は cygwin で見てますが、ちゃんと linux をいれて確かめるつもりです…
0760デフォルトの名無しさん
垢版 |
2020/02/11(火) 23:36:09.88ID:TuMeiRsT
くじで決めてはどうか。
0762デフォルトの名無しさん
垢版 |
2020/02/11(火) 23:56:08.12ID:TuMeiRsT
I/Oの遅さの陰に隠れてたけど。
ストリームよりSSDのほうが速いよって時代になって困る。
0763デフォルトの名無しさん
垢版 |
2020/02/12(水) 01:53:51.39ID:CB9IiDBv
YouTuberは「最強の職業」である理由。
https://www.youtube.com/watch?v=XjV3Nb0-hgA
【事例付き】YouTuberは最強の副業である件について。
https://www.youtube.com/watch?v=wB8hNuNVoIw&;t=267s
【初心者向け】YouTubeの始め方・稼ぎ方を徹底解説!
https://www.youtube.com/watch?v=YEw-a8qlADM
「YouTubeなんていつか稼げなくなる」という主張を論破する。
https://www.youtube.com/watch?v=VatNILApW4U
収益化から丸1年!YouTubeでいくら稼いだか公開。
https://www.youtube.com/watch?v=-zQxuQqZ5eA&;t=103s
その動画で月商○○万!? YouTubeで稼ぐ裏技的アプローチ。
https://www.youtube.com/watch?v=7I4APU_6i9o&;t=433s
【貧者の工夫で戦え】ガラケーだっていい。YouTube始めるのにパソコンはいらない!
https://www.youtube.com/watch?v=jYdWfjjzD7Y
【第一回】SNS、YouTube、ブログで稼ぐ方法を、丁寧に解説します!
https://www.youtube.com/watch?v=erNiLOncDnY
0766デフォルトの名無しさん
垢版 |
2020/02/12(水) 16:01:35.18ID:a1w2Xqz0
>>743
ああなるほど
if(TRUE == !!b) のことか

if(!!b) は javascript の方だろ
0768デフォルトの名無しさん
垢版 |
2020/02/12(水) 17:16:20.22ID:DU9qWhLl
一応、alternative tokensに規定はあるが
使う奴の心は #define BEGIN { なんてやるやつと同質だね
0769デフォルトの名無しさん
垢版 |
2020/02/12(水) 17:20:59.01ID:DU9qWhLl
Cにも_Boolがなきゃヤダジタしてたやつとか
マジそういう言語へ行ったきり帰ってくるなって感じ

で結局BOOL < 0みたいなオカシイことが起き出す原因を作りやがる
0770はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/12(水) 17:47:16.08ID:KQxiYwOn
C と C++ で解釈が違うのに結果として動作は同じみたいなのがたまにあってすげーなって思う。
0772はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/12(水) 19:09:04.21ID:KQxiYwOn
>>770-771
if 文の条件式を見てて思い出した。
C だと条件式の評価結果を 0 と比較するというルール
C++ だとブールに変換するというルール。

まあ整数をブールに変換する規則は結局のところ 0 と等しいかどうかなんで
ちょっと回りくどくなってるだけなんだけど、
そういう違いがあっても互換性が維持されるというのがどこかで検証されてるんだろうと思うと、
手間かかってんなぁという感想が浮かんだ。

他にも列挙定数の型が C と C++ では違うとか……。
私が把握してるのはそんくらいだけど、
探せばもっとあるんじゃないかな。
0773デフォルトの名無しさん
垢版 |
2020/02/12(水) 20:25:01.80ID:ytylQgpT
>>766
>if(TRUE == !!b) のことか

さすがにこんな意味のない書き方が人の目につくほど蔓延りはしないだろう。おそらく>>743の妄想。

!!b は、bool型(と、しばしばオーバーロード)を備えた言語で非bool型の値bをbool型に変換するテクニックだろ。
0775デフォルトの名無しさん
垢版 |
2020/02/12(水) 21:12:18.94ID:h1wCYtKx
そういうゴミみたいな自己満テクニック()が積もり積もって誰も触れないスパゲティモンスターになっちまうんだよ
b!=0でも(bool)bでもいいからやるべきことを直接表現しろ
0777デフォルトの名無しさん
垢版 |
2020/02/12(水) 21:31:03.80ID:DU9qWhLl
>>776
何で?
ISO/IEC 9899:2011 (E)
7.18 Boolean type and values <stdbool.h>
1 The header <stdbool.h> defines four macros.
2 The macro
bool
expands to _Bool.
0779デフォルトの名無しさん
垢版 |
2020/02/12(水) 21:35:17.48ID:ytylQgpT
Cに移植する可能性があるならC++の機能を使っちゃダメなのは当たり前だよなぁ
C++スレで言うことではないと思うが
0781デフォルトの名無しさん
垢版 |
2020/02/12(水) 21:38:26.52ID:rfok9Tr/
コンパイラが問題点を見つけられない例は他に山ほどあるが
だからといってわざわざ増やさなくても良い
0784デフォルトの名無しさん
垢版 |
2020/02/12(水) 21:42:13.60ID:rfok9Tr/
Cに移植する可能性が無いならどうでも良い
ちなみにキャストで警告が出る環境もある
0788デフォルトの名無しさん
垢版 |
2020/02/13(木) 00:16:13.58ID:X++L6urQ
>>733
Rustを少し見てみたけど、書き方が全くC/C++とは違っていて、
全く異なる文化圏の言語になれた人が設計した臭がした。
これがC/C++の代替になるとは考えにくい。
はっきり行って、これを使えといわれると辛い。
0790はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/13(木) 00:45:52.57ID:XX4mj9DD
個人的には Rust は好感触。
型システムは ML 系言語で実績があるものを基礎にしてることもあって、C++ のグダグダな歴史を背負ったものよりはまとも。
ML 系はやっぱり高級路線の言語だし、インデントでブロックを表す系統なのがしんどいけど、
Rust は上手く低レイヤ用 (としても使えるよう) に着地させてるし、 C 風の外観を踏襲してもいる。

C++ が Rust から取り入れられるものはそんなに多くないと思う。
C++ は良くも悪くも互換性についてかなり強い要求があるので、
Rust 的な、カッチリと保護された仕組みを後付けするのはどう考えても無理。
C++ が Rust を参考にすることは間違いなくあるとは思うが、
全体の思想がまるで違うので限定的な範囲でしか取り入れられない。

もし取り入れらたらそれは C++ の新機能として新しく学ぶので十分でしょ。

Rust を学ぶのは間違いなく有用ではあるけども、
Rust の知見が C++ に取り入れられる可能性がありそうだからという理由ならそんなに意味ない。
0791デフォルトの名無しさん
垢版 |
2020/02/13(木) 01:02:46.91ID:b1nbpqgi
C++の配列は長さの情報を持ってないってことになってるけど
長さを与えなくてもdelete[]できるんだから、メモリのどこかにその情報はあるよね?
なんでその情報をプログラマが利用できないようになってるの?
0792デフォルトの名無しさん
垢版 |
2020/02/13(木) 01:06:29.86ID:qzSQSiwu
rustがかっちり保護してくれるとか低レイヤー向けとか馬鹿ほど信じてるよね。
ありゃ帯に短し襷に長しの典型言語だわ。
0793デフォルトの名無しさん
垢版 |
2020/02/13(木) 01:44:34.08ID:X++L6urQ
>>792
実際、Rustは、Cを簡単にするのではなく、Cを難しくしてしまっていて、Cのポインタが理解できない or 難しく感じる人には、Rustの特徴の核心たる所有権、借用などの部分はちんぷんかんぷんだと思う。
0794デフォルトの名無しさん
垢版 |
2020/02/13(木) 01:48:50.73ID:X++L6urQ
>>793
Cの問題点を取り除いたと言うより、ほとんど全てのプログラミング言語が暗黙のうちに用いている代入の概念をなるべく使わないようにして変数束縛などの全く異なる独自概念を用いようとしている。
しかし、これは、手続き型言語と関数言語の違いに匹敵するくらいのプログラミングの概念の変更になってしまうため、手続き型言語の中で改良された次世代言語と言うものではなくなってしまっているとも言える。
0796デフォルトの名無しさん
垢版 |
2020/02/13(木) 06:24:47.58ID:fMXzK7Sc
RustはC++なら簡単にできることをものすごく回りくどく書かないとコンパイル通らない感じだからとてもつらい
0797デフォルトの名無しさん
垢版 |
2020/02/13(木) 09:13:38.23ID:6FSFTWhE
>>790
RustがC++に取って代わることがあるか、というニュアンスの質問でした
今C++でやってる仕事がRustに置き換わる可能性が高いなら今から勉強しとこうか、と
0798デフォルトの名無しさん
垢版 |
2020/02/13(木) 12:35:22.33ID:z5cRWLgY
>>797
断言してもいいが、RustはC++に取って代わることは無い。
なぜなら、普通の手続き型言語での枠組みにすら入ってない書き方を強要されるから。
手短に言えば、単にC/C++と書き方が大幅に違っているだけではなく、書き方が他のどんな減の範疇にも属していない。
0799はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/13(木) 13:30:24.18ID:XX4mj9DD
>>796
C/C++ でのオブジェクトの寿命の管理の難しさってのは
理屈が理解しづらいというよりはわかってても間違うという難しさなんだよね。
そして間違っていてもコンパイラは黙って通すことも多い。
C/C++ を長く使っていればそれを感じることって結構あるでしょ。
そういう部分のプログラムが正しいことはプログラマが保証しなくてはならんわけだ。
でも Rust では言語処理系の側でやってくれる。
C/C++ で面倒な部分を Rust では自動でやってくれる。
まわりくどいのは確かだけど、それで楽できるのも確かなので、
どっちを取るかって話だな。

オブジェクトをどこで後始末するか。
管理の主導権はどのモジュールに持たせるか。
そういうのって C/C++ でも考えてるよね。
C/C++ ではプログラムに書いてないだけで本来はあるはずのものなんだよ。
(C++ だとスマートポインタの導入で少し楽にはなったけど。)
自分が何を考えていたのか、そして何を考えられていなかったのが
明らかになるのはそれはそれで楽しいと思う。
まあ、それは俺が趣味でやってるからかもしれんな。
0801はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/13(木) 13:45:30.52ID:XX4mj9DD
>>800
そうだよ。
そんでもって大抵の人間は設計がヘタクソだし、
ヘタなところが検出されるなら検出されないより良い。
0802デフォルトの名無しさん
垢版 |
2020/02/13(木) 14:01:13.64ID:z5cRWLgY
>>799
変数束縛やら所有権や借用の概念が複雑すぎて、そっちの方が C/C++の
メモリ管理よりミスし易い。
0804デフォルトの名無しさん
垢版 |
2020/02/13(木) 14:20:14.02ID:3lSBa444
設計がヘタクソなヤツが書いたソースのメンテやらされるのは最悪だけど自分で組み上げるならC++以外有り得ない
各々の力量が顕著に表れやすい最高の言語には違いない
バカも容易に炙り出せるしな
0805デフォルトの名無しさん
垢版 |
2020/02/13(木) 14:20:33.11ID:z5cRWLgY
>>803
仮にあなたはちゃんと理解できても、一般のプログラマは変数束縛やら所有権や借用の概念を理解することが難しすぎるので、C/C++を置き換える言語にはならない。
それらの概念は学習コストが高すぎるどころか、一生理解できないプログラマが多いだろう。
0806はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/13(木) 15:53:13.34ID:XX4mj9DD
>>805
誤解のないように補足しておくけど、俺は Rust が C++ を置き換えるという主張はしてないからね。
C++ の重大な欠点を (実行コストをあまり払わない形で) 改善しているのは確かってだけ。
そんでもってそれが必要な場面は間違いなくあるってことも。
0808デフォルトの名無しさん
垢版 |
2020/02/13(木) 19:29:34.59ID:z5cRWLgY
>>807
new TYPE[] のようにしてヒープから配列として確保されたメモリは確かに
要素数の情報を持っている。
しかし、new TYPEのように配列ではない場合は、高速化のために情報を
持ってない処理系もある。そのために 前者では delete[] を、後者では
deleteを使うことになっており、間違った組み合わせを使った場合には
不具合を生じる。

また、ポインタは、ヒープから確保された配列ばかりをポイントしているとは
限らず、例えばスタック上のローカルオート変数や、グローバル変数をポイント
していることもあり、その場合には、要素数の情報は全く持っていない。

さらに、Cの場合、関数の引数に TYPE buf[] のように配列を書いても、
TYPE *buf に自動修正される仕様となっている。
そのため、配列を受け取るのは、必ずポインタということになる。
しかし、ポインタで受け取るということは、そこには、&a のように、
ローカルオート変数も実引数として指定して呼び出すことも出来る。
その場合には要素数が無いので、あなたの望みをかなえる高速な
一般的方法が存在しない。

望みをかなえるためには、言語の拡張が必要となる。
0809デフォルトの名無しさん
垢版 |
2020/02/13(木) 19:33:05.83ID:bRhYdbIA
Rustっていろいろ清々しいよね
関数型言語に必須じゃねえのと思うリスト関係がぽっかり抜けてるのは不満だけど
0811デフォルトの名無しさん
垢版 |
2020/02/13(木) 20:01:17.55ID:b1nbpqgi
>>808
ヒープに確保した配列の要素数はやはりメモリ上にあるんですね
手段がないのは文法として一貫性をもたせられないからということでしょうか
なるほど、回答ありがとうございます
0812デフォルトの名無しさん
垢版 |
2020/02/13(木) 20:08:49.19ID:J94ypinO
delete [] pと同じように
sizeof [] pを用意すりゃいいのにね
pがnew []されてなかったら誤動作するって挙動ならdeleteと同じだろうに
0815◆QZaw55cn4c
垢版 |
2020/02/13(木) 20:36:41.73ID:ImKshd8q
>>791
>C++の配列は長さの情報を持ってないってことになってるけど
>長さを与えなくてもdelete[]できるんだから、メモリのどこかにその情報はあるよね?

new したときは、その領域サイズが実行時にユーザーのみえないところに保存される、というだけなのでは?
C/C++ の配列は長さ情報を(自分でそう書かないかぎり)持たないとおもいますよ
0816デフォルトの名無しさん
垢版 |
2020/02/13(木) 20:38:39.62ID:WjLTLikp
ちゃうねん。
0817デフォルトの名無しさん
垢版 |
2020/02/13(木) 20:50:05.52ID:qzSQSiwu
設計がダメな場合コンパイラにいくら指摘されようと根本的には治らんのだが、
(たいていそういう馬鹿はコンパイラ通すためにmut,RefCell,unsafeを使いまくる)
そういうのを少しもわかってないバカがrust推しなんだよなぁ。
構造体を1から作り直さなきゃならんかったり根本的に間違ってる。
0818デフォルトの名無しさん
垢版 |
2020/02/13(木) 21:00:18.27ID:sl9OX6cI
>>808
new TYPE[]するとき内部的にサイズ情報を持つ保証ってあったっけ?
例えば自前でoperator new []を実装するとき、予め2^nバイトのブロックを所定の数用意しておいて、要求サイズに応じて必要十分な大きさのブロックを返すなら、割り当て時に要求されたバイト数または要素数の情報を保持しないという実装も可能かと思う。
0821デフォルトの名無しさん
垢版 |
2020/02/13(木) 21:39:24.09ID:J94ypinO
デストラクタ呼ぶ必要ない型だと、size情報持ってないと言うことなんだろうね
0822デフォルトの名無しさん
垢版 |
2020/02/13(木) 21:40:36.17ID:sl9OX6cI
>>820
デストラクタの実装も、返ってきたアドレスの値でどのサイズの領域か(割り当て要求されたサイズではなく、自分で区切ったブロックのサイズ)が分かるようにしておけば大丈夫でないかな?
0824デフォルトの名無しさん
垢版 |
2020/02/13(木) 22:02:22.87ID:WjLTLikp
はい忘れました。
0825デフォルトの名無しさん
垢版 |
2020/02/13(木) 22:06:16.93ID:Bk3UL691
アドレスだけじゃなくて長さも受け渡しするインターフェースにしましょうとしか。
0826デフォルトの名無しさん
垢版 |
2020/02/13(木) 22:36:33.13ID:WjLTLikp
シリアル化の王道ってありますか?
0828デフォルトの名無しさん
垢版 |
2020/02/13(木) 22:54:55.06ID:tx2lxPGZ
>>822
TYPEがデストラクタを持つclassの場合に、ptr = new TYPE[n] で確保されたメモリ
を delete[] ptr とすると、 正確に n 回デストラクタを呼び出す必要がある。
new が n * sizeof(TYPE) より大きめのブロックを確保した場合でも、
delete[] ptr 時に正確な n の値を割り出す方法が必要となる。
なので、n の値は ptr の値さえあれば知ることが出来ることが必要条件となる。
つまり、少なくともデストラクタを持つ TYPE の場合に TYPE の配列をヒープから
確保した場合には、配列の要素数を必ず配列の先頭のポインタの値から「知る」事が出来る。
0829デフォルトの名無しさん
垢版 |
2020/02/13(木) 23:01:33.00ID:WjLTLikp
>>827
もうちょっと簡単なのないですかね。
型情報要らないんで。
0831デフォルトの名無しさん
垢版 |
2020/02/13(木) 23:12:32.63ID:WjLTLikp
それがあるんですよ兄さん。
0832デフォルトの名無しさん
垢版 |
2020/02/13(木) 23:12:57.71ID:ktN45haN
双方向mapって何使うのがいいですか?boostのbimap?
それともこのくらいは自作してる人のほうが多いですか?
0833デフォルトの名無しさん
垢版 |
2020/02/14(金) 00:05:24.00ID:CPLKNT1n
双方向Mapって何に使えるんですか?
0834デフォルトの名無しさん
垢版 |
2020/02/14(金) 01:54:24.23ID:0WgbwkuV
型情報ないならそもそもデシリアライズできないし
型情報なしで成り立つ、つまり型情報を事前に知っている前提なら
バイナリでそのまま送ればいいだろ
0836デフォルトの名無しさん
垢版 |
2020/02/14(金) 02:11:15.54ID:CPLKNT1n
>>834
そのやり方教えて。
あめさんあげるから。
0838はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/14(金) 09:19:01.22ID:nLeEzkye
>>826
シリアル化ってのにどういう要件を置くかだな。
同じ環境でデシリアライズ出来ればよいのであれば >>837 で十分だろうし、
データ形式が決まってて (あるいはデータ形式の側を中心に策定したくて)
それのシリアライズとデシリアライズを (それぞれ別の環境で (ときには言語も違うかも)) やりたいということなら
protobuf などのツールを使うのはよい案だと思う。
0840デフォルトの名無しさん
垢版 |
2020/02/14(金) 13:41:23.49ID:a5iC3cHy
>>791
>>807
実装依存だと思うけど hoge[-1] あたりに格納されてた
0841デフォルトの名無しさん
垢版 |
2020/02/14(金) 13:49:57.91ID:rQdJoGM9
>>840
VC++の場合、ptr = new TYPE[n] で確保された場合は、確かに
ptr[0] == n
になっていた気がする。
「確かに」というのは言葉のあやで、厳密には覚えてないが、
VC++の new で使われる組み込み関数のライブラリのソースコードを見ると分かる。
0844デフォルトの名無しさん
垢版 |
2020/02/14(金) 15:26:11.39ID:rQdJoGM9
>>842
あ、すまん、正しくは、大体、
 ((DWORD *)ptr)[-1] == n
だ。
ptr[-1] だと、sizeof(TYPE)分、アドレスが戻ってしまうし、
結果の型も DWORD とかではなく、TYPE 型になってしまう。
0845デフォルトの名無しさん
垢版 |
2020/02/14(金) 15:28:19.59ID:rQdJoGM9
>>843
言っておくが、new char[n] とかでは、駄目な可能性は有るよ。
話は、「TYPEがデストラクタを持つとき」のnew TYPE[n]に限定。
0846デフォルトの名無しさん
垢版 |
2020/02/14(金) 17:17:51.62ID:jFoBh/u0
一時オブジェクトの寿命について、ご教示ください。
例えば、以下のようなコードがあった時、

void foo(const char* c); // 外部ライブラリの関数につき変更不可とする
void main()
{
const std::string s = "aaa";
foo((s + "bbb").c_str());
}

一時オブジェクトstring(s + "bbb")の破棄が行われるのは、
関数foo()を呼ぶ前でしょうか、呼んだ後でしょうか。
調べた範囲では、「完全式の終わり」という話が出てきたのですが、
どこまでが完全式なのか判断できませんでした。
0848はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/14(金) 17:34:07.49ID:nLeEzkye
すごくどうでもいい話なんだけど、
JIS では完結式という用語を使ってるのに完全式って言葉の方がよく使われているよね……。
0850デフォルトの名無しさん
垢版 |
2020/02/14(金) 19:29:16.13ID:CPLKNT1n
>>837-838
ありがとん。
0851846
垢版 |
2020/02/14(金) 19:44:55.13ID:jFoBh/u0
>>847-849
ご回答ありがとうございます。
大変勉強になりました。
0854デフォルトの名無しさん
垢版 |
2020/02/15(土) 10:34:21.20ID:BMoFghq4
newって意外と速いんだな。
アクセスは不利かもしれないけど。
0856デフォルトの名無しさん
垢版 |
2020/02/15(土) 12:12:59.04ID:BMoFghq4
でもスタックは常にキャッシュに乗ってるから、そこらへんでどう変わるのかな。
0857デフォルトの名無しさん
垢版 |
2020/02/15(土) 13:19:54.61ID:J1bovO5o
キャッシュに乗るくらいの量だったらそもそもクリティカルな重さにはならんだろ。
newで問題になるのは10万とかそのくらいのオーダーをがっつりfor文で呼ぶとかそれくらいのことする場合。
0858デフォルトの名無しさん
垢版 |
2020/02/15(土) 13:21:27.11ID:BMoFghq4
スタックは常にキャッシュに乗ってる。
0860デフォルトの名無しさん
垢版 |
2020/02/15(土) 14:11:39.55ID:DzNKB5Jj
>>857
VC++の場合、コンストラクタが無い場合、new が必要とする時間は 170クロック。
3.0GHz の CPUの場合、1.7 * 10^7 回(1,700万回)くらい new してやっと一秒
位。
だから、問題になるのは、1万回ループではなく、100〜1000万回くらいのループ。
0861デフォルトの名無しさん
垢版 |
2020/02/15(土) 14:15:19.79ID:DzNKB5Jj
もちろん、スタック変数で済むならスタック変数の方がいい。
ただ、スタックは容量に限りがあるので全部スタックという訳にもいかない。
ヒープにも限りはあるにはあるが、それは OSやマシンの限界。
0862デフォルトの名無しさん
垢版 |
2020/02/15(土) 14:25:57.86ID:BMoFghq4
そこでgotoなんですよ。
0863デフォルトの名無しさん
垢版 |
2020/02/15(土) 14:43:25.87ID:BMoFghq4
コレクションがソートの有無でだいぶ変わる。
trie_base_benchmark__sorted_words_1
trie assign.
409ms
size : 466551
words : 466551

trie insert.
762ms
size : 466551
words : 466551

std::set insert.
69ms

std::unordered_set insert.
149ms

(assigned) trie find.
24ms

(inserted) trie find.
25ms

std::set find.
194ms

std::unordered_set find.
63ms
0864デフォルトの名無しさん
垢版 |
2020/02/15(土) 14:44:57.19ID:BMoFghq4
trie_base_benchmark__random_words_1

trie assign.
2034ms
size : 466551
words : 466551

trie insert.
2026ms
size : 466551
words : 466551

std::set insert.
490ms

std::unordered_set insert.
146ms

(assigned) trie find.
158ms

(inserted) trie find.
169ms

std::set find.
477ms

std::unordered_set find.
62ms
0865デフォルトの名無しさん
垢版 |
2020/02/15(土) 14:46:37.02ID:BMoFghq4
挿入速度が変わるのは仕方ないとしても、検索速度が変わるのは、キャッシュじゃないかと思うんだけど。
0866デフォルトの名無しさん
垢版 |
2020/02/15(土) 14:49:41.43ID:BMoFghq4
std::sort: 306ms, (466551count).
先にソートしてから挿入したほうが速度的にお得っぽい。
0868デフォルトの名無しさん
垢版 |
2020/02/15(土) 16:18:40.81ID:qSK05WKV
>>867
とにかく、足し算/引き算が1クロック程度、new が170クロック程度だからね。
使い方を間違えなければ劇遅とはいえまい。
0870デフォルトの名無しさん
垢版 |
2020/02/15(土) 17:12:18.08ID:BMoFghq4
newより+のほうが速いってことか。
0871デフォルトの名無しさん
垢版 |
2020/02/15(土) 17:25:57.34ID:BMoFghq4
+と-ならどっちが速いんだろう。
0872はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/15(土) 17:49:06.00ID:cwLPNCdO
>>871
回路はほぼ共有してるんじゃないの?
2の補数を使うのもそれが理由なんだろうし。
少なくとも Pentium 時代まではクロックは同じだったはず。

近頃の事情は知らんけど
GCC あたりで強い最適化をかけてみても引き算か足し算を特に避ける様子もないので、
まあだいたい同じなんでしょ。
0874デフォルトの名無しさん
垢版 |
2020/02/15(土) 18:13:26.25ID:2RWOAy2H
>>871
+ と - で速度が違うCPUは見たことがない

- は順番が関係あるので
処理によっては遅い事がある

b = 1 + b
b = 1 - b
0875はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/15(土) 18:14:19.52ID:cwLPNCdO
整数だけの話じゃなくてってことか。
ある程度の常識的判断が出来る場合もあるけど、
基本的には実装次第だわな。
0883デフォルトの名無しさん
垢版 |
2020/02/16(日) 01:50:35.50ID:1DEBeg9G
経験的にはnewが遅いと思ったことは無い。
なお、コンストラクタの処理時間以外はnewはmallocと同じ速度。
ゲームメーカーでも必要な場合に malloc を使うことは問題ないとされている。
0886はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/16(日) 02:36:27.06ID:VK9AAsv4
ヒープからの割り付けをする機会を減らすことで実行速度を上げる工夫はよく聞く話ではあるよな。
ただ、そこまでギリギリのチューニングが必要ってことがあまりないだけで。
0888デフォルトの名無しさん
垢版 |
2020/02/16(日) 08:25:44.50ID:Yy7z+EdH
具体的な数字が出てるとイメージが湧く。
0889デフォルトの名無しさん
垢版 |
2020/02/16(日) 08:45:53.63ID:Yy7z+EdH
170クロックならあんまり気にする必要ないな。
0892デフォルトの名無しさん
垢版 |
2020/02/16(日) 11:01:02.59ID:B02+i8yM
最近では小規模組み込みでもC++を使う事はあります

new / deleteやヒープを無効にしたり
newのみでdelete出来ないようにしたり
なんてこともあります
0896デフォルトの名無しさん
垢版 |
2020/02/16(日) 11:23:16.68ID:Yy7z+EdH
ストリームってなんで遅いんだろね。
0898デフォルトの名無しさん
垢版 |
2020/02/16(日) 11:42:38.67ID:Yy7z+EdH
スレで、do{}while()はダメっぽいこと書いてあったけど、なんでダメなの?
0901デフォルトの名無しさん
垢版 |
2020/02/16(日) 12:54:36.44ID:Yy7z+EdH
プリンタ屋さんってどんな仕事ですか?
0902デフォルトの名無しさん
垢版 |
2020/02/16(日) 12:58:53.64ID:Rlzwkt+8
>>901
俺は制御周り、上位インターフェースからのデータを描画ルーチンにに渡したり、下位インターフェースにデータ渡したり、パネルとかの制御をやってる
描画部分はまた別の人がやってる
0903デフォルトの名無しさん
垢版 |
2020/02/16(日) 12:59:56.11ID:Yy7z+EdH
なんか難しそうですね。
0904デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:01:18.53ID:Yy7z+EdH
プリンタってプロセッサはどんな感じのを使うんですか?
newってあるんですか?
0905デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:02:40.97ID:Yy7z+EdH
プリンタのヘッドについてる穴の数は決まっているんだから、あまりヒープが必要無さそうな気もする。
0906デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:03:59.79ID:Yy7z+EdH
std::vectorの上にヒープを作っても速度的に大丈夫なことは確認した。
0907デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:07:31.29ID:Rlzwkt+8
昔はSHシリーズとかR2000とか
今はARMもそれなりに使ってる
制御だとnewは基本使わない
あと俺がやってるのは業務用のLBP
0908デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:08:47.09ID:Yy7z+EdH
ってことはキャノンですか。
0909デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:10:53.15ID:Yy7z+EdH
メモ問題は結局ホワイトボード買ってきた。
ホワイトボードをワンノートに撮影するという昔っぽいことに。
0911デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:12:13.52ID:Yy7z+EdH
ワンノートのアンドロイド版はカメラにホワイトボードのモードがあるんだけど、テカリ消してくれないし、ホワイトバランスも調整してくれない。
0912はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/16(日) 13:12:31.37ID:VK9AAsv4
PostScript くらいならプリンタの側で処理することもあるし、
世間で想像されているよりは高級なことをやっているんじゃないかなぁという気もする。
0913デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:16:21.65ID:Yy7z+EdH
ってことは、別の人がnew使いまくりなのでは。
0914デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:17:17.71ID:Yy7z+EdH
テカテカしないホワイトボードないのかな。
0916デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:20:51.42ID:Yy7z+EdH
ありがとん。
0917デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:27:19.36ID:Yy7z+EdH
モーター動かしたりするのはnew使ったらダメなんだろな。
0918デフォルトの名無しさん
垢版 |
2020/02/16(日) 13:52:37.96ID:Yy7z+EdH
リアルタイムOSはヒープあるんだろか。
0919デフォルトの名無しさん
垢版 |
2020/02/16(日) 14:03:56.47ID:1DEBeg9G
>>900
ゲームに関しては、かなりちゃんとした現場で昔から malloc は使われていたし、全社的に使っても問題ないとされていた。
0920デフォルトの名無しさん
垢版 |
2020/02/16(日) 14:33:04.16ID:Rlzwkt+8
>>919
で?
使われてる例も使われない例もあるよ
タイミングにシビアなゲームだと使い辛いと言うだけ
0922デフォルトの名無しさん
垢版 |
2020/02/16(日) 14:44:07.47ID:Yy7z+EdH
あるんだ。
0924デフォルトの名無しさん
垢版 |
2020/02/16(日) 14:53:55.58ID:Yy7z+EdH
選べるってことは、用途によって使い分けが必要って事なんだろな。
0925デフォルトの名無しさん
垢版 |
2020/02/16(日) 14:59:29.04ID:D2RmZx9z
ループ内で可変長のvector使っているようなのは、外に出してループ始めにclearする方がいい
ループごとにvector出力しなきゃいけない場合も、moveしないでcopyした方がいい
0927デフォルトの名無しさん
垢版 |
2020/02/16(日) 15:10:11.48ID:D2RmZx9z
mallocは使い方が余程ひどく無ければ、性能上問題になることはない
問題になっている場合もプロファイラでその部分だけ対策すればどうにでもなる
断片化やmalloc自体の管理領域容量が気になるほどの環境では使わない方がいいが
0930デフォルトの名無しさん
垢版 |
2020/02/16(日) 15:17:30.49ID:D2RmZx9z
そもそもリアルタイム系の処理で、実処理部分でmallocするってのは普通しないよね

初期化時に必要なバッファはあらかじめ確保しておくものでしょ
そこはmallocだろうが静的確保だろうが変わらないし
0932デフォルトの名無しさん
垢版 |
2020/02/16(日) 15:24:31.11ID:1DEBeg9G
>>925
std::vector<TYPE> は、リンクリストではなく、「可変長配列」なので、std::list<TYPE> に比べて、TYPE のコンストラクタがデコボコした頻度で
多めに呼び出されてしまう傾向がある。TYPEのコンストラクタの中で何かをnew していると、new が呼び出される回数をグラフにした場合、
デコボコになるため、速度的に滑らかさがなくなってしまう可能性が考えられる。
それは、newの速度がデコボコなのではなく、std::vector が持つ悪い性質の一つ。
速度的に「滑らか」にしたいならば、std::list の方が適している。
そもそも、C言語がポインタを用意したのは、リンクリストを使いたかったからで、Cはデータ集合用のデータ構造として動的リストではなくリンクリストを用いるのが伝統。
Cの高速性とはリンクリストによるものと言っても過言ではない。
newも、mallocもコンストラクタも、リンクリストと最も相性が良い傾向がある。
cppreferenceなどでも、std::vectorが出てくることが多いが、Cの新かを発揮するにはstd::listの方が良い。
0933デフォルトの名無しさん
垢版 |
2020/02/16(日) 15:25:54.32ID:1DEBeg9G
>>932
誤:Cはデータ集合用のデータ構造として動的リストではなくリンクリストを用いるのが伝統。
正:Cはデータ集合用のデータ構造として動的配列ではなくリンクリストを用いるのが伝統。
0934デフォルトの名無しさん
垢版 |
2020/02/16(日) 15:27:49.69ID:D2RmZx9z
いやいや、速度がシビアならreserveしとけと
cとの親和性考えなきゃdequeも良いが、cのAPI呼び出し考慮すると結局vectorをうまく使うのが一番良い
0935デフォルトの名無しさん
垢版 |
2020/02/16(日) 15:28:20.99ID:1DEBeg9G
>>929
std::vector<TYPE>を使っていて、TYPEのコンストラクタの中でnewするのはリアルタイム処理には向きません。
その場合、std::list<TYPE>に変えれば劇的に速度が安定するはずです。
0936デフォルトの名無しさん
垢版 |
2020/02/16(日) 15:30:12.10ID:1DEBeg9G
>>934
CのAPI呼び出しで集合を渡す場合、通常、集合の要素はコンストラクタを持ちません。
その場合は、std::vectorは適すでしょう。
ところが、要素がコンストラクタを持つ場合は、std::listが適します。
0938デフォルトの名無しさん
垢版 |
2020/02/16(日) 15:33:13.19ID:1DEBeg9G
>>936
補足すれば、APIは、リング0のシステムランドで実装されていることが多いため、
リンクリストの様な複雑な構造が用いられることが少ないのです。
しかし、それはAPIに限った話で、Cは誕生したときから、要素数が変化する
集合には、動的配列よりもリンクリストを用いるのが伝統でした。
伝統と言うよりも、リンクリストこそがCの核心・本質といっても過言では有りません。
0940デフォルトの名無しさん
垢版 |
2020/02/16(日) 15:36:04.25ID:MPWqg8uW
アドレスで直にアクセスできる言語の強みはリンクリストで活きるからごもっとも
0941デフォルトの名無しさん
垢版 |
2020/02/16(日) 15:40:23.46ID:+ZTPu1gL
>>930
そう言う事
平均的には間に合っても確保や解放にかかる時間が読めなくなる
100万回に1回でもダメならダメっていう世界だしね

>>931とかはそう言うことがわかってないので頓珍漢なレスになってるw
0942デフォルトの名無しさん
垢版 |
2020/02/16(日) 15:40:27.92ID:pXV6w9YM
>>934
reserveしただけだとOSによっては実メモリ確保しなさそう…
で初回アクセスでおもむろにページが用意されれる
ヨカン
0946デフォルトの名無しさん
垢版 |
2020/02/16(日) 16:01:46.00ID:1DEBeg9G
>>937
moveを使いたい場合、要素の TYPE クラスに move 用の記述が必要となるため、手間がかかります。
0947デフォルトの名無しさん
垢版 |
2020/02/16(日) 16:01:54.10ID:Yy7z+EdH
is_pod_vで事前条件を確認してるけど、PODはなくなるんだってね。
0949デフォルトの名無しさん
垢版 |
2020/02/16(日) 16:07:00.64ID:D2RmZx9z
listで美味しいのはsplice使いたい時くらいだろ
multi threadのログ統合したい時とかに、lockに必要な時間を最小化出来る
0951デフォルトの名無しさん
垢版 |
2020/02/16(日) 17:05:35.53ID:+vprjU7s
子スレッドを休眠状態で作る方法ない?
起動直後にcondition_variable::waitとかじゃなく
初期状態として
0953デフォルトの名無しさん
垢版 |
2020/02/16(日) 18:53:05.64ID:Yy7z+EdH
>>950
ありがとん。
0955デフォルトの名無しさん
垢版 |
2020/02/16(日) 23:16:48.80ID:B02+i8yM
>>924
まあそりゃね

使えるようにしてもPCやスマホのように自由には使えないぞ
こまめに確保解放なんてことはしない
基本最初に確保して終わり
解放はしない
だから確保しか出来ないヒープも選べる
0956デフォルトの名無しさん
垢版 |
2020/02/16(日) 23:20:30.34ID:B02+i8yM
>>927
それはPCやスマホなどリッチな環境の場合

>>931
一見軽そうで重い関数があったりするから
同じ人が同じ時に作ってたらそんな処理にはしないだろうけど
0957デフォルトの名無しさん
垢版 |
2020/02/17(月) 00:08:48.44ID:U44ZlMgK
白物家電のマイコンやら、pfcのマイコンやらもやったが、そんなのはそもそもmalloc使うような環境じゃなかったしなぁ
RAMもkB単位で少ないし、自由に関数呼べるほどスタックも無いし
割り込み部分はアセンブリで書いてた
0958デフォルトの名無しさん
垢版 |
2020/02/17(月) 00:14:53.75ID:/jKzm6f9
今は冷蔵庫や電子レンジもAI積んでネットワークに繋がるIoT時代だけど
それでも組み込みって未だにそんな感じなの?
0959デフォルトの名無しさん
垢版 |
2020/02/17(月) 00:16:48.70ID:U44ZlMgK
まあそれは特に東南アジア向けだったし
日本よりさらにチープだったのかも
0965デフォルトの名無しさん
垢版 |
2020/02/17(月) 09:22:40.01ID:usLteeFN
趣味じゃないんだから
当然トータルで考えるよ

開発工数、単価、機能性能、信頼性、供給、大人の事情、...
0966デフォルトの名無しさん
垢版 |
2020/02/17(月) 10:36:24.72ID:sgjaAMaL
ゲーム業界の人だけど
new使っても問題ないってのはおれの常識とは異なる

まず問題が広すぎる
言いたいことはデフォルトのグローバルヒープを無邪気に使っていいか
ということだと仮定すると
AAAクラスでそんな杜撰なことしてるところはないと思う

組み込みもそうだがリアルタイム性が必要とされるところでは、メモリ予算というものがある
グラフィック、オーディオ、ネットワークなどのモジュールごとにメモリいくらと決められる
モジュールの責任者はその中でやりくりする
ここで大事なのはメモリの最大使用量を保証しなければならないってこと

必要ならローカルのヒープは作ったりするが、この時点で担当者が気ままにnewってのは認められない
基本的にすべてコントロールされる
現実的に最大量が正確に見積もれないものもあるがそれでも最大量は決める
0967デフォルトの名無しさん
垢版 |
2020/02/17(月) 10:57:08.38ID:sgjaAMaL
といってもグローバルヒープを使わないわけじゃない
オープンソースのもので無邪気にmallocするものは多数あるが、それほど荒ぶらなければそのまま使う
(リアルタイム性が不要なら仮想メモリに任せる)

あとmalloc遅くないという論調の人がいるけどそれはベストケースの話でしょう
ヒープメモリが不足したり一度に巨大なメモリを確保する場合はシステムコールになるからずっと遅くなる
ワーストが見積もれないものはリアルタイムで使いづらい

まぁ昨今は仮想マシン上で動くゲームが多数あるわけで気にしなくていいレベルという意見はある
ただesports系で一瞬カつくとか商品性に関わるわけで
また後から直すのも地獄なので
最初から計画的に作るべきだろう
0968デフォルトの名無しさん
垢版 |
2020/02/17(月) 11:06:49.04ID:tDJaHp5K
ここC++スレだよね、つかぬことだけど
記憶管理はいつでも如何様にもカスタマイズできるようにtypename Allocatorになってるわけじゃん
なんでいきなり組み込みには向かないとかキリッてんの?
0971デフォルトの名無しさん
垢版 |
2020/02/17(月) 12:39:53.15ID:sgjaAMaL
>>968
標準ライブラリでもallocatorが指定できないものもあるんだよ
もはや今のc++で標準ライブラリを全面的に使いつつ、ヒープを個別に差し替えるのはかなり非現実的だ
allocatorを差し替えられてもnewするタイミングや量はリバースエンジニアリングしないとわからない
それが問題になることもある
0972デフォルトの名無しさん
垢版 |
2020/02/17(月) 12:48:18.84ID:2c+OKT/4
てか、静的確保したメモリブロック使うアロケータ書いてそれで標準コンテナ使うのが基本じゃね
まあeastlでも良いが
0973デフォルトの名無しさん
垢版 |
2020/02/17(月) 12:51:50.81ID:tDJaHp5K
>>971

> 標準ライブラリでもallocatorが指定できないもの
例えば?

newだってoperator newですぐカスタマイズできるし
placementで環境依存の細かい設定もできる

ライブラリはISO/IEC14882に固執する必要はなく
サードパーティでも内製でもより都合のよいほうを使えばいい
というだけの話
0974969
垢版 |
2020/02/17(月) 12:56:55.88ID:nfQInp9b
カスタマイズの話なら真っ先にnewの話をすべきなんだが順番おかしくね?
ていうか今時はallocatorより先にpolymorphic resourceだと思うが

というかそもそもmallocの速度の話からであって、いきなりallocatorの話したり
C++全体を否定されたかのように過剰反応するとか・・
0975デフォルトの名無しさん
垢版 |
2020/02/17(月) 13:12:34.13ID:y136Nw0W
仕様通りに書けばいい感じにうごいてくれて、責任は俺にはないとか
思い込んでんじゃってるキッズなんだろう。
デバッグするなんてことはもちろん頭にない。
0976865
垢版 |
2020/02/17(月) 13:34:28.75ID:FC0zZXW0
>>890からの流れでは直後からnewが出てきてたろ
C++が組み込みに向かないという主張の
理由がmallocじゃおかしいだろ
それしか使えんわけでもなし
0978デフォルトの名無しさん
垢版 |
2020/02/17(月) 14:00:21.02ID:sgjaAMaL
>>973
> > 標準ライブラリでもallocatorが指定できないもの
> 例えば?

でしょ?
お前さんは人並み以上にc++知ってると思うけどこの事実知らない
どこで使われてるか知らなきゃ置き換えができないよね

答えはあえて教えない
標準ライブラリのヘッダーをnewでgrepすればallocatorを通さないものが見つかるさ
自分で確認してこりゃ置き換え無理だわと悟って欲しいw
もし見つからないなら後で書くよ

ちなみにグローバルにnewを置き換えるぐらいならmallocのバイナリを差し替えた方が早いし確実
0981デフォルトの名無しさん
垢版 |
2020/02/17(月) 14:59:36.07ID:QYRwM+i2
>>966
もちろん、むやみやたらと使って全く問題ないわけではない。
が、本当に必要な箇所で使う程度なら(多くの場合)余り問題ないという程度。
大体ゲームの場合のnewやmallocは、敵や弾やイフェクト、3Dオブジェクトなど
を1つずつ収めるために使うことが多いが、ゲームの1シーン内に登場する個数が
newやmallocが問題ない程度に元々なっている事がわりと多いと言うだけ。
3Dの雑草の葉っぱ一枚単位で new したりすると問題になってくるかもしれない。
0982デフォルトの名無しさん
垢版 |
2020/02/17(月) 15:51:15.09ID:sgjaAMaL
>>981
なんとも感覚的な話だね
だいたい動けばOK!って感じ?
おれは仕事でそういうもの作りはしない
0983デフォルトの名無しさん
垢版 |
2020/02/17(月) 16:08:54.93ID:HCTe1ZqE
コンシューマかPCかでも違うだろうし
(自分はさほど詳しくないが、基本コンシューマは標準ヒープ使わないはず)
ジャンルによっても違うんじゃね
PCのMMORPGなんかだとシーン中のメモリ確保は必須だろうし
あと草は普通同じメッシュやテクスチャ使うだろうし、揺れを入れるにしても一つ一つにデータ持たせるなんてアホなことしないだろ
0986デフォルトの名無しさん
垢版 |
2020/02/17(月) 16:44:43.28ID:tDJaHp5K
>>985
sgjaAMaLが、自分の話に傾聴してきた人の質問に答えなかった
つまり自分の考えを伝える努力を中止したということでしかない

何人も自らの意見を他人に伝えるには
その意見を説明するしかなく
説明をやめることは沈黙に等しい
0987デフォルトの名無しさん
垢版 |
2020/02/17(月) 16:55:56.23ID:9WiS2n1W
黙って調べてくれば?
調べて無いと結論づけられればまた偉そうに出来るだろw
0988デフォルトの名無しさん
垢版 |
2020/02/17(月) 17:15:39.87ID:9Dh9neDd
ちゃうねん。
僕が組み込みいうたのはArduinoのことな。
RAM2KBやし。
0989デフォルトの名無しさん
垢版 |
2020/02/17(月) 17:31:33.05ID:9Dh9neDd
Arduino面白いよ。
0995デフォルトの名無しさん
垢版 |
2020/02/17(月) 19:46:45.93ID:9Dh9neDd
なぞなぞですか。
0997デフォルトの名無しさん
垢版 |
2020/02/17(月) 23:06:03.72ID:HZSaiYXA
やっぱnew/deleteのレイテンシーを設計に乗せるには非ページプールメモリにアロケートするべきですよねー
0998デフォルトの名無しさん
垢版 |
2020/02/17(月) 23:19:17.27ID:sgjaAMaL
なんかスレ止めてたら悪いから書いておくよ
ひとつは17からallocatorがdeprecatedになったstd::functionね
これは結構知られてるばずだ
定期的にこれ濫用する人が現れるんだけど中身理解してから使うか判断しろと職場では言っている代物

もうひとつあげるなら、
処理系によってかなり違うかもだけどstd::threadも中でこっそり内部クラスをnewしてるはず
ただスレッド間で引数を引き渡すためのものでサイズは小さいしスレッド作るコストの方が遥かにでかいから問題にはなりにくい

他にもあるけどとりあえずこんなもんで
0999デフォルトの名無しさん
垢版 |
2020/02/17(月) 23:46:06.60ID:HZSaiYXA
std::functionを使わないと1 bitもプログラムが書けなくなった漏れガイル、
クロージャをいちいちクラス定義から手で書く日々に戻るのはいやじゃー
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 17日 3時間 0分 7秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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