■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part53
251 名前:デフォルトの名無しさん :2006/10/06(金) 00:32:35
>>250
まずはchar_traits<unsigned char>からなんだろうけど。
しかも、basic_string<>は仮想デストラクタを持ってないし、継承されることを
前提にしてない。

252 名前:デフォルトの名無しさん :2006/10/06(金) 00:37:46
>>250
UTF-8 を扱うのに std::string に何の不満がある?

253 名前:デフォルトの名無しさん :2006/10/06(金) 01:08:13
>>250
http://piza.2ch.net/tech/kako/967/967004691.html

254 名前:デフォルトの名無しさん :2006/10/06(金) 01:19:35
typedef std::basic_string<unsigned char> ustring;で十分な気がする。
char_traits も特に特殊化する必要があるものはないと思う。
後はwstringとの変換をする関数を作れば十分だろ。


255 名前:デフォルトの名無しさん :2006/10/06(金) 01:23:06
>>251
private継承して公開するメンバをusingすれば安全じゃね?
面倒だけど。

256 名前:デフォルトの名無しさん :2006/10/06(金) 08:01:25
private継承使うならコンポジションも考えよう

257 名前:デフォルトの名無しさん :2006/10/06(金) 08:28:24
コンポジションってなに?
private メンバとして持てばいいじゃないってこと?

258 名前:デフォルトの名無しさん :2006/10/06(金) 22:48:14
そう。包含ってやつだ
クラス間にis-a関係が成立しないなら
なるべくそうした方がいいらしいぞ

259 名前:デフォルトの名無しさん :2006/10/07(土) 09:00:47
重〜い計算ソフトの2次元版と3次元版を並行して作っており、
悩んでいることがあります。

例えば、2次元版で、
for (Vec2D vec(0, 0); vec[0] < maxVec[0]; vec[0]++)
{
 for (vec[1] = 0; vec[1] < maxVec[1]; vec[1]++)
 {
  foo(vec);
 }
}

であった箇所が、3次元版では
for (Vec3D vec(0, 0); vec[0] < maxVec[0]; vec[0]++)
{
 for (vec[1] = 0; vec[1] < maxVec[1]; vec[1]++)
 {
  for (vec[2] = 0; vec[2] < maxVec[2]; vec[2]++)
  {
   foo(vec);
  }
 }
}

となります。
できれば、2D/3Dのソースの2元管理はしたくないし、
大量の #ifdef をソース中にばら撒くこともしたくありません。

ループの深さの違いをうまく吸収して、
2D/3Dを共用するアイデアはないでしょうか?
(元々、巨大な計算なのでパフォーマンスに影響は与えたくありません)


260 名前:デフォルトの名無しさん :2006/10/07(土) 09:16:45
blitz++とかあるでしょ。
http://www.oonumerics.org/blitz/

> vec[0] < maxVec[0]; vec[0]++

とかやばすぎ

261 名前:(^-^) ◆MONSOON/qo :2006/10/07(土) 09:50:30
計算量の多いところ(3D)を高速化すれば2Dはそれに含まれそれ以下の速度

262 名前:(^-^) ◆MONSOON/qo :2006/10/07(土) 09:56:22
回転とかだったら一度に全部が動くわけではないんだから結局は一次元とかに分割されるでしょ

263 名前:デフォルトの名無しさん :2006/10/07(土) 09:58:36
  for (vec[2] = 0; vec[2] < maxVec[2]; vec[2]++)
  {
   foo(vec);
  }

だけくくり出してテンプレにでもしたらいいべや


264 名前:デフォルトの名無しさん :2006/10/07(土) 11:27:50
>>254
typedef std::basic_string<unsigned char> ustring;
で十分なんだろうけど
operator<<とかこのへんは最低限実装しないとダメだよね?



265 名前:デフォルトの名無しさん :2006/10/07(土) 14:00:13
java.util.concurrent にあるような「待機状態のない」FIFOキューの
C++での実装って、どこかにない?

266 名前:デフォルトの名無しさん :2006/10/07(土) 14:02:23
>>259 です。アドバイスありがとうございます。

>>260 問題依存のメンバー関数があったりするので blitz++ の利用は
見送りました。
それから、ご指摘の箇所がヤバイ理由はよくわからないのですが...

>>261 2Dでも十分遅いので...(涙)

>>262 最内ループの部分は、行数も含めて可変ですので template 化は
困難かと...


267 名前:デフォルトの名無しさん :2006/10/07(土) 14:05:53
引き続き >>259 です。
>>262
class abstract
{
 virtual bool Scan() = 0;
}
class VecXD: public abstractVec
{
 bool Scan();
}
あるいは、
class PolicyXD{ ... }

teplate<typename DimPolicy> Vec: public DimPolicy
{
 bool Scan();
}
と定義しておいて、
while(vec.Scan())
{
 foo(vec);
}
て感じでしょうか?
virtual を使いたくないし、後者もfor ループではなくなると、
無駄なコードが出力されるような予感がします。


268 名前:デフォルトの名無しさん :2006/10/07(土) 14:31:43
template<int I>
struct Loop{
template<class T>
void calc(T& vec){
for(vec[I]=0; vec[I] < maxVec[I}; vec[i]++){
Loop<I-1>::calc(vec);
}
}
};

template<>
struct Loop<0>{
template<class T>
void calc(T& vec){
foo(vec);
}
};

Vec3D vec;
Loop<3>::calc(vec);

269 名前:デフォルトの名無しさん :2006/10/07(土) 14:33:04
<<245
template<typename T> class Test
{
public:
 Test()
 {
  Val_[0] = 100;
  Val_[1] = 1000;
 }

 T GetVal() { return Val_[0]; }
private:
 T Val_[2];
};


270 名前:デフォルトの名無しさん :2006/10/07(土) 14:35:34
(続き)
template<> double Test<double>::GetVal()
{
 return Val_[1];
}
としておいて
 Test<int> testInt;
 Test<double> testDouble;

 std::cout << "Int: " << testInt.GetVal()
  << " Double: " << testDouble.GetVal() << "\n";

とやったら、Int: 100 Double: 1000 とでましたが

271 名前:デフォルトの名無しさん :2006/10/07(土) 14:38:42
>>265
std::queue

272 名前:デフォルトの名無しさん :2006/10/07(土) 15:02:26
>>270
>とやったら、Int: 100 Double: 1000 とでましたが

で、だから何?

273 名前:デフォルトの名無しさん :2006/10/07(土) 15:49:44
>>270
もういい。くんな

274 名前:デフォルトの名無しさん :2006/10/07(土) 17:24:02
>>271
std:queue は順列コンテナSequenceを自分では実装していないし
デフォルトのSequenceであるdequeが「 「待機状態のない」FIFOキュー」だなんて話はきいたことがない。

275 名前:デフォルトの名無しさん :2006/10/07(土) 17:26:56
「待機状態のない」ってどういう事なの?

276 名前:デフォルトの名無しさん :2006/10/07(土) 17:48:32
マルチスレッドで排他なしでちゃんと動くってこと

277 名前:デフォルトの名無しさん :2006/10/07(土) 17:50:26
>>276
マルチスレッドを考慮していない現状の C++ 標準にそんなコンテナあるわけ無い。

何をどう考えたら、それが「待機状態のない」なんて表現になるんだ?

278 名前:デフォルトの名無しさん :2006/10/07(土) 17:52:48
>>277
誰が「C++標準」なんて言った?

279 名前:デフォルトの名無しさん :2006/10/07(土) 17:52:55
ググってみるとこんなのが出てきた。何かの訳語だね。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/concurrent/ConcurrentLinkedQueue.html

280 名前:デフォルトの名無しさん :2006/10/07(土) 17:52:55
http://www.google.co.jp/search?q=non-blocking+queue で頭のほうに出てくるPDFで
アルゴリズムは紹介されてる。既存の実装はないんかいな?

281 名前:デフォルトの名無しさん :2006/10/07(土) 17:57:26
Lock-free と同義?

282 名前:デフォルトの名無しさん :2006/10/07(土) 17:57:49
non-blocking ってことだしょ

283 名前:デフォルトの名無しさん :2006/10/07(土) 17:58:28
実際には、要素の追加だけはブロッキング不要で取り出しはブロックかかるはずだけど
まあそれはどうでもいいか。

284 名前:デフォルトの名無しさん :2006/10/07(土) 18:08:09
いやこっちだろ。
http://ja.wikipedia.org/wiki/Lock-free%E3%81%A8Wait-free%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0

285 名前:デフォルトの名無しさん :2006/10/07(土) 18:09:39
Lock-free や Wait-free アルゴリズムを作るには、CPUが専用のアトミックな命令を提供し、それを使う必要がある。最も重要なのは、「比較して交換」(Compare and swap, CASと省略する)である。

つーわけで C++だけではこの機能は実装できない。

286 名前:デフォルトの名無しさん :2006/10/07(土) 18:13:23
http://www.audiomulch.com/~rossb/code/lockfree/
ここの "Existing source code and libraries" で、
都合のいい実装が見つかるかもしれない。

287 名前:デフォルトの名無しさん :2006/10/07(土) 18:53:24
CPU、コンパイラ別のアトミックな命令の使用例は
boost::shared_ptr の参照カウンタで使われてるのが参考になると思う。

288 名前:デフォルトの名無しさん :2006/10/07(土) 20:27:44
LinuxとFreeBSDはカーネル読めばそこそこ悩めば実装できると思うよ

289 名前:デフォルトの名無しさん :2006/10/07(土) 21:25:47
Google Code of Summer で Lock-free Container のプロジェクト提案されてたなぁ
結局誰も取らなかったのかな,あれ

290 名前:デフォルトの名無しさん :2006/10/07(土) 21:26:26
>289
>Google Code of Summer
間違えた. Google Summer of Code だ

291 名前:デフォルトの名無しさん :2006/10/07(土) 22:07:19
標準とやらをすぐに持ち出す規格厨ばっかでマジツマンネーな

292 名前:デフォルトの名無しさん :2006/10/07(土) 22:14:41
それがこのスレのいいところ

293 名前:デフォルトの名無しさん :2006/10/07(土) 23:51:45
時々規格厨の人につっこんでもらわないと、普段使ってる実装の挙動だけで脳内完結しちまうしな。
モヒカン乙というか。

294 名前:デフォルトの名無しさん :2006/10/08(日) 00:33:37
このスレはC++規格票の人力検索エンジンです

295 名前:デフォルトの名無しさん :2006/10/08(日) 00:35:49
適当なこと言ったり軽く煽ったりすると、規格を引用してくれるから便利だよねw

296 名前:デフォルトの名無しさん :2006/10/08(日) 00:36:39
たまに>>277 みたいな人の話を聞かずにレスするバカもいるけどな。

297 名前:デフォルトの名無しさん :2006/10/08(日) 01:42:54
質問よろしいでしょうか……
クラス内クラスのアクセス制御て、クラス内クラスのメンバのアクセス制御には
影響しないんだっけ? とりあえずVC++ 8.0では通ったみたい。

class A {
private:
 class B {
 public:
  void test() { std::cout << "test" << std::endl; };
 };
 B b_;
public:
 B& b() { return b_; };
};

int main()
{
 A a;
 a.b().test(); // ok?
  A::B b(a.b()); //NG
}

298 名前:デフォルトの名無しさん :2006/10/08(日) 01:55:29
>>297
影響しないよ。下は VC8 でも NG なんだよね?

299 名前:デフォルトの名無しさん :2006/10/08(日) 01:55:32
>>297
そりゃVC8のバグだ。

300 名前:デフォルトの名無しさん :2006/10/08(日) 01:56:19
>>297
あ、下はNGなのか。それでいい。

301 名前:デフォルトの名無しさん :2006/10/08(日) 02:01:06
何が問題なのか理解するまで30秒かかった。

なんだこりゃwこれ通っちまうのか、VC。見損なったわ!

302 名前:デフォルトの名無しさん :2006/10/08(日) 02:08:09
>>301
は?何いってんの?正しい動作だろ

303 名前:297 :2006/10/08(日) 02:12:33
>298
そうか、OKなのか。サンクス
何かおもしろいことできそうかな……と思ったけど、
 delete &(a.b());
が通っちまうのね……

 class B {
  ~B() {};
  friend A;
 public:
  void test() { std::cout << "test" << std::endl; };
 };
とすりゃいいけど、これはこれで面倒か……



304 名前:デフォルトの名無しさん :2006/10/08(日) 02:14:47
俺は関数定義の } の後に ; つける奴は信用しない。

305 名前:デフォルトの名無しさん :2006/10/08(日) 02:19:10
いくらprivateにしても、参照を返したら何にもならんだろ。

306 名前:デフォルトの名無しさん :2006/10/08(日) 07:51:20
>>297
ややこしいこと書いているが、
> A::B b(a.b()); //NG
< A::B x; //NG
の時点で駄目だぞ。


307 名前:デフォルトの名無しさん :2006/10/08(日) 10:33:58
>>306
読解力0のクズは氏ね。去れ。

308 名前:デフォルトの名無しさん :2006/10/08(日) 10:56:14
>299 >301 >306
ごめん。誤解しちまったか……
  A::B b(a.b()); //NG
自体はコンパイル通らんです。コメントアウトしとけばよかったな。

>305
確かにそうか。

カスタマイズポイントに使えないかな?と思ったけど、よくよく考えたら
クラス内クラスの時点で継承できない(カスタマイズできない)よね……

309 名前:デフォルトの名無しさん :2006/10/08(日) 11:00:52
>>307
プッ

310 名前:デフォルトの名無しさん :2006/10/08(日) 11:38:20
ちょいと質問だが、
複数のテンプレート引き数を取るテンプレート関数の、一部引き数だけの特殊化ってできるんだろか。
例えば
template<typename T, int N>inline T factrial(T s = 1){return factrial<T, N - 1>(s * N);}
template<>T factrial<T, 1>(T s){return s;}
みたいなことがしたいんだけど。
template<>double factrial<double, 1>(double s){return s;}
これなら巧くいくんだけどね。

311 名前:デフォルトの名無しさん :2006/10/08(日) 11:51:35
できるよ。まぁ、コンパイラによるかもね。

312 名前:デフォルトの名無しさん :2006/10/08(日) 11:53:03
>>309
読解力0のクズは氏ね。去れ。

313 名前:310 :2006/10/08(日) 11:56:00
>>311
にえ〜、gcc@cygwinで通らない〜(TT

314 名前:デフォルトの名無しさん :2006/10/08(日) 12:00:16
>>311
なんで嘘をつくの?

315 名前:デフォルトの名無しさん :2006/10/08(日) 12:02:08
>310
>template<>T factrial<T, 1>(T s){return s;}
普通に特殊化しているように見えるけど……

template<T>T factrial<T, 1>(T s){return s;}
の間違い?


316 名前:310 :2006/10/08(日) 12:15:50
いや、それはTが未定義とエラーにされる。
TとNのうちNだけ特殊化ってのはできないのかねぇ。

317 名前:デフォルトの名無しさん :2006/10/08(日) 12:27:54
>>315
typenameが抜けてますよ。(これでもダメだけど)
template<typename T>T factrial<T, 1>(T s){return s;}

テンプレート関数の部分特殊化は禁止されてるはず。
テンプレート構造体ならなんとかなる。

template<typename T,int N>
struct factorial
{
T operator()(T s=1){return factorial<T,N-1>()(s*N);}
};

template<typename T>
struct factorial<T,1>
{
T operator()(T s){return s;}
};


318 名前:デフォルトの名無しさん :2006/10/08(日) 12:28:57
>>310
関数テンプレートは部分特殊化できない。
(関数テンプレートを部分特殊化できちゃう処理系があるかどうかは知らん)

クラステンプレートなら部分特殊化できるから、
実体はクラスにして入口だけ関数にする感じでがんばれ。


319 名前:315 :2006/10/08(日) 12:52:57
>317
指摘サンクス

>310
Exceptional C++ Styleにちょうどその話題が載ってるから、買って読んどけ

そういや、More Exceptional C++の邦訳は出ないのか……?

320 名前:デフォルトの名無しさん :2006/10/08(日) 13:29:26
D&Eには、関数テンプレートは部分特殊化はしてもいいかもしれないけど、
まだ良く分からないからやめてるんだと書いてあったはず。

頑張ってC++0xには入れてほしい。

321 名前:310 :2006/10/08(日) 14:13:47
>>317-319
レスTHX、本も探してみる。

で、結局、>317 ではTへのキャストオペレータがなくて巧くなかったのでこうなった。
関数版と名前がぶつかるのも回避。
#include <cstdio>
#include <cstdlib>

template <typename T> inline T factorial(const int n, const T s = 1) {return n <= 1 ? s : factorial(n - 1, s * n);}

template<typename T, const int N> struct Factorial {operator T() const {return Factorial<T, N - 1>() * N;}};
template<typename T>struct Factorial<T, 1> {operator T() const {return 1;}};

int main(int argc, char ** argv)
{
printf("%d\n", factorial<int>(atoi(argv[argc - 1])));
Factorial<double, 10> foo;
printf("%.20g\n", double(foo));
printf("%.20g\n", double(Factorial<double, 21>()));
return 0;
}
テンプレート引き数だと定数性が求められるから、末尾再帰じゃなくても大丈夫ってことですかね。

322 名前:デフォルトの名無しさん :2006/10/08(日) 14:32:42
Exceptional C++ Styleにまんま載ってるよ、それ
staticメンバ使ってたけどな


323 名前:デフォルトの名無しさん :2006/10/08(日) 16:55:05
質問です
C++でC言語ライクなスクリプト言語を作ろうとしているのですが
まずファイルを読み込み、string scriptに収納します。
次にscriptのコメント(/* */)を削除するのですが、
ここでbool DeleatComment(string &str);という自前の関数を使って
while(DeleatComment(script));と、コメントが全て消えるまでループさせるのですが
なぜかコメントが消えません。/*と*/が消えるだけなのです。
問題のDeleatCommentの部分は

bool DeleatComment(string &str){
 string::size_type com_begin = str.find_first_of("/*");
 if(com_begin != string::npos){
  string::size_type com_end = str.find_first_of("*/",com_begin);
  if(com_end != string::npos){
   str.erase(com_begin,com_end-com_begin+2);
   return true;
  }
 }
 return false;
}

こうなってます。

324 名前:デフォルトの名無しさん :2006/10/08(日) 16:56:13
英語勉強しな

325 名前:デフォルトの名無しさん :2006/10/08(日) 17:19:40
>>323
find_first_of() ではなくて find() だと思うそこは

326 名前:デフォルトの名無しさん :2006/10/08(日) 17:24:25
>>325
ありがとうございます!
なぜだかよく分かりませんが、findにしたら消えました

327 名前:デフォルトの名無しさん :2006/10/08(日) 17:25:34
>>324
どこかでdelatCommentを使っちゃったんだろ。
初心者はよくやる。察してやろうZE

328 名前:デフォルトの名無しさん :2006/10/08(日) 17:34:11
>>327
>324

329 名前:デフォルトの名無しさん :2006/10/08(日) 17:35:04
>>326
std::string::find_first_of(A, B)は文字列Aの中から
「文字列Bの中のどれか一文字が最初に見つかったindexを返す」
のでした
<algorithm>のstd::find_first_of()の説明を見るとなんとなくわかるかもしれない


330 名前:デフォルトの名無しさん :2006/10/08(日) 17:37:17
>>324
すみません、deleatではなくdeleteでしたね
今気づきました

331 名前:デフォルトの名無しさん :2006/10/08(日) 17:38:21
>>328
まじれすされた(^o^)

332 名前:デフォルトの名無しさん :2006/10/08(日) 17:40:06
>>329
ごめん俺が馬鹿
find_first_of(A, B)

A.find_first_of(B)
に置き換えてみると俺が救われます

333 名前:デフォルトの名無しさん :2006/10/09(月) 13:05:57
こんな意味不明な警告が出たんですけど、なんのことやらさっぱりです!

warning C4786: 'std::reverse_bidirectional_iterator<std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,
std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::iterator,std::basic_string<char,std::char_traits<char>,
std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,
std::allocator<char> > *,int>' : 識別子が '255' 文字に切り捨てられました (debug 情報内)。

list<string>を定義したら出たので、その辺の警告なんだと思いますが・・・

334 名前:デフォルトの名無しさん :2006/10/09(月) 13:07:08
日本語嫁

335 名前:デフォルトの名無しさん :2006/10/09(月) 13:07:51
超FAQ

336 名前:デフォルトの名無しさん :2006/10/09(月) 13:13:56
>>334
listの< >内が255文字以上あるということですか?

337 名前:デフォルトの名無しさん :2006/10/09(月) 13:17:28
>>336
違います。


338 名前:デフォルトの名無しさん :2006/10/09(月) 13:21:33
じゃあlist< >の中に同じSTLのstringとかstackとかが入るとまずいっていうことですか?

339 名前:デフォルトの名無しさん :2006/10/09(月) 13:25:27
http://www.google.co.jp/search?q=warning+C4786

340 名前:デフォルトの名無しさん :2006/10/09(月) 13:28:18
よくわからないので諦めます

341 名前:デフォルトの名無しさん :2006/10/09(月) 13:40:20
>>338
違います。
336の方が正解に近いな。

342 名前:デフォルトの名無しさん :2006/10/09(月) 13:41:53
>>333
俺にもさっぱりだが、
>339
を見る限り、
・VC++の環境依存っぽい
・キニスンナ
ということは解る。

343 名前:デフォルトの名無しさん :2006/10/09(月) 13:45:00
読売
北朝鮮が核実験を実施・・・朝鮮中央通信

産経
北朝鮮が核実験を実施

毎日
北朝鮮:中央通信「核実験行った」報じる プルトニウム型

日経
「核実験を実施」中央朝鮮通信


--------------------ここまで日本の新聞----------------------


朝日
北朝鮮「地下核実験に成功」

344 名前:デフォルトの名無しさん :2006/10/09(月) 13:52:15
さっさと核戦争始まらないものかねー

345 名前:デフォルトの名無しさん :2006/10/09(月) 14:42:40
>>344

俺らも被爆するぞ

346 名前:デフォルトの名無しさん :2006/10/09(月) 18:24:27
STLが多様してあると読みずらいよね?

347 名前:デフォルトの名無しさん :2006/10/09(月) 18:29:20
逆に読みやすいです

348 名前:デフォルトの名無しさん :2006/10/09(月) 18:38:48
std::だらけになってお願いしますusing使わせてくださいって
思うときはある

349 名前:デフォルトの名無しさん :2006/10/09(月) 18:58:46
>>348
上司に
「関数スコープ単位での"using namespace std;"は常識なんだよ」
って言うじゃない。
               ・
               ・
               ・
               ・
そしたら、あんたクビだからぁ〜〜。                 



350 名前:デフォルトの名無しさん :2006/10/09(月) 19:05:08
usingとusing namespaceは別物。

351 名前:(^-^) ◆MONSOON/qo :2006/10/09(月) 19:24:08
bsearchが正しい値を返さないのですがどこがいけないのかわかりますか?


N=100;
int *d = new int [N]; // dには適当な数値が入る
k=13421030;
q=(int *)bsearch(&k, d, N, 4, f);
x=(int)(q-d)+1; //サーチした番号


int f(const void *a, const void *b)
{return (*(const int *)a - *(const int *)b);}

352 名前:(^-^) ◆MONSOON/qo :2006/10/09(月) 19:26:28
あと、比較関数を

int f(const void *a, const void *b)
{return (*(const int *)b - *(const int *)a);}

に変更しても結果は同じになるんでしょうか?
別の番地が返ってくるのですが

353 名前:デフォルトの名無しさん :2006/10/09(月) 19:30:47
int [N]はちゃんとソートしてる?

354 名前:デフォルトの名無しさん :2006/10/09(月) 19:31:45
>>348
そういう時に export template<> だと実装側にusingが使いまくれて経済的

355 名前:(^-^) ◆MONSOON/qo :2006/10/09(月) 19:34:02
>>353
ばっちりしてあります 出力して確認済みです
実際にはN=57928730なんですが
数字が大きいと誤作動したりするんでしょうか

356 名前:デフォルトの名無しさん :2006/10/09(月) 19:39:07
んーnewした領域はたかだか220Mほどしかないし、誤動作するとすれば
もしかしたらsizeof(int) != 4の環境かねえ。

357 名前:デフォルトの名無しさん :2006/10/09(月) 19:41:58
>>351
C++なんだからlower_boundとか使えじゃ駄目?

358 名前:(^-^) ◆MONSOON/qo :2006/10/09(月) 19:44:41
>>356
駄目でした 4でした
どんな値でも、初めの200番代くらいまでの番号しか返してきません

>>357
つかってみます!

359 名前:デフォルトの名無しさん :2006/10/09(月) 19:45:01
例えばこれなんかちゃんと動作するよ。何か間違ってないか?

int main()
{
const int N = 100;
int* d = new int[N]; // dには適当な数値が入る
int k = 13421030;

std::fill(d, d + N / 2, 0);
d[N / 2] = k;
std::fill(d + N / 2 + 1, d + N, k + 1);

int* q = (int *)std::bsearch(&k, d, N, sizeof(int), f);
int x = (int)(q - d) + 1; //サーチした番号
std::cout << x << std::endl;
}

int f(const void *a, const void *b)
{
return *(const int *)a - *(const int *)b;
}

360 名前:デフォルトの名無しさん :2006/10/09(月) 19:47:23
レス番が飛んでる

361 名前:(^-^) ◆MONSOON/qo :2006/10/09(月) 19:55:22
>>359
10個や100個の連番で実験するとうまくいくのですが本番では失敗します
ちゃんとソートされているかどうかをプログラムで確認してみます

362 名前:デフォルトの名無しさん :2006/10/09(月) 19:56:57
>>361
んだね。std::qsortとかstd::sortの呼び出し方が間違っているのかもしれん。

363 名前:(^-^) ◆MONSOON/qo :2006/10/09(月) 21:04:01
>>362
原因解明しますた 358にヒントがありました
xがunsigned char型だったのを忘れてしまっていたようです

364 名前:デフォルトの名無しさん :2006/10/09(月) 21:39:36
そりゃ255までしか……って、何故そんなところにunsigned charなぞ使うw

365 名前:デフォルトの名無しさん :2006/10/09(月) 21:45:13
最初っからコンパイルできるソースを貼れってことだな。

366 名前:デフォルトの名無しさん :2006/10/09(月) 22:09:19
('A`)

367 名前:デフォルトの名無しさん :2006/10/09(月) 22:13:49
(´ω`)

368 名前:デフォルトの名無しさん :2006/10/09(月) 22:16:04
さすがにそこまでエスパーレスは出来なかったわ。

369 名前:デフォルトの名無しさん :2006/10/09(月) 22:27:54
誰か比較関数の整数オーバーフローについてつっこんでやれよ。

370 名前:デフォルトの名無しさん :2006/10/09(月) 22:31:21
>>369 なにそれ?わかんない。

371 名前:デフォルトの名無しさん :2006/10/09(月) 23:14:02
>>370
あの比較関数だと a と b が取り得る全範囲の数値の組み合わせの中で
約半数の組み合わせで比較関数が期待されるのとは逆の結果を返すだろ。

372 名前:デフォルトの名無しさん :2006/10/09(月) 23:16:19
ifもしくは?:演算子で分岐か。

373 名前:デフォルトの名無しさん :2006/10/09(月) 23:18:19
switch〜caseで行ってみよう〜

374 名前:デフォルトの名無しさん :2006/10/11(水) 20:54:23
C++ のソースコードのカバレージを測定するフリーのツールってありますぅ?

375 名前:デフォルトの名無しさん :2006/10/11(水) 23:59:34
スレ違い

376 名前:デフォルトの名無しさん :2006/10/12(木) 00:00:09
ソースコードのカバレッジってなんだろう?
テストのカバレッジならわかるんだが。

377 名前:デフォルトの名無しさん :2006/10/12(木) 00:27:27
>>376
PureCoverageみたいなやつのことでしょ?

378 名前:デフォルトの名無しさん :2006/10/12(木) 01:24:20
カバチャン

379 名前:デフォルトの名無しさん :2006/10/12(木) 03:18:30
誰がカバやねん!

380 名前:デフォルトの名無しさん :2006/10/12(木) 05:22:54
ファイル分割し、それぞれのソースである1つのクラスを使用したいのですが、
オブジェクトの生成を何処ですればいいのでしょうか?

381 名前:デフォルトの名無しさん :2006/10/12(木) 05:27:38
>>380 好きにしろ。

382 名前:デフォルトの名無しさん :2006/10/12(木) 06:00:23
データでかくないなら、起動時がオススメ

383 名前:380 :2006/10/12(木) 06:25:00
>>381
>>382
レスサンクスです!質問の仕方が悪かったです、すいません。
AとBという二つのファイルでCというクラスを使用する際、オブジェクトを生成
する場所は何処でするのか?という初心者丸出しの質問なんですが。
やはり共通のヘッダで宣言するといった形でよろしいのでしょうか?

384 名前:デフォルトの名無しさん :2006/10/12(木) 07:47:20
そうそう。共有ヘッダーで宣言しないと、とっても、みずらくなっちゃうから、共有ヘッダーで、ぜんぶ、宣言してね

385 名前:デフォルトの名無しさん :2006/10/12(木) 08:06:09
>384
こらこら

386 名前:デフォルトの名無しさん :2006/10/12(木) 09:31:24
どう考えても「連鎖」って訳はおかしいだろ……

387 名前:デフォルトの名無しさん :2006/10/12(木) 10:02:39
誤爆やん

388 名前:デフォルトの名無しさん :2006/10/12(木) 10:26:46
>383>380に比べて質問のしかたがよくなったとは思えんのだが
てか,「生成する場所」を「ヘッダで宣言」て・・・?

389 名前:デフォルトの名無しさん :2006/10/12(木) 10:59:19
>>383
extern の使い道を考えてみるといいかもしれません

390 名前:389 :2006/10/12(木) 11:18:04
>>386
誤爆に正式爆撃先がマジレス
http://pc8.2ch.net/test/read.cgi/tech/1143608073/

外国の単語にも複数の意味がついているのに
特定団体が利便性の為「だけ」で一つの日本の単語にあてはめる姿勢が駄目
だから単語の揚げ足取りばかりに終始して全く議論が進まない

Sequence という単語から複数本伸びている「枝(意味)」のうち私が選んだ一本を
私は日本の単語「連鎖」に当てました
しかし
連鎖という単語から複数本伸びている「枝(意味)」のうち貴方が選んだ一本が
Sequence という単語に当てられるかどうかまでは私には判りません

以降は上記スレで
スレ違い失礼致しました

391 名前:デフォルトの名無しさん :2006/10/12(木) 12:02:21
>>390
お前空気読めない類だな。

392 名前:390 :2006/10/12(木) 12:13:07
>>391
毎日が妄想嫁とのラブラブハネムーンです><

393 名前:デフォルトの名無しさん :2006/10/12(木) 15:04:40
GAを使った卒論でFラン大でもできる題材ないですか?

394 名前:デフォルトの名無しさん :2006/10/12(木) 20:16:04
>>390
いいから原文のみを貼り、変な訳語は一切付けるな。以上。

395 名前:380 :2006/10/12(木) 21:33:11
レスして下さった皆様、感謝です。
まだまだ、言葉足らずで申し訳ないです。
1つのオブジェクトを複数のファイルから参照出来るようにしたい、
この場合のオブジェクトの宣言は何処でどのようにしたらいいのか。
と、この様な書き方(言い方?)でいいんでしょうか?うまく伝わるか自信ないのですが。
>>389
externを使えば出来るのですね。有難う御座います。
以前、変数に対してexternを使用した時はすんなり出来たのですが、
記述の仕方が悪かったのか、クラスの場合は出来なかったのです。
もうちょっと頑張ってみます。


396 名前:デフォルトの名無しさん :2006/10/12(木) 22:13:30
要するに↓こういうことでっしゃろ?

>AとBという二つのファイルでCというクラスを使用する際、オブジェクトを生成
>する場所は何処でするのか?
     ↓
AとBという二つのファイルでCというクラスのオブジェクトを使用する際、オブジェクトを生成
する場所は何処のファイルでするのか?

397 名前:デフォルトの名無しさん :2006/10/12(木) 22:23:08
>>395
もしかしてこーゆーことがしたかったんかな?

// C.h
class C {
public:
   static C& getInstance();
};

// C.cpp
C& C::getInstance() {
   static C instance;
   return instance;
}

398 名前:デフォルトの名無しさん :2006/10/12(木) 22:45:46
ストロー・ストラップマンセー

399 名前:デフォルトの名無しさん :2006/10/13(金) 02:00:55
お禿さま

400 名前:デフォルトの名無しさん :2006/10/13(金) 02:57:08
>>395
シングルトン?

401 名前:デフォルトの名無しさん :2006/10/13(金) 12:24:03
あ〜,>>380は「クラス」と「オブジェクト(→インスタンス)」の区別がついてないのかな?

402 名前:デフォルトの名無しさん :2006/10/13(金) 12:29:25
>>401 文脈からfile.objの事でないか?

403 名前:デフォルトの名無しさん :2006/10/13(金) 12:53:13
>>401
あらゆる意味で痛いです

404 名前:デフォルトの名無しさん :2006/10/13(金) 13:34:32
Exceptional C++ Style日本語版買ってきた。今から読む。
取り敢えずめぼしい書籍はこれ位しかなかった。

405 名前:デフォルトの名無しさん :2006/10/13(金) 13:35:22
>>380が意味不明な件は?

406 名前:デフォルトの名無しさん :2006/10/13(金) 13:42:37
Exceptional C++とか読むヤツ居るんだな・・・
変態的と評される程ムズいと聞いて以来、
手に取ったことすら無いw


407 名前:デフォルトの名無しさん :2006/10/13(金) 13:45:38
Exceptional C++ Styleってどんな内容?
Exceptional C++は読んでるんだが想像つかん

408 名前:デフォルトの名無しさん :2006/10/13(金) 13:59:49
そこまで難しいことも無い。

409 名前:デフォルトの名無しさん :2006/10/13(金) 14:13:29
>>407
Exceptional C++を読んでいるなら、Exceptional C++ Styleは軽い読み物
だと思う。無理に買う必要はない内容。

410 名前:380 :2006/10/13(金) 16:48:50
皆様、レスありがとです。度々すいません。
>>396
そうですね。それ+どのようにっていうのがあると助かります。
>>397
これが>>400氏が仰っているシングルトンと言う物(?)なのでしょうか?
ちょっと調べた感じではこれで良いような気がしました。どもです。









411 名前:デフォルトの名無しさん :2006/10/13(金) 18:38:34
変態的なのは「Modern C++ Design」だよ。
あれはおもしろい。役に立つかどうかは不明。

412 名前:デフォルトの名無しさん :2006/10/13(金) 19:43:23
Modern C++ Desgin は今改めて読むとめちゃくちゃ分かりやすい入門書だと思う。
Boost みたいに変態的な手段を使わず、基礎を知るには非常にいい本。




413 名前:デフォルトの名無しさん :2006/10/13(金) 20:02:40
>>380
もしかして以下のようなこと?

//--- foo.h ---
class C {
....
};
extern C c; // どこかにあるグローバル変数cを参照するための宣言

//--- foo.c ---
C c; // グローバル変数cの実体を定義

//----aaa.c---
#include "foo.h"
void func_a()
{
c.meber_func1(100); // cにアクセス
}

//----bbb.c---
#include "foo.h"
void func_b()
{
c.meber_func2(); // cにアクセス
}

上の例はオブジェクトcをグローバル変数で定義しているから改めて生成はしていないけど、
グローバル変数としてCのポインタを定義、宣言するなら、オブジェクトの生成(c = new C)は
aaa.cでもbbb.cでもOK.

414 名前:デフォルトの名無しさん :2006/10/13(金) 20:44:21
シングルトンって結局グローバル変数なんじゃないの
カッコいいネーミングしてるが。
っと使ったこと無いが言ってみる

415 名前:デフォルトの名無しさん :2006/10/13(金) 20:48:45
シングルdはクラスとインスタンスが必ず1:1の関係になる設計じゃね?
っと使ったこと無いが言ってみる

しかしEffectiveC++ホントに面白いな
ここ数日必携の書になってる(*´ω`)

416 名前:デフォルトの名無しさん :2006/10/13(金) 20:54:44
必要があれば複数のインスタンスを生成することも可能なのがSingletonの利点の一つ。

417 名前:デフォルトの名無しさん :2006/10/13(金) 21:09:37
>>414
グローバル変数は生成されるタイミングを制御しにくい。

A a;
B b;

で、a のコンストラクタが b を使いたいときなど。

418 名前:デフォルトの名無しさん :2006/10/13(金) 21:24:07
Modern C++ DesignのSingletonはいくらなんでも
ライブラリ利用者疑いすぎじゃないかって思えてくるな。

419 名前:デフォルトの名無しさん :2006/10/13(金) 21:28:14
atexitに登録された関数から使われたらまずいかも、とか考えてたんだっけw

420 名前:デフォルトの名無しさん :2006/10/13(金) 22:45:19
なんか人が書いたソースを見てると、

::AfxBeginThread(略);

みたいな書き方で関数を使ってる部分があるんですが、「::」の意味がわかりません。
こういうのって左側にクラス名も書くものじゃないんですか?

421 名前:デフォルトの名無しさん :2006/10/13(金) 22:50:18
ああ、なにも書かないと一番外側

422 名前:デフォルトの名無しさん :2006/10/13(金) 22:50:21
namespaceに入っていないグローバルスコープな関数を呼んでる。
(でも多分実際はVSのインテリセンスを動かすため)

423 名前:デフォルトの名無しさん :2006/10/13(金) 23:00:02
いや、MFCがWin32APIと同名のメンバ関数作りまくるんで、APIのほうを明示的に呼ぶときには::つきで書く習慣がある。

424 名前:420 :2006/10/13(金) 23:00:41
大体わかりました。「::」は書かなくてもいいけど、
書いた方が明示的になるし入力候補も出るから便利ってことですね。

425 名前:デフォルトの名無しさん :2006/10/14(土) 00:05:19
>>420
書かなきゃならん場合もある。てか、予めそーゆー事態も想定しての明示。

426 名前:デフォルトの名無しさん :2006/10/14(土) 00:06:06
>>424
違う。

427 名前:デフォルトの名無しさん :2006/10/14(土) 00:08:50
>>420 は namespace を理解できていない気がする。

428 名前:デフォルトの名無しさん :2006/10/14(土) 00:17:33
>424
名前解決のやり方が変わるので、明示的にグローバルな名前空間の
関数を呼びたいときはこうすべき。


429 名前:デフォルトの名無しさん :2006/10/15(日) 13:36:07
質問です。
仮想関数を持つクラスにはvtblなどの隠れたデータが挿入されますよね?
で、純粋仮想関数をもつクラスには挿入されないと思いますが、それを継承したクラスには必ず隠れデータが挿入されてしまいますか?

430 名前:デフォルトの名無しさん :2006/10/15(日) 13:42:02
>>429
純粋仮想関数を持つクラスにも vtable は要るよ。

431 名前:デフォルトの名無しさん :2006/10/15(日) 13:48:30
インスタンス化されないのにですか?

432 名前:デフォルトの名無しさん :2006/10/15(日) 13:56:02
>>431
継承されたクラスのインスタンスには基底クラスのインスタンスが含まれる。

433 名前:デフォルトの名無しさん :2006/10/15(日) 14:00:49
多重継承の仕組み教えて。

434 名前:デフォルトの名無しさん :2006/10/15(日) 14:03:43
なるほど。
では、純粋仮想関数と普通の関数のみを持つクラスにはvtableは挿入されないという解釈は正しいですか?

435 名前:デフォルトの名無しさん :2006/10/15(日) 14:26:29
>>434
普通の関数の有無に関係なく、(純粋でも、そうでなくても)仮想関数があればvtableは必要でしょ。

436 名前:デフォルトの名無しさん :2006/10/15(日) 14:28:56
つ C++STD 10.4
純粋仮想関数を特別扱いする規定は無さそうだから、普通の仮想関数と
同じように扱う必要があるんじゃね?
実際は(vtbl含めて)実装次第だと思うけど。

というか、何でそんなにこだわるのかわからん。


437 名前:デフォルトの名無しさん :2006/10/15(日) 14:33:03
実装系に依存するやろ。
vtableは仮想関数(広く言うとメンバ関数)の実装方法だから。

つか >>429 で「隠れた」って自分でいうとるやないか。

アホじゃね?

438 名前:デフォルトの名無しさん :2006/10/15(日) 14:55:27
えーと、派生させる予定のないクラスA,Bがありましてそれらの共通するインターフェースを純粋仮想関数をもつクラスIとしてくくりだそうと思ったのです。

このときA,BをそれぞれIから継承したとすると自動的にA,Bも仮想クラスになってしまうのかと思ったのです。

つまり本来必要ない無駄なオーバーヘッドが生じてしまうのではないのかと思いまして、質問した次第です。

439 名前:デフォルトの名無しさん :2006/10/15(日) 15:00:06
それならテンプレートでいいのでは?

440 名前:デフォルトの名無しさん :2006/10/15(日) 15:03:12
A, Bを実行時多相で扱いたいならvtblのコスト払うのは至極真っ当

A, Bに実行時多相が必要なく単に共通の実装を括り出したいだけなら
vtblのコストを払わずに実装を括り出す方法は他にたくさんある

441 名前:デフォルトの名無しさん :2006/10/15(日) 15:10:39
分かりました。違う方法を考えてみます。

テンプレートってのは派生クラスをテンプレート引数にして基底クラスに渡せってことでしょうか。んで基底クラスを派生クラスにキャストすると。なるほど。

442 名前:デフォルトの名無しさん :2006/10/15(日) 15:18:59
だから多態したいのは実行時なのかコンパイル前なのかと。


443 名前:デフォルトの名無しさん :2006/10/15(日) 15:20:28
>>441
キャストが必要になった時点で何かおかしいと気付くように。

444 名前:デフォルトの名無しさん :2006/10/15(日) 15:22:12
>>441
その方法だとインターフェースの継承には向かないと思うよ。

445 名前:デフォルトの名無しさん :2006/10/15(日) 15:24:55
thisを派生クラスのポインタ型にstaticキャストしてインターフェースクラスから派生クラスのメンバ関数を呼び出せばよいのではないでしょうか…boostの何かでこんな実装をしてた気がします。

446 名前:デフォルトの名無しさん :2006/10/15(日) 15:28:36
こんにちは。Visual Studio 2005 Visual C++ express editionを使っています

#include <iostream>
using namespace std;

int main()
{
int num;
int sum = 0;

cout << "いくつまでの合計を求めますか?\n";

cin >> num;

for(int i=1; i<=num; i++){
sum += i;
}

cout << "1から" << num << "までの合計値は" << sum << "です。\n";

return 0;
}

上記コードがビルドできないんですが何故でしょうか?

447 名前:デフォルトの名無しさん :2006/10/15(日) 15:32:27
>>445
それは、インターフェースじゃないでしょ。
見かけ上の基本クラスから派生クラスのメソッドを呼び出すだけなら
それでもいいよね。


448 名前:デフォルトの名無しさん :2006/10/15(日) 15:32:53
エラーメッセージを貼れとママに言われなかったかい?

449 名前:446 :2006/10/15(日) 15:33:04
エラーメッセージは下記です。
Sample34.cp
error C3872: '0x3000': この文字を識別子で使用することはできません
error C2146: 構文エラー : ';' が、識別子 ' ' の前に必要です。
error C2065: ' ' : 定義されていない識別子です。

どなたか原因の分かる方がいればお願いいたします

450 名前:デフォルトの名無しさん :2006/10/15(日) 15:36:46
>>447
ああ、そっか。インターフェースっていうからまずかったのですね。すいません。
要は実行時のコストなしで共通する実装を括り出したいだけだったんです。煩わしい言い方してすいませんでした。

iterator_facadeでした今思い出しました。解決しました。

451 名前:デフォルトの名無しさん :2006/10/15(日) 15:39:27
全角空白が入っている。エラーメッセージにも書いてあるよ。

なれないうちはエラーメッセージが出たというだけで、
何か分からないことが起きているとすぐ諦めがちだが、
とりあえずメッセージをよく読む習慣をつけるべし。
そのうち分かるようになるよ。

452 名前:デフォルトの名無しさん :2006/10/15(日) 15:41:24
ここは本当に役に立たないインターネットですね

453 名前:デフォルトの名無しさん :2006/10/15(日) 15:43:59
ダメな奴にはどんな情報も役に立たないからな

454 名前:デフォルトの名無しさん :2006/10/15(日) 15:49:02
>450
ポリシークラス使え
protected 非仮想デストラクタにするのを忘れるなよ

455 名前:デフォルトの名無しさん :2006/10/15(日) 15:49:27
>>451
446
ありがとうございます!
何度見てもおかしな点がなかったので途方に暮れていたのですが、全角が入っていたとは・・・
エラーメッセージの読み方がまだわからないので、これから勉強したいと思います
ありがとうございました

456 名前:デフォルトの名無しさん :2006/10/15(日) 15:50:58
>452
馬を水飲み場まで連れて行くことはできるが水を飲ませることはできない

457 名前:デフォルトの名無しさん :2006/10/15(日) 15:59:31
>>454
共通する実装を派生クラスにして異なる実装をポリシーとして渡してそれを基底にするってことですか?

実はコンストラクタが異なるので派生クラスにしないといけないんですよ…う〜む。

458 名前:デフォルトの名無しさん :2006/10/15(日) 17:26:21
>>456
「ミネラルウォーターじゃなきゃヤダ!」とか言って
そっぽ向く馬もネットにはたくさん居るしな。

459 名前:デフォルトの名無しさん :2006/10/15(日) 17:38:53
template < class _Policy > class Interface
{
public:
  void F()
   {
   policy_.F();
   }

private:
  _Policy policy_;
};

class Policy
{
public:
  void F(){ /* impl */ };
};
こんなの?

>>454
protected 非仮想デストラクタにするのを忘れるなよ
ってのがよくわからんのだが。

460 名前:デフォルトの名無しさん :2006/10/15(日) 17:51:56
>459
Policy クラスを継承することを想定しているんでしょう
継承する場合,459のような例ではEBCOが効く可能性があるという利点があります

461 名前:デフォルトの名無しさん :2006/10/15(日) 18:22:28
template < class _Policy > class Interface :private _Policy
{
public:
  void F()
   {
   _Policy::F();
   }
};

class Policy
{
protected:
  ~Policy(){ /*ぷろてくてっどっと。*/ };
public:
  void F(){ /* impl */ };

};

継承すれば最適化されてPolicyクラスが0Byteになることがあるよってことね>>459

462 名前:デフォルトの名無しさん :2006/10/15(日) 18:27:37
EBCOなんか聞いたことないぜー
ググっても出ないし。
流れからするとEmptry byte class optimizationとかそんなの?

463 名前:デフォルトの名無しさん :2006/10/15(日) 18:29:38
_Policy はマズイな。

464 名前:デフォルトの名無しさん :2006/10/15(日) 18:30:12
>>462 Empty base class optimization

465 名前:デフォルトの名無しさん :2006/10/15(日) 18:34:41
>>464
トン
再びググってみる(・∀・)

466 名前:デフォルトの名無しさん :2006/10/15(日) 18:55:47
>>461 みたいな書き方どっかで見かけて
何で継承してるんだろうとか思ってたけど、そういうことだったのか…。



467 名前:デフォルトの名無しさん :2006/10/15(日) 18:59:16
どっかで見たことあるなーと思ったらEffectiveC++に書いてあるんね
身についてねえ('A`)

468 名前:デフォルトの名無しさん :2006/10/15(日) 19:11:18
>>465
empty base optimization, EBO ともいう。つーかEBOで覚えてた。
どっちの名前も使われてるっぽいね。


469 名前:デフォルトの名無しさん :2006/10/15(日) 19:32:53
strlenとかprintfとかはstd名前空間に入ってるのに
assertが入ってないのはなぜなんだぜ?
マクロとかそういうオチですか?
vc8だとstd::assertでエラーだった。
gcc3.2だと通ったけど。

470 名前:454 :2006/10/15(日) 19:36:01
>457
>461のことですな。詳細はModern C++ Design参照。
カスタマイズポイントをユーザーに提供しないんだったら
単純に包含でもいいかもね?

ポリシークラスてそんなにマイナーだっけ?

>460
いや、「実行時のコストなしで共通する実装を括り出したいだけ」
つうてるから忠告しただけ。
何も言わなかったら非仮想publicデストラクタを使いそうだからね。
詳しくは C++ Coding Standards参照

471 名前:デフォルトの名無しさん :2006/10/15(日) 19:41:13
>>469 assert() はマクロ。 std::assert() は不正。

472 名前:デフォルトの名無しさん :2006/10/15(日) 22:53:29
ポリシークラスっていう「名前」がマイナーなんじゃね
MC++D前から同じようなのはいっぱいあった

473 名前:デフォルトの名無しさん :2006/10/15(日) 22:54:34
>>469

#include <cassert>
でstd名前空間にあった気がする

474 名前:デフォルトの名無しさん :2006/10/15(日) 22:54:45
名は体を表す って言うしな

475 名前:デフォルトの名無しさん :2006/10/15(日) 22:58:07
>>473
デマを流すな。確認してから書け。

476 名前:デフォルトの名無しさん :2006/10/15(日) 23:01:18
画像処理プログラムを組んでいます。
ビットマップを読み込む自作クラスに

class Bitmap
{
public :
bool readBmp( string str ) {}
bool writeBmp( string str ) {}
};

のような感じでファイルを読み込む関数を作っていますが、ファイルの読み込みエラーが起きたときに
上記のような感じでbool型のfalseを返すか、例外をthrowするかで悩んでいます。
どっちでもいいっちゃどっちでもいいんですが、どうしても気になって・・・。。。

bool型を返すと
Bitmap pic;
bool flag;
do {
flag = pic.readBmp( "xxx.bmp" );
}
while( !flag );

のような感じでファイルが読み込めるまで繰り返す、という処理をかけるのですが、
こういった記述は例外処理でも可能でしょうか?
※"xxx.bmp"は、他のプログラムでも使用していて、読み込みのタイミングによってはロックされているため


477 名前:デフォルトの名無しさん :2006/10/15(日) 23:04:00
>472 ヒドス
boostでも使われているのに
ttp://www.boost.org/more/generic_programming.html

478 名前:デフォルトの名無しさん :2006/10/15(日) 23:05:00
>>476
for(;;) try { pic.readBmp( "xxx.bmp" ); break; } catch (...) {}

479 名前:デフォルトの名無しさん :2006/10/15(日) 23:05:58
>>475
すみません、VC8の環境でですが、
cassertヘッダの内部では
assert.hをインクルードしてるだけでした。
よって、std名前空間には入りません


480 名前:デフォルトの名無しさん :2006/10/15(日) 23:06:01
>>476
「なんでビットマップにファイルが関係するの?」という些細な問題は端に追いやってしまったわけね
とりあえず俺なら例外を発生させる
わざわざ例外機構があるのに利用しないで条件分岐で対応するのは分が悪い

481 名前:476 :2006/10/15(日) 23:06:46
>>478
ありがとうございます!
それでやってみます

482 名前:デフォルトの名無しさん :2006/10/15(日) 23:07:52
>>479
根本的に、 assert() はマクロだから名前空間に入れることができない。
>>471 で FA 。

483 名前:デフォルトの名無しさん :2006/10/15(日) 23:08:55
>>478
せめて必要な例外だけをcatchするようにしようよ……。

484 名前:478 :2006/10/15(日) 23:11:07
>>483
俺に言うな。必要な例外は >>476 本人しか知らない。

485 名前:476 :2006/10/15(日) 23:11:48
>>480
他にいい設計の仕方があれば助言をお願いします。
自分としては、Bitmapを扱う際には当然、ファイルから読み込む機能がないと不便だと思ったのですが・・・


486 名前:デフォルトの名無しさん :2006/10/15(日) 23:12:07
>>475
俺もstd::assertで使った記憶がある…
何でだろ…


487 名前:476 :2006/10/15(日) 23:13:31
>>438,478
ケンカしないで;;
もちろん例外は必要なものだけ実装します

488 名前:デフォルトの名無しさん :2006/10/15(日) 23:14:01
>>485
readBmp() の中でループまわせ。

489 名前:476 :2006/10/15(日) 23:14:25
あっ、↑の>>438>>483の間違いです。。。

490 名前:476 :2006/10/15(日) 23:17:08
>>488
それだと、ファイルが読み込めなかったときの処理が
読み込むまでループ
に固定されてしまいます。

読み込めなかったときの処理もある程度制御したいので・・・

とりあえず例外を発生させる形で組んで見ます

491 名前:デフォルトの名無しさん :2006/10/15(日) 23:25:44
>>485
> 他にいい設計の仕方があれば助言をお願いします。
> 自分としては、Bitmapを扱う際には当然、ファイルから読み込む機能がないと不便だと思ったのですが・・・
そりゃ当然ファイルから読み込める機能がなきゃ不便に感じる。
でもそれをそのまま実現する必要は無いだろ?

今のBitmapクラスを説明すると次の様になる。
・Bitmap.readBmp(str)=ビットマップがファイル:strから読み込む
・Bitmap.writeBmp(str)=ビットマップがファイル:strに書き込む
本来ビットマップは「Bitmapped data」だけを専門にすればいいだけで、
こういった雑事はBitmapのCreatorさんが担うべき仕事だと俺は思うわけ
つまり
・Bitmap ('utility' , 'createBitmap' , str ) : 'utility'がファイル:strからBitmapを作る
・('utility' , 'writeBitmap' , Bitmap , str) : 'utility'がBitmapをファイル:strに書き込む
みたいな

まぁ、それほど酷使しないつもりならこのままでも悪くは無いかもね、という小さなこと。

492 名前:デフォルトの名無しさん :2006/10/15(日) 23:46:38
>>491
わざわざ複雑度を上げることも無い。 YAGNI ってやつだ。

493 名前:デフォルトの名無しさん :2006/10/16(月) 00:06:21
>>492
ぉぅぃぇ

まあ小さなことだし、ぶつかって機能分割するのもよしかと思ってる

494 名前:デフォルトの名無しさん :2006/10/16(月) 00:19:06
めんどいときこそテンプレートで表現してしまうけどな。

template<IT >
Bitmap::readBmp(IT first,IT last) {}

file_bitmap.readBmp(file::iterator i,file::iterator end);
stream_bitmap.readBmp(&str[0],&str[0] + sizeof(str));

495 名前:476 :2006/10/16(月) 00:51:19
>>491-494
ありがとうございます。
まだC++使いこなしているわけではないので、とりあえずBitmap::readBmp()で実装してみて、
使いにくいようなら
>>491さんの助言を参考にしてみます


496 名前:デフォルトの名無しさん :2006/10/16(月) 03:15:56
char *x = new char[100];

// hogehoge

for (int i = 0; i < 100; ++i)
delete &x[i];

こんな感じに配列として確保したメモリを要素ごとに開放した場合、
正規の動作が保障されるのでしょうか?

サンプルコードを書いて試してみたところ、vc2005では特に問題なく
動いた(ように見える)のですが、やはりdouble deleteされているのでしょうか?

497 名前:デフォルトの名無しさん :2006/10/16(月) 03:20:16
未定義
newはdelete
new T[]はdelete[]
これ以外は鼻から悪魔

498 名前:デフォルトの名無しさん :2006/10/16(月) 03:32:38
掛かってる梯子の途中を無くしたらどうなるんだろうな?

499 名前:デフォルトの名無しさん :2006/10/16(月) 03:41:14
サードパーティーのヘッダーファイルと、
社内のヘッダー内でのtypedefを使った型定義が衝突して困ってます。

1.解決方法として社内ヘッダー側で、
サードパーティー側のヘッダーファイル内にdefineされているマクロシンボルを
チェックして定義を回避する。
しかし、相互チェックではないので、ヘッダーのインクルード順に気を使う必要がある。

2.社内用のヘッダーをnamespaceで囲い、
内部を参照する時はスコープ解決演算子を伴って使用する。
しかし、C用のソースで使用できない。

これぐらいしか対処法が思い浮かばないのですが、他に良い解決方法はないでしょうか?




500 名前:デフォルトの名無しさん :2006/10/16(月) 03:42:55
自社製の方を他の型にtypedefして元の型をundefする。


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.