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


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

C++相談室 Part4
1 名前:デフォルトの名無しさん :01/12/23 10:38
v(^・^)v

Boost C++ Libraries
http://www.boost.org/
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/
GotW.ca Home Page
http://www.gotw.ca/
STLport
http://www.stlport.org/

C++相談室
http://piza.2ch.net/tech/kako/980/980175292.html
C++相談室 Part3
http://pc.2ch.net/test/read.cgi/tech/1003832761/l50

2 名前:デフォルトの名無しさん :01/12/23 10:40
終了。

3 名前:デフォルトの名無しさん :01/12/23 11:00
なんでやねん (笑

4 名前:デフォルトの名無しさん :01/12/23 11:03
v(^・^)v

5 名前:デフォルトの名無しさん :01/12/23 13:20
v(^・^)v

6 名前:デフォルトの名無しさん :01/12/23 13:43
v(^・^)v

7 名前:デフォルトの名無しさん :01/12/23 14:05
v(^・^)v

8 名前:デフォルトの名無しさん :01/12/23 14:14
v(^・^)v 

9 名前:デフォルトの名無しさん :01/12/23 14:55
v(^・^)v

10 名前:デフォルトの名無しさん :01/12/23 15:03
いい加減にしてくれ

11 名前:デフォルトの名無しさん :01/12/23 16:23
(More )?(Effective|Exceptional) C++ は結構話題にのぼるけど,
(Essential|Efficient) C++ ってどーよ?
書評キボンヌ

12 名前:デフォルトの名無しさん :01/12/23 16:27
>>11
推薦図書スレへ行け

13 名前: v(^・^)v :01/12/23 16:28
>>10-11
v(^・^)v

14 名前:デフォルトの名無しさん :01/12/23 17:25
v(^・^)v

15 名前:11 :01/12/23 18:01
>>12
あそこはすぐ荒れるから嫌.
C++ ネタならこっちでいーじゃんという話に過去スレでなったはずだし.

16 名前:デフォルトの名無しさん :01/12/23 18:21
結局、多重継承のあいまいさを解消する手段として
どれが一般的&エレガント?

class Base1 { void foo() {...} };
class Base2 { void foo() {...} };

class Hoge : public Base1, public Base2{
public:
 void bar(){Base1::foo();} //bar()の名はfoo()でいい
 using Base1::foo;
};
int main(){
 Hoge hoge;
 hoge.bar();  //1
 hoge.Base1::foo();  //2
 hoge.foo();  //3
 return 0;
}

17 名前:デフォルトの名無しさん :01/12/23 19:39
>>11
図書スレへ行け宣言はビギナーの参照なのでほうっておけ。
あとv(^・^)vに食いつくのも。わらい
>(Essential|Efficient) C++ ってどーよ?
私もちょっぴり気になっています。パラパラ見た感じは
Essentialは普通そうだけどもEfficientは面白そうだ。
結局このシリーズは全部よんどけってことになるんだろうか。
このシリーズは購入に悩むにはそれほど高くないし
なんか騙されている気もする。

18 名前:デフォルトの名無しさん :01/12/23 19:57
>>16
そんなもの答えがあるわけがない。
void bar(){Base1::foo();} ならきっとfooになにか
別名を付ける特別の操作を意識しているのだろう。
using Base1::foo;ならこちらの関数こそHogeに相応しい
ということなのだろう。
hoge.Base1::foo();なら何も決定できなかったということだ。
だがそれでも答えはきっとこうだ。
君のクライアントは君と同様スコープ解決演算子が大好きだ。

19 名前:11 :01/12/23 21:26
>17
>このシリーズは購入に悩むにはそれほど高くないし
マヂで!?3600円 はヲレにとっては悩む程高いんだよね.
いや,このテの本にしてはまぁ普通なのは分かるんだけど,金額の絶対値が
ヲレにとって高い(苦笑).

んで,
> なんか騙されている気もする。
の意味が良く分からないのでマジレスキボンヌ.
一応購入を検討中なんで・・・

20 名前:デフォルトの名無しさん :01/12/23 22:49
void Hoge::foo()
{
 Base1::foo();
 Base2::foo();
}

21 名前:デフォルトの名無しさん :01/12/23 22:58
オブジェクト指向初心者なのですが、教えて下さい。
スレッドAで、あるクラスオブジェクトを作成したとして
スレッドBからそのオブジェクトのメンバ関数を呼び出したとき
そのメンバ関数はどっちのスレッドで実行されるのでしょうか?

なんかもー・・・・脳味噌バーン

22 名前:デフォルトの名無しさん :01/12/23 23:02
>>21
「どっち」って、何と何??

23 名前:デフォルトの名無しさん :01/12/23 23:16
スレッドBから、そのあるクラスオブジェクトのメンバ関数を
どうやって呼ぶ場合のことをいっている?

24 名前:デフォルトの名無しさん :01/12/23 23:44
>>21
オブジェクト指向関係ねぇだろ。マルチスレッドの理解が足りない。
まさかJavaの話じゃないだろね?

25 名前:21 :01/12/23 23:47
あ、ボケてました・・・・基本的に呼び出せないですよね
この質問は無しでよろ〜(;´Д`)

26 名前:デフォルトの名無しさん :01/12/23 23:57
でも、おれもオブジェクト指向を始めたばっかりの時って、各オブジェクトが
それぞれ独立したスレッドで走っていて、いろいろメッセージのやりとり
しながら動いている、すげープログラム、ってな妄想があったよ。
もう20年近くも昔のことだが。
(あのころはスレッドなんて言葉、無かったかな?)

27 名前:デフォルトの名無しさん :01/12/23 23:59
>>26
そういうOSってあっても良さそうだよね
詳しくないけどMacOS XとかのMachなOSってそういう事なの?

28 名前:デフォルトの名無しさん :01/12/24 00:00
>>26
それはきっとCSPだ。

29 名前:デフォルトの名無しさん :01/12/24 00:27

バイナリのバイト列をできるだけ標準に近い形で、
しかも簡単に扱う一般な方法って何でしょうか?

使い方を限定すれば、
typedef std::basic_string<unsigned char> bytes;
でもいいんだけど、

バイナリなので、
struct char_traits<E>::length( const E *x );
が呼ばれたとき困るしね。

なんかいい方法ってないんでしょうか?

30 名前:デフォルトの名無しさん :01/12/24 00:54
>>29
vector<unsigned char>

31 名前:デフォルトの名無しさん :01/12/24 01:12
vectorは遅すぎんけ?

32 名前:デフォルトの名無しさん :01/12/24 01:15
ならvalarrayは?

33 名前:デフォルトの名無しさん :01/12/24 01:43
>>31
適度にreserve呼び出すかアロケータ書くかすればstringに比べて
遅いなんてこともないだろ。

バイト列なんか標準も何も用途に応じて適当なクラス作ればいいと
個人的には思うんだがね。プラットフォームに依存した物にもなり
やすいし。

34 名前:質問 :01/12/24 01:45
STLのstringって、シフトJISみたいなマルチバイト文字列を扱えます?

35 名前:デフォルトの名無しさん :01/12/24 01:54
>>34
basic_string<wchar_t>

36 名前:34 :01/12/24 02:09
>>35
wstringじゃなくて、1バイトコードと2バイトコードの混在する文字列を扱えるかどうかが知りたいのですが・・・。
というか、多分扱えないとは思うので、stringでマルチバイト文字列を扱うとき
みなさんはどうやっているのか聞きたいのです。

stringの内容を書き換えない場合は、operator const char*()があるから
そのままCライブラリに投げればいいとして、
stringの内容を書き換える場合、たとえば部分文字列の置き換えなんかはどうしたら良いのでしょうか?

37 名前:デフォルトの名無しさん :01/12/24 02:28
>>36
std::stringもマルチバイト文字は扱える。
ただし、文字単位でなくバイト単位の操作になる。
(size()とかはバイト数を返す)

38 名前:デフォルトの名無しさん :01/12/24 02:32
>>36
そこが文字の区切りかどうか判別するアルゴリズムかけば? その場合
常に文字列先頭から走査することになって面倒だけど。

自分はどうしているかというと、UTF-16しか使わないので問題ない。

39 名前:デフォルトの名無しさん :01/12/24 02:33
>>36
std::stringをメンバに持つmulti-byte stringクラスを作ってそれを使うようにしてる。
std::stringのメンバをpublicにしとけば、それに対するアクセスもできるしな。
で、そのクラスもchar_traitsみたいな、multi-byte string用の操作情報を与えれるようにすれば
複数の文字コードにも対応できるしな。

折れはそうしてる。

40 名前:デフォルトの名無しさん :01/12/24 02:40
> 自分はどうしているかというと、UTF-16しか使わないので問題ない。
うらやましい。。
UTF-16だと、JISとかに変換する場合に一意な変換ができんから使えんことが多い。

41 名前:デフォルトの名無しさん :01/12/24 02:44
> 自分はどうしているかというと、UTF-16しか使わないので問題ない。
そうか?
結局サロゲートの処理が必要になるから、
マルチバイトの処理と変わらんだろ。

42 名前:デフォルトの名無しさん :01/12/24 02:57
まともな相談なんだが、
ソース中の関数を列挙しようと思う。
...(){}..のパターンを捕まえてひとつに数えるんだが、
判定として()と{}の間が空白であるという条件を使いたい。
そうしないと変なEnum{}とかa={{},{}};とか関数で
ないのが引っかかってしまう。

ってことで、空白の種類なんだけど、スペースとタブと改行、
それ以外にコンパイラが空白と認識する文字ってあるのかな。
それと、スペースは0x20,改行はテキスト形式で\r\n,タブがわからない・・・
です。

43 名前:34 :01/12/24 03:04
レスどうもです。
やはり有りものでは無理で、
>>36 の方がおっしゃるように、
独自クラスを派生させるのが一番確実のようですね。

44 名前:デフォルトの名無しさん :01/12/24 03:23
>>42
コメントも空白のはず。
タブは '\t'。
テキストしかツールに渡さないのなら、0x20 以下は一律に空白と見なしても問題無いと思う。

45 名前:デフォルトの名無しさん :01/12/24 03:32
>>42
関数を列挙するツールを使った方がはやいぞ。
freewareでその辺にある。

46 名前:デフォルトの名無しさん :01/12/24 08:24
>>42
そういうのって正規表現ライブラリとか使った方が楽ちんじゃない?
関数名列挙なら /^\w+.*\)$/ だけでも十分抽出できるし。

47 名前:デフォルトの名無しさん :01/12/24 09:24
>>42
isspace でいいんじゃないの

48 名前:デフォルトの名無しさん :01/12/24 09:40
>>19
元々web連載をまとめたものなんだから
まとめて一万くらいで十分と思うんだが5,6冊に分けていて姑息だと。

49 名前:19 :01/12/24 11:35
>48
> 元々web連載をまとめたもの
えっ!?そーなんだ.知らなかった・・・
でもまぁそーゆー事なら僕にとっては日本語訳してあるだけでも価値があるからいいや.
お答えサンクスコ

50 名前:初心者 :01/12/24 12:10
日本語処理がわかりません…。
例えばフルパスからファイル名とか取るとき、
『\』を検索して切り取ると最後のファイル名に
『ソ』とかあるとき変なところで切れてしまします。
VC++のヘルプを見てもいまいちよくわかりません…。

51 名前:デフォルトの名無しさん :01/12/24 12:19
Windowsでファイルパス扱うなら素直に_splitpath()。
一般論だと、SJISの場合文字列先頭からみていくしかない。
isleadbyte()参照。
オススメは一旦Unicodeに変換。サロゲートペアなんざ無視。

52 名前:デフォルトの名無しさん :01/12/24 12:24
最悪を絵に描いたような質問法ですね。
あと「一週間位まえから必死で頑張ってるんです!!」
とかあれば100点だと思います :-)

53 名前:初心者 :01/12/24 12:27
どうもありがとうございます。

54 名前:デフォルトの名無しさん :01/12/24 12:28
オススメは一旦UTF-8に変換。サロゲートペアなんざない!

55 名前:初心者 :01/12/24 12:29
>>52
すみません…気をつけます。

56 名前:デフォルトの名無しさん :01/12/24 12:35
Efficient C++は、ボトルネックになっている所をチューンアップする必要がある
プログラマは参考になると思うよ。ライブラリ開発者とか。

アホアホプログラマに読ませると害が大きいと思うな。
大局に影響のない不必要チュウニング馬鹿はどこにでも出没するので。

57 名前:デフォルトの名無しさん :01/12/24 13:51
>>51
UNICODE というか wchar_t にしてしまえば良いと思うが。

wchar_t はあくまでワイド文字 1 文字であって、サロゲートペアなぞ気にしなくていいはず。そもそも wchar_t
の符号化方式が UTF-8, UTF-16 あるいは ISO 2022 ベースの何かとかも規定されていないし、Win32 だと
wchar_t はサロゲートペアなしのサブセット版 UTF-16 (16 ビット固定長) じゃない?

58 名前:デフォルトの名無しさん :01/12/24 14:02
>>57
VC++でWindows前提ならMultiByteToWideChar/WideCharToMultiByte
使ことになるだろうから、まぁUnicodeだろうと。ってこのAPI、変換が怪しいし、
サロゲートペアに対応してたかどうか知らないけど。
いずれにせよstring<->wstring変換関数は適当に自前で用意だろうな。
内部的にどういうコード使っててもそれを外部にださなきゃいいんだし。

59 名前:デフォルトの名無しさん :01/12/24 14:14
>>57 エンコーディングと、文字セットは分けて議論してくれい

60 名前:34 :01/12/25 01:36
めりくり(´Д`)

マルチバイト文字列操作に対応するように、std::stringを拡張しようと考え、
委譲ではなく実装継承にしたかったので
class mbstring : public std::string {}; // 試しに継承してみる
としてみました。
が、"operator=()"が定義されてないとかコンパイラに怒られてしまいました。
サンタさん助けてください。

61 名前:デフォルトの名無しさん :01/12/25 01:48
>サンタさん助けてください。
彼らは今、納期に間に合わせるべく死に物狂いで奔走しているところです。
無茶言わないように。

62 名前:デフォルトの名無しさん :01/12/25 01:49
サロゲートペアなんて必要なんだろうか。
文字オタのために頻度1/1,000,000の文字をサロゲートにしてまで
実装する価値があるのだろうか。
それと中国。文字が多すぎるんだすこしは我慢しやがれっつーの。
というわけで、私が自前で作ったユニコードライブラリは
サロゲートをボツにしました。

63 名前:デフォルトの名無しさん :01/12/25 02:50
個人的にはサロゲートなんぞ提案した阿呆には首括って貰いたい。

64 名前:34 :01/12/25 03:33
>>61
サンタさん、ごめんなさい。
きっと恥ずかしい勘違いでエラーを出してると思うので、
一人で勉強することにします。(・∀・)

65 名前:デフォルトの名無しさん :01/12/25 20:55
g++ で wprintf を使っている人はいませんか。

#include <stdio.h>
#include <wchar.h>

int main()
{
wprintf(L"foo");
}

をコンパイルすると、wprintf が undefined になっちゃうんですが。

gcc だと、コンパイルはできるけど、リンクでエラーになります。
何かライブラリを陽に指定しないといけないんだろうか。

66 名前:デフォルトの名無しさん :01/12/25 21:56
厨房質問ですみません.
wchar とか,wprintf とかって皆さん何で勉強したんですか?
僕の持ってる本にはどれにも載っていなくって,このスレで初めて存在自体を
知りました.一応 web を検索して
http://www.linux.or.jp/JF/JFdocs/Unicode-HOWTO-6.html
こんなのとか見つけたんですが,正直サパーリ分かりませぬ.
どなたか良書 or 良いサイトがあったらご紹介して頂けませんでしょうか.

67 名前:65 :01/12/25 22:34
>>66
あう。この HOWTO に、見事に

> GNU glibc-2.0.x, glibc-2.1.x
> ・wcs/mbs 関数がありますが、fgetwc/fputwc/wprintf はありません

と書いてありますな。というわけで私の疑問は解決。

で、書籍 or サイトについては私も知りたいです。国際化にかんして
私が持っている本だと、

・「C++ 標準ライブラリ チュートリアル&リファレンス」(ASCII) の
「第14章 国際化」
・「Unicode 標準入門」(翔泳社)

くらいです。C のライブラリということだと、

・「標準C言語辞典」(ピアソン)

という本があるようです。

68 名前:デフォルトの名無しさん :01/12/25 23:04
typedef int32_t ucs4char;
typedef basic_string<ucs4char> ucs4string;
って、どう。サロゲート気にしなくて良いよ。
自分のUnicode関係のライブラリは、
文字コード変換用のやつ以外、全部これ。

69 名前:デフォルトの名無しさん :01/12/25 23:31
ucs4ならサロゲートいらないけどさ…
4バイト食っちゃうのがなぁ。うーん。
あとUTF8<->UCS4を行き来しなきゃなんないよねー。
初めの理想を徹してUCS2で我慢できないもんなのかなぁ…。
すべてはやたら多い文字の国が悪いのだ…。

70 名前:デフォルトの名無しさん :01/12/25 23:41
UCS2を捨てるなら3バイトでcxx(c=言語地域,xx=区となんとか)に
すると体系として割とすっきりする。拡張もできるし。
unix系のどこかのグループが作業していたような。
必要なタグは贅沢を言えばキリがないんだけど。

71 名前:無名λ式 :01/12/25 23:46
>>67
wcs/mbsだったら、JIS規格表が出てるから買いなよ。
JISは追加された所だけ別の規格表にしたから安いぞ。
日本規格協会から買える。http://www.jsa.or.jp/
http://www.jsa.or.jp/catalog/catalog09.asp
確かこれ。http://www.jsa.or.jp/catalog/catalog_bumon_a.asp?fn=D007927.HTML

正直、この辺はいい加減な本が多いから、規格読んだ方が早い。

72 名前:デフォルトの名無しさん :01/12/25 23:46
>>69
日本がそんなに悪いのか!

73 名前:デフォルトの名無しさん :01/12/25 23:53
日本だけじゃないけどね(w >>72

74 名前:デフォルトの名無しさん :01/12/26 00:07
>>72
>>73
日本は悪くないよ。

75 名前:デフォルトの名無しさん :01/12/26 00:49
>>71
日本規格協会も C の規格書を出していたんだ。さすがに最新ISOに
則ったやつはまだないみたいだけど、現行のやつでも持っててそんはないね。
おすすめにしたがって、買っておきます。

76 名前:重大なエラー名無しさん :01/12/26 02:19
MUTEXロックについて教えて下さい。

ある共用データを書き込む処理をする、スレッドAと、
共用データを読むだけの処理をするスレッドBがあるとします。
スレッドAでは共用データを書き込む際、MUTEXロックをかけておきます。
スレッドBでは共用データを読むだけなので、MUTEXロックは必要ないのでしょうか?
スレッドBでロックが必要な場合、待ち状態になると思うのですが、待たないよう
にする方法はありますか?

77 名前:デフォルトの名無しさん :01/12/26 02:21
rwlockを使う。

78 名前:デフォルトの名無しさん :01/12/26 02:47
>>76
読むだけといっても、書いている最中のわけのわからないデータに
アクセスしてしまうとおかしくなるということがあると思うけど。
特に、アクセス先が複雑なデータ構造なら。

79 名前:重大なエラー名無しさん :01/12/26 02:58
>>78
そうなんですよね!
つまり、書き込んでいる最中に、ロックもかけないで読むのはいけないということですね。
(読むだけといっても、マシンコードのレベルでは複数行だったりするらしいので。)
で、そこで問題なんですが、普通にロックをかけて読むのであれば、共用データ書き込み中
の場合は、待ち状態(タイムロス)になってしまいます。
では、タイムロス無しに共用データを読むにはどうすればいいんでしょうか?

80 名前:デフォルトの名無しさん :01/12/26 03:12
5秒後に実行するようにプログラムしたいのですができますか?

例えば、入力した文字の画数を調べるプログラムで時間が経つと
かってに、結果に移るようにしたいのです。
コントロール+Dしなくていいように

81 名前:デフォルトの名無しさん :01/12/26 03:18
selectで待つとか、alarmでタイムアウトを検出するとか。

82 名前:デフォルトの名無しさん :01/12/26 03:57
>>79
77 も書いてるが reader/write lock を使う。簡単化して説明すると

読める条件
 writer がいないこと
 (reader は何人いても OK)

書き込める条件
 write がいないこと
 reader がいないこと

でロックをかける。google で検索すれば、山のように説明が出てくると思われ。

83 名前:デフォルトの名無しさん :01/12/26 04:15
>82
>79は、書き込み中にロックしてしまうのを避けたいみたいだが。
確かに、ある種の書き込み方式(たとえば、リストに足していくだけとか)なら、
十分な検討を行い、読み込みをロックフリーにできる場合もあるかもしれない。
たとえば、書き込み前に現在のリスト最終位置を保存しておくとか。
write : Lock(); @last = @list.size(); @list.push( func() ); unLock()
read : last = @last; @list.each( to last ){|i|; process i }
個人的には、ハマり道なので、あまりお勧めできない。

84 名前:デフォルトの名無しさん :01/12/26 04:24
>>83
読み込みの待ち時間を最小にしたいなら

1. 書き込みの単位を小さくする。たとえばキューなら一気にデータ挿入を行わず、1 つキューに入れる
 操作をしたら、すぐにロックを離して、読み込み要求があるか調べる。

2. データをコピーして二つ用意しておき、書き込みはコピー側に対して行う。書込み操作が完了したら、
 以後のリーダーは新データを参照するように挿げ替え(古いデータは参照しているリーダーがいなく
 なるまで残しておいて、後でガベージコレクションかける)

あたりじゃないのか。

85 名前:デフォルトの名無しさん :01/12/26 04:46
>>84
2.でもコピーと挿げ替えのときにロックが必要だから、
やっぱりまったく無しというのは無理だな。

86 名前:デフォルトの名無しさん :01/12/26 04:58
2は参照カウンタをクリティカルセクションで保護する必要があるな(笑)

87 名前:無名λ式 :01/12/26 09:23
>>75
挙げたのはwcs/mbsだけしか載ってないから注意してね。
書籍は、共立から出ていた「国際化プログラミングハンドブック」(たしかこんなタイトル)、
どこだかわすれたけど「マルチリンガル〜」がいいと思う。(UNIX only)

>>76 マルチスレッドプログラミングスレの方が適当じゃないかな?

88 名前:デフォルトの名無しさん :01/12/26 10:29
>>84
おまえのプログラム原因不明のバグとか多いだろ。

89 名前:デフォルトの名無しさん :01/12/26 15:16
>>88
未解決のバグは全部原因不明

90 名前:デフォルトの名無しさん :01/12/26 15:18
原因は明らかなんだが仕様上直せないバグと、どっちがいい?

91 名前:デフォルトの名無しさん :01/12/26 15:37
>>85
データ構造によるけど、たぶんロック無しはきついだろうなぁ。x86 ならポインタ一つだけとか
整数一つだけの操作なら割り込みが入らないけど、それで済むような簡単なデータ構造なら
そもそも問題になってないだろうし(SMP だとロックプリフィックスをつけてバスをロックするの
は必要か)。

>>88
たしかに FreeBSD 5.0-CURRENT には、まだ怪しい挙動する部分あるな。

92 名前:デフォルトの名無しさん :01/12/26 15:48
>>91
一般的にいえば、sig_atomic_t以下のサイズの読み込み以外は必ずロックが必要。

93 名前:デフォルトの名無しさん :01/12/29 01:00
構造体でもクラスでもいいです。
クラスの1番最初のメンバに関数ポインタ(void func(CGOBJ *obj)系のポインタ)
がある様々なクラスを作り(つまり、ヘッダみたいなのを統一して作るの)、
クラス(どのクラスかは不明。)の、ポインタだけわかる状態で
その、関数ポインタに飛ぶにはどういう風にすればいいですか?
関数型キャストしようとすると、ANSI Cじゃ出来ないわよ。
って言われます。
C++このようなこと出来そうな機能ってありますか?
それとも、アセンブラやるしかないのでしょうか?

94 名前:デフォルトの名無しさん :01/12/29 01:18
何をどうしたいのかがいまいち不明だが、以下のような感じ?

class Foo {
private:
 void (*func)(CGOBJ *obj);

public:
 void operator()(CGOBJ *obj) {
  (*func)( obj );
 }
};

int main()
{
 Foo *foo = new Foo;

 // foo->func を初期化する処理をして

CGOBJ *obj = new CGOBJ;

 (*foo)( obj );
}

95 名前:デフォルトの名無しさん :01/12/29 01:20
1番最初のメンバ名を統一する。

96 名前:デフォルトの名無しさん :01/12/29 02:16
>>93
#include <iostream>
typedef void (*func)(int obj);
void test(int obj) {cout << obj << endl;}
class Foo {public: func test;};
int main() {
Foo *foo = new Foo;
foo->test = test;
//(reinterpret_cast<func>(foo))(0);
(*(reinterpret_cast<func *>(foo)))(0);
return 0;
}

g++では通ったぞ
コメントアウトしてる方の行はだめだったけど

97 名前:デフォルトの名無しさん :01/12/29 02:16
>>93
> 関数型キャストしようとすると、ANSI Cじゃ出来ないわよ。
> って言われます。
Cなのか
> C++このようなこと出来そうな機能ってありますか?
C++なのか
はっきりしる。

あと処理系とエラーメッセージも書け。

98 名前:デフォルトの名無しさん :01/12/29 02:17
>>94-95 は読解力 0

99 名前:95 :01/12/29 02:22
>>98

お前はどう読解したんだよ?

100 名前:ロックしないで〜 :01/12/29 04:49
データがでかくてもダブルバッファにして、データへのポインタをかえればいいじゃん。

101 名前:デフォルトの名無しさん :01/12/29 05:04
>>84の話か? >>85-86は読んだか?

102 名前:デフォルトの名無しさん :01/12/29 06:07
つか>>95はネタだとおもったんだが…
関数へのポインタをメンバに持つ構造体を1つ定義して、
それへのポインタにキャストすればええんでないか?

103 名前:100>101 :01/12/29 06:11
読んだからダブルバッファとポインタって言ってるんじゃん。

104 名前:デフォルトの名無しさん :01/12/29 06:18
>>102
構造体を定義せずとも、関数へのポインタへのポインタにキャストすりゃえー
んでは、っつーのが>>92では。

105 名前:デフォルトの名無しさん :01/12/29 06:35
>>104
それがANSI Cじゃできないからっていうんでは?

106 名前:デフォルトの名無しさん :01/12/29 06:37
>>76はスレッドの同期の問題が片付かないと結論でなさそうだけど、ど?

107 名前:デフォルトの名無しさん :01/12/29 06:51
>>105
できるはずだが、>>93がちゃんと情報を出さんので、
ほんとにそういう問題なのかわからん。

108 名前:93 :01/12/29 12:46
どうも。いろいろ意見ありがとうございます。
>>102さんの言うとおり、ヘッダを構造体にしたらいけました。
やろうとしたことは、CGOBJを中心にCOMみたいなことして
いろんな機能を使用、追加できるクラスを作ろうと思ったのです(DirectShowに近い)。
3Dとかになると、同じ座標使っても、
さまざまなポリゴン表示(トーンとかキューブとか)や
ビルボード等、いろいろな表示方法があったり、
他にも、いろんなあたり判定、ライティング座標、etc…
それを初期化の時に、設定しやすく(素材の共有もできる)、そして
使用方法はCGOBJのメンバを呼ぶだけ。
という。そんなものを作ろうとしているのです。
ソースは94さんみたいなものです。で、
(void *)キャストしたmat(94のソースで言うとFoo)を
(void *(CGOBJ))mat(this);//
D:\[Development]\testCOBJ\main.cpp(35) : error C2066: 関数型へのキャストは不正です。
MSDNで見ると
コンパイラ エラー C2066
関数型へのキャストは不正です。
オブジェクトが関数型にキャストされましたが、このキャストは許されていません。
ANSI C では、関数へのポインタとデータへのポインタの間でキャストを行うことは許されていません。

あばば。
今見ると、キャスト方法間違ってたかも。
でも、ヘッダを構造体にすることにより、わかりやすくなったので、
それがいいです。
長文かつ、読みにくい文章ですいません。
いろいろありがとうございました。

109 名前:デフォルトの名無しさん :01/12/29 12:58
while (cin.get(c)) {
if (c >= '0' && c <= '9')
cnt[c - '0']++;
}

for (int i = 0; i < 10; i++)
cout << i << "の出現回数:" << cnt[i] << '\n';

 cout << i << "の出現回数:" << cnt[i] << '\n';
のcnt[i] の部分はfor文とwhile文のどちらの結果が入ってるんでしょうか?
                    

110 名前:デフォルトの名無しさん :01/12/29 13:34
>>108
> (void *)キャストしたmat(94のソースで言うとFoo)を
>>96か?
> (void *(CGOBJ))mat(this);//
(*(void (**)(CGOBJ))&mat)(this);
直接キャストするならこうだろ。たぶん。

111 名前:デフォルトの名無しさん :01/12/29 15:50
inline のメンバ関数定義して、それ経由で func を呼び出せばそれで
終わりじゃないの? なんでわざわざキャストする必要がある?
それともみんなネタ?

112 名前:デフォルトの名無しさん :01/12/29 15:57
>>109
cout の << 演算子は、引数を書き換えたりしないよ。

113 名前:デフォルトの名無しさん :01/12/29 17:48
>>111
inlineだとクラスが分かってないと使えないじゃん。
>>93はgenericな関数を作りたいんだろ。

114 名前:デフォルトの名無しさん :01/12/29 19:45
>>113
111はネタだから

115 名前:デフォルトの名無しさん :01/12/29 19:48
>>113
>>93 は、
> クラスの1番最初のメンバに関数ポインタ(void func(CGOBJ *obj)系のポインタ)
> がある様々なクラスを作り(つまり、ヘッダみたいなのを統一して作るの)、

と言っているので、「ヘッダみたいなの」を基底クラスとして、そこから派生した
クラスを扱うのかと思った。

また、generic な扱いをするのに template を使えば、あらかじめクラスが
分かっている必要はない。関数オブジェクトでやるのが一番スマートかな。

116 名前:デフォルトの名無しさん :01/12/29 20:04
>>108
仮想関数じゃ、どのへんがダメなん?

117 名前:デフォルトの名無しさん :01/12/29 20:36
>>115
> と言っているので、「ヘッダみたいなの」を基底クラスとして、そこから派生した
> クラスを扱うのかと思った。
C++で普通に考えたらそうなんだが。

> また、generic な扱いをするのに template を使えば、あらかじめクラスが
> 分かっている必要はない。関数オブジェクトでやるのが一番スマートかな。
関数自体は一つにしたいということなんでは。
あるいは実行時まで実際のクラスは分からないとか。

118 名前:デフォルトの名無しさん :01/12/29 20:40
>>116
あえて当り前の手を封じてこそのネタ。

119 名前:名無しさん@Vim%Chalice :01/12/30 00:29
>>67
I18N ハンドブック ISBN4320029046
(例えば、http://www.amazon.co.jp/exec/obidos/ASIN/4320029046/qid%3D1009639543/250-5595564-8511408)

120 名前:116 :01/12/30 09:19
・・・ネタだったの? ごみん。

121 名前:デフォルトの名無しさん :01/12/30 18:35
while (cin.get(c)) {
switch (c) {
case '0'; cnt[0]++; break;
case '0'; cnt[0]++; break;
}
}

for (i=o; i<10; i++)
cout << i << "の出現回数:" << cnt[i] <<'\n';←この行のcnt[i]は
switch文のカウントから、きているものなのでしょうか?



122 名前:121訂正 :01/12/30 18:37
case '0'; cnt[0]++; break;
case '0'; cnt[0]++; break;
    ↓
case '0'; cnt[0]++; break;
case '1'; cnt[0]++; break;

123 名前:デフォルトの名無しさん :01/12/30 21:04
>この行のcnt[i]は switch文のカウントから、きているものなのでしょうか?
だからもーちっとマシな日本語使えって.
何が言いたいのか分からんぞ.
だいたい
i=o
の時点でヲィヲィ・・・

124 名前:デフォルトの名無しさん :01/12/31 00:11
>>121
>この行のcnt[i]は switch文のカウントから、きているものなのでしょうか?
cntはどんなクラスの、オブジェクトなのでしょうか?

125 名前:デフォルトの名無しさん :01/12/31 00:41
よく分からんけど cnt[i]とは*(cnt + i)のことだすよ。

126 名前:デフォルトの名無しさん :01/12/31 05:20
operator [](int i)の立場はどうなるのでしょう?

127 名前:121訂正 :01/12/31 05:49
>>123-125
/*
入力に出現する数字をカウントする
*/

#include <iostream.h>

int main(void)
{
char c;
int cnt[10] = {0}; // 配列cntの全要素を0で初期化

while (cin.get(c)) {
if (c >= '0' && c <= '9')
cnt[c - '0']++;
}

for (int i = 0; i < 10; i++)
cout << i << "の出現回数:" << cnt[i] << '\n';

return (0);
}

for文のcnt[i]がどこから来てるのか知りたいんです。

128 名前:デフォルトの名無しさん :01/12/31 06:07
>>127
aとかbとか入れた場合は?

129 名前:デフォルトの名無しさん :01/12/31 06:08
128 すまそ、良く見てなかった

130 名前:デフォルトの名無しさん :01/12/31 10:10
>>127
人をからかってるのか?

131 名前:123 :01/12/31 10:35
>>127
だーかーらー
> for文のcnt[i]がどこから来てるのか知りたいんです。
この一文が意味不明なの.

せめてオマエの考えてる
「こーなの?それともこーなの?どっち?」
とかって質問の仕方をしてみろ.

132 名前:121訂正 :01/12/31 11:20
>>130-131
cnt[i]に出る数値は、

while (cin.get(c)) {
if (c >= '0' && c <= '9')
cnt[c - '0']++;

cnt[c - '0']++;から来ているものなのか、
それとも、
for (int i = 0; i < 10; i++)
から、来ているものなのか?です。

133 名前:デフォルトの名無しさん :01/12/31 11:27
あなたは、「変数」という概念を理解していますか?

134 名前:デフォルトの名無しさん :01/12/31 11:33
「来ているもの」の意味を教えてください。
そうしないと多分、誰も答えられません。

135 名前:デフォルトの名無しさん :01/12/31 11:35
これだけ意味というか意図が不明な質問も珍しい。

136 名前:ここで一句 :01/12/31 11:45
サポートの
 苦労がいたく
  身にしみる
2001年
 暮れのひととき

137 名前:デフォルトの名無しさん :01/12/31 11:47
言葉を少し変えれば
ここのみなさんも簡単にわかる質問だとは思うが
俺も質問の意味がわからん

138 名前:デフォルトの名無しさん :01/12/31 11:48
深すぎて理解出来んぞ  (^-^;;

139 名前:デフォルトの名無しさん :01/12/31 12:06
やはりこの場は、この板の伝説となっている意味不明質問スレを出すしかあるまい。
エクセルの計算式
http://piza.2ch.net/tech/kako/970/970031167.html
しかし、これは意図を読み取れる人がいた。

140 名前:デフォルトの名無しさん :01/12/31 12:07
121を、「あなたむいてません、おきらめなさい」って小一時間説得したい

141 名前:123 :01/12/31 12:15

質問の意図がまだ良く分かんねーんだけど,配列の中の値と,配列の添字の区
別が分かってねーんじゃねーか?
それともインクリメントが分かってねーのか?
なんか前者の可能性が高い気がするんだが・・・.

ちょっと簡単な例を出してみよう

> for (int j = 0;j<10;++j)
>  cnt[j] = j;
>
> for (int i = 0; i < 10; i++)
>  cout << i << "の出現回数:" << cnt[i] << '\n';

これだったら何やってるか分かるか? >> 121

142 名前:123 :01/12/31 12:18
>139
激しくワロタ
腹痛ぇー

143 名前:121訂正 :01/12/31 14:09
>>141
> for (int j = 0;j<10;++j)
>  cnt[j] = j;

jに0を格納、jに1ずつ足していきjが9になるまで繰り返す。
cnt[0] =j;
cnt[1] =j;
 :
cnt[9] =j;
---------
> for (int i = 0; i < 10; i++)
>  cout << i << "の出現回数:" << cnt[i] << '\n';
ここのcout << iのiには0から9までの数が入り。

cnt[i]はjの値が挿入されてるでしょうか?

僕としては、cnt[i]の[i]になぜjの値が入るのか?解らないんです。

144 名前:121訂正 :01/12/31 14:17
>while (cin.get(c)) {
>if (c >= '0' && c <= '9')
>cnt[c - '0']++;
ここは0から9の添え字の出力を行い、なおかつ、入力された
数値もカウントされてるんですよね?

145 名前:デフォルトの名無しさん :01/12/31 14:21
>>143
>jに0を格納、jに1ずつ足していきjが9になるまで繰り返す。
> cnt[0] =j;
> cnt[1] =j;
>  :
> cnt[9] =j;
は、
> cnt[0] =0;
> cnt[1] =1;
>  :
> cnt[9] =9;
が正解。

ちなみに、

for (int i = 0; i < 10; i++)
cout << i << "の出現回数:" << cnt[i] << '\n';

というのは、媒介変数iを使って以下を簡潔に書いたものです。

cout << 0 << "の出現回数:" << cnt[0] << '\n';
cout << 1 << "の出現回数:" << cnt[1] << '\n';
cout << 2 << "の出現回数:" << cnt[2] << '\n';
cout << 3 << "の出現回数:" << cnt[3] << '\n';
cout << 4 << "の出現回数:" << cnt[4] << '\n';
cout << 5 << "の出現回数:" << cnt[5] << '\n';
cout << 6 << "の出現回数:" << cnt[6] << '\n';
cout << 7 << "の出現回数:" << cnt[7] << '\n';
cout << 8 << "の出現回数:" << cnt[8] << '\n';
cout << 9 << "の出現回数:" << cnt[9] << '\n';

iの代わりにjを使っても、本質的な違いはありません。

146 名前:デフォルトの名無しさん :01/12/31 14:29
はじめまして。
アプリ定義の構造体をファイルに出力したいんですけど
struct _data{char *szdata;
int i;}data;

struct _data{char szdata[256];
int i;}data;
激しく違うよね?

147 名前:121訂正 :01/12/31 14:43
>>145
//入力に出現する数字をカウントする

例えば122と入力されたとします。

while (cin.get(c)) {
if (c >= '0' && c <= '9')
cnt[c - '0']++;  //ここがjだとしたら
}

for (int i = 0; i < 10; i++)
cout << i << "の出現回数:" << cnt[i] << '\n';

jがcnt[i]に挿入される?のですか?
------------------
入力された122は
cnt[c - '0']++;でカウントされているんですか?それとも
for (int i = 0; i < 10; i++)でカウントされれいるんでしょうか?

148 名前:デフォルトの名無しさん :01/12/31 14:47
>jがcnt[i]に挿入される
勝手に自分用語を作るな

149 名前:デフォルトの名無しさん :01/12/31 14:58
>>146
激しく違う。

150 名前:123=141 :01/12/31 15:09
>121
> cnt[c - '0']++;でカウントされている
が正解.
for (int i = 0; i < 10; i++)
では cnt の値は何一つとして変えてないだろ.

cnt[c-'0']++;
ってのは
cnt[c-'0'] = cnt[c-'0'] +1;
と同じ意味なのは分かってるか?
これは "=" を使ってるから「cntの値を変更してる」のはいいよな?
その点 for (int i = 0; i < 10; i++) の中では
"<<" という演算子しか使ってなくって,これは cnt の値は変更しねぇぞ.n
だから「カウントしてる」=「cntの値を変更してる」のは前者なわけ.

でもなぁ,きっとお主は配列の概念良く分かってないんじゃないかなぁと思うわけよ.
ちゃんと配列勉強した?

151 名前:デフォルトの名無しさん :01/12/31 15:16
ついにナゾが解明されました

152 名前:デフォルトの名無しさん :01/12/31 15:20
そう、ここは++。とにかく++。
なんて読むんだ++。

153 名前:デフォルトの名無しさん :01/12/31 16:25
>152
チョメチョメ に一票

シーチョメチョメマンセー

154 名前:名無しさん@お腹いっぱい。 :02/01/01 00:11
g++の標準入出力ストリームについて質問です.
ifstreamを用いて,同じファイルから2回データを読み込みたいとき,
例えば1回読み込んだあと,
seekgを用いてカレントポジションを先頭に戻し,再び読み込む,即ち
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
char tmp;
ifstream ifs ("hoge.txt");
// 1回目読み込み
while (!ifs.eof ()) {
ifs.get(tmp);
cout << tmp; // 例えば,表示.
}
ifs.seekg (0, ios::beg); // 開始点にシーク
ifs.clear (); // フラグを初期化
// 2回目読み込み
while (!ifs.eof ()) {
ifs.get(tmp);
cout << tmp; // 例えば,表示.
}
return 0;
}
のように書けますよね.
同様に,標準入力(catとパイプでつなぎたい)から2回データを読みたいと思いまして,
#include <iostream>
using namespace std;
int main ()
{
char tmp;
// 1回目読み込み
while (!cin.eof ()) {
cin.get(tmp);
cout << tmp; // 例えば,表示.
}
cin.seekg (0, ios::beg); // 開始点にシーク
cin.clear (); // フラグを初期化
// 2回目読み込み
while (!cin.eof ()) {
cin.get(tmp);
cout << tmp; // 例えば,表示.
}
return 0;
}
としたところ,うまくいきません.
で,cin.tellg ()を使いましてseekg (0, ios::beg)でカレントがどこに移ったか調べましたところ,
どうやらifstreamの場合と挙動が違うことが分かりました.
つまり,ifstreamではseekg (0, ios::beg)によりカレントポジションが最初の位置に戻りますが,
istream (この場合cin)では戻らないようです.
これは,こういう仕様なのでしょうか? それとも,使用しているライブラリの不備なのでしょうか?
(派生関係にあるのだから,同じように動いて欲しいものです.) 私が使用している環境は,
$ g++ -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/specs
gcc version 2.95.3 20010315 (release)
です.

155 名前:デフォルトの名無しさん :02/01/01 00:42
>>152
マジレスしちゃいかんのかな?
「++」はインクリメントじゃ。

156 名前:デフォルトの名無しさん :02/01/01 00:47
それではこれから「C++」は「Cインクリメント」ということで。

157 名前:デフォルトの名無しさん :02/01/01 00:52
>>154
pipeの仕様。

158 名前:デフォルトの名無しさん :02/01/01 02:24
>>152
マジレスしちゃいかんのかな?
(++)は困ったときの顔文字じゃ。
(+π+)とする人もいる。

159 名前:デフォルトの名無しさん :02/01/01 13:38
C++ ← しぃぷるぷる

160 名前:名無しさん@お腹いっぱい。 :02/01/01 17:45
>>157
>pipeの仕様。

どうやら,最終点まで読み込む前だったら,
seekg (0, ios::beg)は効くみたいです.

例えば,1バイトだけ読み込み,seekg (0, ios::beg)で
先頭に戻したあと,再び読み直す以下のようなプログラム
#include <iostream>
using namespace std;
int main ()
{
char tmp;
// 1バイト読み込んで表示
cin.get(tmp); cout << tmp;
cin.seekg (0, ios::beg); // 開始点にシーク
cin.clear (); // フラグを初期化
// 最初から読み直し
while (!cin.eof ()) {
cin.get(tmp);
cout << tmp; // 例えば,表示.
}
return 0;
}
で,1バイトより大きなデータを標準入力に与えると,
ちゃんと先頭の1バイトも表示し直してくれました.

最終点まで読み込むと標準入力ってバッファを消去してしまうってことなのかな?

161 名前:デフォルトの名無しさん :02/01/01 18:27
>>160
iostreamが管理しているバッファにおさまる限りはseekできるってことでは?
1MBくらい読んでからseekgしてみれば失敗するはず。
seekgが下請けに使ってるlseek(2)はpipeには使えないのよ。

162 名前:名無しさん@お腹いっぱい。 :02/01/01 21:37
>>161
>1MBくらい読んでからseekgしてみれば失敗するはず。
>seekgが下請けに使ってるlseek(2)はpipeには使えないのよ。

試してみたら,おっしゃる通りでした.
4096バイトまでは遡れるけど,4097バイトでは失敗しました.
どうもっ!

163 名前:名無しさん@お腹いっぱい。 :02/01/01 21:57
162です.

ついでに,
たとえ4096バイト以内でも,
最終地点に到達したら,seekgは失敗してしまうようです.

まぁ,いずれにしても標準入力に対してはseekgは使えないみたいですね.

164 名前:ロリオタ殺す :02/01/01 22:16
Reported by WPNP
Tuesday, January 01, 2002 20:11:46

User Name: TenTen_DWP2f3e793d1a2b
Access Level: user
Time Online: 5:55:17
In Channels:
Status: 11 in queue (-2 of 0 available)
Shared Files: 120
Active Downloads: 2
Active Uploads: 2
Connection Type: DSL
Client Version: WinMX v2.6j


ロリと盗撮と援交・・・・・・・・

web pageはこちら。
ttp://www.tokyo-nazo.net/~tenten/

キーワード
援助交際白書
ディズニーランドトイレ
ロリータ写真集

165 名前:デフォルトの名無しさん :02/01/01 22:19
誤爆か?

166 名前:_ :02/01/02 00:27
テンプレート関係が1番完璧に処理できるコンパイラはどれですか?
今VC使ってるけどBC++Builderとかg++とかどうですか?

167 名前:デフォルトの名無しさん :02/01/02 01:44
>>166
VC6 << Borland C++ Compiler < g++

ただ GCC は細かいところでバグがある感じ。ネームスペースとテンプレートを絡めて使うと、
たまに挙動が変。

168 名前:_ :02/01/03 00:10
>>167
ありがとうございます。
Vine Linuxいれたからg++でもやろうかな。
VCでSTLを深くやろうとしたり、テンプレート関係の本のサンプルを打ち込んでも
変な場合があってやる気がなえてたところだから。
Borland C++ Compiler はC++Builderの純粋なコンパイラ部分なんだよね。
GUIのプログラム作るのが楽そうだからこっちもよさそうだな。

169 名前:167 :02/01/03 00:58
>>168
template らぶらぶ で GUI のプログラムを組むのなら VC6 + ATL/WTL を推しときますが。
VC6 の template は「完璧」からは程遠いですが、実用的なフレームワークを作れる程度に
は機能します。

170 名前:デフォルトの名無しさん :02/01/03 01:27
ゲイツ社のC++と、ボーランドのC++ビルダーはどう違うのですか?

171 名前:デフォルトの名無しさん :02/01/03 01:34
>>170

ゲイツ社のC++ってVC++のことか?
ソフトが違うじゃん。

172 名前:デフォルトの名無しさん :02/01/03 01:40
C++BuilderのコンパイラよりもVC++のコンパイラの方が最適化が優れている気がするけどどうなんだろう。

173 名前:デフォルトの名無しさん :02/01/03 18:30
>>172 その通り、最適化コードの質はVCの圧勝。でも言語規格準拠度はVCのボロ負け。

174 名前:デフォルトの名無しさん :02/01/03 19:01
>>173
VS.NETで改善されてるみたい。

175 名前:173 :02/01/03 19:47
VS.NET(VC7)で規格準拠もOKとの噂は聞くけど実際のところ、どう?
どこかに比較記事とかあったら紹介希望。
# RCなしでbeta2からいきりなりリリースとは勇気あるなぁ>VS.NET

176 名前:デフォルトの名無しさん :02/01/03 20:21
なんつーんだろ。
for文の初期

177 名前:デフォルトの名無しさん :02/01/03 21:07
>>175
英語版はRC出てたはずでは?

178 名前:デフォルトの名無しさん :02/01/03 21:14
VS.NET日本語版の正式な発売日・価格ってまだでないの?

179 名前:デフォルトの名無しさん :02/01/03 22:08
>>177 おや英語版のRCって出てたっけ?ちゃんと届けろよ>MSDN

180 名前:デフォルトの名無しさん :02/01/04 01:49
ちょっと質問良いですか?

string型の変数をchar型の配列に変換するにはどうしたら良いんでしょうか?

181 名前:デフォルトの名無しさん :02/01/04 02:01
>180
c_str()

182 名前:デフォルトの名無しさん :02/01/04 05:20
すいません教えてください。
ウインドウの作成と初期化、さらにダイレクトXの初期化をするクラスを
作ろうとしているのですが、WindowProc()関数をそのクラスのメンバ関数に
するにはどうすればいいのでしょうか?
WM_DESTROYメッセージの後にダイレクトX関連のオブジェクトをリリースする
必要があるのでどうしてもWindowProc()関数内部からそのリリースする
メンバ関数にアクセスしたいのです。
よろしくお願いします。

183 名前:デフォルトの名無しさん :02/01/04 05:28
・static/global変数でthisを設定しておく
・hWnd -> thisの連想配列で処理する(MFC式)
・hWndをthisにすげ替えるWindProcを自動生成する(ATL式)
お好きなのをどうぞ。

184 名前:182 :02/01/04 05:59
うーむ。正直サッパリです。どこか参考になるWEBとか
ありませんか?もしくはウインドウ作成と初期化を一つにまとめた
クラスのソース公開しているところとか。

185 名前:デフォルトの名無しさん :02/01/04 06:27
>もしくはウインドウ作成と初期化を一つにまとめた
>クラスのソース公開しているところとか。

なぜATLのソースを読まないのでしょう?

186 名前:182 :02/01/04 06:45
うーん。ひよっこどころか卵状態なのでATL自体よく分かってないです。

187 名前:デフォルトの名無しさん :02/01/04 07:51
>>184
ttp://www.sun-inet.or.jp/~yaneurao/

188 名前:デフォルトの名無しさん :02/01/04 08:48
>>183
CreateWindow 直後に SetWindowLong() で this ポインタを HWND に関連付け、ウィンドウプロシージャでは
GetWindowLong() で this ポインタを引き出してきてメンバ関数を呼び出す、ってのもアリかな。

>>186
MSDN Library に「ATL 3.0 ウィンドウクラス入門」という文書があったはず。あれ読んで CWindowImpl 使うの
が楽だと思うぞ。

189 名前:182 :02/01/04 08:59
とりあえず187のページのSDKダウンロードして
目的のソース見つけました。あとそのページでかなりプログラム技術が
アップしそうな気がします。どうもありがとうございました。
ATLは適当に調べたかんじではまだよく分からなかったので
後回しにします。

190 名前:デフォルトの名無しさん :02/01/04 12:02
>>189 その >>187のページって「やねうらお」だね。
内容見てないけど大丈夫かいな。ATLのソースみた方が安心だと思うぞ。

191 名前:デフォルトの名無しさん :02/01/04 12:19
>>190
技術そのものは、あちこちからパクってきたものだから問題ないんじゃない?
(変にオリジナリティを出そうとしてがんばって改悪してるかもしれないけど)

192 名前:デフォルトの名無しさん :02/01/04 12:24
>182
この板には>>190-191みたいなアンチやねうら粘着厨房がいるみたい、
気にしない方がいいYO!

193 名前:デフォルトの名無しさん :02/01/04 12:33
>192
レス早いですね
粘着厨房さんですか?p

194 名前:デフォルトの名無しさん :02/01/04 12:38
やねうらって誰?

195 名前:デフォルトの名無しさん :02/01/04 12:44
やねうらおがだれだかのコードをパクって、自分の掲示板で指摘されて
ハジかいたってのは見たことある。
それ以外はよく知らないけど。

196 名前:デフォルトの名無しさん :02/01/04 12:50
>>189
やね氏の能力は否定しないが、
文章を読んで賛美者になったりしてはいけない。
自分で技術的真偽の判別がつかない初心者は気をつけるように。

197 名前:デフォルトの名無しさん :02/01/04 14:07
>>195
タスクコンテクストスイッチに関して、かなりボケたことを言ってて叩かれてたのはリアルタイムで
見てた。最近はどうか知らないけど、当時は「計算機論理設計の基礎が分かっちゃいねぇ、ヘネ
シー&パターソン読んで出直せ」というレベルではあった。

C++ と関係ないから、これ以上、やねうらおを語りたければプログラマー板行きましょう。

198 名前:190 :02/01/04 14:41
>>197 賛成〜。やねうらお語るほどヒマじゃないけど、
Webの技術情報を安易に信用するなってことで。

199 名前:デフォルトの名無しさん :02/01/04 23:31
STLのvector(or その他)について質問。

まず<やりたいこと>

・配列をvectorに置き換えたい。
・でも、配列先頭へのポインタによるアクセスは同じようにしたい

よーするに、T Array[5];をvector<T> Array;にしたいんだけど、 (void*)Arrayって
アクセスもしたい、っつーことなんです。

これ、const_pointer使えばOKなん? それとも、クラス書かないとダメ?

200 名前:デフォルトの名無しさん :02/01/04 23:36
大抵の実装では、vector<T>::iteratorがT *になるはず‥‥
ポインタの方で、要素を追加したりしないなら、こういう手もあり。
まぁ、それを想定するのが卑怯だというなら、クラスを実装
するしかないね。

201 名前:199 :02/01/04 23:42
うを、素早い(^^;

ということで早速のお返事、ありがとうございます。

>大抵の実装では、vector<T>::iteratorがT *になるはず‥‥
つーコトは、そのまんま(void*)ArrayでOK?(^^;
ちなみに、
>ポインタの方で、要素を追加したりしないなら、こういう手もあり。
なんてことは露ほども考えておりません(^^;
ぶっちゃけて話しちゃうと、DirectX8のDrawPrimitiveで使う頂点配列を、何とかして整理したかったのココロ(^^;

202 名前:デフォルトの名無しさん :02/01/04 23:45
>>199
std::vector<T> v;
T* p = &v[0];

vector は C の配列と同様のメモリ配置になることが規格上保証されてるから、これで OK。C で書かれた
関数と C++ 混ぜて使う場合 vector は重宝します。

>>197
そういや、以前の yaneSDK には std::vector に auto_ptr っぽいセマンティクスを持つ型を格納するという
おおぼけなコードがあった。最近のは見てないから知らんけど。

203 名前:デフォルトの名無しさん :02/01/05 00:49
>>202
> vector は C の配列と同様のメモリ配置になることが規格上保証されてる
これって、規格になったんだっけ。まあ、そういう方向で標準化作業は
すすんでいたと思うので、そうでない実装というのは存在しないだろうけど。

204 名前:デフォルトの名無しさん :02/01/05 00:59
>>200
g++ 付属の stl だと、vector<T>::iterator から T * への暗黙の変換は
定義されていなかったと思う。

205 名前:デフォルトの名無しさん :02/01/05 01:28
>>204
vector<T>::iterator から T* への変換とかいう問題以前にさ、
typedef T* iterator
ってなってるはずなんだが。

今、g++ の vector のヘッダ見てみたけどさ、ちゃんと

typedef _Tp value_type;
typedef value_type* iterator;

ってなってるぞ。

206 名前:199 :02/01/05 01:58
っと、ごめんなさい。テンプレート付きのクラスでメソッドを記述するには
どうしたらいいのでしょう?

#include <vector>
using namespace std;

template <class T> class apexVector
{
public:
//頂点データのベクタ
vector<T> apex;

void apexVector::method1();

};

vectorは(void*)apexが出来るっつーのでpublicにして横着しようと思ったなり(^^;

が、それは置いておいて、method1でコンパイルエラーになります。apexVector::を
取っ払えばとりあえずコンパイルは通りますが、ここは本来はどーゆー風に書くのでしょう?

207 名前:デフォルトの名無しさん :02/01/05 02:11
ふむ。君はvectorのソースも見ないんだな‥‥ まぁそれはいい。
template <class T> class apexVector {
 void method1() { // 実装
 }
 void apexVector<T>::method2(){//実装
 }
};
ということをやればよい。ああ、テンプレートのメソッドが、テンプレート外に
記述できない、というのは知っているだろうな。(.cppと.hに分離できねーとか
泣きついてくるなよ)

208 名前:デフォルトの名無しさん :02/01/05 02:13
>>203>>205
VC7は違うらしいYO

209 名前:デフォルトの名無しさん :02/01/05 02:20
>>207
template <class T> class apexVector {
 void method1() { // 実装
 }
 void method2();
}
void apexVector<T>::method2(){//実装
}
こうじゃないの?

210 名前:デフォルトの名無しさん :02/01/05 02:22
あ、method2()の実装のまえにtemplate<class T>が必要。

211 名前:199 :02/01/05 02:36
>>207

>ふむ。君はvectorのソースも見ないんだな‥‥ まぁそれはいい。
厨房で申し訳ないっす(^^;

>template <class T> class apexVector {
〜中略〜
>ということをやればよい。ああ、テンプレートのメソッドが、テンプレート外に
>記述できない、というのは知っているだろうな。(.cppと.hに分離できねーとか
>泣きついてくるなよ)

……知りませんでした、申し訳ない(^^; 「.hと.cppに分離」はC++の作法だと思っておりましたので(^^;
早速やってみます。アドバイス多謝(拝)

212 名前:デフォルトの名無しさん :02/01/05 03:07
>>205
gccのvectorのiteratorはT*との互換性はない、と書いた文書を
俺もどこかで見たぞ。公式の文書で。

古いの見てるんじゃないのか? libc++-v3じゃないやつとか。

それと、O(1)のオーダーでアクセスできることと
C の配列と同様のメモリ配置になることとは違うぞ。

213 名前:デフォルトの名無しさん :02/01/05 03:16
少なくともg++-2/stl_vector.hとg++-3/stl_vector.hでは
typedef value_type* iterator;
となってる。

214 名前:デフォルトの名無しさん :02/01/05 03:24
http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_1
これだな。

215 名前:デフォルトの名無しさん :02/01/05 04:09
どうでもいーことだけど、みんな
template<class T>
て書く?
template<typename T>
て書かない?

216 名前:デフォルトの名無しさん :02/01/05 04:22
面倒っちいから template<class T> って書くよ

217 名前:デフォルトの名無しさん :02/01/05 10:04
>>202
>std::vector<T> v;
> T* p = &v[0];
> vector は C の配列と同様のメモリ配置になることが規格上保証されてるから、これで
> OK。C で書かれた関数と C++ 混ぜて使う場合 vector は重宝します。

std::vector<T> v;
T& r = v[0];
でなんか問題あるのか? ここでポインタわざわざ使う必要性が見えないんだが。

218 名前:デフォルトの名無しさん :02/01/05 10:56
>>217
「C で書かれた関数と C++ 混ぜて使う場合」があるからなんでは?

219 名前:デフォルトの名無しさん :02/01/05 10:58
>>213
gcc-3.0.2/include/g++-v3/bits/stl_vector.h だと、
typedef __normal_iterator<pointer, vector_type> iterator;
になってるね。__normal_iterator は別のファイルでクラステンプレート
で定義されてる。

220 名前:217 :02/01/05 11:15
>>218
その「Cで書かれた関数」というのが、「ポインタを引数に取る関数」の
ことならまあ納得するけど、「CとC++を混ぜる」場合、C++上でしかありえ
ないのにC的にする意味は無いと思うが。CにもC++にも適用したいアルゴリズム
はポインタよりイテレータの文脈で処理すべきだ。

221 名前:デフォルトの名無しさん :02/01/05 11:15
>>211
>……知りませんでした、申し訳ない(^^; 「.hと.cppに分離」はC++の作法だと
つーか、それは MS の作法なんじゃねーの? 不必要に情報をタレ流さない
ためには、やたらと .h を作らないほうがいいと思うんだが。

あと、テンプレートクラスを .h で定義しておいて、そのメソッドを
.cpp で実装する、ということは可能だよ。export が使えれば一発だが、
これが使えなくても、必要に応じて明示的なインスタンス生成というのを
やればよい。

222 名前:デフォルトの名無しさん :02/01/05 12:31
>>220
DirectX みたいな「与えられた API」を使ってプログラムを組む場合には、C++ を使っていてもポインタに
縮退させること必須でしょうが。文脈読めよ。

223 名前:デフォルトの名無しさん :02/01/05 13:50
>>222
どして? その元の話がvectorを使おうとしてる以上DirectX云々は
副次的な文脈だろ。ちなみに俺の回答は「そんなとこでvector
使うんじゃねえヴォケ!」

224 名前:デフォルトの名無しさん :02/01/05 14:19
>>223
> 「そんなとこでvector 使うんじゃねえヴォケ!」
なんで?

225 名前:デフォルトの名無しさん :02/01/05 14:32
>>223
STL は C との相互運用にも十分に配慮されたライブラリだから、使わない手はないと思うが。もし英語が
苦手でなければ Scott Mayers の Effective STL を買ってきて Item 16 "Know how to pass vector and
string data to legacy APIs." を読むことを薦めとく。

226 名前:デフォルトの名無しさん :02/01/05 14:36
>>215
Modern C++ Design で、
クラス(ユーザー定義型)しか使わないなら class
組み込み型も使う可能性があるなら typename
っていうふうに使い分けてた。

>>219
いわゆる type traits ってやつかな。
__normal_iterator<pointer, vector_type> を展開すると結局ただの valuetype* になりそうな気がするんだけど。

227 名前:デフォルトの名無しさん :02/01/05 14:38
>>223 なんでかなー、vector 使って良いじゃん。
extern "C" の既存関数やAPIに対して、
std::string の持つデータを .c_ptr() や .data() で渡すのと同じでしょ。

それとも、vector<T> のかわりに basic_string<T> を使えという
主張ですか?それなら納得するけど。

228 名前:無名λ式 :02/01/05 14:54
>>168
g++は、version3以上じゃないと、VC++6よりtemplateはへぼい。そこに注意。

229 名前:デフォルトの名無しさん :02/01/05 14:55
>>219
gcc の STL は読んでないので知りませんが、他の有名どころだと STLport の vector<T>::iterator がデバッグ
モード限定で T* ではないですね。

話がそれるけど STLport のデバッグモードは無効な iterator 参照などを簡単に発見できて便利です。T* な
iterator だと、元の vector に push_back しても iterator が正しい領域を指しつづけることが多いから、バグを
埋め込んだときに再現率が低くて泣ける。

230 名前:デフォルトの名無しさん :02/01/05 16:39
>>225
>>223
>STL は C との相互運用にも十分に配慮されたライブラリだから、使わない手はないと思う
>が。もし英語が苦手でなければ Scott Mayers の Effective STL を買ってきて Item 16
>"Know how to pass vector and string data to legacy APIs." を読むことを薦めとく。

やむをえない時にやるべきことと、率先してやるべきことを混同していないか?
スタック上とか任意の場所にメモリを置いていたいときにvectorだと簡単に管理
できないし、相手先のC関数の挙動とvectorの実装が完全に見えている(=カプセル化
されていない)状況でしか使えないというのはバグの温床以外の何物でもない。
せめて間にラッパ入れてやらないと。

231 名前:デフォルトの名無しさん :02/01/05 17:17
>>230
スタック(というか自動変数)として vector とるのはまったく問題ないけど。その場合でもデータそのものは
allocator 経由で(一般には)ヒープ上に取られた領域に置かれるけど、その違いが問題になるケースって
あるなぁ。

考えられるのは API 内部で渡されたデータに対して free() したり realloc() するケースだけど、それは

 生成 破棄 利用

いずれも専用の API 群で行う設計で、そもそも vector 使う余地がないし。

> 相手先のC関数の挙動とvectorの実装が完全に見えている(=カプセル化されていない)状況でしか使え
> ないというのはバグの温床以外の何物でもない。
問題になるような関数の例を希望。

あと vector の実装に関して仮定していることは「データが連続領域にとられること」だけで、特に問題ない
と思う。

> やむをえない時にやるべきことと、率先してやるべきことを混同していないか?
C++ だと malloc() で確保した生のメモリ領域を自前で管理せず vector を使うのは「率先して」やるべきこと
でしょう。例外中立/安全な可変長のストレージを作ろうとすると、結局 vector と同じような実装にいきつく
ことになるし。

232 名前:デフォルトの名無しさん :02/01/05 17:30
>あと vector の実装に関して仮定していることは「データが連続領域にとられること」だけ

これ、
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/
に載っていますか? ちいさいデータなら並んでるかもしれませんが大きな
データは簡単に確保できず断片化されるとかあるんじゃ、と思ったんで。

233 名前:デフォルトの名無しさん :02/01/05 17:34
vectorの意図しているのは可変長配列であって、
バッファではないよ。バッファとして使いたいなら本来は
それ用のクラスを作って使うべき。もしくはget_temporary_bufferを使うか。
理念でなく実利で言うなら、要素のコンストラクトがおこるとかもある。

>問題になるような関数の例を希望。

について言えば、明らかにカプセル化の理念を無視してるわけだから、
例なんかなくても一見してだめ。

もっとも、俺自身は「わかってやってるならよし」という立場だけど。

234 名前:227 :02/01/05 18:06
あっさり無視されたんでもう一度書くけど
>>233 バッファとして使うなら basic_string<T> ではだめかね

235 名前:デフォルトの名無しさん :02/01/05 18:47
stringのc_str()とかdata()って、新しい領域を内部でnewしてるんじゃないかと
怖いんだけどそんなことってない?

236 名前:デフォルトの名無しさん :02/01/05 20:25
>>235 コピーした直後とか、部分文字列として取りだした直後は、
内部で new してる可能性があるね。でもなぜそれが怖いの?

237 名前:デフォルトの名無しさん :02/01/05 20:56
>>232
それだと vector と deque を分ける意味がないと思うけど。

規格にざっと目を通してみたけど、vector のデータが連続領域にとられることを明記してる文章は
見当たらんね。Effective STL には p.74 に

 The elements in a vector are constrained by the C++ Standard to be stored in
 contiguous memory, just like an array, ...

と書いてあるけど。

>>234
名前が basic_string だから文字列にしか使えん、と思ってる人多数に一票。わりと使いでのある
クラスなんだけどね。

238 名前:デフォルトの名無しさん :02/01/05 21:17
>>233
> 明らかにカプセル化の理念を無視してる
どこが? vector の内部データ形式を仮定してるところかな。

basic_string は値の「共有」を可能にするために参照カウンタが入ってることが多いよね。書き換えが少ない
(でも書き換えないわけじゃない)小規模なデータを値として渡していく場合には便利だけど、DirectGraphics
の頂点リストを管理するには不適切と思うな。

っつかバッファでもサイズが大きくなったら basic_string 捨てて rope だと思われ。標準じゃないけど。

239 名前:デフォルトの名無しさん :02/01/05 22:03
ropeって、その安直なネーミングが萌え

240 名前:デフォルトの名無しさん :02/01/05 22:11
>>236

Cスタイル関数に渡すのにc_str()して、それが何万回も呼び出されると考えると、
newされるのは勘弁して欲しい

241 名前:デフォルトの名無しさん :02/01/05 22:37
>>240
性能に関しては、プロファイラにかけてボトルネックになってることを特定してから考えれば良いと思う
けど。

ちなみに VC6 添付の STL や STLport, あたりだと、内部で C 形式の文字列データを使ってるので、
c_str() は

  return this->internal_buf_ptr;

みたいなコードになってる。コストは this 経由の間接参照が一つ入るだけ。gcc 2.95.3 の STL だと

const charT* c_str () const
{ if (length () == 0) return ""; terminate (); return data (); }
charT* data () { return reinterpret_cast<charT *>(this + 1); }

と末尾を eos で埋める terminate() 呼び出しが入るけど、それを除くとコストはやっぱり間接参照ひとつ分。

242 名前:236 :02/01/05 23:55
>>240 c_str() 呼出毎に毎回 new は無いから安心しな。必要に応じて new するだけだよ。
言語規格上は毎回 new しても構わないが、まともな実装ならそんなことはしない。

243 名前:デフォルトの名無しさん :02/01/06 00:59
memcpy( const_cast<char*>(stringVar.data()), ***, ***)
みたいなことをよくするので(他にはfreadとか)、いちいちnewされたら困る。あと、こういう実相依存なプログラムしてるといつか困るとは思う。

244 名前:236 :02/01/06 01:57
>>243 はぁ〜、const外したらマズイしょ。しかも memcpy …
stringの保持データ操作には
string::assign(const charT*, size_type) や
string::replace(size_type, size_type, const charT*) を使っておくれ
fread に渡すのは auto 変数のバッファにし、後で assign/append しておくれ

245 名前:199 :02/01/06 02:18
ううっ、ついていけないほどの高度な議論になってる……(^^;

とりあえず、
std::vector<T> array;
void* p = &(array.at(0));

で、

T array[5];
void* p = array;

と同じ動作になりました。アドバイスしていただいた皆さんに感謝(拝)
ちなみにクラス定義はメソッド実装も含めて全部.hに集約したナリ。
軟弱でソマソ(^^;

ちなみに、VC++ Ver.6のSTLには、メモリ不足時にかなり致命的なバグが
あるとゆー話を聞いたのですが本当?
なんでも、メモリ確保に失敗したら例外出さずにreturn 0;するとか……(^^;

246 名前:デフォルトの名無しさん :02/01/06 02:30
>>245
STL に限らず、VC++6.0 の new はメモリ確保に失敗しても例外投げないよ。
set_new_handler の仕様も標準のものと全然違う。

247 名前:デフォルトの名無しさん :02/01/06 02:33
>>245
バグというか、仕様ですね。operator ::new(size_t) 失敗時に呼び出すハンドラを _set_new_handler() で指定
できるので、そこで対処してください。

248 名前:何で検索すればいいんでしょうか(´д`; :02/01/06 03:22
int型の値ををChar型に投げたいんですが

int i = 3;char c;
c = i;

としたとき、
cの値が'\003'ってなるのですが、原因がわからず妙な所で苦戦しています。
だれか助けてください・・・

249 名前:デフォルトの名無しさん :02/01/06 03:23
今日は盛況だねー
>>243
>memcpy( const_cast<char*>(stringVar.data()), ***, ***)

それっぽいのは俺もよくやる。WindowsだとconstになってるべきAPIが
constじゃない場合があるからその場合は仕方なく...とか思ったら
コピー元じゃなくコピー先かよ。氏ね

250 名前:248 :02/01/06 03:46
う・・・もしや文字コードが3になってるだけか・・・


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