1 名前:デフォルトの名無しさん [2008/03/30(日) 01:50:26 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.50【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1204124447/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
930 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:16:25 ] >>922 >>923 ありがとうございます。すごくよくわかりました。 void CtimerDlg::OnBnClickedButton2() { // TODO: ここにコントロール通知ハンドラ コードを追加します。 int a =0; while(a < 100){ msgdlg *aaae = new msgdlg[100]; aaae[a]->Create(IDD_DIALOG1, this); // エラー aaae[a]->ShowWindow(SW_SHOW); aaae[a]->OnBnClickedOk(); delete aaae[a]; a++; } } error C2819: クラス 'msgdlg' にはオーバーロードされたメンバ 'operator ->' がありません。 これは何がいけないんでしょうか?
931 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:32:26 ] 下記のコードを実行したときに test::aaa で内部的に確保されたメモリ(?)が解放されず、 メモリリークが起きてしまっているようで解決方法が見つからず困っています。 STLなどの場合、確保したメモリを明示的に解放する関数などがあるのでしょうか? ( aaa.clear() や aaa.~vector() などは試してみたのですが駄目でした) それとも test::aaa 自体も new で確保して delete で解放したほうが良いのでしょうか? 環境はVC++2005です、よろしくお願いします。 class base { public: ~base(){ destory(); } virtual void destory(){}; }; class test : base { public: std::vector< int > aaa; void destory(){ aaa.clear(); } }; void main(){ void *p; { test *ptest; ptest = new test; ptest->aaa.resize(100); p = (void*)ptest; } //ここではポインタ p の基本クラスが base ということ以外はわからない delete (base*)p; }
932 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:39:01 ] デストラクタで仮想関数呼び出すとか馬鹿じゃねーの?
933 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:42:12 ] 古い形式のキャスト使ってるとか馬鹿じゃねーの? スマートポインタ使ってないとか馬鹿じゃねーの? いやいや、馬鹿じゃないって。 デストラクタの中から仮想関数呼び出すのはさすがにないけど。
934 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:44:25 ] >>930 これはひどい
935 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:57:28 ] … ~base() が呼び出されるときは 既に test::destory の実体はなくなっているからでしょうか? 馬鹿ですみません… こういう場合、クラスtestで確保したメモリは どう解放したら良いのでしょうか?
936 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 11:59:40 ] しかも書いてありました。 スマートポインタで調べてみます。
937 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 12:31:15 ] baseのデストラクタにvirtualをつけて上で testに自分のdestoryを呼ぶデストラクタを書けば baseのデストラクタの最初でtestのデストラクタが呼ばれて、testのdetoryが呼び出されるため この場合はmain内部の変更無しでメモリリークがなくなるけど、それじゃ駄目なの?
938 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 13:22:22 ] >>937 ありがとうございます、無事に解放されるようになりました。 いろいろと勉強不足でした。 仮想デストラクタにしないと派生クラスのデストラクタが呼び出されないのはもちろん メンバ変数のデストラクタも呼び出されないということ(?)なんですね。
939 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 13:39:34 ] >メンバ変数のデストラクタも呼び出されない 詳しくは覚えてないが、デストラクタが仮想関数(virtual)であれば、delete演算子が 渡されたポインタから仮想関数テーブルを辿って継承関係を把握できるとか だったと思う(逆に言えば仮想関数でないと把握できない)。 ちなみに勘違いしてそうなので書いておくけど、デストラクタとは ~クラス名();←引数無し のこと。destroyとか勝手に名前つけたらそれはただのメンバ関数だよ。 この場合正しくは virtual ~base();とかだ。
940 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 13:43:43 ] あ、そういえば~base()はちゃんと書いてあるのかw
941 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 14:11:20 ] なるほど…仮想関数テーブルですか、 virtual指定はなんだか漠然としていて理解しにくかったですが なんとなくはどう動作するかが理解できました。 ありがとうございます。
942 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 14:16:49 ] >>930 下のソースはコンパイル可能 行数減らしたから少し見辛いかも >>914 の言うようにポインタと参照について学んだ方がいい struct CTest{ void test(){} }; void f(){ CTest a; CTest* b = new CTest(); CTest* c = new CTest[1]; CTest d[1]; a.test(); (*&a).test(); (&a)->test(); (&a)[0].test(); (*b).test(); b->test(); b[0].test(); (*c).test(); c->test(); c[0].test(); (*d).test(); d->test(); d[0].test(); delete b; delete[] c; }
943 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 14:47:49 ] >>942 感動しました。こんなにわかりやすいの初めてみました。がんばります!
944 名前:デフォルトの名無しさん [2008/04/23(水) 15:37:22 ] 物凄い初歩的な質問なんですが 上手い方法を教えてもらいたくて質問します。 ある文字列があって 1文字ずつ処理していくんですが、 何か文字に変化があった時だけ処理を行いたいのです。 char str[]="ああいうええお";//何か文字列 int len=strlen(str); char current_c; current_c=str[0];//内容を覚える for(int i=0; i<len; i++){ if(current_c!=str[i]){//連続している文字が変われば //処理 } } こんなのを思いついたんですが これだと、1つ目の文字が当然処理されません。 current_c=str[0];//内容を覚える これを current_c=str[0]+1;//内容を覚える として、必ず1回目は処理が行われるようにするのも考えたんですが もっとちゃんとしたスマートな方法があると思うんですが・・・ こういう場合、どうやるのが一般的なのでしょうか?
945 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 15:46:25 ] str[0]+1なんて代入しなくても、0で初期化しておけばいいんじゃないの?
946 名前:デフォルトの名無しさん [2008/04/23(水) 15:48:09 ] >>944 charは1バイトだから平仮名みたいな多バイト文字はうまくゆかないよ。 分かっているならごめん。
947 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:11:33 ] >>945 0に相当する文字が来た時に駄目でしょ。
948 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:12:08 ] >>944 typedef char val_t; val_t str[]="aabbbcccddee"; typedef val_t* iter_t; for(iter_t begin=str,end=str+strlen(str),back,it=begin; it!=end; ++it){ if(it==begin || *back!=*it){ //処理 back=it; } } (・∀・)
949 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:13:42 ] >>947 それはひょっとしてギャグでいってるのか・・・・
950 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:19:37 ] >>944 最初に1文字目と異なる値 str[0]+1 で初期化しとけば良いんじゃね? ってのは結構頭の良い発想。凡百の徒には嫌われるけどね。 でもそういうときの current_c は普通 prev_c だな。
951 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:22:12 ] >>950 そうか?ムダじゃね?
952 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:33:50 ] 一つ目の文字が変わるっていう意味が分からんw
953 名前:948 mailto:sage [2008/04/23(水) 16:41:36 ] struct CTest{ bool operator!=(const CTest& o){ // ... return true; } }; template<typename iter_t> void unique_each(iter_t begin, iter_t end){ for(iter_t back,it=begin; it!=end; ++it){ if(it==begin || *back!=*it){ //処理 back=it; } } } void f(){ CTest v[10]; // v[0] ... unique_each(v,v+sizeof(v)/sizeof(*v)); } (∩゜д゜)アーアーきこえなーい
954 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:46:59 ] >>951 今回は文字だから 0 にしときゃ良いけど、 一般に先頭要素または直前のと異なる要素を 判定していくには良い方法だよ。
955 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 16:58:36 ] >>945 の前提条件 nul終端文字列 >>947 の前提条件 文字列 >>950 の前提条件 コピーコンストラクタ operator+ operator!= を持っている型 >>953 の前提条件 operator!= を持っている型
956 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:04:34 ] >>955 もう>>944 とは別世界に行ってるなw
957 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:31:55 ] PHPやperlでprint を使いながらデバッグするような方法をC++でもやりたいのですが、どうすればよいでしょうか?? そういうデバッグの仕方はC++では難しいのでしょうか。
958 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:32:34 ] >>944 ちょっとトリッキー、でもうまいやり方 >>945 一番シンプル >>946 一番重要なレスw >>953 汎用化し杉ワロタw
959 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:44:15 ] >>944 #include <algorithm> #include <string> #include <iostream> #include <functional> int main() { std::wstring src = L"ああいうええお"; src.push_back(0); ::setlocale(LC_ALL, "ja_JP.UTF-8"); for (std::wstring::iterator i = src.begin(); *i != 0; ++i) { i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>()); std::wcout << i-src.begin() << *i << std::endl;; } } 終端一つ加えて条件が逆のadjacent_find >>957 エスパーするとコードを読ませて実行時に一時的な値を見るとかならデバッガ gdbとVC付属のやつとか
960 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:44:31 ] >>944 は、charの取りうる最大値を指していた場合 +1すると、オーバーする。 >>945 は、処理内容次第では、\0がいきなり来た場合にヤバい。 が、あのプログラムの場合strlenの値がループの実行回数だからOK >953は、恐らく>>944 が本当に必要だったものではない可能性が高いw
961 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:47:00 ] >>959 さん なるほどデバッガで変数に格納されてる値を見ることが出来るんですね。 ありがとうございましたm(_ _)m
962 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:51:55 ] >>>944 は、charの取りうる最大値を指していた場合 >+1すると、オーバーする。 するってーと current_c=~str[0]; が適切?
963 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:53:43 ] オーバーフローしても大丈夫だろ。
964 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:55:39 ] あ、一文字目が処理されない
965 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:56:06 ] >>963 実動はともかく、規格的にはアウトだろ
966 名前:959 mailto:sage [2008/04/23(水) 18:12:21 ] リベンジ #include <algorithm> #include <string> #include <iostream> #include <functional> int main() { std::wstring src = L"ああいうええお"; ::setlocale(LC_ALL, "ja_JP.UTF-8"); std::wstring::iterator i = src.begin(); if (!src.empty()) { do { std::wcout << *i << std::distance(src.begin(), i) << std::endl; i = std::adjacent_find(i, src.end(), std::not_equal_to<wchar_t>()); } while(i++ != src.end()); } }
967 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 18:15:31 ] そして通告されるeucJP
968 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:01:21 ] vectorの配列を作ろうと思い vector<vector<string> > vecStrDim; vector<string> vecStr; string strTest = "test"; vecStr.push_back(strTest); vecStrDim[0].push_back(vecStr); とやってみました。コンパイルは通るのですが This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. とでて実行してもデバッグエラーになります vecStrDim[0].push_back(vecStr);が悪いのはわかるのですが、方法が思いつきません どうすればデバッグエラーを対処できるのでしょうか?
969 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:06:06 ] >>968 ×vecStrDim[0].push_back(vecStr); ○vecStrDim.push_back(vecStr);
970 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:10:40 ] >>969 あわわ……とんでもなく馬鹿なことしてすみません 解決しました
971 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:14:36 ] そのコードがコンパイルが通ることが不思議だ…
972 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 19:29:14 ] シングルバイト限定なら、current_cをintか何かにして、charで表現できないデカい値にしとけばいい。
973 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 20:44:51 ] class内で、static付けたものは、配列にしたときコピーは作られないんですよね? すべて同じ物を参照するんですよね
974 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:27:08 ] まあ配列にしなくても1つしか実体が存在しないようになるけどな
975 名前:デフォルトの名無しさん [2008/04/24(木) 00:49:34 ] #include <stdio.h> void main(void) { int a; pirntf("何か入力してください\n\n"); scanf("%d",&a); while(1){ printf("ぐははははははは!!\n\a"); } } この程度しか俺は中なので書けません。プログラマーさん お願いします。
976 名前:デフォルトの名無しさん [2008/04/24(木) 00:50:21 ] ↑MISSりました #include<stdio.h> void main(void) { int a,b,c; printf("数字を入力してください\n"); scanf("%d",&a); printf("数字をまた入力してください\n"); rewind(stdin); scanf("%d",&b); printf("数字をまたまた入力してください\n"); scanf("%d",&c); if(a == b == c) printf("等しいです,\n"); else printf("等しくないです,\n"); } これでa==b==cだったら"等しい"と表示させるように組んでるのに 1、1、1以外の数字は入力してもは全部"等しくないです"になるのは なんででしょうか?
977 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:52:43 ] >>976 a == b == c は、(a == b) == c と解釈される。つまり、使い方が間違っている。 その場合、恐らくa == b && b == c でいいだろう。
978 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:57:13 ] 980あたり、次スレたのむぜ
979 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:59:27 ] >>977 おおwなるほど! ありがとうございました^^
980 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:11:37 ] >>990 にパス
981 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:14:03 ] >>976 移動前のスレのコメントにもありましたが、 「君が参考にしてるものは信用しないほうがいい」 です。void main(...) はまずい。
982 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:17:45 ] void main は g++ でエラーになるしな。 gcc だと警告ですむけど。
983 名前:981 mailto:sage [2008/04/24(木) 01:34:22 ] rewind() も、あるのかわからない.....。stdin に対して rewind() ?
984 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 03:35:46 ] 1〜100までの数字でひとつだけない数字があるのでそれを探すという問題なのですが ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6318.cpp でひとつひとつ探す方法はあるのですが 他の方法で、まず 1〜50までの個数と51〜100までの個数を数えて 1〜50が49個 51〜100が50個で1〜50にあるとして 次は1〜25、26〜50とどんどん減らして 26〜38と39〜50の割り切れないときは13と12にしたりなどして 最後2つの数字にし 48が1個 49が0個で49がない数字とするプログラムを作りたいのですが どなたか例みたいなものを書いていただけないでしょうか?
985 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 03:41:23 ] 数えながら2つのファイル(小さい,大きい)に書き出していけばいいんじゃねの?
986 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 03:42:37 ] どこにあるのかわからないなら、ひとつひとつしらべるのが最善
987 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 03:48:07 ] 問題でこのような方法で作りなさいとあるので作りたいんですがダメでしょうか? #include<stdio.h> #define N 100 int main(void){ int min , max , mid; int count1, count2; int data, i; FILE *fp ここまでの指定はあるのですが、今自力でやってみてるんですが どう二つに分けそれ以降どのように区切っていけばいいのかよくわからないんです
988 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 04:42:58 ] 物凄い無駄な処理だなw 再帰呼び出しを使うのが良いよ
989 名前:988 mailto:sage [2008/04/24(木) 04:46:09 ] ああ、ごめん。数字は順番に並んでるわけじゃないのか
990 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 04:54:26 ] 諦めて全部足して5050から引け
991 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 05:18:22 ] #include <vector> //trueならmidより上、falseなら下 bool hilow(int min, int mid, int max, std::vector<int> src, std::vector<int> dst) { dst.clear(); std::vector<int> hi, low; //中間数超と以下でhi, lowに分ける for(size_t c=min; c <= max; c++) { if(src[c] <= mid) low.push_back(src[c]); else hi.push_back(src[c]); } //個数が規定値か調べて多い方を返す if(hi.size() == max - mid ) { dst.swap(hi); return ture; } dst.swap(low); return false; } 続く
992 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 05:33:54 ] 続き void main() { std::vector<int> num; //ファイルからnumに一度全部読み込む //ここは自分で書けるでしょ? int min, mid, max; min = 1; max = 100; do { (max - min + 1) % 2 ? mid = (max - min + 1) / 2 + 1 : mid = (max - min + 1) / 2; if( hilow(min, mid, max, num, num) ) min = mid + 1; else max = mid; } while(max - min > 2); //完了 }
993 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 05:36:05 ] あー色々間違ってたw bool hilow(int min, int mid, int max, std::vector<int>& src, std::vector<int>& dst) dst.clear(); は無し f(hi.size() == max - mid ) { dst.swap(low); return false; } dst.swap(hi); return true; }
994 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 05:37:10 ] 試してないけどこんな感じで良いと思うよ。 中間の出し方は微妙に間違ってるかもしれんので、自分で検証してね。
995 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 05:56:21 ] exeを逆アセンブルしてソースコードに組み込む定番のやり方教えて下さい
996 名前:デフォルトの名無しさん [2008/04/24(木) 06:00:08 ] ソースコードでよくみかける10Lや1Lってなんのことなんでしょうか? 「1Lとは」などで検索したのですが見つかりません。 環境はC++、BCCです。どなたか回答頂ければ幸いです。
997 名前:デフォルトの名無しさん [2008/04/24(木) 06:09:58 ] >>996 整数のあとにつくLはlong intであることを表す。 10はintの10。10Lはlong intの10。
998 名前:デフォルトの名無しさん [2008/04/24(木) 06:31:33 ] >>997 ありがとうございます! long intをキーワードに検索したら大体わかってきました。 long intを代入するときはLをつけるという解釈であってますか?
999 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 06:39:42 ] 違うよ。整数リテラルそのものにも型があるの。 1 は int型 '1' は char型 1.0 は double型 1L は long型
1000 名前:デフォルトの名無しさん [2008/04/24(木) 06:49:16 ] 重ねてありがとうございます! 詳しい説明でよくわかりました(多分)。 単なる1でも勝手にintにされてるんですね。
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。