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
0290デフォルトの名無しさん (ワッチョイ 8abd-2pQG)
垢版 |
2018/02/25(日) 19:14:43.19ID:4jIr3vvu0
>>288
func()が常に1画面に収まって1万行の関数とかでありえないという根拠は

>>289
テンプレート定義時の引数に対して引数内容固有の命名が難しいのは
ハンガリアンに限ったことではないからハンガリアンに対する批判になんね

テンプレート批判論者には考える力がないのかね…
0292デフォルトの名無しさん (ワッチョイ df7f-x4Or)
垢版 |
2018/02/25(日) 19:29:08.16ID:s+qaK1zS0
テンプレートに対してはハンガリアンは全くの無力だよなあ
一貫性の観点からやっぱりハンガリアンは無い方がいいわ
0294デフォルトの名無しさん (ワッチョイ 0637-rG1w)
垢版 |
2018/02/25(日) 20:11:05.52ID:fbPK05Px0
そもそも関数が長い場合は型情報を持たすのもありだよな
システムハンガリアンをやめさせようとして先に関数を短くしなきゃだめだなと追う結論に至って放置した
0300デフォルトの名無しさん
垢版 |
2018/02/25(日) 23:57:37.89
>>299
dwをiに置換するだけだからリファクタリングが楽っていう意味?
0307デフォルトの名無しさん (ワッチョイ 8a05-x4Or)
垢版 |
2018/02/26(月) 04:56:46.87ID:lxlU26hn0
>>298
おまえは間違いなく1万行と書いた
その史実を誤魔化すことはできない

「ありえないという根拠は」という問いを反論として用いるのは
俺が「ありえない」と言った(事実と違うが)ことが
おまえが「ありうる」と思っているのと違ったからだろう

いずれにせよ「アホかおまえは」にふさわしいハチャメチャだな
0309デフォルトの名無しさん
垢版 |
2018/02/26(月) 08:09:57.39
>>307
史実とか言っちゃうのって。。。
0315デフォルトの名無しさん (スップ Sdc4-aBV2)
垢版 |
2018/02/26(月) 11:21:30.74ID:mt/mMzV6d
間違えると大変だからハンガリアンを使ってはならないんだよ
偽の情報に頼るんではなくて元を逐一確かめないと
0317デフォルトの名無しさん (ワッチョイ 520e-MTlB)
垢版 |
2018/02/26(月) 11:36:50.47ID:TvC1o7QC0
>>315
不一致が存在しない事が保証されてれば問題無いんやな
そういう事ならつまり変数宣言とプレフィックスが全て一致してるかチェックするスクリプトとかがあれば満足って事でええんか?
0318デフォルトの名無しさん (アウアウカー Sa11-2orQ)
垢版 |
2018/02/26(月) 11:38:09.46ID:n/n1Eejna
>>316
ポインタも必要に応じて使うけど、メモリ管理の煩雑さとミスの危険性を避けるために参照やスマートポインタやコンテナ、イテレータなど他に適切な物がある時はなるべくそちらを使うのが流儀かな。
0319デフォルトの名無しさん (ワッチョイ 8a05-x4Or)
垢版 |
2018/02/26(月) 11:51:17.55ID:lxlU26hn0
>>316
デフォ・・・まあ、そう言えなくもないか
参照でもポインタでもどっちでもいい用途には参照
ポインタでしかできないことはNULLに++や絶対番地指定
参照でしかできないことは一時オブジェクトやコピコン類
0322デフォルトの名無しさん (ワッチョイ df7f-x4Or)
垢版 |
2018/02/26(月) 12:21:09.58ID:W3q5coR10
グーグル規約だと書き込む引数は参照ではなくポインタにしろってなってる
でも標準ライブラリが普通に参照で書き込んでるので意味ないかなと思う
0327デフォルトの名無しさん (アウーイモ MM3a-QuQl)
垢版 |
2018/02/26(月) 18:25:47.85ID:aHz4HBvIM
ローカルで宣言したunique_ptrを他のメソッドに渡してデータをつめたいばあいってどういう引数で渡せば良いの?
unique_ptr<Hoge> ptr(new Hoge);
hogehoge(ptr);

Hogehoge::hoge(const unique_ptr<Hoge>& ptr){
ptr->aaa = 123;
}

これでいける?
なんかウェブサイトみてると&&二つとかあったりするの見かけて混乱してきた
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 が有るし。
■ このスレッドは過去ログ倉庫に格納されています

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