次スレを立てる時は本文の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
C++相談室 part134
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 5fcb-Q2eK)
2018/01/20(土) 09:05:42.21ID:mJKRg6iz096デフォルトの名無しさん (ワッチョイ 9fbd-CNA0)
2018/02/06(火) 22:09:42.68ID:MckGyr3K0 >>95は「論理的にmemcpy()で済むケース」では無いからちげう
97デフォルトの名無しさん (ワッチョイ ffd7-wbgk)
2018/02/06(火) 22:29:22.47ID:CtmFRYuD0 だから日本語でたのむって言っただろ
98デフォルトの名無しさん (ワッチョイ 9fbd-CNA0)
2018/02/06(火) 22:29:24.08ID:MckGyr3K0 どうした?
訂正はよ
訂正はよ
99デフォルトの名無しさん (ブーイモ MMcf-9NhG)
2018/02/06(火) 23:07:57.82ID:hdfY5rL3M 間違いを認めて・・・死んだのか?
100デフォルトの名無しさん (ワッチョイ 9fbd-CNA0)
2018/02/06(火) 23:21:41.18ID:MckGyr3K0 仕方ないので漏れが訂正するわ;
ttps://ideone.com/TZnGv4
↑のコードの
(*1)は「=default;」でデフォルトのコピコンの使用を明示
(*2)は手でmemcpy()でコピーするように書いたコピコン
次の条件で試したら(*1)も(*2)も同じコードになったわ
x86-64 gcc 7.2
-O2 -fno-strict-aliasing -std=c++14 -pedantic -Wall -Wextra
こことかで試せるが保存と公開方法がわからんかったのでideoneを使わせてもろうた
ttps://gcc.godbolt.org/
漏れの国語力ではようわからんが、さすがに多分>>84は間違いなんジャマイカ、
ttps://ideone.com/TZnGv4
↑のコードの
(*1)は「=default;」でデフォルトのコピコンの使用を明示
(*2)は手でmemcpy()でコピーするように書いたコピコン
次の条件で試したら(*1)も(*2)も同じコードになったわ
x86-64 gcc 7.2
-O2 -fno-strict-aliasing -std=c++14 -pedantic -Wall -Wextra
こことかで試せるが保存と公開方法がわからんかったのでideoneを使わせてもろうた
ttps://gcc.godbolt.org/
漏れの国語力ではようわからんが、さすがに多分>>84は間違いなんジャマイカ、
101デフォルトの名無しさん (ワッチョイ 9f34-FPX7)
2018/02/06(火) 23:34:18.80ID:Ur4dB7lv0 Cから来た連中ってどうしてmemcpyやmemset使いたがるんだろうな
102はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-wbgk)
2018/02/07(水) 04:09:18.59ID:OAPGz/K+0 >>76
reinterpret_cast でなければ通らないときはだいたい駄目なときやわ。
reinterpret_cast でなければ通らないときはだいたい駄目なときやわ。
103はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-wbgk)
2018/02/07(水) 04:22:37.75ID:OAPGz/K+0104デフォルトの名無しさん (ブーイモ MMcf-EKSC)
2018/02/07(水) 05:00:09.29ID:1UF8v8gcM 開始アドレス、終了アドレス、サイズが64bit等で割り切れれば
バイトコピーより早いコピーはあるだろうね
バイトコピーより早いコピーはあるだろうね
105デフォルトの名無しさん
2018/02/07(水) 07:27:28.65 頭のいいコンパイラなら勝手にベクトル処理とかしてくれるんじゃないの?
知らんけど
知らんけど
106デフォルトの名無しさん (ワッチョイ 57b3-wbgk)
2018/02/07(水) 22:28:51.20ID:MTpdY7NJ0 "!"!"!MOHYO!"!"!"2"
1.[[[HUn≒MUL=POSI≠MAHO+Set*HUGE=SAGE=LOGE=NOISIA=0≒1]]]
2-[[[[[[[E=RAT%2^10%SPELAn!%]&!TOWA&!PEG#!NOLNOL8!#!HYAGO!2#]1*2=1]U]S]0]O]!#PAL!
3--->PAGODOL7&!@17,2222734.15&[[[%%RENRAK6,9,99"^10"]#$11.2%}]KAIJ]{
41.2SSS = RALQI2.β{{{RA4,0,238^97,1,$.S.L.E.I.L."Q5352.15Q"JOL"5*3>>>41.3q}}}>1.2<0
.3φTALHOSI"0">>>105.10<1.235<1.2>51≠52===55.632>V="E=0.835"of"1.32","632",0.683,1.end
{
1.[[[HUn≒MUL=POSI≠MAHO+Set*HUGE=SAGE=LOGE=NOISIA=0≒1]]]
2-[[[[[[[E=RAT%2^10%SPELAn!%]&!TOWA&!PEG#!NOLNOL8!#!HYAGO!2#]1*2=1]U]S]0]O]!#PAL!
3--->PAGODOL7&!@17,2222734.15&[[[%%RENRAK6,9,99"^10"]#$11.2%}]KAIJ]{
41.2SSS = RALQI2.β{{{RA4,0,238^97,1,$.S.L.E.I.L."Q5352.15Q"JOL"5*3>>>41.3q}}}>1.2<0
.3φTALHOSI"0">>>105.10<1.235<1.2>51≠52===55.632>V="E=0.835"of"1.32","632",0.683,1.end
{
107片山博文MZ ◆T6xkBnTXz7B0 (スププ Sd62-d/x4)
2018/02/10(土) 19:52:35.19ID:x9I4Wn6Pd C++では、
int i;
for (i = 0; i < 9; ++i) { ... }
が、
for (int i = 0; i < 9; ++i) { ... }
って書けるのは知っているだろう。( )の中で、変数を宣言できる。
だが、ifやwhileの( )の中で、変数を宣言できることを知らない人は多い。
int i;
for (i = 0; i < 9; ++i) { ... }
が、
for (int i = 0; i < 9; ++i) { ... }
って書けるのは知っているだろう。( )の中で、変数を宣言できる。
だが、ifやwhileの( )の中で、変数を宣言できることを知らない人は多い。
108デフォルトの名無しさん (ワッチョイ 99b3-BC1W)
2018/02/11(日) 04:31:12.99ID:9irhhPDg0 C++17では
if ( auto v = n; conditions ) {
...
}
が可能になるし、これからは広がってくれるかのう
if ( auto v = n; conditions ) {
...
}
が可能になるし、これからは広がってくれるかのう
109デフォルトの名無しさん (ワッチョイ 2ee8-8oIi)
2018/02/11(日) 06:11:03.22ID:l3GMmVaq0 >>108
これホント待ち遠しい
これホント待ち遠しい
110デフォルトの名無しさん (ワッチョイ 4539-102K)
2018/02/11(日) 17:00:15.07ID:RGzNlubj0 それほど待ち遠しいか?
111デフォルトの名無しさん (ワッチョイ 99b3-7Au1)
2018/02/11(日) 17:27:44.93ID:QA9xO9uU0 待ち遠しくない
112デフォルトの名無しさん (ドコグロ MM0a-/0XS)
2018/02/11(日) 17:34:07.64ID:A61Ds/EIM for( ) の制御変数はそのループでしか使わないことが多いから意味あったけど、if( ) でそんなケースはまれだしなぁ
あれば使うけど待ち遠しいって言うほどじゃない気がする
あれば使うけど待ち遠しいって言うほどじゃない気がする
114デフォルトの名無しさん (ワッチョイ ed9b-gPIt)
2018/02/11(日) 17:40:12.67ID:KWDwqk940 一瞬意図が分からなかったが
()の中が;で区切れるという話?
()の中が;で区切れるという話?
115デフォルトの名無しさん (ブーイモ MMb6-ZT4h)
2018/02/11(日) 17:41:52.24ID:rD0gl3AiM dynamic_castとの組み合わせで使うとかどうよ
116デフォルトの名無しさん (ワッチョイ c27c-jA6l)
2018/02/11(日) 19:11:10.58ID:av7bQMHG0 結構あると思うけどね
if(DWORD err = GetLastError(); err != NO_ERROR)
この場合NO_ERRORが0だって分かってるから
if(DWORD err = GetLastError())
で済むから無意味だけど
if(DWORD err = GetLastError(); err != NO_ERROR)
この場合NO_ERRORが0だって分かってるから
if(DWORD err = GetLastError())
で済むから無意味だけど
117デフォルトの名無しさん (ワッチョイ 22f9-YiuZ)
2018/02/11(日) 19:17:28.82ID:yo2OB3cP0 >>116
前者の方が意図が明確だし意味はあると思う
前者の方が意図が明確だし意味はあると思う
118デフォルトの名無しさん
2018/02/11(日) 20:06:43.52 >>116
>if(DWORD err = GetLastError(); err != NO_ERROR)
普通こうやろ
if((DWORD err = GetLastError()) != NO_ERROR)
変数宣言は少しは意味あるかもしれんが(Perlと同じことができるってこと)
複文書けるのは特にメリット感じないわ
>if(DWORD err = GetLastError(); err != NO_ERROR)
普通こうやろ
if((DWORD err = GetLastError()) != NO_ERROR)
変数宣言は少しは意味あるかもしれんが(Perlと同じことができるってこと)
複文書けるのは特にメリット感じないわ
119デフォルトの名無しさん (ワッチョイ 86e7-zMUp)
2018/02/11(日) 20:41:29.80ID:Ag9E1Urq0 それ通らんよ
こうだろ
DWORD err;
if((err = GetLastError()) != NO_ERROR)
if内でしか使わないerrが外部に漏れてるのがよろしくないってこと
こうだろ
DWORD err;
if((err = GetLastError()) != NO_ERROR)
if内でしか使わないerrが外部に漏れてるのがよろしくないってこと
120デフォルトの名無しさん
2018/02/11(日) 20:56:03.30121デフォルトの名無しさん (ワッチョイ d27e-jA6l)
2018/02/11(日) 22:10:23.49ID:p+z832PL0 if(init ; expr)だと初期化と式が関連していなくてもいいので>>120とは違う構文になる
だからこんなのでもよい
if(int err = GetLastError(); hoge.aho())
lock_guardもしておける
if(std::lock_guard<std::mutex> lock(m); flag)
構造化束縛も使える
if(auto [a, b, c] = f(); b > c){ std::cout << "b > c" << std::endl; }
だからこんなのでもよい
if(int err = GetLastError(); hoge.aho())
lock_guardもしておける
if(std::lock_guard<std::mutex> lock(m); flag)
構造化束縛も使える
if(auto [a, b, c] = f(); b > c){ std::cout << "b > c" << std::endl; }
122デフォルトの名無しさん (ワッチョイ ddc3-saCW)
2018/02/12(月) 12:22:30.52ID:sATukCOa0 Cでは名前空間っていうのをすごい扱っていた気がするんだけどC++は名前空間扱うことってないの?
一つのアプリケーションも完成させたことがないど素人の質問ですまんが
一つのアプリケーションも完成させたことがないど素人の質問ですまんが
123デフォルトの名無しさん (ワッチョイ 62cb-ZT4h)
2018/02/12(月) 12:43:48.54ID:qekpeHDJ0 >>122
まずは"C"の入門書を読んで、何を見間違えたのかはっきりさせてからにしようか。
まずは"C"の入門書を読んで、何を見間違えたのかはっきりさせてからにしようか。
124デフォルトの名無しさん (ワッチョイ e1eb-IGFW)
2018/02/12(月) 14:08:57.84ID:sGdsmrZD0 初心者スレに池
125デフォルトの名無しさん (ワッチョイ 319f-R9JW)
2018/02/12(月) 20:44:41.93ID:gfcybQxo0 >>122
気のせい。
気のせい。
126デフォルトの名無しさん (ワッチョイ 6e8a-9Kvu)
2018/02/13(火) 00:10:36.10ID:YGwN9DGw0 >>122
Cにnamespaceは無いだろ
Cにnamespaceは無いだろ
127はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 066f-jA6l)
2018/02/13(火) 17:30:20.31ID:tUR5ZBgZ0 構造体タグと型名の名前空間が分かれているといったような意味での名前空間は C に有るが
C++ では構造体タグはそのまま型名としても使えるし、そういう意味での名前空間の話かな?
C++ では構造体タグはそのまま型名としても使えるし、そういう意味での名前空間の話かな?
128デフォルトの名無しさん (ワッチョイ c26e-jA6l)
2018/02/13(火) 17:45:08.06ID:a1RYP/Gm0 こんな名前空間もあるね
int x;
int main(void)
{
x = 1;
int x;
x = 2;
{
int x;
x = 3;
}
return 0;
}
int x;
int main(void)
{
x = 1;
int x;
x = 2;
{
int x;
x = 3;
}
return 0;
}
129デフォルトの名無しさん (ブーイモ MM6d-ZT4h)
2018/02/13(火) 17:55:17.58ID:Xr6xvVy+M それはスコープでは
130デフォルトの名無しさん (ワッチョイ c26e-jA6l)
2018/02/13(火) 18:15:03.36ID:a1RYP/Gm0 変数だよ
代入でもあるね
代入でもあるね
131デフォルトの名無しさん (ワッチョイ d27e-jA6l)
2018/02/13(火) 20:09:02.02ID:NNOtJgpO0 謎すぎワロタがそこから上のスコープのxを参照してくれ
132デフォルトの名無しさん (ラクッペ MM61-cyyJ)
2018/02/13(火) 20:19:22.41ID:Za/EZbH7M ブロックって言ってる
133デフォルトの名無しさん (ワッチョイ c26e-jA6l)
2018/02/13(火) 21:49:01.90ID:a1RYP/Gm0 アホばっかり
がっかり
がっかり
134デフォルトの名無しさん (ワッチョイ 9f23-TT3E)
2018/02/15(木) 12:08:37.28ID:Sgd3BwBT0 std::mapのように文字列や構造体をキーにした高速アクセスができて、
要素の数が一定数を超えたらLRU形式で勝手に削除してくれる、
キャッシュのような機能を実装したいのだけど、
C++でそのような仕組みを作れるクラスはないですか?
要素の数が一定数を超えたらLRU形式で勝手に削除してくれる、
キャッシュのような機能を実装したいのだけど、
C++でそのような仕組みを作れるクラスはないですか?
135デフォルトの名無しさん (ワッチョイ 378a-TkRA)
2018/02/15(木) 17:00:44.45ID:GbCJk+7h0 自分で実装するならどうにでもなるだろ
そのための道具は全て標準で揃っている
そのための道具は全て標準で揃っている
136デフォルトの名無しさん (ワッチョイ ff8a-NmL4)
2018/02/15(木) 18:15:51.96ID:6url8MQd0 バックグラウンドならスレッド使うしかないんじゃないかな
137デフォルトの名無しさん (ブーイモ MMbf-4Nx+)
2018/02/15(木) 19:13:27.39ID:CSnzpiZpM C++のプログラマーって性格ねじ曲がってるなあ
初めてGo応援したくなったわ
初めてGo応援したくなったわ
138デフォルトの名無しさん (ワッチョイ 9f60-qi38)
2018/02/15(木) 19:34:35.63ID:95vLe5Bi0 >>137
どんな点が、性格悪い、と思わせるのですか?
どんな点が、性格悪い、と思わせるのですか?
139デフォルトの名無しさん (ワッチョイ d7eb-1VRC)
2018/02/15(木) 20:03:21.73ID:qihnyYvs0 それだよそれ
140デフォルトの名無しさん (ワッチョイ 9fbd-RFe/)
2018/02/15(木) 21:14:35.68ID:MoAPifjS0 C++は多分チューリング完全だと思う
141デフォルトの名無しさん (ドコグロ MMdf-dLOu)
2018/02/15(木) 21:20:32.50ID:6nYos/bmM >>136
要素数が閾値を超えるのは要素が追加される時だからその時に古い奴を削除すりゃいいだけじゃね?
要素数が閾値を超えるのは要素が追加される時だからその時に古い奴を削除すりゃいいだけじゃね?
142デフォルトの名無しさん (ブーイモ MM1b-goL+)
2018/02/15(木) 23:50:52.95ID:fG1U9Z3qM >>135
簡単で良いのでサンプルコード書いてもらえませんか?
簡単で良いのでサンプルコード書いてもらえませんか?
143デフォルトの名無しさん (ワッチョイ 9fa8-yZIn)
2018/02/16(金) 00:43:14.82ID:uaG+5sVQ0 >>135じゃないけどシンプルにいくなら
{
map<key,value> data; // 本来のデータ
map<key,list<key>::iterator> lruindex; //
list<key> lrulist; // LRUリスト
... // mapと同じインターフェイス
}
みたいなクラスで要素の追加・削除・参照とかの時にLRUリスト見て処理すればいい
{
map<key,value> data; // 本来のデータ
map<key,list<key>::iterator> lruindex; //
list<key> lrulist; // LRUリスト
... // mapと同じインターフェイス
}
みたいなクラスで要素の追加・削除・参照とかの時にLRUリスト見て処理すればいい
144デフォルトの名無しさん (ワッチョイ ff80-Pey1)
2018/02/16(金) 03:16:29.76ID:DpsRPWWQ0 辞書・線形リスト・2分木を、組み合わせる。Ruby で書くと、
class LRU_hash
def initialize (max_size = 3)
# ary は、hash に追加・アクセスした順
@hash = {}; @ary = []
@max_size = max_size
end
def push (key)
if @hash.has_key? key
# 一旦、要素を削除してから、最後尾に追加しなおす
@ary.delete key
else
if @max_size == @hash.size
# 先頭要素を削除してから、最後尾に追加する
@hash.delete(@ary.shift)
end
@hash[key] = true
end
@ary.push key
end
def print_buf
puts @ary.join ', '
end
end
ary = ["あ", "a", "あ", "い", "b", "あ", "c"]
hash = LRU_hash.new 4
ary.map { |key| hash.push key }
hash.print_buf #=> い, b, あ, c
class LRU_hash
def initialize (max_size = 3)
# ary は、hash に追加・アクセスした順
@hash = {}; @ary = []
@max_size = max_size
end
def push (key)
if @hash.has_key? key
# 一旦、要素を削除してから、最後尾に追加しなおす
@ary.delete key
else
if @max_size == @hash.size
# 先頭要素を削除してから、最後尾に追加する
@hash.delete(@ary.shift)
end
@hash[key] = true
end
@ary.push key
end
def print_buf
puts @ary.join ', '
end
end
ary = ["あ", "a", "あ", "い", "b", "あ", "c"]
hash = LRU_hash.new 4
ary.map { |key| hash.push key }
hash.print_buf #=> い, b, あ, c
145デフォルトの名無しさん
2018/02/16(金) 04:31:51.17146デフォルトの名無しさん (ワッチョイ d7e3-2H/C)
2018/02/16(金) 06:27:04.53ID:HICjIKnm0 プログラムを作っていて困っています。
プログラム動作環境、windows 7 x86_x64
プロセスをExplorerを親として、
起動したプロセスにファイルの存在するディレクトリを作業ディレクトリとして
割り当てたい。
ただし、プロセスへのアタッチによる変更は禁止とする。
ようするにファイルをダブルクリックして起動するのと同じ状況を再現したいのです。
例
C:\hoge\fuga.exe
[現状]
Explorer C:\hoge\fuga.exe
親
explorer.exe
カレントディレクトリ
C:\Windows\System32\
[理想]
Explorer C:\hoge\fuga.exe
親
explorer.exe
カレントディレクトリ
C:\hoge\
プログラム動作環境、windows 7 x86_x64
プロセスをExplorerを親として、
起動したプロセスにファイルの存在するディレクトリを作業ディレクトリとして
割り当てたい。
ただし、プロセスへのアタッチによる変更は禁止とする。
ようするにファイルをダブルクリックして起動するのと同じ状況を再現したいのです。
例
C:\hoge\fuga.exe
[現状]
Explorer C:\hoge\fuga.exe
親
explorer.exe
カレントディレクトリ
C:\Windows\System32\
[理想]
Explorer C:\hoge\fuga.exe
親
explorer.exe
カレントディレクトリ
C:\hoge\
147144 (ワッチョイ ff80-Pey1)
2018/02/16(金) 07:56:00.35ID:DpsRPWWQ0148デフォルトの名無しさん (ワッチョイ 57fc-T3WU)
2018/02/16(金) 08:03:01.53ID:TOIQut300 >>146
explorer.exeへのショートカットを作ってプロパティで作業ディレクトリを指定するか、
COMでIShellLink::SetWorkingDirectoryを使って同じことをするあたりか?
explorer.exeへのショートカットを作ってプロパティで作業ディレクトリを指定するか、
COMでIShellLink::SetWorkingDirectoryを使って同じことをするあたりか?
149134 (ワッチョイ 9f23-TT3E)
2018/02/16(金) 09:56:21.20ID:+b2iJMK40 みなさんありがとうございます。
std::mapにLRUや最大要素数の仕組みを持たせた派生クラスでも
無いかと思ったのですが、標準ではやっぱり無いですか。
>>143のように、std::mapをメンバの一つに持たせた独自クラスを
一から作っていくことになるんですかね。
std::mapにLRUや最大要素数の仕組みを持たせた派生クラスでも
無いかと思ったのですが、標準ではやっぱり無いですか。
>>143のように、std::mapをメンバの一つに持たせた独自クラスを
一から作っていくことになるんですかね。
150デフォルトの名無しさん (ワッチョイ 9f12-pjg9)
2018/02/16(金) 10:11:55.71ID:JoalkiMd0 amazonランキングの謎を解く とか言う本でmove-to-frontを見た
本の紹介「Amazonランキングの謎を解く」
http://www.kenkyuu.net/whatsnew/2011/08/book2011-08-01.html
>「move-to-front規則」(最後に売れた順に並べる、つまり、注文のたびに1位にジャンプする)
Move To Front - Wikipedia
https://ja.wikipedia.org/wiki/Move_To_Front
本の紹介「Amazonランキングの謎を解く」
http://www.kenkyuu.net/whatsnew/2011/08/book2011-08-01.html
>「move-to-front規則」(最後に売れた順に並べる、つまり、注文のたびに1位にジャンプする)
Move To Front - Wikipedia
https://ja.wikipedia.org/wiki/Move_To_Front
151デフォルトの名無しさん (ワッチョイ 57fc-T3WU)
2018/02/16(金) 10:54:10.09ID:TOIQut300 ageだね
152デフォルトの名無しさん (ワッチョイ 378a-TkRA)
2018/02/16(金) 14:25:37.67ID:UjPhOEUu0153デフォルトの名無しさん (ブーイモ MM3b-mhGK)
2018/02/16(金) 18:05:58.99ID:GGXfeEqkM 江添さんのC++17本予約しようかな
154デフォルトの名無しさん (ワッチョイ 1f7e-T3WU)
2018/02/16(金) 18:26:06.12ID:waI0am5S0 予約しなくても売れ残るからいつでも買える
155デフォルトの名無しさん (アウアウカー Sa6b-s4hu)
2018/02/16(金) 20:04:35.13ID:1Lr9lxEpa C++を勉強しようと思ってる者ですが書籍を探しております。Cはある程度書けるのでそれを前提とした書籍が欲しいです
156デフォルトの名無しさん (ワッチョイ bf0e-qi38)
2018/02/16(金) 20:33:50.33ID:Rc+MuzY40 C++ クイック入門&リファレンス
プログラミング言語C++ 第4版
プログラミング言語C++ 第4版
157デフォルトの名無しさん (ワッチョイ 9f60-qi38)
2018/02/16(金) 20:36:34.10ID:9b60nRDg0 >>155
C++11 以前だが accelerated c++, ここでフォローするよ
C++11 以前だが accelerated c++, ここでフォローするよ
158デフォルトの名無しさん (ワッチョイ 57fc-T3WU)
2018/02/16(金) 20:37:11.23ID:TOIQut300 禿4は俺も推奨する
C++11の良本だ
C++11の良本だ
159デフォルトの名無しさん (アウアウカー Sa6b-s4hu)
2018/02/16(金) 21:09:12.34ID:+EaaPhKWa めっちゃ高いけどその価値あるのね
160デフォルトの名無しさん (ブーイモ MMbf-zxnT)
2018/02/16(金) 21:46:03.21ID:5AmFsIq1M161デフォルトの名無しさん (ワッチョイ 9f4c-C9DI)
2018/02/16(金) 22:03:34.89ID:qDhjnryl0 誰がハゲやねん
162デフォルトの名無しさん (マクド FF6b-xgEu)
2018/02/17(土) 09:43:48.64ID:Lqib7/b9F 以下のようにconst char*型の文字列でchar*型の変数を初期化したいときに
strcpyやstrlenを書かずにstd::stringを利用して短くかけないかと思うのですが
msvcだとエラーにならず、clang, gccだとdeleteでセグメンテーション違反になります。
どうすればより良い感じになるでしょうか?const_castはできれば使いたくないです。
#include <string.h>
#include <string>
#include <iostream>
int main()
{
const char* asdf = "asdf";
// char* psz2 = new char[strlen(asdf)+1];
// strcpy(psz2, asdf);
std::string *psz = new std::string(asdf);
char* psz2 = &(*psz)[0];
std::cout << psz2 << std::endl;
delete psz2;
return 0;
}
strcpyやstrlenを書かずにstd::stringを利用して短くかけないかと思うのですが
msvcだとエラーにならず、clang, gccだとdeleteでセグメンテーション違反になります。
どうすればより良い感じになるでしょうか?const_castはできれば使いたくないです。
#include <string.h>
#include <string>
#include <iostream>
int main()
{
const char* asdf = "asdf";
// char* psz2 = new char[strlen(asdf)+1];
// strcpy(psz2, asdf);
std::string *psz = new std::string(asdf);
char* psz2 = &(*psz)[0];
std::cout << psz2 << std::endl;
delete psz2;
return 0;
}
163デフォルトの名無しさん (ワッチョイ 378a-TkRA)
2018/02/17(土) 09:51:35.08ID:mykV+fTk0 delete psz2なんてしちゃだめconst関係ない
164デフォルトの名無しさん (ワッチョイ 1f7e-T3WU)
2018/02/17(土) 10:21:38.22ID:4SqFrjwY0 何故stringそのものじゃなくて内部データをdeleteしようと思ったのか
newで確保した配列じゃないからdeleteはできない
stringの内部データは静的な配列と動的な配列を組み合わせて表現されている
mscvの場合先頭16文字はchar[16]でそれ以降は動的な配列に入るようになっている
psz[0]のアドレスはchar[16]の先頭アドレスなので当然deleteできない
msvcはdeleteに失敗しても落ちないのかな
newで確保した配列じゃないからdeleteはできない
stringの内部データは静的な配列と動的な配列を組み合わせて表現されている
mscvの場合先頭16文字はchar[16]でそれ以降は動的な配列に入るようになっている
psz[0]のアドレスはchar[16]の先頭アドレスなので当然deleteできない
msvcはdeleteに失敗しても落ちないのかな
165デフォルトの名無しさん (ワッチョイ ff80-Pey1)
2018/02/17(土) 10:47:53.57ID:IU1gsQgu0166デフォルトの名無しさん (ワッチョイ 9fcb-8YMj)
2018/02/17(土) 11:22:13.08ID:++v6vSjK0 ハンガリー人まだ絶滅してないのか。
stringはnull terminatedでないからpszはおかしい。
psz2もnull terminatedの保証がないからc_strを使うべき。
うまくいったらstrdupも調べとこうな。
stringはnull terminatedでないからpszはおかしい。
psz2もnull terminatedの保証がないからc_strを使うべき。
うまくいったらstrdupも調べとこうな。
167デフォルトの名無しさん (ワッチョイ d793-MfWd)
2018/02/17(土) 11:25:45.81ID:szUqPRvW0 >>162
char* psz2 = &(*psz)[0]; って
char* psz2 = psz->c_str(); と同じなのかな?
いずれにせよ delete psz; は出来る(するべき?)だけど、
delete psz2; は出来ないんじゃないかな。
char* psz2 = &(*psz)[0]; って
char* psz2 = psz->c_str(); と同じなのかな?
いずれにせよ delete psz; は出来る(するべき?)だけど、
delete psz2; は出来ないんじゃないかな。
168デフォルトの名無しさん (ワッチョイ 378a-TkRA)
2018/02/17(土) 11:30:29.43ID:mykV+fTk0 必要ないところでnew/delete使う人は根本からして何も分かってない
169デフォルトの名無しさん (ワッチョイ ff8a-NmL4)
2018/02/17(土) 15:18:23.73ID:YAgvIyFy0170デフォルトの名無しさん (ワッチョイ bf0e-qi38)
2018/02/17(土) 16:50:38.35ID:Q4Uv6cZz0 >>162
弁護士の唐沢です
しっかり「char* const」と「const char*」の違いを認識しなさい
const char*は参照先の定数を変更しない事を保証する宣言であり、char*は参照先の定数を変更できる為、const char*で保持するアドレスをchar*にコピーする事は言語仕様により禁止されています。それは分かるよね?
最初に宣言したポインタを間違えて別アドレスで上書きしないようにconstで固定したいのなら、char* constを使うようにしましょう。とりあえずとりいそぎ
弁護士の唐沢です
しっかり「char* const」と「const char*」の違いを認識しなさい
const char*は参照先の定数を変更しない事を保証する宣言であり、char*は参照先の定数を変更できる為、const char*で保持するアドレスをchar*にコピーする事は言語仕様により禁止されています。それは分かるよね?
最初に宣言したポインタを間違えて別アドレスで上書きしないようにconstで固定したいのなら、char* constを使うようにしましょう。とりあえずとりいそぎ
171デフォルトの名無しさん (ワッチョイ 9fe1-/1mG)
2018/02/17(土) 17:22:58.60ID:0j+aLKWi0 >>162
strdupという手があるが何がしたいのか今一つ分からない
const char* asdf = "asdf";
char *p = strdup(asdf);
std::cout << p << std::endl;
delete p;
strdupという手があるが何がしたいのか今一つ分からない
const char* asdf = "asdf";
char *p = strdup(asdf);
std::cout << p << std::endl;
delete p;
172デフォルトの名無しさん (ブーイモ MM3b-zxnT)
2018/02/17(土) 17:31:15.32ID:CLg9GPlRM >>170
それ誰に指摘してんの?とりいそぎ。
それ誰に指摘してんの?とりいそぎ。
173デフォルトの名無しさん (ワッチョイ 1f7e-T3WU)
2018/02/17(土) 17:34:22.09ID:4SqFrjwY0 >>167
データは連続しているので同じになる
16文字まではスタックを使い、それ以上の長さになるとヒープにコピーされる
実装ではメンバの配列には何かしらのエスケープ文字が入る
ちなみにmsvcでは実装の都合上free(&str[0])で強引に解放できる
データは連続しているので同じになる
16文字まではスタックを使い、それ以上の長さになるとヒープにコピーされる
実装ではメンバの配列には何かしらのエスケープ文字が入る
ちなみにmsvcでは実装の都合上free(&str[0])で強引に解放できる
174173 (ワッチョイ 1f7e-T3WU)
2018/02/17(土) 17:49:08.26ID:4SqFrjwY0 補足
スタックとヒープを使い分けるかどうかは実装依存
gcc、clang、msvcでは行われている
したがって短い文字列でnewを避けるためにstringを使わないというのは意味が無い
スタックとヒープを使い分けるかどうかは実装依存
gcc、clang、msvcでは行われている
したがって短い文字列でnewを避けるためにstringを使わないというのは意味が無い
175デフォルトの名無しさん
2018/02/17(土) 18:06:03.81 >>171
strdupで確保した領域をfreeでなくdeleteするのは正しいの?
strdupで確保した領域をfreeでなくdeleteするのは正しいの?
176デフォルトの名無しさん (ワッチョイ 5781-qput)
2018/02/17(土) 18:09:26.31ID:Lp1rq1Kt0 良いみたいだ
中でmallocで確保している
中でmallocで確保している
177デフォルトの名無しさん (ワッチョイ 5781-qput)
2018/02/17(土) 18:10:04.88ID:Lp1rq1Kt0 違う、freeで開放する
178デフォルトの名無しさん (ワッチョイ bf0e-qi38)
2018/02/17(土) 18:14:21.37ID:Q4Uv6cZz0179デフォルトの名無しさん (ワッチョイ 9fb3-dLOu)
2018/02/17(土) 18:18:24.62ID:DOQJ47ER0 昔から気になってるんだが「解放」だよね...
180デフォルトの名無しさん (ワッチョイ 5781-qput)
2018/02/17(土) 18:25:00.27ID:Lp1rq1Kt0 そうでした、ごめんね
181デフォルトの名無しさん (ワッチョイ 9f5a-T3WU)
2018/02/17(土) 18:25:45.10ID:JVoP/9zU0182はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-T3WU)
2018/02/17(土) 18:45:39.74ID:uBckbaXI0 >>162
ぶっちゃけた話、 strcpy が一番短いと思う。
ぶっちゃけた話、 strcpy が一番短いと思う。
183デフォルトの名無しさん
2018/02/17(土) 18:59:50.35 >>182
strdup という答えが出てるのに何言ってるの?
strdup という答えが出てるのに何言ってるの?
184はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-T3WU)
2018/02/17(土) 19:05:58.96ID:uBckbaXI0185デフォルトの名無しさん (ワッチョイ 9fbd-RFe/)
2018/02/17(土) 19:07:20.59ID:u7LZaTzx0 >>166
接頭辞を見ればデータ内容の属性がワカルというメリットは他に代え難い
ttp://local.joelonsoftware.com/wiki/間違ったコードは間違って見えるようにする
あといちいちthis->xと書くよりも、すすんでm_xと書きましょう
接頭辞を見ればデータ内容の属性がワカルというメリットは他に代え難い
ttp://local.joelonsoftware.com/wiki/間違ったコードは間違って見えるようにする
あといちいちthis->xと書くよりも、すすんでm_xと書きましょう
186デフォルトの名無しさん (ワッチョイ 9fbd-RFe/)
2018/02/17(土) 19:21:01.63ID:u7LZaTzx0 strdup()だと明示的に開放コードをどっかに書かなくてはならなくて必ず忘れるので
せっかくC++なのでスマポ的にwrapすると良いと思う
せっかくC++なのでスマポ的にwrapすると良いと思う
187デフォルトの名無しさん (ワッチョイ 9f5a-T3WU)
2018/02/17(土) 19:37:41.81ID:JVoP/9zU0 ホワイトボックスなCでは許せるが
ブラックボックスなC++の流儀には全く合わない
それがstrdup
ブラックボックスなC++の流儀には全く合わない
それがstrdup
188167 (ワッチョイ d793-MfWd)
2018/02/17(土) 19:53:11.68ID:szUqPRvW0 >>173-174 教えてくれてありがとう。
返されるアドレスは等しい値なのか、という単純な質問だったんだけど、
読み直してみたら分かりにくい質問文だと思っていた次第。
それにしても &(*psz)[0] って結構ややこしいのね。
オーバーロードされた[]演算子が返すcharへの参照、
に対してアドレス演算子&を作用させた結果、て感じかな。
返されるアドレスは等しい値なのか、という単純な質問だったんだけど、
読み直してみたら分かりにくい質問文だと思っていた次第。
それにしても &(*psz)[0] って結構ややこしいのね。
オーバーロードされた[]演算子が返すcharへの参照、
に対してアドレス演算子&を作用させた結果、て感じかな。
189162 (ワイモマー MMbf-xgEu)
2018/02/17(土) 20:37:30.76ID:uaRb1j8RM すみません、たくさんレスありがとうございます。
_strdupにしてみたら期待の動作ができました。
ありがとうございました。
_strdupにしてみたら期待の動作ができました。
ありがとうございました。
190162 (ワイモマー MMbf-xgEu)
2018/02/17(土) 21:27:34.68ID:uaRb1j8RM また質問してすみません。
msvc(vs2017)だとコンパイラをC++17にしても以下のプログラムで
C2664 'void (T *&)': 引数 1 を 'hoge *' から 'hoge *&' へ変換できません。
となってしまうのですが、コードにバグが有るでしょうか?msvcのバグでしょうか?
GCCやClangではコンパイルできます。
#include <memory>
struct hoge {};
template <class T>
inline void safe_delete(T*& p) {
if (p) {
delete p;
p = nullptr;
}
}
int main() {
std::unique_ptr<hoge, decltype(&safe_delete<hoge>)> sp{new hoge(), safe_delete<hoge>};
return 0;
}
msvc(vs2017)だとコンパイラをC++17にしても以下のプログラムで
C2664 'void (T *&)': 引数 1 を 'hoge *' から 'hoge *&' へ変換できません。
となってしまうのですが、コードにバグが有るでしょうか?msvcのバグでしょうか?
GCCやClangではコンパイルできます。
#include <memory>
struct hoge {};
template <class T>
inline void safe_delete(T*& p) {
if (p) {
delete p;
p = nullptr;
}
}
int main() {
std::unique_ptr<hoge, decltype(&safe_delete<hoge>)> sp{new hoge(), safe_delete<hoge>};
return 0;
}
191デフォルトの名無しさん (ワッチョイ ff80-Pey1)
2018/02/17(土) 22:11:53.16ID:IU1gsQgu0 (T *&)
そもそも、ポインタ・参照を、同時に使えるのか?
そもそも、ポインタ・参照を、同時に使えるのか?
192片山博文MZ ◆T6xkBnTXz7B0 (スププ Sdbf-ZgEC)
2018/02/17(土) 22:23:52.63ID:EwTJGG8Pd new hoge()は変数じゃないから、代入できない。
>>165
独習C++ はいいですね、特に演習問題「std::stringを再実装する」を絶賛します
これが書けるようになったらC++初級者をかたってもいいかもしれない、もしかすると解答は載ってなかったかもしれないけれども
独習C++ はいいですね、特に演習問題「std::stringを再実装する」を絶賛します
これが書けるようになったらC++初級者をかたってもいいかもしれない、もしかすると解答は載ってなかったかもしれないけれども
194デフォルトの名無しさん (ワッチョイ 9fcb-zxnT)
2018/02/17(土) 22:35:58.70ID:++v6vSjK0■ このスレッドは過去ログ倉庫に格納されています
ニュース
- パワフル女性世界3位に高市首相 米誌フォーブス選出 [蚤の市★]
- テレ朝本社から社外スタッフの男性が転落し死亡 テレビ朝日がコメント [ひかり★]
- 【米FRB】0.25%利下げ決定 3会合連続、雇用下支え [蚤の市★]
- アイヌ民族の「戸籍簿」がヤフオクで落札 団体「人権無視」と憤り [蚤の市★]
- 【S.RIDE】「忘年会の幹事ずるい」 ソニー系配車アプリの広告が物議…… 運営が謝罪「配慮に欠ける不適切な表現」掲出終了に [ぐれ★]
- 【維新→自民党・旧安倍派】元衆院議員の妻を逮捕、コロナ補助金5000万円詐取疑い 名古屋地検 [ぐれ★]
- スーパーで売ってる鍋出汁で最強なのって結局
- 【画像】東京都民「助けて!満員電車もう無理いいぃぃいいぃぃぃいいいいいぃ😭」!!!! [732289945]
- 【堂上隼人】ソフトバンク幹部「よし更生してる」→現在までに逮捕12回、レイプ被害者15人
- 【悲報】教育ママ「ギャオオオオオン!息子が大麻吸ってるのお!!」⇨中3の息子を警察に突き出し全てを終わらせる [455031798]
- 【誰食】おせち料理で確実にゴミ箱行きになる食材1位、「黒豆」 [748563222]
- ミラブルシャワーヘッド買ったった
