C++相談室 part148

■ このスレッドは過去ログ倉庫に格納されています
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/ (日本語)
2020/02/09(日) 08:59:21.69ID:aEgJYC9i
まあ失敗時はFALSE、とも書いてあるから、こう書くのが正解!
bRet32 = MakeSureDirectoryPathExists("C:\\tmp");
if (bRet == TRUE) {
 // 成功すた
 ...
} else if (bRet == FALSE) {{
 // 失敗すた
 ...
} else {
 assert(0);
}
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の知識と想像力の欠如が諸悪の根源
2020/02/09(日) 09:06:48.93ID:aEgJYC9i
訂正orz
 誤: bRet
 正: bRet32

>>509訂正、
 誤: {{
 正: {

>>510訂正
 誤: bRet = TRUE
 正: bRet32 == TRUE
2020/02/09(日) 09:28:45.27ID:PT76WH2y
C89にboolがないことに拒否反応を起こす頭の固い奴に迎合して作られたboolでないBOOL
2020/02/09(日) 09:35:18.39ID:aEgJYC9i
先にWindowsがシステムコールとしての素朴な要請からbool型の実装型を定義して、
その後コンパイラメーカーがbool型の実装を別の方式にし出すよりは
よっぽどマシやったろうが!

個人的にはBOOLは好きだがな
TRUE/FALSEを表すのに4バイトも使うところが
いかにもリッチなOSっぽく、使っていてリッチな気分になれる
2020/02/09(日) 09:41:35.54ID:6++kPC7v
>>508
ありがと
全部は見てないけどDbgHelp関連の奴はその書き方してるみたいね
https://docs.microsoft.com/en-us/windows/win32/debug/dbghelp-functions
2020/02/09(日) 09:47:29.30ID:Ej5ffr5G
>>510
> } else if (bRet == FALSE) {
>  // エラー2が発生すた、
>  ....
エラーじゃないぞ
人の知識とか想像力とか言う前に自分の知識を見直せよw
2020/02/09(日) 09:55:00.47ID:aEgJYC9i
といっても成功していないのだからエラー扱いで差し支えないなのでは…
2020/02/09(日) 10:28:32.96ID:Ej5ffr5G
>>516
なんでそんなに自信満々なんだよw
マジでドキュメント見てこい
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getmessage
2020/02/09(日) 10:45:20.17ID:Jw8Rx7z0
>>510
GetMessageのマニュアルをちゃんと読めクソ雑魚
エラーの時は-1、WM_QUITの時はFALSE(0)を返すが、それ以外の時は「nonzeroを返す」としか言ってない
nonzeroというのはたくさんの値の集合であって、その判定をある特定の値と==で行うことはTRUEが1だろうと他の値だろうと完全な間違いだ
つまりお前のその糞プログラムは完全にバグっているし、お前がバカにしてる>>455らが言った通りの間違いをそのままやらかしてる
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);
 }
}
2020/02/09(日) 11:39:41.09ID:aEgJYC9i
>>519
>TRUE以外ならassertで落としていいなんてどこに書いてある?
それはこちらが聞きたい;
何を見てそう思ったのか?
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");
}
2020/02/09(日) 12:02:53.96ID:Cr/e9GtE
while(GetMessage( &msg, hWnd, 0, 0 ) >0)
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
2020/02/09(日) 12:05:04.77ID:aEgJYC9i
とオモタがわかった
GetMessage()は WM_QUIT以外を受け取ったとき非0を返す、としか書かれていないから
bRet32 == TRUEでは正しい判定にならないのねん

使ったのがスゲー昔なので忘れていたが、そのときは多分>>519式に書いたから安心してホスイ
2020/02/09(日) 12:06:02.94ID:aEgJYC9i
>>522
気持ちはワカル
2020/02/09(日) 15:07:49.90ID:Z95s67CZ
しょうもない事で攻撃的になるやつなんなの
いつも吹いてしまうw
2020/02/09(日) 15:13:04.53ID:G+Zw2pJ3
(笑)
2020/02/09(日) 15:27:19.45ID:OoesT11A
>>506
BASIC というか、古の言語にはビット演算と論理演算の区別がないものが結構あった。
全てのビットが立った状態 (-1) を真ということにしておけば
ビット演算用の AND, OR, NOT がそのまま論理演算のそれとして使える。

昔はこれが気の利いた方法だったんだろう。
528デフォルトの名無しさん
垢版 |
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点!! 出入り禁止!!!
2020/02/09(日) 17:16:55.31ID:J3Qn0niW
>if(b != FALSE) ← 正しい

これこそ糞コード
2020/02/09(日) 17:20:45.96ID:GpaXptWq
意味的にboolなら
if (a)
if (!a)
で判断すべきだと思う
2020/02/09(日) 17:24:22.90ID:GpaXptWq
if (a == TRUE)
if (a == TRUE == TRUE)
if (a == TRUE == TRUE == TRUE)
2020/02/09(日) 17:32:39.19ID:DvSFPggO
とぅっとぅるぅ〜♪
2020/02/09(日) 17:40:32.11ID:J3Qn0niW
もともと>>438>>439を混同すんなという話なんだが、混同してる奴が次から次へと湧いて出てくるw
534デフォルトの名無しさん
垢版 |
2020/02/09(日) 17:46:22.21ID:cYNa4VVg
ちゃうねん。
2020/02/09(日) 17:46:32.42ID:ugWNThcV
>>528
#define TRUE (!0) ← 正しい

C/C++ では、!0 は、必ず1 になることが仕様化されているので、仕様に準拠している
処理系ではこれは必ず、
#define TRUE 1
と書くのと同じになるので、敢えて (!0) と書く意味は無い。
2020/02/09(日) 17:48:20.60ID:GpaXptWq
boolだろうがBOOLだろうがYESNOだろうが
意味がboolであればboolと同じ扱い
2020/02/09(日) 17:48:58.88ID:6++kPC7v
>>529
糞コードだが
> if(b == TRUE) ← 間違い くず! 0点!! 出入り禁止!!!
より1億倍マシ
2020/02/09(日) 17:50:49.32ID:GpaXptWq
>>528
1がイヤなら0もイヤだろう
#define FALSE (0!=0)
としないと
2020/02/09(日) 17:55:11.50ID:J3Qn0niW
>>537
マシとか言う以前にそもそも動作が違うんだが。
bがTRUEと一致するかどうか判断するのに他にどういう書き方をするというんだろう?
540デフォルトの名無しさん
垢版 |
2020/02/09(日) 17:59:01.69ID:cYNa4VVg
>>539
!(b != TRUE)。
2020/02/09(日) 18:02:21.32ID:GpaXptWq
普通はTRUEかFALSEしか入ってないんだよ

それ以外が入ってる可能性があるなら
普通TRUEがどうかの判断だけじゃダメじゃないか?
2020/02/09(日) 18:05:49.02ID:GpaXptWq
switch (b){
case FALSE:
...
case TRUE:
...
case ???
...
default
...
}

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

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

適性に乏しいやつには厳しいよな
2020/02/09(日) 19:16:00.10ID:mORiFTgk
boolからBOOLになってintになってた
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 を示す
2020/02/09(日) 19:17:37.19ID:mORiFTgk
数学関係ないのに数学ネタでひっぱってるヤツがいるな
IDは違うけど同じ人?

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

こういうときってそのクラスのコンストラクタとしては何もしないものを作っておいて、初期化用の関数を別途用意するというのが普通ですか?
インスタンスの宣言だけしておいてコンストラクタは後で呼ぶなんてできないですよね?
2020/02/09(日) 19:23:38.68ID:mORiFTgk
ポインタにしとけ
2020/02/09(日) 19:29:17.77ID:J3Qn0niW
>>561
逆に不思議だわ。
「成功時に0以外の値を返す」と「成功時にTRUEを返す」は違うということがなんで理解できないのか。
2020/02/09(日) 19:30:00.78ID:aEgJYC9i
std::unique_ptr<T>の出番
2020/02/09(日) 19:30:50.97ID:bHnzUNQO
apiの仕様見て適切に処理で終わる話だろこれ
2020/02/09(日) 19:37:32.03ID:54+KBSAm
optionalの出番だろ
2020/02/09(日) 19:39:43.34ID:OliK3lJl
>>568
同意
2020/02/09(日) 19:45:02.77ID:6++kPC7v
>>566
どこから違うことを理解してないと思った?
思い込み激しすぎw
2020/02/09(日) 19:45:29.20ID:6++kPC7v
>>568に一票
2020/02/09(日) 19:47:47.73ID:mORiFTgk
もともとはboolの話だったのに
574デフォルトの名無しさん
垢版 |
2020/02/09(日) 19:49:14.41ID:VD5bohdG
GetGlyphOutline などで文字画像を取り出そうとすると、フォントが持ってない文字は代わりの文字を出力してくる。
(例えば、昔の毛筆フォントでは「(はしご高)」などはMSゴシックになる。)
これを抑制したいので、そのフォントがグリフデータを持っているかどうか、調べる方法はありますでしょうか?
2020/02/09(日) 19:50:25.08ID:mORiFTgk
C++の相談?
2020/02/09(日) 19:52:53.59ID:J3Qn0niW
>>571
違いを理解しているなら>>566の後者はまさに>>539だということも理解できそうなもんだが。
2020/02/09(日) 19:54:35.07ID:bHnzUNQO
>>574
ここよりwindows apiのスレのがいいんじゃないかな
2020/02/09(日) 20:00:40.91ID:6++kPC7v
>>576
もしかして(ことが多い)っていう意味もわかってないのか?
2020/02/09(日) 20:05:04.78ID:54+KBSAm
win32は変な仕様多いからAPIの仕様確認しないと罠にはまる
2020/02/09(日) 20:05:21.07ID:J3Qn0niW
多い方に合わせろって話でもないだろう。
>>568の通りそれぞれの仕様に合わせて適切に扱えってこと。
2020/02/09(日) 20:05:58.49ID:PT76WH2y
>>579
ほんこれ
2020/02/09(日) 20:07:59.65ID:54+KBSAm
GetModuleFileNameとか仕様作った奴のセンスを疑う
2020/02/09(日) 20:20:16.24ID:6++kPC7v
>>580
誰も多い方に合わせろなんて言ってないのに…
単にそういうケースが多いって言うだけの話であることも説明しないとわからんのかな?w
2020/02/09(日) 20:30:08.24ID:J3Qn0niW
なら問題ないケースもあることを理解してるわけだ。だとすると>>552で指摘してたのはなんだろうと。
2020/02/09(日) 20:34:19.93ID:6++kPC7v
>>584
えっ?
まだ(ことが多い)ってわざわざ書いてる意味がわからんのか?
まともな奴と会話してる時ならいちいち書かないんだが、ネット掲示板なのでわけわからん奴に絡まれないようにわざわざ書いたのに想定外の低能さんなの?
2020/02/09(日) 20:46:39.77ID:J3Qn0niW
>>585
つまり>>552は、まずい場合もあるしそうでない場合もあるという意味のない指摘なわけだ。
ようやく>>539に戻れたな。

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

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

もともとのboolの話とは全く関係ないですね
2020/02/09(日) 21:05:18.68ID:6++kPC7v
>>586
> つまり>>552は、まずい場合もあるしそうでない場合もあるという意味のない指摘なわけだ。
お前には意味ないのかもな…
必死になりすぎw
2020/02/09(日) 21:05:59.85ID:J3Qn0niW
>>533に書いたが、boolじゃなくてBOOLの話をしているのになぜかboolと混同する人が
2020/02/09(日) 21:06:45.54ID:mORiFTgk
boolの話題でbool以外を語るのはこんな感じ

内部的に固定小数点なfloatライブラリもあるぞ
内部的にvectorなmapライブラリもあるぞ
2020/02/09(日) 21:07:53.15ID:mORiFTgk
BOOLも同じ
意味的なBOOLが前提
それ以外は特殊事情
2020/02/09(日) 21:21:02.28ID:J3Qn0niW
>>590
意味のあるなしは主観だからいいとして、結局これ理解できたかな?

>>537
マシとか言う以前にそもそも動作が違うんだが。
bがTRUEと一致するかどうか判断するのに他にどういう書き方をするというんだろう?
2020/02/09(日) 21:23:11.71ID:6++kPC7v
>>594
>>552
低能は一度指摘されたことを何度も繰り返すw
596
垢版 |
2020/02/09(日) 21:32:30.02ID:Z95s67CZ
boolができるまでは

if (!!b)

こういうイディオムもありましてね
2020/02/09(日) 21:42:44.86ID:J3Qn0niW
>>576を理解しているなら

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

このような判断がが必要な場合があることも理解しているはずだろうが、
結局この質問には答えられない(答えたくない)ようだな。
2020/02/09(日) 22:05:36.89ID:6++kPC7v
まだやってるのかよw
無能無限ループ乙
2020/02/09(日) 22:07:19.29ID:EoI3r47q
あいかわらずしょーもない話題だと盛り上がるのな。
600
垢版 |
2020/02/09(日) 22:16:06.44ID:Z95s67CZ
goto、マクロ、BOOL
全部C言語の範疇なんだよなw
おじさんがんばりすぎ
2020/02/09(日) 22:18:57.48ID:aEgJYC9i
つか真理値の型であるbool型および
真理値の型としての名前を与えられたBOOL型の議論が
Win32 APIの仕様という現実に汚染されてぐちゃらけてますな
TRUEに幅が有る、なんていうおかしいことを言い出す香具師まで出る始末、!
2020/02/09(日) 22:23:19.21ID:J3Qn0niW
本当は昨日で終わっていたはずの話題なんだがな。
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) と書くのはバグの原因になる
と判断するのは老害的発想と私は断定しますね
2020/02/09(日) 22:33:23.30ID:EiJfhZVq
>>602
お前が言うなよww
2020/02/09(日) 22:33:54.63ID:aEgJYC9i
一般論として、APIの呼び出しが成功しました、という情報にはそれ以上幅も糞も無い(成功した要因など知っても無駄
から、成功=TRUE、失敗=FALSEとする割付の下では、TRUEこそ単一値として規定されるべきブツに他ならない
よって、一般論としては b == TRUEは言うほど糞ではないはずであった、
2020/02/09(日) 22:37:13.53ID:aEgJYC9i
まあエラー要因を複数種類返したい、ということなら
成功判定は b == SUCCEEDEDでSUCCEEDEDでなかったらエラーコードが入っている、という
INTかDWORD返しがストレートやったがな!(成功時非0を返す、とか言われるよりは
607デフォルトの名無しさん
垢版 |
2020/02/09(日) 22:42:00.12ID:VD5bohdG
if( b == TRUE ) って、結局 if( b ) ってことだろ。
2020/02/09(日) 22:45:14.84ID:Z95s67CZ
クソワロタ
口調も激変
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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