1 名前:デフォルトの名無しさん [2009/09/17(木) 22:22:59 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.67【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1247937958/l50 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
468 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 16:33:49 ] コマンドラインで引数を受け取ってローカルアプリのAPIをコールするexeを 作成したいんですがどこか参考になるサイトご教授願いませんか? オブジェクト指向は理解してますがwindowsのプログラムは超初心者です。
469 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 16:43:18 ] Windowsのプログラムが超初心者なら、どのOSのプログラムなら初心者じゃないんでしょうか。
470 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 16:48:48 ] >>468 私はあなたではないので質問の意味が分かりません 他の人にわかるように書いてください
471 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 16:50:45 ] >>468 ローカルアプリというのは何を指していますか? APIは何万個もあるわけですが、どのAPIをコールしたいのですか? コマンドラインで受け取った引数は何に使うのですか?
472 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 17:05:31 ] >>471 Skypeで特定ユーザーにメッセージを送信、ムードメッセージを送信、オンライン、オフラインの切り替えなどです。 Firefoxのadd-onを作成しているのですがActiveXのSkype4COM.dllが使用できないため exeでなんとか操作できないかと。
473 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 17:11:02 ] >>472 exeじゃなくてwscriptで十分。 Skype4Com WScript でググレ。
474 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 17:12:56 ] >>472 https://developer.skype.com/Docs/Skype4COM ここの referenceguide とか examples ちらっと見る限り exe での操作はできるよ
475 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 17:21:43 ] >>464 wikipediaってwww
476 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 17:33:14 ] >>468 その書き方だと、既成のEXE内の関数をコールしたいとか、あらゆる可能性を引きずってる。 もうちょっと限定してくれ。
477 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 17:41:39 ] プログラム全体から呼び出される可能性のあるものはシングルトンにしてもいいだろうよ。
478 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 17:42:26 ] >>476 >>468 = >>472 みたいだ
479 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 17:56:05 ] グローバルかシングルトン使わないと延々とポインタを引数にリレーとかしないといけないからめんどくさいじゃん
480 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 17:57:59 ] ぶっちゃけシングルトンにしていいようなものはグローバル変数にしていいと思う gotoと同じく完全排除が常に善ではないし、gotoよりは使ってもいい ただ無闇に使うなってだけ
481 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 18:02:08 ] >>478 おっとすまない。俺が読めてなかったみたいだ。
482 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 18:04:37 ] グローバルとシングルトンは全然違うだろ。 シングルトンはグローバルとファイル内にスコープの閉じたstaticグローバル変数の中間くらいの性質をもったものでグローバルより安全で使いたい場所でだけゲットできる
483 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 18:05:13 ] 唯一のインスタンスにアクセスするメソッドだけを持ったクラスを継承させたほうがいいとおもう
484 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 19:04:33 ] >>475 内容がおかしければ直せばよい。それだけだ。
485 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 20:00:06 ] シングルトンなんか最近はアンチパターン扱いだろ
486 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 20:06:29 ] >>484 便所の落書きを一生懸命書き直すバカなんかいないだろ
487 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 20:09:50 ] できない言い訳はいいよ
488 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 20:20:45 ] ランタイムコストが掛かるし、細かい罠がぼろぼろ落ちてるし、マルチスレッドには 致命的に向いてないし、下手な使い方をすればグローバルインスタンスと全く同様の 問題も抱える。 今時シングルトンなんか推奨する人はちゃんと理解してるんだろうかと。
489 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 20:27:54 ] 論拠にwikipediaをもってくるやつってなんなんだ。 書き直せよって言うけど、俺がぜんぜん違う内容に書き換えたら、それを信じるってことか?
490 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 20:28:02 ] シングルトンは「俺のコードカコイイ」な人かJava脳の人が使うもんだろ で、MTのコードを書き始めると、ダブルロッキングとか馬鹿で無意味なこと始めるか、 目が覚めて窓から放り投げる
491 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 20:29:41 ] うぃきぺを補強に持ってくるのはバカだけど、とりあえずうぃきぺ出典かどうか なんか無視して、中身の正しさを巡って議論すればいいと思うよ
492 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 20:31:50 ] 海外のフォーラムなんかも「シングルトンだって? 素直にグローバル使えよプゲラ」って感じだな
493 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 20:32:57 ] 値域の制限には使えると思う
494 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 20:46:55 ] wikipediaだからという理由で中身を見ない人って何なの?
495 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 20:59:59 ] >>489 だからグダグダと言い訳ならべなくていいって。 君の最大の力をもって素晴らしいページに書き換えてくれ。
496 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 21:12:45 ] 意味がわからない。 wikip好きすぎだろ。
497 名前:デフォルトの名無しさん mailto:sage [2009/10/07(水) 23:02:01 ] お前の2行目の決め付けのほうが意味がわからない。 発狂するタイミングじゃないと思うんだけど。
498 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 01:33:41 ] >>466 >>482 「初期化順の制御」したいときにも「使いたい場所でだけゲット」したいときにも、 クラスに対してシングルトンパターンのような加工を施す必要は無いんじゃない? ふつうのクラス定義と、そいつの参照を返す関数がひとつあるだけじゃダメなの?
499 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 02:24:17 ] >>498 初期化順で俺が言いたかったのは複数のグローバルなオブジェクトがあるときね 1個だけならお好きに
500 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 02:54:52 ] >>499 オブジェクトが何個でも一緒じゃない? ふつうの関数(と静的変数)ではできなくて、「シングルトン」ならできる、っていう 初期化順の制御ってどんなのがあるの?
501 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 02:59:45 ] >>498 >ふつうのクラス定義と、そいつの参照を返す関数がひとつあるだけじゃダメなの? クラスを公開するなら、そのクラスのインスタンスがあちこちにできちゃうかもしれない。 メンバ関数じゃなくて、参照を引数に取る関数を定義すればいいかもだけど、 それならいっそ参照を外に出さないで、関数だけ公開すればいいと思う。 個人的には静的メンバ関数のみを持つクラスをよく使うなあ。 こういうのってパターン名とかないのかな。
502 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 03:09:59 ] >>501 > クラスを公開するなら、そのクラスのインスタンスがあちこちにできちゃうかもしれない。 それが嫌なら、公開するクラスは純粋仮想関数の宣言を並べただけの インターフェースクラスにしとくという手がある。 class C { public: virtual void f() = 0; virtual void g() = 0; }; C& DefaultC(); 「参照返す関数」をなるべく使わないように、できるだけ引数で受け渡すように しとけば、テスト用にダミー実装に差し替えるとかいうようなこともできる。 > それならいっそ参照を外に出さないで、関数だけ公開すればいいと思う。 あぁそういうパターンもあるよね。 C だと超ふつうだな。 やっぱりシングルトンパターンのメリットは見えてこないな。
503 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 09:31:26 ] staticなメンバ変数しか持たないのはmonostateパターンだね 見た目がシングルトンより綺麗だから俺もこっち使うけどメリットデメリットはよくわからん・・・
504 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 10:18:34 ] 継承できるできないとかコンストラクタが呼ばれない呼ばれるの差じゃね
505 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 10:56:21 ] 質問です。 32ビットのXPで、出来るだけ最適化をかけられてフレームポインタが無い .exe は、 原則として関数(インライン化されたものを除く)のコール順というのは分からないんですよね? それなのに、VisualStudioとかで見ると、呼び出し履歴が見えるのはどうしてでしょうか。
506 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 11:11:59 ] >>505 最低限、関数からリターンするためには呼び出された元の位置を知っていないといけない わけで、どんなに最適化してもプログラムが実行可能である限りその情報は存在している。 CPU が関数からリターンするときにそういった情報を使うのと同じように VisualStudio などの ソフトで情報を読み取れば、最低限の呼び出し履歴の表示は可能。 さらにバイナリに残っているシンボル情報やコンパイル時に生成できるデバッグ情報などを 加えれば、関数名や引数の表示までだいたい可能になる。
507 名前:505 mailto:sage [2009/10/08(木) 11:28:37 ] >>506 ありがとうございます。 StackWalk (StackWalk64) 関数でスタックトレースしようとしても、 フレーム有りだと上手くいくのですが、無しだと上手くいきません。 msdn.microsoft.com/ja-jp/library/cc428994.aspx の引数 FunctionTableAccessRoutine のところに、x86 だと fpo にアクセスすると 明記されてるので、上手くいかなくて当然なのかもしれないんですが、 なんとかアクセスできるようにする方法は無いでしょうか?
508 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 11:38:15 ] >>507 「上手くいきません」って言われてもな。 問題を再現するためのコードと期待した結果と実際の結果を用意して Windows API スレへどうぞ。 Win32API質問箱 Build82 pc12.2ch.net/test/read.cgi/tech/1253699773/
509 名前:505 mailto:sage [2009/10/08(木) 11:53:55 ] >>508 ありがとうございます、こっちで聞いてみます。
510 名前:472 mailto:sage [2009/10/08(木) 18:13:02 ] >>474 を参考にexeを作成して一通りSkypeの操作は可能になりましたが コマンドラインオプションで文字列送信で文字化けして躓きまました。 メッセージ送信は_bstr_t型なので /*内部処理*/ char *orig = "こんにちわ!"; _bstr_t bstrt(orig); pSkype->SendChatMessage("echo123", orig); /*オプション文字列*/ //int _tmain(int argc, char* argv[]) char *opt = argv[1];//こんにちわ!" _bstr_t bstrt2(opt); pSkype->SendChatMessage("echo123", opt); /*出力結果*/ orig -> こんにちわ! opt -> S0・k0a0・ 何が問題なのかご教授よろしくお願いいたします。
511 名前:デフォルトの名無しさん [2009/10/08(木) 18:17:42 ] Mac OS XとLinuxとFreeBSDでは OpenGLのヘッダやライブラリのファイルのある場所が違うので これらのどこになってもmakeが一発で通るように Makefileを書きたいのですが どういう風に書けばよいのでしょうか?
512 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 18:19:33 ] >>511 makefile を分ける ライブラリパスを追加しまくる configure を書く
513 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 18:33:47 ] はじめまして。 いきなりですが質問をさせてください。 携帯向けの会員サイトを構築したいので、いくつかの携帯サイトを参考にしてよさそうなのを見つけたのですが、 どこで配布されているものなのかわkりません。 またはシェアウェアや、どこかの会社に委託して構築されてるものなのでしょうか。 www.google.co.jp/search?hl=ja&q=userLoginOpen.php&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja これらはすべて同じシステムのようなのですが、配布元を教えていただけないでしょうか。 よろしくお願いします。
514 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 18:39:07 ] >>513 鼬害。
515 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 18:41:18 ] >>511 automakeあたりを使えば良いんじゃね?
516 名前:デフォルトの名無しさん [2009/10/08(木) 20:05:50 ] Linuxのgcc4.3.3では #include <limits> でコンパイルエラー起こした #include <climits> を代わりにインクルードさせた通したんだけど いいんでしょうかね、これで
517 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 20:09:39 ] >>516 C++ ならおk C言語ならNG
518 名前:510 mailto:sage [2009/10/08(木) 20:46:10 ] 自己解決。 UnicodeにShift-jis渡してりゃ化けるわw あほだ俺w
519 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 21:10:11 ] どのUnicode
520 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 21:17:51 ] >>516 Cではふつう #include <limits.h> と書く。
521 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:06:54 ] 環境変数はグローバル変数だから使用禁止
522 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:09:00 ] エスケープについての質問です。 下のようなソースで、 main(int argc, char *argv[ ]) 実行イメージが下のように、 入力ディレクトリ、出力ディレクトリの場合に > xxx.exe inDirPath outDirPath main関数ですぐにDEBUGすると、通常なら argv[1] : inDirPath argv[2] : outDirPath のようになると思います。 しかし、下の場合だと > xxx.exe "inDirPath\" outDirPath argv[1] : inDirPath" outDirPath argv[2] : 不定値 のようになってしまいます。 おそらく、 "inDirPath\"の\"がエスケープされ、文字の"となってしまい、 閉じる"がなくなってしまったためだと思います。 このような場合、プログラム上で回避できる策はあるのでしょうか? 無理そうなら、マニュアルに記載しようと思います。
523 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:20:31 ] \という文字がほしいなら\をエスケープして\\と書く。
524 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:35:59 ] すみません、それはつまり プログラムを実行する人に向けて、\は\\と書いてください、と マニュアルに書くしかないということでしょうか?
525 名前:デフォルトの名無しさん [2009/10/08(木) 23:41:17 ] 質問の趣旨とは異なる回答だけど、 プログラム内部でディレクトリパスの末尾に¥が付いてる必要があるなら 入力時には¥の有り無しどちらでも受け付けるようにしておいて プログラム側で末尾を判定して¥を付加してやればいいね \"が"になってしまうのは使う側の責任。だけどそもそも末尾に¥を要求しなければ そういうミスの発生件数も少なくなる
526 名前:デフォルトの名無しさん mailto:sage [2009/10/08(木) 23:43:45 ] >>524 それはコマンドプロンプトのせいだからどうしようもないね 対策はダブルクォートが出てきたら \" だと解釈して自分でパースするくらいかな
527 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 00:29:29 ] 昇順にソート済みの vector<int> v があり、その中から int min 以上、int max 以下の値を列挙したいとします。 これがmin以上max未満ということなら、次のようにすればよいと思いますが、 vector<int>::iterator imin = upper_bound(v.begin(), v.end(), min); vector<int>::iterator imax = lower_bound(v.begin(), v.end(), max); for (vector<int>::iterator i = b; i != e; ++i) 「max 以下」となると、どうするのがスマートでしょうか? for の前に if (imax != v.end()) { ++imax; } とか書くのはちょっとベタすぎる気がするんですけど、そんなものですかね。
528 名前:527 mailto:sage [2009/10/09(金) 00:31:59 ] すみません、自己解決しました。 vector<int>::iterator imax = lower_bound(v.begin(), v.end(), max + 1); でいいですね。
529 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 00:42:20 ] >>525 プログラム内部では、末尾に¥を付ける必要特にないのですが やはりユーザー側から「¥”」のような指定をされてしまうと プログラム側では防ぐことはできなさそうです。 >>526 文字列に「”」があったら、パースするというのも考えたのですが パース後に残った文字列のどこからどこまでが第二引数、第三引数かの判定が難しいです。 (実は第三引数まであり、それぞれ半角スペースが入る可能性有り。) もう少しやってみますが、 おそらくマニュアルに記載するのが良さそうに思います。 ご回答ありがとうございました。
530 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 00:43:21 ] >>527-528 > vector<int>::iterator imin = upper_bound(v.begin(), v.end(), min); これをループの始点に使うんだよね? それなら lower_bound() じゃね? > vector<int>::iterator imax = lower_bound(v.begin(), v.end(), max + 1); こっちは upper_bound(v.begin(), v.end(), max) じゃね?。 ...|1|2|3|4|5|... と並んでるとき、 lower_bound(3) は 3 の前の境目で、 upper_bound(3) は 3 の後ろの境目、だと覚えてるんだけど、違ったかな?
531 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 06:54:56 ] >>527 max+1するなら、両方lower_bound()だな。 iminをupper_bound()で得ると、重複した値を取りこぼす。
532 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 09:38:15 ] >>526 つ[ディレクトリ記号は/でおながいします]
533 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 10:16:01 ] >>490 Javaはシングルトンの使い道があるん?
534 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 17:31:26 ] void test(int x[]){cout << sizeof x << endl;return;} int main(array<System::String ^> ^args) { int x[] = {1,2,3,4,5}; test(x); cout << sizeof x << endl; } ■出力結果 4 20 なんで両方とも20にならないんでしょうか?
535 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 17:34:33 ] >>534 ここ行って聞け C++/CLI part3 pc12.2ch.net/test/read.cgi/tech/1206447234/
536 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 17:37:16 ] >>535 ありがとうございます。
537 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 17:40:20 ] >>534 エラーもしくは警告にならないのそれ まぁそれは実質的に void test(int *x) というプロトタイプと解釈されるから
538 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 17:59:43 ] >>537 エラーも警告もでません。 これは普通はやらない書き方なんですね。 だいたい理解できました。 test関数内ではポインタx単体の大きさをsizeofで見ていて、main関数内では配列全体をsizeof見ていると。 ということはこの場合、test関数内で20という値を得る処理を書く事はできないのでしょうか?
539 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 18:06:48 ] C本来の配列は要素数の情報を持っていない。なので、Cで配列を引数に取る関数は たいてい別の引数で要素数を受け取るようになっている。 悪いことは言わないから、array<T>なりList<T>を使っとけ。
540 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 18:10:48 ] もう誘導先に行ってて遅いかもしれないが、 C++かC#のどちらか明確にして勉強したほうがよいと思うよ。
541 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 18:12:46 ] >>539 そうゆうものなんですね。 すっきりしました、ありがとうございます。 素直にコンテナ?を使っておきます。
542 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 18:18:39 ] >>540 もともとJavaを主に使っていて、C#は多少勉強した程度です。 Javaとは配列の性質が違っていたのでとまどいました。 ご忠告ありがとうございました。
543 名前:デフォルトの名無しさん [2009/10/09(金) 18:28:39 ] gccのバージョンを数字だけ出力する方法はあるでしょうか? 4.3.5なら「4.3.5」だけとか
544 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 18:51:35 ] ___GNUC___ ___GNUC_MINOR___ だけでは末尾の1桁が 取れないのか どうやればいいんだろう
545 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 19:12:00 ] __GNUC_PATCHLEVEL__
546 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 21:04:03 ] >>545 おおサンクス そしたらこうすればいいのか printf("%d.%d.%d", ___GNUC___, ___GNUC_MINOR___, __GNUC_PATCHLEVEL__);
547 名前:デフォルトの名無しさん [2009/10/09(金) 21:48:40 ] 質問です。 環境はVisual Studio.net 2003 C++ 条件は列(9)の最後尾が○の場合、 後ろから●が見つかるまでの部分を 削除して表示する ***実行前*** ○●●○○●●○○ ○●●○○●● ↓↓↓↓↓↓↓ ***実行結果*** ○●●○○●● ○●● ●○○●○○○○○ ●○○○○○●○ ○●●○ ↓↓↓↓↓↓↓ ●○○● ●○○○○○● ○●●
548 名前:デフォルトの名無しさん [2009/10/09(金) 21:49:38 ] 最大横9×縦11項目 ●○○●○○○○○ ●○○○○○●○○ ●○○●○○○○○ ●○○○○○●○○ ●○○●○○○○○ ●○○○○○●○○ ●○○●○○○○○ ●○○○○○●○○ ●○○●○○○○○ ●○○○○○●○○ ●○○○○○●○○ ↓↓↓↓↓↓↓ ●○○● ●○○○○○● ●○○● ●○○○○○● ●○○● ●○○○○○● ●○○● ●○○○○○● ●○○● ●○○○○○● ●○○○○○● このような感じで出力したい場合、どういった風に 実装すればいいでしょうか? 以上、よろしくお願いします。
549 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 21:59:53 ] >>547 #include <stdio.h> #include <string.h> int main(void) { char buf[1024], *p, *q; while(fgets(buf, sizeof(buf), stdin)) { for(p=buf;(q=strstr(p, "●"));p=q) { q+=2; printf("%.*s", q-p, p); } printf("\n"); } return 0; }
550 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 22:03:14 ] MFC使っていいなら、 CStringW s = L"○○●●○○"; s.TrimRight(L'○');
551 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 22:28:16 ] ***実行前*** ○●●○○●● ↓↓↓↓↓↓↓ ***実行結果*** ○●● ここがわからん。開始時に末尾が●ならそれは削除?
552 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 22:37:51 ] 2パスにするのが楽かな?? まず、左から右に一回配列を舐めて、最後に出てきた黒の場所思えておいて、2パス目で表示。 もちろん処理を多めに食うけど、確実じゃないかなぁ。
553 名前:デフォルトの名無しさん [2009/10/09(金) 22:43:40 ] >>549 サンクス!! >>550 サンクス!! >>551 すまん、記述ミス ***実行前*** ○●●○○●●○○ ○●●○○●● ↓↓↓↓↓↓↓ ***実行結果*** ○●●○○●● ○●●○○●●
554 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 22:44:15 ] >>553 ん、そっか。ミスか。 じゃあ回答でおk
555 名前:デフォルトの名無しさん [2009/10/09(金) 22:51:09 ] >>552 例えば、 for(int i=0; i<99;i++) { bool iMap[99] = getFunc( i ); } これで○=1,●=0 ってなっていた場合どうする? つまり、○ならオブジェクトが取得できていて、 ●なら何も無い状態。
556 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 22:54:20 ] >>555 それぐらいは自分で考えてくれ。
557 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 23:04:57 ] >>555 即興だから間違ってたら申し訳ないが。 static const LineLen=99; int LastBlack=LineLen; bool Map[LineLen]; for(int i=0;i<LineLen;i++){//舐める1パス目 Map[i] = GetFunc(i); if(Map[i]==false) LastBalck=i; } for(int i=0;i<LastBlack;i++){//表示。2パス目 printf("%d",Map[i]); } っていう感じ。
558 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 23:09:14 ] 多分9*11で99要素なんだよ。 だから2重ループにするか、lastblackを11要素の配列にしないとだめだ
559 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 23:28:56 ] >>557 書いた後気づいた。読めてなかったなぁ。。。 >>558 の案もあわせて採用するといいと思う。 size_t LastBlack(object* Array,size_t N){ int Last=N; for(size_t i=0;i<N;i++){ if(Array[i]==false) Last=i; } return Last; } --呼び出し-- object obj[99];//どこかで中身設定。 size_t L; for(size_t i=0;i<11;i++){ L=LastBlack(obj+9*i,9); Show(obj+i*9,L); } って感じか?? 2重ループになっちゃったな。。。 確実だが、頻繁に呼ぶにはちょっと重いかもね。。。 黒発見した時点でそれまでを描画すれば1パスでいけないこともないかも??
560 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 23:40:27 ] だれも素直なstrrchrとかは勧めないのか Unicodeだとしてもwcsrchrとかあったはずだし 最悪strrchrwがshlapi.hとかにあった気がするが
561 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 23:59:46 ] 自分の発言でグダグダになったので、フルソース書いてみた。 思っていたのとは別物になってしまった。変なこと書いて申し訳ないね。 #include <stdio.h> #include <vector> #include <algorithm> int main(){ std::vector<int> Array; size_t W=9,H=11,LD=0; Array.resize(W*H); srand(253); std::fill(Array.begin(),Array.end(),0); for(size_t i=0;i<Array.size()/4;i++){ Array[i] = 1; } std::random_shuffle(Array.begin(),Array.end()); for(size_t i=0;i<H;i++){ LD = W; for(size_t j=0;j<W;j++){ if(Array[j+W*i]==1) LD=j; } for(size_t j=0;j<=LD;j++){ printf("%s",(Array[j+W*i] == 0) ? "○":"●"); } printf("\n"); } return 0; }
562 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 00:21:05 ] コンパイラの警告について質問です。 環境はVS2008Expressです。 先ほど2時間悩んだ末に発見した間違いがありまして、これを警告で表示してほしいなぁと思いました。 内容は Hoge c;//Hogeはクラス if (略) c = Hoge(0); else Hoge(1); というもので、elseの後ろは本来c = Hoge(1)とすべきところを、c=を忘れてしまいました。 気づいて直した後に、警告LV3なのが悪かった、4にしようと最高である4にしました。 期待としては cが「初期化されていない可能性のあるローカル変数」として警告される。 Hoge(1)は無意味だ〜という警告(ただ、コンストラクタ内でグローバルな変数にアクセスする設計もありえるあるから、これは警告にはできないか・・・?) のどちらかを期待したいたのですが、駄目でした。 前者は特に不思議なのですが、つかわれ方が Honya(&c); というポインタ引き渡しの場合には警告にならないようなのです。 (Honya(const Hoge *p)なので、constであるから警告になってもよさそうなものですけど…) この(くだらない)ミスを再発しないためには、何か良い方法はあるでしょうか? というつかわれ方をしていたせいで、警告がでませんでした
563 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 00:27:48 ] >>562 Hoge c; って書いた時点でパラメータなしのコンストラクタで初期化さ れてるんでは。
564 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 00:30:36 ] >>562 おそらく無理 前者のcはコンストラクタが呼ばれるから初期化されているので警告は出ない。 後者のオブジェクトを作るだけという使い方も十分あるし文法上何の問題もない。 どうしてもというなら、フラグを作って何のメンバ関数も呼ばれずにデストラクタが呼ばれた場合はassertするくらいか。
565 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 00:37:36 ] >>563-564 あー、なるほど Hogeにはコンストラクタを書いていませんが、暗黙のコンストラクタが用意されるんでしたね… Hogeはコンストラクタのいらない型なのですが、そこでなんとかできないでしょうか? 例えるならVectorデータ型みたいなもので struct Hoge { float x, y, z; }; 相当の品なのです。 こういう構造体を「コンストラクタを無くし」て、「初期化されなかったときの利用で、警告が出るようにする」ためのオプションや修飾子はないでしょうか?
566 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 00:56:10 ] >>565 Hoge C=式 ?Hoge(0):Hoge(1);
567 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 01:01:18 ] デフォルトコンストラクタをprivateにして必ず565みたいにさせるとか。
568 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 01:31:28 ] >>565 Hoge* c; if (略) c = new Hoge(0); else c = new Hoge(1); scoped_ptr<Hoge> cptr(c); Honya(cptr.get()); こんな感じにするかなあ。
569 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 02:24:28 ] 変数宣言と初期化を別にする限り防げないように思う つまり >>567 のいうとおりデフォルトコンストラクタをprivateにして >>566 のいうような宣言と同時に初期化を必須にするしかないと思う ただ>>566 はコンパイラが馬鹿だとコピーコンストラクタが使用されそうだし 俺なら Hoge C(式 ? 0 : 1); って書きそう
570 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 02:29:22 ] >>568 Vectorみたいな使い方と考えると 比較的プリミティブに近くて多く使われそうだし 毎回ヒープにアクセスさせるのは大仰な上に遅くなりそうじゃね? マルチスレッドだったりしたら毎回排他制御が…
571 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 09:30:22 ] 汎用的に配列の要素数を返却するtemplate をこのように書いてみたのですが 期待している動作になりません、間違いを指摘してもらえませんか。 #include <iostream> using namespace std; template<class X> int ArraySize(X* object) { return (sizeof(object) / sizeof(X)); } int main() { int array[] = {1, 2, 9, 3, 4, 5 }; cout << ArraySize(array) << endl; //配列array の要素数を取得したいのですが・・・ }
572 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 09:36:35 ] >>566-570 真剣な検討ありがとうございます。 ポインタにするのは、ちょっと速度的にきつそうかなと思います。 570さんのおっしゃるとおり、プリミティブに近いものを想定していますので。 デフォルトコンストラクタをprivateにすると、 Hoge c; とはできませんね。 (その方法で初期化を強要しつつ)初期化で条件式を使うのは確かによさそうですが、条件分岐が3つ以上の場合に無理がありそうですね。 書けなくはないですが・・・。 else Hoge(1); のところで、「生成したクラスが使われていないようですが?」という警告があれば一番良いのですけどね…。 それを避けるためには、使ってないローカル変数への警告を抑える (void)a; と同じように、 (void)Hoge(1); と書く。とか…。
573 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 09:38:34 ] >>571 int ArraySize(X* object) ここで、単なるポインタにしてしまった以上 sizeof(object)では大きさがとれませんよ。 sizeof(配列)で大きさが正しくとれるのは、それが配列宣言されており、コンパイラがサイズを知っているからです。 ポインタと配列は似て非なるもの
574 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 09:43:32 ] template <class T, size_t N> size_t GetArraySize(T (&)[N]) { return N; } int array[] = {・・・}; cout << GetArraySize(array);
575 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 10:06:36 ] >>571 です >>573 >>574 ありがとうございます。 >ポインタと配列は似て非なるもの そうですね、短絡的でした。 >>574 の T (&)[N] この書き方ですが、配列の宣言が、foo[N]このような書き方がしてある配列を参照しているという、ことなのでしょうか? それから、 return N; どうしてこれで要素数が取得できてしまうのでしょうか、不思議です?
576 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 10:09:41 ] >>575 です 質問がまわりくどいですね T (&)[N] と T &[N] この違いを教えて頂けないでしょうか。
577 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 10:10:13 ] foo[N]のNこそ、要素数でしょ?w
578 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 10:13:42 ] >>577 あ、そうか! わかりましたw T (&)[N] と T &[N] しかし、この違いがまだ理解できません・・・・orz
579 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 10:49:02 ] 構文解析のルールの詳しいことはよく理解してないけど T [N] => Tの配列 T &[N] => Tへの参照の配列 T (&)[N] => T[N]への参照 となってる模様。ちなみに参照の配列はコンパイルできない このへんは仮引数名の省略とか括弧の意味とかいろいろあって直感的には理解しにくいわ
580 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 11:35:26 ] 配列へのポインタと一緒だけど、演算子の優先順位が & より [ ] の方が高いから T &a[N] は先に [ ] と結びついて a[N] つまり a は要素 N 個の配列 その個々の要素の型が T& T (&a)[N] の場合は括弧で明示してあるために先に & と結びついて &a つまり a は参照 その参照先が要素 N 個の配列 関数の引数名は省略できるので、その場合 T a[N] は T [N] に、T (&a)[N] は T (&)[N] になる というように俺は理解してる
581 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 11:41:45 ] >>579 >>580 ありがとうございます、大変よく分かりました。
582 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 20:42:52 ] stringstreamってどんな感じで実装されてるんでしょうかね? stringみたいに内部で独自のメモリ管理方法を取ってるのか、vectorのようにベタな連続メモリなのか、それともまったく違うのか・・・
583 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:21:55 ] 宜しくお願いします。このコードをコンパイルしますと error C2664: 'Point<T>::set' : 1 番目の引数を 'int' から 'int &' に変換できません。 参照を外すと、静的でないメンバ関数の呼び出しが正しくありません。となります。 どのように対処したらいいのでしょうか? #include <iostream> using namespace std; template<class T> class Point { template<class> friend class Point; private: T x_; // x座標 T y_; // y座標 public: Point(); template <class U> Point(const Point<U>& r) : x_(r.x_), y_(r.y_){} Point(T x = T(), T y =T()) : x_(x), y_(y) {} void set(T& x, T& y); }; template<class T> void set(T& x, T& y) { x_ = x; y_ = y; } int main() { Point<int> ip(12, 34); Point<long> lp(ip); Point<int>::set(12, 34); // ここで当該エラー return 0; }
584 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:26:49 ] >>583 です 補足というか、行数の関係で書けませんでした、環境はVS2005 です。
585 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:31:47 ] ごめんなさい、スレを汚してしまいました 解決しましたというか・・・・tohoho情けない × Point<int>::set(12, 34); ○ Point<int> set(12, 34);
586 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 22:04:28 ] いいんだよ^^
587 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 22:14:26 ] >583 void set(const T& x, const T& y) にする。
588 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 06:51:57 ] >>585 set という変数を用意したいのか? メンバ関数のsetを呼び出したいのかはっきりしろ。
589 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 13:34:28 ] >>583 もしsetという名前のメンバ関数を呼び出したくて、しかもインスタンス 無しで呼び出したいのなら、そのメンバ関数はstaticでなければならない
590 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 13:37:55 ] でもインスタンスがないと当然 this が無いから、x_とy_に代入しようと するとエラーになるな 質問者はその当たりをはっきり質問するように
591 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 19:02:19 ] >>583 です 皆さん、フォローありがとうございます。今回のset は変数としての振る舞いを期待していました。
592 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:01:09 ] strstrのように、あるメモリ領域から特定のバイト列を検索する標準関数は あるでしょうか。VC++2008独自関数でもかまいません。 strchrに対するmemchrのようにmemmem?なんてのがあればいいんですけど。
593 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 02:26:50 ] 標準関数は無いと思うけど もし何度もその探索を実行するなら (\0終端の文字列と違い、長さがわかっているのだから) BM法かなんかでの探索を自前で実装するのが良いんじゃないかね。 まあ1度しか使わないのなら、そんなことせずに 先頭文字を探してそこから比較する、いわゆる力任せ法でも充分だろうけどね。
594 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 02:34:09 ] std::search() とか?
595 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 10:05:53 ] traitsって何者なんですか?
596 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 10:11:55 ] 曲者
597 名前:デフォルトの名無しさん [2009/10/12(月) 11:42:45 ] #include <iostream> #include <string> using namespace std; int main(void) { string s("表示"); int i = s.find('\\'); cout << i << endl; return 0; } これを実行すると、「1」と表示されますが、-1にするには どうすればよいでしょうか?
598 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 11:56:51 ] shift_jisを使わない
599 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 11:58:24 ] >>597 string s("ひょうじ");
600 名前:597 [2009/10/12(月) 11:59:06 ] 自己解決しました。できないようです。 ml.tietew.jp/cppll/cppll_novice/thread_articles/78
601 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 12:45:42 ] ソースをSJIS以外にしてコンパイル
602 名前:デフォルトの名無しさん [2009/10/12(月) 13:30:11 ] すみません。 趣味で、VC++のMFCで、いろいろ作っているんですが、もう5年くらいやっていて だいぶというかかなり本格的なものも作れるようになりました。 自分は文系なんでよく知らないのですが、プログラマに就職しようと思えばできるんでしょうか? 今の職場は単調作業なので、ちょっと刺激がほしいです。よかったら、転職しようとおもうんですが・・・どうでしょうか?
603 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 13:35:23 ] プログラマ板で聞いてください
604 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 14:32:08 ] >>602 貴方の人生こんな初心者スレで聞いて棒に振ってもいいんですか??
605 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 16:44:51 ] 関数ポインタの配列を使った関数呼び出しはc++ではどうやって実現させたらいいですか
606 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 16:47:56 ] >>605 Cと何かちがったっけ??
607 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 16:48:10 ] 普通の関数はCと同じ。 クラスのメンバ関数の関数ポインタは手を出さないほうが身のため。
608 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:14:10 ] 初心者なので詳しく答えられる方だけ回答お願いします
609 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:15:19 ] 初心者なのできちんと説明できない人は口を出さないでください イライラします
610 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:19:24 ] 初心者ならどんな回答も学ぶべきことがあるはずなのでありがたく思うべきです
611 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:20:50 ] 初心者なのぐぐれません。
612 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:21:32 ] 初心者なのでよみとれません。
613 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:23:43 ] 初心者なので日本語わかりません。
614 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 17:53:40 ] それではboost.functionの説明を始めようか
615 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:10:08 ] がんばってコード書いたのによくよく調べるとSTLとかBoostに同じしかも完全に上位のコードとかがあると泣けるんだがしかし
616 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:17:11 ] 頑張る前に調べような。そういうのが使える環境ならなおさらだ。
617 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:45:28 ] そりゃ一回は調べるんだけど見逃してたりするんでさ
618 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:49:27 ] コードを書いたことが明日への礎になる。
619 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 19:57:45 ] 中で何やってるのか全く理解できないようなコードを使ってトラブルと どうにもならなくなるしな。
620 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:13:41 ] >>615 それはいい勉強をしたと思え。 ただライブラリを使ってるだけよりいい経験を積んだんだ。
621 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 20:27:56 ] ・boostを眺める ・欲しい機能を見つける ・使ってみる ・boostを参照せずに同じ様な機能の縮小版を作ってみる ・挫折する ・boostはどうやってるんだろうと思いながらソースや解説をみて学ぶ 俺は大体こんなかんじで勉強になった functionとか
622 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 22:23:13 ] 連結リストを実装するのはCでよくある勉強だし、ポインタ完全制覇とか読むと実装したくなるしな。 それをSTLで既にあるじゃんとか言って馬鹿にする奴はいないだろ。
623 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 22:25:27 ] そりゃまぁ勉強目的でやるんならね
624 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 22:32:21 ] 時には馬鹿にならないとやる気にならないこともある。 Boostにあるからいいかではなかなか重い腰が上がらない。
625 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 23:37:36 ] namespaceでもprivateとかpublic使えればいいのに
626 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 23:50:49 ] anonymous namespaceが近いんじゃない?
627 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 23:57:13 ] >>625 staticメンバ関数で、それ専用のクラスを作るのはどうだろう。 気分的にちょっとアレだけど
628 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 00:05:07 ] 無名名前空間とはちょっとちがうかなぁ namespace hoge { private: template <int n> struct is_even { static const bool value = n % 2 == 0; }; // インクルードしても外から使えないようにしたい public: template <int n> class fuga { static const int value = is_even<n>::value ? n : 0; 〜〜; }; } みたいな感じで使いたい 仕方ないからnamespaceをclassかstructで置き換えてそれっぽいことはできてるんだけど 今度はusing namespaceが使えない・・・
629 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 00:30:43 ] ・規約でBoostを禁止しているプロジェクトにげんなりする。
630 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 01:46:06 ] >>628 namespaceだと名前空間を汚す気があれば突破されてしまうが。
631 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 04:51:45 ] 静的関数のテンプレート関数版みたいなもんか。 クラステンプレートfugaの静的メンバ関数にはしたくなさそうだな。