1 名前:デフォルトの名無しさん [2007/09/27(木) 11:39:04 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.42【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1188748806/l50 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2 名前:デフォルトの名無しさん [2007/09/27(木) 12:05:39 ] _,rr-―''''¨゙゙゙ ̄ ̄ ̄ ̄ ̄`゙゙゙゙゙゙゙゙''ヘi、、 ,,,,-―---、 ,r‐'″ ._,,,, `'lri,!'''″ ゙l .,,,″ ,,r'"` ゙゙l, ゙ヘ, | !アr, .l°.ェ'ニ,コ .| ゚ヘ、 | `'i、 .く_,、vr''″ ., ゙'i、 .,,/ ゙X、 ト ゙!,゛ .,,r‐--、 ,、_,、 .,,,,r‐'″ | } .,,r‐'^’ .|゜ め゙゚“゙゙~゛ |  ̄` .,l゙ | ,i´ ,l゙ ゙!、 ,i´ ,ノ .'┐ ,,-° '=,, /` .゚!, ,,,,r'″ ゙┐ ,l゙ ゚'r, .''''"` │ .,,-''i、 / `''x, .| | .,,r'" .゙┐ ,i´ ~'ヘi,,, | |_,r・″ 'ヘ,、 l゙ `¬--|i,,,,,,,,,,,,,,,,v、r',广 ゙ヘ=@ ,l゙ `゙'ーぃ--r'″ `'―、,,,,/
3 名前:デフォルトの名無しさん [2007/09/27(木) 13:00:37 ] 前スレ >>999 'CFuncHolder::SetFunc' : 1 番目の引数を 'boost::_bi::bind_t<R,F,L>' から 'void (__cdecl *)(char *)' に変換できません。 って怒られました。
4 名前:他板37 [2007/09/27(木) 13:03:35 ] どなたかご教授お願いします。 ↓の掲示板に書いてしまって、こちらの掲示板の皆様には申し訳ないのですが・・・。 pc11.2ch.net/tech/index.html#10 37なんですけど、継承方法がわからず困っています。 なんとなく、このままスルーされそうなので焦っています。
5 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 13:14:25 ] >>前007 とりあえずこんな感じにすると動いた #include <boost/function.hpp> #include <boost/bind.hpp> #include <windows.h> void g_func(const char* str) { MessageBoxA(NULL, str, "", NULL); } class Cfunc { public: void func(const char* str) { MessageBoxA(NULL, str, "", NULL); } void (Cfunc::* GetFuncPtr()) (const char*) { return &Cfunc::func; } }; class CHolder { public: template <typename T> void set(const T& f) { func = f; } boost::function<void(const char*)> func; }; int main() { CHolder hold; Cfunc cf; hold.set( boost::bind(&Cfunc::func, &cf, _1) ); hold.func("text"); }
6 名前:5 mailto:sage [2007/09/27(木) 13:15:03 ] 007→997 typo typo
7 名前:デフォルトの名無しさん [2007/09/27(木) 13:20:30 ] セットするところを↓にしたら>>998 でいけたよ! void SetFunc(boost::function1<void, char*> func){m_func = func;}
8 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 15:58:29 ] unsigned longの値を入れる配列無いでしょうか? CStringListみたいなやつで
9 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 16:03:28 ] std::vector<unsigned long>
10 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 16:18:11 ] 好きなコンテナに入れな
11 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 16:52:33 ] ところで↓って何やってるのか意味が分からないんだが、 誰か噛み砕いて教えてくれないだろうか。 boost::bind(&Cfunc::func, &cf, _1)
12 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 17:04:05 ] boost::bind(&Cfunc::func, &cf, _1)(hogr)⇔cf.func(hoge)
13 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 17:20:35 ] >>1 乙
14 名前:デフォルトの名無しさん [2007/09/27(木) 17:29:12 ] boost::functionはグローバル関数へのポインタや関数オブジェクトなどを統一的に保持できるってのは分かった。 で、boost::bindはなにやら拘束とかいうのをして2引数の関数を1引数の関数として扱える?のだとかなんとか・・・ >>5 でいうところの、 普通のグローバル関数g_funcへのポインタというかアドレスはg_funcで、 メンバ関数CFunc::funcのアドレスは&Cfunc::func? でもそれだけだとどのインスタンスのfuncかわからんから、 Cfunc cfっていうインスタンスの情報もどうにか渡す必要があるってのはわかる。 が、それらを拘束するっていうのの意味が分からない。拘束ってなんですか? リファレンスの日本語訳読んでも全然分からない・・・
15 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 17:46:30 ] ポインタうんぬん、インスタンスうんぬんという実装よりも、 まず概念を理解せんことにはな。 Haskellあたりで勉強してきたら?
16 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 18:06:02 ] >>14 STL の bind1st と bind2nd を調べてくればわかるんじゃない
17 名前:デフォルトの名無しさん [2007/09/27(木) 18:11:30 ] 例えば↓みたいな場合、gfunc2のiかjを なにかしら定数として固定して、引数が1変数の関数としてCFuncHolderのm_funcにしまえる? ってことですか? class CFuncHolder{ private: boost::function1<void, int> m_func; public: CFuncHolder(){}; void SetFunc(boost::function1<void, int> func){m_func = func;} void RunFunc(int i){m_func(i);} }; void gfunc1(int i){ printf("%d\n",i); } void gfunc2(int i, int j){ printf("%d\n", i+j); } void main(){ CFuncHolder fh; fh.SetFunc(gfunc); fh.RunFunc(1); }
18 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 18:12:54 ] >>14 拘束じゃなくて束縛だと思うが 関数型言語の束縛とも意味が違うので紛らわしい どっちかっつーと「部分適用」だわな
19 名前:17 [2007/09/27(木) 18:57:49 ] bindの最初の引数がメンバ関数へのポインタのとき、第二引数はインスタンスのアドレスを渡すのが そういう場合の決まった書き方ってことでとりあえず解決した。
20 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 19:52:13 ] _beginthread() でスレッドを生成し、そのスレッドが無限ループしている場合、 プログラム終了時にそのスレッドも終了してくれるのでしょうか?
21 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 20:03:00 ] はい
22 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 20:10:52 ] Σ(・ω・ノ)ノエッ
23 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 20:11:34 ] 終了しなかったら欠陥OSだろw
24 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 20:29:24 ] main() { char *buf = new char[1024]; } 上のコードでbufはプログラム終了時に解放されますってのと同レベルだな
25 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 20:54:17 ] んー・・・「終了される」と言われると違和感あるなぁ。 「破壊される」? まぁ言葉遊びか
26 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 12:04:40 ] よくclassではなくstructで表現されたものを見ますが 何か違いがあるのでしょうか? メリット、デメリットを教えてください
27 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 12:06:47 ] ( ゚д゚)ポカーン
28 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 12:10:26 ] classはデフォルトでprivate structはデフォルトでpublic class A : X { // <-- private 継承 int x; // <-- private メンバ }; struct B : Y { // <-- public 継承 int x; // <-- public メンバ }; それだけ
29 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 12:12:40 ] >>26 C++においては特に無いんじゃね? メンバ関数を持たずある用途のためにまとめた”変数のセット” って言う意味を強調したいときに 俺はあえてstructを使うけど。
30 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 12:35:52 ] >>28-29 ありがとうごさいました
31 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 14:16:18 ] >>11 >>19 boost::bind(&Cfunc::func, &cf, _1)は、 boost::bind(boost::mem_fn(&Cfunc::func), &cf, _1)相当。 mf = boost::mem_fn(&Cfunc::func)とすると、 mf(a, b)は、a.func(b)と同じ。 つまり、mem_fnはメンバ関数を通常の関数呼出の構文で 呼び出せるようにするアダプタと言える。 >>12 へ続く。
32 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 14:34:34 ] std::string str switch( str ) { case "あいうえお" funcA(); break; case "かきこくけこ" funcB(); break; (同様に続く・・・) } のように処理させたいけど文字列な為に出来ません この様な場合どういうやり方が一般的ですか? if文でゴリゴリ書くしかない?
33 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 15:12:10 ] 一般的じゃないかもしれないけどこういう手が楽っぽい #include <map> #include <string> #include <iostream> void funcA() { std::cout << "invoke func A\n" ; } void funcB() { std::cout << "invoke func B\n" ; } int main(void) { std::map< std::string, void(*)(void) > funcs ; funcs[ "あいうえお" ] = funcA ; funcs[ "かきこくけこ" ] = funcB ; std::string str = "あいうえお" ; void(*f)(void) = 0; f = funcs[str]; if ( !f ) // default: の処理 else f(); return 0; } 要は条件をキー、呼び出す関数を値にするmapだな 値をboost::functionへの参照とかにしてやれば、動的なオブジェクトのメソッドを呼び出すことも可能
34 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 15:40:21 ] >>33 ありがとうございました
35 名前:デフォルトの名無しさん [2007/09/28(金) 16:53:01 ] C++初学者です。 std::fstream等を使い、テキストファイルの中身をstd::stringのオブジェクトに格納したいと思います。 テキストファイルtext.txtはShift_JISで書かれ、空白や改行、マルチバイトの文字を含みます。サイズは不明です。 この改行などは、可能な限り保持するとします。 自分は、以下のようなコードを記述しました。 std::string str; std::ifstream ifs; ifs.open("text.txt",std::ios::in); if(!ifs.is_open()) return; //オープン失敗 while(!ifs.eof()) { std::string line; std::getline(ifs,line); str += line + "\n"; } 1.getlineや>>を使って、少しずつ読み込むという方法で良いのか分かりません。一括読み込みの方法はあるのでしょうか。 2.getlineを使う場合、一時的にlineを用意し、それからstrに格納する方法を採っています。何となく冗長な気もしますが、こんなもんなのでしょうか。 3.最後に改行コードを付加する時、+"\n" という書き方をしていますが、std::endlを使う方法、もしくはそれに似たような方法はあるのでしょうか。
36 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 17:00:48 ] ファイルの中身を全部読み取りたかったら、istreambuf_iterator使えばいい。 typedef std::istreambuf_iterator<char> isb_it; str.assign(isb_it(ifs), isb_it());
37 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 17:20:14 ] C++ってキモk
38 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 17:26:59 ] >>35 > 2. 大体皆そういうコードを書く > 3. stringstreamを使えばよい
39 名前:デフォルトの名無しさん [2007/09/28(金) 17:27:12 ] プログラムからMSXMLを使用してローカル(C:\.....\foo.xml)のXMLファイルを読み込みたいのですが どうもload関数で失敗してしまいます。 #import "msxml.dll" named_guids raw_interfaces_only using namespace MSXML; MSXML::IXMLDOMDocumentPtr pDoc; HRESULT hr = pDoc.CreateInstance(MSXML::CLSID_DOMDocument); pDoc->put_async(VARIANT_FALSE); VARIANT_BOOL f; hr = pDoc->load(_variant_t(L"C:\\Documents and Settings\\.........\\foo.xml"), &f); このXMLファイルのパスに実際Web上に存在するファイルを指定したらloadは正常にXMLを取得出来ました。(....../foo.xml ) ローカルにあるXMLファイルを読み込むには何か特殊な事をしなければいけないのでしょうか? 環境はWinXPでVisual Studio 2005 Pro Editionです。
40 名前:35 mailto:sage [2007/09/28(金) 17:32:10 ] >36>38 ありがとうございます、助かりました
41 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:05:32 ] >>35 2.についてだが、普通はこう書く。 std::string line; while (std::getline(ifs, line)) { : } しかし、>>35 のコードでは結局行読みすることに何の意味もないコードに なっている。 そもそもそういう場合はstd::getline()を使うべきではないだろう。
42 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:07:12 ] >>39 load()でローカルファイルを普通によめたと思うが。 MSXMLのバージョンにもよるのかも知れんが。 それとそのパスはなにやら胡散臭いな。 argvでも渡して、カレントのパスや相対パス、絶対パス、漢字を含むもの 含まないもの、色々実験汁。
43 名前:デフォルトの名無しさん [2007/09/28(金) 18:09:05 ] マジWindowsアプリとか詳しい奴尊敬するぜ あんな分かりにくいもん C++の難しさよりも ライブラリ覚えるだけで大変そう
44 名前:デフォルトの名無しさん [2007/09/28(金) 18:13:44 ] >>42 "C:\\foo.xml"で試してみましたが無理でした。 SetCurrentDirectory()でxmlのあるディレクトリに移動して相対パスでの指定も試してみました。 バージョンによる違いも一応調べてみます。
45 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:19:26 ] >>43 あんなに膨大にあるAPIを全部暗記してる奴はいないだろう 関数の名前覚えてたって、引数の並び順だの何だの覚えきれねえよ それに良く使いまわす処理は俺ライブラリ化するなりコピペするなり いちいち一から書かんだろ
46 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:19:58 ] file:// とかは?
47 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:22:42 ] >>43 今はほとんどどの世界に行っても、言語仕様よりライブラリ覚える方が大変だよ
48 名前:デフォルトの名無しさん [2007/09/28(金) 18:25:17 ] >>46 file://の書き方は file:///C:/foo.xmlであってるでしょうか?あまり詳しくないもので・・・。 フォルダのアドレスバーにfile://と入力して出てきたやつをそのまま使ってみました。 でも、やはりロードで失敗してしまいます。xmlファイル自体に問題があるか、MSXMLのバージョンの問題なのか・・・
49 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:26:47 ] >>48 ファイルに問題があるかどうか切り分けたければ、URL越しでロードできた ファイルをローカルに落として試せばいいだろ。
50 名前:デフォルトの名無しさん [2007/09/28(金) 18:33:30 ] >>49 Webからxmlファイル落としてローカルで試したところloadすることが出来ました。 どうやら自分のxmlファイルに問題があったようです。 xmlファイルの中身を見比べてみて原因を探ってみます。
51 名前:デフォルトの名無しさん [2007/09/28(金) 18:33:49 ] >>47 オープン系はそうですね 組み込みはそうでもなくて、純粋にC++に集中できそう
52 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:34:53 ] IXMLDOMDocument::loadは、IStreamなんぞも受け付けるらしいから、 SHCreateStreamOnFileでも使ってストリーム化したらどうだろう?
53 名前:デフォルトの名無しさん [2007/09/28(金) 18:35:42 ] どうやら文字コードが原因だったみたいです。 自作のxmlはShift_JISで、正常に読み込める方のxmlはUTF-8で保存されたものでした。 なんでShift_JISでダメなのかはよく分かりませんが、とりあえずUTF-8で書くことでやっていきたいと思います。 ありがとうございました。
54 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:38:16 ] XML宣言でエンコーディングを指定すれば、 Shift_JISは受け付けてくれると思う、MSXMLなら。
55 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:39:41 ] >>53 既にC/C++の話題でも何でもないが XMLファイルで↓のようにちゃんとエンコーディングは指定してるか? <?xml version="1.0" encoding="Shift_JIS"?>
56 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:42:11 ] 環境依存とかマジわかんねえ XMLなんて言葉しか知らん
57 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 18:50:03 ] >>53 HRESULTの判定をしてないのがいかんのだな。 その辺が出来ないなら raw_interfaces_onlyは使うなよ。
58 名前:デフォルトの名無しさん [2007/09/28(金) 19:17:04 ] >>54-55 対象のXMLファイルにはちゃんと <?xml version="1.0" encoding="Shitf_JIS" ?> と先頭に記述はしていました。ますます分からないですけど、 もしかしたら俺の環境がどこか特殊なのかもしれないので(または全然関係ないところのエラー)、 あまり悩まれない方がいいかもしれませんw
59 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 19:43:41 ] >>58 MSXMLがちゃんとエラーメッセージが返してるからそれみりゃわかるって。 エラーメッセージの取り出し方わかってる?
60 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 19:50:46 ] >>58 Shitf_JIS しとふ・じす
61 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 20:01:36 ] >>60 天才じゃね?
62 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 20:27:36 ] 爆弾クラスのデストラクタに壁を壊す処理を入れてるんですが こういう使い方は良くないと聞きました どうしてですか? だとしたら自分を壊して壁を壊すような処理はどこに書けばいいんですか? よくわからなくなったので教えて下さい
63 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 21:07:08 ] >>62 通報しますた
64 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 21:26:46 ] いやいやいや ゲームのアイテムの話ですよ?
65 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 21:44:40 ] >>62 理由:クラスの柔軟性が損なわれる 「インスタンスの破壊時に必ず呼ばれる」 →爆発させずに爆弾を消去するときも破壊判定させる気? 「デストラクタは引数とれない」 →わざわざ破壊対象の壁の情報を他のクラスに問い合わせるわけ? それなら自分が爆発(explodeメソッド)するって情報だけ他のクラスに送って それ以外の処理は他に任せるようにした方が責任の所在が明確になって まだ良い設計になると思わない? 俺が思いつくのはとりあえずこんな所
66 名前:682 mailto:sage [2007/09/29(土) 00:47:46 ] 001.ppm 002.ppm ・ ・ xyz.ppm という内容のファイルリストからgetlineで画像名を読み込み、 それぞれの画像のカラーヒストグラムを書き出していくという プログラムを作成しています。 一度に処理する画像枚数が約200枚までならば正常に動作するのですが、 一度に処理する画像が300枚前後になると、OSが急に固まりコンソールに 強制終了と表示されて、プログラムが終了してしまいます。 以下、メインのソースの一部 ifstream filelist While(!filelist.getline(filename, sizeof(filename)).eof()) { Image24 test_image; ここらへんで様々な処理 } この例の場合、ループでtest_imageが宣言される度に デストラクタは呼び出されるのでしょうか?(デストラクタでメモリを解放する処理は書いてます) 長文ですがよろしくお願いします。
67 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 00:54:53 ] >>66 デストラクタは呼ばれます。 実験してみりゃ一発なのに・・・
68 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 01:18:09 ] >>66 とりあえずアップしてるソースの範囲は問題なし。 デストラクタの開放処理に漏れや誤りがあるか、 「ここらへんで様々な処理」 に問題があると思う。 LoadImageしてDeleteObjectしてないとか、LD_SHAREDしてるとか。
69 名前:66 mailto:sage [2007/09/29(土) 01:54:27 ] >>67 , >>68 ありがとうございます。 メモリ周りの処理をもう一度徹底的に見直してみます。
70 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 02:26:26 ] int型を文字列の型に変換する関数ってありますか?
71 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 02:33:56 ] Cならsprintf, snprintf C++なら(関数ではないが)std::ostringstream. boost::lexical_cast
72 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 02:41:40 ] ありがとうございます
73 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 20:18:04 ] class string_ex : public std::string { funcA(); funcB(); } のようにstd::stringを拡張してstd::stringの機能をそのままに 文字列操作を行う関数を新たに追加したクラスを作りました string_ex ex; std::string str; ex = str; という操作を期待したのですがコンパイルエラーが出てしまいます 何か良い方法はありませんか?
74 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 20:51:03 ] 代入演算がないだけでは?
75 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 20:55:57 ] 確かstd::stringは継承される事を前提に作られてないはず やめといた方がいいんじゃね デストラクタも仮想じゃないし
76 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:06:33 ] >>74-75 ありがとうございます そうですか、スッキリして良いと思ったのですが残念です
77 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:08:52 ] コンストラクタがないからstd::stringからstring_exに変換できない。 ただし、>>75 の指摘通り使用に際しては注意が必要。
78 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:14:51 ] コピー代入演算子とコピーコンストラクタが無いのが原因だな #include <string> struct A : public std::string { A(){} A(const A&){} A& operator=(const A&) { return *this; } A& operator=(const std::string&) { return *this; } }; int main() { A a; std::string b; a = b; } とりあえずこんな感じでそれらを用意してやれば通る、けどやっちゃいけないよこんな事 basic_stringのカオスさ加減をどうにかしたい気持はわからんでもないけど
79 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:32:11 ] どうやらstd::stringを弄るのは禁じ手のようですね 無理にメンバ関数にしないでフリーの文字操作関数にします いろいろとありがとうございました
80 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:57:56 ] 俺も同じことやってる。 コンストラクタ、代入演算子、あたりを全部作らないといけない上に、const / 非constの制御がかなり面倒。 でもやりたいよね…。ヘルパー作ってばっかだと、なんのためのオブジェクト指向か分からないし。
81 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 22:21:44 ] >>73 仮想デストラクタを持たないstringやコンテナなどから 派生クラスを作る誘惑に負けるな by スコット・メイヤーズ
82 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:03:16 ] #include <stdio.h> main() { int i; int b; int c; int d; printf("最初の数字を入れてください(半角)=>"); scanf("%d", &i); printf("なに算をするか入れてください( / * - + )=>"); scanf("%s", &b); if(b = /){ printf("割る数を入れてください=>"); scanf("%s", &c); d = i / c; }else if(b = *){ printf("賭ける数を入れてください=>"); scanf("%s", &c); d = i * c; }else if(b = +){ printf("足す数を入れてください=>"); scanf("%s", &c); d = i + c;}else{ printf("引く数を入れてください=>"); scanf("%s", &c); d = i - c;} printf("%d\n",d);} これでものすごい勢いでコンパイラエラー吐かれます>< 初心者といううか見様見真似でつくったのでどこがだめかエラー見ただけじゃわからない のでどこがおかしか教えてくださるとうれしいです
83 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:06:56 ] 何算するかというところで、 +-/*という数値でないものを入力しようと言うのに intという数値を扱う型で読み込もうとしているのがいけない。 bはchar型にし、%cで読み込めばいい。 そして、if (b == '/') {のようにする。
84 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:08:30 ] >>83 intは数値だったんですか; いろいろがんばってみます
85 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:11:39 ] intはintegerの略。
86 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:06:21 ] >>82 ・コンパイルエラーがたくさん出ても焦るな。先頭の1つから順に消していけばいい。 ・見よう見まねで作ったならエラー出て当然。まずはもう少し自分で理解する努力をしてから人に聞け。 ・人に聞くなら、どんなエラーが出たのかぐらいは書くべき。
87 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:43:22 ] >84まず入門書か入門サイト嫁www
88 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 11:42:09 ] _typeof, __typeof みたいに前にアンダーバーを1つ2つ付けるのは 予約キーワードと衝突するおそれがあるので避けるべきらしいですが、 typeof_, typeof__ みたいに後ろに付けるならおkでしょうか?
89 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 12:23:07 ] アンダースコアが2個続くのは先頭でも途中でも最後でもだめ
90 名前:デフォルトの名無しさん [2007/09/30(日) 12:49:51 ] template<typenamt t, typename sig> class test; template<typenamt t, typename result, typename arg> class test<t, result (t::*)(arg)>{ result r; };//resultがvoidだとエラーになるので template<typenamt t, typename arg> class test<t, void (t::*)(arg)>{};//特殊化したい んですが、コンパイラからは「特殊化できない」とエラーになります。 引数の数が被ってるのがダメなのかと思い、 template<typenamt t, typename sig, typename dammy1, typename dammy2> class test; template<typenamt t, typename result, typename arg> class test<t, result (t::*)(arg), void, void>{ result r; }; template<typenamt t, typename arg> class test<t, void (t::*)(arg), void, void>{}; としてもやはりダメでした。
91 名前:(90) mailto:sage [2007/09/30(日) 12:50:52 ] ちなみに上下共に同じエラーで弾かれます。
92 名前:(90) mailto:sage [2007/09/30(日) 13:03:41 ] 後者にしたうえで、 template<typenamt t, typename arg> class test<t, void (t::*)(arg), void, void>{}; を template<typenamt t, typename arg> class test<t, void, arg>{}; としtemplate<typenamt t, typename result, typename arg> class testの特殊化を狙っても 「テンプレート引数の数が少なすぎます」とダメでした。
93 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:04:35 ] ちょっと質問。 ヘッダをインクルードする時、ファイル名だけ指定してインクルードパスで検索する方法と、 インクルードパスを限定して、相対パスでファイルを指定する方法とではどちらが一般的でしょうか? ヘッダが100近いフォルダに散在していると前者と後者のどちらを適用すべきか判断がつきません。 他のプロジェクトで類似するケースではどのようにしているのか聞いてみたいんですが。 ちなみにヘッダファイルの移動はないことを前提としています。
94 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:04:48 ] int main(){ (処理) return 0; } 何で0を返すんですか? 1ではダメなのですか?
95 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:20:19 ] >>94 いいよ〜 終了コードの使い方は処理系依存だけど、一般的には 0が正常終了、エラーや警告があれば1以上の数字を返すのが慣例。
96 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:25:37 ] >>90 gcc 3.4.4 だと通った。 詳しいことは解らんけど、それだけ報告。 #include <stdio.h> template<typename t, typename sig> class test { public: static void foo(){ printf("foo\n"); } }; template<typename t, typename arg> class test<t, void (t::*)(arg)> { public: static void foo() { printf("bar\n"); } }; class X{}; int main() { test<int,int>::foo(); test<X, void(X::*)(int)>::foo(); }
97 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:48:55 ] >>93 適材適所。 そのたくさんのディレクトリが相互に無関係ならそれぞれパス指定するしかないと思う。 そうではなく、ある程度共通のディレクトリの中に分散しているのなら、共通部をパス指定して 残りはファイル名で記述すればいいだろう。 例えば、こんな感じ。 -- /home/who/someProject/include/catA/inc1.h /home/who/someProject/include/catA/inc2.h /home/who/someProject/include/catA/inc3.h /home/who/someProject/include/catB/inc4.h /home/who/someProject/include/catC/inc5.h こんなインクルードファイルがあるなら、 #include "catA/inc1.h" #include "catA/inc2.h" #include "catA/inc3.h" #include "catB/inc4.h" #include "catC/inc5.h" と記述してパス指定に$HOME/someProject/includeを追加。
98 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:07:02 ] >>90 コンパイラは何を使っている。 また、そもそも何をしたい?それ次第では別の手段があるかもしれない。
99 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:16:00 ] >>90 #include <stdio.h> #include <boost/type_traits.hpp> class test1 { public: static void foo() {printf("test1\n"); } }; template<typename t, typename result, typename arg> class test2 { public: static void foo() {printf("test2\n"); } }; template<typename t, typename arg> class test3 { public: static void foo() {printf("test3\n"); } }; namespace detail { template<typename t, typename sig> struct selector { typedef test1 type; }; template<typename t, typename result, typename arg> struct selector<t, result (t::*)(arg)> { typedef typename boost::mpl::if_<boost::is_void<result>, test3<t,arg>, test2<t,result,arg> >::type type; }; } int main(int argc, char *argv[]) { detail::selector<test1,void>::type::foo(); detail::selector<test1,int(test1::*)(int)>::type::foo(); detail::selector<test1,void(test1::*)(int)>::type::foo(); return 0; }
100 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:18:29 ] そもそも>>90 のresult r;って、 コンパイラさえ問題なく、しかもrがvoid型なら、 <t, void (t::*)(arg)>なんて特殊化は 不要だと思ったのだが違うのか?
101 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:20:32 ] >>93 インクルードパスにはあまりごちゃごちゃ含ませないことが望ましい。 インクルードパスに含まれるヘッダの名前は実質システムグローバルだからな。 行儀のいいやりかたは、>>97 のように、インクルードパス直下にヘッダを 置かず、モジュールだのライブラリだの用のディレクトリを掘り、その下に ヘッダを入れることだ。 そうすることで、汚染する名前をディレクトリ名だけに限定でき、 名前の衝突を回避しやすくなる。 勿論、これにはインクルードパスの下をあまりとっちらからせずに、整理整頓できる というメリットもある。
102 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:28:50 ] boostみたいに実装詳細のヘッダをhoge/datail に入れておくと 外部公開するヘッダとプライベートなヘッダを分けられてうれしい
103 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:32:36 ] svnのboost::function_typesなら関数の型から、戻り値や引数を取りだせるから それとenable_ifで特殊化してやる方法もある #include <iostream> #include <boost/function_types/result_type.hpp> #include <boost/type_traits.hpp> #include <boost/typeof/typeof.hpp> #include <boost/utility.hpp> void func_v() {} int func() { return 0; } template < typename sig , class Enable = void > struct C { void f() { std::cout << "func\n"; } }; template <typename sig> struct C< sig , typename boost::enable_if< typename boost::is_same< typename boost::function_types::result_type<sig>::type , void>::type>::type > { void f() { std::cout << "void func\n";} }; int main() { C< BOOST_TYPEOF(func_v) >().f(); C< BOOST_TYPEOF(func) >().f(); }
104 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:34:33 ] うへ 仕事では出会いたくないタイプのコードだな…… だからC++は(ry
105 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:34:45 ] boost厨多過ぎ
106 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:39:40 ] boostは順調に使えてる時点ではいいんだけど、 バグったりするともうお手上げ
107 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:45:56 ] そのバグを自力で直して公式に反映できたり、 そこから新しい使い方を発見できる程になりたひ
108 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:23:09 ] >>97 >>101 レスありがとうございます。 自分も正直ごちゃごちゃしたインクルードパスを書くよりは プロジェクトのルートパスを一つ指定するような書き方が望ましいと思っているので、 その方向で調整して行きたいと思います。 ただ、好みの問題程度にあしらわれないか不安ではありますが。
109 名前:(90) mailto:sage [2007/09/30(日) 17:29:01 ] 使っているコンパイラはvisual C++ 2005です。 メンバ関数を特殊化で返り値、クラス、引数をそれぞれ特殊化した後に 内部に作っておいたクラスを使い間接的に返り値を特殊化したらコンパイルが可能になり解決しました。
110 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:40:52 ] オーバーロードについて質問 int Func(int a=NULL); string Func(string a=""); こんな感じで引数が無い場合に戻り値の型によって 関数がオーバーロードされるのを期待してみましたが コンパイルエラーが出てしまいました このような場合関数名を変えるしか無いのでしょうか?
111 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:45:01 ] >>110 戻り値の型でオーバーロードはできません。 ポインタじゃないものに NULL を使っちゃだめです。
112 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:54:37 ] >>111 ありがとうございます
113 名前:94 mailto:sage [2007/09/30(日) 18:43:55 ] >>95 ありがとうございました。
114 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:02:40 ] int x = 4896; int y = 1406; double z = y/x; でzが0になってしまうのですが、 これを0.28.... とやるにはどうすれば良いのでしょうか?
115 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:04:23 ] z = (double)y / x;
116 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:47:24 ] わぁ、ありがとうございます。 ところで、double>intなのに なんで代入変換されないのでしょうか?
117 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:51:35 ] z=y/xという式は、まずy/xが実行される。 int/intなので結果はint、この時点で結果が0になる。 int型の0をdouble型に代入しても当然0になる。 (double)y/xとすることで、yがdoubleになりこの式の結果もdoubleになる。
118 名前:デフォルトの名無しさん [2007/10/01(月) 02:51:59 ] int同士の/演算はint -> int -> intだから、代入する時点ですでに(intの)0なんだよ。 それをdoubleに変換したところで、0.0になるだけさ。
119 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:55:02 ] なるほど、ありがとうございました!
120 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 03:47:41 ] 演算子の優先順位って奴だな = よりも / の方が優先順位が高い
121 名前:デフォルトの名無しさん [2007/10/01(月) 03:54:49 ] =の優先度がたかかったら使いにくくてしょーがねー。 (z=y)/x は欲しい結果じゃないだろ?除算結果捨ててるしなw
122 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:09:57 ] メンバ変数をpublicメンバにして公開せずに入出力関数を用意すべきと言いますが その際に入力用と出力用と2種類作った方が良いのでしょうか? class Choge { private: std::string memo_; public: std::string memo(const std::string& data = "") { return (data.empty() ? memo_ : memo_ = data); } } 上のように入出力をまとめちゃった方がスッキリしそうな気がするのですが 少しトリッキーなようで、こんな事をしても良いのか迷ってます
123 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:12:09 ] >>122 そのメンバを空にしたいときにはどうするんだ? そんな癖のある仕様にするくらいなら、別々に作った方がいいことは自明だ。
124 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:25:17 ] >>122 そもそも、メンバを参照するだけのmemo()がconstメンバ関数じゃないから使い難い。 設定用に非constメンバ関数、取得用にconstメンバ関数を用意するなら、最初から別々に作ればいい。 # 例えば、void func(Choge const & hoge)なんて関数からhoge.memo()を呼べないのは面倒だぞ。
125 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:54:48 ] >>123-124 なるほど。 やっぱり別々にすべきですね。 ありがとうございました。
126 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 07:37:48 ] ff5a_analyzer_src.zip (53 KiB) ff5a_analyzer のソースコードです。まだ未完成です。文字コードは EUC-JP、改行コードは LR となっています。 とあるのですが ttp://x11.s11.xrea.com/ff5a_analyzer_src.zip このソースのコンパイルの仕方はどうやるのでしょうか OSはXPです
127 名前:デフォルトの名無しさん [2007/10/02(火) 07:38:20 ] はじめまして、すいませんが質問させてください。 Linux(Turnolinux Fuji)でsys/systeminfo.hを includeしてSI_HOSTNAMEを使用したい< sysinfo(SI_HOSTNAME〜を対処したい >のですが、 コンパイル時にsys/systeminfo.hがないとエラーが出力されてしまいます。 どうすればよいのでしょうか?ご教授ください。
128 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 07:44:19 ] 探す。includeする。
129 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 07:44:46 ] >>126 ちゃんとmakefileまでついてるじゃないか gccみたいだけど別にほかのコンパイラでも大丈夫だろ
130 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 07:46:26 ] >>126 cygwinを入れて、makeではどうでしょう。 >>127 systeminfo.hを探してみたらどうでしょう。
131 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 08:12:04 ] >>129 >>130 ありがとうございます がんばってみます
132 名前:デフォルトの名無しさん [2007/10/02(火) 12:48:32 ] 質問です。 INT_MIN〜INT_MAXの範囲を超える整数の計算をしたいんですけど どうしたらよいのでしょうか?
133 名前:デフォルトの名無しさん [2007/10/02(火) 13:02:56 ] >>132 search.vector.co.jp/search?query=%91%BD%94%7B%92%B7+%83%89%83C%83u%83%89%83%8A&x=14&y=14
134 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 13:03:45 ] >>132 intよりも大きい値を扱える型を使いなさい。
135 名前:デフォルトの名無しさん [2007/10/02(火) 13:34:03 ] ありがとうございます >>133 多倍長っていうんですね。 ググってみます。なるべく自作したいので。 >>134 ちょっと思いつかないんですが、例えばどんな型がありますか? 符号付の値が扱えるのがいいです。 こちらの環境はVC6です。
136 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 13:41:24 ] >INT_MIN〜INT_MAXの範囲を超える整数の計算をしたいんですけど 大きく超えないのなら vc6 なら __int64 が使えないこともない。 (なんか加算でバグった経験あって個人的には嫌だけど)
137 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 13:43:20 ] >>135 C99ならlong longも使えるし、そうでなくてもint64_tなどの型があるかもしれない。 それに、doubleでもlong doubleでもいいかもしれない。 要は、INT_MAXを超えると言われても大きさも必要精度も判らなければなんともしようがない。
138 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 15:38:16 ] >>135 Windowsだと__int64 / unsigned __int64
139 名前:132 mailto:sage [2007/10/02(火) 16:13:46 ] >>136 そういえばそんなものがありましたね。試してみます。どうもです。 (バグってどんなバグだろう) >>137 VC6なのでC99なんて対応してません。 精度は64ビットも要らないけど32ビットじゃ足りません。 __int64で試してみます。
140 名前:132 mailto:sage [2007/10/02(火) 16:14:33 ] >>138 もありがとう
141 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 16:23:33 ] >>139 32<必要ビット数<64なら、doubleが丁度手頃じゃないか。 非標準の型を使わなくて済むし。
142 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 16:31:10 ] hoge.h hoge.cpp とわざわざ2つのファイルに分けるのはどうしてですか? 後でヘッダファイル見て理解しやすいようにしてるだけ? ヘッダに実装部も含めてclassを記述しちゃった方が楽だと思うのですが
143 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 16:34:35 ] そう思うのなら、そうすればよろしいでしょう。 実際私も、クラスの実装はインクルードファイルに書くことが多くなっています。
144 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 16:46:54 ] >>143 何か問題はないのでしょうか?
145 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 16:58:17 ] >142に提示された条件だけでは問題があるともないともいえません。
146 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:03:12 ] ヘッダに実装コードを書くのはおかしい
147 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:05:19 ] 単にprivateなメンバ変数の値返すだけとかならヘッダに書いちゃう。
148 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:12:10 ] >>144 やってみて問題なければいいんじゃない
149 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:13:53 ] 全てを宣言内に書いてしまうというのは、分割コンパイルの利点の放棄に等しい。 まぁマシン速くなったから、それもいいんじゃない?
150 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:17:49 ] >>145-149 ありがとうございます >分割コンパイル そういう意味もあるんですね
151 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:18:11 ] >>147 そうゆうのはインライン何とかの範囲だからいいと思う
152 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:22:43 ] インラインは早いけどたくさん使うと実行ファイルが大きくなるみたい
153 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:26:40 ] どうせ今のコンパイラはオブジェクト間最適化で無理矢理インライン展開したりもするんだから、気にするほどのことじゃないだろ。 ついでに言えば、テンプレートクラスだとどうせ実装はインクルードファイルに書かないといけなくなるわけで。
154 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:38:32 ] switch - case と do - while について質問 下記のコードで処理がどのような順番で行われるのか教えてください。 よろしくお願いします。 int width = 15; int n = (width + 3) / 4; switch(width & 0x03) { case 0: do { *buffer++ = 0 case 3: *buffer++ = 0; case 2: *buffer++ = 0; case 1: *buffer++ = 0; } while(--n > 0); }
155 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:42:26 ] >>154 ざっくり言うと、widthを4で割った回数だけループする作りになっている。 実際には、4で割った余りも処理しないといけないのでその分を最初の switchからのcaseへの飛び込みで賄っている。 つまり、その例では15でスタートするから初回はcase 3に飛び込むわけだ。
156 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:45:00 ] 各行にprintfでも挟んでみれば?
157 名前:154 mailto:sage [2007/10/02(火) 18:51:37 ] >> 155 どうもありがとうございます。 初回に case 3 に飛び込むのは理解しました。 2回目以降はどうして case 0 〜 case 1 まですべての処理を通るのでしょうか。 すいませんが、もう少し詳しく解説してください。 >> 156 printf を挟んで動作は確認しました。 ただ、どうして >> 155 さんのような挙動になるのか理解できません。
158 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:54:16 ] 最初に switch でどれかの case ラベルに飛んだ後、 while で条件が偽だった場合 do に戻る
159 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:57:26 ] もしかして、break が無いとそのまま次の case が実行されるってことを知らない?
160 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:58:11 ] ちなみにこれはDuff's deviceという名で有名。
161 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:02:16 ] まあただの興味で聞いてるだけだと思うが一応 caseの後には必ずbreak付けろ 使わなくてもdefaultは書け caseはswitchスコープの直下に置け、ループの途中に挟むなんて言語道断 以上
162 名前:155 mailto:sage [2007/10/02(火) 19:08:41 ] >>154 ヒントを一つ。caseラベルはswitch以外からは只のラベルにしか見えない。 つまり、switchから飛び込んだ後は存在しないも同然。 各caseラベルを渡り歩く理由については>159にも書かれている通り、breakしないとスルーするわけだ。
163 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:12:30 ] アルゴリズムの質問なんですが カオリ、165cm、24歳、年収500万 サキ、150cm、21歳、年収1000万 タカシ、180cm、18歳、年収200万 グレイ、100cm、120歳、年収0etc というデータがあってa*身長+b*年齢+c*年収の値が一番大きい順にソートしたとき 最もあいうえお順に近い並び方になるa,b,cの値を探すプログラムを書きたいのだが 如何組めばいいか見当がつきません。 教えてください。
164 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:15:26 ] 全通りの並べ方試してみてそれぞれあいうえお順に近いかどうか調べりゃいいじゃん ところであいうえお順に対する近さって何?
165 名前:154 mailto:sage [2007/10/02(火) 19:20:26 ] >>159 それは理解してます。 >>160 ありがとう。色々調べてほぼ理解できました。 >>161 自分で書く場合はそうしています。 なので、逆に今回のコードが理解できませんでした。 >>162 最初の case 0: do { ...; case 1: ... の時点で理解不能でした。 switchが単なるcaseラベルへのジャンプだと理解すれば それ以降は do{ } while() だけに注目すればよく、その中ではcaseラベルに意味はないのですね。
166 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:21:51 ] あうかえお ○××○○ 3/5=60% という感じでこの値を100に近づけたいんです。 パラメータの全通りとはどのような感じですか?
167 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:22:07 ] さらにgotoを加えて混乱させればいいのに…
168 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:23:45 ] >>166 なんで「う」が×なんだ?
169 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:24:51 ] >>163 Nx3行列A 165 24 500 150 21 1000 180 18 200 100 120 0 3x1行列B a b c Nx1行列C 6 ← 50音順で何番目か 11 16 8 とするとき A・B=C を満たす行列Bを決定すればよい このとき行列Aの逆行列をPとするとき(上付き文字が使えないので^^;) 両辺に左からPを掛けると P・A・B=P・C B=P・C となり求めることが出来る 逆行列の求め方は本(Numerical Recepies in C/C++ みたいなやつ)に 書いてあるのでそれを見ればおk
170 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:27:48 ] >>161 ja.wikipedia.org/wiki/Duff 's_device 嫁
171 名前:163 mailto:sage [2007/10/02(火) 19:28:46 ] >>168 本来その位置は「い」だからです。 >>169 どうもありがとうございました。 さっそくやってみます。
172 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:34:26 ] 本来って何だ 「あ」「う」「か」「え」「お」のソートに何で「い」が出てくるんだ? じゃあデータが「さ」「し」「す」「せ」「そ」ならこうなるのか? さ し す せ そ ×(本来あ) ×(本来い) ×(本来う) ×(本来え) ×(本来お) 0% 変なの
173 名前:168 mailto:sage [2007/10/02(火) 19:35:26 ] >>172 は俺じゃないぞw 俺はもう諦めた
174 名前:172 mailto:sage [2007/10/02(火) 19:37:07 ] いや、168を騙るつもりはないが なんか致命的な勘違いをしてる予感がしたから聞いてみたんだがもう見てないかな
175 名前:169 mailto:sage [2007/10/02(火) 19:38:07 ] >>171 >>169 をちょっと訂正 要素数Nが4以上の時は Nx4行列A (4列目の要素は常に1) 165 24 500 1 150 21 1000 1 180 18 200 1 100 120 0 1 4x1行列B a b c d にしないといけない
176 名前:163 mailto:sage [2007/10/02(火) 20:36:22 ] >>169 追加どうもです。 例が悪かったですね。 あうかえおいきくけこさしすせそ以下順番どおりだとすると 47/50=94%となります。
177 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 21:18:47 ] 例が悪いというか、希望する順列との差異を表したいわけでしょ? そこで「あいうえお」を例にするから悪いわけじゃね? 普通の人が聞けば「あ」はあるかも知れんが「い」はないかもしれないと思う。
178 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 21:51:19 ] てことは「んあいうえおかきくけこ…を」だったら0%なわけね そういう定義ならそれでいいけど目的としてはそれで大丈夫なの?
179 名前:163 mailto:sage [2007/10/02(火) 22:10:54 ] すみませんでした。 >>177 仰るとおりです。 >>178 大丈夫です。
180 名前:デフォルトの名無しさん [2007/10/02(火) 22:21:34 ] C++でnewで生成した配列の要素数って求められないんでしょうか? char* a = new char[5]; char b[5]; sizeof(a) は4(ポインタのサイズ) sizeof(b)は5になるのですが... お願いします
181 名前:デフォルトの名無しさん [2007/10/02(火) 22:23:10 ] >>163 って、結果が必ず50音順になるわけじゃ無いよな。 効率よくやるのは結構ムズい気がする。 あいうえお順に近い並び方から順に、解があるかどうかを 1つずつ調べていくプログラムが作るの楽なんじゃないかなぁ。
182 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:30:25 ] >>180 char a[] = new char[5]; にすればおk
183 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:32:27 ] コンテナ使えやヴォケェ
184 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:33:54 ] スマソ >>182 じゃ無理かも C++ならvectorでもつかっておけば? 風邪なのに2chやってると判断力が鈍るな
185 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:43:23 ] コンテナなんてクソ
186 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:48:35 ] int hoge = 5; char* a = new char[hoge]; でhoge見りゃいいじゃん
187 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:55:21 ] 要素数とポインタをタプルにしよう☆
188 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:57:40 ] サイズは定数で無いと受け付けないから
189 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:59:25 ] じゃあboost::arrayもしくはそれに似たものを自作すればおk
190 名前:182 [2007/10/02(火) 23:05:56 ] レスありがとうございました. Vector使います. もひとつ関連質問ですが、Cで関数に配列渡す場合同じことが起きるんですが 関数内で渡された配列の要素数が必要な場合、要素数も別に渡さないと いけないということですか? void hoge(char a[], int numOfFactor)みたいに
191 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 23:10:34 ] もちろんそうよ ループの終了条件にしか使わないなら番兵置く手もあるけど
192 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 23:11:13 ] >>190 そうだよ。静的な配列ならsizeofで要素数を取得できるけど、そうでない場合は別に値を管理する必要がある
193 名前:190 [2007/10/02(火) 23:14:31 ] 了解しました。重ね重ねありがとうございました。 要素はfactorじゃなくてelementでした。おまいらサンクス!!
194 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 23:23:50 ] どっちかと言うと、C++では先頭及び最後の1つ後を指すイテレータ という2つの引数を取るほうが一般的だと思う。 template<typename Iterator> void hoge(Iterator first, Iterator last); 要素数はポインタ的にfirst - lastと言いたいとこだが、 std::distance(first, last)で求める。 もうちょっと先進的なのが好みならBoost.Range。 template<typename Range> void hoge(Range& r); boost::size(r)で要素数が求まる。 boost::begin(r), boost::end(r)でイテレータ取得。 vectorその他コンテナ一般や配列などを引数に渡せる。
195 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 02:17:51 ] DWORD dwSize = GetFileSize(...); LPBYTE lpBuffer = (LPBYTE)malloc(dwSize)); これをNewを使って書き換えるとするとどんな風になりますか?
196 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 02:37:03 ] Happy New Year
197 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 04:24:39 ] んー。 std::vector<BYTE> buffer(GetFileSize(...));
198 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 06:57:09 ] DWORD New = GetFileSize(...); LPBYTE lpBuffer = (LPBYTE)malloc(New));
199 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 08:33:47 ] DWORD dwSize = GetFileSize(...); //1 LPBYTE lpBuffer = new BYTE[(dwSize + sizeof(BYTE) - 1) / sizeof(BYTE)]; //2 LPBYTE lpBuffer = (LPBYTE)new char[dwSize] //3 LPBYTE lpBuffer = new BYTE[dwSize]
200 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 09:03:51 ] //4 LPBYTE lpBuffer = new(nothrow) BYTE[dwSize]; malloc差し替えなら挙動が同じ(bad_alloc投げずにNULL返す)new(nothrow)最強
201 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 09:39:48 ] んなコードは窓から投げ捨ててFileMapping使え
202 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 11:11:39 ] WindowsServer2003x64上で、64ビットプロセスと32ビットプロセスのメモリ共有を行いたいと思っています。 調べてみるとメモリマップドファイルがあるのですが、これで実現可能でしょうか?単純な方法がありましたら教えていただきたいです。 また、64ビットプロセスでメモリ確保したものを32ビットプロセスでデータ参照するにはどうすればいいでしょうか?
203 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 13:30:07 ] >>202 可能。メモリマップドファイル経由。
204 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 14:54:08 ] 独学で勉強中です。 ClassA a; ClassA b = a; ClassA c(a); とした場合 bはメンバ変数が初期化され、 cは未初期化状態になります。 これは言語仕様でしょうか?環境依存でしょうか? WinXP + Cygwin + gcc3.4.4
205 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 15:03:23 ] やってみたが #include <iostream> class ClassA { public: int x; }; int main() { ClassA a; a.x = 42; ClassA b = a; ClassA c(a); std::cout << b.x << std::endl; std::cout << c.x << std::endl; } 実行結果 42 42 どのへんが未初期化?
206 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 16:08:56 ] >>205 >ClassA c(a) これは、どういうことをしてるの?
207 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 16:13:35 ] コピーコンストラクタによる初期化
208 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 16:19:21 ] >>207 コピーコンストラクタってどこに宣言・定義されてるの? #include <iostream> <----ここの中?
209 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 16:22:39 ] >>208 >コピーコンストラクタってどこに宣言・定義されてるの? あなたの心の中。 冗談さておき、特に自前で宣言しなかった場合は暗黙のコピーコンストラクタが用意される。 # なーに、メンバを全部(浅い)コピーに出すだけさ。
210 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 16:28:28 ] >>209 >暗黙のコピーコンストラクタ ってこうしなさいとC++の仕様で決まってるんの?
211 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 16:55:28 ] そう。
212 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 17:46:41 ] 浅いコピーっていうのは、単なるビットコピーってこと?
213 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 17:49:46 ] 浅いコピーなんだから深く考えちゃだめ
214 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 17:50:38 ] そのメンバがコピーコンストラクタを持っていればそれを使うが、ない場合はそういうことになる。
215 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 19:47:41 ] >>205 すみません、説明不足でした。 > ClassA a; > a.x = 42; > ClassA b = a; > ClassA c(a); の > a.x = 42; を取ると 0 17〜〜〜(-1のunsinged表記?) のように表示されてます。 両方ともコピーコンストラクタによりインスタンスが生成されていますが 結果が異なっていたため気になった次第です。
216 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 19:56:40 ] そもそも元のメンバ変数を初期化していない時点で まともな動作を期待するなよ
217 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 20:14:24 ] >>216 的確ワロスw
218 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 20:52:49 ] int x; printf("%d\n", x);
219 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:09:32 ] >>216 int x; int y; x = y; この場合, x, yは異なる可能性があるの?
220 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:19:33 ] >>219 マジで?
221 名前:デフォルトの名無しさん [2007/10/03(水) 21:20:08 ] C++で使用対象のクラスが参照カウンタを実装している可能性があるので ZeroMemoryなどでデータを初期化するのはご法度 と何処かで目にしか記憶があるのですが、同様の理由で構造体に対しても ZeroMemoryを使うことはあまり好ましくないのでしょうか? C言語では常套手段だったので。
222 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:24:57 ] #include <tr1/memory.hpp> #include <cassert> struct Base { virtual char f(void) =0; }; struct A : public Base { char f(void) { return 'A'; } }; struct B : public Base { char f(void) { return 'B'; } }; int main() { std::tr1::shared_ptr<Base> p; p.reset(new A); assert( p->f() == 'A' ); p.reset(new B); assert( p->f() == 'B' ); } こういう実行時バインディングをCRTPを使って書きたいんですがどう書けばいいんでしょうか?
223 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:25:53 ] >>215 ローカル変数として定義したオブジェクトはデフォルト初期化される 組み込み型の場合のデフォルト初期化は不定値 どんな実装でどんな結果になろうが、考えること自体意味がない
224 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:27:02 ] >>221 その構造体・クラスがPODならZeroMemoryしても構わない。 PODになるには色々条件(コンストラクタ・デストラクタ、仮想関数禁止など)があるが、 概ねCでそのまま使えるような単純な構造体なら大丈夫と思っていい。 それでも、ZeroMemoryよりは初期化子などでゼロ初期化を促すほうが一般的だと思うけど。
225 名前:221 mailto:sage [2007/10/03(水) 21:29:51 ] >>224 素早い回答ありがとうございます。
226 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:44:15 ] そもそもコンストラクタで初期化させるように設計するものなのでは?
227 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:48:41 ] でも外部のライブラリなんかで、 そういうCと共通のヘッダを使うなんて機会もあるし。 #そういうのはラップしろというのは同意。
228 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 21:59:40 ] >219 >>215 の報告を信じるなら、クラスのメンバ変数の場合には異なることが ありうるってことだねぇ。最適化の関係かな。
229 名前:222 mailto:sage [2007/10/03(水) 22:19:01 ] #include <cassert> template <typename Derived> struct base { char interface() { return reinterpret_cast<Derived*>(this)->implementation(); } static char static_func() { return Derived::static_sub_func(); } }; struct derived : base<derived> { char implementation() { return 'A'; } static char static_func() { return 'B'; } }; template <typename T> char f(base<T>& t) { return t.interface(); } int main() { derived d; assert( f(d) == 'A' ); } 英語版wikipediaを参考に書いてみましたがまだしっくりきません というかあきらかに違うような気がします
230 名前:202 mailto:sage [2007/10/03(水) 22:46:03 ] >>203 ありがとうございます。メモリマップ先をファイルでなくメモリで可能ですよね?ただ、やはりメモリ幅の違いが気になります。実装は困難なのでしょうね・・・
231 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 23:17:09 ] >>229 reinterpret_castではなく、static_castにすべきだが、ほかは合っている。
232 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 23:19:59 ] >>230 自分でメモリマップを実装するのは困難だろうけど使うだけなら簡単 #include<windows.h> #include<stdio.h> #define IS_PARENT // ←この行の有りと無しでコンパイルする #define MEMMAP_ID "maptest" int main(void){ HANDLE hmap; char *ptr; #ifdef IS_PARENT hmap=CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 256, MEMMAP_ID); if(hmap!=NULL && GetLastError()==ERROR_ALREADY_EXISTS){ CloseHandle(hmap); return 1; } ptr=MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, 256); ptr[0]='\0'; while(scanf("%255s", ptr)==1) ; #else hmap=OpenFileMapping(FILE_MAP_WRITE, FALSE, MEMMAP_ID); if(hmap==NULL) return 1; ptr=MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, 256); while(getchar()!=EOF) printf("%s", ptr); #endif UnmapViewOfFile(ptr); CloseHandle(hmap); return 0; }
233 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 23:20:05 ] >>230 size_tのような64ビットと32ビットで大きさの違うデータ型を読み書きしようとしない限り問題ない。 32ビットプロセス同士でやるのと同じ。
234 名前:202 [2007/10/04(木) 00:24:19 ] >>232 , 233 ご返信ありがとうございます。 今メモリ共有を行いたいのは、unsigned char型の配列です。 この場合も普通に232さんの教えくださったサンプルで問題ない という認識でよろしいでしょうか?
235 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:30:36 ] >>234 なぜ、やってみないのでしょうか? >>232 はただの動作確認のためだけのサンプルです サンプルで問題がないかどうかは使い方によります 使用しているAPIについて*自分で*調べて下さい
236 名前:202 [2007/10/04(木) 00:35:11 ] >>235 ご返信ありがとうございます。おっしゃるとおりです。 自分で調べずにすぐに質問してしまいました。 実装にトライします。 ありがとうございました。
237 名前:デフォルトの名無しさん [2007/10/04(木) 01:12:29 ] >>103 enable_if 使う初心者w
238 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 10:11:51 ] そんなこと言われても、mplなんて使いこなせないんで…
239 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 10:42:45 ] stdのcoutやcinはヘッダを見るとextern宣言されてますが、定義はどこで行われているんでしょうか?
240 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:02:01 ] >>239 標準ライブラリのソース内でしょう。
241 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:11:59 ] C++はヘッダファイルではなくヘッダをインクルードしますが ヘッダファイルとヘッダの違いって何ですか? ヘッダの中でヘッダファイルがインクルードされてる?
242 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:18:39 ] >>241 ほとんどのコンパイラの実装ではヘッダといえばそれに対応するファイルが 用意されているので、ほとんど同義。ただしコンパイラは <stdio.h> というヘッダを ファイルとして実装する必要はなく、規定された動作さえすればいい。これは C でも C++ でも同じ。 で、一般的にヘッダファイルといえばヘッダのように動作するユーザー作成の ファイルも含む。
243 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 11:34:30 ] >>242 ものすげえわかり易くてワロスw
244 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:10:53 ] <iostream>ってヘッダファイルぢゃないの?
245 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:13:19 ] >>244 C++ の標準ヘッダではあるけど、ファイルであるかどうかはコンパイラの実装しだい。
246 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:17:38 ] >>242 なるほど。ということはユーザー定義のヘッダファイルを #include "hoge.h" とした場合でも、規格上はhoge.hの実装 がファイルでなくてもよいということですか?
247 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:19:34 ] >>245 例えばファイルではないヘッダを使っているシステムってあるのですか? LinuxとかWindowsのコンパイラの場合、OSがファイルシステムを持っているから 事実上はファイルとして実装されてるということになるのですかね?
248 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:20:31 ] >>246 いいんじゃねーの。 実際プリコンパイルドヘッダが用いられるときなんかはhoge.h以外の とこから情報取ってきてるわけだし
249 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:23:16 ] privateな仮想関数って意味ありますか? 派生クラスで上書きしても呼び出せないのに。
250 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:25:05 ] >>248 プリコンパイルドヘッダというのはコンパイル済みヘッダということだと 思うので、バイナリファイルを覗きに行くのですかね?
251 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:25:12 ] delphiのinterface節/impliments節ってよくできてると思う
252 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:27:47 ] >>249 Non virtual interface と呼ばれる手法で使われる。 似たような話でデザインパターンの Template method とか。
253 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:32:52 ] >>250 ただのファイルにするかDBにするかインターネットからとってくるかは、 コンパイラ作成者の自由なんじゃないの?規格も神も制限してないんだから。 そんなの俺に聞いてどう答えて欲しいの?
254 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 12:39:36 ] >>249 派生クラスから呼び出せなくても、基本クラスから上書きバージョンを呼び出すことは出来る。
255 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 15:37:19 ] >>252 >>254 class B { public: void mf(){ privmf(); } private: virtual void privmf(); }; class D : public B { private: void privmf(); } int main() { D objd; objd.mf(); return 0; } このプログラムでobjd.mf() 内で呼び出される関数がB::privmf()ではなく、 D::privmf()になるのですがなぜですか? ポインタか参照に対して呼び出されたときにポリモルフィズム機構 が働くと思うのですが。 void mf(){ privmf(); }はvoid mf(){ this->privmf(); }と同じことですが、 このthisポインタが指している実際のオブジェクトの型がクラスDの 場合(上のプログラムの場合)はD::privmf()が呼ばれるということで しょうか?
256 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 15:59:23 ] そのとおり
257 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 16:11:28 ] >>256 ポインタthisに対する多態性ということですか。 objd.mf() を実質 mf(&objd)と考えて this と &objd が等しいものを表すため、クラスDの仮想関数 テーブルが参照され、そこに登録されている D::privmf()が呼ばれるということで納得できました。
258 名前:BOLT [2007/10/04(木) 18:19:42 ] 自分、C++の初心者です。以後お世話になると思いますがよろしくお願いします。 ccplus.blog121.fc2.com/ ちなみにプログラミング系のブログやってます。 よろしければ見に来てください。
259 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 18:22:29 ] クソショボイブログだなw 誰も見ないしとっとと閉鎖しろよ
260 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 18:42:04 ] 誰も見てくれないからこそ続けるんだ 最低1年くらいは毎週更新できるように努力しる
261 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 19:31:14 ] C++が全角なのが気にくわない
262 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 19:58:05 ] 「全角ってなんですか?」 「"いわゆる全角"のことではないでしょうか」
263 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 20:40:46 ] いいえ、焼き肉屋のことです。
264 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 20:56:58 ] おまえら向上心のある奴はやさしくしてやれよ
265 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 21:34:20 ] どこぞのかわいがりよりはずっとやさしい。
266 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 22:32:21 ] 可愛がってやらないと強くならないぞ!
267 名前:デフォルトの名無しさん [2007/10/04(木) 22:37:51 ] C++でCSVからデータを読み込もうとしています。 普通は1文字ずつ変数に入れていくと思うのですが、 プログラム側で #define FILENAME "a.txt" と定義しておき、 CSVに記述された FILENAME を "a.txt" として読むことはできるのでしょうか。 よろしければお力添えをお願いいたします。
268 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 22:45:46 ] "FILENAME"があったら適当に置換でもしとけばいいじゃん
269 名前:267 [2007/10/04(木) 23:04:23 ] 返信ありがとうございます。説明が不足していました。 defineが他にも多数あり、今後外部ファイルに定義を移して defineの名前も変更できるようにするため、いい方法がないかと思っています。 FILENAME 1個だけなら置換で問題ないですね。
270 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:06:54 ] CreateProcessでWindows Services for UNIXのunzipコマンドを使うのは可能ですか?
271 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:07:08 ] >>269 よくわからんけど、私的なツールなら cppでプリプロセスすればいいんじゃない?
272 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:19:35 ] >>270 createprocess 外部コマンド で検索するぐらいしてから来れば?
273 名前:267 mailto:sage [2007/10/04(木) 23:28:39 ] >>271 すみません、cppでプリプロセスの理解ができませんでした。 私的ではなく会社で使います。今日はこれ以上つなげないので調べてからまた来ます。
274 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:29:59 ] クラスのメンバ変数に参照型を追加した場合の初期化の 方法はこれが正しい書き方でしょうか? class Hoge{ private: int &Test; public: Hoge(int &T):Test(T){} ~Hoge(){} }
275 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:32:00 ] いえす 一番最後にセミコロン無いけど
276 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 23:35:30 ] >>267 その程度のこと会社で聞けよ きみの会社の客はかわいそうだな
277 名前:275 mailto:sage [2007/10/04(木) 23:38:58 ] >>275 どうも。 参考書にもググっても全く見つからなかったので不安が解消できました。
278 名前:274 mailto:sage [2007/10/04(木) 23:39:49 ] >>277 は名前ミス。失礼。
279 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 07:21:23 ] 質問です。 pure virtual な関数て、基底クラスで class ClassA { public: virtual void Test(void) = 0; }; こんな感じに定義するのは普通なのですが、さっき間違って class ClassA { public: virtual void Test(void) = 0 { } }; と、中身を定義したら、コンパイルが通りました。気になったので、派生させてみて、 派生先の Test 関数で、ClassA::Test を呼んだら、呼べました。 pure virtual な関数は、実体を作れないと思いこんでいたのですが、それは間違いなのでしょうか? vc++8.0 sp1 xp sp2
280 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 07:49:32 ] >>279 それは間違いです。 でもその書き方ってできないんじゃなかったっけ。 class ClassA{ public: virtual void Test(void) = 0; }; void ClassA::Test(void) { } って書く必要があったような・・・ 記憶違いかね。
281 名前:デフォルトの名無しさん [2007/10/05(金) 12:29:52 ] >>280 VC++はそういう書き方ができるんじゃなかったか。 pure virtualなデストラクタの定義を書くのを楽にするための、MSの配慮というか お節介だったと思うが。
282 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 21:29:19 ] まあ勘違いしやすい所だよな ×pure virtual な関数は、実体を作れない ○pure virtual な関数を持つクラスは、実体を作れない
283 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:32:31 ] printf 系で "%10s" と指定している箇所が全て 12 に変更されることになって 数値を定数化してフォーマットに埋め込めないものかと思っているんですが、 #define した定数がそのまま表示されたりと期待した動作が得られません。 どなたか知恵を貸して頂けませんか。 (そもそも文字列終端を付けられたらこんな苦労もなかったんですけど・・・)
284 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:35:09 ] #define FMT "%12s" printf(FMT,"hogehoge"); じゃダメなの?
285 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:39:10 ] こんな書き方も出来るかもー!! printf("%*s", 10, "hogehoge"); printf("%*s", 12, "hogehoge");
286 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:40:16 ] #define FMT "12" printf("%" FMT "s", "hogehoge"); とか
287 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:47:38 ] std::mapでキーワードを予め指定しておいた予約語以外は受け付けないように出来ますか? "hoge""hage""hoji""haji" // 何らかの方法で指定した予約語 std::map<std::string , std::string> strmap strmap["hoge"] = "これは成功する"; strmap["miss"] = "これは失敗する"; こんな感じで
288 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:49:15 ] C++で下みたいな方法ってよろしくないですかね・・・ 配列に入れた座標データを,オペレータオーバーライドを使って計算したいんですが 要素毎にコンストラクタ呼び出しは冗長になるので 問題点が判らないので指摘をお願いします #include <stdio.h> float data[] = {1., 2., 3., 4., 5., 6.}; class Data { public: // use default ctor float x, y, z; Data& operator+=(const Data &right) ....省略... }; int main() { Data *ptr; ptr = reinterpret_cast<Data*>(data); printf("%f %f %f\n", ptr[0].x, ptr[0].y, ptr[0].z); printf("%f %f %f\n", ptr[1].x, ptr[1].y, ptr[1].z); return 0; }
289 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 22:53:53 ] >>287 勝手に追加されちゃうから無理じゃね? std::mapを包含したクラス作ってインデクサの中で例外投げるとかしか思いつかない
290 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 23:00:43 ] >>289 stringの方をラッピングするのもアリじゃね? 書く量としてはその方が少なくなりそう。
291 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 23:00:58 ] >>289 そうですか、残念 ありがとうございました
292 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 23:15:10 ] >>288 >コンストラクタ呼び出しは冗長 といってもinlineであれば実質気にするほど変わらない気がする。 Dataがfloatピッタリ3つ分で収まるという保証があるのだろうか?データメンバーが後から追加されたりする可能性は? virtualな関数をもつとサイズが変わったりする様だし、危険を伴う気がします。
293 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 23:36:17 ] assert(sizeof(Data) == sizeof(float[3])); を書いとくとか
294 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 23:43:21 ] >>292 ,293 Thx 対象がRAWなベタデータなので簡素に出来ないかと思ったのですが 素直な書き方をした方がよさげですね
295 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 03:46:16 ] >>284-286 フォーマットって普通に文字列なんだな。 >>285 の方法は知らなかった。参考にさせて貰います。 色々試してみたけど、やりたいこともこれで出来そう。 ありがとね。
296 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 03:51:51 ] >>288 × オーバーライド ○ オーバーロード
297 名前:デフォルトの名無しさん [2007/10/06(土) 16:19:13 ] wcout はバグがありますか? wcout を使うのは避けてますか? WindowsXP Home + BCC
298 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 17:10:25 ] char *hogehoge(){ return "hogehoge"; } 文字列リテラルの場合、変数と違って関数を抜けても有効なままなんでしょうか?
299 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 17:11:10 ] 有効なままです
300 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 17:11:56 ] リテラル返すならconst char*にした方がいいかも
301 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 18:41:45 ] inline const char *&
302 名前:デフォルトの名無しさん [2007/10/06(土) 18:45:41 ] &はイラネーだろ なんか違うのか?
303 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 18:47:11 ] inline const const char *&
304 名前:デフォルトの名無しさん [2007/10/06(土) 18:52:50 ] C++超初心者です。 今まで動いていたのに、今日コンパイルすると、 (1029) invalid format string conversion と表示されてしまいます。 原因が分からず、どのように変えたらよいのかも分かりません。 ご教授宜しくお願いいたします。 すごく長いプログラムなので、関係してそうなところだけ書き込んでます。 FILE *ottq; ottq = fopen("ottq.dat", "w"); double chir,l l=20.05e-3; chir=0.0e-5; fprintf(ottq, "l(m)=\t%le\t\n",l); fprintf(ottq, "chir(%)=\t%le\t\n",chir*100.0); ←1029行目ここです。 fclose(ottq);
305 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 18:54:02 ] %→%%
306 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 18:54:48 ] >>304 エラーメッセージのまんまだろ。
307 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 19:02:37 ] こえぇ お前みたいなのが扱うもんじゃねぇだろ
308 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 19:09:25 ] 変数名きめぇwwwww