C++相談室 part31
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNGただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは >>2-9 あたり
0002デフォルトの名無しさん
NGNG2 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
0003デフォルトの名無しさん
NGNG[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[禿 Stroustrup]
http://www.research.att.com/~bs/
[C++ International Standard]
http://www.kuzbass.ru/docs/isocpp/
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
http://std.dkuug.dk/jtc1/sc22/wg21/
[C/C++ Users Journal]
http://www.cuj.com/
[cppll (ML)]
http://www.trickpalace.net/cppll/ (日本語)
0004デフォルトの名無しさん
NGNG0005デフォルトの名無しさん
NGNGamazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Effective 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/
0006デフォルトの名無しさん
NGNG0007デフォルトの名無しさん
NGNG[Boost]
Boost http://www.boost.org/
(日本語) http://user.ecc.u-tokyo.ac.jp/~s31552/wp/boost/
(日本語) http://www.kmonos.net/alang/boost/
[STL]
STLport http://www.stlport.org/
SGI-STL http://www.sgi.com/tech/stl/
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://www.moderncppdesign.com/
LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
[他]
ACE http://www.cs.wustl.edu/~schmidt/
Blitz++ http://www.oonumerics.org/blitz/
flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
http://www.trumphurst.com/cpplibs/cpplibs.phtml
(日本語) http://www.kmonos.net/alang/cpp/lib.html
0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNG- 【C++】template 統合スレ -- Part4
http://pc5.2ch.net/test/read.cgi/tech/1083550483/l50
- C/C++の宿題をやらせて、お兄ちゃん 23代目
http://pc5.2ch.net/test/read.cgi/tech/1085149383/l50
- C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc5.2ch.net/test/read.cgi/tech/1049790146/l50
- managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/l50
- ATL 相談室
http://pc5.2ch.net/test/read.cgi/tech/1029029882/l50
- COM の世界を斬る!
http://pc5.2ch.net/test/read.cgi/tech/981823340/l50
0010デフォルトの名無しさん
NGNG- タダで最強!フリーC/C++コンパイラ
http://pc5.2ch.net/test/read.cgi/tech/1035882599/l50
- GCCについて part3
http://pc5.2ch.net/test/read.cgi/tech/1072484422/l50
- タダで使えるVisual C++
http://pc5.2ch.net/test/read.cgi/tech/1082177340/l50
- タダで使えるBorland C++ Part3
http://pc5.2ch.net/test/read.cgi/tech/1054390397/l50
- OpenWatcom C++
http://pc5.2ch.net/test/read.cgi/tech/1033433728/l50
- Code of the Nerds" Digital Mars C/C++
http://pc5.2ch.net/test/read.cgi/tech/1044210976/l50
0011デフォルトの名無しさん
NGNG- ★初心者にVisual C++を教えるスレ★ Part12
http://pc5.2ch.net/test/read.cgi/tech/1083585833/l50
- ■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/l50
- C++Builder相談室 Part9
http://pc5.2ch.net/test/read.cgi/tech/1080541814/l50
- Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/l50
/**************** テンプレここまで ****************/
0012デフォルトの名無しさん
NGNG乙です!
0013デフォルトの名無しさん
NGNG0014デフォルトの名無しさん
NGNG使ったりするのかな?
0015デフォルトの名無しさん
NGNG逆に聞くがインターフェイスでprivateにすべきメンバとは?
0016デフォルトの名無しさん
NGNG0017デフォルトの名無しさん
NGNGこのIDマ板いけば神か?
http://live8.2ch.net/test/read.cgi/livecx/1086186992/
0018デフォルトの名無しさん
NGNGg++-2.95 (gcc 2.95.4 20011002 Debian)ではエラーなしでコンパイルされるけれど、
g++-3.2 (gcc 3.2.3 Debian) では最後につけたエラーになります。
これは、どうなるのが正しいのでしょうか?
(ちなみに TestBuilder というツールで発生するコンパイルエラーのエッセンスです。)
----- tst.cpp
#include <iostream>
using namespace std;
typedef int PLI_INT32;
typedef struct t_vc_record { PLI_INT32 vc_reason; } s_vc_record, *p_vc_record;
extern "C" int chpiPliValueCBF(p_vc_record vcRecordP);
extern "C" { typedef int chpiPliValueCBFT(); }
void acc_vcl_delete (int * object_p, PLI_INT32 (*)(p_vc_record), char *user_data, PLI_INT32 vcl_flags);
int main() {
char* ch;
acc_vcl_delete(NULL, (chpiPliValueCBFT*)chpiPliValueCBF, ch, 2); }
int chpiPliValueCBF(p_vc_record vcRecordP) { cout << "chpiPliValueCBF" << endl; }
---- エラーメッセージ
g++ -c -o tst.o tst.cpp
tst.cpp: function 内の `int main()':
tst.cpp:18: error: invalid conversion from `int (*)()' to `PLI_INT32
(*)(t_vc_record*)'
0019デフォルトの名無しさん
NGNG肝心の18行目がないな。
002018
NGNG以下のようにするとコンパイルが通りました。
typedef int chpiPliValueCBFT(p_vc_record);
ということは、2.95 は、(C っぽく)ポインタを自動変換するけど、
3.2 では、(C++ らしく)ポインタを自動変換しないので、
エラーになるということでしょうか?
002118
NGNG改行が多すぎるといわれたので、つめてしまってました。
実際には、以下の行でエラーになってました。
acc_vcl_delete(NULL, (chpiPliValueCBFT*)chpiPliValueCBF, ch, 2); }
0022デフォルトの名無しさん
NGNG0023デフォルトの名無しさん
NGNG環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0024デフォルトの名無しさん
NGNGすげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0025デフォルトの名無しさん
NGNGこのスレじゃもう終わりだよ。
0026デフォルトの名無しさん
NGNG1は言ってねぇだろ
0027デフォルトの名無しさん
NGNGとかいうエラーが出るんだけどこれってどうすればいいのですか?
0028デフォルトの名無しさん
NGNG#include "stdafx.h"
後死ね。
0029デフォルトの名無しさん
NGNG言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0030デフォルトの名無しさん
NGNG0031デフォルトの名無しさん
NGNG0032デフォルトの名無しさん
NGNGCryptCreateHashは使えるでしょうか。
文字列のハッシュ値は求めれるようですが、サイズの大きなファイルから
求めるにはどうしたらいいのでしょうか。
0033デフォルトの名無しさん
NGNGこのスレのタイトルを声に出して10回嫁。
0034デフォルトの名無しさん
NGNGそのファイルが読み込めるだけの記憶域を取得できれば可能。
だがその前にスレタイ読んで回線切って(tbs
0035デフォルトの名無しさん
NGNGみんなさんはファイル入出力どれ使ってますか!
(というかどれが好み?)
最近ftream系を使い出して機能豊富に脱毛してたんだが、
いかんせん使い方にクセがあって戸惑ってますよ。
0036デフォルトの名無しさん
NGNGそりゃ、fstream。C++スレだしな。
0037デフォルトの名無しさん
NGNG0038デフォルトの名無しさん
NGNGiostreamが楽
#DirectXのファイル入力これにしてくれよ〜>MS
0039デフォルトの名無しさん
NGNGライブラリを使わない時は API。それ以外は fstream。
fopen は間違っても使わない。
取り合えず禿になる前に慣れろ。
0040デフォルトの名無しさん
NGNGFILE構造体とかストリームオブジェクトが管理する入出力バッファって、
どこら辺に配置されているんでしょうか?
まぁ、そうそう手が出せない領域に置かれるとは思うんですが
0041デフォルトの名無しさん
NGNG手の出せない領域ってなんだ?
例えばVC++6.0の標準ライブラリならソース追っかければ分かるが、最終的にFILE構造体を
確保してるのはただのmallocだが。
0042いちごあめ
NGNGVC++ 6.0 で CrystalReports 10 を使って帳票を印刷
するプログラムを作りたいと考えています。
でも、いくら探しても方法やサンプルコード等どこに
も載っていません。
どなたかご存知の方いらっしゃいませんか?
よろしくお願い致します。
0043デフォルトの名無しさん
NGNGこのスレのタイトルを声に出して10回嫁。
と言っても理解できそうにないな。
スレ違いだ。VCスレに逝け。>>11
0044デフォルトの名無しさん
NGNG004535
NGNG慣れるまで我慢して使ってみる事にします。
所でfstream::read()でバッファに読んだ時に
実際に読んだサイズってどこから取ってくるんでしょう?
読む前と後でtellp()って事はないですよね・・・。
0046いちごあめ
NGNGお口は悪いようですが、親切なんですね。
教えていただいたところを見てみます。
ありがとうございます。
0047デフォルトの名無しさん
NGNGint basic_istream::gcount( );
0048デフォルトの名無しさん
NGNGC++ の場合、basic_filebuf がソレ
0049デフォルトの名無しさん
NGNGfstreamなんて糞だから間違っても使うな。
fopen系で処理しとけば問題ない。
0050デフォルトの名無しさん
NGNG0051デフォルトの名無しさん
NGNG0052デフォルトの名無しさん
NGNGvoid f() throw(std::bad_exception)
{
...
throw int();
}
とあったとすると、int型は関数の例外指定に無いので、throwすると
代わりにbad_exceptionが投げられると本にあったのですが、これだと
throw int()の時点で強制終了されてしまいます。
throw std::bad_exception() とすると、外側の関数でbad_exceptionが
キャッチできるのですが・・・。ちなみにVC.NETです。
なぜ終了してしまうのでしょうか?
0053デフォルトの名無しさん
NGNGISOでもJISでもいいが規格票の 15.4 の 8 を読んでみれ
0054デフォルトの名無しさん
NGNG規格表、規格表ってよく出てくるけど、あんなもの
カネ出して本当に買ってるのか?
コンパイラ作るワケじゃないし、禿の本で十分
だと思って漏れは買ってないのだが、何かお得
な情報が詰まってるのか??
0056デフォルトの名無しさん
NGNGスレタイの少し下にリンクが貼ってあるよ。
ttp://www.kuzbass.ru/docs/isocpp/except.html#except.spec
0057デフォルトの名無しさん
NGNG>とあったとすると、int型は関数の例外指定に無いので、throwすると
>代わりにbad_exceptionが投げられると本にあったのですが、
どんな本だ?(((( ;゜Д゜)))ガクガクブルブル
0058デフォルトの名無しさん
NGNGこういう事だろう。VC++6.0のような古い処理系では動くかどうか知らんが。
#include <iostream>
#include <exception>
void my_unexpected_handler()
{
throw 1234;
}
void f() throw(std::bad_exception)
{
throw int();
}
int main()
{
std::set_unexpected(my_unexpected_handler);
try {
f();
}
catch (const std::bad_exception& e) {
std::cout << e.what() << std::endl;
}
catch (int i) {
std::cout << "User defined unexpected hadler threw " << i << std::endl;
}
}
0059デフォルトの名無しさん
NGNGpop_backみたいな、ぴったり合う操作が無いな。push_backはあるのに。
resize(size()-1)のほうが効率はよさそう。
erase(end()-1)のほうがソース上に突然現れたときに意味がとりやすそう。
まじめなソースなら、
inline void pop_back(std::string& s){ resize(s.size()-1); }
と定義してしまうのが最善手かと思う。
006052
NGNG私の説明がおかしかったようで、もう少し正確に書くと、本には
class A;
class B;
void f() throw(A)
{
throw A(); //A型例外を送出
throw B(); //unexpected()を呼ぶ→unexpeted()がterminate()を呼ぶ
}
bad_exceptionをした場合・・・
void f() throw(A, std::bad_exception)
{
throw A(); //A型例外を送出
throw B(); //unexpected()を呼ぶ→unexpected()がbad_exceptionを送出
}
とまぁこういったことが書いてありましたので、たとえばint()をスローする
と当然bad_exceptionが投げられて、外側でbad_exception型の例外がキャッチ
できるのかと思ったのですが・・・違いますか?
0061デフォルトの名無しさん
NGNG俺は買ってるが。プログラミング言語 C++ は言語制作者の手による本だとは
言っても、結局、微妙なところになると載ってないし。
JIS から買うと高いが ANSI から PDF で買えば US$20 しないぞ。
0062デフォルトの名無しさん
NGNG0063デフォルトの名無しさん
NGNG006454
NGNGレス�dクス。
ANSIのページにいったら
http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%3A2003
US$281と出てるんだが...orz
0065デフォルトの名無しさん
NGNG違う。unexpected()関数はデフォルトでは常にterminate()しか呼び出さない。
set_unexpected()でunexpected()の代わりに呼び出す関数を入れ替えた時のみ、
その入れ替えられた関数がstd::bad_exceptionを投入する。§15.5.2.2
0066デフォルトの名無しさん
NGNGシングルトンで取得する場合、クラスBのコンストラクタ、デストラクタ
は発動するのでしょうか?その場合、発動タイミングはいつですか?
0067デフォルトの名無しさん
NGNGISO/IEC 14882:1998なら>>3のpdf
0069デフォルトの名無しさん
NGNGそれだけじゃだれにもわからない。
自分で使っている「シングルトン」の実装を調べれ。
0070デフォルトの名無しさん
NGNG会社の規約でグローバル関数をcallするときは、クラスのメンバと
見分けやすくするために :: を明記するように言われてます。
でc++コード中でよくcの標準関数をつかうのですが、getcharを
::getchar()
と書いたらコンパイルが通りません。(その他の関数は知っている限り
とおります)
なんか問題があるのでしょうか?
VC6でもVS7.1でも同様の結果ですた。
0071デフォルトの名無しさん
NGNGC++なら<cstdio>をインクルードしてstd::getcharが正解。
でも、VC6では通らないかもしれない。
0072デフォルトの名無しさん
NGNGレスどうもです。
#include <cstdio> はできないんでつ。というかなぜか
全部のコードがstdio.hなんでつ。(単に古いからだと思うんでつが)
先輩はgetchar()でええやないかって言うんですけど、なんで
::が付けられないのか気になって仕方ないもんで。
007371
NGNGごめんVCのgetcharはマクロでも定義されてるみたい。
#include <cstdio>
#ifdef getchar
#undef getchar
#endif
これでstd::getcharでいけるようになる。
どっちがいいかは微妙。
規格はこのマクロ定義を許しているんだろうか?
007471
NGNGやっぱ規格としては、std::getcharで使えないとダメなんだろうな。
007570
NGNG調べててレス遅れました。
「VCのgetcharはマクロでも定義されてるみたい」でハッとして
VCのソース見たら
#define getchar() getc(stdin)
とされてて、これはまあいいのですが、次に
#define getc(_stream) (--(_stream)->_cnt >= 0 ? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))
とマクロ展開されてました。
これでは ::getchar() が通るわけないでつ。スッキリしますた(´・∀・`)
どうもありがとう。。。 それにしてもvcってへんな実装でつ。
0076デフォルトの名無しさん
NGNG0077デフォルトの名無しさん
NGNG個人で使うならこっち買え。利用規定が違うだけで、中身は変わらん(むしろ、
しおり入ってる分だけ使いやすい)
INCITS/ISO/IEC 14882-2003
$18.00
http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FISO%2FIEC+14882%2D2003
0079デフォルトの名無しさん
NGNG標準でありますよね。内部演算の範囲エラーということのようですが
これってどういうことでしょうか?オーバーフローやアンダーフローは
わかるのですが。
0080デフォルトの名無しさん
NGNGv[15]=5;
bitset<16> bs;
bs[20]=true;
0081デフォルトの名無しさん
NGNG52のような質問をする必要がなくなるという事例を現に目撃しながら、何が聞きたいんだ?
0082デフォルトの名無しさん
NGNGそれっていわゆるout_of_rangeという例外クラスにあたるんじゃ
ないですかね・・。つまりロジックで回避できるものという。
runtime_errorというのは、プログラムのスコープの外で単純に回避
できないイベントを通知するのだそうです。
派生クラスは
range_error
overflow_error
underflow_error
このrange_errorというのがよくわからないんです。
0083デフォルトの名無しさん
NGNGoverflow, underflow と並んでるってことは、その手の「範囲外」を通知するのに
使うことを想定してるんじゃないの?
有効な値の範囲が連続なら underflow, overflow だけで表現できるけど、
とびとびだったりすると、どっちとも言えんよね。
0084デフォルトの名無しさん
NGNG練習で書いたソースですが、思わぬところで躓き
知り合いの先輩に聞いたら、こんな現象を見つけました
なぜ、そうなるのかわかりません、
理由がわかる方がいましたら、教えてください。
推測でもよいので
・・・
やはりVテーブルの話になるのでしょうか?
http://www.lenis.info/~forget-me/Toukou.txt
0085デフォルトの名無しさん
NGNGvtblは関係ないよ
いいから、言うとおりの順に紙に図かいてみろ
・Object型のオブジェクト1個(仮にaと名づける)
・aへのポインタ1個(仮にpaと名づける)
・paへのポインタ1個(仮にppaと名づける)
・Test型オブジェクト1個(仮にbと名づけ、aがbの部分オブジェクトになるように)
・bへのポインタ1個(仮にpbと名づける)
・pbへのポインタ1個(仮にppbと名づける)
おまいさんがやろうとしていることは、
reinterpret_cast<Object**>(ppb)だ
0086デフォルトの名無しさん
NGNGTest **t=0;
Object **o=t;
これが出来ないから
008784
NGNG指摘ありがとうございます。
ネットで調べたら
reinterpret_castは単なる型変更であり、たとえ派生関係があったとしてもポインタのアドレス自体はキャスト前と変わりません。
その意味でreinterpret_castは非常に危険なキャストといえるでしょう。
とありました。正直Castについて、完全に理解してないもので、とりあえずCastの部分が私が間違っていたということでしか、まだ理解できてません
が、返事が遅くなるといけないから、一応レスを書きました。Castについて勉強して、もう一度検討してみたいと思います。
せっかくレスを頂いたのに、まだ理解できなくてすいません。
>>86
なるほど、わたしのしてたことは、それに似たことだったのですね、上で書いたように、もう一度じっくり検討してみます。
どこに着目すればよいかわかりましたので、大変助かりました。ありがとうございます
0088デフォルトの名無しさん
NGNGvectorは確かoperator[]で範囲外アクセスした場合、未定義だったと思う。
vector<int> v(10);
v[15]=5;
v.at(15);
でatの方は例外を投げたと思うけど。
bitsetの方は覚えてない。
0089デフォルトの名無しさん
NGNGstd::bitsetも[]による範囲外アクセスは未定義のふるまい。
0090デフォルトの名無しさん
NGNGs/ふるまい/動作/
0091デフォルトの名無しさん
NGNG0092デフォルトの名無しさん
NGNGそれじゃあビットとは言えないな。
0093デフォルトの名無しさん
NGNGvector<bitset(ry
0094デフォルトの名無しさん
NGNGラッパーを作ればよい
0095デフォルトの名無しさん
NGNG#include <iostream>
class A {
public:
int& test;
A(int& a):test(a){};
};
int main(int argc, char *argv[]){
A *p;
{
int c = 1;
p = new A(c);
std::cout << p->test << std::endl;
}
std::cout << p->test << std::endl;
return 0;
}
2回目のp->testは安全ですか?
一応大丈夫みたいなんですが。
0096デフォルトの名無しさん
NGNGあんま安全じゃない。
0097デフォルトの名無しさん
NGNGポインタを返す関数の戻り値に、
その関数のローカル変数のポインタを使うようなもんだ
009895
NGNGやっぱそうですか。
じゃあ int& を const int& にした場合どうなりますかね?
一時オブジェクトをconstリファレンスで受けると寿命が延びますよね。
その例として型がintなのはよろしくないかもしれませんが。
0099デフォルトの名無しさん
NGNG延びないってば
0100デフォルトの名無しさん
NGNGソースきぼんぬ
010195
NGNGというか他の型でデストラクタが呼ばれてるか調べればいいですね。お騒がせしました。
010295
NGNG寿命が延びるといったのは受けた変数と同じ寿命になるという意味です。
直接受けた変数と同じになるだけみたいですね。考えてみれば当りまえかもしれませんが。
0103デフォルトの名無しさん
NGNGコードブロックの最後にデストラクトするのは、実装依存ではなくて
仕様。それにコンパイラは、ブロック外でアクセスされるのを
検知して、寿命を延ばすことはしない。(警告を出すことはありうる
だろうけど)
ARMに書かれているのは、テンポラリがconst参照されている場合
、その参照の寿命にしたがうということで、ここではcはテンポラリ
じゃないからね。
0105デフォルトの名無しさん
NGNG{
int c = 1;
p = new A(c);
std::cout << p->test << std::endl;
} ← ここで呼ばれるんじゃね?
0107デフォルトの名無しさん
NGNGp = new A(C());
こんな事やってんじゃね?
0110デフォルトの名無しさん
NGNG>というか cのとこがテンポラリだったとしても直接受けるのはコンストラクタの引数なので
>コンストラクタ抜けた時点でデストラクタ呼ばれるんですよね。
レス遅れてすまそ。そうだった。漏れも勘違いしてた。
そのテンポラリで初期化されたのなら、参照変数に束縛(?)されるだろうけど、
変数として渡されたのなら束縛できないね。(コンパイル時に値(テンポラリ)が
確定しないから、C++が寿命管理できない)
で、誰にも束縛されてないから、すぐに(この例だとコンストラクタ抜けたあと)
削除されちゃうね。束縛されてれば最大テンポラリの作成されたスコープいっぱい
生きられるみたいだけど。
011195
NGNGA(int& a):test(a){}; を
A(int& a):test(int(a)){};
みたくしたらテンポラリで初期化するから生き続けるかなあと思ったけど
(もちろんこんなことするくらいなら値渡しすればいいんだけど)
コンストラクタ抜けたらやっぱり死にました。そういうもんなんですかね。
ところで参照のメンバを使う時ってどんなときですか?
0113デフォルトの名無しさん
NGNG> ところで参照のメンバを使う時ってどんなときですか?
生成順序、破棄順序に明確な親子関係がある時かな。
被参照クラスは参照するクラスのコンストラクタで渡さなきゃいけないし、
参照するクラスのデストラクタが呼ばれる前に非参照クラスが破棄されると
普通は困るから。
0114デフォルトの名無しさん
NGNG.C
.cpp
.cc
0115デフォルトの名無しさん
NGNG0116デフォルトの名無しさん
NGNG0117デフォルトの名無しさん
NGNGつか、クラスの新規作成で勝手にファイル生成させてるが。
Linux上でgccに食わせるのはなんとなくccだったりする。
0118デフォルトの名無しさん
NGNG0119デフォルトの名無しさん
NGNG0120デフォルトの名無しさん
NGNG0121デフォルトの名無しさん
NGNGデフォルトコンストラクタを明示的に呼び出す・・・
というのは、どういうことでしょうか?明示的じゃない
呼び出しっていうのもあるんですか?
たとえば
class A{
...
};
A c;
とか
A c();
とかって違うのでしょうか?
0122デフォルトの名無しさん
NGNGと
int i();
は違う。
0123デフォルトの名無しさん
NGNGもしかして「デストラクタの明示的な呼び出し」の間違いか?
全然関係ないが
A c; はオブジェクトの定義
A c(); は関数の宣言
0124デフォルトの名無しさん
NGNG0125デフォルトの名無しさん
NGNG.EXTENSIONOFC++SOURCEFILE
0126121
NGNG引数なしのコンストラクタ呼び出しって
A c();
という具合じゃだめなんですか・・・関数宣言になるんですね。
じゃあ
A c;
または
A c = A();
でデフォルトコンストラクタ呼び出しってことですかね。
いずれにせよ明示的って意味がわかりませんね・・・。
0127デフォルトの名無しさん
NGNG0128デフォルトの名無しさん
NGNG0129デフォルトの名無しさん
NGNGデフォルトコンストラクタにexplicitもクソもあるか。
明示かどうかで挙動が変わるのは組み込み型のデフォルトコンストラクタ。
0130121
NGNG0131デフォルトの名無しさん
NGNG例えば、デストラクタなら
{
hage stroustrup;
} // 暗黙の呼び出し
this->stroustrup::~stsoustrup(); //明示的な呼び出し
0132デフォルトの名無しさん
NGNG{
this->hage::~hage();
this->hage::hage(BullShit);
return *this;
}
0133131
NGNGs/stroustrup/hage/
吊ってきます
0134デフォルトの名無しさん
NGNG暗黙の型変換あたりでググれ。
0135デフォルトの名無しさん
NGNGA.cpp (実装を定義)
とやって、A.cppで、static A gA;
などとグローバルインスタンスとして A を定義し、それをsingletonとして
ポインタを返すメンバ関数をAに用意しておきます。
main.cppの方でそれを呼んで class Aのsingletonを使ってメンバ関数
をコールするというような使い方をする場合、
class Aのコンストラクタ、デストラクタはいつ呼ばれるのでしょうか?
多分、static A gA; がメモリー上に実際に生成される時だと思うんですが
それっていつなんでしょうか?
0136デフォルトの名無しさん
NGNG0138デフォルトの名無しさん
NGNG吊るより
9階からああ飛び降りろ。
間違っても芝生のないところでやれ。
できるなら30階以上のところでやれ。
確実に死ねる
0139デフォルトの名無しさん
NGNG本気で言ってるのか?
0140デフォルトの名無しさん
NGNG正しい吊りかたすれば確実に死ねるぞ
0141デフォルトの名無しさん
NGNG0142デフォルトの名無しさん
NGNG0143デフォルトの名無しさん
NGNGってことか。それならイエスだが。
しかし、なんでわざわざ回りくどい聞き方するかね。
0145デフォルトの名無しさん
NGNG0146デフォルトの名無しさん
NGNGそんなにオナニー好きなのに
よりよいオナり方を人に訊くのか…
0147デフォルトの名無しさん
NGNGさも高度な質問のフリをするためには効果があるわけだな。
しかし、141がDQNであることは、はっきりした。
0148デフォルトの名無しさん
NGNG0149デフォルトの名無しさん
NGNGカッターで頚動脈切ってもらった上で15Fぐらいからダイブしたほうがいいぞ。
0150デフォルトの名無しさん
NGNG0151デフォルトの名無しさん
NGNG0152デフォルトの名無しさん
NGNGなんとなく↓くらいかと思う
C>>C++>>>>>>>>>>>>>>>>Java
0153デフォルトの名無しさん
NGNG0155デフォルトの名無しさん
NGNG0156デフォルトの名無しさん
NGNGライブラリ呼び出しだけで書けると思ってるの?ヴァカ?
0157デフォルトの名無しさん
NGNG処理系もライブラリもコードも示さないで比較もくそもないと思う。
そして処理系もライブラリもコードも示せるなら自分で計測すれ。
0158デフォルトの名無しさん
NGNG標準ライブラリやメソッドコールの差はあるにしても。
0159デフォルトの名無しさん
NGNG数値計算はライブラリの質が大きいが、シミュレーションとか、
もっと一般的に言って物理エンジンなんかはどうなのさ?
0160デフォルトの名無しさん
NGNG全く聞かないけど?
実際は、C≒C++>>>>Java ぐらいじゃないか?
CとC++とJavaで同じ処理を試すということは、
クラスライブラリなどを一切使わないってことだよね?
0161デフォルトの名無しさん
NGNGで、良いんじゃないかな?
0162デフォルトの名無しさん
NGNGあるよ。
expression template などを使わず。単純に見易さとか書きやすさだけを求めると
遅くなるよ。もっともC++ではそういう書き方もできるという意味で、C流に書けば
いいだけなんだけどね。
#expression templateも+,-,*などの単純計算ならなんとかなっても逆行列なんかには
#無力だけど。
0163デフォルトの名無しさん
NGNGって、Cで書けってことか?(w
0164デフォルトの名無しさん
NGNG具体例を希望
0165デフォルトの名無しさん
NGNG162 じゃないけどMATRIX operator+(MATRIX const&, MATRIX const&) とか。
何も考えずに書くと、戻り値で値のコピーが発生して遅くなりがち。
0166デフォルトの名無しさん
NGNG君にはきっと C のほうが向いていると思う。
0167デフォルトの名無しさん
NGNG最高実行速度という意味では厳密に C++ == C ってことでは?
それに加えて、C++より広範囲の抽象化をサポートしていわけで。
(仮想関数ならそれなりの実行時コストをはらって、また、templateなら
実行時コスト無しで)
0168デフォルトの名無しさん
NGNGその計算はCだろうが戻り値のコピーは避けられないと思うが?
戻り値最適化を前提にしちゃいかんのはわかるが
Cで書けば同等の役割を持った上で高速に動作するコードを示してほしい
つーか expression template の話してるところで
「何も考えずに書くと」のケースの話されても一体何と何を比べてるんだって感じなんだけど
0169デフォルトの名無しさん
NGNG一番速度差が出やすいと言われるのはこんな場合。C++だと、
Matrix a,b,c,d,e;
for(int i = 0; i < takusan; i++){
a = b*c+d-e;
}
ってな計算。
なーんにも考えず二項計算だけ定義すると、
b*cの結果、それと+dの結果、
-eの結果、それぞれを確保、開放
繰り返してたらそりゃ遅くなるでしょ。
C流に書けば、a.b,c,d,e,tmp,tmp2,tmp3は適当に定義してあって、
関数にはポインタで渡すとして
tmp =(XXX &)malloc(sizeof(datasize) * matrixsize);
tmp2 =(XXX &)malloc(sizeof(datasize) * matrixsize);
tmp3 =(XXX &)malloc(sizeof(datasize) * matrixsize);
for( i = 0; i < takusan; i++ ){
mul(b,c,tmp);
add(tmp,d,tmp2);
sub(tmp2,e,tmp3)
}
で作業域は一回だけ確保しとけばいいってこと。
でも、計算式そのまま書けば計算できるC++流の関数と
C流の関数両方用意しとけばいいからC++が遅いってことにはならないよ。
Cだと見にくい書き方しかできないけど。
あと、式テンプレートは結果の作業域は用意しなくてもいいんだが、
結局計算式そのものをどっかに格納しとかなきゃいけなかったりする。
0170デフォルトの名無しさん
NGNGだった、しばらく書いてなかったもんでスマソ
0171デフォルトの名無しさん
NGNG0172デフォルトの名無しさん
NGNG言いたいことは分かるんだけれども
その例はC++でも
結果を格納するためのオブジェクトと op= の形式の演算子使うだけで
C流の関数なんて使わなくともそこそこ可読性を保ったままパフォーマンスを同等にまで上げられる。
しかもこれ、割とよく知られている最適化テクニックなんであまり適切な例ではないような。
0173デフォルトの名無しさん
NGNGSSE2命令有効にしてコンパイルしてもこれほど速くならないと思う。
C/C++からコールするにしても行/列アクセス順序入れ替えるのは面倒だし、
オーバーヘッドは必ず発生するしね。
0174デフォルトの名無しさん
NGNGIntel系ならそうですね。WSやマックは切り捨てですか?
atlasが速いのは、出来るだけキャッシュに入るように工夫してるのが大きいと思うのですが…。
InterlのMKLなんかはP4のパイプラインの分岐予測を乱さないように最適化されているみたいですし。
そこまで行ったら、言語の問題じゃないような気がする。
0175デフォルトの名無しさん
NGNGファイル名を格納するchar配列があります。
この配列は幾つファイルが有るかわからないので動的に増やせるようにしたいです。
そこで今は以下のようにしています。
int n = 10;
struct FILENAME{ char lpsz[MAX_PATH]; };
FILENAME* files = new FILENAME[n];
が、これってわざわざ構造体なんか定義しなくても出来るようにならないでしょうか。
無理とは解ってますが以下とかじゃ駄目ですし。
char* files[MAX_PATH];
files = new char*[n];
0176デフォルトの名無しさん
NGNG分野ではC/C++より早いって話しだよね?
逆にfortranってC/C++みたいな自由度はないのでは?
ただ、CとC++の高速度ソフトウエアの記述能力といった意味では全く
同一だと思う。
0177デフォルトの名無しさん
NGNGstd::stringとかstd::vector<char>とか使え。C++なんだし。
0178デフォルトの名無しさん
NGNGchar** filenames = (char**)malloc(sizeof(char*)*n);
じゃだめなのかね。
0179デフォルトの名無しさん
NGNGつ[std::vector<std::string>]
0180178
NGNG0181デフォルトの名無しさん
NGNG型名をどう記述してよいかわからないだけなら typedef で十分だし。
実際は「動的配列どうやって作れるの?」ってだけの話なのか?
0182デフォルトの名無しさん
NGNGfiles = new char[n][MAX_PATH];
0183デフォルトの名無しさん
NGNG>C流の関数なんて使わなくともそこそこ可読性を保ったままパフォーマンスを同等にまで上げられる。
>しかもこれ、割とよく知られている最適化テクニックなんであまり適切な例ではないような。
そりゃ、技を駆使すればC++も速くなるよ。
でも、多大なる努力を駆使して得られる処理速度は、誰でもすぐに書けるCの処理速度に
どれだけ漸近させられるかってだけ。
その努力が数値計算ユーザにどれだけ支持されるかってこと。
0184デフォルトの名無しさん
NGNGうーん、ダウト
0185デフォルトの名無しさん
NGNG何言ってんのかわかんない。
void add(MATRIX&, const MATRIX&, const MATRIX&);
みたいなC式のスタイルはC++でもできる。
C++式のスタイルは使いかたによってはパフォーマンスが悪い、それだけだろ。
0186デフォルトの名無しさん
NGNG>Intel系ならそうですね。WSやマックは切り捨てですか?
Pen4 に atlas 使って遅い用途ならWSも糞マックも役にたたんだろうからどうぞ捨ててくれ。
0187デフォルトの名無しさん
NGNGop= と op じゃ実装も記述の手間もろくすっぽ変わらん。
問題なのは可読性が下がることだけ。
>>169が言ってるのは、
a = sub(add(mul(b,c), d), e);
より mul_assign(b,c, tmp); ...(以下略) とする方が早いという以上の何者でもない。
それをC++の演算子オーバーロードに置き換えれば op と op= の違いになる、というだけ。
0188デフォルトの名無しさん
NGNG0189デフォルトの名無しさん
NGNGふーん。Matrix計算の場合+=.-=は確かに使えるね。
*=が使えると思ってる時点でオバカさんだな。
どうやったら使えるか解説してくれないか?
0190189
NGNGA *= 3.0;
とか
A /= 5.0;
とかね。
0192デフォルトの名無しさん
NGNG話のポイントのつかめんやつだな。
CとC++でどこが違うかって言ってるんだ。
>>166でも一時オブジェクトは確保してるだろ。
どこで一時オブジェクトがいらないなんて話になったんだ?
#さらに言うと *= の場合、
中途で確保する一時領域は行単位で済むから * よりも
オーバーヘッドは小さくできるぞ。
0193デフォルトの名無しさん
NGNGCでは作業域使わずダイレクトにできるのか?
出来ないよな。なら特に今回の話に関係無いよな。
で?
0194デフォルトの名無しさん
NGNG作業領域を中で確保して値渡しで返す(もしくはswapする)のと、
外から作業用兼結果用の領域をもらうのとは結構違うと思うよ。
0195デフォルトの名無しさん
NGNGおつむの悪い僕ちゃんだな。
いいかい。
op= を遣う理由で一時作業領域を省略できる以外になにかあるのかい?
Matrixの*=の場合はそうならないから指摘してるんだよ。
##さらに言うと *= の場合、
# 中途で確保する一時領域は行単位で済むから * よりも
# オーバーヘッドは小さくできるぞ。
ハイハイ。がんばれよ。頭だけじゃなく往生際も悪いようだ。
0196デフォルトの名無しさん
NGNGCで書くとこういう関数になると思うが
この時、retとaのポインタが指す領域が別々とは限らないため、
Matrix &operator *=(const Matrix &a);
と関数内部は同一になると思うが、そういうことを言ってるのではないの?
0197デフォルトの名無しさん
NGNGいいでしょう。
*= については、a *= b ではさらに新たな一時オブジェクトを作る tmp2 = a * b; に対して改善が見込めないという部分は認めよう。
でも、Cでこの書き方より速くできるかという部分については納得する意見をもらってないよね。
0198デフォルトの名無しさん
NGNGだーかーらー ret,a,bが全部違った時は作業領域いらないでしょ。
その恩恵はC++のoperatorじゃあずかれないでしょ。
>>197
さっきからでてる三項の関数使えばいいじゃん。
C++だからってoperatorにこだわることないんだよ。
実際に数値計算のライブラリも三項引数の関数用意してるよ。
0200198
NGNGっていうかこの問題、式テンプレート使うとなるとまた変わってくるのかも。
0201デフォルトの名無しさん
NGNG0202デフォルトの名無しさん
NGNG確かにC++使ってるとoperatorとかtemplate使いたくなるよね。
そんな事やってる間にチューンを忘れるとか疎かになりがち。
そう言いつつET使ってキャッシュも意識して頑張るんだけど。
>>199
restrictって言おうとしたけどCだな。それに保証も出来んか。
0203196
NGNGパフォーマンスがどうたら言うてる割に現在のCPUでペナルティ大きいifチェックかぁ。
まぁ想定してるmatrixが俺と違うのかもね。
内部で動的にメモリ確保したりするようなヤツならifチェックくらい別にかまわないか。
0204デフォルトの名無しさん
NGNG結局、出力パラメータに対して
operator の戻り値コピーの部分(最適化してくれないとして)がネックになるって話なのね。
>>200
expression template はないって前提でしょ。
一応、それならパフォーマンスをある程度保ったまま
はるかに直感的に式書けるんだからまあ文句は出ないと思う。
もちろん式格納領域はいるけど今問題の一時オブジェクトのオーバーヘッドはなくなるわけだし
0205デフォルトの名無しさん
NGNGblitzもublasも逆行列なんかを使うのが悪いと言うようなスタンスだし。
実際、逆行列に使ったところで逆に覚えとかなきゃいけない要素が多くなると思う。
0207196
NGNGお前にバカっていわれたくないなぁ。
つか、お前のレスは人格攻撃、見下しばかりでつまらん。
そんなヤツとは議論しても実りがない。お前パスな。
どうぞ、勝利宣言でもなんでもしてくださいな。
>>204
式テンプレート一時期凝った時があるが
4x4のMatrix値返しした時のほうが早くなって愕然とした記憶がある。
あまりに凝ると最適化が効かなくなるんかいな??もしくは単にミスってたかな。
0208デフォルトの名無しさん
NGNGそこはそれでかまわないと思うんだけど、、、
まあ俺が実際に使うのは乗算と加算ばっかりだから要望ないだけかも。
数値計算屋さん(なの?)としてはどういう風にしてほしいものなのかな
0209デフォルトの名無しさん
NGNGちょっとまってチェックするっていっても関数の頭でポインタのチェックするだけだろ?
ループ内部で条件判断するわけじゃないの無視できるでしょ?
ふつう行列演算C++でかくなら演算できるかどうかの行、列数のチェックはするだろうし。
一般にoperator=でもソースとデスティネーションの同一性のチェックはふつーするでしょ?
#行き着く先のET使っても、保守性が向上するとは言いがたいと思うのだが。
#blitz 見やすいか?使いやすいか?
0210198
NGNGあ、ごめん。ちなみに俺は194=198=200=206で189とは違うから。
勝利宣言はしますけど。
まともな行列ライブラリなら行列の乗算は式テンプレート使うんだろうね。
LiDIAってライブラリには3引数の関数あったけど。
0211デフォルトの名無しさん
NGNGその代替として人を馬鹿にするんだってのがよくわかるね。
0214デフォルトの名無しさん
NGNG> operator の戻り値コピーの部分(最適化してくれないとして)がネックになるって話なのね。
最適化なんてしようがないと思う。
0215207
NGNG刺した上で9Fから突き落としたくなったよ。
0216デフォルトの名無しさん
NGNG通報しますた。
0217デフォルトの名無しさん
NGNG3引数の関数とは例えば
A * B * C
を計算するような関数かな?
でもこれを計算する場合でもtmp領域は必要だよ。
数学上、2項演算しか定義されてないから(それで十分だから)
2項の計算結果をどっかに保存しないと次項の演算に移れない。
ただし、3項以上の演算を定義することでtmp領域の確保回数を
減ずることはできる。
実際、newmatなんかは行列計算の開始宣言、終了宣言して2項毎の
tmp確保を避けてたと思う(随分前に使ってたので記憶が定かでない)。
0219デフォルトの名無しさん
NGNG>>177や>>179は無視か?
0220デフォルトの名無しさん
NGNGキャッシュラインのサイズに応じたベクトル計算の自動分割とかしてくれるのかな・・・
0221デフォルトの名無しさん
NGNG0222デフォルトの名無しさん
NGNGこんな感じ?
struct Matrix matrix_mul(struct Matrix a, struct Matrix b) { ... }
0223デフォルトの名無しさん
NGNG0224デフォルトの名無しさん
NGNGttp://seclan.dll.jp/c99d/c99d07.htm#dt19990802
一応Cでもinline使えないわけじゃないが。
0225デフォルトの名無しさん
NGNGinline にすれば100%早くなるってもんでもない。
無駄にプログラムサイズが大きくなると、キャッシュミスが多くなるし。
inline があれば、高速化のために手動で関数を展開しちゃうという
愚行に走らなくて済むのは確かだけど。
あと、C言語でもコンパイラによっては inline 展開するようになってるし。
0226デフォルトの名無しさん
NGNGポインタ使え。
0227デフォルトの名無しさん
NGNGcout << "終了しますか? Yes = y, No = n" << endl;
}while(cin.get() != 'y');
このコードを実行して、「n」を入力すると
「終了しますか? Yes = y, No = n」の部分が二回表示されてしまいます。。
キチンと表示させるには、どうしたら良いのでしょうか?
0228デフォルトの名無しさん
NGNG????
0229デフォルトの名無しさん
NGNGdo{
}while(cin.get() != 'y');
0230デフォルトの名無しさん
NGNGcout << "終了しますか? Yes = y, No = n" << endl;
} while (cin.get() != 'y' && cin.get() != '\n');
0231230
NGNG0232230
NGNGdo {
cout << "終了しますか? Yes = y, No = n " << endl;
} while (cin.get() != 'y' && cin.get() == '\n');
0234デフォルトの名無しさん
NGNG>222は皮肉じゃないの?
0235デフォルャgの名無しさん
NGNGstruct Matrix {
struct Matrix_t *m;
};
0236デフォルトの名無しさん
NGNG>>169
>結局計算式そのものをどっかに格納しとかなきゃいけなかったりする。
そのような式オブジェクトは理想的な最適化の結果
コードから排除されるだろうというのがET支持者の一応の主張ではあるんですが・・・.
>>172
三項以上の演算,例えば行列におけるa + b + cなどにおいては
op=の形式では抽象化によるペナルティを喰らう可能性は残ると思います.
0237デフォルトの名無しさん
NGNG以下のようなコード(中途半端な擬似コードで申し訳ない)だと192さんの指摘するように,
一時オブジェクトは1行分だけで済むように思えるのですが違うのでしょうか?
Matrix &Matrix::operator*=(Matrix const &rhs)
{
assert(*thisの列数==rhsの行数 && rhsの行数==rhsの列数);
Row tmp;
for(size_t i = 0; i < *thisの行数; ++i){
tmp = *thisのi行;
for(size_t j = 0; j < *thisの列数; ++j){
*this(i, j) = 0;
for(size_t k = 0; k < *thisの列数; ++k){
*this(i, j) += tmp(k) * rhs(k, j);
}
}
}
return *this;
}
0238デフォルトの名無しさん
NGNG式テンプレートでは左辺と右辺の依存関係の問題は
代入メソッドの選択に一任される形になるかと思います.
通常の代入operator=では一時オブジェクトに結果を保存してから代入(swap)する形を取り,
ユーザが代入による依存関係の問題が発生しないことを保証できる場合のために
式オブジェクトから直接代入するための関数を別途用意する,とか.
>>205
通常,線形代数の数値計算では逆行列を陽に求めるのは最終手段(通常はご法度)なので
blitzやublasのスタンスは適切だと思います.
0240デフォルトの名無しさん
NGNG「俺は俺のやり方がなぜうまくいかなかったかが知りてーんだ。
そんな安易な解決策はとっくに思いついてんだよゴミクズどもが!」
ってちゃんと言わないと駄目だよ。
0241デフォルトの名無しさん
NGNGrhsが正方行列じゃなかったら困らない?
あと、rhsってなんの略?
0242デフォルトの名無しさん
NGNGなんで正方行列である必要があると思うの?
rhs = right hand side
0243デフォルトの名無しさん
NGNG列数が変っちゃうから。
なるほど。right(left) hand valueしか知らなかった。
0244デフォルトの名無しさん
NGNG0246デフォルトの名無しさん
NGNGほんとだ。よく見てなかった。でもそうじゃない場合は困るよね。
Matrixの乗算っていうのはたまたま出た例で、op=で一時オブジェクトが必要なときは
C式のスタイルよりパフォーマンスが悪くなるっていうのがもともとの議論。
0247デフォルトの名無しさん
NGNGcopy on write とか使うようにするのはどうかな・・・
オーバーヘッドもたいしたことないと思うんだけど。
0248デフォルトの名無しさん
NGNG>blitzやublasのスタンスは適切だと思います.
逆行列のETなんかはやろうとしてもできない。もしくはパフォーマンスの向上、
リソースの節約に寄与しないからこそ提供できない。
できないってのとやらないのは違う。
技術的にET実装は非常に難しいことをはっきり言うべき。難しいので提供できませんでしたと。
それを数値演算で逆行列を使うのはおかしいなどというのはイソップの狐と同じ。
0249デフォルトの名無しさん
NGNG作業領域はほとんどいらないし、逆行列のひとつの成分を計算するのに
もとの行列のすべての成分が関係するから式テンプレートを使うメリット
はまったくないな。
式テンプレートを使わず逆行列のメソッドを提供すればいいのになんで
blitz++はやらないのかね?
それを使うかどうかはユーザが決めればいいんだがな。
0250デフォルトの名無しさん
NGNG0251デフォルトの名無しさん
NGNGC++ が苦手というか、operator overload で「数式っぽい見た目」でプログラミング
するのと相性悪いんだと思うよ。
これが 4x4 行列と 4 次ベクトル限定で、ベクトル演算用のレジスタ積んでる
プロセッサだと話が変わってくるけど。演算子オーバーロードを使う場合でも、
o 演算子に対応する関数をインライン展開
o 行列やベクトルの要素がコンパイラ最適化によってうまくレジスタに乗る
と、陽に関数呼び出しを行う C スタイルの書き方より早くなることもある。
0252デフォルトの名無しさん
NGNGC++でもCのような書き方をするなら別に苦手ではない。
それでも効率より見やすさや安全性を考えてクラス化してるんだと思う。
0253デフォルトの名無しさん
NGNG速度重視のコアの部分はCで書いてて、外側の部分はC++のような気がするんですが…。
どうなんでしょう?
0254デフォルトの名無しさん
NGNG・ある物の状態を監視
・その状態を表示
といった単純な事がやりたいのですが、その状態を表すクラスを↓のように定義して
class Status{
public:
Status() : dat(0){};
virtual ~Status(){};
void set(int i) { dat=i; }
int is() { return(dat); }
private:
int dat;
};
メイン関数では↓のように作りました。
Status st;
// 監視側
if(ある物の状態==true){
st.set(1);
}
// 表示側
if(st.is()==1){
表示;
}
が、これだと表示側からもdat.set()が呼べてしまうので危険です。
現状ではfriendを使ってやってるのすが、すっきりしません。
こういう場合、普通は(オブジェクト指向的に?)どのように作るものなのでしょうか?
0255デフォルトの名無しさん
NGNGもちろん何も考えず作業領域をoperator毎に作るようなコードに対しては
アドバンテージがあるかもしれないけど。
大きな配列を持ってこないとETは逆効果
0256デフォルトの名無しさん
NGNGコメントを日本語で書くのはやめることだな
0258257
NGNG0259デフォルトの名無しさん
NGNG0260デフォルトの名無しさん
NGNG0261デフォルトの名無しさん
NGNGじゃあ、おまえは「ひまわり」でも使ってろ(プ
0262デフォルトの名無しさん
NGNG0263デフォルトの名無しさん
NGNGインターフェースと実装を分離する。
0264237, 238
NGNG237は行列同士の*=で1行分しか一時領域が要らないのではないか,
という疑問を単に投げただけのもので,議論の本筋からそれたものでした.すいません.
>でもそうじゃない場合は困るよね。
はい困ります.ただ,困るのはCでもC++でも同じことだと思います.
>op=で一時オブジェクトが必要なときはC式のスタイルよりパフォーマンスが悪くなる
というのは,上の議論において未だ論拠が指摘されていないように見えます.
自分としても,Cスタイルにおけるmultiply_assign(Matrix &a, Matrix const &b)という記述と
operator+=の記述との間にパフォーマンスの差を生じさせるものがあるとは思えないです.
>>248
いえ,私が指摘したいのは,
「ETを実装{しない/できない} -> 数値演算で逆行列を使うのはおかしい」
ではないです.
数値演算で逆行列を使うことは悪いとするスタンスは適切ではないか,ということだけです.
ただ,これは数値計算の一般論の指摘でこのスレで書くべきことではなかったです.すいません.
>>249
>式テンプレートを使わず逆行列のメソッドを提供すればいいのになんでblitz++はやらないのかね?
以下は私の中途半端な知識による考えです.適当に流してください.
通常,行列の逆行列が真に必要となる場面は非常に限られ,ほとんどの場合,
逆行列を陽に計算するよりも適切なアルゴリズムを選択する方が
計算量・精度双方の観点から圧倒的に有利になります.
例えば,行列の逆行列と{ベクトル/行列}との乗算では直接逆行列を計算することは論外で,
通常はLU分解法で行列を三角化してから計算します.
なので,あえて逆行列を陽に求めるメソッドを提供せず,逆行列を表す式オブジェクトとの演算を
適切なアルゴリズムにdispatchしているのではないかと愚考します.あくまで私見です.
0265デフォルトの名無しさん
NGNG最近VC6.0から7.1に移行してとまどってる厨房です。
いままでは、
char* buf = new char [256];
if (buf) {
delete [ ] buf;
}
みたいにしてたのを、
(auto_ptr, shared_ptrを使わないとすると)
try {
char* buf = new char [256];
delete [ ] buf;
}
catch (bad_alloc&) {
delete [ ] buf; ← 例外の場合も開放しなきゃだめ?
}
にすればいいんでしょうか。
nothrowを指定するっていう方法もあるけど、
なんかDEBUG_NEWがあるとコンパイルエラーになるし...
0266デフォルトの名無しさん
NGNG>例えば,行列の逆行列と{ベクトル/行列}との乗算では直接逆行列を計算することは論外で,
>通常はLU分解法で行列を三角化してから計算します.
LU分解は大規模疎行列には使わない。逆行列を陽に求めないというのは同意。
0267デフォルトの名無しさん
NGNGLU分解は密行列にしか使いませんね.舌足らずでした.すいません.
0268デフォルトの名無しさん
NGNG> みなさんはbad_alloc例外ってどう扱ってますか?
即興プログラムなら放置してabort()逝き。
まともなプログラムなら適切にcatchを配備。
> delete [ ] buf; ← 例外の場合も開放しなきゃだめ?
まずは、コンパイル通してから出直せ。
0269デフォルトの名無しさん
NGNG>はい困ります.ただ,困るのはCでもC++でも同じことだと思います.
>というのは,上の議論において未だ論拠が指摘されていないように見えます.
>自分としても,Cスタイルにおけるmultiply_assign(Matrix &a, Matrix const &b)という記述と
>operator+=の記述との間にパフォーマンスの差を生じさせるものがあるとは思えないです.
過去ログちゃんと読めよ。昨日さんざん話したっていうのに。
A *= B の場合、一行分の作業領域もしくは行列1個分の作業領域とコンストラクタ、swapの呼び出しが必要。
C = A * B の場合、行列一個分の作業領域とコンストラクタ、コピーコンストラクタの呼び出しが必要(RVOが使えなければそれ以上)。
multiply(Matrix& C, const Matrix& A, const Matrix& B) を使った場合、
&C == &A の場合、A *= Bと一緒、
&C == &B の場合、一列分の作業領域もしくは行列1個分の作業領域とコンストラクタ、swapの呼び出しが必要。
&C != &A && &C != &B の場合、領域もコンストラクタもswapもいらない。
三番目のパターンはoperatorでは実現できない。受ける変数のために行列一個分の作業領域とコンストラクタが必要でも、
コピーコンストラクタ分は得する。あと変数を使い回せるという利点もある。
Matrix A = ...;
Matrix B = ...;
Matrix C = ...;
Matrix D = ...;
Matrix E;
//E = A * B * C * D;
multiply(E, A, B);
multiply(A, E, C);
multiply(E, A, D);
0270デフォルトの名無しさん
NGNGVCに限定していいなら__try〜__finallyを使う。
ちょっとしたものを書くときにクラス化しなくていいのは便利なんだけどな。
標準にして欲しい。
0271269
NGNG議論を理解してないようだけど、
multiply_assign(Matrix &a, Matrix const &b)とoperator+=を比較してるんじゃないよ。
>>187 参照。
0272270
NGNG0274デフォルトの名無しさん
NGNG0275デフォルトの名無しさん
NGNG>例えば,行列の逆行列と{ベクトル/行列}との乗算では直接逆行列を計算することは論外で,
論外かどうかは用途とか行列サイズによる。理論式上では多用する分野もある。現実問題にアプローチ
する前に理論検証したい場合だってある。
あるいは自分が作った疑似逆行列アルゴリズムと理論式どおりの逆行列アルゴリズム間で精度や速度がどれだけ違うか
比較したい場合もある。
うまくいかなかった場合、元の理論がわるいのか、誤差が利いてきてるのか切り分けたい場合だってある。
そんなもんはケースバイケース。論外とするのはサイズの大きいマトリックスで実行時間もかかるし、求めたところで
誤差が大きくなって使い物にならないって言う場合。
事実、数値計算電卓のMATLAB/Octaveでは用意はしてる。
除算は理論的にワンショット(最小システムクロック)で算出できないから用意しませんでした。というプロセッサより
用意したがそれなりに実行コストはかかります。というのがユーザとしてはありがたいと思う。
ただ、逆行列のET実際はほとんど不可能だ。
0276デフォルトの名無しさん
NGNGC#なんていうクソ遅い言語は問題外。ベンチマーク取ってもVC7.1の1/2以下
の速度しか出ない。
0277デフォルトの名無しさん
NGNGそれをいうなら
見やすいC++のコードを書いたら同機能のCの1/4の速度になったことあるよ。
もっというと、Cだと遅すぎるのでasmでチューンしたら3倍速くなったことがあるよ。
全部Verilogで書き直して組み合わせロジックだけで実現できたので1クロックで
処理できるようになったことがあるよ。
必要に応じて開発手段を選択するのが設計。
0278254
NGNGObserver Patternを調べてみて、だいたいどのようなものかは
分かったのですが、実際に監視側と表示側のソースをちょっと
書いていただけないでしょうか?
初心者なもんでそういう設計自体の方法がよく分からなくって・・・
>>263
こちらもできればお願いします。
0279デフォルトの名無しさん
NGNGbad_allocはnew演算子内から投げられる
bufには値は代入されていない
解放する必要がある/ないの前に
どこを解放するつもり?
0280デフォルトの名無しさん
NGNGイラク
0281デフォルトの名無しさん
NGNGイラクって解放できるの?
0282デフォルトの名無しさん
NGNG0283デフォルトの名無しさん
NGNG0284デフォルトの名無しさん
NGNGどうもよくわかんないんだけど、このレスで "C++" っていうとテンプレートや
オペレータの再定義等の C にない機能を使ったコードに限定されるの?
漏れはクラス一切無しのコードでも C++ で書くけど。
ネームスペースとか C99 風のいつでも出来る変数宣言とかありがたいし。
それで別に C より遅くなってる気もしないけど・・・
0285デフォルトの名無しさん
NGNG遅くなくて当たり前だ。
0286デフォルトの名無しさん
NGNG0287デフォルトの名無しさん
NGNGこの部分のコンパイラは同一のコード同一の人間が書いてる?
0288デフォルトの名無しさん
NGNGら、コンピュータのプログラミングに対するセンスが欠如してると認識
したほうがいいよ。
ちなみに gcc と g++ だと、ソースコードがプログラミング言語非依存
の形式になった後は、まったく同じルーチンで最適化されてアセンブリ
出力される。VC++ の cl.exe の中身なんて知らんが、C と C++ でわざ
わざ別の最適化なんてするとは思えないでしょ。
0289デフォルトの名無しさん
NGNG0290デフォルトの名無しさん
NGNGcin >> data;
した後、バッファに「\n」が残ったりしますけど
クリアするには、「cin.get()」とか「cin.ignore()」しかないんですかね?
0291デフォルトの名無しさん
NGNG俺は getline()派だ。
0293デフォルトの名無しさん
NGNGstring使うから、それだけでも大きく違う。と、思う。
少なくとも、Cと変わらない、は偏見じゃないか?
0295デフォルトの名無しさん
NGNGExeptional C++ の34ページの
>T::operator=()は、例外を投げた際に代入しようとしていたTオブジェクト
>の値が変更されてないことを保証しなければならない。
の意味が分かりません。そんな必要は無いと思うんですけど。
0296デフォルトの名無しさん
NGNGchar[]じゃなくstd::stringが使えるからって事でしょ。
改行残るのは、なんかflushとかしたらよかった気がする。
環境依存かもしれんしうろ覚えだから違うかもしれんけど。
0297デフォルトの名無しさん
NGNG>>116
「かわいい彼女」といっても三日で飽きるわけだが。
121 名前:番組の途中ですが名無しです[sage] 投稿日:04/06/10 02:40 ID:Qn1mrozU
>>120
3日で飽きても
なにもないより全然マシじゃないのこのC++野郎
0298295
NGNGアトミックでありさえすれば例外は投げてもよいように思えます。
なんで例外投げちゃいけないんですか?
0299デフォルトの名無しさん
NGNG標準化委員会でそう決定したからです。理由は標準化委員会に問い合わせて下さい。
0302デフォルトの名無しさん
NGNGん〜、科学的には説明できないけど、感覚として。
Cでも関数がエラーを返したのにポインタ経由で渡した引数を
ぐちゃぐちゃにされたらムカつくしな〜。
sturct Nanka iremono;
iremono.sono1 = saisyokarahaitteitamono;
if(ERROR == NannkaChoudai(&iremono)) {
assert(iremono.sono1 == saisyokarahaitteitamono);
}
これでassert()に失敗したらムカつく。
それと同じようなものを感じる。
もしoperator=( )が例外を投げたのに中途半端にオブジェクトが
変わっていたらきっとムカつくな。
0303デフォルトの名無しさん
NGNG$gcc -dr hoge.c
$g++ -dr hoge.cc
とした時の出力はちょっと違うんだよねえ。
しかし最終的なアセンブラコードはほぼ同じ。どうしてでしょう。
0304デフォルトの名無しさん
NGNGCとC++は仕様量が格段に違うんだから
それによって最適化しやすくなったり、
逆に不確定要素が増えて最適化しにくくなったり
ってのはあると思うんだけど、なんで誰も指摘しないのかな。
0305デフォルトの名無しさん
NGNG例外に対処するためのコードが埋め込まれたりして?
0306デフォルトの名無しさん
NGNGvectorのN番目の要素を削除したいときって、
erase()を使うしかなくて、erase()の引数はイテレータしかないですよね。
そこでこんな↓関数を作ってN番目の要素を指すイテレータを取得しようとしたんですが・・・
template <class Cont> Cont::iterator GetNItr(Cont c, int n){
Cont::iterator it = c.begin();
for(int i = 0; i < c.size(); ++i, ++it)
if(i == n) break;
return it;
}
帰ってくるのは不定値ばかり。一体なぜなんでしょうか?(試した環境はVC6です。)
それ以前に「N番目の要素のイテレータの取得」なんて
かなり使いそうな気がするんですがBoostとかにもないですよね。
やっぱり「イテレータ=反復子」という名前に反した使い方だからですかね??
0307デフォルトの名無しさん
NGNGつーか std::advance じゃだめなん?(戻り値として iterator を返してくれないから使いにくいけど)
0308デフォルトの名無しさん
NGNG0309デフォルトの名無しさん
NGNG0311デフォルトの名無しさん
NGNGとりあえず、その関数は
引数で Cont c ってやってるから、コンテナがコピーされ、コピーされた方の要素を指すイテレータが返るからダメになる。
Cont &cなら思ったとおりにいくんじゃね?まc.begin()+Nの方が断然いいが
0312デフォルトの名無しさん
NGNGoperator() 内で、
static std::vector< double > tmp;
ってインスタンス作るのと、
private 内に、std::vector< double > tmp
のインスタンス作ってoperator() 内で使うのと
どっちがいいんですか?
0313デフォルトの名無しさん
NGNGprivateインスタンスのほうがstaticよりマシ。
0315290
NGNGそれは分かるんですが…
「cin.getline()」使用時に「std::string」をどの様に利用するのですか?
0316デフォルトの名無しさん
NGNG0318デフォルトの名無しさん
NGNGthrow() 宣言すると、コンパイラが例外処理のためのコードを追加するから、
パフォーマンスを考えれたら、throw() は入れない。
あと、operator= が例外安全でなければいけない理由は、
simpleDBTable.Current["NAME"] = "MONA";
のような簡易データベース中の項目を置き換えるコードがあったとして、
この中で例外が発生したとき、すでにある項目が消されたら困るでしょ?
0319デフォルトの名無しさん
NGNG>パフォーマンスを考えれたら、throw() は入れない。
なるほどパフォーマンスの問題ですか。
>この中で例外が発生したとき、すでにある項目が消されたら困るでしょ?
そんなことは分かっているのですが(基本的に全ての関数はアトミックにすべき)、
この文脈でその必要はないのではと。例外投げられたら deleteされるので。
0320デフォルトの名無しさん
NGNG> 例外投げられたら deleteされるので。
そうは言えない。
T x = initial_value;
try
{
x = new_value;
}
catch( ... )
{
}
// x はまだ生きている。
// ここで x の値は initial_value か new_value か、どちらかであると言えなければ、
// 以降、 x へアクセスしたときの動作が把握できない。
0321デフォルトの名無しさん
NGNG> 例外投げられたら delete される
誰が delete するのさ?
君はデータベースの更新に失敗したら即座にテーブルを破棄するのか?
0322デフォルトの名無しさん
NGNG何らかの例外が発生したときに、
1. その例外を呼び出し元に正しく通知する。(例外中立)
2. 例外が発生しても、オブジェクトの状態は変化しない。
もしくは例外を出さない。(例外安全)
というのが、例外安全の基本。これを >>295 は理解しているのだろうか?
コンストラクタで例外が発生した場合、そもそもオブジェクトそのものが作成されないが、
代入処理の場合、例外が発生しても依然としてオブジェクトは存在している。
例外から回復して、オブジェクトを再度いじろうとしたときに内容が不定では話にならない。
0323295
NGNGおんなじこと何度も何度も書きやがって。んなこたー分かってる。
Exceptional C++ 33,34ページの話だYO!
catch してから deleteしてるだろ。
だからクラスTにアトミックな代入演算子は要求しないと思うんだよ。
あと swapについて。
確かに例外を投げないほうがいいときもある。
例えば73ページの第二の試み。最後に代入演算子使ってるけど、例外を投げない swapがあればそれで解決する。
でも Stackの例だとアトミックであれば例外は投げともよいと思うんだよ。
そこらへんどーよ。
0324デフォルトの名無しさん
NGNGまあ、おちついて。
"代入しようとしていたTオブジェクト"
とはコピー元をさしてっるて解釈はどお?
コピー元がconstでもmutable変数含んでりゃ
同にでも出来るし。
swapについてだけど、逆にswapが例外を投げる可能性がある場合、
swap(v1,src.v1);
swap(v2,src.v2);
swap(v3,src.v3);
見たいなメンバ関数を例外安全にするのは大変だYO!みたいな事が
言いたかったって解釈はどお?
0325デフォルトの名無しさん
NGNG> Exceptional C++ 33,34ページの話だYO!
そんなコード片の話をしてたのか、そりゃ気付かなかった。
例外発生したときの対応がdelete一択なら、たしかに、そんな要求はないよ。
でも、>>295で引用された2行が、より一般的なケースでの指針である可能性はないのかい?
本読んでないからわかんないだけかもしれないけど。
0326デフォルトの名無しさん
NGNG> "代入しようとしていたTオブジェクト"
> とはコピー元をさしてっるて解釈はどお?
明らかに問題外。
0328295
NGNGよく分からんけど自己代入ってこと?
でもコピー先は newしたばっかの領域だし。
swap についてはその通りですね。
でも Stackの例は適切ではないと思います。
>>325
>でも、>>295で引用された2行が、より一般的なケースでの指針である可能性はないのかい?
そう読めなくもありません。訳の問題なのかも。
でも 58ページに
Stack を例外安全にするために、唯一例外安全にしなければならないTのメンバ関数
なんて書いてます。
0329デフォルトの名無しさん
NGNGそんな話は関係ない。>>295の引用に対する解釈の仕方が問題外だってこと。
0330デフォルトの名無しさん
NGNGそういうことかよ。まぁ、悪かった。
でも今は会社だから手元に本がないんだよなー。
ただ、すこし言わせてもらえば、
アノ本は 代入処理は以下の形式にしなさいというのがキモで、
途中のイロイロは、すべて以下のコードにもっていくための「布石」だと思う。
this_type & this_type::operator=( this_type const & rhs )
{
this_type( rhs ).swap( *this );
return *this;
}
だから、途中のコード云々で話をするのはまったくもって無意味だと思うのだが、どうか?
0331デフォルトの名無しさん
NGNG0333デフォルトの名無しさん
NGNGできないかもしれない。
けど、最低限それだけは保証してもらわないと、どうやっても回復できなくなってしまう。
例外に対する対応がプログラムの終了以外ほぼ選択肢がなくなってしまうだろう。
(ほかには、そのオブジェクトに2度と触らないようにするくらい?)
解体すらできなくなってしまうような仕様のクラスは作らないのが常識だろう。
0334デフォルトの名無しさん
NGNG> その swapは例外を投げない保証をする必要ありますか?
this_type::operator=()への要求として例外安全性が必要なければ、
必要ない。
this_type::operator=()への要求として"no-throw gurantee"が必要ならば、
swapへの要求として引数に対する"no-throw gurantee"が必要。
this_type::operator=()への要求として"strong gurantee"が必要ならば、
swapへの要求として引数に対する"strong gurantee"が必要。
this_type::operator=()への要求として"basic(以下略)
0335334
NGNG0336デフォルトの名無しさん
NGNGまあつまり例外を投げない保証をする必要はないですよね。
この本 swapが例外を投げないことをやたら強調してますが、その理由が示されていないように思えます。
0337デフォルトの名無しさん
NGNG> その swapは例外を投げない保証をする必要ありますか?
ある。
>>330 のコードにおいて、swap が例外を発生させる場合を考えると、
>>322 の 2. を満たすためには、
operator= は以下のように直す必要があるが …
this_type & operator=( this_type const & rhs )
{
this_type temp( rhs );
... // this の状態を保存する。※1
try { temp.swap( *this ); }
catch( ... )
{
... // this の状態をもとにもどすコードを入れる ※2
throw;
}
return *this;
}
ここで、※ にどのようなコードを入れればいいかを考えるといい。
さらに、A.swap( B ) において、A のメンバの一部と、Bのメンバの1部だけが
入れ替わった状態で例外が発生すると、>>322 の 2. を満たせなくなる。
面倒なことをイロイロ考えなくてもいいように、swap は例外を出しちゃ駄目ってことになってるの。
0338デフォルトの名無しさん
NGNG例外が発生したときには、内部状態が変更されていないことを保証するクラス(群)を
構築する際には、例外安全な swap を用意すると便利だよ、STLもそうしてるよ、
っていう話だと思うけど。boost も同じ方針ですよね。
0339デフォルトの名無しさん
NGNGまた、マシって事は他にお勧めがあるんですか?
0340デフォルトの名無しさん
NGNGだーかーらー swapはアトミック性だけ保証してればいいんじゃないですか? アフォ?
>>338
あなたの言う例外安全っていうのは例外を投げないって意味ですか?
例外を投げないことがアトミック性を実現する一番簡単な方法ってなら分かりますが、
Exceptional C++ は swapが例外を投げないってことを強調しておきながら
そのちゃんとした説明がなされていないと思うんですよ。
0341デフォルトの名無しさん
NGNGswap がけして例外を投げないわけではない。
ポインタのスワッピングだから例外を投げないのだよ。わかるか?
0342デフォルトの名無しさん
NGNG???
組み込み型のスワッピングは例外を投げませんね。
再帰的に全てのスワッピングは例外を投げませんね。
swapは例外を投げないものだってのは分かります。
例外投げたらなんか無理してるってのも分かります。
でも Exceptional C++ 48ページに
> Swap() はどんな状況下であっても例外を投げない。
> Swap() のこの特徴こそが、Stack自身の例外安全に関する論証の要なのだ。
って書いてます。
Stack 内で StackImpl::Swap()は2回使われていますが、
これらが例外を投げたとしても Stackの例外安全性は損なわれないと思うんです。
0343デフォルトの名無しさん
NGNGしょうか?あんまりパフォーマンスがよくないとかいう話も聞くし。
どちらかというと、プログラムの連結とかそういうときに持ち出すの
ですか?
0344デフォルトの名無しさん
NGNGStackImpl::Swap のコードは、3つの std::swap から成り立っていて、
そのすべてが組込型に対するスワッピングである以上、StackImpl::Swap は
決して例外をスローしない。ここまではいいと思う。
そして、Swap が例外を投げない以上、これを積極的に使わない手はない。
で、それをふまえた上で、>>342 は、次のどちらを言いたいのか?
1. Swap が無くても例外安全に出来るじゃないか。
2. Swap が決して例外を投げないというその理由がわからない。
どうも、あなたの言いたいことがピンとこない…
0345デフォルトの名無しさん
NGNG僕が言いたいのは、Exceptional C++ の48ページの主張の真意を教えてくれ(Stackの例、間違ってんじゃねーの?)ってことです。
Stack がアトミックなのは Swapが例外を投げないからじゃなくて Swapがアトミックだからだ。
Swapが例外を投げないのはただの結果であって、この場合必要ではない。
と、僕は思うんです。
あー同じこと何回書いただろう。
0346デフォルトの名無しさん
NGNGclass A
{
SetOne();
SetTwo();
};
class B
{
SetOne(;);
}
class C
{
SetTwo();
};
というクラスがあったとします。クラスB、CはクラスAにある関数と同じものを一つずつ持っています。
このとき、同じことを何度も定義すると無駄なので、継承を考えますが、必要ない関数まで継承されて
しまいます。継承先で、必要のない関数を消す方法などはないのでしょうか?
また、何か解決策がありましたら教えてください。
0347デフォルトの名無しさん
NGNG0348デフォルトの名無しさん
NGNGclass A : public B, public C {};
なんじゃないのか?
0349131
NGNGstruct afo { virtual SetOne() = 0; };
struct sine { virtual SetTwo() = 0; };
class black { /* ry */ };
class c { /* ry */ };
class A : public afo, public sine { black b; c dakko; /* ry */ };
class B : public afo { black b; /* ry */ };
class C : public sine { c dakko; /* ry */ };
0350デフォルトの名無しさん
NGNGSwapは絶対に例外を投げない を
Swapは絶対に失敗しない に読み替えれば納得いくんでない?
0351デフォルトの名無しさん
NGNGもったいぶらないではっきり言えよ。
なにが言いたいのか全くわからねえよ。
0352デフォルトの名無しさん
NGNGかなりややこしい作りになってしまうんですが、もっとすっきりしたものにできないでしょうか?
できれば多重継承はない方向でいきたいと思ってます。
0353352
NGNG0354デフォルトの名無しさん
NGNG本の著作者にメールで真意を聞け
0355デフォルトの名無しさん
NGNGCやC++にはないですかね?
地道にクルクル回すしかないのでしょうか。
0356デフォルトの名無しさん
NGNGソースさらすの下手っ取り早いかと
0357デフォルトの名無しさん
NGNGそれで理解できないなら、その程度の頭ってことだ。
0358デフォルトの名無しさん
NGNG考えてみても分からん。まじで分からん。
教えてくれ。たのむ。
0359デフォルトの名無しさん
NGNGなのでかなり端折りますが、以下のような構造体を持つクラスがあります。
これはDirectXで用意されている構造体です。
typedef struct _D3DLIGHT9 {
D3DLIGHTTYPE Type;
D3DCOLORVALUE Diffuse;
D3DCOLORVALUE Specular;
D3DCOLORVALUE Ambient;
D3DVECTOR Position; // ディレクショナルのとき無視
D3DVECTOR Direction; // ポイントのとき無視
float Range; // ディレクショナルのとき無視
float Falloff; // ポイント、ディレクショナルのとき無視
float Attenuation0; // ディレクショナルのとき無視
float Attenuation1; // ディレクショナルのとき無視
float Attenuation2;// ディレクショナルのとき無視
float Theta; // ポイント、ディレクショナルのとき無視
float Phi; // ポイント、ディレクショナルのとき無視
} D3DLIGHT9;
type には ポイントライト、スポットライト、ディレクショナルライトがあります。
それぞれのライトには適用されず無視される変数というのが存在しています。
パラメータの前に書いてあるメッセージがそれです。
この構造体のすべての値を変更できるように、それぞれに対してセッターを作ると
実際に使用するときに、間違って無効なパラメータを設定してしまう場合があると思います。
これを防ぐために、3つのライトそれぞれをクラス化して、無効なパラメータを設定するような
関数は省きたいと思っています。
0360デフォルトの名無しさん
NGNGわたしが想像する サッターさんの真意は、
P35 や P37 のガイドラインおよび、P42 の 3 にあると思う。
それをうけての P48 の記述。
彼の譲れない部分(信念)として、「例外を起こす可能性のある処理」をすべて最初に行い、
「例外を投げる可能性のある処理で状態変更をしてはならない」わけ。
例はあくまで例。言いたいことはコレ。
以下駄文。国語のテストみたいなもん。
Swap に求められていることは、「アトミック」だとか「例外安全」とかいうことではないと思う。
本当に求められているのは、きっと「絶対に失敗しない」こと。
「ここまで来れば絶対成功する」という保証。だから、アトミックであることはもちろん、例外を投げるなんて論外。
まぁ、そういう宗教だと思えばいいじゃん。
0361360
NGNG0362デフォルトの名無しさん
NGNGあっはっはー
やーい逃げた逃げた
何が宗教だ ぼけ
0363デフォルトの名無しさん
NGNG教えてエロいひと!!
0364デフォルトの名無しさん
NGNGstruct PointLight : D3DLIGHT9 {
ポイント用セッター
};
としておいて、生の変数には直接触らないと誓う。
もしくは、AbstructLightクラスのメンバにD3DLIGHT9を持たせて、外からは触らないようにするか。
どっちにしろ、あんまりこだわっても大して嬉しくはならないので、適当なところで妥協することを薦める。
0365デフォルトの名無しさん
NGNG失敗する可能性が本来の代入処理より増えるのであれば、そんなロジックは採用したくない。
0366デフォルトの名無しさん
NGNGえ? 騙られてんの?
>>360
なるほどねえ。そう考えればつじつまは合わなくもない。
例はあくまで例というけれど、そんな破綻した例を持ち出して 48ページのような強い物言いをするかな?
信念があるのはよいけれど全く例が伴ってないよ。
>>323 に書いたように swapが例外を投げちゃいけない例ってのがあって、しかもその信念にぴったりなのにね。
0367デフォルトの名無しさん
NGNG0368デフォルトの名無しさん
NGNG>>生の変数には直接触らないと誓う。
誓うというのは、基本的に自分ならば大丈夫ですが、それ以外となると不可能なので。
妥協して無駄に同じ処理を記述するようにします。
ありがとうございました。
0369デフォルトの名無しさん
NGNGそんなレベルの話をしてるんじゃねえよボケ、と言いたいところだけど
著者の真意は案外そんなとこかもしれない。
>>367
そうですね。これだけ粘っても誰も説明できなかったので、著者は電波ってことで納得します。
スレ汚しスマソ。
0370デフォルトの名無しさん
NGNG0371デフォルトの名無しさん
NGNG>>363 の質問にも答えてやってくれ。
例外を出して、かつアトミックな処理の例とか出してくれると助かる。
0372デフォルトの名無しさん
NGNGそんなもん try,catch 使えばいくらでも書けると思うけど、好みじゃないので。
例えば >>330
最初のコピーコンストラクタが失敗しても、状態は変化していない。
その後の swapは例外を投げない、もしくはアトミックなので例外が起きても大丈夫。
最後の returnは参照渡しだから例外を投げない。
より一般化すると >>314
template <class Container, class BasicOp>
void MakeOperationStrong( Container& c, const BasicOp& op )
{
Container tmp(c); // Copy c
op(tmp); // Work on the copy
c.swap(tmp); // Cannot fail
}
op() がアトミックじゃなくても swap()がアトミックであれば、副作用が一つの処理なら
どんな処理でもアトミックにできると思う。
副作用が二つあったりすると、例外を投げない swap() が必要になると思う。
まあ swap()は例外を投げないべきだけどね。
0373デフォルトの名無しさん
NGNGop() がアトミックじゃなくても swap()がアトミックであれば大丈夫。
アトミックな swap()があれば、副作用が一つの処理ならどんな処理でもアトミックにできると思う。
にして。
0374デフォルトの名無しさん
NGNGてっきりクリティカルセクション的なアトミックを連想したよ。
つまり、
T temp( a ); a = b; b = temp;
ってあったら、そのすべてが必ずひとまとまりに行われるってのを想像した。
0375デフォルトの名無しさん
NGNG0376313
NGNGstaticインスタンス
×寿命が(おそらく)不必要に長くて、さらにその寿命はほぼ制御不能。
×さらに関数内staticは関数外からのアクセスは不可能。
○毎回作り直さないので、生成、破棄のコストがかからない。
×マルチスレッドに対応不可能。
privateインスタンス
○寿命はファンクタの寿命を超えない範囲で自由に制御できる。
○メンバ関数を通してアクセスが可能。
×毎回作り直すので、生成、破棄のコストがかかる。
○マルチスレッドに対応可能。
お勧めは、ファンクタのコンストラクタでstd::vector<double>への参照を受け取り、
メンバにポインタを保持する方法。
アルゴリズムのファンクタ引数は値渡しで実装されている可能性が高いので、
コピーのコストを抑えた方がいいケースが多い。
0377デフォルトの名無しさん
NGNGboost::tokenizerでかなりの事はできない?
0378デフォルトの名無しさん
NGNGポイントライトの位置設定とスポットライトの位置設定が同じ処理になることが偶然
と考えれば、別の関数としておくことに意義を見出せないか?
0379デフォルトの名無しさん
NGNG詳しい説明有難うございました。
0380デフォルトの名無しさん
NGNG0381デフォルトの名無しさん
NGNG0382デフォルトの名無しさん
NGNG特徴としてあげている箇条は大筋いいが
目的が示されていない以上そこまでだろ
どっちがお勧めという根拠がないぜ
0383デフォルトの名無しさん
NGNGEUC2SJISを使えば変換してくれるよ♪
0384デフォルトの名無しさん
NGNG区別が付けられません
0385デフォルトの名無しさん
NGNG区別をつけられなくて困っていることがあるのか?
0386デフォルトの名無しさん
NGNG0387デフォルトの名無しさん
NGNG>(visual cとturbo c)と(c言語とc++)との
E-mailとインターネットはどっちがいいですか?
ってのと同じくらい的外れな質問だぞ
0388デフォルトの名無しさん
NGNGhttp://tohoho.wakusei.ne.jp/wwwkanji.htm
下の方
半角文字は考えられていないようなので注意
0389デフォルトの名無しさん
NGNGEUCコード&0x7f7fしてからwctombs()だっけ?
0390デフォルトの名無しさん
NGNGShift-JISだぞ。
0391デフォルトの名無しさん
NGNGiconv()
0392デフォルトの名無しさん
NGNG0393デフォルトの名無しさん
NGNG全角厨より、100倍マシだと思うけど。
0395デフォルトの名無しさん
NGNG&0x7f7fしたら1バイト目の8ビット目まで0になってしまうと思うんだけど。
0396デフォルトの名無しさん
NGNGこれ、最強
0397デフォルトの名無しさん
NGNG0398389
NGNGそれがなにか? EUCの最上位ビットなんて(コードページを切り替えるための)飾りですよ。
飾りを取れば只のJISですから。
#但し、所謂1バイトかなの判定はそれ以前に行う必要があるけど。
>>397
私にはあなたの言いたいことが判らない。
0399デフォルトの名無しさん
NGNGEUCからShift Jisに変換するにはどうしたらいいでしょうか?
0400389
NGNGwcstombs()がコード変換すると何でか思い込んでたよ。
私が勘違いしてただけなのね。
0401デフォルトの名無しさん
NGNGchar buf[101];
wcstombs(buf, L"あいうえお漢字", 100);
puts(buf);
いや、普通にUCS-2からSJISに変換してるが@VC++6.0
0402デフォルトの名無しさん
NGNG0403デフォルトの名無しさん
NGNG0404デフォルトの名無しさん
NGNG0405デフォルトの名無しさん
NGNG0406デフォルトの名無しさん
NGNGif( ! card ){
printf("ブラックリストに載っています");
return 0;
}
card.buy(1000000);
delete card;
return 0;
こんな風にしたいんですが、
new("岸部四郎") CreditCard() を回避できないでしょうか?
0407デフォルトの名無しさん
NGNG0408406
NGNG・初期化エラー時nullを返すにはnew内で初期化
・初期化に引数をとるにはコンストラクタ内で初期化
で、両立する方法は new("誰それ") CreditCard() とありました。
しかしできれば普通の書式が良いのですが、他に無いでしょうか?
それともnullチェックより例外を使うべき?
0409デフォルトの名無しさん
NGNGclass CreditCard{
CreditCard(const char *);
public:
static CreditCard *New(const char *name){
if(name in list){
return 0;
}
return new CreditCard(name);
}
};
CreditCard *card = CreditCard::New("岸部四郎")
if( ! card ){
printf("ブラックリストに載っています");
return 0;
}
card.buy(1000000);
delete card;
return 0;
0410デフォルトの名無しさん
NGNGその前に本をよく読んでいないか読み間違えていないか?
new で引数をとるコンストラクタを用いたいなら、
new CreditCard("岸部四郎")以外ないと思うが、
回避したいって何が問題で何を回避したいの?
0411406
NGNGありがとうございます。
ただ、やはり特殊な書き方になってしまうので避けたいです…。
>>410
・初期化失敗時にnullを返したい
・普通にnew CLASS(引数)を使いたい//こっち重視
です。
newをオーバーロードして new(引数) CLASS() でも、>>409さんのCLASS::New(引数)でも、
一つ目をクリアする代わりちょっと浮いちゃうので…。
一つ目を諦めると例外を使うことになりますが、あまり失敗の多いところで使うと良くない気がして…。
他に解決方法はあるでしょうか。(例外で問題なければそうします)
0412デフォルトの名無しさん
NGNG0413デフォルトの名無しさん
NGNG0414デフォルトの名無しさん
NGNG>他に解決方法はあるでしょうか。
無い。
0415デフォルトの名無しさん
NGNGチェックしたいのがブラックリストのみで、
それに必要なのがコンストラクタで与える名前だけなら、
ブラックリストをメンバ変数としてもち
内部で>>409 のような処理を行うメンバ関数をもつ発行者クラスを
別に用意してチェックを分離したほうがスマートだと思う。
0416406
NGNG失敗はそれほど多くは無いと思います。が、後学のためにと思って。
>>413
そうですか…。勝手に CLASS.Create() はdelphiスタイルと思い込んでいました。
>>414
分かりました、ありがとうございます。他の方法をとります。
>>415
なるほど…。今回の場合ですが、例が不適切でした。
実は一段下でそれに似たことを行っており、(例? Deal *deal = card.startDeal() )、
かつcardを多数作るわけではなかったので三重は大げさかなと思った次第です。
今回は例外で行きますが、今後三種類の方法を適宜使い分けることにします。ありがとうございました。
情報が小出しになった&長文失礼しました。
0417デフォルトの名無しさん
NGNGデータの初期化について質問します。
例えば以下の例が有るとします。
enum Type
{
taaa,
tbbb,
tccc,
tlast
};
static char* lpType[tlast];
void main()
{
lpType[taaa] = "aaa";
lpType[tbbb] = "bbb";
lpType[tccc] = "ccc";
printf(lpType[tbbb]);
}
これはこれで上手く行ってる訳ですが何となく美しくない。
そこでこれをlpTypeを宣言した時に初期化したいわけですが
何らかの方法って無いでしょうか。
要は
static char* lpType[tlast] = {
[taaa] = "aaa",
[tbbb] = "bbb",
[tccc] = "ccc",
};
見たいな事が出来ないかなぁと思うわけですが。
0418デフォルトの名無しさん
NGNGhttp://pc5.2ch.net/test/read.cgi/tech/1087049069/32
0419デフォルトの名無しさん
NGNG...を要素とする配列
...をメンバ変数にもつクラスオブジェクト
...がTypeを添え字にとる配列オペレータを定義
していれば、できるんじゃねーかな。
0420デフォルトの名無しさん
NGNG{
taaa,
tbbb,
tccc,
tlast
};
template< std::size_t N >
class lpType {
static char[] tmp;
public:
static ostream&
operator<<( ostream& os ) const {
os << tmp;
}
};
lpType<taaa>::tmp = "aaa";
lpType<tbbb>::tmp = "bbb";
lpType<tccc>::tmp = "ccc";
template< std::size_t N >
lpType<N>::tmp = "not defined";
int main( void ) {
std::cout << lpType<taaa> << std::endl:
}
0421デフォルトの名無しさん
NGNG0422デフォルトの名無しさん
NGNG>418の方法は無理みたいですね。
それにC99を使うとなるとC++は使えなくなるようなのでこれも問題です。
とりあえず今回は勉強になったのでこれで良しとします。
有難うございました。
>>420
ここまでやるぐらいなら最初にmainで定義したほうが良さげです。
これはこれで面白いのですが。
0423デフォルトの名無しさん
NGNG名前=値に加え、型情報などの情報が「バイナリ形式」として納められています。
↓イメージ(実際はバイナリ)
long=name1=-123
unsigned long=name2=123
char *=name3=hello
↓値取得のクラス&メソッド(名前と型が一致しないと例外発生。型を取得するメソッドはない。)
void Conf::Conf(const char *file);
void Conf::getValue(const char *name, long *l);
void Conf::getValue(const char *name, unsigned long *lu);
void Conf::getValue(const char *name, char **s);
■このクラス&メソッドを下のような形式にラッピングしたいと思っています。
適切な型 ConfX::getValue(const char *name);
基底クラスをあとから作る?例外で条件分岐?なにかよい方法ありませんか?
0424デフォルトの名無しさん
NGNGどうすれば「よい」とみなすのか示せボケ
0425デフォルトの名無しさん
NGNG役に立つかどうかは知らないが
http://www.ksky.ne.jp/~seahorse/cpp/virtualbase.html
0426デフォルトの名無しさん
NGNGそしてCBaseにはhoge()と言う仮想関数を実装しています。
そして現在、以下のようなコーディングをしていますがー
CBase* pBase;
switch (i)
{
case 0:
pBase = new CA;
break;
case 1:
pBase = new CB;
break;
}
pBase->hoge();
正直綺麗じゃないし無駄なような気がします。
クラスを配列に定義して以下のように何とか出来ないでしょうか。
pBase = new class[i];
0427デフォルトの名無しさん
NGNGtypedef CBase* NewFunction();
template< typename T > CBase* New(){ return new T; }
NewFunction* const table[] = { &New<CA>, &New<CB> };
pBase = table[i]();
0428デフォルトの名無しさん
NGNG0429デフォルトの名無しさん
NGNGうーん、色々やって見ましたが上手く行かないです。
これをどこら辺に定義すれば良いのでしょうか。
とりあえず、こんな感じじゃ無理でした。
#include <windows.h>
typedef CBase* NewFunction();
template< typename T > CBase* New(){ return new T; }
CBase* const table[] = { &New<CA>, &New<CB> }; // エラー
CTest::CTest()
{
int i = 1;
CBase* pBase = table[i]();
}
エラーメッセージ
error C2440: 'initializing' : '' から 'class CBase *const ' に変換することはできません。(新しい動作 ; ヘルプを参照)
コンテキストはオーバーロードされた関数の非不明瞭を考慮しません。
0430デフォルトの名無しさん
NGNG>CBase* const table[] = { &New<CA>, &New<CB> }; // エラー
NewFunction* const table[] = { &New<CA>, &New<CB> }; // エラー
error C2440: 'initializing' : '' から 'class CBase *(__cdecl *const )(void)' に変換することはできません。(新しい動作 ; ヘルプを参照)
スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。
0431デフォルトの名無しさん
NGNGclass CBase{};
class CA : public CBase{};
class CB : public CBase{};
typedef CBase* (*NewFunction)();
template< typename T > struct NewT{ static CBase* New(){ return new T; } };
NewFunction table[]={&NewT<CA>::New,&NewT<CB>::New};
int main(){
CBase *p=table[0]();
0432デフォルトの名無しさん
NGNGまずはVC6を捨てる。
0433デフォルトの名無しさん
NGNG上手く出来ました。有難うございました。
0434デフォルトの名無しさん
NGNG0435デフォルトの名無しさん
NGNG0436デフォルトの名無しさん
NGNGerror LNK2019: unresolved external symbol "__declspec(dllimport)
int __cdecl swprintf(unsigned short *,unsigned int,unsigned short const *,...)"
が4個ほど出るよ…
0437デフォルトの名無しさん
NGNG2002使えるってことは2003もらってるはずだろ
0438デフォルトの名無しさん
NGNG0439デフォルトの名無しさん
NGNG暗黙的?に渡す以外はコンパイルエラーになってしまいます
A自体にtemplateをつける以外でどのようによびだせばよいでしょうか?
struct A
{
template<class T>A()
{
cout << typeid(T).name() << endl;
}
template<class T>A(T)
{
cout << typeid(T).name() << endl;
}
};
int main()
{
// A a<int>(); こういう感じで呼びたい
A a(1); //かっこ悪い
return 0;
}
0440デフォルトの名無しさん
NGNG>A自体にtemplateをつける以外で
こんなことしたいの?
0441デフォルトの名無しさん
NGNG0442デフォルトの名無しさん
NGNGもしかしてVCか?
明示的なテンプレート実引数の
正当な形を撥ねるケースよくあるぞ
0443デフォルトの名無しさん
NGNGちょっと格好悪いかも知れんけど。
template< typename T > struct type{};
template< typename T >
A::A( type<T> )
{
cout << tyoeid(T).name() << endl;
}
A a( type<int>() );
0444デフォルトの名無しさん
NGNGそんなものがあったんですね。ありがとうございました。
で、さっそく使ってみたのですが、
tokenizer.hppをincludeしてビルドしたところ、以下のようなビルドエラーが出ました。
boost\tokenizer.hpp(60) : error C2039: 'begin' : 'CString' のメンバではありません。
c:\program files\microsoft visual studio\vc98\mfc\include\afx.h(368) :
'CString' の宣言を確認してください。
C:\VC_PROJECT\0806\01\Main1.0β_0806\SetUserEntryDlg.cpp(310) :
コンパイルされたクラスのテンプレートのインスタンス化 '__thiscall boost::tokenizer<class boost::char_delimiters_separator<char,struct std::char_traits<char> >,char const *,class std::basic_string<
char,struct std::char_traits<char>,class std::allocator<char> > >
::boost::tokenizer<class boost::char_delimiters_separator<char,struct std::char_traits<char> >,char const *,class std::basic_string<char,struct std::char_traits<char>
,class std::alloca
tor<char> > >(const class CString &)' の参照を確認してください
問題の個所は
template <typename Container>
tokenizer(const Container& c)
: first_(c.begin()), last_(c.end()), f_() { }
となっています。これってboostのバグなのでしょうか。それともこちらの設定か何かが悪いのでしょうか。
長くてすみません。
0445デフォルトの名無しさん
NGNGCString じゃなくて std::string を使うべき。
0446444
NGNG読ませるのをCStringじゃなくstringにしたら通りました・・
お騒がせしました。
0447444
NGNGあ、ありがとうでした。
0448デフォルトの名無しさん
NGNG以下のコードではコメントアウトした部分ですべてコンパイルできませんでした。
何とかならないでしょうか?
#include <iostream>
#include <boost/function.hpp>
template< typename X >
void
testFunc( const X x ) {
std::cout << typeid(x).name() << std::endl;
}
int
main( void ) {
//boost::function< void ( const int ) > f;
//boost::function< template< typename X > void ( const X ) > f;
//boost::function< void template< typename X >( const X ) > f;
//boost::function< void ( template< typename X > const X ) > f;
f = testFunc;
f( 1 );
return 0;
}
0449デフォルトの名無しさん
NGNGboost::function<void (const int)> f; // constはなくても変わらない。
f = static_cast<void (&)(const int)>(testFunc); // void (*)(const int)でも良い。
0450デフォルトの名無しさん
NGNGとおりました、ありがとです。
0451デフォルトの名無しさん
NGNGboost/graphの
boost::in_degreeをつっこみたいのですが。宣言だけ書いてみます。
template< class Config, class Base >
inline typename Config::degree_size_type
in_degree( typename Config::vertex_descriptor, const adj_list_helper< Config, Base >& );
0452デフォルトの名無しさん
NGNG見かけたのですが、これはどういう意味でしょうか。
0453デフォルトの名無しさん
NGNGふつうは、キャストを嫌ってこっちだとおもうが。
boost::function< void (int) > f = testFunc< int >;
0454デフォルトの名無しさん
NGNGttp://www.kuzbass.ru/docs/isocpp/special.html#class.conv.fct
0455デフォルトの名無しさん
NGNG文法がよくわかりません。
int *p = new int[3] = { 1, 2, 3 };
や
int *p = new int[3] { 1, 2, 3 };
とやっても構文エラーがでてしまいます。
JavaやC#は下のやり方でいけるのですが。
0456デフォルトの名無しさん
NGNGできません。
0458デフォルトの名無しさん
NGNG#include <vector>
static int const initial[3] = {1,2,3};
std::vector<int> v(&initial[0],&initial[3]);
0459デフォルトの名無しさん
NGNG{
protected:
int a;
public:
int GetA() const { return a; }
void SetA(int a) { this->a = a; }
};
class B : public A
{
protected:
double b;
public:
};
このようなクラス関係で
B bInstance[100];
bInstance[1].SetA(50);
const A* ptr = bInstance;
++ptr;
int result = ptr->GetA();
とやるとポリモーフィズムでresultに50が入ると思うのですが、
実際には正しい値が得られません。
どこがおかしいのでしょうか?ご教授下さい。
0460デフォルトの名無しさん
NGNGC++のポリモはポインタが指してる先のオブジェクトへの操作
( *ptrか ptr ->mem_function() )についてだけで
ポインタそのものの操作(この場合、++ptr)に対しては
ポリモではないから。
つまり++ptrが間違い。
0461デフォルトの名無しさん
NGNGポリモーフィックなクラスを配列にしてはいけない。
参考:More Effective C++ の
「項目3: 配列をポリモルフィズム的には扱わない」
0462デフォルトの名無しさん
NGNGそういうものなのですね。ありがとうございました。
0463デフォルトの名無しさん
NGNGC++っていたるところで腐臭がする言語ですね。
0464デフォルトの名無しさん
NGNG0465デフォルトの名無しさん
NGNGC++は
ダサい
な
0466デフォルトの名無しさん
NGNG基底クラスやそこから派生したクラスを同一の配列に押し込むのは、サイズの違う
構造体を一つの構造体配列に無理矢理入れるのと同じ。破綻して当たり前。
0467デフォルトの名無しさん
NGNGstruct mona { operator giko (); };
なら、mona型からgiko型へのキャスト
mona c;
(giko)c;
0468デフォルトの名無しさん
NGNG0469デフォルトの名無しさん
NGNGtypedef boost::tokenizer<> tokenizer1;
tokenizer1 token( strLine );
for( tokenizer1::iterator it=token.begin(); it!=token.end(); ++it ){
cout << "TOKEN: " << *it << endl;
}
strLine には id001,あいうえお,pass,1, という文字列が入ってます。
で、 it の中の tok_ を見てくと、一回目は "id001" がちゃんと切り出されているのですが
二回目は "あいう" となっていて 三回目は "お" となっています。
区切り文字が "," 以外にも使われているのが原因か、日本語がだめなのかどちらかだと思います。
区切り文字を指定する方法、日本語を使う方法、わかりませんか?
2つめ。itに入ったトークンをCString か std::string か char[] にコピーするにはどうしたらいいでしょうか。
0470デフォルトの名無しさん
NGNG459ってポリモーフィック関係ある?
0471デフォルトの名無しさん
NGNGJava や C# のようにいちいち new するやり方なら、C++ も似た様な動きをすると思うけど。
0472デフォルトの名無しさん
NGNG関係ないですね。
C++ 的にはこの場合ポインタじゃなくて iterator をつかうべし、ということになるんでしょうね。
アドホックに済ませるならポインタ進めるための Next とかいうメンバ関数を用意するとか。
0473デフォルトの名無しさん
NGNG直感に反する挙動を示したからっていまさらキーキー言うのはナンセンスだよ。
カレーに肥料としての効果を期待するようなもんだ。
0474デフォルトの名無しさん
NGNGDB検索結果を格納するために
連想配列を使用してやろうとおもっているのですがなかなうまくいきません。
vector<map<string, string>>の型に格納予定です。
要素のmapにアクセスできないみたいです。 どのように書けばうまくアクセスできるのですか?
typedef StringHash map<string,string>
typedef VectorStringHash vector<StringHash>
VectorStringHash *pvsh // 検索結果格納済み
vector<string> vstrFieldName // フィールド名
for (VectorStringHash::iterator vit = pvsh->begin(); vit < pvsh->end(); vit++)
{
for (vector<string>::iterator it = vstrFieldName.begin(); it < vstrFieldName.end(); it++)
{
StringHash shMap = *vit;
StringHash::const_iterator n = (StringHash::const_iterator) (*vit).find(*it);
string strMap = n->second; //Segmentation faultでおちちゃう。
}
}
0475デフォルトの名無しさん
NGNG遅くなるし...面倒だし...
継承もメモリもったいないからなるべくしない...
ようにしてる
0476デフォルトの名無しさん
NGNGたぶん、その餌じゃ釣れませんよ。
0477デフォルトの名無しさん
NGNGつーか、そのコードじゃコンパイル通らんぞ普通。
0478デフォルトの名無しさん
NGNGGCC と Borland C++ Compiler だとこちらの方がおすすめとかありますか?
・特殊な部分がなく汎用的で、後から別の環境に移りやすいか
・初心者にも使いやすいか
の2つを気にしてるんですが・・・
0479デフォルトの名無しさん
NGNGWin32APIに触って窓出したりする必要ないならCygwinのgccが無難なんじゃないの。
フリーのbccは進歩止まってるし。
0480デフォルトの名無しさん
NGNGこういうのを作りたいんだけど
0481デフォルトの名無しさん
NGNGtypedefの使い方が変。
0482デフォルトの名無しさん
NGNGフリーのBuilderXに新しいBCCついてるよ
0483デフォルトの名無しさん
NGNGnがendだから?
0484デフォルトの名無しさん
NGNGx < it->end() って意味あんの?
x != it->end()じゃね?
0485デフォルトの名無しさん
NGNGいみあるよ
0486デフォルトの名無しさん
NGNG>>483さんの助言で見直したところ
表示ルーチンはまったく関係なかったようです。
mapを作るときにどうやらスコープを考えてなくつくったようで
内容がすべておかしくなってました。
お騒がせしました。
0487デフォルトの名無しさん
NGNGフリーって時点で「初心者向き」は消えたも同然
ベテランにとって必要な機能に限定した軽快な味が売りだからね
手取り足取りのサポートが欲しければ金がかかるのは世の常だよ
0488デフォルトの名無しさん
NGNGgcc しかないと思う。
風変わりな拡張を多用しないし、処理系固有のクラスライブラリとか覚えなくて済むし。
あと、コンパイラに「使いやすい・使いにくい」っていう差は特にないと思う。
あまり古いものだと規格準拠度が落ちて問題あるかも知れないけど。
0489デフォルトの名無しさん
NGNG>処理系固有のクラスライブラリとか覚えなくて済むし。
は? 別に付属してるもの全部覚える必要なんぞ無いだろ?
0490デフォルトの名無しさん
NGNGそういやそうだ。
0491デフォルトの名無しさん
NGNGこれって何の用途があります?
0492デフォルトの名無しさん
NGNGcppllにいろいろ例が載ってるよ
0493デフォルトの名無しさん
NGNGとはいえ、無理に使わないほうがイロイロな意味で幸せな気もする。
0494491
NGNGhttp://www.tietew.jp/cppll/archive/364
この辺ですか?参考にさせてもらいます。
ありがとうございます。
なんだか、ものすごくトリッキーな感じがするので
頭の体操にいはなるけど、素人は近寄らないほうがよさそうですね。
0495デフォルトの名無しさん
NGNG0496デフォルトの名無しさん
NGNG一見してデフォルトとまったく違う動きをするようなコードは、避けたほうが
良いと思うけどな。演算子オーバーロードにせよプリプロセッサのマクロに
せよ。
ネタとしては面白いけど。
0497452
NGNGレスありがとうございます。なんとなくそんな気がするのですが、
(giko)c
というより
giko(c)
ではないのでしょうか・・・それともどっちでもいいんですかね。
0498デフォルトの名無しさん
NGNGいてっ
おめーに突っ込まれるとな・・・
俺もヤキ回ったな
0499デフォルトの名無しさん
NGNGあんたの「一見」って? (ニヤニヤ
0500デフォルトの名無しさん
NGNG昔ハマったのは operator&& のオーバーロード。C/C++ だと組み込み演算子の && は
短絡評価できることが保証されているから
return foo() && bar();
だと foo() が真なら bar() は評価されない。しかし operator&& オーバーロードして
あると bar() も評価されちゃうので、意味合いがまったく違ってしまう。
字面が同じで一見してバグを発見できずに数人が半日無駄にした覚えあり。この
オーバーロードをしたヤツが、その後どうなったかはとても言えない。
0501デフォルトの名無しさん
NGNG>return foo() && bar();
こんなんでハマんなや
0502デフォルトの名無しさん
NGNGわからんでもないんだが。
C++だとboostのpathあたりか。spiritあたりまでいっちまうともうどうでもいいんだが。
0503デフォルトの名無しさん
NGNG「やりすぎ」かどうか論じるには基準が必要
0504デフォルトの名無しさん
NGNGfoo()が偽なら bar() は評価されない
じゃない?
0505デフォルトの名無しさん
NGNGコンテナのiteratorがRandomAccessIteratorなら、あり。
それ以外のイテレータなら、なし。
0506デフォルトの名無しさん
NGNGここでのインタフェースって何を指しているのでしょうか?
例えば、
class Implと、class Infcが在ったとき、Implの方には実装に必要な
privateインタフェースのみが定義されていて、publicインタフェースは無しで、
Impl内で、friend class Infcが記述されていて、InfcにImplのインタフェースを
移動していると言うことでしょうか?例を示して貰えないでしょうか?
0507デフォルトの名無しさん
NGNGごく簡単な例だと、例えば簡単な html パーサを書いていて、タグの情報をクラス化するとしたとき、
インタフェイス IHtmlTag を
class IHtmlTag {
public:
virtual const string& get_Name() const = 0;
virtual const HtmlAttr& get_Attributes() const = 0;
};
と定義し、実装は
class CHtmlImpl : public IHtmlTag
{
string m_strTag;
HtmlAttr m_attributes;
virtual const string& get_Name() const { return m_strTag;};
virtual const HtmlAttr& get_Attributes() const { return m_attributes;};
};
なんてしておく。
多重継承やcontainment で複数のインタフェイスを持つクラスなんかも作れる。
利点はイロイロあるけど、産業的にはクローズドソースでクラスライブラリを公開できる点が重要。
0508506
NGNGほほ〜。多重継承の場合は、LokiのGenLinearHierarchy等で複数のインタフェースを突っ込んだら
いい訳ですな。containmentは初めて聞くのでちょっと分かりません。後、
クローズドソースでクラスライブラリを公開できるって言うのと、.cppは公開せずに.hppのみの
公開の違いが分かりません。良かったらフォローお願いします。
0509デフォルトの名無しさん
NGNGC++ はたとえ private なものでもメンバ変数ひとつ増えるとオブジェクトサイズが
変わってしまう。インターフェースと実装を分離しない場合、内部的な改修で
あってもバイナリ互換性が崩れる可能性があるのでマズい。
以前は Microsoft の DLL でも、この手の変更が合ってとつぜん動かなくなる、
なんつー問題がしばしば発生してた。
0510デフォルトの名無しさん
NGNGCで言うところのソースとヘッダの分離におけるヘッダにあたる。
ヘッダだけ公開しといて、ソースはそれに合うように作れと。
標準化委員会なんかが好むやり方を想像すればいい。
0511デフォルトの名無しさん
NGNGそこから継承されたクラスは、その分、大きくなるのでしょうか?
0512デフォルトの名無しさん
NGNG1バイト?
確かに実装は未規定だが
さすがにそれは難しそうだな
0514デフォルトの名無しさん
NGNG実装については一切公開しないのがインターフェイスというやり方。
現実には実装も公開しちゃってるケースよくあるけど、それは妥協の産物。
0515デフォルトの名無しさん
NGNG1 バイトなのはポリシークラスでしょ。仮想関数あったら、最低ポインタ 1 個分は
必要。
継承した場合は単一敬称なら相変わらずポインタ 1 個分。多重継承すると
ポインタ n 個分になる実装が一般的。あと仮想継承は話が別。
0517デフォルトの名無しさん
NGNG実装側のヘッダは公開する必要ないけど。コンストラクタを陽に呼び出すのではなく、
インターフェースに従ったオブジェクトを作成する関数や、あるいはファクトリクラス
を公開する。
// 公開ヘッダ
struct IFoo {}; // 純粋仮想関数いろいろ
IFoo* CreateIFoo(); //
// 非公開ヘッダ
class CFoo : public IFoo {};
// 非公開実装
IFoo* CreateIFoo() { return new CFoo; }
Microsoft の COM まわりのドキュメントが参考になると思うぞ。
0518デフォルトの名無しさん
NGNGもしかして
#define インターフェース 実装
状態か?
0519506
NGNGtemplate< typename Interface >
class Impl : public Interface { ... }
を妄想していました。
0520デフォルトの名無しさん
NGNGImpl* pObj; ってやろーとしたろ?
Interface* pObj = new Impl; もダメ
さあどうする?
0522デフォルトの名無しさん
NGNG0523デフォルトの名無しさん
NGNG0524デフォルトの名無しさん
NGNG継承できないんだよな。(パフォーマンスのためなんだろうか)
virtualって一文字追加すれば良さそうなんだが...
このためだけに2つも実装書くのも面倒そうではあるが...
0525デフォルトの名無しさん
NGNG継承する必要ある?
0526524
NGNG機能拡張したい場合は、
できないよりできた方がイイと思うんだが...
完成されたものであれば、その必要はないだろうねぇ。
0527デフォルトの名無しさん
NGNG0528デフォルトの名無しさん
NGNG10中ハック、526がタコ。
といったところ本人がそれに気づくはずもなし。
まぁ、気がむいたら問題を書いてみな。
0529デフォルトの名無しさん
NGNG0530デフォルトの名無しさん
NGNG0531524
NGNGのような場合に
virtualじゃなかったら欠陥になりうるじゃん。
気を付けろといえばそれまでだけどw。
(だから、自分が管理してないコードに使うときはこわくて使えない。)
一般にポリモフィックな動作であれば問題ないコードで問題に
なるわけで、たぶんこれは継承じゃないんだなと邪推。
struct NV{~NV(){}};
struct EX :public NV{~EX(){}};
boost::scoped_ptr<NV> p(new EX);
とか?
0532デフォルトの名無しさん
NGNG・virtualメソッドをもつクラスを継承する場合、デストラクタもoverrideする。
0533デフォルトの名無しさん
NGNGそれはコンテナなのか?
0534デフォルトの名無しさん
NGNGそれはそうかもしれないが、重要なのはなぜそうなのか?ということだ。
>>526 にも理解できるよう説明すること。(20点)
0535デフォルトの名無しさん
NGNGboostのスマートポインタで扱う場合、そのケースでもメモリリーク(確か)しないよ。
試しにやってみなよ。
0536524
NGNG#include<iostream>
#include<boost/scoped_ptr.hpp>
struct NV{~NV()//virtual をあえてつけてない
{std::cout << "~NV" << std::endl;}
};
struct EX :public NV{
~EX()//virtualにすると呼ばれないだけでなく、下記の呼び出しでアボーンしちゃう
{std::cout << "~EX" << std::endl;}
};
int main()
{
{boost::scoped_ptr<NV> p(new EX);}//~NV
}
0537524
NGNGその通りですね。(以下はイメージ的なもの)
#include<iostream>
#include<boost/scoped_ptr.hpp>
struct Virtual{virtual ~Virtual(){} };
struct Non_Virtual{};
template<typename T,typename P_V=Non_Virtual> struct SEL{
SEL(){}
~SEL(){ std::cout << "~SEL<T,Non_Virtual>" << std::endl; }
};
template<typename T> struct SEL<T,Virtual>{
SEL(){}
virtual ~SEL(){ std::cout << "~SEL<T,Virtual>" << std::endl; }
};
template <typename T,typename P_V=Virtual> struct SEL_EX :public SEL<T,P_V>{
SEL_EX(){}
~SEL_EX(){ std::cout << "~SEL_EX" << std::endl;}
};
int main(){
{boost::scoped_ptr< SEL<int,Non_Virtual> > p(new SEL_EX<int,Non_Virtual>);}std::cout << std::endl;
{boost::scoped_ptr< SEL<int,Virtual> > p(new SEL_EX<int,Virtual>);}
}
0538デフォルトの名無しさん
NGNGメモリリークしないのは shared_ptr
ためしに、>>536 の main を以下のように書き換えて見れ。
int main()
{
boost::shared_ptr< void > p( new EX );
return 0;
}
0539デフォルトの名無しさん
NGNGデストラクタにvirtual付いていなくても仕方が無いような気がするんだが。
継承しても、クラスの内部的な動作を差し替えるようなことはできないし。
単なるラップ+αなら、メンバとして持ったって同じような気がする。
ソースを見てデストラクタを確認したり、ドキュメントを見なければならないのは
確かに危険だが、Javaのfinalに相当するものが無いからなぁ。
0540524
NGNGほんとだ。
{boost::shared_ptr<NV> p(new EX);}//~EX~NV
shared_ptrのコンストラクタってメンバtemplateになってるから
指定した型(NV)から推測されるポインタに代入しないで、
実際にコンストラクタに引き渡された型で
削除用の関数オブジェクトも生成しちゃって処理してるのか...。(頭イイ)
だからvirtual付けてない場合は、
{boost::shared_ptr<NV> p(dynamic_cast<NV*>(new EX));}//~NV
としちゃうと意図的にメモリリークを起こせると...
0541デフォルトの名無しさん
NGNGC++ で継承禁止クラスを作ることは可能だよ。
0542デフォルトの名無しさん
NGNG0543デフォルトの名無しさん
NGNGhttp://www.tietew.jp/cppll/archive/10658
あたりからの流れを参照。
早速自作ライブラリに取り込んでみたものの、結局使ったことがない。
ここまでするメリットを感じない。デメリットのほうが大きそうだしね。
0544デフォルトの名無しさん
NGNGええと、これ仮想継承で実現するのか。
デストラクタをvirtualにするよりメモリ食うのではなかろうか。
デストラクタvirtualよりパフォーマンスが良いなら考えるけどな。
0545デフォルトの名無しさん
NGNG以下のコードでどれだけメモリを食うか調べた。
(VC++2003)
struct A : public nonderivable< A > { int a; };
struct B { virtual ~B(){} int b; };
struct C : public B, public nonderivable< C > {};
int main()
{
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
}
結果は A, B は 8 、C は 12 と出た。
パフォーマンスにはあまり影響はなさそうだけど…、ようわからん。
0546デフォルトの名無しさん
NGNGchar_traits などのようにすべてのメンバを static で持つかどちらかにしろということだ。
0547デフォルトの名無しさん
NGNGSTLコンテナの継承にはprivate継承がお薦めですよ.
使うメンバー関数だけusingするといいです.
#include <deque>
using namespace std;
class A: private deque <int>
{
typedef deque <int> Base_;
public:
A (): Base_ () {}
A (const A &p): Base_ (p) {}
A &operator = (const A &p) {if (&p != this) {Base_::operator = (p);} return *this;}
virtual ~A () {}
using Base_::push_back;
};
int main () {
A a0;
a0.push_back (0);
return 0;
}
0548デフォルトの名無しさん
NGNGusingでそんなことできたんだ。
知らなかった。
0549デフォルトの名無しさん
NGNG0550デフォルトの名無しさん
NGNGよくわからんが、
private継承だから、基底クラスのポインタにすることはできない
0551デフォルトの名無しさん
NGNG基底クラスのポインタでインスタンスを保持できないんだから
デストラクタは必ず呼ばれると思う。
0552デフォルトの名無しさん
NGNGひょっとしてvirtualは不要になる?
0553547
NGNGそういう意図です.
>>552
混乱させたようですが,
デストラクタのvirtualはなくてもOKです.
これがなくても,先祖クラスのデストラクタを呼び忘れるなんてシチュエーションは起き得ないです.
Aをpublic継承する可能性があるなら付けておきましょう.
0554547
NGNG055510659
NGNG>ここまでするメリットを感じない。デメリットのほうが大きそうだしね。
「デメリット=無駄にメモリ喰う」って類のことを言ってんなら
デバッグ版の時だけギミックを仕掛けといて
リリース版の時にはギミックを外すようにしとけばいいんじゃない?
0556デフォルトの名無しさん
NGNGstruct person
{
char name[256];
int age;
};
こんなやつも同じ理由で心配になるのかな?
0557デフォルトの名無しさん
NGNG(若干表現は違ったかもしれない)
>基底クラスのポインタを介して派生クラスのオブジェクトを
>削除するとき、基底クラスのデストラクタがvirtualでないと
>、その結果は不定となる。
>不定とはコンパイラはどんなコードでも好き勝手に生成しても
>よいということだ。
この記事を読んでからは
特定のコンパイラで制限付きで動いてても
virtualでない場合は(似非)継承は避けることにした。
ポリモフィックな動作を保証できなくなるなら
他のキーワードがあっても良かった気がする。
0558535
NGNG微妙にうそついてすまんかった。
>>538
scoped_ptrだとリークするんだねぇ。
scoped_ptrリークする可能性のあるコード書いたこと無かったから知らなかったよ。
0560デフォルトの名無しさん
NGNG基底クラスオブジェクトへのポインタって考え方に固執することないじゃん
テンプレートあるんだし
0561デフォルトの名無しさん
NGNGそもそも仮想関数が1つも無いクラスのオブジェクトを
ポリモフィックに使わない。というか使えない。
そんなクラスに仮想デストラクタが必要なんだろうか?
他のメンバ関数は仮想で無いのに。
と、ひさびさに小一時間問い詰めたい。
0562デフォルトの名無しさん
NGNGまったくだ
0563デフォルトの名無しさん
NGNG#include <iostream.h>
とやるよりも、
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
とかってする意義はあるのでしょうか?
<iomanip.h>とかも全て<iomanip>でわざわざ using して使われてます。
どなたか知ってる方。
0564デフォルトの名無しさん
NGNG#include <iostream.h>
はものすごく古い
0565デフォルトの名無しさん
NGNGC#つかえよ。
どーでもいいよそんなもん。臨機応変にやれよ。
0566デフォルトの名無しさん
NGNGそういう風に標準化されているんです。
0567563
NGNG<iostream>だけしかできないことがあるとかはないんでしょうか?
0568デフォルトの名無しさん
NGNGいいとこ突いたな
返答が見ものだw
0569デフォルトの名無しさん
NGNG0570デフォルトの名無しさん
NGNGstd
0571デフォルトの名無しさん
NGNG劣っているというか、
string.h が困るよね。
0573デフォルトの名無しさん
NGNG0574デフォルトの名無しさん
NGNG>あんまり良く分かりません
「まったく分かりません」だろ?
名前空間について調べてみ
0575デフォルトの名無しさん
NGNG古いかもしれないけど規格外ではないだろ?
0576デフォルトの名無しさん
NGNG1998年の時点でdeprecatedなんだから、そろそろアウトにしたいなぁ。
0577572
NGNG良く分かりました。
0578デフォルトの名無しさん
NGNGプ
0579デフォルトの名無しさん
NGNG2000年からプログラミング始めたから。
std::stringとの連携、たとえば
ostream& operator<<(ostram&, const string&);
getline(istream&, string&);
なんかは、"iostream.h"には存在する保証が無い・・・のかな?
0580デフォルトの名無しさん
NGNGプ
0581579
NGNG0582デフォルトの名無しさん
NGNGそらー、食えるとしても新しいほうがいいじゃないかと。
0583デフォルトの名無しさん
NGNGこれの末文とかかな。
名前空間の問題もそうだけど、要は古い実装は1byte lengthのcharに
べったりで用意されていて、過渡期においては、テンプレート化された
新しい実装のものとで住み分けの必要も出てきた。
新しいものがstd名前空間に置かれてるのは当然のことで、逆に置かれてない方は
歴史的な事情に配慮して(つーか放置されて)こうなってるだけ、と。
0584デフォルトの名無しさん
NGNG14882:1998にそんな記述見つけられなかったし、VC7.1に入ってないけど。
0585デフォルトの名無しさん
NGNG0586デフォルトの名無しさん
NGNG規格化されていても問題ある定義体はいくらでもある(例: gets)
>>573にプと言ったのはマジレスだよ
0587デフォルトの名無しさん
NGNG0588デフォルトの名無しさん
NGNG実際にそうした定義が山ほどあるとしたところで、
数があるから問題じゃないというわけじゃなし…
えーと、悪い奴はだれだ!
0589デフォルトの名無しさん
NGNG#include <iostream.h>
int main() { cout << "hoge" << endl; return 0; }
と
#include <iostream>
int main() { std::cout << "hoge" << std::endl; return 0; }
で同じ結果が得られるって保証がないんだよね?
0590デフォルトの名無しさん
NGNGWindowsでもLinuxでも使えて、
フリーで使えて(業務用途不可でもいいです)、
Eclipseライクな操作性の C++ のIDEがあったら教えてください。
0591547
NGNG抜け道(非仮想デストラクタを持つ基底ポインタで派生クラスを削除)塞いどくのは,
別に悪いことではないのではないでしょうか.
そのままでは警告なりエラーなりはでないんですし.
ただ561は,確かにそうかもしれないと思った.
立て札たてとかなくても抜け道通る奴はあんまりいないかな.
0592デフォルトの名無しさん
NGNG知らんけど、EclipseライクがいいんならEclipse自身のC++サポートは駄目なの?
0593デフォルトの名無しさん
NGNG得られる保証も得られない保証もない
ISO/IEC14882が規定しないライブラリは
ISO/IEC14882ではユーザ定義であって
正しいか正しくないかを論じることができない
おまえさんの口ぶりから察するに
言いたそうなことは痛そうだが・・・w
0594デフォルトの名無しさん
NGNGフィルタに何を指定したらいいのでしょうか。
ユーザに、作ったソフトに加えて、RealMediaSplitterをインストール
してもらい、それのフィルタを使って再生する方法なら分かるのですが、
RealMediaSplitterの代わりに、本家のRealPlayerをインストールしてもらうだけ
で、Realメディアファイルを再生できるようになる方法が分かりません。
0595594
NGNGREALSYSTEM SDK
ttp://proforma.real.com/rnforms/resources/server/realsystemsdk/index.html
を使うそうで・・・・・
板汚しすいません(´・ω・`)
0596デフォルトの名無しさん
NGNG派生クラスを作るだろう人の実力によるよな。
初心者に毛が生えたような人だとすると
「どーあっても安全にしたい。効率なんか二の次だ」って
考えてvirtualつけることもあるだろう。
10659氏が言ってくれているように仕掛けを付けとくのも強力。
継承可能かどうかドキュメントに記しておくことも手助けにはなる。
デストラクタprotectedもある。ケースバイケースだな。
0597524
NGNGそういわれてみればそうですね。
仮想関数をなくしてデストラクタを非仮想関数にしてしまう
クラス設計もそれはそれでいいのですが、
本来継承するべきでないのか、
あるいはそれを断念せざるを得ない状況を生み出すという見方もないでしょうか?
(使用者側からはPolicyで選択できるのがいいです。)
まぁC++の場合、C#のsealedやJAVAのfinalのように継承を禁止されない分、
自由度が高いという見方もあるのかもしれません。
宗教論争みたいになってきたんでこれくらいでやめにしておきます。w
つきあってくださった方、ありがとうございました。
0598547
NGNG> 派生クラスを作るだろう人の実力によるよな。
同意.
私は(未来の自分も含め)派生クラスを作る人(以後,利用者)を信用しないほうですから,
安全性を優先してます.
作成者が利用者をコントロールする手段を提供するのは重要なことだと思います.
(そういう意味では543,555は私的にはヒットでした.)
次の言語規格改定では,この辺をもう少し頑張って欲しいですね.
0599デフォルトの名無しさん
NGNGと
int *abc の違いは何なのでしょうか?。*って、読み方なんでしたっけ?。
0600デフォルトの名無しさん
NGNG見た目だけ。
みにくいし
int* a, b;
とかしてはまるからそういう記述はやめとけ。
* = asterisk
0601デフォルトの名無しさん
NGNG0602デフォルトの名無しさん
NGNG理由はわかりません。
0603デフォルトの名無しさん
NGNG0604デフォルトの名無しさん
NGNGあなたの不注意
0605デフォルトの名無しさん
NGNGいろいろ試してみてください。
結構予想と違う振る舞いが多いですよ。
0607デフォルトの名無しさん
NGNGhttp://www.research.att.com/~bs/bs_faq2.html#virtual-dtor
C++に【も】向かない人はいるってことさ
0608デフォルトの名無しさん
NGNG0609デフォルトの名無しさん
NGNG0610547
NGNG「base* でdeleteする」のが利用者でない場合ってのはありえないでしょうか?
極端な例を出すと,
// designer.h
struct Must_Not_Derive {void memfun0 () {} ~Must_Not_Derive () {}};
void func (Must_Not_Derive *p);
// designer.cpp
void func (Must_Not_Derive *p) {delete p; p = new Must_Not_Derive;}
// user.cpp
struct Derived: public Must_Not_Derive {~Derived () {}};
int main () {
Derived *p (new Derived);
func (p);
return 0;
}
で,利用者がdesigner.cppを閲覧できない場合.
設計者は利用者がよもやMust_Not_Deriveを継承するとは考えてない.
一方,利用者はMust_Not_Derive::memfun0を使いたいのだか,
コンポジットあるいはpriavete継承が面倒臭いので,
funcでdeleteされることとは知らずにpublic継承してしまった.
例が極端だけどこういうはまり方はないでしょうか?
0611デフォルトの名無しさん
NGNGどんな場合?ぜんぜん思いつかない。
0612デフォルトの名無しさん
NGNGint* a, b;
とかしてはまるからそういう記述はやめとけ。
この場合は、aもbも、ポインターになるのですか?それとも、bは整数?。
0613デフォルトの名無しさん
NGNG試せば?
0614デフォルトの名無しさん
NGNG引数が非constのfuncが何をする関数かを知らずに使うわけか
0615デフォルトの名無しさん
NGNGレスつけるのは別に義務ってわけじゃないからね。
0616デフォルトの名無しさん
NGNG稚拙杉
0617デフォルトの名無しさん
NGNG自助努力をしろ
初心者であろうがベテランであろうが関係ない
これは人間性の問題
0618デフォルトの名無しさん
NGNG0619デフォルトの名無しさん
NGNGん、何か間違ったこと言ったか?
0620デフォルトの名無しさん
NGNGって書く人はやはり多いんですか?
私は絶対
int* a;
int* b;
と書きます。
0621デフォルトの名無しさん
NGNGその前に、
int* a,b;
と
int *a;
int *b;
は意味が違う
0622デフォルトの名無しさん
NGNGa と b が
・同型でなければならないとき
・たまたま同型なだけのとき
で書き方わけてるよ
0623デフォルトの名無しさん
NGNG型の記述なんだから型の方にくっつけたいよ。
ポインタ宣言は一行に一個。
0624デフォルトの名無しさん
NGNG0625デフォルトの名無しさん
NGNG0626デフォルトの名無しさん
NGNGそんなのは伺いをたてること
こっちから押し売りすることじゃない
0627デフォルトの名無しさん
NGNG0628デフォルトの名無しさん
NGNGtypedef
0629デフォルトの名無しさん
NGNG文盲か?
とりあえず馬鹿は引っ込んでてくださいな。
0630デフォルトの名無しさん
NGNGint *c;
でFA
0631デフォルトの名無しさん
NGNGコーディング基準は俺ルールじゃないってことだよ
0632デフォルトの名無しさん
NGNG0633デフォルトの名無しさん
NGNGム板ではなくマ板でやれば
少しは実りがあるはずだ
0634デフォルトの名無しさん
NGNG隔離ですかw
0635デフォルトの名無しさん
NGNGそういう意図はない
スタイルはプログラム技術じゃない
PGの社会に関することだ
0636デフォルトの名無しさん
NGNGマ板ってネタ系でわないのかね?
0637デフォルトの名無しさん
NGNGそうです。
つまり、勘違いや間違いを起こさないように、と言う意味です。
0638デフォルトの名無しさん
NGNGを
int* p1,p2;
と書き間違えたからって問題になるケースがあるかな?
大抵コンパイルエラーになって、んで訂正して終わりっしょ。
0639デフォルトの名無しさん
NGNG0640デフォルトの名無しさん
NGNGまず、
m_tbl = new (double *) [TBLNUM]; //TBLNUM個のdouble*型を割り当て
として次に
*m_tbl[i]=new (double *) [EACH_TBL_ARRAY];//おのおののm_tbl[i]にEACH_TBL_ARRAY個の配列へのポインタをセット
のようにしたいです。
上記だとコンパイルエラーになります。
0641デフォルトの名無しさん
NGNG*m_tblの型はdouble *だろ。
0642デフォルトの名無しさん
NGNG*m_tbl[i]=new double[]ですね。
でもその前にm_tbl=new(double*)[]がエラーってしまうのですが。
0643641
NGNG*m_tbl[i]はm_tbl[i]の間違いだろ?
要するに
*m_tbl[i]=new (double *) [EACH_TBL_ARRAY];
↓
m_tbl[i]=new double[EACH_TBL_ARRAY];
0644デフォルトの名無しさん
NGNG最初の記述は
m_tbl = new double* [TBLNUM];としたらOKでした。
もっと勉強します。
0645デフォルトの名無しさん
NGNGでも、543の仕掛けでエラーになったとして、
派生クラス作る人がヘボだと、ただ悩むだけになってしまったり。
ドキュメントちゃんと書けよってことか。
やっぱりこういうの綺麗にコンパイルエラーにする仕組みは欲しいよな。
0646デフォルトの名無しさん
NGNGint * i;
int* i;
int *i;
どれでも好きなやり方にしろって。
0647デフォルトの名無しさん
NGNG最後の一行を除き激しく同意
小技に凝る前に大きな忘れ物だ
0648デフォルトの名無しさん
NGNG組み合わせ1つ抜けてる
0649デフォルトの名無しさん
NGNG> 小技に凝る前に大きな忘れ物だ
具体的にはどういう意味?
0650デフォルトの名無しさん
NGNG0651デフォルトの名無しさん
NGNGなにか良い本やWebがあれば教えて下さい。
これから作るシステム構成は
・いくつかのサブシステムからなる。
・共通のコマンドユーティリティがある。
です。
lib, src, lib/src ???
0652デフォルトの名無しさん
NGNG0653デフォルトの名無しさん
NGNG0654デフォルトの名無しさん
NGNGってもうある?
0655デフォルトの名無しさん
NGNGconst_castやreinterpret_cast, mona(giko, c)はともかく
(char *)0を(char*)(0)と書けという根拠は希薄
0656デフォルトの名無しさん
NGNG混ざってると気持ち悪い。
0657デフォルトの名無しさん
NGNG安全性を考えてそうします。
0658デフォルトの名無しさん
NGNGstatic_cast<char *>(0)
( ゚∀゚)アヒャ
0659デフォルトの名無しさん
NGNG(char *)(0)はCスタイルじゃないか?
static_cast<char *>(0)
または
template<typename T> struct id{typedef T type;};
id<char *>::type(0)
かと。
0660デフォルトの名無しさん
NGNG0661デフォルトの名無しさん
NGNGいいたいことはわかるが
reinterpret_castでないあたりから
耐え難い腐臭が・・・
0662547
NGNG利用者のスキルが低い場合にはありえることじゃないでしょうか?
funcは今回は適当に名前を付けましたが,
その中でdeleteしてることを全く連想させない名前である可能性はあるわけです.
これを否定するために,私としても561みたいにこの状況が起こり得ないことを示したいですね.
>>645,647
「ドキュメントちゃんと書けよ」ってのには異論の余地は無いですが,
設計者が利用者とコミュニケーションが取れないことを仮定して,
対策を講じておくのはいいことだと思います.
また,利用者が設計者を信用しないことも同様に安全性を高めると思います.
私に反論して下さる方には,利用者と設計者の立場を分けて考える視点が欠落していると思います.
どうでしょうか.(煽ってなんかないですよ.念のため.)
皆さんそれぞれ作ってるものが違うでしょうから一概には言えませんけど,
virtualディストラクタが(ディストラクタに限らなくてもいいですが.)
全体のパフォーマンスに影響与えてる局面って,
結構少なくないですか?
0663デフォルトの名無しさん
NGNG>利用者が設計者を信用しないことも同様に安全性を高めると思います
では、STLもコンパイラもCPUも信用せずに何ができるのか聞こうか。
0664デフォルトの名無しさん
NGNG0665デフォルトの名無しさん
NGNGfloat(0) はC++タイプ、同様に(char*)(0) もC++タイプ
>>660
reinterpret_cast<char*>(0)
↑間違い
0666デフォルトの名無しさん
NGNG0667デフォルトの名無しさん
NGNGこれって何で間違いなの?
0668547
NGNGここでいう,安全性とは
利用者と設計者の意志疎通がうまく行ってないことに起因する危険に対する安全性です.
そういう意味ではSTLもコンパイラも自前で設計した方が安全ですよ.
ただ,私にはその能力も時間も無いので機能的規模が小さくなっちゃうでしょうけど.
0669デフォルトの名無しさん
NGNG>利用者と設計者の意志疎通がうまく行ってないことに起因する危険に対する安全性です.
ここまではいいが
>そういう意味ではSTLもコンパイラも自前で設計した方が安全ですよ.
なんでそうなるんだよw
おまえさん、プロのコンパイラ屋よりもマシなコンパイラ作れるのか?
0670547
NGNG利用者と設計者が同一人物であるほうが利用者と設計者の誤解が少ないと言いたいのです.
> おまえさん、プロのコンパイラ屋よりもマシなコンパイラ作れるのか?
そんなの無理です(笑).
だから「機能的規模が小さくなっちゃう」と書いてるんですよ.
まぁそんなのは最早STLとは呼べないんでしょうが.
0671デフォルトの名無しさん
NGNGなんでそうなるんだよw
0672デフォルトの名無しさん
NGNG>利用者と設計者が同一人物であるほうが利用者と設計者の誤解が少ないと言いたいのです.
・・・・・・
0673デフォルトの名無しさん
NGNG大体同じ意見。細かいところに話が行き過ぎてる気がするな。
ライブラリ作成者と利用者という立場で分けて考えると
ライブラリ作成者が課した決まりで利用者を縛りたいのは当然。
今話題になっている継承可能か否かという条件に関しては、それを行う時に
1. もしJavaのfinalのような言語仕様があれば、
利用者にも原因がわかりやすいコンパイルエラーにできる。
2. >>543のような仕掛けを用意して、とりあえずコンパイルエラーにする。
3. 継承不可能とドキュメントに書いておく。
4. (別の解法だが)効率無視してデストラクタvirtualで好きに継承させてしまう。
これくらいの選択肢があるぞと。
で、最もスマートなのは1。ドキュメントもほとんどいらないが今のC++では現実的じゃない。
2、3はドキュメント化して、利用者に守らせることが必須になる。
(2の場合は違反して継承した場合のコンパイルエラーを示しておかないと混乱の元)
4をやるかどうかはライブラリ作成者のポリシーによる。
俺は一連の流れからこんなふうに感じた。
0674デフォルトの名無しさん
NGNGg++3.3ではポインタに関してコンストラクタ記法はCスタイルキャストと全く同じ挙動を取るから、
(char *)(0)がどちらと等価かは実験では判断できない様だ。
従って、実際上どうでも良い事になるな。
文法上はどうなんだろう。
0675デフォルトの名無しさん
NGNG中点を幾つも書きたいだけなら、いちいち引用とかしなくていいです ;-)
0677673
NGNG自分が提供したライブラリを利用した場合、
どんなヘボプログラマが利用者でも可能な限り問題が起きないように
したいと思っているんだろうな。気持ちはよくわかる。
virtualの効率に関して言えば、最近だとケータイアプリの
ゲームなんかを作っている人は気にするんではなかろうか。
こういう環境で汎用的なライブラリを作ろうとすると、
「何でもvirtual付けとけ」とはならないような気がする。
0678547
NGNGあぁ,しまった.「private,protected継承」ってのも入れて下さい.
安全性を第一に優先する私としては,
1. Javaのfinalのような言語仕様
2. >>543のような仕掛けを用意して、とりあえずコンパイルエラーにする。
3. private,protected継承を検討する.
4. 効率無視してデストラクタvirtualで好きに継承させてしまう。
5. 継承不可能とドキュメントに書いておく。
の順でしょうか.
0679デフォルトの名無しさん
NGNG0681673
NGNG俺の見た感じこの話にはいくつか段階があって
Q. ヘボ利用者にポリモーフィズム周りで安全なライブラリを提供するには?
A1. デストラクタproteccted
A2. デストラクタvirtual
A3. 継承禁止
A3-1. Javaのfinalのような言語仕様
A3-2. >>543のような仕掛けを用意して、とりあえずコンパイルエラーにする。
A3-3. 継承不可能とドキュメントに書いておく。
のような形だろうか。
> 3. private,protected継承を検討する.
これはライブラリ作成者側から縛れないので疑問符。
>>673で 4に関して別の解法と記したのはA3の実現方法を論じているのに
それより上位の解法を出すのは反則かなと考えていた。
0682デフォルトの名無しさん
NGNGと移る人は多いと思われます。
つまり、c++の練習用ともなっているわけで
妨害する理由がいまひとつわかりません。
0683デフォルトの名無しさん
NGNG0684547
NGNGg++だと,
-Wnon-virtual-dtor 非仮想デストラクタについて警告する
ってのがあるけど,なんだか効いていないようです.
あと,
-Weffc++ Effective C++ 式の指針からはずれるものについて警告する
ってのがあって,これはbase class `class Hoge' has a non-virtual destructor
と警告してくれます.
0687デフォルトの名無しさん
NGNG0688デフォルトの名無しさん
NGNGまずは前提として→http://www.kouno.jp/home/c_faq/c5.html
reinterpret_cast<char*>(0)だと、int型の値0のビットパターンによるchar*型の値になる。
static_cast<char*>(0)だと、char*型のヌルポインタになる。
ヌルポインタが欲しい場合なら、前者は間違い。
0689デフォルトの名無しさん
NGNGΛ_Λ \\
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/ >>688
(_フ彡 /
s/ヌルポ/空ポ/
0690デフォルトの名無しさん
NGNG-Wall使ってもだめ。
どうすれば、ちゃんと怒られるようになるの?
0691デフォルトの名無しさん
NGNGダウト。
5.2.10-8 に明示的に書いてあるべ。
| 8 The null pointer value (4.10) is converted to the null pointer value of the destination type.
従って、reinterpret_cast<char*>(0) は char* 型のヌルポインタになる。
後、reinterpret_cast による変換は実装定義だからビットパターンが同じになるとは限らない。
サイズが十分なら「戻したとき」に同じになるだけ(5.2.10-5)。
0692デフォルトの名無しさん
NGNG間違って iosteram.h をインクルードしてない?
0693デフォルトの名無しさん
NGNGそんな奇妙な名前のものはインクルードしていません。
0694デフォルトの名無しさん
NGNGg++ (GCC) 3.3.1 (cygming special) だとオプションなしでしっかりと怒られますが何か?
特定の環境に依存した話題は↓の方が望ましい。
【初心者歓迎】C/C++室 Ver.7【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1086373839/
つか、g++ ならむしろこっちか。
GCCについて part3
http://pc5.2ch.net/test/read.cgi/tech/1072484422/
0695デフォルトの名無しさん
NGNGCスレに帰ってください。
0696デフォルトの名無しさん
NGNGbool Foo(){
return false;
}
でこの時、
main(){
int a = 0;
bool b = true;
if (a == 0 && b || Foo()) // A
a = 1;
if (a == 0 && b || Foo()) // B
a = 1;
}
と言う事をするとAではFoo()は呼ばれません。
これはbがtrueだからFooを実行しなくともifは真になる為、呼ばれないのは解ります。
しかしBではFoo()が呼ばれてしまいます。
漏れ的考えではa=1になってる為に最初のa == 0で偽になり、その後の条件は実行されないと思っていましたが・・・。
これは一体何故でしょう?
なお、コンパイラはVC++6.0です。
0697デフォルトの名無しさん
NGNG0698デフォルトの名無しさん
NGNGB のほうは
if (偽 && 偽 || Foo()) // B
なんだから、
if (偽 || Foo()) // B
と同値で、まだ Foo() によって真になる可能性がある。
0699デフォルトの名無しさん
NGNG左辺で偽になってるために、右辺が実行されるのでは....
0700デフォルトの名無しさん
NGNGif (偽 && 真 || Foo()) // B
ね。結論は変わらんが。
0701デフォルトの名無しさん
NGNG0702デフォルトの名無しさん
NGNG&&と || の優先順位の仕様を確認しよう。
MSDNだと、「優先順位と評価順序」という項目があるはずです。
初心者ほどわざと難しく書いて自分を混乱させるのが得意だからなぁ。
「難解な書き方するのがプロ」とかは、思わない方がいい。
素直に括弧つけてれば避けられるようなヒューマンエラーは自力で避けよう。
0703688
NGNGごめん。調べてみたら、まだ結論が出てない話みたい。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#463
漏れの意見は"SUGGESTED RESOLUTION"と同じく、
reinterpret_cast<T*>(0)は実装定義の変換であるべきだと思う。
そして、null pointer(これならガッてされない?)を取得する方法として
reinterpret_cast<T*>(0)としない理由を、「間違い」ではなくて
「static_cast<T*>(0)のほうが良い」と訂正しておく。
あと、
s/値0のビットパターンによる/値0から実装定義の変換によって得られる/
これでいいかな?
0704デフォルトの名無しさん
NGNG0705デフォルトの名無しさん
NGNGポインタだろうが配列だろうが、パフォーマンスはそんなに変わらんし、
無闇にポインタ使うのは最初のうちだけに汁。
かといって無闇に関数に参照渡しするのはマズイけど。
0706デフォルトの名無しさん
NGNGswap(文字列置換)
viエディタやPerl言語などで用いる有名な正規表現
0707デフォルトの名無しさん
NGNGsedスクリプトの置換コマンド。たぶんsubstituteの略。
0710696
NGNGアホだ、俺。あまりに初歩過ぎて気が付かなかった。
つか、今までコレよくまともに動いてたな。
たまたまデバッグで発見したんだけど。
0711デフォルトの名無しさん
NGNGちなみに>>706がネタで、>>707がマジ。
0712デフォルトの名無しさん
NGNG自分のソースなら間違いと気付けるけど、
他人のソースだった場合は、間違いなのか意図的なものなのか、
分からない事が多い。
0713デフォルトの名無しさん
NGNGしみじみ。
0714デフォルトの名無しさん
NGNG歴史的な事情により、そういうバージョンも残っている
STLも初期のバージョンではstdで囲われていなかった
0715デフォルトの名無しさん
NGNGそーゆーことを言いながら
素直に憶えれば避けられるようなヒューマンエラーは放置か
0716デフォルトの名無しさん
NGNG避けてこそ堅牢な開発が可能。
「素直に憶えれば避けられる」とか、気合とか、修行とか、
精神論まがいな言動をカマす人間は、
一生、独りでソース管理やってればいいだけのこと。
先入観が大きいほどに見逃す危険も大きくなるという
人間の心理を理解できない、>>715が実に憐れだ。
0717デフォルトの名無しさん
NGNG0718デフォルトの名無しさん
NGNGchar* c;
fc(c);
の呼び出しって、void fc(char*)が存在しない場合、
だいたい次の順で呼び出されるのが決まる。
1.fc(char*) or fc(char* const)
2.fc(const char*) or fc(const char* const)
3.fc(volatile char*) or fc(volatile char* const)
4.fc(const volatile char*) or fc(const volatile char* const)
5.fc(void*) or fc(void* const)
6.fc(const void*) or fc(const void* const)
7.fc(volatile void*) or fc(volatile void* const)
8.fc(const volatile void*) or fc(const volatile void* const)
9.fc(bool) or fc(const bool) or fc(volatile bool) or fc(const volatile bool)
0719デフォルトの名無しさん
NGNG> fc(char*) or fc(char* const)
これ、オーバーロードじゃないよ。同じ関数。
0720デフォルトの名無しさん
NGNG> fc(bool) or fc(const bool) or fc(volatile bool) or fc(const volatile bool)
これも全部同じだな。
0721デフォルトの名無しさん
NGNGこれも同じだな。
0722デフォルトの名無しさん
NGNGJava や C# じゃないんだから、非ポインタで普通に(ポリモじゃなく)クラスとして便利に使える
場面も多々あるわけで、ポリフォできないから継承ダメ、っていうのは方向性として漏れはすきじゃないなー。
派生クラスから基底クラスへのポインタに変換するトコがあればエラーなり警告なり出してくれる程度でいいや。
0723デフォルトの名無しさん
NGNG連想配列を扱う関数名が分かりません。
知ってる方がいれば教えてほしいのですが。
0724デフォルトの名無しさん
NGNG連想配列なら標準のstd::mapがお勧め。
ちなみにboostのProperty Mapはmapっぽいものに対する
共通のインターフェースであって、連想配列そのものではない。
0725デフォルトの名無しさん
NGNGいま、C++でカウンターCGIを作ってるんですが、
更新を押してもカウントしなようにするには
なにを使えばいいのですか?
なにかヒントになりそうなページとかあったら教えてください。
0726718
NGNGフォローどうもです。
fc(char*) = fc(char[]) = fc(char* const)
fc(const char*) = fc(const char[]) = fc(char const*)
ですね。
後から関数が加わったときに呼び出し先が変わると困る場合は
標準変換に頼って関数を呼びださないで
きっちりキャストしとかないとまずいってことなのかな。
0727デフォルトの名無しさん
NGNGhttp://pc5.2ch.net/php/
0728デフォルトの名無しさん
NGNGこういう場合はオーバーロードしない方がいいんじゃないか?
0729デフォルトの名無しさん
NGNGとした場合ってaもbも配列扱いのdeleteになるのでしょうか?
それとも
int *a, b;
みたいになっちゃうのでしょうか?
0730デフォルトの名無しさん
NGNG甘ったれはそっちだろ
規格票を読んでない人がそのことの正当性を強弁する姿は
マニュアルを読んでないユーザが直情で当たり散らす姿とそっくりだ
無知そのものに罪はないが、居直りが加われば間違いなく足手まとい
初心者には厳しさの中に優しさを持って接するが
周囲の足をひっぱるお荷物は叩き出すのが唯一の正当防衛
自分の仕事に関わる規格に精通しようと勉強する人の
やる気をくじくような毒電波をまき散らすな
あんた1人の甘ったれじゃ済まされない威力業務妨害なんだよ
先輩から吹き込まれたならアフォの伝統は浄化しろ
0731デフォルトの名無しさん
NGNGあるサイトのプログラムにあるのですが、
NULLって一体なんでしょうか?
文字でもないみたいだし。
教えてください。お願いします。
0732デフォルトの名無しさん
NGNG0に展開されるマクロ。
ポインタに変換される事を意図していると表明するために使われる事がある。
0733デフォルトの名無しさん
NGNGdelete [] a; b;
となる
0734デフォルトの名無しさん
NGNGうわ、こわっ
0735デフォルトの名無しさん
NGNGマクロとかよくわからないのですが・・・
もう少し簡単に説明するとどういう事なんでしょうか?
お手数ですが、お願いします
0736デフォルトの名無しさん
NGNG0737デフォルトの名無しさん
NGNG逃げろ!
0738デフォルトの名無しさん
NGNG怖くない
0739デフォルトの名無しさん
NGNGそのレベルの質問だと初心者スレのほうがいいでしょ。
ただし、そっちでも「自分で調べろ」「入門書嫁」で終わる
可能性が高いですが。
0740デフォルトの名無しさん
NGNG>周囲の足をひっぱるお荷物は叩き出すのが唯一の正当防衛
「言うは易し、行うは難し」だよ。
ネットで怪気炎あげるのは構わんが実際に叩き出すにしても、
そのための労力・時間も馬鹿にならん。
むしろ、甘ったれてるのは君だろ?
>自分の仕事に関わる規格に精通しようと勉強する人のやる気をくじく
そのくらいで挫けるならさっさと挫けてしまえばいい。
職人的な聖域を徹底排除することがPMにとって重要。
0741デフォルトの名無しさん
NGNG730は740に返答するんだろうけど、
言いたいこと全部書いたら敬語に変換して送信してみよう。
0742デフォルトの名無しさん
NGNG>「言うは易し、行うは難し」だよ。
行えない香具師からのインカムでおまんま食えてるわけだがw
職人やりたくない奴の侵入社員が何物よりも迷惑なんだよ
や る 気 ね ー や つ は 出 て け
どこの職場にも通じる鉄則だ
0743デフォルトの名無しさん
NGNG頭の可笑しい方々がいらっしゃいますねw
0744デフォルトの名無しさん
NGNGC/C++も例外でなく、C/C++である規格が定義されているからといって
その規格を無理に使う必要はない。
あえて思い切って、高度で煩雑な規格の使用を制限して、
多数派PGの理解レベルを優先したとしても、
決して資源の無駄にはならないだろう。
0745デフォルトの名無しさん
NGNG人事にかかわったことがない万年下っ端は楽でいいな。
0746デフォルトの名無しさん
NGNG新入社員がスタッフとして送り込まれてくるらしい。可哀相に(w
大した仕事でもないのに職人気取るヤシって邪魔だよな。
0747デフォルトの名無しさん
NGNG無能PGの理解レベルを優先して何の勝負をしてるんだ、おまえんとこわw
0748デフォルトの名無しさん
NGNG0749デフォルトの名無しさん
NGNGもえ。
0750デフォルトの名無しさん
NGNG不特定の人と関わる仕事をしているのであれば
これからメンテするかもしれないヘボプログラマのためにわかりやすい
書き方をしてやれる能力も必要だし、素人にはぱっと見紛らわしいような
仕様を理解しておく能力も必要でしょ。
そんな一方的な見方ばかりしてないで仲良くしてくれよ。
0751デフォルトの名無しさん
NGNGHSPを使用し、多数派PGの理解レベルを優先したとしても、
決して資源の無駄にはならないだろう。
0752デフォルトの名無しさん
NGNG規格票が理解できねって? ああ、そりゃお気の毒に・・・
0753デフォルトの名無しさん
NGNGのぞいて荒らしてることろを見ると、少しはやってみたいんだろ。
だったら大人しく教えて下さいといいなさい。
0754デフォルトの名無しさん
NGNGネタにマジ煽りされても困るなぁ。
なんつーかさぁ、もうちょっと心に余裕持てよ。
0755デフォルトの名無しさん
NGNGドライバ書きとかゲーム書きとか、あんまヘボだと言語がどうとかいう以前に業務が難しい領域が多くない?
・・・・とオモタけど携帯のソフトがあったか・・・
0756デフォルトの名無しさん
NGNG0757デフォルトの名無しさん
NGNG大人しく教えて下さい
で、何を教えてくれるの?そもそもお前はどのレスに言ってるの?
0758デフォルトの名無しさん
NGNGなにが教えて欲しいの?
0759デフォルトの名無しさん
NGNG0760デフォルトの名無しさん
NGNGあるひとつの問題に対してアプローチがいくつもあり、
それらひとつひとつが曲者だからね。
追いかけるのに疲れ果てて性格が歪むのも無理はない。
これは、C/C++をマスターしていると思っている人間ほど顕著である。
いちいち他人のコードを自分流に修正せずには
いられない脅迫観念にとりつかれているからだ。合掌。
0761デフォルトの名無しさん
NGNG規格票が理解できねって? ああ、そりゃお気の毒に・・・
0762デフォルトの名無しさん
NGNGひとつしかない方が異常だとおもうけど。
0763デフォルトの名無しさん
NGNG0764デフォルトの名無しさん
NGNG何が教えられるの?
0765デフォルトの名無しさん
NGNGさもなくば、事情を知らない煽りか?
前者であれば、口は悪いが心の熱い人間であるといえよう。
実際問題、無能PGが配置されてしまったとして、
そのフォローに奔走するのは結局>>742自身だからである。
>>740は、意外と冷酷な人間だろう。
途上国の安価PGに下請け発注することを専らとしているに違いない。
0766デフォルトの名無しさん
NGNG0767デフォルトの名無しさん
NGNG私は直前のIPを保持して同値ならカウントアップしないようにしています。
クッキーは好きじゃない。
自分自身が参照したときもカウントアップしないようにするといいかも。
こっちは自分なのでクッキーでもいいかな。
それよりもC++でCGI作らせてくれることがうらまやしい。
SAKURAはC止まりなので。
0768デフォルトの名無しさん
NGNGとした場合ってaもbも配列扱いのdeleteになるのでしょうか?
0769デフォルトの名無しさん
NGNGdelete a,b; とし、a,bをクラスにして、
bのデストラクタが呼ばれない事を確認してみろ。
0770デフォルトの名無しさん
NGNG演算子の結合規則くらい調べて来い
0771デフォルトの名無しさん
NGNG0772デフォルトの名無しさん
NGNG768は何かの「解決」を求めているか?
0773デフォルトの名無しさん
NGNG特にdeleteで解放しなかった領域も解放されるんですよね?
プログラムが終わった後まで影響しないですよね?
0774デフォルトの名無しさん
NGNGデストラクタはどうしましょ?
0775デフォルトの名無しさん
NGNG絶対されるとも言えないし、絶対されないとも言えない
0776デフォルトの名無しさん
NGNGプログラムの終わらせ方としては
普通にmainのreturnで終わる場合やexit()やabort()。
main終わるときにローカルオブジェクトはデストラクタ
呼ばれるんですよねぇ。
exit()を呼ぶと、後処理やってくれるようですが
スタックの巻き戻ししないんで、ローカルオブジェクト
はもれるって話みたいで、例外使うなりしてちゃんと
deleteしたほうがいいんですかね、というかみなさんは
そうしますか?
0777デフォルトの名無しさん
NGNG>後処理やってくれるようですが
このへん全然ダメ
ちゃんと調べろ
0778デフォルトの名無しさん
NGNGOS依存。まぁ、普通はプログラム終了時に
リソースは全て回収される罠。
0779デフォルトの名無しさん
NGNGメモリに関して言えば、多くのOSや環境でその通り。
デストラクタは走らないので、例えばテンポラリファイルを作るクラスなど開放時に
処理が必要なオブジェクトはちゃんと delete する必要がある。
0780デフォルトの名無しさん
NGNG>OS依存。まぁ、普通はプログラム終了時に
このへん全然ダメ
ちゃんと調べろ
0781デフォルトの名無しさん
NGNGデストラクタを動作させる必要があるなら、ちゃんと delete する。
「〜ほうがいい」とか言うより、仕様や期待する動作の通りに動くように
プログラムを書けばいいだけだと思うけど。
0782デフォルトの名無しさん
NGNG行う。atexitで登録した関数も呼ぶ。
0783デフォルトの名無しさん
NGNGttp://root.cern.ch/root/Cint.html
の日本語でのマトモな解説サイトとか御存知だったら教えて下さい。
google先生にお伺いしても大したサイトは引っかからないし、
本は絶版になっちゃってるみたいだし。
このソフトすごいと思うんですけど、マイナーなんですかね。
C++インタープリターってここにいる人達なんかにとってはちょっとしたスク
リプト感覚でC++が使えて非常に便利だと思うのですが。
0784デフォルトの名無しさん
NGNGC/C++系のインタプリンタって結構あるんだけどな。
0785デフォルトの名無しさん
NGNGどこかで聞いたことがある名前だったと思う。
0786デフォルトの名無しさん
NGNGそこ行ったらspybotが喚き出した。
0787デフォルトの名無しさん
NGNGVC++6でUnicodeです。
LPTSTR szHoge = new TCHAR(MAX_PATH);
ZeroMemory( szHoge, MAX_PATH * sizeof(TCHAR) );
int nRtn = (GetDlgItem( IDC_EDIT_HOGE ))->GetWindowText( szHoge, MAX_PATH * sizeof(TCHAR) );
LPTSTR lpTgzPath = new TCHAR( nRtn + 1 );
ZeroMemory(lpTgzPath, (nRtn + 1)* sizeof(TCHAR) );
CopyMemory( lpTgzPath, szHoge, nRtn * sizeof(TCHAR) );
delete szHoge;
IDC_EDIT_HOGEのコントロールから取得した文字列をlpTgzPathにコピーするんですが、
delete szHoge; にて例外が発生します。
何がいけないんでしょう・・・?
宜しくお願いいたします。
0788デフォルトの名無しさん
NGNGdelete szHoge;
↓
LPTSTR szHoge = new TCHAR[MAX_PATH];
delete [] szHoge;
0789725
NGNGサンクスです。
その方法でやってみます。
0790デフォルトの名無しさん
NGNGグハ orz
サンクス。もう仕事辞めます。
0791デフォルトの名無しさん
NGNG昼飯くったらまた頑張れ
0792デフォルトの名無しさん
NGNG誤:LPTSTR szHoge = new TCHAR(MAX_PATH); // 値MAX_PATHで初期化された 1 つの TCHAR を newする
誤:LPTSTR lpTgzPath = new TCHAR( nRtn + 1 ); // 値nRtn+1で初期化された 1 つの TCHAR を newする
正:LPTSTR szHoge = new TCHAR[MAX_PATH]; // MAX_PATH個のTCHARの配列をnewする
正:LPTSTR lpTgzPath = new TCHAR[ nRtn + 1]; // nRtn+1個のTCHARの配列をnewする
だら〜っとで良いので、もういっぺん C++ の本とか読み直しておいた方が余計な苦労せずに済むかも。
あと、szHoge みたいなのはいちいち new しないで、ローカル変数の方が良いと思う。
0793デフォルトの名無しさん
NGNG0794デフォルトの名無しさん
NGNG0795デフォルトの名無しさん
NGNG0796デフォルトの名無しさん
NGNGGetWindowTextやCopyMemoryで中身は上書きされるんだからZeroMemoryはいらない
テキストの長さだったらGetWindowTextLengthでわかる
int nSize = (GetDlgItem( IDC_EDIT_HOGE ))->GetWindowTextLength();
LPTSTR szHoge = new TCHAR(nSize);
(GetDlgItem( IDC_EDIT_HOGE ))->GetWindowText(szHoge, nSize);
0797デフォルトの名無しさん
NGNGdeleteミスるぐらいならスマートポインタ使えってことだよ。
っていうか今どきnewとかつかわんよ
0798デフォルトの名無しさん
NGNG0799デフォルトの名無しさん
NGNG>っていうか今どきnewとかつかわんよ
はいはい、脳内「今どき」はあんたの頭の中だけにしときな( ´,_ゝ`)プッ
0800デフォルトの名無しさん
NGNGnew以外に何使えばいいんでしょうか?
0801デフォルトの名無しさん
NGNGそんな餌で俺様がくまー
0802デフォルトの名無しさん
NGNGリソースの量を把握できなくていったい何の為のC++プログラマか。
0803デフォルトの名無しさん
NGNG0804デフォルトの名無しさん
NGNG0805デフォルトの名無しさん
NGNG0806デフォルトの名無しさん
NGNGCスレに(・∀・)カエレ!!
0807デフォルトの名無しさん
NGNG0808デフォルトの名無しさん
NGNG例えば、void func( char **& ) に参照つけるのはどうしてですか?
0809デフォルトの名無しさん
NGNGvoid func( char **&p)
だとしたら、funcでpをいじるんじゃないですか?
*pではなく、**pでもなく。
0810デフォルトの名無しさん
NGNG普通の参照と同じだが?
void func(char *&rp)
{
static char c = 'd';
rp = &c;
}
char *p;
func(p);
0811デフォルトの名無しさん
NGNG点線と黒い影が出ると思うんですけど、
そこからSetFocusでフォーカスを別のとこに移動させると
点線だけ移動して、黒い影がボタンに残ったままになってしまいます。
この黒い影を強制的に消すにはどうしたらいいでしょう?
0812デフォルトの名無しさん
NGNGキミはそれをC++の話題だと思うのか?
0813デフォルトの名無しさん
NGNGVC++やらMFCの話をここでしてはいけないのですか?
0814デフォルトの名無しさん
NGNG・ATL ないし、MFC を使っているならば、CStringT< TCHAR > を使って、
あらかじめサイズをしてした後で、GetBuffer()
・_bstr_t を使って、SysAllocStringByteLen を使い、領域確保してから、
GetBSTR() でバッファ取得。だが、この方法はオススメしない。
0815デフォルトの名無しさん
NGNG0817デフォルトの名無しさん
NGNGだめ。氏ね。
0818デフォルトの名無しさん
NGNG0819デフォルトの名無しさん
NGNGMicrosoft の Windows の話だと仮定して返事してみる。
黒い影は「デフォルトボタン」の印で、フォーカスとは必ずしも関係ない。
あとはWin32 API スレで続けた方がいいよ。C++ と関係ないし。
>>813
811 はおそらく Windows の UI の仕様に関する質問で、別に MFC も VC++ も関係ないみたいだけど・・・
0820デフォルトの名無しさん
NGNGそれと、rfunc( aaa ) と記述できない事と何か関係ありますか?
#include <iostream>
void rfunc( char *& rp ) {
rp[0] = 'a';
}
void pfunc( char * pp ) {
pp[0] = 'b';
}
int
main( int argc, char **argv ) {
char aaa[100];
char *bbb;
bbb = aaa;
rfunc( bbb );
std::cout << aaa[0] << std::endl;
pfunc( bbb );
std::cout << aaa[0] << std::endl;
return 0;
}
0821デフォルトの名無しさん
NGNGリファレンスを取る時は実体が必要。aaaは単なるポインタに変換され、それは
実体がない(変数に入っていない)のでリファレンスを取ることはできない。
無理に取ろうとすると一時変数が作られる。
0822デフォルトの名無しさん
NGNGrfuncもpfuncも引数(この例ではそれぞれrpとpp)に対して操作を行っていないので、
違いが大きく現れない。
rfuncでは、例えばrp = 0;とすると、これがmainのbbbに反映される。
pfuncではこれは起こらない。
このあたりはポインタとの絡みは関係なく参照という物の性質なので、
参照渡しについて復習してみる事をお勧めする。
rfunc(aaa)と書けないのは、aaaがポインタ変数でないから。(ポインタに変換可能であるに過ぎない)
0823デフォルトの名無しさん
NGNG手間を省く。
#include <iostream>
void rfunc(char*& rp)
{
rp[0] = 'a';
}
void pfunc(char** pp)
{
(*pp)[0] = 'b';
}
int main()
{
char a[] = "abc";
char* p = a;
pfunc(&p);
std::cout << *p << std::endl;
rfunc(p);
std::cout << *p << std::endl;
}
0824デフォルトの名無しさん
NGNGpfuncの引数のとり方では悲惨なことになりますね。
(まぁそういうことはあまりやらないけど)
0826デフォルトの名無しさん
NGNGvoid func(T&) と void func(T) の違いなんよ。ポインタとか関係ないんよ。
0827デフォルトの名無しさん
NGNGわかってるけどその説明じゃ分からない香具師がいるんだよ。頭の固い香具師が。
0828デフォルトの名無しさん
NGNG>頭の固い香具師が。
下らん質問にしか回答できない半端もんのくせに、
初心者に対してはびっくりするほど態度でかいな。お前。
0829デフォルトの名無しさん
NGNG>下らん質問にしか回答できない半端もんのくせに、
どうやって俺が下らん質問にしか回答してないとわかるんだ?エスパーか?
0830デフォルトの名無しさん
NGNG0831デフォルトの名無しさん
NGNG0832デフォルトの名無しさん
NGNGデコードする良いアルゴリズムって無いですかね?
自分で作った奴じゃ遅くって。
0833デフォルトの名無しさん
NGNG恐らくエスパーではなく「こわがり」なのでしょう ;-)
0834デフォルトの名無しさん
NGNGプリンタで大きく「C++」と印刷した紙を糊で体に貼り付けろ。
0835デフォルトの名無しさん
NGNGつまんね
0836デフォルトの名無しさん
NGNGパイロットに早くなれる方法はないかというのと同じくらい果てしない質問だ
0837デフォルトの名無しさん
NGNG0838デフォルトの名無しさん
NGNG0839デフォルトの名無しさん
NGNG0840デフォルトの名無しさん
NGNG0841デフォルトの名無しさん
NGNGプログラミング言語Ruby
0842デフォルトの名無しさん
NGNGマジレス
これ!
http://www.research.att.com/~bs/3rd.html
推奨の理由は、自分がこれで憶えたから。
ただし、これは第3版。俺が使ったのは第1版だった。
邦訳はこれ
http://www.longtail.co.jp/errata/
0843820
NGNGchar *& rp はbbbその物自体と理解しました。
0844デフォルトの名無しさん
NGNGおおまかにはそれでよし。
0845デフォルトの名無しさん
NGNGやりたいことは、エラーでるけどこんな感じ。
class A {
public:
string s[];
A(): s[0]("0"),s[1]("1") {}
};
0846デフォルトの名無しさん
NGNG無理無理。
0847832
NGNG文字で変換で調べてるけど見つからず・・・。
0848デフォルトの名無しさん
NGNGJavaScriptなら変換関数あるから簡単だよ。
C++なら自分で作ればいいし。アルゴリズムも何も、先頭から順に見て%見つけたら変換するだけだしね。
0849832
NGNGいや、出来るというか出来てるんですが結構遅くて。
こういうものは結構昔から使われているだろうから
何か良いアルゴリズムは無いかなぁと思う次第です。
0850デフォルトの名無しさん
NGNG相手にすんな。
「自作だと遅い」とか言ってるが、C言語で遅く作る方が難しい。
本当は作ってもいないのに知恵を拝借したいだけだろう。
あるいは過去ログコピペ荒しかもしれない。
0851デフォルトの名無しさん
NGNGこの程度のアルゴリズムでつまづくはずがない。
よって、釣り確定。
0852デフォルトの名無しさん
NGNGその遅いコードとやらはどうせ8,9行だろ貼って見せろ。
0853デフォルトの名無しさん
NGNG自演して楽しいもんなのか?
スレ違いだし。
0854デフォルトの名無しさん
NGNG0855832
NGNGBOOL URLdecode(char *in, char* out)
{
char hex[3] = { 0 };
char *p;
while (*in) {
if (*in != '%')
*out = *in;
else {
++in;
p = in;
if (*p >= '0' && *p <= '9' || *p >= 'a' && *p <= 'f' || *p >= 'A' && *p <= 'Z') {
hex[0] = *p;
++p;
if (*p >= '0' && *p <= '9' || *p >= 'a' && *p <= 'f' || *p >= 'A' && *p <= 'Z') {
hex[1] = *p;
*out = strtol(hex, &p, 16);
++in;
}
}
else
return FALSE;
}
++in;
++out;
}
*out = '\0';
return TRUE;
}
0856デフォルトの名無しさん
NGNGでぐぐれ
0857デフォルトの名無しさん
NGNGのほうがよいかも
0858デフォルトの名無しさん
NGNG0859デフォルトの名無しさん
NGNG何と比較して遅いのかが知りたいところだな。
0860デフォルトの名無しさん
NGNGURLdecode って名前つけてるな
それで検索しなかったのか?
0861デフォルトの名無しさん
NGNG確かに遅そうなコードで、しかもバグがあるね。
0862832
NGNG幾つか見て見ましたが定石みたいな物は無いみたいですね。
それでも自分の作ったやつよりは速そうなのでそれを使ってみることにします。
てか、URLdecodeで調べれば一発だったんだ。
文字変換で調べまくってたのはあほだった。。。
関数名に同じの使ってるのもあるし、、、orz
0863デフォルトの名無しさん
NGNGifの比較は遅すぎ。テーブル検索するように変更。
strtolは遅すぎ。自前で書き換え。
0864デフォルトの名無しさん
NGNG0865デフォルトの名無しさん
NGNGisdigit()などの実装しらんのか?
0866デフォルトの名無しさん
NGNG{
char hex[3] = { 0 };
int i = 0, j = 0;
while (in[i]) {
if (in[i] != '%')
out[j++] = in[i++];
else {
if ( isxdigit(in[i+1]) && isxdigit(in[i+2])) {
hex[0] = in[i+1];
hex[1] = in[i+2];
out[j++] = strtol(hex, 0, 16);
i += 3;
}
else {
out[j++] = in[i++];
out[j++] = in[i++];
}
}
}
out[j] = '\0';
return TRUE;
}
ほれ。ってもういいのか。
0867デフォルトの名無しさん
NGNG夏厨の季節には少し早いはずなんだが。
0868デフォルトの名無しさん
NGNGisdigit()などの実装がひとつだとでも言うのか?
0869デフォルトの名無しさん
NGNGC言語のCGIを語りつつ普及するスレ
http://pc5.2ch.net/test/read.cgi/php/1048393217/
0871デフォルトの名無しさん
NGNG粘着厨が。氏ね
0872864
NGNGhttp://www.microsoft.com/japan/msdn/library/ja/vclib/html/_crt_character_classification.asp
通常、文字分類ルーチンは、自作のテストより高速です。たとえば、次のコードは isalpha(c) を呼び出した場合より遅くなります。
if ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z'))
return TRUE;
(抜粋ここまで)
などと書かれている。お前ら、実際に試してみろ。
上のコードとisalpha()をReleaseビルド版で試すと、自作コードの方がisalpha(c)より速いことを確認できるだろう。
0873デフォルトの名無しさん
NGNG0874デフォルトの名無しさん
NGNG( ´,_ゝ`)プッ
嘘つきはお前だよ
0875デフォルトの名無しさん
NGNGMSDNも872も正しくない
0876デフォルトの名無しさん
NGNGそんなの何の意味も無い。
VC6のランタイムだと、
#define isdigit(_c) (MB_CUR_MAX > 1 ? _isctype(_c,_DIGIT) : _pctype[_c] & _DIGIT)
こんな実装になってる。_isctypeもまたシンプルでない実装になってるし。
0877デフォルトの名無しさん
NGNGいいから試せ。
漏れは、GCCとVC6で逆転を確認している。VC7は試してない。
0878デフォルトの名無しさん
NGNGだから試してから書いてんだよ。激遅。CPUの違いぐらいで吸収できる差とは
思えん。
0879デフォルトの名無しさん
NGNG俄然盛り上がるな。
0880デフォルトの名無しさん
NGNG0881デフォルトの名無しさん
NGNGその変数を返り値にした場合、呼び出し元で使っても大丈夫なの?
呼び出し元で返り値をすぐに変数に代入すれば安全が保証される?
スコープなぞ
0882デフォルトの名無しさん
NGNGだって煽ると面白いんだもん。やめられんよ。(゚∀゚)アヒャ
0883デフォルトの名無しさん
NGNGちゃんとinline関数とかマクロにしたか?
漏れの環境だと、isdigit():自作コード=5:1だぞ(VC6)。
0884デフォルトの名無しさん
NGNG0885デフォルトの名無しさん
NGNGそれぐらいちゃんとしてるっつーに。しつこいな。
0886デフォルトの名無しさん
NGNG俺がどのスレのどのレスで煽ってるかはどこにも書いてないのだが・・・・
またエスパーか?
0887デフォルトの名無しさん
NGNGコンパイル環境と所要時間の比ぐらい示したらどうか?
劇遅でも数値ぐらい示せるだろ。
0888883
NGNGisdigit()じゃなくて、isalpha()
0890デフォルトの名無しさん
NGNGダメ。すぐもなにも元よりスコープ外の物に保障はない。
0891デフォルトの名無しさん
NGNG………
}
class cAdv : public cTemp{
………
}
という感じでクラスを宣言して
cTemp *Test = new cAdv();
delete Test;
↑のコードを実行するとcAdvのデストラクタは実行されないみたいなんですが、
まちがっていますか?継承元ポインタのポインタをdeleteすると
継承元のデストラクタしか実行されないのかっていうことなんですが
0892デフォルトの名無しさん
NGNG0893デフォルトの名無しさん
NGNG間違ってない。そういう仕様だ。
0894デフォルトの名無しさん
NGNG#include <stdio.h>
#include <ctype.h>
#include <assert.h>
const int alpha = 1;
int table[256];
maketable()
{ int i;
for (i = 'A'; i <= 'Z'; i++) table[i] |= alpha;
for (i = 'a'; i <= 'z'; i++) table[i] |= alpha;
}
int isa1(int c)
{ return table[c] & alpha; }
int isa2(int c)
{ return ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z')); }
int measure(int(*f)(int), int times)
{ char s[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int i, j, t = clock();
for (i = 0; i < times; i++) for (j = 0; j < sizeof(s) - 1; j++) assert( f(s[j]) );
return clock() - t;
}
main()
{ maketable();
printf("%dms.\n%dms.\n%dms.\n", measure(isa1, 1000000), measure(isa2, 1000000), measure(isalpha, 1000000));
}
0895872
NGNG>低レベルな争い
そうだ。
低レベルで、かつ、ループの中で何千・何万回も行うかもしれない重要な処理だ。
スレ違いなのは認めるが、if構文や自作コードが遅いかどうかは極めて重要だろ?
0896デフォルトの名無しさん
NGNGセンスが無いのか読解力がないのか微妙な1〜2行目はともかく、
> スレ違いなのは認めるが
わかっているようなので終了ですね ;-)
0897872
NGNGinline関数やマクロを使ってないみたいだし。
それはそうと、>>894のコードを自環境(VC6)でやってみた。
(一部コンパイルが通らない部分やassert()除外などの修正した。)
297ms.
360ms.
343ms.
自環境ではテーブル検索型が最も速かった(isa2>isalpha>isa1)。
述語関数的な用途だと確かに標準ライブラリ関数が威力を発揮する。
自分が>>883で使ったソースでも非インライン・非マクロの場合、
標準のisalpha()に惜敗だった。差は5〜10%ほど。
いずれにせよ、>>878が触れたような【CPUの違いぐらいで吸収できない格差】が得られなかった。
>>878の劇遅に関するレポートが見たいところだな。
0898デフォルトの名無しさん
NGNGisa1 140ms
isa2 190ms
isalpha 670ms
くらいになった
0899872
NGNGなぬ?
関数アドレス渡しでもinline処理が使えるとは知らなかった。・・・orz
0ms.
0ms.
265ms.
・・・アレ?スマソ。ソース修正の仕方が悪く余計な最適化されてしまってたみたい。
そんなわけで余計な最適化されないように修正した。
〜最終結果〜
●非インライン・非マクロ(Ob2なし)
281ms.
375ms.
359ms.
>>897とほとんど同じ。
●インライン(Ob2あり)
78ms.
141ms.
500ms.
これも、テーブル検索型が最速だ。
0900899
NGNG不思議だが、この辺はコンパイラ依存が強そうだ。
VC7やgccでまた違った結果になる悪寒。
0901デフォルトの名無しさん
NGNG453ms.
500ms.
547ms.
0902デフォルトの名無しさん
NGNGBorland-C++5.6.4
-Od(最適化なし)
454ms.
578ms.
765ms.
-Ox(最大限最適化)
422ms.
516ms.
703ms.
Pen4 2.8G + WindowsXPSP1
腐った某ランドのコンパイラでもテーブルが最速である事が判明。
0903872
NGNGコンテナの再発明と、グローバル関数の開発は別だと思っている。
このスレを独壇場にしてスマンかった。
ムシャクシャしてやった。今は反省している。
0904デフォルトの名無しさん
NGNGそう思うなら氏ね
0905デフォルトの名無しさん
NGNG0906デフォルトの名無しさん
NGNG0907デフォルトの名無しさん
NGNG書いても何も得しないんでしょうか?
void Process() const throw();
のthrow()の部分。
0908デフォルトの名無しさん
NGNG継承で実装するよりも、templateと特殊化で実装
した方が楽な気がしますが、何か問題あるでしょうか?
0909デフォルトの名無しさん
NGNGそれで動的に出来るのか?
0910デフォルトの名無しさん
NGNGASCIIコードのみを考えるなら、自作のほうが早くなるのかも寝。
0911デフォルトの名無しさん
NGNGコーディングは繰り返しが出てくるくせに…
0912デフォルトの名無しさん
NGNGテストしてみたけど、isalphaだけだとうまくいかない。
(下記の後者のどこがいけないのでしょうか?)
setlocale(LC_CTYPE,"japanese");
//これはOK
for(int i=0;i<=0xFF;i++){
if( !( isa2(i) == ( (isascii(i & 0xFF) != 0) ? (isalpha(i & 0xFF) != 0 ) : (false) ) ) )
printf("isa2(%d)=%d,isalpha(i)=%d\n",i,isa2(i),i,isalpha(i));
}
//これだとなぜかうまくいかない
for(int i=0;i<=0xFF;i++){
if( !( isa2(i) == (isalpha(i & 0xFF) != 0 ) ) )
printf("isa2(%d)=%d,isalpha(i)=%d\n",i,isa2(i),i,isalpha(i));
}
0913デフォルトの名無しさん
NGNG0914デフォルトの名無しさん
NGNGじゃあ、どうやって戻り値を利用するの?
0915デフォルトの名無しさん
NGNG0916デフォルトの名無しさん
NGNGつうか、プログラムもうちょっとちゃんと書け
ifの条件をすっきりさせて、printfの引数の数を数えなおせ
0917デフォルトの名無しさん
NGNG半角カナ
0918デフォルトの名無しさん
NGNG関数の引数に変数を渡したらコピーされるのは知ってるけど、
returnの場合もコピーされた変数が戻る?
0919912
NGNGほんとだね。全然見てなかった...orz
setlocale(LC_CTYPE,"japanese");//これがないときは両方うまくいく
//これはOK
//asciiか判断してからalphaかを確認
for(int i=0;i<=0xFF;i++){
if( isa2(i) != ( (isascii(i) != 0) ? (isalpha(i) != 0 ) : (false) ) )//一致しないとき
printf("isa2(%d)=%d,isalpha(%d)=%d\n",i,isa2(i),i,isalpha(i));
}
//これだとlocale変えてるときに一致しないときがある
//alphaかだけを確認
for(int i=0;i<=0xFF;i++){
if( isa2(i) != (isalpha(i) != 0 ) )//一致しないとき
printf("isa2(%d)=%d,isalpha(%d)=%d\n",i,isa2(i),i,isalpha(i));
}
0920デフォルトの名無しさん
NGNG0921デフォルトの名無しさん
NGNGctype.hのisalphaはマクロだから遅くないけど、
localeのisalphaは複雑なコードだから遅い。
0922デフォルトの名無しさん
NGNG0923デフォルトの名無しさん
NGNG>>872は正直者です。
ちなみに私も正直者です。
0924デフォルトの名無しさん
NGNG0925917
NGNG一致しない範囲は半角カナなんだってば。
この辺?
> _ismbcalpha
> 英字 c がシングルバイト ASCII 英字(0x41<=c<=0x5A または 0x61<=c<=0x7A)
> または半角カタカナ文字(0xA6<=c<=0xDF)の場合だけ真を返します。
0926デフォルトの名無しさん
NGNGもどらない。戻り値は使わないようにすべき
0927デフォルトの名無しさん
NGNG!?
0928デフォルトの名無しさん
NGNG今96×96で14枚つづりのアニメーションをしよう(画像は96×1334)と思っているのですが
アニメーションなんてやったことないので正直わかりません
やり方を教えていただけないでしょうか?
また画像をまとめる際は横長や縦長にするより正方形や長方形にしたほうがいいのでしょうか?
よろしくお願いします
0929デフォルトの名無しさん
NGNG0930デフォルトの名無しさん
NGNGすっきりとした回答をお願いします。
0931デフォルトの名無しさん
NGNG二文字動かすの部分がわかりません。出力例をください
0932デフォルトの名無しさん
NGNGDebug warning!
Detected memory leaks
といわれてしまいます
なぜですか?
0933デフォルトの名無しさん
NGNGメモリリークしてるからです。
0934デフォルトの名無しさん
NGNG文字通りメモリリークしている。
たぶんdelete忘れ。
VCスレで発見方法教えてもらえ。
0935デフォルトの名無しさん
NGNG>>934
サンクス
0936919
NGNGthx.
923あたりで言ってる意味がやっとわかったw
MSDN不親切すぎ
>is 系ルーチンでは、指定した条件に対するテスト結果は、
>現在のロケールの LC_CTYPE カテゴリ設定に依存します。
>詳細については、setlocale を参照してください。
MINGWの説明(・∀・)イイ!!
http://mingw.biggie.jp/reference/isalpha.html
0937デフォルトの名無しさん
NGNG0938デフォルトの名無しさん
NGNGclass A{
class B{
public:
int x;
}
B y;
}
こんな感じでクラスの中で宣言したものをその上のクラスで宣言して使う時
gccではコンパイルできるんですがBorland C++では出来ません。
なにかオプションとかつけたら出来るようになるんでしょうか?
0939デフォルトの名無しさん
NGNGISO/IEC 14882:2003,Information Technology―Programming languages―C++
では、アニメーションについて規定していない。
よって、このスレのスコープ外である。
処理系別のスレで質問されるがよい。
0940デフォルトの名無しさん
NGNGできるだろ。もしかして
int x;
} ←ここに ; が抜けてるだけ、とかいうオチじゃないだろうな?
0941デフォルトの名無しさん
NGNGそれっぽい罠
0942デフォルトの名無しさん
NGNG0943デフォルトの名無しさん
NGNG0944デフォルトの名無しさん
NGNGint main(int argc,char *argv[])
{
FILE *fin = stdin;
if(argc>1) fin = fopen(argv[1],"r");
・・・
}
このように引数が与えられない場合は標準入力を使用し、引数が与えられた
場合にはファイルオープンをするような処理をiostreamを使って簡潔に記述する
方法をご教授ください。
0945デフォルトの名無しさん
NGNGifstream istr;
pstr = &cout;
pstr = &istr;
(*pistr) >> i;
0946デフォルトの名無しさん
NGNG0947945
NGNGpstr = &cout;
↓
pstr = &cin;
0948デフォルトの名無しさん
NGNGマジで言ってるんだとしたら、相当痛い。もう寝とけ。
0949デフォルトの名無しさん
NGNGこんなところで。
#include <iostream>
#include <fstream>
int mainfunc(std::istream & stream){
int i;
stream >> i;
std::cout << i;
}
int main(int argc,char *argv[]){
if(argc>1){
std::ifstream stream(argv[1]);
mainfunc(stream);
}else{
mainfunc(std::cin);
}
return 0;
}
0950945
NGNGpstrを、pistrに修正。
ま、雰囲気で分かるとは思うが。
0951944
NGNGなるほど・・・理解しました!
ありがとうございました。
0952デフォルトの名無しさん
NGNGchar *dogs[4] = {"Afghan Hound", "Beagle", "Border Collie", "Dalmation"};
のような文字列の配列を定義するにはどうすればいいんだろ。。。
class name{
private:
char *dogs[4] = {"Afghan Hound", "Beagle", "Border Collie", "Dalmation"};
};
こうするとエラーでるし。
0953デフォルトの名無しさん
NGNGこれでいいか
class name{
private:
static char *dogs[];
};
char *name::dogs[] = {"Afghan Hound", "Beagle", "Border Collie", "Dalmation"};
0954デフォルトの名無しさん
NGNGclass name{
private:
char *dogs[4];
public:
name()
{
dogs[0] = "Afghan Hound";
dogs[1] = "Beagle";
dogs[2] = "Border Collie";
dogs[3] = "Dalmation";
}
};
0955952
NGNGこれだと結局はグローバルで初期化することになるよね?
できればコンストラクタ内で初期化したいんだよ。
>>954
それは俺も考えたんだけど、そんな面倒くさいことしないといけないの?
本当に使おうと思ってる配列の数は28個なんだけど。。。。
0956デフォルトの名無しさん
NGNGclass name{
private:
char *dogs[4];
public:
name()
{
ifstream f("dogs.txt");
for(int i = 0; i < 4; i++) {
//ma, ganbareya...
}
}
};
0957デフォルトの名無しさん
NGNGprivate:
static const char * * dogs;
public:
name() {
static const char * const tmpDogs[] = {
"AH", "B", "BC", "D",
};
dogs = tmpDogs;
};
0958デフォルトの名無しさん
NGNG> できればコンストラクタ内で初期化したいんだよ。
ならコンストラクタの中に書けばいいじゃないか。
0959デフォルトの名無しさん
NGNG>そんな面倒くさいことしないといけないの?
古今稀に見るワガママ君だな、キミ(w
クラス関係ないじゃん。
0960デフォルトの名無しさん
NGNGコンストラクタ内で初期化したいということは、インスタンス毎に配列を
持っていたいということ?そうだとしたら、そもそも>>953の方法は適さない。
その配列を書き換えるつもりが無いのなら、staticなメンバとして宣言して、
クラス定義の外で一度だけ初期化するの(つまり、>>953の方法)が自然だと思う。
その配列の用途が判らないことには答えようがないよ。
0961デフォルトの名無しさん
NGNG>>952はインスタンス変数とクラス変数の違いが分かってないのでは?
0962デフォルトの名無しさん
NGNG0963デフォルトの名無しさん
NGNG>インスタンス変数とクラス変数
お前の造語か?( ´,_ゝ`)
0964デフォルトの名無しさん
NGNG0965デフォルトの名無しさん
NGNGマジ知らねーの? おまえ・・・
0966デフォルトの名無しさん
NGNGまずググってから発言するべきだったな
( ´,_ゝ`)スゲーバカハッケンシマスタ!
0967デフォルトの名無しさん
NGNGまあ、クラス変数作るのにstaticなんてキーワード使うC++系言語が悪いといえば悪いんだけど。
ググってから発言すべきってのには同意。
0968デフォルトの名無しさん
NGNG0969デフォルトの名無しさん
NGNG0970デフォルトの名無しさん
NGNGお前ひょっとして、>>874と同一人物か?
0971デフォルトの名無しさん
NGNGそれもクラス変数、インスタンス変数とは微妙に違う。
0972デフォルトの名無しさん
NGNG0973デフォルトの名無しさん
NGNG0974デフォルトの名無しさん
NGNG0975デフォルトの名無しさん
NGNG0976デフォルトの名無しさん
NGNG俺は恥かしそうに「おちんちん」て言ってほしい。
0978デフォルトの名無しさん
NGNG0979デフォルトの名無しさん
NGNG0980デフォルトの名無しさん
NGNG0981デフォルトの名無しさん
NGNG0982デフォルトの名無しさん
NGNG0983デフォルトの名無しさん
NGNGは、つまり勃起することを意味する。
0984デフォルトの名無しさん
NGNG0985デフォルトの名無しさん
NGNG0986デフォルトの名無しさん
NGNGすみません、部屋間違えました
0987デフォルトの名無しさん
NGNG0988デフォルトの名無しさん
NGNG型が違うから同じコンテナに入れて走査できないだろ?
0989デフォルトの名無しさん
NGNG∧∧ ミ _ ドスッ
( ,,)┌─┴┴──────┐
/ つ. 相談室は夏期休暇中 │
〜′ /´ └─┬┬──────┘
∪ ∪ ││ _ε3
0990デフォルトの名無しさん
NGNG0991デフォルトの名無しさん
NGNG0992デフォルトの名無しさん
NGNGここでおちんちんの呼び方がきっかけで起こった俺のちょっとHな体験談を
書かせてもらおうか。
あれはバイトをしてた頃の話だ。
当時俺はファミレスでバイトをしていた。
ある日バイトの休憩時間にウエイトレスの女の子と休憩室で二人きりになったんだ。
女の子と言っても俺より2歳年上で、バイトの先輩でもあった。
0993デフォルトの名無しさん
NGNG0994デフォルトの名無しさん
NGNG0995デフォルトの名無しさん
NGNG男性器のことを何と呼ぶかという話になった。
彼女はさっきも書いたとおり年上で、
けっこう活発で面倒見も良い頼れる先輩って感じなんだけど、
その話の時はなんだか耳が赤くなってるのが俺にはわかって、ちょっと可愛く見えた。
その時は彼女は「ちんちん」と呼ぶと言っていた。
いつもの先輩としての彼女とは違って、少し恥かしがってる言い方がちょっと新鮮だった。
休憩時間はそんな話で終わったんだけど、
その日のバイトは俺も彼女も閉店時間までだったので、
バイトが終わってからまた休憩室で一緒になった。
0996デフォルトの名無しさん
NGNG0997デフォルトの名無しさん
NGNG0998デフォルトの名無しさん
NGNG0999デフォルトの名無しさん
NGNG1000デフォルトの名無しさん
NGNG10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。