1 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 00:00:47 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.49【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1203478421/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
98 名前:デフォルトの名無しさん [2008/03/16(日) 00:26:29 ] >>92-97 ありがとうございます。 アドバイスを総合して実装してみたのですが、コンパイルが通りません。 #include <iostream> #include <vector> using namespace std; template <typename T> class cvector : public std::vector<T> { T operator[](const int n) const { int index = (n >= 0) ? n : this->size()-n; // assert(n >= 0); return (*this)[index % this->size()]; } }; int main(){ cvector<int> vec; vec.push_back(11); cout << vec[0]; return 0; } コンパイルエラーはこうです。 test.cpp:6: error: 'T cvector<T>::operator[](int) const [with T = int]' is private//T operator[](const int n) const {の行です。 test.cpp:15: error: within this context // cout << vec[0]; の行です。 どうかもうすこし教えてください。
99 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:28:34 ] >>98 エラーメッセージそのまんまだろ。何がわからないんだ?
100 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:30:18 ] private ってのは危険だから private 継承しろって意味じゃないのか
101 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:43:03 ] operator[]の前行にpublic:
102 名前:デフォルトの名無しさん [2008/03/16(日) 00:45:09 ] >>100 private継承しようとするとpush_backが使えなかったので、public継承にしました。 >>99 これってどう継承してもよびだせないということですか?
103 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:51:53 ] class cvector -> struct cvector >int index = (n >= 0) ? n : this->size()-n; this->size()-nだとリングにならないよ (n >= 0) ? n : (size() - (-n % size())); あと、 と書くとレスに連続した半角空白を入れられる
104 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:53:38 ] operator[] が private だから呼べねーよ! ってコンパイルエラーだな。
105 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:05:00 ] 負の数を認めない型の値の最上位ビットが立っているかどうかなら、 1 << (sizeof(type) * 8 - 1) とand取ってifすれば得られるぜ。
106 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:10:48 ] そこまでして符号無しにこだわる必要は無いと思うというか、 その時点で引数を符号無しにするべきではないと思うというか。
107 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:26:05 ] 符号なしにしないとオーバーライドできない、っていうか、 operator[]はvirtualじゃないからオーバーライドできない。
108 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:26:55 ] ならオーバーロードで
109 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:32:28 ] そもそも vector を public 継承しようとしている時点であれというか。 vector とは性質的に別ものだから内包して自分でメンバ定義していくのが正しい。 単純な委譲で済む関数はインライン関数にしとけばインライン展開されるだろうし。 どうしても継承したいなら private 継承して、 size() とかそのままでいい関数は using する。
110 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:34:09 ] つうか普通このケースでは包含だよなぁ
111 名前:デフォルトの名無しさん [2008/03/16(日) 01:42:27 ] 質問よろしいですか? 0 1 2 3 4 5 6 7 8 このようになっている時にクラーメルの公式のように(掛け算ではありませんが) 1+5+6というふうにするにはfor文でどのようにすればいいのでしょうか?
112 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 01:57:23 ] int data[3][3]; とするならば int sum = 0; for(int i=0; i<3; i++) { int x = data[i][(i + 1) % 3]; sum += x; } // sum = 1+5+6 = 12
113 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:01:02 ] 3つしかあり得ないならハードコーディングするのも手だと思う。 for 使うなら % だろうけど、逆向きの時は少し注意が必要(i が負になるとマズい)。
114 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:05:16 ] 配列アクセス用のインデクステーブルを作るとか
115 名前:デフォルトの名無しさん [2008/03/16(日) 02:05:33 ] >>112 ,113 すいません、言葉が足りてませんでした 配列は固定ではなくN×N行列で ポインタを*paとする時 pa pa+1 pa+2 pa+3 pa+4 pa+5 pa+6 pa+7 pa+8 でどう求めるかということでお願いします
116 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:12:47 ] [i][(i + 1) % 3] を [i * N + (i + 1) % N] にするだけでしょ。
117 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:14:36 ] for 使うなら % だろうけど、逆向きの時は少し注意が必要(i が負になるとマズい)。
118 名前:デフォルトの名無しさん [2008/03/16(日) 02:21:37 ] >>116 i=0 0*3+(0+1)%3 = 0 i=1 1*3+(1+1)%3 = 3 i=2 2*3+(2+1)%3 = 7 こうなるんじゃないんですか?
119 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:23:30 ] >>118 頭大丈夫か
120 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:26:40 ] 小学生からやりなお(ry
121 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:26:50 ] >>118 とりあえず今日はもう寝とけ
122 名前:デフォルトの名無しさん [2008/03/16(日) 02:26:54 ] >>119 すいません勘違いしてました どうもありがとうございました
123 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 11:30:09 ] ∧∧ / 中\ ( `ハ´) いつになったら福田康夫は日本人が犯人だと認めるアルか ( ⊃┳⊃ c(_)ヘ⌒ヽフ 【中国産・毒ギョーザ】日本人が“犯人”? 共同通信の日本人記者拘束で中国のネット世論沸騰★5 (朝日(-@∀@) mamono.2ch.net/test/read.cgi/newsplus/1204264902/ ≡≡≡ ◎―◎⊃⊃ キコキコ
124 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 11:40:32 ] 毒餃子は中国工場内での混入がほぼ間違いなくなったよな。 濃度は3000ppmって。。漬け置きレベルらしいな。 シナはどこまでも外道。オリンピック開催させるなよ。
125 名前:デフォルトの名無しさん [2008/03/16(日) 11:41:33 ] 102です。以下のように実装してみて、動作することを確認しました。でも2点質問させてください。 (1)vectorを継承した方で、size()はusingsしておけばいいといわれましたが、やり方がわかりません。 でも知りたいのでどうか教えてください。 (2)同じくvectorを継承した方で、public継承するのはよくないと言われましたが、(繰り返しになりますが) private継承するとpush_back等のvectorクラスの機能が使えないと思います。ここはどうするべきなのでしょうか? template <typename T> class ring_vector { public: T operator[](const int n) const { int index = (n >= 0) ? (n % v.size()) : (v.size()-(-n % v.size())); return v[index]; } std::vector<T> v; }; template <typename T> class ring_vector2 : public std::vector<T> { public: T operator[](const int n) const { int index = (n >= 0) ? (n % this->size()) : (this->size()-(-n % this->size())); return std::vector<T>::operator[](index); } };
126 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 12:00:48 ] >>125 (1)レスを追ってないから知らん (2)転送関数
127 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:00:00 ] Linux+gccでCPUの型番や周波数などを取得する方法を教えてください
128 名前:103 mailto:sage [2008/03/16(日) 13:00:16 ] >int index = (n >= 0) ? (n % v.size()) : (v.size()-(-n % v.size())); >>103 のは元のソースがreturn [index % size()];なので、それを前提としてたんだけど・・・。 return v[index];にするなら、負の数の方も、もう一度%しないと、 n == -size() のとき、return v[size()]; になっちゃうよ。
129 名前:103 mailto:sage [2008/03/16(日) 13:02:20 ] return v[index]; を return v[index==size()?0:index]; にするのでも良いけど。
130 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:04:24 ] >>125 ring_vectorの方で良いよ。 継承するの変だと思うし。
131 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:04:53 ] system("cat /proc/cpuinfo");
132 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:12:54 ] クラスで場合によっては定義しない変数は宣言できますか? ありましたら、どうすればいいか教えてください。
133 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:17:07 ] template <typename T> class ring_vector3 : private std::vector<T> { typedef std::vector<T> parent; public: T operator[](const int n) const { int index = (n >= 0) ? (n % this->size()) : (this->size()-(-n % this->size())); return parent::operator[](index); } using parent::push_back; }; みたいな。
134 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:24:34 ] >>132 質問をもう少しkwsk
135 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:26:44 ] >>132 使わなければ
136 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:32:21 ] 使わなくても定義は必要じゃね
137 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:38:31 ] だから、仮想デストラクタを持たないvectorを継承すんなよw
138 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:40:56 ] そろそろvirtualから離れようぜ
139 名前:133 mailto:sage [2008/03/16(日) 13:48:13 ] 何か問題が?
140 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:53:31 ] >>139 使い方によってはvectorのデストラクタが呼ばれないことがある。
141 名前:133 mailto:sage [2008/03/16(日) 13:56:17 ] 使い方?vector<T> *にキャストする話? 出来るの?private継承なのに。
142 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 14:14:38 ] >>141 定義をそれ以上いじらなければ問題ないっしょ。 std::vector<T>* p() {return this;} みたいなメンバ関数を追加したりすれば、 privateな継承でも基底のポインタが得られるので、 単にprivate継承であるというだけで常に安心できるわけではない。
143 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 14:17:26 ] それをdeleteしたら吹くw
144 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 14:23:24 ] そんなメンバをつくって、しかもdeleteしちゃうような輩は、 vector<int> v;を使わせても delete &v[1];とかするだろうなw
145 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 14:25:01 ] イテレータは循環するようにしなくていいのか?
146 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 14:28:34 ] ちょw end()どこだよw コンテナじゃないんだし、いらないっしょ
147 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 14:35:21 ] どのイテレータをインクリメントしてもendと等しくはならない、とか
148 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 14:46:28 ] STLのアルゴリズムに食わせられないじゃん
149 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 14:48:38 ] >>134-135 extern BMPImgData bmpA; extern BMPImgData bmpB; class BMPImgData { public: HDC mHdc; int w; //幅、高さ int h; int anmx; int mv; //・・・・ //↓bmpAには不要 POINT ptgt; //リアルマップ座標(移動)0~10 POINT tgt; //目標リアルマップ座標 POINT Root[MAX_MAPX][MAX_MAPY]; //マップ座標 //・・・ BMPImgData(); ~BMPImgData(); }; 多次元とか宣言すると不安で不安で。 もしかして宣言ってメモリ確保しなければ全然処理重くならないですか? すげえ初歩ですが。
150 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 14:53:38 ] メモリを喰うのが嫌ならクラスを分けるか、 動的に確保するしかないかと
151 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 15:03:56 ] >>149 bmpAに不要なメンバを BMPImgData から除去して、BMPImgDataを継承した別クラスBMPImgData2にそのメンバを追加すれば? BMPImgData bmpA; BMPImgData2 bmpB; もちろん、クラス名は適切に。
152 名前:デフォルトの名無しさん [2008/03/16(日) 15:13:50 ] namespace AAA { void func() {} } class Hoge { friend void AAA::func(); }; とするとコンパイルできません。どうすればよいですか?
153 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 15:15:57 ] >>152 >どうすればよいですか? コンパイルエラーのメッセージを書く。 そのメッセージについて>>152 が何を考えて、何が分からないのかを書く。 エラーメッセージの内容を調べて無いなら、調べてから出直し。
154 名前:149 mailto:sage [2008/03/16(日) 16:02:00 ] >>150-151 ありがとうございます。^^
155 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 16:02:38 ] >^^ むかつくからやめろ
156 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 16:11:29 ] ^^;
157 名前:デフォルトの名無しさん [2008/03/16(日) 16:20:40 ] --;
158 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 16:54:21 ] (;:. @u@)
159 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 18:08:37 ] vectorやらlistを使用する際 コンストラクタで指定した長さ以上の要素を食わせるとどうなるのでしょうか?
160 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 18:09:22 ] >>159 「食わせる」って何?
161 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 18:10:32 ] ああ、すいません 要素数20のlistに21個目の要素を追加しようとするとどうなるのかなぁと
162 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 18:11:03 ] int型の変数をchar型の配列にするにはどうすればいいのでしょうか?
163 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 18:13:13 ] >>161 そりゃ、追加されるんだろ。
164 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 18:15:17 ] >>161 STLのコンテナは、追加はいくらでもやってよい。 コンストラクタで要素数を指定するのは、 あらかじめメモリを確保しておくことで、後から再確保するのを防ぐ、単なる最適化に過ぎない。
165 名前:164 mailto:sage [2008/03/16(日) 18:17:49 ] すまん、reserveと勘違いした。 コンストラクタで指定した要素数は、ちゃんと要素が追加されるよな。
166 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 18:21:25 ] v[20] = 1; とかで追加した気になってるかもしれないから 「追加」 の定義をきちんと聞いておいた方がいいぜ。
167 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 18:26:50 ] >>166 それは既存要素に対する代入だろ。sizeには反映されない。 下手したらコンテナの整合性を壊す。 て、>>166 は言いたいんだと思う。
168 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 19:11:13 ] >>162 やりたいことをもっと明確に説明しないと回答のしようが無い。 たとえば12345という値を持つint型変数があったとして、どのような状態のchar配列が欲しいんだ?
169 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 19:32:59 ] >>162 int型をchar型の要素数4(とは限らんが)の配列として扱うの? それなら共用体になるが
170 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 19:45:07 ] ありがとうございます 共用体しらべてみます
171 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 20:19:59 ] >>170 エンディアンには気をつけてな どうせsprintfとかいうオチだとは思うが
172 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:21:29 ] www.imgup.org/iup575962.jpg.html ・・・VISUAL C++というソフトを使っていたら突然こうなりました OSはVISTAで、これ以降いくらプロジェクトを作成しようとも、どうやら自動生成されるファイルが欠落しているようです アンインストール、再インストールも試しましたが無駄でした、当然管理者権限もです。 どうすればいいでしょうか?
173 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:32:10 ] メッセージのファイルはあったか?あったらそれを直接クリックしてみな。
174 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:36:03 ] >>173 なかったです、正常動作している友人のプロジェクトフォルダを丸ごとZIPで送ってもらったら DEBUGフォルダがありましたが、自分のほうでは生成されなくなってました
175 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:38:59 ] ウイルス・・・じゃないよな? 今までは正常に実行できてたんだよな?
176 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:48:51 ] ないってことは、コンパイルされた結果のファイルが無いんだな。 リビルドして、出力ウインドウにエラーメッセージがないか確認するべし。 プロジェクトのプロパティーページのリンクの項の出力ファイルのパスを確認しよう。その友人のプロジェクトが絶対パスになってないか?
177 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:51:08 ] VC2005 って Vista に対応してたっけ?
178 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:57:08 ] Vista対応パッチがあるという話は聞いたゾ。俺Xpだからよくわかんね
179 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:57:50 ] >>176 // test.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { return 0; } これに int main(void) { return 0;} これを書き足してリビルドしたら 1>------ すべてのリビルド開始: プロジェクト: test, 構成: Debug Win32 ------ 1>プロジェクト 'test'、構成 'Debug|Win32' の中間出力ファイルを削除しています。 1>コンパイルしています... 1>stdafx.cpp 1>test.cpp 1>コードを生成中... 1>マニフェストをリソースにコンパイルしています... 1>リンクしています... 1>LINK : 前回のインクリメンタル リンクで C:\Users\owner\Desktop\Documents\Visual Studio 2005\Projects\test\Debug\test.exe が見つからなかったか、ビルドされませんでした。フル リンクを行います。 1>LINK : warning LNK4067: エントリ ポイントがあいまいです。'mainCRTStartup' が選択されます。 1>マニフェストを埋め込んでいます... 1>ビルドログは "file://c:\Users\owner\Desktop\Documents\Visual Studio 2005\Projects\test\test\Debug\BuildLog.htm" に保存されました。 1>test - エラー 0、警告 1 ========== すべてリビルド: 1 正常終了、0 失敗、0 スキップ ========== で、ぱっとみは何とかなったみたいです 再度printfをためしてみます 一旦ありです
180 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 00:01:22 ] えー
181 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 00:04:13 ] mainは一個でいいです。どちらか一方だけにしましょう。
182 名前:デフォルトの名無しさん [2008/03/17(月) 04:09:01 ] イテレータを循環に、ってできるのですか?
183 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 04:26:18 ] 演算子オーバーロードすればできるんじゃね?
184 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 07:29:05 ] 自分でイテレータを作れば。
185 名前:デフォルトの名無しさん [2008/03/17(月) 09:09:35 ] >>183-184 自分でイテレータってつくれるんですか? あと、演算子のオーバーロードでできるんでしょうか?
186 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 09:11:19 ] できるっていってるじゃない。
187 名前:デフォルトの名無しさん [2008/03/17(月) 10:44:58 ] >>186 もうちょっとだけ具体的に言ってみてよ。
188 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:54:37 ] >>187 何を?
189 名前:デフォルトの名無しさん [2008/03/17(月) 11:09:18 ] 独自イテレータのつ•く•り•か•た
190 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 11:13:53 ] 質問すればいいじゃん
191 名前:デフォルトの名無しさん [2008/03/17(月) 11:16:27 ] ググッたけどわかりませんでした。
192 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 11:33:44 ] class iterator {}; できあがり。 これ以上具体的な回答は、質問が具体的でない限りあり得ない。
193 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 13:03:46 ] ありえないのはオマエの禿頭
194 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 13:19:10 ] ムキになるなよw
195 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 13:27:01 ] ムケてるのはオマエの禿頭
196 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 13:41:30 ] ムケてないのか…
197 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 14:24:11 ] 包茎で無能じゃ救いようがないよ・・・
198 名前:デフォルトの名無しさん [2008/03/17(月) 14:39:59 ] 包茎で無能だけど禿げてはいないぞ(怒)
199 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 15:12:57 ] しまった……全部に当てはまる……。
200 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 15:35:27 ] 包茎で禿げてるから、無能と呼ばれないように頑張るわ……
201 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 20:56:53 ] 包茎で禿で不能です
202 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 21:45:45 ] operator==とかの引数の対称性って手動で保守するしかないんですか? こういうやつ↓ bool operator==(const A& lhs, const B& rhs) {...} bool operator==(const B& lhs, const A& rhs) // これを自動化したい { return rhs == lhs; }
203 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 21:52:23 ] boost
204 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 21:52:26 ] >>202 Boost.Operatorsにまとめられている。 その例だと、Aがequality_comparable<A, B>を継承して、 operator==(const A& lhs, const B& rhs)を定義すれば、 operator==(const B& lhs, const A& rhs)とoperator !=が作られる。
205 名前:デフォルトの名無しさん [2008/03/17(月) 22:56:40 ] 大体の人はよく使う関数などをまとめた個人用ライブラリを作ってると思うのですが どのように管理しているんでしょうか? * mylib/*.{h,c} と一つのディレクトリにヘッダとソース。 * mylib/include/*.h,mylib/src/*.c で mylib/lib/libmylib.a とか。 普通のライブラリ風に。 で使うときにはどうしてます? * mylib ごとコピーして? * mylib/include/ とかにパスを通してる。で -lmylib どうすると楽なのか悩んでます。
206 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 22:59:48 ] 不良債権が流行った頃 護送船団とか何とか叩いておいてアメリカがこの様なわけだが
207 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 22:59:54 ] >>205 コンパイラオプション (多分 -I) + makefile
208 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 23:44:55 ] クラスAがあり、クラスBがクラスAのインスタンスのポインタpを持っている形のプログラムがあります。 クラスAにはchar変数textがあり、クラスBからsprintf(p->text, "test");を実行します。 この時エラーが起きてプログラムが強制終了するのですが、何かおかしな手順を踏んでいるのでしょうか?
209 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 23:47:16 ] if文とfor文だけで一次元配列を大きい順にソートしたいんですけど 自分の力量では出来ませんでした。 やり方を教えてください。
210 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 23:50:39 ] >>208 クラス定義を貼れ
211 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 23:56:47 ] >>209 ソートでググれ。
212 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:08:51 ] >>210 クラス定義はしてあります。
213 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:11:05 ] ぬう。言葉が通じない
214 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:12:11 ] >>208 ・pがAのインスタンスを指していない。 ・pが指しているAのインスタンスはすでに死んでいる。 ・A::textが5byteに満たない。 ・sprintfの前までに何かメモリを壊している。 ・その他 この中のどれなのか判定してやるから、ソースを貼れと言ってるの
215 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:15:58 ] 意味をはき違えました。 コードが非常に長いので今編集しています。
216 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:29:58 ] class Task { public: void Add(Task *obj, LPCSTR name);//インスタンスを登録する関数です。 Task* Find(char *name);//インスタンスのポインタを返す関数です。 void Do();//登録されたインスタンスのExec();を実行 protected: virtual void Exec(); } class Font : public Task { public: char text[10]; protected: void Exec(){ cout << text << endl; } } class Edit : public Task { public: Init(){ font=(Font*)Find("font"); } void setFont(){ sprintf(font->text, "text"); } private: Font *font; protected: void Exec(){ setFont(); } }
217 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:30:21 ] main() { Task task; task.Add(new Font(), "font"); task.Add(new Edit(), "edit"); while(true) task.Do(); } 色々大量に省きましたが大体こんな感じです。
218 名前:208 mailto:sage [2008/03/18(火) 00:33:47 ] すいません、自己解決しました。
219 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:37:07 ] EditのInit()はどこで呼ばれてんの
220 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:41:22 ] >>205 これ俺も気になる。なかなか話題にもならないし、ぐぐっても出てこないし、 みんなどうしてるって疑問は昔からあった 俺は mylib/include、mylib/source、mylb/lib にして、 include、lib にパスを通す派
221 名前:208 mailto:sage [2008/03/18(火) 00:45:27 ] >>219 Add内に実行する部分があるのでそこで実行されてます。 上のだと省いてます。 インスタンスの登録順序のせいでポインタが格納できていないのが問題でした。
222 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:51:13 ] >>220 コピーしたら元を変更したときにコピーした数だけ更新してまわらないといけないだろ。 ディレクトリ分けてパス指定するのが当然だから、話題にもならないんじゃない?
223 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:55:36 ] Visual C++で FileInfo^ fi = gcnew FileInfo(filename); __int64 size = fi->Length; のように取得したファイルサイズを32bitに変換し、さらにリトルエンディアンに変換した後、 バイナリでファイルに書き出したいのですが、何か良い方法はありますか?
224 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:00:11 ] >>223 c++/cliは別スレで。
225 名前:208 mailto:sage [2008/03/18(火) 01:01:47 ] 文字列代入でつまりました。 LPTSTR text; _stprintf(text, "text"); これでエラーが起こるのですが、正しくはどうすればいいのでしょうか?
226 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:02:01 ] >209 とりあえず速度とか、プログラムらしさというのを全く気にしなくて良いなら(勉強の一貫なら) 一度、数字の書いたカードを手作業で並べ替えてみるといいかもしれない。 そのときの手順を1つ1つメモしていくんだ。
227 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:04:09 ] >>225 text はどこを指しているのか。
228 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:04:26 ] >>223 VC++なら、x86だから元々リトルエンディアンですが。 つーか、下位バイトから順番に出力すればいいのでは?
229 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:07:32 ] >>226 やってみます・・・
230 名前:208 mailto:sage [2008/03/18(火) 01:08:08 ] >>227 ありがとうございました。 TCHAR関係すべて勘違いしていました。
231 名前:202 mailto:sage [2008/03/18(火) 01:30:50 ] >>203 ,204 レスthx いろいろなoperatorを定義する時に便利そうですね。 でも、operator==だけを見ると、あまり便利に感じないです。 // Hoge.cpp #include "A.h" #include "B.h" bool operator==(const A& lhs, const B& rhs) {...} というのを考えていたので、Aに修正を加えないといけないのがちょっと・・(Bはそのままというのも気になる)。 普通に定義することにします。
232 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:07:56 ] 209です。ググったりしたのですが難しいです。 よろしければ手直ししていただけませんか。Visual C++ 6.0です。 int hairetu(int jun[N]){ int max,j,k,retu[N],jun2[N]; for(j=0;j<N;j++){ jun2[j]=jun[j]; } for(k=0;k<N;k++){ for(j=0;j<N;j++){ if(max<jun[j]) max=jun[j]; jun[j]=jun2[k]; } retu[k]=max; max=retu[k]; } for(j=0;j<N;j++){ jun[j]=retu[j]; } return(jun[N]); }
233 名前:デフォルトの名無しさん [2008/03/18(火) 02:12:58 ] 開発環境はVS6、コードはANSIです。 _msize()ってmalloc()やrealloc()などで 指定したメモリサイズを返すと思ってましたが、 つなげるランタイムライブラリによって変わるのですか? 現状でコンパイルオプション「コード生成」の「使用するランタイムライブラリ」を 「シングルスレッド(デバッグ)」にすると指定したサイズ、 「シングルスレッド」にすると指定したサイズから直近の16の倍数値が返ってきます。 これってC言語をする人にとって知ってて当たり前のことなんですか? それともオプションで調整できることなんですか?
234 名前:205 [2008/03/18(火) 02:17:24 ] >>207 ,220 やっぱりそういう感じになるんですかね。 >>222 そう思ったんですけど頻繁に mylib は更新されて少し前に書いたものが コンパイル通らなくなったりして結局使ってる側を修正しないといけなかったりで… どうするといい感じに管理できるのかなぁと。
235 名前:208 mailto:sage [2008/03/18(火) 02:17:32 ] >>232 バブルソートでググってみ。 選択ソート、挿入ソートでもOK。 それでダメなら、並び変えるときに自分がどういう手順を追っているか考えてみ。 10 8 3 5 7 1 6 2 4 9 ↓ 1 2 3 4 5 6 7 8 9 10 1つずつ動かして、その手順を元にコード起こす。
236 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:19:42 ] >>232 とりあえず要素5つくらいの配列を考えて、そのプログラムを動かすと配列の要素がどう変わっていくかを 紙の上で1ステップずつ書き出してみな。 ・勉強したアルゴリズムの通りに並んでいかないなら、プログラムのロジックが間違っている。 ・ググって調べたアルゴリズムがまだ理解できていないなら、まずはそれを理解するとこ。 アルゴリズムの説明が欲しいなら、どこか適切なスレへ。 ・自分で書いたプログラムがどういう動作になるのかを追えないなら、勉強不足。 C言語の仕様的に分からないことがあるなら、また質問してみれば?
237 名前:デフォルトの名無しさん [2008/03/18(火) 02:24:24 ] >>232 qsort()じゃだめなんですか? 勉強の為にソートロジック作るなら クイックソートやマージソートやバブルソートなどで検索すればコードがでてくると思いますよ。 参考までに一番単純なバブルソートの例を void bubble_sort(int a[], int n) { int i, j, t; for (i=0; i<n-1; i++) { for (j=n-1; j>i; j--) { if (a[j-1] > a[j]) { t = a[j]; a[j] = a[j-1]; a[j-1] = t; } } } }
238 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:27:32 ] >>233 _msize()ってANSIじゃないでしょ。
239 名前:デフォルトの名無しさん [2008/03/18(火) 02:30:14 ] >>238 う・・・だったみたいですね。 Win32APIやMFCでなくコンソールアプリケーションで作成に訂正です。
240 名前:233 [2008/03/18(火) 02:33:14 ] long lGetSize = 0; char *pcDat = NULL; pcDat = realloc(NULL, 1); lGetSize = _msize(pcDat); printf("1 = %ld\n", lGetSize); → シングルスレッド(デバッグ)での結果=1 → シングルスレッドでの結果=16 pcDat = realloc(NULL, 13); lGetSize = _msize(pcDat); free(pcDat); printf("13 = %ld\n", lGetSize); → シングルスレッド(デバッグ)での結果=13 → シングルスレッドでの結果=16 pcDat = realloc(NULL, 17); lGetSize = _msize(pcDat); free(pcDat); printf("17 = %ld\n", lGetSize); → シングルスレッド(デバッグ)での結果=17 → シングルスレッドでの結果=32 って具合です。
241 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:34:05 ] >>235-237 ありがとうございます。 qsortも使い方が分からないのでとにかくif文とfor文でやることにしていました。 >>237 さんのバブルソートの例を見ながら組み上げたいと思います。
242 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:40:20 ] >>240 _msizeの動作は詳しく無いから想像だけど…。 リリース版では効率化のために1とか13とか中途半端なバイト数で確保せずに、16バイト単位で領域の割り当てをするけど デバッグ版ではデバッグしやすいように指定したバイト丁度を割り当てているのでは? (実際には管理領域やメモリ破壊検知などのためにもっと余分に割り当てているだろうけど。)
243 名前:233 [2008/03/18(火) 02:52:02 ] >>242 確かにこの現象が判明したのはリリースでのコンパイルですが、 デバッグで「使用するランタイムライブラリ」を「シングルスレッド」に変えるだけでも同じ現象になるのです。 これはもうランタイムライブラリの仕様としか言いようがないのでしょうか? 同じコードなのに違う動作をするというのはどうも納得いかないのです。 (オプション変更によってコンパイルorリンクエラーになるならまだわかりますが・・・) これがC言語をする人にとって周知の事なら自分の知識不足として納得しようかと思い書き込みましたw
244 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 03:07:25 ] >>243 MSDNによれば >ヒープに割り当てられたメモリ ブロックのサイズを返します。 と書いてある。 あくまで「割り当てられたサイズ」であり、これは「要求したサイズ」とは必ずしも一致しない。 >同じコードなのに違う動作をするというのはどうも納得いかないのです。 ランタイムライブラリに依存する処理なのだから、リンクするランタイムライブラリが異なれば 結果が異なることは特に不自然ではないと思う。 >これがC言語をする人にとって周知の事なら自分の知識不足として納得しようかと思い書き込みましたw すでに出ていることだけど _msizeはANSIの標準ではなく MS固有のAPIでしかないのだから、 C言語をする人にとって周知の事というわけではない。
245 名前:233 [2008/03/18(火) 03:20:59 ] >>244 言ってることはわかるのですが、 それならデバッグ用のランタイムの動作はデバッグなしのランタイムとあわせるべきじゃないかと思いますね。 例えば、デバッグでステップ実行で確認したのにデバッグ外すと動作変わるなら、デバッグの意味ないですよね。 とりあえず周知でないこととオプションで対応できるようなことでないのはわかりました。
246 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 03:35:54 ] >>245 つ msdn2.microsoft.com/ja-jp/library/974tc9t1 (VS.80).aspx
247 名前:デフォルトの名無しさん [2008/03/18(火) 06:05:02 ] 下のプログラムは ファイル名を入力させて 検索文字列を入力して 「該当ファイルの検索文字列を含む行を全て表示するプログラム」です しかしながら実行すると下のコードの getlineがすっとばされてしまい こちらから検索文字列の入力を行うことができません なぜですか?
248 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 06:05:33 ] #include <iostream> #include <string> #include <vector> #include <fstream> using namespace std; int main() { string s; vector<string> v; cout << "Input filename" << "\n"; cin >> s; ifstream in(s.c_str()); while(getline(in,s)) v.push_back(s); cout << "検索文字列"; //↓の入力がすっとばされてしまう getline(cin,s); for(vector<string>::size_type i = 0;i < v.size();i++){ if(v[i].find(s) != string::npos) cout << i << ":" << v[i] << "\n"; } return 0; }
249 名前:247 mailto:sage [2008/03/18(火) 06:12:54 ] 環境はcygwinを使っています
250 名前:sage [2008/03/18(火) 06:49:59 ] getlineの定義は istream &getline( char *バッファ, streamsize 文字数 ); istream &getline( char *バッファ, streamsize 文字数, char 境界文字 ); ですよね cin.getline(s,MAXSIZE) にしたらだめでしょうか
251 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 06:55:30 ] ファイル名で入力した際に入ってきた改行文字が残っているんではないですか getline(cin,s) の前に cin.ignore(); で一文字削ってみては
252 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 07:31:29 ] >>244 の補足になるけど、malloc/calloc/reallocも 標準では、指定された大きさ「以上」のメモリを確保するとなっていて、 ぴったりちょうどの大きさを割り当てなければならないという決まりはない。
253 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 07:48:32 ] >>245 そもそも_msize()==(要求サイズ)という条件に依存しようとすることが間違い。 >>244 にあるとおり、この条件が常に成立するなどとは、MSは言っていないはず。 処理系依存ってやつ。
254 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 09:20:07 ] >>245 > 例えば、デバッグでステップ実行で確認したのにデバッグ外す > と動作変わるなら、デバッグの意味ないですよね。 デバッグビルドでデバッグし易いようにコードが変わるのは、よくある こと。デバッグビルドとリリースビルドで動作に違いがないなら、デバッ グビルドの意味ないじゃん。
255 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 11:58:02 ] デバッグビルドだとちゃんと動くけどリリースビルドにすると落ちるとか言うのはよくあるよな。 たいていは初期化不足だけど。
256 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 14:35:41 ] >デバッグの意味ないですよね あるよ。 デバッグビルドとリリースビルドの違いで困るプログラムは、 まずいプログラムだから、それを自覚することが出来る。
257 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 17:33:21 ] C言語とか意味わかんね 柴田望洋ってどうなの?
258 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 17:50:42 ] 柴田望洋についての話に進める前にC言語を意味分かるようにする事の方が先決というか それを先にやらないと柴田望洋について話しても何も分からないと思うというか C言語すら分からないようじゃ柴田望洋についての話も分からんだろうというか それ以前に柴田望洋の話はマ板でやれ。
259 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 17:54:45 ] 1:#include <iostream> 2:#include <string> 3: 4://using namespace std; 4: 6:class Foo { 7:private: 8: std::string s; 9: 10:public: 11: string getValue ( void ) { return s; }; 12: void setValue ( const string s_in ) { s = s_in; }; 13:}; 14: 15:int main ( void ) { 16: Foo f; 17: f.setValue("abcd"); 18: std::cout << f.getValue() << std::endl; 19: return (0); 20:} これをコンパイルすると、次のメッセージが出てコンパイルエラーになってしまいます。 "foo2.cpp", 行 11: エラー: 型の名前が予期される位置に "string" があります. 4行目のusingステートメントを有効にするとコンパイルできます。 何が間違ってるのでしょうか? Cは経験あるのですが、C++はド素人で良く分かりません(T_T
260 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 17:57:53 ] 4,8,11行目を見て、何か気付かないか?
261 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 17:59:04 ] namespaceや名前空間でググれ
262 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 18:03:35 ] うわ、自分で書き込んだレスみたらすぐ分かったw エディタで見てるときはどうしても気付かなかったのに。 お目汚しすいませんでした・・・