[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 21:45 / Filesize : 205 KB / Number-of Response : 843
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part56



1 名前:デフォルトの名無しさん [2007/07/26(木) 00:33:07 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>2-15 付近参照

前スレ
class C++相談室lt;part56gt;
pc11.2ch.net/test/read.cgi/tech/1170343752/l50



369 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 18:30:39 ]
あんまり真面目に読んでないけど、とりあえずこうじゃね?
 return (*aaa.subclass)["bbb"]; 

370 名前:368 mailto:sage [2007/08/16(木) 18:44:26 ]
>>369
どうもー
やってみましたがだめでした

371 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 18:53:11 ]
>>370
エラーメッセージが変わっただろ。ちゃんとその辺を書けよ。
で、戻り値の型がLPSTRなんだから、らreturn文で呼ばずに単独で呼んでみな。

372 名前:368 mailto:sage [2007/08/16(木) 19:00:40 ]
>>371
うーんエラーメッセージは変化なしです

373 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 19:06:17 ]
aaa.subclass->operator[]("bbb")

374 名前:368 mailto:sage [2007/08/16(木) 19:08:45 ]
>>373
コンパイル通りました
ありがとうございました

375 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 19:11:26 ]
意味があるかは知らんが、(*aaa.subclass)["bbb"] でコンパイルは通るぞ。

376 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 19:11:34 ]
>>373
俺もそうだと思ったけど、関数形式で呼ぶのがなんか嫌だから書かなかった
なんか解決策ないかね

377 名前:371 mailto:sage [2007/08/16(木) 19:13:21 ]
>>372
そうか? 前者は引き数が合わなくて関数が見つからないが、後者は戻り値の型が合わなくてエラーになると思うのだが。
つーか、なんでまたmain()のreturnなんかで試すんだ? >371の後半は読んでないのか?



378 名前:376 mailto:sage [2007/08/16(木) 19:13:31 ]
ああそうか、違和感の理由が分かった。
連想配列にしたくて添え字をオーバーロードしているはずなのに
opreator[]で呼んだら意味を成さなくなっちゃうからだ。

379 名前:376 mailto:sage [2007/08/16(木) 19:15:59 ]
つうことで解決案

subclassをカプセル化して、参照越しにoperator[]を呼ぶ

380 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 19:23:44 ]
(*aaa.subclass)["bbb"] でコンパイル通らず、
aaa.subclass->operator[]("bbb") でコンパイル通るってあり得ないと思うんだが。

381 名前:368 mailto:sage [2007/08/16(木) 19:28:22 ]
>>375
あわわ間違って(*aaa.subclass["bbb"])としちゃってたようです

>>377
エラー部分だけ抜き出そうとして型違いのreturnになってました、ごめんなさい…

>>379
単語の意味がわかってないので検索してやってみます、ありがとうございました

382 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 19:35:38 ]
でもなんでchar *じゃなくて、char * &なんだろう。
constでないということは、こういうことがやりたいんだろうか。


(*aaa.subclass)[''bbb"] = new char[10] ;

いや、ひょっとしたらこういうことがしたいのか

char * & ptr = (*aaa.subclass)[''bbb"] ;
ptr = static_cast<char *>( realloc(ptr) ) ;

383 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 20:59:50 ]
class Base
{
public:
Base(int n) {}
};
class Derived : Base
{
public:
Derived(int n) {}
};
これがどうしてダメで、Base::Base()が必要なのか教えてください。

384 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 21:06:38 ]
親クラスに n を渡すなら、それをちゃんと書かなきゃいけない。

public:
Derived(int n) :Base(n) {}

385 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 21:06:53 ]
はい?

386 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 21:07:27 ]
>>383
その例のDerived のコンストラクタは結局 Derived(int n) : Base() {} の省略形だから

387 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 21:21:45 ]
そのnは親に渡さずに別に使うnかもしれないし。



388 名前:デフォルトの名無しさん [2007/08/16(木) 23:12:17 ]
>>383
Derived クラスのインスタンスを生成するときに
Base クラスのコンストラクタを呼び出すからなんだと思います。
コンストラクタを定義していないときはデフォルトコンストラクタが呼び出されるけど
定義してると定義されたものを呼び出すから
この場合は引数のいらないコンストラクタを定義するか
Derived クラスのコンストラクタで
Derived(int n) : base(100) {}
みたいに Base(int n) を呼び出して
引数を渡さないとだめだと思うんです。

初心者なんで間違ってるかもしれません。


っていうか STL 難しすぎでうっ!

389 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 23:20:25 ]
Baseのコンストラクタにデフォルト値を書いておくのもいいかも

っていうか STL 関係ねー

390 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 00:01:01 ]
>>388
>っていうか STL 難しすぎでうっ!
でうっ?

391 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 00:20:57 ]
唐突にこれを思い出した
ttp://www.karakuri-box.com/~killer-q/file7/KITERETU0022.png

392 名前:デフォルトの名無しさん [2007/08/17(金) 00:41:05 ]
すいません。釣りではありません。
C++ってどんな局面で使うんですか?
WinアプリならC#使ったほうが圧倒的に楽


393 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 01:00:07 ]
脳みそ沸かしたいとき

394 名前:デフォルトの名無しさん [2007/08/17(金) 01:24:19 ]
Cで先頭アドレスと要素数がわかってるのですが
ForループじゃなくてC++のiteratorに変換してくれるtemplateとかないんですか?

ない場合どのiterator継承すればいいんでしょうか

395 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 01:40:46 ]
T*head; size_t element;が既知なんでそ?
なら、&head[0]〜&head[element]がiteratorの要件を満たしてくれるでそ?

396 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 01:48:01 ]
>>392
楽かどうかなら C# が楽だろうが、
C# は Windows にしか優しくないし、
速度も C++ に劣るし、
そういうのが必要な時には C++ が圧倒的有利。

397 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 02:19:58 ]
速度が必要になるようなミッションクリティカルな場面に出会ったことがない
最近は全部C#。



398 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 02:21:20 ]
サーバーアプリだとC#?ハァ?

399 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 02:38:29 ]


400 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 03:59:53 ]
つかここ#かんけーねーし

401 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 05:58:45 ]
>>392
C#を実装するのに使います

402 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 12:37:18 ]
>>401が良い事言った

403 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 21:16:42 ]
なぜ想像力がデスクトップとサーバー位にしか働かないんだ
プログラムが必要な場面はいろいろあるぞ

404 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 21:39:47 ]
class CFUNC a;
の2次元配列を動的に確保する場面があって、
CFUNC ***pppa;
として使いたいですが、
pppa = new CFUNC**[y_len];
でまずy要素を確保して
pppa[0] = new CFUNC*[x_len];
各y要素のx要素を確保して
pppa[y][x] = new CFUNC();
で、各要素をインスタンス化して
(*(pppa[y][x])).hoge();
みたいに使おうと思うのですが、このpppaを破棄する場合に
deleteはどう書いたらいいのかわからなくなってしまいました。。。どなかたpppaをdeketeしてもらえませんか?
ちなみによくしらないのですが、delete[]ってなんで配列の要素数がわかるんですか?


405 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 22:15:50 ]
typedef CFUNC*** PPPCFUNC
typedef CFUNC** PPCFUNC
typedef CFUNC* PCFUNC
と整理してやると

PPPCFUNC pppa = new PPCFUNC[y_len]
pppa[0] = new PCFUNC[x_len]
pppa[y][x] = new CFUNC
になるんで
deleteとdelete[]で困る局面はなくなると思ってみたり

要素数は実装によるけどもコンパイル時には決められないからどっかで一元管理してんでないすか多分
俺はそうする

406 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 22:53:53 ]
VC++では先頭の手前に要素数が格納されてた希ガス

407 名前:404 mailto:sage [2007/08/17(金) 22:59:04 ]
なるほど、typedefを忘れてました。
ではこれで確保したpppaはdelete[] pppaで破棄できるんですねっ!
要素数は、
int pppa_len_y;
int *pppa_len_x = new int[ pppa_len_y ];
でnew時に一緒に初期化しています。
もっと手軽な方法ありますか?




408 名前:404 mailto:sage [2007/08/17(金) 23:02:44 ]
>406
それじゃぁmallocするときに、必要size+1とってfreeのときにそれ利用してるんですねぇ。
ってことは要素数を保持しなくても、ポインタの手前の要素数使えってこと?
ちなみにc++の規定ですか?処理系依存ですか?

409 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 23:17:52 ]
処理系依存。

410 名前:404 mailto:sage [2007/08/18(土) 00:17:58 ]
>>405
PPPCFUNC pppa = new PPCFUNC[y_len];
でnewしようとすると、PPFUNC*からPPPFUNCに変換できません
と怒られてしまいました。
PPPCFUNC pppa = (PPPFUNC)( new PPCFUNC[y_len] );
でキャストして大丈夫なのでしょうか?

411 名前:404 mailto:sage [2007/08/18(土) 00:36:14 ]
すいません、勘違いです。typedefミスってました。OTL

412 名前:383 mailto:sage [2007/08/18(土) 11:08:57 ]
>>384-389
ありがとうございました。よくわかりました。

最近C++を勉強しているのですが、Java育ちのゆとり世代なものでスパルタさにガクブルものです。
class Foo
{
private:
char* s_;
public:
Foo(char* str) : s_(new char[strlen(str)+1]) { strcpy(s_, str); }
~Foo() { delete[] s; }
};
int main()
{
Foo a("foobar");
Foo b = a;
}
この程度で落ちるってのがすごすぎです(なぜ落ちるのかはちゃんとわかりますが・・・)。

413 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 11:24:18 ]
>>412
生でnewを使うからそういう羽目になる。
std::stringを使うなり、std::vectorを使えばいい。
せめて、スマートポインタを使え。

414 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 11:34:02 ]
コピーコンストラクタや代入演算子をちゃんと書かないから・・

415 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 12:19:01 ]
C++を使う時は、リソースの所有権を常に意識する必要がありますな。
RAIIはちゃんと勉強しといたほうが良いよ

416 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 12:37:37 ]
そうだな、コピーコンストラクタと代入演算子は常に書くべき。

417 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 12:40:35 ]
Java→C++とか死亡ルートじゃね?
Java→C→C++って回るべきだと思うんだが



418 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 13:32:09 ]
GC付きC++って選択肢もあるんでないの(w

419 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 14:17:34 ]
Javaなんか使うから頭が馬鹿になるんだよ。
GC付きの言語を使うと変な癖が付く。

420 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 15:08:22 ]
時代に逆行している人

421 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 16:59:23 ]
>>417
自分はC#→C→Java→C++ってやってきたけどおk?

422 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 17:03:18 ]
コンストラクタで例外を投げるクラスがあり、
そのクラスをstaticに使ってるんですが、
この場合、どのように例外をキャッチすればいいのでしょうか?

class Throw{ public: Throw(){ throw 1; } };
class TestClass{
static Throw throw;
};

こんな感じです。

423 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 17:12:19 ]
>>422
コンストラクタの中でキャッチするか、プログラムが死ぬか。

424 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 17:36:05 ]
>422
staticをやめる

425 名前:デフォルトの名無しさん [2007/08/19(日) 13:25:57 ]
教えてください。

たとえば
int i = 100, *ip;
double d = 123.456, *dp;
ip = &i;
dp = &d;
char *s = "abcdefg";

cout << ip << " " << dp << " " << s << endl;

このようなコードで int型やダブル型のポインタを cout で出力すると
アドレスが表示されるのに char型のポインタだと
文字列が表示されるのがいまいちよくわからなかったんですが
ずっと勉強してきてふと思ったんです。
cout で演算子オーバーロードでそうなるようにされてるのかなと。
で定義されているコードを探そうと思ったんですけど
なんかごちゃごちゃしててよくわかりません。
もし予想が当たってるならどのファイル見ればいいかでしょうか?

426 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 13:54:49 ]
>>425
basic_ostream っていうクラステンプレートに対して定義されている。
char もテンプレート引数になってるからちょっと探しにくいだろうね。
ヘッダ ostream に対応するファイルで定義されているはず。

ごちゃごちゃしたヘッダを読むのがいやなら >>2 から規格のドラフトでも見るといい。

427 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 17:00:46 ]
教えてください。



428 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 17:31:07 ]
何をだ

429 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 18:41:48 ]
>>428
事故解決すますた

430 名前:デフォルトの名無しさん [2007/08/19(日) 21:20:33 ]
>>426
ありがとうございます。
ファイル見てみたんですけど
今の僕にはまだ難しくてよくわかんないんで規格もみたんですけど
いまいちわからなくて
検索してたら説明されてるページをみつけました。
www.io.nara-su.ac.jp/kanrishitsu/manual/FSUNf90/LANG/japanese/C++/stdlib/stdref/bas_8583.htm

これですっきりしました。

431 名前:デフォルトの名無しさん [2007/08/20(月) 15:44:57 ]
質問です。
下のクラス図のようなクラスを実装したいのですが、DataClassのように、二つ(以上)で共有しているクラスは、コード上でどのように書いたらいいのでしょう?
DataClassのインスタンスをグローバルな領域で作るしかないのでしょうか?

クラス図
enjoi.blogdns.net/up/src/868.jpg

とりあえず書いてみたコード
class DataClass{
private:
  int data;
public:
  void setData(int newData);
  int getData();
};
class ClassB
{
public:
  bool DoSomething();
};
class ClassA
{
private:
  ClassB classb;
};


432 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:18:28 ]
状況次第じゃね。

どっちかに持たせて、もう片方にも渡せるようにすることもあるし、
動的に確保して、A, B の両方のスマートポインタに入れとくこともあるし、
A を所有するクラスに持たせて、そっから渡すようにすることもあるし、
シングルトンにしてグローバルな領域に置くこともあるし、

433 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:18:28 ]
そんなに文句あるんならnamespace使うなりClassAとClassBを統合するなりすれば?

434 名前:デフォルトの名無しさん [2007/08/20(月) 16:20:59 ]
初心者だからよくわかんないんですけど
DataClass をメンバとして持つんですか?
ClassA と DataClass の関係って必要なんですか?
ClassB経由で十分なんじゃないでしょうか?

435 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:23:07 ]
関連のあるABのオブジェクトが同じDataClassオブジェクトと関連を持つかどうかは示されていない。
むしろ同じオブジェクトではないと考えるほうが自然。

436 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:28:10 ]
A, B, DataClassを保持する親クラスParentを作っておいて、A, Bのインスタンス生成時にParentへのポインタを渡し、
各インスタンスはParentへのポインタを通してDataClassへとアクセスする。

437 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:30:25 ]
B に入れといて、B を通して操作する。



438 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:35:13 ]
多重継承はやめとけ。実世界でも親の種が違う生き物は短命だ。

439 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:36:43 ]
どこに多重継承が出てくるんだ?

440 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 16:59:47 ]
あの矢印は関連。サブクラスは白抜き三角矢印。

441 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 17:56:47 ]
たくさんのご回答ありがとうございました。

複数の方法論に、そもそも設計の段階でご意見まで、たくさんいただきまして、ありがとうございます。

少し数があるので、それぞれについて吟味して、決めた際にまた改めてのお礼がてらご報告にきたいと思います。
ありがとうございました。

442 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 09:33:29 ]
>改めてのお礼がてらご報告にきたいと思います。
しなくていいよ。

443 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 00:48:57 ]
stringstring を途中で空にすることはできるでしょうか?

444 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 00:56:17 ]
std::stringstream?

445 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 01:27:07 ]
なんだこのバグは
support.microsoft.com/kb/326616/ja
>>443
stringstream.str("");

446 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 02:00:38 ]
>>445
鬱になった
やはりSTLportを入れて使(ry

447 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 02:10:08 ]
std::coutで、時々アドレスのような文字列("0xABCDEF12"みたいな)が出力されたり、
std::wcoutで何も出力されなかったりして困ってたんだけど、445が原因?
でもVS2005 Proだから違うか



448 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 02:34:28 ]
>>447
coutにwchar_t*食らわしたり、localeを適切に設定せずに日本語文字列食わしてるならお前が悪いだけ。

449 名前:印字ケータ [2007/08/23(木) 14:31:20 ]
バイナリエディタでファイルを開くと

保存してある漢字の"日"という文字は16進数で93 FAと表示されてますが、

コレを読込んで、配列に入れると-109と-6となります。

16進数で表示させたいので、変換する方法を教えてください。

お願いします。

450 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 14:35:18 ]
unsignedにキャストすればいいんじゃね。

451 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 14:40:35 ]
93 FA を2進数であらわすと
1001 0011 1111 1010
10010011 を符号付き10進数であらわすと
-109
11111010 を符号付き10進数であらわすと
00000110
-6

そのまま16進にすれば同じ
気にしないで突き進め

char を intにするなら符号拡張がおきるので>>450のとおりunsigned にしとけばいい

452 名前:印字ケータ [2007/08/23(木) 14:42:15 ]
>>450

返答ありがとうございます。

早速やってみましたが、変換後に4294967187というデカイ数値になりました。

ちなみに、unsignedの変数にキャストして代入してみました。

もしかして私のやり方が間違ってますか。



453 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 14:54:41 ]
4294967187 ってのは16進に直すと ffffff93
93 はマイナスだから、そのままint にもってくと 符号拡張するんだよ
unsigned にキャストってどこでどうやったの?
unsigned な変数に入れてやってみ。

454 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 14:56:17 ]
符号拡張されてるんだろう
10010011→11111111111111111111111110010011

455 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 15:04:05 ]
char ch = 93;
int n = (unsigned char)ch;

456 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 18:34:31 ]
>>445
Dinkum版stringの短文字列最適化がアダになったな。
実装としては面白くて好きなんだがな。

457 名前:デフォルトの名無しさん mailto:sage [2007/08/23(木) 22:36:57 ]
2005SP1で直ってるっぽいが



458 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 08:15:51 ]
vector< struct X > Func_A();
vectorとかコレクションを返す関数って効率悪い?

459 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 08:30:10 ]
>>458
コンテナを参照で受け取ったほうがいいんじゃないか?

460 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 08:44:11 ]
そこでRVOに期待、右辺値参照にもっと期待。

461 名前:sage [2007/08/30(木) 10:25:41 ]
>>459
参照で受け取るっていうのは
void Func_A( vector< struct X >& );
か、
vector< struct X >& Func_A();
ってことですか?
とりあえず上の参照を引数にする方でやってみます

462 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 11:47:47 ]
vector< struct X >& Func_A();
はどっかに所有者用意しなきゃいけないから色々と面倒じゃね?

基本はauto_ptr戻しだと思うけど。


463 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 23:55:27 ]
いや、たぶん void Func_A(std::vector<struct X>& arg) のことだろう。

仕様と実装を混同するのはよくないが、実際には多くのコンパイラにおいて
「構造体(class)を返す関数」は、暗黙の引数(返り値へのポインタ)を受け取って、
そこに書き込んで返しているわけだから。

で、return直前にインスタンスを生成する以外の場合、つまり
ローカル変数としてvectorを宣言していろいろ操作しそれを返す場合
おそらくRVOされる可能性も低いんじゃないね。知らないけど。

464 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 00:49:22 ]
>>463
よくある戻り値用のポインタが指しているのは確保されただけで
まだコンストラクタが走ってない領域ね。引数で受け取る場合は
必ず構築済みのインスタンスを指すんで、仕様的にも違いがある。

最後の場合は「可能性が低い」じゃなくて RVO は不可能。

465 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 00:52:15 ]
>>464
Named RVOはVC8がやってるらしいですぜ

msdn2.microsoft.com/en-us/library/ms364057(vs.80).aspx

466 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 00:55:03 ]
ずっと前の gcc に付いてたのに削除されたな。あれは仕様的に
何か問題があったんだろうか?

467 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:09:49 ]
gcc.gnu.org/gcc-3.1/changes.html
コンパイラが勝手にやるようになったから文法からは削除されただけみたい。



468 名前:464 mailto:sage [2007/08/31(金) 01:23:50 ]
いろんな変数返されたとき困るじゃん、とか思ってたけど、そうじゃないときには
働くのね。ふーん。

469 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:35:07 ]
引数が同じで戻り値が違う型の関数を定義する方法って知らないですか?
できればクラスのメンバ関数でやりたいです
まえにWebで見かけたんだけど見つからなかったorz


470 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:48:21 ]
>>469
引数の型が同じなら関数を呼び分けることができないから、基本的に無理だろう。
戻り値の型を基底クラスのポインタにして、異なる型の派生クラスのオブジェクトの
ポインタを返すとかじゃダメ?

471 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 03:13:32 ]
>>469
こんな感じ?

struct A {
 template <typename T> T foo(int);
};

void bar() {
 A a;
 char c = a.foo<char>(0);
 short s = a.foo<short>(1);
 // ...
}


472 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 14:55:28 ]
浮動小数点の小数点以下を簡単に取る方法ってないですか?

473 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 15:13:39 ]
f - floor(f)

474 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 16:14:22 ]
>>472
modf
>>473は負数のとき正しくない

475 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 17:35:42 ]
f = f - (float)((int)f);
とかじゃ駄目?

476 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 18:59:33 ]
f > -1 ? f - floor(f) : aaaaaaaaa

477 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 19:19:41 ]
>>475
もともと整数部分がint範囲を超えてる場合があるので、
intにキャストするのはまずいと思われ。



478 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 23:01:01 ]
まさにそのための trunc (truncf) という関数があるんだが、
調べてみたらこれは C99 で定義されてるらしいから C++ では普通使えないな

とはいえ持ってる処理系に存在するかどうかは調べてみたらどうよ

479 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 23:31:14 ]
unsigned longにキャストは駄目なのか

480 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 00:05:17 ]
fmod(f, 1.0)

481 名前:469 mailto:sage [2007/09/01(土) 00:26:15 ]
>>470,471
レスdクスです、
自分が見てたのは、こんなのでした
素直に名前を変えます...

struct testFunc {
int n, m;
testFunc(int _n, int _m = 1) { n = _n; m = _m; }
testFunc(int _n, double _m) { n = _n; m = 10; }
operator int() { return n * m * 2; };
operator double() { return n * m * 3.0; };
};

void main() {
int a = testFunc(5);
double b = testFunc(5);
int c = testFunc(5, 5);
double d = testFunc(5, 5);
int e = testFunc(5, 5.0);
double f = testFunc(5, 5.0);
}

もう少し探したらそれらしいのが見つかりました
ttp://homepage2.nifty.com/well/FunnyStorage.html#mutate
やりたかったことはこんな感じ↓
ttp://anond.hatelabo.jp/20070722050021


482 名前:デフォルトの名無しさん [2007/09/02(日) 00:02:07 ]
vector<char> v;

for (int i=0; i<v.size(); i++)
{
  .....
}

というコードの i<v.size() で
> warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
という警告が出るんですが、
こういうときは unsigned i=0 にして
きっちり警告を消してしまうもんなんでしょうか?


483 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:07:42 ]
うん
警告も消すのが良い作法

484 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:11:18 ]
>>482
unsigned でも警告は消えるけど、v.size()のリターン値と同じ型を使うのが普通。

485 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:12:08 ]
これが規格厨を黙らせる、完璧に正しい方法。

for ( vector<char>::size_type i = 0 ; i < v.size() ; ++i )

486 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:16:44 ]
そこでautoとか未来を先走るわけですよ。カモンC++0x

487 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:23:34 ]
>>486
でもこの場合どうやるんだろう。
そもそも>>482はstd名前空間のvectorではないから、自前実装の俺様vectorである可能性もあるんだよね。
ひょっとしたら、size_typeなど定義されていないかもしれない。

こういうことできるの?

decltype( v.size() ) i ;

sizeofに関数を渡すと、戻り値の型のサイズになるから、
decltypeだと戻り値の型になってくれるんだろうか。

なんてことをふと考えてしまった。
どうなるの? 教えてハゲな人。



488 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:27:02 ]
さすがにバカ過ぎるだろ

489 名前:486 mailto:sage [2007/09/02(日) 00:30:15 ]
すまん、脳内フィルターで485のループがイテレータに見えていた。
for (auto i = v.begin(); i != v.end(); ++i)

490 名前:デフォルトの名無しさん [2007/09/02(日) 00:40:25 ]
>>483-489
なるほど。さんくすです。

>> 484
やっぱりそうですよね。
安易に型決めるんじゃなくてちゃんと考えるべき何ですよね。

>> 485
感動しました。



491 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 01:34:22 ]
何でイテレータ使わないの? >482
i++使う意味も判らん……

492 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 01:50:17 ]
482じゃないが、iの値自体が処理に絡む場合はイテレータ使えんだろ

for (int i = 0; i < v.size(); i++) v[i] = i;

みたいな。

493 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 01:59:53 ]
>>491
初心者だからだろ。
そのくらいわかれよ。

494 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 08:40:18 ]
>>487
できるよ。

495 名前:デフォルトの名無しさん [2007/09/02(日) 12:06:53 ]
>>491
そうですね。イテレータでもいけそうですね。
今はサンプルプログラム打ちながら勉強してるんで
そこまでは思いつきませんでした。

>>492
ブロック内部でローカル変数作れば解決できそうですね。

またひとつ勉強になりました。
ありがとうございます。


496 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:35:18 ]
>>495
そうそう、ループはイテレータで書くのが癖になると、内部でint idx = it - vec.begin()みたいなのを書くのも癖になる。

497 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:47:29 ]
C++に限ったことではないですけど、Map型とList型って似て非なる物だといいますけど、いざって時にList→MapにしたりMap→Listにしたりする時は
どうすればよいのでしょう。効率的に考えて



498 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:50:09 ]
どういう変換をしたいのかサパーリ
似て非なるっていうか、ListとMapは別物じゃ?

499 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:55:44 ]
>>498
変換というか、Map型を継承しているクラスがList型で取り出せたりその逆も・・・出来る感じの事。
説明下手ですまそ。

500 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:57:46 ]
std::map<a,b> を std::list< std::pair<a,b> >にコピーする話なら、
std::copy(map.begin(), map.end(), std::back_inserter( list ) )
でいけるんじゃね?効率なら知らん。

501 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 14:26:23 ]
list.assign(map.begin(), map.end()) だろ。

502 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 14:42:28 ]
>>499
っ アダプタパターン

503 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 01:48:49 ]
クラステンプレートに関して質問させてください、
template <class T>
class hoger {
  public:
    typedef T hogeT;

    struct fuga {
    } m_fuga;
}

main()
{
  hoger<int> Hoge;
  hoger<型>::fuga &Fuga = Hoge.m_fuga;
}

みたいなことをやろうとしたんですが、hoger内の構造体とかを
(長くなってしまうので)ローカル変数で参照作って使いたいとき
hoger::fuga &ではなくhoger<型>::fuga &とする必要があると思うのですが
hoger<Hoge.hogeT>::fuga みたいに、Hogerオブジェクトからその型の情報は
得られないのでしょうか?
こういう情報(Hogeはintを指定して作成したということ)は外で持っておくしかないのでしょうか。
よろしくお願いします。

504 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 01:53:00 ]
>>503
うん。
何回も書くようなら typedef しとく。

505 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 02:01:24 ]
>>500-502
ありがとうございます。もう少し勉強してみます。

506 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 02:03:57 ]
現状だとtemplateに逃げるしかないな。

507 名前:503 mailto:sage [2007/09/03(月) 13:52:09 ]
遅レスですみません、回答ありがとうございました。
>>506
なるほど、やっぱそうするしかないのですね・・
とりあえずはHoge.m_fuga.foo
みたいに全部書いて指定することにしました。

こういうのってテンプレートの仕様上仕方の無いことなんですかねぇ。
ヘッダにしか書けないのもそうだけど、非テンプレートコードと比べて
可読性が下がるのは、テンプレートの勉強を始めた自分にとっては
しょんぼり来てしまう(´・ω・`)
ともあれどうもありがとうございました。



508 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 14:09:43 ]
ここも将来的には auto で解決するところかな。

509 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:01:18 ]
どうでもいいけどC++0x::autoって従来のCのautoと被らね?><<>

510 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:10:05 ]
C++ソースとCソースが混在していてCソース側にautoがあった場合ってこと?
オブジェクト単位でコンパイル分ければいい
終わり

511 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:26:45 ]
いまさら誰がautoなんて使ってるんだ?

512 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:33:24 ]
俺だよワリオだよ

513 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:17:40 ]
>>509
暗黙のintは廃止されたから、
現在のC++での「auto x;」はコンパイルエラー。
「auto int x;」と書かないといけない。

514 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:20:45 ]
>509
C++ 的には(C99もそうなったけど)宣言時の int の省略が認められないから一意に解釈可能なはず。
C89 での auto i; と同じ意味を持たせるなら auto int i; と書く必要がある。

515 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:21:25 ]
思いっきりかぶりましたとさ。

516 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:35:13 ]
一つのキーワードに複数の意味なんてstaticで経験済みさ

517 名前:デフォルトの名無しさん [2007/09/04(火) 04:09:37 ]
今、VisualC++使ってます。
たとえば、123214332っていう数字があった場合、3桁区切りで123,214,332って表示しようと思ってる。
いい関数ない?やっぱ自作?,



518 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 04:13:24 ]
>>517
マルチしないでさっさとイネ


519 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 04:26:42 ]
>>517
setlocale

520 名前:デフォルトの名無しさん [2007/09/04(火) 05:33:02 ]
>>519
ありがとう。
調べてみる。

521 名前:デフォルトの名無しさん [2007/09/04(火) 07:51:20 ]
>>520
死ねカス

522 名前:デフォルトの名無しさん [2007/09/05(水) 00:48:40 ]
リリースモードでは問題なく動いてるようなんだけど
デバッグモードでアサーション?がでる。
別の似たコードでは問題ないんだけどなぁ・・・。
原因がわからん
眠い。
寝る

523 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:04:21 ]
>>522
リリース時も同様に値がおかしいけど、エラーとして表示されてないだけってことはないよね。

524 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 02:36:54 ]
>>522
失敗してるアサートの条件を満たさないことがあるってことだな。
デバッガで現場を押さえればおおかた原因がわかるだろ。

525 名前:デフォルトの名無しさん [2007/09/05(水) 10:39:58 ]
わっかたああああああああああああああああああああああ

526 名前:デフォルトの名無しさん [2007/09/05(水) 11:00:35 ]
vectorコンテナの要素を削除した後に
イテレータを取得し直さないで使おうとしたのがまずかったようだ。
うっかりやっちゃった。
リリースビルドではたまたま問題なかっただけってことかな。

527 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:00:58 ]
コンパイルはできるのですが、実行時にvectorの部分で止まってしまいます。
ソースは以下になります。

istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start , end);

C++を勉強始めたばかりで初歩的な質問だと思いますが、お願いします。



528 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:19:45 ]
標準入力から、ちゃんとEOFが出るまで読み込んでるのに止まるということ?

529 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:25:51 ]
>>528
デバッガで動きを確認したところ、標準入力から、
ちゃんとEOFが出るまで読み込んでいます。
しかし、vectorを作成する部分で止まってしまって
いる状況です。

530 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:51:51 ]
止まるってアプリが強制終了するって事か?

531 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 16:20:55 ]
入力待ちなんだと思うけどな

532 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 20:33:36 ]
>>530
vectorの実行するところでループしている感じです

>>531
入力のcinの部分は実行されていました

533 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 20:48:31 ]
>>527
私の環境では動きましたよ。


534 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 22:48:50 ]
たまにはexportを思い出してあげて下さい……。

535 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 22:57:19 ]
C++0xスレにお越し下さい

536 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:02:54 ]
>>533
#include<iostream>
#include<istream>
#include<string>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;

int main(){
cout << "Enter the seres of string::";
istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start,end);





こんなプログラムですが、やはり途中vectorの後にプログラムが進みません
コンパイラはg++-4.1を使っています。

わかる方宜しくお願いします

537 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:12:44 ]
>>536
>>531



538 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:19:41 ]
WindowsならCtrl+Z、UnixならCtrl+Dだっけ。
C++と全く関係ない話だ。

539 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:47:03 ]
進まないとか止まるってのはどういう状態のことを言ってるんだ?
こっちで再現できるだけのソースを貼るんじゃなかったら
その辺キッチリ書けよ

540 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:03:38 ]
>>537-539
ありがとうございました。
何とか解決しました

541 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:14:10 ]
何がどう解決したのかも書かない。
これでは何の肥やしにもならない。
糞以下だね。

542 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:22:47 ]
>>541
すみません。
しかし色々いじっているうちに解決してしまったので、何がどうと言われても答えようがないのです。

543 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:35:01 ]
>>541
まぁまぁ、こういう奴はプログラミング向いてないから
いずれ挫折するなり淘汰されるなりしてこの分野から消えてくれるさ。

544 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:47:54 ]
と自分へメッセージ

545 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 19:32:13 ]
>>542=544
プログラマとしても人間としても糞以下だね

546 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:11:09 ]
と糞未満のものが申しております

547 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:37:28 ]
真性だな可哀想に



548 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:58:04 ]
ビクンビクン・・・!!

549 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 23:45:03 ]
>>540>>542
>色々いじっているうちに解決
いじる前後の違いを説明できないと言うのは理解できていないということ。
解決できていない可能性が高い。たまたま動いているだけのソースを直すのが...

550 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 23:47:30 ]
>>545
あと、自演乙

551 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:19:22 ]
「vectorの部分で止まってしまいます」
これがダウトだったんだろうな

552 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:58:09 ]
メンバ関数ポインタから整数型へのキャストができた試しはないけど、
どうもそれを禁止している条項が規格を洗っても見つからない。
誰か、どこにあるか知ってる人いますか?

553 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 01:10:26 ]
肯定的な形でreinterpret_castの

554 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 01:55:41 ]
ポインタは同じサイズの整数型へとキャストできるけど、結果は処理系依存、ってやつのことですよね?
処理系依存だから禁止するのも処理系次第、ってことでいいんですかね。

555 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:02:42 ]
僕の肛門からも悪魔が出そうです><

556 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:03:29 ]
ポインタを同じサイズの整数型にキャストしたときは、それを元のポインタに戻せるはずじゃ?

A pointer converted to an integer of sufficient size (if any such exists on the implementation)
and back to the same pointer type will have its original value;
mappings between pointers and integers are otherwise implementation-defined.

557 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:04:32 ]
いや、そもそもキャスト自体がコンパイル通らない。
VC++ でも g++ でも。



558 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:08:24 ]
もちろん、普通のポインタならキャストは通る。
でも、メンバポインタだと通らない。
警告じゃなくて、エラーになる。

559 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:16:34 ]
メンバポインタは

560 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:20:11 ]
>>558
だったらメンバ関数のキャストの仕方間違ってるだけだろ

561 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:21:32 ]
boostとかで、
namespace xxx_detail{ ふがふが }
ってのを見掛けるんですが、
これは何か意味あるんですか?
ADLの効果抑止とか?

無名namespace( namespace { げふげふ } )とかじゃダメなの?

562 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:26:30 ]
(C++というプライドに賭けた)保守性を考慮した結果。
彼らがあくまでC++プログラマという事を忘れてはいけない。

563 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 03:40:05 ]
>>561
ヘッダで宣言するコンポーネントに無名 namespace の名前を使ったら、
コンパイル単位ごとに個別の宣言になっちゃうから、 ODR 違反になるだろ。

564 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 07:42:42 ]
>>552
5.2.10 p4 の以下の記述がメンバへのポインタから整数型への変換を許しているように読める。
"A pointer can be explicitly converted to any integral type large enough to hold it."

でも 3.9.2 p3 に以下の記述がある。
"Except for pointers to static members, text referring to “pointers” does not apply to pointers to members."

"A pointer" も同様に、メンバへのポインタは含まないってことじゃない?

565 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 10:43:59 ]
C/C++室でも出てた話題だけど、メンバポインタはvoid*には変換できないが、メンバポインタへのポインタならvoid*に変換できると誰かが言っていた。
[void*]を[整数型]として考える

566 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 10:56:38 ]
>>564
それだ! 凄いわ。ありがとう。

567 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 11:03:16 ]
人権擁護委員会が在日を擁護する時
ttp://www.kajisoku-f-2.com/dd/img2-03/img625_j01.jpg
ttp://www.kajisoku-f-2.com/dd/img2-03/img626_j02.jpg



568 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 11:27:29 ]
質問です。hogeオブジェクトを大量に生産しつつ、いらなくなったものを削除しようとして、
以下のようなコードを書きました。

//using namespace std;

//hoge pHoge = new hoge();
//pHogeList.push_back(pHoge);

list<hoge*>::iterator it = pHogeList.begin();
while(it != pHogeList.end()){
if (/*消滅条件が整ったら*/){
delete *it;
*it = NULL;
}
it++;
}
pHogeList.remove(NULL);

しかし、なぜかhogeオブジェクトを生産し続けると動作が極端に遅くなります。
双方向リストを使用し続けると動作が遅くなるということはあるのでしょうか?
このやり方が悪いのでしょうか? もしくは、別の原因があるのでしょうか?

569 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 12:01:45 ]
実際にどこが遅いのかを特定するところから始めたらどうだ

570 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 21:41:35 ]
C++の話じゃないかもしれないけど、C++で書いてるので質問させてください

0x00と"\x00"って何が違うんですか?

571 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 21:44:53 ]
>>570
数値と文字(列)の違い

572 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 22:01:11 ]
std::cout << typeid(0x00).name() << std::endl;
std::cout << typeid("\0x00").name() << std::endl;

573 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 22:13:32 ]
文字は整数です。

574 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 23:16:31 ]
仮に0x00と'\x00'の違いだったとしたら、
C++の場合、値としては同じ0でも前者はint型で、後者はchar型という違いがある。


575 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 00:32:31 ]
おお、知らなかった。C++だと文字リテラル
(この用語自体C++からみたいだけど)はcharなのね。

576 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 01:03:12 ]
理由は演算子多重定義の都合。
IOストリーム作っていたときにそうすべきと感じたそう。
D&Eに書いてある。

577 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 03:26:38 ]
"\x00" == { 0x0, 0x0 }



578 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 03:40:04 ]
  ノ| ,ノ|
 ( 0x0)b

  ノ| ,ノ|
 (; 0x0)a

579 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 19:55:32 ]
>>575
int だったり wchar_t だったりもするけど

580 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 21:41:34 ]
質問よろしいでしょうか?

/* main.cpp */
#inlucde "test.h"

main()
{
int a=1,b=2;
inlinetest(a,b);
}


/* test.h */
inline void inlinetest(int x,int y);


/* test.cpp */
#inlucde "test.h"
inline void inlinetest(int x,int y)
{
return;
}


上記の具合にinline関数を使おうとすると
「未定義のシンボル」とコンパイルエラーがでてしまいました。
inlineの使い方が間違っているのでしょうか?
ご指南お願いいたします。

581 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 21:55:52 ]
> inlineの使い方が間違っているのでしょうか
そうです。

582 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:14:20 ]
>>580
#inlucde
これは試したソースではちゃんとしてるんだろうか?

583 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:20:50 ]
インライン関数は、普通ヘッダに定義を書く。

584 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:24:30 ]
>>580
inline関数はその呼び出された場所に展開されることが前提になりますから、
呼び出し元でその定義が分かるようにしなければなりません。
したがって、通常はヘッダ内で定義し、そのヘッダを#includeします。
>>580の場合は、test.hで定義するのが適当かと思います。


585 名前:580 mailto:sage [2007/09/12(水) 23:40:58 ]
明快に理解できました。
頭の靄がいっぺんに貫かれて光が差し込まれたような晴々しい気分になりました。

丁寧な説明ありがとうございます。

586 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:53:53 ]
寧ろ、inlineなんかは積極的に使わずにコンパイラの最適化に任せた方がいいと思うが。

587 名前:register mailto:sage [2007/09/12(水) 23:56:06 ]
おいらのこともたまには思い出してくれないか?



588 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 00:25:43 ]
>>587
そう言えばconstも、今はプログラマ側の変更不可、副作用不可という側面が際立って紹介されてるけど
K&R読むとキャッシュへの最適化を促すregisterの様に、殆ど読み込みしかしないメモリに配置されて速度的に有利になる様な
最適化を、コンパイラへ促す効果があると記述されてたね。今のハードウェアの観点から考察すするとどうかは知らないけど。

589 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 16:50:41 ]
初期化された const T[] がROM化可能な領域に配置されるのは
昔のコンパイラには良くある振舞い。まぁ今でも似たようなものか。
プロセス間で場合共有可能なページという感じで。

590 名前:,588 mailto:sage [2007/09/13(木) 21:06:23 ]
なんか趣旨が伝わりにくい文章ですが、要するにregisterもconstもに多様な位置づけだよね、ってことです。

591 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:26:55 ]
>>590
いいえ。

592 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:33:35 ]
それはトムです。

593 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:43:15 ]
tomcat

594 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 00:01:10 ]
わろた

595 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 00:03:35 ]
べ、別にわろてなんかいません!勘違いしないでください!

596 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 11:29:42 ]
トムも仏も無い

597 名前:デフォルトの名無しさん [2007/09/15(土) 19:56:06 ]
ところで作りかけのソースあっぷしたら虐めてくれますか?



598 名前:デフォルトの名無しさん [2007/09/15(土) 21:39:52 ]
うん

599 名前:デフォルトの名無しさん [2007/09/17(月) 03:19:16 ]
あるテキストファイルを行の順番を逆にして出力したいんだけど、
スマートなやり方が思いつきません。

今は

vector<string> str;
テキストファイルから1行読み込み
str.push_back(読み込んだ文字列);
for(int i=str.size()-1;i>=0;i--) cout << str[i] <<endl;

こうしてるんだけど、これだとファイルが数百MByte以上になったときにバッファを大量に食うので避けたい。
打開策として、インプットファイルを終端からReadするって手があるのですが、
これ以外でいい方法はありませんか?

600 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 03:29:23 ]
ファイルを分割して読み込む

601 名前:599 [2007/09/17(月) 03:41:50 ]
>>600
あーなるほど!
それも一つの手ですね!

602 名前:599 [2007/09/17(月) 04:01:35 ]
>>600
お礼を言い忘れました。
どうもありがとうございました。

603 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 05:15:30 ]
あとはまぁ、行頭位置のインデックスを作るとか。
元ファイルを調べて、「改行の次の位置」をvector<ifstream::pos_type>型のコンテナにでも詰め込めば、
あとは好きな行を取り出せる。

同じテキストファイルを、毎度毎度ひっくり返して表示する仕様の場合、
そのインデックスを、a.txtに対してa.indexとか名前付けて保存しておけば、2度目以降は速いよね。

604 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 07:14:59 ]
数百MB単位のファイル読むときはちゃんとmemory mapped file使おうぜ。
このスレの範疇からは外れるが。

605 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 08:23:03 ]
>>604
でもさ、>>599の場合だと、
結局は、一度は最初から最後まで全部読み込まないといけないことには変わりないし、
先頭から読んでいくのと違いあるのかな。

普通のモダンなOSはディスクアクセスから予測した先読みのキャッシュぐらいあるだろうし

606 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 09:16:07 ]
つ[tail -r]

607 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 12:10:29 ]
$ tail -r
tail: オプションが違います -- r
詳しくは `tail --help' を実行して下さい.




608 名前:デフォルトの名無しさん [2007/09/17(月) 13:31:44 ]
つか、テキストファイルを逆順に表示する必要があるのか?

609 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 13:34:05 ]
実用的な場面はあまりないかもしれないけど、言語の勉強のための課題としては
手ごろな内容なんじゃないかな。

610 名前:デフォルトの名無しさん [2007/09/17(月) 13:35:00 ]
tail -f /var/log/messages でいいでね?

611 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 14:05:18 ]
馬鹿はすっこんでろ

612 名前:デフォルトの名無しさん [2007/09/17(月) 14:18:17 ]
言語の勉強ならなぜにstd::vectorを使う?


613 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 14:26:42 ]
C++の勉強ならSTLが適当だろう。C++スレだし

614 名前:デフォルトの名無しさん [2007/09/17(月) 14:32:09 ]
勉強が目的なんでしょ?


615 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 14:35:55 ]
「言語文法の勉強」って限定してないなら標準ライブラリの使用法も範疇だろ

616 名前:デフォルトの名無しさん [2007/09/17(月) 15:17:22 ]
c++の質問じゃないかもしれないけど
0x00000F00
こってどういう意味なんでしょうか?
16進法かなと思うんですが

617 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:27:26 ]
明らかにC++じゃないしプログラムの質問でもないぞ
0x00000F00は10進数の3840だ。



618 名前:デフォルトの名無しさん mailto:age [2007/09/17(月) 15:29:33 ]
.

619 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:31:05 ]
>>616 数値のリテラルを16進数で書きたいときの書き方。
その数値自体の意味までは判らんよ。

620 名前:デフォルトの名無しさん [2007/09/17(月) 15:37:41 ]
3840ってことはF00ってことでおk?

621 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:39:47 ]
>>620
何がOKかさっぱりわからん。3840(10)=F00(16)ってだけだ。
わからんならWindows標準の電卓でも使ってくれ。

622 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:44:17 ]
>>617
一応C++の質問になるなじゃない?
CやC++など一部の言語では16進数を表記する文法として0x〜を採用しているだけで、
一般的に16進数を0x〜と表記するという規則はないでしょ。

623 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:50:12 ]
いやー、どこの言語でも0xか\xのプリフィックスが付いたら
16進数だと思うけど。

624 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:56:26 ]
"0x"が仮にC++特有だとしてもそれ以降はただの16進数だしな

625 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:58:36 ]
数字の混ざったトークンにa - fが入ってたら接頭子がなんであれ16進と解釈できるだろ。

626 名前:599 mailto:sage [2007/09/17(月) 16:00:52 ]
>>603-615
どうも、ありがとうございました。
勉強になります。

学校の課題とかではないです(私はもう学生ではないので…)
株と為替の時系列データを処理するプログラムを書いているのですが、
データの入手先によって、系列の時間が上り順のものと下り順のものの2種類あるので、
一方を並べ替えることで1つの書式にそろえようとしたわけです。

627 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:04:36 ]
>>625
17進数〜36進数という可能性も。



628 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:13:47 ]
1バイト文字コードなら256進数までありうる

629 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:52:10 ]
>>616
死ね

630 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:57:01 ]
そこは気を利かせて
0xDEAD
とか書かないと

631 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 17:01:14 ]
>>630
0xDEAD=57005
実はお前さんの書き込み時間は、57分00.5秒だったのでは…

632 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 17:29:46 ]
0xDEADBEEF

633 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 19:23:11 ]
0xBADCAFFE

634 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 19:51:52 ]
0xBACA

635 名前:デフォルトの名無しさん mailto:C++でOOPらしいコードを書くにはどうすればいいだろうか [2007/09/18(火) 19:54:44 ]
0xCPLASPLASDEOOPRASIIKODEWOKAKUNIHADOUSUREBAIIDAROUKA

636 名前:デフォルトの名無しさん [2007/09/18(火) 20:19:58 ]
どうせなら CPLUSPLUS ってかけよ

637 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 20:21:27 ]
>>635
C++はマルチパラダイム言語だ。そんな意味のない目標は捨てて身軽になろう。
OOPなんて所詮たくさんある道具の内の一つに過ぎない。



638 名前:デフォルトの名無しさん [2007/09/18(火) 20:25:01 ]
>>636
気づかなかったわ
>>637
okそうするよ

639 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 22:36:41 ]
そういやどっかのサイトにあったけど、「OOPは呼び出し元を再利用するための手法の一つ」
というのはかなり納得した。特にC++のはそうだよな。


640 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 22:40:04 ]
定義なんぞどうでもいい

641 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 22:43:20 ]
定義?定義じゃネーヨ
概念だろ

642 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:03:17 ]
テンプレート関数にテンプレートクラスを渡したいのですが、可能でしょうか
具体的には
std::list<int> a;
std::list<double> b;

func( a );
func( b );

のようにしたいです

643 名前:642 mailto:sage [2007/09/19(水) 00:12:49 ]
自己解決しました

644 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:17:08 ]
template <typename T> void func(std::list<T> x)
{
};
こんな感じ?

645 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:17:59 ]
そんなちょっと考えたら解決するようなことをいちいち・・・

646 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:30:38 ]
馬鹿だからなんだぜ?

647 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 12:05:47 ]
KODE



648 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 12:15:12 ]
氷結しよっ!

649 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 12:43:44 ]
>>639
それはOOPっていうか、古くは各種アプリのプラグイン(DLL)に始まる
インタフェイス抽象とかコンポーネント化とかの特徴のような気が・・・


650 名前:デフォルトの名無しさん [2007/09/19(水) 20:34:13 ]
>>649
それは呼び出される側の再利用でなくて?

651 名前:デフォルトの名無しさん [2007/09/19(水) 21:28:47 ]
今ポインタの宿題をしていて  数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?

652 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:48:45 ]
その質問を訊く身にもなってください。
今流行りのアスペルガーですか?

653 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:48:59 ]
意味がわからんし、C言語スレへ池

654 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:49:31 ]
俺に免じて許してやってくれ。彼は5歳なんだ。

655 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:54:15 ]
俺アスペルガーだけどこんな奴と一緒にしないで欲しい

656 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 05:03:48 ]
「数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?」
とはどういういみですか?

657 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 05:09:02 ]
数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?

What abhorring is of of display of the value before it executes it by the guy of
exchanging numerical values it?

憎悪が交換数値の奴でそれを実行する前の価値の表示のものであること、それ?

(゚Д゚)?



658 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 06:20:59 ]
>>651
お前があほという意味じゃ

659 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 07:09:57 ]
ある仮想関数が、メンバ変数を書き換えないと想定されている場合、constを付けた方がいいんでしょうか?
例えばこんな感じ↓

class A {
public:
virtual int GetX() const = 0;
};

class B : public A {
public:
virtual int GetX() const { return x_; }
private:
int x_;
};

const A*型を使う場面があるのかが気になります。

660 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 07:20:55 ]
>>659 そうですね。

661 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 07:31:21 ]
>>659
つけられるconstは全てつけるべき。
非constである必要ができたら、非const版を追加するかconstを外すか熟考すべし。

662 名前:659 mailto:sage [2007/09/20(木) 07:36:33 ]
ありがとうございます。

663 名前:kkptcnZciZ mailto:ekeskb@bokqzg.com [2007/09/20(木) 12:34:39 ]
KOMUgI <a href="vunuddokfscm.com/">vunuddokfscm</a>, [url=pliwysnvpdex.com/]pliwysnvpdex[/url], [link=uquzjkpzhomt.com/]uquzjkpzhomt[/link], hukythasnspn.com/

664 名前:マターリ ◆AbENcvTP5o mailto:sage [2007/09/20(木) 14:27:35 ]
いきなりですみませんがこのスレに協力してくれる人を探しています。
ttp://sports2.2ch.net/test/read.cgi/entrance2/1190215633/l50

665 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 14:57:12 ]
>>664
マルチすんな。

666 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 15:16:10 ]
>>650
ん?
プラグインやインタフェイス抽象は主として呼び出す側の再利用に繋がると思うけど。

呼び出される方の利用の仕方がまちまちだと、
呼び出す側はいちいちそれに合わせなくてはならないわけだけど、
インタフェイスや呼び出し規約(API)という形に抽象化し共通化しておくことによって、
呼び出し側を変更せずに機能を追加してゆくことができる。

もちろん呼び出される側を再利用する仕組みでもあるんだけど、
呼び出される側の再利用だけのためであれば単にAPI公開で十分なわけで。

667 名前:デフォルトの名無しさん [2007/09/20(木) 16:37:16 ]
template<class T> class A
{
public:
void (A<T>::*func)();
};

template<class T> class B
{
public:
static void (B<T>::*func)();
};
template<class T> void (B<T>::*B<T>::func)() = NULL;


template<class T, class U> class C
{
public:
void (U::*func)();
};


template<class T, class U> class D
{
public:
static void (U::*func)();
};
template<class T, class U> void (D<T, U>::*U::func)() = NULL;


クラスDのようにしたいんですけど、どなたかわかる方いませんか?
Visual Studio2005 SP1




668 名前:デフォルトの名無しさん [2007/09/20(木) 16:38:31 ]
ちなみにクラスD以外はビルドOKです

669 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 16:49:48 ]
template<class T, class U> class D
{
public:
static void (U::*func)();
};

template<class T, class U> void (U::*D<T, U>::func)() = NULL;

こうだろ?

670 名前:デフォルトの名無しさん [2007/09/20(木) 17:19:20 ]
うぉ、ビルドとおった〜

ありがとう!!

昨日からずっと考えてたよ。

671 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 18:48:48 ]
横からごめん

template<class T, class U> void (U::*D<T, U>::func)() = NULL;

ってどういう意味?

672 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 19:04:46 ]
>>671
単なる、staticなメンバー変数funcの定義だよ。
NULLで初期化してるだけ。


673 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 19:05:53 ]
void (U::*)() 型のstaticメンバ変数 D<T, U>::func を定義して NULL で初期化している

674 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:44:48 ]
最近某入力デバイス共有ソフトのソースと某モデリングソフトのプラグインサンプルのソースと
見る機会があったんだけど
そのどっちも、どう考えても継承ツリーの最底辺、絶対継承されっこないし実際されてない
javaだったらfinalがついてもおかしくないクラスのメンバで
継承元の仮想関数をオーバーライドしている関数にvirtualがついてた

薄々感じてはいたんだけどどんな状況でもオーバーライドした関数にはその目印にvirtualをつけるっていう
暗黙のコーディングルール(というかおまじない?)のようなのが流行してるのかな?
それともvirtual修飾子の意味をほとんどの人が誤解している?

675 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:51:49 ]
かなり昔から流行ってるよね。

676 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:56:41 ]
C#のvirtual, overrideキーワードを見るよろし

677 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:58:33 ]
>>676
C# なんか存在しない頃から流行ってるよね。



678 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:24:07 ]
別にはやってないだろ

679 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:26:07 ]
文法的にはどっちでもいいんだっけ?

680 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:27:37 ]
多分継承元のクラスから関数宣言コピペして、面倒だからvirtual削除してないだけだろ。

681 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:40:33 ]
virtualつけてもoverrideかどうかは分からない
ということに最近気づいた

682 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:41:32 ]
overrideする側はvirtual要らないんだっけ
俺はいつもコメントにoverrideって書くけど

C#がうらやましいぜ

683 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:53:43 ]
基本クラスがvirtualなら十分でそれ以降は任意だったと思うがドキュメントが出てこない。
継承が深くなるとvirtualかどうか確認するのにいくつもヘッダーファイルを遡ることになるから、
overrideしたところにもvirtualがあるとわかりやすい。
いま基本クラスと書いたが途中からvirtualっていうのもありなんだよな。
#include <iostream>
using namespace std;
class A { public: void Say() { cout << "hello A" << endl; }};
class B : public A { public: virtual void Say() { cout << "hello B" << endl; }};
class C : public B { public: void Say() { cout << "hello C" << endl; }};
int main(){
 A *a = new C(); a->Say();
 B *b = new C(); b->Say();
 return 0;}
結果
hello A
hello C

684 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:59:49 ]
一度virtual付ければ後は無くておk。
俺はドキュメントなんか鼻から探すつもりもありませんがw


685 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:01:01 ]
あ、でもvirtualはいつも付けてる。
理由は>>683と一緒。


686 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:01:12 ]
sealedが欲しい。途中から隠蔽w

687 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:06:18 ]
#define public protected




688 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:26:15 ]
とにかく、C#なんかより前から流行ってるよね。

689 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:35:25 ]
>>686
sealedは継承禁止じゃね?

690 名前:デフォルトの名無しさん [2007/09/20(木) 22:36:54 ]
void func(const T& param)
{
T.Hoge();
}

っておかしい?
型Tは何かわからないからそのメソッドHoge()を呼ぶのはおかしい?

691 名前:デフォルトの名無しさん [2007/09/20(木) 22:37:32 ]
void func(const T& param)
{
param.Hoge();
}
の間違いでした

692 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:38:24 ]
継承される事を前提に作ってないクラスはデフォルトでsealed(final)
って仕様だとうれしいんだけど

小規模で作ってる分にはいらないけどさ

693 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:42:09 ]
大規模開発なら「派生型を作らないこと」とドキュメントに書けばいいような・・・

オープンソース物みたいにソースがドキュメントって感じのだと、
そういう言語によるディレクティブは役に立つとは思うけど。

694 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:56:14 ]
>>689
メソッドに対するシールド。
class A { public virtual void Say() { .. ; }}
class B : A { public override sealed void Say() { .. ; }}


695 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:03:45 ]
>>694
それ上書き禁止で隠蔽とはいわないんじゃねーかと。

696 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:09:03 ]
>>695
やりたいことはこうよ。
class A { virtual F
class B : A { sealed F // Aに対するoverrideだが、この後の継承は上書き扱い(非virtual)になる。


697 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:10:36 ]
こんなのはどうだっけ?
class A { public: void a() {}; };
class B : public A { public: template<typename> void a(); /*not implement*/ };




698 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:13:04 ]
>>696
それは隠蔽とは言わんだろ。
AやBにキャストしたら そのまま使えるんだし。

Javaだと覆い隠し(shadowed)とか言ってるような。

699 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:18:46 ]
目印なんだったらコメント使えばいいのになんでそれをトークン使って
プログラムそのものを変質させてしまう形でやってしまうのだろう
いったい誰がこんな風習を広めたのか気になって眠れない

700 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:19:09 ]
>>672
ぁーなるほど。
void (U::*)()の、D<T,U>::funcを。ってことね。
了解しますた。さんくす


701 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:19:49 ]
>>698
C#だとこれのことを隠蔽と言うだけどね。VBだとShadows。
sealedといったのは例えが悪かった。このnewがC++に欲しいという話。
class A { public virtual void Say() { .. ; }} 
class B : A { public override void Say() { .. ; }} 
class C : B { public new void Say() { .. ; }} 



702 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:20:25 ]
>>690-691
問題ない。
もしTがメンバHogeを持っていなければ、エラーになる。

それなんて動的言語と言いたいところだが、
そこはC++なんでコンパイルエラー。

703 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:43:21 ]
>>701
悪い、それ隠蔽だわ。カプセル化の文脈で出てくるデータ隠蔽と勘違いしてた。

704 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:58:00 ]
>>703
死ね

705 名前:デフォルトの名無しさん [2007/09/21(金) 00:28:53 ]
>>702
サンキュ

706 名前:fIIPJstQwl mailto:woptyu@mail.com [2007/09/22(土) 03:23:44 ]
zghXa7 <a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0484.html">big cock</a>
[URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0484.html]pussy[/URL]
<a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0531.html">big cocks</a>
[URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0531.html]pussy[/URL]
<a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0682.html">big dick</a>
[URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0682.html]pussy[/URL]
<a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0731.html">big dicks</a>
[URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0731.html]pussy[/URL]
<a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0874.html">big naturals</a>
[URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0874.html]pussy[/URL]

707 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 06:54:59 ]
void func(int n)
{
 void *a = (void*)new char[n];
 /*...*/
 delete[] (char*)a;
}

これってメモリリークを起こさずにうまく開放されるんでしょうか?



708 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 06:57:27 ]
日本語がおかしい。
メモリリークは開放処理を試みた後に発生する。

709 名前:Kusakabe Youichi mailto:sage [2007/09/22(土) 07:16:59 ]
 

710 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 10:27:23 ]
>>707
途中で例外が投げられてfuncを抜けるなどといった事態が起これば、
メモリリークするね。

711 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 11:06:37 ]
間違って
pc11.2ch.net/test/read.cgi/tech/1188748806/770
に書き込んでしまいました。
宜しくお願いします。

712 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 11:22:09 ]
お断りします

713 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:05:23 ]
>>661
>つけられるconstは全てつけるべき。

自分が読んだ本ではconst使いましょうという感じだったので
今までconst使っていたのですが、会社でconstを使うなといわれました。

const推奨派とconst禁止派みたいなのがあるのでしょうか?

714 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:18:58 ]
「(たまたま)変更されてない」って理由でつけると結局あとでconst外しまくる羽目になる。
「(概念や仕様から考えて)変更しない」って理由でつけるべき

715 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:23:08 ]
外しまくる羽目になってでも現在付けられるものは
全部付けた方が分かりやすいという考え方もある。

716 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:34:26 ]
>>713
const禁止とかどれだけ低脳なんだwww

取り合えず禁止になりうる理由として考えられるのは、
・API等に非constポインタを渡す必要があり、キャストの排除が最優先ルール
・クラスのconstメンバ関数にコンストラクタで代入できない
(↑もちろんメンバ変数の初期化は代入じゃなく初期化子並びを使うべきだが
C転向者が多くて教育コストがかかる)
・宣言が長くなるのでちょっと読みにくくなる
・メンバ関数の適切なconst指定も必要になってくるが、C転向(以下略
・既に非constで作り上げてしまった社内ライブラリを作り直せない。
・論理バグはコーディング工程で見付ける(コンパイルえらー)のではなく、
デバッグ工程で評価チームが見付けるものとして
スケジュールやら人員配分やらが組まれていて直せない。
・上位の人が勉強嫌い

717 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:39:23 ]
>>711
実際にはnew[]するときに、sizeof (T) * 要素数よりも
もう少し余分に確保されている可能性がある。
主にデストラクタを呼ぶ回数を記録するため。
もちろん、delete[]ではそれも含めて解放される。



718 名前:NXRoXAzeEmJXNM mailto:doutiregdou@mail.com [2007/09/22(土) 12:50:13 ]
IpHLIP <a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0942.html">big nipples</a>
[URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0942.html]pussy[/URL]
<a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big1022.html">big tits</a>
[URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big1022.html]pussy[/URL]
<a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big1155.html">big tits round asses</a>
[URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big1155.html]pussy[/URL]
<a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=black0124.html">black lesbians</a>
[URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=black0124.html]pussy[/URL]
<a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=black0284.html">black pussy</a>
[URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=black0284.html]pussy[/URL]

719 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:51:29 ]
>711

>delete[] は type* (この場合 char* )から
>sizeof(type) * (プログラマからは見えない、確保された要素数)
>の分だけのバイトを開放するという挙動でしょうか?

確実に言えるのは new[] で確保された領域が解放される、ということだけ。
サイズについては例えば 16 バイト単位とかに切り上げられてるかもしれない。

なお、delete[] については、静的な型と動的な型が一致することが要請されている。
> 14882:2003 5.3.5/3
>In the second alternative (delete array) if the dynamic type of the
>object to be deleted differs from its static type, the behavior is undefined.

で、気にしているだろうキャストについては、一度 void* にキャストした後、
元の型に戻した場合、値が一致することは保証されているので問題ない。
> 14882:2003 5.2.9/10
>A value of type pointer to object converted to “pointer to cv void” and
>back to the original pointer type will have its original value.

720 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:53:50 ]
静的な型と動的な型の一致とは?

721 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:01:43 ]
>>720
静的な型とはソースコード上の型、
動的な型とは実際の型のこと。

例えば、クラスDがクラスBを継承していたとして、
こういうことはやめてということ。
B* p = new D[n];
delete[] p;

722 名前:713 mailto:sage [2007/09/22(土) 13:05:16 ]
>>714>>715>>716
なるほど、参考になります。ありがとうございます。

私のところではconstは一切禁止のようです。
「constを使うとコードの量が増えて読みにくい」
「constを使わずに読みやすいコードを書けば、コーディングミスも少ないから効率がよい」
という理由だそうです。

723 名前:デフォルトの名無しさん [2007/09/22(土) 13:09:35 ]
このスレッドがふさわしいかどうかわかりませんが、
質問させてください。

C++でリングバッファを作成しようと思っています。
Read PointerとWriter Pointer、そしてBufferを用意し、
Bufferから"複数バイト"を取得する、という処理です。
for(int i = 0; i < num; i++)
if(ReadPointer != WritePointer){
value = Buffer[ReadPointer];
ReadPointer = (ReadPointer + 1)%BufferSize;
}
else
break;
}

上記のように1バイトずつ読み込むならこれでいいとおもうのですが、

これでは1バイトごとに条件文+インクリメントが入るため避けたいです。
一気に複数バイトを読み込むことを考慮した場合、
"ReadPointerがWritePointer"を
越えないことを判断して、バッファを参照することが必要です。
複数バイトを読み込む場合を考慮したリングバッファを実現する
スマートなアルゴリズムはあるのでしょうか?

ReadPointer < WritePointerの位置関係からバッファ読み込みを
一気に行うことは容易ですが、ReadPointer > WritePointerの
位置関係からバッファ読み込みを一気に行う処理で詰まっています。

724 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:11:12 ]
なんだか前世紀からタイムスリップしてきたみたいな職場だな。
組み込みでCを使ってるって言うのならまだ分かるが、
それでC++かよ。

725 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:15:23 ]
#define N 7をconst N = 7;にしたところで
コードの量が増えるとは思わないけど。

constにも色々とあるけどさ。

726 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:32:05 ]
>>707
auto_ptr 使えば。

727 名前:723 [2007/09/22(土) 13:33:38 ]
>724
ご返信ありがとうございます。
特に組み込みなどではありません。
通常リングバッファはどのようにして実装するのが通例となっているので
しょうか?セオリーなどが確立しているのでしょうか?



728 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:42:40 ]
>>726
new[]したものをdelete[]しないのは駄目だろ。
scoped_arrayとかshared_arrayとか結局Boost頼み。

729 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:46:48 ]
>>727
BufferSize-ReadPointer 分だけ memcpy してから、
ReadPointer をゼロにして続きを処理すればよい。

C++ では普通テンプレートベースの汎用クラスを用いる。
高速化の必要がある場合には自前で書く。
(ココに高速化の必要がある場合には、リングバッファから取り出して
別の場所へコピーなどしないでバッファを直接読んで処理する方が
良いことが多いけど)


730 名前:デフォルトの名無しさん [2007/09/22(土) 13:52:42 ]
普通に一バイトずつ読み込めばいいだろが
一度に20バイトずつコピー出来ても大して変わらないだろ

731 名前:723 [2007/09/22(土) 13:57:09 ]
>727
ご返信ありがとうございます。確かに2回に分けてBufferを取得すれば
可能です。
テンプレートベースの汎用クラスを用いる、というのはdequeなどを
使用するということでしょうか?

高速化を目指しております。
>(ココに高速化の必要がある場合には、リングバッファから取り出して
>別の場所へコピーなどしないでバッファを直接読んで処理する方が
>良いことが多いけど)
汎用クラスを用いず、地道にmemcpyなどを使ってデータを取得したほうが
よいのでしょうか?繰り返しの質問になってしまいますが。

732 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:00:44 ]
>>721
>B* p = new D[n];
>delete[] p;
これダメなの? これに対応する為にvirtualデストラクタがあるんだと思ってたけど。

733 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:04:13 ]
>>731
そうではなくて、ココをチューニングする必要があるのは
おそらく数M〜数十Mバイト毎秒の処理を行う場合なわけで、
そんなものをメモリ上でこっちからあっちへコピーする処理自体
無駄なのでやらないようにする、ということです。

例えば映像のデコーダの入力段でリングバッファを用いるような場合、
read(buf, n) などとしていちいちバイト列をコピーして取り出すのではなく、
char* peek(size_t n) のように直接内部のバッファを覗くための関数を用意して、
リングバッファ終端以外では直接バッファ内のバイト列を処理するようにする、等。

734 名前:デフォルトの名無しさん [2007/09/22(土) 14:09:24 ]
N 最後のナンバー
n番 からdバイトコピーするとする

if ( n + d - 1 > N){ memcpy(*,*, N - n - d); memcpy(*,*, n + d - N);}

else memcpy(*,*, d);

のようにすれば良い

735 名前:723 [2007/09/22(土) 14:11:23 ]
>731
ご返信ありがとうございます。理解が乏しいかもしれないので
確認させてください。
readはmemcpyにより格納されたほかのバッファを利用する、ということで
peekはmemcpyで移さずにそのまま参照するということですね。
そして、リングバッファ自体はC++の汎用クラスを使って問題ないという
ことでしょうか?

>リングバッファ終端以外では直接バッファ内のバイト列を処理するようにする、等。
リングバッファ終端以外はpeak()、終端ではmemcpyなどを使って処理する、
ということでしょうか?

リングバッファの実装が初めてでなかなかイメージがわいてこない状況です。
何度も質問してしまって申し訳ありません。

736 名前:713 mailto:sage [2007/09/22(土) 14:13:21 ]
低スキルなので>>723の質問の意味が分からなくて
>>724は私(>>722または>>713)に対するレスかと思ってしまいましたw
違ったのですねw


>>725
仮引数とかにconstをつけるとコードの量が増えて読みにくいから禁止なのだそうです。

737 名前:724 mailto:sage [2007/09/22(土) 14:13:58 ]
>>727
いや、ひとつ上にレスしただけ。



738 名前:723 [2007/09/22(土) 14:18:17 ]
>734
実際のサンプルを教えてくださってありがとうございます。
ぜひ参考にさせていただきます。

739 名前:デフォルトの名無しさん [2007/09/22(土) 14:19:42 ]
>>738
コードは間違ってる所あるけど、
終端を乗りこえていたら、分割して先頭からコピーすればいいだけ

740 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:30:07 ]
>>735
Q1.前半 Yes. 後半 No.
Q2.
用途によります。動画のデコーダなどの場合は一度にリニアに
アクセスするのは高々数十バイト程度なので、一時的なバッファに
コピーしてそこのポインタを返す、あるいは内部バッファを余分に
確保しておいて、バッファ先頭にある続きのデータをそこに複製して
リニアに読めるようにする、等。

読む側の処理が簡単なものなら、終端をまたぐケースだけ
前半、後半に分けて処理するようにしても良いでしょう。

Q1. の後半とも関連するのですが、ただひとつ言えることは
ここを自前で実装すべきなのは、レアケースであって、その場合には
プロファイラやテストなどを行って確かめつつ最適なコードを書く必要があり、
定石みたいなものは無いということです。

ただまぁmemcpyは各社最適化されていて早いコードで実装されてるので、
チューニングしたいんだけど時間がないとかいうときには便利。

741 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:32:00 ]
言い切ってやる。高速化すべきポイントはそこじゃない。

742 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:33:50 ]
>>736
>724はあんた宛だと思うよ。
で、正直そんな会社は私の仕事関係なら出入り禁止にします。

743 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:34:05 ]
>>736
>コードの量が増えて読みにくい
本当にこれだけの理由なら↓これらに当てはまりそうだ。
pc11.2ch.net/test/read.cgi/prog/1139753744/
pc11.2ch.net/test/read.cgi/prog/1179420838/
pc11.2ch.net/test/read.cgi/prog/1169432098/

constがない→何らかの変換が行われる、と予想してそのつもりで読むからな。
constがあることは読み手への助けになるのだよ。

744 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:14:29 ]
>732
仮想デストラクタがある場合に OK なのはこっち。
B* p = new D;
delete p;

745 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:19:04 ]
>で、正直そんな会社は私の仕事関係なら出入り禁止にします
内容の是非はともかくこういう言い方ってDQNじみてると思うんだが


746 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:21:32 ]
スルーしる

747 名前:デフォルトの名無しさん [2007/09/22(土) 15:23:02 ]
>>744
これは仮想デストラクタがなくても領域自体は確保されるんですよね?
Dのデストラクタが呼び出されないのでコンストラクタとかでnewしててそれをデストラクタでdeleteしてる場合はだめだけど



748 名前:713 mailto:sage [2007/09/22(土) 15:28:43 ]
>>737>>742
やはり私に対するレスなのですか。

では改めて・・・

>>724
組み込みではないけど、昔はCを使っていたそうなのでその名残でしょうか?
const以外にもいろいろ禁止されました。
私はfor文を
for(int i = 0; i < size; i++)
{
}
と書いていたのですが、これもダメで
int i;
for(i = 0; i < size; i++)
{
}
とか書かなければならないそうです。
理由は、私の書き方だと「速度が遅くなる」「使用するメモリが増える」からだそうです。私にはなぜそうなるのかよくわかりません。

>>743
確かに辞めたくなりますが・・・
いろいろダメだと言われても私は低スキル(頭が悪い)なので理由が良く理解できなくて
それでここで質問してみようかと・・・。
スレ違いでしょうか?

749 名前:デフォルトの名無しさん [2007/09/22(土) 15:31:23 ]
>>748
おめーと同僚や上司は頭悪いよ
空白は無視されるのが規則なんだよ 速度に違いは出ない

750 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:34:57 ]
>>748
>理由は、私の書き方だと「速度が遅くなる」「使用するメモリが増える」からだそうです。私にはなぜそうなるのかよくわかりません。
寧ろ、あなたの書き方の方が速くなったりメモリが減るかも知れません。まぁ、大抵は同じでしょう。
いずれにしろ、一概には言えません。そんな根拠もないようなことを言っているようではお郷が知れると言うものです。

>確かに辞めたくなりますが・・・
私と一緒に働きませんか?w

>スレ違いでしょうか?
まぁ、宜しいのではないかと。

751 名前:デフォルトの名無しさん [2007/09/22(土) 15:35:53 ]
空白じゃなかった intの定義する位置か

752 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:37:51 ]
>>749
>空白は無視されるのが規則なんだよ 速度に違いは出ない
i の宣言場所の違いが判らん香具師は黙ってらっしゃい。

753 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:41:37 ]
関係ないけど
VCだと
for(int i = 0; i < size; i++)
って書いても
int i;
for(i = 0; i < size; i++)
こう書いてるように動くね

754 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:42:21 ]
>>763
それはVC6とかの話じゃないのか

755 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:48:42 ]
>>744 レスサンキュー
まじかー、紛らわしいというか不便だな。
B* p = new D[n];
delete[] dynamic_cast<D*>(p);
めんどくちゃいけど、これなら大丈夫だろうか。
まあ、ことさら >>732みたいに敢えて基底クラスのポインタで確保/解放する意味もないんだろうけどなぁ...

>>748
ちなみにそのfor文は上と下で i のスコープが変わると思うが、
for文に入る度にiが確保しなおされるとしたら速度変わるカモな。
使用メモリが増えるかどうかは分からん。

756 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:51:13 ]
for文のiとかjってやっぱり仕事なんかで使うときもiやjなの?


757 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:54:34 ]
>>755
>>753はVC(6以前)でスコープが同じになる事を言ってるんだよ
メモリ・速度云々は関係なく



758 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:57:58 ]
>>756
i, jで何か文句あんのか?

759 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:59:46 ]
>>756
単なるループ変数にたいそうな名前が付けられると
かえって読みにくくなるよね。

760 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:04:07 ]
>>758
実際こんがらがって間違える事例を数件目撃したことがある。
慣れてくりゃなんともないが初学者にiやjで教えるのはどうかと思うんだよなぁ

761 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:07:07 ]
>iとj
俺は目視デバッグでチェック項目の一つになってるわ

762 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:10:24 ]
iやjにも元は意味があったろう
今じゃお決まりの変数として定着しているが

763 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:10:26 ]
>>755
それだけなら動くだろうけど、
p経由で扱えるのは先頭要素だけ。

メモリ上にDのインスタンスが連続して並んでいるので、
p[1]が指す位置は、先頭の次の要素ではなく、
おそらくDの配列の先頭要素内の中途半端な位置。

764 名前:723 [2007/09/22(土) 16:14:51 ]
>740, 741
ご返信ありがとうございます。
やりたいこととしては、参照用のリングバッファを書き込み用のリングバッファに
定期的に10KB〜300KB程度のデータを移したいと思っております。
(まず初めに最終的にやりたいことを書かなくてすいません)。

この場合は、終端をまたぐケースを考慮して(734さんのコードを参考、
2回の処理に分けるなどをする)、memcpyを使う、という方向で
考えたいと思います。
ただ一点、やはりC++の汎用クラスを使うのがいいのか、単純に
配列を使ってリングバッファを実装すればいいのか悩んでいるところです。

>ここを自前で実装すべきなのは、レアケースであって、その場合には
ここっていうのはreadとかpeak()のことですよね?

>言い切ってやる。高速化すべきポイントはそこじゃない。
この部分ばかりに注目するのではなく、
他の処理アルゴリズムをもっと最適化しろってことでしょうか?

確認ばかりのレスになってすいません。

765 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:15:05 ]
>747
> これは仮想デストラクタがなくても領域自体は確保されるんですよね?
はい。
> Dのデストラクタが呼び出されないのでコンストラクタとかでnewしててそれをデストラクタでdeleteしてる場合はだめだけど
規格上は delete しちゃうと未定義動作。

>755
配列は polymorphic に扱わないというのが基本。理由は >763

766 名前:713 mailto:sage [2007/09/22(土) 16:16:59 ]
>>750
>私と一緒に働きませんか?w
そう言われるとなんだか嬉しいですwでも私は足引っ張りまくると思いますよ?w

>>755
>for文に入る度にiが確保しなおされるとしたら速度変わるカモな。
なるほど、私の上司は速度についてはそれを言っていたのかもしれません。

私はiのスコープをループの中だけに限定するつもりで
そのように書いていました。(これも本で読んだので・・・)

>>756
私はiやjを使っています。

767 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:25:30 ]
for (int iとint i; for(で最適化しても
速さに違いが出るようなコンパイラなんて
窓から投げ捨ててしまえ。

そんなことで速さに違いが出るのだったら、
設計思想的に、はなからこんな機能導入されていない。



768 名前:デフォルトの名無しさん [2007/09/22(土) 16:28:36 ]
基本的に
for ( int i= )の方が速いのでは?
その都度変数を確保すればレジスタに乗りやすいが、確保してあったままではHDDやメモリに乗っている可能性が高い

769 名前:755 mailto:sage [2007/09/22(土) 16:31:58 ]
>>757
>>755>>753に対して何か言ったつもりはないけど、
その話は(他のスレだったかで)聞いたことがアルよ。

>>762
多分 i = index のi じゃないかな。配列で使うことが多い気がする。
jは単にiの次の文字。

>>763,>>765
なるほど、このスレ見なければそのまま使ってたところだ。
勉強中でg++では問題なさそうに見えたからね。情報ありがとう!

>>767,>>768
まあ実際には気にするほどな差が出るとは思わないよね。

770 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:34:23 ]
>>768
いつの時代のコンパイラ使ってるんだ? お前は。

771 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:36:43 ]
intで差が出るのは糞コンパイラ未満だが、
intでは無くiteratorだった場合差が出ても果たして糞コンパイラ未満と言えるだろうか。

772 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:36:58 ]
しかし、ある言語の常識を別の言語にまで持ち込むバカっているんだなぁ。
C(とCが全盛だった時代の貧弱なコンパイラ)ならまだ分かるかもしれないが、
今の時代のC++でやることじゃないだろ。

絶対に関わりあいたくないから、どこで働いているのか晒してくれないか?w

773 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:38:09 ]
大丈夫
君には入社できないから

774 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:39:42 ]
>>771
前提を変えるなアホ。

そのイテレータのコンストラクタが100MBぐらいメモリを確保するんだったらどうだろうかとか、
いくらでも話を広げられるじゃないか。

775 名前:713 mailto:sage [2007/09/22(土) 16:41:07 ]
>>772
>絶対に関わりあいたくないから、どこで働いているのか晒してくれないか?w

私の会社ですか?それは勘弁してくださいw

776 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:42:05 ]
ぶっちゃけ日本のC++PGの何割がEffective C++とか読んでんだろうな
板違い気味だけど

>>771
俺だったら滅茶苦茶速度に過敏なコードだったら
例え速度が全く等しくてもポインタにする

777 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:47:58 ]
i,j については↓の「暗黙の型宣言による伝統的・慣習上の変数命名規則の誕生」の項を参照。
ja.wikipedia.org/wiki/FORTRAN



778 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:52:18 ]
>>768
基本的に、C/C++ではローカル変数は全てスタックに確保される。
その場合、その確保作業は関数突入時にのみ行われる。
従って、次のようなコードはどちらも確保に伴うコストに変わりはない。
但し、後者の場合は最初のiと後のiで違うメモリを確保する可能性は、ある。
--
void func()
{
int i;
...;
for (i = 0; i < N; ++i) ...;
...;
for (i = 0; i < N; ++i) ...;
}
void func()
{
...;
for (int i = 0; i < N; ++i) ...;
...;
for (int i = 0; i < N; ++i) ...;
}
--
# 勿論、後者もiの有効範囲が重ならないことは容易に判る訳で、真っ先に最適化の対象にはなりそうだが。

779 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:53:29 ]
>>776
私だったら、滅茶苦茶速度に過敏なケースにコンテナは使わないな。

780 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:57:00 ]
>>778
>後者の場合は最初のiと後のiで違うメモリを確保する可能性は、ある。
つまり関数突入時に二つのiを確保するということかな?
だとすれば、速度/メモリ量共に影響があるじゃないか!

781 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:58:44 ]
>>776
可読性も決して軽視出来ない要素だろ・・・条項

782 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:59:53 ]
>>780
馬鹿だな、全く最適化を考慮しない場合の話だぞ。
それに、速度には全く影響ないじゃないか。

783 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:03:16 ]
>>782
>馬鹿だな、全く最適化を考慮しない場合の話だぞ。
その場合のつもりで言ったんだ。
>それに、速度には全く影響ないじゃないか。
すまん、勘違いだった。

784 名前:713 mailto:sage [2007/09/22(土) 17:04:42 ]
>>776
>ぶっちゃけ日本のC++PGの何割がEffective C++とか読んでんだろうな

Effective C++は持っていますが難しくて分からないところがたくさんありました。
私の会社ではconstのことを考えるとEffective C++とか読んでるのは私だけですかねぇ・・・。

785 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:06:27 ]
>>780
お前の環境についてはしったこっちゃないが。
俺様の環境ではスタックポインタを4つ減らすか8つ減らすかの違いでしかないな。
あと俺様のコンパイラはお前以上に頭がいいので、ひとつしか使わないがな。

786 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:08:22 ]
頭のいいコンパイラなら
そもそも使わない分までスタックポインタを移動しない。

787 名前:713 mailto:sage [2007/09/22(土) 17:39:37 ]
あと、他にも会社で禁止にされたことがあります。
ブロック内でfor文やif文など以外のブロックを作成してはならないと言われました。
理由は「行数が増えたりして読みにくくなる」「変数は関数の先頭で宣言したほうが読みやすい」からだそうです。

私はこんな感じで { } を使うことがたまにあります。
void hoge(void)
{
   {

   }
}

私の会社では禁止なのですが、この書き方は一般的なのでしょうか?
皆さんはこのように { } を使うことはありますか?





788 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:45:51 ]
>>787
デストラクタの実行タイミングを細かく制御したいとき(セマフォなどの共有リソースを使ったりとか)には
よくそういう包み方することはあるな。

789 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:46:42 ]
>>787
変数を使う範囲を明示するために頻繁に使うよ。
その会社には仕事を頼みたくないな…。

790 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:47:53 ]
>>787
俺はあまりやらない。その内側のブロックを関数化するかもしれない。

791 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:49:02 ]
>>713
そんな会社辞めちまえ、ダメプログラマにされるぞ

792 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:49:28 ]
やっぱり出入り禁止だw

>>787
>理由は「行数が増えたりして読みにくくなる」「変数は関数の先頭で宣言したほうが読みやすい」からだそうです。
この辺でお郷が知れる。
こう書く人が多かったりしない?
--
FILE * fp;
fp = fopen(...);

793 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:55:17 ]
>>713
尻穴みたいな井の中の蛙になりたくないなら
学習の意欲のあるうちに辞めちまったほうがいい

あるいは部署変えてPG以外の業務勉強したほうがためになりそう

794 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:01:32 ]
>>787
それは禁止されてていい

795 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:03:07 ]
ある意味そのレベルでC++使ってるっちゅーのが感動的だナ

C++といいつつ実質Cとして使ってる制御系か?
VC++6.0以前とMFC使ってる業務系か?

制御で「const使うな」はありえんか

796 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:14:00 ]
これで「クラスって何、おいしいの」だったら傑作なんだが。

797 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:16:17 ]
どこが?



798 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:20:00 ]
>>787
関数内の { } は変数などのスコープを限定するツールとして役に立つよ。
スコープを限定するのがどういいのかは、話すと長いが...
グローバル変数がよくない(誰がどういうタイミングでアクセスするのか
把握できなくなる・しにくくなるから)のとおおよそ同じ理屈。

根拠のない(しかもわりと間違っている)ローカルルールが多いね。
チーム内で1人で反抗してもしょうがないとは思うけど、
ちゃんとしたプログラマになるつもりなら、
後学のためにまず初学者向けの良書を読んでおくことをお勧めする。個人でね。

Effective C++よりももうちょっと易しいものから読んだ方がよさげ。
...って何がいいんかね。C++ Coding Standardsってのも良書でお勧めできるけど、
やっぱりちょっと早いような。


799 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:21:02 ]
そんな長い関数を書くなよ

800 名前:713 mailto:sage [2007/09/22(土) 18:24:51 ]
皆様、レスありがとうございます。

>>792
いいえ、C++ Builderを使っているのでファイルにアクセスするときは
みんなVCLを使っていると思います。
VCLに関連して「Delphiを使うかもしれないからC++のライブラリに依存してはならない」
という理由でSTLも禁止になりました。
STL禁止は守れそうにありません。

>>794
その理由は
「行数が増えたりして読みにくくなる」「変数は関数の先頭で宣言したほうが読みやすい」からですか?

>>795
前述のようにC++Builderを使っています。
パソコンからいろんなものを制御しています。

801 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:29:48 ]
>>800
悪いことはいわんからとっとと逃げ出したほうがいいんじゃないか、その会社。
正直言ってアホしかいねーだろ、どうみても。

802 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:34:13 ]
なんか凄いことになってるな。

>>773
これなら刺身の上にタンポポを乗せる仕事のほうがまだマシだ。

803 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:36:11 ]
標準ライブラリを使っちゃいけないってどんだけー

804 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:40:08 ]
まあ、仕事でやってるとわけ分からんルールは多いね。
 なぜそするの? → 以前からそうだから。
 こう変えたほうが良いのでは? → 今までこれでうまく言っているのだから変えるべきではない。
ということが多すぎ(--;

とりあえず社内ルールだからと割り切ってるが、本来どうあるほうが良いのかという勉強は欠かさないつもり。

805 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:40:12 ]
STL禁止か……もはやC++じゃないな。
テンプレートは使えるんだろうか。

というかなぜC++を使っているんだ。
もういっそのこと全部Delphiでいいだろ。

806 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:45:25 ]
この手の社内ルールというのは、
それを決めた時点では妥当だったりそれなりの理由があったりするものだが、
その後状況が変わってもそれを盲信して変えないという状況に陥りがちなんだよな。
なぜそうするのかが忘れさられて、ただルールだからという理由で守られ続ける。

807 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:47:45 ]
STL禁止や標準ライブラリ禁止って組み込みだったらそれなりにあることだと思ってたけど?



808 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:54:41 ]
>「Delphiを使うかもしれないからC++のライブラリに依存してはならない」
コピペ改変コーディングしか出来ない奴が大半と見た

809 名前:713 mailto:sage [2007/09/22(土) 19:04:23 ]
>>805
>テンプレートは使えるんだろうか。
テンプレートは上司が知らないので使いすぎると
また禁止になる可能性があると思います。

>というかなぜC++を使っているんだ。
>もういっそのこと全部Delphiでいいだろ。
これは私の推測ですが、

C言語は知っている

Windowsの時代になりGUIのソフトを作成しなければならない

Visual C++は難しいのでDelphiを使う

C++Builderが発売

慣れたC言語を使いたくてC++Builderを使う

と、こんな感じではないかと・・・。

>>807
私の会社では組み込みのプログラミングはありません。

810 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:16:04 ]
っていうか組み込みの仕事だっていうから、コンパイラをさらしてくれないと何とも言えない。

上司や同僚が親切に「(このコンパイラでは)〜の方が速くてコンパクトなコードが出る」と
教えてくれてるのかもしれないし。

811 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:37:16 ]
その上司は各種ライブラリのリファレンスもconstウゼーな、
とか言いながら読むんだろうな。


812 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:38:53 ]
だんだん「ム」ではなく「マ」の話題になってきたような気がする。

813 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:44:27 ]
あとでっかい機能といえば例外処理と名前空間だろうか。
Delphi移植論でいけば例外処理はありとなってほしいところだが。

814 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:45:11 ]
コーディング規約やその他のコーディングスタイルは、本来プロジェクトごとに決めるべき。
企業としての品質を維持するために共通ルールを設けるのは構わないが、ある程度の幅を持たせておき
その幅をプロジェクトごとにきめる形にするのがいい。

設計段階でのレビュー作業や、コードレビュー、プロジェクト完了時点での反省会議などをきちんとやれる会社でさえ、
コーディングルールは決まっていないことが多いから仕方ないことなのかも知れないが。

815 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:48:48 ]
その辺のC++の「新機能」って初出はARMだっけか?
1990年だからもう20年近く前になるんだが

816 名前:713 mailto:sage [2007/09/22(土) 20:27:49 ]
>>810
え?>>810は私に対するレスですか?
私はパソコンで使用するソフトを作成しているので
組み込みの仕事では無いと思います。
ついでにコンパイラはC++Builderのそれです。

>>813
名前空間は使っているところをまだ見られていないと思うので分かりません。
上司が名前空間という機能を知っているかどうかも分かりません。
例外処理は勉強不足で私自身分かっていないのでなんともいえません。すみません。

>>814
私の会社はプログラマが少ないせいなのか、決まったルールは無いようです。
入社して間もない私が今まで誰もしなかった書き方をしていたので
上司は他の人も読めるようにしたかったのではないでしょうか。
また、コードレビューや反省会議といったものは特に無いようです。

817 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 21:01:47 ]
レビューもなく環境的な制限もないのにあれ使うなこれ使うなとか言われるのはやだな。



818 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 21:05:08 ]
完全に言語/技術の話じゃなくて「いかに俺の会社の上司がドキュソか」っつー
話になってるな
そういうのはマ板でやってくれんか

819 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 21:29:57 ]
const_<int> i(0);

820 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 21:45:55 ]
なんかこの流れキモくね?

821 名前:713 mailto:sage [2007/09/22(土) 21:59:46 ]
納期に間に合わないので明日は出勤します。

>>818>>820
すみません。

>>819
それはconstのかわりにということですか・・・。
見つかるとそれも禁止になると思います。

スレ違いになってきたようなのでこの話はこのへんで止めます。

レスして下さった皆様、今日はありがとうございました。

822 名前:デフォルトの名無しさん [2007/09/22(土) 22:23:46 ]
std::ostreamに空白文字 ' ' をn個出力する処理の、素敵な、シンプルで高速な書き方を教えてください。


823 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:25:24 ]
for(int i=0;i<n;i++) { os << ' '; }

824 名前:デフォルトの名無しさん [2007/09/22(土) 22:27:55 ]
>823
現状はそれですが、プロファイラが遅いと言っています。

825 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:28:04 ]
こうかな
cout << setw(n) << ' ';

826 名前:デフォルトの名無しさん [2007/09/22(土) 22:32:57 ]
>825
ソレダ
どうもありがとうございました。

827 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:20:47 ]
emacsでc++開発をするときの環境に関するサイトってないでしょうか?

meta-x なんちゃら

でDebugからclass構造のブラウズ、リファクタリングまで
なんでもできちゃう環境とか作れるのでしょうか?

elispは最近おぼえました



828 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:28:45 ]
Cの基本的な知識はありますがC++を独学するとしたらお薦めの本はありますか?


829 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:32:30 ]
Cの本は独習C、新・詳説C言語です。


830 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:33:30 ]
じゃあ独習C++でいいんじゃないの?

831 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:50:31 ]
独習C++は勉強になるけどつまらないっていう評判が多いけど、個人的には面白かったよ。
愛だね。

832 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 01:37:41 ]
独習にします。ありがとうございます。


833 名前:デフォルトの名無しさん [2007/09/23(日) 01:39:20 ]
そのあとでいいから
Effective C++, Effective STL, Exceptional C++, Exceptional C++ Style
くらいは読んでね。同僚の迷惑にならんよう。

834 名前:デフォルトの名無しさん [2007/09/23(日) 01:43:32 ]
今から独習C++なんて読み始めてる人なら

Effective C++, Effective STL, Exceptional C++, Exceptional C++ Style

を読めるようになるまで5年はかかる

835 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 01:45:46 ]
>>833-834
オマイラなんでそんな意地悪なことばっか言うわけ?

836 名前:デフォルトの名無しさん [2007/09/23(日) 01:46:46 ]
平均的なプログラマってそんなもんですかね。安心するなぁ。


837 名前:デフォルトの名無しさん [2007/09/23(日) 01:48:24 ]
なんで意地悪?????

3番めのはちょっと難しいかなとは思うけど、読まないとダメダメなコード
書いちゃうのがC++なんだから読むしかないべ。

新入社員に読ませてるけど、あんまり脱落しないよ?



838 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 01:52:49 ]
つーか、何で書籍スレでやらないの?

839 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 01:53:41 ]
イエテル

840 名前:デフォルトの名無しさん [2007/09/23(日) 02:12:25 ]
C++を本当にC++らしく書ける奴なんてみたことないぞ
日本人だとエピスがちょっと書けるかな?
程度

841 名前:デフォルトの名無しさん [2007/09/23(日) 02:14:49 ]
プッ


842 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 02:25:07 ]

上司「俺の知ってるCの一部の機能だけで書け」
ってことか・・・






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<205KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef