1 :
v(^・^)v :
2010/11/06(土) 02:03:15
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
テンプレ、こんなもんかと。後は好きにして。
>>2 ■基本■ C++ FAQ Lite が Lite じゃなくなった。
>>4 ■Books■に amazon.co.jp の C++ カテゴリを追加。
禿のページ、しばらく前から www2 にリダイレクトされるんだけど、
www が無効になったわけじゃないんみたいなんでそのままに。
>>7 やっぱりそれ要るの?
もう当時のことがわかる人もあんまり居ないから要らないかと思ってるんだけど。
>>8 ありがとう。覚えてたら足しとくよ。次は別の人が建てることになる
かもしれないけどね。
早速質問で申し訳ないです。
親クラスからのメンバ関数からだったら子クラスのメンバ変数にアクセス出来るのに
子クラスのメンバ関数から親クラスのメンバ変数にアクセス出来ないのは何故なんでしょうか。
親クラスでprotected宣言した変数は子クラスからはアクセスできるかと思ったんですがなかなか上手くいきません。
エスパーの方宜しくお願いします。
'Basic::value' はアクセスできない(関数 Application::Change(Basic &) )
http://codepad.org/et7uxwjs
>>10 protecteed で許されるアクセスは this を通してのみ。
そんなわけで、よく見る「派生クラスからアクセスできる」という説明は不十分。
おとなしく private/public で済ませるのがおすすめ。ほんとうに protected が
使いたいとしても、メンバ変数直はやめとけ。
>>9 >やっぱりそれ要るの?
いや単なる地鎮祭w
不要だと思うけど面白いじゃんw
>>10 こういうことじゃね?
自分の親のすねはかじれるが
他人の親のすねはかじれない
ただし、友達にたかることはできる
>>10 11.5 Protected member access [class.protected]
1 When a friend or a member function of a derived class references a protected nonstatic member function or
protected nonstatic data member of a base class, an access check applies in addition to those described earlier
in clause 11.102) Except when forming a pointer to member (5.3.1), the access must be through a
pointer to, reference to, or object of the derived class itself (or any class derived from that class) (5.2.5). If
the access is to form a pointer to member, the nested-name-specifier shall name the derived class (or any
class derived from that class).
要するに基底クラスBasicから派生したクラスが複数存在したとすると、他のクラスから基底クラスの
protectedメンバをいじれる事になってしまい、隠蔽が破られる
そのため特別ルールを設け、この場合はApplicationのポインタもしくはリファレンスもしくはオブジェクト
を介してしかいじれなく制限されている
この場合はvoid Application::Change(Basic& other)のようにApplicationではなくBasicを引数に
取るためエラーになる
早い話が void Application::Change(Application& other) { other.value = value; } これなら問題ないわけだ
>>15 other.value がアクセスできないっていう話だよ
17 :
16 :2010/11/06(土) 02:55:14
>>15 悪い。 other が Application なら大丈夫だな。
なお、
>>14 には (or any class derived from that class) とあるので、
Applicationから派生したクラスのポインタもしくはリファレンスもしくはオブジェクト
を通してもアクセス出来るが、この場合どのようにクラス階層を重ねればいいのか
俺にはわからん
先行宣言しようとするとエラーになるし
単にApplication2がApplicationからpublic派生したとすると、Application2を 通してアクセス出来るという意味ならそうなのかもしれん というかそれしかコンパイル出来ないしな
まだ勉強不足のようでさっきから何度もレスを読み返しているのですが分かったようで分からないようで。。。 取りあえず今はもう一つメンバ関数作ってそこから値を操作するようにしていますがもう少し勉強してから再度読み直してみます。 詳しく解説頂き感謝です。
http://www.gotw.ca/gotw/070.htm > In short, public data is evil (except only for C-style structs).
> Likewise, in short, protected data is evil (this time with no exceptions).
この記事がもう 10 年も前のものなのにな。
なんでこう、 private をさしおいて protected を使う初心者が後を絶たないのか。
Applicationのポインタもしくはリファレンスもしくはオブジェクト を介してしかいじれなく制限されている とあるのですがApplicationのポインタやリファレンスだと親クラスのBasicを引数に取れないのでBasicのメンバ変数を操作しようがないように思うのですがどうなんでしょうか。 続けて質問で申し訳ないです。 void Application::Change(Application& other) { other.value = value; }
もうこうしとけよ class Basic { friend class Application ; protected: int value; public: void Change(Basic& other); };
>>24 そうします。
回答ありがとうございました。
>>23 http://codepad.org/XGP83bqD こういうのがコンパイル通ったらまずいでしょ?
ApplicationクラスとApplication2クラスは全く別のクラスなのに
Application2クラスのメンバ関数ChangeからApplicationクラス
のprotected変数をいじれるとprotectedの意味が無意味になって
しまう
もしApplicationクラスのメンバ関数がBasicクラスのproteced
メンバ変数をいじりたいのなら、基底クラスBasicに元々protected
をいじるようなアクセサを付けておくしかない
でもそうすると外部からもprotected変数を自由にいじれるようになって
しまい、意味がない
というわけでApplicationクラスはBasicのprotectedメンバ変数をいじる
には自分自身の中でやるしかないわけだ
>>24 そやね
手持ちの詳説C++にもfriendクラスとして派生クラスを宣言する事を推奨している
>>24-25 ,27
基底クラスが派生クラスのことを知っている上に friend とか、
protected を使うためにどんだけ犠牲にする気だ。
おとなしく private/public で組めよ。
お前の話はいつも役にたたないなぁ
protected は中途半端。 方針としては中途半端。 「見えちゃ嫌だけどちょっとは見えたほうが」 そんなの微妙すぎ。
でも確かに今回のケースは初心者には「なぜ?どうしてー?」と思うようなワナだよな
#define protected public これでいいだろ
メルセンヌツイスタを使って0〜(n-1)までの均等な乱数を作りたいんですが これで問題ないですか? INT value; do {value=genrand_int31()%n;} while(value>=0x0fffffff-value%n);
>>34 レスサンクス
どうやって直せばいいか分からないので聞いてきます。
なんでループがいるの?
iostreamを利用して、Messagebox関数をラップしようと思っているのですが Messageboxのタイトルとか、ボタンのスタイルなどは、マニュピレーターにして変更できるようにしたほうが良いのでしょうか? 例) msgbox << _T("こんにちは、世界!") << mb_title(_T("テストだよ〜ん")) << mb_style(MB_OK) << std::endl; こんな感じで利用できるように
そんなきもいことしなくても 普通に関数でいいやん
いつ見ても無理してるようにしか見えない
iostreamって無理矢理オペレータのオーバーロードを使ってみましたって感じだよな
41 :
デフォルトの名無しさん :2010/11/07(日) 09:41:54
禿が可変個数引数を否定するにあたって代案を作る必要がでてきて用意した答え
「iostreamを利用して、Messagebox関数をラップ」がそもそも おかしいと思うのは俺だけか
可変個引数に、実際に何個の引数が渡されたのかを知る仕組みが加われば それだけでよかったのに
~int(); これってどういう意味ですか。
intクラスのデストラクタ
>>43 個数だけじゃダメだろ。型情報がないと非PODが渡されたときに困る。
というか可変長引数は型安全性がダメすぎる
~はXORか じゃあ~double() とかはどうなるんだろう
試せよ
XORではなくてNEG、そしてdoubleへの~演算子の適用は出来ない
template<class T> struct Foo { Foo(){ T* p; p->~T(); } }; Foo<int> f; はコンパイル通るのに struct Foo { Foo(){ int* p; p->~int(); } }; Foo f; こっちはコンパイル通りません。 何故ですか。VC2010です。
52 :
デフォルトの名無しさん :2010/11/07(日) 13:51:36
>>50 ネゲート命令のことならそれは単項マイナス
ハードでいうアサートの反対じゃねえぜ
NEG ではなく NOT な
>>51 だから~int()はデストラクタじゃないから
>>51 intもplacement newできるのに、~int()が通らないってなんだろね。
>>53 >>51 はテンプレートパラメータならintを通せるのはなぜ?って言ってるんじゃないか?
56 :
デフォルトの名無しさん :2010/11/07(日) 14:12:59
>>38 いちいち、wsprintfとか使って出力を整形するのに疲れた
msgbox << _T("変数xの値:") << x << std::endl;
これで済むなら、この方が楽で良いと思うの
58 :
デフォルトの名無しさん :2010/11/07(日) 14:57:12
いつも関数定義考えるときに思うんだけど、 void foo(bar* param) { param->method();
59 :
58 :2010/11/07(日) 15:00:03
ごめんごめん途中で送っちゃった。 void foo(bar* param) { param->method(); xxx(param); } bar obj; foo(&obj); と、 void foo(bar& param) { param.method(); xxx(¶m); } bar obj; foo(obj); と、結局どっちも同じだけどどっちにすべきか悩む。 なにかこう明確な仕切りとかどうしてる?
グーグル先生によると参照の引数は必ずconstをつけるんだとさ
typedef boost::array<char, ???> char_array<???>; char_array<100> a; char_array<333> b; char_array<555> c; のように使いたいのですが、うまいtypedefの仕方ありますか?
>>57 俺なら
MessageBox("変数xの値:%d", x);
とできるようにするけどそれじゃダメなんか
>>59 ポインタだとnullが渡される可能性が生じるのでは
一回テストすれば気付くだろう
>>62 それだと、変数の型に縛られるのがいまいちだなぁと思うの
ではboost::formatを参考にしてみるとか
>>66 いや、boost::formatを参考にして作るぐらいなら、boost::formatがそのまま利用できるようにした方がいいのでは?
好きに作ればいいと思うけど オレはCStringで充分だな
ostream& operator << (ostream& s, const myclass& x); myclass obj; cout << obj; msgbox << obj; 試したこと無いけど こうすれば汎用性が高くなるかな?
>>67 boost::formatはstringが返されるんだからc_strすればMessageBoxに直接渡せるだろ。
>>70 そんなこと言ったら、stringstreamだってstr()でstringが返るんだから、c_str()でMessageBoxに直接渡せるじゃん
で、そんな野暮ったいことをするぐらいなら、ストリーム化したほうが格好良いじゃんってなって、以下ループじゃないの?
汎用性のないクラスは自己満足じゃないか
int* p = new int( 0, 1, 2, 3, 4, 5, 6 ); int型のコンストラクタにいくらでも引数渡せるのは何故ですか
VisualStudio2010です。
76 :
デフォルトの名無しさん :2010/11/07(日) 21:46:02
確かにエラーメッセージが異様だな 通らんが
まぁ、結局 p = new int(6); ってやってるのと一緒なんだけどな
コンストラクタ呼び出しは関数呼び出しと同じ形式だから、カンマ演算子じゃないだろ
うむう・・・MSDNを必死で検索してみたけど
>>73 みたいな例は見つからないなあ
多分VC独自の拡張だと思うけど、本来のC++の文法から逸脱している
>>79 VC10で試したけど、VCの拡張ですって警告も出ないな。
>>78 残念なことに
>>77 のいうとおりカンマ演算子の動作をしてるっぽい。バグじゃないのか?
こうなら問題ないのにな
int* p = new int(( 0, 1, 2, 3, 4, 5, 6 ));
構文解析の時に)に一番近い6しか選択されないようになってるだけでしょ int* p1 = new int( 0, 1, 2, 3, 4, 5, 6 ); 0042D679 push 4 0042D67B call operator new (42C07Ch) 0042D680 add esp,4 0042D683 mov dword ptr [ebp-5Ch],eax 0042D686 cmp dword ptr [ebp-5Ch],0 0042D68A je main+2Dh (42D69Dh) 0042D68C mov eax,dword ptr [ebp-5Ch] 0042D68F mov dword ptr [eax],6 0042D695 mov ecx,dword ptr [ebp-5Ch] 0042D698 mov dword ptr [ebp-60h],ecx 0042D69B jmp main+34h (42D6A4h) 0042D69D mov dword ptr [ebp-60h],0 0042D6A4 mov edx,dword ptr [ebp-60h] 0042D6A7 mov dword ptr [p1],edx int* p2 = new int( 6 ); 0042D6AA push 4 0042D6AC call operator new (42C07Ch) 0042D6B1 add esp,4 0042D6B4 mov dword ptr [ebp-58h],eax 0042D6B7 cmp dword ptr [ebp-58h],0 0042D6BB je main+5Eh (42D6CEh) 0042D6BD mov eax,dword ptr [ebp-58h] 0042D6C0 mov dword ptr [eax],6 0042D6C6 mov ecx,dword ptr [ebp-58h] 0042D6C9 mov dword ptr [ebp-60h],ecx 0042D6CC jmp main+65h (42D6D5h) 0042D6CE mov dword ptr [ebp-60h],0 0042D6D5 mov edx,dword ptr [ebp-60h] 0042D6D8 mov dword ptr [p2],edx
>>81 >構文解析の時に)に一番近い6しか選択されないようになってるだけでしょ
それはバグじゃね?普通にクラスだとそんな動作しないぞ
VC2008EEでも問題なし
バグだな こういう致命的なバグを持っているとBoostで通らない場合が出て来たりして 都合が悪い MSに報告しとくか
まて規格を見るのが先だ、いやそれよりも腹がへった飯が先だ
バグ報告して規格通りだったら恥ずかしいw
intのときだけカンマ演算子になるのが規格どおりだとしたら、それによる何らかのメリットがあるはずだ なんだ?
だけ、じゃない
>>86 gccよりVSが規格に近かったって聞いた試しがないけど・・・
C++/CLIの規格なんじゃないの?
いやC++で通っちまうんだよコンパイルが
new-initializerからprimary-expressionまで辿ったけどカンマは出てこないな 間違いでいいんじゃないか
自分がnewで作られたクラスだとして、自分の関数内で、自分をdeleteしたらどのようになりますか? 例えば以下クラス内関数 void A::DeleteMe(){ delete this; func1(int &a);←aを弄る処理(クラス内関数、引数は外部のもの) func2();←自分のクラス内の変数を弄る処理(クラス内関数) func3();←外部の関数 } 疑問点1、delete this以降の関数は実行されるのか、そもそもこれは問題ないのか 疑問点2、デストラクタはどこで呼び出されるのか 疑問点3、func1,2,3のどれが駄目な処理で、どれが問題無い処理なのか
>>93 自分をdeleteするのは構わないが
その時点で開放されてるので
以後仮想メンバ関数や非staticメンバ変数へのアクセスはしていけない
1,2,3は全部ダメな可能性があるし大丈夫かもしれない
95 :
デフォルトの名無しさん :2010/11/08(月) 07:54:32
クラス内関数ってのが引っかかるな static もクラス内ではあるわけで 外部の関数ってのは ::func3(); と書けばコメントは必要ない
>>93 delete this の後にある、 this に対する非 static メンバアクセスは
メンバ関数呼び出しも含めてすべて未定義動作になる。
>>94-95 ありがとう、自分をdeleteするのは問題ないけれど、delete後はstaticで宣言されていない
自分の変数,関数に触るのはいけないのね。
delete thisなんて他人に強要される以外に書く機会なんてあるの?
他人に強要されるってどんなときだよw 「delete thisを書け!さもなくば人質を殺す!」 って言われた場合とか??
delete this;を書け。でなければクビだ。
(delete this;を)書くなら早くしろ、でなければ帰れ!
delete this;を書かなければ民がどうなっても知らんぞ 民のためぇ…これは民のためなんだからぁ〜ん…カタカタ
MFC使うと強制的に書く羽目になった気がする
STLのvectorをXcodeで使用したいのですがエラーが出ます... 解決法ってありますか?
105 :
sage :2010/11/08(月) 16:22:01
教えてください *.cppのファイルをコンパイルしたときに 「致命的エラー F1003 c:\Borland\Bcc55\include\stdcomp.h 5: error 指令: Must use C+ + for STDCOMP.H *** 1 errors in Compile *** new_dog.cpp:」 上記のようなエラーが出たのですが、なぜでしょうか?
拡張子が本当に.cppになってるか確認しる ピリオドが2個ついてたり全角小文字になってたりしないか? ちゃんと合ってるなら後はコンパイルオプションで -P を付けるとか
コンパイルオプション-Pをつけたら コンパイルが通りました!ありがとうございました 致命的エラー F1003 ←このエラーって.cファイルのときに出るもんだと 思っていたんですが、.cppファイルでも出るとは思いませんでした。 new_dog.cpp ファイル名は正しいはずなんですが・・・
実はnew_dog.cpp.txtになってるというオチ
フォルダの拡張子も表示する表示形式でやってますが、 .txtになってなかったです。一瞬ヒヤっとしました。
実はUnicodeで反転されていると ppc.god_wen
111 :
デフォルトの名無しさん :2010/11/08(月) 17:40:39
kakikomi.txtを改竄したくなるレス
C#しかろくに使ったことがないのですが、 C++にはC#のプロパティに近い機能かそれを再現するライブラリはありますでしょうか?
キーボードから整数を入力させ、 1からその整数までの和を出させるプログラムを書きたいのですが うまく動きません #include <stdio.h> int main(void) { int i, x=0; printf("please input positive nunber\n"); scanf("%d", &x); for(i=1; i<=x; i++){ x += i; printf("x = %d", x); } } どこかおかしい点があれば指摘してくれませんか?
scanfは悪魔にとりつかれておる 悪いことは言わん。素人のみでそれを使うのはやめなされ…
scanfは悪魔にとりつかれておる 悪いことは言わん。素人のみでそれを使うのはやめなされ…
for(i=1; i<=x; i++){ printf("x = %d", i); }
>>117 #include <stdio.h>
int main()
{
int i, n, x;
printf("please input positive nunber\n");
scanf("%d", &x);
n = 0;
for(i=1; i<=x; i++){
n += i;
printf("x = %d", n);
}
return 0;
}
>>117 xをせっかく0で初期化してんのにscanfでxに値代入してるじゃん。
>>122 できれば値はxとiのみで書きたいのですが
どこを直せばいいでしょうか?
>>116 ありがとうございます。
コンパイラ依存は面倒ですね・・・
クラス外部から書き換え不可(読み取り専用)なメンバってのも指定出来ませんか
>>124 できれば全文書いていただけるとありがたいです
int型の変数2つだけじゃ無理だな
>>126 for文は何ヶ所もねえだろ
ちったぁ自分で考えろ
iとxのみ #include <stdio.h> int main() { int i, x; printf("please input positive nunber\n"); scanf("%d", &i); for( x=0 ; i>0 ; i--){ x+=i; } printf("x = %d", x); return 0; }
>>130 きれいにまとまってるな
どうしてfor文のiに--がつくんだろう
変数iに入力した値をデクリメントで0になるまでxに足していくだけ
環境依存すれってどこいっちゃったんだ・・・
xml関係の処理をするために、sax関係のクラスを継承しています gccが使っていない変数(パラーメータ)があるよと警告してきますが、 どのようにすれば黙らせることができるのでしょうか?
man gcc
137 :
質問です :2010/11/08(月) 23:17:49
アクセッサ(プロパティ)のGetの方について質問です。 普通なら下のように実装するのでしようが、 int GetValue() const { return m_nValue; } このメソッドの中でエラーが発生する場合、 以下のように引数で得たポインタに値を代入し、戻り値でエラーコードを返すのがいいのか、 bool GetValue(int& pValue) const { *pValue = m_nValue; return true; } 以下のようにexceptionで実装した方が好ましいのか、 int GetValue() const { if (!m_nValue) throw "ぬるぽ"; return m_nValue; } どれがいいのでしょうか。
pair<bool, value>を返すとか
139 :
>>137 :2010/11/08(月) 23:26:48
ミスってた…
× bool GetValue(int& pValue) const
○ bool GetValue(int* pValue) const // まぁint&の方がいいのでしょうけど
>>138 なるほどその手もありますね。
エラーが出るようなものはgetterにしない
検索、追加とか
というかgetterとか関係なくね? 例外かエラーコードかどっちなの?ってだけでしょ
>引数で得たポインタに値を代入し おいおいどこがポインタだよ
エラーが出るような処理をするならその処理の名前を付けて 他の関数でのエラー通知法とあわせるって話じゃないの
質問です。 class p { double x; double y; double z; ...(略) } std::vector<p> a,b a,bにはそれぞれ50000くらいの要素が入る この状態でaの中のとある要素(Xa,Ya,Za)に bの中で最も近い点(Xb,Yb,Zb)を算出するってのをやります。 で、そのときのaに対応するbの要素が何処に格納されてるかを知りたいので クラスpの中に対応するbの要素のアドレスを保管する変数を定義したいのですが、 うまい方法無いでしょうか?
p* nearest;
>>145 単純に以下の形ではだめなの?
class p {
double x; double y; double z;
p *nearest;
};
std::vector<p> b上の添え字を覚えておくだけでもいいなら p* の代わりに size_t にでもすればいい。
そもそもpの中に覚えておくとするとb側の各要素もその情報をもつことになるけど無駄じゃない?
b上の各要素も最も近いa上の要素を記憶するというなら無駄ではないけど。
a側のみ最も近い相手を覚える必要があるなら、pのメンバではなく、
別の配列として std::vector<p*> や std::vector<size_t>で覚えておくことも出来る。
リロードしてなかったorz
>>134 2-3週間ぐらい前に落ちてそれっきり。
>>146-147 ありがとう。p*をclassのなかに追加することにしました。
bにもp*を持つことになるけど、bは次のcについて最も近い点(Xc,YcZc)の情報を保持
するのに使うので無駄にはならないかなぁと。
3行3列の行列の積を求めるプログラムを書きたいのですが 実行してもうまくいきません どこがおかしいのか指摘してくれませんか? #include <stdio.h> int main (void) { int i,j,k; int a[3][3] = { {1, 2, 3}, {1, 2, 3}, {1, 2, 3} }; int b[3][3] = { {1, 2, 3}, {1, 2, 3}, {1, 2, 3} }; int c[3][3]; for(i=0;i<3;i++){ for(j=0;j<3;j++){ for(k=0;k<3;k++){ c[i][j] = c[i][j] + a[i][k] * b[k][j]; } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ for(k=0;k<3;k++){ printf(" %3d", c[i][j]); } printf("\n"); } return 0; } } }
c の初期値がない
釣りじゃないか?
まずベクトルクラスを作るんだ
そして次にPCの電源を切ります
物でベクトル作ってみろや!!
using namespace std;があまり良くないってホントですか?
>>157 うっかり min や max をつぶしてしまったことがありました。
>>157 stdはものすごい広いので、把握できないほど大量の物が定義されており
うっかり被って怒られることがあるのでやめたほうがいい
特にグローバル領域でやるのは
個人レベルで作るくらいならたいした問題じゃないと思うけど たとえばboostライブラリを使ってて、stdとboostで同じ名前のクラスが定義されてたりするとコンパイル通らない using std::cout; とかするといいよ
スペースを" "意外で表す方法ありませんか? " "はVB6っぽくてすごく気持ち悪いです
#define SPACE " "
' '
std::space
javaでは機能ごとにパッケージに分割することが多いと思います。 C++ではあまりディレクトリに分割しないんですか?
お好きなように
データが失われない暗黙的な型変換(boolからintへ、intからdoubleへ)ってコンパイラに警告出させられます? g++かVC++を想定しています
ツリー構造の後順走査って再帰使わないでループで書けますか?
書けるけど スタックをスタックにとるかヒープにとるかの違いに意味があるのか
ループで書けるしスタックも要らない
ツリーの作り方によるんでないの
初歩的なことですが確認のためお聞きしたい 例えば int* a,b; としたとき、これは int *a;//aはポインタ int b;//bは実体 こういう解釈になるらしい?
yes
>>175 ご返答感謝
ということは全部ポインタにしたい場合
int *a,*b;
ですね
>>176 int* a;
int* b;
でおねがいします。
(int *) p, q;
質問です! C++の開発現場に回されることになりそうなんですが、 OSがAIXということで、気をつけなくてはいけないところがありますか? 今まではUNIXやsolarisでmakefileを使ってコンパイルしてました。
何を開発するかが最大の問題であって、環境は大して変わらんと思うよ。 IBMのコンパイラのマニュアルでも斜め読みしておけば?
>>179 話の流れでそれがふと思い浮かんだけどできなかった
そのためのtypedefか
s-jisコードをユニコードに変換する方法教えてください。
>>183 環境依存スレが立ったようなのでそっちで聞いた方が良い
>>181 ネットにAIXのマニュアルが転がってたので見てみることにします
マニュアルの癖に読みづらいな〜w
stringクラスを使うには#include <string>になるけど これはC言語のstrcpy()やstrcmp()と同じヘッダーファイル なんだろうか。
違う
cstring
非情に重いヘッダをインクルードしてるので pimplで翻訳単位を分割してコンパイルを早くしたい だけど実行効率も無視できない部分なのでnew/deleteを削りたい こんな時はどうすればいいですか?
>>189 pimplとnew/deleteが競合する理由がわからない
//hpp class foo { double strage[ENEOUGN_LENGTH]; public: foo(void); }; //cpp foo::foo(void) { static_assert(align_of<foo>::value & (align_of<impl>::value - 1) == 0); static_assert(sizeof(impl) <= sizeof(strage)); new (strage) impl(); }
placement new のオーバーヘッドは0だろ。気にするな。 ENEOUGN_LENGTHがサイズを無駄にする可能性があるけど、重いヘッダーに対してnew(普通の)のコストは誤差レベルが多いだろうからshared_ptrでpimplれば十分だと思う。
mutableを使う時に注意すべき事を教えてください
関数の戻り値にconstを付けると、どのような意味があるのですか?
桶屋が儲かる
template< class T, class S > class Foo { T< S > v; }; Foo< std::vector, int > foo; これ出来ないんですが解決する方法教えてください
ありがとう
>>194 意味は普通の const と同じ
特徴は次のようなのがある
・メンバー変数を変更される恐れがない
・ (a + b).hoge() といった使い方ができない
>>193 mutableを使うとconstメンバーだと思ったら、状態が変わっていたということになる。だから、状態が変わったことがクラスの外からは無関係な場合に使用する。たとえばキャッシュとか。
マルチスレッドでは、constメンバー関数は再入可能な実装が多いが、mutableがあるとconstメンバー関数も再入不可になる可能性がある。再入可能にするためにはmutex等でmutexメンバーを保護する必要がある。
201 :
194 :2010/11/14(日) 17:07:47
>>199 それじゃ、std::string func() const;と何が違うのですか
後ろにconstついてる場合は意味が違う その関数を呼び出してもメンバ変数が書き換わらないことを意味する
203 :
194 :2010/11/14(日) 17:42:56
>>202 なるほど、だからT getXXX()はconst関数なんですね
thx
関数の戻り値にconstを付けると、どのような意味があるのですか? → メンバー変数を変更される恐れがない それじゃ、std::string func() const;と何が違うのですか → その関数を呼び出してもメンバ変数が書き換わらないことを意味する ???
>>204 >>199 の・メンバー変数を変更される恐れがない は
const hoge& getHoge()const{return m_hoge;}
のことを言ってると思われ
constつけないと戻りの参照でメンバーを変更できるでしょ
関数の戻り値にconstを付けると、どのような意味があるのですか? → 返り値が変更される恐れがない ex) if(func() = 1){}っていうミス防止 std::string func() const;は? → その関数を呼び出してもメンバ変数が書き換わらないことを意味する の間違いじゃねえのか
よく分かってない人に対する解説として説明不足ではあるなw
そうであるなw
const T& U::get() const; 前のconstは戻り値がconstになる 後のconstはUの全メンバ変数がconstになる
211 :
デフォルトの名無しさん :2010/11/14(日) 18:59:47
まぁ、禿って一所懸命に考えてるけど。 結局、矛盾を取り繕うための対処策なんだよな
#undef HAGE
>>211 そうそう。
奥が深いんだと勘違いしているだけだろう。
いや引き返せなくなっちゃっているからその仕事は大事なんだけどさ。
黙れ小僧!お前に禿が救えるか?
#if !defined HAIR #define HAIR TEXT("ふさふさ") #endif
>>214 C++を助ければいいのか頭髪を助ければいいのか。
助けるんじゃなくて投げ捨てるべき
JavaやC#みたいなインターフェイスが欲しくてたまらないお… 安全性にも気遣って欲しいお…
じゃあC#でやれよ
>>220 それじゃあC++が進歩せんだろ。
lambda取り入れたぐらいだし、
もうどんどん他の言語の良いとこ取り込んだ方がいいと思うぜ。
Boost InterfaceのC++0x版でも夢想しとけ。
C#をネイティブコンパイル出来るようにする。 or .NETのexeからネイティブexeを生成する。
>>222 サンクス
オナってくる
やはりC++は豊穣やな
C++ に @interface はなぜ存在しないんだろう 特に矛盾なく実装できそうなんだが… private なメンバ関数を増やすだけなんてインターフェイスを変えずに実装を変えてるだけなのに、 その都度ヘッダを見てるソース全コンパイルなんてどう考えてもおかしいだろう 何のためのインターフェイス分離だ pimpl 使うのはいいけどコピーコンストラクタとか書くの面倒だし、 なによりコンパイル速度を上げるためだけに、実行速度を犠牲にしてまで構造を変えるってのが気持ち悪い でも実装されないってことは何か理由があるんだと思うんだが 実際に何があるの?
privateメンバーの代わりに匿名空間の関数を使ったり今のままでもなんとかなるから余計なキーワード追加してまで機能を追加したくない
>>225 純粋仮想関数だけ宣言したクラスで、何か不満か?
コストが不満
>>226 でもC#使ってると、如実にその力を感じるわよ。
IListとかIDisposableとか、何のインターフェイスがあるかで機能がすぐ分かるし、
それに何より安心感がある。
ドキュメント見ながら修正〜みたいな事も減るし、良い事づくめの様に思えるが?
今までのままでなんとかなるっつーても、それはそうだけど、
オブジェクト指向の精神から言うと絶対に入れるべき機能に思えるんだぜ。
開発者が楽するためにってのもすごく重要だし。
仮想関数ぐらいでコストとか死んでしまえばいいよ
いちいち継承しないといかんのがだるいからどうにかしてくれ。自前Vtableは遅いしやんなっちゃう
テンプレートでダックタイピングできるじゃない。しかも実行時のコストはゼロ。
相談室だから聞いちゃうけどさ、 C++でダックタイピングってどうなの? あれは動的言語じゃなきゃ出来ないかと思ってたんだけど…。 確かにテンプレートを知った時は、 「うはwwwwこれでダックタイピング出来るじゃんwww」 って思ったけど、C++って一応静的言語だよね…? 実行時型判断とかやってるの? 初心者の質問ごめんなさい。でも誰か答えてたもれ。
>>234 呼び出しに適合する関数が無ければコンパイルエラーになるだけのこと。
C++に必要なのは機能の追加より制限だろ 生ポインタはunsafeコンテキスト外で使用禁止とかさ
機能追加も制限も、安易にやってしまうとライブラリ開発者が死んでしまうだろうな
>>235 それはそうなんだけど、その静的動作がダックタイピングって言えるのかなっていう疑問です。
ダック"タイピング"だから、打ち込む時の扱いでダックタイピングだと決めていいのかな…?
>>236 それC#…ってツッコミを待っているのか貴様ッ!
C#はVS2010でやっとポインタインデックスに対する加算からアドレスを求めるメソッドが実装されましたよヤレヤレ…
危険な機能でもC系列の末裔なんだからさっさと欲しかったです…
>>238 .NETでポインタ演算したいならC++/CLI使おうよ
ゴミだろ…
ポインタの制約(+α)で、標準オプションレベルでは、 C的キャストにおいてC++キャストに置き換え可能なときはエラー とかしても良かったと思う。 下請けがCキャスト使いすぎだってばよ!
置き換え不可能なCスタイルキャストってあるか?
せめて警告は出してほしいよね。
KdTreeをC++で構築したい。 何となく木構造の構築する手順は解ったんだけど、 実際に最近傍探索をどうやるのかが解らない。詳しい人居ますかね?
>>238 じゃあなんか適当に西洋人に受けそうな名前をつければいいよ。
「チャイニーズダックタイピング」とかなんとか。
危険な処理に片っ端から警告出すコンパイラがあってもいいはずだ どうせならコンパイルエラー吐いてくれれば最高だ ウチで採用する
>>246 >>248 いや単純に疑問でさ…ごめんよ。そういうトリヴィアルな所が気になっちゃうんだ。
251 :
デフォルトの名無しさん :2010/11/15(月) 01:40:19
諸先輩方に質問がございます。 「決定版 はじめてのC++ 初版」を読みながらXP sp3 / VC++2008 EE sp1 で Windowsプログラムを作成しております。 わたくしはプログラミング歴2日ほどの初心者です。 動的変数の配列への適用(p.405)についての質問です。 TCHAR型の動的配列の書き方についてです。 Windowsの変数型であるTCHAR型変数への記載が当然ながら書いてありません。 またchar型変数のことも記載がないのでとまどっております。 TCHAR *str1 ; str1 = new TCHAR[ 256 ] ; … delete [] str1 ; という記述は正しく機能するでしょうか? なぜネットで散見いたします char *str1 = new char[ 256 ] ; のような書き方をしないかについて申しあげます。 LPCTSTR lpcszMes1 = TEXT( "hogehoge" ) ; LPCTSTR lpcszMes2 = TEXT( "mesomeso" ) ; LPTSTR lpszUnited ; があるときに void MessageUnited( TCHAR *unit , LPCTSTR mes1 , LPCTSTR mes2 ) { // ここでmes1とmes2のそれぞれの文字数を合計した数値sumを計測して // unit = new TCHAR[sum+1] ; } といった関数で合体処理して、新しい文字列変数unitのポインタをlpszUnitedで参照して、活用した後、deleteしたいのです。 私の頭は大丈夫でしょうか。
>>238 非ダックタイピングてのはduckはwalkとquackのメソッドを持つと予め宣言する必要があるものをいう。
C++ではコンセプトだな。流れたが。
>>251 TCHARってのは
ユニコード環境でもマルチバイト環境でも使えるようにっていうWindows定義の型
VSならプロジェクトの構成プロパティに
文字セットをどちらにするかの設定がある
Unicode文字セットを使用するなら
typedef wchar_t TCHAR;
マルチバイト文字セットなら
typedef char TCHAR;
となる
同様に、LPTSTRも文字セットの違いによって
wchar_t*型かchar*型の違いがでる
なのでTCHARにしとかないと
どちらかの環境ではエラーがでることになるのでたぶん正しいんじゃない?
全コード見たわけじゃないからなんともいえないけど
>>251 とりあえず書かれた内容にあからさまな間違いは見当たらないから大丈夫じゃね?
やってみるといいよ。
ただし std::vector か std::string の使用を強くお勧めするよ。
TCHARなんて忘れたほうがいいよ Win95/98/Meなんて誰も使ってないんだから
>>251 前半はいいけど
> void MessageUnited( TCHAR *unit , LPCTSTR mes1 , LPCTSTR mes2 )
> {
> // ここでmes1とmes2のそれぞれの文字数を合計した数値sumを計測して
> // unit = new TCHAR[sum+1] ;
> }
> といった関数で合体処理して、新しい文字列変数unitのポインタをlpszUnitedで参照して、活用した後、deleteしたいのです。
この関数は正しく機能しないと思います
unit は MessageUnited のローカル変数なのでただ代入しても呼び出し元に影響しません
呼び出し元の変数を書き換えるには参照を使って
void MessageUnited( TCHAR *&unit , LPCTSTR mes1 , LPCTSTR mes2 )
のようにするか、二重ポインタを使って
void MessageUnited( TCHAR **unit , LPCTSTR mes1 , LPCTSTR mes2 )
とします
257 :
デフォルトの名無しさん :2010/11/15(月) 01:55:01
>>253 >>254 大変心強いお言葉をいただきありがとうございます。
とりあえずやってみてダメなところが見つかったら
試行錯誤してみます。
それにstd::vector、とstd::stringでやりたいことが出来そうであることがわかりました。
重ねてありがとうございます。
LPTSTR UniteMessages(LPCTSTR msg1, LPCTSTR msg2) void UniteMessages(LPTSTR&united, LPCTSTR msg1, LPCTSTR msg2) でしょ
259 :
デフォルトの名無しさん :2010/11/15(月) 02:02:41
>>256 ご指摘ありがとうございます。
void MessageUnited( TCHAR *&unit , LPCTSTR mes1 , LPCTSTR mes2 )
とするときには
呼び出し側で
MessageUnited( &lpszUnited , lpcszMes1 , lpcszMes2 ) ;
とすれば正しく文字列参照ができる、というかんじでしょうか。
そのときでも
TCHAR* lpszUnited ;
としているときには
delete [] lpszUnited ;
でメモリ解放は完了するということであってますでしょうか。
ポインタがこんがらがってきました。
>>255 ところがどっこい
stringってwstringと分かれてるよね
Win32APIスレか環境依存スレでやったほうがいいんじゃね? それとどこのスレで質問するにしても最低限MSDNで検索してからにしろよ TCHARの説明もあるし、TCHAR用の文字列結合関数もあるぞ っつかTCHAR使ってるのに触りも説明しないなんて本あるのか? 今までオレが購入したWindowsのAPIを扱う本ではそんなの一冊もなかったが
今はもう wchar_t 一本でいいよ。XPも切り捨てようかって時代に9xなんてさすがにもう眼中にないだろ。
まあいいじゃないか2chなんだし なにかしら事情があるのだろう察してやれリョ
またいつか新しいまともな文字コードに切り替わるときに TCHARに含められるんじゃないか?
×リョ ○よ
なんか質問のポイントが散りすぎ WindowsプログラミングどころかC/C++もロクにわかってなさそう
そらプログラミング歴2日ならそんなもんだろう
もう歴とは呼べまい。w
>>252 レス感謝
その定義だと一応C++もダックタイピング可って事になりますね。
http://en.wikipedia.org/wiki/Duck_typing けどwikipediaによると、やっぱり動的ってのは必須らしい(宗教論争中なのかもだけど)。
けど同時にJava,C++,Dは静的にunreachableやらが検出できる(当然だけど)と書いてて、
定義はともかく、静的にやれた方が便利みたいなニュアンスを感じる。
タイピング時の動作で言うならテンプレートもダックタイピングなのに、
動的じゃないからダックタイピングじゃないって言われるのはなんか不合理な気もするんだぜ。
動的型検査はダックタイピングの本来的な要素じゃないだろうに。
でもこれよりも流れてほしくないのがインターフェイスについての話についてです。
C++でC++0xにも取り込まれてないのはなんで?
大規模開発可能な言語を自称するんなら必須の機能に思えるのに。
設計と進化にはその理由とか載ってるんでしょうか?
interfaceなんていうありふれた名前を予約語に使えるわけ無いだろ。 まあ大抵の処理系なら[[interface]]あたりでも用意するだろう。
C++/CLIを使ってるのですが char[100] moji = "プログラム中でいろいろ入れる"みたな感じでやってて ボタン->Text = moji のようにしたいのですがString^型がうんたらかんたらと出て変換できません どうやって変換すれば良いのでしょうか?
String^ moji = "なんとかかんとか"; ボタン->Text = moji;
274 :
デフォルトの名無しさん :2010/11/15(月) 07:50:00
>>273 ありがとうございます
String^ out = gcnew String(moji)でやったのですが
自分のはString^ 型のoutを使うのが少なくて、char型のmojiを使うのは多かったのですが(strcpyとかやたらある)
その方法ならchar[100]型使ってたところは全部そのままでいけたのでしょうか?
・予約語を増やしたくない ・現状で十分機能する代替案がある よって追加する必要なし
277 :
デフォルトの名無しさん :2010/11/15(月) 11:05:02
タダでゲームを作ろう! 〜無料で使えるRPG制作ツール16〜
http://d.hatena.ne.jp/ryoh1212/20090624/1243306857 「ゲームを作ってみたいけど、プログラミングが難しくて……」という人も
いるでしょう。確かにプログラミング言語を使ってゲームを作るには、
画像表示やキー入力などのゲーム以外のことも覚えなければなりません。
そこで今回は、プログラミング言語をマスターしていなくてもゲームを
作れるフリーウェアを紹介します。
WOLF RPGエディター、Queek II、CardWirth、J-RPG CreatorDX、
Like A Quest Hyper、RPG Script System、ERPG、mRPG、
シミュレーションRPGエディター、WWWエディター(仮)、
−R− RPG制作ツール、Rmake、Desigeon、
ロープレジェネレーター、RPG_MT、MEIQAの16種類です。
質問です。 名前つきenumの中身を、後から定義する方法はないでしょうか? enum HogeA{}; enum HogeB{}; void foo(HogeA hoge){} void foo(HogeB hoge){} enum HogeA { MONYO = 0 }; enum HogeB { MOO = 0, PPP, }; こんな感じで、 ・enumの型を使って同名な関数を呼び分けたい ・enumの中身の定義は後回しにしたい のです。 実際上のコードはHogeAは定義済みとしてエラーになってしまいます。
最初の方を宣言のみにしとけばいいだけじゃないのか
>>279 それ、現行の標準には含まれてない。拡張で受け付けるコンパイラもあるけど。
enum fuckってやつか
>>279-281 ありがとうございました。
少なくともVS2010では
extern enum HogeA;
(略)
enum HogeA
{
foo = 0
};
が可能でした。
externとは思いつきませんでしたが、関数とかでは「宣言」できるわけですから、想像してしかるべきでした。
本当にありがとうございました!
オススメのフレームワークありますか?
なんのフレームワークでしょうか
おすすめのつってんだろボケ
おすすめのフレームワークありますよ
野菜を育てるフレームワークです
void classA::funcB(int C) と void classA::funcB(const int& C) の引数ってどうやって使い分けるの? 上はインクリメントができるとかそういうこと?
void func(int m) { //〜 } void func(int const & n) { int m = n; //〜 }; まあこれでほぼ等価と考えていい ただ上のほうが最適化しやすいので上で書いて玄人ぶる人もいる
const後置する人ってなんなの?
>>294 ポインタを const にしたいときは後置しかできないことを知ったうえで統一感を重視する人だよ。
constポインタとの兼ね合いを考えると、後置の方が綺麗だろう
左右から修飾されるより右から修飾されるで統一させたほうが読みやすい
int const * const func() const
C++は、日本人ライターの本は、あまり良書がないな。 ただし、「STLよるコンポーネントデザイン」や「Generic Programming - STLによる汎用プログラミング -」の日本語訳者でもある人で、C++を 専門的に執筆してる人の著書だけは、良書だと思うが。
>>284 ご丁寧にありがとうございます。
こちらも参考にさせていただきますね。
C++0xは色々便利になっていて素敵ですね。はやくVSとかに適用されてくれればなぁ(2010への適用度がかなり低い…)
法則優先させることが読みやすさにつながるとは限らないことが理解できるといいですね(ニコッ
constポインタとの兼ね合いを考えたら前置きの方がいいんじゃないの? 後ろ置きだと意味が変わるような
@const int *const *const *const p; Aint const *const *const *const p; どう考えてもAの方が統一性がある。
for(int i=0;i<size;++i){ if(array[i]==0) goto label1; } return false; label1: /*...*/ っていう処理を書いたんですけど、gotoなしで書き直すにはどうしたらいいでしょうか?
for(int i=0;array[i];++i) if(i>=size)return false; /*...*/
306 :
304 :2010/11/16(火) 16:31:52
>if(i>=size-1)return false; じゃね?
307 :
304 :2010/11/16(火) 16:33:57
ともかくありがとうございます
循環参照してるクラス(例えばオブザーバーやメディエーター)の相互参照性を弱めるためにグローバル変数やそれをラップしたインスタンス管理クラス(オブジェクトのマッピング+アクセサ関数)を作るってありだと思いますか?
>>308 設計は違うスレで聞いたほうがいいと思う。。。
ここは、C++の初級者が多いな。
ここにいる時点でお前も
312 :
デフォルトの名無しさん :2010/11/17(水) 00:45:07
>>306 自分は305じゃないけど、
>>304 でいうと、i は+1 でインクリメントしているので sizeと等しいときにループから抜けることになる。
だから if(i==size) 。
で要求は i が size と等しいか大きい場合にループの終了なので if(i>=size) 。
もしくは if(i>size-1) 。
>>306 の if(i>=size-1) を
>>304 に直すと、for(int i=0;i<size-1;++i) になっちまうぜお。
gaslighting
317 :
デフォルトの名無しさん :2010/11/17(水) 23:49:26
あの、今までVC++2008EEを使ってたのですが この前VisualStudio2010プロの何ヶ月かのお試し版を入れて、期限が切れて、消したのですが 何かの拍子にVisualStudio系のファイルを開いたら、今までは2010で開かれて、「期限が切れてます、アップグレードしてください」 みたいな画面が出て、VC++2008EEで開いてくれません。 プログラムのアンインストールの所にはもう無いのですが完全に消せてないのでしょうか?どうすれば良いですか?
VC++2008EEの使用期限すぎたからVC++2010EE にしてねってこと
ええっ!?
スマン誤爆
321 :
デフォルトの名無しさん :2010/11/18(木) 00:04:17
>>318 マジ?
2008EEって無期限じゃないんですか?
んな訳ねェ
visualstudioぐらいかえよ
登録済みEEに使用期限なんてねーし どうにかして関連付け直せばいいだけだろ
Proはアンインストール済みなのに何から何に関連づけ直すんだ?
この開発環境は…アンインストール出来ない!
327 :
デフォルトの名無しさん :2010/11/18(木) 01:33:47
しかもなんか2010 x86 redistribuableとかいうのもアンインストールできないんですよね
エクスプローラでダブルクリックして開かないだけなのか? 2008EE自体が使えなくなったのか? 開発者ならもう少しまともに喋れ
なんかアホっぽいからおまえらに任せるよ
330 :
デフォルトの名無しさん :2010/11/18(木) 01:58:45
2008EEは使える 関連付けだろ。わかったよ
このスレはバカばっかりですね。
vectorやhash_mapにCComPtr<T>をぶち込んだら、メモリー使用量がみるみるうちに上がっていった clear()を呼び出しても減らないし、どうすればいいの? std::vector<CComPtr<ColorDrawingEffect>> ColorEffects; //省略 //ColorDrawingEffectはIUknownを継承している ColorDrawingEffect* effect = new ColorDrawingEffect(color,backcolor); ColorEffects.push_back(effect); DWRITE_TEXT_RANGE textRange = {1,10}; //pTextLayoutはIDWriteTextLayout pTextLayout_->SetDrawingEffect(effect, textRange); //省略 ColorEffects.clear()
>>332 AddRef、Releaseはちゃんと実装したか?
例の場所はこういう感じ STDMETHODIMP_(unsigned long) ColorDrawingEffect::AddRef() { return InterlockedIncrement(&cRefCount_); } STDMETHODIMP_(unsigned long) ColorDrawingEffect::Release() { unsigned long newCount = InterlockedDecrement(&cRefCount_); if (newCount == 0) { delete this; return 0; } return newCount; }
コピーコンストラクタは? pushで再配置するときに何か残ってるんじゃないの?
cRefCount_を0で初期化してないとか 偽COMなんだしunique_ptrに突っ込んどけば?
何故偽COMなんだと思ったらIUknownだった
STLのソースコード読めないんですか?
読めるよ馬鹿にすんな。
おれだって読めるよ!
343 :
332 :2010/11/19(金) 08:43:21
>>339 使ってみたが、メモリリークが収まらない
使い方が間違ってるのか?
ColorDrawingEffect* effect = new ColorDrawingEffect(color,backcolor);
CAdapt<CComPtr<ColorDrawingEffect>> adapter(effect);
ColorEffects.push_back(adapter);
キャリーフラグをしらべられますか? 調べる関数とかないんですか?
char a=1000; ってやるとa=-24になることって保障されてるんですか?
>>344 調べられるかもしれませんし、調べる関数があるかもしれません。
少なくとも言語仕様には一切含まれていませんので、お使いの環境を当たってください。
>>345 charのディフォルトがたまたまsignedで、たまたま8ビット幅で、負の値が2の補数形式で表されている場合は、
-24になることが期待できますが、お使いの環境によっては必ずしもそうではないかもしれませんし、
きちんとそうなるとマニュアルに書かれているかもしれません。
機種によりキャリーフラグを使い分けとか出来ませんか? キャリーフラグの付いてないパソコンでは普通に計算して 付いているパソコンではそれを使うとかいう簡単な方法を教えてください。
キャリーフラグのないパソコンは一般的にはないと思いますが、 そもそも使い分ける理由が一般的にはないと思われます。
ポインタをビットで考えたとき、必ず使われないビットが あるって本当ですか?
キャリーフラグを調べたいって、多倍長計算をコンパクトにしたいとかか? それならインラインアセンブラを使うべきだろう CPUによってはフラグを調べただけで変化してしまう物もあるんだから
>>351 C++において、ポインタを整数にキャストした結果は実装依存です。従って、ビット云々に意味はありません。
354 :
345 :2010/11/19(金) 13:30:31
class Bar { Baz baz; }; class Foo { Bar bar; }; Foo f1, f2; この時に f1, f1.bar, f1.bar.bazはグローバル変数g1にアクセス可能 f2, f2.bar, f2.barbazはグローバル変数g2にアクセス可能 と言った感じでFooのオブジェクトひとつに対してその下位のオブジェクトならばアクセス可能な共有変数を持たせたいのですが なにかいい実装手段はありますか?
static const double aaaaaa =1.0000; intとenum以外の上みたいな書き方が禁止なのは共通ですか? 共通ではないのなら何が何かおしえてください。
>>355 グローバル変数ならどれからでもアクセス可能だから提示された条件は満たせるな
っていうのはともかく継承とかprotectedとかfirendとか使えばなんかいけんじゃね?
言ってることがよく分からないからどうしたらいいかとかは提案できんが
もちろんだとも
>>353 やっぱりそうでしたか。
GCの本にその使ってないビットを使った実装方法法
があるって書いてあったから気になってた。
ありがとう。
質問者が環境を提示しないのは粗忽なだけかも知らんが、 回答者が環境依存であることを明言しないのはなんぞ?
362 :
339 :2010/11/19(金) 19:55:25
>>343 CAdaptは、STLコンテナから要素独自の&演算子を隠すためのものなので、
コンテナのパラメータで指定する。
std::vector<CAdapt<CComPtr<ColorDrawingEffect>>> ColorEffects;
363 :
339 :2010/11/19(金) 21:02:44
>>343 ごめん、CAdaptは関係ないような気がしてきた。
サンプルコード落としていろいろいじってみたけど、自分の環境ではリークは見つからなかった。
cRefCount_は本当に0で初期化されてるか、(全てのコンストラクタで初期化されているか)
pTextLayout_が参照をつかみっぱなしでないか、(pTextLayout_->SetDrawingEffect をコメントアウトしてみるとか)
そもそもリークしているのか、(正しくRelease()->delete this されていれば問題は他)
このあたりを再確認して問題ないのであれば、コードさらしていただければ検証するよ
leak が問題なんだよね? shrink_to_fit を知らないという話じゃないよね
clear()でも消えないんだから違うんじゃない
配列型を表すテンプレートクラスを作ってみたんですけど問題ありましたら教えてください template<class T> struct Array { T* data; size_t size; template<typename size_t N> Array(T (&array)[N]) { data = array; size = N; } };
何に使うのかさっぱりわからない
車輪の再発明なんだからテンプレートの勉強だろ
参照先が消えたらどうなるんだろー
すこしいじれば使い道はあるだろう begin/endとか追加してラッパー・アダプタ的な使い方をすればいい boost::arrayは内部にストレージを持ってるから、そこで差別化できる
まず、arrayとshared_arrayとscored_arrayのどれを作りたいのかをはっきりさせたほうがいいと思う
クラスの前方参照によるヘッダ依存性除去ってできるだけやったほうがいいの? 循環includeがないときでもヘッダでは #include "hoge.h" #include "fuga.h" Hoge* func(Fuga*); じゃなくて class Hoge; class Fuga; Hoge* func(Fuga*); と書くべきかなぁ?
>>373 実装隠す必要なくて名前がぶつからなくてビルド時間も長くないなら気にしなくてよくね?
Hoge* func(Fuga*); この関数を外部に公開するのなら、その引数と戻り値で使ってるクラスが入ってるヘッダは 普通に公開しないと拙いと思うよ。
>>375 補足
// 以下、Huga.hの中身とする。
Class Fuga; // 前方参照(宣言)
Class Hoge
{
private:
Fuga* m_pFuga; // ←こいつがpublicなメソッドの引数や戻り値で使われていないとする
};
//eof
この場合は前方参照(宣言)で回避しとけば依存が無くなるばかりか、
外部に公開されないので安心だねって感じ。
>>375 を更に補足。
>>375 の場合、funcを使うファイルでfuncのヘッダをインクルードしてやれば、
自動的に公開関数の引数や戻り値で使われてるクラスも扱えるので便利だねって話。
ごめんなバラバラで書いて。
ゲームプログラマになる前に〜、に書いてあったな
classの間違いだったヒャッホイorz=3
>>376 修正 × Huga.h ○ Hoge.h 逝ってくる…
>>374-377 ありがとう
循環includeのあるヘッダだけ
>>377 の言う「不便」な状態になるのが気持ち悪いから
いっそ全部不便に揃えようかとも思ったんだけど・・・やっぱり不便なんだよね
別にコンパイル時間に困ってるわけではないから、分けるのはやめとくことにするよ
むしろ循環includeのあるヘッダだけ
class Hoge;
Hoge func();
include "hoge.h"
とかすることにしちゃうかも
strstreamとstringstreamって何が違うんですか?
>>382 std::strstreamはdeprecated
つまりいつ消えても文句は言えない
それとstd::stringstreamとの違いは、std::strstreamはバッファにchar型の配列を
使うが、std::stringstreamはstd::stringを使用する
std::strstreamはバッファオーバーフローの危険性があったためdeprecatedにされた
384 :
339 :2010/11/21(日) 03:09:11
>>372 コード検証してみた。C++/CLIだったのねw
結論から言うと、コードに問題はほとんどないと思うよ。
確かにリークは発生している。
しかし描画ループでのメモリ使用量増加はリークではなく、一時的なマネージドオブジェクトが増えているだけ。
ほっとけばGCで回収されるので問題ない、はず
試しにForm1_Paint()内でGCを強制実行してみると、
{
for (int i = 0; i < 100; ++i) { // 適当な回数ループ
dwrite.BeginDraw();
...
dwrite.EndDraw();
}
GC.Collect(); // GCを強制実行
}
少なくともループ回数に比例したメモリ使用量増加はなくなる。
C++/CLI側を見ると、
ColorDrawingEffectはリークしていない。std::vector::clear()内で正しくRelease()されている。
CustomTextRendererはリークしている。
InitResource()でCComPtr<>::Attach()しているが、それだと参照カウントが増えず整合性が崩れてしまう。
CComPtrの場合、普通に代入すればおk
pTextRenderer_ = new CustomTextRenderer(...)
Factoryで作られたオブジェクトに関しては特に問題はないと思う。DirectWriteが作成したオブジェクトの追跡方法はよく知らないのでスマン
自分が気がついたのはこのくらい
なんでもCComPtrに突っ込むと循環参照が発生してリークしたりするので、
所有権とか意識して、必要なところだけで使うのが良いと思うよ。
>>384 トンクス
CustomTextRendererがリークしていたのか
386 :
デフォルトの名無しさん :2010/11/22(月) 13:17:33
auto_ptr や shared_ptr に似たものを自分で作るという意味じゃないの
ナルヘソ スマートポインターイディオムが ハンドルボディーイディオムの特殊化だから スマートポインターイディオムと書かないでその一般化である ハンドルボディーイディオムとかいてあるのか・・・・
struct point { double x; double y; } std::vector<point> p; このような形で点群データを扱ってます。 ここから-a < x < a, -b < y < b を満たす点を抜き出したいんですけど、何か良い方法はありますか?
abs(x)<a abs(y)<bって計算する。
bool is_outside(point const & p) { return abs(p.x) > a || abs(p.y) > b; } p.erase(std::remove_if(p.being(), p.end(), is_outside), p.end());
abs() を使う理由が判らん
abs使わんとめっちゃ長くなるやん
組み込み型でもa<x<bってのを一発で記述できると楽なんだがなぁ
395 :
389 :2010/11/23(火) 21:59:54
ありがとうございます。 1つのデータに対して範囲を変えて何回もデータを抜き出したいんですけど、 この場合はremove_copy_if()を使えば、必要なデータだけ取り出せる (=その他のデータを残せる)で良いんですよね?
エスパー検定: 2次元座標の当たり判定のように見えるんだが。 そうなら、それようのアルゴリズムはある。
397 :
389 :2010/11/23(火) 22:24:54
すいません。当たり判定ではないです。 点群データをグリッドマップに変換する作業を行ってて、 その中で点群に対して一番近いグリッドを割り出したいのです。
効率悪いことしてるねー
399 :
389 :2010/11/23(火) 22:41:41
>>398 どうすれば効率よくなりますかね?
とりあえず上から降ってきたプログラムのアルゴリズムをまんま流用してるんですけど
あまりに書き方が酷かったので、せめて綺麗に書いていたのですが・・・。
グリッド幅は普通解ってるでしょ だったらx,yから直接何番目のグリッドにあるかわかるじゃん なら何度も篩いにかけるようなやり方じゃなくて一回の走査で十分でしょ
401 :
389 :2010/11/23(火) 23:28:56
>>400 言われてみれば確かにそうですね。
ありがとうございます。そっちに頑張って書き換えてみます。
質問です。size_tに対するprintfの書式指定は%zuであってますか? GCCだと問題無いのですが、Visual C++だとうまくいかんです。 std::printf("size = %zu\n", sizeof(int));
%dか%u
C99なら合ってる つまりはそういうことだ VC++なら %Iu かな
>>402 z は C99 じゃなかったかな?
現状で移植性を確保したければ unsigned long にキャストして l にしとけばいいと思う。
>>393 めっちゃって倍やんか、abs() のコストと条件式が倍になる事を比較したらどっちが得やねんちゅう話や
せやな
コストww
409 :
402 :2010/11/24(水) 00:10:28
みなさんありがとうございます。%zuはC++ではNGということですね。 GCC/Visual C++での移植性を求めて std::printf("size = %llu\n", (long long unsigned)sizeof(int)); として動いたものの、long longがC++言語仕様には無いんですよね。 ということで↓こうなりました。 std::printf("size = %u\n", (unsigned)sizeof(int));
stringstreamやBoost.Format (%1%系の型を指定しない記法)という手もある。 もっとも、long longがC++に存在しないことを気にかけるほどだから、これも根本的問題解決と言えないかもしれない。
intよりlongにしてしまった方が64ビットWindows以外は正しくなる
@各処理系に詳しくなってプリプロセスで分岐 Aテンプレートでクールに決める方法を考える B決め打ちするけど書き換えが楽になるように一段階間接的な手段をとる 世界中で使われるレベルのライブラリ書くようならまだしも 普通はBで十分だよね
template<typename T1,typename T2,typename T3> T3 testtmpfn(T1 a,T2 b) { return a*b; } int iiii=(int)testtmpfn(15,0); テンプレート 引数を 'T3' に対して減少できませんでした というエラーでコンパイルできません 型の自動推定ぐらいしてくれてもいいと思うのですが、 型をこれのように全部指定しないでコードを書く方法ないのでしょうか
無い
415 :
413 :2010/11/24(水) 19:30:20
>>413 で
testtmpfn<*,*,int>(15,0);
のように型の部分指定するにはどうすればいいのでしょうか
T3を一番前にすりゃいいじゃん
OCamlならこのぐらいの型推論は自動でやってくれるのに C++にもOCamlの機能をとりこんでほしい
>>417 template<typename T1, typename T2>
auto Func(T1 a, T2 b) -> decltype(a * b) { return a * b; }
これでおk
取り込んだ結果だろうに
お前等って何作ってんの?
この世界がどうたら
宇宙用戦闘ロボットのOS
脳ミソの中の記憶をバックアップするシステムを開発してる
悪魔召喚プログラム
0xいいな もう実用しても大丈夫なん?
>>426 まだあかん
何かいろいろゴチャゴチャした議論をしてる
moveとcopy回りで収拾が付いてない
0xは実用に使えないけどboostの中に型の自動推定ないかな boost.anyみたいに遅くなるのじゃなくて
型出しくらい部分特殊化でちゃちゃっと挟み込めばいいだけだろ 不特定大人数に提供する大作クラスライブラリじゃあるまいし
>>427 いつの話をしているんだ。
暗黙のムーブの話なら、すでに決着したぞ。
今度は暗黙のコピーに波及したとかどうとか
2ちゃんねるブラウザを作るために、独自でスレビューを実装したい いい感じのライブラリーない?
独自でやんのかライブラリ使うのかはっきりしろ
IEコンポあたりを乗っけるのが一番
OKwaveブラウザ作ってくれないか ないでしょ
いやまじであると便利なのだが、、、はてなも知恵袋も対応してくれると良いなぁ
>>437 あれ系ってデフォルトだとおしなべて最新の回答が質問の次に来るのがマジでウザい
過程とか回答の順序が大事だろうが!?たまに質問と回答がくっついてて順序が変えられないのもあるし
>>441 C++0xの機能。
vs2010とかg++の新しいのとかに先行実装されてる。
C++0xの機能 gccならとっくに実装されてる。
gccよりvsのほうが実装は進んでる。
autoすげえ これで速度落ちないなら常用する
当然速度落ちないよ
落ちるわけねだろ
無駄に長いテンプレートパラメーターがあるとき以外に使うと分かりにくくなるだけだよ。
boostのfor_eachなんかパッと使うのは楽になるけど 瞬時に要素がどういう型なのか判別する手間が増えるな 逆に小細工なしで比較的手軽に汎用的なマクロを作れたりする
auto様とか、上手に利用すると本当にTemplMPが書きやすくなるんだろうな。 俺は書いたこと無いけどね!
今更な質問で申し訳ないんですが、C++0x ってもう使えるんですか!? まだ規格はできあがってないと思ってたんですが…。 C++0x に合わせ、VS2010 とかが少しずつ規格を取り入れてるってことなんでしょうか。 今取り入れられてる部分はについてはもう変更されることはないと確定しているんでしょうか?
規格も確定してないし、コンパイラの対応も半端、変更されるかもしれない
でもまぁ便利だからね
まあ、規格はほとんど完成してるよ。 まだ変更される箇所もあるけれど、普通のユーザーがきにするようなことじゃない。
456 :
デフォルトの名無しさん :2010/11/27(土) 00:06:30
autoを使うことで変数名に気を使うようになり、 結果的にコードが読みやすくなったな
string内のスペース、タブを全て削除するにはどうするんですか 教えてください
remove_ifを使いましょう
スペース、タブをすべて削除するんだよ
ggrks
>>459 #include <iostream>
#include <string>
#include <algorithm>
struct Remove_cntl {
bool operator()(char s) {
return std::iscntrl(s) || std::isspace(s);
}
};
int main()
{
std::string str = "abcdef \t\aghij";
str.erase(std::remove_if(str.begin(), str.end(), Remove_cntl()), str.end());
std::cout << str << std::endl;
}
VS2010でラムダ式を使ってみた #include <iostream> #include <string> #include <algorithm> #include <cctype> int main() { std::string str = "abcdef \t\aghij"; str.erase(std::remove_if(str.begin(), str.end(), [](char c) { return std::iscntrl(c) || std::isspace(c); }), str.end()); std::cout << str << std::endl; }
>>450 typeof(a*b+c) x= a*b+c;
466 :
457 :2010/11/27(土) 01:41:57
>>463-464 ありがとう。
remove_ifだと消す対象に次要素の移動コピーだけしかしないのに、なんでそんなアドバイス来るんだ
と思ったが、eraseでremove_ifからの戻り値(strの無要素の先頭)からstrの最後までを消すことで
スペース、タブを除去するのか。これ、定石なんだろうね
それなら、eraseとremove_if使え位言わないと低脳の僕は分からん
decltypeでいいじゃん
>>466 std::removeとかstd::remove_ifは削除対象の要素を後ろに集めてその先頭イテレータ
を返すだけで、実際の削除はしないのでeraseが必要になる
削除対象じゃないものを前に集めてその最後のイテレータを返す
スペースとタブ以外の文字をコピーして文字列作った方が 速かったりするのかな
>>470 そういう車輪の再発明を極力やめようというのがSTLの基本思想
remove_copy_ifなりcopy_ifを使えばいいだろ なんで車輪の再発明の話になるのかわからん
過去に再発明を経験してないPGほど使えないやつが多い
車輪を作らずとも自動車が作れる そんな時代になるといいですね
車輪の作り方は知らなくても自動車は作れる でも性能の良い自動車は作れない STLってこんな感じだよね
>>476 listでdistanceを平気でやったりとかね。
>>476 下手なプログラマが作るより性能はいい
しかもC++0xから右辺値参照がSTLに入れられるので速度も上がる
質問よろしいでしょうか。 一時展開バッファとして std::vector<int> を使っているのですが、 やけに速度が遅くボトルネックになっていたため、調べてみました。 [1] for (int i = 0; i < 100000; i++) { int* p = new int[100000]; delete[] p; } [2] for (int i = 0; i < 100000; i++) { std::vector<int> ar; ar.resize(100000); } 下の方が100倍以上の時間がかかります。 先に reserve したり、アロケータを実装して再確保をおこさないようにしても、大きな効果はありませんでした。 どうも、メモリ確保後の初期化に時間がかかっているようです。 これがクラスならコンストラクタを実行する必要があるのは分かるのですが、 今回は int 型で、かつ初期化する必要がありません。 ・必要サイズは予想できないので、サイズを動的に変更する機能は必須 ・解放し忘れを防ぐため、new / delete などを直に使うのは避けたい この2つを満たす何か代わりの手段はないでしょうか? boost は使ってるのでその中でも問題ありません。 よろしくお願いします。
STLは糞
std::vectorをループの外に出せばいいんじゃねーの?
>>479 boost::scoped_arrayでも使ってろよ・・・
その話聞くだけだと単に頭悪いようにしか見えんけど
>>479 a.resize()する前にa.reserve()やっとけばいいじゃん
メモリの再割り当てが最高1回で済む
ただしコンストラクタが走るのを阻止できないけど
484 :
479 :2010/11/27(土) 12:24:17
ありがとうございます。
>>481 実験ではループなのですが、実際は単純なループではありません。
もちろん外部に std::vector を用意するという手はあります。
ただ、実際は関数内で一時バッファを使っているのですが、
内部で一時バッファを使っているということは外部に公開する必要はないのに、
外部から引数で受け取るのも少々気持ちが悪いです。
また、static にしたりグローバルに用意したりすると、マルチスレッド関連がややこしくなります。
>>482 boost::scoped_array だと、固定サイズしか作れなくないですか?
>>483 書いたとおり、ボトルネックになってるのはメモリの確保ではなく、初期化部分です。
reserve を行っても大きくは変わりませんでした。
std::vector<int> ar(100000); for (int i = 0; i < 100000; i++) { ar.clear(); ar.resize(100000); }
>>478 そういう意味じゃないから勉強しなおしてこい
先頭から順番に初期化できるのならば、初期化用のイテレータークラスを書いて渡すとか。
[1]はただ領域確保しただけで触ってないし [2]と動作速度がまるで違うのは当たり前
ていうか、なんで初期化の必要ないのにresizeしてんの? resizeしたら拡張分全部にコンストラクタ走るのは当然じゃん
491 :
479 :2010/11/27(土) 12:32:48
>>490 おっしゃるとおりです。なので、
・初期化せずに
・(あらかじめサイズが分からないので)可変長の
・解放し忘れの起きない
メモリを確保する手段はないでしょうか?という質問です。回りくどくて申し訳ありません。
492 :
479 :2010/11/27(土) 12:34:22
>>488 ちょっと意味がつかめません…。申し訳ないです。
今回は、そもそも初期化を行う必要はありません。
>>479 比べるならこうじゃね?まぁ比べると遅いと思うけど
for (int i = 0; i < 100000; i++) {
std::vector<int> ar(100000);
}
>>491 reserveしろ
resizeは指定サイズに達するまで新しい要素を追加するっていう処理だ
本来の引数はvoid resize( size_type size, TYPE val );だしな
vectorの中身の生配列のサイズを拡張したいだけならreserveだろ
初期化しないならreserveだけでいいんでは
496 :
479 :2010/11/27(土) 12:38:11
>>493 確かにそのとおりでした。
やってみたところ…さらに遅くなってしまいました。原因はわからないです…。
497 :
479 :2010/11/27(土) 12:40:39
>>494-495 reserve では内部で領域を確保するだけで、アクセスできないですよね?
std::vector<int> ar;
ar.reserve(10);
ar[0] = 1;
とすると範囲外エラーとなります。(デバッグ時に例外が飛んできます)
struct foo { __int64 start, end, freq; HANDLE hprocess; DWORD oldclass; foo() : hprocess(GetCurrentProcess()), oldclass(GetPriorityClass(hprocess)) { Sleep(10); SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS); QueryPerformanceFrequency((LARGE_INTEGER*)&freq); QueryPerformanceCounter((LARGE_INTEGER*)&start); } ~foo() { QueryPerformanceCounter((LARGE_INTEGER*)&end); SetPriorityClass(hprocess, oldclass); std::cout << (int)(end - start) << std::endl; } }; int main() { { foo f; for (int i = 0; i < 1000; i++) { int* p = new int[100000]; std::fill_n(p, 100000, 0); delete[] p; } } { foo f; for (int i = 0; i < 1000; i++) { std::vector<int> ar; ar.resize(100000); }}}}
>>498 このようにすると速度が逆転するのがわかると思う
std::vectorのデフォルトコンストラクタは十分高速
もう自前で書けよ…… どういう処理想定してるか分からないから適当にアドバイスしたら、 それじゃ駄目とかどうしようもない
もうmap<int, int>を使えばいいよ
>>496-497 vectorの速度を気にする前の問題じゃね?
ちゃんと最適化かけて計測してる?
バッファのサイズはどの時点で確定するんだよ・・・ 実際の処理を擬似コード化 できてる なら良いけど、そうでないなら無駄すぎ 上に書いてある処理だけなら int MAX = 100000; for (int i = 0; i < 100000; i++) { int* p = new int[MAX]; delete[] p; } でいいじゃん・・・ boost::scoped_arrayで包んでもいいし
> ar[0] = 1; なぜ push_back を使わない
505 :
479 :2010/11/27(土) 12:50:15
>>499 高速なのは分かりますが、そもそも初期化する必要がないので…。
実際にボトルネックになっていて、
>>479 で100倍以上の差が出ています。
>>502 はい、最適化はかけています。
>>496 は reserve するようにという指摘に対するレスです。
>>479 の1でいいなら、boost::scoped_arrayやboost::shared_arrayをつかえばリークはない。
forの外でvectorで取るのが一番速い。
>>479 の2が遅いのは配列の各要素を初期化してるから。1は初期化していないので配列の中身は不定。初期化が必要ならその分遅くなる。
高速で何度も使うなら初期化せずに上書きでよくないか検討してごらん?
バッファなのにintってのも不思議 普通char指定しねえ?
for(・・・){ int * p = 0; unique_ptr<int, DelAry> guard(p = new int[size]); }
509 :
479 :2010/11/27(土) 12:55:50
>>503 少なくともコンパイル時には予測できません。
数100MBの巨大なデータが来ても動作するようにする必要があります。
>>504 バッファを用意するのが目的です。
バッファの使う上で、行うのは追加だけとは限りません。
もちろんランダムアクセスする可能性もあります。
>>506 はい、上書きでも構いません。初期化しているから遅いというのも書いてあるとおりです。
初期化せずにバッファを確保する方法はないかという質問です。
>>508 unique_ptrなら
unique_ptr<int[]>これでいんだぜ
>>509 少なくとも、じゃなくて具体的なことを聞いてるんだよ
関数に入った時点で確定するなら
>>503 でいいだろ?
>>510 へー特殊化されてんのね。じゃ
for(…){ unique_ptr<int[]> p(new int[size]); }
でいいわけか
>>506 初期化しないバッファーが欲しいならboost::scoped_arrayやboost::shared_arrayをつかえばリークはない。
515 :
479 :2010/11/27(土) 13:15:31
長々と申し訳ございません…。 顔から火がでそうです。 >int* p = new int[100000]; これが固定サイズしか作れないものと勘違いしてました…。 恥ずかしい限りです。こんなことに何十レスも頂いて…。 boost::scoped_array 何の問題もありませんでした。 関わって頂いた皆様、本当にありがとうございました。勉強しなおします…。
お前、切腹な
どうにも解決できないため,恥ずかしながら,質問させていただきます.
環境はvc++2008のEEでosはwindows7の64bitのprofessionalです.
作成したいプログラムは,Aのパソコンでマイクから音声情報を取得し,TCPで送信(send)をし,
Bのパソコンで受信(recv)し,再生するというものです.
音声の入出力は以下のサイトを
ttp://pino.jpn.ph/index.php/archives/377.html/ tcpに関しては,以下のサイトを
ttp://onishi-lab.jp/programming/tcp_win.html 参考にし,それぞれは動作を確認しました.
その上で,AのパソコンではwaveInStartの後に,sendを,
Bのパソコンでは,recvの後に,waveOutWriteを行う予定です.
その状況で,ご質問させていただきたいのは,
waveInおよびOut関数らで音声データが入る'LPBYTE' と,
sendやrecvらで送受信される 'const char *'との型変換です.
byte配列をいったんchar配列にし,送受信してからchar配列をbyte配列に戻すイメージなのですが.
その部分を上手くプログラミングできません.
具体的には,sendの第2引数にどのように例のプログラムのbyte配列であるlpWaveDataを書けばよいのか.
recvの第2引数をどのように,byte配列であるlpWaveDataへ戻せばよいのかをお教えいただきたいです.
ご意見をいただきたく存じます.よろしくお願いいたします.
キャストするだけでよくね?
>send(dstSocket, &(lpWaveData), sizeof(char)*10000, 0); ポインタのポインタを指定してどうする &要らんよ(char*)lpWaveDataでいい
>>520 さんへ
ご指摘ありがとうございます.
(char*)lpWaveDataにしたうえで,
クライアント側を書き換えて試してみたいと思います.
なんか、根本的にポインタを判ってないんじゃね? なんでdynamic_castが出てくるのかとてもじゃないが、理解できないよ。
dynamic_castとか使うのなんて、よっぽど特殊な環境つーか、設計ミスつーか 素直にstatic_castしろよ
キャストがあーだこーだの前に、
並のC++使いなら
>>517 の作ろうとしているプログラムなら軽く作れると思うから聞くけど、
>>519 のプログラム構成・手順で音声を途切れなく再生できるの?
低脳の僕はなんか駄目なような気がするんだけど。なんとなくだけどね
LAN内なら大丈夫だと思うよ
まぁ品質向上はまず動いてからだべ
>>522 >>523 ご意見ありがとうございます,
ポインタは,「変数のアドレスを入力する変数」程度の知識で,だましだましプログラムを作成してきました.
googleなどで出てきたキーワードを総当りで試しているという状態です.
もう一点,お聞きしたいと思います.
クライアント側の受信を,以下の
recv(dstSocket, (char *)lpWaveData, sizeof(char)*10000, 0);
にすると.コンパイルは通り,動作するように見えるのですが,
waveOutWrite(hwo,&whdr,whdr.dwBufferLength);
のところで,<不適切なptr>というエラーが生じてしまいます.
この意味について,お教えいただけないでしょうか.
>>527 > ポインタは,「変数のアドレスを入力する変数」
それであってると思うけど。
不適切なptr
>>528 さん,
>>529 さん,
>>530 さん.
ありがとうございます.
エラーの現状ですが,ハンドルされていない例外が発生しました.0xC0000005:場所0x00000000を読み込み中にアクセス違反が発生しました。
上記のウィンドウが表示されます.
プロンプトは,waveOutOpenが表示されてとまっており.
また,waveOutWrite(hwo,&whdr,whdr.dwBufferLength);の行の左端に緑の矢印(停止箇所のしるしだと思っています)が表示されています.
そのため,音声のメモリ領域を読み込もうとしたときに,正しい値が入っていないか,初期化されていないのではないかと考えています.
以下の記述が正しくないために,正しい値が変数に入っていないのではないかと考えております.
recv(dstSocket, (char *)lpWaveData, sizeof(char)*10000, 0);
lpWaveData = static_cast<byte *>(lpWaveData);
またとんでもないことをしているかもしれませんが,ご意見をいただければ幸いです.
>>531 音声のデータは未初期化ならただの雑音にしかならない。データーのせいじゃない。
0x00000000を読み込み中がでてるんだからパラメータのどれかががNULL何だね。
パラメータ値にNULLがないか確認
緑は次に実行される場所だから停止した場所とは違う
>LPBYTE lpWaveData = NULL;
このあとにメモリ確保してないから落ちるに決まってる
>recv(dstSocket, (char *)lpWaveData, sizeof(char)*10000, 0);
>lpWaveData = static_cast<byte *>(lpWaveData);
>>519 と書いてることが違うぞ
recvは第四引数で指定した値まで読み込んでくれるとは限らないからちゃんと戻り値見ろ
>>532 ,
>>533 さんへ
ありがとうございました,動作するようになりました.
dropboxのものを動作したものに差し替えさせていただきました.
恥ずかしいので,すこしたったら消します.
>>皆様へ
このたびは本当にありがとうございました.
はじめて質問したのですが,解決に導いていただき,感謝しております.
それでは失礼いたします.
このたびは本当にありがとうございました.
いえいえ
まあまあ
ポインタのキャストって static_cast reinterpret_cast のどっちを使うの? で、それを使う理由は何
>>537 用途による。ダウンキャストならstatic_castだし(もしくはdynamic_cast)
整数に変換するならreinterpret_castだし
>>538 lpWaveData = static_cast<byte *>(lpWaveData);
はstaticで良いんですか? それとも、reinterpret?
void * → hoge * はstatic_castでおk
稀だけど c style cast でしか出来ないcastもあるお
一番いい具体例を頼む
まともじゃないコードをいじらないといけないことの方が多いわ
つまり
>>545 はまともじゃないコードを書いることのほうが多いということか
仕事だと0からプログラムを書くことはほとんどない デスマプロジェクトから脱走したやつの尻拭いで数万行クラスのスパコードからバグの原因を見つけ出して修正とかな
40秒ほどではなくても、40分でつくらされることもあるからなぁ 時給換算だとうまいけど、もやっとする
脱走しているなら未だいい。当の本人から「動かせ、されど修正は最低限で」と言われることの矛盾と来たら。 リファクタリング仕様ものなら激怒され、警告を回避しようものなら蛇蝎の如く嫌われ、成果は全て吸い上げられる。 ま、そういう奴はC++なぞ書こうともしないから未だ救われているが。
リファクタリング出来ないのは本当にイライラする… その理由がステップ数で単価見積りとか…
>>549 上司に相談しろよ
瞬間的には必要なのかもしれないけど
長い目で見ればいないほうが良い同僚はさっさとつぶしたほうが良い
552 :
549 :2010/11/27(土) 23:58:04
>>551 あーいや、取り引き先だから排除しようがないんだ。ボスがそれだから部下も腐っているんだが、金にはなるんでね。
スレ違いだ。マ板行ってくれ。
スレ→板
class b {}; class d : virtual public b {}; d→bはキャストできても、b→dへのキャストはstaticでもdynamicでもできないのな。
は?
アップキャストって言いたいんだろきっと
static_cast<d*>したければ、仮想継承を止める。 dynamic_cast<d*>したければ、class bに仮想関数を追加する。
すいません、VC2008でmapを使ってるんですが、下記コードでコンパイルは通っても、 exeを起動させるとエラーが出て落ちてしまいます。 mapをmap<string,string>ではなくmap<int,string>にすると問題ないんですが、 調べてもよくわかりませんでした。 どなたかアドバイス頂けると助かります。 ▼-------------hoge.cpp------------------- #include <iostream> #include "stdafx.h" #include <fstream> #include <sstream> #include <cstring> #include <iomanip> #include "hoge.h" void Hoge::Load(const string& file){ m.insert(pair<string, string>("hoge","hoge2")); } ▼-------------hoge.h------------------- #include <string> #include <map> using namespace std; class Hoge { private: map<string,string> m; public: void Load(const string& file); };
・なんでエラーメッセージを書かないの? 馬鹿にしてる? ・なんでコードの断片だけなの? 嫌がらせ?
>>559 確かにそれでだけは分からん。
というより、そのコードを見る限りでは、その部分に特に間違いは見受けられない気がする。
別の部分で落ちてるのでは?
>>560 >>561 すいません、慣れないデバッガで検証してみてるんですが、
m.insert(pair<string, string>("hoge","hoge2"));
の行でブレークポイント設定して、続行して自動変数パネルを見ると
thisの中のmの値が「不適切なptr」となっていました。
firstにはなぜかconst int型の-1163005939という数値が入っていて
secondは[0]〜[14]まで「CXX0030: エラーです: 式を評価できません」というエラー。
なぜかthisの外にthisと並ぶ形でもうひとつmがありましたが、
そっちも同じです。
不思議なことに
m.insert(pair<string, string>("hoge","hoge"));
というように第一引数と第二引数を同じにすると
不適切なptrというエラー?は消えてちゃんとfirstにもsecondにもhogeが入ってます。
まあその場合でもパネルでは赤色のフォントで表示されているのですが。
>>559 とりあえずヘッダで using namespace はやめろ。
>>559 プログラム削って、 main() 走らせるだけで同じエラーの起こる最小コードを作ってみろ。
>>562 > なぜかthisの外にthisと並ぶ形でもうひとつmがありましたが、
!?
何かmapの初期化が上手くいってない気がするので、もう少しソースコードを出してくれ。
変数をフルパスで指定したら治るんじゃねーの。たぶん。
>>559 自動変数が未初期化のまま動くわけねーだろ。mainの中身をtryで囲ってエラーを晒せ。
#include <exception>
int main()
{
try
{
...
}
catch(const exception &ex)
{
cout << ex.what() << endl;
}
}
ソースを全部codepadに貼れ
船頭多くして船山に登る。
ヘッダでusing namespace std;とか
573 :
570 :2010/11/28(日) 22:18:48
main()なしでデバッグだとか、未だおちょくっているようにしか見えんな。
576 :
デフォルトの名無しさん :2010/11/28(日) 22:26:59
>>570 本当にhogeで落ちてるのか? このコードじゃ落ちないだろ。念のため↓をやれ
#include <exception>
void hoge::Load(const string& file){
::AfxMessageBox("insertします");
try {m.insert(pair<string, string>("hoge","hoge2")); }
catch(const exception &ex) { ::AfxMessageBox(ex.what()); }
}
>>574 Windowsで_tWinMainしかなかったか、MFC使ってるんだろ。
>>576 「insertします」
というポップアップが出た後、
自動変数パネルのexの中身を見てみるとやはり「不適切なptr」でした。
thisの中のmを展開しようとすると「このアイテムは1000000個以上の子アイテムが含まれます」という
アラートが出るので展開しませんでした。
出力には
プログラム '[1460] program.exe: ネイティブ' はコード 0 (0x0) で終了しました。
とのこと。
コンパイル時の警告には
cl : コマンド ライン warning D9035 : オプション 'Wp64' の使用は現在推奨されていません。今後のバージョンからは削除されます。
と出ますが多分関係ないですよね。
Releaseで動かしてたりして
>>578 あ、ほんとうだ、Releaseになってますね。
Debugにするとコンパイルすら通らなくなってしまった…。
codepadに上げたのじゃない他の複数のファイルで
「プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか?」
というエラーと
「プリコンパイル済みヘッダーの使用を検索中にスキップされました」
という警告が出ますね…あわわ
>>579 プリコンパイル済みヘッダーを使用しない設定に
だから初心者はLinuxでgccでやれと言ってるだろうが
『コード 0 (0x0) で終了』 落ちてねーぞ。どこが問題なの? どうなるつもりであって、どうなったので問題だと思ったの?
>>582 Releaseモードでコンパイルして出来上がったexeをクリックしたら、
先ほどの"insertします"というポップアップが出た後、exeのGUI?が立ち上がらず、
タスクマネージャーのプロセスでは存在するという幽霊みたいな存在になってます。
すぐに「プロセスツリーの終了」で落とすんですが。
最初の方の段階ではexeを立ち上げたとたんランタイムエラーと出て落ちてました。
質問する前に最小限のコメントアウトとかして、上記の幽霊アプリ状態になった感じです。
よくわからないものを無理して使うからよ
>>584 はじめはVC2003使ってたんですが、VC2008に変更したら、
いつの間にかリンカの追加の依存ファイルがきれいさっぱりなくなってました。
とりあえずwinmm.libだけ追加しておきました。
あ、デバグモードとは設定別みたいですね…。 とりあえずデバグモードの設定も追加の依存ファイル全部追加しました。
とりあえずデバグ開始したんですが、立ち上がったアプリケーションウィンドウを閉じるとエラーが出るようになりました。
> Windows によって program.exe でブレークポイントが発生しました。
> ヒープが壊れていることが原因として考えられます。program.exe または読み込まれた DLL にバグがあります。
詳細は下記です。
http://codepad.org/9FaXjGof
m.insertをコメントアウトしたら正常起動するのかね?
>>590 ああ、前までコメントアウトしたら起動してたのに、
あれこれ触ってる内に起動しなくなってしまいました…。
とりあえず今これ以上やってもここの方達振り回すだけになっちゃいそうなので、
自分でもうちょっと検証してみます。
ありがとうございます。
>>591 insertの中をpairじゃなくてmake_pairにしてみ
hoge.hをインクルードしただけでstdの中の名前が取り込まれたら たまらんだろ刺すぞこの野郎
キチガイに刃物
すぐ上に刺すと騒いでるのがいるのか。紛らわしい奴だな。
キチガイに刃物。
>>589 にusing
597 :
デフォルトの名無しさん :2010/11/29(月) 00:35:51
逃げろ!!アイツらが来る
ここはハッテン場じゃないんですから刺すとか刺さないとかそういう話はやめてください
599 :
594 :2010/11/29(月) 00:54:22
何がキチガイだよ。とあるヘッダに > #pragma pack(push, 1) // 構造体メンバのアライメントを変更 > struct X { > }; ←popなし とか書いてあったら殺したくなるだろう。それと同じ。
>>599 お前は「紛らわしい奴」で「キチガイ」じゃないから安心しろ。
>>599 キチガイのドカタ
キチガイのドカタ
キチガイのドカタ
職場でも、殺す、刺すとか普通に使ってるんだろ
killはよく使うよね
生ポインタかスマートポインタにするか迷ってしまいます 指針とかありますでしょうか
生にする必要性を説明できなければスマートポインタ。
生は避けるに決まっているだろう。
ポインタの選択は状況によって異なる コンテナを選ぶのと同様に特徴を理解して一つ一つのケースで考えるしか無い
ありがとうございました
vectorとlistは明らかに特性が違うけど、生とスマートポインタの比較で 生が適しているってどんな状況ですか
メモリ効率、実行効率がよくて boost禁止プロジェクトへの移植も余裕でできます そしてコンパイル時間がアホほど違います
で、漏れる危険に直面するんですね。
人の頭じゃ管理しきれない複雑な共有関係がなければshared_ptrなんてほとんど害しか無いわ
管理から外れたオブジェクトを使い続けてしまう
そうやってメモリリークが発生するんですよ ここテストに出ますから覚えておきましょうねー
scoped_ptrで事足りる。 shared_ptr使うことあんま無いわ。
リーク予防なんてスマポ以外にもいくらでも手段あるだろwww スマポやめただけでリークするとかよっぽどレベル低い環境で仕事してるんだな
>>616 はい。レベルの低い環境で仕事をしています。
参考までに、リーク防止の方法の例を教えていただけないでしょうか。
>>616 こんなこというやつが実際にやらかすんだよな…
死ねばいいのに…
2重delete防止にNULLチェックを命令されたプロジェクトあった・・・
>>617 デバッガでもアロケーターでもエディタ機能でも他のでも何でもいいよ
>>618 俺は自分の担当でメモリリーク一回もしたことない
622 :
617 :2010/11/29(月) 01:55:00
>>620 デバッガですか。スマートポインタは変数を宣言した時点で開放されることが保証されて
いることが大きなメリットだと思っていました。デバッガだと「デバッグ時に発生しなかった」
ことはわかりますが、プログラムの安全性が保証できるわけではないですよね。
Boost禁止されたら、私なら10行くらいでスマートポインタを書きます。
保証されてないだろ そんな考えならGCでも使っとくべき
>>620 ちゃんとした現場ならメモリーリークが珍しい事象であるのは確かだな
90年代はほとんどCで開発していたけどメモリーリークを見たのは2〜3回だ
設計の問題なんですかね
質を問わないのであれば生ポにすることはない
using std はboostのヘッダーに見た記憶あるぞ
関数のブロックスコープやクラススコープ、グローバル以外の名前空間スコープの中なら、 たとえヘッダだろうが、好きに書けばいい。 ヘッダのグローバル名前空間スコープに書くのが問題なんだ。
boost⊃stdてことじゃねーの? boostシラネーけど
コンソールアプリケーションで画像を出したいんだけど OPEN GLはコーンソール画面に出せないから 常識的に言って画像ファイルか動画ファイルを書き出す風に なると思いますが。 それぞれ何形式がよろしいでしょうか?
>>622 > プログラムの安全性が保証できるわけではないですよね。
頭おかしいのがまた沸いたか。
class Foo { static void boo(){} }; とやればbooはインライン化されますか? class Foo { static inline void boo(){} }; とやらないとだめですか?
inlineは書かなくてもいい
サンクス
>>630 をそろそろお願いします。
機種依存ではなくて一番一般性の高いやつがいいです。
コーンソールで笑ったから教えてあげないッ!
jpgでもpngでも好きにしたまえ
>>630 画像なら、名前の通り移植性のある ppm がいい。最強だ。
ちなみに圧縮とか分からないんで一番簡単で一番一般的なフォーマットのやつにしてください。 動画の形式が一つもでてないのでそちらもお願いします
そんな知能で大丈夫か?
ひらめいたけど、 独自の形式を作ってそれをあとで変換すればいいんだ・・・ 無駄なこと聞いてしまった自分が情けない。
>>642 静止画を高速に連続に表示すれば、動画になるよね
動画するのに必要な分の静止画を作りそれを一つにまとめ
各静止画を1/60sレート位で連続表示すれば良いんじゃないか
motion jpeg?
motion ppmでしょ
ppm画像でもffmpegで普通の動画に変換できるしいいね
647 :
デフォルトの名無しさん :2010/11/29(月) 23:40:50
[OS] Windows Xp 32bit
[開発環境]Visual Stadio 6.0
[やりたい事]コード化のアルゴリズムの実装方法
ttp://www.swetake.com/qr/qr2.htmlの実装をC/C++で行いたいのですが 、
英数字モードでは、2文字ごとに11bitの2進数に変換して、その後8bitに分割とありますが
どうしたらいいのか分かりません。
そもそも11bitなんて単位では扱えないし、それでどうやって8bitごとのデータを作ればいいのか分かりません。
ヒントでも良いので何か助言をお願いします。
boolを配列にして11個ならべれば?
>>647 "AB"
は 45*10+11 で
00111001101 になるのは理解できてるか?
それと最終的に
モード指示子、文字数指示子、データ、終端パターン のビット列を並べて
で9バイトになるってのも理解できてるか?
馬鹿にしないでください。理解してたら質問しません。
つまり馬鹿ということですね?
バカにしないでください自分はバカですって書いてるようにしかみえない
私は「わバ「バカで「でで」私私ババ「カ」
>>647 >そもそも11bitなんて単位では扱えないし
いや、英数字モードを11bitで扱いましょうってそこに書いてあるだろ
00111001101 は11個のbitだろ
表2を見てないのか、理解できてないのか、が問題?
boost::ptr_list<int> list; list.Add(new int(10)); 上記の要素をeraseした時点で 10が入ってた領域はdelete されてますか? list自体使われなくなった時点でまとめてdelete?
>>656 当然
そのためのptr_container
658 :
656 :2010/11/30(火) 09:56:42
ありがとです ちなみにptr_listはaddないからpush_backでした
ptr_container自体、C++が事実上ポインタを通してしかポリフォーリズム 出来ないので(実際は参照でも出来るがほとんど使われない)、コンテナで ポリフォーリズムをするために用意されたと思われる 何せ標準で用意されているコンテナは同じサイズの物しか入れられず、派生 クラスも入れられない そこでポインタをコンテナに入れるわけだが、コンテナを操作して使われなくなった インスタンスはデストラクタを自動的に呼んでくれない(インスタンスが入っていた 場合は呼んでくれるが、ポインタが入っていたら無視される) そこでboost::ptr_vectorが登場したと考えられる
×ptr_vector ○ptr_container
なんでそんな説明したの
えーん
×ポリフォーリズム
○ポリモーフィズム
>>661 他の説明があったらよろしく
誰も聞いてないのに自分の得意分野を空気読まずに延々話し出すオタの典型ですね
まあいいじゃない書きたいこと書けば
というか常識を(キリッとか言われても
uint32_t hash(char const * p); これプログラム中に1文字列につき1回しか呼ばれないから どうにかしてコンパイル中に解決して元の文字列をexeから消滅させたいんだけど そういうことってC++だけで出来る?
>>666 C++0xならできそうだけど普通のC++では難しそう
いや、ボーストについてまったく知らない俺にはすごくためになったよ。
>>666 結果を吐くC++プログラムを書けば良い。
必然的に、二段コンパイルになるだろうけどな。
>>659 ためになった
>C++が事実上ポインタを通してしかポリフォーリズム
>出来ないので(実際は参照でも出来るがほとんど使われない)
事実上ポインタを通してしか、出来ない理由は理由は何?
(参照でも出来るのに、ほとんど使われない理由は何?)
参照でコンテナって作れたっけ?
参照のplacement newができないから無理じゃん?
>>670 参照でポリモルフィズムを行うためにはインスタンスを明示して
それの仮想関数を呼び出す必要がある
つまりハードコーディングになるのであまり利用価値がない
というか出番が少ない
参照でポリモーフィズムって関数が参照を返してそれの仮想関数を 呼び出すシチュエーションが多いな
>>673 インスタンスを明示ってなに?
参照でもポインタと使い方変わんないよ?
>>673 インスタンスを明示した場合は例え仮想関数の呼び出しでも直接コールに
コンパイルされるよ
スピードが命のC++だからね
一瞬ん?ってなったけど、ポリモーフィズムの話とコンテナの話は別なのか 紛らわしい・・・ 参照でポリモーフィズム使う場面って、引数くらいだよね確かに
参照で多態使わないとかどこの素人だよ
CでもC++でもいいんだけどfpos_tより大きいファイルって扱う方法ないの?
>>680 OSを独自にいじるライブラリに頼るしかない
処理系依存・環境依存
環境依存だけど手っ取り早く扱いやすくだとmmapとか
683 :
デフォルトの名無しさん :2010/11/30(火) 22:05:28
UTF-8に対応した文字列クラスってありますか? std::string str("あいうえお"); std::cout << str.length() << std::endl; // 5になって欲しい std::cout << str.substr(0, 1) << std::endl; // "あ"が出力されて欲しい というような使い方ができるやつが希望です。 出来れば、EUCやS-JISなども対応してるとなお嬉しい。
ランダムアクセスできないってだけで標準でも2G以上も扱えるよね
685 :
304 :2010/11/30(火) 22:39:14
2bitの値(というか、1bitの値をふたつ)を返したい場合、 int型の1,2bit目で判断するのと、pair<bit,bit>を使うのとどっちがスマートでしょうか? それ以外の方法もあります?
>>683 「あいうえお」の長さが5になったらそれは最早UTF-8ではない。
とりあえず
std::wstring str(L"あいうえお");
でどうだ?
char型で返す ビットフィールドを使う 引数に参照を渡して2bit操作する
pair<bool,bool>だった しかもクッキー食べ忘れ
質問です 一般にグローバル変数はいけない、という事なのですが、 全てのファイルで一貫して使う定数などはどこにどう定義すればいいのでしょうか?
>>685 それぞれの値が数値でなくtrue/falseを意味するなら
struct A { bool flg1; bool flg2; }; だな。
将来的に値が2ビットとか3ビットになる可能性があるならビットフラグかな。
struct A { int flg1: 3; int flg2 : 2; };
>>686 >「あいうえお」の長さが5になったらそれは最早UTF-8ではない。
なんでだ。
>>689 なぜグローバルがダメなのか分からないレベルの初心者なら気にするな
周りの言葉に惑わされて全然関係ないところで躓く典型だ
定数ならヘッダに namespace foo { const int boo = 1000; } とかやれば
>>692 >>693 ありがとうございます
ちなみに、変数名の重複以外の理由でグローバル変数が駄目な理由って
何があるでしょうか?
>>686 回答ありがとうございます。
バイト数ではなく、文字数(=5)を得たいという意味です。
> std::wstring str(L"あいうえお");
> でどうだ?
実際に扱いたいのはリテラルではなくて、UTF-8の入出力なので
その方法だと無理そうです。。
(PCとかならプログラムの入出力に別プログラムでフィルタかませば
済みそうなんですが、組み込みでの使用を考えてるので、それも難しい)
>>694 グローバル変数がいつ何処で書き換わるのかを追うことが難しく、読みにくくなるから。
だからグローバルな定数なら文句を言う奴は少ない。
なんとなく、処理の前後にUTF-8 <-> UTF-16の変換処理入れて 内部はstd::wstringで表現すれば比較的楽にいけるんじゃないかと 思いついた。 というわけで、そういう方向でやってみますー
UTF-16ってWindowsか? 頼むからサロゲートペアはきちんと処理してくれよ。 MultiByteToWideChar呼べば問題無いと思うが。ついでにシフトジスにも対応できる。
>>673 何言ってやがる。
std::iostream も std::exception も参照でポリモーフィズム利用するのが基本だろ。
いつも頭を悩ませるんだけど失敗しうるリソース開放処理ってどう対処してるの? 成功するまで繰りかえす、ログに出力して放置、即落ちる、とか考えたけどどれもいまいちピンとこない
どういうソフトで、解放されなかった場合どうなるかを考えて切り替えじゃないかな 基本はログ出力やメッセージ表示して放置でいいと思うけど
初歩的な質問なんですけど、浮動小数点型の右シフトって 2で割ると同じことになるんですか?
>>704 実はやってみた事がある
キャリーフラグを通しての回転なのでインラインアセンブラを使った
結果は出力がバグって100桁以上の出力になったっけ
多分IEEE754が意図していない変なビットパターンになっちゃったんだな
マジっすか?それはおかしいなぁ クヌースの1巻の1.2.2の問題25で右シフトして 半分にしてるんだけど。
浮動小数点型を2で割ってもビットパターンはまったく回転しないぜ 指数部が1減るだけ
もしかして2から1の間ではなりたちますか?
>>707 それ多分IEEE754形式じゃないんだよ
エクセス64方式でもそうはならない
>>709 だめだと思う
指数部や符号部までシフトされちゃうからおかしくなるよ
1.0をシフトした場合を考えてみれ 0.5になると思うか?
なるような気がします
まず浮動小数点数のビット表現をwikiれ
>>713 IA-32 + Windowsの場合だけど、このように滅茶苦茶な値になる
#include <iostream>
void rshift(double& d)
{
asm {
mov ebx, d
shr byte ptr [ebx + 7],1
rcr byte ptr [ebx + 6],1
rcr byte ptr [ebx + 5],1
rcr byte ptr [ebx + 4],1
rcr byte ptr [ebx + 3],1
rcr byte ptr [ebx + 2],1
rcr byte ptr [ebx + 1],1
rcr byte ptr [ebx + 0],1
}
}
int main()
{
double d = 100.0;
std::cout << "Before Right shift : " << d << std::endl;
rshift(d);
std::cout << "After Right shift : " << d << std::endl;
}
721 :
716 :2010/12/02(木) 04:00:44
>>720 そんな事は百も承知だカス
>>709 に教えてやるためにわざわざやってやってるんだ
低脳は口を出すな
double に 2.0 と 1.0 を代入して16進で見ればすぐ理解できると思うんだけど
cinからバイナリを読んでみたいんだけど ストリームの対象を変えずにオープンモードだけ変える方法ってある? C++でなかったらCでもいいです
>>723 処理系に依存しない方法では無理。Visual C++ならこんな感じ。
#include <fcntl.h>
#include <io.h>
#define setbinmode(fp) setmode(fileno(fp), O_BINARY)
725 :
724 :2010/12/02(木) 18:23:17
すまん。こいつも必要。 #if (defined(_MSC_VER) && (_MSC_VER > 600)) # define setmode(x, y) _setmode((x), (y)) # define fileno(x) _fileno(x) # define isatty(x) _isatty(x) #endif
どうせWindows以外はテキストモードとかどうでもいいしなあ
マルチプラットフォームに対応したソースを書くにはどうしたらよいでしょうか
説明してあるサイト見たこと無いんだ・・・
>>726 VMSのことも時々でいいので思い出してあげて下さい
>>727 使用する関数や言語機能のドキュメントを読んで、
プラットフォーム依存な部分があるのかないのか確認すれば
よいでしょう。
パソコンの性能に依存しない実行速度の測定方法を教えてください。
>>731 どう測定したらパソコンの性能に依存なんてするの?
?!
2つの別々のパソコンで別々のアルゴリズムを測定して2つのアルゴリズムを どうやって比べるの?
>>734 2つのパソコンで2つのアルゴリズムについて std::clock() あたりで実行時間を計測すればいいんじゃないの?
>>731 実行速度はパソコン性能に依存するので諦めて下さい
>>734 パソコン1でアルゴリズム1を測定、パソコン2でアルゴリズム2を測定して、
その2つの計測結果のみでアルゴリズム1とアルゴリズム2のどちらが速いか
決めたい、ってことなのかな?
それは無理だ。
計算量の話にすれば O(1) とか O(N) とか O(logN) の違いでアルゴリズムを
比較することはできるけど、それがそのままどちらが速いという結果につながる
わけでもないし。
OSとかが使う計算とかの、測るアルゴリズム以外の計算は止めておいて クロック数を測る方法でいいです。
使用クロック数自体もパソコンによって違うから。主にキャッシュの量の問題な。
一クロックでどのくらいのことができるかも、CPUによって違うからな
体感しかないな
じゃあ駄目だな。 終わりだな。
クロックが同一でもCPU内部アーキテクチャ、バスアーキテクチャ、メモリ性能や メモリ2枚差し3枚差しでも全然違ってくるから、ベンチマークはPCに依存しない プログラムは原理的に作る事が出来ない
ただし計算量O(ビッグ・オー記法)はコンピュータによって変化しないから、 あるアルゴリズムがどの位の計算量を持つのかそのオーダーを知る事は出来る
なんで、コンピューターはコンピュータなのに ビッグ・オーはビッグ・オじゃないの? なんでオーダーはオーダじゃないの?
くだらない
ここがC++のスレか・・・ ということで質問です。 Delphiで TUnkoClass: class of TUnko type TGeri = class(TUnko) ・ ・ TIpponGuso = class(TUnko) ・ ・ function BuildUnko(AType:TUnkoClass):TUnko; begin Result:=AType.Create; end; こういうのがあったとして、これをC++でやるにはどうしたらいいんでしょうか。
死ね
これってvecの中はdeleteされずにちゃんと数字入ってる? vector<char*> vec; for (int i=0; i<3; i++) { char* ch = new char[2]; sprintf(ch, "%d", i); vec.push_bak=ch; delete ch; }
いいえ
>>751 vec.push_back(ch);だと思うけど、
ポインタがコピーされるだけだから数字は入ってない
これならいける? vec.push_bak(*ch);
ポインタ型のコンテナに値がある訳無かろう
なるほど
{ vector<char*> vec; for (int i=0; i<3; i++) { char* ch = new char[2]; sprintf(ch, "%d", i); vec.push_bak=ch; } } vecがスコープを抜けた時、自動的にchar*のnewで生成の配列をdelete[] するようにするにはどうすれば良いですか?
不可能ですのでほかの言語を勉強しましょう
>>757 boost::ptr_vector<char>を使う
あれ、ptr_vectorに配列はまずいような気がしてきた
入れた分deleteすればいいだけでしょ。
newしないでスタック使えよ
>>757 関数中に
struct disposer {
disposer(char* p) : p(p) {}
~disposer() { delete [] this->p; }
char* p;
} tmp(new char[2]);
char* ch = tmp.p;
C++のnewは何故あんなに遅いのですか?
遅いと思うなら、独自メモリー確保作る。
>>763 感謝上げ
そんなやり方で出来るんですか!
newって200ns〜400nsぐらいだろ。そんなに遅いとは思わないが。 それともJava/.NETのnewと比べてる? そりゃまあ遅い罠。
あんまり高頻度にnew/deleteするのはヒープ領域を汚すし、boostのpoolでも使えば?
ここはC++スレだ。ヒープじゃなくてフリーストアと言え
>>757 ,759,763 std::vector<char> だろjk
>>764 どんな計測結果見て「あんなに」と言ってるのか書いてもらわないと、なんとも。
773 :
デフォルトの名無しさん :2010/12/04(土) 10:09:14
テンプレートクラスのテンプレートコンストラクタの 特殊化を宣言したいんですが、どうもうまくいきません。 どう書けばいいか教えてください。VC2010EEです。 template< typename T > float_class { T f; template< typename V > float_class( const V& v ); }; template< > float_class< float >::float_class( const int& v ){ assert(false); } template< > float_class< float >::float_class( const float& v ) : f(v) {}
>>773 二重のテンプレートだから template<> が2つ要るんじゃない?
numeric_limitsというものがあるようですが ある変数fooのnumeric_limits使うときに わざわざfooの型を見つけてnumeric_limits<double>とかやらないとならんのですか? numeric_limits<foo>とかできないもんでしょうか。
decltype
ダウンキャストを回避する方法を教えてください
継承しなきゃいいんじゃね?
死ね
>>779 基底クラスにアクセスしようとするとハードディスクをフォーマットするようにしておく
そもそもダウンキャスト(基本クラスのポインターやリファレンスから派生クラスのポインターやリファレンスへのキャスト) させたくないという考えがでる時点で、 すでに基本クラスを使っているだろうから・・・ 常にハードディスクをフォーマットするプログラムか。
>>778 std::stringを使うという脳みそはないのか
cstringってなんだろうと思ったので、googleで検索してもmfcしかヒットしません なので、linux + gcc環境下で#include <cstring>とやってみましたが、エラーが出ませんでした cstringはmfcのモノなんですか?
<cstring> は <string.h> の C++ 版で std::strcpy とか std::memcpy とかを使うために必要なヘッダファイルだ
787 :
785 :2010/12/04(土) 17:47:27
>>786 string.hってC言語の物なのか?
CString って便利よねぇ。
C言語のものというかなんというか C++でも使えることになってるから別に使ってもいい 推奨されてはいないが、気にすることはない
string.hはCだけでなくC++にもある。Cのstring.hと同じであるとは限らない。 例えばCのstdlib.hはabs(int)しかないが、C++のstdlib.hはabs(double)があったりする、 はずだが実際には規格に従っていない処理系があったりする。
ンモー
<cstdlib>で定義されているのは abs(int) と abs(long) の整数型で abs(doble) は<cmath>じゃね? Cのmath.hに定義されるfabs()に対応するためのオーバーロード
手元に古い1998年版しかないけど、ISO/IEC 14882:1998(E)の 26.5 C Libraryにはcstdlibって書いてある
ISO/IEC 14882:2003(E) 26.5 C Library 3. In addition to the int versions of certain math functions in <cstdlib>, C++ adds long overloaded versions of these functions, with the same semantics. 5. In addition to the double versions of the math functions in <cmath>, C++ adds float and long double overloaded versions of these functions, with the same semantics. ISO/IEC 14882:2003(E) D.5 Standard C library headers 2. Every C header, each of which has a name of the form name.h, behaves as if each name placed in the Standard library namespace by the corresponding cname header is also placed within the namespace scope of the namespace std and is followed by an explicit using-declaration (7.3.3).
>>784 そもそもが敢えてchar*でやるっていうお題なんだけど
自分の脳ミソ疑ったほうが良いんじゃないの?
>>777 decltype調べてみましたがC++0xの機能のようですね。
msdn見てみるとVS2010以降で使えるようです。
私の環境はVS2008でなのですが、変わりになるようなものあるでしょうか?
>>796 boost::typeof
いまいちだけど
#include <cstring> だろ え およびでない?
>>797 >>763 みたいな案もでてんじゃん。
そもそものお題すらぶち壊す代替案しかだせないレベルなら出てこなくて良いよ
ここは質問したいやつとそれに答えれるレベルのやつのスレなんだから
>>800 >>763 はダメだろ。
お題は vec のスコープアウトでの破棄なのに、 ch のスコープで破棄されてる。
OSのシグナルって割り込みの事だよね 関数ポインタを登録して、コールバックすればいいだけおk?
803 :
802 :2010/12/04(土) 22:46:51
コールバックすればいいだけ?
int* p = new int[0]; って要素数ゼロ指定したらどんな良くないこと起きますか?
p が NULL になるのは確実だけど例外が生じるかは処理系依存かなぁ
>>805 べつに。
「ヌルじゃなければオブジェクトを指しているという」仮定をおいている
コードにそのポインタを渡したときに不正なアクセスとなる可能性は考えられる。
でもどうせ配列アクセスするときにはサイズでチェックするから、それもないか。
>>806 ヌルにはならないよ。
ISO C++ 2003 5.3.4 New p7
> When the value of the expression in a direct-new-declarator is zero,
> the allocation function is called to allocate an array with no elements.
で、 allocation function は成功時にヌルを返しちゃいけない。
3.7.3.1 Allocation functions p2
> ... Even if the size of the space requested is zero, the request can fail.
> If the request succeeds, the value returned shall be a nonnull pointer
> value p0 different from any previously returned value p1, ...
>>808 bcc でも NULL にならなかった double* a で sizeof *a が 8 だったから1要素分は alloc されるんだね
知らんかったよ
いやそれは・・・
int* p = new int[0]; p != NULL *p == NULL が正しい
xxx * p = new xxx[0]; *p で未定義動作なのに、なんでp==NULLや例外発生しないの? あと、どんな時使うの?
その*は演算子ではなく、宣言子の一部だ。
×勘 ○思い込み
>>817 サイズ 0 の配列が欲しいという要求は満たせているのだから、例外が発生しないのは当然。
ヌルを返さないのは「ヌルは確保の失敗を示す」という一般的な意味づけを保つように、だと思う。
>>817 サイズ 0 の場合を特別扱いしなくていいように、だろう。
>>810 sizeof *aはnewしたサイズじゃないぞ。sizeof a[0]と同じ。もちろん実際のメモリアクセスは発生しない。
int* p = new int[0]; ってどうゆう意味よ。 int p; じゃまずいの? new したら deleteするタイミング必要だし。
>>825 実際は実行時に決まる要素数がたまたま 0 になる場合の話だろ。
>>815 デストラクタ使えば何とでもなるだろ。
struct unko : public vector<char*> {
~unko() { for (int i=0; i<size(); i++) delete[] (*this)[i]; }
} vec;
for (int i=0; i<3; i++) {
vec.reserve(vec.size() + 1);
vec.push_back(new char[2]);
char* ch=vec[i];
}
828 :
810 :2010/12/05(日) 02:36:08
>>821 malloc() を呼ぶ時に size が0だとNULLになるだろ
size 0 のヒープは確保できないから最低単位、例えば size 1 のヒープを確保するって事か?
>>824 double* a の時、sizeof *a は sizeof double と同じだな、確かに確保した領域とは関係ないや
class A; char buf[1000]: A* a = new(buf) A[10]; で確保した10個のAのデストラクタを呼び出すにはどうすればいいんでしょうか?
>>828 >malloc() を呼ぶ時に size が0だとNULL
それは違う。
C99 7.20.3
『If the size of the space requested is zero, the behavior is implementationdefined』
>>829 for (int i=0; i<10; i++) a[i].~A();
>>827 vectorって仮想デストラクタ持ってたのか
知らなかった
833 :
827 :2010/12/05(日) 02:54:42
>>832 vectorは仮想デストラクタは持ってないよ
>>832 継承したからといって virtual デストラクタを持っているとは限らない。
virtual デストラクタを持っていないからといって継承しないとは限らない。
>>830 そうは言っても NULL 返さない処理系なんて見た事無いよ
いやまた思い込みって言われるか、確かに過去に扱った処理系全部で size 0 malloc() なんて試してないからなぁ
要点はね bcc だと malloc() は NULL を返し、 new は NULL を返さないって点なんだ
size 0 の場合 new は要素を持たない配列を確保するって言われてもイメージが沸かないでしょ
実装上どういう確保が行われてるか知りたいんだけど....なんかスレ違いみたいだからもう良いや
>>836 dlmalloc のソースや libstdc++ のソースを見るといい。
サイズ0が指定されたら1に置き換えて確保すりゃいいだけじゃない。 ポインタが以前確保した領域と同じか比較する奴がいて、サイズ0だとNULL どうしで同じになって困るバカがいたから必ず違うアドレスが返る様にしたと 昔のマイクロソフトのドキュメントに書いてあった。
>>802 コールバックしてもらえばOK。ただし基本はそこから他の関数を呼んじゃいけない。
>>829 bufは動的に確保しろよ。でなきゃアライメントが保証できない。
>>841 placement new の意味ねーw
placement newでもアライメントは重要だぞ。 C++03では、アライメントというもの自体が規定されていなかったので、実装依存だった、 C++0xでは、alignasというキーワードが導入されたので、ちゃんと指定しろよ。 class A { } ; alignas(A) char buf[1000] : A* a = new(buf) A[10] ;
>>843 > C++03では、アライメントというもの自体が規定されていなかった
んなこたーない
int *p = new int[10];とかやって、detele[]せずに p = new int[5];ってするとどうなりますか? 一応問題なく動いてるようにみえますが・・・
pを保存せずに上書きしたなら 解放できないint10個分の領域が出来るだけ
なるほど解放できなくなるのか ありがとう
virtualデストラクタは必ずつけろとか言うアホはなんなの?
pは、フリーストアへのポインターの値を格納する変数だ。フリーストアそのものじゃない。 なんだろう。今はメモリーとアドレスといった、プログラミング以前の概念が、分かりにくくなっているんだろうか。
>>848 お前がvirtualつけなくていい例を理解してないアホだと思われてるんだろ
>>833 そしたらvectorのデストラクタは呼ばれないよね
大丈夫なの?
>>851 仕様を勘違いしてない?
自動変数→OK.必ず全部呼ばれる
virtualデストラクタ無し、派生クラスのポインタでdelete→OK
virtualデストラクタ無し、基本クラスのポインタでdelete→NG、基本クラスのデストラクタのみ
virtualデストラクタ有り、派生クラスのポインタでdelete→OK
virtualデストラクタ有り、基本クラスのポインタでdelete→OK
>>852 揚げ足取りだが二番目は一般的な挙動なだけで
実際は未定義動作だな
>>852 ありがとうございます
もっと精進します
>>852 そんな面倒な事を覚えなきゃならない欠陥言語をどうして使うんだ?
俺はもう覚えてて平気だから気にならない 覚えられない奴は別の言語使えばいいんじゃね
virtual関数の仕組みは単純だから基本が分かってれば 個々の場合についていちいち覚えてる必要ないし
いっぺんvtableを実装してみれば あぁそういうことだったのかコンパイラさん面倒なことをいつも引き受けてくれてありがとう ってなって二度と間違えることはなくなるよ
つまり、vtableを実装してみないと使えない欠陥言語という事だね。
virtualデストラクタ無し、派生クラスのポインタでdelete→OK これがOKなのって、派生クラスのポインタを通じた破棄は 正しく派生クラスのオブジェクトの破棄とみなされて 派生クラス部分の破棄(派生クラスのデストラクタ呼び出し) →基底クラス部分の破棄(基底クラスのデストラクタ呼び出し)の順で行われるからでいいんですか?^^;
C系列が欠陥言語なのは昔から常識だろう
言語的に自由度が多すぎるのが欠陥なら、アセンブラが一番の欠陥品だな
>>860 そうだね
class Hoge
{
~Hoge(void) {}
};
class Fuga : public Hoge
{
~Fuga(void) { /*…*/; /*ここで見えないけど~Hoge()が呼ばれる!*/ }
}
Hoge *h = new Fuga;
Fuga *f = new Fuga;
delete h; // hの型はHoge*だから~Hogeだけが呼ばれる→やばい!
delete f; // fの型はFuga*だから~Fugaが呼ばれる→中の人が~Hogeも呼ぶ
欠陥言語ならさらに欠陥方向に振って直前の式からゼロ・オーバーフローフラグを採れる言語にしてほしかったな。
virtal destructor 無い学級は基本的に継承させるな学級 継承しても多相しないのならイラネ 覚えとくように。シャキーーーーン 嘘はシャキーーーーンっと言おう、さればこそ釣が出来る
どこで翻訳するとそんな文章になるんだ?
よく分からないなら全てのclass のデストラクタに virtual をつければ良いのですが、 そうすることで、コンパイラによりますが、大抵は vtableという見えないデータメンバを余分に持つことになり、 それが速度に多大な影響を及ぼす場合などもあります。 また、sizeof(クラス名)としても、直感とは違う値が返ってきます。 ですので、C++の高級アセンブラという側面からは、 virtual を言語レベルで強制することは出来なかったです。
870 :
852 :2010/12/05(日) 21:26:37
>>855 俺の場合は仕事だからね。コンパイル時も実行時もエラーを出せないことがある
のは確かに欠陥だとは思うけど、昔は「プログラマーは間違えない」ことを前提とした
仕様がまかり通ってた。面倒だと思ったら
・正しい本来の型で開放→問題なし
・本来の型と異なる型で開放→virtualデストラクタがないと正しく開放されない
と覚えてくれ。
詳しくはEffective C++第3版を読みましょう^^ 第2版は古いので、ややいい加減です。
>>868 それって静的にわからないもんなのかな?
>>872 静的変数や自動変数ならわかるが、newした場合ポインタから指すと
基底クラスと派生クラスのどちらを指しているのかわからない
newしなくてもこれでも同じか Derived drv; Base* b = &drv; もうこれだけで静的には解決できない
ライブラリに以下の関数を定義したとする。 void f(Base * pb) { } コンパイル時にはpbの実体は決まっていない。ライブラリ作成後に struct D : public Base {}; // Dはライブラリ コンパイル時に無かったクラス f(new D); というコードが作成されるかも知れない。
更にいうと
>>852 > virtualデストラクタ無し、基本クラスのポインタでdelete→NG、基本クラスのデストラクタのみ
も間違いだよね。
厳密には未定義の動作。
細かいことを申し上げてゴメンよ、と思ったらもう指摘されていた。
なん既出に気づいたのに書き込んじゃうかな
>874 関数内でそのまま並んでる場合ならコンパイラによってはフロー解析して静的に解決するかもしれない。 実際以下のコードで gcc 4.3.4 で -O2 だと直接 B::func() を呼ぶコードが生成されてた。-O なしだと vtbl 経由。 #include <iostream> using namespace std; struct A { virtual void func() { cout << "A::func()" << endl; } }; struct B : A { virtual void func() { cout << "B::func()" << endl; } }; int main(void) { B b; A *pa = &b; pa->func(); return 0; }
882 :
デフォルトの名無しさん :2010/12/06(月) 13:05:03
iterator traitsのdifference型が満たさなければいけない条件や操作を 全て教えてください。 それとtagを使って多重定義されている関数をコンパイル時に振り分けるとき スタックにtagをつんだりして実行速度はおそくなりますか?
stlのコンテナのイテレータがnext()とか実装されていないのは何故なんでしょうか?
>>883 すでに ++ があるのになぜわざわざ別に next が必要なのか説明するべき
>>886 それはいったいなんの役に立つんだ?
end() と比較するだけでは不十分なのか?
実際にはスタックに積むことがあんまりないので スタックに積んで遅くなることはあんまりない
>>888 一つ目の質問。
iterator_traitsにdifferenceというネストされた型名はない。
したがって質問に応えることはできない。
ちなみに、よく似た名前の、difference_typeならある。
これは、signed integral typeと定められている。
したがって、unsignedな整数型はだめだし、浮動小数点数型はもってのほかだし、クラスはありえない。
二つ目の質問。
実装依存であるため、正解はない。
しかし、関数のインライン展開ができるほどのコンパイラなら、まず最適化で消えるだろう。
もちろんスタック以外でもOKですよ。 上記の文は遅くなる原因なら何でもOKと言い換えられますよ
difference_typeのことでした。 ありがとうございました。
>>887 コンテナしらないオブジェクトが使うときあるじゃないですか
char a[256]のポインタで a=new char[10](これはエラーです) みたいなことはできますか? 固定長の配列を動的確保したいのですが?
イミフ aをヒープ領域としてそっから10個分確保したいってこと?
>>894 普通に
char *a;
a = new char[10];
とするのと何が違うのか説明したまえ
>>895-897 低脳過ぎるよ
確かに意味不明だが
ポンタaはchar配列長256のみ指す用にしたいってこと
a=new char[10]
この場合は、aは配列長10を指す用になるから、ダメポにしたいってことだろ
これぐらい分らないか...いまや日本はゆとりだらけだからな
>>894 できない。new char[10]の型はchar *なので、配列要素数の情報を持っていない。
これで我慢しろ。
struct array100 { char data[100]; operator char*(){ return data; } };
array100 *pa = new array100;
(*pa)[0];
typedef char char256[256]; char256 *a=new char256();
>>898 お前が何を言っているのか理解できねーよw
902 :
デフォルトの名無しさん :2010/12/06(月) 20:49:15
template<int n> struct array { char data[n]; operator char*(){ return data; } }; array<100> &a = *new array<100>; a[0] = '\0'; delete &a;
ありがとうございます。
>>898 ∩_
〈〈〈 ヽ
____ 〈⊃ }
/⌒ ⌒\ | |
/( ●) (●)\ ! !
/ :::::⌒(__人__)⌒:::::\| l
| |r┬-| | / <こいつ最高にアホ
\ ` ー'´ //
/ __ /
(___) /
>>898 >これぐらい分らないか...いまや日本はゆとりだらけだからな
>これぐらい分らないか...いまや日本はゆとりだらけだからな
>これぐらい分らないか...いまや日本はゆとりだらけだからな
/ / '" / / ,,-、 /、ヽ\ ゙i;,-''" / ./ /─''''" ̄ ,,/
/ ./ / ,,,-‐'"-/ / ./ ゙" "\ ゙i;, | 、// / " ,,,/
/ ,-''/ / ,,-''"_ / // ヽ l / レ'/~ /‐/
/ / | l| ,,-'"/゙/,」| / ..::;;;,,, } / |~ ,,-‐,,,-''' //~
/ /-'''''| | /l /‐'''/'' .人 i' .:: :;'" / / l ノ゙i// ,,-‐'"──==
//'" ゙i;: | /‐' ./,, ,,ノ ゙i;,. | _,,-ヾ.// ノ ,-''" l | ‐'" ,,,-‐二
レ' ヽl:i' ./ )'、‐,\゙i;: | ,,,-‐二-┬ナ" /‐'"‐ 〉 ,i'───'''" ̄~-''"
,-‐',ヽ|'" ./゙ヽ-ゝ='\゙i,'''ヽ -゙=‐' '" ,‐'ノ,, /‐''" ,,-‐'''"~
/ / ;;:. ──ヽ, ゙i;'''''' , ゙ "-‐'''''""" 〔_,/ ゙ヽ'-'"~
/ / / ,; ,,_}_ ゙、 ./__,, _,, / \
,;' / ,;;;:;:/;: ,, ~ ヽ ヽ. ヽニ‐'、 / / ゙i,_ おめぇ、ここ大丈夫か?
./ '' ,l,,,,,,/ 〉 ゙ヽ、 '''' ,,-''" / ゙i.\
/ / ヽ / ゙ヽ、--イ~;;:'" // ::;:;:;: | \
i /  ̄ ゙̄" |;:" // ヽ-‐'''"~l|
./ ゙''''ヽ、,,-‐''" .i /,;'" _,,,,,,,,,_,,,-‐'''-''"~ |
if( 904 == 905 )
{
puts("あんぱん\n");
/*
>>909 コメント行にしとけ
コンパイルエラーがでる
*/
throw;
#if 0 これが便利だ。ぼけども。 #endif
913 :
デフォルトの名無しさん :2010/12/07(火) 14:36:01
int count[152]; for ( int i = 0; i <= 151; i++ ) { count[i] = 0;} if (a.jikan[ 1 ].kei >= 420 && a.jikan[ 1 ].kei < 480) { count[4] += 1;} cout << count[4] << endl; 一部抜粋しましたが、コマンドプロンプトでは 0 0 0 0 と続いてしまいます。 1 2 3 4 このように1づつ増やしたいのですが、間違っている箇所を教えていただきたいです。
削りすぎだろおいwww
>if (a.jikan[ 1 ].kei >= 420 && a.jikan[ 1 ].kei < 480) { >count[4] += 1;} ここ通らないから+1されないんだろ
916 :
デフォルトの名無しさん :2010/12/07(火) 15:16:32
915の方ありがとうございます。 こちらはCSVから条件の値をとっているのですが、 a.jikan[ 1 ].keiの値をコマンドプロンプトで取り出すと全てマイナスでした。 しかし、CSVを見てみるとその値にはマイナスでなく、 a.jikan[ 1 ].kei >= 420 && a.jikan[ 1 ].kei < 480の条件に合った値が載っています。 何故だかわかる方はいらっしゃいますか?
エスパーの登場を待て。
一部抜粋には条件のところにしか kei 登場してないもんな 俺らには見えないCSVから値をとる処理とやらが間違ってるんだろうと推測するしかない
919 :
デフォルトの名無しさん :2010/12/07(火) 15:28:44
回答してくださった方々ありがとうございます。 私自身も省略が多い等失礼な事をしました。 みなさんからの助言を下に改めて確認してみたいと思います。 本当にありがとうございました。
ファイルの一部分を一つのファイルとして開くことってできますか? 例えば四ギガのファイルを開く→二ギガ目に移動→現在の位置をゼロ点にして二ギガのファイルとして開き直す(この時点でtellするとゼロ、終端位置でtellすると二ギガが返る) 世の中そんなに甘くないですかね?
その様に動くファイルアクセスクラスでラップする。
特殊な要求は自分で書くしかないね 「開き直す」にどんな意味があるのかよくわからないけど
バイナリデータをwchat_tのワイド文字列データーに変換や復号する アルゴリズムみたいなのが、何処かにありませんか? バイト文字では有るのですが、それをワイド文字に適用しても2バイトになってしまうので><
エスパーするとreinterpret_castすればいいだけ
いやお前が考えるんだよ
#include<stdio.h> #include<limits.h> /* Maximum Definitions */ int main (void) { int a,b,c,d,e,f,g,h,i,j; /* printf("Maximum of int+1:%d\n", INT_MAX+1); /* */ /* printf("Minimum of int-1:%d\n", INT_MIN-1); /* */ /* printf("Maximum of long+1:%ld\n", LONG_MAX+1); /* */ /* printf("Minimum of long-1:%d\n", LONG_MIN-1); /* */ a=INT_MAX; b=a+1 /* prinf("a=%d, a+1=%d\n,a,b); /* Hint */; a=2000000004; b=a/20; printf("Nov 24 2010: a=%d,b=%d YEN\n",a,b);/* 2010*/ printf("Nov 24 2011:%d YEN\n",a+b);/* 2011*/ c=a+b ; d=c/20; printf("Nov 24 2012:%d YEN\n",c+d);/* 2012*/ e=c+d ; f=e/20; printf("Nov 24 2013:%d YEN\n",e+f);/* 2013*/ g=e+f ; h=g/20; printf("Nov 24 2014:%d YEN\n",g+h);/* 2014*/ i=g+h ; j=i/20; printf("Nov 24 2015:%d YEN\n",i+j);/* 2015*/ return 0; } これをすると正しい値が出ません。どこが間違っているか分かりませんか?
928 :
デフォルトの名無しさん :2010/12/07(火) 19:14:46
/*/ ↑ これマジでやってた奴が元同僚にいる 今思い出しても吐き気がする
せやなwwww
>>927 回答不能です。
「これ」をするとどんな値が出ますか?
「正しい値」とは何ですか?
っていうか、それCのプログラムちゃうんか^^
>>923 setlocale(LC_CTYPE, "");
char bin_data[] = "\x83\x7D\x83\x93\x83\x52";
wchar_t a[100];
mbstowcs(a, bin_data, sizeof a / sizeof *a);
wprintf(L">%s<\n", a);
>>927 > a=INT_MAX;
> b=a+1
この時点で何が起こるかわからない。
>>932 いえ、そのー説明が不備で申し訳ありません。
例えば
0x00ff00ff のようなバイナリーデータが有ったとき。
文字コードに変換し−>”ASASDFDFASASDFDF”(内容は適当)保存して。
復号化は
”ASASDFDFASASDFDF” -> 0x00ff00ff にしてバイナリーにして使用する。
昔で言うishだったかなー、これのワイド文字コード版です。
なんという宿題マルチ丸投げ
937 :
934 :2010/12/07(火) 21:09:31
今のところ、下のような変換テーブル作るしか思いつかなかった… L"一丁七万丈三上下不与丐丑且丕世丗丘丙丞両並个中丱串丸丹主丼丿乂乃", // 4E00 L"久之乍乎乏乕乖乗乘乙九乞也乢乱乳乾亀亂亅了予争亊事二于云互五井亘", // 4E45 L"亙些亜亞亟亠亡亢交亥亦亨享京亭亮亰亳亶人什仁仂仄仆仇今介仍从仏仔", // 4E99 L"仕他仗付仙仞仟代令以仭仮仰仲件价任企伉伊伍伎伏伐休会伜伝伯估伴伶", // 4ED5
Base64?
939 :
934 :2010/12/07(火) 21:17:51
Base64はbyte文字コード用なので、それのwchar_t用が無いかなと。
一般的なものは無いでしょ ASCIIみたいにどこでも転送・表示可能な文字に変換するから存在意義があるわけで
941 :
932 :2010/12/07(火) 21:27:07
>>934 UTF-16で使っちゃいけなさそうなのは(0000, D800〜DFFFF,FFFE, FFFF)ぐらいで、
殆ど全部のコードが使えるわけだから、効率的なアルゴリズムはないんじゃない?
942 :
934 :2010/12/07(火) 21:34:58
>>941 そう思って、簡単な変換作ってprintしたら−>??????????享??????????
になってしまって、対応する漢字がないと印刷できなかった…
やっぱり、テーブル索引しかないかな〜
>>942 はぁ? 日本語環境で印刷できる文字だけにしたいなら
ishで漢字にしたのをwchar_tに変換すりゃいいだけでしょ。
wchar_tとか関係ないんじゃ。
944 :
934 :2010/12/07(火) 22:09:16
>>943 まあその ishで漢字コミで変換しても↓
!!CK!:9Q!5"XRo),Sa5h/")H^2h|!&"H!W'\\[!!!!MSzQ}s*j!!!!!!!!!!!!!!!!!!!!!!!!m082
!!CK!:9Q!5"XRo),Sa5h/")H^2h|!&"H!W'\\[!!!!MSzQ}s*j!!!!!!!!!!!!!!!!!!!!!!!!m082
!!CK!:9Q!5"XRo),Sa5h/")H^2h|!&"H!W'\\[!!!!MSzQ}s*j!!!!!!!!!!!!!!!!!!!!!!!!m082
%肄捐A=クUメ゙O訶w,ロ戝扼KコEEv娉v_ム嗣ハ」ヨ+ェイククxLP虔4,ムハス憩KチEEvシP5_モ嗣ハ」ヨ/BUEUv嚆aZ
&肄」絎lキホvレO訥ッ吾贊ミル@脚ーH儺肪薇Y肄ゥ暸=クUvレO訶w,ロ戝扼KコEEvワQv_ム.fハ」ヨ+ェイククxL0瓩
'ユラ掫オクDl梳ョqh・(ャユラゥqラャrmJkP6b1L2肄ッXMlキホH?O蘢ッ吾贊ミル@脚ーH儺肪薇Y肄エヘA=クUvレwkA
)ハ」ヨ/BUEUv坩qh・(ュハォゥqラフZノxmTUf銑;ユラ掫オクDl梳ョqh・(ョユラゥqラフrmJkP6b1L2肄コ/Mlキホメ゙bレコ
の物を、wchar_tにしたら、約倍に増えるわけで…
プログラマのための文字コード技術入門(技術評論社)をちょうど今読んでるところだから、読み終わったら回答するよ!
好きにマッピングしたらいいがな 端末によっては表示不可とか、サイトによっては投稿不可とか、かなり環境選ぶと思うが
それって結局ishになるんじゃね
enum {test1, test2}みたいな感じで、enumを使っていました enumの名前が書かれていなかったのですが、何の意味があるのですか?
意味がないから書いてないんじゃね
>>949 定数を書く時に#defineが嫌いだったに違いない。使う時はint型として使うしかない
名前をつけるとそれは型名として使える^^ enum E { yes, no }; bool f( E e ) { return e != no; } Javaなどの場合はさらに名前空間に入ってくれて便利なんだけど C++にはないんだよねー。
>>953 C++でもenumは名前空間に入るだろ。
E::yesみたいに使いたいと言ってるならC++0xを待つしかないな。
0x、早くこい!
Javaなんて標準ライブラリがfinal intまみれで意味的な分類をしてないゴミだろ。 比較するなら.NET Frameworkの方がいい
同意 明らかにCにも劣る糞仕様なのに、ライブラリ作るときに どうして世に出す前に言語の方を何とかしようという声が挙がらなかったのか不思議でならない
メンバへのポインタ、classX::*memberXになぜしたの? *classX::memberXにしない理由はナニ? ついでに、 アドレスを取得するのにclassX::&memberXじゃなく &classX::memberXする理由はナニ?
>*classX::memberXにしない理由はナニ? struct classX { static int* memberX; }; int *classX::memberX; があるから
質問です。 入力された数字が整数か実数で条件分岐したいと思っています。 double d; cin >> d; int i=(int)d; double EPS=0.001; if( abs(i-d)<EPS ){ //i を使用して処理 } else { //d を使用して処理 } cinから整数値を入力した場合 『double型に格納された整数は内部で正しく表現されないため、 これをint型にキャストすると、値が入力値より誤って1減るに違いない』 と推測していたのですが、i には入力値が1減らずに入りました。 入力値は1~9999までの整数値を試しましたが、どれも入力値と同じ値が i に格納されました。 推測が外れて不気味です。 なぜ入力値と同じ値が i に格納されるのか、教えていただけませんか?
>>960 × double型に格納された整数は内部で正しく表現されない
○ double型に格納された整数は内部で正しく表現されないことがある
ってことかと。
i-dってやってる時点で、(double)i - dみたいなコードになるような気がする というか、目的を達成するなら、文字列で受け取ってから整数かどうかを判定するほうがいいと思う
つか 浮動小数の仕組みから考えて 小数点以下の無い整数は誤差なく表現できるだろう? 1.1とかは無理だけど
有効桁数を超えたら誤差が出るけど4桁程度じゃな
C#のoutの部分,C++/CLIではどう書くのでしょうか? int sinkCookie; connectionPoint.Advise( sink, out sinkCookie );
引数の宣言は[System::Runtime::InteropServices::OutAttribute] int% sinkCookie 使うときは何もいらない。普通に変数を指定すれば勝手に参照渡しになる。 ソース見ただけじゃ変数の値が変更される可能性があるかどうかわからないので可読性が下がる。
967 :
960 :2010/12/08(水) 11:00:04
IEEE754をよく見返してみました。 これ、固定小数点として整数部と小数部をそれぞれ2進変換した後 2進浮動小数点表現にするんですね。 だから整数をそのまま格納するときは誤差が出ない。 10進浮動小数点に変換してから2進変換すると誤解してました。 文字列で受けて判定すれば、doubleの内部表現を気にせず意図通りに動きそうですね。 可読性考えながら両方試してみます。 ありがとうございました。
>>966 [System::Runtime::InteropServices::OutAttribute] int% sinkCookie;
connectionPoint->Advise( sink, sinkCookie );
でよろしいでしょうか?さっそくやてみます
メモリリークとかメモリ破壊を検出するフリーのツールでいいのないすか
まずどのコンパイラを使ってるんだ
VC++
_CrtSetDbgFlag
>>973 100% なんて言ったら、そりゃダメに決まってんだろ。
>>973 人が作った物使う限り100%なんて無いと思うけど。
ソースをいじるタイプじゃなくて実行ファイルを設定して起動したら自動でレポートが出力されるような簡単なタイプの奴がいいんだけど
いちいち条件後出しすんなよ馬鹿
ごめんなさい許してくださいすいませんでした
まずは100%信頼される書き込みを目指せ
ごめんなさい許してください.すいませんでした
>>980 、下が目指した書き込みです
すいません、VC++でメモリリークとかメモリ破壊を検出するフリーのツールでいいのないすか
ソースをいじるタイプじゃなくて実行ファイルを設定して起動したら
自動でレポートが出力されるような簡単なタイプの奴がいいんだけど
そんなツールねーよ
VC++++++++++++++++++++++++++はもともとデバッグビルド時にはメモリリーク表示されるし AfxSetAllocStop関数とかスナップショットとか使えば任意に調べられるじゃないか^^
引数で、ある二つのインターフェースを持ってるものを指定する書き方はありますか? イメージ的にはfunc(<IA && IB> i)みたいな感じで
ない
C++ってjavaのthrowsみたいなのありますか?
ggr C++ "例外指定"
struct IC : IA, IB {}; func( IC& i ) で駄目なん?
いろいろな組み合わせに対応できないじゃない 言語レベルの穴だったようだな
このスレ住人は言語仕様にはうるさいがバグ解析は不得意みたいだな。メモリ破壊ならappverifier だろ。ダンプ読めないと辛いと思うが、ゆとりはダンプ読めないからなあ。ページヒープでググれ。
マルチディスパッチもしらんのか
>>990 >バグ解析は不得意
だってこのスレ住人はバグなんて恥ずかしいことしないから、解析なんてしたことがないんですよ
ですよね、みなさん
たしかに、ミスするやつはバカというやつが多いな。 熟練者ほどミスしない様な、ある意味助長な記述をするが。 ここの連中に言わせると、無駄でバカだそうだ。 ↓そらこいw
│ _、_ │ ヽ( ,_ノ`)ノ 残念、それは私のおいなりさんだ │ へノ / └→ ω へノ
996 :
デフォルトの名無しさん :2010/12/09(木) 00:30:09
ワラタ
冗長を助長とか書くのは確かに馬鹿だな
998 :
デフォルトの名無しさん :2010/12/09(木) 00:40:06
冗長って難しい言葉使わないでよ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。