C++相談室 part63
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/07/26(土) 02:51:09ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part62
http://pc11.2ch.net/test/read.cgi/tech/1211900039/
0002デフォルトの名無しさん
2008/07/26(土) 02:51:39[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない)
[禿 Stroustrup]
http://public.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?&RKKNP_vJISJISNO=X3014
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0003デフォルトの名無しさん
2008/07/26(土) 02:52:11Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0004デフォルトの名無しさん
2008/07/26(土) 02:52:35[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache STDCXX http://incubator.apache.org/stdcxx/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
(日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0005デフォルトの名無しさん
2008/07/26(土) 02:52:59環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0006デフォルトの名無しさん
2008/07/26(土) 04:52:270007デフォルトの名無しさん
2008/07/26(土) 05:59:45うむごくろう。
0008デフォルトの名無しさん
2008/07/26(土) 06:32:26通常、
extern int i;
のようにすると、それは宣言と見なされてインスタンスは作成されませんよね。
ところが
extern int i = 1;
のように書くと、インスタンスが作成され1で初期化されます。
ということで、externが付いても初期化がされているものは、externが
無視されるのだろうと、かってに自分を納得させていました。ところが
int i;
extern int i = 1;
という定義の重複と思われるコードをコンパイルしてみると、エラーは出ず
実行したらiが1で初期化されていました。はて?と思い、今度は前後を変えて
extern int i = 1;
int i;
でコンパイルしてみると、iの再定義ということでコンパイルエラーになりました。
これらの現象から帰納すると、どういうことになるんでしょうか。
単にコンパイラがおかしいのでしょうか。ちなみにVC++ 2008 Expressです。
0009デフォルトの名無しさん
2008/07/26(土) 07:50:16> Apache STDCXX http://incubator.apache.org/stdcxx/
301 Moved Permanently になってた。
次スレで↓に入れ替えおねがい。
Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
0010デフォルトの名無しさん
2008/07/26(土) 08:14:28C だと int i; が仮定義 (tentative definition) とかいう扱いになって、
コンパイル〜リンクできるはず。
C++ だと、 extern が付いてない int i; も、初期化子が付いてる extern int i = 1; も
両方とも(仮ではない)定義とみなされる(規格の 3.1 Declarations and definitions p2 )ので、
定義が重複していることになり、 ODR 違反で未定義動作になる。(規格の 3.2 One definition rule )
g++ 3.4.4 では、並べて書くと redefinition of `int i' というエラーになった。別々の
ファイルに分けて書けばリンクエラーになると思う。 VC は、 C と同じ動作になってる
・・・と思ったけど順番変えてエラーになるのは意味が分からんな。
まぁ未定義動作なんてこんなもんだろ。
0011デフォルトの名無しさん
2008/07/26(土) 08:53:02ありがとうございます。
なんかコンパイラのクセみたいな感じですかね。
そんなことで悩むのはこれまでとします。
0012デフォルトの名無しさん
2008/07/26(土) 11:45:290013デフォルトの名無しさん
2008/07/26(土) 12:47:58#include <iostream>
using namespace std;
int main()
{
int num;
int sum = num
cout << "整数を入力してください\n";
cin >> num;
if (num == 偶数) {
cout << "偶数です\n";
}
else if (num == 奇数) {
cout << "奇数です\n";
}
return 0;
}
0014デフォルトの名無しさん
2008/07/26(土) 12:50:24num % 2 == 0
num % 2 == 1
0015デフォルトの名無しさん
2008/07/26(土) 12:50:29剰余でぐぐれ
0016デフォルトの名無しさん
2008/07/26(土) 12:50:59ありがとうございます
0017デフォルトの名無しさん
2008/07/26(土) 12:51:022で割り切れたら偶数、割り切れなかったら奇数だ。
0018デフォルトの名無しさん
2008/07/26(土) 12:51:39修行に出てきます。
0019デフォルトの名無しさん
2008/07/26(土) 12:56:03奇数
else
偶数
情報処理の基礎的にはこっちじゃない?
0020デフォルトの名無しさん
2008/07/26(土) 12:58:44自分はこういう風にコードを書いてみました。
#include <iostream>
using namespace std;
int main()
{
int num;
cout << "整数を入力してください\n";
cin >> num;
if (num % 2 == 0) {
cout << "偶数です\n";
}
if (num % 2 != 0) {
cout << "奇数です\n";
}
return 0;
}
0021デフォルトの名無しさん
2008/07/26(土) 13:12:580022デフォルトの名無しさん
2008/07/26(土) 13:16:32if {cout << "奇数です\n";}
0023デフォルトの名無しさん
2008/07/26(土) 13:19:420024デフォルトの名無しさん
2008/07/26(土) 13:43:04はい、試みてます。
0025デフォルトの名無しさん
2008/07/26(土) 13:43:48else {cout << "奇数です\n";}
連投すいません;;
0026デフォルトの名無しさん
2008/07/26(土) 13:44:46お疲れ様でした
0027デフォルトの名無しさん
2008/07/26(土) 13:47:03定義に遡って定義どおりに書くだけだ。
cout << (num % 2 == 0) ? "偶数" : "奇数";
ビット演算を持ち出す必要は全くないな。
0028デフォルトの名無しさん
2008/07/26(土) 13:48:560029デフォルトの名無しさん
2008/07/26(土) 13:54:060030デフォルトの名無しさん
2008/07/26(土) 13:56:35最適化ありでアセンブラ見比べてみ。
0031デフォルトの名無しさん
2008/07/26(土) 13:57:100032デフォルトの名無しさん
2008/07/26(土) 13:58:41わざわざビット演算で書いてわかりにくくする必要はない
本当に "num % 2" が割り算を発生させていて、
かつその部分のコードが実行速度のボトルネックになってない限り
ビット演算を使う必要はないんじゃないの
(premature optimization ってやつだ)
0033デフォルトの名無しさん
2008/07/26(土) 14:08:42if( num % 2 )
だけならともかく”==0”が付くことで式が増えて解釈が二度手間になる。
0034デフォルトの名無しさん
2008/07/26(土) 14:12:10if ( num % 2 )
{ /*奇数*/ }
else
{ /*偶数*/ }
0035デフォルトの名無しさん
2008/07/26(土) 14:35:220036デフォルトの名無しさん
2008/07/26(土) 14:36:580037デフォルトの名無しさん
2008/07/26(土) 14:46:02反省と言っては何ですが、30分間冷房を28度にします。常時19度・風速急
0038デフォルトの名無しさん
2008/07/26(土) 14:48:360039デフォルトの名無しさん
2008/07/26(土) 17:43:360040デフォルトの名無しさん
2008/07/26(土) 17:46:54gets()はEOFが入ったらnull文字に置き換えるのですよね?
char strBuff[256];
printf("文字を入力して下さい。(Ctrl+Zで終了)\n");
gets(strBuff);
if(strBuff[0] != '\n'){
printf("%s\n", strBuff);
}else{
printf("Ctrl+Zが認識されました。\n");
}
これを実行するとCtrl+Zを押しても認識してくれないのですが、どのような判定式にすればいいのでしょうか
0041デフォルトの名無しさん
2008/07/26(土) 17:51:28ほんとに問題文にそう書いてあんのか?
0042デフォルトの名無しさん
2008/07/26(土) 17:53:28問題文には、
○入力は、gets関数を使うこと
○CTRL+Zで入力を終了し、処理をすること
とありました。
もしかしてgetsではCTRL+Zを判別することは出来ないのですか?
0043デフォルトの名無しさん
2008/07/26(土) 18:02:34#include <stdio.h>
int main(void){
char c[256];
printf(">");
gets(c);
//fgets(c,256,stdin);
printf("%s",c);
return 0;
}
name>gcc t.c
/tmp/cc4hr3hR.o: In function `main':
t.c:(.text+0x1d): warning: the `gets' function is dangerous and should not be used.
name>./a.out
>(ctrl+z)
中断
name>fg
./a.out
a
a
name>
c++じゃないけど。
ctrl+zの制御って、結構深いところまで潜らないと奪えなかったりしないのかなぁ、知らない。
0044デフォルトの名無しさん
2008/07/26(土) 18:03:44これで一応いいんじゃないかな
gets()でCtrl+Zはもとの文字列に何もしないということなので、
int main()
{
char strBuff[256] = "";
printf("文字を入力して下さい。(Ctrl+Zで終了)\n");
gets(strBuff);
if(strBuff[0] != '\n' && strBuff[0] != '\0' ){
printf("%s\n", strBuff);
}else{
printf("Ctrl+Zが認識されました。\n");
}
return 0;
}
0045デフォルトの名無しさん
2008/07/26(土) 18:21:25おまけにCtrlZなんて環境依存な入力を要求する辺り、出題者の非学非才が窺える。
0046デフォルトの名無しさん
2008/07/26(土) 18:22:09ありがとうございます、なんとか出来そうです。
もとの文字列に手を加えないのですね。そして初期化してなかったから出来なかったと・・・
0047デフォルトの名無しさん
2008/07/26(土) 18:26:33まぁ初心者だったころの気持ちを忘れてるんだろうね
学ばせる順番からいったら最初はgetsがでてきても不思議ではない
おまじないとしてfgetsを使うように言えと?w
0048デフォルトの名無しさん
2008/07/26(土) 18:30:190049デフォルトの名無しさん
2008/07/26(土) 18:31:540050デフォルトの名無しさん
2008/07/26(土) 22:11:09template<std::size_t n>
inline char* gets(char (&buf)[n])
{
return fgets(buf, n, stdin);
}
ここまで書いてMSDNライブラリ見たら、
VC++には本当にこういうプロトタイプのgetsがあるらしいと知った。
>>40-44
getsもfgetsもEOF入れたら戻り値はヌルだから、それで判定すればいい。
0051デフォルトの名無しさん
2008/07/26(土) 22:13:370052デフォルトの名無しさん
2008/07/26(土) 22:21:560053デフォルトの名無しさん
2008/07/26(土) 23:33:160054デフォルトの名無しさん
2008/07/26(土) 23:38:370055デフォルトの名無しさん
2008/07/26(土) 23:54:35○使えない
0056デフォルトの名無しさん
2008/07/27(日) 00:07:220057デフォルトの名無しさん
2008/07/27(日) 00:14:050058デフォルトの名無しさん
2008/07/27(日) 00:16:230059デフォルトの名無しさん
2008/07/27(日) 00:17:430060デフォルトの名無しさん
2008/07/27(日) 00:18:49006160
2008/07/27(日) 00:19:50もう寝る。
0062デフォルトの名無しさん
2008/07/27(日) 02:07:110063デフォルトの名無しさん
2008/07/27(日) 06:17:44あって、それと言語仕様の微妙なからくりを使って、なにやらを実現してる
ようですが、結局constなauto_ptrオブジェクトの所有権を変更できないように
するためのものなんでしょうか?
このからくりを説明できる物好きで暇な人いますか?
0064デフォルトの名無しさん
2008/07/27(日) 07:22:58auto_ptrを関数の戻り地の型にしたいだろ?
でも関数の戻り値はrvalueだから、普通にauto_ptrを実装したのでは、所有権を移せない。
かといって、コンストラクタでconstなauto_ptrをコピーするようにした場合、auto_ptrの意味がなくなってしまう。
どうにかならんかってんで、「言語仕様の微妙なからくり」を使っているわけだ。
Move Semanticsがあらまほしけれ。
0065デフォルトの名無しさん
2008/07/27(日) 11:46:07auto_ptr(auto_ptr<T>& o)のコンストラクタに
一時オブジェクト(戻り値)を渡せないため。
渡せない理由は多分このへん。
http://q.hatena.ne.jp/1167111891
006663
2008/07/27(日) 12:50:45どうやって問題を解決しているのか、そのからくりを誰か語り倒してもらえませんか。
006763
2008/07/27(日) 12:52:59006863
2008/07/27(日) 13:05:23話をコピーコンストラクタに集中するとします。たいていはstd名前空間に次のように
定義されているようです。
template<class Y> struct auto_ptr_ref{
Y* yp;
auto_ptr_ref(Y* rhs):yp(rhs){}
};
template<class T> class auto_ptr{
T* ap;
public:
//コンストラクタ
auto_ptr(auto_ptr& rhs):ap(rhs.release()){}
auto_ptr(auto_ptr_ref<T> rhs):ap(rhs.yp){}
//型変換演算子
template<class Y> operator auto_ptr_ref<Y>(){
return auto_ptr_ref<Y>(release());
}
template<class Y> operator auto_ptr<Y>(){
return auto_ptr<Y>(release());
}
//...他メンバ省略
};
こんな感じのようです。型変換演算子も駆使してるようですが、わけわかめです。
006963
2008/07/27(日) 13:22:43007063
2008/07/27(日) 13:38:121.auto_ptr(auto_ptr_ref<T> rhs)がコールされ
2.operator auto_ptr_ref<T>()により、実引数の右辺値であるauto_ptr<T>オブジェクトが
動的資源の所有権を失い、変わりにその動的資源へのポインタを持った
auto_ptr_ref<T>型に変換され1.の仮引数となる
3.仮引数のauto_ptr_ref<T>オブジェクトがメンバとしてもってるポインタypで
*thisオブジェクトのメンバapを初期化
こんな感じかな?
0071デフォルトの名無しさん
2008/07/27(日) 13:39:26クラス挟んでるだけじゃない?
0072デフォルトの名無しさん
2008/07/27(日) 13:54:05これがないと全く無意味になる。
007363
2008/07/27(日) 13:56:240074デフォルトの名無しさん
2008/07/27(日) 13:57:31007563
2008/07/27(日) 14:00:12explicit付けても付けなくてもどっちでもいいやって感じ?
0076デフォルトの名無しさん
2008/07/27(日) 17:07:090077デフォルトの名無しさん
2008/07/27(日) 17:08:58ifstreamでファイルを開いて、read関数でchar*型のバッファにコピーして、
char*型のバッファをstringのコンストラクタに渡す方法でとりあえず書きましたが、
ifstream→char*型のバッファ→stringと2回コピーが発生して効率悪そうです。
0078デフォルトの名無しさん
2008/07/27(日) 17:12:40std::ifstream ifs;
std::string str;
getline(ifs, str);
0079デフォルトの名無しさん
2008/07/27(日) 17:20:02C++相談室 part61 http://www.bookshelf.jp/2ch/tech/1205059063.html
にauto_ptr_refの話や、part60の487-489のような
auto_ptr_refの仕組みを利用したMove Semantics的な実装の話が出てる
0080デフォルトの名無しさん
2008/07/27(日) 17:23:16thx
0081デフォルトの名無しさん
2008/07/27(日) 18:03:09全ての行に対して何かの処理f()をするとき
while (1) {
getline(ifs, str);
if (ifs.eof() || !ifs()) break;
f(str);
};
と書いてたんだが、もっといい書き方ってない?
(for_eachとか iterator使うのとは別の観点で)
if文を真ん中に入れてbreakするのがどうもダサく見えてしまう
eof以外にエラー判定もしておかないと、無限ループになることがある
あと、改行の無い巨大ファイルを読んだときは、
std::bad_allocが投げられるのかな?
その場合 try catch で囲っておけば、抜けた後 strのメモリは開放されて、
普通に処理を続行できる?
例えば、「ファイルが不正です」と表示してメインループに戻るとか
0082デフォルトの名無しさん
2008/07/27(日) 18:07:33ほげほげ
}
0083デフォルトの名無しさん
2008/07/27(日) 22:44:53ちなみに、改行なし巨大ファイルを読んだら例外出さずに抜けました
0084デフォルトの名無しさん
2008/07/27(日) 23:46:320085デフォルトの名無しさん
2008/07/28(月) 00:55:49VC++コンパイラは、非const参照型で一時オブジェクト受け取れちゃうんだね。
VC++ってウンコ?とも思ったけど、C++0xでも受け取れるようになるとかって
本当なのかね?
参照で受け取っても、一時オブジェクトだけに、すぐ消えちゃうんじゃないのかな。
0086デフォルトの名無しさん
2008/07/28(月) 01:10:26「プロジェクト」→「〜のプロパティ」→「構成プロパティ」
→「C/C++」→「言語」→「言語拡張を無効にする」
0087デフォルトの名無しさん
2008/07/28(月) 01:11:07新しい構文になるみたいだから従来の参照と混同はせんだろう
特別使いたい場合にだけ注意して使うようにしてればいいんじゃないか
0088デフォルトの名無しさん
2008/07/28(月) 01:48:00標準がいいよ。
0089デフォルトの名無しさん
2008/07/28(月) 12:10:560090デフォルトの名無しさん
2008/07/28(月) 12:34:290091デフォルトの名無しさん
2008/07/28(月) 18:35:43http://pc11.2ch.net/test/read.cgi/prog/1217229421/
0092デフォルトの名無しさん
2008/07/29(火) 01:40:00テンプレートコピーコンストラクタなるものを試してみたのですが。
コンパイラは「コンパイルされたクラスの テンプレート のインスタンス化
'C<T>::C<int>(const C<int> &)' の参照を確認してください」
と言ってきます。
template<class T>
class C{
T m;
public:
C(T _m = T()):m(_m){}
template<class Otr>
C(const C<Otr> &c){ m = c.m; }
};
int main()
{
C<int> Ci;
C<double> Cd(Ci); // ……※
}
0093デフォルトの名無しさん
2008/07/29(火) 02:04:02コンパイラ何?
gcc 3.4 だとこうなる。
> : In constructor `C<T>::C(const C<Otr>&) [with Otr = int, T = double]':
> :13: instantiated from here
> :3: error: `int C<int>::m' is private
> :7: error: within this context
んで m を public にしたら通る。
0094デフォルトの名無しさん
2008/07/29(火) 02:13:23コンパイラはVC++2008です。
確かにmがパブリックなら通りますね。
もしかして、テンプレートメンバ関数って、privateなメンバにアクセスできない
ということですかね…なんじゃそら
0095デフォルトの名無しさん
2008/07/29(火) 02:14:230096デフォルトの名無しさん
2008/07/29(火) 02:17:12C<int>とC<double>はまったく別の型だから、privateなメンバを相互参照
できませんね!
0097デフォルトの名無しさん
2008/07/29(火) 02:17:35エラーメッセージそれだけじゃないだろ。
0098デフォルトの名無しさん
2008/07/29(火) 02:23:040099デフォルトの名無しさん
2008/07/29(火) 15:09:44環境はVC 6.0 、OS : Xp です
メンバ関数ポインタについてですが(ソースコードは次のレスで書きます)
main関数内のメンバ関数ポインタ(CSample::*pFunc)から呼び出す(�@)
メンバ関数(CSample::func1)から、メンバ変数であるメンバ関数ポインタ(CSample::*mpFunc)を使って呼び出す(�A)
はできるのですが、
main関数内で、メンバ関数ポインタ(CSample::*mpFunc)を使って呼び出す(�B)
がいろいろ試してみましたができません
そういうことはできないのでしょうか
0100>>99
2008/07/29(火) 15:10:51using namespace std;
class CSample
{
public:
void func(){cout << "CSample::func()" << endl;};
void (CSample::*mpFunc)();
CSample(){mpFunc = func;};
void func1(){(this->*mpFunc)();}
};
int main()
{
void (CSample::*pFunc)() = &CSample::func;
CSample obj;
(obj.*pFunc)(); // �@
obj.func1(); // �A
(obj.*mpFunc)(); // �B
return 0;
}
0101デフォルトの名無しさん
2008/07/29(火) 17:55:24ostringstreamというのは関数の戻り値には指定できないのでしょうか?
ostringstream function();
こういったシグニチャのメソッドを作成したかったのですが、
どうも出来ないようで…。
不可能であるなら、その理由も教えて頂けると助かります。
よろしくお願いします。
0102デフォルトの名無しさん
2008/07/29(火) 17:56:57int m;
};
とあった場合、
&X::mと&(X::m)は同じ意味?それとも別の意味?それともどちらかは無意味?
0103デフォルトの名無しさん
2008/07/29(火) 18:07:220104デフォルトの名無しさん
2008/07/29(火) 18:08:02::名前空間を解決することしかしないので、前者と後者は同じ意味になる。
括弧をつけることに意味を見出せないとすれば、後者は無意味。
0105デフォルトの名無しさん
2008/07/29(火) 18:16:48ostringstreamはコピーできないのでエラーになる。
とりあえずはnewしてポインタでも返すようにすればいい。
ちなみに、将来的には中身を移し替える手法で戻り値にできるようになる。
C++0xに乞う御期待。
0106デフォルトの名無しさん
2008/07/29(火) 18:28:18#include <memory>
stdd::auto_ptr<ostringstream> function(); にしなさい。
0107デフォルトの名無しさん
2008/07/29(火) 18:30:01○ std::
0108デフォルトの名無しさん
2008/07/29(火) 18:31:31ありがとうございます。
0109デフォルトの名無しさん
2008/07/29(火) 21:11:01(obj.*obj.mpFunc)();
0110デフォルトの名無しさん
2008/07/29(火) 21:54:2499じゃないけどやっぱりobj2個いるのか。
0111デフォルトの名無しさん
2008/07/29(火) 22:27:520112デフォルトの名無しさん
2008/07/29(火) 22:51:03次にそのポインタをインスタンスにマッチングするのにもう一個。
0113>>99
2008/07/29(火) 22:51:32ありがとうございます
助かりました
できれば理屈も教えていただけるとありがたいのですが、一応
0114>>113
2008/07/29(火) 22:52:33ニアミスでした
ありがとうございました
0115デフォルトの名無しさん
2008/07/29(火) 23:40:010116デフォルトの名無しさん
2008/07/29(火) 23:47:13何故かVC6ではエラー出なかった
0117デフォルトの名無しさん
2008/07/30(水) 00:31:20コンパイラはBCC5.9.3です
エラーは
エラー E2235 member1.cpp 21: メンバー関数は呼び出すかそのアドレスをとらなければならない(関数 CSample::CSample() )
と出ます
0118デフォルトの名無しさん
2008/07/30(水) 00:57:580119デフォルトの名無しさん
2008/07/30(水) 01:32:05�d
0120デフォルトの名無しさん
2008/07/30(水) 23:04:01あなたはC++の発明者? それとも創造者?〜Bjarne Stroustrup氏との対話〜
http://codezine.jp/a/article/aid/2834.aspx
0121デフォルトの名無しさん
2008/07/30(水) 23:20:140122デフォルトの名無しさん
2008/07/31(木) 01:37:12○超一流
0123デフォルトの名無しさん
2008/07/31(木) 01:38:350124デフォルトの名無しさん
2008/07/31(木) 01:58:19その前にまずC++0xが決まらんと
0125デフォルトの名無しさん
2008/07/31(木) 12:37:580126デフォルトの名無しさん
2008/07/31(木) 13:14:46コメントにもあるけど、引用された英文の邦訳が筆者の認識混じりの意訳になってるな。
あやうく見落とすところだった。
元の英文は、メールでのやりとりなのかな?
0127デフォルトの名無しさん
2008/08/01(金) 14:34:01トップページからX3014を検索して開いたのですが、「ダウンロードしての閲覧は禁止されています。」というエラーが出て見ることができません。
どうすれば見れますか?
0128デフォルトの名無しさん
2008/08/01(金) 14:37:520129デフォルトの名無しさん
2008/08/01(金) 14:58:07リンクを左クリックしただけです。
ダウンロードしないで閲覧する方法がわかりません。
0130デフォルトの名無しさん
2008/08/01(金) 15:03:29http://www.jisc.go.jp/app/pager?id=62935
これならどうよ。
トップページから検索したら行き着いたぜ。
0131デフォルトの名無しさん
2008/08/01(金) 15:06:40ファイルが見つかりません。
File not found.
って出ます。
0132デフォルトの名無しさん
2008/08/01(金) 15:10:530133デフォルトの名無しさん
2008/08/01(金) 15:19:49直接アクセス禁止か、クッキーか何かによる制限をしてるのかもしれない。
一度、トップページへ行って検索してみては?
0134デフォルトの名無しさん
2008/08/01(金) 15:22:47Adobe Readerのバージョンが古くて読み込めないのかもしれないね。
0135デフォルトの名無しさん
2008/08/01(金) 15:26:10インストールしたら見れるようになりました。
バージョンが古かったのかもしれません。
お騒がせしましたorz
0136デフォルトの名無しさん
2008/08/01(金) 22:21:49ダウンロードのダイアログが出てうわ何をするくぁswdfgh
0137デフォルトの名無しさん
2008/08/02(土) 09:17:19||≡3
0138デフォルトの名無しさん
2008/08/02(土) 15:04:59つまり、staticつけなくても外部リンケージはもともと持ってないってことでOK?
0139デフォルトの名無しさん
2008/08/02(土) 15:12:59staticがついてなきゃ外部から参照できるんじゃね?
0140デフォルトの名無しさん
2008/08/02(土) 15:57:27名前空間スコープで const 付きのオブジェクトはデフォルトで内部リンケージ。
これは C++ と C との違いのひとつ。
0141デフォルトの名無しさん
2008/08/02(土) 16:06:560142デフォルトの名無しさん
2008/08/02(土) 16:20:380143デフォルトの名無しさん
2008/08/02(土) 16:37:54グローバルスコープも何らかの名前空間の1つとして分類されるのかなと。
でも無名名前空間もあるし、どういう位置づけなんだろ。
0144デフォルトの名無しさん
2008/08/02(土) 17:07:35「グローバル名前空間」ってことになってる。
3.3.5p6 より
"The outermost declarative region of a translation unit is also a namespace, called the global namespace.
A name declared in the global namespace has global namespace scope (also called global scope)."
0145デフォルトの名無しさん
2008/08/02(土) 17:15:47しらんかった。勉強になった。
知らなくても困らんけどw
0146デフォルトの名無しさん
2008/08/02(土) 17:21:100147デフォルトの名無しさん
2008/08/02(土) 17:26:28vint.push_back( 1 );
int *p = vint[0]; //1のアドレス
vint.push_back( 2 );
vint.push_back( 3 );
・・・
とvintに追加していったとき、pのアドレスは正しいアドレスを保持
できるんでしょうか? 出来なさそうではあるけど・・
0148デフォルトの名無しさん
2008/08/02(土) 17:29:07正解
0149デフォルトの名無しさん
2008/08/02(土) 18:00:48おお、サンクス
0150デフォルトの名無しさん
2008/08/02(土) 18:01:20reserveしとけば? 推奨はしないけど。
0151デフォルトの名無しさん
2008/08/02(土) 18:11:19グローバルのconstオブジェクトが外部リンケージ持たないのと
ODR違反ってどう関係あるんだ?
0153デフォルトの名無しさん
2008/08/02(土) 18:37:59正解。
0154デフォルトの名無しさん
2008/08/02(土) 18:42:17>int *p = vint[0]; //1のアドレス
これ、アドレスじゃなくて、要素の値を代入しちゃってる
0155デフォルトの名無しさん
2008/08/02(土) 18:58:26問題はそこじゃねーよ。
0156デフォルトの名無しさん
2008/08/02(土) 19:09:55,r´⌒ヽ,⌒ヽ,ヽ
(⌒)、 .人 λ\、 ._____
\. \ 、 ヽ./ ー ー\
|\ \ ヽ./ ( ●) ( ●)
| \ \ / (__人__) \ はい、どーもすみませんでした
|. \ | ` ⌒´ |
. |. |.\_ノ\ /
. |. | | \______/
. | ) .| . . ̄ ̄
. | | .|
| |.| .|
. | | .| .|
/ / / ヽ,
(__ノ ヽ、__つ
0157デフォルトの名無しさん
2008/08/03(日) 10:27:47「確実じゃない」というのがどの範囲まで指した言葉なのかによりますけれど,
コンテナ内への参照が無効化されるのを reserve で阻止するのは
きちんと扱うならば規格の保証の範囲内ですよ
0158デフォルトの名無しさん
2008/08/03(日) 12:50:22void main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
std::string str("tekito");
str.append("namojiretu");
exit(-1);
}
上記のコードがメモリリークになるのですが、どうやって解決すればいいのでしょうか?
eraseやclearを使っても解決できません。
また条件が特定できなかったので明記しませんが、使う場所によっては文字列中に改行文字があったときだけ
メモリリークするような現象も起こりました。
解説よろしくお願いします
0159デフォルトの名無しさん
2008/08/03(日) 12:57:230160デフォルトの名無しさん
2008/08/03(日) 13:08:51こんなんとか。
http://msdn.microsoft.com/ja-jp/library/8bsz08tx.aspx
_CRTDBG_MAP_ALLOC 定義した状態の出力を見れば、もう少し情報が増えるかもね。
0161デフォルトの名無しさん
2008/08/03(日) 13:09:200162デフォルトの名無しさん
2008/08/03(日) 13:11:31むしろ、int mainにしてreturnして下さい。
0163デフォルトの名無しさん
2008/08/03(日) 13:12:24strはスコープを抜けてないのでデストラクタが走らない。
0164デフォルトの名無しさん
2008/08/03(日) 13:14:03>Visual Studio .NET 以前のバージョンの標準テンプレート ライブラリは _CrtDumpMemoryLeaks が誤検出を報告する原因となっていましたが、最新リリースでは修正されています。
これ今現在は大丈夫ということなんじゃないんですか?
ちなみに使っているのはVS2005です。
0165デフォルトの名無しさん
2008/08/03(日) 13:17:40>>163
そうするしかないのかー
サブ関数とかで階層が深くなってるとmainまで戻してくのが面倒だったのでexit使ってたんですが…
うーん、直すしかないのか
0166デフォルトの名無しさん
2008/08/03(日) 13:27:49main関数でcatchすること前提にすればギリギリ有りな気が。
struct exit_class{};
void exit_cpp(){
throw exit_class();
}
0167デフォルトの名無しさん
2008/08/03(日) 13:30:48すんません、アホでした
例外投げるという方法をすっかり忘れていました
ありがとうございました
0168デフォルトの名無しさん
2008/08/03(日) 15:18:40組込みじゃないんだから、プログラム終了時のメモリリークなんてOSがなんとかしてくれるさー
0169デフォルトの名無しさん
2008/08/03(日) 15:21:070170デフォルトの名無しさん
2008/08/03(日) 15:44:26それはプログラミングの怠慢だろ
スパゲティ風味がするぞ
0171デフォルトの名無しさん
2008/08/03(日) 16:30:16vector:ベクトル?ベクタ?
deque:デック?ディーク?デキュー?
0172デフォルトの名無しさん
2008/08/03(日) 16:33:45俺のスパゲティはおいしいんだい!
リソース解放はatexit()で解放ルーチン登録してるからいいもん!
>>171
ベクターとデキューって心の中で発音してます。
0173デフォルトの名無しさん
2008/08/03(日) 16:37:38俺はデキューと読んでいるが、確かデックが正しい発音のハズ。
0174デフォルトの名無しさん
2008/08/03(日) 16:41:22プロフィールを詐称
「有限会社やねう企画 代表取締役」
だが、有限会社やねう企画は既に倒産している。
http://www.sia.go.jp/~osaka/zenso/19.09.pdf
また、このやねう企画代表者やねうらお
(本名・磯崎元洋 所在地・大阪府八尾市末広町2−1−2)は
1.労働契約上の不正行為を行っていた
2.他社製ソフトウェアの不正コピーを行っていた
3.不正コピーしていないことを証明しようとしてエロゲーのパッケージを発見し、
写真に撮ってアップロードしようとした。
http://d.hatena.ne.jp/pmoky/19000106
やねう企画の裏側(競馬の詐欺ソフトの製作現場)
http://d.hatena.ne.jp/pmoky/20060510
http://d.hatena.ne.jp/pmoky/20060511
http://d.hatena.ne.jp/pmoky/20060512
0175デフォルトの名無しさん
2008/08/03(日) 17:47:53それもう飽きた。
>>172
exit()を使いたいがために登録し捲くるの?
個数制限もあるのに?
0176デフォルトの名無しさん
2008/08/03(日) 18:21:38}
catch(...){
}
これ最強じゃね?
0177デフォルトの名無しさん
2008/08/03(日) 18:45:18弓月さん!!コピペなら俺も協力させてもらいますよ!!!
【自作自演】弓月城太郎氏に関するまとめ【神秘体験】
http://d.hatena.ne.jp/yaneurao/20080619
0178デフォルトの名無しさん
2008/08/03(日) 19:12:04Windowsなら。
0179デフォルトの名無しさん
2008/08/03(日) 19:15:25しかしデストラクタが走らないので、
例えばデストラクタでファイルへの書き込みを行うだとか、
そういうことをしているとまずい。
0180デフォルトの名無しさん
2008/08/03(日) 19:40:52やってくれんでしょ?
0181デフォルトの名無しさん
2008/08/03(日) 19:49:38……
void write_all_data(void);
void clear_all_resources(void);
~hoge(void);
}
hoge::~hoge(void){
write_all_data();
clear_all_resources();
}
こういう形だとまずいってことじゃないの?
0182デフォルトの名無しさん
2008/08/03(日) 19:50:40まあ俺がそんなにファイルとか扱うプログラムを書かないだけだったりするけどな。
>>180
>>179が言っているように、デストラクタ内でログの書きだしとか、ロックファイルの削除とか、
そういった処理を行うとするなら
デストラクタの呼び出しを伴わない終わり方(exitとかSIGKILL)をすると
いろいろと面倒だよねって話。
うーん、exit派なんだけど、ちょっと心が揺らいできた。
throwしよっかな。
でもめんどくさいw
0183デフォルトの名無しさん
2008/08/03(日) 20:19:12悪いことは言わん、exit も throw もやめとけ。
どちらもあくまで緊急脱出手段だ。
0184デフォルトの名無しさん
2008/08/03(日) 20:29:180185デフォルトの名無しさん
2008/08/03(日) 20:43:10他にどのような利用をするのですか?
0186デフォルトの名無しさん
2008/08/03(日) 20:57:12>>181
0187デフォルトの名無しさん
2008/08/03(日) 21:08:54入出力チャンネルって何?
ハンドルなら自動的にクローズされるけど
0188デフォルトの名無しさん
2008/08/03(日) 21:17:28プロセスを越えるリソースが開きっぱなしでリークするな。
他にもメモリキャッシュ実装しててflushされないとか、
キャッシュファイルが削除されないとか、
Excelみたいなファイル内に共有ロック情報書いてる場合にアンロックされないとか
リソースリーク/終了処理が正常に行われないケースは山ほどある。
0189デフォルトの名無しさん
2008/08/03(日) 21:36:07どのプロセスがどのnamed pipeを開いているかぐらい余裕で把握している。
すべてのプロセスが解放したら消させる。
フックも把握していないといずれ面倒なことになる。
それにVistaからは、フック関数側のCallNextHookEx呼び出しに頼らず、
Windows側がひとつひとつ呼んでいるってのをどこかで呼んだ気がするが。
0190デフォルトの名無しさん
2008/08/03(日) 21:37:41そんなプログラムを書く奴は人に信用されない
無学に見られるから止めておくほうがよろし
0191デフォルトの名無しさん
2008/08/03(日) 21:39:43言いたいことはよくわかるが
exit なんぞ平気で使う奴には通じない話だ
0192デフォルトの名無しさん
2008/08/03(日) 21:47:35作成者が注意力を発揮すれば exit 使う正しいプログラムは書けるが
ちょっとした改造の度にそんなところに注意力を使わなければならない時点で
稚拙な設計だ
優秀なプログラムは、無駄なバグ混入リスクを取らないよう書かれている
で、ホントに必要なときに限りテクを使う
0193デフォルトの名無しさん
2008/08/03(日) 21:55:560194デフォルトの名無しさん
2008/08/03(日) 21:58:060195デフォルトの名無しさん
2008/08/03(日) 21:59:40他の方法ではまともに例外安全なコードが書けない
0196デフォルトの名無しさん
2008/08/03(日) 22:00:26んじゃ教えてくれ。
リソースの解放でエラーが発生したら、一体どうすりゃええんだ。
0197デフォルトの名無しさん
2008/08/03(日) 22:01:00ttp://www.geocities.jp/menopem/
こちらのDirectXウィンドウ化ツールで使用する補助DLLとして、
「窓化起動したアプリケーションを再びフルスクリーン化する」
というものを制作したいのですが、C++の経験が無いために苦しんでいます。
補助DLLの仕様についてはツール内にtxtで含まれているのですが・・・。
用途としてはどうしても色化けしてしまう古い(256色専用)ゲームをパレットエミュレートで正常に動かすことが目的なのですが、
窓化した場合、窓の描画領域の0.0をディスプレイの0.0に合わせないと、画面描画や文字描画がその分ずれてしまう現象に見舞われてしまったので、その簡易な修正のためです。
問題のゲームは下のデザートタイム夢幻の迷宮とファントムナイト夢幻の迷宮�Uです。
ttp://www.parsley.gr.jp/ps_top1.html (リンク先18禁)
0198デフォルトの名無しさん
2008/08/03(日) 22:02:08一応書いてみたコード。ウィンドウハンドルとか判りませんorz
#include <windows.h>
#include <stdio.h>
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
static TCHAR processName[MAX_PATH];
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
GetModuleFileName(0, processName, MAX_PATH);
processName[MAX_PATH-1] = '\0';
OutputDebugString("補助DLLロード確認");
MessageBox(0, processName, "補助DLLロード確認", MB_OK);
SetWindowLong(HANDLE, GWL_STYLE, WS_POPUP | WS_MINIMIZEBOX | WS_VISIBLE);
SetMenu(HANDLE, NULL);
SetWindowPos(HANDLE, HWND_TOP, 0,0,1400,1052, SWP_FRAMECHANGED | SWP_NOCOPYBITS);
break;
case DLL_PROCESS_DETACH:
OutputDebugString("補助DLLアンロード確認");
MessageBox(0, processName, "補助DLLアンロード確認", MB_OK);
break;
}
return TRUE;
}
0199デフォルトの名無しさん
2008/08/03(日) 22:02:260200199
2008/08/03(日) 22:05:18ClientToScreen、GetWindowRectなど
0201デフォルトの名無しさん
2008/08/03(日) 22:08:04例外安全でエラー処理出来る方法を、世界中で多くの人が求めています。
教えてあげて下さい。
0202デフォルトの名無しさん
2008/08/03(日) 22:08:08ぜひkwsk
0203デフォルトの名無しさん
2008/08/03(日) 22:12:47releaseとかcloseのような名前の解放用メンバ関数を用意しておいて、
エラー処理が必要ならそれを明示的に呼び、要らなければデストラクタに任せるとかいう話を聞いたことがある。
0204デフォルトの名無しさん
2008/08/03(日) 22:15:44//RAIIなコード
void fn1(){
File fR;
File fW;
fR.open("read.txt");
fW.open("write.txt");
fn3(fR, fW);
}
//デストラクタに頼らずリソースを解放するコード
void fn2(){
File fR;
File fW;
fR.open("read.txt");
fW.open("write.txt");
try{ fn3(fR, fW); }
catch(...){
try{ if(fW.opend()){fW.close();} }
catch(...){
if(fR.opend()){fR.close();}
throw;
}
if(fR.opend()){fR.close();}
throw;
}
try{ if(fW.opend()){fW.close();} }
catch(...){
if(fR.opend()){fR.close();}
throw;
}
if(fR.opend()){fR.close();}
}
0205デフォルトの名無しさん
2008/08/03(日) 22:23:05GCよりよっぽど使えるわ
0206デフォルトの名無しさん
2008/08/03(日) 22:25:540207デフォルトの名無しさん
2008/08/03(日) 22:27:53サンクス。
0208デフォルトの名無しさん
2008/08/03(日) 22:28:310209デフォルトの名無しさん
2008/08/03(日) 22:30:36リソースのcloseに関してはjavaがもっともカス。
//java
void fn2(){
InputStream ist = new FileInputStream("a");
try{
OutputStream ost = new FileOutputStream("b");
try{
fn3(ist, ost);
}
finally{ try{ ost.close(); }catch(Throwable t){} } //(*1)
}
finally{ try{ ist.close(); }catch(Throwable t){} }
}
//(*1) catchで止めないとより重要なfn3内の例外が消される
//C#
void fn2(){
using(StreamReader r = new StreamReader("a"))
using(StreamWriter w = new StreamWriter("b"))
{
fn3(r, w);
}
}
0210デフォルトの名無しさん
2008/08/03(日) 22:31:32>ハンドルリークするから
しません。それただのバグ。
0211デフォルトの名無しさん
2008/08/03(日) 22:32:30解放処理が失敗してどうやって解放するの?
プロセスを終了してOSに任せるくらいしか俺には分からない。
もし、デストラクタが例外投げた場合の話であれば、そもそもそれが間違いだよな。
デストラクタは何があろうと例外を投げちゃまずいよ。
0212デフォルトの名無しさん
2008/08/03(日) 22:38:12C#,Javaだとリソースの解放マンドイよな
0213デフォルトの名無しさん
2008/08/03(日) 22:42:45> しません。それただのバグ。
失敗はするでしょ。
成功するまでループするの?
0214デフォルトの名無しさん
2008/08/03(日) 22:44:50しません、は「リークする」にかかってるんでしょ。
0215デフォルトの名無しさん
2008/08/03(日) 22:49:180216デフォルトの名無しさん
2008/08/03(日) 22:54:13もはやリークは避けられない運命としか
0217デフォルトの名無しさん
2008/08/03(日) 22:54:48>>208の人は「RAIIのほうは」って言ってるんだし、
解放失敗すればリークってのはRAII関係無いだろ。
脈絡の無いレスは止めておいた方がいい。
0218デフォルトの名無しさん
2008/08/03(日) 22:55:090219デフォルトの名無しさん
2008/08/03(日) 22:55:49では、RAIIを使用せずに開放メンバ関数を手動で呼べばリークしないんですね
0220デフォルトの名無しさん
2008/08/03(日) 22:56:36唐突過ぎて不覚にもワロタ
0221デフォルトの名無しさん
2008/08/03(日) 23:00:43アホは放置
0222デフォルトの名無しさん
2008/08/03(日) 23:08:24>>204って解放に失敗したらデストラクタから例外投げるよって意味じゃないの?
そうでなければ、
try{ fn3(fR, fW); } catch(...) { }
try{ if ( fW.opend() ) { fW.close(); } } catch (...) { }
try{ if ( fR.opend() ) { fR.close(); } } catch (...) { }
とかいう暴挙に出てもいいのかな。
0223デフォルトの名無しさん
2008/08/03(日) 23:16:18fn3の例外は潰したら駄目。
他はまぁアリかな。
0224デフォルトの名無しさん
2008/08/03(日) 23:31:12それとも、クライアントプログラムでもサーバープログラムでも、
1年かかって計算するようなプログラムでも、"本当に不可避な場合"だけを指してるのかな?
おれは前2者しかやったことないから、それ以外がよく分からないんだけど、
クライアント側ならOKと判断してたし、サーバー側も月一回程度の再起動はゆるされたんで、
"ギリギリ"がよく分からない。 よかったら教えて欲しい。
0225デフォルトの名無しさん
2008/08/04(月) 00:02:57throwもやめとけって、じゃあどうするの?
0226デフォルトの名無しさん
2008/08/04(月) 00:09:32異常系はかまわんけど、正常系で throw で抜けるはよせ。
return で main() まで帰れ。
0227デフォルトの名無しさん
2008/08/04(月) 00:12:08異常系って言うと、メモリが足りないとか、電力が足りないとか?
0228デフォルトの名無しさん
2008/08/04(月) 00:19:120229デフォルトの名無しさん
2008/08/04(月) 00:24:14throw の使い方は派閥があるみたいだけど、俺は寛容派なんでファイル
オープンに失敗した程度のエラーや、ユーザーがキャンセル操作を行った
程度のことでも throw を使っていいと思う。
0230デフォルトの名無しさん
2008/08/04(月) 00:49:30どのように記述すればよいでしょうか?
例えば、
template< int m > struct foo{
template< int n > struct bar{};
};
に対して、operator*( int, foo<m>::bar<n> )を定義したいのですが、
fooのクラス内静的関数として定義すると怒られますし、
グローバルな領域で
template< int m, int n > foobar operator*( int, foo<m>::bar<n> )
とやってもやはりコンパイルが通りません。
0231デフォルトの名無しさん
2008/08/04(月) 00:53:32プロジェクト内で一貫した方針で使ってる分にはいいんじゃないかと思う。
0232224
2008/08/04(月) 01:07:07とりあえずあいまいな質問だったし、>>229が答えのような気がするので、
お礼いってたいさんします。 さんくす。
0233デフォルトの名無しさん
2008/08/04(月) 01:09:080235230
2008/08/04(月) 02:24:03でとりあえず自己解決したような気がします、すいません。
それにしてもこんなところにtemplateをつける用法があるんですね。
0236デフォルトの名無しさん
2008/08/04(月) 09:52:02について、まともな反論は結局なかったな
なんであんな誤った手法がまかり通ってるんだろうな
0237デフォルトの名無しさん
2008/08/04(月) 10:08:39RAIIだとハンドルリークする
について、まともな主張は結局なかったな
0238デフォルトの名無しさん
2008/08/04(月) 10:13:27俺の誤解でなければ、>>208と同じ人or意見ということだよな?
そもそも>>208自体が説明出来ていないので、
反論以前に、まともな主張になっていないわけだけど。
釣りかな?
0239デフォルトの名無しさん
2008/08/04(月) 14:45:580240デフォルトの名無しさん
2008/08/04(月) 14:55:24何事も完璧を求めると大変です。
どうやっても閉じれないハンドルなど捨ておきなさい。
0241デフォルトの名無しさん
2008/08/04(月) 14:59:400242デフォルトの名無しさん
2008/08/04(月) 15:08:340243デフォルトの名無しさん
2008/08/04(月) 15:41:16吐けな(ry
0244デフォルトの名無しさん
2008/08/04(月) 19:16:59C++では当たり前ですか?確かに名前の衝突は起きにくくなりますが
いちいち付けるのもなぁとも。やっぱり大規模なプログラムなんかだと
そうやっといたほうが良いのですかねぇ。
0245デフォルトの名無しさん
2008/08/04(月) 19:25:44不要なら付けるな。
よほど変なルールじゃなければ従え。
0246デフォルトの名無しさん
2008/08/04(月) 21:10:12RAIIの欠点としては弱いのでわ?RAII使うメリットを考えるとRAIIダメとは思わないなあ。
0247デフォルトの名無しさん
2008/08/04(月) 21:21:430248デフォルトの名無しさん
2008/08/04(月) 21:23:45情報隠蔽の基本からやり直せ
0249デフォルトの名無しさん
2008/08/04(月) 22:26:03ファイル書き出し → アンマウント みたいに。
0250デフォルトの名無しさん
2008/08/04(月) 22:38:46RAII≒デストラクタ
後はもう自明だろう
0251デフォルトの名無しさん
2008/08/05(火) 08:58:00アンマウントに失敗したらリークどころじゃなくなるからRAII方式はやめとけ
0252デフォルトの名無しさん
2008/08/05(火) 09:57:460253デフォルトの名無しさん
2008/08/05(火) 10:20:30class HandleWrapper
{
HandleT handle;
public:
//...
~HandleWrapper() {
while ( CloseHandle(handle) != SUCCEEDED ) {
;
}
}
};
0254デフォルトの名無しさん
2008/08/05(火) 10:35:46struct NoRetry{
bool userRetryWait(HandleT handle){return false;}
};
template<typename T=NoRetry> class HandleWrapper{
HandleT handle;
T rt;
public:
//...
~HandleWrapper(){
while (CloseHandle(handle) != SUCCEEDED){
if(!rt.userRetryWait(handle)){break;}
}
}
};
0255デフォルトの名無しさん
2008/08/06(水) 18:17:59struct st
{
int Int;
};
class test
{
st Data;
public:
st *operator->() { return &Data; };
st *Get() { return &Data; };
};
test obj;
int i = obj->Int;
これが出来るなら
int i = obj.Get()Int;
これも出来そうな気がしたけど出来ない。
そもそも->演算子ってどんなものなんでしょうか?
0256デフォルトの名無しさん
2008/08/06(水) 18:30:30それやるなら、obj.Get()->Int
多重定義された->演算子は変わりもので、それを呼び出してその戻り値に再び->演算子を適用するようになっている。
つまり、obj->Intはobj.operator ->()->Intと解釈される。
0257デフォルトの名無しさん
2008/08/06(水) 18:45:10>obj->Intはobj.operator ->()->Int
こんな解釈されるんでしたか・・。
ありがとう。勉強になった。
0258デフォルトの名無しさん
2008/08/07(木) 15:45:36try内部でエラーが発生してcatchに移行する場合など、若干動作が遅いという話を耳にしました
それは納得なのですが、例外が発生しない場合はどれだけtry catchを繰り返したりネストしても
例外が発生しない限り処理速度は低下しないのでしょうか?
0259デフォルトの名無しさん
2008/08/07(木) 15:49:060260デフォルトの名無しさん
2008/08/07(木) 15:50:19tryのブロックに入るたびに、例外のために必要なものスタック上に構築するので
tryブロックに出入りするたびにコストがかかる。
だから、これは問題ない
try {
for(;;){/**/}
}
問題あり
for (;;)
{
try { /**/}
}
0261デフォルトの名無しさん
2008/08/07(木) 15:56:39と言うことは例えばmainの最初にtry、最後にcatchして内部でどれだけ処理したとしても
try catchしない場合と比べてオーバーヘッドは略ゼロに等しいということですね。
これで安心して例外処理ベースで組めそうです。ありがとう。
0262デフォルトの名無しさん
2008/08/07(木) 16:19:48float _11, _12, _13, _14;
float _21, _22, _23, _24;
float _31, _32, _33, _34;
float _41, _42, _43, _44;
};
上記のようなマトリックスのクラスで、
>m[1][2]のようにアクセスできるように演算子[]を多重定義せよ
という課題があるのですが可能なのでしょうか?いくら検索しても
やり方のヒントも出てこないのですが…
0263デフォルトの名無しさん
2008/08/07(木) 16:25:230264デフォルトの名無しさん
2008/08/07(木) 16:27:52union{
struct{
float _11, _12, _13, _14;
float _21, _22, _23, _24;
float _31, _32, _33, _34;
float _41, _42, _43, _44;
};
float m[4][4];
}
何でそれで出来るかは考えてね
0265デフォルトの名無しさん
2008/08/07(木) 16:40:500266デフォルトの名無しさん
2008/08/07(木) 16:44:550267デフォルトの名無しさん
2008/08/07(木) 17:00:14float* operator [](int n) { return &((&_11)[n*4]); }
[0][0]で_11
[1][2]で_23
になるんじゃないかな
行と列を逆にしようとするとめんどいな・・・
0268デフォルトの名無しさん
2008/08/07(木) 17:27:18#include <stdexcept>
struct hoge;
struct proxy{
hoge&o;
int i;
proxy(hoge&o,int i):o(o),i(i){}
float operator[](int);
};
struct hoge{
/*略*/
proxy operator[](int i){return proxy(*this,i);}
};
float proxy::operator[](int j){
switch(i){
case 1:switch(j){
case 1:return o._11;
case 2:return o._12;
case 3:return o._13;
case 4:return o._14;
default:throw std::invalid_argument("damepo");
}
/*略したのは「改行が多すぎます」といわれたからであって、決してサボろうとした訳では(ry*/
default:throw std::invalid_argument("damepo");
}
}
0269デフォルトの名無しさん
2008/08/07(木) 17:30:51if(...){
int a;
}
これはだめですよね。ただ
for(;;){
int a;
}
これってg++では定義できないスコープということでエラーがでますが、
Effective C++のサンプルコードでfor文のスコープでオブジェクトを
定義していたのですが、Effective C++が間違ってるのでしょうか?
0270デフォルトの名無しさん
2008/08/07(木) 17:34:48C++の話なら変数の宣言の位置にそのような制約はない。
0271デフォルトの名無しさん
2008/08/07(木) 17:36:45C言語でも無問題。
どうして
> これはだめですよね。
と思ったのかkwsk
0272269
2008/08/07(木) 17:39:540273269
2008/08/07(木) 18:13:46switch(i){
case 1: int a = 1;
case 2: int b = 2;
}
こんなんダメみたいですね。caseラベルによって初期化が飛ばされるとかで。
case 1: int a;
case 2: int b;
これならいいみたいですけど。
0274デフォルトの名無しさん
2008/08/07(木) 18:14:03返答有難うございます。その方法で試してみます。
ちなみに検索しても見つからなかったのは、[][]なんで
float* operator [][](int a,int b)
のようにするのかと勘違いしてたからでしたorz
0275269
2008/08/07(木) 18:28:42case 1: int a;
case 2: int b = 2;
}
これだと問題ないみたい。
switch(i){
case 1: int a;
case 2: int b;
case 3: int c = 3;
}
これも問題なし。
つまり最後のラベルの位置でのみ初期化指定子が書ける模様。
なんでだろ。
0276デフォルトの名無しさん
2008/08/07(木) 18:33:160277269
2008/08/07(木) 18:34:28switch(i){
case 1: int a; break;
case 2: int b; break;
case 3: int c = 3;
}
これも問題ないんですよね。
0278デフォルトの名無しさん
2008/08/07(木) 20:39:25それより後ろに飛ばないから
つまり初期化をスキップしない
0279デフォルトの名無しさん
2008/08/07(木) 20:39:550280269
2008/08/07(木) 21:09:38case 1: int a; break;
case 2: int b; break;
case 3: int c = 3;
}
このコードでcase 3に飛んだ場合、aやbのインスタンスは確保されないって
ことでいいの?
0281デフォルトの名無しさん
2008/08/07(木) 21:15:170282デフォルトの名無しさん
2008/08/07(木) 21:22:37これがコンパイルできない理由を考えれば
事態が把握できますか?
struct X { X(){} };
void f(int a)
{
switch (a) {
case 1: X x; break;
case 2: X y;
}
0283デフォルトの名無しさん
2008/08/07(木) 22:57:36HogeA と HogeB の2つのクラスがあり
HogeA と HogeB が互いに所持しあうような場合
ファイルを分けるとしたらどのようにすればいいのでしょうか
以下のような書き方だとエラーになってしまいます
*********************************
FILE_A.h
*********************************
#ifndef HOGEA
#define HOGEA
#include "FILE_B.h"
class HogeA {
HogeB* m_pHogeB;
public:
HogeA() { m_pHogeB = new HogeB() }
}
#endif
*********************************
FILE_B.h
*********************************
#ifndef HOGEA
#define HOGEA
#include "FILE_A.h"
class HogeB {
HogeA* m_pHogeA;
public:
HogeB() { m_pHogeA = new HogeA() }
}
#endif
0284デフォルトの名無しさん
2008/08/07(木) 22:58:22FILE_B.hの最初の2行は
#ifndef HOGEB
#define HOGEB
です
0285デフォルトの名無しさん
2008/08/07(木) 23:11:34先行宣言しろ
0286デフォルトの名無しさん
2008/08/07(木) 23:16:01設計がおかしいぞ
0287デフォルトの名無しさん
2008/08/08(金) 01:31:14そういうのは普通、所持しあうとは言わないと思うよ。
オブジェクトを作りあう……とか?
それはそうと、コンパイルを通すには、メンバ関数の定義を外に出せ。
// FILE_A.h
...
class HogeA{
...
HogeA();
}
// FILE_A.cpp
#include "FILE_A.h"
HogeA::HogeA() { m_pHogeB = new HogeB() }
// Bも同様
まあ、もちろんこれで通っても>>286の通りだが。
0288デフォルトの名無しさん
2008/08/08(金) 01:35:180289デフォルトの名無しさん
2008/08/08(金) 04:59:47try ブロックの出入りでオーバーヘッドが発生する処理系は、今はもうだいぶ
減ってきてると思うよ。 Windows では長らくオーバーヘッドがある実装ばかりだった
けど、今は VC++ も「同期例外」とかいうオプションで選択できるようになってたと思う。
0290デフォルトの名無しさん
2008/08/08(金) 07:26:23ありがとうございました
コンストラクタでnewしてるのは単純な例として書いたつもりでしたが
確かにメモリを食いつぶすかループしてしまいそうですね
0291269
2008/08/08(金) 07:57:24う〜ん、デフォルトコンストラクタも初期化子と同等と考えれば
コンパイルできないのも組み込み型のときと同じと考えられますが…
switch (a) {
case 1: break;
case 2: X y;
}
これならコンパイルできますね。
要は、インスタンスの確保や初期化は、その位置に制御が来たときにだけ
されるのかどうか?ということです。もしそうなら、一番下のラベルの所だけ
初期化が許されるというのは解せないというか。けっきょく一番下のラベルも
実行時に飛ばされる場合もあるわけだし…他の上の方のラベルと同等と考え
られそうな気も…。
0292デフォルトの名無しさん
2008/08/08(金) 08:11:13だから、宣言部をスルーして有効な範囲に飛び込んじゃダメなの。
要は、
{
goto foo;
int x;
foo:
}
はNGで
{
goto foo;
int x;
}
foo:
はOK。
0293デフォルトの名無しさん
2008/08/08(金) 08:12:37{
int x;
goto foo;
}
foo:
がOKなのは言うまでもないし。
0294269
2008/08/08(金) 09:53:56{
goto foo;
int x;
foo: 0;
}
は、問題ないみたいですよ。
ただ、
{
goto foo;
int x = 1;
foo: 0;
}
はダメでした。
つまり、定義ではなく、初期化を飛び越すのがダメみたいですね。
初期化子やコンストラクタ呼び出しが該当するようです。
つまり、飛び越された場合、初期化はされてないけど、同じスコープだから
そのインスタンスは使用可能。こういう状況を避けたいがための、エラー
なのかもしれませんね。なんか納得できたかもしれません。
0295デフォルトの名無しさん
2008/08/09(土) 20:05:080296293
2008/08/09(土) 20:43:320297デフォルトの名無しさん
2008/08/09(土) 21:41:48ことに対して、エラーになるけど、>>294みたいに0;とか追加すれば
エラーも警告も出ないけどなぁ、VC++でもg++でも。
0298デフォルトの名無しさん
2008/08/09(土) 21:55:490299デフォルトの名無しさん
2008/08/09(土) 21:59:230300デフォルトの名無しさん
2008/08/09(土) 22:11:520301デフォルトの名無しさん
2008/08/09(土) 22:13:590302デフォルトの名無しさん
2008/08/09(土) 22:19:230303デフォルトの名無しさん
2008/08/09(土) 22:23:240304デフォルトの名無しさん
2008/08/09(土) 22:27:470305デフォルトの名無しさん
2008/08/09(土) 22:30:37人に押しつけるもんでもない。
規格で許されてるかどうかの話してるところへ
哲学がどうとか、頭沸いてるんじゃねぇか?w
0306デフォルトの名無しさん
2008/08/09(土) 22:39:08好き勝手にみんなで俺様オナニーコード書いてたら
現場は困るだろ。
まあ、お前らは自分の身を守れるのかもしれんがな。
0307デフォルトの名無しさん
2008/08/09(土) 22:55:13哲学うんぬんはいいとして
俺様オナニーコードでも無駄がなくて仕様どおりなら特に困らないよ
0308デフォルトの名無しさん
2008/08/09(土) 22:57:37は良いと思ってるんじゃなくてどうでもいいってことね
0309デフォルトの名無しさん
2008/08/09(土) 23:29:04再現率の低い組み合わせ入力や、異常な入力に弱いことが多いからダメ
検査時に再現させられるパタンなんて限られているからね
0310デフォルトの名無しさん
2008/08/10(日) 01:52:23設計哲学ってのが何を指しているのかを明らかにしないと。
0311デフォルトの名無しさん
2008/08/10(日) 01:56:15でも楽しくて仕方ないんだ
0312デフォルトの名無しさん
2008/08/10(日) 02:02:11みなさんダメプロジェクトにいるんですね
0313デフォルトの名無しさん
2008/08/10(日) 02:32:19正直最低限の規約も守れない奴ばっかなのでちゃんと勉強して欲しいんだけどねぇ
0314デフォルトの名無しさん
2008/08/10(日) 02:43:02他のメンバーがコミットしたコードを勝手にレビューすればいいんだ
で、最初は簡単で明白な改善を提案していけば良いんじゃない?
0315デフォルトの名無しさん
2008/08/10(日) 02:47:100316デフォルトの名無しさん
2008/08/10(日) 02:54:37とか書いてある本をいくら読んでもどうしたらいいのかわかりません。
横文字多すぎだよ。
0317デフォルトの名無しさん
2008/08/10(日) 09:14:50俺も割とそう思う
0318デフォルトの名無しさん
2008/08/10(日) 11:01:31「C/C++できます」
の「できます」の意味が広すぎる
少なくとも一回は見ないとそいつがどの程度がわからないし
俺よりすごい人ならそいつにレビューお願いできるし
0319デフォルトの名無しさん
2008/08/10(日) 11:51:540320デフォルトの名無しさん
2008/08/10(日) 11:53:26読んでても理解してない奴もいるし。
0321デフォルトの名無しさん
2008/08/10(日) 13:12:18Exceptional C++に書いてある事を理解しててくれたら十分
0322デフォルトの名無しさん
2008/08/10(日) 13:42:050323デフォルトの名無しさん
2008/08/10(日) 14:47:02例外が発生したとき、オブジェクトの状態はその関数の呼び出し前の状態から変更されていない?
0324デフォルトの名無しさん
2008/08/10(日) 15:05:26//例外安全でない、f()がthrowしたらnew A()がdeleteされない\(^o^)/
void f(){
A* a = new A();
f(a);
delete a;
}
//例外安全、f()がthrowしてもdeleteされる
void f(){
auto_ptr<A> a(new A());
f(a.get());
}
0325デフォルトの名無しさん
2008/08/10(日) 15:08:14そんな感じ。
しかし例外に限らず戻り値でのエラー通知でも同様の安全性は
考えるべきだから、これはエラー安全性と言うべきだ。
http://www.gotw.ca/sands2.htm
Error-Safe C++: More Than Just Exception Safety (Bjarne Stroustrup & Herb Sutter)
> But we'll also cover error safety in all cases, because the main difficulty
> in writing exception-safe code has little to do with exceptions in particular,
> but with error handling in general
0326324
2008/08/10(日) 15:08:470327デフォルトの名無しさん
2008/08/10(日) 15:18:17日本語の包括的な文書が見つからなかった
http://www.boost.org/community/exception_safety.html
書籍ならハーブ・サッターの Exceptional C++ が有名
0328デフォルトの名無しさん
2008/08/10(日) 15:28:00どんな関数・暗黙の呼び出しから例外が出てもリークしないようにする、ってこと
0329デフォルトの名無しさん
2008/08/10(日) 15:30:190330デフォルトの名無しさん
2008/08/10(日) 15:34:140331デフォルトの名無しさん
2008/08/10(日) 15:59:32ある処理で例外が発生してその処理を抜けたとき、副作用が起きない
(またはその処理による副作用が起きる前の状態に復元される)ことの保証が「強い保証」。
どのような状況でも例外が発生しないことの保証が「投げない保証」。
0332デフォルトの名無しさん
2008/08/10(日) 16:12:15結局後回しになって基本保証程度になってしまう
0333デフォルトの名無しさん
2008/08/10(日) 16:14:560334デフォルトの名無しさん
2008/08/10(日) 16:29:40例外保証の実装
とりあえず例外処理の流れと簡単な処理は組み込むけどしっかりした実装はデバッグ工程でつめていく感じ
といってもデバッグ期間がほとんどないスケジュール組まれるので大抵時間なくなるという話
0335デフォルトの名無しさん
2008/08/10(日) 16:37:110336デフォルトの名無しさん
2008/08/10(日) 16:38:130337デフォルトの名無しさん
2008/08/10(日) 16:50:36それ設計じゃね?
0338デフォルトの名無しさん
2008/08/10(日) 16:57:200339デフォルトの名無しさん
2008/08/10(日) 17:33:42最初からちゃんと書けばいいだけじゃないの?
0340デフォルトの名無しさん
2008/08/10(日) 19:22:02小手先の話じゃないんだから。
0341デフォルトの名無しさん
2008/08/10(日) 19:51:26実装自体は小手先の話だけど
0342デフォルトの名無しさん
2008/08/10(日) 21:53:44てっきり、常に整列されてるコンテナのことかと思ったけど、
ハッシュテーブルも連想コンテナの一種らしいね。
ハッシュって整列されてないやろ?
0343デフォルトの名無しさん
2008/08/10(日) 21:55:21任意の型(文字列とか)をキーに一意に値を求められるもの
と俺は思ってたけど
0344デフォルトの名無しさん
2008/08/10(日) 21:56:110345デフォルトの名無しさん
2008/08/10(日) 21:59:10それは連想配列という認識だったけど、もしかして連想コンテナと
連想配列って同義語?
0346デフォルトの名無しさん
2008/08/10(日) 22:01:28連想配列なら多分ハッシュに限定。
0347デフォルトの名無しさん
2008/08/10(日) 22:15:22配列のインデックスに値だけじゃなくて、文字列などの自由な型が使えるものを
連想配列と言うらしい。
連想コンテナの例:set, multiset, map, multimap, hash
連想配列の例:map, hash
こうか?連想コンテナの定義が浮かばないけど。
0348デフォルトの名無しさん
2008/08/10(日) 22:18:27http://ja.wikipedia.org/wiki/%E9%80%A3%E6%83%B3%E9%85%8D%E5%88%97
http://en.wikipedia.org/wiki/Associative_array
0349デフォルトの名無しさん
2008/08/10(日) 22:19:370350デフォルトの名無しさん
2008/08/10(日) 23:11:53コンテナ全部配列と呼んでたような理由かな。
0351デフォルトの名無しさん
2008/08/10(日) 23:12:26int(), double()などは0を返すので、論理的にはデフォルトコンストラクタを
持ってるのかと思いきや
class hoge{
int i
};
このhogeクラスをデフォルトコンストラクタで生成しても、iは0で初期化
されない(intのデフォルトコンストラクタが呼ばれない?!)あたり、
やはり組み込み型には論理的にもデフォルトコンストラクタは持っていない
ということですか?
0352デフォルトの名無しさん
2008/08/10(日) 23:15:47int i;
hoge() : i() {}
};
0353デフォルトの名無しさん
2008/08/10(日) 23:19:59自動でデフォルトコンストラクタが呼ばれるのに、何で組み込み型は
デフォルトコンストラクタ(存在するなら)が呼ばれないのかなと。
0354デフォルトの名無しさん
2008/08/10(日) 23:23:320355デフォルトの名無しさん
2008/08/10(日) 23:23:50初期化しないってことなのかな?
0356デフォルトの名無しさん
2008/08/10(日) 23:24:59納得しました。
0357デフォルトの名無しさん
2008/08/10(日) 23:30:07未初期化だったものを初期化するように変更しても、行儀のいいソースなら動作は変わらないはずだから
互換性の問題というわけではないと思う。
C++の思想として効率的なコードがかける必要性があるからでは?
0358デフォルトの名無しさん
2008/08/10(日) 23:32:090359デフォルトの名無しさん
2008/08/11(月) 09:50:380360デフォルトの名無しさん
2008/08/11(月) 09:53:47するためにint()という表記ができるようにしたが、デフォルトコンストラクタではないし、
わざわざCと違う動作をするように変更する必要がないためじゃないかな。
357の言うように効率面もあるだろうし。
0361デフォルトの名無しさん
2008/08/11(月) 15:00:01論点がずれてる
論点は
struct X {
int i, j;
X() : i() {}
};
で、i はゼロで初期化されるのに j は初期化されない理由
0362デフォルトの名無しさん
2008/08/11(月) 15:16:530363デフォルトの名無しさん
2008/08/11(月) 17:47:24実際、性能重視の用途で勝手に初期化処理されて
CプログラムをC++に移植したら遅くなりましたではかなわない
例外ですら迷惑なのに
0364デフォルトの名無しさん
2008/08/11(月) 19:23:11論点がずれてたから360を書いた。
0365デフォルトの名無しさん
2008/08/11(月) 22:01:28計算しろって言われたんですがどうすればいいですか?
10%だと書き直す必要はないからするな、50%速くなるなら書き直せ計算できるだろ!
って言われて困ってます
カメラの監視ソフトで画像を処理する感じのプログラムなんですが
0366デフォルトの名無しさん
2008/08/11(月) 22:03:210367デフォルトの名無しさん
2008/08/11(月) 22:04:26おまえがやれ!って言ってやればいいですか?
0368デフォルトの名無しさん
2008/08/11(月) 22:08:48肝の部分を単純化したものをVBとCで書いて速度を比較する
で、「肝の部分を単純化して比較するとこうなりました」と報告すればいい
大して工数は掛からず嘘もなし
0369デフォルトの名無しさん
2008/08/11(月) 22:09:27すみません、C書いたことないんですが
0370デフォルトの名無しさん
2008/08/11(月) 22:10:390371デフォルトの名無しさん
2008/08/11(月) 22:11:35じゃあ>>366で
0372デフォルトの名無しさん
2008/08/11(月) 22:12:29>C書いたことないんですが
これは笑うことが期待されているのでしょうか?
0373デフォルトの名無しさん
2008/08/11(月) 22:13:35そんなこと聞かないでください!!
0374デフォルトの名無しさん
2008/08/11(月) 22:48:430375デフォルトの名無しさん
2008/08/11(月) 22:56:02C書いたことないんなら、書き直しても大して速くならないうえに
バグが50%増しになってオワルだけだろ
0376デフォルトの名無しさん
2008/08/11(月) 22:57:480377デフォルトの名無しさん
2008/08/11(月) 23:25:19メモリリークはなくなりますが
0378デフォルトの名無しさん
2008/08/11(月) 23:28:490379デフォルトの名無しさん
2008/08/11(月) 23:49:06適当に回答しておきます。
話は変わりますが、その社長なんか変なんですよ。社員に内緒で、一番できる
技術者に占い(?)みたいなソフト作らせてるみたいなんですが
生年月日を入力するとオーラの量とかが測定できるみたいなんです。
どのようなアルゴリズムに基づいているのか本当に不思議です
あと、この前社長の机拭いてたら「ノストラダムスの大予言」って本が置いてあって
いくらなんでも季節外れでしょ。って思ったもんです。
その監視ソフトで業務中監視されてるみたいだし辞めた方がいいですかね?
0380デフォルトの名無しさん
2008/08/12(火) 00:24:510381デフォルトの名無しさん
2008/08/12(火) 03:58:26ここはプログラ「ム」板だ
0382デフォルトの名無しさん
2008/08/12(火) 14:57:16間に占い師くらいいてもいいんじゃないかw
0383デフォルトの名無しさん
2008/08/12(火) 15:17:26Type2Typeで型毎にわけてif文を構築するのが面倒です
どう実装すれば、この型毎にわけずに、以下の実装のようにgetだけで値をとれるようになるのか
教えてもらえないですか。
template <typename T>
struct Type2Type { typedef T OriginalType; };
class hoge {
private:
int _int1v; int _int2v; char _charv; long _longv;
public:
hoge() : _int1v(0), _int2v(0), _charv(0), _longv(0) {}
void getInt1(int& v) {v = _int1v;}; void getInt2(int& v) {v = _int2v;};
void getChar(char& v) {v = _charv;}; void getLong(long& v) {v = _longv;};
template <typename T> void get(const string& name, T& t, Type2Type<int>) {
if (name.compare("getInt1") == 0) getInt1(t);
else if (name.compare("getInt2") == 0) getInt2(t);
}
template <typename T> void get(const string& name, T& t, Type2Type<char>) {
if (name.compare("getChar") == 0) getChar(t);
}
template <typename T> void get(const string& name, T& t, Type2Type<long>) {
if (name.compare("getLong") == 0) getLong(t);
}
template <typename T> void get(const string& name, T& t) {
get(name, t, Type2Type<T>());
}
};
void main() {
hoge h; int int1v; int int2v; char charv; long longv;
h.get("getInt1", int1v); h.get("getInt2", int2v);
h.get("getChar", charv); h.get("getLong", longv);
}
0384383
2008/08/12(火) 15:22:57template <typename T>
void get(const string& name, T& t) {
if (name.compare("getInt1") == 0) getInt1(t);
else if (name.compare("getInt2") == 0) getInt2(t);
else if (name.compare("getChar") == 0) getChar(t);
else if (name.compare("getLong") == 0) getLong(t);
}
'hoge::getChar' : 1 番目の引数を 'int' から 'char &' に変換できません。
上記のエラーがいろいろでますが、コンパイラがif文をみてくれるわけでないので、
型が一致しないのはそうだと思い、Type2Typeで分けてみたけど、
型毎にメソッドを分けないといけないのが面倒です。
0385デフォルトの名無しさん
2008/08/12(火) 15:58:45こういうのでどう
template <typename T> void getInt1(T& v) { v = static_cast<T>(_int1v); };
template <typename T> void getInt2(T& v) { v = static_cast<T>(_int2v); };
template <typename T> void getChar(T& v) { v = static_cast<T>(_charv); };
template <typename T> void getLong(T& v) { v = static_cast<T>(_longv); };
0386デフォルトの名無しさん
2008/08/12(火) 16:08:14template<class T>
T get(std::string name)
{
if (name.compare("i1") == 0) return static_cast<T>(i1);
else if (name.compare("i2") == 0) return static_cast<T>(i2);
else if (name.compare("f1") == 0) return static_cast<T>(f1);
else if (name.compare("f2") == 0) return static_cast<T>(f2);
return T();
}
まあ同じことだが
0387デフォルトの名無しさん
2008/08/12(火) 16:30:41どういう使い方するのかよく分からないけどさ
0388383
2008/08/12(火) 16:36:33おしえてくれてありがとうございます。例が悪かったです。すいません。
この方法って、structか、classをメンバにしたときとかにしたとき、コンパイルエラーになってしまいます。
struct XXX {};
template <typename T> void getString(T& v) { v = static_cast<T>(_strv); };
template <typename T> void getXXX(T& v) { v = static_cast<T>(_xxxv); };
0389383
2008/08/12(火) 16:40:26はい、xml等、なんらかの定義からC++のクラスをツールで作成して使おうと思っています。
その時に、名前でgetterとsetterを実装しておきたいという感じです。
なので、問題ないと思っています。
0390デフォルトの名無しさん
2008/08/12(火) 16:43:41if (name.compare("i1") == 0) v = *((T*)(&i1));
else if (name.compare("i2") == 0) v = *((T*)(&i2));
else if (name.compare("f1") == 0) v = *((T*)(&f1));
else if (name.compare("f2") == 0) v = *((T*)(&f2));
これでなんにでも変換できるが、get<int>("f1")とかでもエラーがでないのが問題
もっとスマートな方法ないかな・・・
0391デフォルトの名無しさん
2008/08/12(火) 16:45:35それか全部stringにしてboost::lexical_cast
0392デフォルトの名無しさん
2008/08/12(火) 16:50:300393383
2008/08/12(火) 16:54:37どーも、どーも、boost::anyを考えた時は、void get(const string& name, any v) にしてみたんですが、
値をどうやって返してもらうんだ?、で、やめました。
内部クラスのholderのメンバが、ValueType held と値になっているから、値渡しでは無理なのかなぁと思っています。
>>392
ありがとう。boost::serializeにちょっくら行ってきます。
0394383
2008/08/12(火) 17:49:58まずはBoostC++Libraries第2版のserialization 4.4〜4.5を読んでみたけど、
幸せになれなかったです。どの辺を考慮してみるべきか教えてもらえないですか。
0395383
2008/08/12(火) 19:19:52struct xxx {
xxx() : _strval("xxx") {}
string _strval;
};
class hoge {
private:
int _int1v; int _int2v; char _charv; long _longv; string _strv; xxx _xxxv;
public:
hoge() : _int1v(0x01), _int2v(0x02), _charv(0x03), _longv(0x04), _strv("boge"), _xxxv() {}
void getInt1(int& v) {v = _int1v;}; void getInt2(int& v) {v = _int2v;};
void getChar(char& v) {v = _charv;}; void getLong(long& v) {v = _longv;};
void getString(string& v) {v = _strv;}; void getXXX(xxx& v) {v = _xxxv;};
void getInt1(CAny& v) {v.Swap(CAny(_int1v));}; void getInt2(CAny& v) {v.Swap(CAny(_int2v));};
void getChar(CAny& v) {v.Swap(CAny(_charv));}; void getLong(CAny& v) {v.Swap(CAny(_longv));};
void getString(CAny& v) {v.Swap(CAny(_strv));}; void getXXX(CAny& v) {v.Swap(CAny(_xxxv));};
template <typename T> void get(const string& name, T& t) {
if (name.compare("getInt1") == 0) {CAny a(t);getInt1(a);t = any_cast<T>(a);}
else if (name.compare("getInt2") == 0) {CAny a(t);getInt2(a);t = any_cast<T>(a);}
else if (name.compare("getChar") == 0) {CAny a(t);getChar(a);t = any_cast<T>(a);}
else if (name.compare("getLong") == 0) {CAny a(t);getLong(a);t = any_cast<T>(a);}
else if (name.compare("getString") == 0) {CAny a(t);getString(a);t = any_cast<T>(a);}
else if (name.compare("getXXX") == 0) {CAny a(t);getXXX(a);t = any_cast<T>(a);}
}
};
hoge h; int int1v; int int2v; char charv; long longv; string aaav; xxx xxxv;
h.get("getInt1", int1v); h.get("getInt2", int2v);
h.get("getChar", charv); h.get("getLong", longv);
h.get("getString", aaav); h.get("getXXX", xxxv);
0396デフォルトの名無しさん
2008/08/13(水) 09:09:23boostと違って、次元数も要素数も自由自在だから、ある程度再帰的な機構が必要なんだよね。
とりあえず配列クラスと要素クラスを作ってそれぞれに要素クラスを返すoperator[]と
配列タイプTの参照を返すキャスト演算子を作ってできたんだけど、printfみたいな
引数の型が分からない場合にわざわざキャストしてあげないといけなくて
めんどいんだけど何とかならんかね
0397デフォルトの名無しさん
2008/08/13(水) 09:13:37普通stream。
0398デフォルトの名無しさん
2008/08/13(水) 10:06:49あきらめてT* operator->を定義して妥協した。
0399デフォルトの名無しさん
2008/08/13(水) 10:53:36最悪デバッグ時でもいいんだが、そっちはスレチか・・・
ちなみにVisualStudio2008
0400デフォルトの名無しさん
2008/08/13(水) 11:05:38判然としないがあれか、例外発生時にどんな関数がどんな順番で呼ばれてたわかるようなやつか?
本当に『わかればいい』ならDebugビルドで例外をcatchせずにmainの外まで放り出せば
デバッガは例外throw時点まで巻き戻して止まるからデバッガの呼び出し履歴ウィンドウを見ればいい。
プログラム側から呼び出し履歴を見る方法があるのかは知らん。 少なくとも言語仕様ではない。
0401デフォルトの名無しさん
2008/08/13(水) 11:20:18そういうこと。本当はリリース版でも正確なログを残したいんだよね^^;
デバッグ時に例外をキャッチしない方法があるか調べてみますわ
0402デフォルトの名無しさん
2008/08/13(水) 11:27:580403デフォルトの名無しさん
2008/08/13(水) 11:29:48struct Hage {
int n;
Hage():n(){}
Hage(int an):n(an){}
};
std::ostream& operator<<(std::ostream& ost, const Hage& o){
ost << o.n;
return ost;
}
std::istream& operator>>(std::istream& ist, Hage& o){
int n;
ist >> n;
o = Hage(n);
return ist;
}
void f(){
Hage a(10),b;
std::stringstream ss;
ss << a;
ss >> b;
std::cout << b << std::endl; // "10"
}
0404デフォルトの名無しさん
2008/08/13(水) 11:31:28最悪リリース時は自分のログだけでも残すようにしてみるよ
0405デフォルトの名無しさん
2008/08/13(水) 16:50:17ていうか、見てくれる人がいるならソース上げたいんだけど、ダメだろうか?
0406デフォルトの名無しさん
2008/08/13(水) 17:08:05ソース上げるなら↓の1にあるロダが良いと思う
http://pc11.2ch.net/test/read.cgi/tech/1218023777/1
0407405
2008/08/13(水) 19:07:33ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7611.txt
Aray.hpp
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7612.txt
こんな感じです。もっとお勧めの実装があればだれかヨロ
0408デフォルトの名無しさん
2008/08/13(水) 22:04:12ないところが見受けられるよな。範囲に対して範囲で検索するアルゴリズムの
場合で言うと、最初の範囲を検索するのsearchに対して、最後の範囲を
検索するのがfind_endとか。まぁごっちゃに開発したのを統合したから
こうなったんだと思うが、こういうのって一度標準として決まっちゃうと
改善されないのかね。互換性は失うけど、後々までこういう不手際が
残るのも問題だと思うが。そのへんて、C++0xで整理されないのかな。
0409デフォルトの名無しさん
2008/08/13(水) 22:15:240410デフォルトの名無しさん
2008/08/14(木) 00:03:01我々から見ると単に一貫性を欠いてるだけに見えるけど
英語ネイティブな人たちにとってはあれで自然なのかも
0411デフォルトの名無しさん
2008/08/14(木) 02:43:43find_end() については SGI のページにはっきり "misnamed" と書いてある。
http://www.sgi.com/tech/stl/find_end.html
0412デフォルトの名無しさん
2008/08/14(木) 09:36:400413デフォルトの名無しさん
2008/08/14(木) 10:12:03class AAA {
public:
void setHoge(int a){};
};
class BBB {
public:
void setFugo(int a){};
};
set hoge = &AAA::setHoge;
set fugo = &BBB:setFugo;
↑ この2行がエラーになります。
intの引数を取る関数ポインタとしてAAAとBBBのsetHogeとsetFugoを扱いたいのですが、どうすればいいでしょうか。
AAAとBBBは親子関係や親クラスが一緒とかないです。共通の親クラスの関数をオーバーライドしないとできないと思っています。
typedef void (OYA::*set)(int);
class OYA {
public:
virtual void setOYA(int g) = 0;
};
class AAA : public OYA {
public:
void setOYA(int g) {}
};
class BBB : public OYA {
publc:
void setOYA(int g){}
};
set hoge = &AAA::setOYA;
set fugo = &BBB:setOYA;
↑ これだといけるけど、親クラスを作って名前を合わせないといけない。
0414デフォルトの名無しさん
2008/08/14(木) 10:15:12public:
static void setHoge(int a){};
};
class BBB {
public:
static void setFugo(int a){};
};
0415デフォルトの名無しさん
2008/08/14(木) 10:15:38search_n(beg, end, count, value, binary_predicate)
これも、ミスらしいね。二項叙述関数受け取るくせに、その叙述関数の2番目の
引数はvalueで固定。この場合、STLの一貫性に従うなら単項叙述関数を受け取るように
して、二項にしたい場合はbind2dなどを使うようにするべきだった。
これなら単項でも二項でも二項のどちらの引数としてでも働く。
0416デフォルトの名無しさん
2008/08/14(木) 10:22:21ごめん、クラス内でインスタンス毎の変数をさわりたいから、staticはだめなんす。
0417デフォルトの名無しさん
2008/08/14(木) 10:23:380418デフォルトの名無しさん
2008/08/14(木) 10:45:32そのインスタンスはset hoge = …の時点で分かってるの?
それとも呼び出すまで分からない?
前者ならboost::bind+boost::functionでなんとかなる
0419デフォルトの名無しさん
2008/08/14(木) 12:39:50残念。ありがとう。
>>418
set hoge=・・・の時点ですでにわかっています。関連のないクラスの引数、戻り値が一緒なだけのメソッドを、
どこかに保存しておいてあとでまとめて呼び出したいんです。
というわけで、boost::bindとboost::functionを見てみます。ありがとう。
0420デフォルトの名無しさん
2008/08/14(木) 13:35:07using namespace std;
//関数宣言
float *lineIntersect(float *L1Point, float L1Slope, float *L2Point, float L2Slope);
int main()
{
float tmp[2];
float sl1 = 1/2;
float sl2 = 1/4;
float pt1[2] = {10, 20};
float pt2[2] = {20, 10};
*tmp = *lineIntersect(pt1, sl1, pt2, sl2);
cout << tmp[0] << "___" << tmp[1];
return 0;
}
float *lineIntersect(float *L1Point, float L1Slope, float *L2Point, float L2Slope) {
float ans[2] = {0, 0};
ans[0] = (L1Slope * L1Point[0] - L2Slope * L2Point[0] +
L2Point[1] - L1Point[1]) / (L1Slope - L2Slope);
ans[1] = L1Slope(ans[0] - L1Point[0]) + L1Point[1];
return ans;
}
cpp(26) : error C2064: 1 引数を取り込む関数には評価されません。
cpp(28) : warning C4172: ローカル変数またはテンポラリのアドレスを返します
2つの直線が与えられたときその交点を返す関数を記述してみたのですがエラーが2個出てなおせません;;
誰か御助けお願いします
0421デフォルトの名無しさん
2008/08/14(木) 13:39:420422デフォルトの名無しさん
2008/08/14(木) 13:49:59・26行目のエラーはケアレスミス。このくらい、自分で見つけろ。
・28行目の警告は初心者にありがちなミス。配列を返すことはできないので、2変数返すには工夫が必要。
・そもそも、配列についてまともに理解できていない。勉強しなおすことをお勧め。
・実数を扱うなら、特にそうする理由がないならfloatではなくdoubleを使うべき。
・1/2は整数演算しか行なわれないので、0になる。
以下省略。
出直すなら、初心者スレへどうぞ。
0423デフォルトの名無しさん
2008/08/14(木) 14:06:25>>417, 418
結局、関数ポインタを内包するクラスをつくって、templateで解決しました。
boost::bindとboost::functionを見てクラスにすればいいのか、という感じで解決しました。ありがとうございます。
0424デフォルトの名無しさん
2008/08/14(木) 14:27:34ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200407/04070013.txt
0425デフォルトの名無しさん
2008/08/14(木) 14:41:58最終形はCCCはvectorに入れたかったので、
boost::anyみたいに内部クラスでテンプレートを使うようにして入れるようにしました。
template <typename T>
class CCC {
public:
typedef void (T::* set)(int);
private:
T& _t;
set _func;
public:
CCC(set func, T& t) : _func(func), _t(t) {}
void invoke(int v) {(_t.*_func)(v);}
};
class AAA {
public:
void setHoge(int a){printf("AAA %d\n", a);}
};
class BBB {
public:
void setFugo(int a){printf("BBB %d\n", a);}
};
void main() {
AAA aaa; BBB bbb;
CCC<AAA> cccA(&AAA::setHoge, aaa); CCC<BBB> cccB(&BBB::setFugo, bbb);
cccA.invoke(1); cccB.invoke(2);
}
0426デフォルトの名無しさん
2008/08/14(木) 22:35:290427デフォルトの名無しさん
2008/08/14(木) 22:40:470428デフォルトの名無しさん
2008/08/14(木) 23:12:45特になさそうなので、ありがとうございました。
0429デフォルトの名無しさん
2008/08/19(火) 13:21:43int *p = new int[10];
delete [] p;
のような場合、ソース上だとdeleteするときサイズがわからないけど配列分
開放されているのですよね?ということは実際にはどこかにサイズが保持
されているってことなんでしょうか?
それなら[]無しのdeleteでもきちんと消すことが出来るんじゃないかとか考え
ていたんですけど、仕様云々なんだろうか。
興味本位の質問ですが、アセンブラわからないのでお手柔らかに教えて
いただきたい。
0430デフォルトの名無しさん
2008/08/19(火) 13:25:030431デフォルトの名無しさん
2008/08/19(火) 13:40:30その考えでいくと、単品の new でもサイズが 1 であることをどこかに保存しないといけない
ことになる。これはゼロオーバーヘッドの原則に反する。だから仕様。
区別したくないんだったら常に new int[1] として全部 delete [] で解放すればいいんじゃね?
まじめな話、動的配列には常に std::vector や boost あるいは tr1 の array を使うのがおすすめ。
これで自分で使う new/delete は単品だけになる。さらに各種スマートポインタを使えば delete を
直接使うことも無くなる。
0432デフォルトの名無しさん
2008/08/19(火) 15:12:46基底クラスを直接deleteしない場合は問題ないよな?
効率的にあんまりvirtual使いたくないんだ。
あと、基底クラスでvirtualな関数を、派生クラスで
virtual外すことに意味ってある?結局virtualになる気がするが・・・
0433デフォルトの名無しさん
2008/08/19(火) 15:26:53virtualは、書いても書かなくても同じなら、わざわざ書かなくていいんじゃない
0434デフォルトの名無しさん
2008/08/19(火) 15:36:36デストラクタをpublic以外に置くのはいいかもな
0435デフォルトの名無しさん
2008/08/19(火) 15:51:22virtualと書かなくても仮想関数になる(仮想関数テーブルを上書きし、そこから呼ばれる)。
もちデストラクタも。これは単にオーバーライドのルール。
あとデストラクタをprotectedにするのは、(わかってそうだけど一応)基底クラスのポインタを
deleteするときに外部から基底クラスのデストラクタを呼べなくする。
つまり派生クラスのpublicなデストラクタを外から呼び、派生が基底のデストラクタを
呼ぶことでのみdeleteできる(=基底のポインタからはdelete不可)。
んだが、基底のデストラクタをprivateにしちゃうと、↑と似た理由で
継承も禁止しちゃうので注意。継承禁止の意味で使えるけど。
0436デフォルトの名無しさん
2008/08/19(火) 16:00:090437429
2008/08/19(火) 16:00:47例えでnew[]を[]無しのdeleteと書いたけど、もしdelete[]でどこかの
サイズを参照して開放しているならばポインタから確保されたサイズ
を得る方法があるんじゃないかと思ったまでです。
0438デフォルトの名無しさん
2008/08/19(火) 16:04:58もちろんサイズは保持しているよ。
[] 無しでも領域は開放されるけど、個々のデストラクタは呼ばれない。
0439デフォルトの名無しさん
2008/08/19(火) 16:10:46普通は自分じゃ弄ること無いからな。
0440デフォルトの名無しさん
2008/08/19(火) 16:22:260441デフォルトの名無しさん
2008/08/19(火) 18:50:220442デフォルトの名無しさん
2008/08/19(火) 19:08:19自分でクラス定義してそれでやってみるとわかる。
0443デフォルトの名無しさん
2008/08/19(火) 19:28:09要素数は確かintサイズだからこうなるよね?違ったっけ?
0444デフォルトの名無しさん
2008/08/19(火) 20:31:06http://www.23ch.info/test/read.cgi/tech/1216215558/952-961
0445デフォルトの名無しさん
2008/08/19(火) 20:32:59だから []なしの delete が要素数を参照するようにすると
常に、[]なしのnewしたときにも要素数が必要になるということを >>431 が言っている
0446デフォルトの名無しさん
2008/08/20(水) 10:00:08プリコンパイル済みヘッダーにテンプレートやインラインが含まれている場合の
処理ってどうなるんでしょう。中間ファイル作ってリンクってできないですよね?
0447デフォルトの名無しさん
2008/08/20(水) 10:04:410448デフォルトの名無しさん
2008/08/21(木) 13:34:20プリコンパイル用ヘッダーの中に何でもかんでも放り込むのはやっぱり良くないのかね?
0449デフォルトの名無しさん
2008/08/21(木) 14:24:08名前汚染が怖くないなら(ちゃんとnamespaceで囲ってあったり冗長な名前を使っているなら)、
何でもかんでも放り込んでおくのはそんなに悪い考えというわけでもないと思う。
どうせ名前の数が増えたってコンパイラが名前の探索に必要な時間は高々O(logn)なんだし。
例えばboostとSTLのよく使うヘッダーをどばーっとPCHでインクルードしておいて、
(可読性とか念のために)本当に使うところでも#includeを書いておけば、インクルードガードのおかげで
結構速くコンパイルできるようになるんじゃないかな。
0450デフォルトの名無しさん
2008/08/21(木) 14:47:05何でも入れるヘッダは良くない。
>>449
ひとつのソースのコンパイルにかかる時間は問題じゃないと思う。
再コンパイルの必要なソースがいくつ発生するかってところが問題でしょ。
0451デフォルトの名無しさん
2008/08/21(木) 15:20:31プリコンパイルヘッダの話でしょ?
標準ライブラリみたいな通常変わらないヘッダを入れるものだよ。
自分らが書くヘッダを入れちゃ駄目だから、再コンパイルについては逆に大丈夫。
むしろプリコンパイルヘッダに都度インクルード文を追加していくのも間違い。
その都度プリコンパイルヘッダ使ってるソース全部再コンパイル対象になるから。
先に使いそうなのを入れておく。
0452デフォルトの名無しさん
2008/08/21(木) 15:37:30本当に使うところでインクルードするならpchでインクルードしなくていいと思うんだが。
本当に使うところでインクルードしなくても良くなるから中途半端でわ?
ソースファイルの独立性が低くなるから、自分はpchでインクルードしない。
やるとしても開発時のみにする。
0453451 (≠449)
2008/08/21(木) 15:45:40超同意。
コンパイル時間短縮だけが目的だしね。
俺の場合、一通り作り終わったらコメントアウトしてる。
0454デフォルトの名無しさん
2008/08/21(木) 15:48:18ライブラリAを複数のソースからインクルードするとそれぞれのソースで
展開されて時間がかかる場合にpchつかうんじゃないの?
0455デフォルトの名無しさん
2008/08/21(木) 15:50:24コンパイルできるように書いてはいるが、実際に外したことはない。
0456デフォルトの名無しさん
2008/08/21(木) 15:51:280457デフォルトの名無しさん
2008/08/21(木) 15:52:330458デフォルトの名無しさん
2008/08/21(木) 15:53:52プリコンパイル済みによるありがた味なんてそんなに出ない。
全体に影響が出るような変更はほいほい行うもんでもない。
てか、そんなに大きなプログラム作ってやるもんかっ
うえっ、、、うえぅ、、、
作れないんじゃないぞっ
作らないんだからな
うぇ、、うぇ、、
0459デフォルトの名無しさん
2008/08/21(木) 15:54:53あるあるw
0460452
2008/08/21(木) 17:36:450461452
2008/08/21(木) 17:48:18>例えばboostとSTLのよく使うヘッダーをどばーっとPCHでインクルードしておいて、
>(可読性とか念のために)本当に使うところでも#includeを書いておけば、インクルードガードのおかげで
>結構速くコンパイルできるようになるんじゃないかな。
ちょうどboost使ってるソースがあったのでやってみたら、体感できる効果があった。
これからは開発時はそうしようっと。
0462デフォルトの名無しさん
2008/08/21(木) 19:55:14.hの代わりにプリコンパイル済みの方を優先して読み込んでくれてる(気がする。)
0463デフォルトの名無しさん
2008/08/22(金) 20:09:36int j = i - 1;
このようなコードがあったとき,jが-1になることは規格で保証されていますか?
0464デフォルトの名無しさん
2008/08/22(金) 20:22:40int j = satatic_cast<int>(i - 1);
0465デフォルトの名無しさん
2008/08/23(土) 00:03:01負数の表現方法が決まってなかった気がするのでだめだと思う。
つかその前に符号なし整数が0より小さくなった時点で処理系定義かと。
0466デフォルトの名無しさん
2008/08/23(土) 00:07:490467デフォルトの名無しさん
2008/08/23(土) 00:17:45i - 1 が UINT_MAX になることは保証されているけど、それを int に入れようとしても
ほぼ確実に INT_MAX より大きいんで、値は処理系定義となってしまう。
0468デフォルトの名無しさん
2008/08/23(土) 00:21:03i - 1 は (unsigned int) - (signed int) なので、
(unsigned int) - (unsigned int) に変換してから計算することになっている。
したがって、この式の型は (unsigned int) で、0u - 1u = MAX_UINT
結果として、MAX_UINTは多くの処理系で(signed int)で表せないので、
代入される値は処理系定義。
0469デフォルトの名無しさん
2008/08/23(土) 00:59:590470デフォルトの名無しさん
2008/08/23(土) 01:07:120471デフォルトの名無しさん
2008/08/23(土) 01:08:24これかな?
3.9.1 Fundamental types p4
> Unsigned integers, declared unsigned, shall obey the laws of arithmetic modulo 2n where n is the number
> of bits in the value representation of that particular size of integer.41)
> 41) This implies that unsigned arithmetic does not overflow because a result that cannot be represented
> by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest
> value that can be represented by the resulting unsigned integer type.
0472デフォルトの名無しさん
2008/08/23(土) 01:36:22unsigned の話だよ。
0473デフォルトの名無しさん
2008/08/23(土) 05:58:08演算子の優先順位から、
int j = i - 1は、まず先にi - 1が先に評価されるわけで、jは関係しない。
減算演算子はその左の項から評価されるから、iの型に1が暗黙変換されて
当然その結果もunsignedになる。でその値がjの型にキャストされてjに代入される。
0474デフォルトの名無しさん
2008/08/23(土) 09:14:24>>減算演算子はその左の項から評価されるから、iの型に1が暗黙変換されて
ちょっと違うんじゃないかな。
柴田ボウヨウの本によると、片方のオペランドがunsignedなら他方をunsignedにすると書いてある。
右か左かは関係ないんじゃないかな。
0475デフォルトの名無しさん
2008/08/23(土) 10:15:220476デフォルトの名無しさん
2008/08/23(土) 13:24:410477デフォルトの名無しさん
2008/08/23(土) 13:30:510478デフォルトの名無しさん
2008/08/23(土) 13:35:490479デフォルトの名無しさん
2008/08/23(土) 14:42:17ほんとややこしい
0480デフォルトの名無しさん
2008/08/23(土) 15:55:140481デフォルトの名無しさん
2008/08/23(土) 20:30:23まさに汎整数拡張では?
short == intの環境なら、確かにchar系だけが対象になる。
0482デフォルトの名無しさん
2008/08/23(土) 21:57:570483デフォルトの名無しさん
2008/08/23(土) 22:50:52本屋にはロベールのC++教室とか独習C++とかありました。
そこそこ難度高くても1000ページ以内で無駄に紙面を使ってない本がいいです
MFCとかWinAPIまではあまり触れてなくても構いません
VB.NETである程度オブジェクト指向は理解してるつもりです
0484デフォルトの名無しさん
2008/08/23(土) 22:54:31つ仕様書
0485デフォルトの名無しさん
2008/08/23(土) 22:59:15(といっても独習C/C++知識を一通り理解したレベルですが・・)
知識が不十分なところがあり、効率は遅々としたものになるのはわかっているのですが
C/C++によるWindowsアプリに挑戦したいと思っています。
そこで、Win32APIかMFCどちらかにまず挑戦したいと考えているのですが、どちらがお勧めでしょうか?
また、それぞれの比較・メリットデメリットなど教えてもらえるとうれしいです
よろしくお願いします
0486デフォルトの名無しさん
2008/08/23(土) 23:46:16つMSDN
0487デフォルトの名無しさん
2008/08/23(土) 23:46:34Windows 特定だからこっちのスレの方が適してんじゃね?
【初心者歓迎】C/C++室 Ver.58【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1218023777/
MFC は使ったこと無い俺が適当に答えてみるとこんな感じか?
Win32API: 低レベル、面倒
MFC: ごてごて、割と楽?
あと、WTL(Windows Template Library)ってのもあって結構良さそげだけど、どれも将来性に不安が残るところ。
0488デフォルトの名無しさん
2008/08/24(日) 18:18:55あれが面倒ね・・・
C++ 使いがそんなこと言ってるのは技量不足に他ならない
# MFC はいわばクラシック C++
0489デフォルトの名無しさん
2008/08/24(日) 19:12:130490デフォルトの名無しさん
2008/08/25(月) 02:18:54どういう目的でC++やるのかによるかもしれないが、通常なら
断然WIN32APIからやった方がいいと思うよ。
MFCは当然API使っているから、後でMFC使う時も理解が深まる。
っていうか、API知らないとMFCでトラブった時に自力で解決できない。
MFCを使う場合は、VSがメソッドの追加とかをサポートしてくれる
楽な機能があるから、いい加減にソフト作るときは楽。でもそれなら
C#とか使えばいいし、正直いまさらやることもない気がする。
WTLはAPIの薄いラッパーみたいな感じなので、結構使いやすい。
APIがある程度わかってきたら、これで楽するといいかも。
0491デフォルトの名無しさん
2008/08/25(月) 20:33:26delete p;
このコードは合法ですか?
つまりdeleteに空ポインタを渡してもOKですか?
0492デフォルトの名無しさん
2008/08/25(月) 20:37:210494デフォルトの名無しさん
2008/08/25(月) 21:08:28C++0xにはnullptrも入ることだし。
0495デフォルトの名無しさん
2008/08/25(月) 21:10:51ISO/IEC14882:2003では 0 を推奨しているので 0 でいい。
0496デフォルトの名無しさん
2008/08/25(月) 21:23:38じゃぁなに使えばいいですか?
0497デフォルトの名無しさん
2008/08/25(月) 21:26:45当面ゼロでいい。
0498デフォルトの名無しさん
2008/08/25(月) 23:28:580499デフォルトの名無しさん
2008/08/26(火) 00:21:420500デフォルトの名無しさん
2008/08/26(火) 00:30:340501デフォルトの名無しさん
2008/08/26(火) 00:34:15誰が0を非推奨にしてる?
0502デフォルトの名無しさん
2008/08/26(火) 00:42:460503デフォルトの名無しさん
2008/08/26(火) 06:05:29そんなことやってコンパイル通る?
もちろんreinterpret_cast使ったら通るだろうけど
C++0xで0が推奨されない理由としては、ポインタではなく数値と解釈されうるせいで、
オーバーロードで自分の予想に反する関数が呼ばれたり、
変な型が型変換にかかってポインタとして扱われたり、
そういう理由だったからだと思う
もっとも、一般には現行のC++でそれを防ぐ術はないけど
もちろん、(void*)0をNULLと定義して(一般のC++ではNULL=0)、
NULL代入するたびにキャストかますのであれば防げるけどね
0504デフォルトの名無しさん
2008/08/26(火) 06:07:100506デフォルトの名無しさん
2008/08/26(火) 10:32:54ここはC++0xスレじゃありませんよ
0507デフォルトの名無しさん
2008/08/26(火) 10:48:07typedef int myint;と宣言した場合、
int a;
myint b;
a=b;
等と行った場合、intにintを代入するよりオーバーヘッドはあるのでしょうか
0508デフォルトの名無しさん
2008/08/26(火) 11:33:490509デフォルトの名無しさん
2008/08/26(火) 11:52:52これで心おきなくtypedefできます
0510デフォルトの名無しさん
2008/08/26(火) 12:40:11組み込み型変数はコンストラクタの初期化リストで初期化するより
代入の方が高速になったんだけど・・・これって普通?
0511503
2008/08/26(火) 12:52:44C++0xで0が非推奨になる理由=C++03で0を使うときに注意すべき事項だろう
というか最初にC++0xの話題振ったのは>>494だけど
0512デフォルトの名無しさん
2008/08/26(火) 13:43:08そんなことになる理由はあんまり考えられないなぁ。
テストしたコンパイラ、とかベンチマークのコードとか挙げてもらわないとなんとも。
0513デフォルトの名無しさん
2008/08/26(火) 14:58:16呼び側
int i=100000000;
int c=clock();
while(i)
{
fw::math::mat44 m;
--i;
}
c=clock()-c;
10回の平均をとった
inline mat44::mat44() : _11(1.0f),_12(0.0f),_13(0.0f),_14(0.0f),_21(0.0f),_22(1.0f),_23(0.0f),_24(0.0f),_31(0.0f),_32(0.0f),_33(1.0f),_34(0.0f),_41(0.0f),_42(0.0f),_43(0.0f),_44(1.0f)
----1.900s----
inline mat44::mat44(){
_11=_22=_33=_44=1.0f;
_12=_13=_14=_21=_23=_24=_31=_32=_34=0.0f;
}
----1.370s----
最適化の有無、デバッグの有無で優劣は変わらず
そんなはずないって言われると気になるな・・・
0514デフォルトの名無しさん
2008/08/26(火) 15:16:120515デフォルトの名無しさん
2008/08/26(火) 15:29:150516デフォルトの名無しさん
2008/08/26(火) 15:33:420517デフォルトの名無しさん
2008/08/26(火) 15:39:060518デフォルトの名無しさん
2008/08/26(火) 16:10:46ここから先は514の言うようにアセンブラと闘わないと分かりそうにないな^^;
0519デフォルトの名無しさん
2008/08/26(火) 16:49:43調べてみたけど分からなかったので教えていただけませんか。
//=============================================================
// Renderer.h
// レンダラークラスの定義
//=============================================================
#ifndef _Renderer_h_
#define _Renderer_h_
#include <d3d9.h>
#include <d3dx9.h>
#include "Common.h"
//=============================================================
// 依存するクラス
//=============================================================
class Scene;
//=============================================================
// Renderer
// レンダラークラス
//=============================================================
class Renderer
{
public:
0520デフォルトの名無しさん
2008/08/26(火) 16:52:49いそん 【依存】
(1)他のものにたよって成立・存在すること。
「食糧の大半を外国に―する」
0521デフォルトの名無しさん
2008/08/26(火) 17:01:30//=============================================================
// 依存するクラス
//=============================================================
class Scene;
を記述しないとコンパイルできないって事ですか
ありがとうございます!
0522デフォルトの名無しさん
2008/08/27(水) 03:59:27あー、初期化リストだとシーケンスポイントが挟まるから、最適化機がいろいろがんばらないと
同じ値の設定をまとめるような形にはならないのかもしれないね。
0523デフォルトの名無しさん
2008/08/27(水) 14:21:55いい加減なコードもコンパイラを通るって有名なんですが?
0524デフォルトの名無しさん
2008/08/27(水) 14:24:16マトリョーシカ(ロシア語だったような)っていうコンパイラ持っていませんか?
いい加減なコードもコンパイラを通るって有名なんですが。
0525デフォルトの名無しさん
2008/08/27(水) 14:44:020526デフォルトの名無しさん
2008/08/27(水) 15:22:070527デフォルトの名無しさん
2008/08/27(水) 15:23:150528デフォルトの名無しさん
2008/08/27(水) 15:44:36そんなコンパイラ聞いたことないぞ
専門学生が卒業制作で作ったようなやつか?
0529デフォルトの名無しさん
2008/08/27(水) 15:46:25あるクラスのオペレータのオーバーロードで
__inline const hoge &hote::operator + () const;
とするとインライン化されるのですが
__inline const hoge hote::operator + () const;
とするとインライン展開されずに関数呼び出しになります
内部処理は*thisを返しているだけです
インライン展開できない条件を調べてみたところ、以下の条件が当てはまるのかと思うんですが
「コピー構築されたオブジェクトを値で受け取る関数を、-GX/EHs/EHa でコンパイルした場合。」
良く理解できず、解決方法が分かりません。どうすれば値渡しでインライン展開できるでしょうか
0530デフォルトの名無しさん
2008/08/27(水) 16:02:44それよりやるべきことはいっぱいある。
0531デフォルトの名無しさん
2008/08/27(水) 16:14:02空のデストラクタを定義していたんですが、それをやめたらうまくいきました。
値渡しだとデストラクタが走るのは分かるんですが、インラインできない理由はよく分かりません^^;
0532デフォルトの名無しさん
2008/08/27(水) 16:19:19529にあるコンパイラオプションはどれも例外処理を使用可能にするものばかりだ。
0533デフォルトの名無しさん
2008/08/27(水) 16:39:140534デフォルトの名無しさん
2008/08/27(水) 20:25:400535デフォルトの名無しさん
2008/08/27(水) 21:46:350536デフォルトの名無しさん
2008/08/27(水) 23:13:450537デフォルトの名無しさん
2008/08/27(水) 23:58:52しかし
bitset<5> bs("10101"); //エラー
bitset<5> bs(string("10101")); //OK
という結果になるのですが、なぜ前者のケースでstring型に暗黙変換
されないのでしょうか?
0538デフォルトの名無しさん
2008/08/28(木) 00:03:580539デフォルトの名無しさん
2008/08/28(木) 00:05:200540デフォルトの名無しさん
2008/08/28(木) 00:07:13explicitだから
0541デフォルトの名無しさん
2008/08/28(木) 00:41:44が可能なので、const char* からstringへの暗黙変換は定義されてると
思うのですが。
0542デフォルトの名無しさん
2008/08/28(木) 01:01:46template<size_t N>
class bitset {
public:
// こっちが本物:エラーになる
template <class CharT, class Traits, class Allocator>
explicit bitset(const basic_string<CharT, Traits, Allocator>&) {}
// 確認用:こっちはOK
explicit bitset(const string&) {}
};
const char*からでは、basic_stringのテンプレートパラメータを推論できない
ちなみにC++0xではconst char*を受け取るコンストラクタが追加される
0543デフォルトの名無しさん
2008/08/28(木) 01:05:43ありがとうございます。
メンバテンプレートのコンストラクタだからですね。
0544デフォルトの名無しさん
2008/08/28(木) 02:04:29「istreamが再定義されています」とかわけの分からないエラーが出るのは悔しいです。
(クラス定義の次の行にstd::istreamを戻り値に持つ関数が定義されている)
ちゃんと「クラス定義の末尾に ; を付け忘れてますよ。ふふふ。」と優しく教えてください。
0545デフォルトの名無しさん
2008/08/28(木) 02:06:43大丈夫、そのうち自身の脳みそがそう指摘してくれるようになるから。
0546デフォルトの名無しさん
2008/08/29(金) 10:48:45以下の[Base.h]でDerivedを宣言した時にBase<T>の型は解決して
[Base.cpp]ではBase<int>::funcがコンパイルされると思うのですが、
リンクエラー(Base<int>::funcがない)になります。
これはどう理解すればよいでしょうか?
[Base.h] // ヘッダファイル
template <typename T> struct Base { T func(void); }; // テンプレートクラス
struct Derived : Base<int> {}; // 型の解決(?)したテンプレートクラスを継承したクラス
[Base.cpp] // 実装
#include "Base.h"
template<typename T> T Base<T>::func(void) { return 0; }
[main.cpp]
#include "Base.h"
int main(void) {
Derived d;
d.func(); // リンクエラー
return 0;
}
0547デフォルトの名無しさん
2008/08/29(金) 11:03:39ヘッダにインラインで書くべき。
exportキーワードで別けられるコンパイラもあるが、gccもBCCもVCもダメ。
0548デフォルトの名無しさん
2008/08/29(金) 11:05:33http://www.google.com/search?q=C%2B%2B テンプレート ヘッダ 実装
0549546
2008/08/29(金) 11:26:32どうも。
テンプレートでは宣言と実装を分けないという基本的な考え方は理解しているのですが、
それは結局はコンパイル時に型解決ができないからですよね。
>>546のコードはどうして型解決ができていないのかというのが質問の趣旨です。
例えば[Base.cpp]内で
Base<int> dummy;
とダミー変数を用意してもダメでした。
0550デフォルトの名無しさん
2008/08/29(金) 11:31:110551デフォルトの名無しさん
2008/08/29(金) 11:33:14実装というのは関数の実装だ。
template<typename T> T Base<T>::func(void) { return 0; }
↑これがダメなの。
型を全部指定したらそれはもはやテンプレートではない。
struct Derived : Base<int> {.....のメンバ関数はcppに実装を書いても通る。
0552デフォルトの名無しさん
2008/08/29(金) 11:42:240553デフォルトの名無しさん
2008/08/29(金) 11:44:06それなら最初からint func(void)にしとけばいいじゃんってことになるからな
0554546
2008/08/29(金) 11:48:58# とりあえず載せます。
コンパイラの気持ちは結局わからなかったのですが、
結果は明らかになりました。
[Base.cpp]
#include "Base.h"
template<typename T> T Base<T>::func(void) { return 0; }
Base<int> dummy;
// ↑これだけだとアウト:オブジェクトファイルBase.oの中身は空っぽ
// ↓これを加えるとOK:Base.o
void func(void) { dummy0.func(); }
つまり、コンパイルされるのは用いられている関数のみでした。
クラスインスタンスを生成しても、使われなかった関数はコンパイルされない、というのは意外でした。
0556デフォルトの名無しさん
2008/08/29(金) 11:59:04h1.a=h2.a+h3.a
h1.b=h2.b+h3.b
h2.c=h2.c+h3.c
と同等のパフォーマンスを出したく、調べていたらRVOと言う方法を見つけたんですが
__inline hoge hoge::operator + ( const hoge &v ) const
{ return vec3(x+v.x,y+v.y,z+v.z); }
とした場合、アセンブラ命令で15命令になってしまいました
RVOではオブジェクトの作成&削除は避けれても値の複製事態は避けられないのでしょうか?
0557デフォルトの名無しさん
2008/08/29(金) 11:59:12関数ポインタについてなのですが
void test(IHoge*(func)(const char*));
という関数に、
CHoge* hoge(const char*);
を渡すことができず、エラーになってしまいました。
IHogeはCHogetの基底クラスのため、暗黙のアップキャストが行われるのを期待したのですが・・・
hoge関数の返り値を変更せずに解決する方法はありませんでしょうか?
0558デフォルトの名無しさん
2008/08/29(金) 12:18:070559デフォルトの名無しさん
2008/08/29(金) 12:28:22IHoge* hogeWrapper(const char* s) { return hoge(s); }
を渡せばいいんじゃない
0560デフォルトの名無しさん
2008/08/29(金) 13:03:33うーん、足してみたけどダメでした
>>559
結構な数のラッパーを書くことになるので、避けたいところです
0561デフォルトの名無しさん
2008/08/29(金) 13:23:53キャスト使うとか?
↓こんな感じ。
// 関数ポインタの型をtypedefしておく。
typedef IHoge*(*RetIHogeFun)(const char*);
// test関数に渡すときにキャストする。
test((RetIHogeFun)hoge);
0562デフォルトの名無しさん
2008/08/29(金) 13:41:03できました!
なるほど、関数ポインタ型にキャストしてやる(書きやすいようにtypedefもしてやる)わけですね。
ありがとうございます。
0563デフォルトの名無しさん
2008/08/29(金) 15:39:21ヘッダーでincludeせずcppの中でvectorをincludeする書き方
ってどんなものがあるでしょうか。
とりあえずメンバを*voidにしておくくらいしか思い浮かばない・・。
0564デフォルトの名無しさん
2008/08/29(金) 15:45:400565デフォルトの名無しさん
2008/08/29(金) 15:47:380566デフォルトの名無しさん
2008/08/29(金) 15:55:520567563
2008/08/29(金) 16:39:25もうちょっと学んでみるけど、これ使ってもポインタにするしかない?
それtも書き方次第なのかな。
0568デフォルトの名無しさん
2008/08/29(金) 18:19:16サイズを知るには実装部を見せるしかない。
なお、ポインタの他に、関数の引数や返り値とする場合も
サイズなしで宣言だけで可能。
でもメンバは無理。
(無茶するならExceptionalC++にchar[]で確保する方法が一応あったけど)
で、おまいが欲しているのはvectorの実体か?
void*を持たせて代わりにするなんてのは、vectorへのポインタ以外にあり得ないが。
0569563
2008/08/29(金) 19:44:51そう、cppでキャストして使う方法。
方法ということで*voidと書いたけど、もしpimplイディオムで実体持たせながら実現
できるならポインタがらみの問題も排除できるかな〜と。
簡単にはいかないようなので、ポインタがらみで問題を増やすなら素直にinclude
することにします。ありがとう。
pimplイディオムというものを知らなかったので勉強になりました。
0570デフォルトの名無しさん
2008/08/29(金) 20:21:48Win32ではない標準のC/C++で他アプリを起動するには
Cのexec system popen のどれかを使用すると調べましたが
他にどのような手段があるのかご教授頂きたく
検索してもWindowsAPI関連サイトが多すぎて歯がゆいっす
0571デフォルトの名無しさん
2008/08/29(金) 20:57:04どれも最終的にはCreateProcessが呼ばれる
気にしてどーすんの
0572デフォルトの名無しさん
2008/08/30(土) 00:38:560573デフォルトの名無しさん
2008/08/30(土) 03:47:150574デフォルトの名無しさん
2008/08/30(土) 04:00:200575デフォルトの名無しさん
2008/08/30(土) 23:08:19つまり、std::coutは窓から投げ捨てろという事ですか?
0576デフォルトの名無しさん
2008/08/30(土) 23:10:58誤変換残しちゃえ
0577デフォルトの名無しさん
2008/08/30(土) 23:27:36cout を使う関数よりは ostream を引数に取る関数のほうが汎用性が高く再利用しやすいということ。
0578デフォルトの名無しさん
2008/08/30(土) 23:53:27実際のところ、その言葉の本質は「大きなスコープで、読み書きされる」ことにあります。
coutから値を取得して本処理に影響を与えるようなコードは問題が有ると言えます。
coutなどは変数なのは、抽象インターフェイスを持たせるためで、
状態を保持させるのが目的ではありません。
グローバルであっても、読むだけの変数(定数)/書くだけの変数(cout他)は、
一般的には許容されと思います。
0579デフォルトの名無しさん
2008/08/31(日) 00:22:56グローバル変数使うなって言うのはプログラムが規模が大きいときに
そんなものが沢山あると収拾がつかなくなるからであって、1画面に
収まるようなショートプログラムなんかでは躊躇無く使って構わない。
0580デフォルトの名無しさん
2008/08/31(日) 00:29:410581デフォルトの名無しさん
2008/08/31(日) 00:31:520582デフォルトの名無しさん
2008/08/31(日) 00:33:57>ショートプログラムなんかでは躊躇無く使って構わない。
そういう場合は害もほぼ無いので基本的には同意ですが、慣れも大事ですよ。
短いプログラム程、グローバル変数なんて無くても困りませんし、
困ってしまう人は、大きなプログラムでもグローバル変数を使ってしまうでしょうからね。
0584デフォルトの名無しさん
2008/08/31(日) 00:50:10金額もアレだけど、
それ以上にカードのみ+ドルだしな。
俺は買う気無いけど、あの売り方は流石にどうかと思う。
0585デフォルトの名無しさん
2008/08/31(日) 00:52:180586デフォルトの名無しさん
2008/08/31(日) 01:09:11581 <= 578 ≪ 577
0587デフォルトの名無しさん
2008/08/31(日) 01:17:18577の「ostreamを引数」 = 578の「抽象インターフェイス」
つまり
理解度
586 ≪ 577-581
0588デフォルトの名無しさん
2008/08/31(日) 02:53:08なかなか辛辣だな
0589デフォルトの名無しさん
2008/08/31(日) 08:09:02と書いたらaもbもcも参照になりますか?
0590デフォルトの名無しさん
2008/08/31(日) 08:17:48int& a = hogea, b = 1;
と書いてコンパイルが通るかとか。
もちろん、厳密には規格に従っているか確認しなければいけないがね。
0591デフォルトの名無しさん
2008/08/31(日) 09:12:19aしか参照型のintにならない。
0592デフォルトの名無しさん
2008/08/31(日) 09:17:50わざわざ上げて馬鹿を披露しなくても良いよ
0593デフォルトの名無しさん
2008/08/31(日) 09:51:49複数の変数を同時に宣言することについて。
メリット
・型を書く必要が無くなり、ソースの文字数を減らせる。
デメリット
・*や&を含む場合、その型名をスマートポインタや
テンプレート引数に変更すると壊れる。
・>>591の仕様を知らない人が、ソースを誤読する。
(知らない構文と思うのでなく、勘違いしたまま読み進めてしまう)
全ての修飾が除かれるわけではなく、例えば、
volatile int a=0;
volatile int* b[]={&a}, c=a;
のとき c は volatile int になる。
0594デフォルトの名無しさん
2008/08/31(日) 14:18:10基本的に複数行に分けて書いた方が良い
0595デフォルトの名無しさん
2008/08/31(日) 15:27:37改良する動きってあるのでしょうか。一貫してない命名規則とかvalarray
のような使い勝手の悪い設計とか。wiki見てもあんまりそのあたり書いて
ないですよねぇ。
0596デフォルトの名無しさん
2008/08/31(日) 15:33:010597デフォルトの名無しさん
2008/08/31(日) 15:33:58今は組み込み系にも広く使われてるんだから、勝手に変えられたら困るなあ
0598デフォルトの名無しさん
2008/08/31(日) 15:38:55互換性互換性言ってたらいつまでたっても汚いまんまではないの。
0599デフォルトの名無しさん
2008/08/31(日) 15:41:11Cの標準化以前の時代からの互換性を引っ張りつづけてるんだから、
いまさら方向転換なんてできないよ。
そういうの嫌いなら一ヶ月ごとにコンパイル通らなくなるD使えばいい。
0600デフォルトの名無しさん
2008/08/31(日) 15:53:09ゆくゆくは折りを見て古い設計がフェードアウト→廃止みたいな
感じで綺麗にしてくれないかな。HTMLみたいに。
0601デフォルトの名無しさん
2008/08/31(日) 16:14:500602デフォルトの名無しさん
2008/08/31(日) 18:36:09auto以外で私が知ってる下位互換じゃなくなる部分では
SFINAEの仕様が明確化されるので今まで曖昧だった部分を使っていたら
コンパイルエラーになるかもしれない、というとこです。
それ以外は基本的に"変更"というのはないです。今後もないでしょう。
0603デフォルトの名無しさん
2008/08/31(日) 18:37:47strstreamとか
0604デフォルトの名無しさん
2008/08/31(日) 18:57:390605デフォルトの名無しさん
2008/08/31(日) 19:14:370606デフォルトの名無しさん
2008/08/31(日) 19:26:02名乗りたいなら最初からトリップつけときゃいいのに・・・
つかこういうつまらん名乗りごっこがしたいならハテナに引きこもっていてほしい
マジウザい
0607デフォルトの名無しさん
2008/08/31(日) 19:36:330608デフォルトの名無しさん
2008/08/31(日) 19:49:51auto_ptr非推奨でunique_ptr新設とかまさにそんな感じ。
0609デフォルトの名無しさん
2008/08/31(日) 20:10:20その後のコメントで晒されたwって言ってるから、
604は本人じゃなさそう。
0610デフォルトの名無しさん
2008/08/31(日) 21:17:140611デフォルトの名無しさん
2008/08/31(日) 21:49:15キチに粘着されたようだなw
質問以外でageてるから>>586=>>586=>>604と予想
0612デフォルトの名無しさん
2008/08/31(日) 21:51:080613デフォルトの名無しさん
2008/08/31(日) 22:00:16貼られて困ること書いたら馬鹿だけど、一応晒されたとは言えると思う。
0614デフォルトの名無しさん
2008/08/31(日) 22:04:01晒されて困るならプライベートモードにでもすりゃいいのに
0616613
2008/08/31(日) 22:09:080617デフォルトの名無しさん
2008/08/31(日) 22:14:16理解に苦しむね
0618デフォルトの名無しさん
2008/08/31(日) 22:20:15たかがtwitterのコメにやけに突っ掛ってるのも不思議だと思うけどな
0619デフォルトの名無しさん
2008/08/31(日) 22:23:35そして、そういう奴がブログ炎上を引き起こす
今回はブログじゃなかったからダメージ少なくてよかったな
いい教訓になったじゃん
0620デフォルトの名無しさん
2008/08/31(日) 22:28:30ブログ炎上とは違うと思うけどな
批判レスならともかく、ただの粘着がくれば普通は嫌がるだろ
0621デフォルトの名無しさん
2008/08/31(日) 22:28:580622デフォルトの名無しさん
2008/08/31(日) 22:32:380623デフォルトの名無しさん
2008/08/31(日) 22:35:28>>603
同意。
なんかあったような気がしてググッたけど見つからなかった。
#errorの警告版みたいなの無かったっけ?
0624デフォルトの名無しさん
2008/08/31(日) 22:40:54処理系依存じゃね?gccなら何か言ってくれそうだけど
0625デフォルトの名無しさん
2008/08/31(日) 22:50:50int main (void) { return 0; }
GCCならこれでwarningが出る
VCなら#pragma message()かね・・・
0626デフォルトの名無しさん
2008/08/31(日) 22:52:06VC++なら#pragma messageでコンパイル時にメッセージ出せる。
メッセージなんで警告数は0になるけど。
0627デフォルトの名無しさん
2008/08/31(日) 22:59:50ディレクティブでなく、処理系拡張の修飾だった。
__declspec(deprecated("test")) void f(){}
としておいて、これでf()を使うと、
warning C4996: 'f' が古い形式として宣言されました。
'f' の宣言を確認してください。
メッセージ: 'test'
って警告が出る。
f()を使わなかったら警告は出ない。
0628デフォルトの名無しさん
2008/08/31(日) 23:12:39#if _MSC_FULL_VER >= 140050320
#define _CRT_DEPRECATE_TEXT(_Text) __declspec(deprecated(_Text))
#else
#define _CRT_DEPRECATE_TEXT(_Text) __declspec(deprecated)
#endif
って書いてあった。
この条件に、_MSC_VERでVC++限定にする#ifも含めて、
別途マクロを定義しておけば良さそう。
直接書いちゃうとVC++でしかコンパイル出来なくなるし。
0629デフォルトの名無しさん
2008/08/31(日) 23:22:48というわけで、とりあえずVC++でのObsoluteみたいなもの。
gccの#warningも混ぜられそうだけど今手元にgcc無いので。
#if _MSC_VER >= 1300
#if _MSC_FULL_VER >= 140050320
#define OBSOLUTE(_Text) __declspec(deprecated(_Text))
#else
#define OBSOLUTE(_Text) __declspec(deprecated)
#endif
#else
#define OBSOLUTE(_Text)
#endif
OBSOLUTE("use f2()") void f(){ /*...*/ }
void f3(){
f(); //警告
}
0630デフォルトの名無しさん
2008/08/31(日) 23:25:34使えるバージョンは知らん
0631デフォルトの名無しさん
2008/08/31(日) 23:31:43というか、クラスまでしかやっていないので、大したものは作れないのですが。
助けt
0632デフォルトの名無しさん
2008/08/31(日) 23:33:50あなたはエスパーか
0633デフォルトの名無しさん
2008/08/31(日) 23:35:29初歩的だが考えるルーチンはこれからのためになる
0634デフォルトの名無しさん
2008/08/31(日) 23:36:38それを言うならOBSOLETEだ
0635デフォルトの名無しさん
2008/08/31(日) 23:36:39�d
確認してないけど、これで良いかも。
>>629の2個目の#elseの前に追記で。
#elif (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))
#define OBSOLUTE(_Text) __attribute__((deprecated))
0636デフォルトの名無しさん
2008/08/31(日) 23:37:59俺も最初は3並べ作ったなあ。
盤と目をクラスとして設計するのもいい練習になるし。
0637デフォルトの名無しさん
2008/08/31(日) 23:39:26ごめんw素で間違えてた。
0638デフォルトの名無しさん
2008/09/01(月) 01:42:42{
class B
{
void F();
};
};
と.hに宣言した場合、
.cppに実装を書く場合、
void A::B::F(){ ... }
と書くと、A::Bは宣言されてないと怒られます。なんで?
gcc バージョン 4.2.3 使用中。
インナークラスは宣言時に実装も書かないとダメ?
0639デフォルトの名無しさん
2008/09/01(月) 02:04:310640デフォルトの名無しさん
2008/09/01(月) 12:38:35ほれ。
クイズゲーム作ってやったぞ
$ cat a.cc
#include <cstdio>
using namespace std;
int main()
{
int hoge;
printf("日本の首都は?");
printf("1.東京 2.京都 3.奈良");
scanf("%d", &hoge);
printf(hoge == 1 ? "正解" : "不正解");
return 0;
}
0641デフォルトの名無しさん
2008/09/01(月) 12:42:400642デフォルトの名無しさん
2008/09/01(月) 12:48:200643デフォルトの名無しさん
2008/09/01(月) 13:09:000644デフォルトの名無しさん
2008/09/01(月) 13:14:250645デフォルトの名無しさん
2008/09/01(月) 13:18:59>#include <cstdio>
>using namespace std;
ワロタ
0646デフォルトの名無しさん
2008/09/01(月) 14:26:23template<class T> class hoge;
こんな感じでおk?
0647デフォルトの名無しさん
2008/09/01(月) 14:33:19付けて.hを付けない新しいタイプのC言語のヘッダって、std名前空間に
C言語のモジュールを入れるためのヘッダじゃなかったっけ?
でも実際はstd名前空間に入ってなくて、グローバル名前空間だよねぇ。
なんでだろ。
0648デフォルトの名無しさん
2008/09/01(月) 14:40:10それはVC6くらいだ。今時のはちゃんとstd名前空間に入れてある。
が、どいつもこいつも中で<*.h>をインクルードしているので、
グローバル名前空間でも使えてしまうのは相変わらずだが。
0649デフォルトの名無しさん
2008/09/01(月) 14:50:44なんだかなぁ。実装者の都合かな。
0650デフォルトの名無しさん
2008/09/01(月) 15:27:430651デフォルトの名無しさん
2008/09/01(月) 15:31:44std::付けなくてもコールできるけど、移植性を考えたらstdにあるつもりで
プログラムしなきゃいけないんだよな。でもそんなことやる奴いるのか?
0652デフォルトの名無しさん
2008/09/01(月) 15:32:520653デフォルトの名無しさん
2008/09/01(月) 15:41:360654デフォルトの名無しさん
2008/09/01(月) 15:52:09それはその通りだが真っ当なプログラマなら当然そのように書くだろ。
>>651で何を言いたいのか分からない。
0655デフォルトの名無しさん
2008/09/01(月) 15:53:11よってstd名前空間を頭につける、という一択しかない。
0656デフォルトの名無しさん
2008/09/01(月) 16:05:270657デフォルトの名無しさん
2008/09/01(月) 16:19:38何が真っ当なプログラマだよ規格書も守らずに
0658デフォルトの名無しさん
2008/09/01(月) 16:23:01日本語通じない馬鹿がなんでこんなにいっぱいいるの?
0659デフォルトの名無しさん
2008/09/01(月) 16:28:15逆だろ。
日本語が通じない馬鹿ではなくて、正しい日本語で相手に自分の
意志をうまく伝えられない自分の馬鹿さ加減を何とかしろ
0660デフォルトの名無しさん
2008/09/01(月) 16:28:350661デフォルトの名無しさん
2008/09/01(月) 17:08:21たぶん一人、二人くらいだと
0662デフォルトの名無しさん
2008/09/01(月) 17:14:28そこで泣く泣く#define SIZE_Tですよ
0663デフォルトの名無しさん
2008/09/01(月) 18:07:53話題提起者(>>651=>>653=>>657)
>>651「ちゃんとstd空間として扱ってる奴居るの?」
>>652「std空間として扱うだろ常識的に考えて」
>>653(652が文意を理解してないと考えて言い換える)
「std空間としてじゃないとまずいんだろ?」
>>654「当然std空間として扱うだろ常識的に考えて」
>>655「std空間一択」
>>656「std::size_tが無い恐怖のEmbedded・・・」
>>657(654が"だが"という言葉を使ったため、
"そのように"をグローバルの方だと認識)
「グローバルは真っ当じゃないだろ」
>>658「勘違いしてるオワタ」
※ 結局全員 std空間として扱うのを推奨
0664デフォルトの名無しさん
2008/09/01(月) 22:23:46>>651が言いたいのは、たいていのコンパイラは新しいC言語ヘッダ(c○○)
を使う場合、std::付けなくてもC言語の標準関数がコールできる。
ただし、std::付けないで組まれたプログラムは、律儀にstd::を付けないと
コールできないようにしているコンパイラ環境では、コンパイルできなく
なってしまう。そういう意味で、移植性を考えるなら、std::がいらない
状況でもstd::を付けてプログラミングするべきという話なんだろう。
0665デフォルトの名無しさん
2008/09/01(月) 23:15:340666デフォルトの名無しさん
2008/09/02(火) 00:50:34代入演算子とは=とか+=とかみたいなの全部(5.17)って書いてるのに
VCとGCCの両方ともグローバルなoperator+=()作れちゃうんだけど
これってどうなの
グローバルな+=とか*=とか作っていーの?
0667デフォルトの名無しさん
2008/09/02(火) 01:33:47によると、その制約は = のみってことで良さそげ。
0668デフォルトの名無しさん
2008/09/02(火) 02:26:56じゃ+=系は+や-と同じただの二項演算子として扱っちゃっていいのね
ありがとう
0669デフォルトの名無しさん
2008/09/02(火) 05:32:49C++の入出力処理は、ストリームバッファなるものを介して行われるようですが
出力時のバッファの役割はなんとなくわかるのですが、入力時のバッファの
役割ってどんな感じなのでしょうか。キーボードから入力してもバッファに
ため込むだけで、実際にプログラムに入力されないみたいなことがあるのでしょうか?
もっといえば、標準入力関数のreadとreadsomeの使い分けがわからないのです。
0670デフォルトの名無しさん
2008/09/02(火) 05:49:34read()は実際にストリームバッファに文字が入力されるまで
そこで停止して待つが、readsome()はストリームバッファに文字
があろうとなかろうと読み取ろうとして停止しない。
もちろんどちらもfailbitやeofbitが設定される。
0671669
2008/09/02(火) 07:31:36ありがとうございます。
動作の違いは理解できました。
が、readsome()の使いどころって想像つきませんね。
まぁキーボードから入力するなどという単純なプログラム作ってるうちは
無理なんでしょうが。
0672デフォルトの名無しさん
2008/09/02(火) 07:38:33readsome()はファイル入出力で生きてくる。
というかstd::cinに対してistream::readsome()が正しく実装されている
処理系は少ないと思う。
0673デフォルトの名無しさん
2008/09/02(火) 08:24:540674デフォルトの名無しさん
2008/09/02(火) 08:26:400675デフォルトの名無しさん
2008/09/02(火) 09:29:30std::min とか std::max とか std::numeric_limits<T>::min()
が置換されてしまうので,
呼び出すときに
std::min BOOST_PREVENT_MACRO_SUBSTITUTION (x, y)
などとしているのですが,長ったらしいので,
(std::min)(x, y)
と関数を括弧で囲みたいのですが,この書き方は規格的に合法でしょうか?
それか他にもっと上手な回避方法はないでしょうか?
0676デフォルトの名無しさん
2008/09/02(火) 09:35:27合法です。
0677デフォルトの名無しさん
2008/09/02(火) 12:07:56あと、もし<windows.h>のだったらNOMINMAXで抑制できる。
0678デフォルトの名無しさん
2008/09/02(火) 13:01:58http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#456
<c...> を使ったら std の名前が使えることは保証されるけどグローバルな名前は使えないかもしれない。
<....h> を使ったらグローバルな名前が使えることは保証されるけど std の名前は使えないかもしれない。
C++0x 以降に備えてこの方針に沿っておくことがおすすめ。
C++ 2003 のうちは、よくわからないってことで、しょうがない。
0679デフォルトの名無しさん
2008/09/02(火) 14:08:22どうすればよいでしょうか?
// インタフェース
struct Hoge {
virtual HogeIterator begin(void);
};
// 実装
struct HogeImpl : Hoge {
HogeIterator begin(void) { container_.begin(); }
vector<int> container_;
};
インタフェースで typedef vector<int>::iterator HogeIterator; とすると実装が見えてしまうし,
インタフェース側で struct HogeIterator; と宣言だけしておいて実装部分で
struct HogeIterator : public vector<int>::iterator {
・・・
};
とするのは大変そうな気がするのですが。
0680デフォルトの名無しさん
2008/09/02(火) 14:21:590681デフォルトの名無しさん
2008/09/02(火) 14:31:50ややこしい文章だなw
イテレータがテンプレートクラスだった場合、
どう足掻いても仮想化出来ないんだからラップすればいい。
※ コンパイルもしてない
struct VirtualIterator {
typedef VirtualIterator Myt;
virtual ~VirtualIterator(){}
VirtualIterator(const Myt& o){copy_from(o);}
Myt& operator++() {incr(); return (*this);}
virtual void incr() = 0;
virtual void copy_from(const Myt& o) = 0;
};
struct Hoge {
virtual VirtualIterator begin() = 0;
};
-- .cpp -----
struct IterImpl : VirtualIterator {
std::vector<int>::iterator it;
void incr(){ ++it; }
void copy_from(const VirtualIterator& o){
IterImpl* p = &o;
it = p->it;
}
};
0683681
2008/09/02(火) 14:41:410684デフォルトの名無しさん
2008/09/02(火) 15:03:22自作のクラス→特定のクラスのキャストを自作クラス内部に記述するやり方ってないでしょうか?
データの配置が同様なのでコピーを作成したくないんです・・・
0685679
2008/09/02(火) 15:49:38同意。
>>680 >>682
これも実は同意で、これまでそういう実装をしていました。
急に気になり始めてしまって…。(麻疹みたいなものですか)
↓みたいにできればシンプルでハッピーなのですが、現状不可です。
class HogeIterator; // in "Hoge.h"
typedef vector<int>::iterator HogeIterator; // in "Hoge.cpp"
0686デフォルトの名無しさん
2008/09/02(火) 17:54:13>コピーを作成したくない
Tokutei* a = new Jisaku(); ってこと?
これなら class Jisaku : public Tokutei{...}
と継承すれば良い。
それとも
Jisaku a;
Tokutei b = a;
ってこと?こっちは当然コピーってことになるけど。
>>685
>急に気になり始めてしまって
そんなふうに考えていた時期が(ry
>現状不可です。
>>681で書いた通り、直接では仮想化出来ないよ。
原理的に。
0687デフォルトの名無しさん
2008/09/02(火) 20:37:49>>686の言うように継承を使うか、
operator Tokutei &() { return reinterpret_cast<Tokutei &>(*this); }
を実装する。
データの配置が同じと言うからreinterpret_castにしてるが、
本当にメモリレイアウトが同じなのか?
そうだとしても偶然や実装依存ではないのか?
ってことはよく考えるべし。
0688デフォルトの名無しさん
2008/09/02(火) 21:02:21取り込まれていると考えていいの?
0689デフォルトの名無しさん
2008/09/02(火) 21:12:05そりゃあ必要に応じて取り込むでしょ
すべてではなく
0690デフォルトの名無しさん
2008/09/02(火) 21:15:36すべて取り込んでたら、
2GBの動画とかメモリ不足で再生出来なくなるだろ
0691デフォルトの名無しさん
2008/09/02(火) 22:57:10かは、実装依存てこと?
0692デフォルトの名無しさん
2008/09/02(火) 23:20:010693デフォルトの名無しさん
2008/09/03(水) 05:09:28>>688はゆとりか?
0694デフォルトの名無しさん
2008/09/03(水) 06:26:210695デフォルトの名無しさん
2008/09/03(水) 06:30:580696デフォルトの名無しさん
2008/09/03(水) 09:07:330697デフォルトの名無しさん
2008/09/03(水) 13:21:31http://pc11.2ch.net/test/read.cgi/tech/1218023777/662
ところでこいつはマトリョーシカなんて開発環境をどこで手に入れたんだろう?
0698デフォルトの名無しさん
2008/09/03(水) 13:29:210699デフォルトの名無しさん
2008/09/03(水) 14:24:33叩かれる傾向があるのさ。
だからちょっと敷居が高く感じるかもね。
0700デフォルトの名無しさん
2008/09/03(水) 14:53:51他所のスレで叩かれて八つ当たりしてるか、或いは生理不順なんだろう。
0701デフォルトの名無しさん
2008/09/03(水) 15:05:150702デフォルトの名無しさん
2008/09/03(水) 15:06:230703デフォルトの名無しさん
2008/09/03(水) 15:38:53あるいは、「初学者」には絶対無くてはならない「自分で試す精神」で、ほんの数行のコードを書いて実験するだけ。
つまり、まともなら質問自体が発生しない話。
PCの基礎知識すら無いか、当たり前の思考力すら無いか、初学者に必須の精神すら無いか。
いずれにせよ、「初学者の、なんてことない質問」になっていないから突っ込まれるんだよね。
0704デフォルトの名無しさん
2008/09/03(水) 15:49:410705デフォルトの名無しさん
2008/09/03(水) 15:57:57一々突っ込むのは(笑)
0706デフォルトの名無しさん
2008/09/03(水) 16:01:050707デフォルトの名無しさん
2008/09/03(水) 16:03:18ファイルを入力用にオープンしたら、ストリームバッファにすべて取り込まれてるかを
調べる 「ほんの数行のコード」 を教えてください。
streambuf::in_avail() を使えば いいと思い以下のコードを確認しました。
#include <iostream>
#include <ostream>
#include <fstream>
int
main()
{
std::ifstream ifs("tmp.bin");
std::cout << ifs.rdbuf()->in_avail() << std::endl;
return 0;
}
環境 cygwin + g++(3.4.4) で 100Mbyte のファイルで 確認したら ファイルサイズがそのまま返ってきました。
$ g++ -Wall -O2 -g tmp.cpp
$ dd if=/dev/zero of=tmp.bin bs=1M count=100
$ ./a.exe
104857600
$
200Mbyte のファイルで確認しても同じでした。
よろしくお願いします。
0708デフォルトの名無しさん
2008/09/03(水) 16:12:36コードは自分で書いてるじゃん
0709デフォルトの名無しさん
2008/09/03(水) 16:40:03参考にならんかもしれんけどBCC5.9.3では0を返した
0710デフォルトの名無しさん
2008/09/03(水) 17:38:230711デフォルトの名無しさん
2008/09/03(水) 17:44:040712デフォルトの名無しさん
2008/09/03(水) 18:38:38> これではC++コンパイラを売っても儲けにならない。
> Microsoftのプログラマたちはこの問題に立ち向かうべく、20年の歳月と120億ドルの開発費をかけて研究を重ねた。
> その結果ついに、タイプミスをしても関数の名前を忘れても、どんな状況下でも適切な補完候補を提示できるIDEを開発した!!
>
>一方ロシアはマトリョーシカ(>>523)を使った。
みたいな?
0713デフォルトの名無しさん
2008/09/03(水) 19:41:24逆だと突っ込まれたやつが来ましたよ。
0714デフォルトの名無しさん
2008/09/03(水) 20:49:24むしろそこはIDEじゃなくてC#が当てはまる気がする。
0715デフォルトの名無しさん
2008/09/03(水) 23:37:560716デフォルトの名無しさん
2008/09/04(木) 01:27:01デストラクタで、ストリームの前処理と後処理を例外安全に行うRAII
オブジェクトということのようですが、実際何をやるんでしょうか。
自前で入出力演算子などをオーバーロードするときに、どういう場合に
使えばいいのでしょうか。
0717デフォルトの名無しさん
2008/09/04(木) 01:44:24C++標準ライブラリより。
sentryオブジェクトは入出力の途中で例外が生じても確実に
処理を終わらせるために設けられている。
出力演算子にsentryを使うには
std::ostream::sentry se(stream);
if (se) {出力を実行}
入力演算子に使うには
std::istream::sentry se(stream, true);
if (se) {入力を実行}
0718デフォルトの名無しさん
2008/09/04(木) 01:45:46不必要にコストが高くなるので、basic_streambufを使うべき、
と書かれている。
0719デフォルトの名無しさん
2008/09/04(木) 02:24:29どうも、何をやるのかってのは、ブラックボックスなんでしょうかね。
0720デフォルトの名無しさん
2008/09/04(木) 02:29:490721デフォルトの名無しさん
2008/09/04(木) 04:41:07char_traits<char>::not_eof(c)は何をやる関数なのでしょうか。
0722デフォルトの名無しさん
2008/09/04(木) 05:16:37iがEOF以外の値であればiを返す
iがEOFであれば処理系依存であるがEOF以外を返す
つまり絶対にEOFを返さないメンバ関数
0723デフォルトの名無しさん
2008/09/04(木) 08:09:33(*this) = rhs;
と自分自身のoperator=を呼び出すのは問題ないでしょうか?
0724デフォルトの名無しさん
2008/09/04(木) 08:53:270725デフォルトの名無しさん
2008/09/04(木) 09:06:220726デフォルトの名無しさん
2008/09/04(木) 09:15:520727デフォルトの名無しさん
2008/09/04(木) 15:04:56ありがとうございました。
0728デフォルトの名無しさん
2008/09/04(木) 16:25:26動的にTCHARの2次元配列を確保したいのですが、下のようなエラーがでます。
error C2440: '=' : 'TCHAR (*)[260]' から 'TCHAR' に変換できません。
こういった場合はどうすれば、いいんでしょうか?
メンバーにszParam[_MAX_PATH]を持った構造体を作ったりするんでしょうか?
TCHAR g_szParam;
void Test(void){
int nCnt = 10;
g_szParam = new TCHAR[nCnt][_MAX_PATH] //ここがエラー
}
0729デフォルトの名無しさん
2008/09/04(木) 16:32:330730デフォルトの名無しさん
2008/09/04(木) 16:37:19だっけ?
うろ覚えで答えたりしてすいません
0731728
2008/09/04(木) 16:51:26有難うございました。1時間位悩んでたので助かりました。
TCHAR (*g_szParam)[_MAX_PATH];
void Test(void){
int nCnt = 10;
g_szParam = new TCHAR[nCnt][_MAX_PATH];
}
0732デフォルトの名無しさん
2008/09/04(木) 18:21:24このタイプのnewをした場合でも、解放するときってdelete[]でいいんでしたっけ?
delete[][]なんてことはないですよねw
0733デフォルトの名無しさん
2008/09/04(木) 18:35:59当たり前だろ。
勉強に3次元配列の確保と解放の仕方を書いてみなさい。
0734デフォルトの名無しさん
2008/09/04(木) 18:40:04p = new int[4][2][3];
delete [] p;
こんなんでいいのかな?
0735デフォルトの名無しさん
2008/09/04(木) 18:41:05,,;f::::::::::::::::::::::ヽ
i::::::::/'" ̄ ̄ヾi
|:::::::| ,,,,,_ ,,,,,,|
|r-==( 。);( 。)
( ヽ :::__)..:: }
,____/ヽ ー== ; ほほう それでそれで?
r'"ヽ t、 \___ !
/ 、、i ヽ__,,/
/ ヽノ j , j |ヽ
|⌒`'、__ / / /r |
{  ̄''ー-、,,_,ヘ^ |
ゝ-,,,_____)--、j
/ \__ /
| "'ー‐‐---''
0736デフォルトの名無しさん
2008/09/04(木) 18:42:13':, ', _____,,.. -‐ ''"´ ̄ ̄`"'' ー 、., /
':, ', >' ´ `ヽ. / し バ
':, / ヽ. ,' な カ
':, ,:' / / ,'´ ヽ. ':,/Ti i. い に
. \ ,' / / ,' ! ; ', ヽ__ /::::| | | で
\ / ,' ,'! /! ! ; /! i 「:::|'´::::::::| | .!. く
∠__,! / !メ、」_,,./| /! / ! ハ! |__」<:::::」」 |. れ
`"'' 、..,,_ ! / ,ァ7´, `iヽ| / |ヽ、」ニイ、 | ! |^ヽ、」」 |. る
i,/レイ i┘ i. レ' 'ア´!_」 ハヽ| | | ∠ ! ?
─-- / ! ゝ- ' ! ! ! | | `ヽ.
/ 7/l/l/ 、 `'ー‐ '_ノ! | i | ` ' ー---
,. -──-'、 ,人 `i`ァー-- 、 /l/l/l | !. | |
ヽ.ソ `: 、. レ' ', u ,/| | ! |
そ 知 i /ーナ= 、 '、 ノ ,.イ,カ ! | |
の っ .|ヘ./|/レへ`>-r =ニi´、.,_ | i ハ ! ,'
く て ! _,.イ´ヽ.7 / /:::| /レ' レ'レ'
ら る | /7:::::! ○O'´ /::::::レ'ヽ.
い .わ .| / /:::::::レ'/ムヽ. /::::::::/ ヽ.
! ! よ ! ./ ,':::::::::::!/ ハ:::::`´:::::::::::;' ',
0737デフォルトの名無しさん
2008/09/04(木) 18:43:43どうやっても1次元。
0738デフォルトの名無しさん
2008/09/04(木) 18:47:370739デフォルトの名無しさん
2008/09/04(木) 20:14:14PA *p = new PA[3];
この動的確保をtypedef無しに生で書くと
int (**p)[5] = new int (*[3])[5];
になると思ったのだが、コンパイル通らん。
どこが間違ってる?
0740デフォルトの名無しさん
2008/09/04(木) 20:30:590741デフォルトの名無しさん
2008/09/04(木) 20:38:250742デフォルトの名無しさん
2008/09/04(木) 20:45:45ありがとうございます。
でもこれってどういうことなんですかね。new演算子の優先順位が
問題なんでしょうが、new int (*[3])[5]; だとコンパイラは
どう解釈しにいってるんだろう。
0743デフォルトの名無しさん
2008/09/04(木) 20:46:14どうもカッコがないとうまくパースできないらしい。
この問題は関数ポインタの配列を確保しようとする時にも
同様に発生した。
詳しい方解説ヨロ
0744デフォルトの名無しさん
2008/09/04(木) 21:03:24結果のint*に配列添え字演算子[5]を付けてると解釈する
でもコンストラクタ引数の*[3]が理解できないからエラー
だと思う多分
0745デフォルトの名無しさん
2008/09/04(木) 21:14:40どてもこのカッコが異質で慣れないもんだから時々悩んでしまうんだよな
0746デフォルトの名無しさん
2008/09/04(木) 22:35:570747デフォルトの名無しさん
2008/09/04(木) 22:52:40いらない事で悩んで時間を無駄にするよりまし
0748デフォルトの名無しさん
2008/09/04(木) 23:27:21ただのバッファで無い限り、1要素に対して、
何か意味のある名前を与えることが出来るはずだ。
0749デフォルトの名無しさん
2008/09/05(金) 00:13:17いや、レアケースではあるけど問題あるからw
0750デフォルトの名無しさん
2008/09/05(金) 00:32:42どういうケース?
0751デフォルトの名無しさん
2008/09/05(金) 00:43:51呼び出している時とか?
0752デフォルトの名無しさん
2008/09/05(金) 01:21:370753デフォルトの名無しさん
2008/09/05(金) 22:32:43そういうノロマまは開発のテンポについていけないから、窓から飛び降りたほうがいい
0754デフォルトの名無しさん
2008/09/06(土) 07:58:07・ランダムアクセス可能
・コピーすると中身もコピーされる
・個数を記憶している
けど、push_backとかで追加することはできないコンテナってある?
0755デフォルトの名無しさん
2008/09/06(土) 08:17:13boost::array
0756デフォルトの名無しさん
2008/09/06(土) 08:24:58なにかを格納するって意味でのただのコンテナならいっぱいある
stlコンテナのことだったら、サイズ固定な時点で定義を外れるので存在しない
0757デフォルトの名無しさん
2008/09/06(土) 08:43:28すまん書き忘れた。
コンパイル時点ではサイズが決まらないんだ。
std::vector<int> v(10);
みたいなかんじで使いたい。
>>756
そうか・・・
自作するしかないかな。
0758デフォルトの名無しさん
2008/09/06(土) 08:46:01ならboost::multi_array
0759デフォルトの名無しさん
2008/09/06(土) 08:49:26おお!
boost::multi_array<int, 1>ってことか!
ありがと!
0760デフォルトの名無しさん
2008/09/06(土) 09:04:17boost::multi_array<*,1,*>{
children
(
#array
(
expr: $c.base_[$i],
size : $c.allocated_elements_
)
)
preview
(
#(
"[",
$c.extent_list_.elems[0],
"](",
#array
(
expr : $c.base_[$i],
size : $c.allocated_elements_
),
")"
)
)
}
でも書いておくとデバッグ時に配列みたいに表示してくれる
上のはmulti_array<int, 1>の場合だけだけど
0761デフォルトの名無しさん
2008/09/06(土) 11:45:010762デフォルトの名無しさん
2008/09/06(土) 15:21:36すげぇ。
>>761
std::vectorだとメモリが倍々で確保されることが多いと聞いたので。
0763デフォルトの名無しさん
2008/09/06(土) 15:34:15作った時点で大きさ決まってて、その後リサイズしないならメモリの問題はないでしょ。
0764デフォルトの名無しさん
2008/09/06(土) 15:44:070765デフォルトの名無しさん
2008/09/06(土) 17:59:080766デフォルトの名無しさん
2008/09/06(土) 18:00:06push_backで容量こえたからって、一個増やして再確保とかははまずやらない
0767デフォルトの名無しさん
2008/09/06(土) 18:11:50単純に倍にするのが素直な実装。
0768デフォルトの名無しさん
2008/09/06(土) 18:53:280769デフォルトの名無しさん
2008/09/06(土) 19:50:200770デフォルトの名無しさん
2008/09/06(土) 19:54:330771デフォルトの名無しさん
2008/09/06(土) 19:55:36void f(){
std::vector<int> s;
std::size_t c=0;
for(int i=0; i<256; i++){
s.push_back(i);
if(c!=s.capacity()){
c = s.capacity();
std::cout << "c=" << c << std::endl;
}
}
}
-------------------------
c=1
c=2
c=3
c=4
c=6
c=9
c=13
c=19
c=28
c=42
c=63
c=94
c=141
c=211
c=316
0772デフォルトの名無しさん
2008/09/06(土) 19:58:09だから、0から順にpush_back()する場合は2倍にすると申し上げてますでしょう。
最初からサイズを指定していれば、2の冪乗になるとは限りませんってば。
0773771
2008/09/06(土) 20:05:09c=1
c=2
c=4
c=8
c=16
c=32
c=64
c=128
c=256
0774デフォルトの名無しさん
2008/09/06(土) 20:07:20ちなみに同じ結果だったわ
0775771
2008/09/06(土) 20:13:15c=4
c=8
c=16
c=32
c=64
c=128
c=256
ちなみにjava6(java.util.ArrayList)はVC++2005同様に1.5倍
実装者の好みって感じなんだろうかね
0776デフォルトの名無しさん
2008/09/06(土) 20:37:18同じMS製のVC++とC#で違うのか・・・。
0777デフォルトの名無しさん
2008/09/06(土) 21:04:200778デフォルトの名無しさん
2008/09/06(土) 21:31:310779デフォルトの名無しさん
2008/09/06(土) 22:10:49経済的な効率を考えるとM$の製品の品質は感慨深いものがある
ユーザーとしてもう少し品質を高めて欲しい気もわからんでもないが
0780デフォルトの名無しさん
2008/09/06(土) 22:44:40{
virtual void draw()=0;
};
class charactor :public drawable
{
...
};
こういう風に継承することで特定のメンバ関数の実装を強制する小さいクラスって何て呼ぶんだっけ?
0781デフォルトの名無しさん
2008/09/06(土) 22:45:130782デフォルトの名無しさん
2008/09/06(土) 22:48:370783デフォルトの名無しさん
2008/09/06(土) 22:54:420784デフォルトの名無しさん
2008/09/06(土) 22:57:070785780
2008/09/06(土) 23:15:260786デフォルトの名無しさん
2008/09/06(土) 23:33:42コンセプトは別物です
0787デフォルトの名無しさん
2008/09/07(日) 00:50:31関数は純粋仮想関数
まぁ、Javaだと全てが仮想関数だしな・・・
0788デフォルトの名無しさん
2008/09/07(日) 01:20:42インターフェイスは抽象クラスのうち全ての関数が抽象関数で実装を持たないクラスのこと、
だと思う。
0789デフォルトの名無しさん
2008/09/07(日) 02:24:45C++の場合は純粋抽象クラスとでも呼んだ方がいいと思うけどな
0790デフォルトの名無しさん
2008/09/07(日) 03:28:510791デフォルトの名無しさん
2008/09/07(日) 03:49:06抽象クラスの方が明確かな
0792デフォルトの名無しさん
2008/09/07(日) 12:50:12C++で書き直して計算させようとしてるとこです。
行列が128*128の時はmatlabに比べて30倍ほど速いのですが、実際に扱い
たい行列1024*1024の時はmatlabと比べて2倍程度にしか速くなりません。
行列の計算自体はドット積です。
大きな行列でもどうしたら速くできますでしょうか?
CPUはインテルのクアドコア3.2GHz、メモリ8G、インテルコンパイラ、OpenMP、行列処理にBlitz++使ってます。
0793デフォルトの名無しさん
2008/09/07(日) 12:58:49キャッシュに乗り切らないから遅いとか。
0794デフォルトの名無しさん
2008/09/07(日) 12:59:440795792
2008/09/07(日) 13:12:51Blitz++と比べてIntel Math Kernel Library使ったら速くなりますか?
0796デフォルトの名無しさん
2008/09/07(日) 13:13:25プロファイルとってみれば?
おそらく、ドット積を普通に計算すると行列全体に満遍なくアクセスするから
メモリキャッシュのヒット率さがってるんじゃないかな。
0797デフォルトの名無しさん
2008/09/07(日) 13:22:500798デフォルトの名無しさん
2008/09/07(日) 13:56:55ある環境ではそうだったんだろうけど、環境が変われば結果も変わる可能性がある。
結局、速度は実測が基本。
0799792
2008/09/07(日) 14:11:08今目の前に居ないので分からないですが、行列のサイズを試しに512*512にしてみたところ一気にパフォーマンスが落ちたので、その通りだと思います。
floatでも試しに計算してみましたが、1024*1024ならdoubleとほとんどか
わり無しでした。
やはり2x6MBのメモリキャッシュがボトルネックみたいです。
大きなサイズの行列でキャッシュを有効に使う方法があれば教えていただける
とありがたいです。
0800デフォルトの名無しさん
2008/09/07(日) 14:30:410801デフォルトの名無しさん
2008/09/07(日) 15:13:28AthlonX2のようなメモリコントローラを内蔵したCPUでFPUも強い
奴を積んでる物の方が多分速いよ
ベンチマークを取ってないからわからんけどクラスタサーバはCoreでは
なくて大抵Opteronで組まれてるし
単に値段が安いだけからかもしれんけど
0802デフォルトの名無しさん
2008/09/07(日) 15:41:390803デフォルトの名無しさん
2008/09/07(日) 15:43:260804デフォルトの名無しさん
2008/09/07(日) 15:45:100805デフォルトの名無しさん
2008/09/07(日) 17:32:38例えば、うっかり2で割る積もりでa * b / 2.0なんて書いたらa * bもdoubleで行なわれてしまう。
0806デフォルトの名無しさん
2008/09/07(日) 17:51:530807デフォルトの名無しさん
2008/09/07(日) 18:02:37速度が気になる事態になってから初めてfloatと比べればいい。
0808デフォルトの名無しさん
2008/09/07(日) 18:04:19double floatはintの倍サイズじゃなくて、floatの倍精度ってことだよな?
すごいアホらしい話だが
0809デフォルトの名無しさん
2008/09/07(日) 18:08:251. floatとintの大きさが同じとは限らない。
2. doubleはfloatの倍という意味での命名だが、倍になっていなくても規格に適合する実装は可能。
ただIEEE 754がすっかり定着しているけど。
0810デフォルトの名無しさん
2008/09/07(日) 18:46:550811デフォルトの名無しさん
2008/09/07(日) 19:52:42doubleがfloatより小さくても全く構わない
だから何だという話だが
0812デフォルトの名無しさん
2008/09/07(日) 20:19:39double が float より小さいのは明らかに規格違反。 (3.9.1 Fundamental types p8)
float の値の範囲については C の規格の FLT_MAX が 1E+37 以上でなければならないことに
なっていて、 C++ もそれに沿うことになる。
0813デフォルトの名無しさん
2008/09/07(日) 20:29:13仮数部に関しては定義はされているの?
0814デフォルトの名無しさん
2008/09/07(日) 20:42:45numelic_limits の digits10 (Number of base 10 digits that can be represented without change) に
あたる FLT_DIG が 6 以上、 DBL_DIG が 10 以上じゃないといけないらしい。
http://www.open-std.org/jtc1/sc22/wg14/
"documents" > "Prei Santa Clara 2008 mailing" > "N1336"
5.2.4.2.2 Characteristics of floating types
0815デフォルトの名無しさん
2008/09/07(日) 21:46:23char=1バイト以外は何も決まってなくてやりたい放題だと思ってた
0816デフォルトの名無しさん
2008/09/07(日) 21:47:320817デフォルトの名無しさん
2008/09/07(日) 22:01:41つーことは、符号もあわせると最低17bit必要ってことか。
0818デフォルトの名無しさん
2008/09/07(日) 22:12:20必須になるのって画像処理とか円周率使うときくらいかな
0819デフォルトの名無しさん
2008/09/07(日) 22:20:37よっぽどでかい配列使うとかSIMD視野に入れて最適化が必要な場合以外は。
0820デフォルトの名無しさん
2008/09/07(日) 22:24:410821デフォルトの名無しさん
2008/09/07(日) 22:30:100822デフォルトの名無しさん
2008/09/07(日) 23:09:06組み込みなんかだと浮動小数点とかいらなかったりしないか?
0823デフォルトの名無しさん
2008/09/07(日) 23:13:19でぐぐれ
0824デフォルトの名無しさん
2008/09/07(日) 23:15:50そんなターゲットもあるだろうけど、だから何だというの?
コンパイラメーカーの決めることじゃないだろ。
0825デフォルトの名無しさん
2008/09/07(日) 23:30:09コピーするときに浮動小数点レジスタ使うこともある
0826デフォルトの名無しさん
2008/09/08(月) 01:21:350827デフォルトの名無しさん
2008/09/09(火) 23:03:15・Type.getType()相当のプリミティブ
・Invoke()相当のプリミティブ
があれば文字列をえっちらおっちらこさえれば.NET Frameworkのコードが呼べるはず。
これならスタック二段増えるだけなので手間じゃないはず。(文字列こさえるのはともかくとしてね……)
大本のプリミティブの下に積んでやれば下位互換性も保たれる。
0828デフォルトの名無しさん
2008/09/10(水) 07:04:280829デフォルトの名無しさん
2008/09/10(水) 07:20:18今までテンプレートを自分で書いたことがなかったので、試しに今までクラスで書いていた
コードに手を加えてテンプレートクラス化してみて気づいたのですが、クラスと違って
テンプレートの実装は宣言とは別に書くことってできないみたいですね。
(コンパイル時にテンプレートにはまる型が決まらないといけないのだと理解しました)
というわけで宣言と実装をヘッダーでやればいんでしょうけど、そうすると関数の一覧が
見えにくいような気がするんですが.... そんなもんでしょうか?
もしかして分けて書く方法もあったりします?
0830デフォルトの名無しさん
2008/09/10(水) 07:46:11同じファイルでだが
ファイルを分けてそれぞれコンパイル、という意味で分けるというのなら確かにできない
理由はあなたが言った通り
0831デフォルトの名無しさん
2008/09/10(水) 07:47:030832デフォルトの名無しさん
2008/09/10(水) 07:59:28>言葉のあやなんだろうけど、定義と宣言を分けること自体はできる
あ、もしかして単純に一個のファイルになってたらいいですかね?
一つのファイルの前半が宣言、後半が実装みたいな。
だったらヘッダファイルの後半で #include "hogehoge.cpp"みたいにすればファイル分割
も一応可能、みたいな。
0833デフォルトの名無しさん
2008/09/10(水) 08:39:10#includeでの埋め込みはコンパイル前なので確かにできます
でもそもそもクラス宣言があると関数一覧が見えにくいというのがよく解からんが
0834デフォルトの名無しさん
2008/09/10(水) 08:53:47テンプレートでも.inlファイルって使うのかな
0835デフォルトの名無しさん
2008/09/10(水) 09:00:55>#includeでの埋め込みはコンパイル前なので確かにできます
確かに、試してみたらよさげです。
>でもそもそもクラス宣言があると関数一覧が見えにくいというのがよく解からんが
テンプレートに限らず普通にクラスを定義するとき、
メンバ関数の宣言と実装を一緒に書く方式(ってもしかして意味不明ですか? もっと標準
的な言い方があったら教えてください)で全部書くと、
そのファイルでメンバ関数の一覧だけ参照したいとき、見にくくないですか? という程度の
ことなんですが...
0836デフォルトの名無しさん
2008/09/10(水) 09:28:56ヘッダファイル内で分けて書いていけない理由はない
0837デフォルトの名無しさん
2008/09/10(水) 09:49:20俺はdoxygen用のコメントでうざくなるから分けて書くが
0838デフォルトの名無しさん
2008/09/10(水) 11:28:260839デフォルトの名無しさん
2008/09/10(水) 13:47:31に
char *arr[30];
を渡すと
引数を 'char *[30]' から 'const char *[]' に変換できません。(新しい機能 ; ヘルプを参照)
というエラーが出ます.
char *からconst char*なら暗黙に変換してくれると思うんですがなぜでしょうか
0840839
2008/09/10(水) 13:48:27環境はvc++ 2008です
0841デフォルトの名無しさん
2008/09/10(水) 13:53:160842デフォルトの名無しさん
2008/09/10(水) 13:53:260843デフォルトの名無しさん
2008/09/10(水) 14:01:45腑に落ちないもので...すみません
>>842
変更できない文字,へのポインタ,の配列
が仮引数だと思っていますがあっていますか?
0844デフォルトの名無しさん
2008/09/10(水) 14:34:16void f(const char* a[]){}
const char *arr[30];
f(arr);
とするか
char *arr[30];
void f(char* const a[]){}
f(arr);
とすると通るんだな、んでどこがconstかというとポインタという事なんだが、一応C++の規則どおりな訳ですが・・・
おれなんかはオーバーロードして
void f(const char* a[]){}
void f(char* a[]){}
reinterpret_cast でやるか template を使ったりと
0845デフォルトの名無しさん
2008/09/10(水) 14:38:20const char は char の const
間違いを指摘したような文書になってしまった
0846839
2008/09/10(水) 14:40:45f()はaを介して値が変更されない事を前提にしているので,
変更することのできるarrを受け取るわけにはいかない,ことは納得しました.
スレ汚しすみません
0848デフォルトの名無しさん
2008/09/10(水) 14:45:53typedef const char * cp_char;
void f(cp_char a[]) {}
cp_char arr[30];
f(arr);
const が自動でついたり外れたりするのは、以下のの位置
void f(const cp_char a[]) {}
const cp_char arr[30];
f(arr);
んで、この const は元々どこだよというと
void f(char * const a[]) {}
char * const arr[30];
f(arr);
死ねるw
0849デフォルトの名無しさん
2008/09/10(水) 14:49:46const char と char const は、同じ型、最初の宣言は互換のためで、これだけ規則が例外だ!!
const は左側を修飾するから、
char const * const a[]
といった書き方にしたら見通しがいいかも知れない。
0850839
2008/09/10(水) 15:07:55からcdeclとか言うプログラムを落として使ってみたところ,
宣言の違いはよく分かりました.
(1) const char *a[];
declare as array of pointer to const char;
(2) char * const a[];
declare as array of const pointer to char;
f()の中で
a[0] = ...;
という処理を行っているので2番目の書き方はできなさそうです.
元々
char arr[30];
const char arr[30];
のどちらでも引数とできる関数を作りたかったのですが,
仮引数は(1)も(2)も駄目で結局
void f(char*a[]){}
とするか>>844さんのようにオーバーロードするしかなさそうです.
>>849 さんのものはなじみが薄いのですが
char const * const a[];
declare as array of const pointer to char const;
と言う事なので恒久的に変化しない文字列配列に使用するのでしょうか.
0852デフォルトの名無しさん
2008/09/10(水) 15:53:52const char * const p; // アドレスもデータも変更できない。
const char * p; // データは変更できないが、アドレスは変更できる。
char * const p; // アドレスは変更できないが、データは変更できる。
char * p; // アドレスもデータも変更できる。
Effective C++
0853デフォルトの名無しさん
2008/09/10(水) 16:01:020854デフォルトの名無しさん
2008/09/10(水) 20:49:40DがGCを捨てると決意するまでは絶対にない
GCを持つ言語がC/C++に取って代わることは永遠にないよ
用途によって部分的に置き換わることはあっても
0855デフォルトの名無しさん
2008/09/10(水) 21:22:03移植性がある答えをおながいします
0856デフォルトの名無しさん
2008/09/10(水) 21:30:53どの程度の移植性かが微妙だけど標準に沿えとかいうんじゃむり
ieee754なら直接ビット見れば判定できるよ
0857デフォルトの名無しさん
2008/09/10(水) 21:34:03VCであれば_isnanを使えばいいようですが、
インテルコンパイラの場合どうするんでしたっけ。
0858デフォルトの名無しさん
2008/09/10(水) 21:41:23public:
std::string m_str;
CHoge(){m_str.empty();}
void addText(std::string str){m_str+=str;}
void print(){cout << m_str.c_str() << endl;}
};
void SetStr(CHoge* hoge){
std::string bar= "ponyo";
hoge->addText(bar);
}
void main(){
CHoge* hoge = new CHoge;
SetStr(hoge);
hoge->print();
}
これって正しいですか?
SetStrの std::string bar = "ponyo";
のSetStrを出た後の生存期間とかで問題は起きませんか?
一応、この単純なプログラムは正常に動作している(ように見える)のですが
別のもっと複雑なアプリで同じような部分で問題がおきていて、
生存範囲の問題なのかなぁとか思って
上記のように単純に切り出して再現してみたところ上手くいってしまいまして・・・
でもたまたま上手くいってるという場合も考えられるので・・・
どうでしょうか。教えて下さい。
環境はVS2005です。
0859デフォルトの名無しさん
2008/09/10(水) 21:44:02CHoge(){m_str.empty();}
は
CHoge(){m_str.clear();}
じゃないの??
emptyは空かどうかを調べるだけのメソッドだし。
正直stringクラスのデフォルトコンストラクタで空文字になるから、
m_str.clear()も入れる必要ないけど。
0860デフォルトの名無しさん
2008/09/10(水) 21:45:270861デフォルトの名無しさん
2008/09/10(水) 22:21:37すいません、勘違いしておりました。
それで、、、本題の方はどうなんでしょうか?
0862デフォルトの名無しさん
2008/09/10(水) 22:25:23でも、C++0xでもGCを実装しやすくするための機構が導入されるんでしょ?
0863デフォルトの名無しさん
2008/09/10(水) 22:28:11「でも」はおかしいだろ。
0864858
2008/09/10(水) 22:40:54すいません。ひとまずそこを直したら上手く動いたようです。
0865デフォルトの名無しさん
2008/09/10(水) 23:08:32一応補足しておくと addText は値渡し、つまりコピーして引数を渡しているので問題は発生しない。
0866デフォルトの名無しさん
2008/09/10(水) 23:43:32DはGCを常に使うことが出来、C++0xはGCを使うことも出来る。
ゆえにDのライブラリは常にGC前提で書くことが出来、
C++のライブラリはGCを前提とすることと汎用性がトレードオフになってしまう。
しかし逆にDはGCのメリットと共にデメリットも常に持つことになり、
C++ではGCのメリットを十分に享受出来ないとしても、
デメリットを排除出来ることを重要視している。
まぁGCもかなり進歩してるし、設計思想の違いってところだろうけどな。
GCだけが理由じゃないだろうけど、その辺のために
Dが使われることが増えてきたとしても置き換わる事は無いだろう。
0867デフォルトの名無しさん
2008/09/11(木) 03:06:250868デフォルトの名無しさん
2008/09/11(木) 03:12:500869デフォルトの名無しさん
2008/09/11(木) 03:18:16はい、そうです。
0870デフォルトの名無しさん
2008/09/11(木) 08:53:05リンクエラーを解消するために、
mainが書いてある*cppファイルのヘッダすべてにextern "C"をつけました。
ヘッダには、ほかの*.cファイルの関数の定義が書いてあります。
これでうまく動くとおもったんですが、まだリンクエラーが取れません。
*.libも全部リンクしてあるし、原因がわかりません。
他になにかこのエラーが出る原因ってありますか?
0871デフォルトの名無しさん
2008/09/11(木) 08:56:260872デフォルトの名無しさん
2008/09/11(木) 08:59:42とりあえずエラーはってくれよ
0873デフォルトの名無しさん
2008/09/11(木) 09:06:51エラー 47 error LNK2001: 外部シンボル "_fatal_error" は未解決です。 dspfeat.obj
エラー 48 error LNK2001: 外部シンボル "_fatal_error" は未解決です。 sift.obj
エラー 49 error LNK2001: 外部シンボル "_fatal_error" は未解決です。 xform.obj
エラー 50 error LNK2019: 未解決の外部シンボル _gsl_rng_free が関数 _ransac_xform で参照されました。 xform.obj
こんなのがでてます…
0874デフォルトの名無しさん
2008/09/11(木) 09:36:290875デフォルトの名無しさん
2008/09/11(木) 10:19:32リンクする前の.oをobjdumpしてちゃんとシンボル名が合ってるか確認してみ
0876デフォルトの名無しさん
2008/09/11(木) 10:55:090877デフォルトの名無しさん
2008/09/11(木) 10:58:06わけもわからずにやってるんじゃないか。
0878デフォルトの名無しさん
2008/09/11(木) 12:35:52関数は全部自分でつくったやつです。
mainの入ってるのが*.cppで
のこりは全部*.cです。
いろいろと定義してあるヘッダファイルを*.cppの中で
extern "C"{ } しています。
>876
objdumpというのは初めてききました。探してみます。
>877
間違ってるかもしれませんが、cppだとふyじこlp@関数名というふうに自動でリネームするので、
そうならないようにextern"C"をつけてcの関数を読み込むんだということを調べました。
0879デフォルトの名無しさん
2008/09/11(木) 12:41:55だからよ、_fatal_errorのような、先頭がアンダースコアなのはextern "C"してるってことだが
fatal_errorの実体はextern "C"してないんじゃないかってことだ。
具体的には、fatal_errorというグローバル変数がどこかにあって、
ヘッダファイルで extern "C" 付きで extern宣言してるんじゃないかってこと。
0880878
2008/09/11(木) 15:52:19解決できました。
VisualStudioの設定でlibを追加したり***.hを*.cに書き込んだりしたら動きました。
0881デフォルトの名無しさん
2008/09/11(木) 17:47:37見かけません。何か問題あるんでしょうか?
それとも、たまたま私が遭遇してないだけ?
0882デフォルトの名無しさん
2008/09/11(木) 17:48:030883デフォルトの名無しさん
2008/09/11(木) 18:33:250884デフォルトの名無しさん
2008/09/11(木) 18:37:560885デフォルトの名無しさん
2008/09/11(木) 19:24:530886デフォルトの名無しさん
2008/09/11(木) 19:24:59ただ、gccのname()で返される文字列が、とてもhuman readableとは思えないが。
MSVCなら分かりやすい。
0887デフォルトの名無しさん
2008/09/11(木) 21:46:15の数値のリストがあって、
ある数 t が与えられたときに
t が valueList の中で何番目に小さな数字か
ってのを求めたいんだが、
エレガントにやるにはどうしたらいい?
って相談されたんだがどうすればいい?
0888デフォルトの名無しさん
2008/09/11(木) 21:47:480889デフォルトの名無しさん
2008/09/11(木) 23:06:19count_ifでtより小さい要素の数を数えるとか。
0890デフォルトの名無しさん
2008/09/11(木) 23:35:05nth_elementはどう?
0891デフォルトの名無しさん
2008/09/11(木) 23:52:51とんくす
0892デフォルトの名無しさん
2008/09/12(金) 00:18:40何したいかによるが場合によってはvectorじゃなくてmultisetとか使ったほうがいい気がする
0893デフォルトの名無しさん
2008/09/12(金) 07:41:01tが何番目に小さいか、何回も求めるならこれが最速じゃないかな。
0894デフォルトの名無しさん
2008/09/13(土) 22:06:50struct Foo
{
Foo() { /* 初期化処理 */ }
};
int hoge()
{
static Foo foo;
// do something...
return 0;
}
関数 hoge() が初めて呼び出された直後に、別のスレッドからも hoge() が呼び出された場合、
クラス Foo のコンストラクタが一回しか実行されないことは保証されるのでしょうか?
初期化の実装が
bool foo_is_constructed = false;
int hoge()
{
if (foo_is_constructed == false)
{
foo_is_constructed = true;
// Foo foo; のコンストラクタ呼び出し
}
return 0;
}
みたいになってたらまずいと思うのですが。。。
しかもアセンブリ吐かせて眺めた限りではそんな気がします。。。
0895デフォルトの名無しさん
2008/09/13(土) 22:45:34コンパイラにオプションがあって、かつ、ユーザがそれを指定しない限り
全くされないと思ったほうがよい
スレッド間の同期というのは、システムによっては数千クロック以上の
ペナルティがかかることもあるぐらい、かなり重たい処理なのです
コアが違うとキャッシュなんかも、からんできますからね
だから、勝手にそんなことをされたら、性能が落ちるから、
原則止めましょうというのがC/C++系の思想と思います
0896デフォルトの名無しさん
2008/09/13(土) 23:01:460897デフォルトの名無しさん
2008/09/13(土) 23:51:16なるほど。マルチスレッド・マルチコアがらみはユーザ・ライブラリ側で調整するべきと言うことですね。
そもそも C++ にはスレッドという概念がありませんでした。。。
>>896
勉強になります。Java では二重チェックしてもうまく働かなかったりするらしいですね。おそろしや〜
せっかくなのでマクロを考えてみました (C99 と BOOST がごっちゃになってますが)
#define STATIC_VARIABLE(type, name, ...) \
static boost::shared_ptr<type> p_##name;\
if (!p_##name)\
{\
static long l = 0;\
if (BOOST_INTERLOCKED_INCREMENT(&l) == 1) p_##name.reset(new type(__VA_ARGS__));\
}\
type &name = *p_##name
いや、こりゃだめだ
0898デフォルトの名無しさん
2008/09/13(土) 23:52:030899デフォルトの名無しさん
2008/09/14(日) 00:48:52つまりこういうことですか
class SpinLock
{
public:
SpinLock() { while (locked || InterlockedExchange(&locked, 1)) { } }
~SpinLock() { InterlockedExchange(&locked, 0); }
private:
static long locked;
};
long SpinLock::locked = 0;
int foo()
{
SpinLock sl;
// do something
return 0;
}
while (...) { } のあたりがスピンです
0900デフォルトの名無しさん
2008/09/14(日) 07:59:420901デフォルトの名無しさん
2008/09/14(日) 08:16:44lockedのテストとInterlockedの呼び出しの間に別スレッドに簡単に割り込まれるじゃん。
何のためにInterlockedCompareExchangeがあると思ってるんだよ。
0902デフォルトの名無しさん
2008/09/14(日) 08:26:32http://pc11.2ch.net/test/read.cgi/tech/1187008532/850-858
とかね。読めないかもしれないが。
0903デフォルトの名無しさん
2008/09/14(日) 08:45:010904デフォルトの名無しさん
2008/09/14(日) 10:45:100905デフォルトの名無しさん
2008/09/14(日) 13:31:050906デフォルトの名無しさん
2008/09/14(日) 14:34:23すみませんでしt。
0907デフォルトの名無しさん
2008/09/14(日) 17:25:05合計を出すのとは別の方法はありますか?オーバーフローは考えなくてかまいません。
・シンプルなコード
・高速なコード
のどちらかを期待しています。両方かなえばうれしいです。
0909デフォルトの名無しさん
2008/09/14(日) 17:31:120910デフォルトの名無しさん
2008/09/14(日) 17:36:24いったんHDDに保存しておいて10Mずつ位読み込んで足す。
HDD(仮想メモリ)に連続アクセスするより確実にメモリに乗っていた方が読み込みが速い
0911907
2008/09/14(日) 18:00:13素晴らしい。やはりこのようなものがあったのですね。
>>908
すみません、誤差も考えなくて良いです。
数値解析の元ネタにするもので、有効桁数6桁くらいで大丈夫です。
>>910
なるほど、スレッドですか。ちょっと試してみます。
すばやい回答、ありがとうございました。
0912デフォルトの名無しさん
2008/09/14(日) 18:15:15複スレッド化しても必ずしも速くなるとは限らんよ。
プロセッサの得手不得手が出るところでもあるから、
あるプロセッサで測って最速なのが他でもそうだとも限らない。
0913デフォルトの名無しさん
2008/09/14(日) 18:17:590914デフォルトの名無しさん
2008/09/14(日) 18:20:31うちのPCはメモリ512Mだから、1ギガ確保するとOSが不安定になって相当掛かる。
0915デフォルトの名無しさん
2008/09/14(日) 18:23:34そんなもんverctorで持つなよw
0916デフォルトの名無しさん
2008/09/14(日) 19:10:040917907
2008/09/14(日) 19:15:21一度に処理するのが100万個なんです。
GBレベルの処理を考えてくださった方は申し訳ありませんでした。
0918デフォルトの名無しさん
2008/09/14(日) 19:29:340919デフォルトの名無しさん
2008/09/14(日) 20:03:170920デフォルトの名無しさん
2008/09/15(月) 23:49:010921デフォルトの名無しさん
2008/09/15(月) 23:50:240922デフォルトの名無しさん
2008/09/19(金) 07:46:00のメンバ関数を参照するときにはどうすべきか悩んでいます。
例えば基底クラスBaseClassにfoo()という関数があったとしてこれを派生クラス
DerivedClassのfoo()で拡張するとき、
DerivedClass::foo()
{
// まず基底クラスのfoo()を実行 --- (1)
// 次に独自の処理を実行 -- (2)
}
としたいのですが(1)はどう呼ぶべきでしょうか。Objective-Cだとsuperという予約語で
基底クラスを参照できたのですが。C++でそれに該当するものはないようですね。
とりあえずBaseClass::foo()と、スコープ解決演算子(ですよね?)を書けばよさげなんで
すが、ちょっと柔軟性に欠けるような気がしました(例えば基底クラスが変わったときとか、
クラスが何回層かになっている時とか)。
0923デフォルトの名無しさん
2008/09/19(金) 08:02:58そもそも関数名を同じにしなければ解決するんじゃない?
class super
{
virtual void foo(){ bar(); }
void bar(){ /* ... */ }
};
class sub : super
{
void foo(){ bar(); /* ... */ }
};
とか。
C++で基底クラスを示す方法がないのは、多重継承を認めてるから
0924デフォルトの名無しさん
2008/09/19(金) 08:03:500925デフォルトの名無しさん
2008/09/19(金) 08:53:460926デフォルトの名無しさん
2008/09/19(金) 09:39:40hoge.so
にしてpythonから呼んでるのですがsoをgdbでデバックするにはどうすればいいのでしょうか?
0927デフォルトの名無しさん
2008/09/19(金) 10:05:19D&Eの13.6 にこの機能が標準化委員会に提案され、却下された経緯が書いてある。
0928デフォルトの名無しさん
2008/09/19(金) 15:56:26よいのでしょうか?
// オーバーロード
template <class T> void foo(const T &) { }
void foo(const std::string &) { }
// 特殊化
template <class T> void foo(const T &) { }
template <> void foo<std::string>(const std::string &) { }
0929デフォルトの名無しさん
2008/09/19(金) 15:58:39って言うかテンプレートのオーバーロードなんて考えたことなかったな
0930デフォルトの名無しさん
2008/09/19(金) 16:03:39temlate <class T> void foo(const T &) { }
void foo (int) { } // int では値で受け取る
のような事ができるので、こちらも捨てがたいのです。
オーバーロードが一般的でないとすれば、何か理由があるのでしょうか?(部分特殊化の可否?)
0931デフォルトの名無しさん
2008/09/19(金) 17:41:14特殊化だと、汎用テンプレートがあるよっ!って教えてくれるから読みやすいよな。
0932デフォルトの名無しさん
2008/09/19(金) 18:52:29確かに可読性という意味では、特殊化に分がありますね。
しかし
class Hoge { };
template <class T> void foo(const Hoge &, const T &) { }
template <class T> void foo(const T &, const Hoge &) { }
void bar() { foo(Hoge(), Hoge()); } // エラー! テンプレートの解決が曖昧
のような状況を考えれば(二項演算子をテンプレートにする場合など)、
オーバーロードも捨てられない気がします。
0933デフォルトの名無しさん
2008/09/19(金) 19:11:55template<typename T>
class Hoge{
#if sizeof(T)==1
char piyo(){
return (char)T;
}
#endif
};
みたいな?
0934デフォルトの名無しさん
2008/09/19(金) 19:28:29プリプロセスはテンプレートの実体化より前に行われるからできないでしょ。
ていうかマクロ使ってないし。
どうしてもやりたければ
#include <boost/static_assert.hpp>
template <typename T>
class Hoge
{
public:
char piyo()
{
BOOST_STATIC_ASSERT(sizeof(T) == 1);
return reinterpret_cast<char>(*this);
}
};
みたいなことをすればいい。
でももっといいやり方があると思うよ。
0935デフォルトの名無しさん
2008/09/19(金) 21:07:50template<typename T, std::size_t Size = sizeof(T)>
class Hoge { };
template<typename T>
class Hoge<T, 1>
{
char piyo() { return xxx; }
};
0936デフォルトの名無しさん
2008/09/19(金) 23:50:37多重定義したいので、型を丸々 template で受け取るってのは無しで。
0937デフォルトの名無しさん
2008/09/19(金) 23:55:530938デフォルトの名無しさん
2008/09/20(土) 00:18:25void hoge(int *first, int *last);
void hoge(std::vector<int>::iterator first, std::vector<int>::iterator last);
void hoge(std::list<int>::iterator first, std::list<int>::iterator last);
...これをネタにもう少し詳しく。意味が分からん。
0939デフォルトの名無しさん
2008/09/20(土) 01:52:37void print( int i ) {
cout << i;
}
template<class T>
void print( const iterable<T>& xs ) {
for( const T& x : xs ) {
print( x );
}
}
この iterable のところを、 std::list なんかの具体的な方を書かずに実装できるのかな、という質問です。
0940デフォルトの名無しさん
2008/09/20(土) 02:00:35template<class T> class C {};
void g()
{
C<int> c;
f(c);
}
0941デフォルトの名無しさん
2008/09/20(土) 02:12:280942デフォルトの名無しさん
2008/09/20(土) 04:53:33いや、オーバーロードの方が一般的でしょう。
C++ Coding Standards 66項でも、
関数テンプレートの特殊化ではなく、
オーバーロードで解決する方が望ましいとしてる。
0943デフォルトの名無しさん
2008/09/20(土) 04:57:47#include <iostream>
#include <iterator>
#include <type_traits>
#include <array>
#include <boost/utility/enable_if.hpp>
template<typename Iter>
struct is_int_iterator : std::tr1::is_same<typename std::iterator_traits<Iter>::value_type, int> {};
template<typename Iter>
void f(Iter first, Iter last, typename boost::enable_if<typename is_int_iterator<Iter> >::type* = 0)
{
std::cout << "int" << std::endl;
}
template<typename Iter>
void f(Iter first, Iter last, typename boost::disable_if<typename is_int_iterator<Iter> >::type* = 0)
{
std::cout << "not int" << std::endl;
}
int main()
{
int i[5];
std::tr1::array<long, 3> l;
f(&i[0], &i[5]);
f(l.begin(), l.end());
}
0944デフォルトの名無しさん
2008/09/20(土) 10:08:52> template<template<class> class A, class B> void f(A<B> x);
の"template<class> class A"という書き方初めて見たけど、なんていうの?
0945デフォルトの名無しさん
2008/09/20(土) 10:22:06ずばりそんな書き方でできると思うんだがなにか問題があったのか?
0946デフォルトの名無しさん
2008/09/20(土) 11:04:24Template Template Parameter
まず使うことはないな。
0947デフォルトの名無しさん
2008/09/20(土) 12:09:19operator<<が見つからないというエラーが出ます
#include <iostream>
template <template <class> class A, class B>
void f(A<B> x)
{
std::cout << x << std::endl;
}
template <class T>
class C {
T i;
public:
C(T c = 123) : i(c) {}
friend std::ostream& operator<<<T>(std::ostream& os, const C<T>& c);
};
template <class T>
std::ostream& operator<<<T>(std::ostream& os, const C<T>& c)
{
os << c.i;
return os;
}
void g()
{
C<int> c;
f(c);
}
int main()
{ g(); }
0948デフォルトの名無しさん
2008/09/20(土) 12:41:460949デフォルトの名無しさん
2008/09/20(土) 12:56:06コンパイラはMinGW (gcc 3.4.5) を使っています。
0950デフォルトの名無しさん
2008/09/20(土) 13:13:30mainに全角空白があるから
0951デフォルトの名無しさん
2008/09/20(土) 13:23:06こんな構文があるんですね。知らなかった。でも一引数のテンプレートクラス = コンテナとするにはちょっと乱暴かな…。
>>943
boost::mpl とか、つい避けてきたんですが、便利ですね。
( type* = 0 というテクニックすら初めて知りました…)
コンテナを受け取る関数は
template<class T> void f( const T& xs, T::const_iterator* = 0 );
とりあえずはこのくらいでも十分かな。
>>945
えっと、具体的にはどう書けばいいんでしょうか。
0952デフォルトの名無しさん
2008/09/20(土) 13:55:21おっしゃる意味がわかりません。
全角文字など使っていません。
0953デフォルトの名無しさん
2008/09/20(土) 13:57:49投稿した奴には空白混ざってるよ
まぁ除いてもコンパイルは通らないけど
0954デフォルトの名無しさん
2008/09/20(土) 14:05:32class C {
...
template<class U>
friend std::ostream& operator<<(std::ostream&, const C<U>&);
};
template <class T>
std::ostream& operator<<(std::ostream& os, const C<T>& c) {
...
}
もしくは
template<class T>
class C {
...
friend std::ostream& operator<<(std::ostream&, const C<T>&) {
...
}
};
若干意味が違うけど。
0955デフォルトの名無しさん
2008/09/20(土) 14:06:23そうですそのコンパイルが通らない理由を知りたいのです。
全角文字は投稿の際にもしかして混ざってしまったのかもしれませんが
ソースには入っておりません
0956デフォルトの名無しさん
2008/09/20(土) 14:10:06ありがとうございます。無事コンパイルが通りました。
0957デフォルトの名無しさん
2008/09/20(土) 14:15:03他の人には分からないよね。
そして、全角空白によってもコンパイルが通らないわけで。
だから、それに気が付いたすごく親切な人が親切に教えてくれたわけで。
一応、俺だったら礼はするな。
0958デフォルトの名無しさん
2008/09/20(土) 14:18:290959デフォルトの名無しさん
2008/09/20(土) 14:20:12いちゃもん付けるな
それ位誰だってわかってるさ
エディタに全角空白は□が表示されるし
しかも質問者は<<が見つからないというエラーが
出ると言っているわけで、全角空白のエラーが
出ると言っているわけではないし
0960デフォルトの名無しさん
2008/09/20(土) 14:21:200961デフォルトの名無しさん
2008/09/20(土) 14:22:050962デフォルトの名無しさん
2008/09/20(土) 14:30:35敗走ワロタ
0963デフォルトの名無しさん
2008/09/20(土) 14:58:33BCC6.1.0ではコンパイラエラーになるな
これはBCCのバグだろう
0964デフォルトの名無しさん
2008/09/23(火) 00:38:22たとえば、
template< class T > hoge{ };
を前方宣言する場合です。
0965デフォルトの名無しさん
2008/09/23(火) 00:42:200966デフォルトの名無しさん
2008/09/23(火) 00:43:310967デフォルトの名無しさん
2008/09/23(火) 00:59:180968デフォルトの名無しさん
2008/09/23(火) 12:57:42例えば、こんな感じ。
template<class TValue>
class CHoge
{
int m_value;
public:
CHoge() : m_value(TValue) {}
};
0969デフォルトの名無しさん
2008/09/23(火) 13:05:250970デフォルトの名無しさん
2008/09/23(火) 13:14:390971デフォルトの名無しさん
2008/09/23(火) 13:16:05でもclassの方がタイプ量が少ないせいか皆こちらを使うね
0972デフォルトの名無しさん
2008/09/23(火) 13:23:120973デフォルトの名無しさん
2008/09/23(火) 16:11:320974デフォルトの名無しさん
2008/09/23(火) 16:31:440975デフォルトの名無しさん
2008/09/23(火) 18:02:03BYTE *dst;
ConvertINetString( &mode, 51932, 932, buf1, &srcLen, dst, &dstLen);
上のdstをchar型に変換したいと思っています。
0976デフォルトの名無しさん
2008/09/23(火) 18:09:590977デフォルトの名無しさん
2008/09/23(火) 18:35:350978デフォルトの名無しさん
2008/09/23(火) 19:09:040979デフォルトの名無しさん
2008/09/23(火) 19:56:07C++は自力で型名を型名と判別できない言語だから必要な予約語であって
一人でパースすらできない欠陥言語であることの証明だから
0980デフォルトの名無しさん
2008/09/23(火) 20:00:240981デフォルトの名無しさん
2008/09/23(火) 20:50:480982デフォルトの名無しさん
2008/09/23(火) 21:08:060983デフォルトの名無しさん
2008/09/23(火) 22:04:290984デフォルトの名無しさん
2008/09/23(火) 22:05:42今後typenameを見るたびに恥ずかしい読み方を思い出すようになってしまったらどうしてくれるw
0985デフォルトの名無しさん
2008/09/23(火) 22:18:51にやにやしてあげる
0986デフォルトの名無しさん
2008/09/23(火) 23:19:12ちょwwww
0987デフォルトの名無しさん
2008/09/24(水) 01:38:090988デフォルトの名無しさん
2008/09/24(水) 01:58:040989デフォルトの名無しさん
2008/09/24(水) 01:59:050990デフォルトの名無しさん
2008/09/24(水) 02:38:370991デフォルトの名無しさん
2008/09/24(水) 12:44:49ログに残すくらいしか対策ないよな。
0992デフォルトの名無しさん
2008/09/24(水) 12:51:11どっちにしろ対処方はないんじゃね?
0993デフォルトの名無しさん
2008/09/24(水) 16:01:380994デフォルトの名無しさん
2008/09/24(水) 16:37:07ONE=1,
TWO=2,
THREE=4,
FOUR=8
};
ってフラグ定数を宣言したい時いちいち=で設定しないでもenumと同じ使い心地の定数の宣言できないだろうか
勝手に2倍2倍にしてくれるenumみたいな
0995デフォルトの名無しさん
2008/09/24(水) 16:39:11dumm0,
ONE,
TWO,
dumm11,
THREE,
dumm101,
dumm110,
dumm111,
FOUR
};
0996デフォルトの名無しさん
2008/09/24(水) 16:39:360998デフォルトの名無しさん
2008/09/24(水) 17:53:390999デフォルトの名無しさん
2008/09/24(水) 19:13:161000デフォルトの名無しさん
2008/09/24(水) 19:14:05http://pc11.2ch.net/test/read.cgi/tech/1221144557/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。