C++相談室 part145

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2019/09/13(金) 17:13:24.60ID:/ygW08Jq
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part144
https://mevius.5ch.net/test/read.cgi/tech/1563769115/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://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/ (日本語)

----- テンプレ ここまで -----
2019/10/21(月) 19:22:51.62ID:ICV7tWge
バッファがいっぱいになったらどうしよう?
547537
垢版 |
2019/10/21(月) 19:27:27.31ID:iqf1snDW
>>540
それらの同期機能って標準C++のクラスだけで実現できるもんなの?
2019/10/21(月) 19:30:51.93ID:Kc9FjQwr
>>546
捨てるしかないだろ
2019/10/21(月) 20:56:31.15ID:NgTxqwl+
>>547
どこまでを標準と言ってるのか知らんけどお前の考える標準でスレッドをサポートしてるならたいてい同期機構もあるはず
2019/10/21(月) 21:02:21.32ID:LVq8IpRv
>>547
WindowsではCriticalSection, CreateMutexなどがあったからC++11以前でも使えた。
C++11からstd::mutex, std::lock_guardなどが使えるぞ。
2019/10/22(火) 00:25:01.95ID:IM/z9Y8P
ロックフリー的ななんか無かったっけ?
2019/10/22(火) 16:18:00.26ID:QN5InCe0
リングバッファの排他制御どうするか?

push/popごとにロックかけたら遅くなりそう。
2019/10/22(火) 16:36:38.23ID:LzjGZCpL
>>545
stlライクにしてる割にコピーやムーブが内部の値ベースなのおかしくない?
2019/10/22(火) 17:03:31.86ID:mzkWHCb9
用途的に
reader 1
wrtier 1
だと思うけどそれならwait freeな実装が可能
read pointer/writer pointerで制御するやつね
かつかつに最適化するならこれ

しかしその前にどれだけの頻度と長さで排他の衝突するか見た方がいい
リアルタイムのオーディオなら短くても5msec周期とかじゃないか
かつlock中に多少のメモリの読み書きやってるだけなら排他が必要な時間は短い
なら素朴にmutex1個でのロックで十分な可能性も高い
同期のミスはデバッグがつらいから不用意に難しいことしない方がいい

もしくはある程度のバッファリング(遅延)が許容できるとか、固定長の処理であるなら
ならバッファを複数用意してダブル、トリプルバッファ的な制御でもいいだろう
つまりwriter側でバッファに全部書き終わったらそのバッファをreader側のキューにいれる
reader側は全部読み終わったらwriter側のキューに戻す
っての

とにかく原則どおりまずシンプルにミスなく作って計測して最適化ね
2019/10/22(火) 17:19:01.36ID:mzkWHCb9
ringのソース見たけど
おれはm_full なしでやるのが好みだな
つまりm_front_indexとm_back_indexが一致するのはemptyのときのみ
full時には実際は1個空きがある状態

これを推し進めればwait freeの実装に近づけるぞ
車輪の再発明だが勉強にはなる
2019/10/22(火) 17:21:45.79ID:2ZhQSHmS
>>551
std::atomicとかあるね
原理的に競合が起きないやつ
2019/10/22(火) 17:29:01.30ID:QN5InCe0
まずは記憶媒体の性能を計測してみた。
https://github.com/katahiromz/YappyCam/blob/master/tests/diskrate/diskrate.cpp
https://twitter.com/katahiromz/status/1186558848393285633
これはSSDの場合だ。HDDでも同様に計測しないといけない。
https://twitter.com/5chan_nel (5ch newer account)
2019/10/22(火) 17:43:23.84ID:QN5InCe0
static DWORD s_dwTick;
printf("write: %ld, %ld\n", cbToWrite, GetTickCount() - s_dwTick);
s_dwTick = GetTickCount();

// 最高の音質での出力。
write: 3900, 15
write: 3900, 0
write: 3900, 16
write: 3904, 16
write: 3900, 0

10msecごとに音声データがおよそ3900バイトあるようだ。
2019/10/22(火) 18:28:33.04ID:HSQTG8Jj
>>558
Win32APIや音声仕様はC++じゃないのでよそでどうぞ。>蟻人間
2019/10/22(火) 19:41:50.02ID:+0Lq2R8m
>>553
具体的にどうやればいい?
2019/10/22(火) 20:08:29.90ID:+0Lq2R8m
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/

こっちに移動します。回答者に感謝します。
2019/10/22(火) 21:35:58.70ID:SC+tqfVH
Win32APIって何だよ
20年前からタイムスリップでもしてきたか?
2019/10/22(火) 21:43:35.88ID:afWm6mlf
>>562
win32api(64bit版)で書くのが正義、という価値観もまだまだ存在するようです
564デフォルトの名無しさん
垢版 |
2019/10/22(火) 23:33:30.81ID:QUuuj0zF
C++11からできた属性構文あるけどこの属性は宣言にだけつければOK?
定義にも同じ属性を記載するべき?
2019/10/23(水) 00:34:15.61ID:kAyiuXKe
>>563
それはお前だけの価値観だろハゲ
2019/10/23(水) 00:50:12.41ID:/s0IRa9G
>>563,565
Mozilla Firefoxなどサードパーティ大手は今もWin32APIをネイティブに使っており.NETを使ってない。
2019/10/23(水) 01:51:47.45ID:GER+FSVM
>>562 は .NET より WinRT とかを想定している気がするが。
2019/10/23(水) 02:03:48.66ID:my1FePPi
単に64bitのWindows APIもなぜかwin32と呼ばれ続けてること知らないんだろ
2019/10/23(水) 06:28:47.24ID:/lpUBik0
それこそ20年前からタイムスリップしたのかって話だなw
2019/10/23(水) 18:08:41.93ID:bvZ5IXVl
速度重視な場面ならWin32APIは今でも普通に使う
2019/10/23(水) 20:43:18.87ID:R0F6kh0V
うわぁ・・・
572デフォルトの名無しさん
垢版 |
2019/10/23(水) 21:15:01.42ID:kC3TvNwV
正直なところWin32APIで速度でるの?
2019/10/23(水) 21:30:55.10ID:/s0IRa9G
>>572
「Linuxシステムコールで速度でるの?」という質問と同じくらい矛盾に満ちた質問。
Win32APIも含めシステムコールはOSが提供するAPIなので、プログラマは他の手段で代替しようない。
2019/10/23(水) 21:35:56.58ID:H9cLmi0l
Native APIがあるじゃろ
2019/10/23(水) 22:12:26.70ID:B7dtMHRy
Visual C++ 2015なんですが、
goto文でERRORというラベルに飛ばそうとしたら、コンパイルエラーが出ました。
ERRにしたらコンパイルできるようになったんですが、
なぜERRORのラベルはダメなんでしょうか?
2019/10/23(水) 22:22:13.25ID:bxABcYeD
>>575
<wingdi.h>に#define ERROR 0がある。
2019/10/23(水) 22:22:30.17ID:R0F6kh0V
#undef ERROR
2019/10/23(水) 22:24:20.08ID:H9cLmi0l
単語1つのラベルなんか使うなってこった
2019/10/23(水) 22:28:23.69ID:R0F6kh0V
いやC++ではマクロが悪だ
580575
垢版 |
2019/10/23(水) 22:32:44.87ID:B7dtMHRy
ERRORのdefineがあるんですね・・・!
ありがとうございました!
2019/10/24(木) 09:12:01.73ID:m57JSwXI
クソみたいなマクロにsmallもある
他にもwindows.hには地雷が入念に仕込まれてる

普通の神経の人間が爆死して厭らしい人間だけが生き残るように整えられている厭らしい環境がwindows.hだよ
マトモな人間にはまず耐えられない
頭のオカシイ厭らしい人間だけが残るように設計されているのがwindows.h
このヘッダは頭がおかしい
2019/10/24(木) 13:45:08.38ID:VURCQr2T
>>581
お前の頭がおかしいだけだと思う
2019/10/24(木) 13:57:45.03ID:SfEmAS3k
林檎だってcheckマクロでBoostに大迷惑かけてるしお互い様
2019/10/24(木) 17:59:23.36ID:0EVcBOG9
>>582
そこは
ヘッダだけにな
と言ってやるところだろ
2019/10/24(木) 18:05:45.17ID:pgieaG2c
ヘッダ「嫌ならincludeするな」
2019/10/24(木) 19:57:40.06ID:WiWlXxwu
このスレはみんなWindows嫌いなのかな
2019/10/24(木) 20:17:56.94ID:TRYJth0S
んなわけない
2019/10/24(木) 21:28:21.53ID:hxYU3Lux
たしかmaxとかもマクロ定義されてたよね
初心者のころはどハマリして殺意がわいたわ
2019/10/24(木) 21:49:18.24ID:omM/Gkq5
いまはIDEが色変えてくれるからすぐわかるから別にいいけどね
2019/10/24(木) 23:20:19.58ID:M5uvwdA8
マクロがあればなんでもできる
2019/10/24(木) 23:40:29.47ID:PIyGP0m1
最近ちょいちょい思うことだが、ある言語のここがどうであーだこうだと議論する場合
テキストエディタでコーディング作業してる連中と IDE でコーディング作業してる連中では
わりと大きな認識の違いがあることが多い
2019/10/24(木) 23:44:34.75ID:8Fri6DgZ
windows.hのマクロ回りでトラブル起こしているのは、殆んどvisual studio使用者だと思うのだが
2019/10/25(金) 00:24:04.41ID:AZBzSxe6
認識の違いはコンパイラによるものであってコードエディタは関係ない。
2019/10/25(金) 00:39:26.61ID:ghRRxqDU
モジュールでマクロとか気にしなくて良くなる(なるといいなぁ...)
2019/10/25(金) 07:52:28.01ID:51G3P59H
コンパイラ変えてもマクロは変わらんでしょ
せいぜいエラーメッセージ変わるぐらいじゃ
2019/10/25(金) 09:14:30.39ID:AZBzSxe6
>>595
何言ってるのか意味がわかりにくいエラーメッセージを吐くのはコンパイラでしょ。
2019/10/25(金) 12:19:38.16ID:51G3P59H
マクロは影響範囲わからんからなんとも

vcでマクロがテンプレートに影響したらマジでわからん
clangはテンプレートのエラーメッセージわかりやすいとかみたな
2019/10/25(金) 12:45:17.61ID:yKAgzXLG
>>593
お前はまず日本語を正しく認識できるようになれよ…
>>591は連中(=人間)の認識の話な
599デフォルトの名無しさん
垢版 |
2019/10/25(金) 17:33:51.00ID:AZBzSxe6
初心者であればあるほど親切なエラーメッセージが必要なのだけど、VCのエラーメッセージはgccに比べて不親切な印象がある。
STL関連のエラーメッセージは、わかりにくい代表格。かたやgccはprintf系の書式ミスを指摘してくれるなど初心者に優しい。
600デフォルトの名無しさん
垢版 |
2019/10/25(金) 18:03:22.82ID:AZBzSxe6
C#が使いやすいと思っている人は、Visual Studioの入力補完に救われていることに気づいていない。
Visual Studioがなければヘッダーファイル相当のgrep検索もままならない不便な言語であると感じるだろう。
2019/10/25(金) 18:50:41.74ID:StYWqeWG
VS込みでいいじゃん
どうせC#なんて大半がWindows向けなんだしVS使える環境で開発してるでしょ

って変なこと言うと思ったらADSLか
2019/10/25(金) 19:00:26.80ID:r/2esNbS
referencesource.microsoft.comみたいなありがたいものがあるのに
2019/10/25(金) 19:58:41.60ID:q2iK2L4t
基本的には MSDN こそ C++ である。
2019/10/26(土) 00:56:44.62ID:7AoWPXY8
class A{};

namespace N
{
class B{
friend class A;
int i;
};

class A{
A(){b.i = 0;}
B b;
};
};

これをコンパイルできるようにするにはどうすればいいですか?

・クラスAを名前空間Nの下に書く
・名前空間NのクラスAを別の名前にする
・最初のクラスAを別の名前にする

これ以外でできますか?
2019/10/26(土) 00:59:53.57ID:SyjizfQh
全部消す
2019/10/26(土) 01:35:09.91ID:dcsgYCXg
>>604
「コンパイルできるようにする」
というだけであれば、何も修正しない元のままでもコンパイルできるはずだし、
最初の class A {} の行をコメントアウトする、消す。
Nの中のAを消す、namespace N {・・・} の部分を全部消す、
などなどいくらでも有りえる。
2019/10/26(土) 06:20:26.55ID:3CUGZWDU
BのfriendをN::AにしたいってことであればNとBの間にclass A;とAの宣言を入れる
これ以上のエスパーは無理
2019/10/26(土) 08:16:08.08ID:kGqH5EJJ
>>604
g++だと、現状のままでok
vs2019は、friend宣言の対象が::AになっていてC2248
::Aをコメントアウトするとok

正しいのはg++
N4713 6.4.1. Unqualified name lookup (7.4)
Note: When looking for a prior declaration of a class or function
introduced by a friend declaration, scopes outside of the innermost
enclosing namespace scope are not considered; see 10.3.1.2.
2019/10/26(土) 21:50:06.24ID:JNlbd3QN
投稿テスト

N3337 3.4.1 Unqualified name lookup
Note: When looking for a prior declaration of a class or function
introduced by a friend declaration, scopes outside of the innermost
enclosing namespace scope are not considered; see 7.3.1.2.
2019/10/26(土) 22:03:59.61ID:JNlbd3QN
vs2019で::Aをコメントアウトするとokの意味がわからんorz
2019/10/27(日) 08:17:56.25ID:/F19lavA
試してないが、理論上はこれでいけるはず :
namespace N
{
class A;
class B{
int i;
friend class A;
};

class A{
B b;
A(){b.i = 0;}
};
};
2019/10/27(日) 08:27:09.91ID:C3DsRDjK
N::Aを前方宣言するなら、宣言を名前空間Nの中に入れるかN::Aで宣言する必要があるってのはC++の規約通りじゃないのか?
>>608が意味わからん
2019/10/27(日) 09:08:16.09ID:M7FyKfzv
friend宣言は、当該宣言を含むクラスが属するスコープを対象とし
なおかつ、対象スコープに識別子を導入しない

class G
{
friend class A; //::A
};

namespace H
{
class I
{
friend class A; //H::A
};
}
2019/10/27(日) 12:21:23.69ID:C3DsRDjK
>>604はfriend宣言ではなく前方宣言の問題なんだが?
2019/10/27(日) 14:03:45.40ID:M7FyKfzv
いや前方宣言は関係ない
「もし」::Aがあったら、H::Aがあったら
と言っているだけのものだ
2019/10/27(日) 14:25:39.88ID:vcUKQgsd
>>614
前方参照をfriendがどう解釈するかの問題だろ
2019/10/27(日) 15:28:12.27ID:itfBjV2c
>>616なのは明白だが
>>604のコードのどこにコメントアウトすべき::Aがあるのかわからん…

ひょっとして、>>604が禁じていないのを良いことに、
最も外側のclass A{};を丸ごとコメントアウトしようとしている?
2019/10/27(日) 15:53:16.22ID:ho9vIROt
>>617
???
>>608はVisual Studio 2019(2017でも同じだったが)の話だと言うことは理解できてるか?
2019/10/27(日) 15:56:22.52ID:M7FyKfzv
>>617
そのとおりだが?

//class A{};

namespace N
{
class B{
friend class A;
int i;
};

class A{
A(){b.i = 0;}
B b;
};
};

friend宣言が識別子を導入したり
関係ないはずのグローバルに干渉するなど
vcはfriendにクセがある
2019/10/27(日) 16:07:13.81ID:6193c9It
規格的にはどうなるのが正しいの?
むしろ、もとの話がどうしたいのかに依る気がしないでもない
2019/10/27(日) 16:13:20.11ID:rrcAfXPk
>>620
規格の話は>>608じゃねーの?
コンパイルできるようにするにはg++にするかVisual Studioなら>>619みたいにするってことでしょ
それ以外なら環境を提示してねってことかと
2019/10/27(日) 16:22:22.30ID:itfBjV2c
>Visual Studioなら>>619みたいにするってことでしょ
https://festy.jp/wp-content/uploads/festy/2015/12/25/06/51/40/917/1448191295053.jpg

>>604
>・最初のクラスAを別の名前にする
と何が違うんだそれ
2019/10/27(日) 16:55:17.47ID:rrcAfXPk
>>622
一緒だよ
だからそれができないならg++(とか他のちゃんと規格準拠して処理系)にしろって書いてあるだ
まあVisual Studioが規格準拠するのを待つとかMSにねじ込むか金払って対応してもらうとかでもいいけどw
2019/10/27(日) 20:50:09.77ID:5FCyBaq0
トンチンカンな質問かもしれませんが許して。

<Base>のコンテナを巡回しながら
Base派生の多態性を引数で実現、みたいなことがやりたいのです。
https://ideone.com/PA26HG

これのManager::update()が、このままだと当然
func(shared_ptr<Base>,shared_ptr<Base>)を呼ぼうとしてしまう訳ですが

宣言してあるfunc(A,A)とかfunc(A,B)とかfunc(B,B)とかが
呼ばれるようにするにはどうしたらいいですかね?
あるいは、ガラっとコード変わってもだいたい似たようなことを実現するとしたら
どう書きますか?
2019/10/27(日) 20:52:12.38ID:oi2VB0wA
シェアポの配列を作って添え字で切り替え。
2019/10/27(日) 20:54:15.22ID:oi2VB0wA
あ、すまん。誤読していた。
>>宣言してあるfunc(A,A)とかfunc(A,B)とかfunc(B,B)とか
多態やってる意味を潰しに来てないか?
2019/10/27(日) 20:54:19.69ID:irXhIBVc
>>624
funcを仮想化すれば?
2019/10/27(日) 20:59:49.33ID:cNZwDfUU
もしくはfuncでは仮想化された関数しか使わないとか。
2019/10/27(日) 21:09:28.45ID:aWGByvYb
>>624
visitorパターン
630642
垢版 |
2019/10/27(日) 21:09:54.33ID:5FCyBaq0
>>627
func(Base,Base)だけをvirtualってこと…ですよね?
え、こういうときにもvirtualて使えるの?と思って試したけどダメですね。

>>628
もうちょっと考えてみますけどたぶん難しいです
631624
垢版 |
2019/10/27(日) 21:14:40.36ID:5FCyBaq0
名前欄間違えてた…

>>629
あー…それかも
なんとなく知ってるだけで
まだ実装したことはないですが

それ正解かもしれません
調べつつやってみます
2019/10/27(日) 21:34:36.36ID:4WtkkchW
>>624
愚直に dynamic_cast で N*N 分岐からはじめたら?
2019/10/27(日) 22:12:39.30ID:5au4GxkL
2引数ならdouble dispatchとか
2019/10/27(日) 22:14:23.71ID:SYtHJPpD
派生クラスの種類が決まっているなら
variantに置き換えたらvisit使えるから簡単
2019/10/28(月) 05:15:43.29ID:VJWcm+Z+
>>624
こうゆうことやのうて?
https://ideone.com/BoNrnP
636デフォルトの名無しさん
垢版 |
2019/10/29(火) 01:15:36.46ID:Vnr+WSpj
C++でCOM扱うの苦痛すぎる
何が正攻法なのかさっぱりわからん
2019/10/29(火) 01:32:18.86ID:CdNgVa0z
>>636
ATL
CComPtr
638デフォルトの名無しさん
垢版 |
2019/10/29(火) 01:41:40.05ID:Vnr+WSpj
別にCOMは作るんじゃないんだよ。
参照するだけなんだよ。
それでもATLなんーーーーーーーーー?
639デフォルトの名無しさん
垢版 |
2019/10/29(火) 01:43:16.61ID:Vnr+WSpj
そもそも文字コードどうなってるんやーーーー
コマンドプロンプトに出す時、どうするんやーー
現在のchcpの設定に従って変換線といかんのカーーーーーー
2019/10/29(火) 02:28:13.51ID:OOQqvLIR
変換なんてWideCharToMultiByte使って一つ変換関数作ってその関数を使い回せばいいやん。
2019/10/29(火) 02:42:32.11ID:/DWax9vx
WriteConsoleW
642デフォルトの名無しさん
垢版 |
2019/10/29(火) 04:01:15.69ID:ymnLB/52
>>640
Unicode文字列(絵文字とか)が文字化けするんだよー!
フォントの問題でないことは確認済み
643デフォルトの名無しさん
垢版 |
2019/10/29(火) 04:07:41.50ID:ymnLB/52
例えばググって見つけた、こことか
http://www.t-net.ne.jp/~cyfis/win_api/sdk/WideCharToMultiByte.html

wchar_t を const wchar_t にするのはまあいいとして、
日本語はOKだけど絵文字とか化けるじゃねーか
わーけわかねなんdfっrね;jk
644デフォルトの名無しさん
垢版 |
2019/10/29(火) 04:13:15.89ID:ymnLB/52
ん?WideCharToMultiByteってShiftJISに戻すやつじゃねーのか?
俺はUnicode文字すべてを表示したいだけだぞ
2019/10/29(火) 04:20:56.50ID:xS90z6YC
chcpくらい使えよ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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