C++相談室 part141

■ このスレッドは過去ログ倉庫に格納されています
2019/02/22(金) 03:07:43.52ID:MgOIx7iK
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

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

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

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

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

----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2デフォルトの名無しさん
垢版 |
2019/02/22(金) 05:33:28.83ID:7jsMxmv+
Cの場合は
#define BIT(n) (1<<n)
if(data & BIT(3)){ data &=~BIT(3); }
みたいなやり方をするんだが、C++の場合は#defineは使わない方がいいらしいけどどういう書き方が
一般的なのだろう。
3デフォルトの名無しさん
垢版 |
2019/02/22(金) 05:43:25.43ID:kNNcPZDM
inlineにしてる。
2019/02/22(金) 05:45:32.03ID:9HNz13T8
そういう場合にマクロ使うなと言われるのは、単にインライン関数にした方がややこしいバグを産みにくいってだけ
別にどっちでもいい
5デフォルトの名無しさん
垢版 |
2019/02/22(金) 05:51:49.61ID:kNNcPZDM
そろそろonline関数も必要だよな。
2019/02/22(金) 06:59:58.96ID:uV/D6RzS
マクロ関数 BIT() の部分、マスク生成をinline関数にするか、
引数を2つ取って、整数値の指定ビットを落とした値を返すinline関数にするか、
if ~ の部分まで含めて、変数の指定ビットを落とすinline関数にするか…。

と思ってちょいと考えたら、この場合は if 不要と気づいた。
最初から 0 か、ビット操作の結果か、いずれにせよ data の bit3 は 0 になるね。
本筋とは関係ない部分だけど。
7デフォルトの名無しさん
垢版 |
2019/02/22(金) 08:00:05.86ID:7jsMxmv+
>>3
inline関数ですか?
constexperでも関数は作れると思いますが、inlineの方がベターなのでしょうか?
constexper int BIT(int bitno){ return 1<<bitno;}

usingを使ってこんな書き方ができますが、マクロの変換はできないのでしょうか?
using Func = int(*)(int);

あとtemplateはあまり使ったことがないですが、なんかマクロ変換に使えそうな気がします。
2019/02/22(金) 08:17:36.02ID:9HNz13T8
constexprは暗黙的にinlineつくからconstexprでもいい

using Funcの部分は根本的に勘違いしてると思う
それの場合intを受け取りintを返す関数のポインタの"型"に
Funcという別名つけてるだけやで
2019/02/22(金) 08:29:39.37ID:9HNz13T8
あと前スレ>>999
PCゲームやスマホゲーでも、STL使おうが使わまいが標準のヒープを直接は使わないことはよくあるよ
コンシューマへの移植性やパフォーマンスのためにカスタムのメモリマネージャ作ってるメーカーなんてザラにある
PCだから/メモリ有り余ってるからお仕着せのライブラリを適当に使うだけでいい、と思ってるなら何も分かってない
2019/02/22(金) 08:34:10.02ID:nGlWTBX9
現実の開発では、とりあえず動くようにしてから余った時間で最適化したほうが速くなるんだけどね
2019/02/22(金) 08:39:17.41ID:nqPCiyAK
まぁオブジェクトコードから臭いを嗅ぎ取った事は
無いな、感じられる人は耳鼻科行った方が良いかと
2019/02/22(金) 09:28:57.73ID:15zpzt8/
>>9
スレ跨ぐなカス
いつゲームの話なんかしたんですかねえ???????
それともゲームしか入ってないんですか?????????
2019/02/22(金) 09:55:02.52ID:n7WbXSSq
>>9だけど、俺前スレ>>996じゃないよ
14デフォルトの名無しさん
垢版 |
2019/02/22(金) 17:51:49.69ID:PtH+29Wq
「C」からって限定条件なら tcl/tk + canvas はありだと思うが
別に tcl の勉強しなくても使えるし
2019/02/22(金) 19:08:44.27ID:zu/11utG
Cから tcl/tk はどうやって使うの?
16デフォルトの名無しさん
垢版 |
2019/02/22(金) 19:16:25.53ID:kNNcPZDM
ワイドスタジオ使っちゃえば?
2019/02/23(土) 10:20:57.99ID:zem2FMDi
void ff()
{
std::packaged_task<int()> pt([](){std::this_thread::sleep_for(std::chrono::seconds(5));return 0;});
auto fut(pt.get_future());

std::thread th(std::move(pt));
th.detach();

//int v(fut.get());
}

上記のように、taskの完了を待機せず、packaged_taskの寿命が尽きても実行時にエラーも出ないのですが
このようなプログラムはありですか
18デフォルトの名無しさん
垢版 |
2019/02/23(土) 11:42:14.30ID:+DV3f+Dk
そいつにリソース占領させてみればいい
2019/02/23(土) 12:14:03.42ID:zem2FMDi
解決しました
20デフォルトの名無しさん
垢版 |
2019/02/23(土) 18:45:10.43ID:3YtKndGk
紅蓮弐式のほうが強い。
ハイ論破。
21デフォルトの名無しさん
垢版 |
2019/02/24(日) 14:23:19.37ID:YwY0sV++
C++ を使っても綺麗にならない
C++ を使ってる意味が無い
22デフォルトの名無しさん
垢版 |
2019/02/24(日) 19:25:23.97ID:iK4D+UQi
C++に綺麗さを求めるの初めて見た。
2019/02/24(日) 20:13:55.34ID:+qyzr+Wj
最低でもインデントくらい揃えてほしいけどな
2019/02/24(日) 21:31:26.79ID:BOQZpNHf
揃えさせられるPythonの読みにくさを見るとある程度柔軟な方がいい
2019/02/24(日) 23:59:09.46ID:haqs87u6
>>24
お、おう
26デフォルトの名無しさん
垢版 |
2019/02/25(月) 00:01:28.93ID:Jz0DexUX
つまりJavaか。
2019/02/25(月) 01:25:43.15ID:Jktx5+0Z
なんでやねん
2019/02/25(月) 01:34:14.73ID:1EOktSCH
ランタイム速度最速を謳ってバカに新機能の実験台になってもらう。
それがc++
2019/02/25(月) 06:06:13.74ID:pgIYnQ9M
>>22
ん?
普通に求めるでしょ?
見栄えとかアルゴリズムとか
2019/02/25(月) 06:43:23.26ID:AQp51hox
Most elementary use of C++
2019/02/25(月) 07:14:51.09ID:RhTHp1T7
>>29
多分そういう意味じゃない
32デフォルトの名無しさん
垢版 |
2019/02/25(月) 07:40:11.99ID:4l/+z2Zp
古いサイトとか見てるとグローバルな関数に::ってつけるこだわりがよくわからん
::CreateProcessとかさ
2019/02/25(月) 08:14:06.58ID:0evRXBiA
>>32
自分の定義した関数にはつけず、win32api には付けて区別しています…
2019/02/25(月) 09:12:10.78ID:RhTHp1T7
公式「バランス調整はVIP部屋を参考にする」
桜井「○○の使用率ガー」

アホ「調整はVIPの使用率できめるらしい」←????
2019/02/25(月) 09:12:42.56ID:RhTHp1T7
誤爆
2019/02/25(月) 10:45:46.00ID:rMTHv0xs
>>32
大規模開発ならスコープ明示するのはよくやること
std省略NGのとこも珍しくないしな
2019/02/25(月) 12:17:07.75ID:y5m/9TYH
>>31
だから綺麗さなんて曖昧な表現だけだと突っ込まれるって話
38デフォルトの名無しさん
垢版 |
2019/02/25(月) 18:50:34.75ID:Jz0DexUX
では評価関数を。
2019/02/25(月) 23:50:43.17ID:sPAFtFpG
double の 999999998 と 999999999 の積が正しい答えである 999999997000000002 じゃなくて 999999997000000000 になります

なんででしょうか
double の範囲に余裕でおさまってますよね?
2019/02/26(火) 00:18:43.14ID:belfWXD5
仮数部の最大値9007199254740992を超えているから
2019/02/26(火) 00:20:50.15ID:H+xdnOpD
>>39
つ 有効桁数
2019/02/26(火) 00:22:22.81ID:kx+LOcr9
>>40-41
10^300 とかまで大丈夫だって思ってはいけないのですね
初めて理解しました
43デフォルトの名無しさん
垢版 |
2019/02/26(火) 14:43:31.98ID:8+7ktUtN
桁落ち
2019/02/26(火) 15:56:22.96ID:5MxkS3P7
浮動小数点は元々、誤差があるから、大雑把な数値でよい

正確な数値を求める場合は、整数型か、decimal を使う
2019/02/26(火) 16:22:19.66ID:aKbIPEAT
>>32
同じ関数で、MFC 版と Win32 版があることがあり、混乱が生じて、
切り分けの難しい不具合を生じる可能性を避けるため、そうしている。

C++だと、実引数を省略することもできる場合があり、その場合、Win32版を
使っているつもりが、MFC版が勝手に呼び出されて、動作が自分の思ったものと
少し違ってしまう可能性があるかもしれない。この時、コンパイラは何の
警告も出してくれないかもしれない。それを避けたいため、絶対に
Win32版を呼び出したい場合には、:: を付けることがある。
46デフォルトの名無しさん
垢版 |
2019/02/26(火) 19:26:51.90ID:7oeDt7bv
DoxygenがモダンC++に対応していないんだけど、何か代わりの物はありますか?
2019/02/26(火) 22:24:56.64ID:t7v3BAso
キーボードのPageUpとPageDownの使い方が判りません、他のボタンも。
48デフォルトの名無しさん
垢版 |
2019/02/26(火) 23:24:35.69ID:S/5yarce
C++のthreadってOSの無いマイコン環境でも動作するんだろうか?
threadが使えるってことは、ハードウエア的に最低でもタイマー割り込みを使う必要が
あるんじゃなかろうか? そうするとそういうタイマーなどのハードリソースはすべて自前で
用意するというのが前提のマイコンではどうするんだろとふと疑問に思った。
2019/02/27(水) 01:13:25.57ID:FtVEDFBt
>>48
どうにもならんのじゃない?
仕様に完全準拠した処理系 (ライブラリ) は提供できんってだけだろ。
50デフォルトの名無しさん
垢版 |
2019/02/27(水) 01:32:45.56ID:apYcTfdI
effective Modern C++ / Scott Meyersには
C++11の偉業として
 C++の平行対応作業の大部分がコンパイラ開発側が負担する形で実現されたおかげで、標準
規格としてC++の歴史上はじめてどのプラットフォームでも動作が変わらないマルチスレッドプログラム
の開発が可能となりました。
と書かれている。
「どのプラットフォームでも」と書かれているがOSのないマイコンだってプラットフォームだからそれを含まない
と可笑しいとおもうが、、
2019/02/27(水) 01:37:31.77ID:3Jl+ieqT
>>50
そこは、対応しているプラットフォームでは、という前提がつくのは自明だと思うぞ、
2019/02/27(水) 01:59:24.57ID:VmfRF6bC
>>46
例えば何に対応してないの?
2019/02/27(水) 09:01:57.37ID:MitD/HmJ
そもそも、マイコンにスレッドなんてあるのか?

main 関数しか無いのでは?
2019/02/27(水) 09:20:12.60ID:fYEBa3GD
マイコンには関数も変数も無いだろ
機械語セットのどこにも関数とか変数とかの命令は無いじゃん
変数が存在してるように見えるのはコンパイラのおかげ
2019/02/27(水) 12:06:10.51ID:FtVEDFBt
C/C++ というのはそういうランタイムサポートが期待できない環境、いわゆる「ベアメタル」でも使い物になる
システムプログラミング言語であるというのがキモの言語だろ。
フルセットで使える環境なら std::thread という共通インターフェイスを使ってねというだけのことで、
リソースが限られたアーキテクチャでもフルセットが使えるべきというほどのもんではない。
2019/02/27(水) 12:51:06.39ID:Gf38Q9uK
>>48
(組み込みの)マイコンでは、普通、single thread なんじゃないかな。
マルチスレッドを使えるOSを作るのは結構複雑。

>>53
そういうOSをマイコンに作れば使えるようにはなるだろうけど、そこまでは
やってないことも多いと思う。そもそもマルチスレッドはプログラミングが
複雑になり予想も難しくなるのでバグが入り易い。カメラや炊飯器が誤動作して
も困る。
57デフォルトの名無しさん
垢版 |
2019/02/27(水) 14:09:36.66ID:+TCpifLa
>>53
mainが無いのもあった気がする
58デフォルトの名無しさん
垢版 |
2019/02/27(水) 15:17:57.76ID:6BQDuKk1
>>53
PCよりテヘロジニアス化(専用機をCPUに統合)が進んでるので、GPGPUみたいな感じってネットで読んだことあるな。
2019/02/27(水) 15:37:08.27ID:HrTieKXO
>>56
どんなマイコンを想像してるのか知らんけど組込みOSならメモリー数KB程度から動作する
https://www.eforce.co.jp/products/microc3c

>>57
mainなんて単なるC言語とかのお約束だからスタートアップルーチンに手を入れられるなら変えることはいくらでもできるよ
2019/02/27(水) 15:48:15.61ID:jy5tl2qf
サービスなんてエントリーポイント2つあるし
2019/02/27(水) 18:55:35.12ID:BQO9B3mv
template<class T>
int print(T v)
{
 printf("%d",v);// intの場合
 printf("%lf",v);// doubleの場合
}

printfを使うことは必須なんですが、どうすれば実現できます?
2019/02/27(水) 19:11:05.97ID:qHrg9QHU
特殊化しよう
2019/02/27(水) 19:14:17.63ID:lylxu9As
typeidで分岐すれば
64デフォルトの名無しさん
垢版 |
2019/02/27(水) 19:17:04.78ID:ZZbXSlBN
>>52
戻り値の型をautoと書くとオーバーロードを認識しなくなるとかです。
2019/02/27(水) 19:23:09.27ID:lylxu9As
auto戻り値なんてメリットあるか?
2019/02/27(水) 19:31:54.53ID:EHh9wz5w
コンパイル時の条件で型が変わるときはautoで済ますと楽
2019/02/27(水) 19:43:36.93ID:1o0vhyUy
>>61
単純にオーバーロードすれば?
68デフォルトの名無しさん
垢版 |
2019/02/27(水) 19:53:26.31ID:ZZbXSlBN
>>65
decltype使うときとかです。
69デフォルトの名無しさん
垢版 |
2019/02/27(水) 19:56:24.14ID:ZZbXSlBN
std::enable_if<>を使うと超長くなるんだけど、doxygenは戻り値の型の欄を改行してくれないので、関数名や説明の欄が横一文字とかになってしまいそうです。
何とかしてほしいです。
70デフォルトの名無しさん
垢版 |
2019/02/27(水) 20:23:21.57ID:Lz5cBdad
>>65
constexpr auto succ(auto num) {
return ++num;
}
2019/02/27(水) 20:31:28.87ID:ajs1Ye6I
>>61
%lfて…わかってやってる、ワケないよな
2019/02/27(水) 20:40:31.82ID:G+GrvvOb
>>61
printf("%s", std::string(v).c_str());
2019/02/27(水) 20:45:05.91ID:G+GrvvOb
>>72
ミスった
std::stringじゃなくてstd::to_stringが正しい
2019/02/28(木) 07:48:59.08ID:nAsBylgf
なるほど、まず文字列に変換、統一してから %s で表示か。
>>62 の「テンプレート関数の特殊化」を教える例題って説も納得いくけど、
std::string の変換関数の好例でもあるな。

>>71 %lf は規格で認められてる変換指定だね、一応。
間違って使う奴があまりに多いので現状追認で追加された、
という経緯らしいけど。
どうやら C90 では未定義、C99以降は %f と同様みたい。
75デフォルトの名無しさん
垢版 |
2019/02/28(木) 12:32:13.81ID:yyOtWed3
>>73
%06d とか %7.3f とかできなくなるやん
7672
垢版 |
2019/02/28(木) 13:07:02.05ID:g9ECmttI
>>75
質問主がデフォルトの書式だからとりあえずそのままで書いた
型ごとに書式を指定するなら上にもあるように特殊化するしかないな
7774
垢版 |
2019/02/28(木) 15:32:45.18ID:nAsBylgf
自分で書いといてアレだけど、
C++に含まれるCの標準関数ってどうなってるんだろ?
Cの規格に追従して自動的に更新されてくのか、
ある時点で分裂したら再統合されるまで離れる一方なのか。

後者だとしたら、C99以降でprintf()の%lfが正当になったとしても
C++に関してはどのバージョンでも未定義、って危険があるな。
2019/02/28(木) 16:24:48.52ID:KlP/6TOW
>>77
今のところつかず離れずを維持してる。
C++ 中の C 関数は「この C 規格を参照」という感じで明記しているので、
ある程度になると状況を見て参照先を変更するってだけ。

まあ関数についてはそれでいいとして、
その他のところも記法は統一して欲しいよなぁ。

C の _Noreturn と C++ の [[noreturn]] はどっちかに統一するのじゃ駄目だったんかなぁ? とか。
2019/02/28(木) 17:54:53.03ID:zeNaE6xz
vector<object*> v
がありまして、んでobjectクラスはメンバ変数int numを持ってるとします
このときですねv.at(1)->num, v.at(2)->num,....v.at(n)->numでvをsortしたいなーってのがあるんですけど上手い方法無いもんでしょうか
全然思いつかなくて
2019/02/28(木) 18:01:05.88ID:3CdGs56r
>>78
そう言うのは好みだからどっちかが大人になって折れるかよほど力の差があるとかでないと統合は無理
2019/02/28(木) 18:07:46.80ID:zeNaE6xz
>>79ですが解決しました。失礼しました。
https://stackoverflow.com/questions/16366978/stdsort-on-a-vector-of-class-pointers
こちらですね
82デフォルトの名無しさん
垢版 |
2019/02/28(木) 18:41:06.34ID:IByT54N8
英語だ!!!
2019/02/28(木) 20:13:33.80ID:FII1Vkt+
>>61
確か double に対応する書式指定は "%f" であって "%lf" ではない、という記憶がありますが
2019/02/28(木) 20:22:30.93ID:SJVUajxC
K&Rのfloatは引数にするとdoubleに昇格するというルールが残っているのでしょう
2019/02/28(木) 23:35:18.37ID:IM+bn+eP
本質ではなく、どうでもいいところにしか突っ込めないんだなw
2019/02/28(木) 23:37:27.00ID:ufQTgCzR
プロトタイプ宣言されたfloat引数にはfloatで渡すけど
可変引数にはfloatは渡せないままなんだな何故か
2019/02/28(木) 23:45:49.79ID:SJVUajxC
>>86
va_list にそんな制限あったっけ?
2019/02/28(木) 23:51:53.97ID:LhFhdmbG
可変長引数関連はスタック周りを弄るコードを「マクロで」wrapしたものだから
C言語と互換性を持たせるためには仕様の詳細まで引き継ぐしか致し方なかったんじゃないの知らんけど

C++専用のva_listを名前を変えて作ったら解決したかもしれんが
知らんけど

ただしそうしたとしたら、extern "C"したのにC言語から呼ばれへん
何で!?となってプチ大混乱が生じそう
知らんけどな…
2019/02/28(木) 23:53:46.30ID:LhFhdmbG
printf()ではdoubleを出力できるのに、
scanf()ではfloatしか受け取れない(doubleをスキャンする機能が無い)というのは
C言語の七不思議のうちの一つ
2019/02/28(木) 23:56:03.03ID:SJVUajxC
MSDNの関連記事 読んでない
https://msdn.microsoft.com/ja-jp/magazine/dn913181.aspx
2019/03/01(金) 00:15:41.73ID:fP7U0W+N
しかしさすがにscanf()でdoubleをスキャンできるようにする近代化は一筋縄ではいかなさげ
92デフォルトの名無しさん
垢版 |
2019/03/01(金) 13:14:40.93ID:ozM8zBQ9
>>89
えっ
2019/03/01(金) 19:20:57.20ID:HVxvwZsK
>>84
不定長引数関数ならば、という縛りがつきます
2019/03/01(金) 19:21:39.88ID:HVxvwZsK
>>91
普通に書式"%lf" でできるのではないですか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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