X



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

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

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

このスレもよろしくね。
【初心者歓迎】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
0443デフォルトの名無しさん (ワッチョイ 4150-LNFl)
垢版 |
2018/04/28(土) 10:33:47.48ID:ibkTuaSK0
>>429の例で
2重インクルードを防ぎたい場合とそれぞれ別にインクルードしたい場合があるってのは書かなくてもわかるよな

中身が全く同じであれば防ぎたいし
全く別の定義であればそれそれぞれをインクルードしたい
0445デフォルトの名無しさん (ワッチョイ 93bd-Mk12)
垢版 |
2018/04/28(土) 10:38:47.00ID:BHnoJcFn0
>>443
>>444
>2重インクルードを防ぎたい場合とそれぞれ別にインクルードしたい場合があるってのは書かなくてもわかるよな
ああ>>443の脳内にはそういう要求もあるんですねわかります
その場合は>>418項番4でドゾー

藻前ら>>418の単純さをバカにするが藻前らの論理展開のアレっぷりも相当なもんやぞ…
0448デフォルトの名無しさん (ワッチョイ 419f-TsVf)
垢版 |
2018/04/28(土) 11:10:27.31ID:ueAKslGb0
>>418,421はミニマムの仕様を提示しただけで、つまり、
この仕様で問題ない場合は #pragma once で手抜きが出来て、
無理な場合は従来通りインクルードガード使えってことだろ。

俺はありだと思うぜ。仕様ってのはこういう割り切り方をしないと決まらない。
C++のラムダなんて後付で仕様を拡張して行っているし。(このやり方がいいとは思わないが)
ただ、この仕様だと現行の #pragma once よりも割り切っているのがイマイチで、
「今」この仕様では却下されるだろう。
「#pragma once が全くない世界」なら、とりあえずここから出発するのもありだっただろう。

現行の #pragma once は常識的に考えて、
・ファイル実体が同じ場合(ハードリンク/シンボリックリンク)は対応可能
・コピーの場合(ローカルに xxx.h を tmp_xxx.h にしてデバッグ出力を改変したり)には対応不能
だろう。だから使用条件としては、
・全ファイルがローカルファイルシステム上にあり、ヘッダファイルの改変は行わない
であり、普通に個人レベルで開発する場合はこれで全く問題ないし、妥当だ。
会社で10-20人レベルで開発する場合、どのみちルールを子細に決めることになるし、
そういう場合は従来のインクルードガードでやれ、という割り切りも妥当だよ。
0449デフォルトの名無しさん (ワッチョイ 419f-TsVf)
垢版 |
2018/04/28(土) 11:11:35.35ID:ueAKslGb0
なお俺が推す仕様は、

・#pragma once のファイル内では複数定義のエラーを無視する

というものだ。従って、
・現行の#pragma once とは違い、対象ファイルは必ず「ファイルとしては」「読み込まれる」
(これは現行のインクルードガードとも同じ)
・定義されている物のシグネチャが既に存在するものと全く同一だった場合、無視する。
・シグネチャが異なっている場合、普通に読み込む(コンパイル対象とする)
(勝手にデバッグ関数を追加されていた場合、その関数だけはコンパイルされる)
・#pragma once のファイルを全部パースし終わった際、「全部重複」「全部新規」ではなかった場合、警告を出す。
(正しく使えば「全部重複」「全部新規」のどちらかになる。
改変《追加》した場合は「一部新規」となり、警告にする。「一部欠落」は検知しない。)
というものだ。

この場合、要するに「読み込んで同じだったら無視」なので、
#ifdef 内等、かなりアクロバティックに使われても、問題なく、使用者の直感通りに動作する。
改行の追加、コメント変更等は全く問題ない。
ただし常に全部のファイルを読み込み、初段階のパースは行うことになるので、
現行の #pragma once やインクルードガードよりは速度は劣る。
とはいえ、今更ここが問題になる時代ではないし、問題になるようならインクルードガードを使えと割り切る。
つまり、面倒なら #include を使わずに、全部 #pragma once にも出来る、というもので、
実際これで問題無いと思うんだがな。
0460デフォルトの名無しさん (ワッチョイ 9391-/P+7)
垢版 |
2018/04/28(土) 14:18:44.28ID:0IOpQOT30
static変数(クラスのインスタンス)がプログラム実行時にそのメンバ関数呼び出し時にその中で、
newをすると既存のヒープ領域を破壊することはありますか?
どうもこのように解釈できる現象が起きているようなのですが、調べても分からずアドバイスを頂ければ幸いです。
環境はMacのHighSierra、コンパイラはbrewから持ってきたLLVMです。
0462デフォルトの名無しさん (ワッチョイ 419f-TsVf)
垢版 |
2018/04/28(土) 16:51:34.89ID:ueAKslGb0
ああすまん、何となく1行目の意味は分かった。

・クラスインスタンスをstatic変数に入れ、そのメソッドを呼んだ

事をそう表現したのかな?
だったらはっきり言ってstatic云々関係ない。
GCなんて無いから「statc変数に入れたら忘れてGCされてしまう」みたいなことはそもそも無い。
ヒープを壊しているのはユーザーです。つーか、ランタイムもないし。


ガチでコンパイラのバグだと思っているのなら、
どのみち再現コード(その場合は20行程度か)を作るしかない。
その過程で君のバグだと気づけるだろうさ。
ただこのように「下から」デバッグをするのは時間がかかるから、俺は嫌いだけど、
君がそう思うのならやるしかない。
C/C++は広く長く使われて来ている言語だから、
現在もバリバリに使われているコンパイラなら、この辺の基本的な部分にバグは無いと思うよ。
static変数に確保するのはマイナーかもしれないが、滅多にやらないってほどではないし、
そもそも上記の通り、コンパイラにとって危険のある(バグに命中する可能性のある)使い方でもない。
0468デフォルトの名無しさん (ワッチョイ 419f-TsVf)
垢版 |
2018/04/28(土) 18:39:11.84ID:ueAKslGb0
ひとまず俺の一つ目の予言は的中だな。
次に行こう。

>>467
ID:aIENMcPWd
お前の日本語の間違いをすべて訂正してみろ。

2つ目の予言をする。お前は言えない。
なぜならお前はゴキブリ韓国人であり、間違いを認識できていないから。
0469デフォルトの名無しさん (アウアウカー Sadd-YAdU)
垢版 |
2018/04/29(日) 02:23:46.17ID:UY96NiMha
C++でプラットフォームに依存しない音楽再生ライブラリってある?特にlinuxで使いたいんだけど。
mpg123とかいうのもみてみたんだけどプログラムに組み込むやり方が分からない
0472デフォルトの名無しさん (ワッチョイ 93bd-Mk12)
垢版 |
2018/04/29(日) 10:01:20.67ID:4Txko8z40
質問ですが
Q1.
浮動小数点型について表現しえる最小の値(負の値のうちの絶対値が最大のやつ)を取得する
環境非依存なやり方はどうすれば良いの?
-std::numeric_limits<double>::max()とか
-DBL_MAX
でおk?

Q2.
テンプレートを型引数が整数型と浮動小数点型で分けたいんですが
同じ名前のテンプレート名のまま、テンプレートの特殊化的な簡単に済ませる方法は無い?
0476デフォルトの名無しさん (ワッチョイ 93bd-Mk12)
垢版 |
2018/04/29(日) 13:56:48.76ID:4Txko8z40
まりがとうございます
>>473
>>475
すばらっし

>>474
言葉足らずでスマンカッタorz
具体的型名で特殊化する普通の特殊化ではfloatとdoubleのそれぞれについて特殊化した定義を与えねばならないので
>>473みたいなやつを求めていたのです!ヽ(>∀<)ノ!!!111!1!
0478デフォルトの名無しさん (ワイモマー MMb3-XMtE)
垢版 |
2018/04/30(月) 23:11:41.90ID:xhvNrk1GM
Boost.Optionalを使う際に、
対象クラスが自分自身の有効無効を変更できるようにしようとしてみたところ、
宣言時に宣言対象を引数にとって初期化できることに気づきました。

変数の引数に変数自身を使うのは仕様的にありなのでしょうか?
ttps://wandbox.org/permlink/YLKYol7KdEOhpyGU
0480デフォルトの名無しさん (ワッチョイ 9368-c97c)
垢版 |
2018/05/01(火) 23:40:40.03ID:dOOCYV+Z0
CObject obj;

for(i=0; i<N; i++)
{
obj = new CObject();
・・・(処理)・・・
}

↑みたいにdeleteせずにnew演算子でクラスオブジェクトを割り振り続けるプログラムってお行儀悪い?

CObject obj;

for(i=0; i<N; i++)
{
obj = new CObject();
・・・(処理)・・・
delete(obj);
}

↑こういうふうにすべき? 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
0493デフォルトの名無しさん (ワッチョイ 8133-M5g1)
垢版 |
2018/05/02(水) 10:02:54.88ID:EfCiDMro0
大規模なコードで大量にオブジェクト生成するならアリだと思うけど
その場合もnewしたものをdeleteするための仕組みは必須だしね
追跡できなくなる、もしくは自分で自分を破棄する仕組みも無いようではダメ
0497デフォルトの名無しさん
垢版 |
2018/05/02(水) 15:02:47.22
>>495
別にnewしなくてもよくね?
なんかサンプル出してみ?
new無くしてやっから
0503デフォルトの名無しさん
垢版 |
2018/05/02(水) 16:36:35.49
そもそも>>498の例なら初期化子自体いらんしw
0507デフォルトの名無しさん (ワッチョイ 318a-23pz)
垢版 |
2018/05/02(水) 17:35:57.58ID:EH+UkdGd0
教えてください

やりたい事は ↓
https://stackoverflow.com/questions/14706954/how-to-override-the-text-displayed-for-a-property-in-the-propertygrid

ここに出てるようなPropertyGridで、数値配列の値を16進で表示したい
[0] 0x0001
[1] 0x0002
[2] 0x0003
....
例えば↑とか、単にこれだけ

そうとう調べまくったんだが、配列の例はみつけられなかった
配列でなければ、実装例は結構見つかるんだが・・・

一見簡単そうなんだけど、俺のレベルでは不可能
0515デフォルトの名無しさん (ドコグロ MMa3-tYAq)
垢版 |
2018/05/02(水) 20:14:18.27ID:sTDjib3HM
>>503
そもそも>>498はコンパイルエラー(もしくは警告)になるだろ...
class CTest
{
 CFoo* cfoo;

 CTest(int x){
  cfoo = new CFoo(x);
 }
 ~CTest(){
  delete cfoo;
 }
 void ReNew(int x){
  delete cfoo;
  cfoo = new CFoo(x);
 }
};
みたいな奴を想定してたのかも知らんけどこれでもunique_ptr使えば良いだけだしね
0516デフォルトの名無しさん
垢版 |
2018/05/02(水) 23:29:42.51
どうせ>>498
CFoo cfoo;
はこれまた
CFoo *cfoo;
のつもりだったんだろう

とりあえず>>499の形にすればnewはなくせる
ポインタを保持したい場合も生ポインタはやめたほうがいいね
0517はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b6f-luqG)
垢版 |
2018/05/02(水) 23:41:46.06ID:g0SlpjdS0
可能な限りスマートポインタを使え、そしてスマートポインタで駄目な場合はほとんどないってのはその通りなんだけど、
初心者が生ポインタをちゃんと理解したことのないままスマートポインタを使いこなせるとも思えぬ。
そこらへんはちゃんと分けて、今回の場合はまずは生ポインタを理解するという方向性で説明する場面じゃろ。
0522はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 466f-XJxX)
垢版 |
2018/05/03(木) 02:41:54.13ID:HFudy7bE0
delete をしない戦略ってのは無くはないよ。

アプリケーションの起動時直後にガッと大量のメモリを必要として、
終了直前に全部解放するってパターンなら、
どうせプロセスの終了と一緒にリソースは回収されるのでわざわざメモリ解放の処理を入れる必要はない。
(C++ だとデストラクタは必ずしもメモリを解放するだけではないので注意が必要だが)
だけどそういう戦略をとれるのはちゃんと理解した上で問題にならないことを確信できるだけの知識があってこそだわな。

というか、それ以上に、確保したのを解放しないのは「気持ち悪い」と感じる心が C/C++er にはある。
0532デフォルトの名無しさん (ワッチョイ 0b33-f8tT)
垢版 |
2018/05/03(木) 21:23:27.91ID:IMqmw2mT0
組み込みとかゲーム機のような、最初に一気に確保する環境で使うんじゃないかね
といっても確保済みのメモリに対して断片化しないように管理する仕組み作ったら、必然的にnew演算子もオーバーロードするだろうから結局placement new使わんかもしれんけど
0533デフォルトの名無しさん (ブーイモ MMc7-+yEv)
垢版 |
2018/05/04(金) 04:49:56.51ID:JszYn0L4M
クラスを丸ごとDLL化するときにはnew系をオーバーロード
しておかないと解放時にエラーになるべ。

ヒープはDLL単位にあるので集めておきたい場合はplacement使う
0534デフォルトの名無しさん (アウアウウー Sacf-a7mP)
垢版 |
2018/05/04(金) 11:44:28.56ID:8Ch7v1Nca
unique_ptrの配列版でメモリの再確保を行いたい場合どのように行うのがベターですか?
0538デフォルトの名無しさん (ワッチョイ ab7f-XJxX)
垢版 |
2018/05/04(金) 15:29:55.09ID:YqO5U4DS0
make_unique使ってね
■ このスレッドは過去ログ倉庫に格納されています

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