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


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

C++相談室 part43
1 名前:v(^・^)v :2005/08/15(月) 22:51:19
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。

前スレ part41(実質42)
http://pc8.2ch.net/test/read.cgi/tech/1120190961/

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

2 名前:v(^・^)v :2005/08/15(月) 22:52:34
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 :2005/08/15(月) 22:53:14
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 :2005/08/15(月) 22:54:01
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/

5 名前:v(^・^)v :2005/08/15(月) 22:54:58
■基本■
[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 :2005/08/15(月) 22:55:40
■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 :2005/08/15(月) 23:02:58
■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 :2005/08/15(月) 23:03:47
■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 :2005/08/15(月) 23:04:44
■Libraries■
[他]
 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

10 名前:v(^・^)v :2005/08/15(月) 23:05:37
■関連スレ■
【C++】template 統合スレ -- Part6
http://pc8.2ch.net/test/read.cgi/tech/1101384692/
C/C++の宿題を片づけます 49代目
http://pc8.2ch.net/test/read.cgi/tech/1123661447/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc8.2ch.net/test/read.cgi/tech/1014486422/
ATL/WTL Part3
http://pc8.2ch.net/test/read.cgi/tech/1095442366/

11 名前:デフォルトの名無しさん :2005/08/15(月) 23:27:14
STLつかうと一気に実行ファイルサイズが10倍に?!

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

13 名前:デフォルトの名無しさん :2005/08/15(月) 23:30:00
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

14 名前:デフォルトの名無しさん :2005/08/15(月) 23:31:55
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

15 名前:デフォルトの名無しさん :2005/08/15(月) 23:33:26
#include <stdafx.h>

後氏ね。

16 名前:デフォルトの名無しさん :2005/08/15(月) 23:47:39
>>13
嘘は言ってないな。

17 名前:デフォルトの名無しさん :2005/08/15(月) 23:48:57
>>15
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

18 名前:>>1-10 :2005/08/15(月) 23:53:07
>>11-15,17


後半(>>6-10)は携帯から書き込んだわけだが…スレ立ての時に限っては
もうちょっと連投規制を緩くして欲しいな。

19 名前:デフォルトの名無しさん :2005/08/16(火) 01:27:43
>>1


20 名前:デフォルトの名無しさん :2005/08/16(火) 04:27:22
wstringの文字列で、指定したn文字目の文字が何バイト文字かを調べたいのですが
どうしたらよいでしょうか。

21 名前:デフォルトの名無しさん :2005/08/16(火) 04:59:51
>>20
ま た お ま え か !

22 名前:デフォルトの名無しさん :2005/08/16(火) 07:28:03
n文字目をいきなり判定することは出来ない。
先頭から順番にチェックしていくしかない。

23 名前:デフォルトの名無しさん :2005/08/16(火) 09:51:56
あるだろその関数・・・

24 名前:デフォルトの名無しさん :2005/08/16(火) 11:15:25
wstringならそもそも格納が文字単位なので
普通にインデックスとればそれが文字位置。

あとwstringはワイド文字で格納されているので
あえて言うなら全部sizeof(wchar_t)バイト文字。
その文字がマルチバイト文字に変換して何バイトかっていうのなら
エンコードによるし。UTF-8で日本語なら3バイトが多いとか。


25 名前:デフォルトの名無しさん :2005/08/16(火) 12:41:32
>>24
エンコードがUTF-16だった場合。

26 名前:デフォルトの名無しさん :2005/08/16(火) 13:00:48
ウインドウ内で画像を移動させたいのですが何度やっても上手くいきません。
色々調べてみましたが結局詰まってしまったのでご助言をお願いします。

以下描画部分(メッセージ処理の一部)を書きますが、それ以外で必要な部分があれば言ってください。
case WM_CREATE:
 SetLayeredWindowAttributes(hWnd, RGB(255, 0, 255), 0, LWA_COLORKEY);          //紫を透明に
 SetTimer(hWnd,1,100,NULL);
 break;

case WM_PAINT:
 hdc = BeginPaint(hWnd, &ps);
 ExtFloodFill(hdc, 1, 1, RGB(255, 255, 255), FLOODFILLSURFACE);
 hbmp = (HBITMAP)LoadImage(hInst, "BITMAP1",IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
 hdc_mem = CreateCompatibleDC(hdc);
 SelectObject(hdc_mem, hbmp);
StretchBlt(hdc, POSX, 0, 100, 100, hdc_mem, 0, 0, 100, 100, SRCCOPY);             //POSXは変動
 EndPaint(hWnd, &ps);
 break;

--続く


27 名前:デフォルトの名無しさん :2005/08/16(火) 13:01:52
続き--

case WM_TIMER:
 hdc = BeginPaint(hWnd, &ps);
 ExtFloodFill(hdc, 1, 1, RGB(255, 255, 255), FLOODFILLSURFACE);
 hbmp = (HBITMAP)LoadImage(hInst, "BITMAP1",IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
 hdc_mem = CreateCompatibleDC(hdc);
 SelectObject(hdc_mem, hbmp);
StretchBlt(hdc, POSX, 0, 100, 100, hdc_mem, 0, 0, 100, 100, SRCCOPY);             //POSXは変動
 EndPaint(hWnd, &ps);
 break;

紫を透明色にし、ウインドウのメニュー・枠線を消して画像だけを表示させることをしようとしています。
WM_TIMERは何度も通っているのを確認、POSXの値は変わっています。
一度WM_PAINTで描画するとどうやってもウインドウ内の位置は変わらないようです。
環境はWindowsXP VC++.NETです。

28 名前:デフォルトの名無しさん :2005/08/16(火) 13:07:41
>>24
とりあえずatとかsubstrでn文字目を取り出すことができるっぽいことは発見しました。
実は簡単なテキストエディタを作ろうと思っているのですが、
折り返し部分(ウィンドウ幅に合わせて自動で折り返したい)やカーソルの指している部分が
何バイト文字で先頭から何ドット目であるかなどを調べて、
その部分で文字列を分けたり挿入したりしたいです。
結局そういったことをするにはテキストを何型で持ってればよいのでしょうか。
あちらを立てればこちらが立たずという感じでワケがわからなくなってきました。

29 名前:デフォルトの名無しさん :2005/08/16(火) 13:09:00
>>26-27
スレ違い、なんだけども、誘導先のスレがわからない。
↓これでいいか?
★初心者にVisual C++を教えるスレ★ Part20
http://pc8.2ch.net/test/read.cgi/tech/1120222322/

30 名前:デフォルトの名無しさん :2005/08/16(火) 13:12:30
>>29
誘導ありがとうございます。
そちらに書いてきます。

31 名前:デフォルトの名無しさん :2005/08/16(火) 13:16:50
>>28
wstring で持ってて「こちらが立たず」という例は、どれだ?

32 名前:26-27 :2005/08/16(火) 13:56:42
誘導先のスレにて解決できましたので報告までに。

33 名前:デフォルトの名無しさん :2005/08/16(火) 13:58:49
>>26
WM_PAINTに応答するとき以外はBeginPaint, EndPaintを呼んでは駄目だ。
どうせ更新領域が空でなにも描画されてないんだろ。

34 名前:28 :2005/08/16(火) 14:19:15
>>31
もちろん私が知らないというだけできちんと方法はあるのかもしれませんが、
例えばマウスクリックした位置にエディタのカーソル(キャレット)を移動し、
そこに文字列を挿入したいとします。
マウスの座標を取得し「その座標の位置にある文字が何文字目であるか」が
取得できればinsertとか使えると思うのですが、
wstringの場合、文字列の先頭から1バイト文字かマルチバイト文字かを判断し
1バイトなら8ドット、2バイトなら16ドットのように足していって
座標値を割り出すことができないのでマウス座標との判定ができなそう、、、など。

あとはIMEで漢字変換したとき、WM_CHARが連続して流れてくるみたいなんですが、
WPARAMをwstringの文字列に突っ込んでもうまくいかないようで、
文字化けしたようになってきちんと表示できませんでした。
stringの場合はそのまま突っ込んでもきちんと表示できていたので、
じゃあstringを使おうかなと思ったのですが、
これだと今度はマルチバイト文字を使った時に「文字単位」で操作できないし、、、
などです。

35 名前:デフォルトの名無しさん :2005/08/16(火) 14:26:47
>34
そんなことしなくともテキストエディタ作ってやればいいんじゃないかな?
SetDlgItemTextで貼り付けてやって、そいつを編集後、
GetDlgItemTextで取得
テキストエディタなら入門本にいくらでもある
それとも、テキストエディタじゃ駄目なのかな?

36 名前:28 :2005/08/16(火) 14:31:16
>>35
ゲーム作ろうと思ってるので、それほど高度なものは必要ないのですが、
Windowsのコントロールの貼り付けとかせずに自前のものを作りたいのであります。

37 名前:デフォルトの名無しさん :2005/08/16(火) 17:59:07
stringでいいんじゃね?
っていうかGetTextExtentPoint32使えばいいんじゃね?
GetCharWidth32とかも使えるんじゃね?

38 名前:デフォルトの名無しさん :2005/08/16(火) 18:20:24
もの凄いくだらない質問なのですが、
配列を、ある地点から降順で検索するときの、「スマートな」書き方があれば教えて頂けないでしょうか
(ある地点が0(先頭)の場合もあります)

39 名前:38 :2005/08/16(火) 18:29:21
Cスレにすべきだた…私のスマートじゃ無さそうなのはこんな感じです
なんか上手い人ならfor文だけでできそうな気がするんです

if( a_position == 0 ) //a_position : インデックスのある地点
 hoge( *array );
else
 for( int i = a_position; i >= 0; --i ) hoge( array[i] );

40 名前:デフォルトの名無しさん :2005/08/16(火) 18:42:06
[begin, a_position + 1)で探索するだけやがな…

41 名前:デフォルトの名無しさん :2005/08/16(火) 18:43:21
検索?用語は正しく使ってくれ…

42 名前:38 :2005/08/16(火) 18:50:01
>>40
降順でやりたいので…
>>41
手元の教本(英語)だとretrieveとあったので

スレ違いっぽいですし質問撤回します

43 名前:デフォルトの名無しさん :2005/08/16(火) 20:09:32
>>38
リバースイテレータ

44 名前:デフォルトの名無しさん :2005/08/16(火) 20:40:57
>>34
バイト数で文字幅が決まるとは限らない。
そうなるように設計されたエンコーディングと描画処理を使ってるなら別だが。

WM_CHAR はマルチバイトシーケンスが1バイトずつ送られてくるから、
チェックとバッファリングが必要
ってこのサイトに書いてあったよ。
http://www.google.co.jp/search?q=WM%5FCHAR+Multibyte

45 名前:デフォルトの名無しさん :2005/08/16(火) 20:41:29
>>36
高度なものが必要ないなら、なおさらOSやライブラリに任せるべきじゃないの?

46 名前:デフォルトの名無しさん :2005/08/16(火) 21:16:25
>>39
これって条件分岐に何の意味があるん?

47 名前:28 :2005/08/16(火) 21:19:40
>>37
GetTextExtentPoint32とか調べてみたのですが
描画もフォント作成もDirectXをつかうのでhdcを渡さないといけないのが何か。。。
なのでやはり先頭から順にバイトで調べる方法が使える型の方がいいのかなーとか
考えてるんですが整理できないです。
>>44
文字の大きさ指定して等幅フォントつかったとしても
バイト数だけでは判断できるとは限らないって事でしょうか?
例えば2バイト文字でも半角幅の文字がある、とか。
>>45
機能面で高度なもの(アンドゥとかコピペとか)はいらないのですが、
DirectXと標準コントロールを混在させると画面がちらついたり
するらしいし、見た目も気に入らないのでちょっと自作に拘りたいのです。

48 名前:デフォルトの名無しさん :2005/08/16(火) 22:31:13
>47
文字を自前描画しているなら、wcharのあるコードポイントが
何ドットを占めているかは簡単に調べられるだろう。
 あとは、だんだん延ばして(減らして)いって変換するだけではないのか?

49 名前:28 :2005/08/16(火) 22:51:35
>>48
よくわからないのですがwcharってwstringみたく半角アルファベットとかでも
マルチバイトで持ってるんじゃないんでしょうか?
簡単に調べられるというのは具体的にどうやって調べればよいでしょうか。
自前描画といっても、フォントと文字サイズを指定してconst char*を渡すと
勝手に書いてくれるDirectXの関数を使っているだけなのですが、、、

50 名前:デフォルトの名無しさん :2005/08/16(火) 22:59:58
とりあえず、もうちょっと詳しく状況を寄越せ。後でボロボロ追加情報を出すな。
あとはスレ違いだからあっち逝け
http://pc8.2ch.net/test/read.cgi/tech/1122031254/l50

51 名前:デフォルトの名無しさん :2005/08/16(火) 23:12:15
>>47,49
さんざん言われてるキーワード「エンコーディング」ぐらい調べてから出直せ。

52 名前:28 :2005/08/16(火) 23:23:06
>>50
自前描画してるなら〜と言われたので、
描画はただDXの関数使ってるだけだしそれがドット数調べたいのと
何の関係があるのかなーと思いつつ説明しただけでして、
あとはDirectXは標準コントロールを使えない理由として
挙げただけですからDirectXスレは全然関係ないと思うのですが。

>>51
エンコーディングって言うと文字コードの話でないでしょうか?
型の事とはまた少し別なような気がするのですが。。。

53 名前:デフォルトの名無しさん :2005/08/16(火) 23:27:06
文字列を、DirectXの関数(どーせGDIラッパのID3DXFontだろうけど)
つかって描画をしている。その(部分)文字列の長さがほしい。
なら、当然DirectXスレか、3歩譲って、Win32APIスレだろ。

54 名前:デフォルトの名無しさん :2005/08/16(火) 23:29:02
>>52
何が関係が有るのか無いのか判断できるほどオマエは賢くない。
もう一度言うが、まずはここで言われたことを自分で調べて、理解し、
それでもC++に関する質問が残っていればまた来い。

55 名前:28 :2005/08/16(火) 23:31:09
文字列操作とか型の相談でして
別に描画に何を使おうが関係ない話だと思うんですが。

56 名前:デフォルトの名無しさん :2005/08/16(火) 23:33:38
>>55 オマエが思ったことなら正しいとでも言うつもりか?いいかげんにしろよ。

57 名前:デフォルトの名無しさん :2005/08/16(火) 23:37:38
wstring使え。環境との間で問題が出るのは、wstringの使い方が間違ってる。以上。
これでいいのか?

58 名前:28 :2005/08/17(水) 03:49:09
そんなにここで質問するのが気に入らないんですか?
気に入らないなら見なきゃいいじゃないですか。

59 名前:デフォルトの名無しさん :2005/08/17(水) 04:45:19
>>28はプログラムのお勉強の前に
日本語の読み取り能力とコミュニケーション能力を養え

60 名前:デフォルトの名無しさん :2005/08/17(水) 05:48:48
そして誰一人として納得させられる回答を提示できないという事実。
それどころか質問の意図すら汲み取れず
しまいにゃ意味不明な逆切れで全然関係ないスレに誘導。

61 名前:デフォルトの名無しさん :2005/08/17(水) 08:09:30
回答の意図を汲み取れない人発見。
負け犬の言い訳はいつも同じだな。

62 名前:デフォルトの名無しさん :2005/08/17(水) 08:35:01
>>34
>wstringの場合、文字列の先頭から1バイト文字かマルチバイト文字かを判断し
>1バイトなら8ドット、2バイトなら16ドットのように足していって
>座標値を割り出すことができないのでマウス座標との判定ができなそう、、、など。

もちろんその方法では出来ない。
wchar_tの幅(ピクセル数)を得る標準的な方法は存在しない。
よってスレ違い。

>あとはIMEで漢字変換したとき、WM_CHARが連続して流れてくるみたいなんですが、
>WPARAMをwstringの文字列に突っ込んでもうまくいかないようで、
>文字化けしたようになってきちんと表示できませんでした。

IME、WM_CHAR、WPARAMと言っている時点で当然スレ違い。

>stringの場合はそのまま突っ込んでもきちんと表示できていたので、
>じゃあstringを使おうかなと思ったのですが、
>これだと今度はマルチバイト文字を使った時に「文字単位」で操作できないし、、、
>などです。

できないのではなく、やりにくいだけ。
マルチバイト文字をどう判別したらいいかはエンコーディングや環境に依存する。
よってスレ違い。

このようにスレ違いのオンパレードにもかかわらず、多くの人が親切にもヒントを与えてくれている。
>>28はもう少し自分で考え、分からない事を明確にした上でもう一度質問してくれ。
どうやるか迷っているのは分かるが、決めるのはあなただ。


63 名前:デフォルトの名無しさん :2005/08/17(水) 08:37:37
本買って勉強しる

64 名前:デフォルトの名無しさん :2005/08/17(水) 11:54:37
スレ違いって言われた時点でとっとと移動しないところが一番悪いな。
それは〜の話だって言われてもググりもせずに関係ないとか言って無視してるし。

65 名前:デフォルトの名無しさん :2005/08/17(水) 12:38:53
UTF8とかシフトJISはstd::string?wstring?
どっちにしてもatとかfindは機能しなくない?

66 名前:デフォルトの名無しさん :2005/08/17(水) 12:51:03
DXスレに誘導してた馬鹿が一人で頑張ってますね。

67 名前:デフォルトの名無しさん :2005/08/17(水) 13:00:58
そもそもテキストエディタを作るのに、無理にbasic_stringを使う必要はない。
適していると思うデータ構造を自分で選んで使いなさいw


68 名前:デフォルトの名無しさん :2005/08/17(水) 13:03:57
それを決めあぐねて助言を求めてるんだろう?

69 名前:デフォルトの名無しさん :2005/08/17(水) 13:21:54
エディタの人ではないのだが。
いつもユニコードに変換してCStringとかBSTRで処理してるから
標準ライブラリ使ってる人はどうしてんのかと思っただけ

70 名前:デフォルトの名無しさん :2005/08/17(水) 13:37:47
>>65
UTF-8は普通UCSに戻して処理するだろ。
SJISは場合によっては16bit化してwstringにつっこむこともある。

71 名前:65 :2005/08/17(水) 14:00:22
了解。

72 名前:デフォルトの名無しさん :2005/08/17(水) 14:13:44
あとはマルチバイトに対応した文字処理関数とか文字列クラスを自分で作るくらいかなぁ。


73 名前:28 :2005/08/17(水) 17:05:29
えー、なにやら偽者が出てますが、テキストはwstringをとりあえず使っとけ
ということだったのでとりあえずそれを使うことにしました。
あと文字幅を調べるのは教えていただいたGetTextExtentPointを使って調べる事にしました。
これはhdcを作ったりDirectXに渡すのと同じフォントを重複して作るのが
気持ち悪くてなんとなく使うのが嫌だったのですが、
これだと太文字使っても文字幅とれるみたいで予想外に便利でした。
長々とお世話様でした。

74 名前:デフォルトの名無しさん :2005/08/17(水) 17:22:27
まったく関係ない話だが、
マルチバイト文字を操作する場合、対応するイテレータ
( Readable ( Forward or Bidirectional ) Traversal Iterator)
を最初に作成しておくと楽。
特に MS系コンパイラのマルチバイト文字列を扱う関数なんかは、
1文字を int で要求することが多いので、dereference で int を返すようなモノを
作成しておくと、後々便利なことも多い。

75 名前:デフォルトの名無しさん :2005/08/17(水) 17:25:05
なるへそ

76 名前:デフォルトの名無しさん :2005/08/17(水) 19:14:10
マルチバイトってBOMあるの?



77 名前:デフォルトの名無しさん :2005/08/17(水) 19:37:07
これもどうでもいい話だけど、Boost.Regex が ICU に対応したらしい。




78 名前:デフォルトの名無しさん :2005/08/17(水) 20:11:32
ここは相談スレだから関係ない独り言はスレ違いです。
はやくDXスレに行って下さい。

79 名前:デフォルトの名無しさん :2005/08/17(水) 20:14:00
>>78
ならばお前もだな

80 名前:デフォルトの名無しさん :2005/08/18(木) 00:27:14
>>76
Unicodeもマルチバイトだって事を知らないの?

81 名前:デフォルトの名無しさん :2005/08/18(木) 09:09:09
>>74
Bidirectionalって可能なの?
……一文字戻るのに定数時間で終わらなくてもいいなら可能かな?


82 名前:デフォルトの名無しさん :2005/08/18(木) 09:28:45
>>81
UTF-8 なら、1文字進めるのとほぼ同コストで可能。
SHIFT_JIS なら、MSコンパイラには _mbsdec がついてくるけど、
文字列の先頭位置へのポインタを要求するので、こちらは線形時間が必要。


83 名前:デフォルトの名無しさん :2005/08/18(木) 09:42:25
なるほど、UTF-8は判別できるようになっているんですね。
thx.


84 名前:デフォルトの名無しさん :2005/08/18(木) 10:17:40
EUCなら定数時間で判別できるのにねぇ。
SJISでも先頭からではなく、遡るアルゴリズムならかなり改善されるけど_mbsdecはどうなんだろ。

85 名前:デフォルトの名無しさん :2005/08/18(木) 10:43:42
>>84
CRTのソースを見る限り遡ってるみたいよ。
2バイト前がマルチバイト文字1バイト目でなければ、前の文字は確実に1バイト文字なので、1バイト戻る。
以降、マルチバイト文字1バイト目でないものが奇数バイト前に見つかれば、2バイト戻る。
偶数バイト前に見つかれば、1バイト戻る。


86 名前:デフォルトの名無しさん :2005/08/18(木) 16:04:39
インデントに全角空白を使ってますがご容赦を

class House{
  struct Hage{
  };
  class Oil{
  public:
    Hage* hage_generator();
  };
  Oil oil;
public:
  void hoge(){
    Hage* wonderful_hage = oil.hage_generator();
  }
};

Hage* House::Oil::hage_generator(){
  return new Hage;
}

クラス内クラスなんですが、これはコンパイル通りませんでして、解決には
hage_generatorをclass内で記述するか、Hageの宣言をHouseの外に出せば良いわけですが、
それ以外の方法でどうにかならないでしょうか

Houseでしか使えないHageを、出来ればHouseの外に出したくないんです

87 名前:デフォルトの名無しさん :2005/08/18(木) 16:06:19
>>86
ワロス

88 名前:デフォルトの名無しさん :2005/08/18(木) 16:08:49
>>86
House::Hage* House::Oil::hage_generator(){
^^^^^^^

89 名前:デフォルトの名無しさん :2005/08/18(木) 16:10:09
>>86
  return new House::Hage;
^^^^^^^
書き忘れ。ここも。

90 名前:デフォルトの名無しさん :2005/08/18(木) 16:12:55
>>88
お付き合いありがとうございます

実はそれも試したのですが、Hageはprivateだからダメよと窘められまして
もしかしてコンパイラのせいなんですかねぇ、規格斜め読み中です

91 名前:デフォルトの名無しさん :2005/08/18(木) 16:18:54
>>89
おお、そちらはやってませんでした
やっぱり通らないのですが、恐らく>>89氏の環境では通っていると思いますので
うちのコンパイラが古いせいっぽいですね

重ねて感謝です

92 名前:デフォルトの名無しさん :2005/08/18(木) 21:35:33
hageにかつらをかぶせたらprivateになった

93 名前:デフォルトの名無しさん :2005/08/18(木) 21:51:47
class Hage{
friend class House;
//以降全てprivate
private:



>Houseでしか使えないHageを、出来ればHouseの外に出したくないんです

つりか・・・

94 名前:デフォルトの名無しさん :2005/08/19(金) 12:50:51
hook 関連でSTLちっくに整理されてるライブラリーってないの?

95 名前:デフォルトの名無しさん :2005/08/19(金) 15:20:30
派生クラスでオーバーライドした仮想関数内で、delete *this;としたい状況にあるんですが、
派生クラスのコレクション(list<Base*>型)から削除するのが問題で、どのように書いたらいいのか困っています。

// 考えてみた方法1(Baseにコレクションを持たせるのはどうか?)
class Base {
public:
virtual ~Base()=0;
virtual void F()=0;
static list<Base*> obj_;
};

class Derived : Base {
public:
void F() {
obj_.erase(find(obj_.begin(), obj_.end(), this));
}
};

96 名前:95 :2005/08/19(金) 15:22:03
// 考えてみた方法2(オブジェクト毎に関数ポインタを持つオーバーヘッドが気になる)
class DoSomething {
public:
void Unregister(Base*);
void Action() {
obj_.push_back(Derived<DoSomething>(&DoSomething::Unregister));
//以下略
}
private:
list<Base*> obj_;
};

template <class Manager>
class Derived : Base {
Derived((typename Manager::*Unregister)(Base*)) : Unregister_(Unregister) {}
void F() {
(*Unregister_)(this);
}
private;
void (typename Manager::*Unregister_)(Base*);
};

どういう設計が良いのでしょうか?

97 名前:デフォルトの名無しさん :2005/08/19(金) 15:34:27
>>96 何がやりたいのかよくわからん

98 名前:デフォルトの名無しさん :2005/08/19(金) 15:48:21
質問の下手なやつばかりだなあ

99 名前:デフォルトの名無しさん :2005/08/19(金) 16:00:59
>>95
何がしたいかわからんが、Baseに任せた方がいいんじゃない?

class Base {
public:
virtual ~Base() { obj_.erase(find(obj_.begin(), obj_.end(), this)); }
virtual void F()=0;
static list<Base*> obj_;
};

class Derived : Base {
public:
void F() { delete this; }
};


100 名前:95 :2005/08/19(金) 16:23:41
>>99
すみません、仮想デストラクタをDerivedクラスでオーバーライドした場合でも、基底クラスのデストラクタはちゃんと呼ばれるんですか?

やりたかったことですが、
本来、list<Base*> obj_は継承階層にあるクラスとは関係ないクラスが持つもので、
継承階層にあるクラスからobj_へのアクセスが、循環依存?になるんじゃないかと設計に困りました。

101 名前:95 :2005/08/19(金) 16:33:01
あ、95の例は、
list<Base*>::iterator it = find(obj_.begin(), obj_.end(), this);
delete *it;
obj_.erase(it);
じゃないとだめですね。

102 名前:デフォルトの名無しさん :2005/08/19(金) 16:33:31
>>100
仮想デストラクタはもちろんトップレベルまで順次呼ばれる

循環依存? まだ何を問題にしているのかわからん

103 名前:95 :2005/08/19(金) 16:42:21
>>102
>> 仮想デストラクタはもちろんトップレベルまで順次呼ばれる
なるほど

>> 循環依存? まだ何を問題にしているのかわからん
まず、>>95の例は、Baseがstaticでコレクションを持つことに疑問を感じます(ポリモフィズムを利用するクラスが持つべき)。
ポリモフィズムを利用するクラスがコレクションを持つことになると、>>100の最後の1行。
そこで考えたのが>>96の例です。

104 名前:デフォルトの名無しさん :2005/08/19(金) 16:43:36
>>95
うーん、そういう設計の問題って、ソースに現れるようなものだけを提示しても仕方ないと思うよ。


105 名前:デフォルトの名無しさん :2005/08/19(金) 16:55:43
そもそも、どういう目的でコレクションを使うのかとか
格納されるオブジェクトは何なのか(なぜ派生するのか)
どういうときに削除したいのか
その辺を説明して欲しいな

106 名前:デフォルトの名無しさん :2005/08/19(金) 16:58:58
>>95
delete thisは避けて
listを持っているクラスが中のインスタンスもろとも消すのが適当だと思う
たとえばbool delete_meとかいうフラグを立てておくとか、
list経由でアクセスされる関数において削除要請を意味する値を返すとか。

107 名前:デフォルトの名無しさん :2005/08/19(金) 17:41:39
コンテナに入ったオブジェクトが自殺したいってことかな?
ならowner(listを持っているオブジェクト)に削除メソッドDeleteを持たせ
格納されたオブジェクトはownerへのポインタを持って、owner->Delete(this);
だろうなあ。

ただこれを呼んだ後returnするまでが危ないっていうなら、Delete()では
list_からdelete_list_に移し変えるだけにして
各オブジェクトの呼び出しが終わったらdelete_list_を一括deleteとかかね

参照カウントで同様の結果を得る方法もあるな

108 名前:95 :2005/08/19(金) 20:53:19
>>106
なるほど、理にかなってると思います。

>>107
Ownerクラスのあるメンバ関数内ではDerived::F()の呼び出し。
Derivedクラスのあるメンバ関数内ではOwnar::Delete()の呼び出し。
両方のクラスに、相手クラスの関数名を記述しあうことになり、気持ち悪さを感じるんですが、
その辺は、気にしなくてもいいことなんでしょうか。


「listへ格納するクラス」に削除フラグを返す関数を書いて、「listを保持・使用するクラス」から削除する事にします。
レス下さった方、ありがとうございました。

109 名前:デフォルトの名無しさん :2005/08/19(金) 21:43:08
>>108
終わったみたいだけど

>両方のクラスに、相手クラスの関数名を記述しあうことになり、気持ち悪さを感じるんですが、

直接参照するのがいやなら、インターフェイスとなる抽象クラスを間にかませば良いんじゃない?

110 名前:デフォルトの名無しさん :2005/08/19(金) 22:23:51
この質問後をたたないな。。

111 名前:デフォルトの名無しさん :2005/08/19(金) 22:39:53
実行速度について質問があります

Microsoft VisualC++6.0にて開発しています。
ファイルの読み込みについてなんですが
fstream経由で読み込むのと完全にC流で読み込むのではC流で読み込んだ方が
早い気がするんですが常識ですか?

112 名前:デフォルトの名無しさん :2005/08/19(金) 22:54:24
>>111
ライブラリ次第。
VC6.0付属のやつはfopen系使って実装されてるので
fstreamのオーバーヘッド分遅くなる。

113 名前:デフォルトの名無しさん :2005/08/20(土) 00:21:58
まあ、画期的な技術が開発されない限りは、

HDDのアクセス速度 >> fstreamやfopenのオーバーヘッド

であるのだろうけどね。

114 名前:デフォルトの名無しさん :2005/08/20(土) 00:36:46
継承と前方宣言について質問があります。

Aを継承したBというクラスを作ろうとして、
B.hのファイルでclass A;というプロトタイプ宣言をしたのですが、

コンパイラ エラー C2504
'class' : 定義されていない基本クラスが宣言されています。

と言われ、コンパイルできません。継承の対象クラスは実体を宣言しないとだめなのでしょうか?

115 名前:デフォルトの名無しさん :2005/08/20(土) 00:44:20
>>114
そのとおり
クラスが'定義'されていないと継承できない

116 名前:111 :2005/08/20(土) 00:45:18
>>112
>>113
即レスありがとうございました
fstreamとfopen両方の関数を適時つかえるようにするといった対処をすることにします

117 名前:114 :2005/08/20(土) 00:52:03
>>115
即レスありがとうございます。
ではそういう場合どのようにコーディングするのですか?
同じファイルに継承したクラスを記述するしかないのでしょうか。

118 名前:デフォルトの名無しさん :2005/08/20(土) 00:54:14
>>117
class Aなら a.hに書いて b.hでinclude "a.h"じゃろ

119 名前:デフォルトの名無しさん :2005/08/20(土) 01:08:56
>>118
たしかにその方法でできるのですが、
そうなるとmain.hのほうで宣言していた
#include "a.h"
#include "b.h"
のところで

コンパイラ エラー C2011'identifier' : 'type' 型の再定義
識別子が既に type として定義されています。このエラーは、タイプ ライブラリを同じファイルに 2 回以上インポートした場合にも発生します。

のエラーがでてしまいます。これはb.hだけインクルードすればよいのですか?

120 名前:デフォルトの名無しさん :2005/08/20(土) 01:12:11
>>119 ヘッダにインクルードガードつけろ。

121 名前:デフォルトの名無しさん :2005/08/20(土) 01:12:38
#ifndef
#endif

122 名前:114 :2005/08/20(土) 01:13:09
>>120
即レスありがとうございました。
ググってきます。ノシ

123 名前:114 :2005/08/20(土) 01:29:13
>>115,118,120,121
問題解決できました。
親切な回答ありがとうございました。

124 名前:デフォルトの名無しさん :2005/08/20(土) 02:28:09
メンバ関数へのポインタをSTLを使って管理したいのですが、
文法上 どうかけばいいのかわかりません。

現在
CGame
{
 public:
  static void Test();
};

vector< void (CGame::*)() > g_vFuncTable;

g_vFuncTable.push_back( &CGame::Test );

と コンパイルしてみたところ コンパイルエラーがでます。

代入が悪いのか、宣言が悪いのか、教えてもらってもいいでしょうか?

125 名前:デフォルトの名無しさん :2005/08/20(土) 02:35:11
何をやったらどんなエラーが出たわけ?

126 名前:デフォルトの名無しさん :2005/08/20(土) 02:45:15
>>124
メンバ関数の型は static かどうかで変わる。
その例だと、 CGame::Test の宣言が悪い( static が要らない)可能性が高いな。

127 名前:124 :2005/08/20(土) 02:46:49
>>125
上記のソースコードをコンパイルしたところ

g_vFuncTable.push_back( &CGame::Test );
のところで

以下のエラーがでました。
error C2664: 'push_back' : 1 番目の引数を 'void (__cdecl *)(void)' から 'void (__thiscall CGame::*const & )(void)' に変換できません。 (新しい機能 ; ヘルプを参照)
理由: 'void (__cdecl *)(void)' から 'void (__thiscall CGame::*const )(void)' へは変換できません。
この変換が可能なコンテキストはありません。

エラー内容が理解できないので、対処ができません。

128 名前:124 :2005/08/20(土) 02:58:55
>>126
CGame::Test の static 修飾子をはずしたら無事コンパイルできたのですが、

g_vFuncTable.push_back( &CGame::Test );

の次の処理

g_vFuncTable.at(0)();

の部分で

error C2064: 関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。

という コンパイルエラーがでてしまいました。

g_vFuncTable 変数を使って 代入した CGame::Test メンバ関数を呼びだしたのですが

どう書けばいいのでしょうか?

2重質問すいません

129 名前:デフォルトの名無しさん :2005/08/20(土) 03:09:31
>>128 .* または ->* いずれかの演算子を使う。

130 名前:デフォルトの名無しさん :2005/08/20(土) 03:10:22
>>127
普通の関数とクラスのメンバ関数ではポインタの型が違う。
ただの関数だとアドレスはひとつに決まるが、
クラスのメンバ関数だと
CGame dq;
CGame ff;
って二つあったとしたらどっちのTest関数やねんって感じ。
んで当然エラー。

>>128
んでC++ならあまりメンバ関数のポインタなんて使わない
そーゆーときは
interface ITest {
  virtual void Test() = 0; //インタフェースの定義
};

class CGame : public ITest {   //インタフェース継承して
 virtual void Test();         //インタフェースの実装
};
vector<ITest*> g_InterfaceTable;
とでもする。
眠いのでもう寝るけど適当にググってHP探すか
いろいろC++の解説本でも読んでください。

131 名前:デフォルトの名無しさん :2005/08/20(土) 03:10:46
>>128 ttp://www.google.co.jp/search?q=%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF

132 名前:124 :2005/08/20(土) 03:30:56
勉強不足ですね
どうもありがとうございました。

133 名前:デフォルトの名無しさん :2005/08/20(土) 19:14:48
名前空間の中にある変数はextern宣言できないんですか?

134 名前:デフォルトの名無しさん :2005/08/20(土) 19:46:49
>>133
できる

135 名前:デフォルトの名無しさん :2005/08/20(土) 20:13:18
どうやって?

136 名前:デフォルトの名無しさん :2005/08/20(土) 20:19:39
検索したらexternしなくても大域変数みたいでした

137 名前:デフォルトの名無しさん :2005/08/20(土) 20:30:33
>>136
意味不明
ここは貴様のチラシの裏じゃない

138 名前:デフォルトの名無しさん :2005/08/20(土) 23:42:24
宣言と定義の区別がついていないようだな

139 名前:デフォルトの名無しさん :2005/08/21(日) 18:18:24
namespace ns { struct X {}; }
のように構造体が宣言されているとき、あるブロックで
using ns::X;
と using 宣言するのと
typedef ns::X X;
のように型を定義するのでは何か違いがでるでしょうか?

140 名前:デフォルトの名無しさん :2005/08/21(日) 18:26:24
typedefだとfriendの対象にならなかったような気がする。

141 名前:デフォルトの名無しさん :2005/08/21(日) 18:32:31
>>139
理由は不明だが int X; って追加してコンパイルしてみると
using が通って typedef が通らない。

142 名前:デフォルトの名無しさん :2005/08/21(日) 18:59:22
gcc 3.4.4 だと、順番で挙動が異なる。
MSVCだと、どっちでも通る。

// OK
namespace ns { struct X; }
using ns::X;
int X;

// NG
namespace ns { struct X; }
int X;
using ns::X;

だめだ。 using を使いこなす自信が無い。

143 名前:デフォルトの名無しさん :2005/08/21(日) 19:22:32
コンパイラ依存だから使わないが吉

144 名前:デフォルトの名無しさん :2005/08/22(月) 00:28:52
>>142

X hoge ;//<-型はどっちになるんだろう?

145 名前:デフォルトの名無しさん :2005/08/22(月) 00:36:53
>>144 自分でやってみないのか?

146 名前:デフォルトの名無しさん :2005/08/22(月) 00:39:26
すまん、int Xか……。
ボケてた。

147 名前:デフォルトの名無しさん :2005/08/22(月) 00:52:27
struct A {
 int i;
 A(int x) : i(x) {}
 A() {}
};

struct B : public A {
 B(int x) : i(x) {}
};

で、Bのi(x)でエラーが出るのはなぜですか?
Aの i がそのままBに継承されると思ったのですが・・・・

148 名前:デフォルトの名無しさん :2005/08/22(月) 00:57:39
>>147
それができるなら
 B(int x) : A(0), i(x) {}
こんな場合に i の初期化が2通り存在してしまう。

149 名前:デフォルトの名無しさん :2005/08/22(月) 01:47:02
>>148
14882:2003§12.6.2.2.当たりでしょうか。

If a mem-initializer-id is ambiguous because it designates both a direct non-virtual base
class and an inherited virtual base class, the mem-initializer is ill-formed.

言われてみれば確かにそうです。Bの初期化リスト中にAのコンストラクタを
呼び出すようにするのが正しいようです。曖昧さを持たせないようにします。
ありがとうございました。

150 名前:デフォルトの名無しさん :2005/08/22(月) 03:58:14
JAVAをobjectorientまでやって今度はC++を学ぼうとしています。
JAVAはでっかいライブラリのページがあって
googleで使いたいメソッドの名前を予想したりして
打ってメソッドからメソッドへ(またはクラス)リンクで飛べてすぐに探せたのですが、
C++では探すのに結構苦労しています。
普段どのように探してるのか教えてください。
compilerとしてvisual studioを使ってます。

151 名前:デフォルトの名無しさん :2005/08/22(月) 04:45:40
>>150
MSDN
ってか、割れですか?

152 名前:デフォルトの名無しさん :2005/08/22(月) 08:03:37
>>150
一行目から既に意味不明

153 名前:デフォルトの名無しさん :2005/08/22(月) 11:23:35
今、ライブラリを作っているんだがコメントのつけ方で悩んでいる。
関数の詳しい説明を、
1) ヘッダファイルの関数宣言部分に書く
2) 関数の実装部に書く
このどちらがいいんだろう?

例えばhoge()があった場合、

(hoge.h) // 1)の場合の例
/*
 hogeする関数。
 [param]
   a : hogeのa用
*/
void hoge( int a );

(hoge.cc) // 2)の場合の例
/*
 hogeする関数。
 [param]
  a : hogeのa用
*/
void hoge( int a )
{
 hogehoge(a);
}

ライブラリと言っても、ほとんど自分専用で変更も多いので
.libファイルとかにまとめない予定。
おまいらならどうする?

154 名前:デフォルトの名無しさん :2005/08/22(月) 12:13:36
>>153
ちゃんと整備する気があるなら、利用者にソースを公開しない可能性を考えてインクルードファイルに書くのがいいのでは?
で、できればDoxygenスタイルに統一するといいかも。

あくまでも自分専用だと言うなら、使い方まで書きゃしないだろうから実装に書いた方がいいかも知れないけど。

155 名前:デフォルトの名無しさん :2005/08/22(月) 12:47:42
俺はヘッダーファイルを関数一覧表として見やすく保っておきたいから
実装部に書いてるな。

関数の使われかた(インタフェース)に関するコメントであって、実装
に関するコメントではないと考えるのならヘッダーファイルに書くのも一理あると思う。

どのみちDoxygenでドキュメントを生成するならどちらに書いても同じかもしれない。

ここ数年Doxygenというか、javadocスタイルでコメントを書いているけど
自分だけだったらソースを直接見た方が早いのであまりドキュメントを生成していなかったりする。

というか、コーディング規約スレか?


156 名前:デフォルトの名無しさん :2005/08/22(月) 13:09:53
ドキュメント生成なら、NaturalDocs マジオススメ。



157 名前:デフォルトの名無しさん :2005/08/22(月) 15:47:04
Doxygenよりもか?

158 名前:デフォルトの名無しさん :2005/08/22(月) 17:43:08
NaturalDocs はコメントの形式がきれいなのですき。

//
// Function: regex_replace
// -------------------------------------
// 正規表現置換を行う。
// -------------------------------------
// Parameters:
//  rex - 正規表現パターン
//  src - 置換対象文字列
//  rep - 置換文字列
//
// Returns:
//  置換された文字を返す。
//
string regex_replace( regex const & rex, string const & src, string const & rep )
{
 ...
}

ソースだけ見ても分かりやすい。

159 名前:デフォルトの名無しさん :2005/08/22(月) 18:39:33
見やすいかもしれんが
長い…

160 名前:デフォルトの名無しさん :2005/08/22(月) 22:52:01
プログラマの皆さん

関数やクラスの名前、はたまたプロジェクトやソフトウェアのいろいろな名前、

名前は飾りですか?

それとも、その機能(特徴)を的確に表し 短く覚えやすい名前をつけますか?


いざ名前をつけるとなると、自分の場合悩んで決めあぐねて困っています

私はこう付ける等のアドバイスやヒントを教えてください。お願いします。



161 名前:デフォルトの名無しさん :2005/08/22(月) 22:59:43
>>160
1行空け読みづらいな。しかも飾りですかって煽りですか
というかスレ違い

162 名前:153 :2005/08/22(月) 23:11:50
トンクス。
NaturalDocsよさげだな。
JavaDocでドキュメントを作ったことがあるんだが、
コメント形式が好きじゃないんでコメントからドキュメント作成は諦めてた。

ドキュメントが作れるならどっちに書いてもいいと思うんで、
なるべくヘッダを見やすくしたい俺は実装部に書くことにしました。

>> 160
名前は長くてもわかりやすいのを付けるようにしている。
といってもまだ学生で、プロジェクトに参加したことがないので
どんな形がいいのかよくわからないのですが。。。

163 名前:デフォルトの名無しさん :2005/08/22(月) 23:25:32
>>160
関数やクラスはその機能にあった名前をつける(というか、それ以外どうしろと)
ソフトの名前は、趣味で勝手に汁

164 名前:160 :2005/08/23(火) 00:24:25
>>161
煽りではないです 読みづらいのはすみません。

>>162 163
二人のレスをよく呼んで気づかされたんですが、 私が悩んでいたのは
関数やクラス名ではなくて、ソフト・プロジェクト名だったようです。
機能にあったわかりやすい名前を関数・クラスに付けるのは当たり前ですね。
さて、いよいよスレ違いくさくなってきたのでこれで最後のレスにします。

>>ソフトの名前は、趣味で勝手に汁
この言葉結構参考になりました。

165 名前:デフォルトの名無しさん :2005/08/23(火) 00:45:50
>>164
おまえキモイ

166 名前:デフォルトの名無しさん :2005/08/23(火) 00:50:13
禿同

167 名前:デフォルトの名無しさん :2005/08/23(火) 01:48:41
operator=の実装などでオブジェクト自身の参照を返したい場合、戻り値は
return *this;
と書けば希望通りに動作してくれるのでしょうか?

自分で試したいけど、PCぶっ壊れて試せない(;´Д`)

168 名前:デフォルトの名無しさん :2005/08/23(火) 01:50:03
OK

169 名前:デフォルトの名無しさん :2005/08/23(火) 09:22:55
>>167
operator=の戻り値の型をきちんと参照型にしておけよ?

170 名前:デフォルトの名無しさん :2005/08/23(火) 12:19:59
どうでもいいけど、何故そこに疑問符をつけるのだろう……

171 名前:デフォルトの名無しさん :2005/08/23(火) 12:52:21
自分に自信が持てないから

172 名前:デフォルトの名無しさん :2005/08/24(水) 20:54:13
OpenPNLコンパイルするだけで30分近くかかってるんですが
そういうものなの?
templateを多用されてるから?

173 名前:デフォルトの名無しさん :2005/08/24(水) 20:59:10
>>172
Firbirdのコンパイル(gcc3.3のコンパイル含む)に12時間かかった漏れに喧嘩売ってますか( ^ω^)
PHPやApacheのコンパイルも1時間以上余裕でかかるorz

つミP54C-133

174 名前:デフォルトの名無しさん :2005/08/24(水) 21:53:25
ペン4 2G とかでも30分かかります

175 名前:デフォルトの名無しさん :2005/08/24(水) 23:01:54
>>172,173,174
マシン余ってるならdistccを使おう


176 名前:デフォルトの名無しさん :2005/08/24(水) 23:09:14
>>175
稼働可能機がEPSON PC-286V-STDしか‥‥(;^ω^)

177 名前:デフォルトの名無しさん :2005/08/25(木) 15:39:40
上手なincludeの仕方(モジュールの分け方?)みたいなのが解説されている
サイトや書籍があったら教えて頂けないでしょうか。
172氏じゃないですが、どうもその辺が下手なせいで、コンパイル時間が長い気がしてなりません。

今のところ、ヘッダには、インラインを使う必要が無い限り、なるべく他のヘッダをincludeしないで
型宣言だけで済ます…くらいしか工夫をしていません(これ自体も良いのか悪いのか…)。

178 名前:デフォルトの名無しさん :2005/08/25(木) 15:42:17
コンパイル時間を減らすためなんてアフォラシス

179 名前:デフォルトの名無しさん :2005/08/25(木) 15:48:17
>>177
プリコンパイルヘッダとか活用汁

180 名前:デフォルトの名無しさん :2005/08/25(木) 15:53:08
依存度を下げる事が再コンパイル時間を減らす事につながるので、
コンパイル時間を減らすことはオブジェクト指向言語として、
最大の目標といっていい。

181 名前:デフォルトの名無しさん :2005/08/25(木) 16:03:00
>>179
やってはいるのですが、どうも…マシンが非力なせいもあるのですが

>>180
なるほど、コツとか近道は無くて、結局設計の腕を上げるしか無いと言うことですか

お二人ともありがとうございます

182 名前:デフォルトの名無しさん :2005/08/25(木) 16:34:49
>>178
お前がアフォ

183 名前:デフォルトの名無しさん :2005/08/25(木) 16:53:48
  _, ._
( ゚ Д゚) …

184 名前:デフォルトの名無しさん :2005/08/25(木) 17:33:17
というか、ヘッダファイルという考え方自体が、古いんだけどな。
どうしてもコンパイルが遅くなる。
苦肉の策としてVCはプリコンパイル済みヘッダという仕組みで早くしているけどね。

D言語とかうらやましい。

185 名前:デフォルトの名無しさん :2005/08/25(木) 18:07:53
かといって、#include がなくなると、

class bind_t
{
 ...
 #define BIND_RETURN return
 #include "bind/bind_template.hpp" // <- スクリプトでつくった実装ファイル
 #undef BIND_RETURN
};

のような事が出来なくなっちゃうので モジュール読み込み形式と、
テキスト展開方式の2パターンが欲しいところ。

186 名前:デフォルトの名無しさん :2005/08/25(木) 18:23:27
BCB使ってるけどC++コードとPascalコードじゃコンパイル速度洒落にならないほど違うしなあorz

187 名前:デフォルトの名無しさん :2005/08/25(木) 18:45:09
>>177
設計というより、実践寄りのものとして

大規模C++ソフトウェアデザイン
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894711249/

ビルドに1週間かかるシステムとかそういうものに対して、
徹底的に依存関係を減らす方法を説明してある。

188 名前:デフォルトの名無しさん :2005/08/25(木) 19:14:43
#nullpo

189 名前:デフォルトの名無しさん :2005/08/26(金) 12:34:04
#include "Global.h"

とかやってた事のある奴挙手

190 名前:デフォルトの名無しさん :2005/08/26(金) 14:43:56
cout << hex << 100 << endl;
ってやると16進数での100の表示が出ますが、
この結果をchar配列に詰めたいときはどうすればいいんでしょうか。

文法的には間違ってますが、
イメージとしては
char[10] buf;
buf << hex << 100;
みたいな感じ。

191 名前:デフォルトの名無しさん :2005/08/26(金) 14:50:40
>>190
stringstream

192 名前:デフォルトの名無しさん :2005/08/26(金) 14:56:09
char[]にこだわるなら処理系がstrstream使えるか調べろ。

193 名前:デフォルトの名無しさん :2005/08/26(金) 15:03:57
sprintf(buf, "%X", 100);

194 名前:190 :2005/08/26(金) 15:16:03
>>193
あ、むっちゃ簡単じゃないですか。
ありましたね、そういうの。すみません。

>>191-192
ありがとうございます。

195 名前:デフォルトの名無しさん :2005/08/26(金) 20:07:06
テンプレートクラス内で型定義して

template <class T>
class Hoge{
  typedef vector<int> Array;   //新しい型の定義
  static Array staticData;    //定義した型の静的メンバ変数を使う
};

//cppファイルで静的メンバ変数の実体を
template<class T>
vector<int>     Hoge<T>::staticData;
ならOKですが

template<class T>
Hoge<T>::Array   Hoge<T>::staticData;
とやってもHoge<T>::Array型を作る事ができずエラーになってしまいます。
この場合の書式はどのようにすればいいのでしょうか?
コンパイラはVC2003です。


196 名前:デフォルトの名無しさん :2005/08/26(金) 20:13:36
>>195
template<class T>
typename Hoge<T>::Array Hoge<T>::staticData;


197 名前:デフォルトの名無しさん :2005/08/26(金) 20:53:04
>>196
なるほど、typenameですか。
どうもありがとうございました。

198 名前:デフォルトの名無しさん :2005/08/26(金) 20:56:40
hoge.hhに

class hoge {
private:
static const string name[3];
};

とあって、hoge.cc内に

const hoge::name[0] = "aho1";
const hoge::name[1] = "aho2";
const hoge::name[2] = "aho3";

とやると
error: conflicting types for `const std::string
hoge::name[1]

と怒られます。
member内のstatic constに配列は扱えないのですか?

199 名前:198 :2005/08/26(金) 21:09:18
const hoge::name[3] = {"aho1", "aho2", "aho3"};
で出来ました。スレ汚しスマソ。


200 名前:デフォルトの名無しさん :2005/08/26(金) 21:55:56
クラステンプレートの中にメンバテンプレートを持たせたとき、
メンバの宣言と定義をわけて書く場合は、下のような感じでいいんでしょうか。
(これが一般的でしょうか、という意味です。試行錯誤でコンパイルが通るようになった結果がこれです)

template <class T> class A{
public:
A(T t){ }
template <class S> void f(S s);
};

template <class T> template <class S> void A<T>::f(S s)
{
}

「template <class T>」「template <class S>」の位置はこれでいいのかな、と。
たとえば「const C&」と「C const&」が同じ意味を持つように、上の例でも
他の書き方があったりしますか?

201 名前:デフォルトの名無しさん :2005/08/26(金) 22:56:34
>>197
なぜ typename が必要かわかってるのかなあ?

>>200
template<typename T> template<typename S> void A<T>::f(S s)
って、およびでない?


202 名前:200 :2005/08/26(金) 23:12:41
>>201
(・∀・;)あぁ、それも他の書き方ですね。
キーワードの順序的にはこれしかない(これが普通)ってことですか。

203 名前:デフォルトの名無しさん :2005/08/27(土) 19:06:21
Fedora Core 2でUSB<->Serial変換を使って制御をやっています。
自前のclassですが、基本はC標準のread()とwrite()を使ってのやり取りです。
Win 2kのハイパーターミナルで通信するのに比べると、
FC2でreadする動作速度が遅いようです。

何かreadを高速化させる方法と言うのがあるんでしょうか?
タイミングの問題でしょうか。

204 名前:デフォルトの名無しさん :2005/08/27(土) 20:35:52
>>203

UNIXプログラミング質問すれ Part6
http://pc8.2ch.net/test/read.cgi/tech/1116908090/

205 名前:203 :2005/08/27(土) 22:29:11
>>205
逝ってきます。

206 名前:デフォルトの名無しさん :2005/08/27(土) 23:18:31
1つ以上の要素を持つ STL コンテナから end() で反復子を取得し、それをデクリメント
した場合、その反復子はコンテナの最後の要素を示すようになるのでしょうか?

207 名前:デフォルトの名無しさん :2005/08/27(土) 23:21:05
>>206
そのコンテナのイテレータが ForwardIterator なら、大丈夫。
標準コンテナならすべて大丈夫。

208 名前:デフォルトの名無しさん :2005/08/28(日) 00:57:26
>>207 さんありがとうございます。

ということは std::list のようなノード型コンテナはダミーのノードを内部に持っているのでしょうか?
もしくは反復子の内部にノードのポインタ以外の情報も持っているのでしょうか?

209 名前:デフォルトの名無しさん :2005/08/28(日) 01:03:03
>>208
std::list なら実装がヘッダファイルに書いてあるはずだから、それを見るといいよ。

210 名前:デフォルトの名無しさん :2005/08/28(日) 01:45:13
exportが使えるようになるのはいつだろう…

211 名前:デフォルトの名無しさん :2005/08/28(日) 01:50:52
>>207
Bidirectional iteratorsの間違い?

212 名前:207 :2005/08/28(日) 01:53:31
>>211
あ、そうか。 ForwardIterator だけじゃデクリメントが無いな。間違い。

213 名前:デフォルトの名無しさん :2005/08/28(日) 08:08:54
>>210
ttp://www.comeaucomputing.com/

214 名前:デフォルトの名無しさん :2005/08/28(日) 16:26:51
質問させてください。
以下のようなプログラムを作り、g++でコンパイルして動作確認をしました。
//////// ここから////////
#include <iostream>

class Test {
public:
  void print(char *msg) {
    std::cout << msg << std::endl;
  }
};

int main() {
  Test t1; t1.print("First print()");
  Test().print("Second print()");
  (new Test)->print("Third print()");

  return 0;
}
//////// ここまで ////////
質問内容は次のレスに続きます。

215 名前:デフォルトの名無しさん :2005/08/28(日) 16:36:58



















続かねーよバーカ。

216 名前:214 :2005/08/28(日) 16:44:20
main関数内1行目は普通に宣言してメソッドを使っているので
うまく動いて当然であり、なんら疑問はありません。

main関数内3行目は、
Test *pt = new Test;
という記述が使えることと、operator newがポインタを返すことから
(new Test)が新しいTestオブジェクトへのポインタであると予想して
記述しました。結果は予想どうりうまく動きましたが、本当に
この予想はあっているのでしょうか?

一番の疑問点はmain関数内2行目で
コンストラクタは返り値が無いはずなのにTest()があたかも
オブジェクトそのものである様に働いている点です。
いったいこれはどういう理屈なのでしょうか?

本屋で立ち読みして答えを探そうとしたのですが、
キーワードが分からずどこを探せばよいのか分かりませんでした。
もしよろしければ、何か手掛かりになるものを教えてもらえないでしょうか?

217 名前:デフォルトの名無しさん :2005/08/28(日) 17:01:05
>>216
new Test については、予想も何も「新しいTestオブジェクトへのポインタ」を返すのが new の仕様。
予想はあっているが、予想して使うものではない。
あと、一般的には new で得たポインタは後で delete できるように扱うべき。

Test() は Test 型のテンポラリオブジェクト(一時オブジェクト)を作る式。
つまり Test() はオブジェクトそのものとみなせる。

218 名前:デフォルトの名無しさん :2005/08/28(日) 17:03:56
>>216
そのTest()はコンストラクタじゃなくて一時オブジェクト。

219 名前:デフォルトの名無しさん :2005/08/28(日) 17:05:02
2分もたってかぶってたスマソ

220 名前:デフォルトの名無しさん :2005/08/28(日) 17:05:13
>>216
>結果は予想どうりうまく動きましたが、本当に
>この予想はあっているのでしょうか?
合ってる。

>一番の疑問点はmain関数内2行目で
>コンストラクタは返り値が無いはずなのにTest()があたかも
>オブジェクトそのものである様に働いている点です。
>いったいこれはどういう理屈なのでしょうか?
Test()は一時オブジェクトの明示的生成。
Test().print("Second print()")
という式全体の評価が終わったあと自動的に解体される。

221 名前:220 :2005/08/28(日) 17:06:10
うおw 俺もスマソ

222 名前:デフォルトの名無しさん :2005/08/28(日) 17:09:09
一時オブジェクトってスタックに取られるんだろうなやっぱ。
でかいオブジェクトを一時オブジェクトで作ると、スタックいっぱい消費する?

223 名前:デフォルトの名無しさん :2005/08/28(日) 17:13:03
>>222
スタックに配置される処理系なら、そうなる
(そうでない処理系は使ったことないが)

224 名前:214 :2005/08/28(日) 18:15:46
>>217,218,220
みなさん解説有難うございます。

つまり、例えば
Test t = Test();
これだと、一時オブジェクトを引数としてコピーコンストラクタが
呼ばれるということですね?

ところで、今回の「一時オブジェクト」はどの程度のレベルの本になら
書いてあるのでしょうか?中〜上級ぐらいの本でしょうか?

225 名前:デフォルトの名無しさん :2005/08/28(日) 18:20:30
もうちょっとマシな聞き方はできないのか?
プログラミング言語C++でも読んどけ。

226 名前:デフォルトの名無しさん :2005/08/28(日) 18:32:07
>>224 このサイトにいろいろ載ってるよ。 http://www.google.com/

227 名前:デフォルトの名無しさん :2005/08/28(日) 18:35:04
入門書にはあんまり載ってないかもね。
STL本だと結構使うから、さらっと説明される。

228 名前:214 :2005/08/28(日) 21:15:30
>>225,227
そのあたりの本を見てみます。
有難うございました。

229 名前:デフォルトの名無しさん :2005/08/28(日) 21:56:32
勉強のために、他人が書いた上手いコードを探しています。
感動したPDSやソースコードを紹介していただけますか?

230 名前:デフォルトの名無しさん :2005/08/28(日) 21:57:26
>>229 www.boost.org

231 名前:デフォルトの名無しさん :2005/08/28(日) 21:57:45
Loki

232 名前:デフォルトの名無しさん :2005/08/28(日) 22:23:13
Lokiもう一票
これ読んだ前後でC++観が変わった


233 名前:デフォルトの名無しさん :2005/08/28(日) 23:30:11
>>230, 231, 232
どうもありがとうございます。
コツコツみていきます。

234 名前:デフォルトの名無しさん :2005/08/29(月) 00:42:45
文字をURLエンコードするにはどうすればいいのでしょうか。

235 名前:デフォルトの名無しさん :2005/08/29(月) 00:45:03
void urlencode(char moji, char kekka[3])
{
 sprintf("%%%02X", (unsigned char)moji);
}

236 名前:デフォルトの名無しさん :2005/08/29(月) 00:45:39
↑ごめん、kekka[4]の間違い

237 名前:デフォルトの名無しさん :2005/08/29(月) 01:06:31
>>236
kekkaを使ってないし、sprintfの引数おかしいし。

238 名前:デフォルトの名無しさん :2005/08/29(月) 01:18:31
void urlencode(unsigned char moji, char kekka[3])
{
 sprintf(kekka, "%%%02X", moji);
}

239 名前:デフォルトの名無しさん :2005/08/29(月) 01:48:03
結果が返らんだろそれは。

240 名前:デフォルトの名無しさん :2005/08/29(月) 03:18:43


241 名前:デフォルトの名無しさん :2005/08/29(月) 12:51:33
結果は引き数経由で渡すから使い勝手は悪いな。

242 名前:デフォルトの名無しさん :2005/08/29(月) 13:03:03
std::string urlencode(char moji)
{
std::ostringstream oss;
if (moji == ' ')
oss << '+';
else
oss << '%' << hex << setw(2) << static_cast<int>(moji);
return oss.str();
}
こんなのとか(動作確認なし)


243 名前:デフォルトの名無しさん :2005/08/29(月) 13:53:09
文字列対応
std::string urlEncode1(const char * str)
{
std::ostringstream oss;
while (str[0] != '\0') {
if (str[0] == ' ') {
oss << '+';
} else {
oss << '%' << std::hex << std::setw(2) << static_cast<int>(str[0]);
}
++str;
}
return oss.str();
}

std::string urlEncode2(const char * str)
{
std::string rtn;
while (str[0] != '\0') {
if (str[0] == ' ') {
rtn += '+';
} else {
char tmp[4];
sprintf(tmp, "%%%02x", str[0]);
rtn += tmp;
}
++str;
}
return rtn;
}

244 名前:デフォルトの名無しさん :2005/08/29(月) 17:42:59
グローバルに
struct Map {
 int x;
 int y;
 //などなど
};

Map g_Map[4096*4096];  //もっと広いかもしれない
とかいう馬鹿でかいデータの確保に挑戦して失敗した場合
例外をキャッチするのは無理なのでしょうか?
どこかの関数内で動的に確保したほうがいいのかな。

245 名前:デフォルトの名無しさん :2005/08/29(月) 17:45:42
>>244
そこは一般にヒープではないし、起動に失敗するだけで例外は飛ばないかと

246 名前:デフォルトの名無しさん :2005/08/29(月) 18:01:24
でも大抵のコンパイラでデフォルト設定だとスタックオーバーフロー起こしそうだな‥‥

247 名前:244 :2005/08/29(月) 18:27:34
やばそうなので関数内で確保するようにしておきます。


248 名前:デフォルトの名無しさん :2005/08/29(月) 18:40:29
グローバル変数でいくらでかい変数とってもスタックオーバーフローにはならんだろ。


249 名前:デフォルトの名無しさん :2005/08/29(月) 19:09:22
>>247
関数内でとるのもいいけど、あんまりでかいデータを自動変数にすると、
スタックオーバーフロー起こす可能性があるから、ヒープに領域確保しておけ。
std::vector<Map> map( 4096 * 4096 ); みたいに。




250 名前:デフォルトの名無しさん :2005/08/29(月) 19:20:13
>>249
おとなしくvectorにしておきます。
ところで馬鹿でかい領域でもvectorのメモリアドレス連続性は保障されているのでしょうか?
std::vector<Map> map( 4096 * 4096 );
memset( &map[0], 0, sizeof(Map) * map.size() );
とやっても大丈夫でしょうか?




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