C++相談室 part145

レス数が1000を超えています。これ以上書き込みはできません。
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/11/04(月) 22:58:08.77ID:7wrIz40y
>>916
バカなの?
ちょっとサイズ変更されたら使えない
かと言ってどんだけ余裕持てばいいかは未来予知能力でもないと無理
要するに常人には使いどころがないってことな
2019/11/04(月) 23:05:23.77ID:J+RS26ji
>>915
C++の用途として可能な限りオーバーヘッドをゼロとすることが要求されるケースがあるのは当然の話であるが、別に議論に参加するものがそういう物を作っている必要性はないだろうに、何でこだわってるんだ?
2019/11/04(月) 23:12:26.97ID:TNJ/Yj6e
>>917
だから手間がかかると言ってるわけ
やる気になれば自動化できるスクリプトは作れるだろうけどね
バカと思うかもしれないけどreserveフィールドでバイナリ互換を保つってのは実際やるんだよ
未来を予測できないのはそのとおり
適当に決める
まぁお前の知らない世界の話だから気にするな
2019/11/04(月) 23:25:59.73ID:DlV1X8tk
外部からはデストラクタもコピーコンストラクタも動かせないのにあえてインラインにする
理由がよくわからないな。
よっぽど特殊でピンポイントな要件なのかもしれないが。
2019/11/05(火) 01:47:52.32ID:8w7ODMFL
placement new を使った
char* ptr = (char *)malloc(sizeof(CPerson));
CPerson *pPerson = new(ptr) CPerson;
という書き方、実は、「コンストラクタの明示的呼び出し」なるものを使って、
CPerson *pPerson = (CPerson *)malloc(sizeof(CPerson));
pPerson->CPerson::CPerson();  // コンストラクタの明示的呼び出し
と書くことも出来るらしいことを最近知った。
2019/11/05(火) 06:17:56.31ID:cY6SY5gz
ああそうそれは良かったね〜
2019/11/05(火) 07:19:41.62ID:UkGDCuYx
>>919
手間の問題じゃないよ
せっかく変更に強くするためにやってるのに
> 適当がいやなら同じサイズにすりゃいいじゃん
なんてやったら本末転倒だろ

> やる気になれば自動化できるスクリプトは作れるだろうけどね
未来予知機能付きのスクリプトができたらいいねw

> バカと思うかもしれないけどreserveフィールドでバイナリ互換を保つってのは実際やるんだよ
ああ、昔のコボラー爺の発想ねw
ファイルとか通信とかで外部とやり取りするようなものだと今でも普通にあるけどメモリーレイアウトでやるのは流石に悪手でしかない

> まぁお前の知らない世界の話だから気にするな
時代遅れのお前の妄想に閉じ込めといてくれw
2019/11/05(火) 07:51:55.68ID:rlbxGVpf
>>780
cygwinで配布してるwxwidgitはgcc3時代のabiでバイナリ作られてるが当然gcc8でもabiオプションで変えてリンクできる
2019/11/05(火) 07:55:46.59ID:Cze7w/ei
>>921 何を見て「出来るらしい」と言ってるのかな?
2019/11/05(火) 08:36:03.93ID:g61EG+/r
解放も自前でやるんなら別にいんじゃね?
2019/11/05(火) 08:47:49.22ID:wVD+ILW8
>>819
pimplが理想だなんて頓珍漢なレスで
ひっ絡んで来たのそっちだろうが
何がそういう返しだ
冗談は顔だけにしろ奇形チンパンジーめ
2019/11/05(火) 12:36:38.02ID:UkGDCuYx
>>927
まさかと思うが
> 目指す理想がpimpl?
って理想がpimplって言ってるとでも思ったのか?
デザインパターンの前に日本語の勉強しろよw
2019/11/05(火) 12:48:20.10ID:XPYDDbPn
日本人じゃないんじゃない?
2019/11/05(火) 16:03:35.45ID:wVD+ILW8
>>928
安心しろ
あからさまにラリッてる廃人の戯言など
どうとも取ってねえよ
そんな価値があるとでも思っているなら
とんだナルシストだw
2019/11/05(火) 17:28:48.96ID:X2+zjlng
>>923
pimplの目的が変更に強いことってはお前の見方にすぎない
コンパイル時に検知できるんだから特別手間ではないし、
呼び出しコストを下げる目的は達している
技術的な話したいなら物事をフェアに見ような
2019/11/05(火) 18:57:55.00ID:lmPmis8+
手間はあるけど(俺は)手間だと感じないだから、変更に強いとは思わない

って言ってるの?
2019/11/05(火) 19:21:00.26ID:X2+zjlng
>>894
2019/11/05(火) 19:48:59.34ID:C6JaWlq+
実装側のサイズが想定をオーバーしたら互換性無くなって再コンパイルになるんでしょ
それが許容される環境ならインターフェース切る意味が薄れるんじゃないの?

まぁ実際はオーバーしないようにするんだろうけど
2019/11/05(火) 19:52:57.91ID:UkGDCuYx
>>930
どうとも取ってないのに顔真っ赤にしてレスするとか珍しいなw
2019/11/05(火) 19:54:47.54ID:UkGDCuYx
>>931
ごめん、お前なんのために>>898みたいなことやるの?
説明できる?w
2019/11/05(火) 20:04:16.17ID:Rmlz0hln
>>936
pimplの説明ならこのスレで何度も出てると思うが?
それにしたいして、お前の反論は「俺はそうは思わない」という感想でしょ?

技術的な話したいなら物事をフェアに見ような
2019/11/05(火) 20:18:38.99ID:GaJDeol8
>>893 というお題な対して出した案が >>898
privateは隠蔽できて、かつ呼び出しコストは低い
配列サイズ増やしたらバイナリ互換がとれないのは承知してる
しかしそれはI/Fにする構造体一般の話であってこの件に限ったことではない

もう十分説明したつもり
2019/11/05(火) 20:37:36.25ID:UkGDCuYx
>>937
>>898がpimplに見えるならちょっと黙っててもらっていいかな?
邪魔なだけだし

>>938
なるほどね
とにかくprivateは見せたくないって事ならそれでいいんじゃね?
俺はやりたくないけどw
2019/11/05(火) 20:51:01.63ID:mHpC8FDb
>>935
とID真っ赤にしてレスするやつ
別に珍しくもねえ どこにでもいる虫けらめ
2019/11/05(火) 21:09:19.41ID:uxZ9xTP+
可愛そうなやつ…
2019/11/05(火) 21:15:13.47ID:ZKJgPI6j
事務職だけど、C++使ってる 
こんな便利なプログラミング言語があるとは
2019/11/05(火) 21:19:49.70ID:36DcdPPB
pimplesが顔に出たのは中学・高校時代だったか。
2019/11/05(火) 21:23:07.90ID:36DcdPPB
pointer to implementation
2019/11/05(火) 22:48:13.18ID:5N1tjWFS
結局のところ、>>893の言う「インラインPimpl」なるものの解釈なんだよな。

「そんなものありえない」>>896
「こうすればできるよ」>>898

俺は「ありえない」派だが。
2019/11/05(火) 22:54:52.19ID:JFmkzqZr
ピンプルはシンプルじゃないとダメでしょ
2019/11/05(火) 23:19:34.53ID:+/SJ/H3y
他の言語ではprivateを隠すための努力なんてしなくていいよね
あくまでc++特有のパターンとしてpimplがある
pimplの肝は、ポインタだけなら前方宣言すればincludeしなくてOKっていう
抜け穴的なところからきていてポインタであることは妥協の産物
implクラスを変更しても互換性が保たれるというのはあくまで副次的
ゼロコストじゃないわけでc++の思想からも外れている
2019/11/05(火) 23:26:17.64ID:+K1+YrIp
何をもって思想から外れていると?
C++の設計思想は最速を目指すことじゃないからな
2019/11/05(火) 23:41:22.87ID:+/SJ/H3y
Bjarne Stroustrupがそう言ってる
2019/11/05(火) 23:55:16.05ID:+K1+YrIp
始まりはそうだったかも知れんが、現在の規格の設計思想は明らかに違う
2019/11/05(火) 23:58:36.99ID:UFe3q3jM
最速を目指すって言うと少し外れてるけど、速度を重視するという所は変わってない
2019/11/06(水) 00:01:20.76ID:x6qzxIK7
それ以上に集団での開発効率を重視したもの
>>898のような奇怪なものよりpImplの方がモダンC++の設計思想に合っているのは間違いない
2019/11/06(水) 00:04:55.89ID:pco2p4E4
別に抜け穴でも何でもないだろ
なきゃこまるじゃん
2019/11/06(水) 00:12:17.42ID:L0p3vvTY
>>950
明らかに〜
説明できないときにつかう常套句だよね
少なくともc++17まではその設計ポリシーが挙げられてるよ
2019/11/06(水) 00:18:49.38ID:L0p3vvTY
>>952
はぁ?
pimplのどこがモダンなの?
最低限delegateを手で書かなくてもいいようにしてから言ってくれよ
スマートポインタ以下だから
2019/11/06(水) 00:32:45.47ID:EoKh/jsd
設計の方針は曖昧なものではなく明文化されてるから調べてきてね
2019/11/06(水) 01:17:04.07ID:mNM1KOm6
ピンプルってピンポンみたいだね
958デフォルトの名無しさん
垢版 |
2019/11/06(水) 01:37:31.84ID:clVAOuCS
ハリソン・フォード主演映画「逃亡者」(1993年)の主人公の名前は、キンブルだったね。
この映画はサントラが良い。ジェームズ・ニュートン・ハワードが音楽担当。
このサントラの「Helicopter Chase」という曲は、「タクティクスオウガ」(1995年)というテレビゲームの「VENDETTA!」という曲によく似ている。
2019/11/06(水) 05:47:10.84ID:iGLzVPkM
pimpl使ったことないからスルーしてたけど
>>947=>>949
ゼロオーバーヘッドの原則は言語が掲げるもので言語利用者を縛るものじゃねーよ

実際それが便利でコストが問題にならない使い方ならどう使ってもいいだろ
2019/11/06(水) 05:56:01.23ID:iGLzVPkM
>>954
君もなんか勘違いしてない?
最速を目指すなんて厨二病みたいなことを挙げていたというソースは?
2019/11/06(水) 06:54:13.33ID:cnDla3Ge
>>959
> ゼロオーバーヘッドの原則は言語が掲げるもので言語利用者を縛るものじゃねーよ
そうだよ、だからこの手の機能は言語仕様には含まれないってことな

> 実際それが便利でコストが問題にならない使い方ならどう使ってもいいだろ
誰もお前に使うななんて言ってないから使いたいなら勝手に使ってろよw
2019/11/06(水) 07:21:04.31ID:GB7Qlzkj
>>947
その主張にincludeは関係ないぞ
963デフォルトの名無しさん
垢版 |
2019/11/06(水) 07:24:02.54ID:hwyI/gg2
質問です。
サンプルプログラムで割り込み処理の一文で

ISR(TIMER1_CAPT_vect) {}でサブルーチンを呼び出してたんだけど、()内の意味わかりますか?
2019/11/06(水) 07:41:29.30ID:iGLzVPkM
>>961
>そうだよ、だからこの手の機能は言語仕様には含まれないってことな
誰か言語仕様に含めろなんて言ってたか?
さすがに隠したいメンバをポインタ経由で隠して無駄にコストかかる言語なら俺もお断りだが
ちな俺はplmpl使いたいなどと書いてない、人の主張を勝手に捏造するな
2019/11/06(水) 08:14:41.32ID:N/klFKt1
あと>>961=947と想定してもう一つ言っておくと
ポインタ変数の宣言に型(クラス)の実際の定義が必要ないのは抜け穴じゃない
必要ないから要求されないだけだ
どうもC++に対する認識がおかしい気がする
D&Eでも読んでこい
2019/11/06(水) 08:16:11.65ID:cnDla3Ge
>>964
> 誰か言語仕様に含めろなんて言ってたか?
誰もお前が言語仕様に含めろと言ってるなんて言ってないぞ
自意識過剰すぎだろ

> ちな俺はplmpl使いたいなどと書いてない、人の主張を勝手に捏造するな
使いたい「なら」な
C++の前に日本語やり直してこいw
2019/11/06(水) 08:17:38.83ID:cnDla3Ge
>>965
> あと>>961=947と想定して
バカほどこういう想定をしたがるw
2019/11/06(水) 08:21:27.02ID:N/klFKt1
ただの荒らしなら出てけ
2019/11/06(水) 08:31:26.58ID:zr2SzfAm
>>963
コンパイラが分からんけど、割り込みベクタテープルのシンボルだと思う。
タイマ1キャプチャ割り込みのハンドラを今から定義しますよ、みたいな。
2019/11/06(水) 09:33:53.63ID:GEOrtix2
サイズの違うコンテナ同士で代入を試みたらセグメンテーション違反になったんだが、リサイズしつつ代入って簡単にできないの?
2019/11/06(水) 09:54:01.45ID:B/9oP97H
>>970 できるよ。
#include <vector>
#include <cassert>
int main()
{
std::vector v1{1}, v2{1,2};
v1 = v2;
assert(v1 == v2);
}
2019/11/06(水) 10:35:41.19ID:GEOrtix2
>>971
普通できるのか
boostの「STLコンテナらしく振る舞う」というある多次元配列コンテナでできなかったから一般的にできないんだと思っちゃった
スマン
2019/11/06(水) 10:42:41.76ID:rSUWYkcI
そのためのstd::vectorのメンバ関数operator=だしな
2019/11/06(水) 12:22:15.65ID:2MfY+5W5
>>968
頓珍漢な想定でくだらんことしか言えないお前が出て行けよw
2019/11/06(水) 15:11:24.10ID:BVN8Da8w
今事務職であいてる時間C++やってるんだけど、事務職に特化したライブラリとかってない?
2019/11/06(水) 15:24:12.57ID:EoKh/jsd
>>975
awk,sed
2019/11/06(水) 17:52:40.67ID:lpQz5w/v
>>975
Excelのアドオン
2019/11/06(水) 18:44:11.86ID:XJugYxC8
char str[ ];
と宣言した場合、str[0] = '\0';というNULL終端をしなければなりませんが
string str[ ];
と宣言した場合は、特にNULL終端の必要性っていうのはないのでしょうか?
2019/11/06(水) 19:20:03.22ID:x6qzxIK7
2019/11/06(水) 19:23:25.64ID:Z1hQUtYe
std::stringはstd::string::c_strメソッドを使ってアクセスするとヌル終端になることが保証されている。
981デフォルトの名無しさん
垢版 |
2019/11/06(水) 19:45:32.35ID:o3tEvZiY
char hoge[] は char の配列
別に文字列として扱う気がなければ 0 終端は必須ではない

string hoge[] は(突っ込まれるかもしれんが敢えて言うと) char[] の配列
上の char hoge[] とは別物
982デフォルトの名無しさん
垢版 |
2019/11/06(水) 19:48:44.64ID:o3tEvZiY
あと片山の答えは >>978 の回答になっていない無関係な話 (いつものことだが)
2019/11/06(水) 19:59:36.42ID:JQYyTTQU
今やc_strでなくてもnull終端は保証されてるしな
2019/11/06(水) 20:14:12.93ID:KdcLkZY9
char str="";で多分null終端される。
stringは多分std::stringなのでそもそも文字列ではなくアドレスを扱う。

た・・・ぶ・・・ん・・・。うぼぁあああああああ。
2019/11/06(水) 20:14:31.39ID:XJugYxC8
>>978です
すみません 文字列として扱い、いきなりその変数を文字列と文字列の連携で使う場合の話です
つまり、その場合でも std::stringで宣言する場合は、"\0"で初期化する必要は無しということですね?
2019/11/06(水) 20:16:22.14ID:KdcLkZY9
すまん書き直し。

char str[]="";で多分初期化時にnull終端される。

「string str[];」は多分std::stringの配列なのでそもそも文字列ではなくアドレスを扱う。
2019/11/06(水) 20:52:15.48ID:vhzIqEHb
>>985
説明が上手くないからもうコードで書きなよ
2019/11/06(水) 20:56:59.66ID:y5v/16J4
ひょっとするとstd::string str[]じゃなくてstd::string strの間違いじゃないの?
2019/11/06(水) 21:29:23.43ID:3LXwRiA7
日本語の説明よりコード片の方が多少間違っていても意図を理解できるという
2019/11/06(水) 23:14:40.66ID:7z10T+eB
char[]は文字の配列=一つの文字列でstring[]は文字列の配列だからそもそも比較するのが間違ってる
2019/11/07(木) 06:10:28.61ID:+Fv/+mh5
>>978 の char str[ ]; string str[ ]; は、どっちも
要素数不明の配列の定義でコンパイルエラーになるんと違うか?
宣言ってことは extern のつもりなんじゃろか。

>>988 の言う通り string str[ ]; は string str; かも知れんけど、
いずにせよ「質問が曖昧で答えようがない」の類かと。
2019/11/07(木) 08:06:36.36ID:N9TqrKuA
アスペ多すぎ
まともな頭していればstring str;の書き間違いだってわかる
2019/11/07(木) 08:28:39.90ID:pA1g5yhx
コンパイラが空気読むわけないだろ(笑)
2019/11/07(木) 08:37:03.72ID:S+DlaQTT
・・・からけ?
2019/11/07(木) 08:39:29.18ID:t3M9+vGM
>>992
本気でstring str[];だと思ってる可能性を否定しきれない
現実にその手の奴はいるし
2019/11/07(木) 08:44:57.00ID:C1GJGInU
>>978です
明らかに自分が悪いです

char str[ ];
と宣言した場合、str[0] = '\0';というNULL終端をしなければなりませんが
std::string str;
と宣言した場合は、特にNULL終端の必要性っていうのはないのでしょうか?

に修正です
2019/11/07(木) 09:42:08.88ID:GEuBrdxx
無い
というか元々stringはC言語由来のゼロ終端とは違い、
「サイズ持ってんだから最後を示すデータは不要」という考え方だった
C++11からは利便性のためにゼロ終端が保証されてるけどユーザーが何かする必要はない
2019/11/07(木) 09:51:34.14ID:GEuBrdxx
初心者ぽいから説明が悪かったかもしれん
クラスが内部でやってくれることなので特に何かする必要はない
けど、内部データを直接書き換えたりするとおかしなことになるので注意
2019/11/07(木) 10:35:04.78ID:Q8xac2sp
stringに対するstring_viewみたいにint配列等にたいするviewはありますか?
1000デフォルトの名無しさん
垢版 |
2019/11/07(木) 10:38:43.53ID:dB1QBGXo
'\0' と 0 とどっち使うのが良い?
NULL は論外だよな
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 54日 17時間 25分 19秒
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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