1 名前:デフォルトの名無しさん [2007/06/25(月) 12:01:46 ] エスケープシーケンスやWin32APIなどの環境依存な物でもOK。 ただしその場合、質問者は必ず、環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.38【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1180877635/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
404 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:38:48 ] すみません。mallocって確保したメモリのポインタが返ってくるのですが、 このポインタって確保したメモリのどこを指しているのですか? このポインタ指しているところの規定ってあるのですか?あればどんな規定?
405 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:42:38 ] >>404 最初(0アドレス)を指してる。
406 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:47:07 ] 0アドレスって凄い誤解されそうな・・・。
407 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:49:05 ] char *p = malloc(size); とすれば、 p[0] 〜 p[size - 1] のメモリをアクセスできることが保証され、 p + size が無効なアドレスにならないことが保証されている。
408 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:27:47 ] 何となく思ったことなんですが、 char *s = "hoge"; は char s[] = "hoge"; と違って、中身を書き換えたりしたらダメなんですよね。じゃあ、最初から const char *s = "hoge"; としておいた方が、間違って書き換えちゃったりしたらコンパイル時にエラーになって、 深夜のデバッグ作業突入を防げるような気がするんですが、これはいい考えですか? それとも、気をつければいいだけですか?
409 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:30:13 BE:223773825-2BP(21)] >>408 とてもいい考えアル と、effective c++あたりに書いてあった希ガス
410 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:37:22 ] >>408 char *s = "hoge"; char s2[] = "hage"; s = s2; s[1] = 'i'; constをつけるとこれもできなくなる。やらないと思うけど。
411 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:43:50 ] const char* const s ="hoge"; にすれば s++ とかも防げるぜ! 以下修飾子の位置について終わりのない議論が始まります
412 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:45:27 ] >>408 少なくとも自分は条件反射的にconstつけてる
413 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:46:11 ] 結論出たので終了
414 名前:デフォルトの名無しさん [2007/07/04(水) 01:05:17 ] 今日wstring型ってのを知ったのですが、 wstring a[2]; a[0] = L"あああああ"; a[1] = L"いいいいい"; wcout << a[0] << endl; wcout << a[1] << endl; ってやっても何も出力されません。 なぜでしょうか?教えてください。 ググっても良い資料が見つからない、、、。
415 名前:デフォルトの名無しさん [2007/07/04(水) 01:06:39 ] >>414 です。 ”何も”ではなく空白行が2行出力されます。
416 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:07:36 ] wcout locale imbue でググるんだ!
417 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:23:30 ] string
418 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:25:59 ] 横レスだが、MacOSX GCC 4.0.1 だと locale に何渡しても runtime_error になるな。
419 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 01:53:39 ] Javaの静的初期化メソッドみたいなもの、C++にありましたっけ? たとえば、 class hoge { static int num[100]; //この配列を0-99まで初期化したい } hoge::int num[100]; といったとき、どう書くのが一番スマートですか? (num[100]={0, 1, 2...} とやるのはなしとして) コンストラクタ内で初期化しようとすると インスタンスを生成するたびに何度も同じ処理が 繰り返されることになるので無駄だし…… 初期化処理が既に終わっているかどうかを示す フラグを追加するとかでしょうか。
420 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:04:49 ] 今考えたけど、こういうゴリ押しができなくもないな。 friend しなくても通ったけど、これって規格的におkなの? #include <iostream> class hoge { private: static const int SIZE = 10; private: struct static_init { static_init() { for(int i = 0; i < SIZE; ++i) { num[i] = i; } } }; public: static void show() { for(int i = 0; i < SIZE; ++i) { std::cout << num[i] << std::endl; } } private: static int num[SIZE]; static static_init static_init_; }; int hoge::num[hoge::SIZE]; hoge::static_init hoge::static_init_; int main() { hoge::show(); }
421 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:17:42 ] この程度で充分じゃね? class hoge { static int num[100]; }; int hoge::num[100]; static int initialize() { for (....) { ... } } static int initializer = initialize(); ファイルスコープのstaticが嫌いならnamespace{}でも。
422 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:24:58 ] 関数を friend にする必要があるね。 個人的には戻り値 int が必要になるのが気持ち悪い。
423 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:36:10 ] >>421 うわー、その手がありましたか。 絶対忘れないように今すぐそれ使って何か書いてきます。 ありがとうございました。
424 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 02:56:23 ] class CStaticInt { public: CStaticInt(void) { for( int i = 0; i < 100; i++ ) a[i] = 0; } ~CStaticInt(void){} static CStaticInt* GetInst( void ) { static CStaticInt obj; return &obj; } int a[100]; }; こういうのもどう? んで、CStaticInt::GetInst()->a[0]でアクセスする マクロ化すれば使用に耐えられなくも無い…かもしれん('A`)
425 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:45:31 ] scanf("%s",str); if(strcmp(str," ")==0) printf("空白文字"); これで入力された文字が空白かどうか調べようとすると strcmpが0とならずprintfが実行されません。 これってどこがダメなのでしょうか?
426 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:47:49 ] >>425 入力が半角空白1文字じゃないんだろう。 else で puts(str) してみれば?
427 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:02:37 ] >>426 う〜ん、なんか動かしてみると scanfが空白文字を読み込んでないみたいな動作をするというか、 半角空白を入力すると入力が終了せず延々と入力を促すようになるのです。 だからif文の後もelse文も実行されない感じでしょうか。
428 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:11:21 ] %s は空白を飛ばすから当然そうなる。
429 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:16:38 ] >>428 そうなのですかorz では文字列を入力するという処理で空白文字が入力されたか というのを調べるには↓みたいにするしかないですか? fgets(str,N-1,stdin); if(str[0]==' ') printf("空白文字");
430 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:20:54 ] strstr()
431 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:42:00 ] >>429 どういう仕様にしたいのかが今ひとつ分からんから何とも言えんなあ。 " hoge " とか "hoge hoge hoge" とか入力された場合どうしたいのかな?
432 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:08:13 ] >>431 char str[N][N]; int i; for(i=0;i<MAX;i++){ printf("文字列入力:"); fgets(str[i],N-1,stdin); if(str[0]==' ') break; } こんな感じで空白文字が入力されたら入力を打ち切る仕様にしたいのです。 だから"hoge hoge hoge"の場合はそのまま文字列として格納です。 >>430 紛らわしいこと書いてすみません、仕様は上記のような感じでした。
433 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:10:00 ] if(str[i][0]==' ') break; でした。書き間違い。
434 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:12:14 ] >>432 " hoge " はどうなの?
435 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 15:15:03 ] >>434 それは考慮してなかった…。 コマンドラインでの入力が「半角スペース+Enter」の場合のみ 入力を打ち切るという仕様だと思います。
436 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 15:19:33 ] >>435 あと、" hoge " と入力された時、 最初と最後の空白をどうするのかという問題もある。
437 名前:デフォルトの名無しさん [2007/07/04(水) 17:09:55 ] TCHAR buf[100]; cin >> buf; ってすると UNICODE 版でコンパイルするとエラーになるのですが、 cin の TCHAR バージョンってないのでしょうか?
438 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:13:46 ] 自分で作るしかなかったと思う。 #ifdef UNICODE_ wistream& tcin = wcin; #else istream& tcin = cin; #endif
439 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:37:17 ] >>404 から >>407 さんへ、有難うございました。 すいません >>407 の >p + size が無効なアドレスにならないことが保証されている。 これ意味の解らないのですが、p + sizeのアドレスって、 確保されたメモリの次アドレス(確保外)が無効なアドレスにならないてことですよね。 なぜ、確保外の次のアドレスを無効なアドレスにならないことを保証しなければならないのですか?
440 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:46:51 ] ポインタ変数でループする際の終端として使えるようにするため。
441 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:48:26 ] >>439 の訂正 誤:これ意味の解らないのですが、 正:これの理由が解らないのですが、
442 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 18:55:36 ] >>440 有難うございました。 つまり、これに使うためにってことですね。 for( char* ptr = p; p != ptr; ptr++){} >>407 さんと >>440 さんのおかげで少し賢くこうなりました、ぺこり
443 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 19:15:40 ] それだといきなりループが終わるw C++ やってりゃ分かると思うけど、 algorithm でやってるあーいう処理ね。
444 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 20:59:34 ] あいやー、いきなりループが終わるんですか、ガクブル、どうすれば良いんですか
445 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:01:14 ] こんな感じ #include <stdio.h> #include <stdlib.h> void fill(int *begin, int *end, int first, int step) { int *p; int n = first; for(p = begin; p != end; p++, n += step) { *p = n; } } int sum(int *begin, int *end) { int *p; int n = 0; for(p = begin; p != end; p++) { n += *p; } return n; } #define SIZE 5 int main() { int *p = malloc(sizeof (int) * SIZE); if(p == NULL) { return EXIT_FAILURE; } fill(p, p + SIZE, 0, 1); printf("%d\n", sum(p, p + SIZE)); free(p); }
446 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:05:50 ] c++で全角と半角を格納している配列から一文字ずつ読んで 標準出力させたいんですが、全角の1文字目と半角を区別することができません。 string str = "あイウ()"; for (int i = 0;i<=100;i++) { printf("%c",str[i]); } こうすると半角は正しく出力されますが、半角が出ません。 どうしたらいいですか?
447 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:12:41 ] >>446 色々方法はある。 _mbclenを使うとか、wstringやUNICODEにするとか。
448 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:26:22 ] > 半角は正しく出力されますが、半角が出ません どっちなんだよ?
449 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:32:50 ] >>445 有難うございます、あす、これとmallocの知識を引っさげて学校で自慢してきます
450 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:33:27 ] >>449 他にこのスレ見てるやつもいるかもなw
451 名前:445 mailto:sage [2007/07/04(水) 21:34:47 ] >>447 なるほど。書いてもらったやつで調べてみたら できそうですね。ありがとうございます。 あと少し教えてください。 「_mbclen」のアンダーバーは何を意味しているんですか? それとアンマネージドというのは.NETの機能を 使わなければいいんですよね? MFC、ATL、SDK、WINDOWS APIとかその辺の区別が全く理解できなくて・・・。
452 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:35:45 ] >>448 すいません。「全角が出ません」の間違いです。
453 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 21:44:47 ] >>451 処理系オリジナルのものと言う証。 下線で始まる名前は、処理系のために予約されている。
454 名前:デフォルトの名無しさん [2007/07/04(水) 21:59:18 ] C++初心者です。型変換のことで教えてください。 main(){ int iv; iv=int(3.14); } この「int()」は何ですか?キャスト演算子ですよね?それとも値生成演算子? また、 class T { int miv; public: T(int iv=0):miv(iv){} }; main(){ T oa; oa=T(2); } このT(2)は、変換コンストラクタの呼び出しですよね?キャストとは呼ばない? さらに、main()を次のように書き換えると、 main(){ T oa; oa=static_cast<T>(2); } このstatic_cast<T>(2)はキャストだけど、実はT(2)と同じですよね。 じゃあ、T(2)もやはりキャストなのでしょうか?コンストラクタの呼び出しとは言わない? ネットやいろんな本を見ても、このあたり、はっきり書いてないのです。
455 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:00:47 ] >>453 わかりました。ありがとうございました。
456 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:06:07 ] >>454 >この「int()」は何ですか?キャスト演算子ですよね?それとも値生成演算子? int のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。 >このT(2)は、変換コンストラクタの呼び出しですよね?キャストとは呼ばない? T のコンストラクタの呼び出しによるテンポラリオブジェクトの作成。 >このstatic_cast<T>(2)はキャストだけど、実はT(2)と同じですよね。 多分同じ。
457 名前:454 mailto:sage [2007/07/04(水) 22:20:46 ] >>456 さん、早速ありがとうございます。 intのようなC言語からある型の場合も、コンストラクタ、オブジェクトという概念で 考えるのですかぁ。C++では、intなどの型もクラスのような感じ? C++本やネットでは、int()は(C風の)キャストだという記述が多いですが、 「コンストラクタ呼び出しによるテンポラリオブジェクトの作成」は、 別な言い方をすれば「キャスト」と同じこと、という理解で良いのでしょうか? static_cast<T>(2)はT(2)と規格上同じだし、(T)2、と書くことも出来るから考えると。
458 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:23:22 ] キャストは引数を複数取れないから基本的には別のもの。 引数が 1 つの場合は同じようになるだけで。
459 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:27:09 ] 規格票の 5.2.3 明示的型変換(関数的記法) によれば、 この記法とキャストは同等だと書いてありますね。
460 名前:454 mailto:sage [2007/07/04(水) 22:40:00 ] 型がクラスの場合は、 引数1つだとキャストと同じ表記だけどキャストとは別もののコンストラクタ呼び出し、 というのは、納得です。 じゃあ、例えばintの場合、Cでは「 (int)3.14」はキャストですよね? C++では、「(int)3.14」はコンストラクタ呼び出しであって、キャストではないということ? それとも、「(int)3.14」はキャストだけど「int(3.14)」はコンストラクタ呼び出し? と、ここで>>459 さんもコメントどうもです。 とすると、意味合いとしてはキャストと、このコンストラクタ呼び出しは同じってこと? それとも、記法としては同じであって、でも意味合いとしては別もの、ということ?
461 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:46:33 ] 同じものの違う表記法というだけみたいですね。
462 名前:デフォルトの名無しさん [2007/07/04(水) 22:47:33 ] >>408 char *s = "hoge"; は、書き換えたりしない(書き換えられないとは違う)。 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、 コンパイラに特別指定しない限り同じ領域を指すポインタである。 深夜までデバッグしたくなければ書き換えるのはやめれ。 従って、("hoge"[2] == 'g') は、真になる。参照する方はやりたい放題。 関数内での char s[] = "hoge"; はありえないと思うのだが、検証した? char s[]というのはポインタではなく、要素数を省略した配列なので、 まず、要素数が決まる `= { ... }' という構文が必要。 そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。 例えば、static char s[] = { 'h', 'o', 'g', 'e', '\0' }; これなら別の値に自由に変更可。 例外として、引数がある void hogege(char hoge[]); これは void hogege(char *hoge); と全く同義なので自由に書き換えられる。 もちろん、呼び出し元の関数と調和をはかるように。
463 名前:454 mailto:sage [2007/07/04(水) 22:51:48 ] 昨日、本屋で「C++の設計と進化」を立ち読みしたです。 索引で見つけた「コンストラクタの表記」を引いてみると、 クラス型名(式)の表記によってコンストラクタを式中でも使えるようになった、 というようなことが書いてあり、さらには、この表記は、 キャストの表記と同じだ、とも書いてありました。 でも、コンストラクタの表記とキャストは同一だという説明はなく、 このあたりは、はっきりとは書かれていなかったです。 C++の本は、新しい4つのキャスト演算子については必ず説明がありますが、 オブジェクトの初期化とコピーコンストラクター以外の コンストラクタの呼び出し(とテンポラリオブジェクトの作成)については、 ほとんど説明がないですねぇ。。
464 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:57:01 ] 正確な情報を知りたければ規格票を見るのが一番ですよ。 www.jisc.go.jp/app/JPS/JPSO0020.html C++ の規格番号は X3014 です。
465 名前:454 mailto:sage [2007/07/04(水) 23:00:56 ] >>464 はい、逝ってきます・・・
466 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:17:00 ] >>460 459ではあれだけで終わっているが、 実際のところ、5.2.3には続きがあって、括弧の中の式の並びが複数ある場合、 コンストラクタを呼び出して一時オブジェクトを作ると規定されている。 歴史的には、コンストラクタを呼んでクラスの一時オブジェクトを作る構文として 導入されたのが最初で、後にそれを一般化して全ての型に対して使えるようになった。 (C++の設計と進化に書いてあるとおり) その際、組込型では型変換演算子と同じ効力を持たせたという次第。 また、1つしか引数を取らないコンストラクタは、そのクラス型への型変換を提供する。 だから454でのstatic_cast<T>(2)は結局コンストラクタ呼出として機能する。 (あと型変換演算子の話もしたいが省略) C++は、型変換を即ち新しいオブジェクトが作り出されることと捉えているように思われる。 すると、コンストラクタ呼出と型変換の境界が非常に曖昧になっているも納得がいく。
467 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:24:01 ] (int*)p はできるけど int*(p) はできないってところとか、 本当に細かい文法的な違いはあるね。
468 名前:454 mailto:sage [2007/07/04(水) 23:34:42 ] >>466 ちょっと判ったような気になりました。ありがとう。 ついでにもう一つ。これから変換関数、変換演算子を勉強しようとしているところですが、 この2つ、同じものですよね?呼び方が違うだけで。 >>467 そーですね。単一名称(単純名称)でないとだめ、という説明はよく見ます。 typedefすれば大丈夫、ともよく書いてある。
469 名前:454 mailto:sage [2007/07/04(水) 23:49:26 ] いま、JIS3014を検索してみました。 「変換関数」はたくさん出てきます。 「変換演算子」というのは該当無しで、 「型変換演算子」は、dynamic_cast, static_cast, reinterpret_cast, const_cast のことを指すのですね。 ネットでググると、変換関数の意味で「変換演算子」を使っているページが たくさんヒットするんですが、これらはみんな間違ってるのかな。 というか、JIS3014、おもしろい。絶対的な信頼があるから、 間違いを疑う必要もないしね。
470 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:18:30 ] 間違いはないけど、コンパイラが対応してないこともw export とかほとんど対応してないし。
471 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:35:03 ] >>462 初心者騙して楽しいか? > 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、 > コンパイラに特別指定しない限り同じ領域を指すポインタである。 そんなことは決まってない。 > そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。 自動変数でも配列要素数の省略は使える。
472 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 04:58:00 ] 質問です。 Microsoft Visual C++ 2005 Express Editionにおいて、 C++のアプリケーションを作っています。 コンパイル後の.exeファイルのプロパティで バージョン情報や会社名などが表示されるタブが出ません。 ソリューションエクスプローラ中にはAssemblyInfo.cppという、 AssemblyTitleAttributeなどが配置されたファイルが自動生成されています。 しかし、反映されません。(検索などではC#で作成され、csの場合のみ反映されるらしい) 対処法か代替案を持っていらっしゃる方はおりませんか?
473 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 05:13:07 ] >>472 こっちで聞いた方がいいと思う Visual Studio 2005スレ Part21 pc11.2ch.net/test/read.cgi/tech/1180692040/
474 名前:デフォルトの名無しさん [2007/07/05(木) 09:03:52 ] 実行環境はWindows環境、開発環境はVS6.0です。 メールを送りたいのですが一般的な既存ライブラリは存在しているのでしょうか? イメージしているのはWinsockに依存したライブラリですが 普通はそのままSMTPを喋るものなのでしょうか? 受信は必要なく、OB25Pも問題ありません。
475 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 09:38:14 ] Windowsで一般的といえばMAPIだろうな 俺は使いたくないけどw
476 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 09:42:20 ] basp21.dll
477 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 10:46:02 ] >>476 そういえばそんなのもあったね。
478 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:05:27 ] ttp://www.hi-ho.ne.jp/babaq/basp21.html 2007年6月29日更新 タイムリーすぎてワロス まさか自演じゃないだろうな
479 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:31:25 ] Windowsで簡単に見た目もいけてるGUIを作るにはどんな方法があるでしょうか? ちなみに過去にチャレンジしたこと ・C++/CLR コントロールは豊富だが、OfficeとかVSにあるようなフローティングメニューが見つからないので中断 日本語の資料が少なくて困る 既存のリソース(DLLなど)と組み合わせるときに DLLのほうの仕様を変えないとうまく動かないor非常にめんどくさいの2択になる あと変な拡張構文がキモい ・MFC デフォルトのコントロール数が貧弱だが、資料も多いし、 Win32APIをラッピングしてある程度のものが多くわかりやすい。 VS2005で作成するとManifestでうんぬんとうざいのでスタティックリンクできないプロジェクトだとだるい。 ・C++Builder GUIのデザインをするには最強だと思うが、本体が生きてるのか死んでるのかよくわからんのと 重い、謎のバグがいつまでも取れない、というのがネック。 未だに6を使ってる人が多い。 VCと一緒に入れるとデバッガが正常に動かない可能性がある? ・WTL 何がいいのかさっぱり
480 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:40:11 ] CEGUI
481 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 11:56:50 ] >>479 SWINGとかAWT継承すれば? C++じゃなくなるけど
482 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:21:14 ] SwingとかAWTをJNI通してC++から使うっていう意味?
483 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:22:06 ] SQING や AWT がイケてるとは思えないけどw
484 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:36:44 ] ロジック部分を C++ で書いて ユーザインターフェイスは C# で書く。 C# からアンマネージドなDLL呼び出せるし。 だめ?
485 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:43:30 ] FrameworkもJREも無しですませたい
486 名前:デフォルトの名無しさん [2007/07/05(木) 12:52:35 ] すみません stringのfindは、またはの検索できませんか たとえば"あい"または"大塚"または"愛" とかです
487 名前:デフォルトの名無しさん [2007/07/05(木) 12:53:34 ] str.find("あい"|"大塚"|"愛") でいいんでしょうか
488 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:56:49 ] なんで試さないの?
489 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 12:58:48 ] >>486-487 str.find("あい") != string::npos || str.find("大塚") != string::npos || str.find("愛") != string::npos 正規表現ライブラリを使ったほうがいいかもね。
490 名前:デフォルトの名無しさん [2007/07/05(木) 13:01:18 ] >>499 ヒットする、またはヒットする、ってやるんですね サンクス わかりました
491 名前:デフォルトの名無しさん [2007/07/05(木) 13:02:37 ] でも、番号がわからないような気が・・正規表現ライブラリを調べてみます!
492 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 13:07:19 ] 場所が欲しかったら代入してやればいい if ((pos = str.find("あい")) != string::npos || (pos = str.find("大塚")) != string::npos || (pos = str.find("愛")) != string::npos) { // みつかった } else { // みつからへん }
493 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 14:22:14 ] ライセンスキーを入力->立ち上がる これをやりたんです。 ・キーの発行は手作業で。 ・アプリ側ですること、ライセンスキーを認証するdllを作成。 こんなこと想像してます。解説しているページや 簡単に実現できるツールなどありませんか。
494 名前:472 mailto:sage [2007/07/05(木) 15:53:44 ] >>473 誘導感謝。そっちへ行ってみます。
495 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:58:22 ] >> 同じ文字列リテラル(ダブルクォーテーションで括った文字列)は、 >> コンパイラに特別指定しない限り同じ領域を指すポインタである。 > >そんなことは決まってない。 そうでない処理系を挙げてくれ。 > >> そして、この構文は静的変数(グローバル変数か、スタティック変数)にだけ許される。 > >自動変数でも配列要素数の省略は使える。 どんな例か試しに書いてくれ。
496 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:04:06 ] VCとか。 C89(ANSI-C)以前の人は、自動変数で int hoge[]={1,2,3};式の初期化が出来ないとか言い張ることあるよね。
497 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:08:04 ] >>495 Visual C++では、コンパイラオプション/GFを指定しないと 同一文字列リテラルが同じ領域を共有するようにならない。 (なお/O1や/O2などの最適化オプションを指定すると暗黙の内に/GFも指定されたことになる) ローカル変数での配列でもchar s[] = "hoge";や char s[] = {'h', 'o', 'g', 'e', '\0'};のように書くことは可能。 このように静的変数や大域変数と同じ構文。 少なくともANSI/ISO Cではできることになっているし、 PC用のコンパイラなら今時できないものを見つけるほうが難しい。
498 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:12:14 ] >>495 ===== 同じ文字列リテラルが違う領域を指す例 ===== gcc -c b.c gcc a.c b.o /*----- a.c -----*/ #include<stdio.h> char *p_hello(void); int main(void){ printf("%s %s\n", "hello", p_hello()); printf("%p %p\n", "hello", p_hello()); return 0; } /*----- b.c -----*/ char *p_hello(void){ return "hello"; } ----- 実行結果 ----- hello hello 00403000 00403020 ===== 自動変数で配列要素数の省略 ===== #include<stdio.h> int main(void){ int i, data[]={0,1,2,3,4,5,6,7,8,9}; for(i=0;i<sizeof(data)/sizeof(data[0]);i++) printf("%d\n", data[i]); return 0; }
499 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:22:06 ] >>495 わざわざ無知を晒しに出てこなくてもよかったのにね。
500 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:28:25 ] まあ聞くは一時の恥、聞かぬは一生の恥と言うし、 495はいい勉強になったということでいいじゃないか。
501 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:38:17 ] >>493 至極簡単だと思うけど…
502 名前:474 mailto:sage [2007/07/06(金) 01:01:18 ] 皆様回答ありがとうございます。 BASP21はタイムリーですね。自演ではないです。 調べてみたところSMTP-AUTHに対応してなさそうな感じでしたので MAPIをもう少し調べてみようと思います。 ありがとうございました。
503 名前:493 mailto:sage [2007/07/06(金) 02:01:09 ] >>501 1.大量のライセンスキーのデータベースが入っていて、マッチング。 2.それとも、秘密の値を一つだけ持っていて、 数学的になにか計算して、(ハッシュなど)マッチング。 一番目ってキーの数が多かったら、大変ですよね。ぬー。 ということは、数学のなにかを使って、やるんでしょうか? たとえば、ウィンドウズだと、どんな感じでしょうか。
504 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 02:25:49 ] ライセンスキーをソートした状態で持っておけば、2分検索が使えるよ。