1 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:18:41 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.47【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1200464091/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
690 名前:デフォルトの名無しさん [2008/02/15(金) 01:47:13 ] VC++のインラインアセンブラで64bitの整数の掛算(UInt32x32To64のような物)をやりたい訳ですが どのようにすれば良いのでしょうか。 32bitなら以下で良いみたいですが64bitのやり方がわからず・・・。 int mul(int a, int b) { _asm{ mov eax, a mov ebx, b mul eax, ebx } }
691 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:54:36 ] >>685 〜688 お〜なるほど、とても助かりました。 シフト演算が使えないと言ったのは自分の知識不足です。 3バイトのデータを一気にシフト演算しようとしていました。 上手くいきました。ありがとうございます。
692 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:55:49 ] 解決したと思ったら、もう一個質問ができました。すいませんが、こちらもお願いします。 読み込んできたデータを次の関数で共用体に格納して、bit単位でいじってるんですが、どうも上手くとれません。 いろいろ省略していますが、以下のような感じです。 テストデータ(バイナリ) 11111111 11111111 11111111 共用体 union UNION{ unsinged char data[3]; struct { unsinged short element1 : 8; unsinged short element2 : 3; unsinged short element3 : 5; unsinged short element4 : 1; unsinged short element5 : 7; }FILED; } 処理 UNION A; read (fd , A.data , 3): printf("%d\n" , A.FILED.elemnt1); ←255が出力される printf("%d\n" , A.FILED.elemnt2); ←7が出力される printf("%d\n" , A.FILED.elemnt3); ←31が出力される printf("%d\n" , A.FILED.elemnt4); ←何故か0が出力される printf("%d\n" , A.FILED.elemnt5); ←127が表示される 4番目の要素が1と表示されるません。 これはなんででしょう?
693 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:00:33 ] unionの使い方間違えてないか?
694 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:02:51 ] >>690 64ビットの値を返すときは、EDX:EAX。 こんな関数をコンパイルさせたら、 long long mul(int a, int b) { return static_cast<long long>(a, b); } こんな出力だった。 ; Line 3 mov eax, DWORD PTR _a$[esp-4] imul DWORD PTR _b$[esp-4] ; Line 4 ret 0
695 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:02:56 ] >>692 試しに、printf("%u\n", A.FILED.element4)にしてみたら? >>693 適切かどうかは兎も角、間違ってはいないんじゃないか?
696 名前:692 mailto:sage [2008/02/15(金) 02:19:25 ] >>695 上手くいってないような雰囲気です。 どっか自分が処理を間違えているかもしれないので、 原因を探してみます。
697 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:47:09 ] 手元のgccだとちゃんと1になるけどなぁ。
698 名前:デフォルトの名無しさん [2008/02/15(金) 02:47:14 ] >>694 上位32bitがEDXに格納されるのは解りました。 それをどうやってUINT64の変数に代入するのでしょうか。 一応、以下みたく物凄く邪道な感じでやってみたり・・・ UINT64 mul64(UINT a, UINT b) { FILETIME c; _asm { mov eax, a mul b mov c.dwHighDateTime, edx //mov dword ptr [ebp-8],eax mov c.dwLowDateTime, eax //mov dword ptr [ebp-4],edx } return *(UINT64*)&c; } >mov dword ptr [ebp-8],eax >mov dword ptr [ebp-4],edx のインラインアセンブラでの正しい記述方法が解らないです。
699 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:54:44 ] >>698 C側で対処するならこんなんとか。 union { struct { uint32 l; uint32 h; } s; uint64 w; } c; _asm { mov c.s.l, eax mov c.s.h, edx } return c.w;
700 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:56:12 ] これでいいよ。 __declspec(naked) UINT64 __cdecl mul64(UINT a, UINT b) { _asm { mov eax, a mul b ret } }
701 名前:デフォルトの名無しさん [2008/02/15(金) 03:29:18 ] >>699 なるほど、適当に構造体定義してやればいいのか。 >>700 これは警告も出ないしスマートだし関数でやるならこちらが良いですね。 解決です。ありがとうございました。
702 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 04:57:05 ] >>681 ありがとうございます。C++はCの標準関数+これらが使えるのね
703 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 05:17:09 ] こんな感じでも行ける UINT64 res; _asm { mov eax, a mul b mov dword ptr[res], eax mov dword ptr[res+4], edx } return res;
704 名前:デフォルトの名無しさん [2008/02/15(金) 14:36:08 ] DLLから要求があるまで動作を停止したいのですが、どのようにしたらいいんでしょうか? メインのグローバルハンドルを共有出来ないですよね?
705 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:01:58 ] >>704 環境とやりたいことを具体的に。どうせ、Windowsだろうけど。
706 名前:デフォルトの名無しさん [2008/02/15(金) 15:33:29 ] すみません 似たような質問なんですが WaitForSingleObject( HANDLE hHandle, // オブジェクトのハンドル DWORD dwMilliseconds // タイムアウト時間 ); ってHANDLEがNULLになるまで待つんですか?どういう価でうごくか教えて下さい
707 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:36:24 ] hHandleがシグナル状態になるか、タイムアウトになるまで待つ。 シグナル状態は、そのhHandleが何かによって変わる。 CreateEventしたやつならSetEventしたやつ、とかね。
708 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:40:37 ] >>706 もしそれが、WinAPIのWaitForSingleObjectならば>707。 詳しくは、MSDNかAPIスレへ。 もしそうでないなら、環境を提示すること。
709 名前:デフォルトの名無しさん [2008/02/15(金) 16:13:48 ] サンクス
710 名前:デフォルトの名無しさん [2008/02/15(金) 20:52:12 ] HTMLの文字コードをS-jisにしたいのですが、インターネットエクスプローラで読み込んでS-Jisで書きだというのをC言語でできませんか
711 名前:デフォルトの名無しさん [2008/02/15(金) 20:53:50 ] 文書全体をS-jisに変換してタグを書き換えるというのでは正しく表されないことが多いです インターネットエクスプローラは変換精度が高いです
712 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:16:31 ] すいません、質問があります。 { A a; B b; } と二つのクラスを確保したとき、デストラクタの呼ばれる順番というのは仕様で 定められているのでしょうか?それとも不定なのでしょうか? よろしくお願いします。
713 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:21:15 ] デストラクタは、コンストラクタが呼び出されたの全く逆の順で呼ばれる。
714 名前:デフォルトの名無しさん [2008/02/15(金) 21:23:44 ] すいません。1次元固定配列をを積み重ねて、 2次の動的配列にしたいのですが。 data[4]固定 data[4] data[4] ↓ 動的 typedef std::vector<int> Four; std::vector<Four> data; にすれば確かに動作するのですが、 これでは両方1次も2次も動的です。 よそのスレで typedef int Fou[4]; std::vector<Four> data; とすればいいと言われましたが スレ違いでこれ以上尋ねるわけにも行かずこちらへ 来ました。 Four four; for(i=0; i<5; i++){ for(j=0; j<4; j++){ four[j]=j; } data.push_back(????); } ここの????の書き方が分かりません。 よろしくお願いします。
715 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:27:13 ] >>713 すばやい回答ありがとうございます。継承の時と同じなのですね。
716 名前:デフォルトの名無しさん [2008/02/15(金) 21:31:00 ] >714 すいません、コピーがうまくいきませんでした。 書き込みがTABを上手いこと反映してくれないみたいですね。
717 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:32:58 ] >>710-711 日本語でおk
718 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:48:34 ] >>714 push_back は無理。 構造体にするならいける。 struct Four { int four[4]; };
719 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 21:50:00 ] boost::array<int, 4>ってvectorの要素にできない?
720 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 22:19:07 ] できる
721 名前:デフォルトの名無しさん [2008/02/15(金) 23:03:34 ] 関数の中でたまにでてくる参照引数 (int & みたいな・・) ってどういうとき使うんですか?? 複数の関数内で1つの変数を使いたいときとかですか?
722 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:04:13 ] >>721 コピーコンストラクタ作るとき
723 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:05:43 ] >>721 ・ 呼び出し元の変数の値を変更したい時 ・ 巨大なオブジェクトをコピーせずに関数に渡したい時
724 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:12:44 ] //身長を整数値として読み込んで標準体重を実数で表示 #include <stdio.h> int main() { int na; int weight; printf("身長を入力してくれ:"); scanf("%d", &na); weight = (na - 100) * 0.9; printf("標準体重は%4.1f Kg", weight); return 0; } これを実行しても標準体重が0.0 Kgになるんだけどどこを改善すればいいのでしょうか?
725 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:14:04 ] >>724 ×int weight; ○float weight;
726 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:17:22 ] >>724 そのコードでちゃんと警告を出してくれるコンパイラに換えるか、そのように設定する。
727 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:36:08 ] >>725-726 こんなのも分からん馬鹿でサーセン。cygwin使ってるんだけどロクに設定もできていないもんでして。 ありがとうございます。
728 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:36:33 ] △float weight; ○double weight;
729 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:41:41 ] >>727 つ[gcc -Wall foo.c]
730 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:46:09 ] gcc -ansi -pedantic -Wall オススメ
731 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:47:50 ] 寧ろ、gcc -std=c99 -Wall -pedantic で。
732 名前:デフォルトの名無しさん [2008/02/15(金) 23:59:03 ] >718 構造体にしたらできました。 ありがとうございます。
733 名前:デフォルトの名無しさん [2008/02/16(土) 00:01:46 ] >719 boost::array自体が定義できないけど、必要なヘッダファイルとか あったら教えてください。 VC6.0を使っています。
734 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 00:10:27 ] >>733 まずはBOOSTでぐぐって来るんだ
735 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 00:35:37 ] VC6 でコンパイルできるかなあ。 まあ array くらいならできるか。
736 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 01:41:19 ] 環境ってMicrosoft Visual C++ 6.0って書けば分かる?
737 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:04:52 ] 考えてある程度予想してみたんですが、この考えで合ってますか? 質問大量ですみませんが (1)char *p="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";やc="aaaaaaaaaaaaaaaaaaaaaaaaaaaa" ↑ポインタってアドレスを格納するのに何で文字列を入れれるの? これはどこのアドレスを入れてるの? 自動的に領域を確保して"aaaaaaaaaaaaaaaaaaaaaaaaaaaa"を入れてそのアドレスを入れてるってことですか? もしそうだとしたら、関数内で宣言してその関数からでた場合はその領域は開放されるんでしょうか? (2)cout<<sizeof(c)<<endl;とした場合4になる どうみてもaは5つ以上あるのになんで4なの? これはchar *pのサイズ(参照するアドレスを入れる領域のサイズ)だからですか? ちなみにstrlenだと35でした。 (3)sprintf(c,"aaaaaaaaaaaaaaaa");や strcpy(c,"aaaaaaaaaaaaaaaa");でコンパイルして実行するとエラー これは確保されていない領域に無理矢理文字列を突っ込もうとしてるからですか?
738 名前:737 mailto:sage [2008/02/16(土) 04:07:15 ] ごめんなさい間違えました。cを全部pとして考えてください ついでに言うと(1)の2つめはこんなの char *p; p="aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
739 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:14:11 ] 文字列リテラル(" " で囲んでるやつ)は、 その文字列の置いてあるアドレスを返す。
740 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:18:58 ] ありがとうございます。ということは プログラム起動した時点でa〜zや日本語,記号の全ての文字がメモリのどこかに 自動的に置かれるってことですか? それとも"aaaa"の部分を実行した時点で文字列"aaaa"がメモリに置かれる?
741 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:19:58 ] 起動した時点で置かれてる。
742 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:20:42 ] 起動した時点で、"aaaa" が置かれる、ね。
743 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 04:27:32 ] >>741-742 ありがとうございます。今まで知らずに使ってきました。 ずっと気になってたので教えてもらえてスッキリした
744 名前:デフォルトの名無しさん [2008/02/16(土) 08:26:22 ] >735 げ、自分でコンパイルするのか。 c++標準なのかと思った。
745 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 08:33:14 ] >>744 Boostは事実上の準標準。 一部のライブラリ以外はヘッダのincludeのみで使える。
746 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 09:08:08 ] >>737 > (3) sprintf(c,"aaaaaaaaaaaaaaaa");や strcpy(c,"aaaaaaaaaaaaaaaa"); > でコンパイルして実行するとエラー > これは確保されていない領域に無理矢理文字列を突っ込もうとしてるからですか? 違う。 領域は確保されているが、文字列を突っ込めない (要は、書けない) 領域だから。 エラーになるかどうかは環境によって異なる。 素直に書き換わる環境もあるし、単に書き換わらないだけとか、全然別の場所の 文字列が勝手に書き換わるとかすることもある。 要するに、文字列の領域を書き換えるのは基本的にやってはいけない。 >>741-742 規格でそんなこと決まってたっけ?
747 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 09:25:51 ] >>746 staticな変数と同じ寿命に決まっている。
748 名前:デフォルトの名無しさん [2008/02/16(土) 09:39:06 ] HTMLファイルの構文を解析して、UTF8形式をS-JIS形式に変換するにはどうすればいいですか?
749 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 09:40:49 ] >>748 っ NKF
750 名前:748 [2008/02/16(土) 09:41:44 ] インターネットエクスプローラで読み込んで、S-jisで保存するのをプログラムでやりたいんです
751 名前:748 [2008/02/16(土) 09:43:06 ] >>749 すみません よんでませんでした NKFはやったのですが、エンコード属性が指定されていたりして、文字化けしてしまいます タグを解析する必要があるんです
752 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 09:59:59 ] >>747 そもそも static な変数の寿命なんて決まってたっけ? 例えば、自動変数の寿命ははブロックに入った時から出るまでじゃないだろ。 利用されている区間がかぶらないとわかれば、違う変数を同じレジスタに割り 当てるコンパイラは珍しくない。 それと同じで、利用されてる区間がかぶらない static 変数を同じ領域に割り 当てちゃいかんのか?
753 名前:デフォルトの名無しさん [2008/02/16(土) 10:08:02 ] インターネットエクスプローラの名前をつけて保存 (エンコード指定) だけを利用するには どうすればいいですか?
754 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 10:40:02 ] >>752 のいう同じ領域っていうのは物理メモリの領域を指してるの?
755 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 10:44:34 ] >>753 「IEコンポーネント」で調べてみては?
756 名前:デフォルトの名無しさん [2008/02/16(土) 10:52:38 ] >>753 HTMLの解析とコード変換はMSXMLとADODBを使えばできるがお前には無理。
757 名前:デフォルトの名無しさん [2008/02/16(土) 10:55:58 ] インクルードファイルだけ入れて boost::array<int,4> d; std::vector<d> data; と定義だけはエラーが出ないのはいいのですが 実際はどのように使えばいいのでしょうか。 d[0]=0; d[1]=1; d[2]=2; d[3]=3; data.push_back(d); //この部分がエラー としてもコンパイルエラーが出ます。
758 名前:デフォルトの名無しさん [2008/02/16(土) 11:06:03 ] >757 すいません。できました。別に原因があったようです。
759 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 11:31:11 ] #include <stdio.h> class Test{ public: static int ary[4]; }; int Test::ary[] = {0,1,2,3}; int main(){ printf("%d\n", Test::ary[2]); } すみません。上記のように1次元配列だと初期化できるのですが 2次元配列にするとどう記述しても初期化できません。 例えば static int ary[2][4]; }; int Test::ary[] = {0,1,2,3, 5,6,7,8}; にすると error C2040: 'ary' : 'int []' は 'int [2][4]' と間接操作のレベルが異なります。 となりますし 多次元配列のメンバ変数を初期化する方法はないものでしょうか?
760 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 11:42:03 ] >>759 int Test::ary[] = {0,1,2,3, 5,6,7,8}; これはおかしいよ。 int Test::ary[2][4] = { { 0,1,2,3 }, {5,6,7,8} }; とかじゃないの?
761 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 11:51:33 ] >>760 有難うございます。上手くいきました。 int Test::ary = { { 0,1,2,3 }, {5,6,7,8} }; や int Test::ary[][] = { { 0,1,2,3 }, {5,6,7,8} }; や int Test::ary[0][0] = { { 0,1,2,3 }, {5,6,7,8} }; で試してみて上手くいかなかったのでどうやるのかと思っていました。 [2][4]と書けば良かったのですね。
762 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:04:02 ] >>752 厳密には寿命と記憶期間は別物だが、 大抵の人は普段は記憶期間の意味で寿命という言葉を使う。
763 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:16:55 ] 記憶期間なんて言う俺俺用語を語られても...
764 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:23:50 ] 記憶域期間だった
765 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:43:32 ] auto_ptrについて質問です。 以下のコードを実行したとき、throw(A)のあとで TTestクラスのデストラクタが呼び出されると思っていたのですが呼び出されません。 auto_ptrってこういうものなのでしょうか? TTest* TTest::NewL() { std::auto_ptr<TTest> self(new TTest()); throw 1; // A return self.release(); }
766 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:47:54 ] 例外を投げた際、デストラクタが呼ばれるのは例外が捕捉された時。 例外が捕捉されなければ呼ばれないかもしれない(環境依存)。 auto_ptr の問題じゃなくて、C++ の仕様の問題。
767 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:48:27 ] >>765 catchしたか
768 名前:765 mailto:sage [2008/02/16(土) 12:53:01 ] すみません、catchしたかどうかが重要とは知らず書いてませんでしたが、catchはしています。 ちなみに、std::auto_ptrの部分を自作のsmart_ptr(スマートポインタの解説サイトを参考に作成) にした場合はきちんとデストラクタが呼ばれました。 コンパイラはBorland C++ Compiler 5.82 なのですが、これのauto_ptrがポンコツなのかも…
769 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:58:41 ] memory ヘッダの中を読んでみたら?
770 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:01:09 ] とりあえず gcc だと呼ばれる。
771 名前:765 mailto:sage [2008/02/16(土) 13:12:49 ] う〜ん、中身見てみましたがおかしいと思えるところは見つからず… auto_ptrのソースをちょこっと改造して試したところauto_ptrのデストラクタ自体が呼ばれてないようでした。 ただ、gccだと正常に呼ばれるとのことなのでBCCが悪いということで解決します。 どうも、ありがとうございました。
772 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:16:48 ] BCC の「どこが」悪いかちゃんと調べないと、 他の所でも沢山困る所があるかもしれないぜ。
773 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:19:46 ] とりあえず俺がチェックに使ったコード。 どう表示される? #include <iostream> #include <memory> class Test { public: Test(int n) : n(n) { } ~Test() { std::cout << "~Test(" << n << ")" << std::endl; } static Test* New() { Test test1(1); std::auto_ptr<Test> test2(new Test(2)); throw 1; return NULL; } private: int n; }; int main() { try { Test* test = Test::New(); test = test; } catch(int n) { std::cout << "catch" << std::endl; } return 0; }
774 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:26:09 ] >>773 BCCで試したところ、以下のように表示されました。 やはりtest2が削除されないようです。 ~Test(1) catch >>772 確かに…引き続き調査はしてみます。
775 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:27:49 ] memory をいじってコンストラクタで文字列表示するようにして、 それが表示されるかチェックしてみれ。
776 名前:デフォルトの名無しさん [2008/02/16(土) 13:56:28 ] HTMLファイルの構文を解析して、UTF8形式をS-JIS形式に変換するソースありますか
777 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:00:52 ] >>776 あるけどおまえにはそれすら無意味
778 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:28:58 ] >>752 staticな変数の生存期間はそのプログラムが起動されてから終了されるまで。 絶対に外部から参照される恐れが無い場合でもなければ、使い回しはできない。 例えば、strtok()やlocaltime()は内部のstaticな領域を返すように実装されていることが多い。 従って、その関数を呼び出した先で参照する可能性があるからコンパイラはこれを取り除くことができない。
779 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 15:07:48 ] > 絶対に外部から参照される恐れが無い場合でもなければ そのときの話をしてるんだが? アドレス取られたら削除できないのはあたりまえ。 また、絶対に外部から参照されないケースなんてほとんどないので、 大概の実装ではそんな最適化をしていないと思う。 問題にしているのは、規格としてそう言うことをしていいかどうか だよ。
780 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 15:23:33 ] >>779 規格を云々したいのなら折角そういうスレがあるんだからそちらへどうぞ。
781 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 15:25:24 ] 異なるオブジェクトは異なるアドレスを持たないという規定がなかったかな? 仮にあったとしても、779の状況では、 プログラム上から異なるアドレスであることを確かめるすべはないと思うけど。
782 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:08:56 ] とりあえず、同じ内容の文字列リテラルが複数箇所に書かれた場合、 それらは同じアドレスに置いても構わない。 また、"abc" というのと "bc" というのがあった場合、 "bc" のアドレスが "abc" + 1 であっても構わない。
783 名前:デフォルトの名無しさん [2008/02/16(土) 18:00:20 ] struct f_point{ float x, y; }; f_point square[4]; // 正方形の頂点が入る for(float angle=0;angle<PI*2;angle+=PI/16){ ... } 構造体squareに正方形の頂点4点の平面座標が入るとして、 その正方形の中心を軸に回転させるには forの中でどういう風に書けばよいでしょうか?
784 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:08:56 ] そういう扱い方するんだったら、 正方形を中心と、どれか1つの頂点の角度とで扱えばいいんじゃね?
785 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:13:27 ] >>783 宿題スレでもいけばいいんじゃね?解答もらえるよ x, yをx + y iの複素数とみなして cosθ + i sinθを掛けた値の実部と虚部を取る 計算を行うようにするとか x * cosθ-y * sinθ, x * sinθ+y * cosθ になるんじゃなかったかな多分
786 名前:デフォルトの名無しさん [2008/02/16(土) 18:15:37 ] 中心px,py 半径r 角度θ x度回転するには、σ(n) = θ + (x+90n) *π/360 px + r cosσ(n) , py r sinσ(n)に変換する
787 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:17:45 ] ループ変数に float 使うなよ・・・。 誤差で境界条件が重い通りにならないかもしれないんだから。
788 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:19:30 ] ×構造体square ○構造体f_pointの配列square つ[アフィン変換]
789 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:22:09 ] (原点ずらす移動の変換行列) × (回転行列) × (原点戻す移動の変換行列) をかければいいんだろ
790 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:27:16 ] 境界条件っつーと、微分方程式の特種解を決定する物を思い浮かべてしまう なんかビミョーな違和感
791 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:38:47 ] // オレ言語ならこれで逝けるぜw f_point center = average(square, square + 4); for (int angle = 0; angle <= 360; ++angle) { for (int ic = 0; ic < 4; ++ic) { print ([square[ic].x square[ic].y] - [center.x center.y]) * [cos(angle * rad) sin(angle * rad); -sin(angle * rad) cos(angle * rad)] + [center.x center.y]; } } // 要は、正方形の中心が原点になるように移動して、回転してから再び移動(≒>789)
792 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:43:04 ] >>785 ほんとごめんなさい、よく読んでませんでした 原点中心回転してました
793 名前:デフォルトの名無しさん [2008/02/16(土) 19:51:23 ] 文字列で入力された char a ; を、関数の中で数値に変換して int a ; にしたいんだ 同じ変数名aなんだけど char → int ってできますか?(´`)
794 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:55:18 ] スクリプト言語を使った方が幸せになれそうな予感
795 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:00:53 ] >>793 それだと1文字だろうし最初からintで受け取ればいい
796 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:01:01 ] >>793 文字とか文字列を数値にしたいとかじゃなくて char型変数を名前そのままにint型変数に変えたいんだな?無理です
797 名前:783 mailto:sage [2008/02/16(土) 20:04:07 ] >>784-792 ありがとうございます。無事できました。 float fCenterX = ( x1 + x2 ) / 2; float fCenterY = ( y1 + y2 ) / 2; float fR = ( float )hypot( fCenterX - x1, fCenterY - y1 ); float fX[] = { x1, x2, x1, x2 }; float fY[] = { y1, y1, y2, y2 }; float fA_[] = { 7, 5, 1, 3 }; for( int i = 0; i < 4; i++ ){ fX[ i ] = fCenterX - fR * cos( fAngle + D3DX_PI / 4 * fA_[ i ] ); fY[ i ] = fCenterY + fR * sin( fAngle + D3DX_PI / 4 * fA_[ i ] ); }
798 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:18:21 ] VisualStudio2008買いました。 重くなるかな?と思ったら、逆に軽くなりましたねw やっぱVistaとVS2005との相性が悪かったんでしょうか。 感激です。
799 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:22:36 ] はぁ?相性だぁ?
800 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 21:01:00 ] >>798 単純に2005より最適化されて軽くなっただけ
801 名前:デフォルトの名無しさん [2008/02/16(土) 22:39:14 ] C++クラスのstaticについて質問です。 親クラスに作ったstatic変数は、 全子クラスで共有するのでしょうか? それとも、各子クラスに一つずつ、 オーバーライドした同名のstatic変数ができるのでしょうか? それとも、static変数は継承できず、 各子クラスで同名のstatic変数を宣言しなければいけないのでしょうか?
802 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:51:28 ] 実験すればいい。 その結果の通りだ。
803 名前:801 mailto:sage [2008/02/16(土) 22:53:37 ] 確かに。。。 めんどくさくて質問してしまいました。すいません。 試してみます。
804 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:54:13 ] >>801 その中では全子クラスに共有というのが一番近いが、 正確には親クラスにしか存在しない。 ただし、protectedやpublicなら子クラスからでもアクセスできる。
805 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:56:06 ] 実験してこうなったけど、これって規格通りなのですか? という質問なら良し。
806 名前:デフォルトの名無しさん [2008/02/16(土) 22:58:58 ] >>795 >>796 ありがとうございました!!
807 名前:801 mailto:sage [2008/02/16(土) 23:02:26 ] >>803 ありがとうございます。 具体的に何をやりたかったかというと、 各子クラスのstatic変数にアクセスするstatic関数を、 親クラスに作りたかったのです。 static変数は各子クラス別々のものを使うけど、 それに対して行う処理は全子クラスで共通だったので。
808 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:05:56 ] 何か想像付かない処理だ。 本当にその実装方法しか無いんけ? static 変数は基本的には再利用性を阻害する癌のような物だから、 ないならないで済むのが一番いいのだが。 まあ、使い勝手と天秤にかけたら static 変数に軍配が上がることもあるけど。
809 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:19:34 ] CRTPと言って、親をクラステンプレートにするという手がある。ATLがよく使っている。 template<typename T> class Base { //T::Hogeを使う。 }; class Derived : public Base<Derived> { public: static const int Hoge = 10; };
810 名前:801 mailto:sage [2008/02/16(土) 23:22:31 ] >>808 説明しづらいのですが、 シューティングゲームで、敵ユニットを表すクラスを作っています。 まず親クラスUnitがあって、敵の種類ごとにUnitを継承したクラスを作っています。 敵一匹がUnitのインスタンスになるのですが、 ユニットに使う画像はインスタンスごとに持っている必要は無く、 ユニットの種類ごとにあればいいので、Unit各子クラスのstatic変数にしてます。 だけど、その画像に対して行う処理は、 敵の種類に関わらず全クラス共通なので、親クラスのUnitに作りたい。 そんな感じです。 C++も、ゲーム作るのも初めてなので、 もっといい実装方法案があったら、教えてもらえると嬉しいです。
811 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:25:32 ] >>810 とりあえず一旦動くところまで組み上げてしまうんだ どんなにソースコードが汚くなろうとも その後で、こうしているんですが もっと良い方法はありませんか? と質問するヨロシ
812 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:31:23 ] それなら static 変数でもいいかもしんないけど、 画像が要らなくなった時に破棄したくなったとき少し面倒かもね。 俺なら敵ユニット作成クラスと画像管理クラスを作るかな。 でも、とりあえずそれで組んでみてもいいんじゃね。
813 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:31:50 ] お聞きしたいのですが 参考書に array[index]の結果は*((array)+(index))と同じなので char ch = p[3]; と char ch = 3[p]; (pはポインタ) は、同じ処理だと書いてあったのですが、データ型がintの場合は3が12バイト分になってdoubleの場合は3が24バイト分になるはずなので 一概に「3+pに格納されてるアドレスの数値」って言えない気がしたのですが何か考え方が間違っているのでしょうか?
814 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:33:59 ] *(p+3) と *(3+p) で結果が違うわけなかろう
815 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:35:29 ] >>813 ポインタとアドレスは違う(似ているからややこしいが) char a[2]; double b[2]; printf("%p %p\n", &a[0], &a[1]); printf("%p %p\n", &b[0], &b[1]);
816 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:40:10 ] 例えば p の示すアドレスが 0xb1832100 の時、 p が char* なら p + 3 は 0xb1832103 に、 p が int* (int は4バイトとする)なら p + 3 は 0xb183210c に、 p が double* (double は8バイトとする)なら p + 3 は 0xb1832118 になる。 だから、一概にそう言える。
817 名前:801 mailto:sage [2008/02/16(土) 23:41:36 ] >>809 ありがとうございます。 テンプレートというのは知りませんでしたが、使えそうな気がします。 >>811 確かにそうですね。 後から実装を作り替えるのは手間ですが、 実際動くと、モチベーション上がりますよね。 >>812 画像破棄用の全画像リストは、ユニットとは別に作ってます。 ユニットは敵の種類ごとに画像をロードすると同時に、 画像マスターリストにロードした画像を登録して、一括で破棄してます。
818 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:45:31 ] >>817 なるほど。 あと、ある敵ユニットから派生して新しい敵を作りたい時に困るかもね。 そういうことがあるかどうか、だが。 画像オブジェクトへの参照のようなもの、 あるいは画像リストのインデックスのようなものを保持させるなら、 ユニットごとにそういう情報を持っていたのでも 大した容量圧迫にはならないと思う。
819 名前:813 mailto:sage [2008/02/16(土) 23:49:56 ] そーか、ポインタ=アドレス みたいに考えてしまっていました。 腑に落ちました。ありがとうございましたm(_ _)m
820 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:00:03 ] >>812 static変数の初期化は各子Unitじゃなくて、別の何か(親Unit?)がしてるの?もしそうなら 設計ミスだと思うよ。 それじゃstatic変数をグローバル変数として使ってるのとかわりがない。 static変数の初期化は子Unitが行うべき。 ところで >各子クラスのstatic変数にアクセスするstatic関数を、 これがイメージできないんだけど、具体的に何をする関数を作りたかったの? parentStaticFunction( childStaticImage ); みたいな感じで子Unitが呼び出しちゃダメなの?
821 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:03:45 ] 画像管理クラスに対する処理にはできないものなのかな。 あるいは仮想関数にするか。
822 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:13:42 ] WIN32 APIのSetROP2と同じ様な機能を持つ、CarbonAPIをご存じの方いませんか? 開発環境:Winは.net2002 + SDK, MacはCordWarrier pro 5 + Carbonです。
823 名前:822 mailto:sage [2008/02/17(日) 00:15:40 ] 使用言語はCです。
824 名前:801 mailto:sage [2008/02/17(日) 00:18:43 ] >>818 ユニットクラスが持ってるのは画像のポインタなので、容量はたいしたことないと思いますが、 大量に敵が出るので、オブジェクトごとにそれを作る負荷がどんなもんか想像つかなくて、 なるべく共有できるものは共有しようと思いました。 >>820 初期化はちゃんと各子Unitでやってます。 >parentStaticFunction( childStaticImage ); これはできます。 今までJavaしかやったことなくて、決まりきった引数を指定するのが嫌だったのです。 神経質ですいません。 でも、割り切ってこれが一番現実的でいいかもしれませんね。 >>821 >画像管理クラスに対する処理 ありがとうございます。 難しそうですが、それは一考の価値があるかも。
825 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:23:25 ] 敵の大量具合によるんじゃないか? 1億体出るなら馬鹿にできないし
826 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:24:10 ] ごめん、JavaこそparentStaticFunction(childStaticImage); のようなことをするしかない気がするんだけど。
827 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:26:03 ] ポインタなんて大抵4バイトだし、 敵5000体出した所でたった20キロバイト。 これ以上敵を出そうとしても処理落ちひどくて無理だでよ(5000体でもキツいだろう)。 誤差の範囲だ。
828 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 00:26:55 ] >>822 QiuckDrawのPenModeかなぁ。 ttp://developer.apple.com/DOCUMENTATION/mac/QuickDraw/QuickDraw-59.html ttp://developer.apple.com/DOCUMENTATION/mac/QuickDraw/QuickDraw-75.html
829 名前:801 mailto:sage [2008/02/17(日) 00:29:38 ] >>825 >1億体 出ませんw 最大でも1500くらい。 >>826 そういえばJavaでstatic変数をオーバーライドなんてやったことなかったですw Javaに比べて、C++とWin32APIは引数が多くて嫌だなと、なんとなく思ってただけです。 すげー悩んで試行錯誤しながら、今の形になってきたんですが、 要件を聞いただけで、ぱっと思いつくなってみんな凄いですね。 破棄のための画像管理クラスなんて最初全然考えてなくて、後から作りました。
830 名前:822 mailto:sage [2008/02/17(日) 00:58:39 ] >>828 PenModeの8つのモードすべてで試したのですが駄目でした。私もPenModeだと思ったんですが。。。 SetROP2のように前景モードで動作するのではなく、GrafPort自体に描画しているようです。 Carbonを使い始めて2ヶ月程度なので、間違いがあったらごめんなさい。
831 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:47:40 ] >>830 んー。前景と背景の合成方法を設定するAPIだから、やってることは同じだと思うけどね。 PenModeは現在のGrafPortに対して作用するんで、SetPortPenModeでポートを指定したらどうかな。 もうやってるかもしれないけど。 俺はCocoaな人なので、あんまり力になれなくてすまん。新・mac板の方が詳しい人いるかもね。
832 名前:822 mailto:sage [2008/02/17(日) 12:07:03 ] >>831 書いてなかったけど、ラバー バンディングを実行したくて行き詰まってしまいました。 マウスをドラッグしている間、直前に描かれた線を上書きで消して新しいPointに対する 線を描くという動作なんですが、最後にInvalWindowRectするとエンティティ自体は 正常に描かれます。エンティティ自体を移動させても余計に描画された線は消えます。 長くなって済みません。Macの開発環境がまだ自宅にないので明日会社でSetPortPenMode を適用してみます。ありがとうございました。
833 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:19:09 ] 1999/12/31 23:59:59 2008/02/17 11:53:59 みたいな日付をint型もしくはunsigned int型にしたいのですがどうすればいいのでしょうか? 秒に変換する事も考えましたが2008*365*24*60*60だとintに収まり切りません。 そのまま文字列で保存すればいいかもしれませんが、 この値をstlのmapのキーにしてソート等を行いたいので文字列だと遅そうなのでint型にしたいです。 スレ違いかもしれませんが何か良い方法があれば教えてください。 お願いします。
834 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:27:22 ] もろ環境依存だけど、__int64とか使えればそのまま入れられるんじゃないかな
835 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:34:17 ] 区切り文字をあり得ない数字の連続に置き換えるとか
836 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:34:32 ] >>833 年だけ別にしたら? struct Date
837 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:35:41 ] すまん送信ミス。 struct Date { unsigned int year; unsigned int sec; }; みたいに。
838 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:39:52 ] >>837 それをそのまま使おうとしてmapで使えないと質問しにくるとみた
839 名前:833 mailto:sage [2008/02/17(日) 12:53:46 ] みなさんレスありがとうございます。 >>834 自分の環境では__int64使えるみたいだったけど、他のPCで実行したらどうなるか分からないので今回は辞めておきます。 >>835 えっと、どういう意味ですか? >>836-838 なるほど。そういう手もありましたね。 つまり、比較演算のオペレーターを自作するって事ですよね? ちょっと、その方法でやってみます。
840 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 12:56:41 ] 今64ビット化が進んでいるtime_tはどう?
841 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:05:02 ] 閏秒とか考慮しなくていいならそれでいいか 暦法の微妙な問題に足突っ込みたくなければ全部秒で表した方が無難 しかし使えるならboost::gregorian使っとくのが楽ではある
842 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:06:27 ] >>833 年が1999年以降しかなくて、2099年までしか使わないのであれば unsigned intでも収まりそうな気がする
843 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:10:27 ] キーワード: 通算秒 time_t
844 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:21:04 ] て言うか、「文字列だと遅そう」って思ってるだけじゃないのか? まずはこれで実装してみて、ほんとにそこがネックになってるなら いろいろ工夫すればいいと思う。
845 名前:833 mailto:sage [2008/02/17(日) 13:55:31 ] みなさんいろいろなアドバイスありがとうございました。 キーを構造体にするという>>836-837 さんのやり方で出来たので今回はこれでいこうと思います。 >>840 ,843 time_tと言う変数は知りませんでした。今度調べてみようと思います。 >>841 閏秒の問題は考えてませんでした。 そこまでの制度の秒を管理する訳じゃないので今回はこれで・・。 boost::gregorianと言うのも知らなかったので調べておきます。 >>842 確かに年を3桁にすれば入りそうですね。 そんなに広い範囲の年を扱う訳じゃないのでそれで良いかもしれませんがなんかなw >>844 一応、キーをUINT, string, struct{UINT, UINT}の3パターンで挿入の時間を計ってみた所、 UINT > struct{UINT, UINT} > stringの順で速かったです。 Cは文字の扱いにあまり優れていないと聞いたことがあるのでそう思ってました。すいません。 とりあえず、これで解決とさせて頂きます。ありがとうございました。
846 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:05:06 ] time_tは型だ
847 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:08:39 ] time_tは__int64をtypedefしただけだったりな 環境にもよるが
848 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:13:50 ] 標準かどうかが大きな違い。
849 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:20:16 ] longだったりする可能性があることを考えたら、 素直に__int64使ったほうがマシだと思うけど
850 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:21:27 ] せめてlong longがいいな。
851 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:26:08 ] 案外void*だよ
852 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:37:03 ] >>845 1970年の1月1日とかからカウント始めれば、精度が秒くらいならunsignedな32bitで十分収まる。
853 名前:デフォルトの名無しさん [2008/02/17(日) 14:42:10 ] googleでかなり調べたのですが、RC4が うまくコンパイルがとおらないので、教えてください。 fedora core1で、コマンドラインからc++でコンパイルしてます。 --------------------- #include <stdio.h> #include <openssl/rc4.h> int main(){ RC4_KEY key1; const char *keystring = "HOGEHOGE"; RC4_set_key(&key1, 4, (unsigned char *)keystring); return 0; } --------------------- コンパイルすると下のようになります。 ---------- /tmp/ccuOdmEl.o(.text+0x30): In function `main': : undefined reference to `RC4_set_key' collect2: ld はステータス 1 で終了しました ------------- 未定義の関数を用いているようなエラーですが、 rc4.hをインクルードしているのですが、 どこがいけないのでしょうか?
854 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:43:57 ] どうやってコンパイルしたの?
855 名前:デフォルトの名無しさん [2008/02/17(日) 14:48:34 ] >>854 コマンドラインから %c++ main.cpp としました。 すると、上記のエラーが表示されます。
856 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:51:51 ] ライブラリリンクしようよ(´・ω・`)
857 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:52:16 ] WindowsのVARIANT型だとdoubleじゃなかったかな 普通は専用のAPIで触ることになるが、 1989/12/30からの日数(1日=1.0で、1秒が1/86400)という単純な仕様 だったと思うんで、自分で計算するのも別に難しくは無いはず 精度(有効範囲)は流石に2038年でオーバーフローする32bitのtime_tよりは ずっとマシ
858 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:52:30 ] >>845 time_tなら標準関数の支援を受けられるし、説明も楽だな。
859 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:53:35 ] >>857 今時、time_tは64ビットですが。
860 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:55:30 ] >>859 そりゃ環境による、でしょ ま、言い方が悪かったか。「time_tが32bitだ」と言ってるんじゃなくて、 「time_tが32bitであるような環境では〜」と読んで欲しい。
861 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:57:43 ] たとえばMSVCでは、6までは32bit 未だに現役で使われてもいるコンパイラなので、注意な
862 名前:デフォルトの名無しさん [2008/02/17(日) 14:59:15 ] >>856 すみません、そのライブラリリンクとは どのようにやるのか教えていただきたく。。。
863 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:04:51 ] いただきたく。。。なんなんだ? 。。。とかね、もう質問の仕方なんて義務教育中に学べと
864 名前:デフォルトの名無しさん [2008/02/17(日) 15:05:16 ] VCで プログラムからキーを押すプログラム作りたいのですが mouse_event みたいな関数教えていただけないでしょうか?
865 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:07:03 ] それだけじゃいまいちはっきりしないがgetch()とか
866 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:09:08 ] すみません、質問の仕方がわるかったです。 プログラムからキーボードの'A'ボタンを押したいのです。 どうすればよろしいでしょうか。
867 名前:デフォルトの名無しさん [2008/02/17(日) 15:15:23 ] >>863 義務教育での勉強不足で失礼いたしました。 今後は、質問の仕方を改めますので、 ご教示のほどよろしくお願いいたします。
868 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:18:05 ] >862 RC4を使ったことがないのでどのファイルをリンクすべきなのか俺にはわからない。 一般に、よほどのことが無い限り、コンパイルするときは関数の実体が入ってるファイルをコンパイラに教えてあげないと コンパイラが迷子になってしまう。 /usr/lib/libRSAglue.a /usr/lib/libcrypto.a /usr/lib/libssl.a さらっとぐぐったかんじだとこのへんのどれかじゃないかとは思うけど。 >866 やっぱりわかんない。 関数に引数として'A'をあげてやればいいだけなのでわ?と思ってしまう。
869 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:19:40 ] >>864 mouse_eventときたらkeybd_eventだろ
870 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:20:28 ] >>865 getch('A')だと、Aボタンが押されたことを感知する命令ですよね。 putch('A')みたいな命令があればと思ってお聞きしたのですがm(_ _)m
871 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:21:17 ] >>869 keybd_eventですか、 使い方をググってみますね
872 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:28:41 ] >>859 Windows の VARIANT 型とか言ってる奴は、どうせ Excel ぐらいしか 触れないんだから、スルー推奨。 >>862 目立関係者か? 「いただきたく」なんてローカル用語使うなよ。
873 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:31:58 ] >>869 ご教授感謝です、その方法でドンピシャであります!
874 名前:デフォルトの名無しさん [2008/02/17(日) 15:51:29 ] >>868 /usr/lib/libssl.a で無事動きました。 ありがとうございました。
875 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:44:00 ] >866 keybd_event
876 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 17:46:00 ] 更新し忘れ。 >872 どうでもいいが、目立関係ないうちの会社でもこの用法の「いただきたく」はたまに使われてる。
877 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 18:26:26 ] 教えて頂きたく存じます だろ。
878 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:16:26 ] >教えていただきたく そもそも話題になってる意味が分からんのだが。
879 名前:デフォルトの名無しさん [2008/02/17(日) 22:26:04 ] x86_64環境でiccでc++のソースをコンパイルできません。 > icpc ./exercise.4.1.cpp ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../libstdc++.so when searching for -lstdc++ ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../libstdc++.a when searching for -lstdc++ ld: cannot find -lstdc++ これはどうすればよいですか? googleしてみたけど、似たような人がみつけられませんでした。 どうかお願いします。
880 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:30:05 ] 標準ライブラリが見つからないというエラーに見えるが
881 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 22:33:52 ] >>879 iccのインストール先のbinディレクトリ内にある、環境設定用のスクリプトを動かしてみたら?
882 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:33:06 ] 参照を戻り値にする関数 (例えば int &sample(); ) って、呼び出す時 int hoge = sample(); って呼び出しますよね。 (ポインタを返す関数は呼び出すときに * を使うけど参照を返す関数は & を使わない。) ってことは int &sample(); が定義されてる時は int sample(); は同一モジュール内で定義できないってことなんでしょうか。 呼び出すときの名前が同じですよね。 一応自分で試したらエラーが出たのでやはり不可ってことなのだと思うのですが合ってるでしょうか?
883 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:36:09 ] 戻り値の型のみが異なる関数は2つ以上同一スコープ内に作る事が出来ない。 引数に違いが無いとオーバーロードはできない。
884 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:46:15 ] たとえばC言語で昔よく使ったprintfやscanfは戻り値はint型だ。void型ではない。 けど、戻り値を使っていないプログラムを見たことあるよな? 関数の戻り値を必ず使う必要はないわけだ。 sample(); こういう呼び出しがあった場合、どちらを使えばいい? コンパイラには判断しようがないため規格上できないようになっている。
885 名前:884 mailto:sage [2008/02/17(日) 23:52:55 ] >>883 さん レスありがとうございます。 あれ、そもそも int sample(); と int &sample(); は、戻り値の型が同じではないんですか? どっちもint型ですよね? &sample(); そのものが参照で、その参照が指しているアドレスの値をint型のhogeに戻り値として返す、ということだと思ってたのですが、違うんでしょうか?? >>884 さん なるほど。 int hoge = sample(); と int hoge = &sample(); みたいにして、使い分けはできんのかなと思ったのです。 int hoge = &sample(); とするとエラーが出るし、やっぱりできないということなんですね。 ありがとうございましたm(_ _)m
886 名前:↑884 mailto:sage [2008/02/17(日) 23:54:30 ] 884じゃなくて882でした。
887 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:55:40 ] >>885 違う。 int & sample()は、「intの参照型」を返す関数だ。
888 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 23:57:32 ] どこかに C++ 標準ライブラリの 完全なリファレンスマニュアルってないですか? 検索してみたのですか、ほとんどが一部しか載ってなくて… ソースか書籍しか無いのでしょうか…?
889 名前:882 mailto:sage [2008/02/18(月) 00:02:07 ] >>887 さん レスありがとうございます む それなら int &hoge = sample(); みたいにhogeの前に & が必要な気がするのですが int hoge = sample(); でもエラーにならないのはなんでなんでしょう?(sample(); は参照を返す関数だとして) int hoge = sample(); だとhogeはint型の参照じゃなくて普通のint型として定義されてますよね。
890 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:09:12 ] int &x; があったときに int y = x; ってできるのと一緒
891 名前:882 mailto:sage [2008/02/18(月) 00:19:53 ] >>890 さん レスありがとうございます。 なるほど、てことは &sample() { ... } int hoge = sample(); とあったとき、hogeもsample()そのものも、どっちとも参照型ってことでいいんでしょうか?
892 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:22:02 ] int hoge = だったら、hogeは参照じゃないだろう sample() の戻り値が参照してる先の値をコピーしてるんだよ
893 名前:882 mailto:sage [2008/02/18(月) 00:22:24 ] &sample() → int &sample() ですね...
894 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:24:04 ] 横から質問させてください。 >>890 は(暗黙の)型変換の一つであり、 T&からTへの型変換はdereferenceである と考えて正しいですか?
895 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:29:37 ] >>894 型変換じゃないと思うよ。ただの dereference というか。
896 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:30:20 ] >>888 C++ referenceでググっても軽くこんなに見付かる。 www.cppreference.com/ www.cplusplus.com/reference/ msdn2.microsoft.com/en-us/library/cscc687y.aspx
897 名前:879 [2008/02/18(月) 00:31:47 ] >>880-881 ありがとうございます。環境設定用のスクリプトは呼び出してるんですが、、、 どうも変なところにstdc++を探しにいっているような、、 どこに探しに行っているかをしらべるコマンドってなかったでしたっけ?
898 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:33:28 ] >>888 完全なっていうなら JIS の閲覧用クソ重いやつか、 ISO のドラフトがいいかもね。
899 名前:882 mailto:sage [2008/02/18(月) 00:38:22 ] >>892 さん レスありがとうございます。 うーむ int &sample() { ... } int hoge = sample(); hoge = 10; とやるとエラーが出ずに普通にコンパイル出来ました。 hogeが参照だったら hoge = 10 みたいに再定義できないと思うので、 やっぱりこの場合hogeは参照じゃない・・?
900 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 00:42:17 ] >>899 hogeは参照ではない。分解して書けば一目瞭然。 int& sample(); int hoge; // どう見てもint型です hoge = sample(); > hogeが参照だったら hoge = 10 みたいに再定義できないと思うので、 int hogehoge = 0; int& hoge = hogehoge; // hogeが参照だったら hoge = 10; // 参照先のhogehogeに10が代入される
901 名前:882 mailto:sage [2008/02/18(月) 01:01:31 ] >>900 さん ですよね。 ありがとうございましたm(_ _)m
902 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:16:17 ] visual studio 2008 express版を使っていたんだが error C2057: 定数式が必要です。 error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。 というエラーが出たのですがこれはどういったエラーなの?
903 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:20:58 ] エラーでた個所のソースを張り付けては? 後ろの方はint i[];とかしたときにでるかな?前はよく見るけど忘れた。
904 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:26:08 ] >>902 メタプログラミングでもやってんのか?
905 名前:902 mailto:sage [2008/02/18(月) 01:42:27 ] ARToolKit を使って連続MQOファイルを表示しようとしてます #define CAMERA_CONFIG_FILE "Data/WDM_camera_flipV.xml" // カメラ設定ファイル #define CAMERA_PARAM_FILE "Data/camera_para.dat" // カメラパラメータファイル #define PATT_FILE "Data/patt.sample1" // パターンファイル #define MQO_FILE "Data/output_0.mqo" // MQOファイル(座標軸) int MOTION_NUM = 60; int motion_total = 60; int MOTION_FPS= 30; MQO_OBJECT g_mqoModel[MOTION_NUM]; // メタセコファイルから読み込んだモデル
906 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:57:25 ] >>905 static const int MOTION_NUM = 60;
907 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:58:34 ] >896 上2つでは<utility>や<locale><stdexcepts>等の情報が見あたらなかったのですが MSDNのはかなり情報量多そうですね。しばらくMSDNを頼りにしてみます。 >898 JISに行ったら購入とかあったので有料?と思ったのですが 閲覧だけなら出来るみたいですね。 どうやら、保存は出来ないみたいですが。 C++ ISO Draft で調べたら幾つか見つかりました。 英語なのでちょっと大変そうですが、頑張ってみます。
908 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:59:00 ] MQO_OBJECTが正しく宣言されていないからだと思うが? その環境がわからんから俺にはこれ以上は答えられん・・・ってこれくらいのこと試してそうだけど・・・
909 名前:908 mailto:sage [2008/02/18(月) 01:59:38 ] はぅ、そっか・・・おれはずかしす・・・
910 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:36:27 ] 超初心者です char *a[]={"あ","か","さ","た","な"}; printf("%s",a[0]); こんな時、なぜ*が必要なのかいまいちピンときません。 どなたか教えてください…
911 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:43:14 ] >>910 aはポインタ配列だからです。
912 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:52:47 ] int a = 5; int a[] = {1, 2, 3, 4, 5}; char* a = "あ"; char* a[] = {"あ", "い", "う", "え", "お"};
913 名前:910 mailto:sage [2008/02/18(月) 10:06:32 ] こんがらがってきた(ヽ'A`) 文字列の扱い方はこんな感じでおかしくないでしょうか char a='N'; char a[]={'N','M'}; char a[]={"NM"}; char *a="NNNN"; char *a="あ"; char *a[]={"NNNN","MMMM"}; char *a[]={"あ","い"};
914 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 10:14:24 ] >>913 ああ、だいたいそれでいい。あとは char* じゃなくて char const* にしとけば完璧だ。
915 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 10:21:50 ] >>913 次は配列とリテラルの違いに苦しむが良い
916 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 10:43:58 ] const char*
917 名前:910 mailto:sage [2008/02/18(月) 10:44:53 ] みなさんありがとうございます。なんとなくわかった気がします 次はどうしてこうなるのか簡潔に説明できるように頑張ります…
918 名前:879 [2008/02/18(月) 10:48:57 ] すいません、誰かたすけて。。 x86-64のマシンでiccでC++のソースがコンパイルできません。 icc : l_cc_p_10.1.008 g++ : g++ (GCC) 4.1.2 20061115 (prerelease) (SUSE Linux) iccvars.shはsourceしてます。 icc samp.cのように、ただのCのソースならコンパイル+実行できます。 でもicpc samp.cppのように、C++のソースをコンパイルしようとすると、 ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../ libstdc++.so when searching for -lstdc++ となって、コンパイルできません。 ちなみに、-lstdc++は、 $ file /usr/lib64/libstdc++.so.6.0.8 /usr/lib64/libstdc++.so.6.0.8: ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), stripped ちゃんと存在してます。
919 名前:879 [2008/02/18(月) 10:56:31 ] すいません、自己解決したかも、です。 x86-64:~> /opt/intel/cce/10.1.008/bin/icc as/samp1.cpp => これはコンパイルでき、実行もできた。 x86-64:~> /opt/intel/cc/10.1.008/bin/icc as/samp1.cpp ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.1.2/32/../libstdc++.so when searching for -lstdc++ => これは上に書いたとおりコンパイルできない。 cceを使えばいいみたいです。 お騒がせしました。
920 名前:デフォルトの名無しさん [2008/02/18(月) 11:00:15 ] >>919 ???何故、一つ上のdirectoryに上がるのです??? 其の場所に"stdc"が置いて在るのですか?
921 名前:デフォルトの名無しさん [2008/02/18(月) 11:31:47 ] 単精度と倍精度でどの程度性能が違うのか、簡単なテストプログラムを書きたいと思っています (Programming Pearls の コラム6 練習問題) gcc -O0 で最適化をオフにして、何らかの計算をループさせて時間を計ろうと思うのですが、こういうのに手ごろな計算ってあるでしょうか?
922 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 11:37:42 ] >>921 単純な性能差を求めようとしても余り意味がない。 何故ならば、最適化なしの指定にすると恐らくはx86ではfpuを使うコードを出力するが、 それはfloatでもdoubleでも同じCPU命令を使うことになるから。
923 名前:879 [2008/02/18(月) 11:40:20 ] >>920 レスありがとうございます。 >???何故、一つ上のdirectoryに上がるのです??? というのは、libstdc++の場所のことですよね?自分も調べてみたのですが、結局その位置は、 /usr/lib64/libstdc++.so.6.0.8 になってて、これがlibstdc++のようです。 cceのディレクトリ以下のコンパイラだとリンクできて、cc以下のコンパイラだとリンクできない 理由は分かってないですが、。。
924 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 11:42:37 ] そりゃぁ、ccはx86-32でcceがx86-em64tだからだ。
925 名前:879 [2008/02/18(月) 12:01:30 ] >>924 ありがとうございます。 なるほど、そういうことですか。 でも、なんでx86-64環境にインストールしたのに、iccとやると、デフォルトで32ビットの バイナリを作ろうとするんですかね。自分は、 alias icc64="/opt/intel/cce/10.1.008/bin/icc" しときました。
926 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 12:05:45 ] >>925 cce配下のbinにあるスクリプトを使えばcceにPATHが通る。
927 名前:879 [2008/02/18(月) 12:22:03 ] >>926 以下のようにやると通りました。 source /opt/intel/cce/10.1.008/bin/iccvars.sh ありがとうです。
928 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:22:58 ] 文字列を初期化するにはどっちがいいのでしょうか? 1, ZeroMemory( str, sizeof(str) ) 2, memset( str, '\0', sizeof(str) )
929 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:24:25 ] 両方同じ
930 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:31:27 ] '\0'=0ってことなんですか?
931 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:32:53 ] >>928 >1, ZeroMemory( str, sizeof(str) ) 一部の環境にしか存在しないことを承知で使うのならこっちでもいいが、 そもそも文字列を初期化するのに0クリアはナンセンス。
932 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:33:01 ] 2なら環境をWindows以外に変えても修正しないで済む。
933 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:52:19 ] ZeroMemoryもマクロで結局memsetになる。
934 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:06:59 ] 文字列の初期化だったら、「*str = '\0';」でいいじゃない。
935 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 22:37:43 ] #include <new> class CBase { public: /** new */ void* operator new(std::size_t aSize) throw(std::bad_alloc); /** delete */ void operator delete(void* aMemory) throw(); /** placement new */ void* operator new(std::size_t aSize, void* aPtr) throw(); /** placement delete */ void operator delete(void* aMemory, void* aPtr) throw(); }; Effective C++にあった配置newを試そうと上のクラスを作ってみたのですが、 BCBでコンパイルすると下記のエラーが出てしまいます E2238 'CBase::operator delete(void *) throw()' の宣言が複数見つかった ボス助けて
936 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:02:54 ] >>935 visual c++ 2005では問題なくコンパイルできました。 bccがポンコツということで処理します。
937 名前:デフォルトの名無しさん [2008/02/18(月) 23:30:10 ] GetCurrentDirectory()は最大260文字くらいしか読み取れないね なんとかなりませんか?
938 名前:デフォルトの名無しさん [2008/02/18(月) 23:37:18 ] 937です 自己解決しました 途中まで(250字程度)は返してくれるのでそこまで 移動してからディレクトリを進めていって、たとえば適当なファイルを生成してそれを見つければよいです
939 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 00:01:14 ] GetCurrentDirectoryWでも260文字越えはだめ?
940 名前:デフォルトの名無しさん [2008/02/19(火) 00:11:17 ] GetCurrentDirectoryWでも250程度しか行きませんでした
941 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 00:15:38 ] オレ様のGetCurrentDirectory()にはそんなちゃちな制限はないぜ。
942 名前:デフォルトの名無しさん [2008/02/19(火) 00:34:58 ] 247文字までは取得できますが、それを越えると一つ上のディレクトリまでしか返さないようです
943 名前:デフォルトの名無しさん [2008/02/19(火) 00:36:52 ] だからたとえば50文字で返却されたとしてもそこがカレントディレクトリとは限りません 200文字のディレクトリ内かも知れない為
944 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 01:13:09 ] 時々ファイル名が長すぎてリネームできないファイルがありますが 私はいつもネットワーク共有状態にしてUNC名でリネームしてます
945 名前:デフォルトの名無しさん [2008/02/19(火) 01:28:08 ] 階層の深いフォルダをドライブに見せかける命令ってどうやるんでしょうか これが出来れば読めるところまで進めてくりかえせばいいのですが
946 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:13:51 ] Linux 2.6.18-6-686 #1 SMP Sun Feb 10 22:11:31 UTC 2008 i686 GNU/Linuxで wtmpの中身をみて遊んでて出た疑問です。 struct utmp u; sizeof(u)をしたら384が出力されたのですが/usr/include/bits/utmp.hを みてメンバー変数のサイズを合計したら382となりました。 下記のサンプルで出したのですがメンバー変数に見落としがあったのでしょうか? #include <stdio.h> #include <stdlib.h> #include <time.h> #include <utmp.h> main(){ struct utmp u; printf("size utmp %d \n", sizeof(u)); printf("size ut_type %d \n", sizeof(u.ut_type)); printf("size ut_pid %d \n", sizeof(u.ut_pid)); printf("size ut_line %d \n", sizeof(u.ut_line)); printf("size ut_id %d \n", sizeof(u.ut_id)); printf("size ut_user %d \n", sizeof(u.ut_user)); printf("size ut_host %d \n", sizeof(u.ut_host)); printf("size ut_exit %d \n", sizeof(u.ut_exit)); printf("size ut_session %d \n", sizeof(u.ut_session)); printf("size ut_tv %d \n", sizeof(u.ut_tv)); printf("size ut_addr_v6 %d \n", sizeof(u.ut_addr_v6)); printf("size __unused %d \n", sizeof(u.__unused)); }
947 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:15:24 ] どこかにパディング入ってんじゃね
948 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:21:17 ] >947 なるほど。wtmpはバイナリーデータなんですけどutmp.hの構造体のサイズ信じて バイト単位でデータにアクセスした場合ほしい値がもらえない場合があるわけですね。
949 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 03:32:44 ] offsetofでも使えばいいんじゃね
950 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 04:11:21 ] >949 なるほど、パディング入った位置はわかった。
951 名前:デフォルトの名無しさん [2008/02/19(火) 05:01:29 ] 質問です。 itpro.nikkeibp.co.jp/article/COLUMN/20061204/255878/ のプログラムがコンパイルできないのですが、 msg[i] += 'A' - 'a' の処理ってどうやればコンパイルできるようになるのでしょうか? というか、どんな処理型だったらコンパイルできるのでしょうか? gcc -std=c99では駄目でした。
952 名前:デフォルトの名無しさん [2008/02/19(火) 05:11:17 ] >>951 お前にはVB6がお似合い
953 名前:いいこと教えてやるヨ [2008/02/19(火) 05:19:15 ] いつもこのスレにお世話になってるんで、お前らに恩返ししてやるよ。 あのな、クラスの中で、大文字のTっつー名前のメンバ変数を定義すんなよ。 そのあと、クラス内でtemplate <class T>とかするとハマる。 おれはこんな時間までハマった。 じゃあな。
954 名前:デフォルトの名無しさん [2008/02/19(火) 05:26:02 ] いや、 msg[i] += 'A' - 'a' msg[i] -= 'A' - 'a' の処理が大文字と小文字をひっくり返す処理くらい 俺でも分かるよ。 でも、コンパイルできねーんだもん。
955 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 05:26:49 ] >953 申し訳ないけど笑ってしまった。
956 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 06:09:39 ] >>954 #include <string.h> とかか?
957 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 07:09:34 ] コロンなのがあかんのんやろ
958 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 07:15:33 ] >>951 (msg[i] -= 'A' - 'a') と括弧で括ればいい。 あるいは、C++処理系でコンパイルすればいい。
959 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 10:28:20 ] #include <iostream>やusing namespaceは.hに書くのがよいのでしょうか?それとも.cppに書くべきなのでしょうか?
960 名前:デフォルトの名無しさん [2008/02/19(火) 10:28:46 ] まさか、'A'がchar型だと思ってるバカはいないよな?
961 名前:デフォルトの名無しさん [2008/02/19(火) 10:55:47 ] >>959 それぞれのスタイルでしょ。でも、 using namespace を.hに書くのはやめとけ。というか、c++を使いつづけると、 そのうち自然に止めたくなると思う。
962 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 12:30:34 ] ソースファイル毎に名前空間分けてるWindows用某フレームワークは名前空間一つにまとめてくれといいたくなる。
963 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 14:08:56 ] 特定のクラスだけパディングして欲しくない 事があるんですが、何か手はあるでしょうか?
964 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 14:16:05 ] #pragma pack
965 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 14:40:34 ] >>964 おーあるのね。感謝!
966 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:35:49 ] ofstreamのmemcpyで落ちる場合があるんですが何が原因でしょうか?
967 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:03:21 ] ofstreamでmemcpy使うことなんてあったっけ? ここにソース書いてくれ。
968 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:09:37 ] じゃあofstreamじゃないのかもしれません。 CStringA str; str = wstrData; fout.write( str, DATA_SIZE ); この様なことをやっていて 何回も動かしていると落ちてしまうんですが マルチバイトとワイド文字の変換にCStringAを使ってるのでここかもしれません
969 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:17:52 ] 原因を予想してもらうより、まずどこで落ちるのか確定するにはどうすればいいかを聞いたほうがいい気が・・・ スタックのトレースも無さそうだな
970 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:33:57 ] >>968 DATA_SIZE
971 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 20:44:05 ] fout.write(str, str.GetLength()); じゃないの? あるいは fout << str;
972 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 23:53:25 ] プログラムの勉強に飽きたとき息抜きで何やる?
973 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 23:54:55 ] 一人で電機屋で1980円で買った麻雀ゲーやってる あと最近興味ないクラシックを聴いて10分で眠くなる特技が出来た
974 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:10:05 ] えーとごめんなさい。VC使って5年ぐらい経つんですが 未だに普通のウィンドウにコントロールを貼り付けるような リソースエディタ的なソレを知りません。 ダイアログなら直球なんですがウィンドウでそういうの出来ますか?
975 名前:974 mailto:sage [2008/02/20(水) 00:11:14 ] 使ってるのはVC6です。
976 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:11:23 ] 日本語が使えないんじゃ何年VC使っててもだめだろうね
977 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:13:42 ] こんくらいは分かるだろ。 とりあえず VC ではそういうのは知らない。
978 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:14:29 ] 普通のウィンドウにあんまりコントロールをはっつけるなってことじゃないのかな。 Windows 的には。
979 名前:デフォルトの名無しさん [2008/02/20(水) 00:15:28 ] >>974 初心者は、C#かBCBつかえよ 無理
980 名前:974 mailto:sage [2008/02/20(水) 00:21:42 ] >>976 んじゃ0年でもOK てゆかVC6のウィンドウエディタはリソースエディタしかないから それでやってたけど、ダイアログしか作れないのはおかしいだろ、 とか思いながらやってたんだけど、その疑問をはらしたくてな。 >>977-978 あれ?やっぱこれでOKなのか。 要するに「VC6に"ウィンドウ"エディタは無い」でOK?
981 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:22:26 ] てゆか
982 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:26:09 ] BCB にはありそうな気がする。
983 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:34:32 ] >>980 ダイアログをウィンドウに張ることはできますが。
984 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:51:48 ] ダイアログにウィンドウクラスを割り当ててしまえば、 もはやダイアログではないウィンドウができる。 でも俺は983のようにすることが多いけど。
985 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:54:52 ] アンマネージドでも.NETくらい楽にUI作れるようにならんかなー
986 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:38:22 ] ちなみにBCBでダイアログ作るとダイアログもどきな普通のウィンドウになる
987 名前:デフォルトの名無しさん [2008/02/20(水) 05:25:33 ] virtualデストラクタを持つ親クラスを継承して、子供クラスを作りました。 その子供クラスを、親クラスのポインタをつかって扱ってます。そのとき、 親クラスのポインタに対して、delete ptr;とやると、まず子供クラスの デストラクタが呼ばれた後で、親クラスのデストラクタが呼ばれるのですが、 これって正しい動きですか? 親クラスのデストラクタは呼ばれないと思ってた。
988 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 06:16:06 ] >>987 正しい。 親のが呼ばれなきゃ親のリソース開放できないじゃん。
989 名前:デフォルトの名無しさん [2008/02/20(水) 06:21:51 ] >>988 その通りですね。 ありがとうございました。
990 名前:デフォルトの名無しさん [2008/02/20(水) 11:16:24 ] vectorをnewを使って確保するというのは出来ますか? (vector<int>とか) 色々やってみたんですが、なぜかどうやってもコンパイル失敗してしまいます。 もしかして、できないのかな、と思った。
991 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:31:28 ] >>990 #include <vector> int main() { std::vector<int> *p = new std::vector<int>; delete p; }
992 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:46:47 ] >>990 なんでまたそんな希代なことしようと思ったのかが気になる。
993 名前:デフォルトの名無しさん [2008/02/20(水) 12:25:18 ] >>991-992 ありがとうございます。なぜそんなことをしようと思ったかというと、vectorを関数間でやりとり したかったからです。適当にクラスを準備して、その中にvectorを保持してましたが、単体でも newで出来るかなと思いました。
994 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:28:17 ] 次立てて埋めようとしたらたてらんねえ
995 名前:デフォルトの名無しさん [2008/02/20(水) 12:34:23 ] 立てたよ。
996 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:36:34 ] 【初心者歓迎】C/C++室 Ver.49【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1203478421/ >>995 乙
997 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:47:08 ] >>993 別にわざわざnewする必要なんか無いだろ。そのための参照渡しがあるんだから。
998 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:54:35 ] でも複数の場所にたらい回しにするときは、 boost::shared_ptr<std::vector<int> >(new std::vector<int>()); とかやる?
999 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:56:51 ] 梅て次いこう
1000 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:57:38 ] ほいほいほい
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。