- 1 名前:デフォルトの名無しさん [2008/02/20(水) 12:33:41 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.48【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1202141921/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 648 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 02:13:09 ]
- >>643
>static つけたらクラスが消滅しても値が残るんですか? (クラスではなくインスタンスのことを言いたいのだと思うが…) staticで宣言した変数は、main関数の開始前から終了後まで存在する。 破棄されるのがmain関数終了後だから通常はそれへのアクセスが問題になることはないが、 staticの変数が異なるファイルで定義されて、一方のデストラクタからもう一方を参照するような 処理があるとまずい。 意味が分からないようなら気にしなくていい。 >つけなくても自動でstaticになりますか ならない。
- 649 名前:648 mailto:sage [2008/02/25(月) 02:14:21 ]
- ちょっと訂正
×staticの変数が ○2つのstaticの変数が
- 650 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 02:24:32 ]
- 質問があるのですが、
include " " include < > " ", < > の違いを教えて頂けませんか?
- 651 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 02:30:32 ]
- >>650
コンパイラのマニュアルか入門書を読みなさい。
- 652 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 02:47:52 ]
- >>650
www.google.co.jp/search?q=C%E8%A8%80%E8%AA%9E+include 上から順に読んでいけばそのうち解説してるサイトにたどり着く
- 653 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 07:25:36 ]
- >>632
std::string の内部バッファの連続性は次の規格で保証されるようになる。 おそらく現状全ての実装でそうなっていることが、その規格変更を実現したんだろう。 だから一応そう言うことをしても問題は無いはずだが、 メンバ関数でできることはメンバ関数でやった方がいい。 replace 使うといい。
- 654 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 09:45:12 ]
- 例外ねぇ、何も考えずにint型のエラーコードを投げちゃうなぁ
返り値でエラーコード返しちゃうと返り値の型が拘束されちゃうしメンドクサ 結局こういう使い方だと例外のありがたみを半分も得ていない気がする
- 655 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 10:00:21 ]
- 例外はstd::exceptionみたいな基本クラスを決めとかないと
ありがたみが半減する。
- 656 名前:デフォルトの名無しさん [2008/02/25(月) 11:44:36 ]
- ガベージコレクションは、標準のC++でつくれますか?ライブラリでは動作するのか不安です
自作したいです あと、整数変数は、初期化なしでアクセスしてもエラーは出ませんか?
- 657 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 11:46:47 ]
- 素人が自作した方が不安だと思うんだが
- 658 名前:デフォルトの名無しさん [2008/02/25(月) 12:00:29 ]
- これ動かすとクラス変数は値がほぼ一定ですが理由はなぜですか?
#include <iostream> using namespace std; class cl{public: int i; cl(){cout<<"class "<<i;} }; int main(){ int n, a[100]; for(n=0; n<100; n++){ cl *x=new cl; cout<<" arrey "<<a[n]<<"\n"; } getchar(); }
- 659 名前:デフォルトの名無しさん [2008/02/25(月) 12:09:11 ]
- 動的確保による違いでした たぶんヒープ領域は値があまり変化しないことが原因かも・・・
#include <iostream> using namespace std; class cl{public: int i; }; int main(){ int n, a[100] ; cl x[100]; for(n=0; n<10; n++){ cout<<"class="<<x[n].i<<" arrey="<<a[n]<<endl; } getchar(); }
- 660 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 12:12:41 ]
- >>656
整数変数を初期化しなくてもエラーは出ませんが、ローカルな場合に不定値なので初期化しましょう。
- 661 名前:デフォルトの名無しさん [2008/02/25(月) 12:37:27 ]
- 定数文字列は値渡しにして、動的な文字列は参照渡しにしたいのですが、これだとメモリリークしますよね
どうやれば直りますか? #include <iostream> using namespace std; class cl{ char *str; public: cl(char* const& x){ str=x; } template <size_t n> cl(char (&x)[n]) { str=new char[n]; strcpy(str,x);} }; main(){ cl str="rrrr"; str="oooo"; getchar(); }
- 662 名前:デフォルトの名無しさん [2008/02/25(月) 12:42:21 ]
- 値渡しされているかフラグを作って、されていれば解放する様にすればいいのですが、
初期化前にコンストラクタで代入されてしまうとフラグが確認できません
- 663 名前:デフォルトの名無しさん [2008/02/25(月) 12:47:11 ]
- >>661は間違えました 定数式が期待する方へ行っていませんでした それもどうやれば直りますか
- 664 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 12:56:55 ]
- >>661
やりたいことがよくわからん。せめて、コンパイルできるソース(の断片)を貼ってくれ。
- 665 名前:デフォルトの名無しさん [2008/02/25(月) 13:00:43 ]
- まとめるとテンプレート関数で、
定数文字列" "と 固定文字列char [n]と 可変文字列char *を 区別して、上の二つならメモリを確保して値渡しにしたいんです 値を書き換えたいため
- 666 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 13:01:40 ]
- 最近ずっとこいつ出没してるな
- 667 名前:デフォルトの名無しさん [2008/02/25(月) 13:02:01 ]
- それと、新たにメモリを確保するときに、以前確保したメモリを解放してメモリリークしないようにしたいです
- 668 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 13:06:38 ]
- >>667
要は、const char *でコンストラクトするときはメモリを確保して、char *でコンストラクトするときは確保しなければ委員でね? それと、書き換えのときはconst char *でもchar *でも以前の状態に応じて解放しないといけないんでね?
- 669 名前:デフォルトの名無しさん [2008/02/25(月) 13:07:20 ]
- 簡略化すると関数の引数で、" "型と、char[]型と、char*型を区別したいって事です
- 670 名前:デフォルトの名無しさん [2008/02/25(月) 13:17:48 ]
- >>668
constつけるだけでは無理です #include <iostream> using namespace std; class cl{ char *str; public: cl(char const *x) { cout<<"文字列は定数です\n"; } cl(char *x){ cout<<"文字列は可変長です\n"; } }; main(){ cl str="xxx"; //定数で初期化 char ch[]="yyy"; str=ch; //固定配列の代入 str="zzz"; //定数の代入 getchar(); }
- 671 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 13:19:34 ]
- すまん、そもそも char ch[] = "yyy"は固定長でも書き換え可能な配列なんだが
それを定数として扱ってはいけない理由を教えてくれ。
- 672 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 13:22:36 ]
- あ、聞き方が変だ。
char ch[] = "yyy"は書き換え可能なんだから可変長と同一視すればいいし const char ch[] = "zzz"は書き換え不可能なんだから定数と同一視すればいいのでは?
- 673 名前:デフォルトの名無しさん [2008/02/25(月) 13:22:41 ]
- 可変長文字列と {定数文字列、固定長文字列} ( ← 一緒でいいです)
を分類する方法教えてください あと、すでにメモリが確保してあればそれを解放する方法教えてください
- 674 名前:デフォルトの名無しさん [2008/02/25(月) 13:23:36 ]
- 長さも書き換えられないといけません
- 675 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 13:24:19 ]
- こいつ日本人なのかなぁ
- 676 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 13:26:00 ]
- >あと、すでにメモリが確保してあればそれを解放する方法教えてください
これは簡単。コンストラクト時にメモリを確保したらフラグをセットしておいて、代入オペレータでそれをチェックすればいい。 勿論、代入オペレータも2種類用意して必要ならフラグをセットするのは当然として。 そのフラグはいずれにしてもデストラクト時に必要にナル死ね。
- 677 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 13:28:05 ]
- あー、ローカルな配列だとコンストラクト時にフラグが立ったら問題か。
ここは一つ、char配列は渡さないと言う運用でw
- 678 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 13:28:42 ]
- で、この馬鹿はなんで目的を説明できないんだろうなぁ。>675ってことなんだろうか。
- 679 名前:デフォルトの名無しさん [2008/02/25(月) 13:43:23 ]
- 目的は、参照渡しのできるstringを作りたいんです
現存するやつは値渡しです
- 680 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 13:45:33 ]
- いやだから、それを(態々)作る目的を聞いているのだが。
- 681 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 13:46:27 ]
- チャットじゃないんだから要旨をまとめてから書き込め。
- 682 名前:デフォルトの名無しさん [2008/02/25(月) 13:46:53 ]
- >>676
クラスの確保と同時に代入されてしまうと、フラグが設定されていないので動作不明になりませんか?
- 683 名前:デフォルトの名無しさん [2008/02/25(月) 13:50:39 ]
- >>681
可変長文字列は参照渡しにして、それ以外は値渡しにして、新たな文字列が渡されたら以前のを解放したいんです
- 684 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 13:52:58 ]
- >>683
>680
- 685 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 13:53:25 ]
- 伸びてると思ったら、また例の日本語が不自由なヤツが現れたのか
- 686 名前:デフォルトの名無しさん [2008/02/25(月) 13:56:58 ]
- 何をしたいかと言うと
(バイナリ) 文字列 str , p , qに対して replace(str, p, q) strの全文でpをqに置換する という関数を作りたいんです
- 687 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 14:03:08 ]
- >>665
それぞれの型の応じて関数を振り分ければいいのか? template<size_t N> void g(const char (&a)[N]) { cout << typeid(a).name() << endl; } template<size_t N> void g(char (&a)[N]) { cout << typeid(a).name() << endl; } void g(char *&p) { cout << typeid(p).name() << endl; } template<typename T> void f(T& t) { g(t); }
- 688 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 14:03:31 ]
- //テスト
int main() { f("abc"); char a[5]; f(a); char *p; f(p); }
- 689 名前:デフォルトの名無しさん [2008/02/25(月) 14:08:07 ]
- ぜんぶcです・・・・
#include <iostream> #include<typeinfo> using namespace std; template<size_t N> void g(const char (&a)[N]) { cout << "a" << endl;} template<size_t N> void g(char (&a)[N]) { cout << "b" << endl; } void g(char *&p){ cout << "c" << endl; } template<typename T> void f(T& t) { g(t); } int main() { f("abc"); char a[5]; f(a); char *p; f(p); }
- 690 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 14:12:45 ]
- >>689
そりゃコンパイラがだめなんだろうな。 g++ 4.2.3だとa b cになる。
- 691 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 14:12:57 ]
- >>686
これでいいのか? #include <string> #include <iostream> using namespace std; void replace(string& str, string p, string q) { int i = str.find(p); while (i >= 0) { str.replace(i, p.length(), q); i = str.find(p, i + q.length()); } } int main() { string str = "abcdabcd"; replace(str, "bc", "BC"); cout << str << endl; }
- 692 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 14:17:34 ]
- >>686
俺だったら、次のどっちかにする。だから、673のようなことをしたくなる理由が理解できない。 1. strは全く書き換えず、置換後の文字列は新しく確保したメモリに書き込んで戻り値に返す。 2. strは書き換えできるという前提でstrを書き換える。(書き換えできない 文字列をstrに渡したければ、書き換え可能な場所へコピーを作ってそれを渡す)
- 693 名前:デフォルトの名無しさん [2008/02/25(月) 14:25:43 ]
- STR str="hogehogehogehogehoge"
replace(str, "geho", "(^_^)"); や、 int N=300*1024*1024; char *ch=new char [N]; for(int n=0;n<N;n++)ch[n]=n; //巨大なバイナリ配列 STR str(ch,N); replace(str, "geho", "(^_^)"); がしたいんです
- 694 名前:デフォルトの名無しさん [2008/02/25(月) 14:29:10 ]
- 巨大な配列を扱おうとすると、元のデータをコピーしたり、返却時に新規確保すると、
もとのデータと併せて領域が2倍必要になりますしコピー時間がかかります >>691 バリナリデータも扱いたいです
- 695 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 14:32:38 ]
- >>693
できるぞ >>694 バイナリデータも問題ない #include <string> #include <iostream> using namespace std; void replace(string& str, string p, string q) { int i = str.find(p); while (i >= 0) { str.replace(i, p.length(), q); i = str.find(p, i + q.length()); } } int main() { string str="hogehogehogehogehoge"; replace(str, "geho", "(^_^)"); cout << str << endl; int N=300*1024*1024; char *ch=new char [N]; for(int n=0;n<N;n++)ch[n]=n; //巨大なバイナリ配列 string str2(ch,N); replace(str2, "geho", "(^_^)"); cout << str2 << endl; }
- 696 名前:デフォルトの名無しさん [2008/02/25(月) 14:32:39 ]
- C++
開発環境 CentOS コンパイラ g++ 関数書き出しプログラムが機能せず。 どうしてでしょうか。 #include <iostream> #include <fstream> #include <cstring> #include <string> #define buffer_size 1000 using namespace std; int main(int argc,char *argv[]){ string buffer; int count=0; char *p; ifstream fin(argv[1]); if(!fin)return 0; while(fin>>buffer){ while(count!=1){ if((p=strchr(buffer.c_str(),'{'))!=NULL){ count++; cout<<buffer; } } while(count!=0){ if((p=strchr(buffer.c_str(),'{'))!=NULL)count++; else if((p=strchr(buffer.c_str(),'}'))!=NULL)count--; } } fin.close(); return 0; }
- 697 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 14:35:18 ]
- >>694
置換前より後の文字列のほうが長い場合、 単純にその場で書き換えていくと、1ヶ所置換が行われる度に 置換部分以降をずらしたり、時にメモリの伸張をしたりで時間がかかる。 最近のOSはメモリの扱いも上手になっているし、 そもそもPCのメモリ搭載量も大きくなっているから、 新しいメモリに書き込んでいくも選択肢として捨てたものではない。
- 698 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 14:38:10 ]
- >>689
VC++ 2008でしか試してない。オーバーロード解決は規格に従って いるんだが。コンパイラがテンプレート規則に対応していないのかね。
- 699 名前:デフォルトの名無しさん [2008/02/25(月) 14:48:28 ]
- >>695 >>697
stringにコピーするのが一番なんですかね? 関数で作業領域を確保しようとするので 初めの3倍必要になります コピー無しなら2倍ですみます 300メガとかだと動作に支障出ないですかね・・ >>698 うちのコンパイラだと全滅しました MinGWの最新版 、DMC、VC++6.0、bcc5.5.1
- 700 名前:デフォルトの名無しさん [2008/02/25(月) 14:51:46 ]
- >>692
2番の方向で行こうとしているところだったんです 定数なら書き換え可能な領域を確保しようとしたら、その判別がコンパイラでできないのでここで質問していたんです
- 701 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 14:51:46 ]
- >>699
new char[]せずに最初からstringの中にデータを作ればコピーを減らせる int N=300*1024*1024; string str2; str2.resize(N); for(int n=0;n<N;n++)str2[n]=n; //巨大なバイナリ配列 replace(str2, "geho", "(^_^)");
- 702 名前:デフォルトの名無しさん [2008/02/25(月) 14:57:26 ]
- わかりました
stringに直接挿入する方向で行こうと思います 巨大な入力があるのはファイルからなので、自作して直接stringに入れるようにします
- 703 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 15:00:35 ]
- >>699
>コピー無しなら2倍ですみます 300メガとかだと動作に支障出ないですかね・・ stringの操作云々よりも、その情報量をどう扱うかと言うアルゴリズムの方が問題になりそうな希ガス。 少なくとも、GiBオーダ未満のメモリくらい今時普通に扱えるよ。 >>696 どう、機能していないのさ。
- 704 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 15:01:19 ]
- ちゃんと目的を説明すれば、妥当な回答が手早く得られると言う好例だな。
- 705 名前:692 mailto:sage [2008/02/25(月) 15:03:09 ]
- >>700
俺の場合、その判別は自分でやる。 必要なら自分でメモリ確保してmemcpyか何かでコピーしてから置換する関数へ渡すと言うこと。 メモリ確保その他をstringに任せているという点が違うけど、695案と同系統のアイデア。
- 706 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 15:04:31 ]
- >>696
関数突入を探すwhileの条件がcount != 1だから、関数突入後に中括弧を見つけるとcountが2になって脱出できなくなる罠。
- 707 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 15:10:50 ]
- >>696
>706に加えて、内側のwhileは両方ともifでいいだろよ。 つまり、最初のwhileは if (count == 0)で、次のwhileはif (count > 0)。 んで、fin >> bufferだと単語単位でしか入力できないから工夫が必要。 # 行単位入力すればいいのかな? 仕様がわからんからなんとも言えんが。
- 708 名前:デフォルトの名無しさん [2008/02/25(月) 15:13:01 ]
- 初めはC言語のみで、作成しようとして最後まで作ったのですが
ポインタのポインタとかやっているうちに動かない場合があることに気づき修復不可能になりました そしてC++で参照や型判定して作ろうとしたらこれも上手くいきませんでした 簡明なプログラムが大事ですね
- 709 名前:デフォルトの名無しさん [2008/02/25(月) 15:20:04 ]
- ここできいたのを参考に変換関数を作ってたのですが、そしたら全体がややこしくなり回復無理になりました
#define strconv(q, p) _memconv(&q, &p, strlen(p)) #define memconv(q, p, n) _memconv(&q, &p, n) #define strconstconv(q, p) _strconstconv(&q, p) _memconv(strdata *q, char **p, int n){ char **chend =(char **)malloc(sizeof(char **)); q->start=p; *chend=&(*p)[n]; q->end = &(*chend);}
- 710 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 15:52:07 ]
- >>708,709
無理して難しく書いても、あとあとメンテナンスやデバッグのことを考えると、シンプルに書いた方がいい場合が多い メモリを何MBか余計に使ったり、実行時間が何分か伸びたところで、なんだというんだ ややこしいコードは書くのもデバッグも何日もかかる それだけの価値があればやってもいいが、たいていは割に合わない
- 711 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 17:21:33 ]
- やさしいC++買って来た。
一日でマスターするのは無理なのかなぁ・・・
- 712 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 17:26:04 ]
- 一週間くらいは覚悟しないといかんね
- 713 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 17:39:36 ]
- 一年ぐらいは(ry
とか言いたいけど最低10年とかいう意見もあるし やね某が何年か前に提唱した半年ぐらいで勘弁しておいてやろう
- 714 名前:デフォルトの名無しさん [2008/02/25(月) 18:04:09 ]
- 質問ですが、stringの+は、\0を特別視しませんよね?
"aa\0aa" + "bbbbb"はどのコンパイラでも、 "aa\0aabbbbb"ですよね?
- 715 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 18:38:41 ]
- いつからCは+演算子で文字連結できるようになったんだ
- 716 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 18:39:19 ]
- stringと書いてあるだろうがアホ
- 717 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 18:43:10 ]
- >>716
>>714はC++でもNGだろ。C文字列同士だぞ。
- 718 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 18:45:36 ]
- そこは中身がそうなっているstringインスタンスだと解釈してやろうぜ。
- 719 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 18:48:48 ]
- 質問者はそういう中身のstringを造ろうとしてそこでつまりそうだが
- 720 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 19:21:16 ]
- >>718
アイアイ
- 721 名前:デフォルトの名無しさん [2008/02/25(月) 19:30:23 ]
- std::auto_ptrって、ブロックを出ると自動的に開放されるポインタですよね?
これって、AUTO変数と比べてより便利な点ってあるのでしょうか?
- 722 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 19:36:53 ]
- ×ブロックを出ると自動的に開放
○std::auto_ptrが破棄されたときインスタンスも自動的に開放
- 723 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 19:37:01 ]
- >>721
・スタックに置くには適さない巨大なデータも置ける ・最初はNULLにしておいて必要になってからnewできる ・ブロックを出るまで待たなくても好きなタイミングで削除できる ・releaseで手放せばブロックを出ても削除しないことも出来る
- 724 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 19:39:10 ]
- 関数の戻り値にも使えるはず。
- 725 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 19:41:51 ]
- using namespace std;
string func1() { string s = "Hello"; return s; } void func2(string s) { cout << s << endl; } int main() { func2(func1()); } この渡し方って解放されなかったり破壊されたりしますか? 処理系によりけりですか?
- 726 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 19:43:39 ]
- >>725
しません。 どの処理系でも平気。
- 727 名前:デフォルトの名無しさん [2008/02/25(月) 19:59:12 ]
- >>722-724
ありがとうです。 ところで、testは適当なクラスとして、 int main() { std::auto_ptr<test> tp(new test); tp.release(); return 0; } とすると、メモリリークが検出されてしまうのですが、tp.release()をしないようにすると 大丈夫でした。これってrelease()の使い方が間違ってますか? あと、最初にauto_ptr<test>だけ宣言しておいて、途中でnew testする方法もわかりません。 もうちょっとだけ教えてくださいな。
- 728 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:05:08 ]
- releaseは、以後、自分でメモリ管理するからauto_ptrはdeleteするなというもの。
- 729 名前:デフォルトの名無しさん [2008/02/25(月) 20:14:08 ]
- >>728
最初は、 std::auto_ptr<test> tp(new test); tp.release(); test* tp2 = tp.get(); delete tp2; としていたのですが、以下のようにしなければならないということですね。 std::auto_ptr<test> tp(new test); delete tp.release(); ありがとうございました。
- 730 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:27:13 ]
- >>729
tp.reset();
- 731 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:44:23 ]
- resetはVC6のauto_ptrには無いとか言い出すぜきっと。
- 732 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:52:38 ]
- resetもしないでデストラクタに任せればいい場面にまで
729のようなことをしていないか不安。
- 733 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:58:49 ]
- 設計について色々調べていると(デザインパターン等々)これ無駄じゃね?みたいな部分に多々遭遇します
例えばコンストラクタとデストラクタで確保&解放を行う為に全体をそれに合わせたり それの為にメソッドやクラスを用意したり等々 確かに見通しもよくなりますし、わかりやすくなるとは思うのですが、 それらを犠牲にすれば短く出来たりオーバーヘッドを減らせたり出来るんじゃないか?と考えてしまいます つまりコード全体の見易さ、転じてメンテナンスが容易になるなどのメリットと 速度を犠牲にするというデメリットがあると思います とはいえ後者は今時気にするほどでもなく、詳しくないのですがここを気にするのは組み込み系と呼ばれる分野くらいなのかなとも思います 実際はやはり見易さ等を気にした手法(なんていうんだろう?)を用いて設計を行うべきなんでしょうか? うまく表現できなく、長くなってしまってすみません
- 734 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:01:16 ]
- Visual Studioって 何処にヘッダファイル置けば
- 735 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:04:18 ]
- Visual Studioって 何処にヘッダファイル置けば
フルパス指定しなくて読み込めるんですか? C:\Program Files\Microsoft Visual Studio 8\VC\include でOK?
- 736 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:06:29 ]
- >>735
ソースファイルと同じ場所なら #include"hoge.h" でおk
- 737 名前:デフォルトの名無しさん [2008/02/25(月) 21:09:06 ]
- >>733
大丈夫 君よりコンパイラのほうが賢いから
- 738 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:09:18 ]
- 速度犠牲とか偉そうに言うやつほど、ダメなプログラマ
- 739 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:10:01 ]
- 普通の初心者質問には答えないんだなぁ
- 740 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:11:48 ]
- 本当に遅くなることばかりじゃないしな。
std::sort が qsort より概して速くなる、というみたいに、 インライン化されると問題ないことも多い。
- 741 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:14:36 ]
- >>738
色んな分野があるって前提で考えてるんだろう? お前は組み込み系とビジネスソフト開発が同じだと思っているのか? それにプログラミングしてればみんなプログラマって思考が気持ち悪い お前見たいのは答える側に回るな
- 742 名前:デフォルトの名無しさん [2008/02/25(月) 21:14:59 ]
- プログラマではないです、ただいろんな分野があってそれに合ったプログラミングがあることくらいはわかっています
でもやっぱり速度は気にしちゃいけないところですか、無駄だと思ってしまうところから直す必要がありそうですね コンパイラの最適化というのも知らない分野ですし、当分は見通しの良いプログラムを目指してみようと思います
- 743 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:18:54 ]
- まず動くプログラムを書く。
そして遅ければ改善する。 この順だな。
- 744 名前:696 mailto:sage [2008/02/25(月) 21:19:34 ]
- 696です。
先ほどのプログラムを訂正したら、 一行ほどしか出力されませんでした。 どこが間違っているのでしょうか。 ttp://www.borujoa.org/upload/source/upload17009.txt
- 745 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:26:58 ]
- これをちょっと弄って横長から縦長にしたいのですが、
いまいち組み方がわかりません。環境はLinuxでコンパイラはgccです。 #includeは省略 #define max 50 using namespace std; class hist{ private: string buffer; int count; int mat[max],i,j; public: int func(char *argv[]);}; int hist::func(char *argv[]){ ifstream fin(argv[1]); if(!fin)return 0; for(i=0;i<max;i++)mat[i]=0; while(fin>>buffer){ count=strlen(buffer.c_str()); for(i=1;i<max;i++){ if(i==count)mat[i]=mat[i]+1; } } for(i=1;i<max;i++){ cout<<i; for(j=0;j<mat[i];j++)cout<<"*"; cout<<'\n'; } return 0;} int main(int argc,char *argv[]){ hist hoge; hoge.func(argv); return 0; }
- 746 名前:696 [2008/02/25(月) 21:28:43 ]
- すみません、あげるの忘れてました。
どなたか教えてください。
- 747 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:32:49 ]
- GNU global使えていう話じゃなくて?
- 748 名前:744 [2008/02/25(月) 21:37:58 ]
- >>747
そんなソフトがあったんですかw ありがとうございます。 しかしそれではコーディングトレーニングにならないので、 ソースコードでよろしくお願いいたします。 どう考えてもイメージがわかないもので質問した次第です。
|

|