1 名前:デフォルトの名無しさん mailto:sage [2009/05/14(木) 20:35:36 ] スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。 過去ログ スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/ スレを勃てるまでもないC/C++の質問はここで 3 pc11.2ch.net/test/read.cgi/tech/1187521676/ スレを勃てるまでもないC/C++の質問はここで 4 pc11.2ch.net/test/read.cgi/tech/1221633708/ スレを勃てるまでもないC/C++の質問はここで 5 pc11.2ch.net/test/read.cgi/tech/1230516307/ スレを勃てるまでもないC/C++の質問はここで 6 pc11.2ch.net/test/read.cgi/tech/1231564903/ スレを勃てるまでもないC/C++の質問はここで 7 pc11.2ch.net/test/read.cgi/tech/1232983248/ スレを勃てるまでもないC/C++の質問はここで 8 pc12.2ch.net/test/read.cgi/tech/1235921779/ スレを勃てるまでもないC/C++の質問はここで 9 pc12.2ch.net/test/read.cgi/tech/1240022781/
962 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 10:23:58 ] Webを参考に全ての順列を列挙するプログラムを作ったんですが、 これをnPkが列挙できるように改良するにはどうすれば良いですか 引数を一つ増やして(int k) 終了条件をt.size()==kとしてみましたが 予想よりも多く結果が出力されてしまってうまくいきません void perm(int p,vector<int>& v,vector<int> t){ if(t.size()==v.size()){ copy(t.begin(),t.end(),ostream_iterator<int>(cout," "));cout<<endl; } for(int j=p;j<v.size();++j){ t.push_back(v[j]); perm(p+1,v,t); t.pop_back(); perm(p+1,v,t); } } int main(){ vector<int> v(5),t; for(int i=0;i<5;++i){v[i]=i;} perm(0,v,t); }
963 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 13:37:58 ] C言語でマイコンからLCDに文字列を出力するプログラムで void PutString(char* point); void PutChar(char data); main(){ PutString("Hello,world!"); } void PutString(char* point){ while(*point){ PutChar(*point); ++point; } } void PutChar(char data){ //LCDに1文字出力し、カーソルをインクリメントする } 上記のプログラムが正常に動くのですが PutString("Hello,world!"); 文字列のリテラルとchar型ポインタは型があわないはずなのに なぜこの行がエラーにならず正常に動のでしょうか? マイコンというよりCの言語仕様の話だと考えたのでこっちに質問しました。
964 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 13:42:06 ] 俺も最近マイコンのプログラムに触れて思ったけど、 マイコン向けのコンパイラってANSIとかに厳密に追従してない感じだな ところどころ気持ち悪い
965 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 13:47:46 ] 標準出力? 何ソレ? みたいな環境もあるからな。 それはしゃーない。
966 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 14:05:57 ] >>963 "Hello,world"はchar[12]型。 それが配列からポインタへの変換でchar*になる。 型の問題はどこにもないぞ。
967 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 14:15:59 ] ヒント:リテラル
968 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 14:23:34 ] え?文字列リテラルは書き換えできなくてもchar*に変換できるだろ。
969 名前:963 mailto:sage [2009/06/13(土) 15:52:05 ] >>964-968 アドバイスサンクスです。 関数コール時に一時的にメインメモリ上にchar[12]の領域が確保され そのポインタが渡され、型の問題が生じない。という理解で良いですか。 char[12]が一時的に確保されたなら、その領域が解放されるのは PutString("Hello,world!"); を抜けた時でしょうか。
970 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 16:12:22 ] いいや、一時的な領域が作られることはないよ。 基本的に、文字列リテラルは予め用意された静的な領域に置かれるが、 そこへのポインタそのものがPutStringの引数として渡される。
971 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 16:20:01 ] 型安全についてCよりも厳しくなったC++では この変換を「死の変換」と呼ぶ。
972 名前:963 mailto:sage [2009/06/13(土) 16:26:04 ] >予め用意された静的な領域に置かれる 納得しました。 >>971 「死の変換」ですか・・・ 関数から抜けた後は、その文字列リテラルへのポインタがわからなくなり 永遠にアクセスできない領域になってしまうためそう呼ばれるのでしょうか。 char hello[12] = "hello,world!" と最初のほうに書いておき、 PutString(hello); とやるほうが望ましいでしょうか。
973 名前:デフォルトの名無しさん [2009/06/13(土) 16:28:43 ] C++でnamespaceの名前つけかたのルールみたいなものってあるんですか? Javaだと全部小文字でドメイン名をひっくり返したものとか、あるけど。 大文字で始まってるのよく見る気もするし。 ドットが入ってるのあんまり見ないし ドメイン名っていうのはかぶらないのでいい方法だと思うけど yahoo.co.jpだったらどんなのつけます?
974 名前:デフォルトの名無しさん [2009/06/13(土) 16:31:59 ] そういうのは、プロジェクトポリシーで決まるんじゃねーの
975 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 16:36:10 ] >>972 いや、それよりもPutStringの引数にconstつけろよ。
976 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 16:40:57 ] >>973 全世界にソース公開とかじゃない限り「絶対にかぶらない名前をつける」ってのは 重視しなくていいんじゃないかな。 ちなみに、自分はクラス名と同じ命名規則。
977 名前:デフォルトの名無しさん [2009/06/13(土) 16:44:55 ] プログラムのわかりやすさではstringだな。 生成と動作のコストがかかるが。
978 名前:デフォルトの名無しさん [2009/06/13(土) 16:52:01 ] 長い文字列、データをソース内に貼り付けるとコンパイル時間かかりサイズもでかくなる。 計算や短い文から生成できるならそれ使うべき。
979 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 17:29:48 ] 日本語の識別子を使う人なんてめったにいないだろうから namespaceで日本語を使えば被る確立はほとんどないだろう コンパイラ依存だけど
980 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 17:57:37 ] >>979 どう考えたって、 仕様違反のコンパイラ依存に確実になるくらいなら namespaceがかぶる危険があるってだけの方が まだマシだと考えるヤツが大半だと思うが。 ローマ字に止めるべし。
981 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 18:01:00 ] 和製英語のローマ字読み最強
982 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 18:19:57 ] BOOL bBlockConnect(char * pAddr, int iPort, unsigned int uiMsg); int iOnSocketEvent(WPARAM wParam, LPARAM lParam); BOOL bInitBufferSize(DWORD dwBufferSize); XSocket(HWND hWnd, int iBlockLimit); virtual ~XSocket(); int m_WSAErr; BOOL m_bIsAvailable; BOOL m_bIsWriteEnabled; void _CloseConn(); int _iSendUnsentData(); int _iRegisterUnsentData(char * cData, int iSize); int _iSend(char * cData, int iSize, BOOL bSaveFlag); int _iSend_ForInternalUse(char * cData, int iSize); メンバ関数の 始まりの文字が b -> return BOOL i -> return int と規則的に作られてるのですが _ (アンダーバー)で始まるのは何の意味があるのでしょうか?
983 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 18:24:17 ] 実装した奴が、そうしたかったから 言語仕様での意味はないはず。
984 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 18:39:53 ] privateなメンバとか。何か規則があると思う。 スコープがクラスだから、_[a-Z]+()なメンバ関数があっても他のスコープと識別子がかぶることはないが、 _[a-Z]+で始まる識別子は予約されているので、マクロで置き換えられたときに嵌まるおそれがある。
985 名前:デフォルトの名無しさん [2009/06/13(土) 19:00:49 ] STLのmapの容量はかってみた。 <int,int>で2の21乗個登録したら、127M使用していた。 一個あたり、64バイト。 通常の配列だと4バイト、16倍も消費量が多い。 もっと少なくなるやつある?