1 名前:デフォルトの名無しさん [2008/02/28(木) 00:01:39 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.49【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1203478421/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
13 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:36:13 ] コンストラクタでインスタンスの生成が始まって 実際にメンバ関数や変数が使えるようになるタイミングというのは気にしなくて良いのでしょうか? あと、派生クラスの時には仮想関数はコンストラクタ内で使用しない方が良いというのは本当なんでしょうか?
14 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:43:24 ] >>13 >実際にメンバ関数や変数が使えるようになるタイミングというのは気にしなくて良いのでしょうか? どういうときに気にする必要があるの? >コンストラクタ内で仮想関数 ケースバイケースだが、派生クラスでオーバーライドされたものが呼ばれると思ってると痛い目に会う。
15 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:14:54 ] >>13 >あと、派生クラスの時には仮想関数はコンストラクタ内で使用しない方が良い >というのは本当なんでしょうか? C++のオブジェクトモデルの観点から言えば、 少しおおざっぱだが(厳密さは省く)、コンストラクタにはコンパイラ によってvptrが自クラスの仮想関数テーブルへのポインタにセットされる タイミングがあって、コンストラクタボディでは既にセットされてしまって いる。基底クラスのコンストラクタボディでは基底クラスの仮想関数テーブル が参照される。どう頑張ってもポリモルフィズムは起こらない。
16 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:39:19 ] もしも仮想関数が純粋仮想関数だった場合にはどうなるんだろ 基底クラスには存在しない関数を呼び出すことになるので コンパイルエラーになるのかな?
17 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:47:24 ] >>16 定義が無いとリンクエラーだろうな。
18 名前:16 mailto:sage [2008/02/28(木) 14:54:58 ] >>17 どうもです g++でテストしてみたよ エラーになった…コンパイルエラーっぽいけどリンカエラーなのかな 詳細は不明ですが、エラーになると。まあ当然ではありますが… >tes.cc: In constructor `A::A()': >tes.cc:12: error: abstract virtual `virtual void A::func()' called from constructor
19 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:01:24 ] >>18 認識合ってないかも。>>13 からの流れのだよね? class Widget { public: virtual void jyunsui() = 0; Widget(){ jyunsui(); } ~Widget(){} }; class Budget : public Widget { public: void jyunsui() {} }; Budget b; こういうことじゃない?
20 名前:16 mailto:sage [2008/02/28(木) 15:13:34 ] >>19 コンストラクタから仮想関数を呼び出すときに仮想関数テーブルにある 関数が呼び出されるという話を聞いて 仮想関数が純粋仮想の場合はどうかなと思った次第であります あまり深い意味はありません、すみません… テストしたコードは19さんのコードと同じです コンパイルすると >tes.cc: In constructor `Widget::Widget()': >tes.cc:8: error: abstract virtual `virtual void Widget::jyunsui()' called from constructor
21 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:23:31 ] >>20 へえ、コンパイルエラーなんだ。 Comeau C++ では警告は出たけどコンパイルできた。 VC++2008だとリンクエラーになったね。 定義すると警告無しでビルドできた。
22 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:30:55 ] 処理系に依存するのか。。
23 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 17:05:21 ] VC++2005で "1.wav"などローカルに保存された音声ファイルを再生したいのですが。 標準でそういった関数?はあるのでしょうか?
24 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 17:23:59 ] PlaySound()なんていう便利なAPIがあるとか本気で思ってるの!?
25 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 17:39:49 ] >>20 g++ 4.0 では警告出たけどコンパイルできたよ。 もちろんリンクはできないけど。 定義するとリンクも通る。
26 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 17:45:11 ] >>24 ありがと。
27 名前:デフォルトの名無しさん [2008/02/28(木) 18:45:23 ] すいませんお願いします。 passing `const cell' as `this' argument of `double cell::cell_input(double)' discards qualifiers というエラーが出ます。 問題の行は IT->first.cell_input( OUTPUT*(IT->second) ); でITは map<cell,double >::iterator IT; です。 やりたいことはclass cellのオブジェクトA内のpublic関数から 別のオブジェクトB内のpublic関数にアクセスすることです。
28 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:53:14 ] >>27 map<cell,double > のcellはconstで修飾されてる。 IT->first.cell_input・・・・ cell::cell_input(double);が非constメンバー関数なんじゃないの?
29 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 19:02:46 ] C++の質問です。 コンパイラはbccを使用しています。 別のcppファイルで定義した配列をexternしたいのですが、 "外部シンボルが未解決です"というリンクエラーがでます。 data.cpp const char namber[5] = { 1, 2, 3, 4, 5 }; show.cpp extern char namber[]; リンクエラーを解決する方法を教えて頂けないでしょうか? よろしくお願いします。
30 名前:デフォルトの名無しさん [2008/02/28(木) 19:05:53 ] >>28 ありがとうございます! 非constメンバー関数、で検索かけて調べてみます!
31 名前:27 [2008/02/28(木) 19:17:50 ] すいません。。 調べましたがmapに放り込んだ時点でconst cellになってしまうから もし非constメンバ関数からconstメンバ関数に変えられない場合 私がやりたいことは出来ないということでしょうか? cell_ouputは非constメンバ関数でありデータメンバを書き換えます。
32 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 19:23:26 ] >>31 残念ながらmapのキーはconstだからキーのオブジェクトは 変更できない。他の手段を考えたほうがいいかも。 とにかくcellはconstオブジェクトだから非constメンバー関数 は呼び出せない。
33 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 19:25:20 ] >>31 変更する部分をまとめてpimplにするとかはどうよ?
34 名前:27 [2008/02/28(木) 19:26:18 ] >>32 まいった。ありがとうございます。 無理やりmap<mutable cell,double >::iterator IT; とか書いてみたけど無理っぽかったです。 他の手段か・・重ねてありがとう。
35 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 19:29:49 ] >>34 mutable使うならメンバーに あまり好きではないけど
36 名前:27 [2008/02/28(木) 19:35:30 ] >>33 pimplちょっと調べてみたんですが難しくて・・覚えておきます、ありがとう。 >>35 メンバー関数の先頭にはmutable付けられなかったです。 変更されることになるデータメンバの先頭につけてみたけど変わらず・・。
37 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 19:40:31 ] >>36 mutableデータメンバはconstメンバ関数から変更できる
38 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 19:41:02 ] >>36 mutableを非staticなメンバーに指定すれば、constメンバー関数内で 変更できるはずだけど。
39 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 21:27:49 ] pair の vector コンテナじゃ駄目ですか><
40 名前:デフォルトの名無しさん [2008/02/28(木) 21:41:36 ] 前レス >944 すいません。前回ポインタの格納場所について質問したものですが お礼を言うのを忘れていました。 ありがとうございます。
41 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 22:08:50 ] >>34 キーがconstなのは、キーでソートされるからであって、 mapに格納したまま書き換えたら順序を守れなくなる。 一旦mapから削除して、書き換え後に再度insertすべきでは?
42 名前:sage [2008/02/28(木) 22:21:56 ] 質問します。たったこれだけのコードが動きません。 ポインタのポインタを使ってみたのですが。教えてくだされ。 #include <stdio.h> #include <string.h> const char* string; const char** address; char str[1024]; void inputadd(const char* stradd){ address=&stradd; } void inputstr(void){ char teststr[]="abcdefghijklmn"; strcpy(str,teststr); *address=str; } void main(void){ string=NULL; inputadd(string); inputstr(); printf(string); }
43 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 22:24:24 ] >>42 address=&stradd; ←これがダメ straddはinputadd内のローカル変数だ。 関数を抜けると無くなるので、addressはトンでもないところを指すことになる。
44 名前:29 mailto:sage [2008/02/28(木) 22:30:58 ] 自己解決しました(。。)゛ 分割コンパイルを行わないといけないのですね。 記述にばかり目を奪われておりましたが、 やっと問題点に気がつきました。 レスが無いのも納得がいきます。 それでは。
45 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 22:31:03 ] >>43 サンクス。ポインタは引数なら直でいけるという思い込みだったわ。 関数内で使っているものはポインタの値のコピーに過ぎないわけだな。 下みたいにして乗り切ったが正解でいいんだよな? void inputadd(const char** stradd){ address=stradd; }
46 名前:デフォルトの名無しさん [2008/02/28(木) 22:39:56 ] 初心者は、newやポインタを使わない方がいい STL使えばすべて片付く
47 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 22:43:40 ] 使わなければいつまで経っても初心者だ。 練習コードなんだから、なんでもやってみればいい。 >>45 OK
48 名前:デフォルトの名無しさん [2008/02/28(木) 23:03:04 ] 上級者もnewやポインタを使わない方がいい 使うのは、速度やサイズの気になる場面だけだ それまで気になるならアセンブラにする
49 名前:デフォルトの名無しさん [2008/02/28(木) 23:04:10 ] 極論するとC言語は使わない方がいい
50 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 00:19:17 ] 極論するとプログラミングなんかしない方がいい
51 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 00:47:12 ] 速度が気になるんだったら、newを使うのはいけないと思うんだ。 少なくとも考えなしに使うのは。
52 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 01:12:20 ] boost::Pool
53 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 01:27:58 ] >>51 実測もせずに new を避けるのも良くない。
54 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 03:16:43 ] 結局のところ重複はこっちでいいんかい?
55 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 06:28:30 ] >>53 は受け売りでしゃべっているだけですから気にしないでください。
56 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 10:16:31 ] newのなにがいけないのだろうか? 動的にオブジェクトの生成をしたらだめ?
57 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:02:47 ] 馬鹿?馬鹿なの?ねえ? あえてだめっていう理由があるとしたらオーバーヘッドだろうか、ログ読んでないからなんともいえないが
58 名前:27 [2008/02/29(金) 11:39:19 ] >>37 ,38,39,41 昨日は急用で落ちてしまいました27です。 >mutableを非staticなメンバーに指定すれば、constメンバー関数内で 変更できるはずだけど。 を実践したところコンパイル通りました! constとかややこしくて触らないようにしてたんですけど これからちょこっと勉強してみようと思います みなさんありがとうございました!!
59 名前:デフォルトの名無しさん [2008/02/29(金) 12:10:15 ] 基本的に動的確保は頻繁にやるべきではない 不安定になる
60 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:16:40 ] >>59 動的確保が悪いんじゃない。正しく扱わないプログラマが悪いんだ。 C++ なら、 new したらすぐ auto_ptr なりに突っ込んどくとか、 new [] したくなったら標準コンテナを使うとか、そういう正しい対処をしとけば ミスもほとんど防げる。 原因も把握せずに「不安定になる」とか言ってプログラムの手段を 制限するのは得策じゃないね。
61 名前:デフォルトの名無しさん [2008/02/29(金) 12:24:44 ] あらかじめ必要な領域を見積もって確保すべき for(n=0;n<100000;n++) str+="A"; などは解放確保を繰り返し良くない
62 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:29:33 ] reserve 使っておけばいいし
63 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 13:45:50 ] 本業はWEBアプリ屋なんですが、必要に迫られてActiveXの開発することになったC++ド素人です。 環境はVS2008、作ろうとしてるモノはMFC ActiveXです。 内部で文字列の暗号化処理(Blowfish)をしたいのですが、以下のソースを書いてコンパイルも 一応通ったものの、案の定うまく動きません。 LPSTR lpszPassword; //パスワード LPTSTR lpszInputStr;//暗号前文字列 //↑に値を適当にセットした上で↓ UCHAR digest[16]; MD5String(lpszPassword, digest); CBlowFish bf; bf.Initialize(digest, sizeof(digest)); unsigned char* outBuf = (unsigned char*)malloc(sizeof(lpszInputStr)); // エンコード bf.Encode((unsigned char*)lpszInputStr, outBuf, sizeof(lpszInputStr)); printf("%S", outBuf) よくわからなくて、ググりつつ適当に書いたソースなのでめちゃくちゃだと思います。 最終的には暗号化されたMD5ハッシュ値のような感じの文字列が出力されることを期待 していたのですが、バケバケな上入力値を変えても同じ値が返ってきますw 若干お手上げなので、皆さんのお知恵を拝借ください
64 名前:63 mailto:sage [2008/02/29(金) 13:49:43 ] ちなみに、BlowfishのソースはJim Congerさんが書いたのそのままです。 ↓ここから持ってきました。 www.schneier.com/blowfish-download.html
65 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 13:56:07 ] waveファイルを再生しようと思い、playsound()というAPIがあるよ、と教えて貰ったので 調べてみたのですが、 VC++2005 #include <mmsystem.h> // PlaySound()のため #pragma comment(lib,"winmm") #define FILENAME "Windows XP Startup.wav" LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg){ case WM_DESTROY: PostQuitMessage(0); return 0; case WM_LBUTTONDOWN: //再生 PlaySound(FILENAME,NULL,SND_FILENAME | SND_ASYNC | SND_LOOP); return 0; case WM_RBUTTONDOWN: //停止 PlaySound(NULL,NULL,0); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } このようなサンプルを見つけたのでコンパイルしてみたのですが、 error C2065: 'CALLBACK' : 定義されていない識別子です。 error C2065: 'DRIVERPROC' : 定義されていない識別子です。 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません なぜでしょうか?
66 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 13:57:41 ] >>65 #include <windows.h>
67 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:14:23 ] >>66 ありがとうございます。ですが、まだエラーが出てしまいます>< VC++2005 #include <windows.h> #include <mmsystem.h> // PlaySound()のため #pragma comment(lib,"winmm") #define FILENAME "Windows XP Startup.wav" LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg){ case WM_DESTROY: PostQuitMessage(0); return 0; case WM_LBUTTONDOWN: //再生 PlaySound(FILENAME,NULL,SND_FILENAME | SND_ASYNC | SND_LOOP); return 0; case WM_RBUTTONDOWN: //停止 PlaySound(NULL,NULL,0); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } error C2664: 'PlaySoundW' : 1 番目の引数を 'const char [23]' から 'LPCWSTR' に変換できません
68 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:17:28 ] #define FILENAME TEXT("Windows XP Startup.wav")
69 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:28:38 ] >>68 ありがとうございます。&重ね重ねすいません。まだ駄目みたいです。 error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。 fatal error LNK1120: 外部参照 1 が未解決です。
70 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:33:19 ] エラーメッセージでぐぐれ
71 名前:デフォルトの名無しさん [2008/02/29(金) 14:33:42 ] #include <windows.h> #include <mmsystem.h> #pragma comment(lib,"winmm.lib") main(){ PlaySound("C:\\WINDOWS\\system32\\oobe\\images\\clickerx.wav", NULL,SND_FILENAME | SND_ASYNC | SND_LOOP); Sleep(2000); PlaySound(NULL,NULL,0);}
72 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:35:57 ] >>69 main関数がないのに動くわけないだろう
73 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:38:11 ] >>70 int main を追加する方法や システム>サブシステムをwindowにする方法 エントリポイントにMainを追加してみたりは試した上で質問はしました。。><
74 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:49:57 ] VCだよね?mainをこう書いてみたら? int APIENTRY _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR lpCmd, int nCmd) { ... } あとWindowProcを呼ばせるにはちゃんとウィンドウを作って、 メッセージ処理しないとだめだと思うぞ。
75 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:59:41 ] >>72 書き終わった直後に気付いて書いてみたのですが根本的な原因は別にあるようでした。 >>74 そうみたいです!。ありがとうございます。 >>71 これに、文字セットをマルチバイトにしてみたところ。うまくいったので、これをベースにして、考えているプログラムにしてみたいと思います。 みなさんお付き合い頂いてありがとうございました。
76 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 15:06:52 ] >>63 >unsigned char* outBuf = (unsigned char*)malloc(sizeof(lpszInputStr)); 俺unix屋だから windows のこと詳しくないけど lpszInputStr は LPTSTR だからポインタだと思うよ。 上のコードのしていることは文字列の分ではなく ポインタのサイズの分をmallocで確保している。多分4バイトくらい。 まず文字列のバイト数を正しく求めることから始めないといけないんじゃないかな。 size_t size_of_in = sizeof(TCHAR) * (lstrlen(lpszInputStr)+1); // NUL 文字に+1文字分 あと outBuf には暗号化されたバイナリが入るだろうから printf("%S") ではうまく表示されないと思うよ。バイナリで扱わないと。 他にも暗号化単位やバイトオーダーなども問題になるかもしれないよ。
77 名前:63 mailto:sage [2008/02/29(金) 16:02:41 ] >>76 ども、ありがとうございます。 PHPやASPな人間なもんで、厳密な型変換やったことないんでさっぱりです。 バイナリを文字列(1-9,a-z.A-Z)に戻すのは、どうすればいいんでしょうか。
78 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 16:04:03 ] newってそんなに遅いの?
79 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 16:08:03 ] その程度のオーバーヘッドも看過できないような状況では十分に「遅い」。
80 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 16:21:26 ] まぁ、何を作ってるか、によるよね。 趣味でLisp方言作ってたときは、operator new()を工夫しただけで全体の動作が3割速くなったし。
81 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 16:33:06 ] >>79 boost::Poolのほうが断然速かった。
82 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 17:23:19 ] >>78 メモリマネージャ次第じゃね? Windowsに限ってもVCとBCBじゃnewでもメモリ確保の仕方違うし。
83 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 23:15:19 ] newを忌避しすぎるのも意味が無い。「まだ最適化するな」。
84 名前:デフォルトの名無しさん [2008/03/01(土) 01:01:15 ] 初期化方法おしえてください 全部通りません vector<int> x={1,2,3}; vector<int> x(3,{1,2,3}); vector<int> x({1,2,3});
85 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:04:48 ] >>84 static int const initial_x = {1,2,3}; vector<int> x(&initial_x[0], &initial_x[3]);
86 名前:85 mailto:sage [2008/03/01(土) 01:05:36 ] ごめん。 [] が抜けてた。 static int const initial_x[] = {1,2,3};
87 名前:デフォルトの名無しさん [2008/03/01(土) 01:08:49 ] そういうやり方しかないですか・・・そしたらint x[]={1,2,3}ですませます すみません
88 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:16:29 ] #include <boost/assign/std/vector.hpp> ... vector<int> v; v += 3, 1, 4;
89 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:16:34 ] boost::assignとか
90 名前:89 mailto:sage [2008/03/01(土) 01:16:55 ] ごめんリロードしてなかった
91 名前:デフォルトの名無しさん [2008/03/01(土) 01:21:24 ] vectorに関数追加する方法ありませんか? x={1,2,3}の代入を可能にする関数です
92 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:23:37 ] 配列数が8000ぐらいあるものでそれぞれが4つくらいのアイテムを持っている場合、 vectorやらmapやらを使いたいんですが、メモリ消費や処理速度的にどのようにしたらよいでしょうか? ちなみに8000くらいあるほうは歯抜けで番号が記録されていてコール元から頻繁にアイテムを求めてきます。(ユニークキー) 4つくらいのアイテムの方は可変になってしまうのでそれぞれをvectorにしようかと思ったのですが、 消費メモリが大きくなりそうだったので悩んでいます。
93 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:23:45 ] >>91 継承すれば
94 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:24:00 ] ありません
95 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:35:05 ] >>92 「なりそう」で悩む前に素直に実装してみて、実際のメモリ消費量見てから考えるのがいいよ。
96 名前:デフォルトの名無しさん [2008/03/01(土) 01:44:11 ] vec x(10, 10, 10, 0); で初期値0の3次配列を定義できるようにするには、どう書けばいいですか? int 型限定でよいです 4次や5次もしたいです
97 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:45:17 ] >91 無理。C++0x を待て。
98 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:46:56 ] >>95 ありがとうございます。 ちょっと試してみます。 業務で初めてC++使っているので勉強の毎日です。><
99 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:53:25 ] >>96 コンストラクタ多重定義しとけば。
100 名前:デフォルトの名無しさん [2008/03/01(土) 01:56:57 ] このように書けば可変個の引数をとれますが、内部の型が一つに決まってしまって変更できません どうすればいいですか? class vec{ int x; public: vec(int n, ...){} };
101 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:59:21 ] template使え
102 名前:デフォルトの名無しさん [2008/03/01(土) 02:04:43 ] 100次元でもできるようにするためには、テンプレートを再帰的につかうようにすれば いいと思いますがわかりません どう書けばいいですか
103 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 02:09:53 ] まだこれいたのか
104 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 02:13:35 ] もう誰も触るなよ。
105 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 03:20:54 ] Cのcursesについてお教ください printw("mojiretsu"); char buf[]="mojiretsu" printw("%s",buf); これで前者が表示され後者が表示されないのは何故なんでしょうか。
106 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 04:17:36 ] >>105 環境くらい書いた方が。 どちらのコードも問題はないと思う。 refreshはしている? 前者が表示されているってことなので大丈夫だとは思うけど。 お試しコードみたいに短いのを書いていて、 printw→refreshのあと、すぐにendwinとかしてたら表示が見えていない可能性あり。
107 名前:105 mailto:sage [2008/03/01(土) 04:36:50 ] OSはクノーピクスのDVD最新ver、コンパイラはgccです。 int main() { initscr(); move(5,1); printw("mojiretsu"); refresh(); char buf[]="mojiretsu"; move(8,1); printw("%s",buf); refresh(); getch(); getchで止まった時に上のmojiretsuは表示されているのに下はされないという状態です。 最初はcygwinでやろうかと頑張ったのですが、cursesライブラリがどうやってもリンクできずクノーピクスを使うに至っています。
108 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 05:28:37 ] >>107 fedoracoreでは特に問題なく二つの行ともに表示された。 そのソースでcursesを使うプログラムとしては特に問題はないと思うけど、 くのーぴくすに入ってるライブラリのバグなのかな…… windows上でなら、cygwinのcursesでもいいと思うけど、 PDcursesを取ってきて自前でライブラリを自分の得意の環境でコンパイルする手もあるよ。 それならリンクのやりかたが分からないとかって問題もないと思う。
109 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 05:31:29 ] printw("mojiretsu");とprintw("%s",buf);の順番が逆の時はどう?
110 名前:105 mailto:sage [2008/03/01(土) 05:57:14 ] 逆にした場合もprintw("mojiretsu");の側しか表示されません。 どうやら環境が問題のようなので108さんが紹介してくださった方法等試してみます。 ありがとうございました。
111 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 06:18:59 ] printwww
112 名前:デフォルトの名無しさん [2008/03/01(土) 09:03:27 ] C++のdeleteについて質問させてください。 環境はWindowsXP VS2005EEです。 newしたポインタをdeleteすると、メモリの中身がfe ee fe eeとなります。 fe ee fe eeという値には何か意味があるのでしょうか?
113 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 10:36:51 ] >>112 メモリ管理の都合やらデバッグの都合やらで値を書き換えているのかも しれない。ともかく、delete後のメモリなんて参照しちゃダメ。ぜった いダメ。
114 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 13:27:17 ] >>113 もちろん、その値を何かに使ったりはしませんが 見るだけでも何かまずいことがおこるんですか?
115 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:00:51 ] ネットからダウンロードしたデータがシフトJISコードの場合char型のに入れると 文字化けしてしまってまともに処理できないんですが、ecuに変換すればいいんでしょうか? できたらやり方かサンプルソース公開してくれてるサイト教えて欲しいです
116 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:05:12 ] 間違えたecuじゃなくてEUC
117 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:23:31 ] GNUのlibiconvでも使えば? GPLイヤンならIBMのICU 窓限定でいいのなら ttp://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=613442&SiteID=7
118 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:42:32 ] >>117 ありがとう。勘違いしてたEUC→SJISに変換だった 自力で関数作ってどうにかできました
119 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:43:11 ] >>114 起こらないかもしれないが、起こるかもしれない まだOSにメモリを返してなければ大丈夫かもしれないが、 返しちゃってた場合はアクセス違反で落ちるかも 処理系の実装と運次第
120 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 15:22:17 ] >>114 動作未定義だから鼻から悪魔が出るかもしれんし、HDDが フォーマットされるかもしれない。
121 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 16:32:42 ] VCで定数のアライメントってどうするん? packじゃ出来なかったYO
122 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 16:47:33 ] 定数のアライメント に一致する日本語のページ 約 件中 - 件目 ( 0.201466 秒) 定数のアライメント に該当するページは見つかりませんでした。
123 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 17:32:52 ] ifとswitchくらいしかまだ使ったことがないのですが、 条件分岐をする際 if を良く使います。ifの中にifその中にif って普通でしょうか?
124 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 17:48:13 ] 普通
125 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 17:52:33 ] あまり深くすると後で読みづらくなったりする。個人的には5段とか行くと分割を考える。
126 名前:デフォルトの名無しさん [2008/03/01(土) 18:14:46 ] C++で、doubleという名前の関数を作れるでしょうか? void double(int a); とかそんな感じ。今あるソースをみているんですが、コンパイルできなくて、 どうもそこでひっかかってるんじゃないかと。。できないとおもうんですが、 そう言いきってしまっていいですか?
127 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 18:25:21 ] doubleは予約語だから当然ダメ。Doubleならおk
128 名前:デフォルトの名無しさん [2008/03/01(土) 18:32:13 ] >>127 ありがとうございます。
129 名前:デフォルトの名無しさん [2008/03/01(土) 18:49:02 ] コンパイラや標準ライブラリベンダが使用する識別子について質問です どうやら以下の条件を満たす識別子は使ってはいけないみたいですが 1 _で始まり、大文字が続く名前 2 __(アンダースコア2こ)を含む名前 3 グローバルスコープで _で始まる名前 ケースA int _Hoge;//ダメ(1に抵触) ケースB int __hoge;//ダメ(2,3に抵触) ケースC int hoge__hige;//ダメ(2に抵触) ケースD int _hoge;//ダメ(3に抵触) ケースE namespace foo{ _hoge;} //これはok? ケースF class Hage{ int _hoge;} //これはok? ケースEとFが合法なのかどうかわかりません この辺を指摘(警告とか)してくれるコンパイラとかないんですかね
130 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 18:54:36 ] ないでしょうね、なにろ標準ライブラリが使っているわけですから・・・ しかし、初めてみたなそのルール。 _ __ が最初につく名前は駄目だというのは知ってたけど。 129 ルールでは E F は合法っぽいけどね自分の知っているルールでは非合法だ。
131 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:06:45 ] >>129 _ に小文字が続く識別子に関しては、 グローバルネームスペースでのみしか禁止されていない。 でも、マクロでは禁止されてた気がする。
132 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:20:17 ] マクロはnamespace関係ないからな。
133 名前:デフォルトの名無しさん [2008/03/01(土) 19:44:45 ] __FILE__や__LINE__ってどのファイルに定義してあるのでしょうか??
134 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:49:30 ] 大抵は字句解析器が置換する。
135 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:50:50 ] tryブロックでthrowされた例外がcatchされてcatch内で例外処理が成された後、 正常系はどこから復帰になるのでしょうか?
136 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:52:05 ] 最後のcatch節の下
137 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:53:51 ] 復帰しないよ?そのまま続く。 try{ A; //例外発生 B; }catch( exception &e ){ C; //例外処理 } D; なら、正常は:A, B, D。 Aで例外時は:A, C, D。 もちろん、Cで例外が発生したり、throwしたりしたら別だけど。
138 名前:デフォルトの名無しさん [2008/03/01(土) 19:58:13 ] Win32APIのWindowsアプリケーション開発環境を作るためにPlatform SDKを インストールしたのですが、corewin_express.vspropsのデータの修正が出来 なくて困っています。 どうしたら、修正する事が出来るようになるのでしょうか? ちなみに、OSはvistです。
139 名前:デフォルトの名無しさん [2008/03/01(土) 20:01:49 ] visual stdio2008のexpressいれとけ
140 名前:デフォルトの名無しさん [2008/03/01(土) 20:13:48 ] >>134 ありがとうございます。
141 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:34:52 ] >>136-137 ありがとうございます tryブロックの範囲の選定も気をつけないといけないようですね またまた質問なんですが std::exceptionを継承してMyExceptionクラスを作ってそこに、例外発生時のログ取り機能を追加しました 不正な引数を取ってしまったときinvalid_argumentのような例外クラスを投げたいのですが 多重継承は色々ややこしいのでMyExceptionから派生させて相当の自作クラスを投げる やっぱりMyExceptionとinvalid_argumentの多重継承を行う どちらがよいのでしょうか?
142 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:39:40 ] ログ取り機能を例外クラスから分離した方がいいと思う。
143 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:41:52 ] MyExceptionからログ鳥部分を分離して、派生のない ExceptionLogクラスを作り、std::invalid_argumentと 派生した例外を投げる、みたいな。
144 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 22:02:07 ] >>142-143 必要な標準例外クラスから派生したmy標準例外クラスを作って そのクラスにログ取り機能クラスを保有させたほうがいい ということですよね? そのほうが系統だった例外クラスの構造になるのでしょうか?
145 名前:138 [2008/03/01(土) 22:11:41 ] 2005で作りたいのですが、いい方法はありませんか? どこかの設定をいじると書き込み可能になったりとかないんでしょうか・・・。
146 名前:デフォルトの名無しさん [2008/03/01(土) 22:12:05 ] 1クラスに2つ以上の機能を入れるのは一般によくないとされている
147 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 22:23:16 ] とりあえずロガークラスを作るのは確定としても、 以降をどう実装するかは結構悩みどころだな。 個人的には throw をマクロ LOG_THROW みたいなので置き換えて、 その中で例外を投げる前にログを取るようにするのがいいと思う。 マクロは使わずに済むなら使わないのが一番いいんだけど、 デバッグ時に __FILE__, __LINE__ を利用したり、 文字列化演算子を使って移植性の高い方法でクラス名を表示したりできるから、 ログ取りには便利だと思う。
148 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 23:38:52 ] 質問です。 ヘッダをインクルードせずに class Cls* pCls; と書くのはOKなんですけど namespaceで括られた場合に class Name::Cls* pCls; と書くと'Namne' : 識別子がクラス名でも名前空間名でもありません。 とエラーが出ます。 インクルードせずに宣言する方法ってあります?
149 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 23:45:13 ] >>148 こうかな namespace Name{ class Cls; } Name::Cls *pCls;
150 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:06:39 ] ところで標準例外std::exceptionの中身ってどうなってるんだろう?
151 名前:デフォルトの名無しさん [2008/03/02(日) 00:12:35 ] CLASS x={1,2,3,4,5,6}; はどのようにかけばジツゲンできますでしょうか
152 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:14:58 ] boost::arrayでも見れば?
153 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:26:06 ] >>150 実装依存としか。
154 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:27:31 ] >>152 要するにあれは構造体の初期化だよね。 コンストラクタが無ければクラスだろうが あのタイプの初期化ができることを利用しているという。
155 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:44:18 ] boost::arrayは {{ }} で囲わないとダメだろう。
156 名前:148 mailto:sage [2008/03/02(日) 00:49:28 ] >>149 無事宣言することが出来ました。 ありがとうございます。 お礼にオプーナを買う権利をあげます。
157 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:11:03 ] 「↓」を表示後、キー入力があるまで処理を一時停止させ、 キー入力があればそれに対応した動きをさせたいのですがどうすれば良いでしょうか? getch()だと入力待ちカーソルが邪魔になってしまい、困ってます
158 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:11:07 ] >>155 いや、必要ではない。
159 名前:デフォルトの名無しさん [2008/03/02(日) 01:13:39 ] >>157 別スレで環境依存だといわれたろ? なぜ環境を書かない
160 名前:157 mailto:sage [2008/03/02(日) 01:17:19 ] すみません、vidual studio2005のC++です
161 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 02:15:30 ] >>147 実装方法ですか。 マクロを使うというとこういう感じになるのでしょうか? ErrorLogger(char* filename, int linenumber, const char* errmsg) のようなロガークラスを用意して、 コンストラクタ内でエラー内容を記録させてしまうようにしておいて #define THROW(msg , exception_type) ErrorLogger log(__FILE__ , __LINE__ , msg);\ throw exeption_type\ というようなマクロを組めばよいのでしょうか? というか、初めてマクロを組んだのであってるかどうかも判りませんorz
162 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 02:55:52 ] >>161 自己レスながらマクロ修正してみた #define THROW(msg , exception_type) ErrorLogger log(__FILE__ , __LINE__ , msg); \ exception_type e;\ throw e\ これでだいじょうぶですかね?
163 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 02:58:56 ] >>161-162 ErrorLogger をクラスにする意味がわからない。関数でいいだろ。 例外オブジェクトにデフォルトコンストラクタしか使えないのは無駄な制限。 マクロ名は動作を表すように LOG_AND_THROW() とかにしたほうがよくない? あと、最後の \ が余計。
164 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 03:00:12 ] inline関数でいいじゃまいか。何故define・・・しかもTHROWはないなw
165 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 03:03:37 ] >>164 __FILE__, __LINE__ は inline 関数だとマズイだろ。
166 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 11:18:51 ] #define LOG_THROW(type) \ do { \ :LogAndThrow(#type, __FILE__, __LINE__); \ throw type(); \ } while(false) void LogAndThrow
167 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 11:19:13 ] 途中で送ってしまった・・・。
168 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 11:26:43 ] #ifdef NDEBUG #define LOG_THROW(type) \ do { \ LogAndThrow(#type); \ throw type(); \ } while(false) void LogAndThrow(const char* type_name) { ErrorLogger log; // ここでログをとる } #else #define LOG_THROW(type) \ do { \ LogAndThrow(#type, __FILE__, __LINE__); \ throw type(); \ } while(false) void LogAndThrow(const char* type_name, const char* file_name, int line) { ErrorLogger log; // ここでログをとる } #endif こんな感じ。 実際には関数の実装は .cpp 側に書くわけだけど。 THROW という名前は何かと使われている恐れがあるので止めた方がいい。 LOG_THROW って名前も、実際には何か接頭辞を付けた方がいいと思う。
169 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 11:30:39 ] しまった。ログとるだけにしたから LogAndThrow じゃなくて LogError だな。
170 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 11:31:38 ] もちつけ
171 名前:デフォルトの名無しさん [2008/03/02(日) 13:09:31 ] ifstreamで読込みをしているとき、改行を読み込んだことを知るにはどうすればよいですか?
172 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:10:28 ] 読み込んだ内容が改行を含むかどうかチェック。 1行ずつ読み込みたければ getline が使える。
173 名前:デフォルトの名無しさん [2008/03/02(日) 13:16:15 ] >>172 int a; ifs >> a; みたいにやってるんですが、 > 読み込んだ内容が改行を含むかどうかチェック。 はどうやればいいですか
174 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:18:17 ] ああ、そういうことか・・・。 それは無理じゃないかな。
175 名前:デフォルトの名無しさん [2008/03/02(日) 13:20:54 ] >>174 じゃあ、一行ずつ読みたいなら、getline()でやるしかないですか?
176 名前:デフォルトの名無しさん [2008/03/02(日) 13:25:32 ] 以下のようなとき、 子クラスのオブジェクトから、func(1)を実行すると、 func(const char* ch)を呼んでしまうのですが、 親クラスのfunc(int i)を呼ぶにはどうすればいいのでしょうか? /*****こんな感じ*****/ class Parent{ public: void func(int i); }; class Child : public Parent{ public: void func(const char* ch); }; /*******************/
177 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:29:35 ] >>175 そうなる。 getline した後 istringstream に渡してやるとか。
178 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:39:57 ] >>176 Child ch; ch.Parent::func(1);
179 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 13:47:37 ] >176 子クラス Child の func() によって親クラス Parent の func() が隠蔽されている。普通にオーバーロードしたいなら class Child : public Parent { public: using Parent::func; void func(const char* ch); }; とすることで Parent での func() も見えるようになる。
180 名前:176 mailto:sage [2008/03/02(日) 14:07:51 ] >>178 >>179 ありがとうございます。
181 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:27:55 ] namespace temp { class Test { private: std::ostringstream oss; public : ~Test() {std::cout << oss.str();} template <typename T> friend Test &operator <<(Test &, T t); }; } template<typename T> temp::Test &operator<< (temp::Test& test, T t) { test.oss << t; return test; } を、temp::Test() << 2; と使うと、「operator << が曖昧です」というコンパイルエラーになります。 名前空間を使わないとコンパイルできるのですが、何が問題なのでしょうか Win2k、VC2005です
182 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:32:37 ] << の実装部も temp 名前空間に入れないと。 temp::Test 内で宣言してる friend 関数は temp 名前空間内に入る。 だから、今は temp::operator<< と operator<< の2つがある状態。
183 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:37:08 ] >>182 なるほど、ありがとうございました!
184 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:39:32 ] あるいは friend のところを ::operator<< にするかだけど、 temp 名前空間内に入れた方がいいと思う。
185 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:50:17 ] コマンド等文字列処理で2重のループから抜けるときに goto文使うのって邪道かな? いつも使ってるんだが。
186 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:50:54 ] 2重ループから抜ける際に goto を使うのは常套手段
187 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:17:28 ] 俺、今まで一度も使ったことが無い。 使いたい衝動に駆られたことはある。
188 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:19:02 ] 小さい関数内なら結構goto使っちゃうなぁ
189 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:23:44 ] 常套手段ではあるけど、 2重ループから抜ける必要があること自体があまりないよね。
190 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:24:49 ] まあ関数は一目でざっと目通せる程度にするもんだしちゃんと考えて使うならぜんぜんいいと思う
191 名前:デフォルトの名無しさん [2008/03/02(日) 15:36:50 ] ポインタを解放した後、安全のためNULLを入れると書いてたんですが、 NULLを入れると何が安全なのでしょうか?
192 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:38:35 ] 解放されているかどうかを NULL チェックで確認できる。
193 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:39:18 ] 二重にdeleteすることが無くなる(delete(NULL)は安全なことが保障されている)
194 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:40:13 ] NULL なら間違って解放後にアクセスした際にエラーになってくれる環境が多い。 NULL じゃない場合は偶然アクセスできるかもしれないが、 メモリ領域を壊したり変な値を取得したりしてしまう。
195 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:41:42 ] 無限ループでポインタインクリメントでもしながら片っ端から表示してみれば良いわけない
196 名前:デフォルトの名無しさん [2008/03/02(日) 15:49:10 ] すみません keybd_eventみたいに プログラムからキーボードを押したことにするのは gccだと何か方法がありますか・・・?
197 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 16:12:32 ] >196 keybd_event は Windows API。gcc はいろんな環境向けがあるコンパイラ。 例えば Windows 上で gcc を使っているなら keybd_event になるわけだしやりたいことをもっと正確に書こう。
198 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 17:26:18 ] 初心者です。 デフォルトコンストラクタっていうのは、 1.引数なしで呼ばれるコンストラクタ 2.なにも記述してなくてもデフォルトで呼ばれるコンストラクタ のいったいどっちのことなのですか? 1と2の違いは、例えば、引数なしのコンストラクタを 自分で定義したときに、それをデフォルトコンストラクタと いうかどうかという違いになると思うのですが、、、 1と2の説明ともWEB上で見かけますが、 どちらがより正確なのでしょうか?
199 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 17:29:15 ] 引数無しで呼ばれるコンストラクタ。 自分で定義しようがデフォルトコンストラクタ。
200 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 17:34:41 ] >>198 引数なしで呼ばれるというよりは引数なしで呼ぶことが可能なと いったほうがいいかもな。デフォルト引数もあるから。 class Widget { public: Widget(int i = 0) {} }; //例えば Widget w; //このsyntaxがデフォルトコンストラクタを要求する。 //Widget::Widget(0)が呼ばれる。
201 名前:198 mailto:sage [2008/03/02(日) 17:35:37 ] >>199 ありがとうございます。 すっきりしました。
202 名前:198 mailto:sage [2008/03/02(日) 17:37:25 ] >>200 おっと行き違いになりました。 そうですか、 それもデフォルトコンストラクタなんですね。 ありがとうございました。
203 名前:196 [2008/03/02(日) 18:15:40 ] >197 すみませんでした OSはDebianでPDFかパワポのようなものを C言語で操作したいのです 具体的には下キーかEnterキーをC言語で押したことにして スライドを進めることを行いたいです
204 名前:191 mailto:sage [2008/03/02(日) 19:36:37 ] >>192 >>193 >>194 ありがとうございます。 具体的によく分かりました。
205 名前:デフォルトの名無しさん [2008/03/02(日) 21:56:29 ] c言語で聞きたいことが1からたくさんあるので、何方かmsnメッセで教えてくれませんか? kamisama6@hotmail.co.jp までお願いします!
206 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:02:14 ] >>205 C言語の個人講習をして欲しい訳だな?しかも無料で! そんな奇特な人は少ないが候補として C言語を覚えたてで自分のために他人に説明する人がいるが そんな人を探すくらいなら良書を買ったほうがいくぶんかマシ C言語をマスターしていながら教えてくれる人がいるとしたら リタイヤした人くらいだろうな
207 名前:デフォルトの名無しさん [2008/03/02(日) 22:08:50 ] string tmp; cin >> tmp; としたとき、改行だけが押されたことを知るにはどうすればいいですか?
208 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:16:47 ] >>207 フォーマット入力はデフォルトでは空白類記号は読み込まれない。
209 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 23:29:59 ] gcc をつかった 分割コンパイルの仕方がわからないのですが わかりやすく解説したページはないでしょうか?
210 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 23:33:01 ] gcc -c hoge1.c gcc -c hoge2.c gcc -c hoge3.c gcc -c hoge4.c gcc -o hoge hoge1.o hoge2.o hoge3.o hoge4.o
211 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 23:55:20 ] >>209 Makefileでググれば、良いと思う。
212 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:35:02 ] namespace Name { class Cls; }
213 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:48:48 ] 丸一日前のレスにレスか
214 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:52:06 ] Makefileとbjamとどっちがいい? やっぱ標準であるmakeは一通りやっとくべきかな?
215 名前:デフォルトの名無しさん [2008/03/03(月) 01:14:07 ] >>208 ありがとうございます。一応自分で書いてみましたが、まだうまく動きません。 noskipwsをした後、おかしくなります。 どうかよろしくお願いします。 std::string filename = "default_file.txt"; while (1) { std::string tmp; cout << "Input file name : (hit return to default: " << filename << ") "; cin >> std::noskipws >> tmp; // 下の(1)でY以外で答えたとき、ここで入力を受け付けてくれない。 if (tmp.empty()) { // リターンキーだけが押された場合に、ここのIF文に入る tmp = filename; } cin.clear(); cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); cin >> std::skipws; cout << "filename : " << tmp << " OK (Y|N) ? "; std::string ans; cin >> ans; // (1) if (ans == "Y") { filename = tmp; break; } }
216 名前:デフォルトの名無しさん [2008/03/03(月) 02:22:41 ] stdlib.hの中で_CRT_DOUBLE_DECと_LDSUPPORTを定義してないとき_CRT_DOUBLE、_CRT_FLOATといった構造体を用意してるようですが、 _CRT_DOUBLE_DECと_LDSUPPORTとこの2つに囲まれた構造体などは何のために用意してるんですか?
217 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 02:31:37 ] >>215 改行は読み込まないからgetlineがいい。 std::string filename = "default_file.txt"; while (1) { std::string tmp; std::cout << "Input file name : (hit return to default: " << filename << ") "; std::getline(std::cin, tmp); if (tmp.empty()) { tmp = filename; } std::cout << "filename : " << tmp << " OK (Y|N) ? "; std::string ans; std::getline(std::cin, ans); if (ans == "Y") { filename = tmp; break; } }
218 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 02:43:47 ] C++ってどういう業界の人がつかってるの? GUIでMFCやVCL、Qtさわるくらいはあるが、 ゲーム以外でフルスクラッチで書き上げる人たちって どういう人?
219 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 02:44:13 ] 趣味
220 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:24:20 ] やっぱそうか。 抽象化なんて考えてる暇あったら別の仕事が 飛んでくるもんね。
221 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:25:01 ] 最近C#なんか使う企業もねえ
222 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:50:36 ] つまりCωの時代がやってくると。
223 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:57:12 ] 時代はwebアプリか・・・
224 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 03:58:37 ] 業務ソフトなら実際C#とか.NETでもなんら問題なくなってきてるご時世だもの
225 名前:デフォルトの名無しさん [2008/03/03(月) 03:59:03 ] 俺は金融関係だけど、C++使ってるよ。 matlabを使うとこも多いけど。
226 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 04:00:20 ] 自動車関係企業のシステム部門ってC/C++使うのかなぁ
227 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 04:01:14 ] いかにも使いそうじゃないか
228 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 04:05:58 ] >>226 COBOLとか使うと思うんだ、経験則
229 名前:デフォルトの名無しさん [2008/03/03(月) 04:51:56 ] 昨日から色々質問させてもらっているものです。 色々分かってきたのですが、getlineとcinとの併用のときにどう書くべきかわかりません。 #include <iostream> using namespace std; int main() { int a; string s; cout << "int: "; cin >> a; // cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "string: "; getline(cin, s); cout << "int: "; cin >> a; return 0; } 上記のソースでコメントアウトしている箇所がありますが、コメントアウトしたままだと、 真ん中のstringの入力が、1つめのintの入力の改行を拾ってしまうせいで、とばされてしまいます。 そこで質問なのですが、ここにコメントアウトされている行をいれるのは正しいですか?
230 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 05:00:45 ] >>229 コメントアウトした行を入れてもだめ。 cin >> a; で改行文字がバッファに残るため、それが次のgetlineで 読み取られてしまう。Cで言う所のscanf()とgets()を混在させた問題と同じ。 解決策はgetline(cin, s); をもう一つ付け足して改行文字を読み飛ばす。 もしくはgetline()に統一する。
231 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 05:37:29 ] 今の所COBOL、PL/I、Java、JS、Access、Rubyを見たことがある
232 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 05:42:58 ] >>225 金融っていってもmatlab使ってるようなところは 複雑な数値計算やってるだろうからちょっと特殊だな。 車でもカーナビのように限られたリソースでGUI作るようなところは 使ってるだろうが、間違っても制御には使わんと思うんだが。
233 名前:デフォルトの名無しさん [2008/03/03(月) 05:53:38 ] >>230 ありがとうございます。 getline()とcinを混在させないのが一番いいと。でも、cinが便利なので、 基本的にはcinを使いつつ、cinだと改行を扱うのが不便なのでその時だけgetline()を 使う、という風になりそうです。(自分としては) すると、 (1)getline()する前にバッファに改行が残っているか確認して、残っていれば消す。 (2)cinした後には改行を消しておく。 のどっちかになると思うのですが、今回は(1)の方法が分からなかったので、(2)で実装しました。 どっちにしても、cin関係はなんか使いにくい感じ。
234 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:03:00 ] linux のmmapのこと調べてて疑問に思ったので質問。 mmap でファイルを仮想メモリにマッピングしたとき、OSがファイル上のデータを ブロック転送する、アプリがその領域に書き込むとOSがファイルにそれを反映すると 書いてあった。 mmapでマップされた領域に上のあるアドレスに代入したとき、 OSは代入されたことを知っているの? 代入演算子で値を放り込むことと、read write のシステムコールを使うのは 根本的に違いますよね?
235 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:03:27 ] >>218 GEANTは4からC++だよ!
236 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:09:53 ] >>234 C/C++の問題じゃないと思う 多分OSがマッピングした領域は書き込み不可の属性が付いており 書き込んだらCPUに割り込みがかかってそれを利用してファイルに反映してるか そんな所だと思う
237 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:14:44 ] >>236 失礼しました。 環境に依存する内容は避けたほうがよいですね。
238 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:52:21 ] >>237 環境依存OKのスレだから問題ないんだけどC/C++よりも linuxの話になるね ちなみにWindowsの仮想メモリとメモリマップトファイルも似たような 機構で実現している
239 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 07:59:34 ] 複数ある単語から文字列中最初にマッチする物を探す用途で、 こんなのを考えてみたのですが、こういう2分木辞書ってなんて 名前になるんでしょうか? サフィックスツリー?(これよりもっと複雑なようですが) typedef std::map<char, Node> Tree; //char に単語の1文字が入る struct Node { Node *pChild; //次の文字ノード int No; //登録番号、兼、非末端(-1) } 単語がab,ba,ac,abcとあるなら、子ノードの繋がりが下記のようになる。 先頭 <a,-1> <b,-1> / \ / <b,0> <c,3> <a,1> / <c,3>
240 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 08:01:07 ] 訂正 struct Node { Tree *pChild; int No; }
241 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:10:06 ] &ClassName::memberVarName; って演算はいったい何を行っているのでしょうか? 最初オフセット値を得ているのかと思ったんですが、ためしに出力しても、1が出力 されるだけです。 元ソースでは、これを引数にしてメンバ変数のオフセット値を得ているようですが…
242 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:11:38 ] >>241 メンバポインタでぐぐれ
243 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:27:45 ] >>242 ありがとうございます。おかげで理解できました。 メンバポインタからオフセット値を得るには、 &( static_cast<A*>(0)->*memPtr ) で仕様上問題ないでしょうか?
244 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:35:43 ] 単にオフセットが欲しいんなら offsetof を使えばいい
245 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 11:13:30 ] >>243 実際には動くだろうけど、仕様上は良くないような ちゃんとインスタンスを用意した方がいいんじゃない
246 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 11:30:26 ] >>243 オフセットは POD 型に対しての offsetof でしか取れないよ。 素直にメンバポインタ通して参照しちゃダメなの?
247 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 12:07:59 ] >>229 仕様上正しい。 以下はJosuttis本の記述の要約。 istream& istream::ignore(streamsize count, int delim) This form ignores up to count characters until delim is extracted and discarded. (ストリームから改行まで抽出されて捨てられる。) ちなみにg++ 4.0では無問題だった。
248 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 12:50:21 ] >>239 トライ木じゃねえの
249 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 15:03:37 ] >>236 割り込みなんかかからない。 ページング機構を備えるどんなプロセッサでも(俺の知る限り) プロセッサ自体に、書き込まれたかどうかのフラグ (いわゆる、dirty bit と呼ばれるもの)をセットする機構がある。 例えばx86ならば、ページテーブルの該当ページを示すエントリ内にこれがある。 で、ファイルから読み込んだときにOSがこのフラグをリセットしておき OSは、ページが不要になった時やsync要求が来たときにこのフラグを確認して 書き戻すか破棄するかを決定する。
250 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 15:09:16 ] >>248 それみたいですね。 すっきりしました、感謝。
251 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 16:48:21 ] >>245 ,246 仕様上ダメですか…違う方法を模索することにします。
252 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 20:58:31 ] >>249 すみません。 read write のようなシステムコールを実行するとOSデバイスドライバが あとは処理してくれますよね? 代入演算子を使ってmmapした領域に書き込むとき、 そのフラグもセットするようにgccが実行ファイルを生成してくれるのでしょうか? でもそれだと操作するアドレスがどこなのかをプログラムソースには書かなくても実行ファイルの中では 毎回見ているということでよろしいのでしょうか?
253 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 21:15:49 ] dirty bitを立てるのは249に書いてあるとおりCPUの仕事。 特にコンパイラがすることはない。
254 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 21:47:57 ] 仮想記憶でぐぐればいいと思うよ。
255 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 21:51:42 ] ちなみに、少し前のLinuxカーネルのバグは この複数からの同一ページへのアクセス時に このフラグをうまく処理しなかったかららしい。 また、少し違うが phenomのバグはキャッシュに対するdirty bitの反映が 高負荷時に滞るというものらしい。
256 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:03:13 ] もう少し補足すると、 普通のページング可能なプロセッサは、 TLBと呼ばれる、ページテーブルのキャッシュを内部に持っている。 (x86以外では呼び方が違うかもしれない) したがって、該当ページへの書き込みがある度に 毎回物理メモリ上のページテーブルに書き込んだりはしない。 (TLB内の情報と変更があった場合のみ、書き込む) で、このTLBの内容を書き戻すときにまずキャッシュに書き込むわけだけど これがうまくいかない場合がある、というのがphenomのバグらしい。 L1とL2の関係もあるとかどっかで読んだが詳しくは覚えてない。
257 名前:デフォルトの名無しさん [2008/03/03(月) 22:37:05 ] enumってプリプロセッサが解釈するのでしょうか??
258 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:41:16 ] いいえ。コンパイラたんがせっせこお仕事します。
259 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:41:58 ] >>258 サンクスでちゅ。
260 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:51:12 ] >>253 ありがとう。 CPUのやるとことまで押さえるのは難しいな。 もちろん仮想記憶で調べたりもしてるんですが、 なかなか自分の知りたいところのたどり着けない。 使い方はソースも含めて載ってたりするんだが。
261 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:31:23 ] >>260 そういうCPUまわりのことを色々知りたいなら、 www.intel.co.jp/jp/download/index.htm ここにあるIA-32なんとかなんとか下巻:システム・プログラミング・ガイドが参考になるかも
262 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:00:20 ] ちょっとお聞きしたいのですが stringクラスの関数でcompareというのがありますが、参考書によると int compare(const string& str) const; のように定義されているとあります。 この定義のconst string& の&ってどういう意味の&なんでしょうか? 最後のconstも、なぜここにconstがあるのか分かりません。 また、上の定義が宣言されている場所を探してみたのですが、そもそもそれが見つかりません。string.hの中にはないのでしょうか?? 質問ばかりで申し訳ないのですが、どなたか教えていただけると幸いです。
263 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:15:09 ] >>262 C++をもちっと勉強するといいよん。 &は参照。C++で導入された機能。参照についてはぐぐるよろし。 constは簡単に言うと「この関数はメンバ変数を変更しません」って宣言。 compare関数を呼ぶことで元の文字列を弄られちゃ話にならんだろ?
264 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:15:17 ] たぶん、これからも山ほど疑問が出てくるだろうから 入門書を読んだほうが早いと思う。
265 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:16:31 ] あと定義はstring.hではなくてstringの中だ。 string.hはCのヘッダーだからそりゃないだろうね。
266 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:19:45 ] >>262 > ちょっとお聞きしたいのですが > stringクラスの関数でcompareというのがありますが、参考書によると > > int compare(const string& str) const; > > のように定義されているとあります。 > この定義のconst string& の&ってどういう意味の&なんでしょうか? > 最後のconstも、なぜここにconstがあるのか分かりません。 > > また、上の定義が宣言されている場所を探してみたのですが、そもそもそれが見つかりません。string.hの中にはないのでしょうか?? > 質問ばかりで申し訳ないのですが、どなたか教えていただけると幸いです。 例えばcompare(const string str)だとすると引数にstd::string型のオブジェを入れると std::stringのコピーコンストラクタがstrに働いて無駄なメモリ間のコピーが働く compare(const string& str) とする理由は引数に参照を取る事となり コピーが働かないので無駄なメモリの消費がなくなる。 最後のconstはメンバ関数を呼び出したオブジェクトを修正できないようにすることです
267 名前:252 mailto:sage [2008/03/04(火) 01:45:56 ] レスくださった方々ありがとうございます。 >std::stringのコピーコンストラクタがstrに働いて無駄なメモリ間のコピーが働く >compare(const string& str) とする理由は引数に参照を取る事となり >コピーが働かないので無駄なメモリの消費がなくなる。 なるほど!勉強になります。 あと、compareの宣言ですが、stringやcstringの中も見てみたのですが、みつからないんです。
268 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:54:48 ] >>267 更にstringからインクルードしている先にあるんじゃないか? 例えばcygwinのgccだと/lib/gcc/i686-cygwin/3.4.4/include/c++/bits/basic_string.hにある。
269 名前:デフォルトの名無しさん [2008/03/04(火) 02:19:09 ] >>262 VSならソースコード中に#include <string>として stringの所にカーソルあわせて右クリックでstringを開くを選択すれば 中身は見れるよ
270 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 04:14:40 ] 適当なcompareのとこで右クリック→定義を参照すれば、basic_string::compare()かなにか出ると思うよ
271 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 04:15:02 ] あ、VSの話ね
272 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 04:30:57 ] たまにはBCBとかのことも思い出してね
273 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 08:34:19 ] grepくらい使えよ(´・ω・`)
274 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 08:37:41 ] findも使えよと混ぜ返したらDOSのfind.exeと誤解される罠。
275 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 08:46:55 ] プリプロセッサだけ通したモノにエディタで検索かけるのはダメですか…?
276 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 09:40:08 ] vector型で vector<int> num; num[i*j]=a; 見たいなことしたいのですが どうやるのでしょうか
277 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 09:48:22 ] templateで、特定の型以外が渡された場合にエラーなり 分岐なりする方法ってあるんでしょうか? たとえば template<class T> class Hoge { void Fuga(T &ref) { //ここで渡された型を知りたい }; } C++だと無理?
278 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:01:47 ] クラスAからそれぞれ派生したクラスB系統とクラスC系統のクラスがあるのですが Aのポインタ*pがどちらの系統か判別する方法はありますか? RTTIだとpの中身は分かるけどどういう系統までは追えないようですが良い方法はありますか?
279 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:04:16 ] 意味が良くわからんかったけどメンバに識別子でもいれればいいんじゃない
280 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:07:13 ] >>277 テンプレートの特殊化の話かな
281 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:08:10 ] >>278 dynamic_cast
282 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:08:45 ] >>279 デコレータパターンのConcreteComponentの型を判別する方法はないかな、ということです
283 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:10:30 ] >>278 dynamic_castはダウンキャストに失敗すると0を返す。
284 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:14:25 ] >>282 それ、パターンの使い方っていうか、設計ができてないんじゃないの? ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B9%E3%82%B3%E3%83%95%E3%81%AE%E7%BD%AE%E6%8F%9B%E5%8E%9F%E5%89%87
285 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:19:42 ] >>276 operator[](size_type)があるやん
286 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:20:04 ] >>284 そうなんですけど 出来れば再帰的に DecoratorA-DecoratorB-DecoratorC-ConcreteComponent と順番に型情報をたどって行く必要ができてしまって・・・ 最悪でも、根元の情報だけでも何とかならないかと
287 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:22:42 ] じゃあまさに>>279 の方法なんじゃないの?
288 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:26:38 ] >>285 なんですかそれ
289 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:31:02 ] >>287 Decoratorの方はいくらでもいじれるのですが ConcreateComponentの方はこちらの一存ではいじれないので識別子を埋め込むのは難しいかと やはりcastの成否で判別していくのが無難か・・・ castに失敗するとNULLが返る? bad_castがthrowされるのは参照のキャストの時だっけ・・・
290 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:38:55 ] >>288 普通にnum[i * j] = aとすればいいということ。勿論、num.size()がi * jより大きいことが条件になるけど。
291 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:40:16 ] >>277 テンプレートで先ず全ての型で失敗するコードを書いておいて、 特別な型だけ特殊化しておくとか。
292 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:56:49 ] 全く関係ないが キャストとくにdynamic_castを使用する度に クラス設計に問題があったんじゃないかと不安な気分になるのは自分だけか?
293 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:58:43 ] >>292 それが正常。
294 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 11:03:25 ] 俺なんか気づいたら継承が全部public、メンバもほとんどpublicだったことがあるぜ! (´・ω・`)
295 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 11:32:26 ] でもcast使わざるをえない時ってあるから嫌らしいよな
296 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 11:36:08 ] >>280 ,291 すみません、説明がたりませんでした。 templateでtemplate型を受け取った時にも対応できる方法が あるかが知りたかったんです。 例えばtempate関数でstd::vector<何でもOK>は受け取れるが std::list<>はだめな場合など。 こういう場合、特殊化だとvector<int>、vector<float>〜という具合に OKにしたい型を全て記述しないとダメなんじゃないですか?
297 名前:291 mailto:sage [2008/03/04(火) 11:45:15 ] >>296 「特定の(少数の)型」だけ有効にしたいのかと思ったから特殊化を提示した。 そうでないんだったらtypeidで動的に型を調べることになるのかな? templateスレ辺りの方が喰い付きがいいかも知らん。
298 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 11:52:37 ] >>296 こんなの? #include <vector> template<typename T> void foo(T const& x); template<typename E> void foo(std::vector<E> const& x) {} int main() { std::vector<int> vi; std::vector<float> vf; foo(vi); foo(vf); return 0; }
299 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 12:00:49 ] concept check
300 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 12:07:36 ] >>296 mplを駆使すればできるだろ
301 名前:267 mailto:sage [2008/03/04(火) 13:06:56 ] grepは使ったのですが、なぜかうまく検索できなかったので困ってました。 Eclipse CDT 使ってるんですが同じようなことができました。 ありがとうございました。
302 名前:267 mailto:sage [2008/03/04(火) 13:07:28 ] grepは使ったのですが、なぜかうまく検索できなかったので困ってました。 Eclipse CDT 使ってるんですが同じようなことができました。 ありがとうございました。
303 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 13:18:46 ] [゚Д゚] castトキイテラグオルカラキマシタ, アイシテ!
304 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 13:21:32 ] 野郎銃器ロボはお帰りください。 野郎近接ロボとなおんロボはOK。
305 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 13:34:47 ] >>298 >template<typename E> void foo(std::vector<E> const& x) {} あーこういう書き方でいいんですね。助かりました。 いつかさらに複雑な選別が必要になったら、mplやconcept checkも 調べてみます。どうもでした。
306 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 14:49:30 ] ちょっとお尋ねした胃のですが void qsort(void* base, size_t n, size_t size, int(*fnc)(const void*, const void*)); という定義がありますが、const void* ってなんなのでしょうか? voidってのは「空の型」ってことだと思うのですが、空のものをconst(固定)するってどういうことなのでしょうか? 何もないのだから固定しようがないと思うのですが・・ また、引数がvoid*になっているのもよく分かりません。void(何もない)のポインタを引数にするってどういうことなのでしょうか??
307 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 14:51:16 ] void*は汎用ポインタ。voidとは関係ない。
308 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 14:53:05 ] >>306 Cでは「何かへのポインタ」をあらわずときに void* を使う。qsort()で はソート対象の型が決まっていないので、何でも受け取れるように void*を使っている。 const void* ってのは、「そのポインタが指している先は書き換えしま せんよ」という意味。
309 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 14:56:06 ] ポインタにはアドレスと「そのアドレスから先にどういうデータが入っているか」という情報が含まれる。 void型ポインタってのは「そのアドレスに何が入っているかを指定しないポインタ」という意味。 受け取った関数内で適切な型にキャストしてやって使うことになる。 qsortはintでもcharでも構造体でもソートできる汎用的な関数にするためそういう形になってる。 constってのは「そのポインタの場所に入ってる変数を変更してはいけません」って意味。 constつけた関数内でうっかり書き換えるとコンパイルエラーになるから、ミスを予防できる。
310 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:30:54 ] 下記のソースを bcc32 test.cpp でコンパイルすると★の行で エラー2423 存在しないテンプレート'show_array'の明示的な特化またはインスタンス化 *** 2 errors in Compail *** が表示されなす。 存在しないって言われても直前に・・・・ テンプレートの定義が間違ってるのでしょうか?
311 名前:310 mailto:sage [2008/03/04(火) 16:31:43 ] --- test.cpp --- #include <iostream.h> /*-------------------------------------------------------*/ /* 配列の表示テンプレート */ /*-------------------------------------------------------*/ template<class T, class T1, class T2> T show_array( T1 *array, T2 count ) { T2 index; if( count == 0 ){ /* 表示しない ? (YES) */ return( 0 ); /* 非表示 */ } /* 配列を表示 */ for( index = 0; index < count; index++ ){ cout << array[index] << ' '; } return( 1 ); /* 表示 */ }
312 名前:310 mailto:sage [2008/03/04(火) 16:32:59 ] template char show_array( int *array, int count ); ★ template int show_array( float *array, unsigned char count ); ★ /*-------------------------------------------------------*/ /* main関数 */ /*-------------------------------------------------------*/ void main( void ) { int pages[] = { 100, 200, 300, 400, 500 }; float price[] = { 10.05, 20.10, 30.15 }; /* int型の配列 */ show_array( pages, 5 ); cout << '\n'; /* float型の配列 */ cout << show_array( price, 3 ) << endl; cout << show_array( price, 0 ) << endl; cout << '\n'; return; }
313 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:53:01 ] unsigned char String[9] = "S2KTI2G7"; unsigned char KeyTable[11] = "0123456789"; char *id = "0"; int i; for(i = 0; i < 8; i++) String[i] ^= *id; このプログラムの動作がよくわかりません たとえばString[0]はSのアスキーコードが83、0のアスキーコードが48なので String[0] = 83^48になるのかと思ったのですが、実際は99になっているようです。 どうして99になるのでしょうか?
314 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:53:46 ] >>310 >*** 2 errors in Compail *** 恥ずかしいからちゃんとコピペしようね。
315 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:56:05 ] >>313 Cではハット(^)はビット毎の排他論理和演算子なので、83^48はちゃんと99になる。
316 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:58:09 ] >>313 83^48 =1010011^0110000 =1100011 =99
317 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:01:12 ] >>315-316 なるほど ここしばらく他の言語しかやってなかったのですっかり忘れてました すばやい回答ありがとうございます
318 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:01:17 ] >>310 こんな感じじゃないかなたぶん return( 1 ); /* 表示 */ }; <----- ここテンプレートの最後にセミコロンが必要 template char show_array..... → template<> char show_array..... template int show_array..... → template<> int show_array..... show_array( pages, 5 ); → show_array<char>( pages, 5 ); show_array( price, 3 ) → show_array<int>( price, 3 ) show_array( price, 0 ) → show_array<int>( price, 0 )
319 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:02:30 ] >>310 そのテンプレート関数の目的が意味不明なんだが、取り敢えず「所謂」全角空白が見えるエディタを使おう。
320 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:05:25 ] >>310 多分、テンプレート関数では配列の一部を出力してその有無を返すだけと判断して勝手に修正してみた。 -- #include <iostream> using namespace std; template<class T> bool show_array(T array[], int N) { for (unsigned ic = 0; ic < N; ++ic) { cout << array[ic] << ' '; } return N != 0; } int main( void ) { int pages[] = { 100, 200, 300, 400, 500 }; float price[] = { 10.05, 20.10, 30.15 }; /* int型の配列 */ show_array( pages, 5 ); cout << '\n'; /* float型の配列 */ cout << show_array( price, 3 ) << endl; cout << show_array( price, 0 ) << endl; cout << '\n'; return 0; }
321 名前:320 mailto:sage [2008/03/04(火) 17:09:21 ] いかん、配列の要素数を勝手に取得するバージョンの名残で引き数Nが大文字だw ついでなんで、そのバージョンも貼っておこう。 -- template<class T, size_t N> bool show_array(T (& array)[N]) { for (unsigned ic = 0; ic < N; ++ic) { cout << array[ic] << ' '; } return N != 0; } -- これだと、show_array(price)で使える。でも戻り値の意味がないw
322 名前:306 mailto:sage [2008/03/04(火) 17:33:00 ] なるほど。 レスくださった方々、わかりやすい説明ありがとうございましたm(_ _)m
323 名前:310 mailto:sage [2008/03/04(火) 17:34:28 ] レスありがとうございます! 314 >> あ、aが余分でした (;ω;`) 318 >> テンプレートの最後にセミコロン付加 templateの後に<>付加 show_arrayの後に<型>付加 をやってみましたが、エラー内容は変わりませんでした・・ 319 >> 練習用に色々やってみた感じで作りました。 エディタはさくらエディタ使ってます。 320 >> > 多分、テンプレート関数では配列の一部を出力してその有無を返すだけと判断して させたい動作はその通りです。 320さんのソース読んできます。
324 名前:310 mailto:sage [2008/03/04(火) 17:36:39 ] アンカーの付け方まちがえたぁぁ〜
325 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:47:39 ] >>324 全角空白を見えるようにしろって言うのは、>320に全角空白が入っているからなんだが。 # 勿論、後から追加したであろう★印のところ以外にね。
326 名前:325 mailto:sage [2008/03/04(火) 17:48:15 ] いや、全角空白が入っているのは>320じゃなくて>310だった_/ ̄|○
327 名前:310 mailto:sage [2008/03/04(火) 17:57:39 ] >>320 さんのソースを元に、自分との違いを考えて >>311-312 のソースの★の記述を削除し、 >>318 さんの変更を加えたら、コンパイル通りました〜。 ソースの書き方がコテコテ素人なんで、 >>320 さんのソース見て勉強します。 >>318 さんの追加が無い場合はエラーが出るのですが、内容読んでも show_array<char>( pages, 5 ); の<char>が何で必要か わからんです、ヒントお願いできないでしょうか。 エラー内容は↓です。 エラー2285 show_array<T,T1,t2>(int *, int)に一致するものが見当たらない
328 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 18:00:40 ] >>327 template<class T, class T1, class T2> T show_array( T1 *array, T2 count ) というテンプレートがあるので、show_array( pages, 5 ); は show_array<char, int*, int> かもしれんし show_array<int, int*, int> かもしれんし show_array<long, int*, int> かもしれんし T1とT2は引数見ればわかるけどTの型は決定できないので
329 名前:310 mailto:sage [2008/03/04(火) 18:03:50 ] >>326 !? お template<class T, class T1, class T2>と T show_array( T1 *array, T2 count ) の間に全角空白が!!!!!! コピペした後に入れちゃったみたいです。('A`) ご指摘ありがとうございます。
330 名前:310 mailto:sage [2008/03/04(火) 18:13:08 ] >> 328 なるほど! 分かりやすいご説明ありがとうございます。 試しに <char>show_array( pages, 5 ); してみたら、構文エラーでしまた。 show_array<char>( pages, 5 ); って書き方なんですね。 ご回答下さった皆様、ありがとうございました(。。)゛
331 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 19:37:21 ] oprator void *() const { if (state&(badbit|failbit)) return 0; return (void *) this; } のopratorはここではどういう意味で使われているのでしょうか? この位置にあるのを初めて見まして、よくわからないんです。
332 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 19:41:08 ] >>331 型変換の演算子。
333 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 20:00:13 ] >>331 例えば class Foo { public: operator int() { return 42; } }; main() { Foo foo; int x = foo; // <-- ここ cout << x; } というふうに、クラスを別の型に変換するときに呼ばれる。
334 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 21:54:20 ] ちなみに、このvoid*への変換演算子は if (str)のように条件式で用いるために用意されている。 なぜoperator boolでないかというと、boolでは整数へ変換できてしまうから。 int x = str;のような想定外の変換を行わせないためである。
335 名前:デフォルトの名無しさん [2008/03/04(火) 23:21:45 ] C#で開発したプログラムを、事情で一部C++.Netで書き直さないといけなくなったのですが [C#] List<int[]> foo; の書式が、C++.Netではどう直せばいいのかわかりません。 intの配列ではテンプレートを適応できないのでしょうか?
336 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 23:24:05 ] >>335 List<array<int>^>^ foo;
337 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 23:24:19 ] vene.wankuma.com/ecma372/24_cli_array.aspx これ?
338 名前:335 [2008/03/04(火) 23:25:39 ] >>336 ありがとうございます。私の4時間が返ってきた。 これで作業が続きます。
339 名前:336 mailto:sage [2008/03/04(火) 23:40:27 ] >>338 ちなみにあなたが書いてるのはC++/CLIなので 分らないことがあったらC++/CLIスレに行くと幸せになれるかも。
340 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 23:56:55 ] List<array<int>^>^ foo; 笑ってるように見えて何かムズムズするw
341 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 00:36:11 ] List<List<List<array<int>^>^>^>^ foo = gcnew List<List<List<array<int>^>^>^>();
342 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 00:37:46 ] 積年の疑問なんですが、スタックサイズはいつどうやって決まるんでしょうか。 1. コンパイル時に 2. リンク時に 3. 実行時に a. 自動的に(コンパイラとかが自動変数の使用状況などを見て) b. 固定的に 多分、どれかに当てはまると思うんですが。
343 名前:デフォルトの名無しさん [2008/03/05(水) 00:40:00 ] コンパイルしたら
344 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 00:48:12 ] >>342 環境依存。 Windowsはリンク時に実行ファイルのヘッダにサイズが書かれるんだった かな。子スレッドのスタックは実行時。
345 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 00:48:49 ] >>342 Windowsではexeにスタックサイズが書かれるので、リンク時以前 組み込みなんかでリセットベクタもコンパイルする必要がある場合は、コンパイル時 と思う。
346 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 01:31:09 ] 組み込みで開発してたときはスタックサイズのチェックしてたな どこまで上ってきてるか心配だったから。 あのときはコンパイル時だな。
347 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 01:34:24 ] うちもスタックポインタのチェックやってる。んでも、リンク時だと思う。 リンク時にスタックポインタの開始アドレスとかグローバル変数の確保領域アドレスとかの設定ファイルを使うから。
348 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 01:52:00 ] >>347 そうだな。何とか形式のファイルのサマリーを 出してくれるツールがあったな。
349 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 02:57:13 ] よく、C++ における class と struct の違いはデフォルトで private か public かの差しかないって言うけど、本当? class だと継承やらの情報を管理するための暗黙のメンバが最初にくっつかない? class C {int a;} struct S{int a;} C c; S s; を実行してデバッガで c と s の中身見てみるとメンバ違わない?
350 名前:デフォルトの名無しさん [2008/03/05(水) 03:10:19 ] クラスはメンバ関数や、オーバーロードが使えるだろ 構造体の拡張だろう
351 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 03:14:17 ] 本とかだと、class と struct はデフォルトの可視範囲が異なるだけで、 コンパイラレベルでは全く同一ですと書いてある。
352 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 03:16:08 ] >>349 structも継承できるのに何でそこが違うとおもったんだ?
353 名前:デフォルトの名無しさん [2008/03/05(水) 03:16:27 ] 細かいことは気にするな 使う側として同じなら構わないだろう
354 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 03:17:46 ] >>349 大抵の実装では、仮想関数を持つクラス・構造体は、 仮想関数呼出のためのテーブル (vtbl)へのポインタを隠し持っているが、 これもクラス・構造体どちらでも同じ。 規格でも構造体とクラスは完全に同一視され、 構造体について何か独立した規定は存在しない。 全てクラスとしてまとめられている。
355 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 04:19:31 ] full bokko
356 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 07:17:09 ] そして大抵の実装では 仮想関数を持たないクラス・構造体は vtbl へのポインタを持っていない。
357 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 07:38:19 ] >>347 H8やSHでは#pragma stacksize XXX というのがあるので、 スタックサイズはコンパイル時、スタックアドレスはリンク時ということかな。
358 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 08:45:07 ] struct S{ int m_a; int m_b} として m_b に代入しようとして void hoge(void *s){ int offset = sizeof(int); unsgiend char * p = (unsgiend char *)s; int * m_b = p[offset]; *m_b = 1234 } みたいなコードが書いてあると位置がずれて死ぬ訳か
359 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:23:24 ] >>358 いいえ、環境依存です。
360 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:30:41 ] struct S { int a; int b; void clear() { ZeroMemory(this, sizeof(*this)); }; } こういうのもマズイ?
361 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:32:20 ] >>360 いつか POD の規則から外れる変更を加えたときに忘れずに修正する覚悟が必要。
362 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 09:42:56 ] vectorとか追加した場合ですね。 上のほうで出てた、仮想関数を持つクラスを継承して vtbl へのポインタを持ってる場合は>360で問題無しですか?
363 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 10:42:35 ] >>362 仮想関数を持ったものも POD から外れる。
364 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 10:45:50 ] >>357 HEWでそれやってたな。てかconfig入力画面でメモリセクションのカスタマイズできた。
365 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 10:47:58 ] struct S { std::vector m_v; } s; で ZeroMemory(&s, sizeof(S)); ってやって死んだ事がある
366 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 11:46:02 ] コンパイラBCC55 class PPP{ public: union{ struct{ int n; struct{ enum Hoge hoge; int x; }aa[32][32]; LPCWSTR name[256]; }a; struct{ int p; char i; float y; Hoge *o; }b; struct{}c; }data; }; こんな共用体がクラス変数になってる時に PPP ppp; とするとそこでプログラムが例外も吐かずに落ちてしまいます。 しかし、PPPを他のクラスのクラス変数として宣言しておけば落ちません。 class Hoka{ PPP p; }; 分かる人おながいしまつ・・・。
367 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 11:47:00 ] ちなみにenum HogeはPPPの中で定義されてます。すいません
368 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 12:21:18 ] 現象が再現する最小限のソースうp
369 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 14:39:59 ] 今更ですが>>290 のことで vector<int> num; num[i*j]=a; でnum.size()が不定のとき(i*jより小さいときもある)場合 先にnum[i*j]を確保して、num[i*j]=aを入れればよいのでしょうか 確保の仕方を教えてください
370 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 14:46:08 ] >>369 num.resize(100) とかで好きなサイズに変更する
371 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 15:20:53 ] num.resize(i*j)っていうのも可能ってことでしょうか?
372 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 15:28:07 ] >>368 最小限が分かりづらいのでエラーの出ないnewで代用しました。
373 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 15:58:15 ] >>371 可能だが resize(i*j) ではサイズが足りないと思うぞ
374 名前:デフォルトの名無しさん [2008/03/05(水) 16:14:35 ] もっとも使われていないバッファを解放したいのですがSTLなどで良いライブラリはありますか?
375 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 16:53:00 ] >>374 せめてもうちょっと具体的に言わないとどうにもならないと思うよ
376 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 16:57:59 ] LRUを実装するのに適したコンテナはどれでしょうかってことだとエスパーしてみる JavaのLinkedHashMapみたいなやつ? STLにそれはないから、mapとlistを組み合わせるのかな・・
377 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 18:39:44 ] 3次元配列(texture)を動的に確保しようと if( (int)texture.size() < ( temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1] ) ) texture.resize(temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1]); texture[temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1]] = num; こうしたら、格納されません。 現在の3次元配列の幅よりも、大きいのが出てきたら値を取り直して、入るべき所にぶち込む ってことをやりたいだけなのですが
378 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 18:58:40 ] >>377 サイズが 10 だったら、有効なインデックスは 0〜9 だ サイズが temp[0] + .... *maxValue[1] だったら、 有効なインデックスは 0 〜 temp[0] + .... *maxValue[1] - 1 までだ
379 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:07:20 ] >>378 ありがとうございます、それが抜けていました ただ 0 0 0 があったときに格納できないというエラーが出てきて 後少しなのに
380 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:20:23 ] class Aを例外として投げるとき throw new A; のようにnewで生成して投げるのと throw A(); と投げるのはどっちが良いのでしょうか?
381 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:25:04 ] 自プロセスのHWNDを取るにはどうしたらいいのでしょうか?
382 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:25:10 ] むかーしどっかで見たのですが、3次元以上の配列は使わない方が良いってどういうことでしょうか? ソースがどこだったか覚えてないのですが、そのときの記憶があり3次元以上はなるたけ使わないようにしてる原状です
383 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:27:31 ] あんま多いと気づかずやらかす類のバグが増えるかも…しれないけど決定的な理由じゃねえよな
384 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:37:17 ] >>380 Javaと一緒にすんな
385 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 19:57:35 ] >>382 その配列が表すモノが本質的に3次元以上のモノなら3次元配列で良いけど 構造体やクラス等で表すべきモノを配列にしてしまうのは避けるべき
386 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 20:47:36 ] 数値計算で添字3つ以上の行列とか扱わない限り、 まず必要になることはないと思うけどね。
387 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 20:52:58 ] >>380 newするとどこかでdeleteせんといかんよ。
388 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 21:29:17 ] >>380 new はしない。
389 名前:デフォルトの名無しさん [2008/03/05(水) 22:04:19 ] #define SAFE_DELETE(p) {delete (p); (p)=NULL;} を定義して、 SAFE_DELETE(ptr); とすると「構文エラー : ';' が〜の前にありません」のエラーになってしまいます。 delete ptr;なら普通にコンパイルできるのですが、 どこが悪いのでしょうか。
390 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:06:01 ] ちょっと行き詰まってしまったので質問させて下さい。 VC2005、WinXP64で以下のようなプログラムを作ったのですが、うまく動いてくれません。 DWORD WINAPI ThreadPrc(LPVOID lpParameter) { while (!ThreadTerminated){ //要求があるまで待機 WaitForSingleObject(hEventHandle,INFINITE); if (ThreadTerminated) break; //共有オブジェクトの排他アクセス WaitForSingleObject(hMutexHandle,INFINITE); //適当に処理 ReleaseMutex(hMutexHandle); //処理が終わると相手に通知 //ここがおかしい SetEvent(hDoneEventHandle); } return 0; } 普段はDelphiでやってますが、64ビットでビルドする必要があったので、Delphiで作ったものをC++に移植しました。 プロセス間通信でいろいろやってるわけなのですが、同じところでいつもタイムアウトしてしまいます。 もちろんINFINITEにするとそのまま固まってしまいます。 32ビットプロセスでSetEventして、64ビットプロセスでWaitForするのは成功するのですが、その逆がうまくいかないのです。 VC固有の問題なのか、64ビットの問題なのか、関係ありそうなのは調べましたが全く原因が分かりません。 この部分さえうまくいけば完成なのですが・・・。 どなたか分かる方いましたらアドバイスお願いします(o*。_。)o
391 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:09:05 ] >>389 SAFE_DELETE(ptr); は {delete (p); (p)=NULL;}; に展開される。 } の後に ; があるのがポイント。 これで何か起こってんじゃね?
392 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:12:09 ] >>389 問題の起こる最小のコードをplz!
393 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:17:54 ] >>389 うちの環境だと普通に動いてしまったよー。 周りを疑ってみるべき
394 名前:331 mailto:sage [2008/03/05(水) 22:18:39 ] なるほど! 分かりやすい説明ありがとうございましたm(_ _)m
395 名前:389 mailto:sage [2008/03/05(水) 22:20:21 ] 周りを少し抜き出すとこんな感じです。 -----SystemMacro.h---------- #ifndef SYSTEMMACRO_H #define SYSTEMMACRO_H #define SAFE_DELETE(p) {delete (p); (p)=NULL;} #endif ------List.h---------- #include <windows.h> #include "../system/SystemMacro.h" template <class T> class List { public: virtual ~List(){ if(!_tempFlg) { WORD i; for(i=0; i<_ct; i++) { delete _arr[i]; } } SAFE_DELETE(_arr); //←ここをdelete _arr;にするとコンパイル通る } }; ※Listのメンバ変数は省略してます。
396 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:21:28 ] template <typename T> void SafeDelete(T *& p) { delete p; p = NULL; }
397 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:23:00 ] なんか怪しげなコードだが _arrの型は?
398 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:24:06 ] どーでもいいけど _ は変数名の前につける習慣は良くない。 つけるなら後ろに。
399 名前:389 mailto:sage [2008/03/05(水) 22:25:12 ] あ、_arrがテンプレートの、T**型なのですが、 それが悪いのでしょうか。
400 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:29:21 ] fmtflags setf(fmtflags flg, fmtflags mask); 関数の説明で、この関数は flags((flags() & ~mask) | (flag & mask)); のような処理をしている、と書いてあったのですが、 flags((flags() & ~mask) | flag); でも同じではないでしょうか? なぜわざわざ(flag & mask)と書いてあるのでしょうか。
401 名前:389 mailto:sage [2008/03/05(水) 22:37:45 ] >>396 ありがとうございます。 >>397 template <class T>のT**型です。 >>398 とあるJavaのソースでクラスのメンバ変数の先頭に_をつけてたのを真似してます。 C言語はまだ初めたばかりな上、グーグルと2chで全て学んだので、 基礎がなってないのですが、先頭_はなんで不味いんでしょうか。 上のListクラスの機能は、たぶんstd::vectorとほぼ同じです。 標準ライブラリというのを知らなくて、作ってしまいました。
402 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:38:32 ] >>400 > 同じではないでしょうか? いや、同じじゃないから。
403 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:43:14 ] だれか>>391 に突っ込んでやれよw >>401 「_」始まりの単語はシステム予約される可能性があるから。
404 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:45:19 ] pは何処から出てきた? でいいのかな。
405 名前:389 mailto:sage [2008/03/05(水) 22:49:40 ] >>403 ありがとうございます。 }の後ろに;をつけても、うちの環境では動きました。
406 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:06:52 ] レスありがとうございます。 fmtflags setf(ios::hex, ios::basefield); で、 ios::hex が 0x0800 ios::bsaefield が0x0e00 とすると、 ios::hex & ios::basefield で、 0000 1000 0000 0000 と 0000 1110 0000 0000 の論理積なので、 0000 1000 0000 0000 で、結局 ios::hex(0000 1000 0000 0000) そのものと変わらないじゃんと思ったのですが、どこかで勘違いしているのでしょうか。
407 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:08:47 ] >>406 > 論理積なので、 いや、違うから。
408 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:14:46 ] とりあえず SAFE_DELETE(_arr); を {delete (_arr); (_arr)=NULL;}; に置き換えてコンパイルが通るかどうか。 あと、コンパイラは何?
409 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:16:54 ] >>400 flgは立てたいビット、maskはflgの属するフィールドを指定するが、 flgがmaskのフィールドに属さなかった場合に、 余計なフィールドのビットを立ててしまうのを防ぐため。
410 名前:デフォルトの名無しさん [2008/03/05(水) 23:24:26 ] 質問させて頂きたいのですが、 このように宣言しましたが、 char a[] = "1234"; char b[] = "4567"; char* abc[2][255]={ a, b }; *abc[1]で値が取り出せません。 こういうやり方は無理でしょうか?
411 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:30:23 ] >>410 abcはポインタが二次元に並んだ配列だが、それでいいのか? やりたいのは、ポインタの一次元配列のように見えるが。 つまり、こう。 char* abc[2] = {a,b}; そうしたら、 *abc[0]は'1' になる。
412 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:47:55 ] >399 >あ、_arrがテンプレートの、T**型なのですが >395を見ると delete _arr[i]; とあるから、_attrは new[] で確保したアドレスを前提としていないか? それなら delete ではなく delete[] とすべき。 コンパイルエラーの件とは無関係だが。
413 名前:デフォルトの名無しさん [2008/03/05(水) 23:55:17 ] 411> おっしゃるとおり二次元配列のポインタですね。 全然気がつきませんでした。 ありがとうございます。
414 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 00:16:05 ] >389 とりあえず本論とは別だが、その手のマクロは if(flag) SAFE_DELETE(p); else do_something(); みたいにするとエラーになるのでしばしば #define SAFE_DELETE(p) do { delete (p); (p) = NULL; } while(0) のように定義されることが多い。
415 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 00:23:46 ] この場合なら #define SAFE_DELETE(p) ((void)(delete (p), (p) = NULL)) でもいいと思うけどね。 まあ、式中に書けるのが嫌だというのであれば、 do-while 使ったのでもいい。
416 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 00:50:58 ] SAFE_DELETEを使ってるのを見ると ああ10年前に学ぶのを止めてしまったんだなと分かる 自分自身がSAFE_DELETEされてしまったんだ
417 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 03:06:00 ] >416 ちなみにトレンドは?
418 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 03:32:56 ] 416じゃないけどshared_ptrとかじゃないの
419 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 03:44:42 ] ずっと前から auto_ptr と vector によって delete の出番はほとんど無くなっている。
420 名前:417 mailto:sage [2008/03/06(木) 04:10:27 ] ああ、そういう意味でか。勘違いしてた、さんきゅ。
421 名前:デフォルトの名無しさん [2008/03/06(木) 06:12:17 ] ガベージコレクションの緩いやつの理論はありますか? たとえばファイルに書き出すために複数のバッファを用意したとして もう書き込みが発生しないだろうと予測されたら書き出してメモリを解放するというやつです
422 名前:デフォルトの名無しさん [2008/03/06(木) 06:15:54 ] 100ファイルに書き込みがあって試行するうちに総数の10%のみの書き込みだけになったら それ以外は書き込みがないだろうと思って解放したいのですが、タイミングをいつにするか具体的に計算する方法は ありますか
423 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 06:49:42 ] LRUでぐぐればいいんじゃない?
424 名前:デフォルトの名無しさん [2008/03/06(木) 07:02:10 ] ちょっと違うんです たとえばバッファは10個なら、10個前が一番古いですが、11個目の後 1〜10番が続くかもしれないじゃないですか もっとも利用されなかっただけではなく、バッファサイズを増したほうがいいかも調べたいんです
425 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 09:24:11 ] 最終使用時間を記録しといて、N秒以上使われてなかったら削除 とかでいいんじゃない?
426 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 14:33:28 ] >>419 それって大問題なんじゃなかったっけ?
427 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:20:10 ] 質問でございます。 int* A_PTR = new int[5]; として確保した領域の、たとえば、A_PTR[3]のような、 途中の領域だけ解放(delete)することは可能でしょうか?
428 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:45:33 ] >>427 無理
429 名前:427 mailto:sage [2008/03/06(木) 16:59:15 ] >>428 やはり無理なんですね。 別のポインタに入れてからdeleteなど、 いろいろ実験していて気が狂いそうでしたので 大変すっきりしました。 れす、ありがとうございました。
430 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:32:23 ] CString cstr; unsigned char uc[sizeof(cstr)] = (unsigned char)(LPCSTR)cstr; コンパイル通りません。要は、↓を動的にしたいです。 unsigned char uc[10]="0123456789"; よろしくおねがいします
431 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:39:19 ] 配列のサイズを動的に変えるのは無理です。 ヒープで取って良いのなら、 char* uc = new char[文字列の長さ+1]; strcpy(uc, コピーしたい文字列へのポインタ) でもしてください。
432 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:41:23 ] これではだめ? unsigned char* uc = (unsigned char*)(LPCSTR)cstr;
433 名前:430 mailto:sage [2008/03/06(木) 18:04:24 ] >>431 やっぱり無理ですか。。 >>432 uc[0],uc[1]みたいに、ポインタではなく配列としてアクセスしたいんですよね。。 なんか根本的に駄目なソース書いてる気がしてきたので、発想を変えてみます。 どうもありがとうございました。
434 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 18:06:06 ] 動的に大きさを変えたいならstd::vector使えばいいやん。
435 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 18:06:34 ] あ、文字列ならstd::stringな。
436 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 18:09:14 ] >>433 添え字演算子はポインタでも使えるけど。
437 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 18:29:09 ] >>433 E1[E2] は *((E1) + (E2)) の syntax sugar だ。 uc[0] → *(uc + 0) uc[1] → *(uc + 1)
438 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 20:40:20 ] uc[0] → *(uc + 0) → *(0 + uc) → 0[uc] uc[1] → *(uc + 1) → *(1 + uc) → 1[uc]
439 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 20:43:02 ] >>438 さんざん既出 "0123456789ABCDEF"[i] を大昔はやっていた。
440 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 20:44:58 ] それは関係ないだろう・・・。 i["0123456789ABCDEF"] ならともかく。
441 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 20:48:59 ] >>440 おんなじやんけ
442 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 20:49:41 ] あま〜〜〜い
443 名前:389 mailto:sage [2008/03/06(木) 22:58:20 ] みなさん色々とアドバイスありがとうございました。 >>408 通ります。Visual Studio.NET 2003を使ってます。 >>412 _arr = new T*[_max];という感じで確保してます。 delete[] は使ったことないですが、やってみます。 >>414 それは思いつきませんでした。 >>415 その書き方は初めて見ました。 >>416 10年前というか、C言語始めてまだ1ヶ月半なんですが。。。
444 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:05:22 ] アレだ、「個体進化は系統進化を繰り返す」
445 名前:デフォルトの名無しさん [2008/03/06(木) 23:10:44 ] 以下のコードでファイルの2番目のバイトだけを 書き換えようとしたんですが 全く何も代わりません #include <stdio.h> int main(void){ FILE *fp; char cIn; char cOut = 'X'; int cnt; fp = fopen("test.txt", "rb+"); fread(&cIn, 1, 1, fp); printf("%c\n", cIn); cnt = fwrite(&cOut, 1, 1, fp); printf("%d\n", cnt); fclose(fp); return 0; } <test.txtの内容↓> ABCDEFG <出力結果↓> A 1 これはどう理解したらいいんでしょうか? BCとVCで試してみました
446 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:20:59 ] freadしてA読んで、表示した(出力1行目) fwriteして次のBをXで上書きして、(test.txtの中身変化) 要素数の1が戻ってきて表示(出力2行目) 何が不思議なんだ?
447 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:21:31 ] >>445 readからwriteに切り替える時、もしくはwriteからreadに切り替える時は 必ず間にfseek()を挟む事。
448 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:39:54 ] >>445 コンパイル君のぼやき 「freadとfwriteに&使わないで下さいよ。あと、辞書ぐらい買ってくださいよ。 何でもかんでも私に聞かないで下さいよ。なんでもかんでもプリントにしないでくさいよ。 宣言するんだったらまともに宣言してくださいよ。main関数の引数ぐらい使ってくださいよ」
449 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:43:29 ] Visual C++についてなのですが、 分割コンパイルについていまいちよくわかりません。 main.ccp ClassA.ccp Def.h ClassA.h resource.h と5つあって、 main.ccpではDef.hがインクルード、 ClassA.hでもDef.hがインクルードされ、Classの宣言と、インラインでのメンバの定義、 ClassA.ccpではClassA.hとDef.hがインクルードされています。 また、Def.hではresource.hがインクルードされているほか、#ifdnefを使って重複しないようにしています。 ビルドをすると、C2143構文エラーなど、ものすごい沢山のエラーが出てきてしまいます。 このようにヘッダとソースファイルを分割する場合、どのようにインクルード等をすればよいのでしょうか。
450 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:48:48 ] > ClassA.ccpではClassA.hとDef.hがインクルードされています。 とりあえずこのDef.hはインクルードしなくていいいような・・・
451 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:49:48 ] >>449 その文面だけを見る限り、ファイル分割のしかたもインクルードの仕方 も問題ないよ。エラーが出るのはファイルの内容がどこか間違っている とか、何かの定義が足りないとか。
452 名前:デフォルトの名無しさん [2008/03/06(木) 23:51:02 ] newを使って確保した領域をポインタとして返す関数を作ったんですけど、開放するにはどうすればいいんですか? 個人的には↓の方法でできるような気がするのですが、できるかどうか心配なので教えてください char *func(){ char *buf = new char[1024]; //bufにデータを入れる return buf; } int main(){ char *ptr = func() //ptrであんな処理やこんな処理 delete [] ptr; }
453 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:51:16 ] 膨大な数のエラーと聞くと、本当に何か書き間違えている気がする。
454 名前:デフォルトの名無しさん [2008/03/06(木) 23:55:48 ] 初心者も上級者もnew使うならクラスでつかえよな 解放する方法を間違えたり、しなかったりする クラスならデストラクタがする
455 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:56:25 ] >>452 どうでも話にはなるが、 メイン関数のファンクがカマを彫られたって泣いてるが、 わかっててほられたのかほられてないのか気になる。
456 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:56:44 ] >>452 それで特に問題はないが、 void func(std::vector<char>& buf) { buf.resize(1024); // buf にデータを入れる } int main() { std::vector<char> buf; func(buf); // buf であんな処理やこんな処理 } とやった方が面倒がないし例外とかあっても確実にメモリが解放されるから安全で便利。
457 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:57:05 ] >>454 それ・・・なんの冗談?
458 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:57:48 ] 日本語はおかしいが、要するに RAII ってことじゃね?
459 名前:デフォルトの名無しさん [2008/03/06(木) 23:58:43 ] string buf buf.reserve(1024) &buf[0] でも良い
460 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:59:30 ] それはちょっと・・・。 length 変わらないじゃんか。
461 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:59:47 ] >>451 あってますか… 1行目初っぱなから Naive_Grid_Class.cpp(4): error C2143: 構文エラー : ';' が 'NaiveGridCtrl::ChkhCtrl' の前にありません。 などと出てきて(下のようなコード) #include "DefHeader.h" #include "Naive_Grid_Class.h" BOOL NaiveGridCtrl::ChkhCtrl(){ return (BOOL)hCtrl; } もう何が何だかさっぱりなんですが…
462 名前:デフォルトの名無しさん [2008/03/07(金) 00:01:05 ] >>457 class ABC { char *buf; ABC(){確保} ~ABC(){解放} }; main(){ ABC x; } とやれば簡単って事
463 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:03:17 ] 呼ばれたタイミングだけでnewしたいとは限らんだろうに
464 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:04:43 ] >>461 class NaiveGridCtrl の最後の ; を忘れているんじゃないか?
465 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:08:16 ] 質問です。 前から思ってたんだけど、 メモリの解放以外にデストラクタって使い道あるの?
466 名前:デフォルトの名無しさん [2008/03/07(金) 00:09:25 ] データの残りを書き出す
467 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:11:43 ] リソースの開放
468 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:22:56 ] 質問です。 C++で住所録を作っているのですがソートができません。 構造体に名前、住所、年齢、電話番号・・・など 項目ごとに入れるところまではできたのですが、 名前、住所、年齢、電話番号・・・など項目ごとに分かれているので、 名前なら名前だけがソートされてしまい他のはそのまま。 名前をソートしたらその順序で他の項目が付いてくるようにするには、 どうしたらいいのでしょうか。
469 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:24:16 ] >>468 まず、どうやってソートしてるんだ? そこのプログラムみせてみ
470 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:24:24 ] >>468 え?なんでそうなるのさ? ソートした順に構造体を並べ替えればいいだけじゃんw
471 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:25:22 ] 名前だけ入れ替えてるんじゃねw
472 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:26:52 ] 構造体にしてる意味がねぇw
473 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:27:37 ] 名前をソートするんじゃなくて、名前のソート順通りに構造体のオブジェクトをソートするんだ。
474 名前:デフォルトの名無しさん [2008/03/07(金) 00:33:47 ] int i = 1; while(i <= 10){ fout[i].open("dat$i.dat"); fout[i] << i <<'\n'; i++; } てな感じでデータファイルを10個作りたいのですが、 ""の内のiは変数と見てくれなくて困ってます。 何かいい方法ありませんか??
475 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:36:20 ] >>474 あたりまえだろw こうすればいい char filename[100]; sprintf( filename, "dat$%d.dat", i ); fout[i].open( filename );
476 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:36:50 ] >>474 stringstream
477 名前:デフォルトの名無しさん [2008/03/07(金) 00:37:46 ] >>468 #include <iostream> #include <string> #include <set> using namespace std; class memberlist{ public: string name; string tel; string adress; memberlist(string a, string b,string c){ name=a; tel=b; adress=c;} bool operator<(const memberlist& a)const{ if(name<a.name)return 1;return 0;} }; main(){ set<memberlist> x; x.insert(memberlist("山田太一","030000000","東京都")); x.insert(memberlist("明石家明","077777777","沖縄県")); x.insert(memberlist("佐藤一郎","051111111","大阪府")); set<memberlist>::iterator p; for(p = x.begin(); p!=x.end(); p++){ cout<< p->name <<" "<< p->tel <<" "<< p->adress <<endl; }}
478 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:41:10 ] >>463 どちらにしろ管理クラスに入れとけば デストラクタが勝手に delete してくれるだろ。
479 名前:445 mailto:sage [2008/03/07(金) 01:06:00 ] みなさんドモドモ >>447 それそれ。それです。 fseek(fp, 0, SEEK_CUR); が必要みたいなんですが これがわからない。 カレントポジションから0バイト進めるのは 何もしないのと同じなのではないのでしょうか? OSのAPIなどの場合 readしてそのままwriteする事でファイル位置が 自然に進む事が多い気がする訳ですが この仕様はよくわからないです これはC(ライブラリ)の明示された仕様なのでしょうか?
480 名前:445 mailto:sage [2008/03/07(金) 01:12:39 ] そうそう。あと一つ・・・ fwriteで1バイト書き込めたはずなのに その1バイトはどこへ行ってしまったんでしょうか・・・
481 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:13:18 ] >>479 APIと違って、バッファリングするのが前提だからfseek()などでバッファを同期を取ることに決められている。
482 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:16:55 ] >>461 Naive_Grid_Class.h の最後に ; が足りないとか、 BOOLの定義がどこにもないとか。
483 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 01:17:54 ] >>480 同期を取っても書き換わらない?
484 名前:デフォルトの名無しさん [2008/03/07(金) 01:22:57 ] >>475 そのようにすれば、できました! ありがとうございます。 >>476 stringstreamも勉強します。
485 名前:445 mailto:sage [2008/03/07(金) 01:49:51 ] >>481 なるほど。仕様ですか・・・ 多分FILE構造体の内容とかから必然なのかな? 直感的には把握が難しかったです >>483 fseekはさめば書き換わりますが、 はさんでなくてもfwriteの結果が1というのが 納得いかず・・・ 試しにfread/fwrite/fseek(fp, 0, SEEK_END) というのもやってはみたけれどやはり書き換わらず・・・
486 名前:デフォルトの名無しさん [2008/03/07(金) 02:03:11 ] int main(){ fin.open("aaa... fout.open("bbb... function(....); } function(.....){ fout << "thanks" <<'\n'; } のようにmain関数でデータファイルを開いて、 function関数の中に開いたファイル持ってきて、書き込みたいんですけど。 どうするのがいいのでしょうか?
487 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 02:11:36 ] >>486 ストリームを引数にとればいいんじゃねーの?
488 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 02:23:55 ] >>486 ストリームを大域変数にすればいいんじゃねーの?
489 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 02:48:25 ] >>486 ストリームを参照で取る constで取ったらあかんよ
490 名前:デフォルトの名無しさん [2008/03/07(金) 03:42:36 ] >>486 (ofstream& fout[], ifstream& fin[]) ってことですか?? 参照型の配列は許されないとかなるんですが。。。 困り果てた。
491 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 03:47:08 ] >>490 何故いきなり配列に? >486では一言もそんな話が……
492 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 03:50:43 ] >>490 常考参照のポインタだろ *&fout
493 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 04:00:42 ] #include <iostream> これで通る #include <fstream> void sub(std::fstream* f) { f[0]; } int main() { std::fstream f[10]; sub(f); }
494 名前:デフォルトの名無しさん [2008/03/07(金) 04:17:54 ] >>493 すいません、素人目からはさっぱりなんですが。。。 fout,fin???どうなったのでしょうか??
495 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 04:25:17 ] >>494 配列だったらリファレンスではなくポインタで渡せばいいだけの話。
496 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 04:28:51 ] >>494 あんた>486=>490? >489に答えがあるのに、それをどう曲解したのか>490になって、 >491の質問を無視して>494みたいなこと言われても最早誰も対処できないぞ。
497 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 07:12:46 ] もらった回答をすっ飛ばす奴の神経がわからんね。 漢字読むのが面倒臭いからって、上の行↑を「もらったをすっばすのがわからんね」と読んで 「うーん、さっぱりわかりません」とか一人で勝手に困ってるようなものだろ。
498 名前:デフォルトの名無しさん [2008/03/07(金) 08:49:37 ] どっちでもいいといえば どっちでもいいのですが、 現在ゲームを作ってまして、敵の動きを実装するのですが、 C言語で関数のポインタを保持し、タイミングが来たら 保持していた関数を呼び出すのと C++で、基本のクラスを用意し、それから派生してポリモーフィズムで呼び出すのと どちらが良いでしょうか 開発規模は個人なのでそれほど多くならないです、ですがまだ、仕様が決まってないのでなんともいえないのです。 なにが不満かというと Cだと 関数だらけになってしまう C++だと 開発に時間がかかったら保守が大変そうなことです
499 名前:デフォルトの名無しさん [2008/03/07(金) 09:01:36 ] 作ったことがないが、C++に一票
500 名前:デフォルトの名無しさん [2008/03/07(金) 09:03:21 ] 迷ったらC++。これ鉄則。
501 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 10:54:41 ] >>498 Commandパターン or Callback by template
502 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:07:04 ] くだらない質問で申し訳ありません。 namespace myname{ hogehogehoooge; }; //← namespace mymyname{ hagehagehaaage; } //← コンパイル自体はどっちでも通ったのですが、どっちが本来の文法的に正しいのでしょうか。
503 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:25:44 ] コンパイラ的には上のセミコロンは空文があるってだけかと
504 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:43:35 ] >503 なるほど、納得しました。
505 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:33:34 ] 物凄くくだらない質問なのですが教えてください double x=1.0; int y = 10000; int z = y * x; この場合z=yって成り立つのでしょうか?
506 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:36:02 ] >>505 成り立つよ 浮動小数点の誤差がどうとか言う観点だよな?
507 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:57:06 ] はい、そうです ありがとうございました
508 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:07:28 ] メンバに変数しかないクラス(ようするに構造体)を継承して、 それらのポインタをdynamic_castしたい場合、親クラスに virtualな関数を無理やり入れておくしかないのでしょうか?
509 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:09:33 ] >>508 dynamic_castの意味分かって言ってる?
510 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:10:34 ] >>508 手っ取り早く済ませたいならそうだね。 手間がかかってもいいなら、たぶん dynamic_cast の必要性を 見直したほうがいいんだろうけど。
511 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 15:23:55 ] >>509 ,510 関数テーブルで引数が違う関数をまとめる場合に、 引数型を全部派生にして親クラスのポインタを 受け取るようにしとくと、キャストミスも無くて便利かなと 思ったんですが。 多分設計見直したほうが良いパターンなんでしょうね。
512 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 15:49:54 ] デストラクタを仮想にしておけば良いんじゃないかな このパターンで自分もはまったな 引数に<list>をとるか可変長引数とか配列とか色々やり用はあるな
513 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:23:58 ] >>511 つテンプレートの特殊化
514 名前:468 [2008/03/07(金) 16:44:37 ] www.borujoa.org/upload/source/upload17235.txt すみません。ド素人のプログラマですが、質問です。 なるべく上のファイルを利用してファイルソートを行いたいのですが、 これからどうすればいいのかわからず手が止まっております。 ソースではなく文章でいいので答えていただけますか? filesortがファイルをソートする関数部分です。 つまりVectorとsortを使って何とかしたいわけですが、 この書き方であると要素ごとでしかソートできません。 もちろん要素だけのソートはできました。 なんかあとちょっと弄ればできそうな気がするんですが、 僕の脳ではどうしようもありません。 どなたかご指導ください。 私的にはsetさえ使えば100人力じゃぁみたいな感じになるので、 setを使いたくありません。その点も含めてよろしくお願いいたします。 あとこのソース見て「ここをこうした方がいいのでは?」と思う人はご指摘ください。 よろしくお願いいたします。勉強になります。 開発環境:CentOS 5 コンパイラ:g++ コンパイルエラー:無し
515 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:49:15 ] クラスについてさっぱりわかってないからこんなこと思うのかも知れませんが、 クラスの公開メンバ関数のアドレスを外部に教えてあげて、 そこから直接クラスの関数にアクセスすることってできますか? 具体的に言うと、Wik32APIでの、ウィンドウプロシージャに、クラスのメンバ関数を使いたいのですが…
516 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:06:28 ] >514 filesortの中身をちらっと読んだだけ。 ・カンマ区切りを取り出す常套手段は 1:スペース記号、タブ記号をすべて別の文字列で一旦置換 2:カンマ記号をすべてスペースに置換 3:stringstreamに流し込んで >> を使って読み込む 4:1:で入れ替えてたのを元にもどす です。こうした方がいいです。 ・名前を入れ替えたいだけじゃないんですよね? 今のあなたのファイルは「名前データを取り出して、それをベクターに格納。そのベクターをソート」 している「だけ」ですよ。 あきらめてsetを使うか、set相当のものを自分で書くか、 そうでなければsort相当のものを自分で書いてください。 ・fin>>temp この部分は、もし入力ファイル中にスペースがあると困るのではないかと。 nameに「Richard Feynman」って入ったら、Richardで切れますけど、いいんですか? 一行取り出したいならgetlineを使いましょう。
517 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:07:45 ] >>511 普通の関数は仮想にするなよ つEffective C++ 第38項 ダウンキャストはやめよう つEffective C++ 第39項 というかEffective C++を購入して一読する事を強く勧める。
518 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:12:53 ] >>515 メンバ関数の実装は、クラスのポインタを引き渡していることが多い。 (thisポインタが引数としてわたっている)。 よって、関数ポインタを取ってきたところで、メンバ以外からマトモに使えません。
519 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:31:14 ] >>513 511じゃないが参考までにどういう形で実装するのか教えてくれませんか? テンプレートを使った経験がないのでどういう風に使うのか見当がつきません
520 名前:452 mailto:sage [2008/03/07(金) 18:21:57 ] >>455-456 亀ですがレスthx Winsockと同時に使うから文字列をstd::stringじゃなくてchar*で使ってたんですが、 例外処理さえつければ>>452 のコードで大丈夫ですよね あと、>>455 のカマを掘られたって言うのがどうことかちょっと気になるんですが・・・
521 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:07:56 ] >>518 やっぱ駄目なんですか。 共通プロシージャ用意してmapしたのを検索する方向で考えてみます。
522 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:31:55 ] >>515 web.archive.org/web/20070810174250/http://techtips.belution.com/ja/vc/0009/
523 名前:デフォルトの名無しさん [2008/03/07(金) 19:42:31 ] >>521 staticなメンバ関数なら問題ない
524 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:48:12 ] >>523 staticメンバ関数はstaticなメンバしかイジれないじゃん。
525 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 20:31:15 ] >>524 そうだよ。単にクラスという名前空間に閉じ込め、 protected/privateにできるという程度の意味しかない。 どっかからインスタンスへのポインタを得て、非静的なメンバ関数を呼ぶのが 静的メンバ関数のウィンドウプロシージャの仕事。 >>522
526 名前:デフォルトの名無しさん [2008/03/07(金) 20:34:15 ] >>524 オブジェクトを作らずに呼び出そうとしてるんだからメンバなんていじる必要ない気が
527 名前:デフォルトの名無しさん [2008/03/07(金) 20:42:15 ] >>515 サンクという手法でウィンドウプロシージャを書き換えて、ウィンドウハンドルの代わりにthisをスタックに積んでメンバ関数にジャンプさせれば?
528 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 20:47:14 ] boost::function
529 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:35:51 ] >>528 どうやってやるのさ
530 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:38:29 ] >>523-527 あ、オブジェクトではなく、クラスにひも付けすればよいのですね。 有り難うございました!
531 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:39:03 ] とあるクラスの派生クラス郡の中で一つの派生クラスだけ 関数の引数が異なることになってしまいました こういう場合はどうしたらよいでしょうかorz
532 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:51:31 ] 設計しなおす
533 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:52:10 ] >>531 全クラスに引数増やすとか(そしてデフォルト引数をつけておくとか)、 その派生クラスだけ別のメンバ関数で余分の引数を設定しておくとか、 引数の集合を何かクラスにまとめて、上位の概念に置き換えることで引数を共通にするとか。
534 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:53:54 ] dynamic_castしろと悪魔が囁いているぜ
535 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:56:46 ] >531 1. きっとやりたいことが間違ってるから考え直す。 2. boost::any とか boost::variant とかでぶちかます。 まぁもう少しやりたいことを詳細に説明するべきだろうね。
536 名前:531 mailto:sage [2008/03/08(土) 02:14:02 ] とある計測器と連携して、とあるプロセスを監視してそのデータをモニタに表示するのですが 今回のプロセスだけ表示させたいパラメータの数が増えてしまいました 監視プロセスが複数同時に走っていて、そのうち3つを同時に表示するようにするため 表示対象をユーザーが切り替えられるようにするため 表示クラスに監視クラスのポインタをつかって保持させています 監視クラスに GetData(int OutputA, int dataB,int dataC) という関数をよういしていたのですが 最新の計器が監視できるパラメータが増えてしまって・・・orz
537 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 02:22:28 ] >>536 そのシグニチャでGetだと言うのなら、参照かポインタ渡しじゃないの? まあそれはいいとして。 パラメータの種類を指定して、データを1種類だけGetする関数を作ったら?
538 名前:デフォルトの名無しさん [2008/03/08(土) 02:38:59 ] void calc(int& m, fstream* fio); int main(void) { fstream fio[10]; char filename[10]; int m, steps; steps = 7; fio[0].open("calc0.dat"); m = 1; while(m <= steps){ sprintf(filename, "calc%d.dat", m); fio[m].open(filename, ios::in | ios::out); m++; } m = 1; while(m <= steps){ calc(m, fio); m++; } return 0; }
539 名前:デフォルトの名無しさん [2008/03/08(土) 02:43:13 ] void calc(int& m, fstream* fio) { int i, j; int a, d[100]; j = 1; while(j <= 3){ fio[m-1] >> a; d[j] = a; j++; } j = 1; while(j <= 3){ fio[m] << d[j] <<' '<< j <<'\n'; j++; } } calc0.datの中身 5 16 77 基本的にすべてのデータファイルが同じになるようにプログラムを書いたのですが。 うまくいかないです。どこか間違っていますか?
540 名前:デフォルトの名無しさん [2008/03/08(土) 02:43:52 ] void calc(int& m, fstream* fio) { int i, j; int a, d[100]; j = 1; while(j <= 3){ fio[m-1] >> a; d[j] = a; j++; } j = 1; while(j <= 3){ fio[m] << d[j] <<' '<< j <<'\n'; j++; } } calc0.datの中身 5 16 77 基本的にすべてのデータファイルが同じになるようにプログラムを書いたのですが。 うまくいかないです。どこか間違っていますか?
541 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 09:11:50 ] >>540 >どこか間違っていますか? あんたの説明。 結果がどうなったのか、どうなるつもりだったのか(これは全てcalc0.datと同じになるということか)、 実行した環境と処理系は何か、位のことは書いても罰は当たらんよ。
542 名前:511 mailto:sage [2008/03/08(土) 11:33:07 ] 昨日の続きなんですが、引数のの違う関数を まとめた関数テーブルって、どう実装するのが 良いでしょうか? >512のようにlistや可変長引数だと、個数が 違う場合には有効ですが、構造体を渡す場合には 無理があると思えます。 (構造体の要素をPOD型に分解してlist化するとか?) >513で書かれた特殊化では、どう実装するのかが 全く閃きませんorz キャストを使う以外で違った構造体やクラスを スムーズに(できれば低コストで)渡す方法ってあるのでしょうか?
543 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 11:41:16 ] >>542 昨日の続きと言われても状況を把握するために過去に遡って読むのは面倒なので目的を詳しく。 まぁ、よくあるGUIライブラリの実装などでは構造体を丸ごと渡すのではなく汎用ポインタを渡す形が多いけどね。
544 名前:511 mailto:sage [2008/03/08(土) 11:42:33 ] なお今自分が使ってた方法だとこんな感じです。 class ArgBase { //引数親 public: virtual ~ArgBase(){}; } class Arg1 : public ArgBase { public: int arg; } //以下必要なだけArgBaseを引き継いだ構造体を作る //関数テーブル typedef bool(*pFunc)(ArgBase*) FUNCPTR; FUNCPTR fuctable[10]; fnctable[0] = Func1; //関数例 bool Func1(ArgBase *pArg) { //これがArg1が必要な関数なら Arg1 *ptr = dynamic_cast<Arg1*>(pArg); if(ptr == NULL) return FALSE; //処理 return TRUE; }
545 名前:デフォルトの名無しさん [2008/03/08(土) 15:49:36 ] 久しぶりにプログラムを組むのですが、初歩的なことが分からないので 教えてください。昔 float a; a=1.0 と1ではなく1.0にしなさいと教わったのですが、その詳しい理由を 忘れました。 どうしてなのでしょうか?
546 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 15:56:19 ] >>545 1.0も中途半端だな。1.0fと書け。 1と書くとそれはint型になる。 1.0と書くとdouble型になる。 1.0fと書くとfloat型になる。 intやdoubleからfloatへの変換は警告が出る可能性があるので、 代入先と同じ型にしておけということ。生成される機械語は同じだろうけど。
547 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 16:23:22 ] >>543 やはり間違わないように気をつけてvoid*で渡してキャストするのが 常套手段なんですかね。
548 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 16:25:25 ] あと、 typedef bool(*pFunc)(ArgBase*) FUNCPTR; じゃなくて typedef bool(*FUNCPTR)(ArgBase*); でしたorz
549 名前:デフォルトの名無しさん [2008/03/08(土) 17:09:29 ] 現在、勉強がてらに、Windows用のクラスライブラリを無意味に作ってるのですが dynamic_castって良い機能ですねぇ 基本クラスに無意味に仮想関数を突っ込まなくても、派生クラスの機能が使えるなんて嬉しすぎる
550 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:12:08 ] dynamic_cast禁止
551 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:12:19 ] は?
552 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:12:46 ] すげークラスライブラリきた
553 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:24:08 ] 俺も今無意味にgtkのラッパークラスライブラリ作ってるよ! Window wnd("sample",MAIN_WINDOW); vBox box(MAIN_WINODW); Label sample_label("sample",MAIN_WINDOW); Button ok_button("OK",MAIN_WINDOW); CREATE(MAIN_WINDOW); ok_button.clicked(func); box << sample_label << ok_button; wnd << box; CONSTRUCT(MAIN_WINDOW); みたいにmain関数の中で書いたらコンパイルが通るようになるやつ。 今マニピュレーター実装中。
554 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:26:54 ] これだから演算子多重定義が叩かれるわけだ。
555 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 17:49:29 ] >>550 ごめんねごめんね(*‘ω‘ *) void __fastcall TForm1::N1Click(TObject *Sender) { TMenuItem* menu = dynamic_cast<TMenuItem*>(Sender); switch(menu->GroupIndex) { case 1: switch(static_cast<TSortDirection>(menu->Tag)) { case sortLarge: break; case sortSmall: break; } break; case 2: switch(static_cast<TLogOutputMode>(menu->Tag)) { case logList: break; case logSingleLine: break; } break; } UpdateTitle(); }
556 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:05:19 ] Cらしいプログラムですなあw
557 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:05:55 ] これなら適切にdynamic_castを使っている場面に見える。
558 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:08:50 ] TForm1とかN1Clickとかいただけない
559 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:17:40 ] すみません。えらく単純な質問なんですが、 C++で「なんでもいいからキーを押すと続行」 というのはどうすれば実現できるのでしょうか? 文字列や数字を読み取らせる方法は知ってますし、 ググればいくらでも出てくるのですが、 「いったん入力待ちしていかなるキーを押しても構わず実行」 という風にしたいのです。 もちろん数字読み取らせて適当な数+ENTERという風に組めば 手間が増えるだけで大体同じことはできるます。 しかし、あるデータの異常値の原因を調べるため、 異常のたびにそのデータをグラフにして打ち出させたいんですが たぶん三万回くらいやらなきゃならないんです・・・
560 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:25:40 ] OSによる
561 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:26:01 ] そこでpdcurses(ncurses)
562 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:27:06 ] enterキーのみ反応でいいならgetchar()でもなんでもいけそうな気がする
563 名前:560 mailto:sage [2008/03/08(土) 18:33:28 ] ありがとうございます。getcharでいけました
564 名前:デフォルトの名無しさん [2008/03/08(土) 18:33:56 ] >546 ありがとうございます。 元がfloatなのにいらないお節介しなくても良さそうなのに。
565 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:34:05 ] 559の間違いです。すいません
566 名前:デフォルトの名無しさん [2008/03/08(土) 18:46:22 ] msxml6.dllを使ってXMLのデータを取得しようと思っているのですが、 要素の属性の取り方だけ分かりません。 どのように取り出せばいいのでしょうか?
567 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 18:48:37 ] >>564 >元がfloatなのにいらないお節介しなくても良さそうなのに。 大きな勘違いをしている悪寒。
568 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:22:34 ] もうなんて言うか、初心者とかそういうレベルですらないんですけど、 昨日小一時間このミスに気づかなくてバグと死闘していたので… int a,c,x; unsigned int b; x = max(-c, min(x, a - b)); としたとき、 (a-b)がunsigned intとして評価されてしまうのですが、 こういうとき、オペレーターの戻り値の語ってどうやって決まるんですか? どこかの本では、大きい方に丸められるとか何とか書いてあった気がするんですが… 実際どのような規則になっているんでしょうか?
569 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:30:35 ] >>568 算術型の標準変換、整数の格上げとか そんなもんどの本にも載ってるだろ。
570 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:30:57 ] >>564 >元がfloatなのにいらないお節介しなくても良さそうなのに。 もとがdoubleの値(1.0)をおまいが勝手にfloat型の変数に入れようとしているのを コンパイラさんは(おせっかいかなと思いながらも)教えてくれようとしている。 レベルアップするためにも、人の忠告は素直に聞こうな。
571 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:35:44 ] >>570 おまえはサル
572 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:37:00 ] サルなら反省できる
573 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:43:39 ] >>570 お前・・・なんという読解力のなさ・・
574 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:46:59 ] >>570 の言うことは間違ってないような・・・
575 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:48:09 ] >>570 は正しい事を言っている気がするが オレも読解力がないのだろうか
576 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:53:38 ] 皆無
577 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:54:05 ] レスをたどると元々は float a = 1; のような気がする
578 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 19:59:33 ] >>577 それだとfloat変数の初期化だよね。 もともとは以下のようにfloat←doubleの代入だったはず。 >float a; >a=1.0
579 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 20:08:18 ] >>569 持ってる本は2冊ともunsignedまでは書いてないんだが… 駄目なの使ってるのね…(一つは学校指定だけど) 算術型 標準変換 でググったら見つかりました、有り難う。 long double > double > float > unsigned long int > long int > unsigned int > int int > unsigned int だとばっかり思ってた。 (表現力が大きい方に…ってかいてあるからマイナスが表現できる方が上なのかと… よく考えてみたら、表現できる値の絶対値はunsignedの方が大きいけど。)
580 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 20:15:02 ] >>566 DOMだったら、selectNodesとかselectSingleNodeとかを使えばいいよ。
581 名前:デフォルトの名無しさん [2008/03/08(土) 21:20:47 ] >578 最初に書き込んだものです。 多分みなさんが思っているよりもっと初歩的なことが 分かっていないのだと思います。 正直doubleとfloatの違いが精度の違いでfloatがメモリ確保の ためだけに使われるぐらいにしか考えていません。 情報落ちや桁落ちの問題でここまでするのでしょうか? 正しい解釈はこうですか? int a; float b; double c; a=1; b=1.0f; c=1.0;
582 名前:デフォルトの名無しさん [2008/03/08(土) 21:23:45 ] >581 すいません。もう少し質問させてください。 何のためにここまでするのかと言う部分です。 情報落ち、桁落ち、丸め誤差、その他 このうちのどれですか?
583 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:31:40 ] おっもくそ大量の数値データを扱うときはdoubleじゃなくてfloatにするなぁ・・・ で、単純に、floatを準備したからにはfloatを突っ込む。と。
584 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:37:28 ] >>581 何をどう解釈しているのか分からないが…。 1や1.0などの定数自身も型を持っていることは理解している? その定数をどの型の変数に代入するかに無関係に、定数自身が型を持っている。 1 ← int型 1U ← unsigned int型 1.0 ← double型 のように。 >情報落ち、桁落ち、丸め誤差、その他 この場合は、その他。 実数の1.0という値は、double型でもfloat型でも桁落ちも丸め誤差もなく正しく表現できる。 ここで指摘されているのは、定数の書式としてfloat型の定数を表現できるのだから それを使用したほうが適切だろう、ということ。 精度の大きい型の値を精度の小さい型の変数に代入しても、桁落ちなどがなければ全く問題ない。 桁落ちなどがあるとしても、それを意図して書いているなら動作としては正しい。 でも意図したものかどうかプログラムを他人が読んでも分からないので、そのような場合は明示的なキャストをしたほうがいいこともある。 この場合はキャストなんかせず、定数を明示的にfloat型で書けばいい。
585 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:39:04 ] 定数の1は整数型だが、実数に変換しても何にも問題ないので int a = 1; float b = 1; double c = 1; としてしまうなぁ。 # ただし、float b = 1.0としてしまうとdouble値からfloat値からのキャストになるのでコンパイラによっては巧くないね。
586 名前:デフォルトの名無しさん [2008/03/08(土) 22:09:18 ] >584-585 早速のレスありがとうございます。 よく分かりました。 >この場合は、その他。 >実数の1.0という値は、double型でもfloat型でも桁落ちも丸め誤差もなく正しく表現で>きる。 そう思っていたのに何故そこまでこだわるのだろうと思っていたら、 定数の型のことを言っていたんですね。
587 名前:デフォルトの名無しさん [2008/03/08(土) 22:20:53 ] マルチスレッドのプログラムでSTLは使えないと聞いたのですが、本当ですか? あと、_PTHREADSをdefineすれば使えるとも聞いたのですが、、、 googleしても、結構昔の情報が多くて実際のところはどうなのかよく分かりませんでした。
588 名前:デフォルトの名無しさん [2008/03/08(土) 22:23:39 ] FedoraとWindowsでソースレベルで100%互換のアプリケーションを 作ろうとしているのですが、現実的ではないでしょうか? またどの辺に気をつけて開発した方が良いでしょうか? 内容は不特定多数のPCとsocket通信でバイナリデータをやりとりし、 内部でPostgreSQLにアクセスする、いわゆるサーバアプリケーションです。 開発はほぼ全面的にWindows側(VisualC++.net2003)で行い、 1日2度程、Fedoraでも動作テストをする予定です。
589 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 22:56:48 ] >>587 そういうときは、闇雲にググるのではなく、 自分の使っているライブラリのマニュアルを読め。 例えば、Visual C++もlibstdc++もスレッド安全性についての文書がある。 msdn2.microsoft.com/ja-jp/library/c9ceah3b (VS.80).aspx gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch03s05.html#manual.intro.using.concurrency.thread_safety
590 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 22:58:30 ] かつてKylixという開発環境があってですね
591 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 03:48:11 ] >>588 完全に.NET上に載せてしまってMONO使うとか。 俺は使ったことないけど
592 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 03:56:01 ] 一つお伺いしたいのですが,FLVなどの動画をweb上からdownloadし, てローカルに保存するプログラムを作りたいのですが, どのようなライブラリを使えばいいのでしょうか? ライブラリなどなく自分で作るしかないのでしょうか?
593 名前:デフォルトの名無しさん [2008/03/09(日) 04:02:45 ] ダウンロードするライブラリはあるが、アドレスを発見するライブラリはない
594 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 04:10:04 ] レスありがとうございます. アドレス入力は手動でやろうと思っています. ダウンロードするライブラリはあるんですね.ありがとうございます
595 名前:デフォルトの名無しさん [2008/03/09(日) 04:14:05 ] Youtubeの動画がおいてある場所がわかれば ZIPやEXEやAVIやMP3を落とすのと同じ 場所がわからなければ無理 動画が見られるアドレスと違う
596 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 05:39:49 ] 祭りらしい 【ひめはじめ】その7 venus.bbspink.com/test/read.cgi/megami/1204907313/ 【ひめはじめ】その8 venus.bbspink.com/test/read.cgi/megami/1204919740/
597 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 09:17:25 ] >>588 ソケット通信をどうにかする必要がある。 WindowsとPOSIXで似て非なるAPIを持っているから、 自分でラップするなり既存のライブラリを使うなりしないといけない。
598 名前:デフォルトの名無しさん [2008/03/09(日) 09:51:30 ] 先にSTLについて質問したものです。 教えてもらったファイルとかを見てみたのですが、マルチスレッド環境で std::cout に何かを書き出す時、いちいちロックをとらないとだめなようですが、 ロックの必要ないcout相当のものはないでしょうか? 自分でinline関数を作ってつかうようにはしたのですが、、
599 名前:デフォルトの名無しさん [2008/03/09(日) 10:33:05 ] ごめんマクロだった boost::mutex mutex_io; #define safe_cout(m) { \ boost::mutex::scoped_lock lock(mutex_io); \ m \ } int main() { safe_cout( std::cout << "hello" << std::endl; ); こんな感じ。
600 名前:デフォルトの名無しさん [2008/03/09(日) 11:39:46 ] 頭がこんがらがってきたのですが、 クラスmyclassの大きさをnバイトとして、次のように定義すると、 myclass *A; A = new myclass[x]; myclass B[x]; sizeof()の戻り値が n ← sizeof(myclass),sizeof(*A),sizeof(*B) 4 ← sizeof(A) x*n ← sizeof(B) となるわけですが、AとBにはどういう違いがあるんでしょうか
601 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 11:45:03 ] 配列とポインタの違い。 ちなみにsizeof (*B)は、Bが配列型→ポインタ型への変換を受けた後、 それに単項*演算子を適用しているので、B型のインスタンスをsizeofにかけていることになる。
602 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 11:56:08 ] Aはポインタ型(配列の先頭を指す) Bは配列型(値は配列の先頭を指すポインタ) ってことでしょうか 両方A[0].xとかB[1].xでクラスのメンバ変数xにアクセスできるので、 イマイチ区別が付きませんでした
603 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 12:13:17 ] 配列型のインスタンスは、原則として式の中でその先頭要素を指すポインタに変換される。 (sizeof Bのように直接sizeofの演算対象にするのはその例外の1つ) それで、[]演算子は常にポインタを対象にしている。 このページの中程にそういう話がある。 kmaebashi.com/programmer/pointer.html
604 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 12:32:06 ] cout << Bでどう考えてもBがポインタだったのは、 自動で変換されていたためでしたか そのページを参考に基本的な部分を整理しようと思います ありがとうございました
605 名前:デフォルトの名無しさん [2008/03/09(日) 17:48:09 ] これの直しかたわかりませんか? コンパイル時にアットマークがついてしまいます Error 42: Symbol Undefined _WSACleanup@0
606 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 17:58:46 ] それはstdcall関数の仕様。 @がどうとか関係ないから、ws2_32.libか何かをリンクしろ。
607 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 18:03:44 ] C++の入門書のお勧めは?
608 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 18:04:43 ] accelerated C++
609 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:12:41 ] >>607 猫でも分かるC++言語プログラミング
610 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:05:34 ] >>608 そ・れ・は・な・い
611 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:22:02 ] >>610 え、そうなの? >>608 見てアマゾンに注文したばかりなんだけど。
612 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:29:54 ] >>611 評判はとてもいいのですが 入門向きでは無いだろあれw C++が初めてで、他になにかやってたってとかならまだいいんだろうけど
613 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:30:27 ] >>611 読む価値は非常に高い良書。 ただ入門書を探してる人のレベルによっては 難しいと感じるかもしれないというだけのこと。 いずれ読むべきだから買っておけ。
614 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:42:41 ] JavaやC#でいうところのInterface的なものを真似る場合 class IHogeの中に実装があってもいいのでしょうか?
615 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:48:02 ] 実装があるならabstractクラスを真似るべきじゃね
616 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:57:55 ] 多重継承最強!
617 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:06:06 ] >>614 「真似る」のなら駄目 C++的にIHogeの中に実装があってもいいかどうかは別ね
618 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:25:57 ] accelerated c++ はベターCでなく C++ らしいやり方で進めてるところが好き
619 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:30:02 ] いずれ読むべきという点で「C++の設計と進化」をお勧(ry
620 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:17:51 ] 独習C++やらロベールやら色々あるから 本屋でとりあえず立ち読みでもしてみれ。 ネットでポチっと買うと合わなかった時悲惨。
621 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:42:18 ] 現行規格とはずれているがARMの内容は秀逸。
622 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:53:59 ] 今のところ、入門に向いてるのは609の 猫でも分かるC++言語プログラミングだけだなw >>607 「猫でも〜」は本買った方がいいけど(著者にとって)、webでも見れるよ。 www.kumei.ne.jp/c_lang/howto.htm
623 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:02:50 ] じゃあ一発 これならわかるC++ ブルーバックス版
624 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:04:46 ] >>614 それなんてCOM?
625 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:05:50 ] 猫でもを妙に推している人がいるな。 本人なのか、信者なのか。
626 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:08:18 ] 猫でもわかるシリーズにC++編はないわけだが
627 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:10:15 ] ググったら確かに。書籍化されてるのは C だけだな。 じゃあ本人ではないなw
628 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:10:15 ] webにはちょっとあるけど全然使えない
629 名前:622 mailto:sage [2008/03/10(月) 00:13:06 ] >>625 推してるの一人じゃね? 俺はwebでも見れるよって言いたかったの。 "だけだな"って言ったのはacceleratedとかD&Eとか無茶やろって思ったからw
630 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:16:03 ] >>628 あれって全部じゃなかったんだ・・・
631 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:18:10 ] 独習やロベールは別に無茶じゃないだろ?
632 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:21:07 ] >>625 猫は素人でも知ってる場合があったぞw 素人メールに猫の話があった時には目を疑った。 Web主体の素人さんにはPG的に一番名度高いのかも知れんね。
633 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:23:37 ] >>631 ごめん"立ち読みしてみれ"のあたりしか読んでなかった。 独習は良いかもね。
634 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:25:03 ] 猫でもはサンプル動かして改造するのには最適 入門書読んで、猫でもで遊んで、オブジェクト指向とか良いプログラミング作法でも学んでいけばいいんじゃね
635 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:34:18 ] C言語を独学で学んでいるのですがよく分からない文字(演算子?)があります -> ↑これはどういった意味の物なのでしょうか?
636 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:37:35 ] アロー演算子
637 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:38:56 ] >>635 A* a = new A(); //以下の2行は同じ (*a).aaa(); a->aaa();
638 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:41:57 ] >>635 ポインタptrが指す構造体のメンバmemである (*ptr).mem を ->演算子を用いて ptr->memと表す。 a -> b は、aが指す構造体のメンバbを表す。
639 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:45:26 ] >>636-638 良く分かりました。ありがとうございます。
640 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:56:28 ] 俺は (*a) も a-> も導入せずに、 同じ意味で a@ みたいな演算子が欲しかったよ・・・ [0]の構文糖衣として。 a@.aaa(); a@ += 10; a@++; まぁ、提案するとしても20年くらい言うのが遅い(C言語宛てになるし)わけだけど。
641 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 02:03:40 ] Delphiみたいに ^ がいいな
642 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 02:22:49 ] そうなると、定義もDelphiっぽくA^ a;になってC++/CLI設計者が涙目w
643 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 02:26:36 ] A$でおk
644 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 02:53:11 ] >>640 そもそも*(ついでに&も)が後置だったら良かったと俺は思う。 なんで前置にしたんだろう。
645 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 02:57:37 ] それを言い出すとなんで関数ポインタの宣言はあんなに狂ってるんだとかそういうハナシに
646 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 03:09:58 ] そもそもなんでこんな話題話してんだという話になる
647 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 03:24:32 ] >>644 たしかに。後置で良いよな。 >>646 void 635(){ 640(); }
648 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 03:46:23 ] 何故前置にしたのか気になってD&Eちょっと見て C言語の設計者の方じゃないと意味無いことに気付いた
649 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 05:09:56 ] 素人の友達にWindowsプログラミングしてみたいから いい本ないかと聞かれて猫でもわかる〜を薦めたら 馬鹿にするなと怒られた。 他意はなかったんだが、うかつだったわ。
650 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 06:44:56 ] それだけ聞くと、なんか馬鹿っぽい友達だな。
651 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 07:25:43 ] 数学でも単項演算子は前置である割合が多いから、 特別な理由をその時思いつかなければ まず後置にはしないと思う。
652 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 09:54:49 ] オブジェクトの排他制御というのはマルチスレッドで処理するとき以外は気にしなくて良いのでしょうか? というか、マルチスレッドを利用する場面というのはどういうときなのでしょうか
653 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 10:01:09 ] マルチスレッドでぐぐれよもう
654 名前:デフォルトの名無しさん [2008/03/10(月) 11:21:28 ] >>652 ウンコしながらオナニーとか
655 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 11:50:51 ] >>652 GUIアプリなんかで通常の機能を提供しながら重い処理をバックグラウンドでやるとか
656 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 11:56:51 ] >>654 流石にそれは難しいだろう。 >>652 トイレで出すもの出しながら飲食するとか。
657 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 12:20:13 ] >>649 猫でもわかる〜のサイトは、中身はいいけど、体裁がなぁ... プログラムの入門サイトなんだし、HTMLのタグぐらい、もうちょっと調べようよつとか思うよね...
658 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 12:24:13 ] 文章が読めたら何でもいいだろ・・・
659 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 12:32:21 ] 本人乙
660 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 12:34:24 ] むしろプレーンテキストでいい
661 名前:デフォルトの名無しさん [2008/03/10(月) 13:33:18 ] Delphiなんかの ExpandFileName関数(相対パスを絶対パスにする)と 同じ働きをする関数って VC++ だとなんて関数?
662 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 13:37:42 ] GetModuleFileNameでがんばるとか
663 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 13:44:38 ] VC++標準じゃないが、boostにパス変換がある。 boost::filesystem::system_complete
664 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 13:45:59 ] >>662 何故GetModuleFileName()? あれはカレントからの相対パスを解決する関数なんだから、モジュールからの相対パスにしちゃダメだろう。
665 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 13:54:07 ] GetFullPathNameは駄目なの?
666 名前:デフォルトの名無しさん [2008/03/10(月) 13:56:31 ] クラスのメソッドから、クラスのインスタンスの変数名を知る方法ってありますか? 具体的には、 class test {}; test a1; a1.method(); としたとき、method内でa1という名前をしることは出来ますか?
667 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 14:05:01 ] >>666 ムリ
668 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 14:07:08 ] >>666 thisでよくね?
669 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 14:12:44 ] 面倒だがコンストラクタの引数で変数名を文字列受け取るようにして 自分で保持するってのは? class test { std::strung instance_name; public: test(const char *pName) { instance_name = pName; } } test a1("a1");
670 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 14:15:06 ] 変数名が知りたいっていう状況がわからんのだが どう使うの?
671 名前:デフォルトの名無しさん [2008/03/10(月) 14:26:04 ] >>667-670 ありがとうございます。 用途はデバッグです。あるクラスの中身を表示させているのですが、 どのインスタンスかがわかりやすいようにしたかったので、、 自動化したいので、コンストラクタの引数に書くのは避けたいです。 が、これが一番確実ですかね。
672 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 14:30:23 ] >>671 Use the debugger, >671
673 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 14:32:57 ] デバッグ用途ならマクロの文字列化演算子 # を使うとか
674 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 14:44:44 ] >>671 どういう環境かは知らんが>>672 の言うようにデバッガ使ったらいいと思う
675 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 15:03:47 ] >>671 何らかの制限で、デバッガが使えない場合 デバッグログが使えるのならば、 生成した側が、確保されたアドレスを出力(__FILE__と、__LINE__も一緒に出力するとわかりやすい) クラスの中身を表示するところでthisを表示すればいいんじゃないかな? >>674 なかなか面白い書き込み時間だ
676 名前:デフォルトの名無しさん [2008/03/10(月) 16:52:05 ] ttp://www.borujoa.org/upload/source/upload17298.c 簡易ブラウザを作っているのですが、ソケット接続エラーがでます。 どこが原因か分かりません。教えていただけませんか?
677 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 18:03:29 ] >>676 htonsとか?
678 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 18:06:29 ] >>676 基礎からやり直せ。
679 名前:デフォルトの名無しさん [2008/03/10(月) 19:01:42 ] ハ,,ハ ('(゚∀゚∩_ おいらをどこかのスレに送って! /ヽ 〈/\ お別れの時にはお土産を持たせてね! /| ̄ ̄ ̄|.\/ |dexiosu|/  ̄ ̄ ̄ 現在の所持品:たばこ・ライター・コーヒー・ブラックブラック・枕・ケータイ電話 睡眠薬・聖教新聞 ・ダッチワイフ・外付けSCSI340MHDD・ネットランナー4月号 TYG02・小嶋進社長・ペプシNEX・モツ煮・ヌルポ・伊予柑・寒いギャグ ・7年ものキムチ ・カビキラーストロング ・ハイスクール奇面組文庫版全13巻 ・(元)関内太郎 ・チャッカマン ・ぺヤングソースやきそば・魔法先生ネギま!14巻限定版 ・小田急3000形・PSP ・デスノート ・ファブリーズ ・ポーション ・SH902i ・Windows3.1
680 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 19:11:21 ] >>676 生ソケットでHTTPをやるプログラム例はウェブにやまほど転がってるか ら、それらを見て何が足りないか調べてみましょ。 gethostbyname()やsocket()のエラーチェックもしましょ。 それ以外にもツッコミ所が多いけど致命的じゃないので省略。
681 名前:676 mailto:sage [2008/03/10(月) 20:26:39 ] うん、何か知らないけど分かって言ってるのか分かってないのかようわからん、 役に立たない情報ありがとう。
682 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 20:37:07 ] >>680 例えばnewしてdeleteしないのは、それが習慣化すると致命的だと思うぞ。 >>676 ということで、>678。 まさかとは思うが、そのレベルで外部に直接繋ぎに行くなよ。 接続先に迷惑掛けることになるからな。
683 名前:676 mailto:sage [2008/03/10(月) 20:44:42 ] >>682 いまどきのパソコンは自動で解放するから別にデリートしなくていいし (つーかdeleteしなかったのはこの程度のプログラムだったらいらんし面倒くさいからで)、 その機能的な面を考えておるんだったら、最初っから一気にメモリ確保しといて、 解放しますよ。あと、ポート80に設定してないとか言われてたが、 あれはポート80に設定しなかったら自動で80に設定してくれるからで、面倒くさいから。 socket()のエラーチェックしなかったのは、面倒くさかったからで。
684 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 20:48:29 ] >>682 newしてdeleteしない習慣がついてます、サーセンwww。 vectorとかshared_ptrがないと生きていけません。
685 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 20:49:11 ] お前に教えるのが面倒くさいわ。
686 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 20:49:20 ] きみのところの石がPowerPCとかMIPSとかでないなら、 iprt.sin_port=80; は iprt.sin_port=20480; にするといいお
687 名前:676 mailto:sage [2008/03/10(月) 20:50:38 ] >>684 俺もC++で、ついこないだまで必死でc_str( )使ってた。
688 名前:デフォルトの名無しさん [2008/03/10(月) 20:52:26 ] newはクラス以外で使うなよ STLのように自動開放する以外には使うべきでない
689 名前:676 mailto:sage [2008/03/10(月) 20:53:06 ] >>686 あぁ消したハズなのに普通に代入してたの残ってた。 このことか。ありがとう。 てか20480って怪しいポート何?
690 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 20:54:16 ] deleteめんどくさいならnewしなきゃいいって発想はないのかなぁ。 悪くてもこの場合固定長配列でいいし、もっと言えばstringを使うべきところ。 全く意味のないnewじゃん。 newしてdeleteしないのが致命的にならないのはこのサイズのバイナリだからであって、 自動でやるからデリートしなくて良いって考え方は非常に危険。くせにするなって言う意見のがもっとも。 たとえば、photoshopみたいなソフトを作ってる人がnewしてdeleteしなかったらどうなるか。
691 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 20:54:40 ] はい、GCを導入します
692 名前:676 mailto:sage [2008/03/10(月) 20:59:43 ] >>690 ありがとう。今度からできるだけ意味無いことは止める。 string型にすればいいだろうなぁとは思ってた。 最初mallocにしてたけど、知らん間にnewになった。 そもそもstringならnewはいらんはなしだったけど、そこまで頭回らんかった。 俺の脳裏にはC言語っぽいのをできるだけC++っぽくしようってのがあったんだと思う。 かえってそれが変に見えたのは認める。 勉強になりました。
693 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 21:01:47 ] つーか、 ・getaddrinfo使えタコが ・面倒だからとエラー処理サボると、もっと面倒な事態に の例
694 名前:676 mailto:sage [2008/03/10(月) 21:07:27 ] >>693 ネットワーク系に触るの生まれて初めてなのよn getaddrinfoか、メモメモ / ̄ ̄\/) f ヾ | ⊂(゚Д゚)| ヽ _(◎)ノ ノつ /ノ/ ハヽ二二ノ ( (||i) )ヽ\ ヽ)L人(_/(ノ`J
695 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 21:30:06 ] >>694 触んないほうがいい。
696 名前:676 mailto:sage [2008/03/10(月) 21:42:16 ] >>695 NEってCCNAとかのイメージが先行して配線を弄ってるイメージ強かったけど、 プログラム組ませると「間違えると危険なんだなぁ」とは思った。勉強になりました。 安全な下級PGに戻ります。
697 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:38:48 ] スレがカオス気味でワロタ
698 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:10:24 ] ここでド素人の俺が颯爽と質問 int型へのポインタの宣言って int *a; int* a; この二つで差がありますか?
699 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:13:06 ] int* a, b;
700 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:13:52 ] 若干スレ違い臭いのですが、質問させてください。 コンパイル時、2つのコンパイルオプションを指定したいのですが、どのように書けばいいのでしょうか。 例えば`wx-config --cppflags` と `pkg-config --cflags gtk+-2.0` を同時に使いたいのです。
701 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:14:44 ] >>698 違いはありません。 しかし、その二つはまれに戦争の火種となります。
702 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:19:40 ] >>698 int *a, b; int* a, b;
703 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:33:51 ] >>699 ,701-702 ありがとうございます intだとint型とint型へのポインタが同時に宣言でき、 int*だとint型へのポインタのみ宣言できるわけですか >戦争の火種 (((( ;゚Д゚))))ガクガクブルブル
704 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:39:19 ] >>703 いいえ、どちらも同じです
705 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:40:40 ] >703 戦争の火種って言っても空襲は来ないから安心しておじいちゃん。
706 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:47:02 ] >>703 残念ながらそれは違う
707 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:59:24 ] int *a, b; int* a, b; 二つとも aがint型へのポインタ。int型の変数bでしょうか?
708 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:02:17 ] Yes. int* a, b; と書こうが、b はポインタにはならない。
709 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:02:58 ] >>707 その通り
710 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:05:39 ] int * a; のように書く人もいるね。
711 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:07:17 ] >>700 単に並べればいいよ。 gcc `wx-config --cppflags` `pkg-config --cflags gtk+-2.0` mycode.cc
712 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:08:06 ] int*a; 派
713 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:09:31 ] おまえがどう書こうが関係ねえ
714 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:10:33 ] int * a ; 派
715 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:11:23 ] >>714 ステップ数至上主義者ですね
716 名前:700 mailto:sage [2008/03/11(火) 00:17:01 ] >>711 さん ありがとうございます!
717 名前:デフォルトの名無しさん [2008/03/11(火) 00:34:27 ] i\ n\ t * a ; 派
718 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:37:59 ] boost::mpl::identity<int*>::type a;派
719 名前:デフォルトの名無しさん [2008/03/11(火) 01:21:53 ] string の読み込みがないのが不便ですね 改行やバリナリはありますが 自作するしかないですか
720 名前:デフォルトの名無しさん [2008/03/11(火) 01:24:21 ] C言語やWindowsAPIはファイルの入出力が低レベルのしか無いです たとえば空きメモリを調べてバッファを使って出力するとか そういうのを強化するライブラリ無いですか ビット単位の出力もないです
721 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 01:25:23 ] boostでおk
722 名前:デフォルトの名無しさん [2008/03/11(火) 01:27:40 ] 詳しく教えてください ライブラリ名とか
723 名前:デフォルトの名無しさん [2008/03/11(火) 01:32:21 ] 例えば、Fstream というバッファ付きファイル出力クラスを自作したとします 書き込みがあまりなくなったらメモリを解放したいのですが、 一番最後の書き込み時に解放しなかった場合、 それ以降アクセスがなかったら無いことを知ってメモリ解放するにはどうしたらいいですか
724 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 01:33:05 ] デストラクタで開放するようにして、スマートポインタに入れるなりなんなり
725 名前:デフォルトの名無しさん [2008/03/11(火) 01:34:41 ] クラス生成時にサブスレッドを動かして 時間計測してシグナル出せば良さそうですね
726 名前:デフォルトの名無しさん [2008/03/11(火) 01:37:56 ] >>724 複数のファイルを同時に扱いたいです 1000個の書き込みがあれば 一つあたり100KB確保でも大きいです 単独でバッファ管理するより複数を調べた方が良さそうですが
727 名前:デフォルトの名無しさん [2008/03/11(火) 01:43:50 ] 例えば Fstream fp("out1"), fq("out2"); としたとします クラスはfpの状態とfqの状態両方を知ることは出来ますか
728 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 01:51:55 ] static変数ででも管理すればいいだろ
729 名前:デフォルトの名無しさん [2008/03/11(火) 01:57:24 ] fp[100]としたとき、メモリを解放した方が良い番号がわかったとき自動的に 解放させるにはどうしたらいいですか? 最近参照された時間を保持していてもメンバ関数からでは 他のメンバ変数はわからないですよね
730 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 01:58:38 ] >>729 728読んだ?
731 名前:デフォルトの名無しさん [2008/03/11(火) 01:59:49 ] staticは共用されないですか? 個別の時間を保持しないと駄目ですが
732 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 02:01:30 ] 全インスタンスの個別の時間を保持するlistかmapかなんかをstatic変数にすればいいだろう
733 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 02:02:00 ] だいたい貴様の知識が乏しいのは自分でもわかってるんだろ。 その貧相な知識で勝手に判断して人のレスを無視するんじゃねえよ
734 名前:デフォルトの名無しさん [2008/03/11(火) 02:03:54 ] 時間管理もバッファも、vector型にして共用すれば良いですか?
735 名前:デフォルトの名無しさん [2008/03/11(火) 02:09:53 ] あとメモリ解放のためにサブスレッドを動かしたいのですが コンストラクタに入れるとクラス生成ごとに呼びだれると思うのですが これも共用するにはどうすればいいですか? static fnc(){}などと書けば初めの一回だけになりますか
736 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 02:10:01 ] 質問する前に手を動かしてみたら?
737 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 02:15:17 ] 闇雲に手を動かすだけで、「〜をやってみましたがうまくいきませんでした。なぜですか。」とか聞いてきそうだ。 >static fnc(){}などと書けば初めの一回だけになりますか staticというキーワードを知っているのなら、それについての最低限の仕様くらいは 自分で調べたほうがいいよ。webを見るなり、まともな入門書を読むなりして。 凝ったことをやろうとする前に、もっと先に学ぶべきことが多そうだ。
738 名前:デフォルトの名無しさん [2008/03/11(火) 02:28:02 ] うごかないですが原因がわかりません どうすればいいですか class cls{ public: static int n; cls(){ n=0; } }; main(){ cls x; }
739 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 02:32:52 ] どううごかないんだ コンパイルエラーなのか 画面に何も表示されないのか 後者なら別におかしくないぞ
740 名前:デフォルトの名無しさん [2008/03/11(火) 02:37:50 ] Error: 未解決の外部参照 'cls::n' がTEST.OBJ から参照されました とでます
741 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 02:39:42 ] static変数の定義がないから static int cls::n;
742 名前:デフォルトの名無しさん [2008/03/11(火) 02:42:55 ] それは知りませんでした サンクス あとクラスのメンバ関数も共用出来ますか? 初めに一度コンストラクタで起動するだけにしたいです
743 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 02:44:44 ] >>742 staticをメンバ 関数につけたらどうなるか調べなおせ
744 名前:デフォルトの名無しさん [2008/03/11(火) 02:56:22 ] 他人のコードを読んでいて、 namespace std { template <> void swap(hoge &a) みたいな記述があったのですが、templateのあとの<>の中が空白でも コンパイル出来ているのですが、なんででしょうか?
745 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 02:57:24 ] パラメータ0個のテンプレート
746 名前:デフォルトの名無しさん [2008/03/11(火) 03:01:30 ] >>745 ありがとうございます。でも意味がないような、、、 どんな時につかうのですか?
747 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 03:06:02 ] 特殊化でぐぐれ
748 名前:デフォルトの名無しさん [2008/03/11(火) 03:11:47 ] read(fp, x) write(fq,x) としたとき、読み込むファイルが1G以上だとメモリがたらなくなります あらかじめ書き込むサイズが判明していたとしてマルチスレッド化して read(fp, x) write(fq, x, N, KAIHOUFLG) としてメモリを解放しながら読み書きするにはどのように実装すればいいですか
749 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 03:15:09 ] マルチスレッドに何の関係があるんだよ。 分割して読み書きすればいいだけだろうが
750 名前:デフォルトの名無しさん [2008/03/11(火) 03:17:02 ] read(fp, x)はファイルを読み込みますが、例えば1G読み切るまで停止しないって事です
751 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 03:19:17 ] それはそのreadの設計が悪いだけだろうが。
752 名前:デフォルトの名無しさん [2008/03/11(火) 03:20:49 ] >>747 ありがとうです。特殊化でぐぐったら、wikipediaのエントリが先頭に出てきて、それを 読んだらわかりました。(わかりやすく書いてあった) templateのうち、コンパイラまかせじゃなくて自分で書いてしまいたいところを自分で 書くということですね。
753 名前:デフォルトの名無しさん [2008/03/11(火) 03:21:11 ] 1Gのファイルを読み込んだとして、 メモリを解放しながら書き込むという指定をすると 読み込まれた部分に対して先頭からメモリを解放しながら書き込みます
754 名前:デフォルトの名無しさん [2008/03/11(火) 03:23:27 ] 通常使用では一括して読み込むことも出来るし、 メモリを解放させながら読み込むことも出来るという汎用の関数を作りたいんです
755 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 03:25:35 ] なら作ってください
756 名前:デフォルトの名無しさん [2008/03/11(火) 03:26:09 ] やり方を教えてください
757 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 03:30:19 ] 上で散々でてるがな。
758 名前:デフォルトの名無しさん [2008/03/11(火) 03:30:20 ] 商品先物や、為替取引と同じようなものです 現物を扱わずに売り買いだけを先にしてしまうようなものです 読み込みと書き込みの約束だけをしてしまい不要ならメモリを解放します
759 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 04:31:06 ] 口約束で終わるって事か?
760 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 06:03:12 ] スレが伸びてると思ったら、梯子もなしに屋上に上ろうとする馬鹿が沸いてたか。
761 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 07:20:30 ] VirtualAllocでCOMMITを調整する話か? まー、32bitアプリは仮想メモリ空間も 2Gあたりでリミットだからあんまし意味がないけど
762 名前:デフォルトの名無しさん [2008/03/11(火) 07:20:53 ] >>756
763 名前:デフォルトの名無しさん [2008/03/11(火) 07:23:38 ] >>756 Windowsなら4つのAPIで実現できる。 APIの頭文字はそれぞれ、C、M、U、Cだ。
764 名前:デフォルトの名無しさん [2008/03/11(火) 09:38:41 ] 書き込み予約と、読み取り予約と、バッファ管理して それらを同時に動かして快適動作させたいわけです コードを教えてもらえませんか? 読み書きのバッファを128KB単位にして管理すれば良さそうなんですが・・ x[n]のようにデータにアクセスできるが、前方が解放されていたとしてもそれ以外は同じアクセスが出来るようにしたいです
765 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 09:46:11 ] >>764 ディスクを交換するほうが早い。
766 名前:デフォルトの名無しさん [2008/03/11(火) 10:36:58 ] >>764 脳ミソを交換ry
767 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 12:00:57 ] >>764 したい事は >>748 なのか? もしそうなら、標準関数は何もしなくてもそうなってる 一体何のために何がしたい?
768 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 13:46:23 ] 読み込みや書き込みをできる限りメモリにキャッシュしたい、というこ となら、組み込み環境でない限り、OSがそれぐらいはやっている。
769 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 13:57:28 ] そんなこと無いよ それだったらFFCやfast copyがOS標準のコピーを上回らないはずだよ 一つの巨大ファイルだけを扱うならば、速度差は出ないだろうけど 複数のファイル(1000以上同時など)を扱うと標準のはやつにたたない あと2Kずつ書き込みがあったとしたらそのつどAPIでそのまま書き込んでいたらとても鈍いよ
770 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 14:02:16 ] ファイルをメモリにロードする事、複数の少数ずつのファイル出力の最適化する事 上のファイルロードをスレッド化して読み込み中に不要なメモリを解放出来るようにすること
771 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 14:07:58 ] まずC言語とWindows APIのファイル入出力は難しいんだよ Read( "inputfile", buf ); Write( "outputfile" , buf ); だけで扱えるようにしたい しかしここで、バッファ管理やマルチスレッド化を導入しなければ 巨大ファイルを読み込むときにメモリ不足が足らなくなったり、少数ファイルの書き込みで速度低下する これらを解消して簡単なファイル入出力をしたい
772 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 14:10:02 ] ファイルマッピングをmemcpyしたまえ 64ビットならアドレス空間も余裕だ
773 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 14:20:24 ] >>769 FFCとかはFILE_FLAG_NO_BUFFERINGをつかって システムキャッシュにのせないことで高速化してるんじゃなかったっけ?
774 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 14:28:10 ] >>770 目指している方向はわからなくもないが、 ここで色々訊いているような人間が使い物になるものを作れるかどうか不安。 何事も、下手な自作よりOS標準など既存のものほうがずっとうまいと仮定すべき。
775 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 14:33:19 ] 読むだけじゃ意味無い(処理するために読む)んだから、 巨大データをオンメモリでっていうこと自体に元々限界があるの。 分けなさい。
776 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 14:49:21 ] すみません 出力値が異なるのですが原因がわかりません なぜでしょうか? #include <iostream> #include <string> using namespace std; #define N 10000000 int main(){ unsigned int n,m,cn[256]; string x(N,'\0'); for(n=0;n<N;n++)x[n]=rand()&255; for(n=0;n<256;n++){cn[n]=0;for(m=0;m<8;m++)cn[n]+=(n>>m)&1;} unsigned int sum=0; for(n=0;n<N;n++)sum+=cn[x[n]]; cout<<sum<<endl; #define b(x,i) ((x>>i)&1) sum=0; for(n=0;n<N;n++){ int y=x[n]; sum+=b(y,0)+b(y,1)+b(y,2)+b(y,3)+b(y,4)+b(y,5)+b(y,6)+b(y,7); } cout<<sum<<endl; }
777 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 14:52:58 ] 自己解決しました string x(N,'\0'); → vector<unsigned char> x(N,0); で一致しました
778 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 15:48:42 ] ちょっとお尋ねしたいのですが コンパイル時 ../source/memo.h:15: note: candidates are: MyFrame::MyFrame() ../source/memo.h:15: note: MyFrame::MyFrame(const MyFrame&) のようなエラーが出たのですが、このエラーはどういう意味のエラーなのでしょうか??
779 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 16:52:43 ] それ単独では出ないと思うけど・・・ その直前のエラーについての補足説明で、 候補としてこういう関数がありますよってことじゃないかなたぶん?
780 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 20:31:11 ] 山ほどあるコンパイラのエラー出力フォーマットなんていちいち覚えてられないよ。 コンパイラ・ソース・エラー(省略せずに)を明記してくれ。
781 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:04:38 ] >>778 noteって単語と、candidateって単語の意味くらい調べましょうね。 そうすればそれらの行がエラーじゃないことと、何を言わんとしているか位判るだろうから。
782 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:06:36 ] >>769 >複数のファイル(1000以上同時など)を扱うと標準のはやつにたたない  ̄ ̄ >巨大ファイルを読み込むときにメモリ不足が足らなくなったり、少数ファイルの書き込みで速度低下する  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 落ち着いて、日本語で書いてください。
783 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:07:04 ] int a[6]={0,1,2,3,4,5,6} とすると、配列の中身を一気に定められますが、 int a[6] と一度定義した配列に一気に中身を代入することは可能でしょうか
784 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:15:55 ] >>783 int oneShotArray[] = {0, 1, 2, 3, 4, 5, 6}; int a[6]; std::copy(oneShotArray, oneShotArray + 6, a); memcpy(a, oneShotArray, sizeof(* a) * 6);
785 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:43:13 ] 誘導されてこちらに来ました。 ifstreamで半角空白を含むファイル名や、日本語を含むパスで ifstream ifile(フルパス名);で失敗してしまうのですが、これは仕様なのでしょうか? 仕様なのでしたら回避策はあるのでしょうか? Visual Studio 2005SP1を使用しています。 よろしくおねがいします。
786 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:43:47 ] コンパイルはVisualStudio2005 Command Promptで行いました。 フルパス名をコピペして、\を一つ減らしてエクスプローラーに貼り付けると正常に開けます。 #include <iostream> #include <fstream> #include <windows.h> using namespace std; int main(int argc, char **argv) { ifstream ifile("d:\\新規テキスト ドキュメント.txt"); if(ifile) { MessageBox(NULL, "success", "info", MB_OK); ifile.close(); } else { MessageBox(NULL, "failed", "info", MB_OK); } return 0; }
787 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:44:52 ] >>786 向こうの誘導したレスの前半は無視ですか?
788 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:46:51 ] えくすぽろーらで開けんだから、ファイルはあるんしょ
789 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:49:05 ] とりあえずtest.txtで試してみたら?
790 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:49:56 ] だから、カレントディレクトリはどこなのかとw
791 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:50:28 ] ソースコードのエンコーディングがutf8なんじゃない?
792 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:51:42 ] >>787 ファイルはあります。 >>789 "d:\\test.txt"ではsuccessとなります。
793 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:52:33 ] だったらロケール設定して見るんだ。
794 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:53:40 ] >>791 ソースコードに // あいうえお と入力して、テキストエディタでエンコードを確認しましたがシフトJISでした。
795 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:57:55 ] >>793 setlocale(LC_ALL, ""); で出来ました! ありがとうございました!
796 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 22:36:43 ] 向こうで速攻でロケールについて指摘されているのを無視するからだ・・・
797 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 23:16:36 ] なんで無知の身でもらった回答を勝手に「選別」するんだろうな。
798 名前:デフォルトの名無しさん [2008/03/11(火) 23:17:43 ] 自分クラスのアドレス(実際はthis)をstatic_castで上位クラスにキャストしなおして、上位クラスのメソッドを呼ぼうと思ったのですが segmentation faultになります。 baseclass::method(); と書いて目的は達成できたのですが、segmentation faultになる理由が分かりません。 #あと、このスレのタイトルが #【初心者歓迎】C/C++室 Ver.50【環境依存OK】 # ってなってるけど、なんか何度かVer.50がくりかえされているような気がするのは自分だけ?
799 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 23:39:18 ] だからコードを晒せと。スラッシングが起きてるんじゃねーだろーなー
800 名前:デフォルトの名無しさん [2008/03/11(火) 23:51:29 ] どこで聞けば良いのかわからなかったので、 環境依存OKということでここでお伺いします。 linuxThreadsでは、あるスレッドでsetpriority()を呼ぶと 親スレッドの優先度は変化しないと思いますが、 NPTLでは同一のPIDならすべて変化するのでしょうか?
801 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 23:52:56 ] >linuxThreadsでは、あるスレッドでsetpriority()を呼ぶと >親スレッドの優先度は変化しないと思いますが、 そうは思えないが。
802 名前:778 mailto:sage [2008/03/11(火) 23:54:27 ] レスくださった方々ありがとうございます。 noteはなんとなく分かったのですが、candidatesは調べてもわかりませんでした。 candidatesは何のことなんでしょうか・・。 どなたかご教示頂けると幸いです。
803 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 23:57:01 ] ヒント:複数形
804 名前:デフォルトの名無しさん [2008/03/11(火) 23:57:11 ] >>799 すいません。 class base { public: virtual void resize(){} }; class deri : public base { public: virtual void resize() { #if 1 base* tmp = this; tmp->resize(); // ここでseg fault #else base::resize(); // 問題なし #endif } }; です。
805 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 23:58:21 ] >>804 無限再帰でスタックオーバーフローだな。
806 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 23:59:48 ] ・base::resize() 静的に呼ぶ ・tmp->resize() 結局virtualたどってderi::resize()にくるから無限再帰
807 名前:デフォルトの名無しさん [2008/03/12(水) 00:00:30 ] >>801 即レスどうもです!! そうなんですか? manにはプロセスの優先度を設定すると書かれてありました。 linuxThreadsはPIDを共有しないので変化しないと思ってたのですが。 PIDは違うけどプロセスは同一ということでしょうか?
808 名前:デフォルトの名無しさん [2008/03/12(水) 00:07:58 ] >>805-806 ありがとうございます。tmp->resize()の前にログをいれて再帰していることを確認しました。 再帰というのは全然考えてなかったです。 助かりました。
809 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 00:21:21 ] >>802 ../source/memo.h:15: note: candidates are: MyFrame::MyFrame() ../source/memo.h:15: note: MyFrame::MyFrame(const MyFrame&) 俺も英語は苦手だがせっかくネット使えるんだから有効活用しようぜ。 「MyFrameが複数の候補がある」という内容。 コード上でどちらの処理を使うかがコンパイラに判断できないからだ。
810 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 00:23:45 ] エスパーすると、直前に no matching function for call to 〜 とか云われたはず。コードで書いてある引数に マッチする関数の宣言がなかったって話。
811 名前:778 mailto:sage [2008/03/12(水) 01:14:43 ] >>803 さん 809さん 810さん レスありがとうございます。 なるほど、普通に「候補」でよかったんですね。 なんかプログラミングの専門用語でcandidatってのがあるのかと勘違いしてました。 ありがとうございましたm(_ _)m
812 名前:デフォルトの名無しさん [2008/03/12(水) 01:16:15 ] 正常なSJISならば出現しない番号0-255ってありますか?
813 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 01:24:27 ] >>812 日本語でおkと言いたいが、 windowsなら スタート → すべてのプログラム → アクセサリ → システムツール → 文字コード表 を見てみては?
814 名前:デフォルトの名無しさん [2008/03/12(水) 02:02:04 ] すみません 番号を教えてください
815 名前:デフォルトの名無しさん [2008/03/12(水) 02:10:10 ] 新聞、2ちゃんなどを1ギガほど計測したところ次の通りでした 下位のものは間違ったSJISの番号でしょうか? 26番15475回 30番17423回 22番18440回 127番18931回 25番19273回 上位 32番45338056回 130番93045087回
816 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 02:11:38 ] スレ違い
817 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 02:51:43 ] 一度定義したクラスのデータメンバやメンバ関数をあとで追加することってできないのでしょうか? 例えば、40行目で clsss aaa { public: void sample1 (); } と定義したクラスのデータメンバとメンバ関数を、 80行目で class aaa { public: int xxx; void sample2(); } みたいな感じで、追加する感じです。 上のように書いたのをコンパイルしようとしたらエラーが出たのですが、 すでに定義したクラスの機能を拡張するにはやはり継承しなければいけないのでしょうか??
818 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 02:52:26 ] はい、そうです
819 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 05:03:16 ] >>817 40行目の定義を削除すればいいじゃん。
820 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 05:44:14 ] 環境はLinux/Windowsの両方です HDD残量を取得したいのですがどのようにすればよいのでしょうか? 環境に関係なくとる方法はあるのでしょうか? もしなければ,どのようにして取得すればよいか教えていただきたいです.
821 名前:デフォルトの名無しさん [2008/03/12(水) 06:16:19 ] 環境別に分ける
822 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 07:48:11 ] >>811 だから、英単語の意味を調べたら単に「候補」って出てくると思うのだが……
823 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 07:49:31 ] >>820 そもそも、どのディスクの残量を知りたいのかね。
824 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 07:55:39 ] Amazonを使ってる方へ Amazonのほしい物リストで、個人情報(氏名等)がもれる場合があります。 ほしい物リスト(ウィッシュリスト)が未登録ならば、問題ありません。 しかし、自分のアカウントを調べた方が良いです。 1505953.blog76.fc2.com/blog-entry-340.html 祭り中? 【祭】Amazonウィッシュリストで個人情報ダダ漏れ中★6 namidame.2ch.net/test/read.cgi/news/1205262805/
825 名前:817 mailto:sage [2008/03/12(水) 11:28:26 ] >>818 さん >>819 さん レスありがとうございます。 40行目のやつは、実際今作ってるプログラムだとincludeで読み込んでるライブラリで定義していまして、 消して下で書き直すのもライブラリ自体をいじるのもなんか好ましくないような気がしまして。 やはり継承するしかなさそうですね。というかむしろライブラリのクラスは継承してから使うものなんですかね。 ありがとうございましたm(_ _)m
826 名前:デフォルトの名無しさん [2008/03/12(水) 13:36:09 ] すれ違いといううことでここに移ってきたんですが、 stlの使い方について質問です。今リストの中に1,2,4,8,16,32,64 と入っているんですが、"erase" を使って5番目の数字を削除して中身を表示し、 その後に3番目の数字を削除して表示。 そして、"insert"を使って3番目と4番目の 数字の間に7を入れて表示という感じにするにはどうしたらいいんですか? osはubuntuでg++を使っています。 #include <iostream> #include <iterator> #include <list> using namespace std; int main(){ list<int> mylist; for(int i=1; i<=64; i *= 2) mylist.push_back(i); cout<<endl; list<int>::const_iterator itr1; for(itr1 = mylist.begin(); itr1 != mylist.end(); itr1++) cout<< *(itr1)<<" "; return 0; }
827 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 13:47:08 ] 質問です 引数つきコンストラクタから、デフォルトのコンストラクタを呼ぶことはできないでしょうか? Javaではできたので、C++でもできないものかと思っているのですが CHoge::CHoge() { // 共通の初期化がだらだらと } CHoge::CHoge(int type) { // CHoge()で共通の初期化を呼び出したあと、色々やりたい } CHoge::CHoge(const char *psz) { // CHoge()で共通の初期化を呼び出したあと、色々やりたい }
828 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 13:56:34 ] 初期化処理をまとめたプライベート関数を作ればよろし
829 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 13:58:35 ] >>827 ないよ。 そんなことできたら初期化子が重複するから。
830 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 13:59:16 ] >>828-829 ありがとうございます 初期化プライベート関数つくるとします
831 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 14:01:57 ] >>826 >"erase" を使って5番目の数字を削除して中身を表示し 削除したら表示できないだろ。 削除するだけでいいなら、文字通りerase()を使えばいい。 # erase(), insert()は引き数にiteratorを必要とするが、 # advance()を使えば何番目を指すiteratorを作れる。
832 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 14:02:09 ] >>827 C++でもコンストラクタからコンストラクタを呼び出すことは文法違反ではない。 CHoge::CHoge() { // 共通の初期化がだらだらと } CHoge::CHoge(int type) { CHoge(); //一時オブジェクトの生成!!!!! //いろいろな固有の処理 } しかし、こんなコードを書いたならば想像してるとおりにはならないだろう。 こういう場合C++では、共通化したい処理をまとめた (恐らくはprivateな)メンバー関数を別に用意する。 void CHoge::init(); CHoge::CHoge(int type) { init(); //共通の処理 //いろいろな固有の処理 }
833 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 14:10:49 ] 勇気を出して変えてごらん HogeをMoeに変えてごらん そうすれば世界も変わって見えるんだ
834 名前:デフォルトの名無しさん [2008/03/12(水) 14:20:50 ] >>831 "erase" を使って5番目の数字を削除して中身を表示 1,2,8,32,64 その後に3番目の数字を削除して表示 1,2,32,64 そして、"insert"を使って3番目と4番目の数字の間に7を入れて表示 1,2,32,7,64 というう感じにしたかったんです。
835 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 14:29:04 ] >>834 その通りに書けばいいだろ。 www.wakhok.ac.jp/~sumi/stl/header/vector.html
836 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 15:13:26 ] >>834 >831に書いた内容の何が気に入らないんだ?(:; つーか、4はどこに消えたんだ?
837 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 15:27:12 ] マクロでクラス生成をしたいのですが、任意のクラス名を受け取る方法はないですか? #define GENERATE_CLASS class X {...} // マクロを呼び出す側からXの部分を任意に指定できるようにしたい
838 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 15:30:49 ] #define GENERATE_CLASS(x) class x{hogehoge ではないの?
839 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 15:48:28 ] template使えば?
840 名前:837 mailto:sage [2008/03/12(水) 15:58:32 ] >>838 その方法はGENERATE_CLASS(Hoge)と使った時、Hogeの部分でエラーが出た気がしたのですが、 今もう一度試してみたらできました。(別の部分で間違いがあったようです) 簡単すぎること聞いて申し訳ないです。 >>839 template引数のバインドができない関係で、マクロでクラスを書くことになってので、templateでは無理なのです。
841 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 16:04:21 ] >>840 まさかとは思うが、業務上のプログラムを2ちゃんで質問しながら書くなよ。
842 名前:837 mailto:sage [2008/03/12(水) 16:06:27 ] >>841 趣味グラマです。
843 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 17:21:29 ] Visual C++ 6.0の課題で分からないところがあるので助言お願いします。 「main関数において、返却値の値によって表示の方法を変えよ」 とあるのですが“表示の方法を変える”とはどのようなことをすれば良いのでしょうか? 返却値は1、2、3の三つです。
844 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 17:32:05 ] printf("%dがきたー\n", henkyakuchi)
845 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 17:33:57 ] 変化球がきたに見えた
846 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 17:43:04 ] >>844 ありがとうございます とりあえずその方向でやってみます
847 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 18:06:09 ] >>843 もし問題文が 「main関数において、返却値の値によって表示の方法を変えよ」 だけなら、回答はこうだ 「日本語でおk」
848 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 18:12:25 ] うむ、出題の意味がわからん。 そして宿題は宿題スレへ。
849 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 18:12:32 ] こういうことか! switch(henkyakuchi) { case 1: printf("きたー"); break; case 2: puts("きたー"); break; case 3: cout << "きたー"; break; }
850 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 18:18:14 ] >>843 switch (henkyakuti) { case 1: printf("0"); break; case 2: fputs("0", stdout); break; case 3: putchar('0'); break; }
851 名前:850 mailto:sage [2008/03/12(水) 18:18:48 ] ネタかぶったorz
852 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 18:35:01 ] >>847 まあ全文じゃないけどな >>848 スマン、ヒントが欲しかったんだ >>849 ,850 そういうことなのか?
853 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 18:40:31 ] 全文載せないでまともなヒントあげれると思ってんの? 載せるなら宿題スレ池だが
854 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 18:45:01 ] >>853 お前>>843 読んでないだろ
855 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 19:11:36 ] >>843 の文章だけでは題意が読み取れない これが分かっただけでもいいんじゃないか? っつーか問題の意図は出題者に聞けよ
856 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 19:24:25 ] >>852 問題文を他人に意味が伝わるように要約できない=テメーが問題文の意味を理解していない
857 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:00:24 ] >>856 理解できてないから質問してるんじゃないか?
858 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:04:09 ] 理解できてないなら要約すべきではないわけで >>852 みてイラっときた俺はたぶん短気なんだろう
859 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:04:20 ] まとめると、質問するなら要約するなってことだな
860 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:19:52 ] ある変数の値に応じて特定の処理をさせたいのですが、 値のパターンがかなり多い場合、 switch〜case文とif〜elseif文ではどっちのほうが処理が早いでしょうか ひとつの値に対しひとつの処理なので、どちらの文を使っても同じように処理できます (switch〜caseの場合はbreakで抜けるので) あんまり多い場合、関数の配列でも用いた方がいいのかもしれませんが……
861 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:23:18 ] 試せるなら実測しろ 試せないならどっちを使っても一緒。気にするだけ無駄。
862 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:27:22 ] switch 文にはジャンプテーブル最適化というのがあってだな、 その最適化が効けば case ラベルの位置のアドレスの表を使ってジャンプするようになる。
863 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:33:39 ] しかし分岐予測の効き方を考えるとジャンプテーブルの方が遅い場合もある 実測して比べるしかない
864 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:37:03 ] 多くの場合においてある1つの条件に集中するような場合は それだけ if して、その他を switch にするとか?
865 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:37:40 ] >>860 一般的にはswtichが効率的。 なぜならswitchはジャンプテーブルなり、各個比較なり、 コンパイラが最適なものを選択すると期待できるから。
866 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:13:05 ] >>857 問題が理解できないのなら、問題の意味を教えてくれと問うべきだし、 問題が理解できているのなら、その解決策に関して問うべきだし、 解決策があるていど目星が付いてるが、ひっかかる所があるならば、その点を問うべきだろ。 自分が理解できない問題を一部だけ示して教えろなんて、どんなバカだ。
867 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:14:30 ] 処理を後々追加する羽目になる可能性があればswitchの一択でしょ。
868 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:23:08 ] 顔真っ赤なやつがいるな いいかげんその話題は終われ
869 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:26:07 ] 上と似たようなどうでもいい質問なんだけど bool z = a() && b() && c() && d() && e(); みたいな文があったとき、a()から順に、最悪e()まで調べていくと思う。(&&演算子は必ず左から調べるよね ということは、e()が最も高確率でfalseを返す場合、e()を一番左に持って行った方が効率よくなりますよね? あと↑が正しいとして、コードの見栄や保守を考えて順番を変えたくないって場合、どうしますか?
870 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:30:01 ] あ、でも関数だから、ショートサーキットな評価は行われないのか… 書いた後に気づいた…
871 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:39:01 ] >>868 「その話題」がどの話題かわからないけど、「顔真っ赤」とか刺激してる時点で たぶん君も「終わらせない気満々」なんだよね。 終わらせようとしているのに同時に刺激してるなら、馬鹿丸出しだし。
872 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:39:13 ] >>870 > 関数だから なんでそう思うんだ?
873 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:39:48 ] >>870 ?
874 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:45:30 ] >>872 関数が実行されるかされないかによって、プログラムの挙動が変わることがあるから、って思った。 よく考えてみれば、 if (ptr && ptr->func()) とか書きますね・・・
875 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:49:23 ] > if (ptr && ptr->func()) これptrがNULLでも安全なの?
876 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:51:53 ] 871 これでも舐めておちつけ(´・ω・`)つ〔きゃらめる〕
877 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:55:45 ] >>875 ptrがNULLなら&&を通らないから大丈夫じゃない?
878 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:56:26 ] >>875 ptrがNULLの場合でも問題ない。 でも、ptrがNULLじゃなくても変なとこ指してる可能性は忘れるな。 それだけ見て本当の意味で安全かどうかはなんともいえない。
879 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:57:29 ] &&の評価順は左からと決まっている。
880 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 00:02:46 ] >>869 前半部分が正しい。 効率が良くなるが順番を変えたくない場合は個人的にケースバイケース。 効率が求められる部分ならば変更かける。(実測して効果があるかも試して) とはいえ、関数内に副作用があったり、今後そうなる可能性だってあるから 基本的に短絡評価をあてにした効率は求めないようにしている。 >>875 NULLなら短絡評価でptr->func()は評価されないため問題なし。
881 名前:デフォルトの名無しさん [2008/03/13(木) 00:49:53 ] make && make installみたいなものだよな。
882 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 02:25:29 ] >>869 割と適当に答えるけど、通常見かける && や || は短絡評価をあてにして cond && (cond が非ゼロの時のみ可能な処理) や (非ぜロの確率が低い式) && (非ゼロの確率が高い式) あるいは (軽い処理) && (重い処理) または (先に必要な副作用のある式) && (その後にのみ評価されるべき式) 等、 すでに正しい順序で記述されているので、並べ替えは不可ということが多いように思う。 もしそうでない場合はコードの質を疑っちゃうから、もしちゃんと動いているならなるべく 触らない⇒やはり並べ替えないだろうなあ。
883 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 03:13:39 ] #include <studio.h> int main(void) { puts("ローゼン「ローザmstcを入れて」"); puts("「次に、目玉を入れて」"); puts("真紅「ぎゃあああああああ」"); puts("ローゼン「あ、順番間違えた」"); return 0; } コンパイル通りません><
884 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 03:21:04 ] >>883 そうですね。ではおやすみ。
885 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 03:39:10 ] >>883 studio
886 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 05:08:18 ] 質問です。現在猫でもわかるC言語プログラミングというので勉強しているのですが、 関数の再帰呼び出しというところで #include<stdio.h> int main() { static int i = 1; if (i <= 10) { printf("i = %d\n", i); i++; main(); } return 0; } というのがあり、これを実行すると i = 1 i = 2 ・・・ i = 10 になるとなっていて、試してみたところ確かにそうなるのですが、 main内でmainをもう一度呼び出した際に static int i = 1; の部分でなぜ再度 i に1が代入されないのでしょうか? 初心者過ぎてバカかと思われるかと思いますが ご教授願えるとありがたいです。
887 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 05:17:07 ] static i = 1; //宣言かつ初期化 static i; //宣言のみ i=1; // 代入 初期化と代入は違うのです。 下のように書き換えてみるとどうなります?
888 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 05:20:28 ] ごめん、書き込んですぐだけど、そんなプログラムまわすべきじゃないね。 延々回り続けちゃう。 static int i=1; static int j; j=1; if(i<10){ printf("%d %d",i,j); i++; j++ main(); } return 0; } まわすならこっち。
889 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 05:23:47 ] >>886 >main内でmainを ml.tietew.jp/cppll/cppll_novice/article/1584 >static int i = 1; の部分でなぜ再度 ttp://d.hatena.ne.jp/unageanu/20070826
890 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 05:27:30 ] >>885 わかった!ありがとう!
891 名前:886 mailto:sage [2008/03/13(木) 05:59:43 ] なるほど、初期化というのが代入とごっちゃになって、 ちゃんと理解できてなかったことがよく分かりました。 887さん、889さん、ありがとうございました。
892 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 16:35:10 ] vector型で push_backの反対で、先頭に要素を追加するには どのようにすればいいのでしょうか
893 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 16:37:34 ] できません。 listとか使ってください。
894 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 16:42:01 ] そうですか 残念です。すごく これが出来れば完成なのに
895 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 16:50:34 ] 単純な質問があります。 Mainループ { @の計算 whilie(永久にループ) { Aの計算 } } このようなプログラムでは、@の計算をし続け、かつAの計算をし続けてもらえると思ったのですが @を一度計算したあとはAの実行をループします。 こういった処理をしたい場合はマルチスレッド処理?というのをしなければならないのでしょうか?
896 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 16:51:40 ] ジャパニーズでおk
897 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 16:52:15 ] >>892 vectorの先頭への挿入は効率が悪いからpush_frontは提供されていない。 どうしても必要ならinsert
898 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 16:55:00 ] 無限ループ作ったらずっとそこで回り続けるに決まってるじゃないか。
899 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 16:57:24 ] >>898 ありがとうございます。やっぱりそうゆうものですよね。
900 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 17:17:11 ] 待てよお前らwww vectorでpush_frontを使いたいって言われて、なんでlist薦めたり、insert薦めたりなんだよwww deque教えてやれよちゃんとww
901 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 17:34:44 ] それよりもっと良いのは ufcpp.net/study/stl/characteristics.html www5c.biglobe.ne.jp/~ecb/cpp/07_04.html のようなページを教えてあげること。 そして一番良いのは、今後同じ様な問題を自己解決出来るようにしてあげること。 「stl コンテナ」でググれ。
902 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 18:59:00 ] >>900 >これが出来れば完成なのに この言葉に心奪われたんだ。
903 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 18:59:58 ] >>900 dequeにもvectorに劣る欠点はあるしなあ。なんともいえん。
904 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 20:04:03 ] 初心者なんざ全部vectorで充分
905 名前:デフォルトの名無しさん [2008/03/13(木) 20:39:41 ] 窓の杜も忘れないであげて。
906 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 21:08:38 ] そういえば、去年だかの窓の社で紹介されていたいもうとデスクトップ、 どうやら動くものが出来つつあるらしいな。
907 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 01:36:10 ] C++ の入門書を探しています。C言語の知識はありません。 ネットで検索してみると 柴田望洋『新装版 プログラミング講義C++』(ソフトバンククリエイティブ) 塚越一雄『はじめてのC++』(技術評論社) 日経ソフトウエア編『ゼロから学ぶC/C++』(日経BP社) あたりがC言語の知識が無い初心者にとっての C++ の入門書らしいのですが, この3冊の中で特にお薦めなものとその理由を教えていただけませんか?
908 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 01:42:59 ] すべての書籍を持ってる人なんているのかな?個人的にはどれでもいいと思う。というより、別にネットでもいいのでは? 書籍がいいというのであれば、大きめの本屋にいって立ち読みで少し目を通してわかりやすそうなのを選ぶ。
909 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 01:48:40 ] 本気でやるなら三冊とも買えばいいと思う 出費したくないなら入門サイトでも探して勉強するのがいい
910 名前:907 mailto:sage [2008/03/14(金) 01:53:06 ] 確かに,3冊とも持っている方はほぼいないでしょうね。 では,この3刷のどれかを読んで感じた長所・短所を教えていただけませんか?
911 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 02:00:34 ] >>910 つ pc11.2ch.net/test/read.cgi/tech/1202273631/
912 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 02:16:07 ] 独習と林晴比古ってどうなんだろう。
913 名前:デフォルトの名無しさん [2008/03/14(金) 03:14:18 ] >>912 独習は基礎知識と問題集 林はC言語で知識止まってる
914 名前:デフォルトの名無しさん [2008/03/14(金) 08:03:07 ] 林と柴田の本はケツを拭く紙にもならない
915 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 09:12:16 ] C++はロベール見ておけばよくね? ロベールでぐぐれば一番上にくるよ
916 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 09:49:23 ] テンプレート周りまでカッチリやりたかったらC++Primer 4/Eにしとけ。 値段は張るがまあいい本だ。
917 名前:デフォルトの名無しさん [2008/03/14(金) 11:43:37 ] 循環小数のことについて知りたいのですが。 vc6.0からC#に移って久しぶりにこの問題に直面 しました。 double d; d=1.2-1.1; が0.0999999になりますが循環小数でない数の 0.0999999とどうやって見分けをつけたらいいのでしょうか。 0.1だけだったら分かるかも知れませんが他にも循環小数が いっぱいあるし自動的に調べられるようにしたいです。 丸めればいいとか1000000倍して必要なときだけ/10000000 すればいいとかいろいろ意見はあるでしょうが単に見分ける方法 とか聞きたいです。
918 名前:デフォルトの名無しさん [2008/03/14(金) 11:50:05 ] プログラムに循環小数は無いだろう 無限の値を保存できない
919 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 11:57:42 ] >>917 double d1 = 1.2 - 1.1; //d1 == 0.099999999999999867 double d2 = 0.099999999999999867; で、 d1 != d2ということが知りたいの?
920 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 12:03:20 ] その手の誤差は浮動小数点の宿命。 完全に一致したり不一致したりを確認することはできないから、 その計算で出る誤差の最大を取って±誤差に収まってるものを一致するとみなしたりする。 そういう誤差が許されない処理をしたいなら整数型でなんとかするしかない。
921 名前:デフォルトの名無しさん [2008/03/14(金) 12:36:02 ] >>917 一応C++で浮動小数点の比較をやりたいときは、 double a,b;//こいつらには適当な数値がはいってるとして if (abs(a-b)<=std::numeric_limits<double>::min()) { // a == b } else { // a != b } おれはこんな書き方を習ったけど、これでもすべてのケースを正しく判定できるわけではないからなあ。
922 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 12:39:43 ] あるクラスのメンバ変数に関数へのポインタを与え、 そのクラスのメンバ関数にアクセスしたいのですが、 代入の仕方が分かりません グローバル関数へのポインタなら問題なく出来るのですが
923 名前:デフォルトの名無しさん [2008/03/14(金) 12:40:05 ] int ary[100] = {0}; int100個の配列を0で初期化したいとき、このコードは規格に沿ってますか? 手元のg++だと動くんですが、、、
924 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 12:41:29 ] そもそも 1.2 とか 1.1 とか 0.1 って定数が正しく 1.2 や 1.1 や 0.1 を表してるわけじゃないから、 正しく判定ったって、何がどう正しいのやら
925 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 12:42:19 ] >>922 メンバ関数ポインタでぐぐる >>923 沿ってます
926 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 12:42:37 ] >>923 沿ってない ary[1]〜ary[99]は初期化されない
927 名前:922 mailto:sage [2008/03/14(金) 12:57:06 ] >>925 ちょっと説明不足でした インスタンスごとにポインタに代入するメンバ関数を変えたいんですよね main関数内で宣言・代入する方法はいくらでも見つかるんですが、 コンストラクタのようなメンバ関数内で宣言・代入する方法が分からなくて
928 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 13:03:04 ] こうか? class Foo { public: void (Foo::*func)(); Foo(int){ func = &Foo::bar; } Foo(bool){ func = &Foo::hoge; } void foo(){ (this->*func)(); } void bar(){ cout << "bar"; } void hoge(){ cout << "hoge"; } }; int main() { Foo a(1); Foo b(true); a.foo(); b.foo(); }
929 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 13:15:08 ] >>923 C++なら規格に沿ってる Cだと沿ってなかったような気がするが…
930 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 13:18:03 ] >>928 それです! >void (Foo::*func)(); ここが分かっていませんでした ありがとうございました
931 名前:デフォルトの名無しさん [2008/03/14(金) 13:49:37 ] >919 そうです。 >921 確かに整数値に直すしかなさそうですね。 丸める方法も0.00001の誤差を判定するときも 0.09999の次の9を丸めて0.1にしたらえらい違い になりそうな気がするし。 確実に循環してると分かっているなら丸めてもいいと思うけど そうでない場合は困るね。 >921 それでも確実じゃないと言われると絶望的? VC6.0はどうやって判断していたんだろう。
932 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 13:50:09 ] >>930 >main関数内で宣言・代入する方法はいくらでも見つかるんですが これ嘘くせえな おまえちゃんと読んでないだろ
933 名前:デフォルトの名無しさん [2008/03/14(金) 14:08:50 ] >>929 Cでも沿っている。
934 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 14:17:17 ] しつもんです。 int hoge [][3] = { {0,0,0}, {1,1,1}, {0,1,0}, }; のような配列で hoge[1]; とやると hoge[1][0]のアドレスを返して来るでよろしいでしょうか?
935 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 14:19:14 ] >>931 別に循環はしてないよ これ実行してみ int main() { printf("%.70f\n", 1.2); printf("%.70f\n", 1.1); printf("%.70f\n", 1.2 - 1.1); }
936 名前:デフォルトの名無しさん [2008/03/14(金) 14:24:19 ] >>931 どうやって判別しているのかは、仮数部と指数部が完全一致だろう
937 名前:デフォルトの名無しさん [2008/03/14(金) 14:28:56 ] >>934 うん。 int a[3];でa==&a[0]なのと一緒だからね。
938 名前:デフォルトの名無しさん [2008/03/14(金) 14:29:38 ] 扱う数によってどの位の誤差ならいっちしていると見なすか各自で判定すればいい 100億と100億1くらいならば同一と見なすとか・・ 0.0001なら1の誤差は大きい GOSA = 0.999と定義して、x = yであることを x*GOSA < y < x/GOSA としたらどうか?
939 名前:デフォルトの名無しさん [2008/03/14(金) 14:33:04 ] 計算量を減らすなら 0.999 < x/y < 1.001 の判定にすれば良いか
940 名前:デフォルトの名無しさん [2008/03/14(金) 14:49:12 ] >935 すいません。VC6.0からC#間がないので、 stdio.hをインクルードする方法(できるの?)が分かりません。 代わりに次のようにしてみたら・・・、 static void Main(string[] args) { Console.WriteLine(1.2 - 1.1); } 0.0999999999999999 となりました。
941 名前:デフォルトの名無しさん [2008/03/14(金) 14:51:41 ] >939 なるほど。参考にしてみます。
942 名前:デフォルトの名無しさん [2008/03/14(金) 15:01:04 ] 初めに|x - y| < 1 などを調べておくと高速化できるな
943 名前:デフォルトの名無しさん [2008/03/14(金) 15:03:12 ] 仮数部、指数部を直接調べていけばより高速化出来るな 指数部が2以上ずれていれば駄目だろう
944 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 15:29:33 ] >>940 C#ならdecimal型を使えば解決 static void Main(string[] args) { decimal d = 1.2m - 1.1m; Console.WriteLine(d); }
945 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 15:35:36 ] 初心者スレで >>926 みたいな嘘付くのは良くないよね・・・
946 名前:デフォルトの名無しさん [2008/03/14(金) 16:00:02 ] #include <iostream> #include <cstdlib> using namespace std; int main() { cout << rand() << endl; cout << rand() << endl; } このようにプログラムをコンパイルし実行してみると何度やっても 0 1481765933 となります。乱数当てプログラムみたなのも全部0が生成されてしまいます。 コンパイラはcygwinのg++です。なぜなんでしょうか???
947 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 16:04:10 ] >>946 しょせん擬似乱数だから srandで異なるシード値を与えれば変わる
948 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 16:36:37 ] class X { public: const int tbl[2]; }; 非staticでconstの配列をメンバーに持たせることは可能ですか?
949 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 16:44:49 ] >>948 こう? class X { public: const int tbl[2]; }; int main() { X x = {{96,43}}; cout<<x.tbl[0]<<x.tbl[1]<<endl; }
950 名前:デフォルトの名無しさん [2008/03/14(金) 16:54:23 ] >943 ここまでしないとだめ? 確かにそれだと指数部を見ただけで二つの値が違うかどうか 分かりそうだけど。
951 名前:デフォルトの名無しさん [2008/03/14(金) 17:00:01 ] >944 いいですね。しかし128ビットも使うのは少し嫌ですね。 unsigned short decimal とか使いたい^^
952 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 17:05:54 ] >>946 ちゃんとsrandにガンダムシードを与えないと。
953 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 17:24:35 ] >>949 説明不足でした。 コンストラクタで初期化できるかどうかです。 もう少し込み入ったクラス class X { public: int mi; virtual void mf(); double md; private: const int tbl[2]; };
954 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 17:28:42 ] >>953 むり
955 名前:バラ [2008/03/14(金) 17:31:15 ] c言語で ”山田太郎”は0008バイトあります。 とmystrlenを使ってと表示させたいのですが やり方教えてください。 お願いします。
956 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 17:34:16 ] #define mystrlen strlen
957 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 17:47:22 ] >>954 thx 規格でもそうなってる?
958 名前:バラ [2008/03/14(金) 17:48:53 ] 956 mystrlen関数だけをを使いたいのですが。 strlenは使用禁止だそうせす。 詳しく教えてください。
959 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 17:53:04 ] 宿題スレ行け
960 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 17:53:19 ] > strlenは使用禁止 仕方がないな。 int mystrlen(const char*p){ return strchr(p,0) - p; }
961 名前:デフォルトの名無しさん [2008/03/14(金) 17:55:00 ] 素直にdecimal型を使うことにします。 皆さま、いろいろとありがとうございました。
962 名前:バラ [2008/03/14(金) 17:57:35 ] ほ〜^^。 ありがとうございます。
963 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 18:26:55 ] まず間違いなく先生にツっこまれるな
964 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 18:42:37 ] じゃあこれでどうだ? int mystrlen(const char *str) { char buff[512]; return sprintf(buff, "%.500s", str); }
965 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 18:43:43 ] void mystrlen() { printf("\"山田太郎\"は0008バイトあります。"); } 一応質問文からだとこれでもあながち間違いじゃない
966 名前:バラ [2008/03/14(金) 19:20:51 ] #include <stdio.h> #include <stdlib.h> #define STRING "山田太郎" int mystrlen(char *p) { /*i初期化*/ int i = 0; /*\0ならば抜ける*/ while(*p != '\0') { /*pを増やす*/ p++; /*iを増やす*/ i++; } /*iを返す*/ return i; } int main() { /*バイトを表示*/ printf("%s は %04d バイトです.\n", STRING, mystrlen(STRING)); /*0を返す*/ return 0; } できました。ありがとうございます
967 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:22:29 ] 圧倒的なひらめき っ BCD
968 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:31:19 ] 「先生に車輪の再発明は不毛です。」と告げるのじゃ。
969 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:34:10 ] 車輪の再発名は勉強にはいいのじゃ。
970 名前:パラ mailto:sage [2008/03/14(金) 19:38:27 ] 何をどうやっても山田太郎が12バイトになってしまいます… どうやったら8バイトにすることでができるんでしょうか…
971 名前:教えてください>< mailto:sage [2008/03/14(金) 19:39:08 ] 関数ってなんですか?
972 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:39:31 ] UTF-8 なら 12 バイトだから正常だと思うぜ。
973 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:40:07 ] >>971 中学校からやり直してください
974 名前:教えてください>< mailto:sage [2008/03/14(金) 19:46:37 ] この歳では中学校に通う暇がないんです>< c++における関数の定義が知りたいんです><
975 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:49:48 ] その歳なら本買え。
976 名前:教えてください>< mailto:sage [2008/03/14(金) 19:51:32 ] 本を買いに行ってる時間が無いんです>< 今教えていただけませんか?><
977 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:52:30 ] ならググれ。 C++ の入門サイトがあるだろう。
978 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:53:14 ] googleで検索したほうが時間の節約になる
979 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:55:35 ] 問題解決能力がないとこの先生きのこれないしな。
980 名前:教えてください>< mailto:sage [2008/03/14(金) 19:56:18 ] なんで皆さんそんなに冷たいんですか?>< 分かる人から分かりやすく聞いた方が理解しやすいと思って書き込んだのに!>< 何のための掲示板ですか?!><
981 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:58:08 ] お前のためを思ってるからこう言ってるんだ。 こんな質問するなんて、お前のこの先が凄く心配だからな。
982 名前:教えてください>< mailto:sage [2008/03/14(金) 20:01:41 ] 分かりました。さてはあなたたちも説明できないのですね>< 説明してくれる人が現れるのを待つことにします。 このスレッドが1000行くまで待ちます><
983 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:03:21 ] f(6)=2 fが関数。中の構造は何でもいい。
984 名前:教えてください>< mailto:sage [2008/03/14(金) 20:04:17 ] ラーメンうめえwwwwwww
985 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:04:40 ] >>976 ほれ ttp://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0
986 名前:教えてください>< mailto:sage [2008/03/14(金) 20:05:08 ] 誤爆しました><
987 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:06:10 ] これはひどい
988 名前:教えてください>< mailto:sage [2008/03/14(金) 20:08:50 ] 985さん つまりc++の関数とはサブルーチン機能のことなんですね!>< ありがとうございました>< ラーメンおいしいです
989 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:39:56 ] スレ違いかもしれんが自転車こいで電力ためるのってどういう装置がいるんだ?
990 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:40:57 ] 蓄電池だろ
991 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:48:48 ] 重りを上に上げて、位置エネルギーから電気を取り出す機械ってのもあったな スレチだが
992 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:58:50 ] 揚水発電もその一種だな
993 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:01:17 ] 今更だけど本屋行く時間はないのに誰かが答えを書くのを待つ時間はあるんだな。
994 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:02:45 ] 建てた。 【初心者歓迎】C/C++室 Ver.51【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1205496128/l50
995 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:08:15 ] >>994 乙 >>989 発電機もいる コイル+磁石 で電磁誘導がどうたら 発生する電流は交流だから整流してこうたら 蓄電池に充電する際には一定以上の電圧(蓄電池による)が必要になるからうんたら で、スレチというより板違い
996 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:16:01 ] どう考えてもスレチなのに答えてくれるお前らに感動した
997 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:29:31 ] こんなんでましたけど〜 無かった事にしておこうか… 【初心者歓迎】C/C++室 Ver.50【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1204124447/ 実はこのスレよりも古いようだ 【初心者歓迎】C/C++室 Ver.50【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1204124499/
998 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:29:38 ] >>994 乙
999 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:41:19 ] 【初心者歓迎】C/C++室 Ver.50【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1204124447/ こっちまだ残ってるけど使わないの?
1000 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:54:54 ] 1000 なら 【初心者歓迎】C/C++室 Ver.50【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1204124447/ は超高速質疑応答で消費される
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。