12/05/20 21:48:23.26
>>198
vector<double> x,y,z;
z=x*y;
的なこと?たしかにRとかで使うけどなれると便利だよな。
Pascalにもあるの?
203:デフォルトの名無しさん
12/05/20 22:14:52.36
>>201
コンパイラでそういうの早くしようとしたら、どういう頑張りが必要なの?
まったく想像がつかないんだけど命令手書きとか?
204:デフォルトの名無しさん
12/05/20 22:19:12.45
>>202
URLリンク(www.ss.isc.tohoku.ac.jp)
URLリンク(www.ss.isc.tohoku.ac.jp)
この辺の話にでてくるベクトル命令
205:デフォルトの名無しさん
12/05/20 22:25:08.49
>>202
B(1:99) = A(2:100)
こんなんとか。
Fortranならある範囲から、ある範囲に対して
演算を行える専用構文が存在するがCやC++には
存在しない。独自の拡張か、環境依存の関数を
使う必要が有る。
206:デフォルトの名無しさん
12/05/20 22:30:31.09
ベクトル回路に乗せやすいように配列データを並べて
固定回数の繰返し構文を見つけて専用命令を充てる。
207:デフォルトの名無しさん
12/05/20 22:55:46.78
C++もstd::valarrayを擬似クラス化して最適化できる
ようにすりゃいいんだけどな。演算子のオーバーロードとか
通常時は、演算毎にループして、最適化がかかった場合は
Expression Templateみたいに一つのループで一つの要素に対する
演算をすべて実行したりとかさ。
208:デフォルトの名無しさん
12/05/20 22:58:09.26
>>203
基礎研究レベルからの積み重ね以外にないだろう
商用のCやFortranのコンパイラがやってる融合変換や自動ベクトル化とか命令の合成とかは全部その上に成り立つもの
別に言語の仕様が高速化に向いてるからだとかいうものじゃない
209:デフォルトの名無しさん
12/05/20 23:06:09.20
>>208
配列演算ができるのと出来無いのじゃ差が大きいよ
GpGPU分野でもFortranがそのまま移植され始めたし
210:デフォルトの名無しさん
12/05/20 23:24:38.00
>>198
ここで言うベクトル命令ってSSEの類じゃないってどういうこと?
インテル系以外のプロセッサということなのか?
211:デフォルトの名無しさん
12/05/20 23:26:50.52
このスレに貼られたリンク先をよく見てみましょう
212:デフォルトの名無しさん
12/05/20 23:35:25.20
>>210
ここではベクトルプロセッサーのベクトル命令の事。
ベクトルプロセッサーの命令は、ループで回しながら
xmm0みたいな固定長のレジスタを使って演算する
わけじゃなく、演算命令に範囲と要素のサイズを
指定するだけ。構造がだいぶ違う。
213:デフォルトの名無しさん
12/05/21 00:35:17.00
>>212
なるほどよくわかった。ベクトル機向けだからか。
今だとCUDAに近い感じかな。
214:デフォルトの名無しさん
12/05/21 00:59:09.35
>>200
VCにはrestrictはないが__restrictという予約語でこっそりMS独自拡張されてる
ヘルプ見てみ
>>209
D&Eでも禿が「C++は演算分野でFORTRANと張りあうつもりはない」ってはっきり言ってるもんな
でも実際使われてる事も確かだし速度が少し遅くても答えさえでりゃいいって奴がおおいんじゃ
どうしてもいやならFORTRANをリンクして行と列を入れ替えれば済む話だし
ベクトルって並列演算の事だと思うけどスーパーコンピュータはほとんどベクトル機だから(Power PCを
並列につないで使ったりしてるもんな)C/C++で同じ事をやろうとすればOpenMPか>>213のように
GPUを使ったCUDAしかない
しかしGPGPUは単精度という致命的な欠点があって倍精度専用のGPUも発売されているが
これは気軽に買えるようなものではない
215:デフォルトの名無しさん
12/05/21 01:13:25.79
MS独自に拡張されてようとC++11には無い
216:デフォルトの名無しさん
12/05/21 01:16:42.78
ここC++11のスレじゃないんだけど
ちなみにC++03にもないです
俺が言ってるのはPCでrestrict使いたければVCかIntel C++(C99対応)を
買うしかないという事
スパコンも案外独自拡張されてそうだけどな
あれだけ演算速度を重視されるんだから
217:デフォルトの名無しさん
12/05/21 01:22:04.90
あ、やっぱり
ベクトル型スーパーコンピュータのC/C++はrestrictを独自拡張してる物が多いようですね
これがないとベクトルCPUやSIMDが使えないもんなあ
それか素直にC99を使うか
218:デフォルトの名無しさん
12/05/21 01:28:46.99
std::stringを継承させた
exstringというクラスを作ったのだけど
std::stringのいろんなコンストラクタをそのまま継承クラスでも使う方法ってないの?
219:デフォルトの名無しさん
12/05/21 01:31:36.96
stringクラスに仮想デストラクタはあるのか?まずそれが一番大事
無いとdeleteの時にメモリリークするぞ
次にコンストラクタは継承されないから自分で書き直すしかない
コピペしてそのまま呼び出せばいいのは初期化リストに入れれば良い
220:デフォルトの名無しさん
12/05/21 01:33:12.86
ポータブルなisnanの実装って可能?
doubleのビットを全部見たらnanについて何が分かる?
221:デフォルトの名無しさん
12/05/21 01:34:33.68
>>219
std::stringにアップキャストしたポインタをdeleteしなきゃリークしねーだろ
222:デフォルトの名無しさん
12/05/21 01:35:11.83
ちなみにexstringをポインタ経由でなくてインスタンスとしてしか使わないのなら問題ないけどな
それからexstring自身のポインタ経由で使うか
std::stringは「失敗した標準ライブラリ」だと良く言われる
理由は多量のコンストラクタに、整理されてない多量のメンバ関数
STLの前に作られたから仕方ないんだが
string用に最適化されている事を期待して諦めているが
223:デフォルトの名無しさん
12/05/21 01:50:02.37
>>219
おまいバカだろ
224:デフォルトの名無しさん
12/05/21 01:56:35.44
>>223
馬鹿というなら具体的な対応策をお前が>>218に呈示してやれよ
225:デフォルトの名無しさん
12/05/21 02:52:59.24
全然話は違うけどSTLPortのstd::ropeはどうなったん?
boostもC++11も見捨ててるみたいだけど、自然消滅?
226:デフォルトの名無しさん
12/05/21 04:21:31.83
>>220
IEE754でいいなら、ビットパターンでNaNを表現している。
227:デフォルトの名無しさん
12/05/21 04:27:55.75
std::stringじゃなくて
<boost/container/string.hpp>
使うのは?
228:デフォルトの名無しさん
12/05/21 04:43:06.94
>>227
本当だな
それだとslistも入ってるし不要なstringのメンバ関数がバッサリ切り捨てられてる
全部STLでやれって事だよな
229:デフォルトの名無しさん
12/05/21 06:11:32.83
>>216
正式に規格になったから、一応C++11もこのスレに含まれるっぽいぞ。
数カ月前向こうでそういう議論があった。
今C++11スレは、次世代規格やC++11の対応状況とかそんなスレになってる。
つか過疎ってる。
230:デフォルトの名無しさん
12/05/21 08:41:00.31
>>217
自分で書けばいいじゃん。
俺はクリティカルになるところは自分でかく。
それ以外は、コンパイラ任せ。
231:デフォルトの名無しさん
12/05/21 09:11:46.86
ropeは現在では遅延評価がある言語でエディタ実装する用途以外に使い道無い
232:デフォルトの名無しさん
12/05/21 12:36:03.13
ベクトル演算なんて自前でループなんかしないでippあたりのライブラリ使うから
どうでも良い
233:デフォルトの名無しさん
12/05/21 19:17:30.82
メモリの断片化を防ぐために、OSが不定期にデータを移動させることがあるそうですが、
現在、これによる影響を考慮するようなプログラムはないと考えてよいでしょうか?
昔(WindowsNTより前?):物理メモリアドレス=プログラムが参照するアドレス
→移動可能メモリを読み書きするにはロックが必要
今:物理メモリアドレスはOS管理の論理アドレステーブルで対応付けされ、プログラムからは常に固定のアドレス
234:デフォルトの名無しさん
12/05/21 19:31:11.61
どういうときに考慮する必要があるの?
断片化解消を阻止するプログラムでも作るつもりか?
235:233
12/05/21 19:36:58.90
>>234
DirectXにロックするAPIがあるんです。
現在はロックって必要ないはずですよね??
236:デフォルトの名無しさん
12/05/21 20:20:42.21
>>235
DMAとかでCPU以外からのアクセスがあるため、OSが勝手に移動すると困る
237:233
12/05/21 20:42:28.92
>>236
なるほど。
GPUから見た場合は論理テーブルみたいな仕組みがないので、
明示的に物理アドレスを固定しないといけないということなんですね。
ありがとうございました!!
238:デフォルトの名無しさん
12/05/22 15:19:56.67
uプリフェックスってコンパイラで指定したソースコードの文字コードを
UTF-16に変換してconst char16_t*型の変数に代入するって意味ですよね?
例えばソースコードがエスジスならばエスジスをUTF-16にへんかんするってことですよね?
239:デフォルトの名無しさん
12/05/22 20:57:41.81
だいたいあってるけど正確には違う
240:デフォルトの名無しさん
12/05/22 22:39:22.14
struct X
{
char x;
X( const X& o ) : x(1) {}
X() : x(0) {}
};
int _tmain(int argc, _TCHAR* argv[])
{
X x;
x = X();
return 0;
}
これ、コピーコンストラクタが呼ばれずにx.x != 1になってしまうんですが
なぜだかわかりますか? Visual C++ 2010です。
241:デフォルトの名無しさん
12/05/22 22:52:07.80
operator=が呼ばれてるからじゃないんけ
242:デフォルトの名無しさん
12/05/22 22:54:31.43
初期化と代入の区別はちゃんとつけよう!
243:デフォルトの名無しさん
12/05/22 23:14:03.53
コピーじゃなくて代入だから呼ばれないよね(´・ω・`)
244:デフォルトの名無しさん
12/05/22 23:25:39.40
>>240
operator=を書いてみ
245: ◆QZaw55cn4c
12/05/23 03:17:06.92
>>240
URLリンク(codepad.org)
246:デフォルトの名無しさん
12/05/23 07:22:31.20
同じ事を何度も言わなくてよろしい
247:デフォルトの名無しさん
12/05/23 23:34:18.12
template部分特殊化で
int float doubleは同じ処理で
string charは違う
その他のいろんなクラスは汎用処理
ということをしたいとする
int float doubleの同じ処理を3回書かないでプリプロセッサあたりで一回で書いてしまう方法ないでしょうか
248:デフォルトの名無しさん
12/05/23 23:41:58.93
template<class Signature>
struct my_class{ ... }; // etc type
template<class T>
struct base_int_float_double{ ... }; // int or float or double
template<>
struct my_class<int> : public base_int_float_double<int>{};
template<>
struct my_class<float> : public base_int_float_double<float>{};
template<>
struct my_class<double> : public base_int_float_double<double>{};
これじゃいかんのか?
249:デフォルトの名無しさん
12/05/23 23:47:57.51
>>248
ありがとう
それでいけます
250:デフォルトの名無しさん
12/05/24 03:41:09.75
中身はintだけど型がintと違うものを作りたくて
struct exint ; public int
{};
してみたらintはclassじゃないと怒られた。こんなものは作れないってことでいいの?
251:デフォルトの名無しさん
12/05/24 04:04:31.20
>>250
D言語でおk
252:デフォルトの名無しさん
12/05/24 04:49:36.72
オブジェクト指向もどきだから
何でもかんでもオブジェクトじゃないよ
253:デフォルトの名無しさん
12/05/24 13:53:23.19
newしたクラスのコンストラクタで、自分のメンバ変数にさらにnewしてクラスのオブジェクトを持たしている時
一番上位のオブジェクトをdeleteしたらメンバ変数のnewしたオブジェクトも消えるでしょうか?
つまり↓
newオブジェクト①->newオブジェクト②->xxxx ;
と続いている時、newオブジェクト①をdeleteする
この場合はnewオブジェクト②を削除したければ、そいつのデストラクタを呼ばないと駄目?
254:デフォルトの名無しさん
12/05/24 13:58:59.65
>>253
newしたオブジェクトはスコープアウトしても消えることがないので、ライターの責任でdeleteする必要がある。
だから消えない。
255:デフォルトの名無しさん
12/05/24 14:00:56.11
>>253
それはデストラクタに書くべき事でしょ
newオブジェクトにもデストラクタを書いておけば全部呼んでくれる
継承してないし簡単
256:デフォルトの名無しさん
12/05/24 14:12:45.06
例えばこれはメモリリークしない
class Base {
public:
Base* bp;
Base() : bp(new Base) {
bp->bp = 0;
}
Base* pointer() { return bp; }
~Base() { delete bp; }
};
int main()
{
Base b;
Base* bp = b.pointer();
bp->bp = new Base;
bp->bp->bp = new Base;
bp->bp->bp->bp = new Base;
}
257:デフォルトの名無しさん
12/05/24 14:20:05.69
bpがpublicというのは格好悪いのでprivateにした
やはりメモリリークはない
class Base {
Base* bp;
public:
Base() : bp(new Base) {
bp->bp = 0;
}
Base* pointer() { return bp->bp; }
~Base() { delete bp; }
};
int main()
{
Base b;
Base* bp = b.pointer();
bp = new Base;
bp = bp->pointer();
bp = new Base;
bp = bp->pointer();
bp = new Base;
}
258:デフォルトの名無しさん
12/05/24 14:26:34.15
>>253
newしたらdelete
URLリンク(ideone.com)
スマートポインタの方がいい
URLリンク(ideone.com)
ポインタの必要がなければ普通にメンバにした方がいい
URLリンク(ideone.com)
259:デフォルトの名無しさん
12/05/24 15:23:47.59
>>258
タメになるなぁ。
>>257
ダメになるなぁ。
260:デフォルトの名無しさん
12/05/24 15:56:15.57
>>257
リーク以前にそれ無限ループじゃね?
261:デフォルトの名無しさん
12/05/24 16:14:14.63
>>260
やってみて言ってんのか
Base() : bp(new Base) {
bp->bp = 0;
}
が何のために書いてあるのか分からないのか
262:デフォルトの名無しさん
12/05/24 16:19:57.35
おれもコンストラクタが再起するように見えるけど。
開発環境入ってないから検証できないな。
で、Ideoneで試してみたら、ランタイムエラーだってさ。
URLリンク(ideone.com)
263:デフォルトの名無しさん
12/05/24 16:36:25.55
うん。スタックオーバーフローだから、実行するまでわかんない。VCとかだと何事も無く終了するw
264:デフォルトの名無しさん
12/05/24 16:38:47.40
>>257
ループの件とは別に、
>>256はbp->bp->bpで連結してるけど
>>257はBase::bpでなくmainのローカル変数書き換えてるだけなのでリークする
やりたいことは分かるけどサンプルは盆ミス回避のため実際に実行するに限る
URLリンク(ideone.com)
265:264
12/05/24 16:41:37.05
>盆ミス
そしてこの凡ミスである
266:デフォルトの名無しさん
12/05/24 17:00:14.45
>>261
やってみて言ってんのか
267:260
12/05/24 17:43:32.61
>>261
コンストラクタでのnewでまたコンストラクタを呼び出す <---- 無限ループ
試しに bp->bp=0; にブレークポイント仕掛けたけど、そこに到達する前にスタックオーバーフローした
見た瞬間に気が付くと思うんだけどなぁ
268:デフォルトの名無しさん
12/05/24 18:47:57.48
既に>259で答えが出てた。
269:デフォルトの名無しさん
12/05/24 19:51:23.02
どう見ても永久ループです
ありがとうございました
#include <iostream>
class Base {
Base* bp;
public:
Base(int i = 0) {
std::cout << "Base() " << i << " time(s) called." << std::endl;
bp = new Base(i + 1);
bp->bp = 0;
}
Base** pointer() { return &bp->bp; }
~Base() { delete bp; }
};
int main()
{
Base b;
}
270:240
12/05/24 20:52:39.67
>>240 のお答えありがとうございました。こちらは理解出来ました。
ただもうひとつ、疑問があります。
このoperator=()が適用されないんですが
なぜなのかさっぱりです。
というかこれは常識ですか?
URLリンク(codepad.org)
271:デフォルトの名無しさん
12/05/24 20:57:20.69
暗黙のうちに作られるoperator=(const X<x0,x1>&)があるから。
普通のメンバ関数なのでテンプレートより優先。
272:240
12/05/24 21:04:15.42
そうなんですか・・
デバッガでトレースしても何も無いし
暗黙なんて止めて欲しい・・
ともあれ、おかげで対策方法もやっとわかりました。
どうもありがとうございます。
273:デフォルトの名無しさん
12/05/24 23:25:58.77
Base() : bp(new Type()) {
}
初期化リストでnewするって無いよな
スマポ使えとまでは言わんが、せめて
初期化リストはNULL初期化だわ
効率もスマポ使った時と変わらん
Base():value1(NULL),value2(NULL)
try
{
value1 = new Type();
value2 = new Type();
}
catch(...)
{
delete value1;
delete value2;
}
274:デフォルトの名無しさん
12/05/24 23:42:36.30
いやそこはスマポ使えよ
275:デフォルトの名無しさん
12/05/24 23:43:59.04
NULLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
いや、俺はちゃんとnew_handler記述するよ。
276:デフォルトの名無しさん
12/05/24 23:47:16.61
というかnewがこけるときって、どういう状態なんだろ?
もうガッタガタで、プロセス落とすしかないんじゃないの?
277:デフォルトの名無しさん
12/05/24 23:55:28.25
>>276
Effective C++読んでみれ。
第三版はどうなってるか知らんが、第二版ではかなり最初のほうで出てくる話題。
メモリ不足への対策は初級クラスのプログラマでも必須の知識だってことなんだよ。
イメージできないなら、まだ初級プログラマになれてない。
278:デフォルトの名無しさん
12/05/24 23:59:38.27
と、思っていま第三版の目次を確認したら後方に移動してたw
二版では2章7項だったが、三版では8章辺りの話題のようだ。
279:デフォルトの名無しさん
12/05/25 00:02:50.74
あ、オレ初級以下だわ
280:デフォルトの名無しさん
12/05/25 00:05:45.16
メモリが有限だってことさえわかれば自然と不足する状況なんて考えられるはずなのに、
それがわからないって言ってるやつは結局エラー処理をサボる理由が欲しいだけなんでしょ。
281:デフォルトの名無しさん
12/05/25 00:06:34.49
クラスに自分へのポインタを持ってそこにnewして入れるなら
再帰呼び出しになるから、引数を入れて深さがある程度になったら
止めるなどの工夫をしないとstd::bad__alloc例外が投げられるのは目に見えている
282:デフォルトの名無しさん
12/05/25 00:07:23.77
その前にスタックオーバーフローで止まるかハングしそうだけどね
処理系によってはスタックオーバーフローしても何も言わずにそのまま続行するから
たちが悪い
283:デフォルトの名無しさん
12/05/25 00:20:57.76
new と スタックがどう関わるか詳しく聞きたいものだな
284:デフォルトの名無しさん
12/05/25 00:37:07.29
コンストラクタの再帰呼び出しの機構は特に規格に入ってないけど
普通の関数のCALLみたいな機構で実現されてる場合が多いみたいです
だから先にスタックが逝くような感じ
285:デフォルトの名無しさん
12/05/25 00:56:04.36
ウェブ上で配信されているMJPEG形式のストリームを読み込んでメモリ上でパースしたいです。
どのような方針で書けばいいでしょうか。
よろしくお願いします。
286:デフォルトの名無しさん
12/05/25 01:01:57.44
とりあえず適当にバッファにとって切り取っていけばいいんじゃないでしょうか
287:285
12/05/25 01:36:52.37
ソケット作ってってことですか?
ストリーミング取得しやすくするライブラリでもあればいいのですが。
ちなみに対象のMJPEGの構造は把握しているので独自に解析するとして、今は自分の中に以下の3つの課題があります。
・データをどうやって取ってくるか
・送られてくるMJPEGを具体的にどのようにバッファして解析してバッファをリリース&次のデータを取得すればいいのか
・マルチスレッドで他の処理と並行して実行させたいので、プロセス内でjpgのやり取りをしたいのですが、
例えばOpenCVを使った画像処理スレッドとjpgを取得するスレッドをどうやって連携させるのか
288:デフォルトの名無しさん
12/05/25 04:07:11.32
>>287
1. wget URL | お前のプログラム
2. read(stdin)
3. シングルで動いてから考えろ
煽りじゃなくて本気でリファレンス実装作ってからじゃないとデバッグ大変よ?
289:デフォルトの名無しさん
12/05/25 04:37:11.10
大きな問題を小さく分割して1つひとつ実現するセンスが必要
290:デフォルトの名無しさん
12/05/25 06:01:17.57
>>275-276
new演算子の問題じゃなく、newに付けたコンストラクターが
例外を出した時が問題なんだけどな
291:デフォルトの名無しさん
12/05/25 06:24:09.31
>>275
new_handlerつかっててもコンストラクタでコケたらメモリーリークする
メモリーリークだけなら即致命的な事態にならないが
ファイルロックや排他など各種ロックが掛かりっぱなしになる
292:デフォルトの名無しさん
12/05/25 06:26:00.68
言葉が足りなかった。
>ファイルロックや排他など各種ロックが掛かりっぱなしになる
これは、ロックするタイプのオブジェクトをnewで確保していた場合な
293:デフォルトの名無しさん
12/05/25 07:32:03.94
だからスマポ使えよ
294:デフォルトの名無しさん
12/05/25 08:24:38.42
>>291
new_handler とメモリーリークは関係ないだろ。
295:デフォルトの名無しさん
12/05/25 09:28:57.73
スマポ使ったら負けだと思うんだ。(笑)
296:デフォルトの名無しさん
12/05/25 09:35:01.30
スマポこそ人類の英知だ
そうは思わんかね
297:デフォルトの名無しさん
12/05/25 09:46:28.44
>>295 けっこうよく居るな、こういうやつ。なんなんだろうな?
298:デフォルトの名無しさん
12/05/25 09:58:18.30
>>291-292
細かいアレだけど「コンストラクタが例外安全なコードになってなかったら」だろ?
299:283
12/05/25 12:10:39.91
>>239
kwskおねがいしま(ry
300:デフォルトの名無しさん
12/05/25 12:58:34.67
shared_ptr使ったらあっさり書けて拍子抜けしたわ
C++はGCが付いてないんだからスマポ使った方がいいかもね
メモリリークで本当に悩む
301:デフォルトの名無しさん
12/05/25 16:45:50.43
スマポが使えるなら使ったら方がいいが、
パフォーマンスやメモリの観点で使わない方がいい場合もあるからケースバイケースだな。
302:デフォルトの名無しさん
12/05/25 17:04:43.03
shared_ptrはともかくunique_ptrは消費メモリもオーバーヘッドも生ポインタと変わらんと思う
303:デフォルトの名無しさん
12/05/25 17:23:15.50
生成と破棄x30000000、sizeof比較
int*: time: 2.13s
URLリンク(ideone.com)
std::unique_ptr<int>: time: 2.13s
URLリンク(ideone.com)
std::shared_ptr<int>: time: 4.41s
URLリンク(ideone.com)
sizeof:
URLリンク(ideone.com)
> sizeof(int*) = 4
> sizeof(std::unique_ptr<int>) = 4
> sizeof(std::shared_ptr<int>) = 8
304:デフォルトの名無しさん
12/05/25 17:24:20.59
亡きauto_ptrさん
URLリンク(ideone.com)
305:デフォルトの名無しさん
12/05/25 17:56:17.19
ユニポすげえええええええええ
306:デフォルトの名無しさん
12/05/25 19:21:00.33
多機能ではなくスマートさを追求したユニークさんこそ至高
307:デフォルトの名無しさん
12/05/25 19:33:51.01
>>297
会社がboost使わせねェんだから仕方ねぇだろ
308:デフォルトの名無しさん
12/05/25 19:41:03.98
>>307
scoped_ptrくらいなら定義すればいいだろ
309:デフォルトの名無しさん
12/05/25 19:43:11.82
>>307
内製の糞ライブラリ使うしかないのかwww
310:デフォルトの名無しさん
12/05/25 19:49:48.85
社員の腕前まるっとまとめて信用されてないんだろ
紐付けとかないとなにやらかすかわからん集合無知みたいな
311:デフォルトの名無しさん
12/05/25 20:03:22.59
タダより高いものはないとか言ってセキュリティがうんぬん
312:デフォルトの名無しさん
12/05/25 20:10:06.48
じゃあ、コンパイラから全部内製で。
313:デフォルトの名無しさん
12/05/25 20:12:18.61
単にboost分からないから使わせないだけだよ
314:デフォルトの名無しさん
12/05/25 20:13:50.23
じゃあ標準ライブラリは完全にわかってるのか。すごいなぁ。
315:デフォルトの名無しさん
12/05/25 20:19:58.86
const auto_ptr ぐらいは使えるだろ
316:デフォルトの名無しさん
12/05/25 20:24:12.06
というかC++だって完璧にわかってるやつなんてそうそういねぇよ
317:デフォルトの名無しさん
12/05/25 20:50:09.14
C++はあのPL/Iよりも言語仕様が大きいんだぜ
全部覚えたら神様と崇めるよ
318:デフォルトの名無しさん
12/05/25 20:58:47.74
std::vector<Hoge>でHogeをコピーしないでHogeのデフォルトコンストラクタ呼び出す方法ありますか?
319:デフォルトの名無しさん
12/05/25 21:02:10.59
ソースで示して
320:デフォルトの名無しさん
12/05/25 21:06:08.79
>>318
resize
321:デフォルトの名無しさん
12/05/25 21:07:54.55
C++11より前だとコピるぞ。
322:デフォルトの名無しさん
12/05/25 21:08:02.54
resizeでコピーが発生せずデフォコンで構築されるのはC++11から
323:デフォルトの名無しさん
12/05/25 21:31:17.40
>>307
どんな理由で禁止されてんの?
324:デフォルトの名無しさん
12/05/25 21:45:46.59
上司「今の僕には理解できない」
325:デフォルトの名無しさん
12/05/25 21:47:35.90
上司「うちはBCC使ってるんだけどコンパイル通らないじゃんあれ」
326:デフォルトの名無しさん
12/05/25 21:47:36.00
「なぜあなたが理解できないということが禁止の理由になるのですか?」
327:デフォルトの名無しさん
12/05/25 21:47:46.73
>>323
テンプレが役に立たなかった時の名残
328:デフォルトの名無しさん
12/05/25 21:49:27.89
>>327
なら今はもう問題ないな。
329:デフォルトの名無しさん
12/05/25 21:50:34.36
VC6が未だ現役という・・・
330:デフォルトの名無しさん
12/05/25 21:51:37.50
boostのコンパイルが通らない環境の仕事つい最近まであった
331:デフォルトの名無しさん
12/05/25 21:53:21.90
先輩「STLも禁止な」
332:デフォルトの名無しさん
12/05/25 21:55:01.37
俺様「OTL」
333:デフォルトの名無しさん
12/05/25 22:13:36.61
Oresama Template Library
334:デフォルトの名無しさん
12/05/25 22:26:00.18
先輩「templateも禁止な」
俺「それC++を使う意味なくないっすか?」
335:デフォルトの名無しさん
12/05/25 22:26:55.36
C99非対応の処理系ならベターCとして十分実用性が
おっとMicrosoftの悪口はそこまでだ
336:デフォルトの名無しさん
12/05/26 00:23:07.53
>>334
3~5年前なら当たり前のようにそういう話があった
今でも少なくない
337:デフォルトの名無しさん
12/05/26 00:34:43.34
そうだな、昔も今もアホは居るからな。
338:デフォルトの名無しさん
12/05/26 01:21:21.23
もっと昔だと・・・templateは予約語だった
339:デフォルトの名無しさん
12/05/26 01:25:34.85
mapに特定のキーが登録されているかいないか調べる方法ありますか
340:デフォルトの名無しさん
12/05/26 01:27:44.73
find
341:デフォルトの名無しさん
12/05/26 01:30:26.65
count
342:デフォルトの名無しさん
12/05/26 02:09:27.73
VS2010を用いているのですが、コントロールがクラシックデザインなのはどうしようもないんですか?
343:デフォルトの名無しさん
12/05/26 02:13:27.57
>>342
URLリンク(eternalwindows.jp)
344:デフォルトの名無しさん
12/05/26 02:46:18.77
>>313
コンパイラが変わると、コンパイルが通らないからだよ。
ビルド環境にboostがあるとは限らんし。
早くboostがstlになればいいんだよ。
345:デフォルトの名無しさん
12/05/26 02:51:18.55
糞環境自慢されても
346:デフォルトの名無しさん
12/05/26 03:05:38.09
業界標準以外は導入しづらい
347:デフォルトの名無しさん
12/05/26 07:27:02.37
>>294
遅レス&&全レス読んでないが、関係はある
クラスFooのコンストラクタ内で例外が発生すると、
その時点で構築済みメンバのデストラクタはもれなく呼ばれるが
Fooインスタンス自体のデストラクタが呼ばれない
したがって、Fooがメンバとして単純なポインタFoo::m_pを含んでおり、
それに対するnewが成功した後に(別のnew等で)例外が発生すると
Foo::m_pが指すメモリを解放する奴が居ないからリークする
解決策はFoo::m_pのような奴を生のポインタではなくauto_ptrにするとか
348:デフォルトの名無しさん
12/05/26 07:41:07.42
いやすまんnew_handlerか、
new_handler中身でやることのパターンは何通りかあるが、結局例外を投げてしまう場合、と読み替えてちょ
349:デフォルトの名無しさん
12/05/26 13:07:43.57
コンパイラごとのSTLのアルゴリズムは
イテレーターのクラスによって要請されているインターフェイスの
オペレーターを全て実装していることを仮定されていますか?
よろしくお願いします。
350:デフォルトの名無しさん
12/05/26 16:52:27.58
>>349
C++に準拠してれば、C++の仕様に沿ったオペレーターを実装してるだろう。
C++に準拠してないコンパイラーの話なんかされても知らんがなとしか言えん。
351:デフォルトの名無しさん
12/05/26 17:23:19.31
>>349
何を聞きたいのかわからんが、
一応テンプレートに現れるシンボル(オーバーライドされたオペレータ含む)はtwo-phase lookupと言う規則で解決され、
インスタンス化しないテンプレートに現れるシンボルやオペレータについては宣言も実装も一切要らない
352:デフォルトの名無しさん
12/05/26 17:43:29.25
すなわちSTLアルゴリズムの使用するイテレーターテンプレートのインスタンスの
インターフェイスの提供するファンクションはSTLで実装されているイテレーターのイテレータークラス
によって類別されて決定される全てのファンクションが実装されていることを前提としているのでしょうか?
353:デフォルトの名無しさん
12/05/26 18:00:41.46
コンセプトが導入されてない現状ではそのアルゴリズムの実装が使うイテレータの機能だけが使用可能ならば問題ない
だから現状ではイテレータの要件を完全には満たしてないクラスを渡しても動作するアルゴリズムの実装はありえる
354:デフォルトの名無しさん
12/05/26 18:05:54.57
ただし、あるアルゴリズムがイテレータのどの機能(ってfunction=関数?)を使うかは実装依存。
一回動けばいいような書き捨てプログラムでもない限りきっちり作っておくが吉。
355:351
12/05/26 18:56:58.81
ああスマン、自作イテレータをSTLのアルゴリズムに食わせる話か、
初心者なものでイテレータはSTLのコンテナから出てくるものが全てだと思い込んでいた、
356:デフォルトの名無しさん
12/05/26 20:27:12.61
自前でちゃんとしたイテレータを書くのは
結構面倒くさいからboost使うといいよ
357:デフォルトの名無しさん
12/05/26 21:41:27.08
>>348 読み替えてもやっぱり new_handler とメモリーリークの関連が見えてきませんね。
358:デフォルトの名無しさん
12/05/26 21:50:08.94
変態イテレータあるよな
for_eachで回すだけで面白い事が出来る奴とか
359:291
12/05/26 21:52:12.10
>>357=294 ?
俺は、>>275がnew_handlerでなんとか出来るらしいと
書いてたからnew_handlerでメモリーリーク対策できなくねと書いたまで。
new_handlerとメモリーリークが関係するかはしらんがな。
360:デフォルトの名無しさん
12/05/26 21:57:56.25
そうか。すまんかった。
361:デフォルトの名無しさん
12/05/26 22:03:50.90
>>357
Fooのコンストラクタ内で例外を捕捉しないものとして、
>347な状況でnew_handlerから(何でもいいが)bad_alloc等の例外をスローすると、Foo::m_pが指す先のメモリがリークする
>347の状況であってもnew_handler内で(あらかじめ非常用にリザーブしておいたメモリから割り当てる等の手段で)
例外をスローせずに処理した場合、リークは起きない
よって、new_handlerの中身がリーク発生に全く無関係とは言えない
362:デフォルトの名無しさん
12/05/26 22:09:06.28
空きがもうない状況の話なのに
空きがあったらってぶっちゃけ関係ないよな
363:デフォルトの名無しさん
12/05/26 22:18:29.67
>>362
>空きがあったらってぶっちゃけ関係ないよな
空き0前提はともかく、非常用のリザーブ領域まで0前提なのか否かはスレの流れからは自明ではありませんね~
new_handler内でユーザー向けダイアログボックス用にリザーブ領域メモリを割り当て、
エラー表示した後プログラム終了、という設計も有り得る
364:デフォルトの名無しさん
12/05/26 22:22:05.70
>>363
newが例外を出した時点で、new_handlerは失敗してる。
365:デフォルトの名無しさん
12/05/26 22:25:43.17
>>363
newが例外だしてりゃリザーブ領域空ですよね
366:デフォルトの名無しさん
12/05/26 22:30:47.43
>>364,>>365
kwsk
デフォルトのnew_handlerを自作new_handlerに差し替えた後でも
newが勝手に例外をスローするというのは初耳
367:デフォルトの名無しさん
12/05/26 22:36:04.77
>>366
自作new_handlerが何も割り当てできなかったらNULLでも返す気か?
要点は例外じゃなくて、new_handlerがなすすべがない状態におちいてっるて
所なんだからそれぐらいは解れよ
368:デフォルトの名無しさん
12/05/26 22:41:05.88
>>366
つまらん事で意地をはるな
得することなんて何もないんだから
369:デフォルトの名無しさん
12/05/26 22:48:40.40
>>367
自作new_handlerなんだから、なすすべがない状態に陥らないように設計もできるよ?
単純な方法としては、プログラムの起動時に数KBかそこらのメモリを非常用にnewしておき、
そのポインタを大域変数g_pReservedに記録、
その後本当にメモリが0になったらg_pReservedからとりあえず返し、ただしプログラム終了フラグをセットして
速やかにプログラムを終わらせる、みたいな
そのためのnew_handlerです
370:デフォルトの名無しさん
12/05/26 22:53:03.92
>>365 の話がでてるのに、リザーブがあればという。
もうダメだなこの人完全に意固地になってる
371:デフォルトの名無しさん
12/05/26 22:53:30.08
>>369
g_pReserved が使われた後にもっかい new したら同じこと。
372:デフォルトの名無しさん
12/05/26 22:55:46.29
>>361
元々可能性の低い失敗がもし起こったらどうなるか、って話をしてるのに
可能性をもう少しほんのちょっとだけ下げる方法の話をしても意味ないでしょ。
373:デフォルトの名無しさん
12/05/26 22:57:52.31
>>369
話の論点からずれるけどアホだろあんた
最初にnewしてなければその分空きがあったはずで、意味がない。
new_handlerとして有効な使い方は、高速化の為にだけ先読みしてた
画像データなどのキャッシュ解放。不要なデータを削除すんのが普通。
#余談だから無視してくれ
374:デフォルトの名無しさん
12/05/26 23:09:46.56
>>370
デフォルトのnew_handlerを自作new_handlerに差し替えた後ならnewが勝手に例外を投げることはないから、
>365の言うような現象は起きない。よって、>365に基づく批判はナンセンスだし
>>371
まあそこらの細かい設計は一考を要するが、
別にg_pReservedをただ一つのオブジェクトに一括で返さねばならないわけでもなし
>>372
可能性を下げる方法の話ではないよ。プログラムを正常終了させる話。
本当にヒープ0になってからでは何も仕事はできない、という主張をするなら、
後始末という仕事を正しく遂行するため用のメモリをあらかじめ確保しておくという発想に到らねばおかしい
>>373
無視するが、>372へのレスの通りである
375:デフォルトの名無しさん
12/05/26 23:17:56.17
>>374
g_pReservedが空になったらどうする気だ?
376:デフォルトの名無しさん
12/05/26 23:21:13.73
>>375
本当にそうなったら万事休すだが、
やる仕事は後始末、と限定し、それに必要十分なメモリ量を見積もって
g_pReservedとして確保しておけば、それは避けられる
377:デフォルトの名無しさん
12/05/26 23:23:24.66
>>376
万事休すになった時のことをみんな言っているんだけど
それと、その時あんた例外なげないっていってたけどどうする気だ?
378:デフォルトの名無しさん
12/05/26 23:33:22.47
>>376
newを呼ぶ側からすればどこから取ったかなんて知らんのですよ。
取れれば有効なポインタが返り、取れなければ例外、それだけ。
足りなくなったのでクリーンナップして終了させる必要があるなんて知る余地もない。
std::vector<T>あたりのメンバ関数/コンストラクタで足りなくなったとして、お前は一体何をすればいいと言うつもりだね?
379:デフォルトの名無しさん
12/05/26 23:36:22.15
>>377
「万事休す」に2種類あることに注意だな。ただしどっちの解決策も示し済みwwwwww
(1) 後始末を遂行するためのメモリがリザーブ領域に残っているがそれ以外が0になった「万事休す」なら、
リザーブ領域のメモリからの割り当てて後始末を遂行し、プログラムを正常終了すれば良い(>369, >374の3コ目)
(2) 後始末を遂行するためのメモリまで0になる「万事休す」は、
>376のようにきちんと必要なメモリ量を見積もって確保しておけば生じない
ていうか、漏れとしてはnew_handlerの一活用方法を述べているだけで、そればかりに食いつかれてもなんだか悲しい
興味がおありの向きは、自力でnew_handlerを調べて活用方法でも考えたらどう?
例えば、new_handlerから自作GCを起動してしばらく使っていないオブジェクト(当然GCで管理する設計にする)
を解放し、空いたメモリを返すとか
380:デフォルトの名無しさん
12/05/26 23:40:36.58
>>376
>>369のやり方をすれば、ヒープが枯渇するタイミングが早まるだけで、
使えるヒープの総量は変わらないんだけど
381:デフォルトの名無しさん
12/05/26 23:54:34.16
>>378
>newを呼ぶ側からすればどこから取ったかなんて知らんのですよ。
おk newがメモリをどこから取るかに依存するような話はしていないつもりだが
>std::vector<T>あたりのメンバ関数/コンストラクタで足りなくなったとして、お前は一体何をすればいいと言うつもりだね?
漏れはg_pReservedに残っているメモリでプログラムの後始末を遂行し、終了するという考え方を示した。
後始末と終了以上の仕事をさせたいというならどうするか考えるのはYOUの仕事ですな
>>380
使えるヒープの総量が変わらない、はその通り
>369のやり方は、後始末を遂行する余力を残した状態で、ちょっとだけ早期にヒープ枯渇を察知することに意味がある。
382:デフォルトの名無しさん
12/05/27 00:22:31.86
>>381
おい、new_handlerが不足を察知したところでnewを呼ぶ側にはそれを知る術がない、といっているのだが。
383:デフォルトの名無しさん
12/05/27 00:27:33.02
>>379
リザーブが枯渇した後なんだから(1) は文脈としてありえないだろ
見積もれないからnew_handlerが呼ばれてるわけで(2)も終ってる
384:デフォルトの名無しさん
12/05/27 00:36:22.89
>>374
> 可能性を下げる方法の話ではないよ。プログラムを正常終了させる話。
どっちにしてもメモリーリークと関係なくね?
プログラムを正常終了させる話にしても、普通にスマートポインタつかってりゃ
例外が飛んで catch されるなり terminate() されるなりしてプログラムを終了
させたければさせられるわけだが、そのよくわからん new_handler を使う方法は
何がうれしいのかさっぱり。
385:デフォルトの名無しさん
12/05/27 14:26:48.55
>>328-383
Effective C++ 改訂2版 p.49に>363に類似だがより良い方法の記述がある
>たとえばプログラム起動時に予備として大きなメモリブロックを割り当てておき、
>new-handlerが初めて呼び出されたときにそのブロックを開放するという方法がある。
記憶管理の話は荒れますねwwwwww
386:デフォルトの名無しさん
12/05/27 14:31:55.15
>>385
荒れてる原因は話題じゃなくて、無理を通そうとする若干一名に見える。
387:デフォルトの名無しさん
12/05/27 14:34:23.79
>>384
>385の引用の続きだが
>予備のメモリを解放するときには、ユーザーにメモリが少ないことを警告
>し、もっとメモリを追加しないと今後の要求が失敗する恐れがあることを
>知らせるメッセージを出す事が多い。
↑これはメッセージを出すケースだが、予備が十分なら、
メッセージを出すのがある程度高価な処理であるケース
(例えばダイアログボックススに長いメッセージを出す必要があり、文字列をnewしたい場合等)に対応できる。
また、ヒープメモリが予備含めて完全に0になった状態で
「(例外をcatch等して)プログラムを(正常に)終了させたければさせられる」
という>384の自信はどこから来るんだ;
388:デフォルトの名無しさん
12/05/27 14:36:00.96
>>386
違うな。Effective C++の著者と漏れとで少なくとも2名だ
389:デフォルトの名無しさん
12/05/27 15:00:39.65
>>388
お前か。
みんなが >>361 の「new_handlerの中身がリーク発生に全く無関係とは言えない」について
ツッコミを入れているのがわからないの?
390:デフォルトの名無しさん
12/05/27 15:19:59.91
>>389
じゃあ藻前ら流の「全く無関係」のwell-definedな定義と「全く無関係」であることの論証よろ
少なくとも>388は、A,Bを命題として、「A→Bかつ¬A→¬BだからAとBは無関係とはいえない」、
という論法(のちょい派生)なわけだが
391:デフォルトの名無しさん
12/05/27 15:21:59.07
しつれい
× >388
○ >361
392:デフォルトの名無しさん
12/05/27 15:27:48.24
>>390 命題A,Bってそれぞれ何のこと?
393:デフォルトの名無しさん
12/05/27 16:04:43.89
\ / /. : : : : : : : :ヽ-‐.: :_;. --- .._: : : : : : : :\ \ /
_ 争 も _ /, -‐==ミ: : : : _,ィニ-‐……ー-: 、`ヽ、: : : : ヽ、 _ 争 _
_ え っ _ . .:´: : : : : : : ≠:7: : : : : : : : : : : : :ヽ、 ヽ| : i : : :, _ え _
_ : . と _ /.: : : : -‐: :7´: : /:,ハ : : : :ヽ : : : ゝ-- :\ | : :! : : : , _ : _
_ : _ /, -‐/.: : : : :i : : /ィ:爪: : :\ :\ : : :\: : :`ト : !: : : :′ _ : _
〃 /. : : : : : : |.:イ :ハ:| \: .、\: : xィ¬ト、: :| : : ! : : : : :,
/ \ /.: :/.: : : : /l : |/Гト、 / |_,ノ0:::ヽ : : :i : : : : :′ / \
/ | | \ | .:/.:/. : : :i: i : | |ノ0:::ト ::::::::::::: |: :∩::::::ト: : : !: : : : : : :, / | | \
∨i: |: : : : |: :ヽ| |::∩::| :::::::::::::::: !.::∪::::::| |: : :i : : : : : : ′ ,ィ /〉
|: |: : i : :', : | |::∪::| :::::::::::::::: !: : : : : :||: : i : : : : : : : :, / レ厶イ
ヽハ: : :、: :ヽ| l : : : |::::: , ::::└―┘ ! : : i : : : : : : : ′ / ⊂ニ、
い、: :\/  ̄ ̄ ', : : i : : : : : : : : , _, -‐' ⊂ニ,´
r 、 _ ヽ: :〈 <  ̄ フ |: : : ! : : : : : : : :′,.-‐T _,. -‐'´ ̄
くヾ; U| | : \ /| : : :i : : : : :_, -‐' | /
r―' ヽ、 | : : : \ イ: : :| : : :i_,. -‐ |/
`つ _  ̄ ̄Τ`ー―-- L: : : : : `: : . . . __ .:〔: : :|: : :r┬' |
394:デフォルトの名無しさん
12/05/27 19:45:53.79
このスレはC++/CLIもやってるの?
395:デフォルトの名無しさん
12/05/27 19:49:06.86
共通の話題なら扱うだろうけどCLI固有の話となるとご遠慮願いたい。
396:デフォルトの名無しさん
12/05/27 20:20:49.72
CLIはこっちか
初心者用しかないのが気にはなるが
くだすれC++/CLI(初心者用)part2
スレリンク(tech板)
397:デフォルトの名無しさん
12/05/27 21:00:36.93
初心者といっても、C++/CLI初心者にはC++と.NETの両方とも中級以上が必須だぜ
向こうはC++/CLIに固有の内容以外(C++や.NETの基礎知識)は基本的にスレチだし
398:デフォルトの名無しさん
12/05/27 21:42:40.23
int main()
{
int *array = new int[0];
delete[] array;
return 0;
}
Visual Studio 2008搭載のコンパイラーでこのコード走らせると
異常終了してた気がするけど、もし異常終了したらバグじゃね?
仕様として正常終了と異常終了どっちが正しいんだ?
399:デフォルトの名無しさん
12/05/27 21:58:07.72
>>398
new が失敗→ bad_alloc → terminate() → abort() という可能性はあるが、
現実に VS が対象としてる Windows 環境でそうなることは考えづらいな。
400:デフォルトの名無しさん
12/05/27 22:00:21.06
>>390
メモリー不足→new_handler作動→リザーブが足りない→newが例外→直前にnewで確保したメモリーがリーク
もしくは、
メモリー不足→new_handler作動→リザーブが足りない→newが例外を出さない→newが0を返す?→異常終了
メモリーリークとnewが例外出す以前は全く関係ない
401:デフォルトの名無しさん
12/05/27 22:01:47.57
>>399
俺Windows持ってないから、実際やったらどうなるか試してもらえるか?
正常終了したら正常終了したと教えてくれ。
402:デフォルトの名無しさん
12/05/27 22:10:53.15
new int[0] は合法。変える値もnull値とは限らない(配列の格納に必要な追加のメモリを要求することは実装上許されているので)。
…規格票はJISのページがアレなので、誰か英語の規格でも貼っておくれ^^
403:デフォルトの名無しさん
12/05/27 22:12:54.12
bad_allocが投げられるようなシチュエーションではもはや何をやっても大抵ダメ
って書いてある本があったな
Exceptional C++だったかな?
404:デフォルトの名無しさん
12/05/27 22:14:48.61
>>402
new int[0]が何を返そうがどうでも良いんだけどね。
どうせ0なんだから代入しないわけだし。
問題はdelete[]がnew int[0]で確保した何かを
削除して落ちるのが合法かというわけで。
405:デフォルトの名無しさん
12/05/27 22:17:32.68
>>404
勿論合法。>>398もエラー無しの正常終了。VCでもエラーでなかったよ。
406:デフォルトの名無しさん
12/05/27 22:20:18.83
>>403
大抵はダメでも対処するケースはそれなりにある
可能な限りキャッシュを開放してロックを解除とかね
プロセス外部にあるロックは鼓動が止まってから
しばらく立たないと解除されないから、開放できるものがあるなら
最後の余力を使って可能な限り解放したほうがいい
407:デフォルトの名無しさん
12/05/27 22:21:29.08
>>405
de;ete[] new int[0];で異常終了が合法なの?
りょうかーい。
408:デフォルトの名無しさん
12/05/27 22:25:00.40
大抵は盛大にリークしまくりモードで焼け牛に水状態なんだけどな。
実装によっては開放した途端OSにボッシュートされてヨソにもってかれたりとかも。
409:デフォルトの名無しさん
12/05/27 22:29:37.55
Windows Me以前か、Windows以外のOSか?
基本的に
ヒープが空 = アドレス空間に空きがない
であって
ヒープが空 = システムの記憶領域が足りない
じゃないからな。後者だとプログラム以前にOSが止まる。
410:デフォルトの名無しさん
12/05/27 22:30:27.97
>>407
ちゃうねん。異常終了しないのが合法。
411:デフォルトの名無しさん
12/05/27 22:31:42.59
焼け牛…そういえば、牛に衝突すると「モー」となくドライビングゲームがあってだな…
412:デフォルトの名無しさん
12/05/27 22:58:10.60
若干スレチですが、
cmathのrand()って周期いくつか分かりますか?
413:デフォルトの名無しさん
12/05/27 23:00:29.78
若干スレチですが、
cmathのrand()って周期いくつか分かりますか?
414:デフォルトの名無しさん
12/05/27 23:03:46.58
2分弱かな・・・。
415:デフォルトの名無しさん
12/05/27 23:15:26.42
>>413
そんなもの存在しない
416:デフォルトの名無しさん
12/05/27 23:26:07.12
C++11ならMT19937が装備されたじゃん
417:デフォルトの名無しさん
12/05/28 00:05:41.96
>>413
cmathの中にrandはない。他の場所にあるrandの周期は実装によって異なる。
418:デフォルトの名無しさん
12/05/28 00:15:04.79
randの仕様見たけど、ほとんど仕様ないんだな
419:デフォルトの名無しさん
12/05/28 00:24:54.98
線形合同法だったり、なんかビット操作して128bit周期にしてみたりとか色々実装があるね。
420: ◆QZaw55cn4c
12/05/28 03:46:04.96
最近のはやりは、それでも基本線形合同、ただし表に返すのは上から半分
421:デフォルトの名無しさん
12/05/28 05:52:39.32
それは仕様がない
422:デフォルトの名無しさん
12/05/28 10:47:20.39
土日に盛り上がってたんだな・・・
>>361
RAII(スマポ)使うかtry-catch(-rethrow)するか2択なんだし
両方しないのは単なる例外安全でないバグコードじゃね
Fooがバグってるのに
Foo「俺のせいじゃないです、bad_alloc投げたやつせいです」
それあんまりじゃね
423:デフォルトの名無しさん
12/05/28 12:00:15.12
>>403
どうしようも無いケースも多いだろうけど
オンメモリで小さいテキストを処理する機能にクソでかいファイル渡すとか
オプションで何かのバッファサイズに無茶な値を設定したとかあるし
対話型なら別にプロセス落とさなくても
入力ハンドラあたりでcatchしてエラー表示して続行でよくね
424:デフォルトの名無しさん
12/05/28 12:34:04.34
まったくだ。数ある「例外処理したくない」言い訳のひとつだろ。
425:デフォルトの名無しさん
12/05/28 14:26:54.15
>>423
画面表示もメモリ食うんじゃないのか?
426:デフォルトの名無しさん
12/05/28 18:21:20.59
>>425
>>423の2,3行目のケースならメモリ大量消費処理から
入力(\nやマウスイベント)ハンドラまでスタックが戻った時点で
メモリは解放されてる(例外安全なコードなら)
戻って尚足りないなら、どうしようも無いケースってことで
427:デフォルトの名無しさん
12/05/29 09:45:22.55
リソースが厳しい組み込み系以外で、
コンパイラオプションで例外を無効にしてる人っている?
428:デフォルトの名無しさん
12/05/29 13:24:28.38
>>427
Google社員がそうじゃね?
429:デフォルトの名無しさん
12/05/29 21:19:59.03
PSP、DS、360、Wii全部例外切ってやってた
430:デフォルトの名無しさん
12/05/29 21:59:51.13
>>429
コンパイラー何使った?
431:デフォルトの名無しさん
12/05/29 22:52:35.80
CODE WARRIOR
432:デフォルトの名無しさん
12/05/30 01:10:25.39
>>429
427 じゃないけど、なんで切ったのか気になるなー。
プログラムサイズ?実行速度?
433:デフォルトの名無しさん
12/05/30 04:20:14.38
>>431
それはコンパイラーじゃなくて統合開発環境じゃん。てのは置いといて、
CodeWarriorについて来るコンパイラーは、そもそもthrow-try-catchが
まともに動かんだろ。
434:デフォルトの名無しさん
12/05/30 07:38:21.36
例外切るとstd::stringやstd::vectorとかも実質使えないから
ベターCとしてのC++になるのかな
435:デフォルトの名無しさん
12/05/30 08:05:44.79
STLも使えなくなるな
いやまて例外を投げるメンバ関数だけ切ればいい話か
436:デフォルトの名無しさん
12/05/30 08:28:18.20
クラスのポインタって実体はあるの?
class sub{
public:
int aaaa;
};
claaa sper{
public:
sub* s;
};
↑特にこういう時
437:デフォルトの名無しさん
12/05/30 08:37:44.75
メンバへのポインタあるだろ
(sub::**s)になるのかな
438:デフォルトの名無しさん
12/05/30 08:38:14.93
あ、ただしこれは単独では使えないからね
インスタンスと組み合わせて使わないと意味をなさない
オフセットのようなものか
439:デフォルトの名無しさん
12/05/30 08:46:53.93
sperをインスタンス化してもsubは不定かNULLポインタだな。
440:デフォルトの名無しさん
12/05/30 08:50:28.22
それはコンストラクタの初期化リストか他のメンバ関数でnewするしかないね
他の配列やPODなんかを指しても別にいいけど
ただクラスはstaticメンバでない限り多数生成する目的なんだからやはりnewだろうね
そしてデストラクタにはdeleteを入れる
スマポを使うと楽だけどな
441:デフォルトの名無しさん
12/05/30 08:52:29.69
オブジェクトを作って配下の変数やクラスにもデータを入れているのに
初期化関数を抜けたらポインタで持たせているデータだけNULLになっていました。
char*とかがそうです。中身を持たせているのにも関らず消えてしまうのはなぜなんでしょうか?
442:デフォルトの名無しさん
12/05/30 09:00:09.20
具体的に書いてみろや
文章だけじゃイメージ沸かない
443:デフォルトの名無しさん
12/05/30 09:17:17.40
>>436
こんな感じかなあ
class sub {
public:
int aaaa;
};
class sper {
public:
sub* s;
};
int main()
{
sub* su = new sub;
sper* sp = new sper;
sp->s = su;
int sub::*aa = &sub::aaaa;
su->*aa = 1;
std::cout << su->*aa << std::endl;
sp->s->aaaa = 2;
std::cout << su->*aa << std::endl;
delete sp;
delete su;
}
444:デフォルトの名無しさん
12/05/30 09:42:39.53
クラスの配列をコンストラクタで初期化することってできますか?
class test{
public:
cObj* objArray[10];
test() : objArray[0](new cObj) {};
};
みたいな感じなんですが・・・・・
445:デフォルトの名無しさん
12/05/30 09:50:21.49
>クラスの配列をコンストラクタで初期化することってできますか?
できる。
446:デフォルトの名無しさん
12/05/30 09:56:04.82
>>445
どうやって?
447:デフォルトの名無しさん
12/05/30 09:58:31.43
やればできる
できないと思った瞬間にゲーム終了だ
448:デフォルトの名無しさん
12/05/30 09:58:34.74
>>445
それできるのか? 知らんかった
449:デフォルトの名無しさん
12/05/30 10:05:05.19
newしたオブジェクトをdeleteする際に下のエラーが出て困っています。 どうしたらいいか教えてください。
HEAP[hoge.exe]: Invalid Address specified to RtlFreeHeap( 00000000, 00000000 )
Windows によって hoge.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。hoge.exe または読み込まれた DLL にバグがあります。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
450:デフォルトの名無しさん
12/05/30 10:19:59.96
ソースを示せ
nullをdeleteしてるんだろ
451:デフォルトの名無しさん
12/05/30 10:23:54.40
>>444
デフォルトコンストラクタでいいならvectorにでも突っ込めばいいけどな
452:デフォルトの名無しさん
12/05/30 10:41:58.15
>>449
地道にデバッグするしかない
書いちゃダメなところに書いてる
多くの場合、配列の添字かポインタが意図しない値になってる
453:デフォルトの名無しさん
12/05/30 10:51:41.49
>>450
無理!
超雑だし、吐き気を催すだろうからww
>>452
なるほど・・、取りあえずやってみます。
454:デフォルトの名無しさん
12/05/30 10:57:58.23
答え:雑だから
455:デフォルトの名無しさん
12/05/30 11:04:26.07
>>454
明日から背中に気をつけろよ
456:デフォルトの名無しさん
12/05/30 11:13:47.59
ソースも出せないカスプログラムをデバッグさせられるのは嫌だ
457:デフォルトの名無しさん
12/05/30 11:25:43.53
どっちにしろって所だけどな
カスだろうがカスじゃなかろうが、カス扱いは確実だろう
やりたくなきゃやらなきゃ良い
458:デフォルトの名無しさん
12/05/30 11:32:25.52
心のさけびをぶっぱされても・・・
459:デフォルトの名無しさん
12/05/30 11:40:58.92
動的メモリ確保でいいならアライメントを解決した領域に単純なplacement new、
それが嫌ならaligned_storageから作れるスタック領域にplacement newをforなりwhileなりの
繰り返し構文で回せばできるだろ。
460:デフォルトの名無しさん
12/05/30 11:43:19.03
sizeof使った部分特殊化で重複定義を回避する方法って何か無いですかね?
URLリンク(ideone.com)
URLリンク(ideone.com)
URLリンク(ideone.com)
461:デフォルトの名無しさん
12/05/30 11:43:25.50
自分でnewしたものをdeleteできないなんてプログラマとしてどうなんだ
462:デフォルトの名無しさん
12/05/30 11:46:14.46
おとなしくスマートポインタ使えよ。
463:デフォルトの名無しさん
12/05/30 11:56:39.78
>>460
mpl::mapを使えばできる。
ちょっと待っててね。
464:デフォルトの名無しさん
12/05/30 12:18:14.76
>>460
できたよー(^o^)ノ
URLリンク(ideone.com)
465:デフォルトの名無しさん
12/05/30 12:35:47.70
またnullをdelete出来ないと思ってるアホが居る…
466:デフォルトの名無しさん
12/05/30 12:35:57.38
>>464
ありがとうございます
template<int n>にして目的のものが出来ました
467: ◆QZaw55cn4c
12/05/30 12:41:05.43
free(0)はOKなんですけど、delete はだめなんですか?
468:デフォルトの名無しさん
12/05/30 12:45:23.75
delete nullptr; は何ら間違ってはいない。
前規格だと delete NULL; かな。
469:デフォルトの名無しさん
12/05/30 18:35:27.65
ソースも出さずにデバッグ出来るのはエスパーだけ
元のソースが秘密で出せないのならせめて症状が再現する最小のプログラムだけでも
示してくれないと何も出来ないから
470:デフォルトの名無しさん
12/05/30 18:57:32.46
質問の意図や前提をくみ取れない糞質問
が多い。それで回答者が逆質問をしたり
悪口を言ったりする。それを前もって思
い描く力が絶望的に欠如してるに違いない。
スーパーハッカーだけが意図を理解できる。
レアなそういう神が颯爽と登場する予感。
471:デフォルトの名無しさん
12/05/30 19:47:02.72
>>468
NULLじゃなくて0じゃね?
NULLは、Cとの互換で残ってて
元々非推奨だし
472:デフォルトの名無しさん
12/05/30 20:19:34.26
NULLが非推奨って何の話だ
473:デフォルトの名無しさん
12/05/30 20:24:15.21
0がNULL扱いになった頃の話
474:デフォルトの名無しさん
12/05/30 20:24:50.01
逆じゃね?
475:デフォルトの名無しさん
12/05/30 20:29:53.11
ネットじゃ文章が見当たらんけど
NULLだと、0だということがぼやけるから
という事だったハズ
476:デフォルトの名無しさん
12/05/30 20:36:29.39
#define NULL (void*)~0
0がぼやけるってのを補足するとNULLだと別に
0じゃなくてもいいんだけど、C++じゃdynamic_castとか
deleteとか無効アドレスとして0を前提とした
言語機能があるもんで、NULLだと値が不定でマズイ
477:デフォルトの名無しさん
12/05/30 20:39:30.91
4.10 Pointer conversions [conv.ptr]
1 A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to
zero. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that
type and is distinguishable from every other value of pointer to object or pointer to function type. Two null
pointer values of the same type shall compare equal. The conversion of a null pointer constant to a pointer
to cv-qualified type is a single conversion, and not the sequence of a pointer conversion followed by a qualification
conversion (4.4).
JIS-X3014
4.10 ポインタ変換
ゼロと評価される右辺値を持つ整数型の汎整数定数式(5.19)を、空ポインタ定数と呼ぶ。空ポインタ定数
は、ポインタに変換する事ができる。その結果は、その型の空ポインタ値となる。空ポインタ値は、オブジェクト先
ポインタ型 又は 関数型ポインタ型のどんな値とも区別できる値とする。同じ型の二つの空ポインタ値は、
比較で等しくなるものでなければならない。空ポインタ定数から、cv修飾付きの型へのポインタの変換は、
単一の変換となり、ポインタ変換の後で修飾変換(4.4)を行うことはできない。
C++ではCと違い、void*を任意のポインタに代入する場合には明示的なキャストをしなくてはならなく
なったためにvoid*を使うメリットがなくなったという話
しかし単なる 0 をヌルポインタなのかdouble型の0.0なのかコンパイラが判別出来ないためにまだ問題が
残ったので、C++11ではnullptrを新設した
478:デフォルトの名無しさん
12/05/30 20:42:10.74
>>477
C++98とかそんな最近の話じゃないぞ
479:デフォルトの名無しさん
12/05/30 20:44:03.62
>>478
ISO/IEC 14882:2003だぞ
480:デフォルトの名無しさん
12/05/30 20:48:17.83
>>479
98年以前から言われてた話だってこと
そっからすると2003は最近でしょ
あと、仕様が出来た理由と非推奨の話は別だからね
仕様書に書いてる話じゃなく禿のコラムとかそっちに
書いてあった内容だから
481:デフォルトの名無しさん
12/05/30 21:01:09.85
URLリンク(www.libjingu.jp)
標準化前というとiostream.hとかの時代かなあ
482:デフォルトの名無しさん
12/05/30 21:15:42.11
>>434
例外切ってるけどstd::stringやstd::vectorはフルに使うよ。何かまずいの?
483:デフォルトの名無しさん
12/05/30 21:43:54.88
>>480
D&Eの日本語版のP291から書いてあるな
484:デフォルトの名無しさん
12/05/30 23:01:04.82
>>482
中でメモリ確保失敗したらどうすんの?
485:デフォルトの名無しさん
12/05/30 23:12:10.31
>>484
メモリ確保失敗しないように作る。ゲーム開発では普通のこと
486:デフォルトの名無しさん
12/05/31 00:04:33.51
>>485
そりゃ製品はそうなるだろうけど、開発中には失敗しちゃうこともあるでしょ。
呼び出し元でチェックとかできないわけだけど、どうすんの?
わけわかんない動作が起こってから調べに行くの?
487:デフォルトの名無しさん
12/05/31 00:13:37.94
>>486
なぜ呼び出し元でチェックできないのかよくわからんけど
488:デフォルトの名無しさん
12/05/31 00:17:11.33
NULLチェックすりゃいいじゃんね
489:デフォルトの名無しさん
12/05/31 00:25:19.96
new (nothrow) 使うんだろ
490:デフォルトの名無しさん
12/05/31 00:27:53.20
>>487
vectorの中のメモリ確保失敗は標準C++ではbad_allocなんかの例外で通知されるんだけど、
例外無効にしてる状態で呼び出し元でチェックしようとしたら何かしら標準以外の方法を使うことに
なるんじゃないの?
>>488-489 vectorやstringではそうはいかないでしょ。
491:デフォルトの名無しさん
12/05/31 00:29:39.31
>>490
例外未対応の処理系ならabortへ直行
492:デフォルトの名無しさん
12/05/31 00:35:15.99
GoogleならSTLに頼らない独自の配列クラスとか作ってるらしい
493:デフォルトの名無しさん
12/05/31 00:44:25.22
>>491
やっぱそうか。ありがとう。
494:デフォルトの名無しさん
12/05/31 00:45:33.18
まあヌルポにアクセスしちゃうからね
495:デフォルトの名無しさん
12/05/31 00:46:14.25
>>476
んなこたーない。
496:デフォルトの名無しさん
12/05/31 07:20:19.34
ヌルポは必ず 0 だよ
ビット表現が ~0 だろうが
ソース上は必ず 0 で表現する
だから >>476 はあり得ない
というか (void*) 付きの NULL は C++ じゃなくて C だし
>>476 は無茶苦茶やで
497:デフォルトの名無しさん
12/05/31 07:29:48.78
~ヌルポ
498:デフォルトの名無しさん
12/05/31 10:50:31.28
ソースコード上のポインタリテラルの0はNULLとして扱われるが
内部表現が0(0番地)とは限らない
//OK
int* p = 0;
delete p;
//NG ただし殆どの環境で問題は起こらない
int n = 0;
int* p = reinterpret_cast<int*>(n);
delete p;
499:デフォルトの名無しさん
12/05/31 11:32:04.45
そんなもん知ってる
500:デフォルトの名無しさん
12/05/31 12:16:01.43
C FAQ 読め。んで、そこに書いてあることは繰り返し書かなくていい。
URLリンク(www.kouno.jp)
501:デフォルトの名無しさん
12/05/31 12:30:10.64
それCや
502:デフォルトの名無しさん
12/05/31 12:57:36.36
規格票読んでもこの点に付いては同じ
503:デフォルトの名無しさん
12/05/31 13:01:32.98
規格にこだわる人に限ってたいしたプログラムを書けない
504:デフォルトの名無しさん
12/05/31 13:02:29.84
○○○さんのことかー
505:デフォルトの名無しさん
12/05/31 13:08:12.51
deleteするのとNULLを代入するのとどう違うんだよ
506:デフォルトの名無しさん
12/05/31 13:19:43.41
>>503
馬鹿かお前は
規格票は無駄な議論を終わらせるためにある
507:デフォルトの名無しさん
12/05/31 13:20:03.68
どこが同じなんだよ
508:デフォルトの名無しさん
12/05/31 14:39:11.68
deleteしてからNULLにしなきゃいけないのはなぜ?
最初からNULLじゃ駄目なの
509:デフォルトの名無しさん
12/05/31 14:51:05.54
>>508
int *a = new int(0);
delete a;
a = nullptr;
の事?それなら、
int *a = new int(0);
delete a;
a = nullptr;
... // いろいろな処理
delete a; // 重複delete
っていうのを仮にしたとしてもプログラムを落とさせないためだと思う。
でもそれやるくらいならunique_ptr使った方がいいし、これが必要な場面というと
「もしかしたらコードの中途半端な所でメモリ削減のためにdeleteする場合があるけど最終的な終了場面でもdeleteしたい」
っていうそうとうトリッキーで可読性の低い時だから推奨は推奨はしない。
510:デフォルトの名無しさん
12/05/31 14:51:43.63
誤字まくりだけど気にしないで。
511:デフォルトの名無しさん
12/05/31 15:16:43.24
>>505 >>508
GCの話・・・なわけないよな
512:デフォルトの名無しさん
12/06/01 00:39:38.16
>>400
>メモリー不足→new_handler作動→リザーブが足りない→newが例外を出さない→newが0を返す?→異常終了
ないわwwwwww
newが例外をスローせずに0を返すのはset_new_handler(0)とした場合(ハンドラ無し)であって
set_new_handler()に有効なnew_handlerを設定すれば、メモリ確保に成功するか、
new_handlerから例外を投げるかするまでnew_handlerが繰り返し呼ばれるのじゃ
というわけでど素人相手に潰れた漏れの土日を返せよ;
ま、漏れの意見を潰したければ、>369の無駄な複雑さに噛み付くべきであった
513:デフォルトの名無しさん
12/06/01 00:47:51.29
>>422
Fooがバグっていたとして、叫ぶことになるのがFooの作者とは限らん
ていうか、std::vector<T>にしても、コンストラクタからTのコンストラクタが呼ばれるわけだが、
その中で例外が発生した場合ときリークしないことが仕様で謳われてるっけ?
いちおうVS2008ではリークしないみたいだけど、ようわからんので>376への回答は避けといた
514:デフォルトの名無しさん
12/06/01 01:07:08.93
>>512
> newが例外をスローせずに0を返すのはset_new_handler(0)とした場合(ハンドラ無し)であって
そんな動作しません。
set_new_handler(0) はデフォルトのハンドラを指定していることになるので、普通に bad_alloc が飛ぶ。
515:デフォルトの名無しさん
12/06/01 02:06:07.06
>>513
> Tのコンストラクタが呼ばれるわけだが、
> その中で例外が発生した場合ときリークしないことが仕様で謳われてるっけ?
new TでTのコンストラクタが例外を投げたらTのために確保されたメモリは解放される。
new T[x]でどこかの要素の構築中にTのコンストラクタが例外を投げたら構築済みの要素のデストラクタが呼ばれ確保されたメモリは解放される。
ただしTの内部でコンストラクタの中断でリークがおきるならそれはリークする。
516:デフォルトの名無しさん
12/06/01 02:12:02.44
>>513
>リークしないことが仕様で
リークしたらバグ
リークしないためのRAII
URLリンク(ideone.com)
517:デフォルトの名無しさん
12/06/01 06:27:50.13
>>512
お前が例外出さない方法があるって言ったから提示してくれた案だろ
痴呆かよ
518:513
12/06/01 06:36:18.11
しつれい ×: >376 ○: >378
>>514
ありゃ確かにそうかも、、、
// (main()の冒頭で)
std::new_handler prevHandler = std::set_new_handler(foo);
std::cout << "p=0x" << prevHandler << std::endl; // p=0x00000000
519:デフォルトの名無しさん
12/06/01 06:39:59.13
>>517
>お前が例外出さない方法があるって言ったから提示してくれた案だろ
┐(´ー`)┌
気持ちは有難いが、規格準拠じゃない挙動を案と言われても困るな、、
520:デフォルトの名無しさん
12/06/01 06:51:04.78
ということで結局メモリー枯渇したらnewで例外は避けられん訳だ
521:デフォルトの名無しさん
12/06/01 07:25:18.44
nothrowしろよ
522:デフォルトの名無しさん
12/06/01 08:15:17.43
例外安全にするかabortだろ
NULL返す意味ねーよ
523:デフォルトの名無しさん
12/06/01 10:10:18.87
C++で背景画像とロゴ画像が二つ作ってあるときに
ロゴ画像のロゴ以外の部分(何も無い余白部分)を透明にして
ロゴ画像の何も無い部分には背景画像が映るようにするにはどうしたらいいんですか?
524:デフォルトの名無しさん
12/06/01 10:13:12.39
>>523
画像を二枚読んで合成する。
具体的には、
ロゴ画像のとある位置の色が透過色だったら背景色を出力バッファに書き込む。
透過色じゃなかったらロゴの色を出力バッファに書き込む。
それだけ。
525:デフォルトの名無しさん
12/06/01 10:30:01.46
だからそのやり方を(ry
526:デフォルトの名無しさん
12/06/01 10:36:08.00
分かってない人に分かり難く言っても絶対分からない
527:デフォルトの名無しさん
12/06/01 10:38:55.07
む~。これ以外にどう説明しようか。
>>524
画像を読むときはファイルオープンして画像フォーマットにそって画素データを読み込む。
画像ファイルフォーマットは数多にあるので対象になるものをググれ。
後は画素を比較して出力バッファに書き込むだけなんだが・・・。
コードがほしいなら宿題スレでお願いしてみるのがいいかもしれん。
あんまりいい方法じゃないけどな。
528:デフォルトの名無しさん
12/06/01 10:41:38.98
>>523の内容だけじゃ
>>524ぐらいしか言えないだろw
APIも画像フォーマットも謎なんだし
529:デフォルトの名無しさん
12/06/01 10:43:34.01
できるだけプラットフォーム非依存にするならDeVILで読み込んでOpenGLのテクスチャにして
合成はOpenGL側でやるとかか
530:デフォルトの名無しさん
12/06/01 11:19:10.19
>>528
用件が解決する方法であればなんでもいいだろ
客先で「画像形式は?」「API使います?」なんて聞くエンジニアは見たこと無い
指定が無いなら勝手に決めればいいこと
531:デフォルトの名無しさん
12/06/01 11:22:53.98
>>526
このスレではよくあること
理解してても他の人の説明聞くと「えっ?」ってなる
532:デフォルトの名無しさん
12/06/01 11:23:40.51
何で客に聞く話になるんだよwアホ杉だろw
533:デフォルトの名無しさん
12/06/01 11:31:27.28
質問もせずに独断で決めるエンジニアとか嫌だ
同じチームなら困る
534:デフォルトの名無しさん
12/06/01 11:59:26.97
画像形式ぐらいさすがに聞くだろ…
535:デフォルトの名無しさん
12/06/01 12:51:38.25
暇でしょうがないから突貫で作ったよ。3時間ではこれが限界。
URLリンク(www1.axfc.net)
もっと手を抜くつもりだったけど思ったよりかかってしまった。
画像形式はPGMテキストだ!まさに外道。
我を崇めよ~~~。はっは~~。
536:デフォルトの名無しさん
12/06/01 13:21:30.92
カスだった
537:デフォルトの名無しさん
12/06/01 13:36:25.45
>>536
よく言った。その功績を讃えてすごいサンプルを作る義務をあげるよ。
たのんだよ~。
538:デフォルトの名無しさん
12/06/01 13:38:30.63
ヘッダーに定義を書くなよ
539:デフォルトの名無しさん
12/06/01 13:46:27.56
>>538
テンプレート書いてた時の癖でベタ書きしてしまう。
手抜きの意味もあるんだが、正直スマンカッタ。
540:デフォルトの名無しさん
12/06/01 15:29:52.12
なにもしないやつほど文句を言う典型例
541:デフォルトの名無しさん
12/06/01 16:48:21.33
突貫としても低レベル過ぎ
542:デフォルトの名無しさん
12/06/01 19:23:02.02
>>538
今は、ヘッダー別のプリコンパイルドヘッダーも
あって速度も速いんだからいいじゃねぇか
543:デフォルトの名無しさん
12/06/02 00:03:30.05
>>542 そういう問題じゃないだろ。
544:デフォルトの名無しさん
12/06/02 02:49:02.35
>>541
腕がないのはしょうがない。仕様だ。
処理が低級っていうだったら、概念を説明出来ればいいかなと割り切ったんだよ。
ま、高尚なライブラリは俺がドキュメント読めなくて使えないんだけどね。
お、俺にもっと能力をくれ・・・。
545:デフォルトの名無しさん
12/06/02 04:07:18.14
胸がないのはしょうがない。仕様だ。
546:デフォルトの名無しさん
12/06/02 04:09:06.20
>>545
きょぬー甘え。
547: ◆QZaw55cn4c
12/06/02 04:34:28.04
>>545
賓乳萌え
548:デフォルトの名無しさん
12/06/02 10:53:04.80
貧乳が好きなのは肉体労働者だそうです
頭脳労働者はグラマーが好きな傾向が高いです
549:デフォルトの名無しさん
12/06/02 12:15:53.19
プログラマーと言いたいようだから先に言っておこう
550:デフォルトの名無しさん
12/06/02 12:21:02.95
数学者はたぶん虚乳が好き。
551:デフォルトの名無しさん
12/06/02 12:21:38.68
このスレおやじばっかw
552:デフォルトの名無しさん
12/06/02 12:24:48.04
わてはピチピチの女子高生でおまんがな
553:デフォルトの名無しさん
12/06/02 13:54:10.94
>>551
オヤジはプログラマなんて出来ないよ
連日徹夜でしかも頭の柔らかさを必要とするIT土方だから、定年が35才と言われている
それまでに管理職に移動出来ないと悲惨な人生が待っている
554:デフォルトの名無しさん
12/06/02 16:03:52.76
>>553
確かに力づくでコーディングしている人は体力がなくなると終わりだが、
センスや技術がある人はいくつになってもプログラマできるよ。
555:デフォルトの名無しさん
12/06/02 16:40:55.85
センスも技術も年で劣化するから・・・
556:デフォルトの名無しさん
12/06/02 16:52:31.83
プログラマ35歳定年説とか
ただのヘボプロブラマだけの話だよ
557:デフォルトの名無しさん
12/06/02 17:09:55.44
経験豊富になってダメな囲い込み技術の(未来のどん詰まり具合を)見抜けるようになると
その日の飯の種を拾う(3年後には)無駄/死亡と判りきってる学習が億劫に成っちゃうからねー
ケツの軽い若い時期しか無理ってのは確かだと思うよ
558:デフォルトの名無しさん
12/06/02 17:12:13.66
マ板でやれ
559:デフォルトの名無しさん
12/06/02 18:14:27.03
>>556
お前プログラマじゃないだろ・・・
560:デフォルトの名無しさん
12/06/02 19:05:05.40
>>559
プログラマだよ
まだ35じゃないけど
561:デフォルトの名無しさん
12/06/02 19:13:26.54
>>555
センスも技術も年で劣化するからダメというのなら、
どんな職業も35歳で定年だな。
562:デフォルトの名無しさん
12/06/02 19:14:14.71
クラスを配列に動的に確保したいんですが
hoge *h;
h = new hoge(int ho)[size];
とかだとコンストラクタの引数を変えれないので
*(h+1) = new hoge(int ho);
*(h+2) = new hoge(int ge);
みたいにできないでしょうか
563:デフォルトの名無しさん
12/06/02 19:21:04.50
別にコンストラクタを使わなあかんゆう決まりはないんやで
564:デフォルトの名無しさん
12/06/02 19:27:14.73
コンストラクタでなくても
parent *h;
h[0] = new child1();
h[1] = new child2();
みたいな使い方がしたいんです
565:デフォルトの名無しさん
12/06/02 19:29:43.99
いや、h[0].init(ho); やあかんのん?
どうしても new したいのなら boost::ptr_vector<T> でも使っとき
C++11 なら std::vector<std::unique_ptr<T>> でもええけど
566:デフォルトの名無しさん
12/06/02 19:33:32.17
>>562
std::vector<hoge> h;
h.reserve(size);
h.push_back(hoge(ho));
h.push_back(hoge(ge));
...
567:デフォルトの名無しさん
12/06/02 19:36:28.00
>564 URLリンク(ideone.com)
568:デフォルトの名無しさん
12/06/02 19:53:32.36
>>565-567
ありがとうございます、試してみます
569: ◆QZaw55cn4c
12/06/02 20:19:43.25
>>548
へーそうなんだ、なして?
570:デフォルトの名無しさん
12/06/02 21:45:33.58
Java使いで、C++初心者です。
C++でも、
xxx.method(new A());
と書けると思うんですが、
この場合、Aのインスタンスのdeleteは、
どこですべきなのでしょうか?
method内ですると、
A *a = new A();
xxx.method(a);
のときにもdeleteされてしまい、その後使えなくなってしまいます。
C++では、
xxx.method(new A());
という使い方はよくないのでしょうか?
571:デフォルトの名無しさん
12/06/02 21:49:42.82
うん。良くない。unique_ptrとかshared_ptrを使うべき。
572:デフォルトの名無しさん
12/06/02 21:58:36.41
そもそもmethod側がnewすべきじゃね
573:デフォルトの名無しさん
12/06/02 22:19:09.09
っていうかぁー。
Javaはすべてのオブジェクトをnewで生成するけど、
C++はnewでオブジェクトと生成するのは
「スコープを私(プログラマ)が管理しますよ」って宣言するのとほとんど同義なのでー
生成した人が、破壊を管理しないといけないんですよー。
で、xxx.methodの中で破棄するなら、
それは生成と破棄をxxxが管理すべきですしー
xxx.methodを呼び出す側が生成しているなら、破棄も呼び出す側の責任ですしー
もしくは、A自身が己の破棄を自前で行うよう設計する必要があるわけですよー。
…タブンネ。
574:デフォルトの名無しさん
12/06/02 22:20:16.71
Decorator とか Builder とか Strategy とか
575:570
12/06/02 22:44:41.62
shared_ptrを使えば、deleteしなくていいみたいなので、
Java感覚でできるということですね。
>>571さんありがとうございました。
576:デフォルトの名無しさん
12/06/02 23:01:03.29
Java感覚でプログラミングしたら
C++使う意味ないね
577:デフォルトの名無しさん
12/06/02 23:16:06.28
基本はconst参照か右辺値参照でどうにかする事を考えるみたいなのがC++極右
578:デフォルトの名無しさん
12/06/02 23:20:47.09
うっへんち参照はライブラリ(コンテナ)設計者以外はあんまし考えなくていいみたいよ?
ライブラリが正しく設計されていると、その利用者は右辺値参照について考慮しなくて済む。
579:デフォルトの名無しさん
12/06/03 01:18:34.69
>>572
method関数がnewするなんてどこに書いてあった?
580:デフォルトの名無しさん
12/06/03 08:22:12.26
C++は自動ガベージコレクションしてくれたりしないのでJavaみたいにnew/deleteを乱発してると
そのうちメモリが断片化してbad_alloc例外飛ばされるぞ
581:デフォルトの名無しさん
12/06/03 08:23:50.71
GCと断片化に何のつながりが
582:デフォルトの名無しさん
12/06/03 08:25:37.74
コピーガベージコレクションならコンパクションかけられると言いたいんだろ
583:デフォルトの名無しさん
12/06/03 08:44:04.41
g++でgprofの使い方がイマイチ分からん。
何かいいリファレンスかサイトある?
特にclassのメソッドをよく使っているプログラムで解析しやすい方法が知りたい。
584:デフォルトの名無しさん
12/06/03 08:45:23.25
あとついでにインライン展開を止める方法も。
585:デフォルトの名無しさん
12/06/03 09:42:01.37
>>584
___attribute( 何か )___ で止められたはず
何かは、何だったか忘れた volatileだったかnoinlineだったかそんな感じだったはず
586:デフォルトの名無しさん
12/06/03 12:51:55.87
GLSLシェーダやOpenCLカーネルのような実行時にコンパイルされるソースコードを
main.cpp等のファイル内に簡単に埋め込む方法はないでしょうか。
現在はchar型配列に
char data="int main(){..."
上のように書き込んでいますが見にくいので・・・(改行ごとにバックスラッシュを入れています)
boostや標準機能の中でもっと綺麗に書く方法があればご教示お願いします。
587:デフォルトの名無しさん
12/06/03 12:56:38.80
ある
588:デフォルトの名無しさん
12/06/03 12:59:33.93
>>586
std::stringを返す専用の引数なし関数にキックするとか。
589:デフォルトの名無しさん
12/06/03 13:00:14.86
>>586
エスケープ済みの別ファイルsource.cppとか
作ってmainで#include"source.cpp"じゃだめなんけ
source.cppは、cl.cppみたいな別ファイルにソース書いといて
置換コマンドで、\,"を\\, \"に置き換えるだけ
590:デフォルトの名無しさん
12/06/03 13:31:19.36
>>587,588,589
レスありがとうございます。
>>588
string型を返す専用関数で少しうまい方法を考えて見ます。
>>589
ヘッダのように別ファイルに書き込んで置換、というのは一度やってみたのですが
次の2点から少し敬遠していました。
・IDE上に並ぶファイルが増える。
・友人にコードを渡すときにヘッダが増殖する(lib化しろ、というのは最もなのですがWinとMac・・・)
588さんの書き込みを見ていろいろ探していたところ、
string tmp=STRINGIFY(int main(){...);
のような書き方をしているコードを見かけたので中を調べてみます。
皆様すぐにレスしていただきありがとうございました。
591:デフォルトの名無しさん
12/06/03 14:13:54.22
構文エラー : ';' が '*' の前にありません。
と出てしまいます。エラー場所はこれだと思うのですが、文法が間違っているのかよくわかりません。
class Cabc{
Cbdf* bdfaddr;
public:
Cabc(Cbdf*);
};
Cabc::Cabc(Cbdf* tmp):bdfaddr(tmp){}
class Cbdf{
Cabc* abc;
private:
Cbdf(){abc = new Cabc(this)}
};
592:デフォルトの名無しさん
12/06/03 14:22:16.98
Cabc(Cbdf*);
これは
Cabc(int*)
って書いてるようなものだ
Cabc(Cbdf* hoge);
とすれば消える
593:デフォルトの名無しさん
12/06/03 14:36:17.77
Cabc(きゃびっく?)ってなんよ?
594:デフォルトの名無しさん
12/06/03 14:44:26.79
>>591
きゃびっく型が事前に宣言してないきゃぶどふ型使ってるからだろ
きゃびっくの前に、class Cbdf;と書いとくか、Cbdf *bdfaddr;を
class Cbdf *bdfaddrと書けば行けるはずだ。
ただ、よっぽどの事情が無い限りクラス同士を循環参照すべきじゃない。
オブジェクト同士の循環参照は構わないが、その場合、抽象クラスなどを
用いてクラス定義では単一参照にする。
595:デフォルトの名無しさん
12/06/03 14:45:17.51
>>593
Class ABC じゃね?
596:デフォルトの名無しさん
12/06/03 14:49:01.51
プリフィクスはヤメロと・・・
597:デフォルトの名無しさん
12/06/03 15:01:37.39
>>592
なるほど・・・
宣言時は省略できるもんだと思ってました
598:デフォルトの名無しさん
12/06/03 15:02:43.71
>>596
便利じゃないですかー
599:デフォルトの名無しさん
12/06/03 15:11:23.54
何に使うんだよ・・・
(今やプリフィクス禁止が基本なのに)
600:デフォルトの名無しさん
12/06/03 15:22:11.28
今やというか、昔から禿はプリフィクス付けんなと言っているけどな
代わりに名前空間使えや
601:デフォルトの名無しさん
12/06/03 15:23:27.27
>>597
いや、省略できるよ。そこは問題ない。問題は循環参照。
602:デフォルトの名無しさん
12/06/03 15:25:32.98
これからはフィリックスの時代
603:デフォルトの名無しさん
12/06/03 15:51:11.79
>>602
懐かしいな。黒い猫だろ。
604:デフォルトの名無しさん
12/06/03 15:59:12.44
プラスネジじゃないの?
605:デフォルトの名無しさん
12/06/03 19:44:49.39
>>591そのままのソースならnew Cabc(this)の後ろに;がないのが間違いだが
606:デフォルトの名無しさん
12/06/03 20:03:46.47
>>601
ポインタの場合具体的な変数名を記入すれば回避できるという話では無いんですか?
それにしてもfunc(int*)という宣言は出来たような気がしますけど・・・
607:592
12/06/03 20:05:20.92
592はただの知ったかだから無視すればいい
608:デフォルトの名無しさん
12/06/03 20:08:14.92
えーと、じゃあ>>591のソースコードで出るエラーは>>605ぐらいしかなく、
とりあえず他のエラー要因は無いということですか?
609:デフォルトの名無しさん
12/06/03 20:23:15.28
>>608
だから循環参照が原因だっつってんじゃねぇかハゲっ
610:デフォルトの名無しさん
12/06/03 21:08:37.12
>>608
両方ポインタなら回避できると聞いたんですけど、違うんですか?
611:デフォルトの名無しさん
12/06/03 21:15:31.14
ポインタでもCbdfが何かは書かないとわからない。class Cbdf;みたいに
612:デフォルトの名無しさん
12/06/03 21:41:55.41
> とりあえず他のエラー要因は無いということですか?
既出のように>>591の適切な場所にCbdfの宣言と;を追加すればとりあえずコンパイルは通る
が、意図したように動くか?
613:デフォルトの名無しさん
12/06/03 22:30:35.03
>>612
設計の話になってしまうのですが
マネージャークラスが保持する任意のクラスから、
同じくマネージャークラスが保持する他の任意のクラスにアクセスしたいんです。
ファイルの階層構造みたいな感じで、例えばwindowsの
Program FilesフォルダからWindowsフォルダにアクセスするときローカルディスクC:に戻るみたいな設計です。
C++風に書くと
LocalDiscAddress->GetWindowsAddr()->hoge
でも中々に読みづらい(´・ω・`)
614:デフォルトの名無しさん
12/06/03 23:43:59.83
メモリポインタを使うと動くよ
615:デフォルトの名無しさん
12/06/04 00:21:22.68
親クラス 子クラスがあります
親 hoge = new 子1
親 hoge = new 子2
みたいな感じで1つのオブジェクトで親と子の2クラスを両方扱いたいんです。
これは可能で、キャストすれば子独自のメソッドも使用可能なのはわかるんですが。
今親クラスのオブジェクトの宣言を std::auto_ptr で行なっているため、キャストが上手くいきません。
解決法としては、std::auto_ptr を辞めるしかないんでしょうか?他にいい方法がありましたら、
ご教授お願いします。
616:デフォルトの名無しさん
12/06/04 00:22:55.89
std::auto_ptrはそれ無理です
std::unique_ptr使ってください
617:デフォルトの名無しさん
12/06/04 01:25:07.50
>>615
auto_ptr でも static_cast<子1&>(*p) すりゃ何の問題も無いだろう。
何か他に制約があるようならコード晒せ。
618:デフォルトの名無しさん
12/06/04 01:36:00.60
ダウンキャストするぐらいなら最初から子のauto_ptr使えよ
619:615
12/06/04 01:36:05.78
dynamic_cast ではなく static_cast を使うんですか?
これは思いつきませんでした。ありがとうございます。
620:615
12/06/04 01:42:13.45
初めは子の auto_ptr を使っていたんですが、コーディングが冗漫になったので
ダウンキャストしようかと。
621:デフォルトの名無しさん
12/06/04 01:46:09.88
だったら親と子の型2つのスマポを用意して
同じオブジェクトを参照させるべき
auto_ptrじゃ使えねぇからshared_ptr使うことになるけどね
622:デフォルトの名無しさん
12/06/04 02:24:53.64
>>619
型を自分で保証できるなら static_cast でいい。
623:デフォルトの名無しさん
12/06/04 02:25:16.25
>>621
それはないわ。
624:デフォルトの名無しさん
12/06/04 05:39:45.46
安易なダウンキャストは止めたほうがいい
根底と、派生2つのポインターで管理してる場合は、
派生クラスを差し替えた際、派生のポインターで
コンパイルエラーを引き起こせる。根底のポインターを
1個使い回しダウンキャストする方法だと、
派生を交換しても実行時になるまで、キャストミスに
よるエラーが解らない。関数スコープならそこまで
面倒じゃないが、クラススコープだと問題特定が面倒になる。
625:デフォルトの名無しさん
12/06/04 07:07:32.40
UNIX系で C++ 勉強してて最近 Visual C++ 2010 はじめたばかりなんですけど
Visual C++ で時刻を取得するにはどうしたらいいんでしょうか
time.h インクルードしても
time_t time;
は宣言できるんですが
time(&time);
でエラーになります
レベルの低い質問ですいません…
626:デフォルトの名無しさん
12/06/04 07:15:56.30
エラーの内容を書けと
627:デフォルトの名無しさん
12/06/04 07:18:53.48
すいません><
式には(pointer-to0)関数型が必要です
っていうエラーがでます
628:デフォルトの名無しさん
12/06/04 07:25:16.64
うわあ はずかしい
ごめんなさい 自己解決しました
time_t t;
time(&t);
にしたらとおりました
C++は関数と変数で名前空間かぶっちゃだめなんですね
授業でならうの Java が多いのでので知りませんでした
おさわがせしました><
629:デフォルトの名無しさん
12/06/04 09:28:28.59
一定時間ごとにメッセージボックスを表示するだけのプログラムを作ったんですけど
メッセージボックスが表示されてないときにプログラム終了するには
タスクマネージャーからきるしかないんでしょうか…
好きなときに終了できるようにするにはどうするのがスマートなんでしょうか…
#include <windows.h>
#include <time.h>
#define INTERVAL 60
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
time_t prev = (time(NULL) + 300) / 1800;
while(1) {
time_t now = (time(NULL) + 300) / 1800;
if(now != prev) {
MessageBox(NULL, TEXT("時間で~す"), TEXT("時間で~す"), MB_OK | MB_TOPMOST | MB_SETFOREGROUND);
prev = now;
}
Sleep(INTERVAL * 1000);
}
}
630:デフォルトの名無しさん
12/06/04 09:33:59.01
>>629
例えば「好きなとき」をキー入力で伝えることにすれば、てきとうな API でキー入力でも監視すればいいだろう。
心を読んで欲しいということならたぶん無理だ。
631:デフォルトの名無しさん
12/06/04 09:43:08.60
あ~ 説明不足でごめんなさい
できればキーじゃなくて直感的に分かりやすい操作で終了dけいるようにしたいんですけど
たとえば常にベースパネルだけ表示させてそこに終了ボタンつけるとか…
下のタスクバーに表示させて右クリック終了みたいにできるとか…
って簡単にできますか?
なにぶん GUI プログラミング初心者なもので…
632:デフォルトの名無しさん
12/06/04 09:59:34.74
Shell_NotifyIconでgoogle
633:デフォルトの名無しさん
12/06/04 10:05:46.32
あ まさにやりことこれでした!
なんか難しそうですけどがんばってよんでみます!
ほんとにありがとうございました!
634:デフォルトの名無しさん
12/06/04 10:12:32.33
>>629
今度からは環境を明記の上、環境依存OKのスレに書いてね。
635:デフォルトの名無しさん
12/06/05 17:47:30.54
カンマで並列関係にある引数、(a1,a2)や(a,b)の順序が
固定されないのはいいけど
a1,a2,b1,a,b のように並列関係を超えて順序が未規定なのは何でだろう
これのせいで
f(std::unique_ptr<A>(new A()), std::unique_ptr<B>(new B()));
が危険なコードになってしまう
C++11で直せばよかったのに
どうせCと完全互換でないんだから例外に絡むところまで合わせる必要ないのに
636:635
12/06/05 17:49:38.33
1行目消しちゃった
f(a(a1(), a2()), b(b1())));
637:デフォルトの名無しさん
12/06/05 19:13:51.16
>>635
評価順序の話か?
その危険なコードとやらがどう危険なんだ?