1 名前:デフォルトの名無しさん mailto:sage [2009/05/28(木) 01:08:48 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.65【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1239326399/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
52 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 14:49:15 ] >>51 参照渡しと言えば普通は引数についての議論だけど、 1〜6は戻り値の受け取り方だろ。噛み合ってない。 まあ、戻り値について言えば、3〜6は参照先の実体が失われるような受け取り方なので、 危険であり、ありえない。 内部的な処理で言えば、参照はポインタと同じで、どこかにある実体を指しているだけ。 実体は他でちゃんと保持されなければならない。
53 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 14:51:16 ] >>50 例外安全のために二段階に分けられている。 そのやり方しかない。
54 名前:デフォルトの名無しさん [2009/05/31(日) 15:28:12 ] >>52 ごめんなさい、参照での戻り値についての質問でした。 3〜6は参照先の実体が失われるとのことですが、 具体的にはどのようなケースで危険が発生するのでしょうか SStruct& sTestStruct = GetReturnStruct(); は 1.GetReturnStruct()で返り値の変数が作られる 2.それを参照する。 SStruct sTest1Struct = GetReturnStruct();は 1.GetReturnStruct()で返り値の変数が作られる 2.宣言SStruct sTest1Structで変数が作られる 3.返り値の変数をsTest1Structに代入 と思っていたため、変数が作られるのが一つ少ない分 SStruct& sTestStruct = GetReturnStruct(); の方が良いと思っていたのですが・・・
55 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 16:15:17 ] >>54 > SStruct& sTestStruct = GetReturnStruct(); は > 1.GetReturnStruct()で返り値の変数が作られる > 2.それを参照する。 つづきは 3. 1で作った返り値の変数が破棄される。(参照は破棄済みのデータを指すことになり、使えない) > SStruct sTest1Struct = GetReturnStruct();は > 1.GetReturnStruct()で返り値の変数が作られる > 2.宣言SStruct sTest1Structで変数が作られる > 3.返り値の変数をsTest1Structに代入 つづきは 4. 1で作った返り値の変数が破棄される。(コピー済みのsTest1Structは残るので、使える)
56 名前:デフォルトの名無しさん [2009/05/31(日) 16:32:15 ] >>55 Thanks ですが、 SStruct& sTestStruct = GetReturnStruct(); では、その後も普通に取得した値の参照が使えてしまいます・・ なぜこのような事態が発生するのかわかりますでしょうか?
57 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 16:58:56 ] >>56 ごめん、私の勉強不足のために嘘を教えてしまった。 ttp://www.sun-inet.or.jp/~yaneurao/intensive/cppmaniax/chap0001.html にあるように、const参照は一時オブジェクトを束縛するということなので、5と6はOK。 3が通るのは、そのコンパイラが一時オブジェクトを破棄するタイミングを たまたま遅らせているだけと考えられるので、 環境を変えたときに安全は保証されないと思う。
58 名前:デフォルトの名無しさん [2009/05/31(日) 17:28:49 ] const参照は一時オブジェクトを束縛する ということで了解しました。回答ありがとうございます。 ところで、クラスのメンバ関数の作り方で再び質問で、 以下のようなクラスがあるとします。 class CTest { private: SStruct m_sTestStruct; public inline VOID GetStruct(SStruct& sGetStruct) { sGetStruct = m_sTestStruct; } inline SStruct GetStruct() { return m_sTestStruct; } } メンバ変数のm_sTestStructを取得する関数の書き方としては、 1. VOID GetStruct(SStruct& sGetStruct); 2. SStruct GetStruct(); のどちらが処理的には良いのでしょうか? 直感的な見た目としては戻り値がSStructの方がわかりやすいと思うので 自分は大体2の方を使っております。
59 名前:デフォルトの名無しさん [2009/05/31(日) 17:30:10 ] あと、構造体の質問で以下のような構造体があるとします、 struct SList { SStraightCardList(); ~SStraightCardList(); E_TYPE eType; INT32 anArray[3]; }; このとき、以下のような初期化をしようとすると static const SList SLIST_DEFAULT = { eN_DEFTYPE, 1, 2, 3 }; error C2552: 初期化子リストによる個別の識別子の初期化に誤りがあります。 ユーザー定義のコンストラクタを含む型はアグリゲートではありません。 とのエラーメッセージで構造体の初期化がうまくいきません・・・ 構造体ではデフォルトコンストラクタを自分で定義してしまったら 初期化 = {..., ..., ...}; の書き方は使えないということなのでしょうか?
60 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 17:30:26 ] すいませんプリコンパイル済みヘッダーというのが使い方がよく分からないのですが、 pch.hファイルに使用する全てのヘッダーファイルのincludeを書いて、 他のcppファイルはpch.hのみincludeするというのが正しい使い方なんでしょうか
61 名前:デフォルトの名無しさん [2009/05/31(日) 17:32:40 ] すいません。コンストラクタ部分をこぴぺミスしました。 SStraightCardList()→SList()です。 よろしくお願いします
62 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 18:09:52 ] >>58 今はVOIDだが、他に戻り値が必要なら1。 SStructがコンストラクタを持つなら、コピーコンストラクタ一発で値を返すことができるので2。 SStructがただの構造体なら1も2も同じだけど、呼び出しが楽なので2。 それより良い手は const SStruct& GetStruct() const { return m_sTestStruct; } >>59 ttp://msdn.microsoft.com/ja-jp/library/0s6730bb(VS.80).aspx >>60 プリコンパイル済みヘッダには、各cppで共通のヘッダで、変更の少ないものを書くのが普通かと。 変更があると、全cppを再コンパイルする羽目になるので。 各cppはプリコンパイル済みヘッダと、不足分のヘッダをincludeする。
63 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 19:03:18 ] int data_1[100][200] int* p_data; p_data = &(data_1[0][0]); として、 p_data[50][70]; などとしてデータを取り出したいのですが、うまくいきません。 *(p_data + 50*200 + 70)とすれば取り出せることは分かったのですが、 2次元配列形式でデータを取り出すのは不可能なのでしょうかデータのコピーはしたくありません
64 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 19:06:10 ] int* p_data[][]; もしくは int* p_data[100][200];
65 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 19:13:56 ] int* p_data[][]; と記述するとコンパイルエラーになります。 あと、p_dataの参照先はdata_1だけでなく、 条件によってサイズの異なる別の配列を参照する場合があるので、 サイズを固定することはできないです。
66 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 19:14:43 ] 先頭を渡すなら p_data = &(data_1[0][0]); じゃなくて p_data = data_1;
67 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 19:16:01 ] >>65 サイズが違うなら多次元配列を1次元配列とみなして *(p_data + 50*200 + 70) のような感じでアクセスするしかないんじゃない?
68 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 20:52:22 ] typedef int (*data200)[200]; data200 p_data = data_1[50]; return p_data[70];
69 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 20:54:47 ] >>68 それだと前の配列しか可変になってねえ?
70 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:21:53 ] >>65 ポインタの配列を使えば可 でも、受け取った関数側でサイズを知る方法が無いから 追加の引数でサイズを渡すとか構造体にまとめてから渡すとかしないとダメぽ struct tag_matrix_t { int width, height; int **data; }; みたいに
71 名前:デフォルトの名無しさん [2009/06/01(月) 11:30:21 ] std::vector<T> vec; std::deque<T> deq; があるとき、中の要素を適当に並べ替える関数を定義したいのですが、オーバーロードを使って、 mysort(std::vector<T> &v); mysort(std::deque<T> &d); とやっていたのですが、イテレータ引数の関数を定義して1つにまとめてしまいたいです。 どうやればいいですか? テンプレートを使って書くのは、結局自分ではイテレータを定義してないというか、 dequeやvectorのテンプレート機能を呼び出しているだけという感じがするのですが。
72 名前:デフォルトの名無しさん [2009/06/01(月) 12:18:40 ] ファイルからの入力の場合、vectorのソートと、setのソートはどっちが速いですか? メモリに一気に格納してソートか、一つずつソートする違いです。
73 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 12:21:20 ] >>72 テストソース書いて実測してみればいいよ。 ファイルの置き場所によって変わる可能性もあるだろうけど メモリに一回あげたほうが早いと思う
74 名前:デフォルトの名無しさん [2009/06/01(月) 12:23:51 ] ありがトン 実測してみます
75 名前:デフォルトの名無しさん [2009/06/01(月) 13:20:15 ] 最小2乗法によるm次の多項式近似を行うプログラムを教えてください 教えて xがー2の時yが3.02 −1の時0.98 0の時1.22 1の時2.16 2の時2.61 の時のです 出来ればソース全文書いてください
76 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 13:23:04 ] いいえ
77 名前:デフォルトの名無しさん [2009/06/01(月) 14:33:33 ] VS2008でC++でコンソールプログラムを書いてます。 std::cout << "" << std::endl; とかで出力を出しているのですが、それをテキストファイルに書き込みたいのですが、 プログラム内でファイルを開いてそこに書き込んで、、、渡河やらないと駄目でしょうか?
78 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 14:38:39 ] > でリダイレクトすれば標準出力をファイルに落とせる
79 名前:デフォルトの名無しさん [2009/06/01(月) 15:54:04 ] Windows & C++の質問です。 例えばCのqsort()関数のように、中身を直接弄らなくても、 ユーザが処理の一部を書けるようにする……という手法がありますよね。 とあるフレームワーク(ライブラリ群)を作成するにあたり、 エントリポイント(main関数)を隠蔽した状態で、一部の処理をユーザに記述させるにはどうやるのがスマートでしょうか? 現在こちらが想定しているイメージとしては、フレームワーク開発側が以下のようなコードを書いておき、 その中の setting.init() をユーザに用意してもらう……といった感じです。 int main ( 〜 ) { Setting setting; //適当なシングルトンクラス setting.init ( ); //ユーザが記述する初期化処理 /*メイン処理*/ return 0; } Setting::init()は、中身が空っぽでも大丈夫とします。 その際、もし可能であれば、わざわざユーザがinit()部分を書かなくても良いようにしたいなあと考えています。 Settingクラスには、init()以外のメンバ関数があり、それらはユーザがタッチしなくてもよい部分です。 そのため、それらはフレームワークの中に隠蔽しなければなりません。 ですが、そのままやると、1つのクラスがフレームワークの内外に散ってしまうので、なんとなく気持ち悪いです。 継承や関数ポインタも考えましたが、main()内を弄らずに指定する方法が分かりません。 また、DLLを用意して読み込む方法はナシとします。
80 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 19:33:03 ] Cの初心者本でオススメってなんかない? 基本情報の午後にむけて勉強したいもんで
81 名前:デフォルトの名無しさん [2009/06/01(月) 19:54:20 ] VC++ 2008 にて、コントロールのサブクラス化を行っているのですが、 ボタンのクリックイベントで詰まりました。 ウィンドウプロシージャ内で、 マウスの左ボタンクリックのイベントを拾いたいのですが、 WM_LBUTTONDOWN、WM_LBUTTONUP や ダブルクリックの WM_LBUTTONDBLCLK はあるものの、 シングルクリック(マウスを押して離す)の定義が見つかりませんでした。 WM_COMMAND だと親コントロール依存になってしまうので避けたいです。 .NETクラスライブラリの Control.WndProc を覗いてみると、 WM_LBUTTONDOWN の際に、押された事を示すフラグを内部的に立て、 フラグが立っている状態(そのコントロール外でマウスボタンを離さない)で、 WM_LBUTTONUP が来たら クリックイベント発動。 という、けっこう面倒な処理をしていました。 どうしようもなければ、.NETと同じようなコードにしようと思うのですが、 もっと簡単な実装などありますでしょうか? よろしくお願い致します。
82 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 20:30:23 ] >>81 多分無い ボタンに対して マウスLB押下 そのまま ドラッグしていって ボタンの範囲外に抜けた後に マウスLB開放 した場合とかを考え出すとね…
83 名前:デフォルトの名無しさん [2009/06/01(月) 20:48:19 ] メモリマップ度ファイル便利と思って多用していたが、 巨大なファイルのシーケンシャルリードするとメモリ解放しないままで 次々に読むから不安定になるな。
84 名前:83 [2009/06/01(月) 20:51:35 ] 自分の予定では、次に読むだろうところだけ先読みして あとは開放しているもんだと思っていた。 しかしためられるだけためてた。
85 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 21:07:33 ] >>82 ありがとうございます。やっぱ厳しそうですね。。。 .NETのクラスライブラリを参考に作ることにします。
86 名前:デフォルトの名無しさん [2009/06/01(月) 21:13:30 ] >>83 ,84 もしよかったら、どういうシチュエーションで便利に使ってたか教えてよ。
87 名前:83 [2009/06/01(月) 21:28:40 ] メモリにロードせずに、そのまま操作できるところ。 ケースによっては、自前でバッファを管理して入出力するより高速に動く。 OSやディスクのキャッシュが適切に効いた場合、入出力バッファ処理を気にする必要がなくなる。
88 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 21:45:44 ] >71 template<typename RandomAccessIterator> void mysort(RandomAccessIterator first, RandomAccessIterator last); の何が不満なの? 他人が書いた Iterator を使って望みの事ができるならわざわざ自分で書く必要ないだろ? そもそもコンテナ用の Iterator 書くならコンテナの実装を知ってる方がいいわけで、 その意味でも自分で書く必要がない。 >84 物理メモリ上に載ったままって話?
89 名前:デフォルトの名無しさん [2009/06/01(月) 21:49:42 ] 物理メモリにはのったままではないけど、ギリギリまで使い切ってる。 あとは仮想メモリに入っているよう。この仮想メモリはOSのものとは別物の気がする。 メモリマップドファイルすると、した分は仮想メモリとしてOSは認識しているようにおもう。
90 名前:デフォルトの名無しさん [2009/06/01(月) 21:53:09 ] 予想では、次々に同一ファイルのロードが起こると、 OSは大事なファイルと認識しメモリに蓄えておこうとするのだと思う。 もっとも最近に参照されたファイルが優先されて、そのファイルだけが残ると思う。
91 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 21:57:14 ] >>90 OSじゃなくメモリマップドファイルを実現してるクラスとかがメモリを確保してるだけでしょ windowsだと確か設定を変えなければ一つのアプリが最大使えるメモリって 2GBだっけ? そのくらい物理メモリ詰んでなければそりゃ使い続ければいずれ物理メモリを超えるので スワップ発生するだろうし
92 名前:デフォルトの名無しさん [2009/06/01(月) 22:21:16 ] メモリマップドファイルは、windowsが用意している関数でそのメモリ使用量を自前で制御できない。 まったくメモリにキャッシュしないようにするオプションはあるけど。 OSの制御にあって、使用中は全く手出しできない。
93 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 22:44:39 ] WindowsXP VisualC++2008EEです。 クラスの中のメンバクラスに関する質問です。 ---------------------------- class ClassA{ ClassA( int a, int b ) { }; //コンストラクタ ^ClassA( void ) { }; //デストラクタ }; ---------------------------- 上記のように引数付きのコンストラクタを持つクラスがあるとき ---------------------------- class ClassB{ private: ClassA mClassA( 1, 2 ); }; ---------------------------- といった形で、メンバクラスを宣言しようとすると、 「error C2059: 構文エラー : '定数'」 といったエラーが出てきてしまいます。 引数付きのコンストラクタがあるクラスをメンバとして持つには、 どのようにすればよいのでしょうか?
94 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 22:47:20 ] >>92 そういう作りなのか まあ気に入らなければ自分で作ればいいだけだしな。
95 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 22:53:25 ] >>93 class ClassB { ClassA mClassA; ClassB() : mClassA( 1, 2 ) {} }; classB のコンストラクタで メンバの初期化
96 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 23:24:42 ] funini.com/kei/mmap/mmap_api.shtml
97 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 23:24:43 ] >>79 Settingクラス(フレームワーク提供)を継承したクラスをユーザが定義し、 そのファクトリ関数もユーザが定義するようにすればできない? Setting::init()は空の仮想関数。 ファクトリ関数はグローバルで、関数名とプロトタイプはフレームワーク仕様により規定。
98 名前:デフォルトの名無しさん [2009/06/01(月) 23:42:28 ] jpgファイルをWindowsのアプリから表示したい時、boost::gilを使ってる人いますか? 使う言語はC++なのですが(Win32APIは出来る限り使ってません)、 WindowsのAPI使った方がいいのか、わざわざboost::gil使う意味あるのか。
99 名前:79 mailto:sage [2009/06/01(月) 23:42:39 ] >97 ありがとう。 ファクトリ関数が何なのか調べるところから始めてみる。 ……要は、継承先のクラスを指定する部分だけを フレームワークの外に出してしまえばいいんじゃね?ってこと?
100 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 23:44:49 ] >>95 ありがとうございます! 動きました・・・・が、見たこと無い形なので、なぜ動いたかが分からない・・・。 「コンストラクタ初期化子」というのがあるそうですね。 そういうものだと割り切って覚えるのが早いでしょうか。
101 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 00:02:16 ] コンストラクタの初期化リストは大事だから 知らなかったならちゃんと勉強し直した方がいい
102 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 00:07:25 ] 初期化リスト使えないとconstなメンバを初期化できないから注意な
103 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 00:10:43 ] コンストラクタの後ろにコロンで繋げて 初期値を指定するのって、地味にめんどい
104 名前:砂ぐま [2009/06/02(火) 00:28:02 ] 教えてください。 [1]C++ [2]締切:6/3 [3]問題文 以下の問題はprintf scanfを用いらず、cin coutを使用しなさい @2つの4行4列の行列が与えられたとき、 その積を計算するプログラムをwhileループとインクリメント演算子を用いて作成しなさい。 (※ヒント whileループは行列をキーボードから入力するためにも用いる) A3項演算子として __ ? __ : __ が存在する。この演算子を用いて次のプログラムを作成しなさい。 (1)変数a,bをキーボードから入力し、小さいほうを出力するプログラム (2)変数a,b,cをキーボードから入力し、最小値を出力するプログラム Bwhileループと複合代入演算子を用いて、等差数列 1+3+5+7+・・・・・・+9999を計算するプログラムを作成しなさい。 CBのプログラムを実行した結果はいくらになるか? D型変換として、算術演算子のオペランドの一つがdoubleで、片方がintであれば、 int型のオペランドはdouble型に変換されて、計算される。 下記は例である。 int a; float b; a=(int)b また、下記のようにすると、 int a=5,b=3; float c,d; c=a/b; d=a/(float)b で値が異なる。 この値が異なることをプログラムを組むことによって確かめなさい。
105 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 00:29:27 ] >>101 まだまだ勉強中の身なのです。 >>102 なるほど! 確かにconst指定したメンバが コンストラクタで初期化できないから、 どうするんだ?、と悩んでたことがありました。 >>103 そうですね。自分も30個くらいメンバが必要なので 同じことを考えていました。
106 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 00:45:58 ] >>104 具体的に何が分からないのか答えなさい。(5点)
107 名前:砂ぐま [2009/06/02(火) 01:20:43 ] >>106 解答をお願いします。
108 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 01:24:20 ] >>107 宿題スレへ行くほうがいい。
109 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 02:12:17 ] >>108 宿題スレとマルチしてるんだけどな
110 名前:デフォルトの名無しさん [2009/06/02(火) 03:57:02 ] boost::gilの使い心地の方もお願いしま〜す。
111 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 04:06:56 ] >110 こっちは? pc12.2ch.net/test/read.cgi/tech/1232367742/
112 名前:デフォルトの名無しさん [2009/06/02(火) 05:41:26 ] int i =100; float* pf = (float*) &i pf = pf * 2 このコーディング、どこだダメなんでしょうか
113 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 05:47:46 ] >>112 intとfloatの内部表現が一致している保証はどこにもないから それとポインタに対する演算はアドレスを取る事と定数を足す引く しか認められていないからポインタを2倍するとか全く無意味
114 名前:デフォルトの名無しさん [2009/06/02(火) 05:53:16 ] ありがとうございます。 内部表現が一致するとは、具体的にどういうことでしょうか? これであればアドレスの中身(100?)を2倍することになるのでしょうか *pf = *pf * 2
115 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 05:57:52 ] >114 内部表現が一致するとはiと*pfの値が等しい時に常にiと*pfのビット列 が等しい事が保証されている事を意味する しかし実際には大部分の計算機では浮動小数点はIEEE754、整数は 2の補数表現を取っている事が大部分で内部表現にお互いの互換性 はない >*pf = *pf * 2; *pfが元々floatの変数のアドレスを取っている時はその通り 今のように元々intの変数のアドレスを取ってそれを2倍したら浮動小数点例外 が起きるかもしれない
116 名前:デフォルトの名無しさん [2009/06/02(火) 06:36:32 ] 高精度の文字エンコード判定・自動変換ライブラリ で一番いいのはなんでしょうか?
117 名前:デフォルトの名無しさん [2009/06/02(火) 06:43:49 ] 秀丸とかEmとかは判定どうやっているのかわかりませんか? (世界各国で通用するのは)モジラかIEくらいしかしりません。 エディタの作者は自分で作っているんですか?
118 名前:デフォルトの名無しさん [2009/06/02(火) 07:06:57 ] ありがとうございます。
119 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 09:59:01 ] >>117 ちょっと文字コード調べればわかると思うけど、 それぞれの文字コードで仮定して矛盾が生じたら違うと判断すればいいんだよ。 どこまで調べるか、どうやって調べるかはそのアプリの性質で決めたらいい。 判定不能な場合どうするかもね
120 名前:デフォルトの名無しさん [2009/06/02(火) 10:07:44 ] 理屈はわかりますが、実際にやると大変です。 これはエディタの本体(GUI)を作るほど手間がかかりそうです。 世界各国語に対応させる場合。
121 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 10:11:05 ] >>120 文字コード扱うプログラマとしては常識の範囲ですが・・・ テキストごときでwwwとかいうゆとり多いけどテキストほど面倒な物は無い。 文字コードを限定すればなんとかなるけど
122 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 10:17:18 ] たかがテキストごときで
123 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 11:24:03 ] 文字コードの自動判別は不可能なんだから実装する必要なし ユーザに選択させればいいだけ ブラウザはhttpヘッダのcharsetで判定してるだけだろ
124 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 12:53:00 ] ICUライブラリを使う(キリッ
125 名前:デフォルトの名無しさん [2009/06/02(火) 13:12:49 ] 判別、自動変換はできるのですか
126 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 13:29:39 ] とりあえず入力コードと出力コードを指定して一発で変換することはできるし、 CharsetDetectorっていう判別専用のクラスもある 世界中の業務用アプリで使われている実績もあるしライセンスも緩くて使い勝手もいい 問題は添付するdll(so)が糞大きいことだけ
127 名前:デフォルトの名無しさん [2009/06/02(火) 13:43:37 ] トンクス
128 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 16:55:47 ] float の NAN ってどういう値なんですか?
129 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 16:59:46 ] ttp://ja.wikipedia.org/wiki/NaN
130 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 17:03:22 ] ありがとうございます
131 名前:デフォルトの名無しさん [2009/06/02(火) 20:50:15 ] 質問です。 CLSはクラスで、int charなどの変数で構成されます。 CLSの変数と同じ順番で記録されているファイルがあり これを vector< CLS > x; にロードしたいのですが Read( &x[0] ) のようにしてもうまくいきません。 データが壊れています。 一括でロードする方法はありませんか?
132 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 20:54:22 ] ないと思うべき。 順番が同じでも、アラインメントが入ってどうせファイル上のデータの並びと同じではないだろう。
133 名前:131 [2009/06/02(火) 20:54:25 ] vectorのソートを使いたいんです。 構造体に読み込めば出来そうですが それをvectorにコピーしたらいいでしょうか? 無駄なことをしている気がしますが。
134 名前:131 [2009/06/02(火) 20:56:51 ] サンクス 一度にロードして、vectorに正しく挿入することにします。
135 名前:デフォルトの名無しさん [2009/06/02(火) 21:01:25 ] すみません。 変更して構造体に入れてqsortにします。
136 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 23:01:34 ] int a = 10; この変数aを関数の引数として渡す場合、 void FuncA(const int n){ int test = n; } void FuncB(const int& n){ int test = n; } の関数があるとして FuncA( a ); FuncB( a ); 結果としては2つとも各ローカルのtestに10が入りますが後者(FuncB)はなぜこれで大丈夫なのでしょうか。 aのアドレスをFuncBに渡している…となると Func( &a ); でないとエラーが出そうなのに・・。 むしろ後者は前者とどういう処理の違いがあるのか気になります。
137 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 23:06:04 ] >>136 参照≠ポインタ
138 名前:デフォルトの名無しさん [2009/06/03(水) 00:50:33 ] 時々このスレで質問させてもらってる者です。 大体何ターンくらいで終わるのか調べてみようと思って UNOのゲームを書いてみたのですが、どなたか新しい戦略を書いてくれませんでしょうか? ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9331.zip ルールは、 (1)Draw2とかDraw4はSkip飛ばしできません。 (2)最後にワイルドカードを出してあがれません。 あとは普通のルールと思います
139 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 01:21:43 ] >>136 いちいち&aと書かずに済むポインタだと思っても3割くらい当たっていると思ってもいい。
140 名前:デフォルトの名無しさん [2009/06/03(水) 01:22:26 ] Player.cppの中の bool Player::SelectCard(const Card ¤t, int DrawObligation, Card *playcard) という関数を書き換えれば新しい戦略が書けます。 この関数は前のプレイヤが出したカードがcurrent、何枚か引かないと駄目な状態になって る場合には、DrawObligationが2以上になってます。出すべきカードが見つかればtrueを 返して、*playcardに出すべきカードを入れます。 以上です。失礼しました。
141 名前:デフォルトの名無しさん [2009/06/03(水) 07:55:24 ] hashmapは存在してますが、hashsetは効いたことがありません。 stlのsetは効率がいいので開発されてないんでしょうか?
142 名前:131 [2009/06/03(水) 10:28:10 ] 構造体になんとかしてロードしたかったのですが、これも値がずれてしまいました。 値がずれずに一括でロード出来る方法はないんでしょうか? 一括で読み込んで、クラスや構造体に格納していくしかありませんか。
143 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 10:31:22 ] >>142 そもそも保存するときにズレてるんじゃない? パディングとかオープンモードとかあるから
144 名前:131 [2009/06/03(水) 10:35:05 ] アライメントに注意してデータ作成時に隙間を作っておく必要があるんですね。 自己解決しました。
145 名前:デフォルトの名無しさん [2009/06/03(水) 11:01:21 ] 隙間を作る (構造体、クラスをそのまま出力する) 方法で一括ロードできました。 ありがとうございます。
146 名前:デフォルトの名無しさん [2009/06/03(水) 17:50:27 ] C言語の学習を始めたばかりですが、 char型配列の要素を、int型の数値に出来なく困っています。 (Borland C++ 5.5.1 for Win32) char s[3],a; scanf("%s",&s); の時、*6 と入力すると s[0] → * s[1] → 文字としての 6 s[2] → \0 となっていると思うのですが、s[1]の6を数値として 取り出すにはどうすればよいのでしょうか? 以下やってうまくいかなかった事です。 1)printf("int=%d\n",(int)s[1]);→int=54 2)a = s[1]; printf("int=%d\n",(int)a);→int=54 3)printf("int=%d\n",atoi(s[1])); 4)printf("int=%d\n",atoi(a)); 3,4ともに「パラメータ '__s' は const signed char * 型とし て定義されているので int は渡せない(関数 main )」とエラー。 悩んでしまってここから全く前に進めなくて弱っています。 ご存知の方ご教示ください。よろしくお願いします。
147 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 17:52:16 ] >>146 文字としての6ならatoi関数
148 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 17:53:18 ] 途中になった printf("int=%d\n",atoi((int)s[1])); としてキャストしないと
149 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 18:25:17 ] >>141 あるよ。DinkumwareとかSGIとかは、hash_mapと共にhash_setも作っている。 そして、unordered_mapとunordered_setという名前でC++標準にも入るし、VCやg++でももう使える。
150 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 18:51:43 ] >>146 どんな教科書使って勉強してる? C言語はBASICみたいに文字列をひとまとまりの変数として扱えないし 数値との相互変換も簡単にはできないので、 一通り教科書を読み終わってから そういう(Cの初心者には)むつかしいことにはチャレンジしたほうがいいよ。
151 名前:146 mailto:sage [2009/06/03(水) 20:09:49 ] >>147-148 早速のレスありがとうございます。 >>150 雑誌の初心者向けの連載を参考にしています。 サンプルを改造しようとしても型変換のようなところで躓いてしまいます。 仰る様にいくら考えても分からない部分は後回しにして進めてみたいと思います。 >>147-148 文末のコードでコンパイルしてみましたが、 エラー E2342 パラメータ '__s' は const signed char * 型と して定義されているので int は渡せない(関数 main ) と出てしまいました。 本当に学びはじめなので、考えられない間違いがあるかもしれません…。 ご指摘いただければ助かります。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main() { char s[3]; scanf("%s",&s); printf("int=%d\n",atoi((int)s[1])); return 0; }
152 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 20:14:11 ] >>147-148 馬鹿はわざわざ書き込まなくてもいいのですよ。 >>151 取り敢えず、printf("%d\n", atoi(& s[1]))とでもして味噌。