C++相談室 part64
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/11/01(土) 21:32:27ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part63
http://pc11.2ch.net/test/read.cgi/tech/1217008269/
0002デフォルトの名無しさん
2008/11/01(土) 21:33:19ググレカス
http://www.google.co.jp/
0003デフォルトの名無しさん
2008/11/01(土) 22:47:59なぜ今たてる
0004デフォルトの名無しさん
2008/11/02(日) 00:52:16[Main.java]
abstract class A { protected abstract void foo(); }
class B extends A {
protected void foo(){System.out.println("foo!");}
public void bar(){pa.foo();}
public void set(A p){pa = p;}
private A pa;
}
public class Main { public static void main(String[] args) { B b = new B(); b.set(b); b.bar();}}
$ javac Main.java; java Main
foo!
[protected.cpp]
#include <iostream>
class A {
protected://public:とすれば問題無し
virtual void foo()=0;
};
class B : public A {
protected:
void foo() {std::cout << "foo!" << std::endl;}
public:
void bar() {pa->foo();}
void set(A* p) {pa = p;}
private:
A *pa;
};
int main() { B b; b.set(&b); b.bar(); return 0;}
$ g++ protected.cpp
protect.cpp:4: error: ‘virtual void A::foo()’ is protected
protect.cpp:10: error: within this context
0005デフォルトの名無しさん
2008/11/02(日) 09:51:03なんで、A を継承してるのにさらに A を内部に持とうとしてるの?
0006デフォルトの名無しさん
2008/11/02(日) 10:46:50Strategyみたいなことをしたいんじゃね?
<<4
インターフェースなのに公開しないというのが不思議だけど
どうしてもfooを呼ばれたくなければAの方をpublicにして、
protected継承すればよいと思う
0007デフォルトの名無しさん
2008/11/02(日) 13:32:000008デフォルトの名無しさん
2008/11/02(日) 22:43:03それ、Javaでもprotectedだから見えるのではなく、
同一パッケージのデフォルトアクセスのおかげで見えているだけだぞ。
BとAを別のパッケージに置くとJavaでもエラーになる。
0009デフォルトの名無しさん
2008/11/03(月) 10:09:46実行ファイルとライブラリを同フォルダに置いても、ライブラリがありませんと言われます。
LD_LIBRARY_PATHにカレントディレクトリをセットすれば動くのですが、毎回セットするのも
面倒で、だからといって/usr/libなどを汚したくもありません。
何か良い方法はないのでしょうか?
0010デフォルトの名無しさん
2008/11/03(月) 10:20:470011デフォルトの名無しさん
2008/11/03(月) 10:26:20やっぱりそれがいいのかな
自分が作った共有ライブラリを放り込むフォルダ作って、
パスを通しておく方法でいってみます。
0012デフォルトの名無しさん
2008/11/03(月) 12:40:29C++相談室 part63
http://pc11.2ch.net/test/read.cgi/tech/1221144557/
0013デフォルトの名無しさん
2008/11/03(月) 13:03:550014C++嫌いな人
2008/11/03(月) 18:59:04コンストラクタ、デストラクタ、メンバ関数、ポリモフィズム、
以外に何かあります?
テンプレートって使いどころが今一不明
0015デフォルトの名無しさん
2008/11/03(月) 19:00:530016デフォルトの名無しさん
2008/11/03(月) 19:33:08流石C++スレ
0017デフォルトの名無しさん
2008/11/03(月) 19:49:510018デフォルトの名無しさん
2008/11/03(月) 21:28:07テンプレートで要素の型を指定するから適宜よろしくやってくれる。
qsortよりはsortのほうが便利だ。
比較関数の引数がvoid*でないだけでも随分便利に感じる。
ソート対象と比較対象で要素の型を間違えれば警告やエラーになる。
まあエラーメッセージがわけわかめなのは御愛嬌。
0019デフォルトの名無しさん
2008/11/07(金) 02:55:24型によって異なる動作をさせたい時に使うのがポリモーフィズムで、
異なる型に同じ動作をさせたい時に使うのがテンプレート。
0020デフォルトの名無しさん
2008/11/07(金) 03:20:55同じ動作をさせたい時にテンプレート?
動作が同じなら普通にその動作を書けばいいだけじゃないの?
0021デフォルトの名無しさん
2008/11/07(金) 03:25:44>>20
型が違うので同じ処理には渡せない。
同じ処理をソース上複数書くと保守性に欠ける。
0022デフォルトの名無しさん
2008/11/07(金) 05:33:09それは同じ基底クラスから派生させてポリモーフィズムで解決することもできるだろ。
0023デフォルトの名無しさん
2008/11/07(金) 08:12:54テンプレートでやった方がスマートだよ。
0024デフォルトの名無しさん
2008/11/07(金) 08:38:140025デフォルトの名無しさん
2008/11/07(金) 08:53:03具体的に、何が良いのか言えるかな?
「スマート」とかいうあやふやな価値観でヘッダの依存関係を強制されるのは受け入れがたい。
0026デフォルトの名無しさん
2008/11/07(金) 10:26:260027デフォルトの名無しさん
2008/11/07(金) 20:52:20ある種のポリモーフィズムを実現する1つの手段としてテンプレートがあるというのが自分の認識。
0028デフォルトの名無しさん
2008/11/07(金) 21:10:530029デフォルトの名無しさん
2008/11/07(金) 21:35:32インタフェースとか継承とか使って、クラスA B Cが同じように見えて、同じように扱える。
使う側はABCの実装なんか気にすること無い。それぞれが勝手によろしくやってくれる。
で、ジェネリクスは template<typename T> G だろ。型 T を引数で渡すんだ。
型による違いは T を使う側、つまり G が面倒見なきゃならんのだな。
クラス X Y Z で G<X> G<Y> G<Z> とか。X, Y Z はお互いの違いなんて気にすること無く同じ機能を使える。
G が勝手によろしくやってくれる。
ところが T は型なんだ。つまり class なんだ。ってことはポリモフィズムが使えるんだ。
T をインタフェースにして、A B C がインタフェースを実装してたら、G は楽になるよな。
わざわざ場合わけする手間が省ける。A B C は同じ手続きを提供しているわけだから。
A B C が自分自身に関する情報を共通の手段で G に提供する。
ジェネリクス G は A B C のポリモフィズムを利用して、
さらに高レベルな手続きや機能を、A B C に付加するんだな。
そんなこんなで STL であり Boostなんだろうな。
0030デフォルトの名無しさん
2008/11/08(土) 03:25:500031デフォルトの名無しさん
2008/11/08(土) 14:55:16元々は関数のオーバーロードなどを指したけど、異なる型に対するテンプレートの実体化もある意味オーバーロードだからな。
0032デフォルトの名無しさん
2008/11/10(月) 23:50:57Interface -> Concepts
Inheritance -> Refinement
ってSGIのドキュメントに書いてあった。
0033デフォルトの名無しさん
2008/11/12(水) 18:34:20error LNK2019: 未解決の外部シンボル
"int __cdecl import_features(char *,int,struct feature * *)"
(?import_features@@YAHPADHPAPAUfeature@@@Z) が関数
"void __cdecl readfeatures(void)" (?readfeatures@@YAXXZ) で参照されました
とかいうエラーがでるんですけど、
どういうことをここではいってるんですか?
0034デフォルトの名無しさん
2008/11/12(水) 18:46:35恐らくは、readfeatures()で呼んでいる筈のimport_features()が見つからないのでしょう。
0035デフォルトの名無しさん
2008/11/12(水) 18:48:43宣言と定義が微妙に食い違ってて別物扱いされてるとかな。
0036デフォルトの名無しさん
2008/11/12(水) 18:50:490037デフォルトの名無しさん
2008/11/12(水) 19:43:17このスレにレスしなくても
0038デフォルトの名無しさん
2008/11/12(水) 23:41:47Parentのコンストラクタ内で複数のChildを生成します。
ここで、ChildからParentの情報を参照したくなったので、
ParentへのポインタをChildに持たせ、コンストラクタでParentへのポインタを渡そう思ったんですが、
Parent::Parent() : child1_(new Child(this)),child2_(new Child(this)) //←これはヤバス?{}
デバッガで覗くとあやしげな値が入っていて、どうやら無効なポインタぽいです
まだできてないインスタンスのポインタを持ってもしょうがないって事ですかね
こういう場合うまいこと子クラスに親の参照を持たせる方法ってないですか
適当にInit()関数とか用意して、そこで全ての子に親への参照を持たせるのが手っ取り早いのですが
子が親への参照を持ってない状態ができてしまうのと、
Parentクラスの利用者に余計な手間を強制してしまうのでイマイチな気がします
0039デフォルトの名無しさん
2008/11/12(水) 23:44:380040デフォルトの名無しさん
2008/11/13(木) 00:11:07必要になったときに作る。
0041デフォルトの名無しさん
2008/11/13(木) 00:11:18Childのコンストラクタで、渡されたParentオブジェクトをアクセスするのはNG
参照を憶えておくに留め、Parentのコンストラクト後にならいくらでもアクセスしてOK
>>39
Parentのスーパークラスに依存しているのかもしれない。
その場合は相互参照ではないね。
0042デフォルトの名無しさん
2008/11/13(木) 04:20:020043デフォルトの名無しさん
2008/11/13(木) 09:25:020044デフォルトの名無しさん
2008/11/13(木) 09:53:27値が変更されないだけ
0045デフォルトの名無しさん
2008/11/13(木) 11:06:21""int __cdecl import_features(char *,int,struct feature * *)"
(?import_features@@YAHPADHPAPAUfeature@@@Z)" は未解決です。
MfSift.obj
というエラーが出るんですけど、何が原因なんだと思いますか?
ヘッダに宣言、別ファイル.cに定義をしています。
他のソリューションでは動いていたんですが、このソリューションにコピペしたら
このエラーが出るようになり、困っています。
0046デフォルトの名無しさん
2008/11/13(木) 12:09:220047デフォルトの名無しさん
2008/11/13(木) 12:11:46もしかしてそれを .cpp から呼び出そうとした?
0048デフォルトの名無しさん
2008/11/14(金) 12:56:10// ...
numer / denom;
としたときに,0除算の例外が起きるときは denom == 0.0 が常に true になるときだけでしょうか?
それとも denom == 0.0 が false のときでも上記の除算で0除算の例外が生じる可能性はありますか?
0049デフォルトの名無しさん
2008/11/14(金) 14:04:39その辺の挙動を何とかしたいならアーキテクチャのマニュアル嫁
0050デフォルトの名無しさん
2008/11/14(金) 17:33:190051デフォルトの名無しさん
2008/11/14(金) 17:40:510052デフォルトの名無しさん
2008/11/14(金) 18:03:36Aというプログラムのヘッダで、
#include hoge/hoge.dll
として、hoge.dllを読み込み、
ProgramA.dllを作成したとします。
そしてこのProgramA.dllを全く別のディレクトリに入れて動かすことを考えているのですが、
この際、
hoge.dllは必要になりますか?
また、必要だとしたら、ProguramA.dllのあるディレクトリにhogeを作って、その中にhoge.dllを入れる必要がありますか?
0053デフォルトの名無しさん
2008/11/14(金) 18:05:02Aというプログラムのヘッダで、
#include hoge/hoge.dll
として、hoge.dllを読み込み、
ProgramA.dllを作成したとします。
そしてこのProgramA.dllを全く別のディレクトリに入れて動かすことを考えているのですが、
この際、
hoge.dllは必要になりますか?
また、必要だとしたら、ProguramA.dllのあるディレクトリにhogeを作って、その中にhoge.dllを入れる必要がありますか?
0054デフォルトの名無しさん
2008/11/14(金) 20:11:20C/C++ の #include ディレクティブを正しく理解するほうが先です
0055デフォルトの名無しさん
2008/11/14(金) 20:18:31コンパイルしたら何が起こるんだろう
こえー
005653
2008/11/14(金) 21:47:34vs2005の設定で読み込ませるだけです。
0057デフォルトの名無しさん
2008/11/14(金) 21:48:55同じDLLでも.NETのアセンブリはだいぶ性格が違うから。
0058デフォルトの名無しさん
2008/11/14(金) 23:27:290059デフォルトの名無しさん
2008/11/15(土) 02:25:01ここで説明されているD言語のtypedefのような,強いtypedefと同等のことをするにはどうするのが簡単でしょうか?
Boostなどの利用を前提とされても構いません
006059
2008/11/15(土) 02:57:37BOOST_STRONG_TYPEDEF
ってのがありました…
0061デフォルトの名無しさん
2008/11/15(土) 23:17:00それは数値型でだけしか意味を成さなかったような記憶が
0062デフォルトの名無しさん
2008/11/17(月) 23:30:13(namespace fugaのFooクラス)
class fuga::Foo; //これだとコンパイルエラー
namespace fuga{
class Foo; //これならおk
}
class Hoge{
fuga::Foo* f_;
};
なぜなんでしょうか
0063デフォルトの名無しさん
2008/11/17(月) 23:40:58そういうもんです、としかいいようがないやね
0064デフォルトの名無しさん
2008/11/17(月) 23:42:48::は名前空間解決をするのであって
名前空間を生成するわけじゃないから
0065デフォルトの名無しさん
2008/11/18(火) 00:09:06どこか分かる方教えて下さいませ。
0066デフォルトの名無しさん
2008/11/18(火) 00:10:33visual studio2008のソースって流出してたっけ
0067デフォルトの名無しさん
2008/11/18(火) 00:16:58ん?
0068デフォルトの名無しさん
2008/11/18(火) 00:18:340069デフォルトの名無しさん
2008/11/18(火) 00:18:520070デフォルトの名無しさん
2008/11/18(火) 00:22:48http://msdn.microsoft.com/ja-jp/library/52f3sw5c.aspx
ここに載ってる
0071デフォルトの名無しさん
2008/11/18(火) 00:24:56Visual C++ C/C++ プログラムのビルド
0072デフォルトの名無しさん
2008/11/18(火) 00:32:37ありがとうございます
0073デフォルトの名無しさん
2008/11/18(火) 20:12:42暫定的なプログラムが出来上がり、ビルド→デバッグなしで開始、と実行出来たのは良いのですが、
結果出力用のファイル名をscanfで受け取るように変更し、ファイル操作等を行っているところでおかしくなってしまい、
最終的には初めの上手く動作していたソースコードに新たにprintf文を付け加えただけで上手く動かない状態となってしまいました。
アルゴリズムはSIMPLEという半陰解法を用いており、未知数である圧力、速度をループ計算で解くというものです。
ループ内で、各回の収束判定変数の推移をprintfで出力していますが、これは正常に動作して16回のループで終了します。
新たなprintf文を加えると、この変数が2ループ目から#QNAN0となってしまい、圧力、速度を得ることができません。
このprintf文はループ内においても、その外側のmain文中においても同様です。
stdio.hに問題があるのかと思い、改めてscanf文を入れてみたところ、特に問題はありませんでした。
しかしputs("")では同様に異常が見られます。
収束判定用の変数には何も関与していないのに、こんなことがあるのでしょうか。
プログラミング環境の問題かとも思いますが、何か情報があれば力を貸していただきたいです。
0074デフォルトの名無しさん
2008/11/18(火) 20:15:590075デフォルトの名無しさん
2008/11/18(火) 20:35:110076デフォルトの名無しさん
2008/11/18(火) 21:09:58>>74
初期化せずに扱っているものはないと思います。
>>75
現在scanfは用いていないのですが、スタックの破壊は具体的にどういう現象がおきていそうなのでしょうか。
0077デフォルトの名無しさん
2008/11/18(火) 21:10:330078デフォルトの名無しさん
2008/11/18(火) 21:11:560079デフォルトの名無しさん
2008/11/18(火) 21:15:43一見何も関係なさそうな変数がいつの間にかぶち壊れてるからな
0080デフォルトの名無しさん
2008/11/18(火) 21:24:410081デフォルトの名無しさん
2008/11/18(火) 23:03:470082デフォルトの名無しさん
2008/11/18(火) 23:58:59デバッガ使えるなら、問題の変数の値がQNANになる所で
ブレークしかけておけば原因がすぐわかると思うよ。
0083デフォルトの名無しさん
2008/11/19(水) 12:25:56スタックの破壊については昨日調べました。
>>81
参考になるか分かりませんが、プログラムの概略を載せます。
1 int main(void){
2 grid(); //格子を切る関数
3 init(); //初期値を代入
4 while(sorce>sormax){
5 cal_U(); //それぞれ速度U、V、Pを計算する関数
6 cal_V();
7 cal_P();
8 sorce = maxof3(resorm, resoru, resorv); //maxof3()は3数の最大値を返す
9 printf("%lf %lf %lf %lf\n", sorce, resorm, resoru, resorv);
10 }
11 output(); //結果を出力
12 }
だいたいの流れはこのような感じです。
11行目以降はprintfを入れても問題なく走ります。
デバッガのことは知らなかったので、とりあえず今Visual C++ Express Editionのデバッグ機能を使ってデバッグをしてみました。
2行目にprintf("aiueo.\n");と入れてステップインで一行ずつ実行していくと、これまでと違い、このprintf文も実行され、ループも問題なく回っています。
これは何を意味しているのでしょうか…。
0084デフォルトの名無しさん
2008/11/19(水) 13:16:30ていうか関数間のデータのやり取りにグローバル変数使うのヤメロ。
0085デフォルトの名無しさん
2008/11/19(水) 18:30:29しかしひでープログラムだな
ローカル変数を知らないのか?
0086デフォルトの名無しさん
2008/11/19(水) 20:51:15流れであって実際のコードじゃないです。
ローカル変数に見えているのは実際にはファイルのstatic変数なんです
0087デフォルトの名無しさん
2008/11/19(水) 20:58:23ロダに上げてもらえば一発でバグの原因が分かるんだが・・・
0088デフォルトの名無しさん
2008/11/19(水) 21:05:29CodeGuardはいい機能と思っているが
いま、バカのC++を使ってるのってほとんどいないだろ。
VS用CodeGuardやVS用CodeGuardもどき ってないのか?
0089デフォルトの名無しさん
2008/11/19(水) 22:23:3083のコードにローカル変数なんか一つもないじゃないか
てか変数壊してるかもって話なのに変数定義省略するとかふざけてるのか
やっぱりわかってないのね
とりあえずCの勉強し直すのをお勧めする
0090デフォルトの名無しさん
2008/11/19(水) 22:47:59聞いているのは、どうしたら問題の部分を発見できますかじゃないのか?
問題箇所発見方法を聞いているのであって、(トンでもないプログラム構成だろとは想像できるが)
文法、コーディングスタイルは聞いていないと思う。それにCの勉強し直すのをお勧めする じゃ
ある意味的外れだろ(ググれカス的かな)
問題箇所部分の推定すら出来てない状況じゃ、かなりな部分のコードさらさないと駄目な気がする。
0091デフォルトの名無しさん
2008/11/19(水) 23:28:410092デフォルトの名無しさん
2008/11/19(水) 23:53:10で、コンパイル通るんですか? 試してないですが、通らないですよね
で通った場合、最後の%lfは何を(どこを)表示するんですか
0093デフォルトの名無しさん
2008/11/19(水) 23:57:11スタック上の適当なデータを勝手にIEEE実数だと仮定して読んだ積もりになる。
しかも、恐ろしいことに%fを生で使っているので数百桁出力することも有り得る。
0094デフォルトの名無しさん
2008/11/20(木) 00:04:37○%f
C++ はまだこうだな。
そして、printf のフォーマットまでチェックするコンパイラもあるけど、
全くチェックしないコンパイラもある。
まあ、ログ入れると動くっていう変なバグは大抵スタックを破壊してる。
スタックを破壊する原因は、
・ 配列のインデックス計算にミスがあり、配列外の領域に書き込んだ
・ 配列のインデックスに未初期化の変数を使って、配列外の領域に書き込んだ
・ ポインタの演算にミスがあり、予期しない領域に書き込んだ
・ 未初期化のポインタを使用し、予期しない領域に書き込んだ
など、色々あるが、どれも原因特定には地道な作業が必要だ。
0095デフォルトの名無しさん
2008/11/20(木) 00:08:02ローカル配列変数の扱いにまずいところがないかチェックだな。
0096デフォルトの名無しさん
2008/11/20(木) 00:20:57>全くチェックしないコンパイラもある
ガクガクブルブル、信じられな
それはprintf系だけで話で、
自分で関数f(a,b,c)を作り、たとえば、これをf(a,b)とか、f(a,b,c,d)とか書くと
この場合は全てのコンパイラーでエラー絶対に起こりますよね? 起こらないのあったりして
009796
2008/11/20(木) 00:25:27なんか、orzです。
0098デフォルトの名無しさん
2008/11/20(木) 00:26:56C++では通常有り得ない。Cで未宣言の状態で関数を呼ぶ場合は、大いに有り得る。
まぁ、C++でもprintf()の例で判るように可変個数引き数(...)があればチェックされないが。
0099デフォルトの名無しさん
2008/11/20(木) 00:30:55可変引数は普通チェックされないけど
printf系とかだけ、第一引数の内容と残りの引数の整合性を見てくれるコンパイラがあることを言ってるんじゃないの?
010096
2008/11/20(木) 00:39:35ありがとうございます。CでもC++で(.cpp拡張子つけて)コンパイルすることにします。
ただ、printfは引数の数チェックしていないと覚えておかないといけないですね。
そうしないと、printfが終わった時点でまだ使うスタック変数を失う可能性がありますね。
0101デフォルトの名無しさん
2008/11/20(木) 00:42:05>そうしないと、printfが終わった時点でまだ使うスタック変数を失う可能性がありますね。
何を仰っているのかよく判りませんが、なにやら勘違いをなさっているとお見受けしました。
0102デフォルトの名無しさん
2008/11/20(木) 00:44:01printf("%x", p);
だと警告が出る(vs2005)
printf("%p", p);
は当然でない
010396
2008/11/20(木) 00:46:54printf,sprintfでも変数は可変個数引だから、チェックなしは当然かな
0104デフォルトの名無しさん
2008/11/20(木) 00:47:530106デフォルトの名無しさん
2008/11/20(木) 00:58:19printf()の使い方をどう間違えたところで、ローカル変数がおかしくなるなんてことは(%nでも使わない限り)有り得ない。
それはさておき、「スタック変数」なんて妙ちきりんな言葉を使いなさんな。
0107デフォルトの名無しさん
2008/11/20(木) 01:00:12もしかしてcal〜とかmax〜の関数の中で配列使ってないか?
使ってるなら配列に値を代入する直前にインデックスをprintfして
配列のサイズを超えた値になってないか確認してみ。
俺の予想では、そんだけグローバル変数が多いところを見ると、
きっとインデックスもグローバル変数になってて、
初期化もせずに使い、2回目以降のループで死んでるとみた。
0108デフォルトの名無しさん
2008/11/20(木) 01:06:27for(int i=0; i<MAX; i++)
がその類のミスを除く常套句として使えるな
多言語だとforかforeachで書くループがwhileになってるFORTRANを逐語訳して死んでるのはたまに見るな
0109デフォルトの名無しさん
2008/11/20(木) 01:24:00index-1するのを忘れる可能性がw
0110デフォルトの名無しさん
2008/11/20(木) 06:54:06<>比較演算子だとRandom Access Traversalを要求するからのう
0111デフォルトの名無しさん
2008/11/20(木) 16:00:10FindNextFileA と FindNextFileW を内部で自動的に切り分けているような
クラスを使う時に、MBCSとUNICODE両方に対応するコードは
どうやって書いてる?
#ifdef UNICODE
#define FindNextFile FindNextFileW
#else
#define FindNextFile FindNextFileA
#endif
は邪道??
0112デフォルトの名無しさん
2008/11/20(木) 16:07:540113デフォルトの名無しさん
2008/11/20(木) 16:09:210114111
2008/11/20(木) 16:18:24そうだよね。
ただ、クラスのメソッドだけと取り上げてdefineすると、
インテリセンスに違和感ない?
ドット打っても、こんなメソッドねーYO!なのにコンパイル通る不思議。
保守で胸やけしそう。
みんなこんなもんなのかな。
>>113
メソッド名に流用しても平気?
流用が気持ち悪いなら _FindNextFile とかにしようかな。
0115デフォルトの名無しさん
2008/11/20(木) 16:20:46コンパイルできるという点では平気。あとは好みの問題。
ちなみに、ATL/WTLではUNICODE切り替えに関して全面的にWin32API用の#ifdefを流用している。
0116デフォルトの名無しさん
2008/11/20(木) 16:21:200117111
2008/11/20(木) 16:27:51ほぉー!そうなのか。
勉強になりました。ありがとう。
>>116
なんかそれ以前誰かにも言われたな・・・
互換性の為に残してあるとか。
そういえば今だに _ の意味がよく理解できてない俺は所詮VB厨
_ と __ との違いとか意識して使ってる?
0118デフォルトの名無しさん
2008/11/20(木) 16:45:032._で始まり、英大文字が続く識別子
3.__を含む識別子
以上は処理系のために予約されており、ユーザが使うことは規格違反になる。
0119デフォルトの名無しさん
2008/11/20(木) 16:48:180120デフォルトの名無しさん
2008/11/20(木) 18:10:19105は、たぶんprintfとscanfを混同しているのだと思う。
スタック変数というのは確かに変な用語だがw
スレも、あまりに自然な流れで話題が scanf→printf へ移ってるからな
>>105
とりあえず俺からできるアドバイスは、
そのようなバグは、対処療法的に直すというよりも、プログラムの書き方を改善すると
自然に治るというパターンの方が多い。急がば回れ。
とりあえず、そのstatic変数を、*すべて* ローカル変数と関数の引数にすること。
数値計算のプログラムだったら、static変数なんかいらないだろ
0121デフォルトの名無しさん
2008/11/20(木) 18:41:09>>105と元祖質問者>>73は別人だろ
105=96と元祖質問者>>73の書き方はだいぶ違う。
0122デフォルトの名無しさん
2008/11/21(金) 00:50:35int foo, bar, hoge;
int a, b, c, d, e, f, g;
unsigned char h, i, j, k, l, m, n;
double piyo, piyopiyo, baz, foobar;
int x, y, z;
};
int main() {
God god;
Foo(&god);
Bar(&god);
Hoge(&god);
FooBar(&god);
Baz(&god);
}
と書いて満足されるかもしれない恐怖。
0123デフォルトの名無しさん
2008/11/21(金) 01:17:50#define cahr char
#define unsinged unsigned
0124デフォルトの名無しさん
2008/11/21(金) 01:21:220125デフォルトの名無しさん
2008/11/21(金) 02:41:25変数名retrunはやっぱ普通に困るよ
0126デフォルトの名無しさん
2008/11/21(金) 14:45:44std::bad_alloc
以外に何がありますか?
例外一覧が乗っているサイトとかありますか?
0127デフォルトの名無しさん
2008/11/21(金) 14:55:500128デフォルトの名無しさん
2008/11/21(金) 14:58:310129デフォルトの名無しさん
2008/11/21(金) 15:00:07標準例外でググったら見つかりました
ttp://www.geocities.jp/ky_webid/cpp/library/027.html
0130デフォルトの名無しさん
2008/11/21(金) 15:00:350131デフォルトの名無しさん
2008/11/21(金) 15:09:09ぬるぽは、何でcatchしたらいいんですか?
0132デフォルトの名無しさん
2008/11/21(金) 15:12:53ない、つーか無効なポインタ参照しちゃっても例外投げない
0133デフォルトの名無しさん
2008/11/21(金) 15:16:45つまり、何が起きるのか (例外が発生するのか、シグナルが発生するのか、
何事もなかったかのように動作し続けるのか、鼻から悪魔が出るのか)、
C++の規格では定義されていません。
0134デフォルトの名無しさん
2008/11/21(金) 15:40:30int* p = 0;
*p = 100; // SNT(スーパーぬるぽタイム)
}catch( int e ){
printf( "%d exception\n" , e );
}catch( std::exception e ){
printf( "exception(%s)\n" , e.what() );
}catch( ... ){
printf( "misc exception\n" );
}
一応、misc exception って出るんですお
0135デフォルトの名無しさん
2008/11/21(金) 15:44:06げにおそろしきぬるぽ
0136デフォルトの名無しさん
2008/11/21(金) 16:16:16そういう変なものを例外で受け取れてしまうのはWindowsだけ(構造化例外)
0137デフォルトの名無しさん
2008/11/21(金) 16:21:250138デフォルトの名無しさん
2008/11/21(金) 17:47:56ポインタを出リファレンスしたりするとI/Oには読むだけで
動作するものもあるので、鼻から悪魔としか言えない
0139デフォルトの名無しさん
2008/11/22(土) 03:38:26たとえばWindowsのコモンコントロールを使うには
InitCommonControl()を事前に呼んでおく必要があります
class hoge{
public: static once_init(){ legacy_global_init(); }
};
hogeを使うユーザが明示的にonce_initを呼ぶ決まりにしておけばいいだけの話なんですが、
なるべく初期化関数を呼ぶ必要がない様にしたいです
そこで、翻訳単位内に
struct static_initializer{ static_initializer(){ legacy_global_init(); } };
というクラスを作って静的なインスタンスを作成し、
namespace{ static_initializer s_inst; }
自動的に初期化させる様にしました。
他の翻訳単位の初期化関数に依存する時はまずそうですが、
その他気をつける事はありますか?
というかこういう処理をするのはどうするのがセオリーなんでしょうか
0140デフォルトの名無しさん
2008/11/22(土) 03:45:28class hoge{
static int x;
hoge() {
if (x == 1) {
x = 0;
legacy_global_init();
}
}
};
hoge::x = 1;
0141デフォルトの名無しさん
2008/11/22(土) 03:48:42精々、互いに無関係な変数の初期値設定くらいだろうな。
複数のコントロールをまとめて一つの単位として扱いたいなら、ビルダーパターンとか、ファクトリとかのクラスを作って
そのクラスの初期化関数を一発呼ばせる。それくらいはさせるべきだろ、
ユーザーがコントロールの初期化の前に何かやりたいと思ったときにそれが出来ないんじゃ困る。
0142139
2008/11/22(土) 03:50:40そちらの方が初期化が遅延されるので、hogeクラスを全く使わない時には
初期化関数が呼ばれないので無駄が無くていいですね
マルチスレッド環境で気をつけないといけないですが
0143139
2008/11/22(土) 03:53:36>ユーザーがコントロールの初期化の前に何かやりたいと思ったときにそれが出来ないんじゃ困る。
確かにこの視点は抜けてました
ユーザの自由度はなるべく下げたくないですね
デザインパターンですか
ちょっと勉強してきます
0144デフォルトの名無しさん
2008/11/22(土) 11:11:57仮想関数から、基底クラスのメンバー変数を参照する、クールな方法を教えて、もらえませんか
基底クラスには、そのメンバー変数に対する、アクセッサー(set/get関数)は、実装しているのですが
当たり前のことですが、基底クラスで、その、メンバー変数をセットしたものは、派生先の、基底クラスから、
呼び出しても、コンストラクターが、呼び出されだけで、初期化されたメンバー変数しか、取得できません(当然のことですが)
基底クラス、派生クラスに関係ない、普通に、C言語タイプの関数を定義して(クラスを定義しないという意味です)
そこで渡す方法とか、有ると思うのですが、2ちゃんねらー諸兄のテクニックを、伝授してください、長文スマソ。
0145デフォルトの名無しさん
2008/11/22(土) 11:13:26○当たり前のことですが、基底クラスで、その、メンバー変数をセットしたものは、派生先クラスから、
すみません
0146デフォルトの名無しさん
2008/11/22(土) 11:36:19こうか? 普通に取得できるようだけど
class Base {
private: int foo;
public: Base() : foo(0) {}
int GetFoo() { return foo; }
void Bar() { foo = 42; Hoge(); }
virtual void Hoge() = 0;
};
class Derived : public Base {
public:
virtual void Hoge() { cout << GetFoo() << endl; }
};
int main() {
Base *p = new Derived();
p->Bar();
}
0147デフォルトの名無しさん
2008/11/22(土) 11:36:39意味が分からん。クールとか無理。
とりあえず自分で書いたコードでも見せてくれないか?
0148デフォルトの名無しさん
2008/11/22(土) 11:56:10意味がわかりづらい上に、なんだその西村京太郎みたいな読点。
0149デフォルトの名無しさん
2008/11/22(土) 11:56:210150デフォルトの名無しさん
2008/11/22(土) 11:58:180151デフォルトの名無しさん
2008/11/22(土) 15:22:24エディットボックス内の背景色の変更の仕方がわからない。
とりあえず、色を指定してブラシを変更して再描画命令出してみたけど書き換わらないんだけどどうすればええん?
0152デフォルトの名無しさん
2008/11/22(土) 15:27:330153デフォルトの名無しさん
2008/11/22(土) 16:30:360154デフォルトの名無しさん
2008/11/22(土) 16:59:06WM_CTLCOLORでブラシの設定はさせてみたけど変わりませんでした
0155デフォルトの名無しさん
2008/11/22(土) 17:43:09テンプレート使って要素1つ1つキャストするクラス作ろうとしたんだけど、
テンプレートってenum型はダメなのね。。
enum HOGE {
A = 0;
B = 1;
};
HOGE hoge[] = { 0, 0, 1, 1 };
// ↑暗黙キャストされないからエラー
0156デフォルトの名無しさん
2008/11/22(土) 18:00:24hDC弄るんじゃなくて、返り値にヒープに作ったブラシハンドルを返すんだ
0157デフォルトの名無しさん
2008/11/22(土) 18:24:56enumの使い方が間違ってないか。
0158デフォルトの名無しさん
2008/11/22(土) 18:27:26HOGE hoge[] = { A, A, B, B };
でいいんじゃないか?
0159155
2008/11/22(土) 20:25:34>>158
うーん、やっぱ使い方がおかしいか。
配列初期化するときだけはintで書いた方がわかりやすいんだけど、
それはそれで別途変換コード書いたほうがいいか。
どうもありがとう。
0160デフォルトの名無しさん
2008/11/22(土) 21:14:34継承したクラスのメソッドを置き換えるってイメージなんだけど
何でわざわざ別の処理に変更させるの?
0161デフォルトの名無しさん
2008/11/22(土) 21:22:260162デフォルトの名無しさん
2008/11/22(土) 21:25:11了解。
一応ググってみたけれどけどもう少し解りやすい
メリットを提供して頂けると僥倖。
0163デフォルトの名無しさん
2008/11/22(土) 21:31:050164デフォルトの名無しさん
2008/11/22(土) 21:35:370165デフォルトの名無しさん
2008/11/22(土) 21:45:18全然関係ないですが"僥倖"って言葉初めて知りました
でも、明日には忘れてそうです><
これが、クールな表現なんだな。
0166デフォルトの名無しさん
2008/11/22(土) 21:49:57その上、本来カキコする内容すら忘れてしまいました。orz
0167デフォルトの名無しさん
2008/11/22(土) 21:50:44一個の雛形で色々出来ると便利だから
0168デフォルトの名無しさん
2008/11/22(土) 21:54:58ひな形?
0169デフォルトの名無しさん
2008/11/22(土) 22:03:14http://www.google.co.jp/search?hl=ja&q=vitrual&lr=&aq=f&oq=
0170デフォルトの名無しさん
2008/11/22(土) 22:47:380171デフォルトの名無しさん
2008/11/23(日) 00:43:26では任意の関数を格納できるポインタはどう宣言すればいいでしょうか
一応
int bar(int i){ cout << "bar arg = " << i << endl; return i + 2; }
//関数ポインタに入れて
void (*fp)() = reinterpret_cast<void(*)()>(bar);
//取り出して
int (*fp_arg1)(int i) = reinterpret_cast<int(*)(int)>(fp);
//実行する
std::cout << "return value = " << fp_arg1(3) << std::endl;
とむりやりキャストしてみると一応動きます
0172デフォルトの名無しさん
2008/11/23(日) 00:48:19そうなの? 「互換性」がどういう意味か分からないが、キャストは出来ると思うが。
メンバ関数ポインタは無理だけどね。
0173デフォルトの名無しさん
2008/11/23(日) 00:56:27関数ポインタから void* へキャストできることも多いけど、移植性の面では避けたいところ。
C++98,2003 では確かにできないことになっているし、次の改訂で変更が入るものの
"conditionally-supported behavior" とかいう微妙な扱いになってる。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#195
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#573
0174デフォルトの名無しさん
2008/11/23(日) 00:57:56関数ポインタはその保証がない
もしかしたらvoid*より大きいかもしれない
0175171
2008/11/23(日) 01:08:15今ソースを見ているんですが、心が折れそうです
0176デフォルトの名無しさん
2008/11/23(日) 01:10:400177デフォルトの名無しさん
2008/11/23(日) 01:13:04> sizeof(X*)はXがvoidかデータ型なら同じになることが保証されてるけど
いや、それは無いだろ。
0178デフォルトの名無しさん
2008/11/23(日) 01:20:010179デフォルトの名無しさん
2008/11/23(日) 01:37:36ごめん、そんな保証なかった
>>171
5.2.10.6
関数へのポインタは、別の関数へのポインタに明示的に変換することが出来る。
ある関数の定義で用いられた関数型とは異なる関数型へのポインタを介して関数呼び出しを行った結果は、未定義とする。
型"T1へのポインタ"の右辺値から型"T2へのポインタ"(ここでT1及びT2は、関数型とする)へのポインタ変換の結果は、
それを元の型に戻すと元のポインタ値に戻ることを除いて、未規定とする。
これ読む限り、関数型同士ではreinterpret_castし直せば戻ることが保証されてるみたいだから
void (*)()にでも格納すればいいんじゃね
0180171
2008/11/23(日) 01:43:44なるほど
元のシグネチャでちゃんと取り出せば、
とりあえずは何の関数ポインタに格納しておいてもいいんですね
void(*)()に入れておきます
ありがとうございました
0181デフォルトの名無しさん
2008/11/23(日) 01:44:540182デフォルトの名無しさん
2008/11/23(日) 13:12:22例えば MS-DOS のミディアムモデルやコンパクトモデルだな。
このあたり知ってれば互換性が無いのは当然の話と分かる。
0183デフォルトの名無しさん
2008/11/23(日) 13:13:32データポインタと関数ポインタはビット幅が違うこともあるよ
0184デフォルトの名無しさん
2008/11/23(日) 13:17:26printfのフォーマット文字列に、関数ポインタ用の%pが無いのは規格の不備ではないかと思っている
0185デフォルトの名無しさん
2008/11/23(日) 13:19:43流石にメンバポインタはどう表現していいものか分からんから
無くても仕方が無いとは思うが・・・。
0186デフォルトの名無しさん
2008/11/23(日) 17:23:04i8086 を持ち出すならデータポインタ同士、関数ポインタ同士でもサイズが違ったりするだろ
0187デフォルトの名無しさん
2008/11/23(日) 17:56:40それを語ることの出来るってことは、このスレにはおじちゃん世代が
かなり居るってこと?おじちゃん世代ってもう現役PGじゃないですよね
0188デフォルトの名無しさん
2008/11/23(日) 18:50:560189デフォルトの名無しさん
2008/11/23(日) 18:51:40near ポインタと far ポインタは標準じゃないし・・・。
0190デフォルトの名無しさん
2008/11/23(日) 20:21:18「自分で興味があるから小さい頃から触ってた人」と
「他に何も出来ないから専門学校を出て職業コーダーになった人」の違いですよ。
0191デフォルトの名無しさん
2008/11/23(日) 20:25:03未だにVistaでもDOSプロンプト積んでるんだからおぢいちゃんとかおぢちゃん世代って言われる筋合いねぇっていうか
未だにバッチ処理させるのに使ったりするし、今現在「定年まで勤めたプログラマ」は存在しない
0192デフォルトの名無しさん
2008/11/23(日) 20:28:51その前者はいつまで現役でプログラミングしてるもんなんだろ
当然,やりたい仕事ができるかぎりは引退までなん?
0193デフォルトの名無しさん
2008/11/23(日) 20:38:48どちらもまだ20代でしょうけど。
0194デフォルトの名無しさん
2008/11/23(日) 20:47:28Win3.1以前のユーザーなら誰しも少なからずDOSに触れたことがあるはずだから、
たとえば小学校の真ん中くらいに、最初に買って貰ったPCに入ってたのがWin3.1、
なんて人は、DOSの使用経験があってもまだ20代の半ばくらいだね。
>>190が言いたいのはそういうこと(年齢よりは本人の"PC歴"に依存する)では。
0195デフォルトの名無しさん
2008/11/23(日) 21:12:34それとも同じとしているのか?
厳密に言うなら、Win2000以降はDOSプロンプトじゃないんじゃない?
0196デフォルトの名無しさん
2008/11/23(日) 21:15:52自分では現役でいたくても、会社が強制引退にするのがほとんど
フリーには多いのかもしれないが、40代で主業務がプログラミングなのうちでは
ほとんどいないな
0197デフォルトの名無しさん
2008/11/23(日) 21:31:52そもそも、16bitコマンドってまだVistaでも動くのか?
0198デフォルトの名無しさん
2008/11/23(日) 21:35:350199デフォルトの名無しさん
2008/11/23(日) 21:36:47動くけど、16bit用の日本語のデータが無いから日本語使うプログラムは動かないし
最初のWindows向けに書かれたプログラム何も弄らなくってもVistaで動くものもあるっていう・・・
0200デフォルトの名無しさん
2008/11/23(日) 21:47:27そんなことをしているソフトもほとんどVistaのコマンドプロンプトで動くのか
0201デフォルトの名無しさん
2008/11/23(日) 21:48:48ハンドアセンブルできるよ。
0202デフォルトの名無しさん
2008/11/23(日) 21:50:2198SEとかはまだ現役なところもあるって聞くし。
それと、自作暦が数年以上あるような人は
BIOSのアップデートとかで(無意識かもしれないが)
DOSに触ったことがある人も居るだろう。
だから何だと言われればそれまでだが。
0203デフォルトの名無しさん
2008/11/23(日) 22:02:47というか仮想メモリの概念がない
OS含めて全プロセスが同じアドレス空間を共有する
0204デフォルトの名無しさん
2008/11/23(日) 22:08:250205デフォルトの名無しさん
2008/11/23(日) 22:20:20CP/M-80、FLEX、OS9 とか使ったことあるよな
0206デフォルトの名無しさん
2008/11/23(日) 22:24:00ちょっと前に「flexって知ってる?」って聞かれて
「yacc/lexのlexのgnu版のflex?」って答えて恥かいたw
0207デフォルトの名無しさん
2008/11/23(日) 22:46:28vistaはもう保証外のはずだけど
9x系のDOSプロンプトは、リアルモードじゃなくて仮想86モードで動いてた(>>204で)。
で、その場合はI/Oは全てトラップされて9xのカーネル内でエミュレートされて
正常に動くようになっていた。
もちろん、単純にI/Oを発行しなおしても調停等が無ければ正常に動くわけ無いので
それをうまく動かすために、MSは個別対応等多大な努力をしたと聞く。
ビデオやディスク等BIOSを使うのが普通だったものはともかくとして、
サウンド関係なんかはI/O直が普通だったので相当苦労したらしい。
0208デフォルトの名無しさん
2008/11/23(日) 23:10:34俺はflexと聞くとflexlmを思い出す
0209デフォルトの名無しさん
2008/11/24(月) 00:17:20アセンブラM80、リンカL80、ライブラリアンLIB80
aseg
.z80
org 100h
まずこれで始めたよな。
0210デフォルトの名無しさん
2008/11/24(月) 00:38:050211デフォルトの名無しさん
2008/11/24(月) 00:46:49それどころか、9xだとWin32アプリからもIOできて、DOSアプリ同様トラップして処理される。
自分がやったのは直接ディスクアクセスで、使ったのはint割込だったけど。
0212デフォルトの名無しさん
2008/11/24(月) 09:18:010213デフォルトの名無しさん
2008/11/24(月) 09:37:370214デフォルトの名無しさん
2008/11/24(月) 10:19:320215デフォルトの名無しさん
2008/11/24(月) 10:26:410216デフォルトの名無しさん
2008/11/24(月) 10:30:41できた、ありがとう
0217デフォルトの名無しさん
2008/11/24(月) 18:22:41public:const int a;
};
class clsB{
public:clsA ca;
};
上記のような2つのクラスがあります。
この場合、clsBのcaのaの定数を指定する場合、どのようにしたら良いのでしょうか。
教えてください。
0218デフォルトの名無しさん
2008/11/24(月) 18:24:030219デフォルトの名無しさん
2008/11/24(月) 18:31:28後だしですみませんが、コンパイラはVC++2008です。
0220デフォルトの名無しさん
2008/11/24(月) 18:33:27どうやったら、どうなったのか書けよ。
読んでるほうはエスパーじゃない。
0221219
2008/11/24(月) 18:36:100222219
2008/11/24(月) 18:37:14clsBのcaのaの値を設定したい、ということです。
0223デフォルトの名無しさん
2008/11/24(月) 18:37:36public:const int a;
clsA( const int a ) : a( a ){ ; }
};
class clsB{
public:clsA ca;
clsB( const int a ) : ca( a ){ ; }
};
int main( void ){ clsB b( 10 ); std::cout << b.ca.a; return 0; }
こういうことか?
0224デフォルトの名無しさん
2008/11/24(月) 18:38:120226デフォルトの名無しさん
2008/11/24(月) 18:52:550227デフォルトの名無しさん
2008/11/24(月) 19:11:51clsA( const int a ) : a( a ){ ; }
の;をとったらコンパイルエラーは直りますか?
0228デフォルトの名無しさん
2008/11/24(月) 19:14:07>>220
どんなコンパイルエラーか書けよ
0229デフォルトの名無しさん
2008/11/24(月) 19:26:14ここに出て来るaはどっちがどっちのaなのか調べろよ。コンパイラも混乱するわ。
C++なんてトラップの多い言語使わずにPythonとか使っとけ。
0230デフォルトの名無しさん
2008/11/24(月) 19:33:18これ
エラー:E0000、あなた嫌い
でつ
0231デフォルトの名無しさん
2008/11/24(月) 20:52:31でもあなたは;をとったらどうなるか
意味はわかっているのですか?
0232デフォルトの名無しさん
2008/11/24(月) 20:55:40とっても増やしても変わらないよ
0233デフォルトの名無しさん
2008/11/24(月) 21:01:23それはどういうことですか?
分かりやすく教えてください
0234デフォルトの名無しさん
2008/11/24(月) 21:32:47何も無い関数の中に;つけておくのもここ何も無くて終わるよって人間の為だし
;の有無でかわるか?って聞く前にコンパイル通して試してみろよと。
頭の中でコンパイルできないなら、機械を使え、機械に使われるなバカ
0235デフォルトの名無しさん
2008/11/24(月) 21:57:21Visual C++ 2008 Express Editionで確認した
0236デフォルトの名無しさん
2008/11/24(月) 22:40:12> ;はその行の終わりを示すんだからあろうがなかろうが変わらない
行の終わりは改行だと思うのですが?
> 何も無い関数の中に;つけておくのもここ何も無くて終わるよって人間の為だし
そういう人は何も無い関数の中に;がないと何か続きがあると思うのでしょうか?
0237デフォルトの名無しさん
2008/11/24(月) 22:55:35> 行の終わりは改行だと思うのですが?
いいえ。
> そういう人は何も無い関数の中に;がないと何か続きがあると思うのでしょうか?
そういう人を探して訊いてみればいいと思います。
0238デフォルトの名無しさん
2008/11/24(月) 23:07:04バカとバカががっぷりよつに組んでるようにしか見えん。
0239デフォルトの名無しさん
2008/11/24(月) 23:12:430240デフォルトの名無しさん
2008/11/24(月) 23:19:230241デフォルトの名無しさん
2008/11/24(月) 23:19:52> > 行の終わりは改行だと思うのですが?
> いいえ。
では行の始まりだというわけですね?
> > そういう人は何も無い関数の中に;がないと何か続きがあると思うのでしょうか?
> そういう人を探して訊いてみればいいと思います。
では>>223の人に訊いてみてください
0242デフォルトの名無しさん
2008/11/24(月) 23:20:22> バカとバカががっぷりよつに組んでるようにしか見えん。
同感ですね。
>>239
> あーではいつもの厳密な定義をお願いします
いつもの?
0243デフォルトの名無しさん
2008/11/24(月) 23:21:35> では行の始まりだというわけですね?
いいえ。
> では>>223の人に訊いてみてください
意味不明です。
0244デフォルトの名無しさん
2008/11/24(月) 23:24:24> 仕様書
別名「馬鹿には見えない文書」ですねw
0245デフォルトの名無しさん
2008/11/25(火) 00:01:040246デフォルトの名無しさん
2008/11/25(火) 00:12:49言っているようなもんか
0247デフォルトの名無しさん
2008/11/25(火) 02:41:380248デフォルトの名無しさん
2008/11/25(火) 04:32:27>>234で「行」ではなくてexpressionとでも書いておけば揚げ足もとられなかったのだね。
0249デフォルトの名無しさん
2008/11/25(火) 04:36:520250デフォルトの名無しさん
2008/11/25(火) 05:55:50細かい違いに絡む人なんだから、勝手に";"の話とか解釈すると
これも揚げ足とられるから注意ね。
0251デフォルトの名無しさん
2008/11/25(火) 06:54:59>>250 それこそ文意を汲んであげないと可哀想。
そういえば最近「鼻から悪魔」ってよく聞くんですが流行ってるんですか。
0252デフォルトの名無しさん
2008/11/25(火) 07:24:09C++を使おうという人ならこの程度は読んでなきゃ話にならない、という本で使われてたね。
もちろん、その本を読んで無くてもその程度のことが当たり前に身についてる人も居るだろうけど。
それと、最近じゃないよ。昔から。
0253デフォルトの名無しさん
2008/11/25(火) 07:31:35最近よく聞くようになった気がするのは仕様の話をする人と接する機会が増えたせいかな・・・。
0254デフォルトの名無しさん
2008/11/25(火) 07:39:37えー。困ったちゃんキャラになって文意を汲まない遊びをしてる人なんだから、
乗ってあげなきゃ逆に可哀相じゃん。
0255デフォルトの名無しさん
2008/11/25(火) 07:45:431992年ごろにcomp.lang.cあたりに投稿された記事が由来だそうだが。
まあ最近っちゃ最近だわな。
0256デフォルトの名無しさん
2008/11/25(火) 18:27:26自分、この言葉にはなにこれって感じで、なんか、ぽかーんって感じ
英語ではぴったりの表現なんかな?それとも、良く使われる表現?
0257デフォルトの名無しさん
2008/11/25(火) 18:52:50自分、この言葉にはなにこれって感じで、なんか、ぽかーんって感じ
英語ではぴったりの表現なんかな?それとも、良く使われる表現?
0258デフォルトの名無しさん
2008/11/25(火) 18:55:590259デフォルトの名無しさん
2008/11/25(火) 21:16:09突拍子もないことの喩えなんだからその印象であってる
0260デフォルトの名無しさん
2008/11/25(火) 21:30:25日本的な言い方に変えた方がいいんじゃね?
モニタから美少女とか。
0261デフォルトの名無しさん
2008/11/25(火) 21:33:390262デフォルトの名無しさん
2008/11/25(火) 21:41:37目ん玉が飛び出す の方が日本的でいい
鼻から悪魔じゃ、日本語能力低すぎて、ひどい翻訳している翻訳者と同じレベルだな
0263デフォルトの名無しさん
2008/11/25(火) 22:01:060264デフォルトの名無しさん
2008/11/25(火) 22:01:560265デフォルトの名無しさん
2008/11/25(火) 22:06:19そこで「既存の慣用句に使われている表現」を出すのは、ちょっと違うんじゃないかなぁ。
未定義の世界に踏み込んだ結果起こりうる、まったくの「予測不可能」を表現するには、
他で一切使われていないナニか、のほうが相応しいと思う。
たとえばの話、「物凄い金額を見せられる」という定義された行動でも「目玉は飛び出る」ものだから、
「未定義だと、こんなことさえ起きかねないんだぜ!?」っていう、未定義ならではを表現する言葉としては、
それだとインパクトが薄いのではないかと。
ここまで書いてやっと気付いたけど、すげえどうでもいい話題だなこれw
0266デフォルトの名無しさん
2008/11/25(火) 22:31:560267デフォルトの名無しさん
2008/11/25(火) 22:38:050268デフォルトの名無しさん
2008/11/25(火) 22:40:41競合他社にソースコードをFAXしてもよい
試験ではうまく動いて一番大事な顧客の前で突然動かなくなってもよい
0269デフォルトの名無しさん
2008/11/25(火) 22:46:02どうせならFTPでファイルください
0270デフォルトの名無しさん
2008/11/25(火) 22:47:340271デフォルトの名無しさん
2008/11/25(火) 22:52:530272デフォルトの名無しさん
2008/11/25(火) 22:53:30> 試験ではうまく動いて一番大事な顧客の前で突然動かなくなってもよい
Effective C++だっけ。サラッと流すような書き方が逆に笑えた。
0273デフォルトの名無しさん
2008/11/25(火) 23:06:46考えられるでしょうか?
nの数はグループによって違います
グループ1
double[5]
double[5]
・
・
・
---------
グループ2
double[5]
double[5]
・
・
・
アクセス時は、グループ2の1本目を見る、2本目を見るみたいにアクセスしたいです
0274デフォルトの名無しさん
2008/11/25(火) 23:13:540275デフォルトの名無しさん
2008/11/25(火) 23:19:090276デフォルトの名無しさん
2008/11/25(火) 23:23:13そうですか
さらに次の要求をどうぞ
0277デフォルトの名無しさん
2008/11/25(火) 23:24:54vect.push_back( )
みたいには入れられませんよね
;
0278デフォルトの名無しさん
2008/11/25(火) 23:26:49double tmp[5];
tmpに入れたい値を一回入れる
test.push_back(tmp);
0279デフォルトの名無しさん
2008/11/25(火) 23:44:530280デフォルトの名無しさん
2008/11/25(火) 23:47:120281デフォルトの名無しさん
2008/11/26(水) 00:20:21struct neko {
string* nyah;
long piki;
vector<double[5]>* otte;
};
vector <neko> nekos;
こんな感じですか...うんーーん
0282デフォルトの名無しさん
2008/11/26(水) 00:51:00std::map<std::string, std::map<std::string, double[5]> >でいいんじゃない。
あ、タグは外側グループ、内側グループの両方につけた形だけど、そこんとこどうなの?
0283デフォルトの名無しさん
2008/11/26(水) 01:05:36使い方次第で,適したデータ構造などは変わるものだが
0284デフォルトの名無しさん
2008/11/26(水) 12:05:12質問してから先の問答で初めて真剣に考える奴って
割といる。
「俺は何かを望んでいるけど、どうやらそれが上手く行かない、誰か助けて〜」
死ねばいいと思う。
0285デフォルトの名無しさん
2008/11/26(水) 12:58:270286デフォルトの名無しさん
2008/11/26(水) 13:15:24C++ coding standard 101
0287デフォルトの名無しさん
2008/11/26(水) 13:16:170288デフォルトの名無しさん
2008/11/26(水) 17:55:52あなた自身のことですね。死ねばいいと思う。
0289デフォルトの名無しさん
2008/11/26(水) 18:12:040290デフォルトの名無しさん
2008/11/26(水) 18:20:220291デフォルトの名無しさん
2008/11/26(水) 18:22:41Accelerated C++はマジお勧め。
学部のプログラミング演習等の副読本にも適していると思う。
0292デフォルトの名無しさん
2008/11/26(水) 18:29:220293デフォルトの名無しさん
2008/11/26(水) 18:41:45C++が学ぶべき価値がある言語か判断するために最初にMC++Dを眺めとくのは重要
アレに興味を持って、理解できるようになるまで勉強しようと思えない限りC++には触らない方がいい
0294デフォルトの名無しさん
2008/11/26(水) 18:46:100295デフォルトの名無しさん
2008/11/26(水) 18:49:27Modern C++ Designの内容を完全理解し、書いてあることを使いこなしているいるのか
0296デフォルトの名無しさん
2008/11/26(水) 18:59:28トラブルが起これば中の汚物を読まなきゃならなくなることもあるはずだ
その時にMC++Dの知識は役に立つ
0297デフォルトの名無しさん
2008/11/26(水) 19:12:18普通はマナちゃんのやさしいC++とか柴田望洋とか林晴比古あたりじゃないの。
0298デフォルトの名無しさん
2008/11/26(水) 19:22:32そこで吐き気を催したら引き返した方がいいというだけ
0299デフォルトの名無しさん
2008/11/26(水) 19:29:05じゃ、本屋でパラパラ見るだけで良いってことか
パラパラ見て、お前は
アレに興味を持って、理解できるようになるまで勉強しようと決意してC++
を始めたのか。で、最初のステップとしてどの本を読んだ?
0300デフォルトの名無しさん
2008/11/26(水) 20:57:10独習C → ポインタの極意 → 独習C++ → Effective C++
で独習C++は選択を間違えたと思えた
0301デフォルトの名無しさん
2008/11/26(水) 22:09:23ま、いいことだw
0302デフォルトの名無しさん
2008/11/26(水) 22:12:14独習C++ って俺のC++の最初の本だ
なっ、なぜそう思うんだ
0303デフォルトの名無しさん
2008/11/26(水) 22:26:06柏原正三著
ちょっとあちこちに記述に癖があるけど、それをわかってて
読むなら結構易しい入門書
0304デフォルトの名無しさん
2008/11/26(水) 22:27:330305デフォルトの名無しさん
2008/11/27(木) 02:01:46300じゃないけど、独習C++とかC++入門の類って基本的にどれも同じ匂いがする。
それぞれ記述に工夫はしているだろうけど、どれもC++の大味なダイジェストにしか過ぎないというか。
学ぶという点ではAccelerated C++に一票。
0306デフォルトの名無しさん
2008/11/27(木) 09:02:51絶対途中で飽きる…
0307デフォルトの名無しさん
2008/11/27(木) 09:31:190308デフォルトの名無しさん
2008/11/27(木) 14:49:10独習C++の入門という意味では普通に読了できたんだけど
その後読んだEffective C++で知らないものばかりでてきて
独習C++だけじゃ全然知識足りないのかよ,って当時の自分は困ってしまってたから,こういう印象かな
そのあとは結局大学の図書館でいろんな本あさりまくってしまい効率悪かった
独習C++の後はこれ読むといいよ,っていうオススメな本とかも思い当たらないしなあ
でもそういう過程で知識がついたっていうのもあるけど
0309302
2008/11/27(木) 18:33:54入門書で必要十分な知識なんて得られないと思っている
独習C++ -> accelerated C++ -> 詳説C++ ってな感じだったな。
独習C++:C++さわりの勉強
accelerated C++:C++らしいコーディング、使い方
詳説C++:より詳しく
これら全ての読み終わってようやく入門過程終わりって感じかな。入門過程復習を兼ねて
禿げ教科書を詳説C++の後あたりに読むのも良いかもしれん。
次は初級過程でEffective C++、Effective STLなど自分の興味に応じて読めって感じだな
0310デフォルトの名無しさん
2008/11/27(木) 19:46:18興味なくても読んでくれないと困る
0311デフォルトの名無しさん
2008/11/27(木) 19:56:03C++専用ライブラリを使い倒して学んだ
その後、流行りのJAVAを興味本位だけで理解してみようと
入門書『明解JAVA』を購入
結構良かった
何が言いたいかっつーと、同じ著者で『明解C++』も出している
読んだことはないがちょっと期待
0312デフォルトの名無しさん
2008/11/27(木) 20:35:05Effective C++は当たり前の事ばかり書いててあんま役に立たんかった。
0313デフォルトの名無しさん
2008/11/27(木) 20:44:47平気でコンストラクタで仮想関数呼んだりデストラクタで例外投げたりするんだぞ初心者は
0314デフォルトの名無しさん
2008/11/27(木) 21:36:08基底クラスの非virtual関数と同名のメンバ関数を派生クラスで定義していたのを
納品前にこっそり修正したのは
今となってはいい思い出だ
0315デフォルトの名無しさん
2008/11/27(木) 22:01:01自動化できそうなチェック項目も結構多いんで
こういうのを自動的に点検してくれるようなコードチェッカーってのが欲しいと思ったな
精度の高いパーザがあればそう苦労せずにできそうだとは思うけど
gccならコンパイラオプションでeffective c++に載ってるような間違いに対してある程度警告してくれるんだよね
0316デフォルトの名無しさん
2008/11/27(木) 22:12:10しょうもないのしかチェックしてくれないけど
0317デフォルトの名無しさん
2008/11/27(木) 22:12:42初心者向きなのは
プログラミング言語 C++
Effective C++
上の2つを読んだらこれがおすすめ
More Effective C++
C++ In-Depth Series
0318デフォルトの名無しさん
2008/11/27(木) 22:18:15間違いなく日本語訳より読みやすいから
0319デフォルトの名無しさん
2008/11/27(木) 22:19:17こういう時ろくに話に出てこないよな。
0320デフォルトの名無しさん
2008/11/27(木) 22:20:530321デフォルトの名無しさん
2008/11/27(木) 22:23:24それより、言語仕様上やれるけど辞めてください項目を知ってもらうのが
0322デフォルトの名無しさん
2008/11/27(木) 22:27:10おっさん、じじいが多く、最近の入門書なんて読んでないから
話できないんじゃね。
0323デフォルトの名無しさん
2008/11/27(木) 22:28:12C++はやさしいだろ。
0324デフォルトの名無しさん
2008/11/27(木) 22:43:510325デフォルトの名無しさん
2008/11/27(木) 22:45:04言語自体はやさしい。
0326デフォルトの名無しさん
2008/11/27(木) 22:48:49だがしかし、GoTo文とかあるんだけど滅多に使うなって言われるものの説明が無い本が多いw
0327デフォルトの名無しさん
2008/11/27(木) 22:50:49ひとつでも該当したらその本は捨てろ
・void main()
・定数をマクロで定義してる
・コンストラクタの初期化リストを使わない
・using namespace std;
・意味もなくキャストが旧形式
・_で始まる名前を勝手に使う
・ヌルポインタがNULL
・X x = new X(); if(x == NULL){ ... }
・ポリモーフィズムの例え話にAnimalクラス
・void operator +=(X)
・X& operator +(X,X)
・多重継承をとりあえずこきおろすが理由は書いていない
・「グローバル関数は危険です、全部メンバ関数にしましょう(キリッ」
・「コンストラクタから例外を投げてはいけません(キリッ」
あと何かな
0328デフォルトの名無しさん
2008/11/27(木) 22:52:15using namespace std;を一方的にダメだというのがダメだと思う
0329デフォルトの名無しさん
2008/11/27(木) 22:55:11#include <iostream.h>
auto_ptrをコンテナの要素にする。
nothrowでないnewの結果をヌルと比較している。
0330デフォルトの名無しさん
2008/11/27(木) 22:57:20説明を簡素にするためには必要悪だよね。
0331デフォルトの名無しさん
2008/11/27(木) 23:38:10入門者用Good本の見分け方,please
0332デフォルトの名無しさん
2008/11/27(木) 23:44:250333デフォルトの名無しさん
2008/11/28(金) 00:40:250334デフォルトの名無しさん
2008/11/28(金) 01:35:510335デフォルトの名無しさん
2008/11/28(金) 07:16:03はじめから順番にやっていってクラスが終わった辺りででてくりゃまだ実感沸くだろうけど。
0336デフォルトの名無しさん
2008/11/28(金) 09:39:50>ヌルポインタがNULL
現行でどうせいっちゅーんだ?
C++0xはまだドラフトだぞ。
0337デフォルトの名無しさん
2008/11/28(金) 10:10:150338デフォルトの名無しさん
2008/11/28(金) 12:34:230339デフォルトの名無しさん
2008/11/28(金) 12:41:32標準には、ない。実装上は、なくもない。
0340デフォルトの名無しさん
2008/11/28(金) 12:49:220341デフォルトの名無しさん
2008/11/28(金) 12:50:440342デフォルトの名無しさん
2008/11/28(金) 12:58:23http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#463
> A null pointer constant, which has integral type, is not necessarily converted to a null pointer value.
0343デフォルトの名無しさん
2008/11/28(金) 13:02:490344デフォルトの名無しさん
2008/11/28(金) 13:08:30どうすりゃいいの?
0345デフォルトの名無しさん
2008/11/28(金) 13:25:240346デフォルトの名無しさん
2008/11/28(金) 13:32:340347デフォルトの名無しさん
2008/11/28(金) 17:16:57それをまたキャストするんですね分かります
0348デフォルトの名無しさん
2008/11/28(金) 18:07:47本当にズブのド素人が読むには何がオススメ?
0349デフォルトの名無しさん
2008/11/28(金) 18:15:20reinterpret_cast<void*>(0)はバイト列0x0をポインタと見做したものであってヌルポインタとは限らない
0350デフォルトの名無しさん
2008/11/28(金) 18:19:25試してから出直して来いカス
0351デフォルトの名無しさん
2008/11/28(金) 18:25:47それで正しいことにはならないぞ
規格読んで出直してこい
0352デフォルトの名無しさん
2008/11/28(金) 19:04:490353デフォルトの名無しさん
2008/11/28(金) 19:10:27変数の初期化以外はするなと指摘されたんですが・・
わざわざCreateや、Initなんてメソッド作るメリットって何ですか?
0354デフォルトの名無しさん
2008/11/28(金) 19:12:29コンストラクタは例外以外で直接はエラーを表現できないから。
0355デフォルトの名無しさん
2008/11/28(金) 19:13:29コンストラクタの例外も突っかかれました・・・
0356デフォルトの名無しさん
2008/11/28(金) 19:17:13フレームワークのようなライブラリでは便利なのかもしれないという程度だと思う。
0357デフォルトの名無しさん
2008/11/28(金) 19:19:06RAII を使う場合はエラー時にコンストラクタから例外を投げるのは常識的な行為。
Google みたいに「例外を使ってはいけない」とかいうコーディング規約がないのであれば。
0358デフォルトの名無しさん
2008/11/28(金) 19:20:08初期化のタイミングをコントロールしたい場合は便利だよね。
new する手もあるけど、new は失敗するかもしれないし・・・。
0359デフォルトの名無しさん
2008/11/28(金) 19:20:130360デフォルトの名無しさん
2008/11/28(金) 19:22:01色んなメンバ関数を呼ばれると困るという点があるね。
0361353
2008/11/28(金) 19:25:19でも自分が理想としてるのは、まさにこんな感じです。
wikipediaチラ見ですけど。
0362デフォルトの名無しさん
2008/11/28(金) 19:26:22だから逆に「コンストラクタでメンバ関数を呼んではいけない」ルールがよいという主張もある
どっちが正しいと言うもんでもない
0363デフォルトの名無しさん
2008/11/28(金) 19:32:14(語源的にどうかと思うかもしれないけど、
重要なのはデストラクタで自動的にリソースが開放される点なので)、
コーディング規約によっては setter 使っても悪いわけではない。
0364353
2008/11/28(金) 19:43:09自分は、おそらくそういう意図で指摘されたんだと思います。
new でタイミングをコントロールしちゃまずいんでしょうか。
その方は高速化がどうのこうのとも言っていました。
0365デフォルトの名無しさん
2008/11/28(金) 19:45:30寝言は兎も角w
>new でタイミングをコントロールしちゃまずいんでしょうか。
タイミングコントロールだけが目的なら感心しないが。
0366デフォルトの名無しさん
2008/11/28(金) 19:45:38ベストは両方可能にすることな気もするが。
0367353
2008/11/28(金) 20:06:13問題ないような気がしてきております。
既存のクラスって結構そういうのが多い気がしますし・・
いろいろご教授ありがとうございます。
0368デフォルトの名無しさん
2008/11/28(金) 22:04:57来月ビャーン著の入門者向けの本が出るよ
http://www.research.att.com/~bs/programming.html
0369デフォルトの名無しさん
2008/11/28(金) 23:48:010370デフォルトの名無しさん
2008/11/29(土) 02:47:210371デフォルトの名無しさん
2008/11/29(土) 11:51:18無名名前空間にプロトタイプだけ突っ込んで、定義は他の場所で行おうと思っているのですが、どうにもうまくいきません。
func1()の方は特に問題なく動くのですが、func2はerror C2825が出てコンパイルエラーとなります。
何故でしょうか、、、
#include <windows.h>
namespace{ int func1(); BOOL func2(); };
int ::func1(){ return 1; }
BOOL ::func2(){ return TRUE; }
0372デフォルトの名無しさん
2008/11/29(土) 13:36:480373デフォルトの名無しさん
2008/11/29(土) 13:39:040374デフォルトの名無しさん
2008/11/29(土) 15:01:34class ChTraitsBase
{
public:
typedef char XCHAR;
typedef LPSTR PXSTR;
typedef LPCSTR PCXSTR;
typedef wchar_t YCHAR;
typedef LPWSTR PYSTR;
typedef LPCWSTR PCYSTR;
};
って言う記述があった場合、これってどういうこと?
クラスなのにメンバ変数とか、関数とか物理的なものが何もない。
これはtypedefの及ぶ範囲をChTraitsBaseクラスおよびその派生クラスで限定したいテクニックなのかな?
0375デフォルトの名無しさん
2008/11/29(土) 15:04:52参照の参照を回避するのに使ったり
0376374
2008/11/29(土) 15:09:37でも何のことやら理解できない(TT)
0377デフォルトの名無しさん
2008/11/29(土) 15:20:17ChTraitsBaseはwchar_tで特殊化されているはずで、
全体としてみると、charかwchar_tでの使用しか念頭に置いていないCStringTで、
X〜は自身のテンプレート引数と同種、Y〜は違うほうの文字の型になるようにできている。
例えば、ChTraitsBase<char>::YCHARがwchar_tで、
ChTraitsBase<wchar_t>::YCHARがcharになるという具合。
具体的には、コンストラクタなどでは、X系の型ならそのまま格納、
Y系の型が来たら変換して格納なんて区別に使っている。
0378デフォルトの名無しさん
2008/11/29(土) 15:43:32こういう使い方はC++の世界では、そういうテクニックとして認識されるものなのですか?
0379デフォルトの名無しさん
2008/11/29(土) 16:52:47標準ライブラリに std::char_traits や std::iterator_traits やらあるから、まぁそうだね。
最近は ..._traits みたいにひとつの型に複数の要素を入れるより、テンプレート引数から
一つの結果(型 type またはコンパイル時定数 value など)だけを取得できるようにして、
関数のような使いかたができるようにした「テンプレートメタ関数」のほうが好まれる。
0380デフォルトの名無しさん
2008/11/29(土) 18:56:28そのオブジェクトがすでにdeleteされたことを
ポインタを保持している側が判断することは可能ですか?
0381デフォルトの名無しさん
2008/11/29(土) 18:57:45面倒だから、削除された時に中身NULLとか書いておけば?
0382デフォルトの名無しさん
2008/11/29(土) 19:07:100383デフォルトの名無しさん
2008/11/30(日) 00:09:15を当たり前だと理解できるのはすごいと思う。
普通に使ってても、テンプレート関連のテクニックとかを悟るのは相当厳しいんじゃないか?
あとみんなクラスのメンバ変数はどんな時でも全てprivateにしてるの実際?
0384デフォルトの名無しさん
2008/11/30(日) 00:27:11vectorやらlistやらのメンバ変数は
protectedか、実装によってはpublicだったりする。
継承すべきclassじゃないのに。
まあstackやqueueに使うためなのかな、と後で思ったが。
0385デフォルトの名無しさん
2008/11/30(日) 00:30:32派生クラスからしてみれば「自分の一部」として扱いたいこともあるし
protectedなアクセサ書くのもダルいし
publicにはしない
0386383
2008/11/30(日) 00:42:08OSSのコードとか見ても「メンバ変数は絶対private」を守ってるのはすごく少ないように思いますね。
0387デフォルトの名無しさん
2008/11/30(日) 00:47:41前半部分に付いて。
Effective C++(やその他Must Readな本)の内容は先人たちの長年の試行錯誤の成果だよ。
だから普通のC++ユーザは、自分で悟らなくてもそれらを享受すればよいだけ。
ただ、読んで盲目的に倣うんではなくて、勘所を理解した上で効果的に使って欲しいと思うけどね。
0388デフォルトの名無しさん
2008/11/30(日) 01:19:07使いたくなった時はカプセル化の単位を見直せば、だいたい片付く。
this 以外を通しては同じクラスでもアクセスできないとか、
private/public には無いわかりにくいルールもあるんで、あんまり
使いたくも無い。
0389デフォルトの名無しさん
2008/11/30(日) 03:03:240390デフォルトの名無しさん
2008/11/30(日) 03:30:24アクセサもアクセサ経由で書いてるのか
0391デフォルトの名無しさん
2008/11/30(日) 03:32:110392デフォルトの名無しさん
2008/11/30(日) 03:33:570393デフォルトの名無しさん
2008/11/30(日) 04:05:20もはや構造体でも十分かも
0394デフォルトの名無しさん
2008/11/30(日) 04:10:080395デフォルトの名無しさん
2008/11/30(日) 04:24:450396デフォルトの名無しさん
2008/11/30(日) 07:48:440397デフォルトの名無しさん
2008/11/30(日) 08:06:22マルチスレッドで排他でもしない限りまったく必要ないしな
ウインドウズアプリだけどさw
0398デフォルトの名無しさん
2008/11/30(日) 08:15:25あとウィンドウズアプリも
0399デフォルトの名無しさん
2008/11/30(日) 08:19:40ウインドウズアプリって言ったのは規模がオモチャ程度ってことを言いたかっただけさ
0400デフォルトの名無しさん
2008/11/30(日) 09:01:240401デフォルトの名無しさん
2008/11/30(日) 10:58:48ではないということを、書いてたな、
ただ思うに、何でもかんでもprivateにして、アクセッサーを作れば良いのかといえば、そういうもんでは無いと思う
コンストラクタの動きを熟知したうえで作られた、genericのコードを見ると、思わず、なるほどと感心する事もあるからな
0402デフォルトの名無しさん
2008/11/30(日) 12:30:24∧ ∧ ∧ ∧
(・ ∀・) (・ ∀・) ビャ〜ン
(〜)〜 (〜)〜
┘| ┘|
0403デフォルトの名無しさん
2008/11/30(日) 12:36:57C++再考、古い本だが、良書である
この本では、「仮想関数を使うべきでない場合」という章があって、パフォーマンスの面で
仮想関数を使う場合は、そのコストも良く勘案して使うべしのような、ことが書かれているのだが
その解決手段の一つに、protectedを用いて、継承を可能にする事例が掲載されている。
デザパタでいうところのFactoryパターンで、インスタンスの生成を制限するのに、
protectedを上手に使うよね。
ようするに、適材適所、使い方次第ってことかな。
終わり。
0404デフォルトの名無しさん
2008/11/30(日) 12:45:51問題はprotectedメンバ変数の方
こっちは禿もD&Eで後悔してるって言ってるしHerb Sutter氏は邪悪だと言い切ってる
0405デフォルトの名無しさん
2008/11/30(日) 13:20:540406デフォルトの名無しさん
2008/11/30(日) 13:27:170407デフォルトの名無しさん
2008/11/30(日) 18:59:470408デフォルトの名無しさん
2008/11/30(日) 19:03:24アクセス制御のprotectedと
protected継承は明確に区別しような。
0409デフォルトの名無しさん
2008/11/30(日) 21:35:220410デフォルトの名無しさん
2008/11/30(日) 21:36:57どうやるんだ、それ?
コンストラクタが実行し終わらないと「newしたオブジェクト」が存在しないと思うんだけど。
0411デフォルトの名無しさん
2008/11/30(日) 21:37:57delete this
とか?
どう考えてもやばいだろ
0412デフォルトの名無しさん
2008/11/30(日) 21:42:25そういうことです。
0413デフォルトの名無しさん
2008/11/30(日) 21:44:02どうしてそれが合法かもしれないと思うの?
0414デフォルトの名無しさん
2008/11/30(日) 21:45:38違法であるとは定められていないかもしれないからです。
0415デフォルトの名無しさん
2008/11/30(日) 21:45:42違法だと確信できないからです
0416デフォルトの名無しさん
2008/11/30(日) 21:49:100417デフォルトの名無しさん
2008/11/30(日) 21:50:53new の戻り値がまったく使えないことになるだろ、どう考えても。
0418デフォルトの名無しさん
2008/11/30(日) 22:36:51コンストラクタでdelete thisは聞いたことがない。
コンストラクタが完了してない、つまりオブジェクトの構築が終わっていないのに
デストラクタを呼ぶというのはC++のオブジェクトに対するモデルにそぐわないと思う。
0419デフォルトの名無しさん
2008/11/30(日) 22:51:410420デフォルトの名無しさん
2008/11/30(日) 22:53:200421デフォルトの名無しさん
2008/11/30(日) 22:54:52問題外。newしたものをfree()で解放した場合は鼻から悪魔。
0422デフォルトの名無しさん
2008/11/30(日) 23:00:14水子霊が成仏できなくて夢枕に毎晩たつようになる(T_T)
0423デフォルトの名無しさん
2008/11/30(日) 23:02:10例外を投げるようなライブラリを初期化処理で使いたいとかだったら、
FactoryMethodパターン使えばいいだけだし。
0424デフォルトの名無しさん
2008/12/01(月) 00:02:520425デフォルトの名無しさん
2008/12/01(月) 00:05:270426デフォルトの名無しさん
2008/12/01(月) 00:29:43何のメモリ?コンストラクタ内で確保したメモリとかも?
0427デフォルトの名無しさん
2008/12/01(月) 00:36:050428デフォルトの名無しさん
2008/12/01(月) 00:55:43コンストラクタ内で動的に確保したメモリは、コンストラクタ内で例外が発生した場合はコンストラクタ内で解放する必要があります。
Foo::Foo():
m_p1(NULL),
m_p2(NULL)
{
try {
m_p1 = new P1;
m_p2 = new P2;
}
catch(std::exception & e) {
delete m_p1;
delete m_p2;
}
}
0429デフォルトの名無しさん
2008/12/01(月) 00:59:07struct A{
A(){delete this; throw 1;}
};
int main()
try{
A *a = new A;
}catch(...){
return 1;
}
0430デフォルトの名無しさん
2008/12/01(月) 01:00:31変なサンプル載せんな。バグってるし。
その問題に対する修正は RAII を徹底することだ。
0431デフォルトの名無しさん
2008/12/01(月) 01:16:050432デフォルトの名無しさん
2008/12/01(月) 01:26:210433デフォルトの名無しさん
2008/12/01(月) 01:29:40それがこの流れと関係あると思うんなら、たぶん何か勘違いしてる。
0434432
2008/12/01(月) 01:31:170435デフォルトの名無しさん
2008/12/01(月) 01:34:42ネタにもなってない
0436デフォルトの名無しさん
2008/12/01(月) 01:42:29delete 0 はOKらしいから大丈夫じゃね?
一定周期で話題になるよねコレ
0437デフォルトの名無しさん
2008/12/01(月) 01:50:12そこは関係ない。
>>428
まず、この場合は throw される型に関係なく delete したいんだろうから、
catch (...) じゃないと不完全。
そしてもう一点、 new P2 で例外が投げられた場合に delete 済みの m_p1 を
メンバに残したままコンストラクタが完了してしまっている。これは catch の最後に
throw を置けばいい。
ただし >430 の言うとおり、 RAII による対処が望ましい。コードが減るうえに
上記2点の対処もコンパイラに任せられる。
0438デフォルトの名無しさん
2008/12/01(月) 01:52:12例外が中で握り潰されるから、delete済みの無効ポインタを持ったゴミオブジェクトが生成されてしまう
多分デストラクタでm_p1とm_p2をdeleteしてるはずだから、
ゴミオブジェクトが破壊される時に二重deleteが起こる
0439デフォルトの名無しさん
2008/12/01(月) 02:36:15>>438
catch(...)は微妙だが、それ以外は
全部仮定の上の話じゃん。バグとまでは言えない。
0440デフォルトの名無しさん
2008/12/01(月) 02:41:530441デフォルトの名無しさん
2008/12/01(月) 02:45:21デストラクタでdeleteしてない変な設計だったとしても、
newしてる以上どっかで必ずdeleteしてるはずだ(それをしてないならメモリリークのバグ)
中のメンバがnewに成功してるのか、失敗してゴミになってるのかは移植性のある方法で確認できないから
「ゴミならdeleteしない」という方法で逃げることも出来ない
よってnewに失敗すればメモリリークか二重deleteのどちらかがどっかで必ず起こる
これをバグでないと思うような奴がC++のプログラム書いてると思うと恐ろしい
0442デフォルトの名無しさん
2008/12/01(月) 02:53:41delete m_p, m_p = 0;
とかしとけばいいんじゃないの
0443デフォルトの名無しさん
2008/12/01(月) 02:54:21だからそれも仮定の話じゃん。
バグと思うか思わないかは知らないが
>>428のコンストラクタのコードだけみて
バグであるとは言えないと言ってる。
0444デフォルトの名無しさん
2008/12/01(月) 03:00:55ぐぐったら出てきましたが、auto_ptrをこういう使い方をして大丈夫でしょうか?
class RAII {
std::auto_ptr<Test> m1;
std::auto_ptr<Test> m2;
public:
RAII() : m1(new Test), m2(new Test) { }
};
0445デフォルトの名無しさん
2008/12/01(月) 03:04:02それが正解。
0446デフォルトの名無しさん
2008/12/01(月) 03:05:01それを強弁して何がしたいの?
バカがあのコード見て見習ったら困るじゃん。
0447デフォルトの名無しさん
2008/12/01(月) 03:05:11本当のバカみたいだから丁寧に説明する
>>428を含むプログラムがバグを持たないためには、次のどちらかが保証されなければならない
・Fooクラスのインスタンスがどんな実行パスでも一切生成されない
・new P1とnew P2が絶対に例外を投げない
前者ならFooクラスの定義自体が無意味だ
後者ならわざわざあんなtryブロックを書く必要はない
よって>>428のコンストラクタのコードを含むプログラムは
全く無意味なことを書いてるか、バグがあるか、どちらかと言うことになる
428がチラシの裏に脈絡のない落書きをしたつもりでない限り、あれはバグだということだ
0448デフォルトの名無しさん
2008/12/01(月) 03:06:12ありがと、メンバで使ってるのははじめてみた。
0449デフォルトの名無しさん
2008/12/01(月) 03:19:50デストラクタで delete してるクラスなんか半分ぐらいコピーコンストラクタや
代入演算子でバグってるのが実情だろ。
0450デフォルトの名無しさん
2008/12/01(月) 06:05:15鼻から悪魔、なつかしいw
えぴすてーめーさんだっけ?この言い回し好きだったのは.
0451デフォルトの名無しさん
2008/12/01(月) 06:39:58そういう場合だとauto_ptrを使ってもなんの解決にもならない
0452デフォルトの名無しさん
2008/12/01(月) 06:43:120454デフォルトの名無しさん
2008/12/01(月) 14:21:510455デフォルトの名無しさん
2008/12/01(月) 14:26:140456デフォルトの名無しさん
2008/12/01(月) 14:41:11ジワジワ来て結局笑ってしまった
0457デフォルトの名無しさん
2008/12/01(月) 15:43:06いや、その派遣社員なんですけど…
0458デフォルトの名無しさん
2008/12/01(月) 15:59:12自分のツールとなる自前の派遣社員を調達する
0459デフォルトの名無しさん
2008/12/01(月) 17:35:26cfront
http://www.softwarepreservation.org/projects/c_plus_plus/cfront/release_3.0.3/cfront_3_0_3.tgz
0460デフォルトの名無しさん
2008/12/01(月) 18:32:12enum A{b,c,d};
enum E{f,g,h};
のように書いた場合、例えばcからタグ名であるAを取得する方法はあるのでしょうか?
0461デフォルトの名無しさん
2008/12/01(月) 18:37:170462デフォルトの名無しさん
2008/12/01(月) 18:39:270463デフォルトの名無しさん
2008/12/01(月) 20:07:250464デフォルトの名無しさん
2008/12/01(月) 20:32:25それは"int"が帰ってくる
0465デフォルトの名無しさん
2008/12/01(月) 20:36:250466デフォルトの名無しさん
2008/12/02(火) 01:57:210467デフォルトの名無しさん
2008/12/02(火) 02:04:32コンストラクタの中で出来ることがまともに残ってるか?
少しは考えようぜ
0468デフォルトの名無しさん
2008/12/02(火) 02:06:47別スレッドに操作してもらえば
コンストラクタ外だから問題ないですよね
0469デフォルトの名無しさん
2008/12/02(火) 02:21:48理由と結論にまったく脈絡が見られないんだが。
0470デフォルトの名無しさん
2008/12/02(火) 06:34:510471デフォルトの名無しさん
2008/12/02(火) 07:18:38自分を大きく越えちゃってる世界に行くと、住人すべてが屁理屈ばっか言ってる馬鹿に見える。
0472デフォルトの名無しさん
2008/12/02(火) 07:38:06大半のC++プログラマにとって意味不明っつーか知らなくても問題ない話が
粗大ゴミじゃねえ、醍醐味なんだよな
0473デフォルトの名無しさん
2008/12/02(火) 09:02:22まぁ別の意味で使えない人種なのかもしれないけど。
0474デフォルトの名無しさん
2008/12/02(火) 09:14:59残念ながら勘違いしてる人が多い。
0475デフォルトの名無しさん
2008/12/02(火) 09:16:080476デフォルトの名無しさん
2008/12/02(火) 10:04:160477デフォルトの名無しさん
2008/12/02(火) 11:58:16一人で作っていいものがターゲットだから
手段のC++が大好きなだけで
他人に発注するプログラムや
面倒そうなターゲット依存GUIアプリ作りにはC++を決して使いませんよ
共同開発もストレスたまりそう
0478デフォルトの名無しさん
2008/12/02(火) 12:08:15プログラミング能力のある人間ほど、プログラミング自体を職に設定していないと思われ
それなりの能力と社会的常識があれば、他の待遇の良い職についてるだろうし
仕事で行うコーディングは決して楽しいとはいえないわけで
0479デフォルトの名無しさん
2008/12/02(火) 12:53:48例外安全を知らないのは C++ に限らず大問題じゃね?
0480デフォルトの名無しさん
2008/12/02(火) 14:04:55あるメソッドが呼び出しグラフを追って例外を吐く可能性のあるメソッドの呼び出しを含むか否か
を手作業で確認あるいは脳内dbに問合せするなんて人間様のやる事じゃねー
0481デフォルトの名無しさん
2008/12/02(火) 14:34:40べつにそんなことしなくても例外安全に作る方法はわかってるでしょ。
「呼び出しグラフを追って〜」なんて、コードに不備があるときにそれが実害に
結びつくかどうかを検証するだけのこと。
コードに不備があるかどうかの検証はその場のコードと、そこから呼び出される
関数それぞれが例外を投げるかどうかを見ればわかる(はず)。これは戻り値で
エラーが報告される場合と同じ。
0482デフォルトの名無しさん
2008/12/02(火) 15:45:48その場のコードと、そこから呼び出される関数群とさらにそれらの関数群が呼んでる関数群
例外危険性は伝搬するから(例外安全で無い関数を呼ぶ関数は例外安全では無い)、
結局「安全性」の確認にはその場のコードを根とする木の全探索が必要になるよね
それらを馬鹿で面倒臭がりですぐ忘れたり間違えたりするという厄介な特性を持った
人間様が一つ一つチェックするわけ?
0483デフォルトの名無しさん
2008/12/02(火) 16:56:08constのような修飾子を手で加えて例外安全でない呼び出しを追跡させるのが精一杯だろうが
正直そこまでいらないぜ
0484デフォルトの名無しさん
2008/12/02(火) 17:00:53関数名指定したら再帰的にチェックして例外安全性の有無を判別してくれたりとか
0485デフォルトの名無しさん
2008/12/02(火) 18:01:55C++プログラマなら自分で作る。
C++コーディング出来るだけじゃドカタ。そんなツールを作れてプログラマ。
俺は底辺ドカタだからクレクレだがな、orz
0486デフォルトの名無しさん
2008/12/02(火) 18:29:23半手動みたいな方法だけど
C++ Sourceに、関数が例外安全かどうかをタグ付けして、コンパイル時にタグを検証する方法が投稿されてたよ
0487デフォルトの名無しさん
2008/12/02(火) 20:09:02list<int> list[M][N];
みたいな2次元配列って出来るんですか?
0488デフォルトの名無しさん
2008/12/02(火) 20:22:110489デフォルトの名無しさん
2008/12/02(火) 20:33:57もうちょっとこう、譲れない要求がハッキリしていないと、
二次元配列であるという以外にコトを絞れなくて、当然のように>>488が答になる。
0490デフォルトの名無しさん
2008/12/02(火) 21:21:01実装の本はいっぱいあるけど、設計的な視点なのってあんまない気がする。
0491デフォルトの名無しさん
2008/12/02(火) 21:26:54>>487です。
確かに尋ね方が悪かったと思います。
とりあえず二次元配列を用意したのですが、
・初期化
・for文を使った要素の挿入
・displayの仕方
がわかりません。
御教授お願いします。
0492デフォルトの名無しさん
2008/12/02(火) 21:35:46まずそもそも欲しいものは list の二次元配列で正しいのか?二重の list (list<list<int> >)だったりしないか?*
for 文を使った要素の挿入って挿入したいのは list でいいのか、int なのか?
挿入っていうからには後の要素は後ろにずれないといけないのか?
やりたいことを正確に説明しようぜ。
0493デフォルトの名無しさん
2008/12/02(火) 21:49:08二重のlist(list<list<int>>)とlistの違いがわかりません。どう違うのですか?
挿入するのはint型の要素です。
挿入したら後の要素は後ろにずれるようにしたいです。
0494デフォルトの名無しさん
2008/12/02(火) 21:52:14どっちが欲しいんだ?
0495デフォルトの名無しさん
2008/12/02(火) 21:56:280496デフォルトの名無しさん
2008/12/02(火) 22:07:16好きな方にしろ
list<list<int> >
list<int>[]
0497デフォルトの名無しさん
2008/12/02(火) 22:14:05↑このような形で宣言するのですか?
使い方がわかりません。
0498デフォルトの名無しさん
2008/12/02(火) 22:19:03list<list<int> > lst1;
な。
> と > の間にスペースが要る
0499デフォルトの名無しさん
2008/12/02(火) 22:22:300500デフォルトの名無しさん
2008/12/02(火) 22:26:51で定義しました。
後はint型の要素を入れていきたいのですが、pushでは、
「error C2664: 'std::list<_Ty>::push_front' : 1 番目の引数を 'int' から 'const std::list<_Ty> &' に変換できません。」
と出ます。
要素はどうやって入れればいいのですか?
0501デフォルトの名無しさん
2008/12/02(火) 22:27:17の lst1 の要素は list<int> だ。
0502デフォルトの名無しさん
2008/12/02(火) 22:33:52それじゃ、要素の削除、追加大変だからだろ
2次元に連なる要素の削除、追加を高速にしたいんじゃね
0503デフォルトの名無しさん
2008/12/02(火) 22:38:00それでもせめてvector<vector<int> >じゃね
0504デフォルトの名無しさん
2008/12/02(火) 22:39:230505デフォルトの名無しさん
2008/12/02(火) 22:41:12答えるほうも聞くほうも。
0506デフォルトの名無しさん
2008/12/02(火) 22:42:09エラーメッセージでそっくりそのまま言われてるじゃないか
少しは自分で考えろや
0507デフォルトの名無しさん
2008/12/02(火) 22:44:23#define M 10
#define N 10
main()
{
list<list<int> > lst1;
list<int> list1;
int i, j;
for(i = 0;i < M;i++)
{
for(j = 0;j < N;j++)
{
list1.push_front( 値 );
}
}
}
こんな感じでいいのですか?
0508デフォルトの名無しさん
2008/12/02(火) 22:47:470509デフォルトの名無しさん
2008/12/02(火) 22:49:270510デフォルトの名無しさん
2008/12/02(火) 22:51:57vectorの要素削除、追加速度で問題なければ良いと思うが
0511デフォルトの名無しさん
2008/12/02(火) 22:52:44その「こんな感じ」は、最初の質問の「みたいな」と同じ問題を抱えてると思う。
基本的に、君が頭に抱くイメージ、及びモノの表現には、隙間がありすぎる。
事の本質は、君がなにかとすっ飛ばしたがるディテールの中にあるんだよ。
きちっとした本なりサイトなりで勉強するべきだと思う。
現状だと、説明されても、説明の為の説明が必要になるだけ。
0512デフォルトの名無しさん
2008/12/02(火) 22:53:05vectorが一番だな
0513デフォルトの名無しさん
2008/12/02(火) 22:53:520514デフォルトの名無しさん
2008/12/02(火) 23:05:30構築過程だからじゃね
構築したら、ビシバシ途中要素の追加削除するんだよ
0515デフォルトの名無しさん
2008/12/02(火) 23:08:330516デフォルトの名無しさん
2008/12/02(火) 23:34:56↑大変だけどこれ読んでみ
例外安全性ってマジパネェ
コンストラクタを使わなきゃまるく収まるのかな?
0517デフォルトの名無しさん
2008/12/02(火) 23:40:560518デフォルトの名無しさん
2008/12/02(火) 23:42:44いやもちろん他の言語でも例外安全の概念は意識すべきだと思うよ。
0519デフォルトの名無しさん
2008/12/02(火) 23:50:30動詞+名詞だっけ?
名詞+動詞だっけ?
どっちだっけ
0520デフォルトの名無しさん
2008/12/02(火) 23:51:150521デフォルトの名無しさん
2008/12/02(火) 23:53:200522デフォルトの名無しさん
2008/12/03(水) 01:32:34> 例外危険性は伝搬するから(例外安全で無い関数を呼ぶ関数は例外安全では無い)
これが間違いじゃないの?
「バグってる関数を呼ぶ関数はバグってる」なんて言わないでしょ。
int main() { std::puts("Hello"); } という関数にバグがあるかないかの検証をするのに
puts() の実装まで確認する必要は無いよね?
同じように int main() { std::puts("Hello"); } という関数が例外安全かどうか検証するのに
puts() の実装まで確認する必要は無いよね?
0523デフォルトの名無しさん
2008/12/03(水) 01:42:09確かに実装まで確認する必要はないな
putsは例外安全ではあり得ないからmainも例外安全ではあり得ない
例外安全でぐぐってから出直してこい
0524デフォルトの名無しさん
2008/12/03(水) 01:43:11例外安全って何か知ってる?
0525デフォルトの名無しさん
2008/12/03(水) 01:44:12putsでも基本保証は出来るか
だからってバグと例外安全が一緒ではないけどな
0526デフォルトの名無しさん
2008/12/03(水) 01:46:54そんなのがあったらHerb Sutterが泣いて喜ぶぞ
早く見せてくれよほらほら
0528522
2008/12/03(水) 02:08:43だれもそんなことは言ってないよ。
例外安全性の検証をするのにすべての関数呼び出しツリーをたどる必要があるという話に
異を唱えているだけ。
まぁ基本例外保証の処理に一時変数を加えて強い例外保証を与えることができたり
するんだけどね。そんなもの見せてもあたりまえすぎて誰も喜ばない。
0529デフォルトの名無しさん
2008/12/03(水) 02:17:40throw()例外指定されてるだけかと思ってた
でも中で例外を握り潰してはいけないとは書いてないな
握り潰してたら安全じゃないし、そういう関数を呼んでる関数も安全じゃない
0530522
2008/12/03(水) 02:30:19> 握り潰してたら安全じゃないし、そういう関数を呼んでる関数も安全じゃない
そうなるとどんなコードも例外安全とは言えないことになるのには、気づいてて言ってるの?
たとえば >444 にある class RAII のコンストラクタは例外安全と言えると思ってるんだけど、
違うの?
要は、例外安全性はあるコード辺について評価されるものだと思ってるんだけど、
実行結果に対して評価されるものだと思ってる人が多いってことなのかな?
0531デフォルトの名無しさん
2008/12/03(水) 02:31:35例外を処理したってことで
例外安全なんじゃ?
0532デフォルトの名無しさん
2008/12/03(水) 02:36:27握りつぶした結果、変なことが起こってるかもしれないっていいたいんだろ。きっと
0533デフォルトの名無しさん
2008/12/03(水) 02:37:530534デフォルトの名無しさん
2008/12/03(水) 02:39:12そんなひどい標準関数はいやだなw
0535デフォルトの名無しさん
2008/12/03(水) 02:39:170536デフォルトの名無しさん
2008/12/03(水) 02:43:25呼んでたら二重例外で未定義動作になる
0537デフォルトの名無しさん
2008/12/03(水) 03:13:23断定口調で嘘を書くな。
二重例外がまずいのは、例外に伴うスタック巻き戻し中に実行されたデストラクタが
例外を「送出する」場合。中で握りつぶしてれば握りつぶしたなりの動作をする。また、
その場合でも未定義動作になるんじゃなくて terminate() に直行することになっている。
規格内の該当箇所は 15.5.1 "The terminate() function" ね。あと、 catch 内でも
同様に、握りつぶせばそのとおりに動作する。
なんなんだ昨日からの流れは。10年も前になろうかという間違い混じりの記事を
いまさら貼るやつまでいるし。 C++ の例外を誤解させようという組織でも活動してるのか?
0538デフォルトの名無しさん
2008/12/03(水) 11:11:29構文解析だけで特定できるのだろうか?
あと「例外を投げ得るコードを含まない」に合致するのは
no throw guaranteeの一部だけなのではないか
0539デフォルトの名無しさん
2008/12/03(水) 11:50:47何言ってんのかわからん。
静的解析で例外安全性を検証したい、とかいう話?
0540デフォルトの名無しさん
2008/12/03(水) 12:04:330541デフォルトの名無しさん
2008/12/03(水) 12:35:11とりあえず invariants が何かというのは既存のコードを解析するだけじゃ無理なのは
明白だろう。明示的な記述の追加が必要だと思う。いくつかの言語がサポートしている
DbC に関する機能を真似ることになるだろう。ただし invariants の評価を静的に
行うことができるかどうかも大きな問題になるはず。
例外安全性と言えば、これに加えてリソースリークの有無を判別する必要もある。
これについてもリソースの確保・解放を行うコードを何か統一された書式で記述しないと
無理だろう。
さらに strong guarantee の検証には、観測しうる状態が変化しないことを確かめる
必要がある。グローバル変数や volatile 変数へのアクセスを考えると、これについても
何か追加の情報を与えてやらないと機械的に判別できない。
現状から考えるとあまりにも非現実的と言うしかない。ドキュメント化された
インターフェースの仕様から invariants やリソース確保・解放や副作用に関する
情報を集められる人間が検証する以外に考えられない。
最後の no throw guarantee についての話はあたりまえで、内部に例外を投げうる
コードを含んでいても、外部に漏らさないように補足して処理できていれば
no throw guarantee は達成できる。
0542デフォルトの名無しさん
2008/12/03(水) 17:35:48ありますか?
「ちゃんとした」ってのは曖昧ですが、勉強のために読みたいという感じなので
主観でかまいません。
たとえば話題に上ってる例外安全とか。
0543デフォルトの名無しさん
2008/12/03(水) 20:08:03デザインパターンも含め、スタンダードで模範的なコードか?
優等生ベンダが保有するソースじゃないと、C/C++でそういうのは
少ないと思うぞw
0544デフォルトの名無しさん
2008/12/03(水) 20:58:370545デフォルトの名無しさん
2008/12/03(水) 21:03:58勉強のためには変態的すぎるんじゃないかと思うんだ。
0546デフォルトの名無しさん
2008/12/03(水) 23:26:490547デフォルトの名無しさん
2008/12/03(水) 23:40:320548デフォルトの名無しさん
2008/12/03(水) 23:59:28shared_ptr とか?
0549デフォルトの名無しさん
2008/12/04(木) 00:06:03あんなもの真似しちゃダメだ
0550デフォルトの名無しさん
2008/12/04(木) 00:34:090551デフォルトの名無しさん
2008/12/04(木) 00:41:350552デフォルトの名無しさん
2008/12/04(木) 00:46:530553デフォルトの名無しさん
2008/12/04(木) 01:26:290554デフォルトの名無しさん
2008/12/04(木) 01:29:22boost::mplマジお勧め
0555デフォルトの名無しさん
2008/12/04(木) 01:34:470556デフォルトの名無しさん
2008/12/04(木) 01:35:290557デフォルトの名無しさん
2008/12/04(木) 01:37:380558デフォルトの名無しさん
2008/12/04(木) 04:45:490559デフォルトの名無しさん
2008/12/04(木) 04:59:57ワイド文字がまともに使えねーし。
所詮一文字一バイトの世界で生きてる南蛮人の書いたコードなんだなと。
0560デフォルトの名無しさん
2008/12/04(木) 07:38:520561デフォルトの名無しさん
2008/12/04(木) 08:03:460562デフォルトの名無しさん
2008/12/04(木) 20:22:33char で new して placement new する時に
いかにしてアラインメントを揃えるかとか。
0563デフォルトの名無しさん
2008/12/04(木) 21:30:320564デフォルトの名無しさん
2008/12/04(木) 21:47:19vectorを別のコンテナに突っ込むかな
0565デフォルトの名無しさん
2008/12/04(木) 21:52:400566デフォルトの名無しさん
2008/12/04(木) 22:53:100567デフォルトの名無しさん
2008/12/04(木) 23:00:37vectorを指すスマートポインタという意味なら、状況に応じて適切なものを選ぶ。
vectorだからといって特別扱いする必要はない。
0568デフォルトの名無しさん
2008/12/05(金) 00:12:25{
std::vector<char> temp;
std::ifstream ifs( filename, std::ios::binary );
std::copy( std::istreambuf_iterator< char >( ifs ),
std::istreambuf_iterator< char >(),
std::back_inserter(temp) );
std::cout << "read size =" << temp.size() << std::endl;
}
ここのtempを他のところで処理したいんです。
そこで動的にこのvectorを生成し、そのdeteteをスマートポインタに任せたら良いんじゃないかと。
ただ、ポインタでアクセスが->になるのが不便なんですが
0569デフォルトの名無しさん
2008/12/05(金) 00:54:170570デフォルトの名無しさん
2008/12/05(金) 02:39:09そのtempがそれほど大きくないならそのまま返しちゃっても高が知れているけどね。
0571デフォルトの名無しさん
2008/12/05(金) 07:35:20Windowsに限った方法ではあるが、俺はこのサイトで、例外処理の勉強をさせてもらった
このようなクラスに改造しているので、stlの例外も、捕まえることができる。
class Exception : public std::exception
{
protected:
std::vector<char> msg_;
public:
/// コンストラクタ
Exception();
Exception(const char *fmt, ...);
/// 構造化例外処理コンストラクタ
Exception(PEXCEPTION_POINTERS pInfo);
/// デストラクタ
virtual ~Exception(){}
/// エラー内容の取得
const char* what() const;
/// 構造化例外をC++の例外に変換
static void set_transrator();
};
0572デフォルトの名無しさん
2008/12/05(金) 07:52:380573デフォルトの名無しさん
2008/12/05(金) 08:26:110574デフォルトの名無しさん
2008/12/05(金) 10:27:15もうC#とCでいいよ
0575デフォルトの名無しさん
2008/12/05(金) 10:40:15>>573
>>571です
先に掲示した、サイトの作者が意図したところは、「C++の例外処理とWindowsの構造化例外処理が同時に使えない。」ので
全ての例外をキャッチ出来るクラスを作って使っている。更に俺は猿真似して
stlの例外もキャッチさせたくて、改造を施した。
発案した、先のHPの作者は、賢いし、ヒントを与えてくれて感謝している。
俺の作ったクラスも、思い通りの振る舞いをしてくれているので、とても役立っている。
0576デフォルトの名無しさん
2008/12/05(金) 12:16:59「stlの例外を捕まえる」の意味がわからん。
そのせいか、リンク先の記事と比べて改良されてるように見えないんだが。
改造されてるのはわかるけど。「キャッチするクラス」も合わせて意味不明だな。
クラスが例外をキャッチするわけじゃないだろうに。
「Windows 構造化例外処理を C++ 例外に変換している」とだけ言えば何も
おかしなことは無いんだが。
で、その例外トランスレータの使い方は >516 のコラムの最後、 2000 年発表の
「例外処理、第 17 部」にずっと先に載ってるものなので、発案したのが
その人なわけじゃないと思うよ。どうでもいいけどね。
0577デフォルトの名無しさん
2008/12/05(金) 14:08:57これって、やっぱり STL で提供されているイテレータの流儀にのっとって
(std::iteratorを継承するとか) 作ったほうがメリットあるのかな?
それとも、適当にシグネチャを合わせておけば十分?
0578デフォルトの名無しさん
2008/12/05(金) 14:16:22自分しか使わないんならエラーが出るたびに不足してるメンバを調べて足していく
方向でもいいかもしれない。ごく狭い範囲で基本的なメンバしか使われないなら、
こっちのほうが早いかも。
汎用的に使いたいとかエラーが出るたびに調べるのが嫌なら、最初からイテレータの
要件をひととおり揃えておいたほうがいい。
どのみち足りないメンバを足す時には要件を見ることになるわけだから、やっぱり
後者がおすすめ。
0579デフォルトの名無しさん
2008/12/05(金) 14:19:08ここのConceptっていうのに沿って作っていけば楽だよ
ttp://www.boost.org/doc/libs/1_37_0/libs/range/doc/range.html
あと
ttp://www.sgi.com/tech/stl/table_of_contents.html
も参考になると思う
0580デフォルトの名無しさん
2008/12/05(金) 18:05:35コピー時に多重例外でterminate
0581デフォルトの名無しさん
2008/12/05(金) 19:41:34どうもありがとうございます。
ファイルサイズが大きい時で10MBになるんで
return std::vector<char> temp; じゃなく
void file_read_test(const char* filename, std::vector<char>& vect)
にすることにしました。
0582デフォルトの名無しさん
2008/12/08(月) 03:41:34hinnyu = 0,
hutsuu,
kyonyu
};
static const unsigned int OPPAI_N = 3;
void gen_girl(OPPAI oppai);
void gen_all_girl(OPPAI oppai) {
for (unsigned int i=0; i<OPPAI_N; ++i) {
gen_girl( static_cast<OPPAI> (i) );
}
}
こんな風にenum型使ったがためにキャストする機会があると
なんかenum使うべきじゃなかったんじゃないかと思っちゃうんだけど、
こういうときって
typedef unsigned int OPPAI;
const OPPAI hinnnyu = 0;
const OPPAI hutsuu = 1;
const OPPAI kyonyu = 2;
の方がデザイン的にベターなのかしら?
どうでもいいことなんだろうけど、気になって夜も眠れない。
誰か教えてくださいm(__)m
0583デフォルトの名無しさん
2008/12/08(月) 03:42:310584デフォルトの名無しさん
2008/12/08(月) 04:51:310585デフォルトの名無しさん
2008/12/08(月) 06:24:390586デフォルトの名無しさん
2008/12/08(月) 06:37:10chinko
}
gen_girl(chinko);
これは困るから型付けはしたいとです・・・。
0587デフォルトの名無しさん
2008/12/08(月) 11:48:14キャストが嫌なら、そういう操作はなるべく enum 提供側で用意してあげればいいんだよ。
たとえば class oppai_iterator 作るとか。
そこまでする必要があるかどうかは疑問だけどね。
0588デフォルトの名無しさん
2008/12/08(月) 12:30:34enum OPPAI {
hinnyu = 0,
hutsuu,
kyonyu
};
inline OPPAI& operator ++(OPPAI& o)
{
return o = static_cast<OPPAI>(o + 1);
}
inline OPPAI operator ++(OPPAI& o, int)
{
OPPAI r = o;
++o;
return r;
}
static const OPPAI OPPAI_N = static_cast<OPPAI>(3);
void gen_all_girl() {
for (OPPAI i=static_cast<OPPAI>(0); i < OPPAI_N; ++i) {
gen_girl(i);
}
}
0589デフォルトの名無しさん
2008/12/09(火) 14:34:15「n個のアイテムの中からk個のアイテムを選ぶ」はどうやって実装するのが良いのでしょうか?
考えたのは、
・0からn-1までの乱数をk回取得して、同じ数字が出たら乱数を取得しなおす方法。
・コンテナにアイテムのインデックスを入れて、1回選ぶ毎に選んだアイテムをコンテナから取り除く方法。
前者は、乱数の精度に影響がでそうで良くない気がします。
後者は、コンテナの構築とコンテナからアイテムを取り除くのにコストがかかるのが嫌な感じです。
nが大きく、何度も繰り返し実行される部分なので、高速なのがいいのですが、うまい実装はないですか?
0590デフォルトの名無しさん
2008/12/09(火) 15:30:260591デフォルトの名無しさん
2008/12/09(火) 16:12:08確かに同じ数字を引く確率は低く、影響は気にしなくていいのかもしれません。
問題はシンプルなのに、実装にすっきりしない感が残るのですが、仕方ないんですかねぇ・・。
0592デフォルトの名無しさん
2008/12/09(火) 16:16:31ある程度コントロールしたいんなら後者のほうがやりやすそうな気はする
0593デフォルトの名無しさん
2008/12/09(火) 16:38:57前者にします。
ありでした。
0594デフォルトの名無しさん
2008/12/09(火) 16:50:17前者の「同じ数字が出たら」っていうのは、例えばコンテナに既に出た数字を詰めたりして判断するんだよね?
で、後者の「1回選ぶ」っていうのは乱数で選ぶの?
0595デフォルトの名無しさん
2008/12/09(火) 16:55:53そんな感じじゃないかな
0596デフォルトの名無しさん
2008/12/09(火) 16:57:430597デフォルトの名無しさん
2008/12/09(火) 16:58:30>>589の文に不備がありました。
×「n個のアイテムの中からk個のアイテムを選ぶ」
○「n個のアイテムの中からk個のアイテムをランダムに選ぶ」
前者についてはその通りです。
同じ数字は取り除いて、コンテナの要素数がkになるまで乱数を詰めます。
0598デフォルトの名無しさん
2008/12/09(火) 17:10:21kは10以下で、nは1000以上も想定しています。
0599デフォルトの名無しさん
2008/12/09(火) 20:46:59なら
>・0からn-1までの乱数をk回取得して、同じ数字が出たら乱数を取得しなおす方法。
が、けっきょく一番じゃありませんか。
0600デフォルトの名無しさん
2008/12/09(火) 21:12:56実際には、乱数の取得しなおしは必要なくて、ちょうどk回の乱数の取得で十分。
vector<T> v;
int n = static_cast<int>(v.size());
for (int i = 0; i < k; ++i) {
int j = random_int(i, n); // [i, n) の範囲の整数をランダムで取得する
swap(v[i], v[j]);
}
// v[0] ... v[k-1] に選択された要素が入る
>>595 の言っている random_shuffle とほぼ同等だけど、全体をシャッフルするんじゃなくて
最初のk個のシャッフルで十分であるところがポイント。
0601デフォルトの名無しさん
2008/12/09(火) 22:24:53vを破壊していいならね。
0602デフォルトの名無しさん
2008/12/09(火) 22:30:47v[0..k-1]がインデックス配列になるというのでもいいか。
0603デフォルトの名無しさん
2008/12/10(水) 00:06:33#include <iostream.h>
main() {
cout << "Hello World\n";
return 0;
}
==================
$ gcc hello.cpp
参考書を見ながら入門しようと思ったのですが
コンパイルできませんでした。
OSはLinuxでgcc-4.1.2です。
0604デフォルトの名無しさん
2008/12/10(水) 00:08:36#include <iostream.h>
using namespace std;
main() {
cout << "Hello World\n";
return 0;
}
==================
0605デフォルトの名無しさん
2008/12/10(水) 00:08:450606デフォルトの名無しさん
2008/12/10(水) 00:08:54int main() {
std::cout << "Hello World\n";
return 0;
}
C++では古い入門書で勉強するのはやめたほうがいい
それ以前の問題も含んでるけど
0607デフォルトの名無しさん
2008/12/10(水) 00:09:580608デフォルトの名無しさん
2008/12/10(水) 00:19:53int main() {
std::cout << "Hello World" << std::endl;
return 0;
}
$ g++ hello.cpp
出来ちゃいました
0609デフォルトの名無しさん
2008/12/10(水) 00:22:510610デフォルトの名無しさん
2008/12/10(水) 18:06:150611あ
2008/12/10(水) 18:09:52・データの一覧表示
・キーボードからのデータ追加
・名前によるデータ検索
・学生番号によるデータの整列(昇順)
・ファイルからデータ入力
・ファイルへデータ出力
ただし単方向の直結リストを使わなければならない。
教えてください。。
0612デフォルトの名無しさん
2008/12/10(水) 18:12:55宿題は宿題スレに、丸投げしないということなら初心者スレに。
0613デフォルトの名無しさん
2008/12/10(水) 18:20:380614デフォルトの名無しさん
2008/12/11(木) 09:49:52C++でスレッドセーフという場合は、
一つのインスタンスにおいてセーフにするべきか、
複数のインスタンスにおいてセーフにするべきかが、
よくわかっていません。
これってどうなんでしょう?
複数のインスタンスにおいてセーフなものを作るのって大変な気がします。
また、この辺に関していい例がありましたら、URL等を教えてもらえると助かります。
0615デフォルトの名無しさん
2008/12/11(木) 10:49:00http://xerces.apache.org/xerces-c/faq-parse-3.html#faq-6
0616デフォルトの名無しさん
2008/12/11(木) 11:36:18パーサは複数のインスタンスでスレッドセーフなのですね。
http://naoyuki.hirayama.googlepages.com/caper_more.html
(逆に、1つのインスタンスではスレッドセーフではない? 少なくとも上のURLにはそう書いてあります。)
今はデータベースを作っているのですが、
その場合は複数のインスタンスにおけるスレッドセーフティを実現するのが
難しいと思ってますが、どうなんでしょうか?
(細かい話になってしまいますが、
クラスのメンバとして、staticなpthreadオブジェクトを持っていると、
他のデータベースに対するインスタンスに対しても同じpthreadオブジェクトが使われてしまうなど。)
0617デフォルトの名無しさん
2008/12/11(木) 11:52:52異なるデータベースに対して異なるスレッドを使いたいのなら、
staticではなくデータベースインスタンスのメンバであるべきだろう
0618デフォルトの名無しさん
2008/12/11(木) 11:56:37もうちょっと具体的に状況を説明して欲しい
0619デフォルトの名無しさん
2008/12/11(木) 12:10:42今の状況を説明します。(
以下、説明のためのコードです。)
class DataBase {
// constructor and destuctor
bool put(/* key and value */)
{
pthread_rwlock_wrlock(&rwlock_);
// update the database
pthread_rwlock_unlock(&rwlock_);
}
bool get(/* key and value */)
{
pthread_rwlock_rdlock(&rwlock_);
// some retrieval action from the database
pthread_rwlock_unlock(&rwlock_);
}
private:
pthrad_rwlock_t rwlock_;
};
このような感じで、今は1インスタンスにおけるスレッドセーフを実現しています。
これを複数インスタンスでもスレッドセーフにしたいのですが、
どうやっていいのかを悩んでいます。
0620デフォルトの名無しさん
2008/12/11(木) 12:19:44各インスタンスで共通に参照するpthread_rwlock_tオブジェクトをプロセス内に置いて
利用すれば、複数インスタンスによるアクセスも大丈夫ではないでしょうか。
0621デフォルトの名無しさん
2008/12/11(木) 12:29:50そうすると、1プロセス内の複数のスレッドが別々のデータベースを開くと問題になると思いますが、
いかがでしょうか?
何か勘違いしてるようでしたら、ご指摘ください。
0622デフォルトの名無しさん
2008/12/11(木) 12:52:44一般に、同じクラスから生成した各インスタンスが、それぞれ全く別々のデーターベースをアクセス
するような設計には至らないでしょうが、もしそのようなケースであれば、普通にデーターベースの
参照と更新において競合関係があり、排他制御をしなければならないインスタンス間だけでロックの
共通をすれば問題ないでしょう。
しかしそんなクラスは作れない(作れたとしてもトリッキーで無駄に時間を費やす)場合が多いので、
データーベースへのアクセス単位でクラスを分けて、static属性のクラス内メンバオブジェクトにします。
0623デフォルトの名無しさん
2008/12/11(木) 13:42:48そのコードで何が問題なの?
「複数インスタンスでスレッドセーフ」とか意味わかんないから、具体的な問題を書いて欲しい。
0624デフォルトの名無しさん
2008/12/11(木) 13:50:11ありがとうございます。
参考にさせていただきます。
0625デフォルトの名無しさん
2008/12/11(木) 14:11:03説明不足ですいません。
上のコードだと、以下のパターン1はOKですが、パターン2がNGなので、
両方ともいける良い方法はないかと考えているところです。
* パターン1
---
DataBase db;
db.open(/**/);
// thread作成
// 各threadはdbを共有 (dbへのポインタを各スレッドに渡す)
---
* パターン2
---
// thread作成 (下記のprocを処理するようにする)
// 各スレッドが処理する関数
void proc(void *p)
{
DataBase db;
db.open(/**/); // 各スレッドは同じデータベースをopen
// なんか処理
}
---
0626デフォルトの名無しさん
2008/12/11(木) 14:33:56オープンを失敗させればいいんじゃない。
すでに開かれていますとかなんとか言って。
0627デフォルトの名無しさん
2008/12/11(木) 16:10:05B、Cにほぼ同じ処理があるのでAにその処理を書きたいのですが、
if(dynamic_cast<B*>(p))... と if(dynamic_cast<C*>(p)).. の違いなのです。
thisから型を得て、それでキャストできればAに書くだけで済むのにと思っているのですが、
そういったことは出来るのでしょうか?
0628デフォルトの名無しさん
2008/12/11(木) 16:26:39こんな感じ?
0629デフォルトの名無しさん
2008/12/11(木) 16:45:10BとCはAImplを継承するって形にするのは駄目?
0630627
2008/12/11(木) 16:53:53確かにそんな感じならAに書けますね。
ありがとうございます。
ただ、書いてなくて申し訳ないのですが、
p2 = (B*)p; 、 p2 = (C*)p; と言った処理もあって、
これもthisを使って p2 = (thisの型)p; のようにできますか?
>>629
B、Cもそれぞれ派生クラスを持っていて、
その処理から返ってくるポインタがBならBの派生、CならCの派生かそうじゃないかで処理を分岐させています。
だからAImplを作っても結局はAに書くのと変わらないです。
分かり難くてごめんなさい。
0631デフォルトの名無しさん
2008/12/11(木) 17:20:110632デフォルトの名無しさん
2008/12/11(木) 17:23:47それをどう使うつもり?
BあるいはCにキャストしたいということは、
BまたはCに固有の、共通でないメンバを使いたいということだ
共通のコードで書けるはずないと思うのだけど
共通のメンバならAに持ってくればいいだけだし
0633デフォルトの名無しさん
2008/12/11(木) 17:36:11p2の型はB*、C*です。
よく考えると>>632さんの言うとおりです。
すみませんでした。
いろいろ変更すれば>>628の書き方でいけそうな気がしてきました。
皆さんありがとうございました。
0634デフォルトの名無しさん
2008/12/12(金) 03:10:00パターン 2 の問題を解決する自然な方法がパターン 1 ということだろ。
無関係なオブジェクト同士が非同期に動いて大丈夫なわけがない。
どうにかして情報(たとえば排他オブジェクト)を共有する必要がある。
DataBase インスタンス同士を明示的に繋ぐコードを書きたくないなら
static な何かで繋げるほか無い。
そのパターン 1 で何か不満なのか?
0635デフォルトの名無しさん
2008/12/12(金) 03:53:31http://groups.google.com/group/comp.std.c++/browse_thread/thread/4516117afeac669d
0636デフォルトの名無しさん
2008/12/12(金) 13:15:20> News 2008-12-12: The 2008-12 mailing is available
> News 2008-12-12: The C++ Standard Core Language Issues List (Revision 60) is available
> News 2008-12-12: The C++ Standard Library Issues List (Revision 61) is available
0637デフォルトの名無しさん
2008/12/12(金) 14:06:160638デフォルトの名無しさん
2008/12/12(金) 18:12:10とりあえず、ネットで色々調べた結果、以下の流れで関数を発行していけば可能ということはわかりました。
ZpInit→ZpSetOption→ZpArchive
しかし、それ以上の詳しい情報が全くわかりません。
なるべくなら日本語で詳しく説明されているサイトやドキュメント等はないでしょうか?
0639デフォルトの名無しさん
2008/12/12(金) 20:49:20非常にソフトなテイストで且つ皮肉たっぷりに伝えたいんだが、
自分にそんな文才がないことが非常に悔やまれる。
0640デフォルトの名無しさん
2008/12/13(土) 00:28:35zpinitをグーグルで検索してヒットしたページにサンプルが置いてあるけど、それでは何かご不満?
残念ながら、私にはそれ以上に詳しい説明なんてものが存在し得るとは思えないのですが。
まぁ、どうしてもこれ以上話を続けたいと言うのでしたら環境依存スレでどうぞ。
あー、その際はどこまで理解できたかを書いたほうがいいかもしれませんね。
案外、日本語の勉強から始めないといけないかも知れませんし。
0641デフォルトの名無しさん
2008/12/13(土) 00:51:130642デフォルトの名無しさん
2008/12/13(土) 01:06:36おいばかやめろ
Win32APIスレへおかえりください^^
0643デフォルトの名無しさん
2008/12/13(土) 02:32:01戻ってこなければどこのスレいったっていいんだけどさ。
どこにいったって同じ事聞いて、同じ事かえすんでしょ? ダムすれでもいいんじゃね?
0644638
2008/12/13(土) 10:03:48C++で作成使用としていたため、ここに書き込んでしまっていました。
0647デフォルトの名無しさん
2008/12/13(土) 11:25:48何処までC++って奥が深いんだろう
と、C++の淵に佇む
void Fun()
{
class Lcal
{
...メンバー変数...
...メンバー関数定義...
};
Localを使用するコード...
}
0648デフォルトの名無しさん
2008/12/13(土) 11:26:44void Fun()
{
class Local
{
...メンバー変数...
...メンバー関数定義...
};
Localを使用するコード...
}
0649デフォルトの名無しさん
2008/12/13(土) 11:28:240650デフォルトの名無しさん
2008/12/13(土) 11:30:520651デフォルトの名無しさん
2008/12/13(土) 11:38:32boostならlexical_castとか。
0652デフォルトの名無しさん
2008/12/13(土) 12:29:20っていう制限があった気がする
それで一気に萎えた記憶がある
0653デフォルトの名無しさん
2008/12/13(土) 12:33:17関数ローカルクラスだろうと無名クラスだろうと何でもテンプレートに渡せるぞ!
0654デフォルトの名無しさん
2008/12/13(土) 12:48:180655デフォルトの名無しさん
2008/12/13(土) 13:22:48そんなあなたにD
関数ローカルクラスだろうと関数リテラルだろうと
メンバメソッドだろうと何でもテンプレートに渡せるぞ!
0656デフォルトの名無しさん
2008/12/13(土) 16:28:03ATL::CSimpleMap のキーを順に全部取得する場合ってどうやってやってる?
インデックスで対象のキーを拾えればいいんだけど、できないっぽい。
GetStartPosition/GetNext 使わなきゃむりぽ?
0657656
2008/12/13(土) 16:54:390658デフォルトの名無しさん
2008/12/13(土) 16:58:030659デフォルトの名無しさん
2008/12/13(土) 17:08:33関数Aに書かれている_tfopen_sは成功(戻り値:0)なのに、
関数Bに書かれている_tfopen_sは失敗(戻り値:EBUSY)するんです。
引数はともに全く同じで、_tfopen_sの前や処理後には必ず_fcloseallしてます。
なんで2回目は失敗するんでしょうか・・・
0660デフォルトの名無しさん
2008/12/13(土) 17:18:45引数が実は違う
実はcloseしてなかった
どっかでスタック破壊してる
等々いくらでも原因が・・・
0661デフォルトの名無しさん
2008/12/13(土) 17:22:53そうですよね…すみません。
引数1は単純なFILE*で、モードは"r"、パスはフルパスで正しい。
呼ぶ前に_fcloseall()しても閉じ忘れとか考えられます?
EBUSYってどっかで開かれてますよー状態ですよね。
あとはメモリ破壊をチェックか…長旅になりそうです><
0662デフォルトの名無しさん
2008/12/13(土) 17:33:380663659
2008/12/13(土) 17:51:07けっこうでかいソースだけど、とりあえず端折って・・・
DWORD CClass1::hogeFunc(ATL::CString* szFormatfile){
// Open file
FILE *filebuf;
DWORD dwRet;
_fcloseall();
dwRet = _tfopen_s(&filebuf, (LPCTSTR)szFormatfile , _T("r"));
/* なにやらな処理 */
_fcloseall();
}
こんな感じです。
dwRet に 16 が返ります。
0664デフォルトの名無しさん
2008/12/13(土) 17:58:470665デフォルトの名無しさん
2008/12/13(土) 18:16:200666デフォルトの名無しさん
2008/12/13(土) 18:24:44普通に閉じた方がいいと思うよ
0667デフォルトの名無しさん
2008/12/13(土) 18:26:020668659
2008/12/13(土) 18:32:11fclose でもだめですたorz でもこれからは fclose にします
>>665
読んだとき、「operator LPCTSTRがあるだろーが」と思ってしまったんですが、
よく見直してみたら「CString::operator LPCTSTR を使った char* を指定する動き」じゃなくて
「CString* を LPCTSTR と見做す動きに」になってしまっていたorz
dwRet = _tfopen_s(&filebuf, (LPCTSTR)szFormatfile , _T("r"));
を
dwRet = _tfopen_s(&filebuf, (LPCTSTR)(*szFormatfile) , _T("r"));
に直したらうまくいきました!
本当にありがとうございました。反省して精進します。
0669デフォルトの名無しさん
2008/12/13(土) 18:37:180670デフォルトの名無しさん
2008/12/13(土) 22:09:240671デフォルトの名無しさん
2008/12/13(土) 23:10:350672デフォルトの名無しさん
2008/12/14(日) 00:04:47using namespace std;
上のほうでusing使うなみたいなこと書かれてたけど、どうして?
0673デフォルトの名無しさん
2008/12/14(日) 00:15:50using 全部じゃなくて using namespace の話だよな。
まずヘッダでやるのは論外。名前空間の意味が無くなる。
それ以外には、スコープ指定の無い通常の名前が指すものが
曖昧になってしまうという問題がある。
http://d.hatena.ne.jp/mb2sync/20080317/p1
最初からエラーになってくれればまだしも、取り込んだ名前空間内部の
変更によって後からエラーが発生するようになる可能性もある。
0674デフォルトの名無しさん
2008/12/14(日) 02:08:54つ “More Exceptional C++”
詳しい解説があったから、確認してみ。
大雑把に言うと、「名前空間を汚染する/順番依存な問題を発生するから使う場所に気を付けないとダメ」つうこと。
0675デフォルトの名無しさん
2008/12/14(日) 02:16:50クソ入門本がいっぱいあるから
0676デフォルトの名無しさん
2008/12/14(日) 02:17:16「余計なキャストしたからこそ、ケアレスミスを見逃した」
ってことを言いたいんじゃねえのかなと思った。
0677デフォルトの名無しさん
2008/12/14(日) 02:44:58で、
DWORD* dwOffset = 0x03A40000;
したときの、
*(dwOffset + 0x00000002) の値って、0x00030090 になるよね!?(もちろんIA32)
なぜか 0x00000004 になるorz
0678デフォルトの名無しさん
2008/12/14(日) 02:51:530679デフォルトの名無しさん
2008/12/14(日) 02:53:28*(dwOffset + 2) = dwOffset[2] だもん
それやるなら
BYTE *dwOffset=0x03A40000;
*(DWORD*)(dwOffset + 2) みたいな感じでは
規格見てないけどw
0680デフォルトの名無しさん
2008/12/14(日) 02:59:38とりあえずこのスレ的には未定義動作と言っておこう。
実際、アライメント違反で CPU 例外が発生する環境もあるし。
あ、 "IA32" なら大丈夫なんだっけ?
0681デフォルトの名無しさん
2008/12/14(日) 03:17:54dwOffset + 2 だと8バイト移動するんじゃないか?
0682デフォルトの名無しさん
2008/12/14(日) 03:26:490683677
2008/12/14(日) 03:43:18それは、例えば DWORD に 0x0 が入っているとして、
DWORD + 2 っていうのは、0x0 + 0x2 = 0x2 ではなく、
0x2 + sizeof(DWORD) * 2 = 0xA っていう事か!?
ポインタ変数に対し + 演算子を使う時は単純合計と考えてはいけないって事なのか!?
0684デフォルトの名無しさん
2008/12/14(日) 03:51:18いや、ポインタとその内部表現であるアドレスとを混同しなければ
その結果で十分単純だから。
0685デフォルトの名無しさん
2008/12/14(日) 03:52:49DWORD a[2];
DWORD p = &a[0];
で p + 1 は &a[1] になるってだけの話だ。
0686デフォルトの名無しさん
2008/12/14(日) 04:00:31Cから勉強し直すことをお勧めする
0687デフォルトの名無しさん
2008/12/14(日) 04:13:29「ポインタの極意」をオヌヌメするよ
0688デフォルトの名無しさん
2008/12/14(日) 06:26:47それは、例えば DWORD に 0x0 が入っているとして、
DWORD + 2 っていうのは、0x0 + 0x2 = 0x2 ではなく、
0x2 + sizeof(DWORD) * 2 = 0xA っていう事か!?
--
だめだこいつ、落ち着きがなさ過ぎる。
0690デフォルトの名無しさん
2008/12/14(日) 08:28:06using std::vector; とか。
0691デフォルトの名無しさん
2008/12/14(日) 09:01:08*(dwOffset + 0x00000002)
↓
↓コンパイル時の解釈
↓
*((DWORD*)((BYTE*)dwOffset + sizeof(DWORD) * 0x00000002))
0692デフォルトの名無しさん
2008/12/14(日) 11:18:44構文エラーがでてしまいよくわからないので
dllファイルの関数の使い方を教えてください
0693デフォルトの名無しさん
2008/12/14(日) 11:32:07あとは普通の関数と同じように使える。
0694デフォルトの名無しさん
2008/12/14(日) 11:33:40すいません.libのリンクはどうやればいいのですか?
0695デフォルトの名無しさん
2008/12/14(日) 11:38:260696デフォルトの名無しさん
2008/12/14(日) 12:07:28dllだけの場合最初に#using <XXX.dll>
だけでいいんですか?
0697デフォルトの名無しさん
2008/12/14(日) 12:08:16言葉が足りなかった。
キャストをつける必要はないけど、キャストをつけるんだったら static_cast にしておけば
誤りには気づいたかもね、ぐらい。
暗黙のうちに変換されるものについてはキャストつけた方が呼び出しが明確になるという
考え方もあるかと思って。
0698デフォルトの名無しさん
2008/12/14(日) 12:13:14その辺はもうC++の範囲外だから、適切なスレでやってくれ。
0699デフォルトの名無しさん
2008/12/14(日) 12:13:16どのDLLが使いたいのか隠さずに言ってみろよ。
0700デフォルトの名無しさん
2008/12/14(日) 12:13:59VS2008スレが妥当かな。ここは言語のスレだからすれ違いだ。
DLLはいろいろ種類があるから何のDLLかも移動先に書いとけ。
0701デフォルトの名無しさん
2008/12/14(日) 14:45:12コンストラクタで LoadLibrary と GetProcAddress をして
デストラクタで FreeLibrary するラッパクラスを作っとけ。
0702デフォルトの名無しさん
2008/12/14(日) 17:45:07関数に対しDer1,Der2のポインタを、基底クラスであるBaseのポインタを用いて受け渡しています。
現在は、関数内部では、受け渡せれたクラスがDer1なのか、Der2なのかをdynamic_castで判定し、
Der1であったばあいはvector<Base*>に対し、push_back(new Der1)
Der2であったばあいはpush_back(new Der2)
といった処理を行っているのですが、この方法であると、dynamic_castを多用するのでパフォーマンスが心配なのと、
派生クラスを増やすとpush_backを行う関数の書き換えも必要となるといった点で、問題があるかなと思っています。
そこで、Baseクラスに純粋仮想関数としてgetInstance()を持たせ、各派生関数で
Base* Der1::getInstance(){return new Der1;}とし、
push_back(p->getInstance())
することも考えたのですが、getInstanceというとsingletonパターンみたいに見えるので、
可読性が落ちるのでやめたほうがいいよ といった意見もありました。
今回のように、基底クラスのポインタを用いて渡されたオブジェクトの型が「new 型」するためだけに必要な場合は
どのような手法を用いるのが最適なんでしょうか?
0703デフォルトの名無しさん
2008/12/14(日) 18:25:12AbstractFactory?
0704デフォルトの名無しさん
2008/12/14(日) 18:25:350705デフォルトの名無しさん
2008/12/14(日) 18:26:520706デフォルトの名無しさん
2008/12/14(日) 18:26:59受け取ったオブジェクトを vector に入れるんじゃなくて、同じ型の
デフォルトコンストラクタで生成したオブジェクトを入れるの?
なんかおかしくない?
0707デフォルトの名無しさん
2008/12/14(日) 19:20:54とりあえず関数名はgetInstanceからcloneあたりに変えたほうがいいかな。
0708デフォルトの名無しさん
2008/12/14(日) 20:40:17見たことないけど名前どうするのがいいんだろうな、createDefaultとか?
そのデフォルト生成のオブジェクトにセマンティックな意味があるならその名前を付けた方がいい
例えば空のレコードならcreateEmptyRecordとか
0709デフォルトの名無しさん
2008/12/14(日) 21:32:320710デフォルトの名無しさん
2008/12/14(日) 22:57:030711702
2008/12/14(日) 23:15:40やはり関数名がgetInstance()では混乱をきたしそうなので少し考える必要があるみたいですね。
上であげた例のような完全にデフォルトのコンストラクタを呼ぶ場合は
newInstance()あたりが良いのかなと思います。
また、実際に利用する際は、デフォルトをそのままpush_back()するだけではなく、
例えばpushObject(Base *obj,int ID)
といったように付加情報を付ける場合も多いので、
そういった場合は
Base *nObj = obj->newInstance();
nObj->setID(ID);
push_back(nObj);
といった形をとり、より複雑にオブジェクトを構築する必要がある場合は
FactoryMethodの利用も考えたいと思います。
0712デフォルトの名無しさん
2008/12/15(月) 21:20:33こちらのスレで、STLやらそういう技術をメモリの少ないハード(ゲーム機)で
使うかどうか中途半端に議論になっているのですが、
実際のところ、どうなんでしょうか?
0713デフォルトの名無しさん
2008/12/15(月) 21:46:040714デフォルトの名無しさん
2008/12/16(火) 01:45:55自分で確保したメモリ上のクラスをコピーするにはどういったコピーをすればいいのでしょうか。
たとえばstd::vectorをコピーするときってどうやって内部を複製しているのでしょうか。
コピーコントラクタがいいのか、イコールがいいのか。
最悪memcpyって手もありますけど、これは気持ち悪いからしたくないです。
どなたかご教授ください。
0715デフォルトの名無しさん
2008/12/16(火) 01:59:30中身は「メンバをひとつずつコピーする」だけ
(コピーコンストラクタの場合はメンバ初期化子でやるのがいい)
これ守っていればどんなクラスを作ろうと同じやり方で済むし
引数に渡しても戻り値でもらっても他クラスのメンバにしても
ローカル変数で実体作られても例外で投げられても問題ないし
何よりstd::vectorなんかに突っ込むときに余計な心配がいらない
memcpyが気持ち悪いと感じているのは感覚として正しい
でも理屈を理解したほうがいい
0716デフォルトの名無しさん
2008/12/16(火) 02:00:320717デフォルトの名無しさん
2008/12/16(火) 02:11:31レス感謝。えぇっと。書き方悪かったです。
コンテナの方を再発明してるんですが、コピーするときの方法を知りたかったのです。
ってこれ最初にかいてれば・・・。すいません。
自分で確保って言うのは、クラス配列を自分でnewしたときの事です。
newして確保時にコンストラクタが動いてそこからコピーする2重苦は避けられないのでしょうか??
お願いします。
0718デフォルトの名無しさん
2008/12/16(火) 02:28:48一応コピーコンストラクタで解決ってことにします。
セオリーの代入とコピーコンストラクタを同時に実装するというのはコンテナはコピー方法を選ばないと解釈しました。
そういう感じで回答ありがとうございました。抜けます〜。
0719デフォルトの名無しさん
2008/12/16(火) 07:28:43STLとか、わけのわからんくくりで考えてるうちは一生答えは出ないだろうよ。
せっかく部品に分かれてるんだから、問題ないものは使う、問題があれば使わない、と
個別に考えないと何も見えてこない。
0720デフォルトの名無しさん
2008/12/16(火) 10:06:32> 自分で確保って言うのは、クラス配列を自分でnewしたときの事です。
> newして確保時にコンストラクタが動いてそこからコピーする2重苦は避けられないのでしょうか??
vectorなんかの実装見れば分かるけど、allocatorで領域だけ確保した後placement newしてる。
0721デフォルトの名無しさん
2008/12/16(火) 23:51:38struct c_t
{
uint_t m;
c_t() : m(u){}
};
const uint_t u = 0;
c_t< u > f0;
uint_t xx = 3;
*const_cast< uint_t * >(&u) = xx;
c_t< u > f1;
stream << _T("c_t< 0 > = ") << f0.m << std::endl;
stream << _T("c_t< 3 > = ") << f1.m << std::endl;
結果:
c_t< 0 > = 0
c_t< 3 > = 0
これってバグってると思う?
0722デフォルトの名無しさん
2008/12/17(水) 00:04:300723デフォルトの名無しさん
2008/12/17(水) 00:07:490724デフォルトの名無しさん
2008/12/17(水) 00:16:41int main(){
const int i = 0;
std::cout << i << ",";
*const_cast<int*>(&i) = 3;
std::cout << i << std::endl;
}
このプログラムは「0,3」を表示しても「0,0」を表示しても「0,924877096」を表示してもよい
何も表示せずPCを炎上させても良い
要するに未定義だ
0725デフォルトの名無しさん
2008/12/17(水) 00:24:31const は、読み出しオンリーのauto変数扱いだと
思ってたけど違うのか
const uint_t u が
templateのパラメータに使えてしまうのが、そもそもおかしいのかと思ったので
0726デフォルトの名無しさん
2008/12/17(水) 01:49:190727デフォルトの名無しさん
2008/12/17(水) 01:51:080728デフォルトの名無しさん
2008/12/17(水) 07:17:48釣りなの? 馬鹿なの? 死ぬの?
0729デフォルトの名無しさん
2008/12/17(水) 09:30:05static じゃないconst メンバ変数は?
0730デフォルトの名無しさん
2008/12/17(水) 10:13:47それをどうやってコンパイル時に"初期化されている"状態にするんだ?
>>726については規格の5.19に書いてあるよ
0731デフォルトの名無しさん
2008/12/17(水) 10:20:45726 には「コンパイル時に」とは書いて無かったから嘘だと突っ込まれてるんだろ。
規格の 5.19 に「初期化されているconst変数は、全て」なんて記述も無い。
0732デフォルトの名無しさん
2008/12/17(水) 11:51:40volatile constにするとどうなる? それでも非定義?
0733デフォルトの名無しさん
2008/12/17(水) 13:13:37使いなさんな。
0734デフォルトの名無しさん
2008/12/17(水) 17:36:45placement newてそういう風につかえるんですね。新発見です。
0735デフォルトの名無しさん
2008/12/17(水) 21:16:15大丈夫そうなイメージはあるが。
0736デフォルトの名無しさん
2008/12/17(水) 23:35:12じゃ、volatile const にどんな意味があるのかと言えば、読み込み専用のメモリマップド I/O とかだったら
有り得るような気がする。
0737デフォルトの名無しさん
2008/12/17(水) 23:38:35プログラムの管理領域にvolatile constの変数取って意味あるかなぁ…
0738デフォルトの名無しさん
2008/12/17(水) 23:49:520739デフォルトの名無しさん
2008/12/18(木) 01:58:140740デフォルトの名無しさん
2008/12/18(木) 02:17:24MFCスレなりゲ製板なりへどうぞ。
0741デフォルトの名無しさん
2008/12/18(木) 04:06:170742デフォルトの名無しさん
2008/12/18(木) 04:14:130743デフォルトの名無しさん
2008/12/18(木) 04:16:150744デフォルトの名無しさん
2008/12/18(木) 04:55:470745デフォルトの名無しさん
2008/12/18(木) 07:41:53ああそうか。
そのプログラムには書き込み禁止だけど
別な所で値が変更されるような場合もあるだろうしな。
0746デフォルトの名無しさん
2008/12/19(金) 03:07:030747デフォルトの名無しさん
2008/12/19(金) 07:02:340748デフォルトの名無しさん
2008/12/19(金) 09:07:16まず、解の公式を加算減算だけで表した数式を書くのが先では?
コンピュータというのは、人がやったら物凄い時間がかかるのを単に高速にやってくれる
だけのものなんだから。自分が分からないものを自動的にはやってくれないよ。
0749デフォルトの名無しさん
2008/12/19(金) 09:43:470750デフォルトの名無しさん
2008/12/19(金) 20:00:46#include <iostream>
#include <new>
using namespace std;
int main()
{
double *p;
unsigned long int count = 0;
cout << "double一個のサイズは" << sizeof(double) << endl << endl;
for (;;) {
try {
p = new double;
count++;
} catch(bad_alloc ba) {
cout << "error:"<< count << "回目に起こった" << endl;
return 1;
}
}
cout << "outside of loop" << endl;
return 0;
}
0751デフォルトの名無しさん
2008/12/19(金) 20:29:441が返らないかチェックした?
bad_alloc がthrowされた時点でメモリが不足してるから標準出力されないと予想。
最初にメモリ確保しておいてcatchの先頭でdeleteして空きメモリを作れば
出力されると予想
0752デフォルトの名無しさん
2008/12/19(金) 20:34:47cout なくても terminate 内で terminate が呼ばれたというメッセージが出てで死んでた。
例外機構を実行すること自体にメモリ足りなくて
また例外投げて落ちてるのかもしれない。
0753デフォルトの名無しさん
2008/12/19(金) 20:35:43多分、newするだけでメモリアクセスしてねーから、ページを予約だけして
実際にページインは発生してない、
ゆえにいつまでたってもエラーにならないんじゃないか?
まあ、C++言語仕様の範疇の話ではないな
0754デフォルトの名無しさん
2008/12/19(金) 20:41:48流石にそれはないか
0755デフォルトの名無しさん
2008/12/19(金) 20:42:30ちゃう。malloc に失敗自体はする。
ただ、catch される前に死ぬ。
0756デフォルトの名無しさん
2008/12/19(金) 20:43:350757デフォルトの名無しさん
2008/12/19(金) 20:46:28参照カウンタ式のスマートポインタで、
参照カウンタは A が保持しているとする(侵入型)。
んで、
int main()
{
try {
std::list<B> v;
for (;;) {
v.push_back(B());
}
} catch (const std::bad_alloc& e) {
return 1;
}
return 0;
}
とすれば catch される前にメモリが開放されるはずなので
大丈夫かと思いきや、それでも死んだ。
多分、throw の実装が例外オブジェクトをヒープに確保するようになってて、
そこでメモリ確保に失敗して死ぬんじゃないかと予想する。
0758デフォルトの名無しさん
2008/12/19(金) 20:48:33常に失敗するわけじゃなくて、
細かいバイト数ずつ確保していった場合のみ、こういう現象がおこるらしい。
bad_alloc 例外を受ける事は普通は全く問題ないんだが、
こういう極端な例の場合は問題が発生することもあるようだ。
0759デフォルトの名無しさん
2008/12/19(金) 20:52:500760750
2008/12/19(金) 22:24:15(error:201046784回目に起こった)
どちらのPCでもg++でコンパイルしたのですが、、、不思議です。
0761デフォルトの名無しさん
2008/12/19(金) 22:26:42double 1つごときが確保できないような状況では、
はっきりいってなにもできないに等しい
0762デフォルトの名無しさん
2008/12/19(金) 22:35:31によると、throw では __cxa_allocate_exception() によって例外オブジェクト用メモリが割り当てられるらしい。
で、gcc 4.2.1 の libstdc++/libsupc++/eh_alloc.cc では、32 bit 環境では、512 バイト×32 個の緊急回避用バッファを
用意しているものの、それを使い尽くしてどうにもならなかった場合には std::terminate() を呼んでいるようだ。
0763デフォルトの名無しさん
2008/12/19(金) 22:36:55へー…
これは個人的な興味だけど、
new_handlerで出力しようとするとどうなるの?
0764750
2008/12/19(金) 23:13:35new_handlerを知りません。
とりあえず細かくメモリを割り当てると今回のようなことが起るかもしれないと思って置きます。
いままで逐一例外処理を書いてたけど無駄な作業になっていたのも多かったかもw
0765デフォルトの名無しさん
2008/12/19(金) 23:23:04オフトピで申し訳ないのだが,そのソース中の
__cxa_allocate_exception() 内の goto の使い方は正当なのだろうか
0766デフォルトの名無しさん
2008/12/20(土) 00:11:480767デフォルトの名無しさん
2008/12/20(土) 00:16:080768デフォルトの名無しさん
2008/12/20(土) 00:17:27coutのせいじゃねえの?
printfは意外とヒープにデカいメモリ要求することがあるから
シビアな環境でのデバッグには使えなかったりする
coutのoperator<<はよく知らないけど同じようなことしてるんじゃね
0769デフォルトの名無しさん
2008/12/20(土) 00:24:47おまいさんは今までの流れの何を見てたんだ・・・
0770デフォルトの名無しさん
2008/12/20(土) 00:34:38cout外しても症状同じなのな
0771デフォルトの名無しさん
2008/12/20(土) 03:41:23bad_alloc に対する例外処理が、ってことだよね?
Exceptional C++ Style やそれに基づく前スレでの議論
C++相談室 part63
http://pc11.2ch.net/test/read.cgi/tech/1221144557/672-695
辺りも参照するといいと思う。
>765
特に問題があるようには見受けられない。
最後の後始末部分だけまとめるという意味では goto の使用法として
それなりに良くあるパターンに見えるけどどの辺りが気になる?
0772デフォルトの名無しさん
2008/12/20(土) 10:46:38そこにDBからデータを読み込んでいます。
スコープから出ればローカルのDataオブジェクトは完全にメモリから解放される
はずなのになぜかメモリリークっぽくなっています。
C++の書き方が問題なのかSQLiteのバグなのか検討がつきません。
ところどころでgetchar()で止めて確かめたメモリ使用量はコメントで
記しています。アドバイスお願いできないでしょうか。
// DBのデータを格納するデータ構造
class Data {
public:
vector<string> data;
};
int main() {
cout << "before scope" << endl; getchar(); // 2.7MB
{
Data d;
func(&d);
cout << "push data" << endl; getchar(); // 83MB
}
// ここでdは解放されて元の2.7MBに戻るはずなのに戻らないでリーク?
cout << "out of scope" << endl; getchar(); // 22MB
return 0;
}
0773デフォルトの名無しさん
2008/12/20(土) 10:48:05// SQLiteのコールバック関数、Dataオブジェクトにデータを流し込む
int callback(void *unused, int columnCount, char **values, char **columnNames) {
Data *d = (Data*)(unused);
for (int i = 0; i < 10; i++) {
d->data.push_back(*(values+30));
d->data.push_back(*(values+25));
d->data.push_back(*(values+30));
d->data.push_back(*(values+30));
}
return SQLITE_OK;
}
void func(Data *d) {
sqlite3 *handle;
string query = "select * from Table1";
sqlite3_open("test.db", &handle);
cout << "before exec" << endl; getchar(); // 2.9MB
sqlite3_exec(handle, query.c_str(), callback, d, NULL);
cout << "after exec" << endl; getchar(); // 83MB
}
0774デフォルトの名無しさん
2008/12/20(土) 10:52:300775デフォルトの名無しさん
2008/12/20(土) 11:11:23手元にないのですぐに確かめられないのですが
それ以外で怪しいところがあったらご指摘お願いします。
0776デフォルトの名無しさん
2008/12/20(土) 11:13:10OSに返されるわけではない。
new/delete、malloc/free のすることは、
(1) ページという単位でOSからメモリを取得し
(2) 必要なサイズにぶつ切りにしてプログラムに渡し
(3) 解放されたら再利用できるようにリストにしておく
という感じ。
だから、delete/freeでプロセスのメモリ使用量が完全に元に戻るわけではない。
その処理を1000回繰り返してメモリ消費量がどんどん増えるようなら
確かにリークしているが、1回だけの実行では何とも言えない
0777デフォルトの名無しさん
2008/12/20(土) 11:34:130778デフォルトの名無しさん
2008/12/20(土) 11:47:00まさかタスクマネージャ・・・
0779デフォルトの名無しさん
2008/12/20(土) 12:03:50まあ、stlとか信用していないならvectorとstringも怪しいが。
0780デフォルトの名無しさん
2008/12/20(土) 12:20:31Windowsのタスクマネージャのメモリ使用量ですが・・・ダメですか?
あとLinuxではps alx | grep a.outでRSSを見てます。
0781デフォルトの名無しさん
2008/12/20(土) 12:22:10SQLiteの最新版を使ってはいるんですが、Googleで調べてみたらメモリリークのバグありとかなんとか・・・>>776さんの方法で確かにリークしていたらそこくらいしか思いつかないのです。
0782デフォルトの名無しさん
2008/12/20(土) 12:39:17さっさとループにして試せばいいじゃん
5秒でできるだろ
0783デフォルトの名無しさん
2008/12/20(土) 12:49:460784デフォルトの名無しさん
2008/12/20(土) 12:50:16ごもっともだと思うので今試してみます。
環境がMacしかないうえのsqlite3もDBも手元にないので5秒では無理ですが報告します。
0785デフォルトの名無しさん
2008/12/20(土) 12:54:13せめて3分ぐらいください。
0786デフォルトの名無しさん
2008/12/20(土) 12:58:51782から15分経ってるからとっくに出来てるよな
早く見せろ
0787デフォルトの名無しさん
2008/12/20(土) 13:04:31cout << "before scope" << endl; getchar();
{
Data d;
func(&d);
cout << "push data" << endl; getchar();
}
cout << "out of scope1" << endl; getchar();
{
Data d;
func(&d);
cout << "push data" << endl; getchar();
}
cout << "out of scope2" << endl; getchar();
こんな感じで5回繰り返しています。使ってるDBは同じじゃないです。メモリ使用量はps alxのRSSです。sqlite3は3.6.6です。
最初: 356
DB読み込み直後: 74884
out of scope1: 70808
out of scope2: 71784
out of scope3: 72752
out of scope4: 73720
でした。やっぱリークかな・・・
0788デフォルトの名無しさん
2008/12/20(土) 13:16:430789デフォルトの名無しさん
2008/12/20(土) 13:17:140790デフォルトの名無しさん
2008/12/20(土) 13:21:140791デフォルトの名無しさん
2008/12/20(土) 13:29:420792デフォルトの名無しさん
2008/12/20(土) 13:33:160793デフォルトの名無しさん
2008/12/20(土) 13:41:26cout << "before scope" << endl; getchar();
for (int i = 0; i < 100; i++) {
{
Data d;
func(&d);
cout << "push data" << endl;
}
}
cout << "end of scope" << endl; getchar();
1回目ループ後:75860
100回目ループ後:166840
うーん。やっぱり少しずつもれてるんでしょうか。
0794デフォルトの名無しさん
2008/12/20(土) 13:48:35グラフにするんだよ。
0795デフォルトの名無しさん
2008/12/20(土) 14:48:570796デフォルトの名無しさん
2008/12/20(土) 15:11:130797デフォルトの名無しさん
2008/12/20(土) 15:12:50普通のことだろ
0798デフォルトの名無しさん
2008/12/20(土) 15:21:030799デフォルトの名無しさん
2008/12/20(土) 15:46:45上でループコードを回してるんだよな・・・
当然だよな・・・
・・・
0800デフォルトの名無しさん
2008/12/20(土) 15:54:270801デフォルトの名無しさん
2008/12/20(土) 15:54:50少なくともこの現象とは関係無いよ。
0802デフォルトの名無しさん
2008/12/20(土) 16:00:55コールバックの中でpush_backしてるのをコメントアウトしてみたらどうなる?
0803デフォルトの名無しさん
2008/12/20(土) 16:53:20いやいや、開いた handle をクローズしなきゃまずいだろ
sqlite3_close のシグネチャは
int sqlite3_close(sqlite3*);
だよ?
0804デフォルトの名無しさん
2008/12/20(土) 17:05:59例えれば、FILE* と同じものだよ。おまえは、ファイルの読み書きをする時に、
readのループで毎回fopenしてfcloseしてるのか?
0805デフォルトの名無しさん
2008/12/20(土) 17:14:49元の質問とコードを全く読んでないだろ。
それとも読解能力が無いのか?
0806デフォルトの名無しさん
2008/12/20(土) 17:40:02言ってるけど、正しい位置で呼び出してるかどうからわからんし、
コピペされたコードにない以上、答える側が疑うのは当然だろ
>>805
func でsqlite3_open して、closeしてないじゃん?
ここでいうループってのは、メモリ使用量を測るための
処理全体の恣意的なループのことを言ってるんだから、毎回解放するべきに
きまってるじゃん
ていうか、おまえは 普通のプログラムで fopen 読んでおいて fclose を
呼ばないのか?お前らこそコード読んでないだろ
#fcloseは自動的に呼ばれるってのは無しな
0807デフォルトの名無しさん
2008/12/20(土) 17:51:010808デフォルトの名無しさん
2008/12/20(土) 17:52:100809デフォルトの名無しさん
2008/12/20(土) 17:56:00ヒント:C言語
0810デフォルトの名無しさん
2008/12/20(土) 17:56:220811デフォルトの名無しさん
2008/12/20(土) 18:02:300812デフォルトの名無しさん
2008/12/20(土) 18:23:18newで確保したメモリはヒープ領域から割り当てられて、
ヒープ領域は双方向リストで構成されてますよね。(wikipedia調べ)
下の図で分割されてる四角が双方向リストを表してます。
この左側には次の空き領域のアドレスが入り、0が入ってるのは次の空き領域がない状態です。
右側には空き領域のサイズが入ってます。
この空き領域と割り当て済の領域はスタック構造なのでしょうか?
メモリについてよく理解していないので変なこと言ってるかもしれないです。
ttp://kita.kitaa.net/10/s/10mai81022.jpg
0813デフォルトの名無しさん
2008/12/20(土) 18:33:45と思うが、これからWikipedia見てくる
ヒープが双方向リスト構造をしているわけではない
0814デフォルトの名無しさん
2008/12/20(土) 19:01:400815デフォルトの名無しさん
2008/12/20(土) 19:38:45使う側としてはどのように管理されているのか意識しなくていいはず。
自分でカスタムアロケータを書く際の参考にするとか、アセンブラレベルでコードを
追っかけてるとか、メモリダンプを解析しているとかでなければ。
とはいえ、リスト構造によって管理するのはありがちな実装だとは思う。
「スタック構造」が何を指しているのかよくわからないけど、領域の割り当てと解放は
任意の順序で発生しうるので、先入れ後出しのスタック構造とは言えないと思う。
0816デフォルトの名無しさん
2008/12/20(土) 19:44:09C++の用語としてはフリーストアが正しい。
C++の規格内にヒープという言葉は
std::make_heap などのヒープ構造の操作関数以外存在しない。
0817デフォルトの名無しさん
2008/12/20(土) 19:57:250818デフォルトの名無しさん
2008/12/20(土) 20:00:26たしかに間違ってはいないんだが、いろんなレイヤーの話がぐちゃぐちゃに
書いてあるから、初心者は混乱するような気がする
OSとページングとプロセスモデルの話があって、
その上に libc の話があって、
その上にC/C++の話があるわけだけど
0819デフォルトの名無しさん
2008/12/20(土) 20:12:19雑多な知識の風呂敷を広げるところでもあるからな。
0820デフォルトの名無しさん
2008/12/20(土) 20:33:07まず、「スタック」 には2つの意味があって、
「プロセスが利用するメモリ上のスタック領域」 と、
「スタックと呼ばれるデータ構造」 がある。この両者の区別はついてる?
両者は、別物。正確には、メモリ上のとある領域が、「データ構造のスタック」 と
似ているから「スタック領域」 などと呼ばれる、ということだけど。
同様に、
「メモリ領域のヒープ」 と 「データ構造のヒープ」 も完全に別物。
まずはこの区別を付けること。
ちなみに、質問にストレートに答えるなら、答えは 「NO」
0821デフォルトの名無しさん
2008/12/20(土) 20:33:47malloc()やfree()がC++の標準に入ってないとでもお思いですか?
>>812
メモリ割り当ての構造やアルゴリズムを知りたければ
ベストフィット/ファーストフィットなどのキーワードでぐぐれば
それなりに詳しいものに当たれるはず。
0822デフォルトの名無しさん
2008/12/20(土) 20:36:26実際にヒープが使われる事が多いだけであって。
0823デフォルトの名無しさん
2008/12/20(土) 20:36:59Perlで連想配列をハッシュと呼ぶのと同じようなもんだな。
0824デフォルトの名無しさん
2008/12/20(土) 20:38:230825デフォルトの名無しさん
2008/12/20(土) 20:45:160826デフォルトの名無しさん
2008/12/20(土) 20:45:560827デフォルトの名無しさん
2008/12/20(土) 20:50:320828デフォルトの名無しさん
2008/12/20(土) 20:53:26>>822
0829812
2008/12/20(土) 20:57:41スタック領域はプログラム開始時に変数作り終了時に一斉解放する場所。
ヒープ領域は動的に確保する変数をリスト構造使って割り当ててく場所。
この認識であってますか?
0830デフォルトの名無しさん
2008/12/20(土) 21:02:000831デフォルトの名無しさん
2008/12/20(土) 21:03:20ヒープについてはおおむね正しい
0832デフォルトの名無しさん
2008/12/20(土) 21:04:04C++の標準関数であるmalloc()が持ってくるのはどこの領域ですか?
0833デフォルトの名無しさん
2008/12/20(土) 21:04:22スタックが間違ってる
0834デフォルトの名無しさん
2008/12/20(土) 21:09:31正直なところ、名前が紛らわしいから付け替えただけ、というのが本当な気がする。
名目上は、ヒープはプロセスの仕組みとかと比較的結びついていて
どこから割り当てられるかある程度決まっているけど
フリーストアはその出自を問わない領域、ということにはなってる。
もちろん、malloc()が割り当てるのはヒープで
operator new()が割り当てるのがフリーストアであり、
フリーストアの割り当てに失敗すると
new_handlerが呼ばれたりbad_allocが投げられたりする、という違いはあるけどね。
0835デフォルトの名無しさん
2008/12/20(土) 21:09:48ヒープ
0836812 829
2008/12/20(土) 21:10:04俺にはどこが違うのかわからないので・・・。
0837デフォルトの名無しさん
2008/12/20(土) 21:19:00データ構造としてのスタックと
CPUの動く仕組みとしてのスタックがあるから混同するなよ。
もちろん、由来は同じなんだが
「スタック領域」と「スタック構造」は違うから。
0838デフォルトの名無しさん
2008/12/20(土) 21:28:21>>829はスタック領域→普通のメモリですね。
スタック領域はサブルーチンなどで使われるauto変数が置かれる場所ですね。
ttp://www.geocities.co.jp/SiliconValley-Bay/8490/c/c_047.html
このURL先の
■ 4、auto変数についてについて
▼ スタック領域の原理
の説明って正しいですか?
スタック領域とスタック構造ごっちゃになってるような・・・
0839デフォルトの名無しさん
2008/12/20(土) 21:30:01「プログラム開始時に」 ではなく、「関数開始時に」 ならおおむね正しい
関数を呼ぶごとに、その関数のローカル変数を含んだ 「フレーム」 が
スタック領域に積まれていく。
ttp://www.kumikomi.net/article/explanation/2008/15stack/03.html
0840デフォルトの名無しさん
2008/12/20(土) 21:30:37ループ100回回したのサンプルでsqlite_close忘れてましたorzすみませんorz
sqlite_close入れたらループ100回回したあとのメモリ使用量は70812で増えてはいませんでした。
ただ完全に解放されてはいないようです。
これは>>776さんの言う通りにあとで使い回すためにキープしてあるのかもしれません。
vectorにもswap技法なんてのもあるようなので強制解放できないか調べてみます。
0841デフォルトの名無しさん
2008/12/20(土) 22:07:010842デフォルトの名無しさん
2008/12/20(土) 22:07:15>>816は正しいのですか?
0843デフォルトの名無しさん
2008/12/20(土) 22:08:37ヒープという言葉には2通りある
0844デフォルトの名無しさん
2008/12/20(土) 22:09:44正しい
0845デフォルトの名無しさん
2008/12/20(土) 22:10:50たしかに、そのページは全体的にいろいろおかしい。
参考にするべきではないね。
「autoと宣言することによるメモリを効率的に使えます」 ってなんだ
0846デフォルトの名無しさん
2008/12/20(土) 22:59:37標準関数のmalloc()はヒープからメモリを割り当てるのに
>C++の規格内にヒープという言葉は
>std::make_heap などのヒープ構造の操作関数以外存在しない。
が正しいのですか?
>C++の用語としてはフリーストアが正しい。
のならば、malloc()のところにも「フリーストア」と書いてあるのですか?
0847デフォルトの名無しさん
2008/12/20(土) 23:01:310848デフォルトの名無しさん
2008/12/20(土) 23:16:18つまりmallocで確保したメモリのことを言ってる可能性もあるのに
「C++の用語としてはフリーストアが正しい」なんてわけないだろ。
0849デフォルトの名無しさん
2008/12/20(土) 23:18:170850デフォルトの名無しさん
2008/12/20(土) 23:26:15The order and contiguity of storage allocated by successive calls to the calloc,
malloc, and realloc functions is unspecified. The pointer returned if the allocation
succeeds is suitably aligned so that it may be assigned to a pointer to any type of object
and then used to access such an object or an array of such objects in the space allocated
(until the space is explicitly deallocated). The lifetime of an allocated object extends
from the allocation until the deallocation. Each such allocation shall yield a pointer to an
object disjoint from any other object. The pointer returned points to the start (lowest byte
address) of the allocated space. If the space cannot be allocated, a null pointer is
returned. If the size of the space requested is zero, the behavior is implementationdefined:
either a null pointer is returned, or the behavior is as if the size were some
nonzero value, except that the returned pointer shall not be used to access an object.
どこに確保しろとは一言も言ってないな
アライメントちゃんとしろとかallocationからdeallocationまで寿命持てとか
別に確保したのは被らないようにしろとか失敗したらNULL返せとか要件しか書いてない
0851デフォルトの名無しさん
2008/12/20(土) 23:36:590852デフォルトの名無しさん
2008/12/20(土) 23:37:320853デフォルトの名無しさん
2008/12/20(土) 23:42:20だから、mallocで確保した領域について話す場合は、
「C++の用語としてはフリーストアが正しい」は正しくない。
0854デフォルトの名無しさん
2008/12/21(日) 00:10:25> 「autoと宣言することによるメモリを効率的に使えます」 ってなんだ
Cの話だな。
関数内で修飾子を付けずに宣言した int x; みたいなのは auto int x; の省略形とみなされている。
このautoの意味は領域が必要なとき(スコープが有効になったとき)に自動的に確保されて
不要になったら(スコープから抜けたら)自動的に解放されるということをstaticとの対比で明確にしたもの。
必要になったときに確保されて不要になったらすぐに解放されるんだから
プログラム実行中は確保されっぱなしの静的なものよりはメモリを効率的(容量的な意味で)に使えるってこと。
・・・何をいまさらって説明だな。
0855デフォルトの名無しさん
2008/12/21(日) 00:18:09あった事をお伝えしたが、秋葉原駅西側広場に、特大のDVD広告があるのに気が付いた。
広告には、長瀬湊や片桐優姫やこれからのストーリーみたいな事も書かれていた。
http://www.akibaos.com/img/2008/12/02/20081202k04.jpg
http://www.akibaos.com/img/2008/12/02/20081202k00s.jpg
▲「第10話で息を呑み、第11話で涙する−」
秋葉原駅西側広場に「あかね色に染まる坂」の特大のDVD広告
現在放映中の「あかね色に染まる坂」は、2007年に発売されたエロゲ(美少女ゲーム)が原作の
TVアニメで、10月から放映されている。
ファミ通.comでは、『主人公・長瀬準一と、彼の前に現れた少女・片桐優姫は、親どうしが決めた
許嫁。しかし、ふたりの仲は最悪だった。そんなふたりをよそに、両親たちからの命令で、進級
するまでともに過ごすことを義務づけられてしまう』とストーリーを紹介している。
広告があったのは秋葉原駅電気街口の西側にある広場で、
『DVDシリーズ12月19日リリース開始!』と告知されており、長瀬湊と片桐優姫が描かれていた。
広告には『お店によって特典が変わるんだからね!』等のセリフがあったが、
『第10話で息を呑み、第11話で涙する――』とこれからのストーリーみたいなのもあった。
http://www.akibaos.com/img/2008/12/02/20081202k02.jpg
▲「お店によって特典が変わるんだからね!」片桐優姫(CV:釘宮理恵)
http://www.akibaos.com/img/2008/12/02/20081202k03.jpg
▲「どの特典も魅力的ですよね♪」長瀬湊(CV:平野綾)
アキバOS
http://www.akibaos.com/?p=4465
・関連
【アニメ】「あかね色に染まる」DVD第7巻、発売中止? ソフマップ、2009年6月26日→発売中止の表記へ変更
http://gimpo.2ch.net/test/read.cgi/moeplus/1228230000/
0856デフォルトの名無しさん
2008/12/21(日) 00:19:12auto修飾しない場合、コンパイルオプションでレジスタ変数への最適化を許容させていた名残かもね。
0857デフォルトの名無しさん
2008/12/21(日) 00:43:09今でもレジスタへの最適化は普通にするし。
0858デフォルトの名無しさん
2008/12/21(日) 01:02:12というのを思い出した
0859デフォルトの名無しさん
2008/12/21(日) 01:21:43C++0xでは型修飾子ですらなくなるし
型修飾子autoを使ったC++コードを今書くことは有害なだけだな
解説ページに書くことではない
0860デフォルトの名無しさん
2008/12/21(日) 01:24:460861デフォルトの名無しさん
2008/12/21(日) 02:24:17一般的にそれぞれどれくらいの割合が普通なのでしょう?
0862デフォルトの名無しさん
2008/12/21(日) 02:41:37とりあえず大小関係は スタック < 静的 < ヒープ が一般的かなぁ。
割合は、同じぐらいの環境から 1000 倍の違いのある環境まで見たことあるし、
どれぐらいが一般的とかわかんないねぇ。
0863デフォルトの名無しさん
2008/12/21(日) 11:28:21単なる興味本位でなければ、なぜそういう質問をしているかという背景があると望みの答えが得られやすいかも。
どのデータをどの領域に割り当てるか、について考えるために聞いているなら、サイズがどうこうより
そのデータの使用方法によってどの領域に割り当てるかがほとんど決まるので意味がない。
・関数内のみ→スタック
・プログラム中維持、サイズ不変→静的
・プログラム中の任意の時点で確保、解放、サイズ変更あり→ヒープ
サイズによって変える場合があるのはでかすぎてスタックに入らないパターンくらい。
0864デフォルトの名無しさん
2008/12/21(日) 11:38:030865デフォルトの名無しさん
2008/12/21(日) 13:01:38そんな議論してると思うけど、元ページはそんなレベルじゃないと
思う。めっちゃくちゃなページだから
0866デフォルトの名無しさん
2008/12/21(日) 13:10:580867デフォルトの名無しさん
2008/12/21(日) 14:45:17動いた!?Σ(゚д゚lll)
0868デフォルトの名無しさん
2008/12/21(日) 14:48:30http://ja.wikipedia.org/wiki/Atof
だってさ
0869デフォルトの名無しさん
2008/12/21(日) 15:12:240870デフォルトの名無しさん
2008/12/21(日) 15:50:23> いや、おまえら元ページを見ないで
> そんな議論してると思うけど、元ページはそんなレベルじゃないと
> 思う。めっちゃくちゃなページだから
見てきたがそれほどひどくない、
っていうかああいった方向でだめなプログラマはめずらしくもないので正直どうでもいい。
0871デフォルトの名無しさん
2008/12/21(日) 15:51:050872デフォルトの名無しさん
2008/12/21(日) 20:25:55もっと簡単に関数にマルチスレッドフラグのようなものはないんですしょうか?
0873デフォルトの名無しさん
2008/12/21(日) 20:26:220874デフォルトの名無しさん
2008/12/21(日) 20:32:12何がしたいからマルチスレッドにするの?
スレッドを複数動かせばマルチスレッドだけど・・・
NowLoading?
0875デフォルトの名無しさん
2008/12/21(日) 20:39:42マルチスレッドにするならOpenMPでも使えば良いんじゃね。
本質的にマルチスレッドな処理がしたいなら
マルチスレッドな処理をプログラムすればいい。
0876デフォルトの名無しさん
2008/12/21(日) 20:45:26すいません、調べたらBoostライブラリを使えばいいと書いてありました。
0877デフォルトの名無しさん
2008/12/21(日) 23:07:42CPU2つあるからって処理に2つ使っちゃったらレスポンス最悪だしね
処理時間長めでも軽いほうが大抵いいよね
って考えると余計なお世話的場面のがどうしても多くなる
0878デフォルトの名無しさん
2008/12/23(火) 17:22:490879デフォルトの名無しさん
2008/12/23(火) 17:58:570880デフォルトの名無しさん
2008/12/23(火) 19:46:52基本クラスの仮想関数が実態になる、であってますか?
0881デフォルトの名無しさん
2008/12/23(火) 19:51:53コードで書け
0882デフォルトの名無しさん
2008/12/23(火) 19:57:31{
virtual void funk();
}
class b : public a
{
funk();
}
a::funk() でb::funkが呼び出される
b::funk() でb::funkが呼び出される
まではわかったんです。
この場合、class bが存在していない場合
aのfunkが実態になるんでしょうか?それとも起動しないんでしょうか
0883デフォルトの名無しさん
2008/12/23(火) 20:02:56bが存在しなかったらa::funk()が呼び出されるに決まってるだろ
0884デフォルトの名無しさん
2008/12/23(火) 20:07:210885デフォルトの名無しさん
2008/12/23(火) 20:50:06a::func() が純粋仮想関数で無いなら a::func() が実行される
0886デフォルトの名無しさん
2008/12/24(水) 02:14:410887デフォルトの名無しさん
2008/12/24(水) 07:32:020888デフォルトの名無しさん
2008/12/24(水) 18:01:21君が書くんだ
0889デフォルトの名無しさん
2008/12/24(水) 18:32:58class A {
public:
char* hoge = "A::hoge";
void func();
private:
void piyo();
}
A::piyo() {
cout << "A::piyo()";
}
A::func() {
cout << hoge;
piyo();
}
A::func() 内で int hoge; などと別に宣言した場合の曖昧性を回避するにはどうすればいいですか
あと,グローバルスコープで別に定義された piyo() を A::func() の中で呼び出すにはどうすればいいのですか
0890デフォルトの名無しさん
2008/12/24(水) 18:34:53同じ変数名にしない
::piyo()
0891デフォルトの名無しさん
2008/12/24(水) 18:37:34A::hogeでないとメンバ変数のhogeにはアクセスできないんじゃね
0892デフォルトの名無しさん
2008/12/24(水) 20:15:030893デフォルトの名無しさん
2008/12/24(水) 23:13:14実務的には命名規則とか決めて名前が重複しないようにする。
言語仕様的なことは置いといて。
m_XXXとか、_XXXとか。
0894デフォルトの名無しさん
2008/12/24(水) 23:20:11先頭アンダースコアは無い
0895デフォルトの名無しさん
2008/12/24(水) 23:30:49そうか、C/C++は予約されてたな。
他の言語では使うこともある。
0896デフォルトの名無しさん
2008/12/25(木) 12:19:52ここはC++のスレだ
他の言語ってなんだよw
0897デフォルトの名無しさん
2008/12/25(木) 13:00:560898デフォルトの名無しさん
2008/12/25(木) 13:41:40うん。
規格に std::list のメンバ関数 sort() についてに以下の記述がある。
23.2.2.4 "list operations" p31
> Notes: Stable: the relative order of the equivalent elements is preserved. ...
0899デフォルトの名無しさん
2008/12/25(木) 15:16:14C++のクラスの初期化についてです。
メンバー変数を増やしたり減らしたりしていると、ついつい増やした際にコンストラクタでの初期化を書くのを忘れてしまうことがあります。
もちろん「メンバー変数を増やしたら、コンストラクタに初期化処理を書け」を守ろうとはしているのですが、たまに忘れ、Releaseビルドだとうまく動かない!ってことが起きます。
この手のヒューマンエラーを無くす方法で、何か良いものはないでしょうか。
例えば「クラスのメンバー変数が全て0で初期化されていることを保証するコンパイルオプション」とか、そういう類のものがあれば・・・と思うのですが
0900デフォルトの名無しさん
2008/12/25(木) 15:30:25コンパイルオプションを例に挙げながら
コンパイラが何なのかは書かないんだな
0901デフォルトの名無しさん
2008/12/25(木) 15:50:19protectedにでもしておけばいいんじゃね
かなり不毛だけど
0902デフォルトの名無しさん
2008/12/25(木) 16:17:290903デフォルトの名無しさん
2008/12/25(木) 17:03:41gccならこんなオプションがあるよ。って答え方すりゃいいんじゃね?
まー初心者くさいからVC2008だと思うが
0904デフォルトの名無しさん
2008/12/25(木) 17:56:20クラスAAAのメンバ関数の引数にクラスBBBのインスタンスがあって
クラスBBBはメンバ変数としてクラスAAAのインスタンスを持っているとき
class AAA
{
void test(BBB inst);
};
class BBB
{
AAA mem;
};
というコードにすると、最初のクラスAAAの部分で、まだクラスBBBが定義されてないためにエラーがでて、
順番を逆にすると、今度は逆にAAAが定義されていないと、同様のエラーが出ます
こういう場合、どうすればよいでしょうか?
0905デフォルトの名無しさん
2008/12/25(木) 17:57:54って先頭におけば
0906デフォルトの名無しさん
2008/12/25(木) 18:55:11今回のケースでは必要ないかもしれないがインターフェイスを使った設計を知っておいた方がいい。
http://www.geocities.jp/ky_webid/cpp/language/010.html
0907デフォルトの名無しさん
2008/12/25(木) 20:02:14気持ちは分からんでもないが、知らないと理解できないルールは実用上良くないだろ
0908デフォルトの名無しさん
2008/12/25(木) 20:29:530909デフォルトの名無しさん
2008/12/25(木) 20:40:13virtualというキーワードでは直感的に意味が分からないから、よろしくない
0910デフォルトの名無しさん
2008/12/25(木) 20:45:020911デフォルトの名無しさん
2008/12/25(木) 20:46:09aの実体(具体的にはvtbl)を見るまでわからない
だから仮想
0912デフォルトの名無しさん
2008/12/25(木) 21:11:370913デフォルトの名無しさん
2008/12/25(木) 21:18:40virtual = (表面的には違うけど)実質上の、事実上のっていう意味だから。
てか、virtual = 仮想って誤訳だよな。まぁ定着しちゃったから別にいいけど
0914デフォルトの名無しさん
2008/12/25(木) 21:20:35訳語を一種類しか見ない馬鹿?
0915デフォルトの名無しさん
2008/12/25(木) 21:25:33は?煽るんならまずお前の解釈とか意見を書けよ
前提抜きで考えれば、仮想関数は意味的におかしいだろ。
別にvirtual=仮想と訳すのが世の中全部で間違ってるとは言ってねえよ
0916デフォルトの名無しさん
2008/12/25(木) 21:27:45polymorphicだって多態だの多相だのとわけわからん訳しかないから
結局「ポリモーフィック」で通ってるんだし
0917デフォルトの名無しさん
2008/12/25(木) 21:33:08Xのように見える/振舞うもの」じゃないの。
C++では「インタフェースの一致」に主眼を置いてvirtualといっているんだと
思うが、virtualという言葉は「偽」「〜もどき」「バッタもん」という
イメージがとても強いので、イメージ的に混乱が生じる
仮想派生とかになるともっと意味わからん
0918デフォルトの名無しさん
2008/12/25(木) 21:52:23もしくは indirect とか
0919デフォルトの名無しさん
2008/12/25(木) 22:11:340920デフォルトの名無しさん
2008/12/26(金) 00:31:000921デフォルトの名無しさん
2008/12/26(金) 00:53:510922デフォルトの名無しさん
2008/12/26(金) 10:58:03> virtualという言葉は「偽」「〜もどき」「バッタもん」という
> イメージがとても強いので、
そのへんのニュアンスは、マスコミのゲーム批判とかネット批判で
強化されてきた感が、個人的にはある。
0923デフォルトの名無しさん
2008/12/26(金) 13:07:49その意味ではvirtual関数はインターフェースとしての性質をよくあらわしている。
バーチャルリアリティは目標としては「現実と区別できない」だが実装された技術はそこまででもない、みたいな。
0924デフォルトの名無しさん
2008/12/26(金) 13:44:07class IB{...};
class A : public IA{
private:
IB* pB_;// Bにアクセスするために使う(デストラクタでdelete pB_;とするわけではない)
};
class B : public IB{
private:
IA* pA_;// Aにアクセスするために使う(デストラクタでdelete pA_;とするわけではない)
};
newされたAとBの寿命管理は別のクラスがするとします。
メンバ変数として保持された参照(pA_またはpB_)が生きているか死んでいるかを検知するにはどういう方法がいいのでしょう?
考えたのは
・ハンドルを使う(boost::weak_ptrなど)
・デストラクタで相手に死んだことを伝える(pB_->NoticeDeleted(this)など)
・メンバ変数で参照を保持するのをやめて、参照が必要なときに寿命管理クラスに問い合わせて参照を取得する
ケースバイケースな気はするのですが、この中で絶対にやめたほうがいいとか、これにするべきというのはありますか?
また、他にも方法があったらお願いします。
0925デフォルトの名無しさん
2008/12/26(金) 13:54:240926デフォルトの名無しさん
2008/12/26(金) 13:57:27そのコードを「参照を保持する」と呼ぶのは止めて欲しい。
0927デフォルトの名無しさん
2008/12/26(金) 14:11:46> newされたAとBの寿命管理は別のクラスがするとします。
これはAの寿命管理はBでなくC、Bの寿命管理はAではなくCという意味です。
わかりにくくてすみません。
>>926
すみません、型名&で宣言される参照と紛らわしいですね。
そのままポインタと呼ぶべきでした。
0928デフォルトの名無しさん
2008/12/26(金) 14:21:020929デフォルトの名無しさん
2008/12/26(金) 14:23:17相互参照が発生してる時点で失敗してるということですか?
0930デフォルトの名無しさん
2008/12/26(金) 15:16:570931デフォルトの名無しさん
2008/12/26(金) 15:55:46AとBはお互い同じ「偉さ」(主従関係にない)なんでしょ?
実質Cが親みたいなもんじゃない。
CはAやBがいつ死んだのか知ってるわけだから、安全でしょ。
(Aから「Bのポインタが欲しい」って言われた時、Bが死んでいたらNULLを返すとか)
0932デフォルトの名無しさん
2008/12/26(金) 16:41:12Cがどういった形でAとBを管理してるのかわからんが
俺だったらCにshared_ptrでAとBを保持させて
AからB、BからAへのアクセスはweak_ptr使うかな
0933デフォルトの名無しさん
2008/12/26(金) 16:49:08なんとなく構造が変だよな 依存しあってる code smell
0934デフォルトの名無しさん
2008/12/26(金) 16:51:30STGで、敵は主人公の位置が知りたいので主人公へのポインタを持つ。
主人公も敵の位置を知りたい(オートロックオンとかそういう機能があったので)ので敵へのポインタを持つ。
って設計になったとき、これはおかしいぞって思った。
確かにお互いがお互いの情報を欲しいから、参照を持つと楽そうなのはわかる。
でもなぁ。
というわけで、主人公は「敵達を管理するクラス」から敵の位置を取得するようにしたし、
敵は「ゲーム全体を司るクラス」から主人公の位置を取得するようにした。
0935デフォルトの名無しさん
2008/12/26(金) 16:57:15敵を管理する cpp 全てを再コンパイルするはめに…と
気づいたら、何を更新しても全てを再コンパイルする羽目になった
0936デフォルトの名無しさん
2008/12/26(金) 17:02:340937デフォルトの名無しさん
2008/12/26(金) 17:03:56良いではないか、良いではないか。
0938デフォルトの名無しさん
2008/12/26(金) 17:19:470939デフォルトの名無しさん
2008/12/26(金) 17:37:30でもインターフェースが増えるとやっぱり再コンパイルとなるわけでw
0940デフォルトの名無しさん
2008/12/26(金) 17:43:22アドバイスありがとうございます。
>>924に書いた方法のうち1番目か3番目がいいようですね。
0941デフォルトの名無しさん
2008/12/26(金) 19:12:19ポインタの保持はグローバル変数と並ぶ大罪
引数で渡すのが王道
0942デフォルトの名無しさん
2008/12/26(金) 22:33:28いまだにc++でゴリゴリ書いてんの?
0943デフォルトの名無しさん
2008/12/26(金) 22:41:070944デフォルトの名無しさん
2008/12/26(金) 22:42:250945デフォルトの名無しさん
2008/12/26(金) 23:11:16ふいたwww
0946デフォルトの名無しさん
2008/12/26(金) 23:40:05複数保持だろ?
昔のC言語の本には結構書いてあったな
ゲーム作ってるとDirectXのデバイスのロストで大抵痛い目見るんだ
0947デフォルトの名無しさん
2008/12/26(金) 23:43:09そのインスタンスのポインタをどっかのクラスがもっちゃ駄目だよね
そのインスタンスを破棄した情報をどっかのクラスは知らないわけだし
どうしたってバグる
そういう構造にそもそもしちゃ駄目
引数使え引数
0948デフォルトの名無しさん
2008/12/26(金) 23:43:570949デフォルトの名無しさん
2008/12/26(金) 23:45:30そう簡単に置き換えられないこともあるでしょう。
0950デフォルトの名無しさん
2008/12/27(土) 00:04:28基本的に、最適化しづらいコードってよくないと思うんだ。
0951デフォルトの名無しさん
2008/12/27(土) 00:11:530952デフォルトの名無しさん
2008/12/27(土) 00:14:40それって結局別の処理かかなきゃいけないわけだしいいんじゃないの?
駄目なの?
必要もないのに必要のない値が一括で流れてる構造っていいの?駄目なの?
引数できっちり渡すことこそきちんとしたプログラムじゃない?
それとも実装の手間惜しんでバグ増やすほど作業時間切迫してるの?
0953デフォルトの名無しさん
2008/12/27(土) 00:30:39{
public:
void foo(C& c);
void bar(C& c);
// foo() と bar() には必ず同じインスタンスを渡してください!!
};
こんなコメント書くぐらいなら T の中に C& c を持ったほうがいいこともあるでしょ。
0954デフォルトの名無しさん
2008/12/27(土) 00:32:09ないって
よしんばあったら設計がまずい
0955デフォルトの名無しさん
2008/12/27(土) 00:33:010956デフォルトの名無しさん
2008/12/27(土) 00:44:21if(pC)chinko.setC(pC);
chinko.foo();
unkounko();←実はこのときにpCシボンヌ
chinko.bar();←そうとは知らないchinkoがpC使おうと必死の形相で実行
なんて見た目問題おきないようなコードでやられたら一生バグがみつからん
っていうかチェックが甘すぎる
このコードはせめてこうなってなきゃ駄目だろ
素人じゃないんだから
if(pC)chinko.setC(pC);
if(pC)chinko.foo(pC);
if(pC)unkounko(pC);
if(pC)chinko.bar(pC);
なら使用してる側からもpCにアクセスしてるってわかるだろ常考(エラー処理もほしいが)
↓これじゃ意味不明じゃん
if(pC)chinko.setC(pC);
chinko.foo();
unkounko();
chinko.bar();
0957デフォルトの名無しさん
2008/12/27(土) 01:07:14AとBは一対一対応?
何で多重継承じゃダメなの? 動的に切り替わったりするの?
>956
昔からある所有権の問題だな。
素直にスマートポインタ使うのがベター。
0958デフォルトの名無しさん
2008/12/27(土) 01:09:08そうかぁ?
スマートポインタって落ちないだけじゃね?
俺は引数を使ってうまく組むべきだと思うけどね
0959デフォルトの名無しさん
2008/12/27(土) 01:09:29自分ならせめてこうする。
class T
{
public:
void foo_bar(C& c) {
foo(c);
bar(c);
}
private:
void foo(C& c);
void bar(C& c);
}
0960デフォルトの名無しさん
2008/12/27(土) 01:14:50ポインタの保持の問題をいってるのにおかしなこという
0961957
2008/12/27(土) 01:16:25依存関係を減らすのは重要だけど、本質的に依存するものを切り離すのは本末転倒だからね。
結局のところ、クラス同士がどういう関係で、何を処理するか次第だと思うよ。
0962デフォルトの名無しさん
2008/12/27(土) 01:23:36いや、そんなことねぇよ
やっぱり、こういうポインタを保持しちまうなんてのは
PGの怠慢なんだよ
怠慢するならするでさ
なにかフォローが必要なんだと思うぜ
もちろん他の人間もわからないしさ
人に対してもソースに対してもそういう配慮が必要になるのを忘れちゃいけない
資料作ったりコメント残したりね
そういうのが嫌だったら引数で渡すようにしたほうがいいぜ
引数だって構造体でまとめて変更あってもソース変わらないですよね?
なんて意地悪しないでちゃんと一つ一つチェックして渡すべき
0963957
2008/12/27(土) 01:25:32・引数で渡す
オブジェクトが生きていることを保証する責任は関数を呼び出す側(のプログラマ)が持つ
・スマートポインタのメンバとして保持
オブジェクトが生きていることを保証するのはスマートポインタ。
ただし、循環参照など別の問題が発生するかどうかを管理する責任はスマートポインタを
扱う部分全体(のプログラマ)が持つ
といった感じかね。
0964デフォルトの名無しさん
2008/12/27(土) 01:27:26最適化されますようにって気を使って技巧的に書いたソースからできたバイナリよりも
深く考えず自然な形で書いたソースからできたバイナリのほうが最適化されていることがある罠。
0965957
2008/12/27(土) 01:30:24だから内容次第だってば。
例えばイテレータとかはポインタをメンバとして持たないと何にもできないぜ?
0966デフォルトの名無しさん
2008/12/27(土) 01:36:02ごめん
C++のそういう機能全般使ったことないわ
俺、C+クラスぐらいの機能でもう10年ぐれーそれで通ってきてる
これまで言語は規制をかけることで発展してきたけど
C++のテンプレート類はなんか便利な機能群な感じがして
これまでの言語の進歩とは違うっていうか勘違い系が入ってる気がするんだよね
毎回、何がいいの?その程度の機能って感じがする
0967957
2008/12/27(土) 01:43:49ベターCとして使うんだったら別に構わないけど。
もちろん、純粋関数だけを使用して宣言的にプログラムすることもある程度可能だけど、
全部それでやろうとすると大変な部分が出て来るからね。
0968デフォルトの名無しさん
2008/12/27(土) 01:52:42あんまり便利にならなくね?
むしろ、問題ばっかりおきる
あれだけ汚いコードかかせてやってくれること可変配列だけっていらないだろ
0969デフォルトの名無しさん
2008/12/27(土) 01:55:27ちょっと例外起きただけでメモリリークするようなプログラム組んでんじゃねーだろうな。
0970デフォルトの名無しさん
2008/12/27(土) 01:59:14でもmallocラップした関数のがいい機能あるんだよね・・・orz
0971デフォルトの名無しさん
2008/12/27(土) 02:03:050972デフォルトの名無しさん
2008/12/27(土) 02:03:56だったら間違いなく例外脆弱なコードになってるな
「俺は例外なんか使わないから関係ないぜ!」とか言わないように
関係なくないから
0973デフォルトの名無しさん
2008/12/27(土) 02:08:37引数通すから必要ないよ
お前が想定してる自体のほとんどの可能性からいって潰れてるから
必要ないんだろうな
0974デフォルトの名無しさん
2008/12/27(土) 02:08:560975デフォルトの名無しさん
2008/12/27(土) 02:09:43騙るならまず日本語を勉強してからにしてくれ。
0976デフォルトの名無しさん
2008/12/27(土) 02:15:33引数で渡してるならほとんど問題おきないな
引数で渡すって怠慢をするから他の多くのものが必要になってる感はたしかにある
0977デフォルトの名無しさん
2008/12/27(土) 02:16:18○引数で渡さないでポインタを保持する
0978デフォルトの名無しさん
2008/12/27(土) 02:19:39それだから例外安全だって言ってるの?
ダメだこいつ早く何とかしないと
0979デフォルトの名無しさん
2008/12/27(土) 02:23:28...
bar(px);
...
}
int main(){
foo((X*)malloc_wrapper(sizeof(X)));
delete X;
}
引数で渡すってこういうこと?
0980デフォルトの名無しさん
2008/12/27(土) 02:28:11どういう場合を考慮して駄目って言ってるの?
>>979
インスタンス1つに付き変数1つみたいな感じだ
なんではじめのmallocで確保したときは変数もってもいいぜ
でもそれ以外は駄目
引数で渡すってのはそれであってる
0981デフォルトの名無しさん
2008/12/27(土) 02:49:44絶対投げない関数しか使わないから
0982デフォルトの名無しさん
2008/12/27(土) 02:57:320983デフォルトの名無しさん
2008/12/27(土) 03:36:18そんな最強クラスに強い例外安全性だけでコード書くとか俺には無理すぎる。
0984デフォルトの名無しさん
2008/12/27(土) 03:52:25例外使えないとなんか駄目なんだw
そんなにあの機能役に立つとは思えないけどなー
コードスタイルひっくり返すほど重要なんだw
あんまり応用効かない技術に頼ってんのな
0985デフォルトの名無しさん
2008/12/27(土) 03:55:160986デフォルトの名無しさん
2008/12/27(土) 06:05:13だって便利とかの以前にC++の他の人が書いたライブラリはほぼ全滅。
標準ライブラリもboostも諦めるしかない。
newもnothrowとかplacement newとかしか使えないじゃん。
ついでにoperator hoge(=,+,etc)系は、
本質的に例外使えないとエラーを表現できないから使えない
同じくコンストラクタもエラーの通知方法は例外だから使えない
operator =とコンストラクタが使えないって事は結局ただのPODと殆ど同じ。
エラーの発生しない事が保障できるなら上の構文も使えるけど、
そんなのはPODに毛が生えたようなしょぼいデータ構造だけだろうし役には立たなさそう。
POD相当のクラスしか使えないC++って何に使えるの?
本当にCよりはマシってぐらいしか使い道なさそう。
個人的にはC++では例外は空気のように存在してて、それが無い世界が割と想像できん。
0987デフォルトの名無しさん
2008/12/27(土) 06:41:420988デフォルトの名無しさん
2008/12/27(土) 07:10:12突然、どうしたんだ?
0989デフォルトの名無しさん
2008/12/27(土) 08:39:31だから全部使ってねぇって
C+クラスしか使ってねぇっていってんじゃん
0990デフォルトの名無しさん
2008/12/27(土) 08:43:22未だに20年近く前の技術にしがみつくということなのですね、判ります。
0991デフォルトの名無しさん
2008/12/27(土) 08:47:02仮に使うと何がどうよくなんの?
って機能ばっかりだけどな
クラスにしてもあんまりご利益ないんだよね
0992デフォルトの名無しさん
2008/12/27(土) 08:54:070993デフォルトの名無しさん
2008/12/27(土) 09:28:12大人しくCを使っておけばいいと思うよ。
COBOL専業のソフトハウスだってあるご時世だ、C専業もあるだろさ。
つーか、>992に同意。
0994デフォルトの名無しさん
2008/12/27(土) 09:59:51ならそもそも、954も言っているが、953のような有り得ない状況を元に話をするなよ。
0995デフォルトの名無しさん
2008/12/27(土) 10:09:48みんなそうだけど
全然説明できないよね
テンプレートまわりの利点ってさ
作り手のオナニー以上の効果は絶対にない
0996デフォルトの名無しさん
2008/12/27(土) 10:19:34#define swap(type, x, y) do {type t = (x); (x) = (y); (y) = t;} while (0);
CのqsortよりC++のsort関数テンプレートのほうが見た目が自然でしかも速いとか。
0997デフォルトの名無しさん
2008/12/27(土) 10:21:06枝葉末節だな
0998デフォルトの名無しさん
2008/12/27(土) 10:22:40もうホントなんもねぇだろw
0999デフォルトの名無しさん
2008/12/27(土) 10:24:521000デフォルトの名無しさん
2008/12/27(土) 10:25:3210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。