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


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

C++相談室 part46
1 名前:v(^・^)v :2006/01/08(日) 12:15:07
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part45
http://pc8.2ch.net/test/read.cgi/tech/1133007604/

2 名前:デフォルトの名無しさん :2006/01/08(日) 12:15:46
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

3 名前:v(^・^)v :2006/01/08(日) 12:16:58
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/

4 名前:v(^・^)v :2006/01/08(日) 12:17:28
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 http://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) http://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) http://pc8.2ch.net/test/read.cgi/tech/1113408957/
41(実質42) http://pc8.2ch.net/test/read.cgi/tech/1120190961/
43 http://pc8.2ch.net/test/read.cgi/tech/1124113879/

5 名前:v(^・^)v :2006/01/08(日) 12:18:02
■基本■
[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://www.open-std.org/jtc1/sc22/wg21

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)

6 名前:v(^・^)v :2006/01/08(日) 12:18:29
■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/
Exceptional C++ Style
 http://www.amazon.com/exec/obidos/ASIN/0201760428/

7 名前:v(^・^)v :2006/01/08(日) 12:19:06
C++ Coding Standards
http://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
http://www.amazon.co.jp/exec/obidos/ASIN/4894716860/(翻訳)

■Books(Templateまわり)■
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/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/

8 名前:v(^・^)v :2006/01/08(日) 12:19:34
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/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

9 名前:v(^・^)v :2006/01/08(日) 12:22:03
■関連スレ■
【初心者歓迎】C/C++室 Ver.24【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1131691023/
【C++】STL(Standard Template Library)相談室 4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
C/C++の宿題を片付けます 56代目
http://pc8.2ch.net/test/read.cgi/tech/1135125328/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc8.2ch.net/test/read.cgi/tech/1014486422/
【.NET】 C++/CLI について語ろうぜ 【最適】
http://pc8.2ch.net/test/read.cgi/tech/1126450441/
ATL/WTL Part4
http://pc8.2ch.net/test/read.cgi/tech/1134388951/

10 名前:v(^・^)v :2006/01/08(日) 12:25:16
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>

後氏ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

テンプレは以上です。足りない所、間違っている所がありましたら、追加訂正よろ。

11 名前:デフォルトの名無しさん :2006/01/08(日) 12:44:58
>>10
1レスで一気にやったら面白みがないだろ。

12 名前:デフォルトの名無しさん :2006/01/08(日) 12:46:24
テンプレに面白みなんて求めるなよ

13 名前:デフォルトの名無しさん :2006/01/08(日) 12:48:00
>>11
スマソ(´・ω・`)
レスを節約しようとしたんだけど。次回から別レスにするね。

14 名前:デフォルトの名無しさん :2006/01/08(日) 12:48:10
何はともあれ乙。

ところでBoostの日本語文書といえばcppllの翻訳を抜かしていいのか?

15 名前:デフォルトの名無しさん :2006/01/08(日) 12:49:34
C++相談室 part44
44 http://pc8.2ch.net/test/read.cgi/tech/1128512737/

これ抜けてた。

16 名前:デフォルトの名無しさん :2006/01/08(日) 12:51:45
>>1乙。

STLport http://stlport.sourceforge.net/

17 名前:デフォルトの名無しさん :2006/01/09(月) 05:04:26
メンバ関数ポインタの代入がコメント化した部分でコンパイルエラーがでてしまいます。

class B{
public:
 void func(void){}
 B(void)
 {
  void (B::*p)(void);
//  p=B::func;//エラー メンバー関数は呼び出すかそのアドレスをとらなければならない
 }
};

class C{
 public:
 C(void){
  void (B::*p)(void);
  p=B::func;
 }
};

int main(void){
 B b;
 C c;
 void (B::*p)(void);
 p=B::func;
 return 0;
}

他のクラスやmain関数では上手くいくのに…納得できません
class Bのコンストラクタ内でBのメンバ関数ポインタの代入はできないのでしょうか

18 名前:デフォルトの名無しさん :2006/01/09(月) 05:13:26
p = &B::func;

19 名前:デフォルトの名無しさん :2006/01/09(月) 05:15:28
>>17
それ、Borlandのコンパイラだろ。多分バグだよ。
gccだとちゃんとエラーが出るぞ。

20 名前:デフォルトの名無しさん :2006/01/09(月) 05:23:59
そうです、BCCです

関数ポインタへの代入を全部p = &B::func;にしたらコンパイル通りました。
ありがとうございます。この書き方が正しいのですね。
…ではロベールさんとこの関数ポインタの書き方は、一体???

21 名前:デフォルトの名無しさん :2006/01/09(月) 05:38:47
>>20
間違ったサイトを見ずに、規格書を読め。

22 名前:デフォルトの名無しさん :2006/01/09(月) 05:46:49
わかりました・・・

23 名前:デフォルトの名無しさん :2006/01/09(月) 17:08:34
そのサイト、「メンバ関数ポインタ」でググると一番上に出てくるな

24 名前:デフォルトの名無しさん :2006/01/09(月) 17:10:04
悪いsage忘れた

25 名前:デフォルトの名無しさん :2006/01/09(月) 17:56:32
間違った知識を流布している時点で、害悪だな。

26 名前:デフォルトの名無しさん :2006/01/10(火) 11:09:16
std::cerr の rdbuf をプログラム開始時に
ファイルストリームに変更して、
出力をファイルに落としています。

ofstream ofs("out.txt");
std::cerr.rdbuf(ofs.rdbuf());

場合によってはエラー出力を抑制したいことがあるのですが、
Windows なので /dev/null に出力するということもできません。
ヌルデバイスを表現するストリームというモノは
標準で用意されてるモノなのでしょうか?

27 名前:デフォルトの名無しさん :2006/01/10(火) 12:00:37
>>26
/dev/nullがあるから、標準では用意されなかったんだろ。
WindowsはNULにでも出すしかないな。

28 名前:デフォルトの名無しさん :2006/01/10(火) 16:10:42
Boost.Iostreams の Null Device とか

29 名前:デフォルトの名無しさん :2006/01/10(火) 19:12:27
ちわっす。
相談です。
VC++でやってるんですけどね
ボタンを押したときはちゃんと別ウインドウに表示されるんです。
しかしエンターキーを押したときに用意した別ウインドウに表示されない。
そうとうこまって降ります。
case WM_KEYDOWN:
switch( wParam )
{
case VK_RETURN:
GetWindowText(hWndEdit2,sBuff,79);
SetWindowText(hWndEdit1,sBuff);

return TRUE;
}
return 0;
       case ....以下続く

30 名前:デフォルトの名無しさん :2006/01/10(火) 19:15:07
スレ違い。sageろ。死ねばいいのに

31 名前:デフォルトの名無しさん :2006/01/10(火) 19:16:19
>>30
なんですれ違いなのか理解不能だが
切々と語ってくれ

sageについては正直すまんかった

32 名前:デフォルトの名無しさん :2006/01/10(火) 19:23:20
言語と環境の区別くらい付けてくれ。

33 名前:デフォルトの名無しさん :2006/01/10(火) 19:48:54
なんか2chは無条件にsageなきゃいけないと思ってる奴が時々いるな。
技術系の板で質問でageるのは普通だろ。

34 名前:デフォルトの名無しさん :2006/01/10(火) 19:51:57
ぶっちゃけPC初心者板でもなきゃageる意味無い。
VBスレが上がっててもVB知らなきゃ答えられんし

35 名前:デフォルトの名無しさん :2006/01/10(火) 20:01:57
知ってる奴に見てもらえりゃいいんだから別にいいだろ。

36 名前:デフォルトの名無しさん :2006/01/10(火) 20:11:36
iostream の std::endl は、改行文字を出力した後に
バッファをフラッシュしてくれるマニピュレータですが、
この改行文字は固定なのでしょうか?

CR/LF/CR+LF を何らかのフラグで切り替える
ということは出来ないでしょうか?

37 名前:デフォルトの名無しさん :2006/01/10(火) 20:14:20
>>33
もうsage強迫観念だよな、精神病の一種だw
なんでそんなになっちゃったんだろう

38 名前:デフォルトの名無しさん :2006/01/10(火) 20:36:03
すみません。
坊主憎けりゃ袈裟まで憎い。
スレ違いに腹をたてたばかりに、ageまで憎く思えてしまいました。

ちなみに、>>31
「言語と環境の区別くらい付けてくれ」は、いまいちでした。
「もっと適したスレがある」というべきでした。
反省しています。

39 名前:デフォルトの名無しさん :2006/01/10(火) 20:45:12
>>29
Win32API質問箱 Build39
http://pc8.2ch.net/test/read.cgi/tech/1136673250/

40 名前:36 :2006/01/10(火) 20:51:34
やはり ios::binary でオープンして、
'\x0a' を出力するしかないのかなぁ。

41 名前:36 :2006/01/10(火) 20:59:25
Visual C++ 2005 でしか確認していないのですが、
std::endl は結局のところ "\n" を出力している
だけで、それを受けたストリームが
通常の '\n' の解釈にしたがって改行コードを
出力しているだけですね。

42 名前:デフォルトの名無しさん :2006/01/10(火) 21:04:13
WinとかMacって\rだと何が出力されるの?

UNIXだと普通に
\r CR
\n LF
だが


43 名前:デフォルトの名無しさん :2006/01/10(火) 21:29:20
自分でマニピュレータ定義した方が早いのでは?


44 名前:デフォルトの名無しさん :2006/01/10(火) 21:41:37
昔調べた結果

出力文字 unix dos  mac
\r      \r   \r    \r
\n      \n  \r\n  \r
\r\n    \r\n \r\r\n \r\r

入力文字 unix  dos  mac
\r     \r   \r  \n
\n     \n   \n  \n
\r\n   \r\n  \n  \n\n



45 名前:デフォルトの名無しさん :2006/01/10(火) 21:59:33
それって、\r は0x0D で \n は 0x0A?
Perlなんかだと違ったりしているようなので気になった。
ttp://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify

46 名前:デフォルトの名無しさん :2006/01/10(火) 22:00:10
>>44
おおそうなっているのか
Winはdosと変わってないんだよね?
MacもOSXと昔のMacOSで変わってないのかな?


47 名前:デフォルトの名無しさん :2006/01/10(火) 22:10:23
>>45
UnixもDOSもMacもASCIIを使っているのでそのとおり。

ついでに言えばストリームをバイナリモードにすればどれもUnixと同じくそのままの文字が出力されるはず。

48 名前:デフォルトの名無しさん :2006/01/10(火) 22:55:12
何かのポインタ型をtemplateの型として受け取ったとき、
なんとかtemplate内部で、そのポインタ型の、ポインタじゃないインスタンスを生成する方法ないすかねぇ。

int main(){
Hoge<int*> hoge;
hoge.create();
}

と、した時

template <class TPTR> class Hoge{
TPTR p;
void create(){
//ここで p = new int; としたいのですが……無理っすかねぇ。
}
}

最初からHoge<int>を前提としてtemplate書けって感じですが、そこをなんとか

49 名前:デフォルトの名無しさん :2006/01/10(火) 22:56:00
あ、mainが返値なくてすいません

50 名前:デフォルトの名無しさん :2006/01/10(火) 23:02:37
>>48
Hogeのテンプレート引数は必ずポインタ型であることが必要なら、
初めから元の型をテンプレート引数に取るようにするのが一番楽。

template <class T> class Hoge{
    T *p;
    void create(){
        p = new T;
    }
};

それが駄目ならboost::remove_pointer<T>

>>49
mainだけはintを返すように宣言してあり、なおかつreturnがなければ
return 0;が行われるという扱いがなされるから問題ない。

51 名前:デフォルトの名無しさん :2006/01/10(火) 23:20:25
>>50
レスありがとうございますx2

remove_pointerのソース観てみましたが、いやはやさっぱり分かりません。
もとからない自信が、すっかり無くなってしまいました。

やはりそうですよね…おとなしく書き直すことにします。変更個所オオス!!

52 名前:デフォルトの名無しさん :2006/01/10(火) 23:43:40
>>51
boost::remove_pointer<int *>::typeはintになっているという具合。

53 名前:デフォルトの名無しさん :2006/01/11(水) 02:12:01
char* func()
{
char *str = new char[100];
char* retstr = str;
delete str;
return retstr;
};

こういう書きかたってマズイんでしょうか。

54 名前:デフォルトの名無しさん :2006/01/11(水) 02:18:54
>>53
返したretstrを何に使うの?


55 名前:デフォルトの名無しさん :2006/01/11(水) 02:21:35
>>53
ポインタが指すメモリにアクセスするつもりならマズイ。
deleteした時点でもう使えなくなっている。


ところで48が気になったのでremove_pointerを読んでみた。
それで48の望む動作をするコードが一応出来た。

template<typename T> struct remove_pointer
{
};

template<typename T> struct remove_pointer<T*>
{
     typedef T type;
};

template<typename TPTR> struct Hoge
{
     TPTR p;
     void create()
     {
         p = new remove_pointer<TPTR>::type;
     }
};

テンプレートに慣れていないせいなのかなんかキモイ。
やはり普通に元の型でやるべきだと思った。

56 名前:53 :2006/01/11(水) 02:46:41
よくよく考えてみればマズイですね。
コードに意味はなくなんとなく考えてみただけです。
有難うございました。

57 名前:デフォルトの名無しさん :2006/01/11(水) 02:51:18
>>53 そこの delete は delete [] な。

58 名前:デフォルトの名無しさん :2006/01/11(水) 06:43:06
>>44
実際にはコンパイラ(のランタイムライブラリ)によって変わるみたいだよ。
だから例えば同じ dos 環境下でも Microsoft のコンパイラで作成したプログラムと
Borland のコンパイラで作成したプログラムでは結果が違う。 >>4 の表のdosの欄は恐らく
Microsoft のコンパイラで作成したプログラムでの結果だろうけど、Borland のコンパイラで
作成したプログラムの場合、"\r\n" の出力結果は "\r\n" のままになる。

cf. http://www.trickpalace.net/cppll/reference/printf.htm ( このページの一番最後 )

59 名前:デフォルトの名無しさん :2006/01/11(水) 06:50:53
まあそんなものに依存するプログラムは書くなってことだな

60 名前:デフォルトの名無しさん :2006/01/11(水) 12:22:58
>55
typename 付けないといけないです

template<typename TPTR> struct Hoge
{
TPTR p;
void create()
{
p = new typename remove_pointer<TPTR>::type;
}
};

61 名前:55 :2006/01/11(水) 12:57:20
>>60
おっと、ごめん。
忘れてた。

VCで通ったのでそのまま書いてしまった。


62 名前:デフォルトの名無しさん :2006/01/11(水) 19:58:30
前すれにストリームの解説を求めてた人がいたけど、
標準ライブラリの解説は、ここが参考になる。

//www.cc.nao.ac.jp/fsunman/japanese/C++/index.html

63 名前:デフォルトの名無しさん :2006/01/11(水) 22:12:42
>>55さん他
うーん、凄い…ありがとうございます。

ここまで簡単に書いて頂いたのに、理解できない自分に絶望ですが。
何故こうなるんだろ…。奥が深いですねぇ(俺には)。

64 名前:デフォルトの名無しさん :2006/01/12(木) 21:27:48
こういう怪しげなテンプレートの使い方はModern C++ Designで勉強するしかないな。

テンプレートがもう少し使いやすい概念になってくれるとありがたいんだけどな。


65 名前:デフォルトの名無しさん :2006/01/13(金) 01:29:52
Modern C++ Design は序盤のタイプリストまわりが超難解、
template<template<template<hoge>,hoge>,hoge> とかの
多段テンプレートってのはLispの書式に近いんだそうだが、
そのLispの書式がこれまたわけわからんかったりする。

66 名前:デフォルトの名無しさん :2006/01/13(金) 01:47:24
要はcarとcdrをtemplateを駆使して実装してる感じか

67 名前:デフォルトの名無しさん :2006/01/13(金) 02:04:24
最近はそういう再帰的なテンプレートと並行して,
テンプレートクラスを1つの関数とみなして使う使い方も重要かと.
boost::mpl, boost::type_traits あたりは後者の見方がないと
なかなか使いこなせないように思うのですが.

68 名前:デフォルトの名無しさん :2006/01/14(土) 01:44:48
実験データがtab区切りで並んだfileがあって、
10.1 2.33 4.1 8 9.443
とかってあるとする。
こいつの最小桁は小数点何位かを知りたいんだけど、
簡単にやる方法ってあります?
上の数字列を入れると、
0.1 0.01 0.1 1 0.001
と得られると希望通りの動作。
ただし、1.20とかって数字のときにも、
0.1ではなく0.01が出ないと駄目。

69 名前:デフォルトの名無しさん :2006/01/14(土) 01:53:38
>>68
実験データひとつを、ひとつの文字列として読み出し、
文字列の後ろから小数点を検索して距離を調べ、
見つかれば距離に応じた値が答え。見つからなければ1。

C++関係無いな。

70 名前:デフォルトの名無しさん :2006/01/14(土) 02:00:26
Cなら
scanf("%s.%[^ ]", null, po)
みたいな感じで読めそうだけどC++核のは面倒くさそうだな

71 名前:デフォルトの名無しさん :2006/01/14(土) 02:01:18
- C++核
+ C++っぽく書く

72 名前:68 :2006/01/14(土) 02:57:44
>>69-71
やっぱ、"."を探すしかないよね。
ありがとう。

73 名前:デフォルトの名無しさん :2006/01/14(土) 09:54:19
10底のlog取るだけジャン

74 名前:デフォルトの名無しさん :2006/01/14(土) 10:25:15
それよりは文字列として'.'を探してやるほうが早そうな気がする。

75 名前:デフォルトの名無しさん :2006/01/14(土) 12:08:00
ごめん嘘 速度以前に題意に即さなかった

76 名前:デフォルトの名無しさん :2006/01/14(土) 13:26:20
>>73
ただし、1.20とかって数字のときにも、
0.1ではなく0.01が出ないと駄目。

よく嫁

77 名前:68 :2006/01/14(土) 15:21:06
結局こういうのにした。

double GetPrecision(const string value)
{
int length = value.size();
int dotPos = value.find(".");

if(dotPos>=0) return pow(10., 1+dotPos-length);
else return 1.;
}

78 名前:デフォルトの名無しさん :2006/01/14(土) 16:04:26
>>77
const string&にしろよ。

79 名前:デフォルトの名無しさん :2006/01/14(土) 16:06:29
ちょっと気になるのが、
dotPosがsigned型であることと、return 1だな。


80 名前:デフォルトの名無しさん :2006/01/14(土) 16:26:06
jya, return 2 ni suruyo


81 名前:デフォルトの名無しさん :2006/01/14(土) 16:29:24
俺ならintじゃなくて必ずstring::size_typeにするけど、神経質かなぁ?

82 名前:デフォルトの名無しさん :2006/01/14(土) 16:33:33
>>77
・引数が値渡しである必要は無いので参照に。
・length は string のメンバ関数を使えばいい。
・find() の引数を長さ1の文字列ではなくひとつの文字に。
・dotPos を fin() の戻り値にあわせて string::size_type に。
・見つからない判定は string::npos で。

double GetPrecision(const string& value)
{
 string::size_type const dotPos = value.find('.');
 if(dotPos != string::npos) return pow(10, 1+dotPos-value.length());
 else return 1;
}

83 名前:82 :2006/01/14(土) 16:39:17
うは。 pow の引数 signed にキャストしないとえらいことになるな。

84 名前:デフォルトの名無しさん :2006/01/14(土) 16:42:00
符号なしは怖いです
for(;i>=0; i--)

85 名前:82 :2006/01/14(土) 16:45:26
キャストキモス

double GetPrecision(const string& value)
{
 string::size_type const dotPos = value.find('.');
 if(dotPos != string::npos)
  return pow(10,-static_cast<int>((value.length()-1)-dotPos));
 else
  return 1;
}

86 名前:デフォルトの名無しさん :2006/01/14(土) 17:46:16
>>82
stringのメンバlengthとsizeは全く同じだよ。好きなほうを選べばいい。

87 名前:デフォルトの名無しさん :2006/01/14(土) 19:27:30
>>86 同じだから length = size() という変数での置き換えが不要だということだろう。

88 名前:デフォルトの名無しさん :2006/01/14(土) 20:40:18
あるライブラリーのクラスのメンバー変数のメモリ配列がうんこ
なので不都合がおきてる
class Base {
public:
int x_, y_; //ここが問題
//できればこうしたい
// std::vector<int> xy;  int &x_; int &y_;
//Base(int x , int y): xy(2),x_(xy[0]), y_(xy[1]){}

Base(int x , int y): x_(x), y_(y){}
int doSome() { return (x_*y_);}
};
けれど他人のライブラリなので変更できないので
派生クラスで解決しようとした
class Derived :public Base
{
public:
std::vector<int> xy; int &x_; int &y_;
Derived(int x , int y): xy(2),x_(xy[0]), y_(xy[1]){}
};

main()
{
Derived d(1,2)
d.doSome() ;// x_ * y_ = 1*2 が帰ってくるようにしたい。
}
けれどdoSome()はちゃんと動かない当然だけど
Baseを変更しないでメンバー関数doSome()を使う方法ないんでしょうか?

89 名前:デフォルトの名無しさん :2006/01/14(土) 20:46:04
>>88
Base b(1,2);
b.doSome();
これで不満な理由がわからんことには答えようが無い。

90 名前:デフォルトの名無しさん :2006/01/14(土) 20:54:38
x y がメモリー上で連続に並んでいる場合にしか使えない関数
func(int *p_xy){ return *p_xy + *(++p_xy) }
とかと同時に使いたい

91 名前:デフォルトの名無しさん :2006/01/14(土) 20:59:24
>>90
それは Base を使ってる限り無理だな。
ローカルな配列に一旦コピーして、後で戻すことができれば
同じ結果にできるだろうけど。

92 名前:デフォルトの名無しさん :2006/01/14(土) 21:01:28
>>90
> func(int *p_xy){ return *p_xy + *(++p_xy) }

これは未定義動作だな。メモリー上の連続性とか関係無しに。

93 名前:デフォルトの名無しさん :2006/01/14(土) 21:01:47
>>90
そういう阿呆なことをしようとするな。

94 名前:デフォルトの名無しさん :2006/01/14(土) 21:02:20
Derivedでint &x_を宣言したってBaseのメンバ関数からは
Base::x_しかみえんだろうが。
doSomeをオーバーライドしない限りどうしようもなかろうに。


95 名前:デフォルトの名無しさん :2006/01/14(土) 21:14:44
>>92
直前の副作用完了点から次の副作用完了点までの間で
同一オブジェクトに対して読み取りや変更が行われる回数は
高々1度でなければならないってのだっけ?よく覚えてないが。

96 名前:デフォルトの名無しさん :2006/01/14(土) 21:20:11
>>95
具体的に言ってしまえば*p_xyと*(++p_xy)のどちらが
先に評価されるか未定義になってる。

97 名前:デフォルトの名無しさん :2006/01/14(土) 23:41:16
Derived を Baseにcastとか・・・

98 名前:デフォルトの名無しさん :2006/01/14(土) 23:53:58
>>97 何この電波?

99 名前:デフォルトの名無しさん :2006/01/14(土) 23:58:02
コンストラクタの引数はつかわんのか?

100 名前:デフォルトの名無しさん :2006/01/15(日) 04:46:16
お前ら文字エンコードの変換ってどうしてる?
ICU?iconv?std::codecvt?

オレはICUで落ち着きそうなんだが
いい方法、ナイスライブラリがあったら教えて

101 名前:デフォルトの名無しさん :2006/01/15(日) 11:13:08
「aiueo 12345」のような入力が各行から入ってくるとき、

std::string s1,s2;
std::cin >> s1 >> s2;

として aiueo を s1 に、12345 を s2 に格納したいのですが、
可能でしょうか?

102 名前:デフォルトの名無しさん :2006/01/15(日) 11:26:49
可能です

103 名前:デフォルトの名無しさん :2006/01/15(日) 11:44:32
>>102 ありがとうございました。
いままで scanf を使っていたのですが、
C++ のストリームを使う方が安全だし便利ですね。

104 名前:デフォルトの名無しさん :2006/01/15(日) 11:54:22
その代わりコストは付くがな。

最近じゃCRTの可変長引数関数にタイプチェックあるんだっけ?
VC8.0限定だった気もするけど。

105 名前:デフォルトの名無しさん :2006/01/15(日) 12:14:59
あんなもんサイズ間違えたら終いだ
その前にまず標準に準拠しろと

106 名前:デフォルトの名無しさん :2006/01/15(日) 13:30:32
>>104
scanf の方がむしろ書式文字列をパースする
必要があるので、コストつきそうな気もする。

107 名前:デフォルトの名無しさん :2006/01/15(日) 13:47:01
>>106
計測せずに言うな

108 名前:デフォルトの名無しさん :2006/01/15(日) 14:05:27
>>100
オレも ICU で落ち着いてる。つか、 ICU で良いんじゃね?
他の国際化の機能まで視野に入れると iconv より俄然強力だし
少なくとも std::codecvt よりはマシと思うw

109 名前:デフォルトの名無しさん :2006/01/15(日) 15:11:31
>100
使ったことないけど挙げとく。暇ができたら趣味プログラムで使ってみる予定……

ttp://tricklib.com/cxx/ex/babel/



110 名前:デフォルトの名無しさん :2006/01/15(日) 16:45:44
すみません、double以上の数字の計算ってどうやってするんですか?

111 名前:デフォルトの名無しさん :2006/01/15(日) 16:48:00
>>110
long double

112 名前:100 :2006/01/15(日) 18:44:37
>>108
iconv は手軽だけど char のみの対応
std::codecvt は使い方がよく判らん + C/C++ 各環境の実装が胡散臭い(wchar_t が 2byteとか)
ICU は大がかりだけど独自UChar に安心感が・・・
その結果で ICU に落ち着きそうな俺ガイル
詳しそうな人の意見が聞けて嬉しいなり

>>109
入れるの忘れてた
それも気になる気になる

レスどーもでした
参考になります、ありがとうございました

113 名前:デフォルトの名無しさん :2006/01/15(日) 22:53:54
ICUはなんかサイズが大きいイメージがあっていやん。
そんなに本格的に文字コードを扱う必要がないのなら、codecvtで十分だとは思うけどね。
【C++】STL(Standard Template Library)相談室 4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/622

114 名前:デフォルトの名無しさん :2006/01/15(日) 23:08:09
ATLを使うへたれな俺。

115 名前:100 :2006/01/16(月) 03:10:29
>>113
勉強してみる
ありがとう

116 名前:デフォルトの名無しさん :2006/01/16(月) 06:49:32
基底クラスから、
派生クラスのメンバ関数ポインタfuncをだけを元に
メンバ関数を呼び出すことはできませんか?
(this->*func)(param);とするわけにもいかず困っております。

(面倒くさいので、基底クラスでvirtual宣言したくないのです。)

もしくは、イベント処理を実装するのに
よいライブラリ、もしくはヒントでもいいのでありませんか?
boostですか?

117 名前:デフォルトの名無しさん :2006/01/16(月) 06:54:50
>面倒くさいので、基底クラスでvirtual宣言したくないのです。

これが根本的に間違っていると思う。

118 名前:デフォルトの名無しさん :2006/01/16(月) 10:24:42
X がすでにtypedef されているかを判定する方法ないでしょうか?

disable_if_c< is_class<X>, typedef A'>::type X;

などとすると Xが それ以前にtypedef されていない場合に
Xは定義さfれていません、と怒られます

119 名前:デフォルトの名無しさん :2006/01/16(月) 11:19:02
>>116
やりたいことはなんとなく想像尽くけど、別の方法を検討した方がいいと思う。

一番無難なのは、結局基底クラスにexecute関数をvirtualで持って、
派生クラスの内部で状態によって分岐だね。

派生した処理関数の呼び出し方にトリッキーな方法はいくらでもあるけど、
コンパイラの実装依存とかになりやすいし、変に複雑になるんなら
基本に立ち返るのが吉

120 名前:デフォルトの名無しさん :2006/01/16(月) 19:08:02
わかりました。
基本に立ち返ります。

121 名前:デフォルトの名無しさん :2006/01/16(月) 19:10:23
Boost.Regex が、ICU に対応したからこれから使うなら ICU じゃね?
ただ、Boost や STL のコード中に紛れ込むと違和感は歩けど。

122 名前:デフォルトの名無しさん :2006/01/16(月) 19:36:36
>>118 少なくとも標準では、無い。

123 名前:デフォルトの名無しさん :2006/01/16(月) 20:50:09
>>116
派生じゃなくてテンプレートを使うのはどうかな?

//base
template class Events<class HandlerT>
{
void event1()
{
Handler::event1();
}
...
};

//derived
class Handler
{
void event1()
{
printf("event1");
}
...
};

Event<Handler> EventHandler;

124 名前:デフォルトの名無しさん :2006/01/16(月) 20:51:01
まちがえた

125 名前:デフォルトの名無しさん :2006/01/16(月) 23:59:11
>>116
Boost なら Signals とかかな

126 名前:デフォルトの名無しさん :2006/01/17(火) 20:52:19
コードの書き方のスタイルについておしえてください
べたに処理を書くのではなく
type2 output1,output2;
DoSome1(type1 &input, type2 &output1);
DoSome2(type2 &output1, type2 &output2);

処理結果outputをclass内のメンバー変数として保持できる
class CDoSome1{
public:
type2 output1;
CDoSome1(type1 &input){output1 = ...}
};
class CDoSome2: public CDoSome1
{
public:
type2 output2;
CDoSome2(type1 &input):CDoSome1(input)
{output2 = ...}
};
というスタイルで処理しています。
けれどやっぱりべた書きのほうがいいのかとも悩んでます。
どちらのほうがいいのでしょうか?

127 名前:デフォルトの名無しさん :2006/01/17(火) 21:02:07
>>126
何か間違っている気がしてならない。

128 名前:デフォルトの名無しさん :2006/01/17(火) 21:25:05
メンバ関数の中で
delete this;
と自分自身を削除するのはアリなんでしょうか?

129 名前:デフォルトの名無しさん :2006/01/17(火) 21:32:27
合法ではある。

130 名前:デフォルトの名無しさん :2006/01/17(火) 21:32:50
>>126
そのコードを活かして type2 の替わりに CDoSome1 を使うと、
何らかの結果が格納されていることが保証できる。
それが利点にならないのなら、ほとんど無駄な感じ。
CDoSome2 辺りは、たぶん間違い。

一般的に、クラスが存在する意味を他の人にも
説明できないようなら、クラスを作るべきじゃない。

131 名前:デフォルトの名無しさん :2006/01/17(火) 21:34:22
>>128 ttp://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15

132 名前:デフォルトの名無しさん :2006/01/17(火) 21:35:29
>126
最近俺も、戻り値が複数ある関数をクラス化してみたりしてる。
が、コンストラクタで処理を実行するのは如何なものか?
判りにくいから継承もするべきではないと思う。

133 名前:デフォルトの名無しさん :2006/01/17(火) 23:29:37
戻り値が複数あるような関数は、
いつもクラス・構造体を返す関数にしている。

134 名前:デフォルトの名無しさん :2006/01/17(火) 23:34:56
二つくらいならポインタ渡して代入させてる。

135 名前:デフォルトの名無しさん :2006/01/18(水) 03:46:38
関数の後にはすべて throw() などとして
どんな例外を投げるかとかを指定するべきでしょうか?

136 名前:デフォルトの名無しさん :2006/01/18(水) 03:53:34
>>135
例外仕様はむしろ避けるべき。
詳しくはC++ Coding Standardsの第75項あたりを参照のこと。

137 名前:デフォルトの名無しさん :2006/01/18(水) 04:20:37
ふむ、やっぱ買わなきゃならんか。
32ドルくらいだし買うか、生協で。
その本の内容を読まずにレスするけど、
例外つかわないってのがトレンドなのか?
コンストラクタで例外投げるのは時々躊躇することがあるが。

138 名前:デフォルトの名無しさん :2006/01/18(水) 04:22:11
例外を使わないんじゃなくて、例外仕様を使わないのがトレンドなんじゃない?
例外はむしろ使うべきだろ。
コンストラクタでは特に。
デストラクタで投げちゃいかんけど。

139 名前:デフォルトの名無しさん :2006/01/18(水) 04:33:06
あ〜そういう意味での「例外仕様」か。納得。
C++ の規格に含まれる例外つー仕様は使うな、
ってことかと思た。

コンストラクタでの例外を投げるのを躊躇するってのは、
投げないって言う意味じゃなくてコンストラクタ内での
投げる場所について慎重になるって意味ね。
中途半端に初期化された状態ってのが怖くて。

ところで、いまさら何をですまんが、
例外でコンストラクタを抜けるときって
そのオブジェクトの *this について
デストラクタ呼ばれるんだっけ?

140 名前:デフォルトの名無しさん :2006/01/18(水) 04:34:46
呼ばれないというのを前提で生きてきたんだけど。

141 名前:デフォルトの名無しさん :2006/01/18(水) 04:36:43
呼ばれない

142 名前:デフォルトの名無しさん :2006/01/18(水) 04:40:00
>>139
> 中途半端に初期化された状態ってのが怖くて。
中途半端に初期化されたオブジェクトが使われることは絶対にないから安心しる。

143 名前:デフォルトの名無しさん :2006/01/18(水) 04:48:43
例えばコンストラクタ内で

member1 = new char[100];
if (member1 == NULL) throw std::bad_alloc();
member2 = new char[200];
if (member2 == NULL) throw std::bad_alloc();

とかやるとまずいよなぁ、ってのが
コンストラクタ内での例外に慎重になってた原因の一つ。

144 名前:デフォルトの名無しさん :2006/01/18(水) 04:50:06
member1 とか member2 を auto_ptr にして
こわくない、こわくない、って自分に言い聞かせればいいのか?

145 名前:デフォルトの名無しさん :2006/01/18(水) 07:34:31
>>143
メンバ変数や派生元クラスのデストラクタは呼ばれる。
動的配列をメンバとして使いたければ std::vector にしとくとか。

146 名前:デフォルトの名無しさん :2006/01/18(水) 08:33:19
>>136,138,139
なんか、その「例外仕様」って用語、無茶苦茶紛らわしい命名だね。
いや、仮に、俺がその用語を命名する立場だったとしても同じような名前をつけてしまいそうだとは思うけど。
なんだかなぁ。

147 名前:デフォルトの名無しさん :2006/01/18(水) 08:54:49
>>143-144
class Hoge
{
 boost::scoped_array<char> member1;
 boost::scoped_array<char> member2;
public:
 Hoge() : member1(new char[100]), member2(new char[100])
 {}
};

としとけば、member2 の new が std::bad_alloc 投げても member1 の
デストラクタが呼ばれて member1 の char[100] も解放されるね。

148 名前:デフォルトの名無しさん :2006/01/18(水) 09:27:10
>>147
とくに効率が問題にならなければ std::vector を
使っておいたほうがいいんじゃないか?

class Hoge
{
 std::vector<char> member1;
 std::vector<char> member2;
public:
 Hoge() : member1(100), member2(100)
 {}
};

149 名前:デフォルトの名無しさん :2006/01/18(水) 09:58:16
>>148
今はそういうことを問題にしてるんじゃないんだけど。

150 名前:デフォルトの名無しさん :2006/01/18(水) 12:25:20
>>147-149 まぁ、仲良くしとけ。
効率重視なら std::auto_ptr でよくないか?
これでもちゃんと開放されるだろ?

151 名前:デフォルトの名無しさん :2006/01/18(水) 12:28:35
>>150
>>147-149のように配列を構築したいときには駄目
auto_ptrが呼び出すのはdeleteだから。
配列の場合delete[]を呼ばないといけないですからね。

# 標準ライブラリにauto_ptrに対応するauto_arrayがないのが惜しまれる

152 名前:デフォルトの名無しさん :2006/01/18(水) 12:29:57
auto_ptrを使ってしまうとコピーコンストラクタを書くのが面倒になるんだよな。

153 名前:デフォルトの名無しさん :2006/01/18(水) 12:36:31
んじゃ、boost::shared_array だったらおk?

154 名前:デフォルトの名無しさん :2006/01/18(水) 12:39:02
おkじゃない?
遅いからって嫌がる人もいるけど。

155 名前:デフォルトの名無しさん :2006/01/18(水) 12:39:26
>>147 俺、いままで boost::coped_array でいいところを
boost::shared_array 使って書いていたみたいだ。

156 名前:デフォルトの名無しさん :2006/01/18(水) 12:40:00
例外仕様がガラクタ認定なのは面白いよな
Javaかわいそう

157 名前:デフォルトの名無しさん :2006/01/18(水) 12:43:11
VC++じゃthrow()しか対応してないしなぁ

158 名前:自分用メモ :2006/01/18(水) 12:47:25
A Pragmatic Look at Exception Specifications
http://www.gotw.ca/publications/mill22.htm

http://www.tietew.jp/cppll/archive/7726

159 名前:デフォルトの名無しさん :2006/01/18(水) 13:17:03
つまり例外仕様は使うな、でFAってことだな

160 名前:デフォルトの名無しさん :2006/01/18(水) 14:27:13
お願いします。
int x;
xに値を代入(0から99)のときに、xが0から9までのときは、
00、01、、、09みたいに頭に0が付くように出力する簡単な方法はないでしょうか。
setwを使うと0が出ません。はじめにケタを調べればできますが、もっといい
方法はないでしょうか。

161 名前:デフォルトの名無しさん :2006/01/18(水) 14:29:17
cout << setw(2) << setfill('0') << x << endl;

162 名前:デフォルトの名無しさん :2006/01/18(水) 14:32:43
例外仕様は絶対に使わないってルール決めがあれば
throw をマクロで弄って __FILE__ と __LINE__ を例外オブジェクトに付加したり
catch されなくても自分で出した例外を throw の時点で全部ログに吐くなんて使い方もできるしなぁ。

まぁ、C++の規格的には予約語である throw をマクロで弄る時点で違法だけどw

163 名前:デフォルトの名無しさん :2006/01/18(水) 14:34:31
>>160
素直に printf 使おうぜ!
printf("%02.2d\n", x);

164 名前:デフォルトの名無しさん :2006/01/18(水) 14:35:30
>>163
"%02d"で十分な気が......

165 名前:デフォルトの名無しさん :2006/01/18(水) 15:05:33
>>162
予約語をマクロで弄ってはいけないなんて規定あったか?

166 名前:デフォルトの名無しさん :2006/01/18(水) 15:28:38
関数ポインタを使ったメッセージディスパッチを作っています。
関数ポインタの型がそれぞれ違う場合、関数ポインタをコンテナのようなものでひとまとめに保持することは不可能でしょうか?

static const int EVENT1 = 0;
static const int EVENT2 = 1;
...
typedef int (*func) (int, int);
func funcArray[SIZE];
funcArray[EVENT1] = func1;
funcArray[EVENT2] = func2;
...
funcArray[EVENT1](10, 10);
と等価なようなことをやろうと思っているんですが、型が違う場合はポインタをバラバラに保持するしかないでしょうか?


167 名前:デフォルトの名無しさん :2006/01/18(水) 15:34:32
>>166
仮に型が違う関数ポインタをまとめてコンテナに入れられたとしても、
関数を呼び出すときには、適切な型にキャストしてやらなきゃならないんだから
別々に保持しても変わらないと思うが

168 名前:デフォルトの名無しさん :2006/01/18(水) 15:44:12
>>166
「型が違う」ってどの程度違う?
その例だと、(10, 10)で呼び出しているから、
・型はT (T1, T2)という形であり、
・int -> T1, int -> T2の暗黙の変換がある。
という条件を仮定している。
こういう条件があるなら、細かい型の違いを無視して
boost::function<void (int, int)>に入れられたと思う。

169 名前:166 :2006/01/18(水) 16:02:44
>>167
やっぱり呼び出すときに型情報が要りますよね・・
intにマップしたEVENTXから関数ポインタの型を取得するようなtemplate書こうと思ったけど
結局そのテンプレートにアクセスするときに型が必要で意味なかった orz

>>168
ありがとう。でも引数の数と型から返り値の型まで違うんでboost::functionは無理そうです。

170 名前:162 :2006/01/18(水) 16:53:52
>>165

バグベアードを作る時に違法じゃないか一応調べてさぁ

>17.4.3.1.1 マクロ名
>1 ヘッダ中でマクロとして定義された名前は,翻訳単位がそのヘッダを取り込んだ場合,いか
>なる用途に対しても,処理系用に予約する。
>2 ヘッダを取り込んだ翻訳単位は,そのヘッダ中で宣言又は定義された名前を定義するマクロを
>含んでいてはならない。更に,そのような翻訳単位は,字句的にキーワードと一致する名前をマ
>クロとして定義してはならない。

てなモノを見つけて、「キーワード(予約語)はマクロで定義するのは違法」って解釈したんだけど、
俺の解釈がなんか間違ってる?

# で、まぁ、違法と認識しつつ結局そのままバグベアードを作ったんだけどw

171 名前:デフォルトの名無しさん :2006/01/18(水) 16:59:31
違法て・・・

172 名前:デフォルトの名無しさん :2006/01/18(水) 17:07:28
違法等等以前に大混乱の危険


173 名前:デフォルトの名無しさん :2006/01/18(水) 17:20:53
>>170
知らなかった。サンクス

174 名前:デフォルトの名無しさん :2006/01/18(水) 19:14:31
自作のデータベースから任意の検索条件で検索を行い、
検索結果を一覧で表示するプログラム
をc++builder6で作成するプログラムがわかりません。
どなたか教えてください。

175 名前:デフォルトの名無しさん :2006/01/18(水) 19:17:50
そんなものありません

176 名前:デフォルトの名無しさん :2006/01/18(水) 19:20:38
>>174
スレ違い

くだすれC++Builder(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1117225464/

177 名前:デフォルトの名無しさん :2006/01/18(水) 19:32:11
宿題だろこれ、たぶん。

178 名前:デフォルトの名無しさん :2006/01/18(水) 20:08:25
>>174
「自作のデータベース」
これ大変な事だぞ。一から作れって言うのか。
BDE使ったらだめなのか。

179 名前:デフォルトの名無しさん :2006/01/18(水) 20:09:44
そんな事より、
「プログラムをc++builder6で作成するプログラム」
これ大変な事だぞ。

180 名前:デフォルトの名無しさん :2006/01/18(水) 20:12:27
うむ。完成したら俺にもくれ。

181 名前:デフォルトの名無しさん :2006/01/18(水) 23:08:47
ちょっと質問
boost::tokenizer::iterator itで(特にコレに限らないけど)
func( *it++, *it );
だと引数の評価順序は不定でしたっけ?


182 名前:デフォルトの名無しさん :2006/01/18(水) 23:20:27
>>181 不定。

183 名前:デフォルトの名無しさん :2006/01/18(水) 23:24:16
>>151
auto_array など要らない、って禿がゆってた。
ttp://www.research.att.com/~bs/bs_faq2.html#auto_ptr

184 名前:デフォルトの名無しさん :2006/01/18(水) 23:28:26
>>182 ありがd

185 名前:デフォルトの名無しさん :2006/01/19(木) 13:51:07
//hoge_comp.h-------------------------------------------------------------
struct HogeComp{
int func(){ return 777; }
};
//hoge.h-------------------------------------------------------------
class HogeComp; //hoge_comp.hを伝染させないため、ヘッダではクラス宣言のみ
class Hoge{
HogeComp* hoge_comp; //本当はここは HogeComp hoge_comp; で良いのですが…
public:
Hoge();
~Hoge();
int func_comp();
};
//hoge.cpp-------------------------------------------------------------
#include "hoge.h"
#include "hoge_comp.h" //あえてこの順で
Hoge::Hoge() : hoge_comp( new HogeComp ){}
Hoge::~Hoge(){ delete hoge_comp; }

int Hoge::func_comp(){
return hoge_comp->func();
}
//main.h-------------------------------------------------------------
#include <iostream>
#include "Hoge.h"
int main(){
Hoge hoge;
std::cout << hoge.func_comp() << std::endl;
return 0;
}
hoge.cppでしか使わないhoge_compの宣言と実装とを、hoge.hを読み込む他のソースに伝染させないため
上のように書いています。この書き方はどうなんでしょうか。これではJavaっぽくて、C++の良さを失っていそうな気もします。

186 名前:デフォルトの名無しさん :2006/01/19(木) 14:30:29
>>185
Efficient C++だったかに、そういう実装のやり方について書いてあった。
ビルドに要する時間をできるだけ短くするために、そうすることもあると。


187 名前:デフォルトの名無しさん :2006/01/19(木) 14:32:38
>>186
良かった、オーソライズして頂き安心しました。
レスありがとうございました。

188 名前:デフォルトの名無しさん :2006/01/19(木) 15:56:34
>>185
>hoge.cppでしか使わないhoge_compの宣言と実装
分量にもよるけどhoge_comp.hの内容をhoge.cppに書いて
hoge_comp.hを無しにしてもいいかもね


189 名前:uroko :2006/01/19(木) 16:59:25
Modern C++ Design っていう本を読んでいるんですが難しくてよくわかりません。
本の内容に関する質問はこのスレでもよいですか?

190 名前:デフォルトの名無しさん :2006/01/19(木) 16:59:59
いいんじゃない?

191 名前:uroko :2006/01/19(木) 17:04:46
では、今は仕事中でもあるので後ほど質問を内容を整理して
質問します。よろしくです。

192 名前:デフォルトの名無しさん :2006/01/19(木) 17:42:23
unkoかとオモタ

193 名前:デフォルトの名無しさん :2006/01/19(木) 17:44:32
unkoかとオモタ

194 名前:デフォルトの名無しさん :2006/01/19(木) 17:50:17
質問させてください。
構造体を用意してnewしたあと p_testにポインタで渡しているはずなのに
p_testの中のxとyに未定義の値と表示されそれを他の変数に代入すると
エラーが発生します。

CではエラーにならないのでC++では特別な書き方等あるのでしょうか?
すいませんがご教授お願いします。

typedef struct _POINT{
int x;
int y;
}POINT;
typedef struct _TEST{
int s;
POINT p;
}M_TEST;

int WINAPI WinMain(...){
TEST * test = new TEST;
POINT * p_test = &test->p;
...

195 名前:194 :2006/01/19(木) 17:52:25
環境を書き忘れました。
VC.net 2003です。先日までVC6.0を使用していました。

196 名前:デフォルトの名無しさん :2006/01/19(木) 17:53:29
>>194
たぶんコンパイラ・デバッガの仕業。
未初期化の変数の値を読み込もうとするとエラーにするコンパイラ・デバッガを俺は知っている。

197 名前:194 :2006/01/19(木) 17:58:28
>>196
返答ありがとうございます。
一応ソースコードには間にZeroMemory関数を使用して初期化しているのですが
結局だめでした。

また関数にポインタも渡せなくて困っています・・・

198 名前:196 :2006/01/19(木) 17:58:44
>>195
やっぱりそうだ。
VC++ .Net 2003では196のとおり。変数をきちんと初期化すれば良い。
ただの構造体をnewしただけでは初期化されない(0埋めなどされない)

199 名前:196 :2006/01/19(木) 18:01:13
忘れていた。こうすれば0初期化される。
TEST * test = new TEST();

200 名前:デフォルトの名無しさん :2006/01/19(木) 18:06:04
今日からようやくクラスのお勉強に入ります。

201 名前:デフォルトの名無しさん :2006/01/19(木) 18:07:11
連絡不要

202 名前:194 :2006/01/19(木) 18:12:06
>>198
>>199
ありがとうございました。
参考になります。


グローバル変数で
POINT * p_test;
を定義したら中身が見えるようになりました。

お騒がせしました。

あ、というか関数内で定義したポインタは中身見れないのは仕様なのですか?

203 名前:デフォルトの名無しさん :2006/01/19(木) 19:10:21
>>202
あなたがやろうとしていることは、C++の流儀には従っていないと思われる。
「こう書けばコンパイルが通るから」という理由で、グローバル変数にするのはやめた方がいい。

void f() {
 TEST* test = new TEST();
}
この場合、TEST型へのポインタtestのスコープは、関数f()内である。
(厳密には、testが宣言された次の文から、関数の最後の}まで)
従って、この関数f()の外からtestにアクセスすることはできない。

複数の関数からtestをアクセスしたければ、次のようなオプションが取れる:
1. アクセスしたいすべての関数にtestへのポインタを渡す
2. 関連のある関数をまとめ、testと共にクラス化する

蛇足だが、ZeroMemory()を使うより、_POINT, _TESTのコンストラクタで初期化した方がいいと思う。


204 名前:uroko :2006/01/20(金) 01:03:04
>>189

質問1 (page x)

次のコードは、コンパイル時に評価を行うことができるassertマクロだそうです。

template<bool> struct CTAssert;
template<> struct CTAssert<true> {};

このCTAssertの使い方と、とういう状況のときに使うのかがわかりません。
(コンパイル時に評価をおこなう必要がある状況というのがわからない)


205 名前:デフォルトの名無しさん :2006/01/20(金) 01:09:43
>>194
「未定義の値」とはどこに表示されるのか?
他の変数に代入すると発生するエラーの内容(エラーメッセージ)は?
ソース貼るなら実際に動かしてるソース貼れ。
それから、コンパイル通るのぐらい確認しろ。

typedef struct _POINT {...} POINT; は C++ では struct POINT {...}; でいい。
C で使うにしても struct _POINT は struct POINT にしとけ。

>>202
「中身が見える」というのがどういう状態のことを言ってるのかわからん。

>>203
エスパー乙。
test のスコープは厳密には次の文からではなく test の直後から。

206 名前:デフォルトの名無しさん :2006/01/20(金) 01:11:27
>>204
ttp://www.kmonos.net/alang/boost/classes/static_assert.html
このあたりが参考になるかと

207 名前:uroko :2006/01/20(金) 08:23:47
>>206
ありがとうございます。よくわかりました。

208 名前:デフォルトの名無しさん :2006/01/20(金) 15:22:15
プロセスが消費した時間を計測するために使える関数で、
getusage() というものは有るのでしょうか?
昔、どこかのスレッドで同様の質問をしたときに、
getusage() 使え、という回答を頂いたのですが、
getusage() なる関数の使い方を見つけることが
できませんでした。 getusage() という関数は
実在するのでしょうか?

209 名前:デフォルトの名無しさん :2006/01/20(金) 15:40:06
>>208
C++標準にはない

これだけだと可哀想なのでフォローしておくと
君が探しているのはたぶん getrusage だろう

210 名前:デフォルトの名無しさん :2006/01/20(金) 21:10:56
動的に生成する予定の二次元配列を関数に渡したいのですが,
int* foo( a(*)[ 定数式 ] ) ;
の形式でないと,コンパイラが受け取ってくれない..んですよね?
どうすればいいでしょうか?
できるだけ配列をグローバル変数にはしたくないのですが..
そのほうがオブジェクト指向の適うと思うんです.

<状況>
#include<iostream>
using namespace std ;

int* foo( ) ;

int main( void )
{
int n ; // 配列のサイズ
cin >> n ;

int a[ n ][ n ] ;

・・・ ・・・

int* foo( ) ; // 何とかして配列の先頭アドレスを渡したい

return 0 ;
}

int* foo( )
{
・・・ ・・・
}


211 名前:デフォルトの名無しさん :2006/01/20(金) 21:14:42
>>210
> int a[ n ][ n ] ;
これが既にダメ。

212 名前:デフォルトの名無しさん :2006/01/20(金) 21:22:19
>>210
いくつかの選択枝がある。
1. std::vector<std::vector<int> >
  ただし、int[][]のようなメモリ上の連続性はないし、大きさの初期化が必要。
2. new
  1.のデメリットに加えて、deleteが面倒くさい。
3. boost::multi_array
  1.2.のデメリットはない。ただし、非標準。
4. その他

213 名前:デフォルトの名無しさん :2006/01/20(金) 21:28:52
5.二次元以上の配列を使う奴は馬鹿

214 名前:デフォルトの名無しさん :2006/01/20(金) 21:33:53
てんさぁ

215 名前:デフォルトの名無しさん :2006/01/20(金) 21:43:32
オブジェクト指向で、グローバル変数なんて使いやがったらしたたかに殴る。


216 名前:デフォルトの名無しさん :2006/01/20(金) 21:48:06
↓C(++)に二次元配列はない云々

217 名前:デフォルトの名無しさん :2006/01/20(金) 21:58:14
#include<stdlib.h>
int main(){
void * p = malloc(sizeof(int)*100);
((int[10][10])p)[1][2] = 3;
}

Cの話になりそうだけど、こういうことって出来ないの?

218 名前:デフォルトの名無しさん :2006/01/20(金) 22:03:56
>>217
それだと結局要素数は定数でなきゃいかんが。

219 名前:デフォルトの名無しさん :2006/01/20(金) 22:19:20
(* (int (*) [10][10]) p)[1][2] = 3;

配列のポインタ使えばこんな多分こんな感じ。

220 名前:デフォルトの名無しさん :2006/01/20(金) 22:22:41
int[][]が型じゃないから無理

221 名前:デフォルトの名無しさん :2006/01/20(金) 22:27:00
なるほど、二次元配列へのポインタにいったんキャストしてから、
デリファレンスするのね。

#include<stdlib.h>
int main(){
typedef int arrint[10][10];
void * p = malloc(sizeof(int)*100);
(*(arrint*)p)[1][2] = 3; //OK
(*(int***)p)[1][2] =3; //error
((int**)p)[1][2] =3; //error
}

222 名前:デフォルトの名無しさん :2006/01/20(金) 22:39:22
あ、でもtypedefするときには配列に定数を求められるけど、
使うときにはコンパイラはたとえリテラルが書き込まれてても
チェックしてくれないのね。。。当たり前か。
#include<stdio.h>
#include<stdlib.h>
int main(){
    void * p = malloc(sizeof(int)*100);
    //typedef int arrint[][]; //error
    typedef int arrint[10][10];
    (*(arrint*)p)[0][12] = 3; //OK
    printf("%d\n",(*(arrint*)p)[1][2]);
}

223 名前:デフォルトの名無しさん :2006/01/20(金) 23:22:12
>>212
6. std::vector<int>やnew int[n * n]など1次元配列を使う。
薄いラッパでもあれば結構使える。

>>217
たぶんreintepret_cast<int(&)[10][10]>(p)[1][2] = 3;ならいけるはず。

>>221-222
同様にreinterpret_cast<arrint&>(p)[0][12] = 3;や((arrint&)p)[0][12] = 3;とできるはず。
さらにnew arrintというようにはできないか?
しかしtypedefでそもそも要素数がコンパイル時に決定しているので本末転倒。

224 名前:デフォルトの名無しさん :2006/01/21(土) 01:17:47
void **Alloc2(size_t x,size_t y,size_t size)
{
 size_t IndexSize=sizeof( void * )*x ;
 void **p=malloc( IndexSize+size*x*y ) ;
 void *pY=( char* )p+IndexSize ;
 size_t i ;
 for( i=0 ; i<x ; i++ ) p[i]=( char* )pY+i*y*size ;
 return p ;
}

int **m ;
m=(int **)Alloc2(n-1,n-1,sizeof(int)) ;

こうやるとコンパイラに怒られます..
void* 型は void** 型に変換できない..と
どうしたものでしょうか?Cでやった時には問題なかったんですが・・

225 名前:デフォルトの名無しさん :2006/01/21(土) 01:21:57
void *から任意のポインタ型への変換は、明示的なキャストをする必要がある。

void **p=malloc( IndexSize+size*x*y );

void **p=(void **)malloc( IndexSize+size*x*y ) ;

226 名前:デフォルトの名無しさん :2006/01/21(土) 01:22:07
>>224
void **p=(void**)malloc( IndexSize+size*x*y );

次からはどの行でエラーがでたのかちゃんと書こうな?

227 名前:デフォルトの名無しさん :2006/01/21(土) 01:28:53
>>223
typedef int arrint[10][10];
arrint * p = new(arrint);

この場合、gcc-3.4.4(cygwin)とVC++7.1の両方で上手くいきませんでした。勘違いしてますかね。
VC++
arrint.cpp(5) : error C2440: 'initializing' : cannot convert from 'int (*)[10]' to 'arrint (*)'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style
g++
arrint.cpp:5: error: cannot convert `int (*)[10]' to `int (*)[10][10]' in initialization

また配列に対する代入および参照のところでgccのだけは挙動がおかしいかったです。VC++では完璧。

(*(arrint*)p)[0][12] = 3; //OK
//((arrint&)p)[0][12] = 3; //gccでは0になる
//reinterpret_cast<arrint&>(p)[1][2] = 3; //gccでは0になる

std::cout << (*(arrint*)p)[1][2] << std::endl; //代入した値を取得できる
//std::cout << ((arrint&)p)[1][2] << std::endl; //なぜか5になる。
//std::cout << reinterpret_cast<arrint&>(p)[1][2] << std::endl; //なぜか5になる。

228 名前:デフォルトの名無しさん :2006/01/21(土) 01:33:56
>>225-6

おおーっ!!やっぱりベテランは違いますね!
どうもありがとうございます!m(_._.)m
作ったプログラムが無事にコンパイルできました!

229 名前:デフォルトの名無しさん :2006/01/21(土) 02:24:48
>>227
初期化がコンパイル通ってないのに挙動が確認できるのか?
ポインタを参照に reinterpret_cast して挙動がおかしいのは当たり前。

230 名前:デフォルトの名無しさん :2006/01/21(土) 02:29:30
>>227
だからboost::multi_arrayを使えと。

231 名前:デフォルトの名無しさん :2006/01/21(土) 02:34:57
とりあえず、ソース汚いですけど、これで比べてみてください。

#include<cstdlib>
#include<iostream>
using namespace std;
int main(){
typedef int arrint[10][10];
arrint * p = (arrint *)malloc(sizeof(arrint));
(*(arrint*)p)[0][12] = 12; //OK
((arrint&)p)[0][13] = 13; //OK
reinterpret_cast<arrint&>(p)[0][14] = 14;
cout << "(*(arrint*)p)[1][2] " << (*(arrint*)p)[1][2] << endl;
cout << "(*(arrint*)p)[1][3] " << (*(arrint*)p)[1][3] << endl;
cout << "(*(arrint*)p)[1][4] " << (*(arrint*)p)[1][4] << endl;
cout << "(*(arrint*)p)[0][12] " << (*(arrint*)p)[0][12] << endl;
cout << "(*(arrint*)p)[0][13] " << (*(arrint*)p)[0][13] << endl;
cout << "(*(arrint*)p)[0][14] " << (*(arrint*)p)[0][14] << endl;


232 名前:デフォルトの名無しさん :2006/01/21(土) 02:35:46
cout << "((arrint&)p)[1][2] " << ((arrint&)p)[1][2] << endl;
cout << "((arrint&)p)[1][3] " << ((arrint&)p)[1][3] << endl;
cout << "((arrint&)p)[1][4] " << ((arrint&)p)[1][4] << endl;
cout << "((arrint&)p)[0][12] " << ((arrint&)p)[0][12] << endl;
cout << "((arrint&)p)[0][13] " << ((arrint&)p)[0][13] << endl;
cout << "((arrint&)p)[0][14] " << ((arrint&)p)[0][14] << endl;

cout << "reinterpret_cast<arrint&>(p)[1][2] " << reinterpret_cast<arrint&>(p)[1][2] << endl;
cout << "reinterpret_cast<arrint&>(p)[1][3] " << reinterpret_cast<arrint&>(p)[1][3] << endl;
cout << "reinterpret_cast<arrint&>(p)[1][4] " << reinterpret_cast<arrint&>(p)[1][4] << endl;
cout << "reinterpret_cast<arrint&>(p)[0][12] " << reinterpret_cast<arrint&>(p)[0][12] << endl;
cout << "reinterpret_cast<arrint&>(p)[0][13] " << reinterpret_cast<arrint&>(p)[0][13] << endl;
cout << "reinterpret_cast<arrint&>(p)[0][14] " << reinterpret_cast<arrint&>(p)[0][14] << endl;
}


233 名前:デフォルトの名無しさん :2006/01/21(土) 02:39:35
>>231
こんなんじゃダメなの?(行数詰めたから見難いけど)
template <typename T> struct array_2d {
    T* data_; int size1_, size2_;
    array_2d(int size1, int size2) : data_(new T[size1 * size2]) , size1_(size1), size2_(size2){}
    ~array_2d() {delete[] data_;}
    struct proxy {
        array_2d* parent_; int offset_;
        proxy(array_2d* parent, int offset) : parent_(parent), offset_(offset) {}
        operator T*() {return parent_->data_ + offset_;}
    };
    proxy operator[](int x) {return proxy(this, size2_ * x);}
};
template <typename T> void assign(T& a) {
    for (int i = 0; i < 2; ++i) for (int j = 0; j < 3; ++j) a[i][j] = 10 * i + j;
}
#include <iostream>
int main() {
    array_2d<int> a(2, 3); assign(a);
    for (int i = 0; i < 6; ++i) std::cout << a.data_[i] << ' ';
    std::cout << std::endl;
    int b[2][3]; assign(b);
    for (int i = 0; i < 6; ++i) std::cout << reinterpret_cast<int*>(b)[i] << ' ';
    std::cout << std::endl;
    return 0;
}

234 名前:デフォルトの名無しさん :2006/01/21(土) 02:43:15
>>233
あ、俺は210じゃないっす。ただの通りすがりの暇人ですw

>>229
>ポインタを参照に reinterpret_cast して挙動がおかしいのは当たり前。
あーこれはだめなんですか。未定義の部類になるのかな。じゃあgccとVCで結果が違って当たり前ですね。

235 名前:デフォルトの名無しさん :2006/01/21(土) 07:17:46
vtbl内における、各仮想関数ポインタのオフセット位置を得たいのですが、どのように書けばいいのでしょうか?
class X
{
public:
 virtual void func1() {};
 virtual void func2() {};
 virtual void func3() {};
};
のような場合、func1()について0、func2()について4(32ビットシステムの場合)、func3()について8が得られる書き方ですが・・・

あと、インスタンスのVtblのアドレスを得るにはどうしたらよいのでしょうか?
X x;
printf("%X\n", *(void **)&x);
こんな書き方しかないのでしょうか?

236 名前:デフォルトの名無しさん :2006/01/21(土) 07:57:42
>>235
処理系依存
確実に取得したいなら自前で仮想関数テーブルをエミュレートするしかない

237 名前:デフォルトの名無しさん :2006/01/21(土) 09:02:30
>>235
諦めてメンバへのポインタを普通に使え。

238 名前:デフォルトの名無しさん :2006/01/21(土) 14:06:53
>>227
要するに p は配列を指すポインタであるので、
配列を指す参照にキャストしてしまうと、間接参照のレベルが一段ずれてしまう。

配列を指す参照を用いるなら

((int (&) [10][10]) (*p)) [1][2] = 3; が正解

239 名前:デフォルトの名無しさん :2006/01/21(土) 20:52:20
キャストを使おうとしている人がほとんどみたいだけど、それって
当然規格はその結果を保証してないよね?

240 名前:デフォルトの名無しさん :2006/01/21(土) 23:45:36
えーと、ソースのみにローカルなclassを使うときに、
外部から見えないようにするために、namespace { } を使うのですが、

個人的に.cppにclassを書くので、class内部に実装もがんがん書くし
さらに内部structなんかを持たせる時もある、
なーんて事をしていると、(エディタでソース全体を整形することも多いので)
インデントが深くなってちょっと嫌な感じ。

で、
namespace {
 namespace local {
  class localclass;
 }
}
class local::localclass { ... };
using local::localclass;

などという事を考えたのですが、
これ(無名のnamespaceのさらに内部のスコープだけを明示して使用)って合法ですか?

vc,bcc,gcc等でのコンパイルは問題ないみたいですが。
(未定義のstatic変数のエラーメッセージで確認)

241 名前:デフォルトの名無しさん :2006/01/22(日) 00:23:46
>>240
大丈夫だと思います。

242 名前:デフォルトの名無しさん :2006/01/22(日) 00:27:58
>240
(質問の意図を思いっきり無視して)
namespaceでインデントしなければいい。

243 名前:デフォルトの名無しさん :2006/01/22(日) 00:47:42
ほんとにそれで、大丈夫なんですか?

244 名前:デフォルトの名無しさん :2006/01/22(日) 00:51:09
大丈夫だと思います

245 名前:デフォルトの名無しさん :2006/01/22(日) 00:54:56
>>241
どもです。

>>242
xyzzyでソース全体を整形すると、勝手にインデントしてしまうのですよ・・・
#includeを使って
"namespace hogehoge {" だけのファイルと
"}" だけのファイルを
先頭と最後に入れてごまかそうとした事も。

246 名前:デフォルトの名無しさん :2006/01/22(日) 01:02:58
>>245
> #includeを使って
インデントが深くなるよりもこっちの方が気持ち悪い。

247 名前:デフォルトの名無しさん :2006/01/22(日) 01:03:38
狂おしいほどハゲドー

248 名前:デフォルトの名無しさん :2006/01/22(日) 01:17:17
>>239
なぜそう思う?

malloc も operator new も 返す型は void* なんですが。

249 名前:デフォルトの名無しさん :2006/01/22(日) 01:19:28
>245
ちょっと名前を汚して良いのなら
#define NAMESPACE_hogehoge namespace hogehoge {
#define END_OF_NAMESPACE_hogehoge }
とか?

250 名前:デフォルトの名無しさん :2006/01/22(日) 02:00:03
クラスBのオブジェクトをA.cppとC.cpp内で使いたいのですが下記のエラーが出てリンクできません。
どうすればよいでしょうか?

A.OBJ : error LNK2005: "class B b" (?b@@3VB@@A) はすでに C.OBJ で定義されています

(A.h)
#include <stdio.h>
#include "B.h"

extern B b;

class A
{

};

(A.cpp)
#include "A.h"

B b;

int main()
{
return 0;
}


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