- 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
- 447 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 00:40:52 ]
- >>446
日本語でおkだな。 コンパイルしたいのであればC++のコンパイルが可能なものであればなんでもいい。 コンパイラに必要なものが知りたいのであれば、ソースファイルだけあればいい。
- 448 名前:デフォルトの名無しさん [2008/01/09(水) 00:45:13 ]
- 質問です。
bcc developerを使ってC言語を勉強してるんですが、 #include ""DxLib.h" int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC) { ChangeWindowMode(TRUE); if(DxLib_Init() == -1)return(-1); DrawBox(0,0,120,65535,TRUE); WaitKey(); DxLib_End(); return(0); } と打ち込むと Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照) となります。 いろいろ調べてみた結果Windows アプリケーション→コンソールアプリケーションに チェックを変えると、 Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照) となり、やはりだめです。。 もうにっちもさっちもいきません。どなたかアドバイスお願いします
- 449 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 00:55:34 ]
- #include <windows.h>
コンパイルオプション -W
- 450 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 00:59:49 ]
- >>448
よく分からんけど先頭行に #include<windows.h> でいけるかも
- 451 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 01:57:55 ]
- >>444
ソート済み const 配列の形で定義して、 lower_bound() とかする関数を インターフェースとしてかぶせとけばいいんじゃない?
- 452 名前:448 [2008/01/09(水) 02:06:46 ]
-
説明不足ですみませんでした。 とある参考書を使っていて、「DxLib」というファイルをインクルードして 進めていくらしく、それで#include"DxLib"となっているみたいです。 >>449-450 れすありがとうございます。 #include<windows.h> としたんですが、同じエラーがでました。 コンパイルオプションってどうやっていじるんでしょうか。 BCC developerのプロジェクト設定で ●コンソールアプリケーション(-WC) Windowsアプリケーション(-W) というようにチェックするところがあるんですが、 このことですか?
- 453 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 02:12:28 ]
- あたりが付いてるならとりあえずやってみてから質問してはどうか
- 454 名前:448 [2008/01/09(水) 02:16:38 ]
- やってみたんですが、だめでした。
根本的に間違ってるんでしょうか
- 455 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 02:29:52 ]
- >>451
それなんてEffective(ry
- 456 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 02:38:20 ]
- >>448
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5704.zip 素直に、VC++とかにしてくれれば、話は早いんだが、まぁ、ゲーム作りたいやつは応援する主義なんでね。
- 457 名前:448 [2008/01/09(水) 02:54:28 ]
- >>456
ありがとうございます! さっそくやってみます
- 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 微妙。まともじゃない解説をしているサイトも検索されるから。
|

|