X



C++相談室 part134
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 5fcb-Q2eK)
垢版 |
2018/01/20(土) 09:05:42.21ID:mJKRg6iz0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part133
http://mevius.5ch.net/test/read.cgi/tech/1511509970/

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

■長いソースを貼るときはここへ。■
 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
0332デフォルトの名無しさん (ワッチョイ 8610-QuQl)
垢版 |
2018/02/26(月) 21:01:42.73ID:k0ghrbBh0
所有権を渡すのってstd:move()だと思ってたんだけどconst &&でもいけるの??
0339デフォルトの名無しさん (ワッチョイ 8610-QuQl)
垢版 |
2018/02/28(水) 18:07:41.72ID:IZRayiSM0
右辺値参照とか難しいなー
最近ようやくC++11使えるようになったから全然いってることがわからん
0340片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd94-HaFh)
垢版 |
2018/02/28(水) 18:34:51.95ID:jmOf6Upnd
右辺値参照が使えなかった頃は、std::swapでスピード最適化していた。ポインタとメモリー確保を含む構造体は、
単純にスワップしたり、単純にバイト単位コピーしたりするのはまずいことがある。
そういうときに、std::swapを使う。右辺値参照は、それよりちょっと速くて賢いが、テンプレート型を理解してないと多分理解できないと思われる。
0344はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e66f-x4Or)
垢版 |
2018/02/28(水) 19:18:07.29ID:7ezW7mFb0
実際のところヘッダファイルから std::move の定義を抜き出すとこんな感じ。

template<typename _Tp>
constexpr typename std::remove_reference<_Tp>::type&&
move(_Tp&& __t) noexcept {
return static_cast<typename std::remove_reference<_Tp>::type&&>(__t);
}

テンプレートの都合で面倒くさくなってるけど、実態としては static_cast してるだけ。
0345片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd94-HaFh)
垢版 |
2018/02/28(水) 19:24:03.59ID:jmOf6Upnd
そのstd::remove_reference<T>::typeはTから左辺値参照や右辺値参照をはずした型になるね。それに&&を付けるんだから、左辺値参照が右辺値参照になる。
0347はちみつ餃子 ◆8X2XSCHEME (ワッチョイ e66f-x4Or)
垢版 |
2018/02/28(水) 19:35:33.38ID:7ezW7mFb0
C++17 では noexcept は型の一部という扱いに変更された。
例外を投げないなら投げないと書いておかないと他のライブラリとの組合せで型エラーになったりすることもあるかもしれんぞ。
0350デフォルトの名無しさん (ワッチョイ eff2-x4Or)
垢版 |
2018/02/28(水) 21:27:43.47ID:LDTKKB+20
江添ってあれか。ニートの時にやることないからたまたま目についたC++の仕様書を読み込んでたら
いつの間にかすごく強くなったという、ホリランみたいな。
0351デフォルトの名無しさん (ワッチョイ 1651-x4Or)
垢版 |
2018/02/28(水) 21:32:34.60ID:eOQjYTv40
おまえそれをバカにできるのか?
仕事ってそういうもんだぜ
目の前の案件のために必死こいても付け焼き刃にできることは知れてるんだよ
「ヒマ」なときに遠くを見て投機的にコツコツ努力したことが
あとで花咲くことがあるし咲かないこともある
賭に勝った者を、降りたやつがバカにできるのか? え、おい
0352デフォルトの名無しさん (ワッチョイ 8abd-2pQG)
垢版 |
2018/02/28(水) 22:02:12.40ID:debsNNov0
>>320
>>322
書き込むときポインタ渡しにするのは
C++には参照渡しがin/out/refのどの意味なのか表すシンタックスが現状無いから
というのが主要な動機だと思うが
inならconst T& aというのは比較的読み筋だが
T* pと書いただけだとoutなのかrefなのかやっぱりわからん…
0354デフォルトの名無しさん (ワッチョイ f680-IMbs)
垢版 |
2018/02/28(水) 22:38:47.40ID:ugxprRf80
&& は、Rust のmove の事。
所有権移転。移転元が空になる

基本的に数年は、ドワンゴ江添と共に、山ごもり!
江添が空海なら、漏れは最澄w

悟りを開くまで、空海・最澄の一問一答が、延々と続くw
0357デフォルトの名無しさん (ワッチョイ bfe7-s382)
垢版 |
2018/03/01(木) 07:05:17.46ID:/bb7E7Gp0
&&参照は「このオブジェクトもういらないからぶっ壊してもいいよ」というサイン
言うなれば肉屋へ行く馬車
野生のオブジェクトは誰に断る必要もないので勝手に連れてかれて解体される
家畜を渡す時は解体に同意するサイン(std::move())が必要
0358デフォルトの名無しさん (アウーイモ MM2b-wIew)
垢版 |
2018/03/01(木) 07:13:49.75ID:YKLxBKOvM
Fooクラスのunique_ptrがつまったvectorを作って、他クラスのメンバ変数にセットするときはどう渡すべき?
作った元ではもう使わないから所有権放棄していいとする

const参照渡しにして、渡された側でvectorの中身を全部std:move()して新しいvectorにつめるのが一番最初に思い浮かんだ
そんなことしなくても最近ここででてる、&&つけて渡してそのままセットすれば解決するのかな?
0360デフォルトの名無しさん (アウーイモ MM2b-wIew)
垢版 |
2018/03/01(木) 08:22:01.82ID:YKLxBKOvM
なるほどー
コードにするとこんな感じかな?

std::vector<std::unique_ptr>vec_hoge;

...

Hoge hoge;
hoge.setHoge(std:move(vec_hoge))


Hoge::setHoge(vector<unique_ptr>&& vec_hoge) {
this-> vec_hoge = vec_hoge;
}
0363デフォルトの名無しさん (アウーイモ MM2b-wIew)
垢版 |
2018/03/01(木) 10:38:08.68ID:YKLxBKOvM
ありがとう!勉強になりました
0365デフォルトの名無しさん (アウアウカー Sabb-5mf3)
垢版 |
2018/03/02(金) 07:10:33.20ID:GbvR6g/La
noexceptにtrue,falseがある理由については

#include <type_traits>

template<typename T>
void test(T t)noexcept(is_unsigned<T>){
//Tの型がunsignedの時だけは例外は投げない
}

こういう事が出来ると書いてあったけど、c++17以降も問題なく使えるだろうか?
0373デフォルトの名無しさん (マクド FFbb-x7J7)
垢版 |
2018/03/02(金) 22:27:40.22ID:3pZ6Fb9JF
visualstudio2017 でスタックトレースがしたいのですができません。
最初はBoost.StackTraceで試みたのですがMSVCでは行数やファイル名の出力が非対応で
アドレスまでしか取れませんでした。

次にWinAPIを使って解決させようとしたのですがこれもうまく行きません。
SymGetSymFromAddrを使うとどうやってもエラー126が帰ってきてしまいます。

以下のプログラムがVisualstudio2017で動作している人はいないでしょうか?
ttps://github.com/shive/blogpost/blob/master/20130918-stacktrace/main.cpp
0374デフォルトの名無しさん (ワッチョイ 7f95-A/Ur)
垢版 |
2018/03/02(金) 23:27:18.83ID:KYEHMUiK0
スタートレックと空目した
0375デフォルトの名無しさん (ワッチョイ 5f7e-m1UI)
垢版 |
2018/03/02(金) 23:40:43.96ID:vziGgrtU0
>>373
こうなった

---- BEGIN BACKTRACE ----
1 : 0x00e76873 : Project1 : mycode::foo : c:\users\\source\repos\project1\project1\main.cpp(116) :
backtrace();
2 : 0x00e76513 : Project1 : mycode::bar : c:\users\\source\repos\project1\project1\main.cpp(120) :
foo();
3 : 0x00e76563 : Project1 : mycode::baz : c:\users\\source\repos\project1\project1\main.cpp(124) :
bar();
4 : 0x00e76b33 : Project1 : mycode::hoge : c:\users\\source\repos\project1\project1\main.cpp(128) :
baz();
5 : 0x00e76f0d : Project1 : main : c:\users\\source\repos\project1\project1\main.cpp(134) : try {
6 : 0x00e7870e : Project1 : invoke_main : f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl(78) : ?
7 : 0x00e785b0 : Project1 : __scrt_common_main_seh : f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl(283) : ?
---- END BACKTRACE ----
0377373 (ワイモマー MMff-cxM0)
垢版 |
2018/03/03(土) 01:05:16.48ID:7bxI8Ps/M
>>375
プロジェクトの設定はdbghelp.libを追加しただけでしょうか?
あとWindows10ですか?7ですか?

>>376
自分もそれを読んでx86とx64両方試したのですがダメでした、、、
0379373 (マクド FFbb-x7J7)
垢版 |
2018/03/03(土) 07:43:32.07ID:MjEj/kk+F
>>378
自分はWindows7&VisualStudio2017なのですが
dbghelp.lib、dgbhelp.hを探すと以下の場所にあるのでWin10でしか対応していないのかなと…

C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\x86
C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\um

C:\Program Files (x86)\Windows Kitsの下には8.1と10
という名前のフォルダがあるのでOSの番号ぽいです。

dbghelp.dllならそこらじゅうにあるのでLoadModule関数で呼べばいけるのかも
0380373 (マクド FFbb-x7J7)
垢版 |
2018/03/03(土) 08:51:25.52ID:MjEj/kk+F
VisualStudio Installerで構成の変更をしようとすると
'Windows XP Support for C++'というのがあって
これがWindows7用のSDKらしいです。(どんな名前の付け方だ…)

これをインストールするとめでたくdbghelp.libとdbghelp.hが追加されるので
それでコンパイルしようとすると
#include <dbghelp.h>
とかくだけでコンパイルエラーになってしまいました。

エラー C2760 構文エラー: トークン '識別子' は予期されておらず、'型指定子' が予期されています scratch c:\program files (x86)\microsoft sdks\windows\v7.1a\include\objbase.h 239

Windows10を買うかVisualStudio2015をインストールするかしかないのかもしれません;;
0381デフォルトの名無しさん (ワッチョイ 8723-WWZl)
垢版 |
2018/03/03(土) 09:17:35.93ID:iGrPHQq30
>>380
Visual Studio 2017 スレの919あたりから話題になっているけど、
VS2017 の Windows 旧バージョンサポートはおかしいみたい。
2015と同じツールセット、SDKを用いても動作が違う。

2015をインストールするのがいい気がする。

参考
Visual Studio 2017 Part4 ・
http://mevius.5ch.net/test/read.cgi/tech/1509244956/

https://www.visualstudio.com/ja/vs/older-downloads/
0386デフォルトの名無しさん
垢版 |
2018/03/03(土) 12:49:02.99
sizeofが小数を返しちゃいけないって誰が決めたの?🙄
0387はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-m1UI)
垢版 |
2018/03/03(土) 13:15:05.21ID:uc6Z/AdW0
>>386
仕様。
C99 だと 7.17 に size_t は sizeof 演算子の結果の符号無し整数型って書いてある。
C++11 だと 5.3.3 に sizeof 演算子の返却値の型は size_t って書いてあって、
18.2 に size_t は符号無し整数型って書いてある。
0389はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-m1UI)
垢版 |
2018/03/03(土) 13:43:14.93ID:uc6Z/AdW0
どうせ汎整数昇格で int になることばかりなので、
アドレス単位以下の小さなオブジェクトにする意味なんてないよ。
大きな配列で扱いたいときは std::bitset が有るし。
0390デフォルトの名無しさん
垢版 |
2018/03/03(土) 14:56:24.32
>>387
ありがとう🤣
0393デフォルトの名無しさん (ワッチョイ df8f-obH6)
垢版 |
2018/03/03(土) 18:28:41.77ID:OIzMcqKj0
この板に書いてあることがほとんどわかっていないようなクソ素人ですみませんがちょっとお聞きしたいことがあります。
Windows 7でOpenCVをTDM-GCCにて動かしたいと思っているのですが、どなたかこの設定で動かされている方など居られますでしょうか?
もしくは素直にVisualStudioなど使ったほうが良いのでしょうか?
昨日からあれこれ試しているのですがまったく動かないです。
0394片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sdff-dixK)
垢版 |
2018/03/03(土) 19:01:36.20ID:ZgUZF4A1d
>>393
俺ならパッケージマネージャがあるMSYS2+MinGW使うよ。
パッケージマネージャがないTDM-GCCなら、まず、OpenCVをビルドして、リンクできるようにしないといけない。
まあ、めんどうくさい訳で。
0396デフォルトの名無しさん (ワッチョイ df8f-obH6)
垢版 |
2018/03/03(土) 20:12:29.49ID:OIzMcqKj0
片山様
レスありがとうございます。
そうですね、VSは重いという理由で避けていましたがやはりまずはちゃんと王道からやっていこうと思います。
慣れたらソースからビルドもしてみたいですが、まずはOpenCVであれこれしたいのでやりやすい環境で頑張りたいと思います。
ありがとうございました。
0399デフォルトの名無しさん (ワッチョイ 8723-WWZl)
垢版 |
2018/03/03(土) 21:37:46.21ID:iGrPHQq30
主に使ってるライブラリ/フレームワークに合わせれば?

何でもいいなら multibyte で utf-8 一択だろう
ucs2 (16bit) にしても ucs4 (32bit) にしてもどうせ
合字とかで1コードポイント1文字にならないから意味ないし
コンテナは string でも何でも好きなものを
0401デフォルトの名無しさん (ワッチョイ 5f7e-m1UI)
垢版 |
2018/03/03(土) 21:55:03.34ID:e0EB+SLu0
>>398
TCHARはcharとwchar_tをvisual studioのプロジェクトの設定で切り替えてtypedefしてる型だ
マイクロソフトのライブラリの一部

u16stringとu32stringはstd::basic_string<char16_t>とstd::basic_string<char32_t>のエイリアス
UTF-16とUTF-32の文字列を扱うクラスで標準ライブラリの一部

そもそもどっちかというものではない
std::basic_string<TCHAR>とか使ってもいい
0408デフォルトの名無しさん (ワッチョイ 4781-atej)
垢版 |
2018/03/03(土) 23:43:29.67ID:q1dNIabI0
utf8に統一したら、ロケールの切替って表示する文字列の言語を決める位の意味しか無いのではないかな
異なる言語の文字列でもそのまま字化けせずに表示出来た方が都合が良いように思うけど
0409はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-m1UI)
垢版 |
2018/03/04(日) 00:38:00.37ID:R9gQD4Ga0
Windows はもう 20 年以上前から Unicode 化はやってるんだってば。
UNICODE 版の API を正しく使う限り文字化けしない。
フォントの設定とかで化けることはあるかもしれんけど、
それも今はフォントリンクとかでおおよそ上手いこと処理してまうしな。

UNICODE 化できていない今までに作られたカスなアプリが消し去れないし、
カスなアプリのために ANSI 版の API (の挙動を制御するためのコードページの切替えの仕組み)
は残しておかなきゃならないけど、
Unicode への統一そのものは出来てるから満足するしかない。
っていう話ね。
0414デフォルトの名無しさん (ワッチョイ dfbd-lEE9)
垢版 |
2018/03/04(日) 01:15:23.20ID:BtVPmkEs0
だいたいwchar_tとかcharの倍容量を食うじゃん?
2が3になるとかならまだしも1が2になるというのは精神的にインパクトがデカイ
L"Hello World!"のバイナリをダンプしてみたらトラウマを抱え込むレヴェル
というのもあるし他環境とのソースコード共通化も視野に入れる場合やっぱマルチバイトしか…
0417デフォルトの名無しさん (ワッチョイ 8723-WWZl)
垢版 |
2018/03/04(日) 02:20:02.75ID:8pLLmBBd0
>>416
iOS / macOS / Windows / Java と多くのプラットフォームの
API で文字列としてUTF-16 が使われてるから割と使うけど、

近年多用される絵文字とかが全然1文字1符号にならんので
ロジックを基準する上ではUTF-8より便利ってわけでもない。
文字列の処理を描くときは合字以外は1文字1符号になるUCS4 の方が良い。
0423はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-m1UI)
垢版 |
2018/03/04(日) 03:02:39.39ID:R9gQD4Ga0
>>417
どうせイテレータでアクセスするから、合字はどうしようもないにしても
先頭からコードポイント単位で読む分にはどの符号化を使っててもあんまり変わらん気がするが。
0424デフォルトの名無しさん (ワッチョイ 8723-WWZl)
垢版 |
2018/03/04(日) 03:56:38.94ID:8pLLmBBd0
>>423
UTF-16 だとサロゲートペアが出てくるからマルチバイトがマルチワードになるだけ
ucs4 だとそれが要らなくて符合とコードポイントが1:1対応になるんだよ。

何年か前まではサロゲートペア?なにそれおいしいの?でも済んでたけど
今の時代それは無理だし
0425デフォルトの名無しさん (ワッチョイ 8723-WWZl)
垢版 |
2018/03/04(日) 04:09:09.92ID:8pLLmBBd0
要は
utf-8、utf-16 → 1符合 ≠ 1コードポイント ≠ 1文字
ucs4 → 1符合 = 1コードポイント ≠ 1文字
だから完全自作の文字列処理ではucs4が楽だよという意見でした
テキストなんてたいしてメモリ食わないしね
おしまい
■ このスレッドは過去ログ倉庫に格納されています

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