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/
623 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:51:15 ] >>621 C++ なら vector を使えばいいです。 Cでは直接配列を値渡しすることはできないので、 構造体の中に入れて、構造体を値渡ししましょう。
624 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:56:06 ] >>623 アリガトゴザイマす
625 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 04:23:23 ] 初心者です。 Cの参考書でメモリ関連の事が良く出てきます。 バイトとかビットとか2進数、10進数とか出てきますけど、これらはスルーしても 良いんでしょうか? HTMLで例えるなら#ffffffみたいな感だったので・・・。 これは覚えたほうがいいんでしょうか。 わけわからないんですが
626 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 04:54:02 ] スルーしちゃらめぇ。
627 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 06:24:57 ] >>625 C言語はそう言うのを扱うのが醍醐味というか、 それが分からないと全然まともに使えないと思われる。 理系なら分かるでしょ?がんばれ!
628 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 07:46:11 ] 授業で言うなら、最初の3回くらいまでは知らなくてもなんとかなりそうな気はするけど せいぜいそれくらいだよなあ。
629 名前:デフォルトの名無しさん [2009/06/04(木) 17:39:26 ] C++の質問です。 あるクラスの、あるメンバ関数からしか参照されないことが分かっている変数があるとします。 この関数が呼び出されたあとも、変数の内容を保持したい場合は、どのようにするのがスマートでしょうか? ・メンバ変数にする → 数が多いと、ヘッダに書く量が増えて見通しが悪くなるかも? ・呼び出し側で変数を用意しておき、引数でその都度渡す → 呼び出し側の手間が増える。数が多いとかなり大変。 ・staticを付ける → オブジェクトごとに個別の値を持てなくなる
630 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 17:42:17 ] そのときの変数の性質や役割による。 手間隙とかは関係ない
631 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 17:50:18 ] ああごめん、途中で質問を書き直したら 頓珍漢な内容になってました。 以下の3パターン以外に方法はないのでしょうか、で。 思いついた3つのうち、いずれの方法を取るにしても何らかの欠点があるので。
632 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 17:57:18 ] 制約がないなら好きにすればいい
633 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 17:58:41 ] >>629 ・メンバ変数にする → 数が多いと、ヘッダに書く量が増えて見通しが悪くなるかも? これがやっぱり一番自然でしょ。 と俺は思う。 いくつあるのかしらないが、そんなに多いならクラス内クラスを作るとかすれば?
634 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 17:58:43 ] ・関数オブジェクトを用いる。
635 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 18:08:35 ] C言語勉強中なんですが、宿題で 「ファイル名を自分で設定しそのファイルに、EOFを行うまで スペース区切りの二つの整数を何回でも入力できるようにし、 それをファイルに改行して記録しなさい」 というのがあり、 #include <stdio.h> int main() { int a,b; FILE *fp; char name[100]; printf("ファイル名を入力してください\n"); scanf("%s",name); fp=fopen(name,"w"); printf("数値を入力してください\n"); while(scanf("%d %d",&a,&b)!=EOF){ scanf("%d %d",&a,&b); fprintf(fp,"%d,%d\n",a,b); } fclose(fp); return(0); } というプログラムを作ったんですが、なぜか 数値を入力した際に記録される時とされない時があります。。。。 どなたか解決策を教えていただけないでしょうか?
636 名前:デフォルトの名無しさん [2009/06/04(木) 18:36:32 ] スレの皆様に質問です。 8ビットbitmapファイルを読み込み、各ピクセルに演算を加え、別ファイルとして出力するプログラムを作っています。 演算結果をint型の変数ifooに格納し、unsigned char型にキャストしてputしています。 ifooがunsigned char型の範囲外の値の時は、範囲の端の値を代入しています。 //fin,foutのファイル上の位置は適切な場所にあるとする for (int y=0 ; y<height ; ++y){ for (int x=0 ; x<width ; ++x){ int ifoo = fin.get()*A+B; if(ifoo<0) ifoo=0; if(ifoo>255) ifoo=255; fout.put((unsigned char)ifoo); ++i; } //bmpファイルの幅は4の倍数ピクセルとする } 先輩が組んだプログラムはこれの2倍以上速いのですが、AとBがハードコードされていて ソースコードは失われ、先輩本人は行方知れずです。。。 そのためA,Bを引数で与えられるように、イチから再作成しています。 1000x1000pxのBMPを一度に数千枚〜数万枚単位で処理するため このループ部分をもっと高速化したいです。何か良いアイデアは無いでしょうか。 ちなみにこの部分以外に目立ったループ箇所は無いです。
637 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 18:48:13 ] >>636 1. ループの中で ファイルIOするのは遅すぎるので、 一度メモリに全部読み込んでから変換→ファイルに書き出しを行う。 (全部読み込めないほどメモリが少ないのなら、一部ずつとか) 2. SIMDで複数pixelを同時に処理するか、OpenGL or DirectXのpixelシェーダ書く
638 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 20:50:01 ] >>637 早速ありがとうございます。とりあえず1を試してみます。 環境書き忘れて申し訳なかったですが、Windowsのプロンプトから呼ぶプログラムをgccで作っています。 2の手法はVisualStudio等を使って行う方法でしょうか? そのうち勉強してみたいと思います。
639 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 20:56:08 ] >>638 インラインアセンブラ
640 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 20:57:00 ] と外部ライブラリ
641 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 21:17:36 ] usingを解除することはできますか? namespace { using foo::CFoo; class CBar { public: void hoge(CFoo); }; } みたいにやってるんですが副作用があるのかどうか気になってます
642 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 21:21:29 ] >>638 最近だとインラインアセンブラのほかに<emmintrin.h>なんかの組込関数という手もある。 いずれにせよgccでも使える。
643 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 21:23:37 ] まぁまずないとは思うけど最適化オプションの存在は知ってるよね?
644 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 21:37:23 ] >>635 while(scanf("%d %d",&a,&b)!=EOF){ fprintf(fp,"%d,%d\n",a,b); } としてみるべし
645 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 21:40:54 ] デートは家でまったりしたいのですが 女性から見ればNGですか?
646 名前:デフォルトの名無しさん [2009/06/04(木) 21:43:37 ] Rubyを教えてくれるならOK
647 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 21:43:39 ] >>645 死ね
648 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 21:44:20 ] >>645 誤爆サーセン
649 名前:636 mailto:sage [2009/06/04(木) 22:05:38 ] >>639 アセンブラはマイコンで少々やったことがあるので挑戦してみます。 ただ後年に後輩が読めなそうなので、教授が許してくれなそう・・・orn >>>640 外部ライブラリというと、そういう処理が高速にできる ライブラリを他から持ってきちゃえということでしょうか? >>643 恥ずかしながら知らなかったです。 軽くググってみて、とりあえず -O3 をつけて変化を観察することにします。 プログラムを大学に置いてきてしまったので、有意な変化があれば明日報告します。 皆様アドバイス有難う。
650 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 22:46:58 ] あと、流行りの並列処理も最近のコア沢山なCPUには効くぞ。 gccならOpenMPが使えるし。
651 名前:636 mailto:sage [2009/06/05(金) 14:13:30 ] >ループの中で ファイルIOするのは遅すぎるので >一度メモリに全部読み込んでから変換→ファイルに書き出しを行う。 new で uint8(unsigned char)型の readbuf,writebuf を、int型のcalcbufを確保し 以下のように書き換えたところ、>>636 より約6倍も高速化しました。 fin.read((char*)readbuf,width*height); int i=0; for( int y=0 ; y<height ; ++y){ for( int x=0 ; x<width ; ++x){ calcbuf[i] = readbuf[i]*A+B; if(calcbuf[i]<0) writebuf[i]=0; else if (calcbuf[i]>255) writebuf[i]=255; writebuf[i] = (uint8)calcbuf[i]; ++i; } //bmpファイルの幅は4の倍数ピクセルとする } } fout.write((char*)writebuf,width*height); ○vector<uint8> foo でバッファを確保した場合 read()にchar* が渡せないからダメ。 という判断から、バッファはnewで確保しました。 ○ループ中の2回のif文をelse if でまとめ、比較演算回数の減少を図りました。 (気休め程度だと思ったので、これ単体の効果は未計測) 「先輩と互角」という目標を軽くクリアし、先輩の倍以上高速なプログラムになりました。 最適化オプション、インラインアセンブラ、並列化等もこれから試してみたいですが 目標クリアしたためとりあえず質問は終了させて頂きます。 スレの皆様ありがとうございました!
652 名前:デフォルトの名無しさん [2009/06/05(金) 14:20:51 ] アセンブラ化は効果なし。 もっとも時間かかるのはディスクアクセス。 Windowsであれば、Noバッファリングで読み込んでみて。 バッファリングありより倍以上の速度になる。 あと、一度にたくさん読み込んでも逆に遅くなる。 100M読み込むより、4Mや2Mずつのほうが速い。 データが仮想メモリ(HDD)に移動してしまう可能性が高い。 自分の環境では4M以上は速度は上がらなかった。
653 名前:デフォルトの名無しさん [2009/06/05(金) 14:24:21 ] ちなみに一度に一斉に書くのも遅くなる。 メモリ不足になるという理由で。 入出力バッファは、1M〜4Mくらいにして、使い回すのが吉。
654 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 14:27:13 ] 並列化もきっと意味ないだろうなぁ
655 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 14:27:21 ] calcbuf[i] = readbuf[i]*A+B; if(calcbuf[i]<0) writebuf[i]=0; else if (calcbuf[i]>255) writebuf[i]=255; writebuf[i] = (uint8)calcbuf[i]; ↓ tmp = readbuf[i] * A + b; if (tmp < 0) tmp = 0; if (tmp > 255) tmp = 255; writebuf[i] = (uint8) tmp;
656 名前:デフォルトの名無しさん [2009/06/05(金) 14:29:14 ] 2008-04-30 大容量ファイルI/Oの効率について 其の弐 FILE_FLAG_NO_BUFFERING 指定のないReadFile() -赤線- リニアにアクセス速度が低下していく。大容量ファイルのリードを行うことに対して Windows の I/O バッファリングアルゴリズムにパフォーマンスバグがあると思われる。 FILE_FLAG_NO_BUFFERING を指定すれば回避できるとはいえ、 コンシューマ市場向けにもTBクラスのストレージが出回ってる昨今、これは致命的な問題だと思う。 FILE_FLAG_NO_BUFFERING 指定のあるReadFile() -緑線- 2GiB の読み込みに概ね12-13秒台の高速でコンスタントなアクセス速度を誇る。(・∀・)イイ!! img.f.hatena.ne.jp/images/fotolife/w/wraith13/20080430/20080430231453.png d.hatena.ne.jp/wraith13/20080430/1209565632
657 名前:デフォルトの名無しさん [2009/06/05(金) 14:34:48 ] bmpではなくjpgなら、アセンブラ化は効果あるだろけど bmpはサイズがでかいからな。 処理内容が複雑 (ディスク読み込み時間と比べて速すぎない) なら並列化は効果あるだろけど 単純なものをスレッド化すると、スレッドの呼び出し時間がかかり、余計に鈍くなり得る。
658 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 19:59:01 ] implementationは実装と訳せばいいのですか?
659 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 20:33:17 ] >>656 バッファリングなしの非同期読み取りだともう少し速くなるのだろうか?
660 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 21:24:22 ] >>658 そうです^^
661 名前:658 mailto:sage [2009/06/05(金) 21:31:46 ] >>660 ありがとうございます。
662 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 01:54:30 ] 関数を呼びまくるとスタックオーバーフローを起こします。 スタックを増やす以外にどんな解決方法がありますか?
663 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 02:01:52 ] 関数オブジェクトをヒープに置く。
664 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 02:23:44 ] >>662 再帰呼び出しが原因ならば、アルゴリズムを工夫して再帰が深くならないようにする。 そうでなければ、ローカル変数域を減らす。特にバッファ。
665 名前:デフォルトの名無しさん [2009/06/06(土) 05:33:46 ] 配列の要素の組み合わせを出力したいのですが、 実装をどのようにするか迷っています・・・ 配列 int array[10] = {0,1,2,3,4,5,6,7,8,9}; 出力 {0}, {1}, {2}, {3}... {9} {0,1}, {0,2}, {0,3}... {8,9} {0,1,2}, {0,1,3}... {7,8,9} ... {0,1,2,3,4,5,6,7,8,9} このような出力を実現するにはどのようにコードを組めば効率が良いでしょうか?
666 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 05:41:25 ] ヒント:二重ループ
667 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 06:29:22 ] なんだよそのヒントw >>665 は一応実装はできるけど 最適な実装ロジックを聞いてるんでしょ。
668 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 06:47:20 ] いや二重ループが一番のヒントだろ
669 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 07:25:49 ] >>665 どういう規則で出力するのかさっぱりわからん。
670 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 07:37:10 ] 桁ごとに、組み合わせを順番に表示してくんだろw
671 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 07:56:47 ] >>665 効率はしらんが、適当に書いてみた #include <stdio.h> void combi(int n, int pos, int digit, int *array) { int i, j; if(pos==digit) { printf("{%d", array[0]); for(i=1; i<digit; i++) printf(",%d", array[i]); putchar('}'); } else { for(i=n; i<=9; i++) { array[pos] = i; combi(i+1, pos+1, digit, array); }}} int main(void) { int i, array[10]; for(i=1; i<=10; i++) combi(0, 0, i, array); return 0; }
672 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 08:23:21 ] printfのfはformattedのfだと聞いたことがありますが、 そもそもformattedってどういう意味ですか? 辞書を引いてもC/C++に適した訳語が見つからなくて。。。
673 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 08:30:09 ] 書式に則った
674 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 08:31:42 ] >>673 何の書式に則ったってことですか? 自分で指定した"hoge%spi%dyo"だとかそういうことでしょうか?
675 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 08:34:17 ] どう考えてもそれしかないと思う。
676 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 08:38:52 ] >>675 ありがとうございました。
677 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 08:45:47 ] >>665 main() { int array[10]={0,1,2,3,4,5,6,7,8,9}; int i,f,set; for(set=1;set<=0x3ff;set++) { putchar('{'); for(i=0,f=0;i<10;i++) if(set & (1 << i)) { if(f) putchar(','); printf("%d", array[i]),f=1; } putchar('}'); } }
678 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 10:20:23 ] >>677 これは良いな。出力順序が変わるのを何とかしようと頑張ってみたが俺には無理だった
679 名前:デフォルトの名無しさん [2009/06/06(土) 15:57:09 ] クラス内で動的確保した文字列に、ポインタ渡しでのアクセスは出来ませんか。
680 名前:デフォルトの名無しさん [2009/06/06(土) 15:59:10 ] >>679 できます
681 名前:デフォルトの名無しさん [2009/06/06(土) 16:04:03 ] これができません。なぜでしょうか。 #include <iostream> #include <string> using namespace std; class A { public: char *ch; A() { ch=new char [10]; strcpy(ch,"aaa"); } void test(char *p){ p=ch; } }; main () { A x; char *p; x.test(p); cout<<p; }
682 名前:デフォルトの名無しさん [2009/06/06(土) 16:06:26 ] 自己解決しました。 test(char* &p)にしたら良かったです。
683 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 16:11:36 ] char* &pって気持ち悪いなchar*& pがクール
684 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 16:16:08 ] いやむしろ、char *&p の方がクール。 理由は宣言構文の仕様上、char が specifier で *&p が declarator だから。 char* p; のように書く人は p と q をポインタにしたいとき char* p, *q; のように非対称に書いたりするので混乱必至。 っていうか宗教^^
685 名前:デフォルトの名無しさん [2009/06/06(土) 16:16:56 ] それより一引数で参照私の値変更ってのがさ!
686 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 16:23:07 ] >>684 > char* p; のように書く人は p と q をポインタにしたいとき > char* p, *q; のように非対称に書いたりするので混乱必至。 そうでもないよ。俺は普段1行目のように書くけど、2行目のようなケースは まず第一に「滅多に書かない」し、もし書く時は char *p, *q; って書く。 まぁ、宗教。
687 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 16:26:38 ] そもそも*&ってのが気持ち悪い ダブルポインタのほうがかっこよくない? まぁ、宗教。
688 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 16:29:15 ] Effective C++(第2版)には ** 使うくらいならどうして *& を使わないのかって書いてあるから *& でいいんじゃない?っていうか、>>681 のような質問って時々出てくるけど その設計にどういうメリットがあるのかしら? ポインタの管理はクラスの外でやってるし、そもそも内部の詳細を公開しているし・・・
689 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 16:29:33 ] 創価学会最高!
690 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 17:09:37 ] そこまでするならmulti_arrayみたいにラップするわ
691 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 18:20:00 ] デバッグしてるときにちょっと気になったんですが 他人の作ったメソッドや関数(例えばSTLやboost)が投げる可能性のある例外を調べる方法は仕様を読む以外ないんでしょうか? 強制的に例外を投げさせるオプションみたいなものがあるんでしょうか? コンパイラはVC++EE2008を使っています
692 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 18:27:02 ] つ grep
693 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 22:29:11 ] 複文マクロは do{〜;〜;〜;}while(0) とすると良いとききました。 しかしこれだと返り値を持たせられないため、関数形式のマクロが書けません。 複文マクロでありながら、返り値を持たせる方法はありませんか?
694 名前:デフォルトの名無しさん [2009/06/06(土) 22:34:00 ] インライン使っとけ。 複雑なマクロつかうよりいい。 エラーがわかりやすい。 実行時間が計測できるなどりメリット。
695 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 22:34:51 ] >>694 インライン関数などの知識は十分あるんですが、 どうしても変なマクロが書きたいんです。 マクロでしかできない変な処理なんです。
696 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 22:46:21 ] カンマ演算子でなんとかするのはもう考えた?
697 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 22:48:56 ] >>696 ありがとうございます。 もう考えてあります。 ただ、try catchブロックを盛り込みたく、それがカンマ演算子に合わせられないのです。。。 そしてマクロでしかできない処理というのは「マクロ引数から#で文字列化する」というような いわばリフレクション的な処理も含んでいる物だからです。 まあ無くても支障ないのですが、一般化して再利用可能にしておいたら便利かなと思って 変態マクロに挑戦しているところです。
698 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 22:50:26 ] 引数っぽくすれば #define FOO(X) do{;;(X)=hoge;}while(0)
699 名前:697 mailto:sage [2009/06/06(土) 22:55:03 ] >>698 ありがとうございます。 副作用を持たせるわけですね。 最終手段として考慮します。 しかし当面はもうちょっと挑戦してみます。 返り値はbool型になる予定でして、疑似関数の形の方が分かりやすいので。 関数テンプレートや文字列結合演算子、無名構造体など、 もちえる言語仕様の知識をフル活用してみます。
700 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 23:20:30 ] void func(float a[]){ int size=sizeof(a)/sizeof(float); } これでsizeに配列aの個数が入ると思ったのに1になる。何で?
701 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 23:31:22 ] aはfloatへのポインタに変わったから
702 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 23:31:55 ] サイズが分からないから void func(float a[10]){ とかにすれば10って出るはず
703 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 23:34:47 ] void func(float a[]){ としても void func(float *a){ となるから >>702 なんねーよばか
704 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 23:35:53 ] ありがとう。float[10]ってしないと駄目なのか でもそれだとint size=10;ってすることと一緒だから意味無いよね 受け取った配列の数によって処理を変えたいんですがどうすればいいですか?
705 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 23:38:08 ] それこそマクロっぽくするべき #define func(x) func_(sizeof(x)/sizeof(float)) void func_(unsigned size);
706 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 23:39:11 ] >>704 二引数にして大きさを渡すする ものすごい馬鹿みたいに思うかもしれんが memsetやらfreadやらあるように領域の大きさを渡すのは普通
707 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 23:39:19 ] void func(float *a, size_t n) { } #define numberof(array) (sizeof(array)/sizeof(array[0])) float foo[10]; func(foo, numberof(foo));
708 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 23:48:33 ] ありがとうございます。サイズを引数として受け取るしかないんですね 当たり前なんだろうけど、これにはちょっとびっくり。 普通に分かるものだとばかり思ってた
709 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 00:27:30 ] 商業ソフトだとメモリ確保とかでガチガチにtry catchするんでしょうか?
710 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 01:10:01 ] メモリ確保失敗はアプリレベルではどうにもならないからOSに例外投げてしまう。 という考え方もある。
711 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 01:14:08 ] 限界になる前に、そろそろメモリが足りません言い出すソフトもあるなぁ・・・・
712 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 02:22:58 ] OSに例外投げたらどうなるんだ?つか、そんなことできるのか?
713 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 02:57:00 ] 他人のソースコードを読んでいってもさっぱり頭に入ってきません。 何かソースコードを読む際のポイントとかあるんでしょうか。
714 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 03:00:11 ] コメントを読んだり、 読んでる関数の中身までは読まずに、大まかな流れを先に確認する。
715 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 03:37:32 ] >>713 doxygen(Graphviz)で関係のグラフ化オヌヌメ
716 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 10:54:46 ] テンプレートの型を一部の型に限定したい(たとえばunsignedの各種整数型のみ)場合は template<typename T> class HOGE; template<> class HOGE<unsigned char> {...;}; template<> class HOGE<unsigned short> {...;}; template<> class HOGE<unsigned long> {...;}; template<> class HOGE<unsigned int> {...;}; のように本体を書かずに、特殊化のほうをいちいち全部書くしかないんでしょうか?
717 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 11:53:12 ] traits
718 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 12:20:01 ] C++にて。 同じ副作用を保ったまま、式を文にすることは出来ます。 セミコロンを付ければ良いだけです。 例 x=3ならx=3;とすればよい。 しかし同じ副作用を保ったまま、文を式にすることは出来ますか? その際の式の値は何だって良いとして。 例 while(flag){++x;} を ???
719 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 12:50:35 ] >716 class の中身の方は型によって変わらないと仮定して、 #include <boost/utility/enable_if.hpp> #include <boost/type_traits/is_unsigned.hpp> template<typename T, typename Enable = void> class HOGE {}; template<typename T> class HOGE<T, typename boost::enable_if<boost::is_unsigned<T> >::type> { // 何か }; 他の型にするなら boost::is_unsigned を適宜変更すれば OK。 型をべた書きするなら↓なんてのも可能。 #include <boost/mpl/set.hpp> #include <boost/mpl/has_key.hpp> template<typename T> class HOGE<T, typename boost::enable_if< boost::mpl::has_key< boost::mpl::set< unsigned int, unsigned char >,T> >::type> { // 何か }; 中身も変わってくるなら >717 の通り traits でまとめる。
720 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 13:42:55 ] >>718 そこを関数にする。 そうすれば関数呼出式になる。
721 名前:718 mailto:sage [2009/06/07(日) 14:31:24 ] >>720 あーなるほど。 ありがとうございます。
722 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 18:39:05 ] for each 処理を自前で作りたい。 Sentinelを付加する方法でなんかいいアイデアない?
723 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 18:43:09 ] CかC++かくらい書け。 もっとも、C++ならSTL使え、だが。
724 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 18:57:23 ] もっと洗練されたライブラリが必要だと思うんだ
725 名前:722 mailto:sage [2009/06/07(日) 19:00:27 ] STL様 i=begin;while((function(i++),i)<=end); は偽物foreach i=begin; end+1=eoloop; while(function(i++)); ^^^^^^^^^←この部分
726 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 19:01:00 ] 一応Qt(C++用ライブラリ)にforeachはある それを参考にしろとは言わんが
727 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 21:22:20 ] インターフェースクラスがクールに感じたんだけど、これってなにかマイナス面はある? 今作ってるプログラムをこれ使って大幅に書き換えようかなと思ってるんだけど
728 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 21:39:06 ] >>727 ソースコードの量が増える 保守するとき読めればいいが そんな保証などない 将来性にかけて拡張性に優れた設計にするには 優れた設計能力が必要 後からの変更は1からのやり直し
729 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 21:48:20 ] >>727 Qtのこと? 俺もQtの設計は美しいと思ってるし、 いまさらMFCやろうとしてる(まずいないがw)やついたらQtを紹介してる マイナス面は、以前はGPLだったけどそれも変更になってLGPL 不満といえばdllのサイズぐらいかな? マルチOSなのもおいしいところ
730 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 21:56:43 ] >>725 std::for_eachもいやならBOOST_FOREACHはだめ?
731 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 22:02:31 ] >>729 そのインターフェイスじゃないだろ
732 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 22:11:32 ] QtってGUI専用だと勝手に思っていたが、 GUI以外の事も出来るの?
733 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 22:18:02 ] >Qt 何故か俺の中で、 フジコフジオのイメージが払拭できない
734 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 22:21:55 ] >>732 コンテナ、ネットワーク、XML、データベースとか一通り 機能制限はあるが組込み向けやXサーバーなしでもGUIが使えたり
735 名前:732 mailto:sage [2009/06/07(日) 22:24:51 ] >>734 すげーー マジかよ。 LGPLだと商用利用はしんどいか? Staticリンクしちゃうとオープンソース強制だっけ?
736 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 22:55:36 ] >>735 LGPLだと静的リンクはアウトだね 動的リンクなら商用非公開おk
737 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 23:03:14 ] LGPLだと、リバースエンジニアリングの拒否の禁止かな。
738 名前:732 mailto:sage [2009/06/07(日) 23:06:54 ] リバースエンジニアリングはどうせされるんだろうし そんなの禁止しても意味ないだろうけど・・・。 >動的リンクなら商用非公開おk これはつまりDLLを付属させて配れってこと?
739 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 23:14:11 ] >>735 強制じゃないけど staticリンクでその条件を満たすのはかなりしんどい
740 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 23:14:53 ] >>738 そうだよ配っていいんだよ
741 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 23:28:13 ] ってことは 「QtのDLLを付属させてスタティックリンクしないようにするかぎり」 無償でクローズドソースの商用利用が可能 ということか。 Qtいいな。 …ちょっと考えてみようかな。
742 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 02:12:57 ] >>715 分かりやすい解説サイト教えてください
743 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 02:20:00 ] >>742 ggrks 相当前からあるソフトで、情報も腐るほどあるぞ ちなみにそのウィザードもQtでできてる
744 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 03:44:59 ] C++のテンプレートについて教えて クラスとどう違うんだ?
745 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 03:49:36 ] 次元が違う
746 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 04:18:25 ] 違いすぎて逆に説明が困難だな。
747 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 04:19:38 ] 訂正 C++のテンプレートについて教えて やっぱクラスとの違いじゃなくてどういう時に使うのか どんなニーズによってできたのか教えて
748 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 04:27:42 ] 型が違うだけで同じような処理を何回も書かないで済むように
749 名前:デフォルトの名無しさん [2009/06/08(月) 06:46:52 ] 今年女子大に入ったばかりのゆきこと言います。 C++を学びたいのですが、どの本がお薦めでしょうか?
750 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 06:47:04 ] >>744 天と地ほど違うと思うけど。 [タイヤキを作るための金属の鋳型] と [食べられるタイヤキ] の違い。ぜんっぜん違う。
751 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 06:56:11 ] >>742 このスレに行け。 【コメント】doxygen【コンソメ】 ttp://pc12.2ch.net/test/read.cgi/tech/1212144627/ オススメは以下。 Graphviz ttp://www.graphviz.org/ doxygenの文字化け対策 - 僻地のプログラマkmt-t - わりとどうでもいい日記 1.1 ttp://d.hatena.ne.jp/kmt-t2/20090403/1238718375 Let’s use doxygen! ttp://www.fides.dti.ne.jp/%7Eoka-t/doxygen.html 無題ドキュメント ttp://www.sat.t.u-tokyo.ac.jp/~tetsuya/homeNew/research/Tips/doxygen.htm SourceForge.net: sakura-editor ≫ DoxygenComment ttp://sakura-editor.wiki.sourceforge.net/DoxygenComment Doxygenマニュアル ttp://www.doxygen.jp/manual.html Doxygen公式 ttp://www.doxygen.jp/
752 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 10:12:17 ] >>750 それクラスとインスタンスの違いでなくて? テンプレートはその鋳型を付け替えるとタコ焼にも今川焼きにもなる台とか
753 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 11:03:19 ] 型チェックしてくれるマクロとでも思えば。
754 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 12:56:01 ] なんだかtemplateってbindに似てるね
755 名前:デフォルトの名無しさん [2009/06/08(月) 13:03:26 ] コンストラクタの引数の値によって、データメンバの型を変える方法ってありますか?
756 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 13:24:48 ] >>749 女子供は股開いてればいいんだよ
757 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 13:34:28 ] 子供もかよ……
758 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 13:49:24 ] ぼくおとこのこだよ…
759 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 13:58:54 ] >>755 同じ親クラスから継承した子クラスという条件内であれば可能。 もしくは、void*で持たせれば、多分なんでもおkだけど。
760 名前:750 mailto:sage [2009/06/08(月) 16:12:44 ] >>752 そうとも言えるな。 なら俺方式で言うなら クラステンプレート=[タイヤキやら今川焼きやらを作るための金属の鋳型を作るためのナニモノか] クラス=[タイヤキを作るための金属の鋳型] インスタンス=[食べられるタイヤキ] とでも言えばいいかな。
761 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 16:55:30 ] 喩えなら何とでも言えるわ。
762 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 17:42:54 ] 名前空間について質問です。 名前空間 foo と、それとは別に名前空間 bar::foo があるとします。 このとき、bar の内側から、bar::fooでは無い方の foo を指定するにはどうしたら良いのでしょうか。 なお、環境はWinXP、C++、VisualStudio2005です。
763 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 17:46:20 ] ::foo
764 名前:762 mailto:sage [2009/06/08(月) 17:53:04 ] すみません、2つ質問するつもりで書いてませんでした。 あるクラス内に、別クラスをメンバ変数として取り込む時、 その別クラスが書かれたヘッダファイルをインクルードするのではなく、 先に class foo; とだけ書いておき、コンパイラに別クラスの存在を知らせることってありますよね? さて、その別クラスの名前が、名前空間 bar の下にあるとき、 namespace bar { class foo; }; と記述していたんですが、一般的にこの書き方で良いのでしょうか? >>763 ありがとうございます。 なんで思いつかなかったんだろう、自分。
765 名前:デフォルトの名無しさん [2009/06/08(月) 18:40:27 ] 便乗質問、テンプレートクラスを持たせる時って同じ方法使えるん?
766 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 18:48:37 ] 使えるん
767 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 18:51:59 ] >>764 あなたのいうクラスに名前が付いていないので 説明の便宜上 あるクラス=MyClass, 別クラス=fooとします。 まずは本題からちょっとそれた話から。 > その別クラスが書かれたヘッダファイルをインクルードするのではなく、 > 先に class foo; とだけ書いておき、コンパイラに別クラスの存在を知らせることってありますよね? あります。 しかし > あるクラス内に、別クラスをメンバ変数として取り込む時、 この場合は前方宣言Forward declarationだけでは足りません。 というのも、 class MyClass {int m_num;std::string m_str;foo m_var;} のようにメンバ変数としてfoo型変数を使いたい場合、 fooが不完全型なのでそのサイズがわからず、したがって MyClassのために確保すべき領域のサイズもコンパイラには分からないことになるからです。 前方宣言で足りるのはfoo型メンバ変数ではなく foo型への参照型メンバ変数やfoo型へのポインタ型メンバ変数、 あるいはメンバ関数の戻り値としてfoo型を使用する場合などです。
768 名前:デフォルトの名無しさん [2009/06/08(月) 18:54:54 ] ユーザが入力した数式を処理するプログラムを考えているのですが cin>>eq; #define function(x) (eq) cout<<function(1); みたいなことができませんんか?もしくは別の方法があったら教えてください
769 名前:767 mailto:sage [2009/06/08(月) 18:54:56 ] あとはまあ 前方宣言で足りるのは メンバ関数の引数の型としてfoo型を使用する場合 や typedefとかかな。 > さて、その別クラスの名前が、名前空間 bar の下にあるとき、 > namespace bar { class foo; }; と記述していたんですが、一般的にこの書き方で良いのでしょうか? それでいいと思いますが。 class bar::foo;とか書いても無理ですし、それ以外記述できないですよねぇ? もし有識者がいらしたらそっちを信用してください。
770 名前:767 mailto:sage [2009/06/08(月) 18:56:45 ] >>768 意味不明ですが、どういうことですか? プリプロセッサにより cin>>eq; cout<<((eq));//xは無視される として処理されるだけですが。。。
771 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 19:01:07 ] >>770 768に書いたのはあくまでイメージです。言葉足らずですみません 私がしたいことは引数にある文字列を数式として扱いたいのです もしくはcinで入力した式をプログラムで処理したいのですが
772 名前:デフォルトの名無しさん [2009/06/08(月) 19:02:27 ] ほんとは言語の問題じゃないかもしれないけど教えてください @double配列と、Aメンバがdoubleいっこだけの構造体の配列を読み上げる速度を比較するための コードを書いて実行してみたらAのほうが速かったです 環境はItanium、CentOS、GCC(C++)です これはなぜなんでしょうか?
773 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 19:04:08 ] そうなったから
774 名前:767 mailto:sage [2009/06/08(月) 19:04:19 ] >>771 言いたいことは分かりました。 C++の知識はどのくらいありますか? STLやBoost C++はご存じですか? C言語じゃなくてちゃんとC++らしいコードが書けますか?
775 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 19:05:31 ] >>772 不思議だわ。 ・・・最適化とかレジスタの割り付けとか、もう不確定要素に押されて結果が揺らいでるだけじゃないか? つまりどっちで書いても大差ないから好きな方で記述すればよか。
776 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 19:08:39 ] >>774 c++は初めて3か月くらいですが、STLはつかったものがあるので 簡単なものなら大丈夫だと思います。
777 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 19:09:25 ] >>775 計算時間半分くらいでした ちなみにこれに気づいたのは構造体メンバのアライメントに関する実験中でした コンパイラが賢くなりすぎてマニアックな知識も必要ない時代になったんですかねえ・・・
778 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 19:11:11 ] 普通のポインタがインスタンスを持ってるかどうか判別する方法はありますか? 現状ではポインタのゼロ初期化とdelete・0代入を徹底するぐらいしか手段が思いつきません
779 名前:767 mailto:sage [2009/06/08(月) 19:11:28 ] >>776 せっかくSTLの知識の有無を聞いたのですが、STLつかった実例が見つかりませんでした。 とりあえず適当なリンクを張っておきます。 以下の中で、上に挙げられている物の方が より優れていると思ってください。 letsboost::spirit ttp://www.kmonos.net/alang/boost/classes/spirit.html 数式解釈プログラム - uPage ttp://www-as.dse.ibaraki.ac.jp/umezu/?%E6%95%B0%E5%BC%8F%E8%A7%A3%E9%87%88%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0 七行プログラミング ttp://cm.xrea.cc/thread/program_001.html LISPですが 記号数式処理 ttp://www-antenna.ee.titech.ac.jp/~hira/hobby/symbolic/index.html
780 名前:767 mailto:sage [2009/06/08(月) 19:13:06 ] 追記。 >>776 Spiritで数式を解釈させるなら boost::spiritっちゃえ! ttp://tamachan.club.kyutech.ac.jp/%7Egridbug/spirit/ C++ Labyrinth ttp://www.fides.dti.ne.jp/~oka-t/cpplab-boost-spirit.html Spirit v1.6 ttp://boost.cppll.jp/BDTJ_1_30/libs/spirit/ これらが有名で質も高いと評判です。
781 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 19:14:34 ] >>768 これでイメージが湧いたらそいつは一流のエスパーだwwwww
782 名前:767 mailto:sage [2009/06/08(月) 19:17:06 ] >>778 >普通のポインタがインスタンスを持ってるかどうか 有効な領域を指し示しているかどうかとおっしゃりたいものと推測・解釈します。 結論から言えば、 普通のポインタでしたら、そんな方法はありません。 指し示す領域が有効かどうかなぞわかり得ません。
783 名前:768 mailto:sage [2009/06/08(月) 19:22:56 ] >>782 いろいろ情報ありがとうございます。
784 名前:764 mailto:sage [2009/06/08(月) 19:45:30 ] >>767 >>769 ありがとうございます >宣言 やっぱ namespace bar { class foo; }; って書くしか無さそうですね。 階層が深いとちょっと面倒かな?と思っただけなので、特に問題はありません。 >メンバ変数 確かに、メンバ変数を直接弄ろうとすると前方宣言だけじゃダメですよね。 まあ、素直にアクセサ付けれ、って話ですが。 >>765 確かに、 std::string とかは上記の方法じゃ出来ないですね。
785 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 20:11:52 ] C++の関数で文字列を参照渡しする方法がわかりませ ん &stringだと弾かれたし
786 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 20:16:09 ] >>785 参照の記述を勉強してください。 クラス名& ref=参照先; で記述します。
787 名前:785 mailto:sage [2009/06/08(月) 20:23:15 ] 参照の書き方って&nと違うの?
788 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 20:31:10 ] >>787 まずは日本語から覚えた方がよさそうだな
789 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 20:33:46 ] char &string; って書いてるんだったりして。
790 名前:786 mailto:sage [2009/06/08(月) 20:36:41 ] もう らちがあかないので ソースみせるか、 参照の記述を勉強し直すか、 名前空間を記述するか せめて少なくとも1つはやってみせてください。 なんかアドレスとごっちゃになってそうな予感もしますね。
791 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 20:39:25 ] int func(const char *string)
792 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 20:40:24 ] 途中送信。>791を参照渡しにする
793 名前:786 mailto:sage [2009/06/08(月) 21:04:14 ] >>791 それだけエスパーを強制しすぎです。 適当に答えるなら //before int func(const char *string); const char * const p="mojiretsu"; func(p); がアドレス渡し(ポインタ渡し)で、 //after int func(const std::stirng &string); std::string str="mojiretsu"; int func(str); が参照渡しです。 せめて前後関係の分かるソースを見せてください。 答える側が書いたソースの方が長いっておかしいです。
794 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:16:08 ] foo *p = new foo[bar]; delete p; がまずいのはわかるんだけど foo *q = new foo; delete [] q; ってーのはべつにやばくない・・・よね?
795 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:16:58 ] やばいよ。何が起きても知らないよ。
796 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:17:12 ] std::stringで書き変えるのは要求を満たしてない気がするなあ。
797 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:19:34 ] >>794 配列をnewしたときは、その配列のサイズなんかも保持しておくので 配列じゃないのにdelete[]だと、関係ない部分にアクセスする危険性がある……と教わったが、正確には違うかも。
798 名前:786 mailto:sage [2009/06/08(月) 21:21:37 ] >>796 彼は >C++の関数で文字列を参照渡しする方法 と言っています。 別にconst char*型変数を参照渡ししてもいいんですが、 もうエスパーするしかないからわかりませんよ。
799 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:23:02 ] >>794 だめな理由は処理系によりいろいろあるだろうけど、そんなの関係ない。 「仕様上認められていない」ってだけで 十分に鼻から悪魔が出てくると結論づけられます。
800 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:26:52 ] C++はめんどくさいな
801 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:36:37 ] >>800 なにを今更w
802 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:50:39 ] C++に限らず、多種多様の実装が存在する言語は多かれ少なかれそういう傾向にあると思う。
803 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 23:34:58 ] doxygen = デュクシジェン
804 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 01:06:17 ] doxygen destroyer
805 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 04:19:56 ] >>804 pc11.2ch.net/test/read.cgi/gamedev/1238520070/692 692 :名前は開発中のものです。:2009/06/09(火) 00:57:34 ID:2fI/sHFo 何言ってんだ。プログラマにまともな精神持った奴がいた試しなんてねえよ。 第一プログラマと精神科なんてほとんどセットなのに今更それを語るとか情弱以下だろ。
806 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 04:31:40 ] C言語をやりたいんだけど Microsoftのc++ExpressEdition ってのでもできますか? #include <stdio.h> int main(void){ printf("aaaa"); return 0; } みたいなのもちゃんとできますか?
807 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 05:09:32 ] >>806 Microsoft Visual C++ 2008 Express Edition の事ですね。 可能です。 ですが、最初はコンソールの方が分かりやすいと思いますよ。 C/C++初心者なら bcc5.5.1+bcc developer がなかなかオススメ。 エラーメッセージが分かりやすいので。 複雑なテンプレート等、まともなC++をやりたくなったらその時初めて Microsoft Visual C++ 2008 Express Edition gcc3.x, gcc4.x などを試せば良いかと思います。
808 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 09:17:19 ] まあ鼻から悪魔が出ることは無いと断言できる
809 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 15:45:37 ] C/C++というよりLinuxの質問になってしまうのですが、 mq_sendとmq_receiveでメッセージキューのパラメータに 任意の構造体を渡すことはできますでしょうか? 関数仕様ではchar*のみのようですが。 メッセージキュー以外の方式で別プロセスに任意の型の 値を渡す代替案があればそれでも良いのですが。
810 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 16:10:40 ] mmapとかpipeとか プロセス間通信は、Linuxの方で聞いた方がいいかもね
811 名前:デフォルトの名無しさん [2009/06/09(火) 16:13:22 ] 使ったこと無いけど 文字列にシリアライズして渡すんじゃねーの そんな雰囲気のある関数っぽい
812 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 17:07:30 ] >>809 昔は, 任意のバイト列に対するポインタは char* を使っていた で, 関数使用はその名残だと思うんだわ # kernel 内部の caddr_t とかの絡みもあるとは思うが……… 構造体とか配列とかもバイト列として表現できるわけだから, キャストすれば何でも可
813 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 17:08:35 ] >>812 × 関数使用は 〇 関数仕様は
814 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 17:27:02 ] なるほど、ありがとうございます。 mmapとかの共有メモリがお手軽そうですね。 >>812 やはりできるんですね。やろうとしてsegvでちゃったん ですが、できるとわかればもうちょっと調べてみます。
815 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 17:29:28 ] vectorのmax_size()って中の人はどうやって計算してるの?
816 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 17:51:40 ] bad_alloc出した場合って普通何をするもんなのかな ・APIとかで開いた画像ファイルとかを閉じる ・そのメソッドで確保成功した分のメモリを開放する ・そのメソッド内での仕事が完了したらbad_allocを上に投げる ・再帰的に開放作業を繰り返して、一番上でプログラム終了 とかでいい?
817 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 18:01:25 ] >>815 gcc 4.1は単にsize_type(-1) / sizeof(value_type)を返してた。 VC2008は、上の値とアロケータの最大サイズと比較してちっさい方返してた。
818 名前:デフォルトの名無しさん [2009/06/09(火) 19:52:52 ] void Initialize(){ ここで配列を5本動的確保 } そしてこの関数で使いたいんですがどうすればいいですか? void calc(){ } calcは何度も呼び出すのでcalc内で動的確保するのは無駄だと思いました。
819 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:03:38 ] template <typename _T,int _Size> class hoge { private: std::vector<_T> _vec[5]; public: void Initialize(void) { for(int i=0;i<5;++i) _vec[i].reserve(_Size); } void calc(void) { 以下略 };
820 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:09:32 ] vectorとかのコンテナのサイズを変えるときはtry-catch(bad_alloc)したほうがいいの?
821 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:17:52 ] >>819 できればSTLなしで・・・
822 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:48:36 ] >>821 お前の質問に対する答えが>>819 なわけだが、STLがその答えの本質じゃないことぐらい判るだろ。 コードを一から書いて欲しいなら宿題スレ行ってこいよ。
823 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:17:14 ] 内容がC++からちょっとずれますがお願いします。 大学ではじめてのC++で勉強しているのですが、phpの初心者向けサイトで コードをみたところc++と似ていて驚きました。c++はphpにも応用が利くと聞いたのですが、 C++をどの程度できるようになればphpでも簡単なwebサービスをできるでしょうか?
824 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:32:03 ] C++をいくら極めてもwebサービスはできんじゃろ。 なんせ標準ライブラリにwebに関するものはまったくはいっとらんからな…。
825 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:33:51 ] >>821 STLなしでとか何言ってるの? まさかSTLない環境でやってるわけじゃなくて知識がないだけでしょ? ちょっとで良いから勉強しろよ。
826 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:34:11 ] >>814 Linux の実装はしらんが, Solaris とか *BSD とかの実装だと, mq_send で msq_ptr からサイズ分 kernel 内バッファにコピーして, mq_receive で該当領域を読み出し側にコピーする で, kernel は該当領域にアクセス可能か否かの test 程度は行っている ので, とんでもない引数を与えると EINVAL か何かが返るはず segv が発生するのは, mq_receive で, msq_ptr として与えた領域サイズより 大きな msg_len を与えてスタック書きつぶしたときくらいじゃ内かな?
827 名前:デフォルトの名無しさん [2009/06/09(火) 21:34:16 ] 文字処理が面倒だけど cgiで起動すれば出来るんじゃね。
828 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:36:02 ] 0から99までの乱数を表示するプログラムを作ったんですが、コンパイルしたらまた新たな乱数を表示するにはどうすれば良いのですか?
829 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:42:11 ] >>828 乱数系列切り替えればええんちゃうの?
830 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:44:31 ] 時刻でも乱数シードに使えばいい
831 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:46:56 ] >>828 乱数の生成方法によって違うけれど乱数の種を設定できる仕組みがあるはずだからそれで種を変更する。
832 名前:デフォルトの名無しさん [2009/06/09(火) 21:50:14 ] >>829-831 ありがとうございます。 すいません。 かなり初心者なので、出来れば、詳しくお願いします。 今main関数の中が cout<<rand()%100<<endl; だけなんですが、何かつけ加えますか?
833 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:54:17 ] >>832 そうゆう話なら取りあえず処理系の名前を書け
834 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:54:55 ] ↓以下乱数の質について
835 名前:デフォルトの名無しさん [2009/06/09(火) 21:56:53 ] 箱を開けたら猫
836 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:58:12 ] >>833 bcc32です。
837 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:06:15 ] メルセンヌツイスタでぐぐるといいよ
838 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:10:23 ] >>836 けっして誉められた手法ではないんだろうが おそらく sland(time(NULL)) とかやっとけば? >>834 が期待してるように 用途に応じて生成される乱数の品質とかアルゴリズムとかが問題になる 置くの深い部分だけどな
839 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:18:59 ] 標準の乱数は大きな素数を割ってるだけみたいな単純な実装なので それをそのまま使うとカルドセプトサーガみたいなことになるかもね♥
840 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:25:25 ] >>838 ありがとうございます。 やってみます。
841 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:31:08 ] >>837 ありがとうございます。 参考にしてみます。
842 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:33:38 ] どういたしまして
843 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 00:59:13 ] 質問したいのですが誰かいますか?
844 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 01:00:12 ] います
845 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 01:11:32 ] じゃあ質問させていただきます。 今、作っているプログラムはあるファイルから特定の部分の値を読み込み 値だけのバイナリファイルを書き出すプログラムを作っているのですが。 sstreamを使い、値を変数に格納したいのですがfloat型だと格納できるのですが、 int型だと格納されません。 どうしてか教えてください。 ソース: stringstream ss(f_buf); int test[16 * 3]; //ここがint型だと値が入らない for(int i = 0; i < (16 * 3); i++){ ss >> test[(i * 3)] >> w >> test[(i * 3) + 1] >> w >> test[(i * 3) + 2] >> w >> w; } データ: 0;1;2;, 1;2;3;, :
846 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 01:13:48 ] >>845 追記 stringstream ss(f_buf);の下に char w; //記号を飛ばすための変数
847 名前:デフォルトの名無しさん [2009/06/10(水) 01:19:14 ] どうしてでしょう?
848 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 01:20:34 ] わからん
849 名前:デフォルトの名無しさん [2009/06/10(水) 01:27:14 ] どなたか>>845 の理由が分かる人いますか?
850 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 01:29:17 ] たとえば古いgccはstringsteamの中身に挙動不審なバグがあるので、それが原因かもしれない。 今やってみたらとりあえずgcc 4.1とVC2008はどっちもちゃんと動いた。 #include <iostream> #include <sstream> using namespace std; int main(void) { int t[3]; char w; stringstream ss("1,2,3,,"); ss >> t[0] >> w >> t[1] >> w >> t[2] >> w >> w; cout << t[0] << " " << t[1] << " " << t[2] << endl; return 0; } 出力 1 2 3
851 名前:デフォルトの名無しさん [2009/06/10(水) 01:34:22 ] >>850 さん、ありがとうございます。 環境をかくの忘れてましたね… 環境はVC2005です。 >>850 さんのソースも試してみましたがやはりだめなようです… 変数を作った時の不定な値が入ったままでした。 2008でビルドしてみようかな…
852 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 10:06:43 ] あるディレクトリ下にあるファイルを読み取ってから削除するという処理をしているのですが、希にコピー途中のものを読み取ってしまい、 思ったような動作が出来ない場合があります。アクセスしようと(もしくはアクセス中の)ファイルが、コピー中であるか否かの判断は 一般的にどのような方法で実装するのでしょうか。
853 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 10:07:49 ] >>852 OSは?
854 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 10:09:47 ] >>853 Windows 2000/XP です。コピー元は同じPC上の時もあれば、ネットワークを介して他PCからの場合もあります。
855 名前:853 mailto:sage [2009/06/10(水) 10:19:57 ] 俺はUNIX屋なので、後は誰かに任せた。
856 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 11:04:35 ] >>854 writeオープンしてからコピーする
857 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 11:55:21 ] FILE_FLAG_DELETE_ON_CLOSEフラグ付けて開くとか
858 名前:デフォルトの名無しさん [2009/06/10(水) 12:41:47 ] std::stringでTCHAR扱えないので std::basic_string<TCHAR>を使うってのはグーグル先生でわかったんですが、 入出力の方法が今度はわかりません。グーグル先生に聞いてもわかりませんでした。 std::cinやstd::coutの代わりにどのように使うんでしょうか?
859 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 14:19:21 ] //hoge.h class CHoge { public: void hoge(); }; //hoge.cpp #include "hoge.h" void CHoge::hoge() {・・・}; このCHoge::hogeを省略してhogeだけで書きたいんですけどそういうことはできますか? なぜかusing CHoge::hogeではできませんでした
860 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 14:22:27 ] 名前空間じゃなくてクラス名か。 全然「なぜか」じゃねーw どうしても面倒なら、ヘッダファイルに中身も書いたら?
861 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 14:30:00 ] C#を使えばおk
862 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 14:34:07 ] >>858 wstring & wcoutを使う。 >>859 #define hoge CHoge::hoge
863 名前:デフォルトの名無しさん [2009/06/10(水) 14:51:54 ] +とか+=とか、そういった四則演算関連の演算子オーバーロードを作成したいのですが、 ネットで見ると、戻り値が参照だったり実体だったりして、演算子によって違うみたいです。 どういう考え方で参照と実体の使い分けをしているのでしょうか?
864 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 14:58:39 ] 関数を抜けても壊れない参照を返せるなら基本参照返し。 一時オブジェクトを返さざるをえないなら泣く泣く実体返し。
865 名前:デフォルトの名無しさん [2009/06/10(水) 15:49:30 ] float型の変数がゼロかどうか(誤差も含めて)判断するときに、 1e-4fみたいな数字で比較を行っているコードを見たんですが、 こういう数字の記述の仕方(意味)を説明してるウェブページをどこか知りませんか?
866 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 15:53:30 ] 科学表記とかでぐぐる
867 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 17:32:36 ] 初歩的な部分ですが、 while(i--) 処理 は「iの値が評価され、処理を実行するか決定する」→「iがデクリメントされる」 while(--i) 処理 は「iがデクリメントされる」→「iの値が評価される」 ということで、i>0なら前者は処理が i 回、後者は (i - 1)回行われるということでよいのでしょうか。
868 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 17:34:44 ] コーディングの最終段階に入っていて、 なるべく見通しが良くなるように関数に処理を分割したりしています。 a,b,cという関数が有って各関数はうまく行けば0を返し失敗すれば1を返します。 aがうまく行けばbを,bがうまくいけばcを行いcがうまく行けば 最後に少量の出力が有ります。 そこで、今の段階はプロトタイプとして int main() { if(a == 0) { if(b == 0 { if(c == 0{ //some print } } } return 0; } となっているのですが、ネストが深くなりすぎているような気がしてなりません。 なにか良い方法が御座いましたらご教授願います。
869 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 17:37:21 ] if (!a && !b && !c)
870 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 17:41:00 ] !(a||b||c)
871 名前:868 mailto:sage [2009/06/10(水) 17:43:50 ] 見落としていた点が有りました。 追加で書きますがお許しください。 aが失敗すればプログラム終了 bが失敗すればプログラム終了 cが失敗すればプログラム終了 とそれぞれ行いたく思います。 よろしくおねがいします。
872 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 17:50:39 ] それは a が false を返す代わりに exit(1) を呼び出せばいいじゃないか^-^
873 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 17:57:00 ] >>872 そうなんですよね、一度そのような事を考えたのですが 言語はC++なのですが、 kmaebashi.com/bbs/bbs12.html というページを見かけてなんとなく怖くなってexit()を使わなくしたのですが、 実際どうなのでしょうか? よろしくおねがいします
874 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 18:09:17 ] どっちにしても>>869 や>>870 でOK。
875 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 18:11:32 ] >> 874 ありがとう御座います。 無事きれいになりました!! 感謝感激です。
876 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 18:52:22 ] C++にはJavaのObjectクラスに相当するようなものは無いんでしょうか? Java使い向けに書かれているデザインパターン本を読んでて 脳内翻訳するのに必要になったもので
877 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 18:59:05 ] 全然別人が話に食いつきます。 >>873 が言う >ISO/IEC 14882:1998 3.6.1-4 >exit 関数を呼び出すことは現ブロックを抜けずにプログラムを終了させることであるため、 >自動記憶域期間を持つオブジェクトは破棄されない。 >静的記憶域機関を持つオブジェクトのデストラクタ中から > exit を呼び出すことは、未定義の動作を引き起こす。 これって 巻頭言 2000〜 ttp://park1.wakwak.com/~y-nagano/200001.html ここに書いてあるとおりなんだろうが、 恐ろしいよねぇ。
878 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 19:37:24 ] もよもと exit はプログラムの異常終了時くらいしか使わんからなー。
879 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 20:17:11 ] >>858 自分で作ればいい。 #ifdef UNICODE # define tcin std::wcin # define tcout std::wcout # define tcerr std::wcerr # define tclog std::wclog #else # define tcin std::cin # define tcout std::cout # define tcerr std::cerr # define tclog std::clog #endif あと、mainの頭で、文字コード変換が行われるように指示しておく。 std::locale l(""); // 数値を取り扱うならstd::locale l(std::locale::classic, "", std::locale::ctype);のほうがよいかも。 tcin.imbue(l); tcout.imbue(l); tcerr.imbue(l); tclog.imbue(l);
880 名前:デフォルトの名無しさん [2009/06/10(水) 20:57:45 ] C++なら例外使えばいいのに
881 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 21:00:13 ] >>880 誰もキャッチできない例外をスローするってこと? みんなはそうしてるの?
882 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 21:03:14 ] 例外のよい使い方がいまだにわからん
883 名前:881 mailto:sage [2009/06/10(水) 21:14:30 ] >>882 俺は 関数の戻り値は正常値ならおk、 異常値を返す場合は-1とか0とかそういう値に限り、 不完全なオブジェクトを返すような形は とらないようにしている。 そして不完全なオブジェクトを返さざると得ない時に 例外を使っている。 ・・・でもやっぱり俺もわからない。
884 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 21:15:49 ] ttp://pc12.2ch.net/test/read.cgi/tech/1241438694/ ここの>>740 が妙な提案をしていたよ。 もっとも実際には出来なさそうって結論になったのだが。
885 名前:デフォルトの名無しさん [2009/06/10(水) 22:06:18 ] ABCが失敗したら例外発生させて、キャッチして適当に処理して return 0 すればいい。
886 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:24:46 ] VC++を勉強するのにお勧めの本ありますでしょうか? 初級〜中級くらいをめどに
887 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:29:14 ] いわゆるぺゾルト本。 Programing Windows 第5版。 定番なので。
888 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:32:10 ] >>886 VC++だから、MFCかも知れないが 普通にSDK使う程度なら、wisdomとか入門サイトから見るといいよ 俺はいろいろなサイト見て学んだ
889 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:33:06 ] >>887 www.amazon.co.jp/Programming-Windows-Microsoft-Charles-Petzold/dp/157231995X/ref=sr_1_1?ie=UTF8&qid=1244644307&sr=8-1 これのことでしょうか?すごくとっつきにくそうなんですが
890 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:37:56 ] 今時MFCはどうかと思うけど、お勧めの本はなさす。 中級以上なら、Effective C++のシリーズお勧め
891 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:38:07 ] この本は原著じゃなくても翻訳はまともだから大丈夫だよw プログラミングWindows第5版〈上〉Win32 APIを扱う開発者のための決定版! (Microsoft Programming Series) (単行本) まぁ…とっつきにくい感じはするかなぁ。 まぁ、あくまで定番ってことで。
892 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:40:51 ] Effective C++はもちろん名著だけど、VCの勉強にはならんじゃろw
893 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:16:36 ] 質問です Cでファイルに書き込むときに fwrite(str, 1, strlen(str), fp); fwrite(str, strlen(str), 1, fp); とどちらが一般的ですか?何か違いは出てくるのでしょうか?
894 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:24:08 ] VC++で、いっぱい書店においてるような本はどうなのですか? 入門〜やや中級手前レベル?の内容くらいかいてるようにはみえたのですが 役に立たないのかな
895 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:56:43 ] >>894 プログラミング言語を全く知らない人が、いきなりVCに手を出す状況とかなら 決して悪くはないんじゃないかしら?
896 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:49:07 ] >>893 fwrite(str, 1, strlen(str), fp); に1票。 なんとなく2番めの引数は型のサイズ、3番めの引数はその個数って 思っている。
897 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 04:45:58 ] >>893 >fwrite(str, 1, strlen(str), fp); 1バイトをstrlen(str)分書き込む、成功した際の戻り値がstrlen(str) >fwrite(str, strlen(str), 1, fp); strlen(str)バイトを1回書き込む、成功した際の戻り値が1 結果は同じ ただ、意味のあるデータなら後者の方が意味的に良くない?
898 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 07:13:39 ] >>895 >プログラミング言語を全く知らない人が、いきなりVCに手を出す状況 そうとうな窮地だな。
899 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 07:24:29 ] #include <iostream> #include <list> int main() { std::list<int> nums1; nums1.push_back(4); nums1.push_back(6); std::cout << nums1[0] << std::endl; std::cout << nums1[1] << std::endl; return 0; } vectorで動いたソースをlistに変更してみたら動かないのでしがなんででしょうか?
900 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 07:52:45 ] エラーメッセージ読めよ
901 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 07:56:21 ] 「動かない」というのはこの場合、極めて曖昧な比喩表現でしかない。 比喩を使われても困る。
902 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 11:17:11 ] list<int>::iterator p = nums1.begin(); while( p != nums1.end() ) { cout << *p << endl; p++; } list はランダムアクセス子をもってない
903 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 12:24:09 ] www.geocities.jp/KY_webid/cpp/library/012.html なるほど了解した。ありがと
904 名前:デフォルトの名無しさん [2009/06/11(木) 15:57:58 ] gprofって、対象のプログラムが使うライブラリが全てスタティックリンク でないといけないのです? そういうのないですよね?
905 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:09:13 ] try { m_pInt = new int [N]; } catch { delete [] m_pInt; // <-するべき?それとも放置? }
906 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:28:03 ] >>905 m_pIntに予め 0 を入れておけばdeleteしても問題ない
907 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 23:22:38 ] >>905 そんなことよりboost::scoped_array使え。
908 名前:デフォルトの名無しさん [2009/06/12(金) 01:31:58 ] ちょっとした質問です。 二分木の高さと深さは違うものですよね。
909 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:37:26 ] 木の「高さ」とノードの「深さ」のこと?
910 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:46:07 ] 下から見れば高さ、上から見れば深さ、相対的な違いか?
911 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:57:06 ] 視点が違うだけで数としては同じになる
912 名前:デフォルトの名無しさん [2009/06/12(金) 02:04:36 ] たとえば、a(左部分, 右部分)とあらわす。 aはroot a(b, NULL) b(c, d) c(NULL, NULL) d(NULL, NULL) c,dはleaf という風になっているとします。伝わるかわからないですが・・・ このとき、a,b,c,dそれぞれの高さは2,1,0,0で合ってますか?
913 名前:853 mailto:sage [2009/06/12(金) 02:07:21 ] Fedora11落としてきたばかりなのに。 最近は自前でカーネルコンパイルするの減ったな。
914 名前:デフォルトの名無しさん [2009/06/12(金) 02:50:17 ] すいません。だれか僕が作ったプログラミングのデバッグしてくれませんか?お願いします。 初歩中の初歩です。
915 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 02:56:30 ] お断りします
916 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 03:04:38 ] とりあえずうp汁
917 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 04:12:14 ] 住所・氏名・連絡先も忘れずに。
918 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 07:55:46 ] codepad ttp://codepad.org/ ってところに貼れ。 貼ってどうすれば良いかは分かると思う。
919 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:53:27 ] コンストラクタの引き数の規約を与えるための仮想基底クラスを作ることはできますか?
920 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 13:00:43 ] codepad.org/WjzXeUiM エラーがでるのですが エラーを日本語にしてもらえないでしょうか?
921 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 13:02:45 ] >>920 翻訳サイトつかってみたら?
922 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 13:06:51 ] codepad.org/qHGkIKzL う〜ん
923 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 13:09:35 ] >>920 どこにエラーが? 警告なら出ているようだけど。
924 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 13:11:42 ] 三行目を void print( const char *c ) にすればいいよ。
925 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 13:13:25 ] >>920 ほい、エラーを翻訳してやったよ。 -- 誤りとして扱われる警告 --
926 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 15:13:06 ] R255 G0 B0の赤色の1ピクセルのbitmapのデータ読み込みで 54byte飛ばして色データを読み込んで10進数で表示させたのですが 0 0 -1 0 と表示されます。 0 0 255 0と表示されないのはなぜでしょうか?
927 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 15:22:52 ] >>926 charに読み込んでるとか。
928 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 15:32:45 ] >>927 charではダメなんですか? 1バイトだからいいかと思ったのですが char unchi[10000]; fread( unchi, 1, 5000, fp ); とやっています
929 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 15:36:07 ] あ、わかりました charって-127~128ですよね unsignedにすればいいですか?
930 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 15:37:24 ] できました。 お騒がせしてすいません ありがとうございました。
931 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 15:40:38 ] >>929 ビットマップに限った話ではないが typedef unsigned char uint8; とでもしておくと楽。 必要に応じてuint16,uint32,uint64もtypedefしといてもいいかと。
932 名前:デフォルトの名無しさん [2009/06/12(金) 15:51:13 ] char 配列に日本語が入っているとします。 改行コードが\nで統一されている場合に wchar_tにポインタでキャストしたときに文字化けしない方法はありますか?
933 名前:932 [2009/06/12(金) 16:05:38 ] キャストしたら\r\nでも文字が正しくなく・・・ windowsのwchar_tの文字コードは UTF16とか効いた気がします・・・
934 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 16:08:25 ] mbtowc(wchar_t *wc_str, const char *mb_str, size_t mb_scan_size);
935 名前:932 [2009/06/12(金) 16:10:43 ] ここに書いてありました。 EUCやSJISをwchar_t* にキャストして操作しても問題は出ませんか? 表示できないだけで。 ワイド文字 - Wikipedia wchar_tの内部表現もUnicodeである必要はない。 本来はCode Set Independet(符号化集合に独立)なのである。 しかし、Windowsでは16ビット (UTF-16)、 LinuxやMac OS Xでは32ビット (UTF-32)である。
936 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 16:30:16 ] >>935 文字列の終わりの0のサイズが違うんで、キャストしただけじゃ使えないと思う。
937 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 16:31:42 ] 質問です int *Array; int *pNum; int Num = 10; Array = new int[1]; Array[0] = Num; *pNum = Array[0]; デバッグすると、このコードの最後の部分でエラーが起きます どうすればうまくいきますか?
938 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 16:34:19 ] >>937 pNumもメモリ確保しないと。
939 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 16:38:29 ] >>938 ああ、なるほど ありがとうございました
940 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 19:04:46 ] ユニコードとかって3バイト以上の文字もありますよね? wchar_tは2バイトなのにどうやってこれを格納してるんですか?
941 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 19:25:10 ] >>940 >wchar_tは2バイト そんなこと決まってないっしょ? 言語使用上定められているのは sizeof(char)<=sizeof(wchar_t) だけじゃない?
942 名前:デフォルトの名無しさん [2009/06/12(金) 19:39:08 ] つ UTF16
943 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 20:44:25 ] 少なくともうちでは2バイトじゃないから大丈夫だなあ
944 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 20:55:20 ] cygwinはwchar_tが2バイトっていうイカれた仕様 なのでUTF-8が上手く使えない…
945 名前:デフォルトの名無しさん [2009/06/12(金) 21:04:42 ] windowsも2バイト
946 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 21:13:12 ] そうなのか、失敬した
947 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 21:55:53 ] UTF-8はマルチバイトだからchar*で扱うもの
948 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 22:09:33 ] 16bit整数二つ→32bit整数ひとつと変換して、配列の添え字に使いたいのですが 全部のインデックスからアクセス可能にしようとすると配列がでかくなりすぎてこまります なにかいい方法はないでしょうか?
949 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 22:12:12 ] inline static void foo(); と static inline void foo(); とではどちらが正しいですか? foo()はあるクラスの静的メンバ関数です。
950 名前:949 mailto:sage [2009/06/12(金) 22:16:02 ] あれ? MyClassの宣言中では MyClass { //etc static void foo(); //etc }; と書き、 そのヘッダの中(ただし宣言の外で)実装を書いて inline void foo() { //実装 }; と書くのがただしいですか?
951 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 22:19:34 ] どっちでもいい。 どっちかが正しかったら、憶えなくちゃいけないから大変だ。
952 名前:949 mailto:sage [2009/06/12(金) 22:22:17 ] >>951 ありがとうございます。
953 名前:デフォルトの名無しさん [2009/06/12(金) 22:23:49 ] >>948 つ map mapなら、int x=-1; でも、a[x]がエラーにならない。 google製のmapもある
954 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 23:52:12 ] >>940 Windows環境ではsizeof(wchar_t) == 2で、UTF-16を格納している。 昔はサロゲートペアはサポートしていないと聞いたような気がするが今はどうだか知らん。 多くの*NIX系環境ではsizeof(wchar_t) == 4で、UTF-32(UCS-4)を格納している。
955 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 02:08:32 ] int型の配列に整数だけを代入したいときにはどうすればよいのでしょうか? isdigitが数字かどうかの判定が出来るというので、使ってみたら、エラーが出ます。 これがソースの一部です。 for(i = 0; i < 10; i++){ while(isdigit(a[i]) == 0){ printf("%d個目の整数です。\n",i+1); fgets(buf, 10, stdin); sscanf_s(buf, "%d", a[i]); } } whileの中身をどうにかすればうまくいくと思うんですが。
956 名前:デフォルトの名無しさん [2009/06/13(土) 02:14:55 ] いろいろとだめだろ。 &がついてないし、入力後に確認すればいいものをループの上で判定するし たとえば変数xに数字が入っていたら代入すればいいし。
957 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 02:15:07 ] ソースの一部を貼るのはいいが、特に初心者ならちゃんと変数宣言とかも書いてくれ。 あとエラーメッセージもちゃんと書いてくれよ。 エスパー技能を発揮できる人間はそうそういないんだから。
958 名前:デフォルトの名無しさん [2009/06/13(土) 02:23:10 ] たとえば。 int inputsu(){ int x; do{ scanf("%d", &x); } while(x<0 || x>1000); return x; } int main(){ int i; int a[10]; for(i = 0; i < 10; i++){ printf("%d個目の整数です。\n", i+1); a[i]=inputsu(); } }
959 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 02:23:43 ] >>955 isdigitは、あるcharの1字が'0'から'9'までの数字に分類される文字かどうかを判定するだけ。 数値であるかどうかの判定とは違う。 a[i]に値が入るのはsscanf_sの時点。 そのsscanf_sは代入できたデータの数を戻り値にする。見るべきはこれ。 for (i = 0; i < 10; i++) { do { printf("%d個目の整数です。\n", i + 1); fgets(buf, 10, stdin); } while (sscanf_s(buf, "%d", &a[i]) != 1); }
960 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 02:36:13 ] >>956 入力後に確認ですか、ありがとうございます。 >>957 すいません、次から気をつけます。 visual C++ 2008EEでやっているのですが、ビルド時にエラーは出ないんです。 コンパイルしたときに Debug Assertion Failed! Program:...\Visual Studio 2008\Projects\~ Line: 56 Expression: (unsigned)(c + 1) <= 256 For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. っていうメッセージが出ます。
961 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 02:48:22 ] >>958 >>959 言われたとおりにやってみたら、 期待したとおりの出力結果が得られました。 ありがとうございます。
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倍も消費量が多い。 もっと少なくなるやつある?