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


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

【初心者歓迎】C/C++室 Ver.46【環境依存OK】



1 名前:◆NUNUK382Dk mailto:sage [2007/12/27(木) 20:32:47 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.45【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1197090562/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

458 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 03:23:36 ]
>>448
 とりあえず、VC++2005ExpressEditionを進めておく
www.microsoft.com/japan/msdn/vstudio/express/maninstall/
の 「Visual C++ 2005 Express Edition」 日本語版 611,540 KB 0xB3AD1A2F を選択してダウンロード、
仮想ドライブでインストール、あるいは、一度CDに焼いてから、でもよい。

Win32APIを利用するためには、PlatformSDKが必要
www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en
ここの、最後のほうに、「PSDK-x86.exe 1.3 MB」と (Download) がある。
似たようなのが、3つあるが、一番下の(Download)を選ぶ。ダイアログが出ると保存なりしてくれ。
 ダウンロードした exe を実行して指示に従えばよい。

 参考ページ : www.microsoft.com/japan/msdn/vstudio/express/visualc/

459 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 03:50:34 ]
2008じゃだめなん?psdkも一緒にインスコできるぜ

460 名前:デフォルトの名無しさん [2008/01/09(水) 03:56:03 ]
ポインタの基本的なことなのかもしれませんが、良く分からず悩んでおります。

2次元、3次元配列をポインタにキャストして操作したいのですが、
以下のような操作は問題ないのでしょうか?

int* hoge = (int *)new int[2][3];

例えば、上のようにcastして、1次元配列のint[5]と同じように
操作しても問題ないでしょうか?



461 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 04:04:13 ]
>>461
ちょっとずれるかもしれないが、plaza.rakuten.co.jp/tcross/diary/200711230000/

 キャストは、一日3回までだっていったでしょう。
できるだけキャストしないですむように組みましょう。
 問題ありそうな気がする。試してないので、あれだけど。

462 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 04:07:53 ]
C++のブースト以外のプログラムってないでしょうか。

463 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 04:10:49 ]
意味が分からないぞw
ライブラリのことならそりゃいっぱいあるよ

464 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 04:12:35 ]
>>460
CもC++も配列はあくまでも一次元。(多次元と表現するけど。)
今の場合は、int[3]を要素として二つ持つ一次元配列だから
int (*p)[3] = new int[2][3];
だと思う。

465 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 04:12:45 ]
>>461
断言できないが、簡単に試したら、問題なかった。
でも、気持ち悪いので、出来るだけキャストはやめて欲しい。

466 名前:460 [2008/01/09(水) 04:23:49 ]
>>461
>>464
>>465

みなさんありがとうございます。
できれば変なキャストはさけたいのですが、
呼び出さなければいけないDLLのメソッドが
int * で待ってまして、どうやって2次元配列、3次元配列を渡せば
よいのか悩んでおります。
(ちなみにFortranのDLL)

いちおう上のようなやりかた
int* hoge = new int[2][3];
で渡して動作しているよう?なのですが、

なにか動きがおかしいようです・・

メモリ的にはint[5]と同じなので、問題ないのかな?
とも思うのですが・・



467 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 04:39:05 ]
2 * 3 = ?

468 名前:460 [2008/01/09(水) 04:41:41 ]
>>467
すみません、int[6]でした。

469 名前:460 [2008/01/09(水) 04:47:58 ]
www.nurs.or.jp/~sug/soft/tora/tora10.htm
ここをみると、

int x[10][10];
int i;
int *p = (int *)x;

for( i = 0; i < 100; i++ ) {
*p++ = i;
}
printf( "x[5][5] = %d\n", x[5][5] );

とあるので、どうやら問題なさそうですね・・。
でもC++でも問題ないのか、なぞですが・・。

470 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 04:58:32 ]
>>466
int (*p)[3] = new int[2][3]; にして&p[0][0]を渡せばいいんでない?
キャストしないとコンパイルエラーだし、コンパイルを通すための無理やり
キャストは正直気持ち悪い。

471 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 05:04:30 ]
int* hoge = (int *)new int[2][3];

いや待てよ。上の場合だと

delete [] hoge;

が未定義動作になる可能性がなきにしもあらずな気がしないでもない。
大丈夫かもしれんが移植性と規格を考えたら、>>470のほうが安心だな。


472 名前:460 [2008/01/09(水) 05:39:13 ]
>>470-471
ありがとうございます。そちらの方がやさそうですね。
ためしてみます。
ちなみに3次元配列の場合は

int (*c)[2][3]= new int[5][2][3];

のような感じですよね?

473 名前:460 [2008/01/09(水) 05:39:46 ]
「よさそうです」の間違いでした。


474 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 07:42:52 ]
最初から1次元配列で確保しておいて、オフセットを調整した方がいい希ガス。
オフセット計算用にこんな関数でも用意して。
static int offset(int w, int x, int y) {return w * y + x;}

475 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 10:47:37 ]
>>472
そう。

>>474
そう思う。


476 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 12:37:45 ]
>>448
俺は前にbccでWinMainの引数型不一致でコンパイル通らなかったことがある
詳しいことは忘れたが第三引数がTだったような、違うかったような



477 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 14:17:31 ]
スレ違いかもしれませんが7-zip32.dllで
自分で作ったデータを直接zipで保存する方法分かる人いませんか?
具体的に言うと
自分で作ったデータをファイルとして出力→7-zipでファイルを指定して圧縮 はできるのですが
圧縮範囲をポインタで指定→ファイル名を指定して書庫作成 ができないのです。

478 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 14:25:20 ]
>>477
ファイルアーカイバで、ファイル以外のものをアーカイブする機能があるとも思えないが。
そもそも、なんでファイルに出力しちゃいけないの?

479 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 14:30:51 ]
>>478
数が多いので出来ればいちいちアウトプットしたくないんです。
最悪 ファイル出力→書庫作成→ファイル消去
ってしようと思ってます。
やっぱりこういったdllには基本的にないんですかね?

480 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 14:40:17 ]
圧縮したいだけならアーカイバのDLLを使わないで圧縮ライブラリ使ったら?

481 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 14:51:38 ]
そのとおり

482 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 14:52:07 ]
>>479
7-zip32.dllのAPIリストを流し読みしてみたが、メモリソース展開用の関数は無いっぽい。
出力先はメモリで受け取れるみたいだけどなw
480が言ってるようにzlibなりを使うのも手。
(その場合他のアーカイバと互換性を持たせるのは少し面倒だが)
あとは7-zip32.dllのソースをいじってメモリソース対応版を作るのも良いかも。
該当箇所を探すのが少し面倒だろうけど。

483 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 15:27:16 ]
軽く調べたら7zip(7-zip32.dllではなく、本家のほう)のcommon/StdInStream.h .cpp
を修正すればメモリソースに対応できると思う。
あとは自分で調べるか詳しい人に聞いてね

484 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 16:58:56 ]
統合アーカイバDLLってのは、基本的はファイル経由ばかりかと。

極端に言えば、昔の(今もあるけど)コマンドラインインターフェースを
そのままDLLに渡して動かすために作られたようなものだから。
各DLLに共通の操作を実現させるために、基本的な処理が中心だし。

だから、その元になるものを参考にすれば、大抵はオンメモリの操作になる。
例えば、TAR32.DLLではなくてzlibを使うとかね。
全てにそういうのがあるわけじゃないだろうけど。

485 名前:デフォルトの名無しさん [2008/01/09(水) 17:44:08 ]
>>463
ライブラリ詰め合わせとかがあると便利なんですけど
誰かマジレスお願いします。

486 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 17:44:36 ]
>>466

//配列へのポインタ−−簡単な例

#include <stdio.h>

int main(void)
{
int a[4][10]; // 配列
int i, j;
int (*p)[10]; // 配列へのポインタ

//配列へ代入
for(i=0;i<4;i++) {
for(j=0;j<10;j++) {
a[i][j]=(i+1)+(j+1)*10;
}
}

//ポインタを使って表示する
for(p=a;p<a+4;p++) {
for(i=0;i<10;i++) {
printf("%3d ",(*p)[i]);
}
printf("\n");
}
return 0;
}




487 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 17:46:51 ]
>ライブラリ詰め合わせ
そりゃいくらでもあるぞ。目的も環境も判らんからなんとも言えんが。

488 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 17:49:23 ]
>>485
割とまじめに答えたんだがな
存在するなら
欲しい機能名 ライブラリ
で適とーにぐぐれば見つかるだろ

いろんなライブラリが片っ端から詰め合わせてあるのが欲しいとか?w
ねーよwwwww

489 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 17:49:55 ]
アーカイバの展開なら00AM型Susieプラグインがメモリストリームからの展開サポートしてるのにね。

490 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 19:09:33 ]
FILE_ATTRIBUTE_TEMPORARYを付けてCreateFileして、
Windowsにバッファフラッシュされないことを期待。

491 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 19:34:13 ]
>>488
ここ2、3年新しいライブラリとかは作られていないんですかね。
携帯全盛期でほとんどプログラム終わってると困るんですけど。

キャノンの説明受けに行くのでちょとでも関係あることあればいいんですけどね。

492 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 19:44:08 ]
「キャノン」って書いてる時点で

493 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 20:17:43 ]
ぶっちけた話C++でformに写るようにするには
VBしかないんでしょうか。

494 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 20:23:37 ]
画像表示さえできればボンバーマンくらいはすぐできるだろう
今ならjavaとかが手軽でいいんじゃないか

495 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 20:31:41 ]
VC2005で簡単にゲーム作ってみようと思ったんですが、
getch()でキーコード受け取ったら、カーソルキーが全部224で判別できないんです。

これをどうにかして識別する方法を教えてください。
別にgetchに拘らなくてもいいですが、出来ればC/C++の標準ライブラリに入っているものだと嬉しいです

496 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 20:38:13 ]
>>491
488が否定しているのは詰め合わせのようなものの存在を否定しているだけだぞ。



497 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 21:01:59 ]
>>495
そもそも getch は標準関数じゃない

498 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 21:11:49 ]
>>495
とりあえず「ゆきいるか」でググってLunaでも使っとけばいいと思う。

499 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 21:24:35 ]
>>491
Qt でも使ってみたら。


500 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 21:26:00 ]
>>495
カーソルキーは二つのコードが送られてくる気がする
224 が制御コードで続くコードでカーソル方向が判別できるはず

501 名前:495 mailto:sage [2008/01/09(水) 21:31:18 ]
回答ありがとうございます。getchって標準ライブラリじゃなかったんですか、初めて知りました…
>>498
あんまり外部のライブラリ使いたくなかったんです。ちょっと試しにやってみようかって程度だったので。

>>500
その発想は有りませんでした。試してみたら確かに取得出来ました!

502 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 21:40:54 ]
ttp://msdn2.microsoft.com/ja-jp/library/19f56tw3.aspx
↑のページに書いてあるコードで、一度

#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)

と定義してから

#define new DEBUG_CLIENTBLOCK

と定義し直す意味って何かあるのでしょうか

503 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 21:59:54 ]
new( _CLIENT_BLOCK, __FILE__, __LINE__)っていう文字列にトラウマがあって使いたくないんじゃね

504 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:01:23 ]
>>493
・CLI+Windows.Form
・VCL

505 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:38:12 ]
>>502
ヘッダファイル内で new が置換されると困るだろ?

506 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:39:46 ]
困るってのは、具体的に言えば operator new あたりが一番困る。



507 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 23:05:08 ]
レスありがとうございます。おおよその目的がわかりました。
newを使うファイルでいちいち
#define new DEBUG_CLIENTBLOCK
を定義するのがめんどくさそうですね

508 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 23:06:40 ]
それ専用のヘッダファイルを用意するとか。
最後にインクルード。

509 名前:448 [2008/01/09(水) 23:13:00 ]
>>458
なにからなにまでありがとうございます。。いじくってみます。
>>476
そのへん調べてみます

510 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 23:14:35 ]
STLにたどりつかねぇ、焦っちゃダメだ・・基礎がおろそかになる

511 名前:476 mailto:sage [2008/01/09(水) 23:54:28 ]
>>509
すまん、今試したらTは何の関係も無かったw
何でエラー出てたんだっけな……

512 名前:476 mailto:sage [2008/01/10(木) 00:03:07 ]
連投すまん、うちのエラーはLPCSTRでC++としてコンパイルした時だった(LPSTRならコンパイル通る)
つまり少なくとも>>448みたいにCがついていないのじゃ関係無かったすまん

513 名前:448 [2008/01/10(木) 00:14:32 ]
わかりました。わざわざ教えてくれてすいません

514 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 00:22:38 ]
 >>448
 よかった。まだ見てたか。将来、今までにない斬新なゲームを作ってくれ。

こういうことは、ゲ製板 pc11.2ch.net/gamedev/
のほうが、いいと思う。

DXライブラリ 総合スレッド
pc11.2ch.net/test/read.cgi/gamedev/1197468399/

515 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 00:41:38 ]
>>502見当違いかもだけど
_CLIENT_BLOCK, __FILE__, __LINE__
↑こいつらがどっかで定義されてるマクロだとするとその中身を展開するには
一回newをDEBUG_CLIENTBLOCKにしてからnew( _CLIENT_BLOCK, __FILE__, __LINE__)にしないといけないんじゃないか?
#define new new( _CLIENT_BLOCK, __FILE__, __LINE__)だと
以前に
#define _CLIENT_BLOCK 何か
ってのがあっても、一回のマクロ展開ではnew( _CLIENT_BLOCK, __FILE__, __LINE__)が出るだけで
_CLIENT_BLOCKがそのまま展開されずに残るって言う・・・

試してないけどね!!

516 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 00:44:54 ]


以下の文字列があったとします。
AB AA ABCA BA BB

この中かからABCが含まれているか検査したいのですが
どうやって実現すればいいのでしょうか

strstrだとABCAのABCに部分一致してしまうので使えないと
思うので困ってます



517 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 00:49:35 ]
文字列の最後に空白をくっつけて
ABC空白 で探せばよくね?

518 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 01:43:28 ]
>>512
WinMainは<windows.h>のさらにどっか奥でプロトタイプ宣言が為されているので、
それと合わないとそういう風にエラーになってしまう。

519 名前:519 mailto:sage [2008/01/10(木) 01:44:30 ]
書き忘れた。
多重定義にならず、エラーになるのはextern "C"が付いているため。

520 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 01:58:56 ]
>>516
その例だと「AB AA ABCA BA BB」のなかに「ABC」という文字列はなかったとしたいのか?
だとするならばstrcmpでよくね?

521 名前:520 mailto:sage [2008/01/10(木) 02:01:15 ]
書いた後に気づいた。char str[] = "AB AA ABCA BA BB";ってことか。
char * str[] = { "AB", "AA", "ABCA", "BA", "BB" };だと思った。
セパレータが固定されてるなら>>517でよさそうだね。
ただし、後ろだけじゃなくて前後につけなきゃだめだけど。

522 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 02:04:11 ]
>>516
正規表現ライブラリを使ってみるととか

523 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 02:26:09 ]
オタだとばれない程度のプログラムってどんな物があるんでしょうか。

524 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 02:30:31 ]
>>523
中途半端なプログラムではなく、きっちりしたプログラムならヲタだと思われない。
また、言語知識以外にも専門的な知識が必要になるプログラムなら確実に思われないだろうな。
たとえば、半導体のキャリア輸送をシミュレートするプログラムとか。

525 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 02:38:51 ]
他には何かないのか。

526 名前:デフォルトの名無しさん [2008/01/10(木) 03:09:30 ]
以下のソースがコンパイル通りません。
色々とそぎ落としてこうなったのですが、どこが間違ってるのでしょうか?
誰か助けて〜

#include <iostream>
#include <queue>
using namespace std;
class event {
int priority;
public:
event() { priority = 0; }
bool operator<(const event &a);
};
bool event::operator<(const event &a) {
return this->priority < a.priority;
}
int main() {
priority_queue<event> q;
return 0;
}




527 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 03:12:25 ]
>>526
デバッグを他人に丸投げしたいのでなければ、エラーメッセージくらい張れ。

528 名前:デフォルトの名無しさん [2008/01/10(木) 03:50:09 ]
>>527
すいません。以下です。コンパイラはlinuxのg++です。
意味があるのは最後の4行だと思うのですが、それでも意味が分からん。。。

$ g++ test.cpp
/usr/include/c++/4.2.1/bits/stl_function.h:
In member function 'bool std::less<_Tp>::operator()
(const _Tp&, const _Tp&) const [with _Tp = event]':
/usr/include/c++/4.2.1/bits/stl_heap.h:279:
instantiated from 'void std::__adjust_heap
(_RandomAccessIterator, _Distance, _Distance, _Tp, _Compare)
[with _RandomAccessIterator = __gnu_cxx::__normal_iterator
<event*, std::vector<event, std::allocator<event> > >,
_Distance = int, _Tp = event, _Compare = std::less<event>]'
/usr/include/c++/4.2.1/bits/stl_heap.h:404:
instantiated from 'void std::make_heap(_RandomAccessIterator,
_RandomAccessIterator, _Compare) [with _RandomAccessIterator
= __gnu_cxx::__normal_iterator<event*, std::vector<event,
std::allocator<event> > >, _Compare = std::less<event>]'
/usr/include/c++/4.2.1/bits/stl_queue.h:353: instantiated from
'std::priority_queue<_Tp, _Sequence, _Compare>::priority_queue
(const _Compare&, const _Sequence&) [with _Tp = event,
_Sequence = std::vector<event, std::allocator<event> >,
_Compare = std::less<event>]'
samp50.cpp:14: instantiated from here
/usr/include/c++/4.2.1/bits/stl_function.h:227:
error: passing 'const event' as 'this' argument of
'bool event::operator<(const event&)' discards qualifiers



529 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 03:59:44 ]
const忘れてるぜ

530 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 04:01:44 ]
- bool operator<(const event &a);
+ bool operator<(const event &a) const;

- bool event::operator<(const event &a) {
+ bool event::operator<(const event &a) const {

531 名前:デフォルトの名無しさん [2008/01/10(木) 04:02:27 ]
>>529
えっ,どこですか?
priority_queue<const event>
としてみたのですがダメ。(コンパイル通らず)


532 名前:デフォルトの名無しさん [2008/01/10(木) 04:06:19 ]
>>530
コンパイル通りました!
でも意味わかんねえス。今まで演算子のオーバーロードでそんなところに
constつけたことなかったよ。どういう意味ですか?


533 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 04:06:26 ]
笑ってしまっていいのだろうか……

534 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 04:07:17 ]
笑えよ・・・

535 名前:デフォルトの名無しさん [2008/01/10(木) 04:10:32 ]
>>533,534
だんだん自分でも怖くなってきた。もしかして自分は、すごく基本的なことを
知らないとか言ってる?


536 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 04:11:30 ]
.>>528
そのoperator<()が非constメンバだから、非constなオブジェクトからは呼び出すことができない。
書き換えを伴わないメンバ関数は、全てconstメンバにしておくべき。



537 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 04:11:58 ]
うぜぇな
ttp://www.google.co.jp/search?source=ig&hl=ja&rlz=&q=%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0+const&meta=lr%3Dlang_ja
これでも見てろ

538 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 04:12:13 ]
> 演算子のオーバーロードでそんなところにconstつけたことなかった
「演算子のオーバーロード」を「メンバ関数」に置き換えても、やっぱり同じことが言えるんだとしたら、
かなり基本的なことを学び損ねてると思う。
そうでないなら、まぁちょっとした誤解だから、すぐ知識の修正もできるだろうけど。

539 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 04:24:38 ]
bool operator<(const &TYPE)const;じゃないとダメなのはpriority_queueの問題でしょ

あと
>そのoperator<()が非constメンバだから、非constなオブジェクトからは呼び出すことができない。
「constなオブジェクトからは呼び出すことができない」じゃね


540 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 04:38:54 ]
>>537
微妙・・・

541 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 04:48:34 ]
priority_queueは内部でstd::lessを使うんだが、これが>>526の場合は
bool less(const event &a, const event &b){ return a < b; }
こんな感じなので、eventクラスのoperator<がconstメンバ関数じゃないとエラーになる


542 名前:デフォルトの名無しさん [2008/01/10(木) 05:41:08 ]
>>536-541
色々こんな時間にありがとうございます。
自分の中ではとりあえず、
「priority_queue用に独自classに<(less)を定義する時は、引数と関数にconstをつける必要あり」
というルールで記憶することにしました。そして、
かなり基本的なことを学び忘れているようなので、とりあえず関連記事探して独習c++でも逝っときます。
関数にconstをつけるのは本当に知らなかった。メンバ変数にconstをつけるのは
意味なし、くらいに思っていたし。。
関数にconstつけるのは、メンバ変数を変更しない、という意味でいいんですよね?

あと、537が書いてくれたリンクはわかりやすかったんですけど、540の微妙…という
コメントは、どうしてですか?



543 名前:Gori [2008/01/10(木) 05:46:34 ]
これら どの様な違いが有るのでしょうか?

Microsoft Visual C++ 6.0 Standard Edition

Microsoft Visual C++ 6 Professional

Microsoft Visual C++ 6.0 Enterpris

544 名前:つらいぜ独学 [2008/01/10(木) 06:45:35 ]
ちょっと質問です。
#include<stdio.h>
void aaa(int test){
int i = 1;
if(test == 5)
return;
printf("あ");
test += i;
aaa(test);
printf("え");
}
int main(void){
int test = 0;
aaa(test);
return 0;
}
の結果を あああああえ になるかと思ってたんですが、
実際は あああああえええええ でした。
これは何ででしょうか?


545 名前:デフォルトの名無しさん [2008/01/10(木) 07:05:59 ]
aaa()に入ったら、引数が5でないかぎり
printf(え)を実行するじゃん。引数が5になるまで、
aaa()は5回呼ばれる。

546 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 08:23:17 ]
>>544
再帰関数の中で、再帰する前の処理をA、自分自身の呼び出しをB、再帰した後の処理をCとすると
その再帰は(ABC)になってるわけだろ。
で、ここのBをまた(ABC)に置き換えて…ってのを5回(4回か?数えるのメンドクセ。)やって
最後のときはBを消すって形で終わってるから最終的な形としては
(AAAAACCCCC)になる。



547 名前:536 mailto:sage [2008/01/10(木) 10:25:10 ]
>>539
そうそう、間違えた。訂正感謝。

>>542
微妙。まともじゃない解説をしているサイトも検索されるから。

548 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 12:11:58 ]
// ABase.h
class ABase {
public:
 typedef std::vector<B> VectorB; // Bは完全型でなくてはいけない?
 virtual VectorB::iterator F(const VectorB& vec)=0;
 ...
}

// B.h
template <...> // テンプレートクラスのため.hと.cppにわけることができない
class B {
public:
 void F() {
  pABase_->...; // ABaseの関数を呼び出す
  ...
 }
private:
 ABase* pABase_;
};

ABaseはBの定義が必要、BはAbaseの定義が必要という状態になってしまい、困っています。
こういった循環参照を避ける手法はないでしょうか?

549 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 12:17:13 ]
質問させてください。
C++言語で
interface A {
virtual void MesA() = 0;
};
interface B {
virtual void MesB() = 0;
};
interface C : public A,public B {};
class D : public C {
public:
void MesA() { printf("A class\n"); }
void MesB() { printf("B class\n"); }
};
int main() {
D d;
void *p = (D *)&d;
B *bbb = (B *)p;
B->MesB();
}
こうするとAのMesAのメソッドが呼ばれてしまいます。
Cの中身は空ですが、他のメソッドが書かれています。(このサンプルでは関係ないと思うので空にしました)
変数pを一度C型にキャストしてからB型にキャストするとうまくいくのですが、
なるべく、そうはしたくないので困っています。
原因、解決策のわかる方教えてください。
環境
Visual Studio 2003 .NET
2005でも同じでした。
改行が多すぎるとエラーが出たのでみずらくてすいません。

550 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 12:47:53 ]
>>548
これでどうかなぁ
でもかなり無理矢理な感

// ABase.h
#include "B.h"
#ifndef ABase_h
#define ABase_h
class ABase {
...
};
#endif

// B.h
#ifndef B_h
#define B_h
class ABase;
template <...>
class B {
public:
void F();
private:
ABase* pABase_;
};
#include "ABase.h"
template <...>
void B<...>::F() {
pABase_->...;
};
#endif

551 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 12:54:24 ]
>>549
void*を元と異なるクラスにキャストしてるのが原因かと

>void *p = (D *)&d;
>B *bbb = (B *)p;

ここ(pはD*なのかB*なのか??)を

void *p = (B *)&d;
B *bbb = (B *)p;

とする(pはB*を保持)か、あるいは

void *p = (D *)&d;
B *bbb = (D *)p;

とする(pはD*を保持)

552 名前:548 mailto:sage [2008/01/10(木) 13:17:57 ]
>>550
レスthx

しかし、できれば書きたくないコードですね。
設計を見直した方がいいのかなぁ。

553 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 13:47:15 ]
>>552
こういう風にしてみるとか

// ABase.h
#include "Bdecl.h"
class ABase { ... };

// Bdecl.h
class ABase;
template <...>
class B { ... };

// Bimpl.h
template <...>
void B<...>::F() { ... };

// B.h
#include "ABase.h"
#include "Bimpl.h"

554 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 14:38:23 ]
標準偏差を求める計算式はどのようにしたらいいでしょうか?

555 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 14:43:15 ]
ググレカス

556 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 14:57:59 ]
レスありがとう御座います。

説明不足の部分がありましたので、補足させて頂きます。

実際この処理を使う場面では

//interface AはA.hに定義
//interface BはB.hに定義

//callbackA.cpp
#include "A.h"
void callbackA(void *p) {
A *a = (A *)p;
a->MesA();
}
//callbackB.cpp
#include "B.h"
void callbackB(void *p) {
B *b = (B *)p;
b->MesB();
}
引数pにはDクラスのアドレスが入っているとします。

このように
callbackA.cpp中ではAのinterfaceのみが公開され、
callbackB.cpp中ではBのinterfaceのみが公開されるようにしたいのです。

やはり>>551さんのようにcallbackソースの中でDやCの定義を公開して
キャストするしかないのでしょうか?

説明不足で申し訳ありませんでした。



557 名前:デフォルトの名無しさん mailto:sage [2008/01/10(木) 15:24:17 ]
>>556
callbackAを呼ぶときはpにはA*をvoid*にしたものを渡せばいいし
callbackBを呼ぶときはpにはB*をvoid*にしたものを渡せばいいが
どうしてもpにはD*を渡したいけどDは公開できないというのはわりと無理め

いくらか妥協するなら例えば
class Z {
virtual void dummy(){}
};
みたいなダミーを用意して
class D: public C, public Z { ... };
としてDにZを継承させ
void callbackA(Z *p) {
A *a = dynamic_cast<A *>(p);
a->MesA();
}
って方法もある

引数の型を変えたくないなら
void callbackA(void *p) {
A *a = dynamic_cast<A *>((Z*)p);
a->MesA();
}
とか

558 名前:デフォルトの名無しさん [2008/01/10(木) 15:24:55 ]
cでは変数のアドレスを表示するときに
printf("%p", i);
とかやってましたが、これをcout <<
でやるにはどうすればよいでしょうか?







[ 続きを読む ] / [ 携帯版 ]

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

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