■過去ログ置き場に戻る■ 1- 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part31
1 名前:デフォルトの名無しさん :04/06/02 23:08
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

過去スレ、関連スレ、関連リンクなどは >>2-9 あたり

2 名前:デフォルトの名無しさん :04/06/02 23:08
  1 http://mimizun.mine.nu:81/2chlog/tech/piza.2ch.net/tech/kako/980/980175292.html
  2 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/

3 名前:デフォルトの名無しさん :04/06/02 23:10
■基本■
[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/ (日本語)

4 名前:デフォルトの名無しさん :04/06/02 23:11
4 G E T

5 名前:デフォルトの名無しさん :04/06/02 23:11
■Books■
amazon.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/

6 名前:デフォルトの名無しさん :04/06/02 23:12
6 G E T

7 名前:デフォルトの名無しさん :04/06/02 23:12
■Libraries■
[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


8 名前:デフォルトの名無しさん :04/06/02 23:12
8 G E T

9 名前:デフォルトの名無しさん :04/06/02 23:14
■関連スレ■
- 【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

10 名前:デフォルトの名無しさん :04/06/02 23:15
■コンパイラスレ■
- タダで最強!フリー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


11 名前:デフォルトの名無しさん :04/06/02 23:16
■開発環境スレ■
- ★初心者に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

/**************** テンプレここまで ****************/

12 名前:デフォルトの名無しさん :04/06/02 23:40
>>1
乙です!

13 名前:デフォルトの名無しさん :04/06/02 23:51
Z

14 名前:デフォルトの名無しさん :04/06/02 23:51
前スレのclassとstructだけど、javaからきた人(?)はinterfaceのかわりにstructとか
使ったりするのかな?

15 名前:デフォルトの名無しさん :04/06/02 23:53
>>14
逆に聞くがインターフェイスでprivateにすべきメンバとは?

16 名前:デフォルトの名無しさん :04/06/03 00:02
>>1 の名前が・・・

17 名前:デフォルトの名無しさん :04/06/03 00:20
95 名無しでいいとも! 04/06/03 00:13 ID:c++9JSEr
このIDマ板いけば神か?

http://live8.2ch.net/test/read.cgi/livecx/1086186992/

18 名前:デフォルトの名無しさん :04/06/03 01:03
以下のコードをコンパイルすると、
g++-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*)'


19 名前:デフォルトの名無しさん :04/06/03 01:11
>>18
肝心の18行目がないな。


20 名前:18 :04/06/03 01:18
ごめんなさい。
以下のようにするとコンパイルが通りました。
typedef int chpiPliValueCBFT(p_vc_record);
ということは、2.95 は、(C っぽく)ポインタを自動変換するけど、
3.2 では、(C++ らしく)ポインタを自動変換しないので、
エラーになるということでしょうか?


21 名前:18 :04/06/03 01:20
>>19
改行が多すぎるといわれたので、つめてしまってました。
実際には、以下の行でエラーになってました。
acc_vcl_delete(NULL, (chpiPliValueCBFT*)chpiPliValueCBF, ch, 2); }


22 名前:デフォルトの名無しさん :04/06/03 13:33
STLつかうと一気に実行ファイルサイズが10倍に?!

23 名前:デフォルトの名無しさん :04/06/03 13:35
>>22
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

24 名前:デフォルトの名無しさん :04/06/03 14:08
>>1
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

25 名前:デフォルトの名無しさん :04/06/03 14:27
はいはい、スレ1つにつき1回だけだよ。
このスレじゃもう終わりだよ。

26 名前:デフォルトの名無しさん :04/06/03 20:00
>>24
1は言ってねぇだろ

27 名前:デフォルトの名無しさん :04/06/03 22:09
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいのですか?

28 名前:デフォルトの名無しさん :04/06/03 22:11
>>27
#include "stdafx.h"

後死ね。

29 名前:デフォルトの名無しさん :04/06/03 22:12
>>28
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

30 名前:デフォルトの名無しさん :04/06/03 22:16
つりはよそでやれ。あとググれ。

31 名前:デフォルトの名無しさん :04/06/04 00:37
ググレカレー

32 名前:デフォルトの名無しさん :04/06/04 01:32
ファイルからMD5ハッシュ値を計算して16進表示させたいんですが
CryptCreateHashは使えるでしょうか。
文字列のハッシュ値は求めれるようですが、サイズの大きなファイルから
求めるにはどうしたらいいのでしょうか。

33 名前:デフォルトの名無しさん :04/06/04 01:42
>>32
このスレのタイトルを声に出して10回嫁。

34 名前:デフォルトの名無しさん :04/06/04 02:46
>>32
そのファイルが読み込めるだけの記憶域を取得できれば可能。
だがその前にスレタイ読んで回線切って(tbs

35 名前:デフォルトの名無しさん :04/06/04 07:45
fopen系、fstream系、CreateFile系
みんなさんはファイル入出力どれ使ってますか!
(というかどれが好み?)

最近ftream系を使い出して機能豊富に脱毛してたんだが、
いかんせん使い方にクセがあって戸惑ってますよ。

36 名前:デフォルトの名無しさん :04/06/04 07:49
>>35
そりゃ、fstream。C++スレだしな。

37 名前:デフォルトの名無しさん :04/06/04 08:48
個人的にはCStdioFileがおすすめだよ。

38 名前:デフォルトの名無しさん :04/06/04 08:52
>>35
iostreamが楽

#DirectXのファイル入力これにしてくれよ〜>MS

39 名前:デフォルトの名無しさん :04/06/04 11:13
>>35
ライブラリを使わない時は API。それ以外は fstream。
fopen は間違っても使わない。

取り合えず禿になる前に慣れろ。

40 名前:デフォルトの名無しさん :04/06/04 11:34
便乗で質問なんですが
FILE構造体とかストリームオブジェクトが管理する入出力バッファって、
どこら辺に配置されているんでしょうか?
まぁ、そうそう手が出せない領域に置かれるとは思うんですが

41 名前:デフォルトの名無しさん :04/06/04 12:47
>>40
手の出せない領域ってなんだ?
例えばVC++6.0の標準ライブラリならソース追っかければ分かるが、最終的にFILE構造体を
確保してるのはただのmallocだが。

42 名前:いちごあめ :04/06/04 13:11
はじめまして、こんにちは!

VC++ 6.0 で CrystalReports 10 を使って帳票を印刷
するプログラムを作りたいと考えています。
でも、いくら探しても方法やサンプルコード等どこに
も載っていません。
どなたかご存知の方いらっしゃいませんか?
よろしくお願い致します。

43 名前:デフォルトの名無しさん :04/06/04 13:41
>>42
このスレのタイトルを声に出して10回嫁。

と言っても理解できそうにないな。
スレ違いだ。VCスレに逝け。>>11

44 名前:デフォルトの名無しさん :04/06/04 13:54
Win32APIスレだと思うが

45 名前:35 :04/06/04 14:06
意外とfstream使ってる人多いんだな!
慣れるまで我慢して使ってみる事にします。

所でfstream::read()でバッファに読んだ時に
実際に読んだサイズってどこから取ってくるんでしょう?
読む前と後でtellp()って事はないですよね・・・。

46 名前:いちごあめ :04/06/04 15:42
>>43
お口は悪いようですが、親切なんですね。
教えていただいたところを見てみます。
ありがとうございます。

47 名前:デフォルトの名無しさん :04/06/04 16:34
>>45
int basic_istream::gcount( );


48 名前:デフォルトの名無しさん :04/06/04 16:52
>>40
C++ の場合、basic_filebuf がソレ

49 名前:デフォルトの名無しさん :04/06/04 21:36
>>45
fstreamなんて糞だから間違っても使うな。
fopen系で処理しとけば問題ない。

50 名前:デフォルトの名無しさん :04/06/05 00:38
std::stringの後ろ1文字削るのにresizeとeraseどっちがいいと思う?

51 名前:デフォルトの名無しさん :04/06/05 03:00
どちらも使わずそのまま使う。

52 名前:デフォルトの名無しさん :04/06/05 08:02
例外について教えてください。とある関数が

void f() throw(std::bad_exception)
{
...
 throw int();
}

とあったとすると、int型は関数の例外指定に無いので、throwすると
代わりにbad_exceptionが投げられると本にあったのですが、これだと
throw int()の時点で強制終了されてしまいます。
throw std::bad_exception() とすると、外側の関数でbad_exceptionが
キャッチできるのですが・・・。ちなみにVC.NETです。
なぜ終了してしまうのでしょうか?


53 名前:デフォルトの名無しさん :04/06/05 08:11
>>52
ISOでもJISでもいいが規格票の 15.4 の 8 を読んでみれ

54 名前:デフォルトの名無しさん :04/06/05 08:31
横槍でスマンがもまいらひとつ教えてくれ。
規格表、規格表ってよく出てくるけど、あんなもの
カネ出して本当に買ってるのか?
コンパイラ作るワケじゃないし、禿の本で十分
だと思って漏れは買ってないのだが、何かお得
な情報が詰まってるのか??

55 名前:52 :04/06/05 08:40
>>53
うぅ・・・もってません

56 名前:デフォルトの名無しさん :04/06/05 10:40
>>55
スレタイの少し下にリンクが貼ってあるよ。
ttp://www.kuzbass.ru/docs/isocpp/except.html#except.spec

57 名前:デフォルトの名無しさん :04/06/05 10:47
>>52
>とあったとすると、int型は関数の例外指定に無いので、throwすると
>代わりにbad_exceptionが投げられると本にあったのですが、

どんな本だ?(((( ;゜Д゜)))ガクガクブルブル

58 名前:デフォルトの名無しさん :04/06/05 11:07
>>57
こういう事だろう。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;
 }
}

59 名前:デフォルトの名無しさん :04/06/05 11:19
>>50
pop_backみたいな、ぴったり合う操作が無いな。push_backはあるのに。
resize(size()-1)のほうが効率はよさそう。
erase(end()-1)のほうがソース上に突然現れたときに意味がとりやすそう。

まじめなソースなら、
inline void pop_back(std::string& s){ resize(s.size()-1); }
と定義してしまうのが最善手かと思う。

60 名前:52 :04/06/05 12:07
レスありがとうございます。
私の説明がおかしかったようで、もう少し正確に書くと、本には

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型の例外がキャッチ
できるのかと思ったのですが・・・違いますか?



61 名前:デフォルトの名無しさん :04/06/05 12:21
>>54
俺は買ってるが。プログラミング言語 C++ は言語制作者の手による本だとは
言っても、結局、微妙なところになると載ってないし。

JIS から買うと高いが ANSI から PDF で買えば US$20 しないぞ。

62 名前:デフォルトの名無しさん :04/06/05 13:14
ISO で規格制定した C++ をJIS/ANSIから買えるって?

63 名前:デフォルトの名無しさん :04/06/05 13:23
1000ページの解説本ですら解説しきれない仕様そのものが問題だな。

64 名前:54 :04/06/05 14:30
>>61
レスdクス。
ANSIのページにいったら
http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%3A2003
US$281と出てるんだが...orz


65 名前:デフォルトの名無しさん :04/06/05 14:31
>>60
違う。unexpected()関数はデフォルトでは常にterminate()しか呼び出さない。
set_unexpected()でunexpected()の代わりに呼び出す関数を入れ替えた時のみ、
その入れ替えられた関数がstd::bad_exceptionを投入する。§15.5.2.2

66 名前:デフォルトの名無しさん :04/06/05 14:37
あるクラスAが、別のクラスBのインスタンスへのポインタを
シングルトンで取得する場合、クラスBのコンストラクタ、デストラクタ
は発動するのでしょうか?その場合、発動タイミングはいつですか?


67 名前:デフォルトの名無しさん :04/06/05 14:47
>>64
ISO/IEC 14882:1998なら>>3のpdf



68 名前:64 :04/06/05 14:58
>>67
サンクスコ。2003の最新のですた。
でも1998のpdfは今はもうタダなんでつか?>61さんは
$20って書いてましたが。。。

69 名前:デフォルトの名無しさん :04/06/05 15:00
>>66
それだけじゃだれにもわからない。
自分で使っている「シングルトン」の実装を調べれ。

70 名前:デフォルトの名無しさん :04/06/05 15:35
質問おながいします。
会社の規約でグローバル関数をcallするときは、クラスのメンバと
見分けやすくするために :: を明記するように言われてます。
でc++コード中でよくcの標準関数をつかうのですが、getcharを
::getchar()
と書いたらコンパイルが通りません。(その他の関数は知っている限り
とおります)
なんか問題があるのでしょうか?
VC6でもVS7.1でも同様の結果ですた。

71 名前:デフォルトの名無しさん :04/06/05 15:38
>>70
C++なら<cstdio>をインクルードしてstd::getcharが正解。
でも、VC6では通らないかもしれない。

72 名前:デフォルトの名無しさん :04/06/05 15:42
>>71
レスどうもです。
#include <cstdio> はできないんでつ。というかなぜか
全部のコードがstdio.hなんでつ。(単に古いからだと思うんでつが)
先輩はgetchar()でええやないかって言うんですけど、なんで
::が付けられないのか気になって仕方ないもんで。

73 名前:71 :04/06/05 15:46
>>70
ごめんVCのgetcharはマクロでも定義されてるみたい。

#include <cstdio>
#ifdef getchar
#undef getchar
#endif

これでstd::getcharでいけるようになる。
どっちがいいかは微妙。

規格はこのマクロ定義を許しているんだろうか?

74 名前:71 :04/06/05 16:05
gccのcstdioでstdio.hのマクロは全部#undefされてた。
やっぱ規格としては、std::getcharで使えないとダメなんだろうな。

75 名前:70 :04/06/05 16:42
>>71
調べててレス遅れました。
「VCのgetcharはマクロでも定義されてるみたい」でハッとして
VCのソース見たら
#define getchar() getc(stdin)
とされてて、これはまあいいのですが、次に
#define getc(_stream) (--(_stream)->_cnt >= 0 ? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))
とマクロ展開されてました。
これでは ::getchar() が通るわけないでつ。スッキリしますた(´・∀・`)
どうもありがとう。。。 それにしてもvcってへんな実装でつ。


76 名前:デフォルトの名無しさん :04/06/05 17:04
getcはマクロで実装してもよかったような希ガス。

77 名前:デフォルトの名無しさん :04/06/05 17:39
>>64
個人で使うならこっち買え。利用規定が違うだけで、中身は変わらん(むしろ、
しおり入ってる分だけ使いやすい)

INCITS/ISO/IEC 14882-2003
$18.00
http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FISO%2FIEC+14882%2D2003


78 名前:64 :04/06/05 18:47
>>77
たった今DLしますた。なんかわからんけど
ディスカウントが効いて$13.5ですた。
サンクスコですた(・∀・)!!




79 名前:デフォルトの名無しさん :04/06/05 18:52
runtime_errorクラスの派生クラスでrange_errorっていうのが
標準でありますよね。内部演算の範囲エラーということのようですが
これってどういうことでしょうか?オーバーフローやアンダーフローは
わかるのですが。

80 名前:デフォルトの名無しさん :04/06/05 18:55
vector<int> v(10);
v[15]=5;

bitset<16> bs;
bs[20]=true;

81 名前:デフォルトの名無しさん :04/06/05 19:45
>>54
52のような質問をする必要がなくなるという事例を現に目撃しながら、何が聞きたいんだ?

82 名前:デフォルトの名無しさん :04/06/05 20:12
>>80
それっていわゆるout_of_rangeという例外クラスにあたるんじゃ
ないですかね・・。つまりロジックで回避できるものという。

runtime_errorというのは、プログラムのスコープの外で単純に回避
できないイベントを通知するのだそうです。
派生クラスは
range_error
overflow_error
underflow_error

このrange_errorというのがよくわからないんです。

83 名前:デフォルトの名無しさん :04/06/05 20:16
>>82
overflow, underflow と並んでるってことは、その手の「範囲外」を通知するのに
使うことを想定してるんじゃないの?

有効な値の範囲が連続なら underflow, overflow だけで表現できるけど、
とびとびだったりすると、どっちとも言えんよね。

84 名前:デフォルトの名無しさん :04/06/05 20:37
リファレンスカウントを作りたくて
練習で書いたソースですが、思わぬところで躓き
知り合いの先輩に聞いたら、こんな現象を見つけました
なぜ、そうなるのかわかりません、
理由がわかる方がいましたら、教えてください。
推測でもよいので
・・・

やはりVテーブルの話になるのでしょうか?

http://www.lenis.info/~forget-me/Toukou.txt



85 名前:デフォルトの名無しさん :04/06/05 20:53
>>84
vtblは関係ないよ

いいから、言うとおりの順に紙に図かいてみろ
・Object型のオブジェクト1個(仮にaと名づける)
・aへのポインタ1個(仮にpaと名づける)
・paへのポインタ1個(仮にppaと名づける)
・Test型オブジェクト1個(仮にbと名づけ、aがbの部分オブジェクトになるように)
・bへのポインタ1個(仮にpbと名づける)
・pbへのポインタ1個(仮にppbと名づける)

おまいさんがやろうとしていることは、
reinterpret_cast<Object**>(ppb)だ

86 名前:デフォルトの名無しさん :04/06/05 20:59
>>84
Test **t=0;
Object **o=t;

これが出来ないから

87 名前:84 :04/06/05 21:34
>>85
指摘ありがとうございます。
ネットで調べたら
reinterpret_castは単なる型変更であり、たとえ派生関係があったとしてもポインタのアドレス自体はキャスト前と変わりません。
その意味でreinterpret_castは非常に危険なキャストといえるでしょう。
とありました。正直Castについて、完全に理解してないもので、とりあえずCastの部分が私が間違っていたということでしか、まだ理解できてません
が、返事が遅くなるといけないから、一応レスを書きました。Castについて勉強して、もう一度検討してみたいと思います。
せっかくレスを頂いたのに、まだ理解できなくてすいません。

>>86
なるほど、わたしのしてたことは、それに似たことだったのですね、上で書いたように、もう一度じっくり検討してみます。
どこに着目すればよいかわかりましたので、大変助かりました。ありがとうございます


88 名前:デフォルトの名無しさん :04/06/06 00:14
>>80
vectorは確かoperator[]で範囲外アクセスした場合、未定義だったと思う。
vector<int> v(10);
v[15]=5;
v.at(15);
でatの方は例外を投げたと思うけど。
bitsetの方は覚えてない。


89 名前:デフォルトの名無しさん :04/06/06 00:20
>>88
std::bitsetも[]による範囲外アクセスは未定義のふるまい。

90 名前:デフォルトの名無しさん :04/06/06 00:56
>>89
s/ふるまい/動作/

91 名前:デフォルトの名無しさん :04/06/06 03:19
std::bitsetの要素は1bitですが、要素がN bitのものはありませんか?

92 名前:デフォルトの名無しさん :04/06/06 04:35
>>91
それじゃあビットとは言えないな。

93 名前:デフォルトの名無しさん :04/06/06 10:59
>>91
vector<bitset(ry

94 名前:デフォルトの名無しさん :04/06/06 11:50
Nの大きさに合わせてvectorを使ったりbitsetを使ったりする
ラッパーを作ればよい

95 名前:デフォルトの名無しさん :04/06/06 11:52
ちょっと質問なんですが、
#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は安全ですか?
一応大丈夫みたいなんですが。

96 名前:デフォルトの名無しさん :04/06/06 11:57
>>95
あんま安全じゃない。

97 名前:デフォルトの名無しさん :04/06/06 12:19
>>95
ポインタを返す関数の戻り値に、
その関数のローカル変数のポインタを使うようなもんだ

98 名前:95 :04/06/06 12:33
>>96 >>97
やっぱそうですか。
じゃあ int& を const int& にした場合どうなりますかね?
一時オブジェクトをconstリファレンスで受けると寿命が延びますよね。
その例として型がintなのはよろしくないかもしれませんが。

99 名前:デフォルトの名無しさん :04/06/06 12:43
>>98
延びないってば

100 名前:デフォルトの名無しさん :04/06/06 12:46
>一時オブジェクトをconstリファレンスで受けると寿命が延びますよね。
ソースきぼんぬ

101 名前:95 :04/06/06 12:53
http://www.google.co.jp/search?q=%E4%B8%80%E6%99%82%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88+%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9&ie=UTF-8&hl=ja&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=

というか他の型でデストラクタが呼ばれてるか調べればいいですね。お騒がせしました。

102 名前:95 :04/06/06 13:05
コンストラクタ抜けた時点でデストラクタ呼ばれてるようですorz。
寿命が延びるといったのは受けた変数と同じ寿命になるという意味です。
直接受けた変数と同じになるだけみたいですね。考えてみれば当りまえかもしれませんが。

103 名前:デフォルトの名無しさん :04/06/06 13:25
>>95
コードブロックの最後にデストラクトするのは、実装依存ではなくて
仕様。それにコンパイラは、ブロック外でアクセスされるのを
検知して、寿命を延ばすことはしない。(警告を出すことはありうる
だろうけど)
ARMに書かれているのは、テンポラリがconst参照されている場合
、その参照の寿命にしたがうということで、ここではcはテンポラリ
じゃないからね。

104 名前:95 :04/06/06 13:31
>>103
というか cのとこがテンポラリだったとしても直接受けるのはコンストラクタの引数なので
コンストラクタ抜けた時点でデストラクタ呼ばれるんですよね。

105 名前:デフォルトの名無しさん :04/06/06 13:35
>コンストラクタ抜けた時点でデストラクタ呼ばれるんですよね。
{
int c = 1;
p = new A(c);
std::cout << p->test << std::endl;
} ← ここで呼ばれるんじゃね?


106 名前:95 :04/06/06 13:41
>>105
cのとこが一時オブジェクトだった場合、Aのコンストラクタが終了した時点で一時オブジェクトのデストラクタが呼ばれます。

107 名前:デフォルトの名無しさん :04/06/06 14:11
>>106
p = new A(C());

こんな事やってんじゃね?

108 名前:95 :04/06/06 14:14
>>107
そんな事やってますがそれがなにか?

109 名前:107 :04/06/06 14:16
>>108
ごめそ。>>106じゃなくて>>105ね。

110 名前:デフォルトの名無しさん :04/06/06 15:23
>>95 == 104
>というか cのとこがテンポラリだったとしても直接受けるのはコンストラクタの引数なので
>コンストラクタ抜けた時点でデストラクタ呼ばれるんですよね。

レス遅れてすまそ。そうだった。漏れも勘違いしてた。
そのテンポラリで初期化されたのなら、参照変数に束縛(?)されるだろうけど、
変数として渡されたのなら束縛できないね。(コンパイル時に値(テンポラリ)が
確定しないから、C++が寿命管理できない)
で、誰にも束縛されてないから、すぐに(この例だとコンストラクタ抜けたあと)
削除されちゃうね。束縛されてれば最大テンポラリの作成されたスコープいっぱい
生きられるみたいだけど。

111 名前:95 :04/06/06 15:43
>>110
A(int& a):test(a){}; を
A(int& a):test(int(a)){};
みたくしたらテンポラリで初期化するから生き続けるかなあと思ったけど
(もちろんこんなことするくらいなら値渡しすればいいんだけど)
コンストラクタ抜けたらやっぱり死にました。そういうもんなんですかね。
ところで参照のメンバを使う時ってどんなときですか?

112 名前:105 :04/06/06 15:54
>>106-109
了解ッス

113 名前:デフォルトの名無しさん :04/06/06 16:04
>>111
> ところで参照のメンバを使う時ってどんなときですか?
生成順序、破棄順序に明確な親子関係がある時かな。
被参照クラスは参照するクラスのコンストラクタで渡さなきゃいけないし、
参照するクラスのデストラクタが呼ばれる前に非参照クラスが破棄されると
普通は困るから。

114 名前:デフォルトの名無しさん :04/06/06 17:41
ところでみなさん、C++ のソースファイルの拡張子は、何にしてますか?
.C
.cpp
.cc


115 名前:デフォルトの名無しさん :04/06/06 17:47
cxx

116 名前:デフォルトの名無しさん :04/06/06 17:48
.cpp

117 名前:デフォルトの名無しさん :04/06/06 17:49
VC++だと拡張子つけないと勝手にcppだからcpp。
つか、クラスの新規作成で勝手にファイル生成させてるが。
Linux上でgccに食わせるのはなんとなくccだったりする。

118 名前:デフォルトの名無しさん :04/06/06 17:52
zshでは、cpp は、C++ の拡張子としては、扱われてなかった。


119 名前:デフォルトの名無しさん :04/06/06 18:21
え、設定変更できないの?

120 名前:デフォルトの名無しさん :04/06/06 18:37
zstyle を使えば、変更できます。

121 名前:デフォルトの名無しさん :04/06/06 19:57
ちょいと本読んでたら気になる表現があったのですが
デフォルトコンストラクタを明示的に呼び出す・・・
というのは、どういうことでしょうか?明示的じゃない
呼び出しっていうのもあるんですか?
たとえば
class A{
 ...
};

A c;
とか
A c();
とかって違うのでしょうか?

122 名前:デフォルトの名無しさん :04/06/06 20:05
int i;

int i();
は違う。

123 名前:デフォルトの名無しさん :04/06/06 20:10
>>121
もしかして「デストラクタの明示的な呼び出し」の間違いか?

全然関係ないが
A c; はオブジェクトの定義
A c(); は関数の宣言

124 名前:デフォルトの名無しさん :04/06/06 20:18
たぶん、explicit の話だろう。

125 名前:デフォルトの名無しさん :04/06/06 20:25
>>114
.EXTENSIONOFC++SOURCEFILE

126 名前:121 :04/06/06 20:31
あ、
引数なしのコンストラクタ呼び出しって
A c();
という具合じゃだめなんですか・・・関数宣言になるんですね。
じゃあ
A c;
または
A c = A();
でデフォルトコンストラクタ呼び出しってことですかね。
いずれにせよ明示的って意味がわかりませんね・・・。

127 名前:デフォルトの名無しさん :04/06/06 20:36
読み間違いの予感

128 名前:デフォルトの名無しさん :04/06/06 20:37
だから、「explicit+コンストラクタ」でぐぐってこい

129 名前:デフォルトの名無しさん :04/06/06 20:50
>>128
デフォルトコンストラクタにexplicitもクソもあるか。

明示かどうかで挙動が変わるのは組み込み型のデフォルトコンストラクタ。

130 名前:121 :04/06/06 22:46
その明示的と明示的じゃないというのは、表現方法はどう違うのでしょうか?

131 名前:デフォルトの名無しさん :04/06/06 22:59
>>130
例えば、デストラクタなら
{
hage stroustrup;
} // 暗黙の呼び出し

this->stroustrup::~stsoustrup(); //明示的な呼び出し

132 名前:デフォルトの名無しさん :04/06/06 23:08
const hage& hage::operator = (const hage& BullShit)
{
this->hage::~hage();
this->hage::hage(BullShit);
return *this;
}

133 名前:131 :04/06/06 23:10
s/stsoustrup/stroustrup/
s/stroustrup/hage/
吊ってきます

134 名前:デフォルトの名無しさん :04/06/06 23:14
>>130
暗黙の型変換あたりでググれ。

135 名前:デフォルトの名無しさん :04/06/07 01:55
A.h (class Aを定義)
A.cpp (実装を定義)

とやって、A.cppで、static A gA;
などとグローバルインスタンスとして A を定義し、それをsingletonとして
ポインタを返すメンバ関数をAに用意しておきます。
main.cppの方でそれを呼んで class Aのsingletonを使ってメンバ関数
をコールするというような使い方をする場合、
class Aのコンストラクタ、デストラクタはいつ呼ばれるのでしょうか?
多分、static A gA; がメモリー上に実際に生成される時だと思うんですが
それっていつなんでしょうか?

136 名前:デフォルトの名無しさん :04/06/07 02:05
>>132のコードに感動した

137 名前:135 :04/06/07 02:28
>>135
色々自分でいじくってたら自己解決しました。
すんまそん。

138 名前:デフォルトの名無しさん :04/06/07 08:36
>>133
吊るより
9階からああ飛び降りろ。
間違っても芝生のないところでやれ。
できるなら30階以上のところでやれ。
確実に死ねる

139 名前:デフォルトの名無しさん :04/06/07 08:40
>>136
本気で言ってるのか?

140 名前:デフォルトの名無しさん :04/06/07 10:03
>>138
正しい吊りかたすれば確実に死ねるぞ

141 名前:デフォルトの名無しさん :04/06/07 11:45
C++ では類の実体を函数の返値にできるよね?

142 名前:デフォルトの名無しさん :04/06/07 12:41
C++には自信があったのですが、141の日本語が理解できない漏れは、9Fからフェンスめがけて飛び降りるべきでしょうか。

143 名前:デフォルトの名無しさん :04/06/07 12:49
「クラスのインスタンスを関数の返値にできるか?」
ってことか。それならイエスだが。
しかし、なんでわざわざ回りくどい聞き方するかね。

144 名前:デフォルトの名無しさん :04/06/07 13:05
>>142
>>143

カタガナ語が嫌いだからさ

145 名前:デフォルトの名無しさん :04/06/07 13:14
カタガナ語???

146 名前:デフォルトの名無しさん :04/06/07 15:57
>>144
そんなにオナニー好きなのに
よりよいオナり方を人に訊くのか…

147 名前:デフォルトの名無しさん :04/06/07 16:04
入門書買え、読め、と叩かれそうなぐらい初歩の初歩の質問を、
さも高度な質問のフリをするためには効果があるわけだな。
しかし、141がDQNであることは、はっきりした。

148 名前:デフォルトの名無しさん :04/06/07 16:23
必死な低学歴が大量なスレですね

149 名前:デフォルトの名無しさん :04/06/07 17:51
>>142
カッターで頚動脈切ってもらった上で15Fぐらいからダイブしたほうがいいぞ。

150 名前:デフォルトの名無しさん :04/06/07 18:08
今は9Fからダイブするのがナウイ

151 名前:デフォルトの名無しさん :04/06/07 18:55
今死ぬなら60F。

152 名前:デフォルトの名無しさん :04/06/08 18:38
C++はCに比べて遅いというのは良く聞く話ですが、具体的にどれくらいですか?
なんとなく↓くらいかと思う

C>>C++>>>>>>>>>>>>>>>>Java


153 名前:デフォルトの名無しさん :04/06/08 18:51
具体的に聞きたいならどういったコードの実行性能かを具体的に書け

154 名前:152 :04/06/08 18:56
>>153
科学計算用途です。行列演算とか、フーリエ変換とかが入った計算。

155 名前:デフォルトの名無しさん :04/06/08 19:22
C++の既存の科学計算ライブラリ >>>>>>>>>>>>> 152の書いたCの科学計算コード

156 名前:デフォルトの名無しさん :04/06/08 19:29
>>155
ライブラリ呼び出しだけで書けると思ってるの?ヴァカ?

157 名前:デフォルトの名無しさん :04/06/08 19:44
>>152
処理系もライブラリもコードも示さないで比較もくそもないと思う。
そして処理系もライブラリもコードも示せるなら自分で計測すれ。

158 名前:デフォルトの名無しさん :04/06/08 19:48
純粋な数値計算でC/C++の差が出ることってある?
標準ライブラリやメソッドコールの差はあるにしても。

159 名前:デフォルトの名無しさん :04/06/08 19:53
>>158
数値計算はライブラリの質が大きいが、シミュレーションとか、
もっと一般的に言って物理エンジンなんかはどうなのさ?

160 名前:デフォルトの名無しさん :04/06/08 20:18
>>152
全く聞かないけど?
実際は、C≒C++>>>>Java ぐらいじゃないか?

CとC++とJavaで同じ処理を試すということは、
クラスライブラリなどを一切使わないってことだよね?

161 名前:デフォルトの名無しさん :04/06/08 22:19
> C≒C++>>>>Java
で、良いんじゃないかな?

162 名前:デフォルトの名無しさん :04/06/08 22:35
>>158
あるよ。
expression template などを使わず。単純に見易さとか書きやすさだけを求めると
遅くなるよ。もっともC++ではそういう書き方もできるという意味で、C流に書けば
いいだけなんだけどね。

#expression templateも+,-,*などの単純計算ならなんとかなっても逆行列なんかには
#無力だけど。


163 名前:デフォルトの名無しさん :04/06/08 22:43
継承レベルを出来るだけ浅くして、オブジェクトの生成も出来るだけしないようにすれば遅くならないよね。
って、Cで書けってことか?(w

164 名前:デフォルトの名無しさん :04/06/08 22:53
>>162
具体例を希望

165 名前:デフォルトの名無しさん :04/06/08 22:57
>>164
162 じゃないけどMATRIX operator+(MATRIX const&, MATRIX const&) とか。
何も考えずに書くと、戻り値で値のコピーが発生して遅くなりがち。


166 名前:デフォルトの名無しさん :04/06/08 22:58
>>163
君にはきっと C のほうが向いていると思う。

167 名前:デフォルトの名無しさん :04/06/08 23:27
結局書き方の問題であって、生成されるオブジェクトの
最高実行速度という意味では厳密に C++ == C ってことでは?
それに加えて、C++より広範囲の抽象化をサポートしていわけで。
(仮想関数ならそれなりの実行時コストをはらって、また、templateなら
実行時コスト無しで)



168 名前:デフォルトの名無しさん :04/06/08 23:28
>>165
その計算はCだろうが戻り値のコピーは避けられないと思うが?
戻り値最適化を前提にしちゃいかんのはわかるが
Cで書けば同等の役割を持った上で高速に動作するコードを示してほしい

つーか expression template の話してるところで
「何も考えずに書くと」のケースの話されても一体何と何を比べてるんだって感じなんだけど

169 名前:デフォルトの名無しさん :04/06/08 23:29
>>164
一番速度差が出やすいと言われるのはこんな場合。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だと見にくい書き方しかできないけど。

あと、式テンプレートは結果の作業域は用意しなくてもいいんだが、
結局計算式そのものをどっかに格納しとかなきゃいけなかったりする。

170 名前:デフォルトの名無しさん :04/06/08 23:32
(XXX *)
だった、しばらく書いてなかったもんでスマソ

171 名前:デフォルトの名無しさん :04/06/08 23:41
C++は速度を犠牲にして保守性を向上させているというのは都市伝説の類ですか?

172 名前:デフォルトの名無しさん :04/06/08 23:42
>>169
言いたいことは分かるんだけれども
その例はC++でも
結果を格納するためのオブジェクトと op= の形式の演算子使うだけで
C流の関数なんて使わなくともそこそこ可読性を保ったままパフォーマンスを同等にまで上げられる。
しかもこれ、割とよく知られている最適化テクニックなんであまり適切な例ではないような。

173 名前:デフォルトの名無しさん :04/06/08 23:48
速度求めるならSSE2命令使ってコーディングしてるatlas + fortranが速い。
SSE2命令有効にしてコンパイルしてもこれほど速くならないと思う。
C/C++からコールするにしても行/列アクセス順序入れ替えるのは面倒だし、
オーバーヘッドは必ず発生するしね。

174 名前:デフォルトの名無しさん :04/06/08 23:54
>>173
Intel系ならそうですね。WSやマックは切り捨てですか?
atlasが速いのは、出来るだけキャッシュに入るように工夫してるのが大きいと思うのですが…。
InterlのMKLなんかはP4のパイプラインの分岐予測を乱さないように最適化されているみたいですし。
そこまで行ったら、言語の問題じゃないような気がする。

175 名前:デフォルトの名無しさん :04/06/08 23:55
ちと気になったので質問します。
ファイル名を格納するchar配列があります。
この配列は幾つファイルが有るかわからないので動的に増やせるようにしたいです。
そこで今は以下のようにしています。

int n = 10;
struct FILENAME{ char lpsz[MAX_PATH]; };
FILENAME* files = new FILENAME[n];

が、これってわざわざ構造体なんか定義しなくても出来るようにならないでしょうか。
無理とは解ってますが以下とかじゃ駄目ですし。
char* files[MAX_PATH];
files = new char*[n];


176 名前:デフォルトの名無しさん :04/06/08 23:56
fortranの場合並列処理に分割し易いとかそういった理由で科学計算の
分野ではC/C++より早いって話しだよね?
逆にfortranってC/C++みたいな自由度はないのでは?

ただ、CとC++の高速度ソフトウエアの記述能力といった意味では全く
同一だと思う。

177 名前:デフォルトの名無しさん :04/06/09 00:03
>>175
std::stringとかstd::vector<char>とか使え。C++なんだし。

178 名前:デフォルトの名無しさん :04/06/09 00:04
>>175
char** filenames = (char**)malloc(sizeof(char*)*n);
じゃだめなのかね。

179 名前:デフォルトの名無しさん :04/06/09 00:06
>>175
つ[std::vector<std::string>]

180 名前:178 :04/06/09 00:07
しまった、C++スレでした。鬱山車脳。

181 名前:デフォルトの名無しさん :04/06/09 00:08
というか構造体を定義することと動的配列の実装に何ら関連性がないのだが。
型名をどう記述してよいかわからないだけなら typedef で十分だし。
実際は「動的配列どうやって作れるの?」ってだけの話なのか?

182 名前:デフォルトの名無しさん :04/06/09 00:21
char (*files)[MAX_PATH];
files = new char[n][MAX_PATH];


183 名前:デフォルトの名無しさん :04/06/09 00:33
>結果を格納するためのオブジェクトと op= の形式の演算子使うだけで
>C流の関数なんて使わなくともそこそこ可読性を保ったままパフォーマンスを同等にまで上げられる。
>しかもこれ、割とよく知られている最適化テクニックなんであまり適切な例ではないような。
そりゃ、技を駆使すればC++も速くなるよ。
でも、多大なる努力を駆使して得られる処理速度は、誰でもすぐに書けるCの処理速度に
どれだけ漸近させられるかってだけ。
その努力が数値計算ユーザにどれだけ支持されるかってこと。

184 名前:デフォルトの名無しさん :04/06/09 00:36
> 誰でもすぐに書ける

うーん、ダウト

185 名前:デフォルトの名無しさん :04/06/09 00:39
>>183
何言ってんのかわかんない。
void add(MATRIX&, const MATRIX&, const MATRIX&);
みたいなC式のスタイルはC++でもできる。
C++式のスタイルは使いかたによってはパフォーマンスが悪い、それだけだろ。

186 名前:デフォルトの名無しさん :04/06/09 00:40
>>174
>Intel系ならそうですね。WSやマックは切り捨てですか?
Pen4 に atlas 使って遅い用途ならWSも糞マックも役にたたんだろうからどうぞ捨ててくれ。

187 名前:デフォルトの名無しさん :04/06/09 00:42
故意にC++を難しくみせようとしているヤツがいるな。
op= と op じゃ実装も記述の手間もろくすっぽ変わらん。
問題なのは可読性が下がることだけ。

>>169が言ってるのは、
a = sub(add(mul(b,c), d), e);
より mul_assign(b,c, tmp); ...(以下略) とする方が早いという以上の何者でもない。
それをC++の演算子オーバーロードに置き換えれば op と op= の違いになる、というだけ。

188 名前:デフォルトの名無しさん :04/06/09 00:51
可読性と保守性と速度を全て満たした言語は無いのか?

189 名前:デフォルトの名無しさん :04/06/09 00:58
>op= の形式の演算子使うだけで
ふーん。Matrix計算の場合+=.-=は確かに使えるね。
*=が使えると思ってる時点でオバカさんだな。
どうやったら使えるか解説してくれないか?

190 名前:189 :04/06/09 01:02
おおっと、定数には使えるよ
A *= 3.0;
とか
A /= 5.0;
とかね。

191 名前:189 :04/06/09 01:11
浅はかな>>172, >>187は、
A *= Bの計算を作業域使わずダイレクトにできると思ってるんだろうね。
おめでたいこった。


192 名前:デフォルトの名無しさん :04/06/09 01:16
>>190
話のポイントのつかめんやつだな。
CとC++でどこが違うかって言ってるんだ。
>>166でも一時オブジェクトは確保してるだろ。
どこで一時オブジェクトがいらないなんて話になったんだ?
#さらに言うと *= の場合、
 中途で確保する一時領域は行単位で済むから * よりも
 オーバーヘッドは小さくできるぞ。

193 名前:デフォルトの名無しさん :04/06/09 01:19
>>191
Cでは作業域使わずダイレクトにできるのか?
出来ないよな。なら特に今回の話に関係無いよな。

で?

194 名前:デフォルトの名無しさん :04/06/09 01:27
>>192 >>193
作業領域を中で確保して値渡しで返す(もしくはswapする)のと、
外から作業用兼結果用の領域をもらうのとは結構違うと思うよ。

195 名前:デフォルトの名無しさん :04/06/09 01:29
>>192
おつむの悪い僕ちゃんだな。
いいかい。
op= を遣う理由で一時作業領域を省略できる以外になにかあるのかい?
Matrixの*=の場合はそうならないから指摘してるんだよ。

##さらに言うと *= の場合、
# 中途で確保する一時領域は行単位で済むから * よりも
# オーバーヘッドは小さくできるぞ。
ハイハイ。がんばれよ。頭だけじゃなく往生際も悪いようだ。

196 名前:デフォルトの名無しさん :04/06/09 01:32
void mul(Matrix *ret,const Matrix *a,const Matrix *b);
Cで書くとこういう関数になると思うが
この時、retとaのポインタが指す領域が別々とは限らないため、

Matrix &operator *=(const Matrix &a);
と関数内部は同一になると思うが、そういうことを言ってるのではないの?

197 名前:デフォルトの名無しさん :04/06/09 01:38
>>195
いいでしょう。
*= については、a *= b ではさらに新たな一時オブジェクトを作る tmp2 = a * b; に対して改善が見込めないという部分は認めよう。
でも、Cでこの書き方より速くできるかという部分については納得する意見をもらってないよね。

198 名前:デフォルトの名無しさん :04/06/09 01:41
>>196
だーかーらー ret,a,bが全部違った時は作業領域いらないでしょ。
その恩恵はC++のoperatorじゃあずかれないでしょ。

>>197
さっきからでてる三項の関数使えばいいじゃん。

C++だからってoperatorにこだわることないんだよ。
実際に数値計算のライブラリも三項引数の関数用意してるよ。

199 名前:196 :04/06/09 01:43
>>198
いや、全部違うかどうかは関数内部でわからないでしょ?
まさかポインタが違うかどうかifでチェックするの?なわけないよね?

200 名前:198 :04/06/09 01:45
え? ifでチェックすればいいじゃん。
っていうかこの問題、式テンプレート使うとなるとまた変わってくるのかも。

201 名前:デフォルトの名無しさん :04/06/09 01:49
速度云々とかいいながら条件分岐なんか使う気なのか。

202 名前:デフォルトの名無しさん :04/06/09 01:49
通りすがりの横レスだけど
確かにC++使ってるとoperatorとかtemplate使いたくなるよね。
そんな事やってる間にチューンを忘れるとか疎かになりがち。
そう言いつつET使ってキャッシュも意識して頑張るんだけど。

>>199
restrictって言おうとしたけどCだな。それに保証も出来んか。

203 名前:196 :04/06/09 01:50
ifチェックすんのかよ!
パフォーマンスがどうたら言うてる割に現在のCPUでペナルティ大きいifチェックかぁ。

まぁ想定してるmatrixが俺と違うのかもね。
内部で動的にメモリ確保したりするようなヤツならifチェックくらい別にかまわないか。

204 名前:デフォルトの名無しさん :04/06/09 01:52
>>197
結局、出力パラメータに対して
operator の戻り値コピーの部分(最適化してくれないとして)がネックになるって話なのね。

>>200
expression template はないって前提でしょ。
一応、それならパフォーマンスをある程度保ったまま
はるかに直感的に式書けるんだからまあ文句は出ないと思う。
もちろん式格納領域はいるけど今問題の一時オブジェクトのオーバーヘッドはなくなるわけだし

205 名前:デフォルトの名無しさん :04/06/09 01:55
式テンプレート使ってメリットあるのははせいぜい乗算ぐらいまででしょ。
blitzもublasも逆行列なんかを使うのが悪いと言うようなスタンスだし。
実際、逆行列に使ったところで逆に覚えとかなきゃいけない要素が多くなると思う。


206 名前:198 :04/06/09 01:55
>>201 >>203
バカかおまえらは?
気になるならチェックしないバージョンつくって使いわければいいだろ。
operatorにこだわるならそういうことすらできないんだよ。

207 名前:196 :04/06/09 02:02
>>206
お前にバカっていわれたくないなぁ。
つか、お前のレスは人格攻撃、見下しばかりでつまらん。
そんなヤツとは議論しても実りがない。お前パスな。
どうぞ、勝利宣言でもなんでもしてくださいな。

>>204
式テンプレート一時期凝った時があるが
4x4のMatrix値返しした時のほうが早くなって愕然とした記憶がある。
あまりに凝ると最適化が効かなくなるんかいな??もしくは単にミスってたかな。

208 名前:デフォルトの名無しさん :04/06/09 02:06
>>205
そこはそれでかまわないと思うんだけど、、、
まあ俺が実際に使うのは乗算と加算ばっかりだから要望ないだけかも。
数値計算屋さん(なの?)としてはどういう風にしてほしいものなのかな

209 名前:デフォルトの名無しさん :04/06/09 02:09
>>196
ちょっとまってチェックするっていっても関数の頭でポインタのチェックするだけだろ?
ループ内部で条件判断するわけじゃないの無視できるでしょ?
ふつう行列演算C++でかくなら演算できるかどうかの行、列数のチェックはするだろうし。
一般にoperator=でもソースとデスティネーションの同一性のチェックはふつーするでしょ?

#行き着く先のET使っても、保守性が向上するとは言いがたいと思うのだが。
#blitz 見やすいか?使いやすいか?

210 名前:198 :04/06/09 02:09
>>207
あ、ごめん。ちなみに俺は194=198=200=206で189とは違うから。
勝利宣言はしますけど。

まともな行列ライブラリなら行列の乗算は式テンプレート使うんだろうね。
LiDIAってライブラリには3引数の関数あったけど。

211 名前:デフォルトの名無しさん :04/06/09 02:38
こうしてみると、人は説得力のあることを言えないときに
その代替として人を馬鹿にするんだってのがよくわかるね。

212 名前:198 :04/06/09 02:50
あ、185も僕でした。
>>211
つまんない揚げ足とられたから腹立っただけだよ。

213 名前:デフォルトの名無しさん :04/06/09 03:01
いや、罵倒と質問ばっかで、肝心の自論については
雰囲気しか示していない>>189=>>195が主な対象。

214 名前:デフォルトの名無しさん :04/06/09 03:08
最後に、>>204
> operator の戻り値コピーの部分(最適化してくれないとして)がネックになるって話なのね。
最適化なんてしようがないと思う。

215 名前:207 :04/06/09 03:43
ホント、カッターで刺した小学生の気持ちがよくわかる。
刺した上で9Fから突き落としたくなったよ。

216 名前:デフォルトの名無しさん :04/06/09 03:47
>>215
通報しますた。

217 名前:デフォルトの名無しさん :04/06/09 04:03
>>210
3引数の関数とは例えば
A * B * C
を計算するような関数かな?
でもこれを計算する場合でもtmp領域は必要だよ。
数学上、2項演算しか定義されてないから(それで十分だから)
2項の計算結果をどっかに保存しないと次項の演算に移れない。
ただし、3項以上の演算を定義することでtmp領域の確保回数を
減ずることはできる。
実際、newmatなんかは行列計算の開始宣言、終了宣言して2項毎の
tmp確保を避けてたと思う(随分前に使ってたので記憶が定かでない)。

218 名前:175 :04/06/09 08:01
>>181
そんなとこです。

>>182
なるほど、()で括ってやれば良かったんですね。
どもでした。

219 名前:デフォルトの名無しさん :04/06/09 10:21
>>218
>>177>>179は無視か?

220 名前:デフォルトの名無しさん :04/06/09 11:46
結局 C だとどんな魔法を使って C++ より高速に算術演算を行えるのか、誰か分かった?
キャッシュラインのサイズに応じたベクトル計算の自動分割とかしてくれるのかな・・・

221 名前:デフォルトの名無しさん :04/06/09 12:05
OOP機能を駆使すると遅くなるので、Cの機能しか使いません。

222 名前:デフォルトの名無しさん :04/06/09 12:10
>>221
こんな感じ?
struct Matrix matrix_mul(struct Matrix a, struct Matrix b) { ... }


223 名前:デフォルトの名無しさん :04/06/09 12:46
C++はinline使いまくれるからCより速い

224 名前:デフォルトの名無しさん :04/06/09 12:55
>>223
ttp://seclan.dll.jp/c99d/c99d07.htm#dt19990802

一応Cでもinline使えないわけじゃないが。

225 名前:デフォルトの名無しさん :04/06/09 12:57
>>223
inline にすれば100%早くなるってもんでもない。
無駄にプログラムサイズが大きくなると、キャッシュミスが多くなるし。

inline があれば、高速化のために手動で関数を展開しちゃうという
愚行に走らなくて済むのは確かだけど。

あと、C言語でもコンパイラによっては inline 展開するようになってるし。

226 名前:デフォルトの名無しさん :04/06/09 15:01
>>222
ポインタ使え。

227 名前:デフォルトの名無しさん :04/06/09 15:14
do{
  cout << "終了しますか? Yes = y, No = n" << endl;
}while(cin.get() != 'y');

このコードを実行して、「n」を入力すると
「終了しますか? Yes = y, No = n」の部分が二回表示されてしまいます。。
キチンと表示させるには、どうしたら良いのでしょうか?

228 名前:デフォルトの名無しさん :04/06/09 15:22
> キチンと表示
????


229 名前:デフォルトの名無しさん :04/06/09 15:23
  cout << "終了しますか? Yes = y, No = n" << endl;
do{
}while(cin.get() != 'y');

230 名前:デフォルトの名無しさん :04/06/09 15:32
do {
cout << "終了しますか? Yes = y, No = n" << endl;
} while (cin.get() != 'y' && cin.get() != '\n');


231 名前:230 :04/06/09 15:33
ごめん わすれて


232 名前:230 :04/06/09 15:35
これでどうだ?
do {
cout << "終了しますか? Yes = y, No = n " << endl;
} while (cin.get() != 'y' && cin.get() == '\n');


233 名前:227 :04/06/09 15:39
>>230
ああ、要するにコレ、バッファに「\n」が溜まってたって事なんですね…
なるほど、良く分かりました。

234 名前:デフォルトの名無しさん :04/06/09 17:52
>226
>222は皮肉じゃないの?

235 名前:デフォルトの名無しさん :04/06/09 18:07
きっとこうなってるんだよ。
struct Matrix {
    struct Matrix_t *m;
};


236 名前:デフォルトの名無しさん :04/06/09 18:18
すいません.蒸し返すようで悪いですが少しだけ.

>>169
>結局計算式そのものをどっかに格納しとかなきゃいけなかったりする。
そのような式オブジェクトは理想的な最適化の結果
コードから排除されるだろうというのがET支持者の一応の主張ではあるんですが・・・.

>>172
三項以上の演算,例えば行列におけるa + b + cなどにおいては
op=の形式では抽象化によるペナルティを喰らう可能性は残ると思います.


237 名前:デフォルトの名無しさん :04/06/09 18:20
>>195
以下のようなコード(中途半端な擬似コードで申し訳ない)だと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;
}


238 名前:デフォルトの名無しさん :04/06/09 18:22
>>200
式テンプレートでは左辺と右辺の依存関係の問題は
代入メソッドの選択に一任される形になるかと思います.
通常の代入operator=では一時オブジェクトに結果を保存してから代入(swap)する形を取り,
ユーザが代入による依存関係の問題が発生しないことを保証できる場合のために
式オブジェクトから直接代入するための関数を別途用意する,とか.

>>205
通常,線形代数の数値計算では逆行列を陽に求めるのは最終手段(通常はご法度)なので
blitzやublasのスタンスは適切だと思います.


239 名前:175 :04/06/09 20:03
>>219
そんなとこです、が>>177>>179に対する答えでもあったのですが。
分からなかった様ならスミマセン。

240 名前:デフォルトの名無しさん :04/06/09 20:24
>>239
「俺は俺のやり方がなぜうまくいかなかったかが知りてーんだ。
そんな安易な解決策はとっくに思いついてんだよゴミクズどもが!」
ってちゃんと言わないと駄目だよ。

241 名前:デフォルトの名無しさん :04/06/09 20:52
>>237
rhsが正方行列じゃなかったら困らない?
あと、rhsってなんの略?

242 名前:デフォルトの名無しさん :04/06/09 20:55
>>241
なんで正方行列である必要があると思うの?
rhs = right hand side

243 名前:デフォルトの名無しさん :04/06/09 20:58
>>242
列数が変っちゃうから。
なるほど。right(left) hand valueしか知らなかった。

244 名前:デフォルトの名無しさん :04/06/09 21:40
返事がないな。

245 名前:237 :04/06/09 22:10
>>243
237のままだと正方行列である必要があります.
なので,237のコード中のassertで一応そのことを表明しているつもりです.

246 名前:デフォルトの名無しさん :04/06/09 22:19
>>245
ほんとだ。よく見てなかった。でもそうじゃない場合は困るよね。
Matrixの乗算っていうのはたまたま出た例で、op=で一時オブジェクトが必要なときは
C式のスタイルよりパフォーマンスが悪くなるっていうのがもともとの議論。

247 名前:デフォルトの名無しさん :04/06/09 22:43
大きな行列の場合にはデータ本体はシェアしておいて
copy on write とか使うようにするのはどうかな・・・
オーバーヘッドもたいしたことないと思うんだけど。

248 名前:デフォルトの名無しさん :04/06/09 22:50
>通常,線形代数の数値計算では逆行列を陽に求めるのは最終手段(通常はご法度)なので
>blitzやublasのスタンスは適切だと思います.

逆行列のETなんかはやろうとしてもできない。もしくはパフォーマンスの向上、
リソースの節約に寄与しないからこそ提供できない。
できないってのとやらないのは違う。
技術的にET実装は非常に難しいことをはっきり言うべき。難しいので提供できませんでしたと。
それを数値演算で逆行列を使うのはおかしいなどというのはイソップの狐と同じ。

249 名前:デフォルトの名無しさん :04/06/09 23:07
逆行列の計算はもとのマトリックスを破壊してもいいなら、
作業領域はほとんどいらないし、逆行列のひとつの成分を計算するのに
もとの行列のすべての成分が関係するから式テンプレートを使うメリット
はまったくないな。
式テンプレートを使わず逆行列のメソッドを提供すればいいのになんで
blitz++はやらないのかね?
それを使うかどうかはユーザが決めればいいんだがな。

250 名前:デフォルトの名無しさん :04/06/09 23:23
つまりは行列に限らず、巨大なデータを何段階にも扱う計算はC++は苦手と考えてよろしいか?


■過去ログ置き場に戻る■ 1- 次250 最新50
DAT2HTML 0.33f Converted.