C++相談室 part72

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part71
http://pc12.2ch.net/test/read.cgi/tech/1247853298/
2デフォルトの名無しさん:2009/09/01(火) 11:53:35
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映していない)
[禿 Stroustrup]
 http://public.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3デフォルトの名無しさん:2009/09/01(火) 11:56:14
4デフォルトの名無しさん:2009/09/01(火) 11:58:54
5デフォルトの名無しさん:2009/09/01(火) 12:03:11
>> Apache STDCXX http://incubator.apache.org/stdcxx/
>> は
>> Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
>> というのは指摘済みでした。ごめんなさい。とりあえず訂正。
>ごめんなさい。直すの忘れていました。
ごめんなさい。俺も直すの忘れていました。

■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
6デフォルトの名無しさん:2009/09/01(火) 12:09:21
入門ページなど

http://www.cplusplus.com/

・入門, 一覧, 使い方
http://www5c.biglobe.ne.jp/~ecb/cpp/07_01.html
・メソッド一覧
http://www.wakhok.ac.jp/~sumi/stl/
・サンプルプログラム集
http://www.s34.co.jp/cpptechdoc/reference/stl_samples/
7デフォルトの名無しさん:2009/09/01(火) 12:11:41
Boost C++ Libraries
http://www.boost.org/

Boost 翻訳プロジェクト
http://boost.cppll.jp/HEAD/

Let's Boost
http://www.kmonos.net/alang/boost/

boost info
http://shinh.skr.jp/boost/
8デフォルトの名無しさん:2009/09/01(火) 15:46:18
これは乙じゃなくてなんとかかんとか
9デフォルトの名無しさん:2009/09/01(火) 17:02:07
torakan2.exe の 0x004012f3 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x01bb9000 に書き込み中にアクセス違反が発生しました。

上記のようなエラーが発生してしまいました。
どうか、ご指導・ご鞭撻のほどよろしくお願いします。
109です:2009/09/01(火) 17:04:16
プログラムを貼りつけたいのですが、
貼りつけられるサイトをどなたかご存知でしょうか?
11デフォルトの名無しさん:2009/09/01(火) 17:22:24
>>10
codepad.org
129:2009/09/01(火) 17:33:59
>11さん
ありがとうございます。
プログラムの内容は下記の通りです
http://codepad.org/mdRuRQ2g
13デフォルトの名無しさん:2009/09/01(火) 17:57:02
codepad
ttp://codepad.org/

長いソースを貼るときはここへ!

ってテンプレに入れようぜ。
14デフォルトの名無しさん:2009/09/01(火) 17:58:59
>>12
j+k>=8927 にしてみたらどうなる?
15デフォルトの名無しさん:2009/09/01(火) 18:03:11
>>12
Cでコンパイルするなよ。
16デフォルトの名無しさん:2009/09/01(火) 18:20:21
delete [] L はないだろ。
17デフォルトの名無しさん:2009/09/01(火) 18:22:42
ファイルのオープンに失敗したら、exitするなりreturnするなりしろよ。
18デフォルトの名無しさん:2009/09/01(火) 18:42:23
ファイルのクローズに失敗したら、どうすればいいのでしょうか。
デストラクタでクローズしています。
19デフォルトの名無しさん:2009/09/01(火) 18:51:27
クローズは、バッファに残ってるまだ書き込まれてないデータのフラッシュも行う
クローズに失敗したということは、書き込まれなかったデータがいくらかあるかもしれないということだ
書き込みが失敗したという事実をユーザに通知するべき
20デフォルトの名無しさん:2009/09/01(火) 19:06:18
デストラクタでクローズしてるのでそれは出来ません。
21デフォルトの名無しさん:2009/09/01(火) 19:14:36
ユーザーアンフレンドリーなプログラムだな・・・
自分専用なら別にいいかもしれないが (何かあっても自業自得なだけだし)
22デフォルトの名無しさん:2009/09/01(火) 19:34:24
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
2320:2009/09/01(火) 19:57:26
ビープ音でモールス信号を発生させ、エラーの内容をユーザーに通知することにしました。
24デフォルトの名無しさん:2009/09/01(火) 20:13:39
失敗したときの対処を行いたければ、デストラクタに頼ってはいけない。
ファイルを閉じる処理とそれに失敗したときの処理を明示的に行う。
25デフォルトの名無しさん:2009/09/01(火) 20:41:46
class test {
virtual ~test() = 0 {}
};

この文法って相変わらずVC++専用?
26デフォルトの名無しさん:2009/09/01(火) 21:06:35
うn
27デフォルトの名無しさん:2009/09/01(火) 21:18:48
すまんpublic付け忘れた
28デフォルトの名無しさん:2009/09/01(火) 23:49:14
>>25
これって何?
仕事のない純粋仮想デストラクタ?
29デフォルトの名無しさん:2009/09/01(火) 23:56:43
int i;
char ch;

std::cin >> i >> ch;
として"123 A"を読み込ませると空白文字(ここではスペース)が読み飛ばされる
と知りましたが、

C++入出力
ttp://www.cppll.jp/cppreference/cppio_details.html#read
このreadメンバ関数を使って読み込んだ場合、
空白文字(スペースなど)は読み飛ばされる心配はありませんか?

例えば"a i u e o"から4文字読み込ませると
'a',' ','i',' '
が読み込まれるのでしょうか?



30デフォルトの名無しさん:2009/09/03(木) 06:05:49
全順序 "total order" とは、任意の値の集まりを一列に並べたとき、その
結果がただ一通りだけになるような順序関係のこと。
この場合、等値関係 "equality" と等価関係 "equivalance" はまったく同じ
関係となり、等価な要素同士を入れ替えても並べた結果としては同じになる。
たとえば、整数の大小関係は全順序である。

弱順序 "weak order" とは、全順序よりも要件を少し弱くした順序関係で、
等値でない2つの値を等価とみなすような順序関係を含めたもの。
この場合、並べ替えの結果の中で等価な値同士を入れ替えることで、異なる
並べ替えの結果が得られることがある。
たとえば、整数の大小関係は弱順序でもあり全順序でもあるが、整数の
下一桁を無視した大小関係は弱順序であって全順序ではない。

厳密弱順序関数 "strict weak ordering" とは、弱順序を定義する関数で、
関数 r と任意の値 x, y, z についての以下の要件を満たすもの。
 - r(x, x) が常に false となること。
  これは非反射性 "irreflexivity" といわれる性質である。
 - r(x, y) && r(y, z) が true なら r(x, z) も true であること。
  これは推移性 "transitivity" といわれる性質である。
 - r による等価関係 !r(x, y) && !r(y, x) を equiv_r(x, y) として、
  equiv_r(x, y) && equiv_r(y, z) が true なら equiv_r(x, z) も
  true であること。つまり、等価関係にも推移性があること。
r の逆の否定として得られる r'(x, y) = !r(y, x) は明らかに非反射性を
満たさないが、同じ弱順序を定義する関数といえる。
たとえば、整数の大小関係において "<" は厳密弱順序関数である。
このとき "<" の逆の否定である "<=" も同じ順序を定義する関数であるが、
厳密弱順序関数ではない。
呼び名に「厳密」とあるが、これは英語で等号無しの不等式 "<", ">" を
"<=", ">=" と区別して "strict inequalities" と呼ぶことから付けられた
記号的なもので、言葉どおりの意味を表すものではない。
3130:2009/09/03(木) 06:06:42
"strict weak ordering" を人に説明しようとしてググったけど、日本語で
わかりやすい記事が出てこなかったんで、むしゃくしゃして C++ プログラマ
向けの(数学用語をなるべく避けた)説明をがんばって1レスにまとめてみた。

間違ってるとか、もっと短くできるとか、もっと簡単にできるとか、添削して
もらえると助かる。

特に最後に挙げた "strict" の由来あたり、英語版 Wikipedia をうろうろして
ひねり出したものなのでいまいち自信が無い。
32デフォルトの名無しさん:2009/09/03(木) 11:27:53
どれくらい厳密さを求めているか、背景まで知る必要があるかによるけど、
いかにも数学っぽくてかなりの人が拒否反応を示しそう。

・比較したいものの対象全体を考えます。
・同じと見なすものでグループごとに分けます。
・グループ間で順序付けします。
・同じグループ内の要素間では false を返し、別グループの要素間では先ほどグループ間で決めた
 順序付けに従って、true か false を返します(func(a,b) で a < b なら true, b > a なら false)。
これが strict weak ordering になります。

これで実用上問題ないんじゃない?
33デフォルトの名無しさん:2009/09/03(木) 12:09:36
あえて抽象度を落として、funcの名前をlessにでもしてしまうとか
34デフォルトの名無しさん:2009/09/03(木) 18:13:45
エクセルのような表計算ソフトを作る場合、テーブルの表示には何を使いますか?
35デフォルトの名無しさん:2009/09/03(木) 18:29:51
GDI関数
36デフォルトの名無しさん:2009/09/03(木) 20:02:33
std::stringstreamを使って、デバッグログの出力をしたい

std::stringstream debug_out;
debug_out << "debug log" << std::endl;

ログ結果をIDEのデバッグウインドウに出力したいので
1ライン出力ごとにOutputDebugStr()をコールして内容を出力したい。
ただし、1ライン書くごとにOutputDebugStr()直接埋め込むのは避けたい。

debug_out << "debug log" << std::endl;
::OutputDebugStr( debug_stream.str().c_str()); debug_stream.str(_T("")); // <-これを毎回書くのは避けたい

表面上追加・変更は最小限に、OutputDebugStr()コールを追加することは出来ますか?
37デフォルトの名無しさん:2009/09/03(木) 20:05:13
OutputDebugStringStreamを作るというのはどうか
38デフォルトの名無しさん:2009/09/03(木) 20:25:41
>>37
お答えありがとうございます。
それが正攻法だとは私も思ってますが、
std::streamの知識が無いので、出来ればやりたくない。
恒久的に残すつもりはないので、楽ならどんな方法でもかまわない。
何かありませんか?

また、stringstreamはコンストラクタでopenmodeを指定しますが、
もう既にあるインスタンスを再構築したい場合は、どうすればいいんでしょうか?
debug_stream = stringstream(std::ios::out);
これは駄目のようです。
39デフォルトの名無しさん:2009/09/03(木) 20:32:30
それなら debugendl を作って endl の代わりに使うというのは
#define endl debugendl
とかやってもいいし
4030:2009/09/03(木) 20:52:19
>>32-33
ありがとう。

うーん。あれでもだいぶ削ったつもりだったんだけど、確かに挙げてもらったのと
比べるとまだまだ数学っぽさが色濃いね。

で、今回調べたきっかけが、「厳密って何?」「弱ってことは強もあるの?」とか、
「結局 "<" と同じようにすればいいだけなのに、なんでそんな変な名前なの?」とか、
そういうところだったんで、なんとかそこらへんの疑問がひととおり片付くようなものを
書いたつもり。

これはつまり「背景まで知る」のを前提にしてたってことになるね。後出しでごめん。
41デフォルトの名無しさん:2009/09/03(木) 21:34:11
>38
大分前に書いたコードから抜粋してきたけどこれでそれなりに動かない?

#include <iostream>
#include <sstream>
#include <windows.h>

class odstringbuf : public std::stringbuf
{
protected:
  virtual int sync(void) {
    OutputDebugString(str().c_str());
    str("");
    return 0;
  }
};

int main(void) {
  odstringbuf odsbuf;
  std::ostream ods(&odsbuf);

  ods << "debug log" << std::endl;
  return 0;
}
42デフォルトの名無しさん:2009/09/03(木) 22:10:02
>>41
それを使ったらうまくいきました。
今後もそれを使っていきます。
ありがとうございました。
43デフォルトの名無しさん:2009/09/03(木) 23:43:04
>>29
をお願いします
44デフォルトの名無しさん:2009/09/03(木) 23:50:06
>>29,43
read() は書式なしの読み込み処理として備えられているものなので、問題ない。
4529:2009/09/04(金) 12:08:03
>>44
ありがとうございます!
46デフォルトの名無しさん:2009/09/04(金) 16:45:39
readってeofに到達したときに読み込めたバイト数をどうやって検出するの?
47デフォルトの名無しさん:2009/09/04(金) 16:46:48
>>46
何を言っているのか分からん。
分かるように書き直して
48デフォルトの名無しさん:2009/09/04(金) 16:53:09
1000バイト未満のファイルをreadで1000バイト読み込もうとしたときに何バイト読み込んでエラーになったか知りたいのです。


49デフォルトの名無しさん:2009/09/04(金) 17:10:38
>>48
あーなるほど、
if(is)とかでエラーになったことはわかるけど、
具体的に何バイトでエラーになったかはどうやって調べるのか、って意味か。

・・・ごめん分かんない。
有識者plz
50デフォルトの名無しさん:2009/09/04(金) 18:56:01
gcount()
51デフォルトの名無しさん:2009/09/04(金) 20:07:28
STLコンテナを作りたいんだが、
面倒なのでstd::vectorをpublic継承したい。

メンバ変数がなければ問題ないのかもしれないが、
メンバ変数を持ちたいとき、なにか妙案はない?

・std::vectorをメンバ変数として持つ
・private継承する
だと、メンバやtypedefを全部書かなきゃならん。

要はstd::vector&へのキャストを禁止したいんだが。
5251:2009/09/04(金) 20:28:08
自己解決。

template <class T, class Allocator = std::allocator<T> >
class protected_vector : private std::vector<T, Allocator>
{
public:
  typedef allocator_type allocator_type;
  typedef const_iterator const_iterator;
  typedef const_pointer const_pointer;
  ...
protected:
  ~protected_vector();
}

こういうのを作っておいて継承するわ。
53デフォルトの名無しさん:2009/09/04(金) 20:34:47
typedefがおかしいぞw
54デフォルトの名無しさん:2009/09/04(金) 20:42:09
>>50サンクス
gcountで解決しそうです。
55デフォルトの名無しさん:2009/09/04(金) 20:46:24
streamへ出力するとき、
行の先頭位置を設定するマニプレータはありますか?

cout << tab(4) << "aaa" << endl << "bbb" << endl;

____aaa
____bbb

例えばこうすると、常に4文字分スペースが入って出力されるようになるような。
5651:2009/09/04(金) 21:09:14
>>53
これでいいんでね?
privateなものをpublicで公開する的な意味で。
57デフォルトの名無しさん:2009/09/04(金) 21:20:59
>>52
typedef してるところは using でいいんじゃね?
std::vector<... > とか書くのが嫌なのかもしれないけど、いっこ base_type を typedef すれば
よさそう。
5851:2009/09/04(金) 21:33:46
>>57
そうねorz
59デフォルトの名無しさん:2009/09/04(金) 23:35:07
面倒だからprivate継承、とかはろくなもんじゃないけどな…
60デフォルトの名無しさん:2009/09/04(金) 23:56:09
_beginthreadexでスレッドを呼び出す場合スレッド側で_endthreadex(0);と書くのは必要でしょうか?
単にreturn 0;と書いているサンプルもあるので
61デフォルトの名無しさん:2009/09/05(土) 00:01:44
6261:2009/09/05(土) 00:02:40
こっちのほうがいいか
http://msdn.microsoft.com/ja-jp/library/hw264s73(VS.80).aspx
63デフォルトの名無しさん:2009/09/05(土) 00:38:35
>>60
わかりました。ありがとうございます
64デフォルトの名無しさん:2009/09/05(土) 00:39:01
C++0xのconstexprと同じ動作を
既存のVC++でやるにはどうすればいいのですか?

65デフォルトの名無しさん:2009/09/05(土) 00:46:41
>>64
VC++でC++0xコンパイラを開発する
66デフォルトの名無しさん:2009/09/05(土) 01:39:26
どうせコンパイル時定数になるんだから
PHPか何か埋め込んで計算させるのはどうだ
67デフォルトの名無しさん:2009/09/05(土) 04:15:34
すみませんが、みていただけませんでしょうか。
http://codepad.org/2Xe82VfM
ソートしないのですが‥‥‥。
68デフォルトの名無しさん:2009/09/05(土) 04:30:50
>>67
釣り?
comparatorの仕様をちゃんと調べればすぐに判ることだが、
qsort()の比較関数とは違うぞ。
6967:2009/09/05(土) 04:59:43
>>68
了解しました。単に true/false を返すだけでよかったんですね。
70デフォルトの名無しさん:2009/09/05(土) 12:55:43
std::vector<double>::iterator() == std::vector<double>::iterator()

こういうことはできない?
VC++だとassertっぽいので落ちるんだが。

イテレータの代わりにポインタで書かれたプログラムを書き直していて躓いた。
71デフォルトの名無しさん:2009/09/05(土) 13:05:16
何でイテレータを空引数のコンストラクタで生成してるんだ?
72デフォルトの名無しさん:2009/09/05(土) 14:43:27
hogel() = default;

これを普通のC++で書くとどうなるの?
73デフォルトの名無しさん:2009/09/05(土) 14:51:21
>>70
これは何したいコード?
意味論的に狂ってないか?
74デフォルトの名無しさん:2009/09/05(土) 14:53:49
>>72
C++0xですか?
75デフォルトの名無しさん:2009/09/05(土) 15:00:54
>>74
C++0xのコードを普通のC++に書き直したいの
76デフォルトの名無しさん:2009/09/05(土) 15:05:57
>>72
// hogel() = default;
77デフォルトの名無しさん:2009/09/05(土) 15:09:47
>>72
えええー
それ以外なんかないのですか?
78デフォルトの名無しさん:2009/09/05(土) 15:13:03
hogelクラスのデフォルトコンストラクタの話でしょ?
諦めて書きましょう。
79デフォルトの名無しさん:2009/09/05(土) 15:15:31
>>76で何が不満なの?
普通のC++で明示的に書けないからC++0xで追加されたんじゃないか。
80デフォルトの名無しさん:2009/09/05(土) 15:37:48
>>71,73
ポインタをイテレータで置き換えてるんで、
NULLポインタを表すものがほしかった。
81デフォルトの名無しさん:2009/09/05(土) 15:41:36
>>80
それは何か方針が間違っているよーな。。。

詳しくは次の方どーぞ
82デフォルトの名無しさん:2009/09/05(土) 15:45:52
>>80
コンテナの end() が、だいたいその役割。
83デフォルトの名無しさん:2009/09/05(土) 15:54:16
>>77
暗黙のデフォルトコンストラクターとかコピーコンストラクターとかコピー演算子とかが副作用バリバリで余計なお世話だと、昔は思っていた。
でも今は、メンバーにPOD型を止めてshared_ptrとか他のオブジェクトとか使うことでRAII前提にしたら、暗黙の系との親和性が良くなってすごく便利に感じるようになった。例外安全にもなるし一石二鳥ということで
84デフォルトの名無しさん:2009/09/05(土) 17:39:05
古いC++の本見てたらoverloadなんて予約語を見つけた
廃止されたらしいけど、こんなのあったなんて知らなかったよママン
85デフォルトの名無しさん:2009/09/05(土) 17:44:33
constexprってなんなのですか?
普通のC++でコンパイルとおらねーぞ

助けてください
86デフォルトの名無しさん:2009/09/05(土) 17:52:27
>>85
今度の規格改定で入る予定のキーワード。constがもっと強くなったようなもの。
普通のプログラムならまだ使っていないと思うんだけど。
87デフォルトの名無しさん:2009/09/05(土) 18:38:11
templateを使って、ある型Hogeが来たら対応する型Fugaを返すといったような型のマッピングが
したいんですが、複雑で柔軟なマッピングがしたいです。

//型のマッピングをしてくれる構造体。Tを与えるとtypeにマッピングされた型が定義される
template<typename T>
struct type_map{
  typedef なにか type;
};

という構造体があったとして、「なにか」の部分をうまいことして単純な1対1対応のマッピングだったり
「あるクラスの派生型ならこの型」というような継承関係を利用した多対1のマッピングだったり
マッピングの定義箇所がソース上で何箇所かに分かれていたり(例えば、返したい型の定義されているヘッダ)
こういうことをしたいんですが、何か方法はありますか?

C+
88デフォルトの名無しさん:2009/09/05(土) 18:47:27
>>87
>単純な1対1対応のマッピングだったり
テンプレートの特殊化でできるよ

>「あるクラスの派生型ならこの型」というような継承関係を利用した多対1のマッピングだったり
boostのis_系メタ関数使って特殊化

>マッピングの定義箇所がソース上で何箇所かに分かれていたり(例えば、返したい型の定義されているヘッダ)
たぶんムリ
89デフォルトの名無しさん:2009/09/05(土) 19:26:58
>>87 テンプレートメタプログラミングのboostのmplを使えば型のリストを作ることができる。
typedef boost::mpl::list<hoge,huga,piyo> katalist;
これにboost::mpl::foreachとかでいろいろ処理を記述できる。
boost::mpl::mapを使えばマッピングが簡単になるかもしれない。mpl::mapは使ったことないんで自信ない。
90デフォルトの名無しさん:2009/09/05(土) 20:49:16
こういう時どうすればいいのか教えてください

HANDLE h = open(...);
OBJ *o = new OBJ(h);
return o;

上記の用に、OBJのコンストラクタに
ハンドルを渡す必要があるのだけど
エラー処理を追加すると、メモリ確保に失敗した場合
オープンして、すぐクローズする羽目になる。

HANDLE h = open(...);
try { OBJ *o = new OBJ(h); }
catch (std::bad_alloc& e) { close(h); throw error; }

処理の流れ的には、メモリ確保に成功したらオープンして〜
というほうが自然なのだけど、ハンドルを受け取る
コンストラクタしかないので出来ない。

さらにopen()やclose()も失敗する可能性があるので
その処理も追加すると、煩雑になってしまう。
なにかいい方法ありませんか?
91デフォルトの名無しさん:2009/09/05(土) 20:53:53
HANDLEとOBJを修正出来ないならそうするしかないだろうよ
92デフォルトの名無しさん:2009/09/05(土) 20:59:11
ソースの煩雑さが問題なだけなら、auto_ptrのようなHANDLEを自動解放するクラスを作ってデストラクタにやらせる
どうしてもメモリを先に確保したい?別にいいんじゃないの?
93デフォルトの名無しさん:2009/09/05(土) 21:26:51
placement newでメモリ確保
94デフォルトの名無しさん:2009/09/05(土) 22:12:53
>>90
HANDLEを管理するオブジェクトを作って包含させる。
するとOBJのコンストラクタが例外を送るとOBJに包含されているオブジェクトのデストラクタが自動的に呼ばれ、自動的にhandleがクローズされる。そのためtry-catchが不要になる。
ただしこの例はcloseでは例外を送出しないと仮定している。

#include <boost/shared_ptr.h>
using boost::shared_ptr;
class Handle
{
HANDLE handle;
private:
Handle(const Handle&);//no copyable
public:
Handle(Handle hand):handle(hand){};
virtual ~Handle(){close(hand);}
};

class Obj
{
shared_ptr<HANDLE> ha;
public:
Obj(const shared_ptr<HANDLE>& hand):ha(hand){};
};

shared_ptr<Handle> h(new Handle(open(...));
Obj*o = new OBJ(h);
95デフォルトの名無しさん:2009/09/05(土) 22:49:27
>>94
なんか違ってたスマン
#include <boost/shared_ptr.h>
using boost::shared_ptr;
class Handle
{
HANDLE handle;
private:
Handle(const Handle&);//no copyable
public:
Handle(HANDLE hand):handle(hand){};
virtual ~Handle(){close(hand);}
};

class Obj
{
shared_ptr<Handle> ha;
public:
Obj(const shared_ptr<Handle>& hand):ha(hand){};
};

shared_ptr<Handle> h(new Handle(open(...));
Obj*o = new OBJ(h);
96デフォルトの名無しさん:2009/09/05(土) 22:56:59
え?先にOBJのメモリ確保してからHANDLEをオープンしたいって話しじゃないの?
97デフォルトの名無しさん:2009/09/05(土) 23:05:22
煩雑にならない方法を聞いてるようにしか…
98デフォルトの名無しさん:2009/09/06(日) 01:35:01
>>88,89
ありがとうございました。
やはり、それなりにはできそうですね。でもあまり柔軟性は高くないようで・・・
この辺C++0xとかで改善されるといいですね〜
99デフォルトの名無しさん:2009/09/06(日) 03:43:38
boost::mplのレベルの柔軟性でも不満ならC++0xにもそれほどは期待できないと思う
100デフォルトの名無しさん:2009/09/06(日) 05:02:26
C++0xの言語レベルでのテンプレート関係の強化って
コンセプト亡き今は可変長引数のサポートくらいしかないからなぁ
あとはboostよりずっと貧弱な標準ライブラリがあるくらいで
101デフォルトの名無しさん:2009/09/06(日) 05:57:23
template 混じりの typedef がヤバい程便利で且つ混迷を深める凶悪兵器だと思うがね
102デフォルトの名無しさん:2009/09/06(日) 09:02:54
>>101
C#でtypedefのないジェネリックスを使うと、mplでのtypedefのやばいほどの便利さをひしひしと感じる。何で無いの?
103デフォルトの名無しさん:2009/09/06(日) 10:25:13
なんでと思ったなら言語使用の上っ面だけでも見なおせよバカ
104デフォルトの名無しさん:2009/09/06(日) 11:02:53
>>100
いや、BoostがC++0xに準拠したらもうとんでもないライブラリが
できるだろう。期待しちゃうぞ。
105デフォルトの名無しさん:2009/09/06(日) 11:20:40
>>104 boostのtypeofエミュレーションがC++0xでネイティブサポートされてるだけでも大きな効果があるぞ。
106デフォルトの名無しさん:2009/09/06(日) 11:26:17
でも0xはで無い
2015年まで出ないぞ
107デフォルトの名無しさん:2009/09/06(日) 12:08:29
C++0fってことか?
108デフォルトの名無しさん:2009/09/06(日) 12:11:15
auto decltype rvalue lambdaあたりは実装してるコンパイラもちらほら出てるし。
boostがその辺のコンパイラのサポート状況の違いを吸収してくれると嬉しいんだが。
109デフォルトの名無しさん:2009/09/06(日) 12:56:22
>>107
16進にしても、0fにはならんぞ
110デフォルトの名無しさん:2009/09/06(日) 13:30:31
tainting checkみたいなのをランタイムコスト無しでうまく実装できないかなぁ、
constが感染するような感じの挙動で
111デフォルトの名無しさん:2009/09/06(日) 16:15:32
template<typename T>
T *NewInstance()
{
    void *p = AllocMemory( sizeof(T) );
    return new(p) T;
}

これの配列版を作りたいんですが、どういう実装になるんでしょうか。
112デフォルトの名無しさん:2009/09/06(日) 16:17:27
何のためにそんな関数を作ってるのかが分からない
113デフォルトの名無しさん:2009/09/06(日) 16:18:18
>>111
十分なサイズの領域を確保して、ループをまわす。
ちなみに、その実装だと T のコンストラクタで例外が発生したときに p が漏れるよ。
114デフォルトの名無しさん:2009/09/06(日) 20:44:58
>108
>auto decltype rvalue lambda
このあたりは既に吸収しはじめてると思う。
少なくとも BOOST_NO_XXXX マクロは全て存在する。

>111
std::uninitialized_fill() とか使えばいいんじゃね?
115デフォルトの名無しさん:2009/09/06(日) 21:43:21
auto, decltype: Boost.Typeof
rvalue reference: Boost.Move
lambda: Boost.Lambda
ってとこか。Moveはまだacceptされてないけど。
116デフォルトの名無しさん:2009/09/07(月) 03:07:41
vectorは、resize(N,0)で初期化できるものと信じていたが
生成時以外だと無理なのね。
既に使用済みのvectorを0クリアしようとこれ使っていたら、消えてない。
初期化はどうやったら良いんですか?
117116:2009/09/07(月) 03:08:07
あげ
118デフォルトの名無しさん:2009/09/07(月) 05:33:13
>>116
vector<type>().swap(v);
119デフォルトの名無しさん:2009/09/07(月) 05:34:31
>>116
Effective STL読んだ方がいい
120デフォルトの名無しさん:2009/09/07(月) 05:36:39
v.clear();
v.resize(N, 0);
121デフォルトの名無しさん:2009/09/07(月) 05:58:08
サンクス
>>119 読んでないけど既にある領域を壊さないを壊さない仕組みなんだろうけど。
122デフォルトの名無しさん:2009/09/07(月) 06:26:54
>>118
Effective STLではそう書いてあるけど

v.swap( vector< type >() );

じゃなんでいけないんだろう。
こっちのほうがわかりやすいと思うんだけど^^;
123デフォルトの名無しさん:2009/09/07(月) 06:37:40
>>122
vector::swap()の引数は非constなわけで(スワップするんだから当然)、
そこに一時オブジェクトを渡しちゃダメでしょ。
124デフォルトの名無しさん:2009/09/07(月) 06:40:02
いや、すまん勘違い。
一時オブジェクトとconst云々は元のやり方にも言えることか。
125デフォルトの名無しさん:2009/09/07(月) 09:36:29
いやあってる。
一時オブジェクトは非const参照引数には渡せない。
一時オブジェクトのメンバ関数を呼ぶのは問題ない。
126デフォルトの名無しさん:2009/09/07(月) 11:29:58
0クリアってstd::fillを使えって話じゃないの?
127デフォルトの名無しさん:2009/09/07(月) 11:54:23
いや、vector::assignじゃないの普通
または v = vector( n, 0 );
ここでswapを出してくる感覚が理解できん
128デフォルトの名無しさん:2009/09/07(月) 11:59:23
まぁ>>116の日本語も下手なんだが、swapが出てくる理由の分かってない奴は
「capacityを0にしたいらしい」という意図を汲み取れ
129デフォルトの名無しさん:2009/09/07(月) 12:19:01
>>128
最初に resize(N, 0) って書いてあるんだから、ただの誤読じゃねーか。
130デフォルトの名無しさん:2009/09/07(月) 12:21:45
最初に書いてあるのは「resize(N,0)じゃ駄目でした」だろ
131デフォルトの名無しさん:2009/09/07(月) 12:24:46
resize(N, 0) で capacity を 0 にしたいわけがない。
132デフォルトの名無しさん:2009/09/07(月) 12:31:42
「capacityを0にしたいのにresize(N,0)じゃできないんだけどどうしたらいいんですか」
だろ?
133デフォルトの名無しさん:2009/09/07(月) 12:37:05
んー。代入(operator=、assign)はO(N)の保障だけど
vectorのswapはO(1)が保障されているから
swapしたほうが速いかも。

vector< int >( n, 0 ).swap( v );
134デフォルトの名無しさん:2009/09/07(月) 12:41:29
>>127
assignのことすっかり忘れてた

>>128
俺はエスパーになれそうにないな

ところでswapの方が早いとかあり得るのか?
無駄なメモリ確保が入りそうなんだが
135デフォルトの名無しさん:2009/09/07(月) 12:41:30
>>132
resize(0) なら、そうとも取れるが、 N はどっから出てきたことになるんだ?
136デフォルトの名無しさん:2009/09/07(月) 12:41:44
>>133
いやいや、その一時オブジェクトの構築に結局O(N)かかるだろ。
137デフォルトの名無しさん:2009/09/07(月) 12:47:23
>>136
いや、そりゃそうだけど、

>または v = vector( n, 0 );

の右辺の構築も同じくO(N)かかるじゃろが。w
実際、今VCで実験したらswapの方が倍くらい速かった。^^
138デフォルトの名無しさん:2009/09/07(月) 12:51:50
ちなみに比較したのは、>>127>>133ね。

v = vector< int >( n, 0 );
vector< int >( n, 0 ).swap( v );

ちなみに、マッサー本によると
vectorにおいて代入とassignは線形時間、swapは定数時間となってるから
結果どおりでいいんじゃないかと。
139デフォルトの名無しさん:2009/09/07(月) 12:52:28
vector::assignでいいじゃん。なにか困るの?
140デフォルトの名無しさん:2009/09/07(月) 12:53:13
>>137-138
いや、 v.assign(n, 0) でいいから。
141デフォルトの名無しさん:2009/09/07(月) 12:54:20
assign() を operator = () のただの別名だと思ってるんだろう。
142デフォルトの名無しさん:2009/09/07(月) 12:58:41
std::fillもついでに計測してくれ
143デフォルトの名無しさん:2009/09/07(月) 13:02:30
>>141
おぉ、v.assign( n, 0 ) でやったらswapより2%速くなった^^;;;

なお、マッサー本には assign は clear(); insert( begin(), n , u ); と同値と書かれていて(p.329)、
代入と同じではないね。
というわけで、やるならassignかな。代入はコスト的に間違いってことでF/A?
144デフォルトの名無しさん:2009/09/07(月) 13:04:49
>>142
fill はそもそも resize の要求にこたえてないので実験しません^^あしからず。
145デフォルトの名無しさん:2009/09/07(月) 13:07:43
assignもcapacity変わらなくね?
146デフォルトの名無しさん:2009/09/07(月) 13:12:45
>>145
だから、最初から capacity を変えたかった人なんていないんだってば。
147133:2009/09/07(月) 13:15:14
>>145
もちろん、かわらないよ。
自分は>>128じゃないから、
capacityがどうなるかは問題にしてない。
148デフォルトの名無しさん:2009/09/07(月) 17:43:34
すいません質問があります.
VC++のダイアログ形式でプログラムしているのですが
下記のプログラムで
myDLG.DoModal()
を行うと最初からあったOKボタンを押してもプログラムが死に切っていないようなのですが
どのようにすればいいのでしょうか.
ググったら無限ループとか永久に待機してるとかっぽかったんですが解決法が良く分かりませんでした.

プログラム開始→OKボタン 普通に終了する
プログラム開始→ボタン8→ファイル選ぶ→OKボタン ダイアログは消えるがプログラムは完全に死んでないみたい

といった状況です.

void CtestDlg::OnBnClickedButton8()
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。

//ファイルダイアログを表示してファイル指定する
CFileDialog myDLG(TRUE,NULL,NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"AVIファイル(*.AVI)|*.AVI||");
if(myDLG.DoModal() != IDOK)return;
}
149デフォルトの名無しさん:2009/09/07(月) 17:49:36
>>148
MFCスレへどうぞ。
150デフォルトの名無しさん:2009/09/07(月) 17:55:19
>>149
MFC相談室ってスレですかね?
誘導どうもです.
151デフォルトの名無しさん:2009/09/08(火) 03:23:54
int F() という関数に、__inlineやinlineをつけると、

「関数は値を返すべき」という警告出ます。 つけないと出ないのですが。

これは、予定通りの動作しなかったりしますか?
152デフォルトの名無しさん:2009/09/08(火) 03:25:38
お前がどんな動作を予定してるのか分からんし
153151:2009/09/08(火) 03:29:25
具体的なコードはこれですが原因わかりますか。


__inline int kana_chk (unsigned char *p){
if ( p[0]==0xa4 ) if( p[1]==0xf3 || (p[1] >= 0xa1 && p[1] <= 0xf1 ) )return 1;
return 0; }
154デフォルトの名無しさん:2009/09/08(火) 03:34:03
これだと、どちらも警告でないのですが・・・ 上のコードだと付けるか付けないかで変わります。



int F() { return 1; }
__inline int G() { return 1; }
155デフォルトの名無しさん:2009/09/08(火) 03:36:33
>>151,153
↓こっちいきな。
【初心者歓迎】C/C++室 Ver.67【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1247937958/

そのコードと合わせて、コンパイラと、そのバージョンと、エラーメッセージを
「なるべくすべて、正確に」貼れば、きっと解決に繋がるよ。
156デフォルトの名無しさん:2009/09/08(火) 03:36:51
コンパイラのバグと思ってスルーで行こうと思いました。
153とほぼ同じ別の判定関数で、警告でない物もあるので。
157デフォルトの名無しさん:2009/09/08(火) 03:37:34
サンクス
158デフォルトの名無しさん:2009/09/08(火) 07:17:16
>>153コンパイラが正しいな。
字下げを正しくすれば分かる。
159デフォルトの名無しさん:2009/09/08(火) 08:27:01
__inline int kana_chk (unsigned char *p){
 if ( p[0]==0xa4 )
  if( p[1]==0xf3 || (p[1] >= 0xa1 && p[1] <= 0xf1 ) )
   return 1;
 return 0;
}

160デフォルトの名無しさん:2009/09/08(火) 08:42:30
むしろinlineを付けたままで、
中身を削って確認して欲しい
161デフォルトの名無しさん:2009/09/08(火) 08:48:43
ヒントない?
値はちゃんと返してると思うけど?
162デフォルトの名無しさん:2009/09/08(火) 08:51:54
__inline int F (unsigned char *p){
 if ( A ) if( B )  return 1;
 return 0; return 0; }

にすると警告でなくなるな。一つ目のreturn 0; はif文の影響うけてるって事?
理由わからん。
163デフォルトの名無しさん:2009/09/08(火) 08:54:29
 if ( A ) if( B )  return 1;
 return 0;




 if ( A ) { if( B )  return 1; }
 return 0;

は別物だったの?  しらなかった。 下は警告でない。
164デフォルトの名無しさん:2009/09/08(火) 09:33:10
まぁ普通に全部ブロックに入れろや
ifの構文規則なんかを覚えて頑張ってブロックを省略するより、&&と||の優先順位を
覚える方がまだしも役に立つぞ
165デフォルトの名無しさん:2009/09/08(火) 09:39:30
inline の有無で警告出る理由は何だ? 教えてくれ
166デフォルトの名無しさん:2009/09/08(火) 11:20:54
関数の構文が破損してるからだよ。
167デフォルトの名無しさん:2009/09/08(火) 15:02:27
角さんのHPが消えているみたいですが、どなたか移転先しりませんか?
http://www.wakhok.ac.jp/~sumi/stl/
168デフォルトの名無しさん:2009/09/08(火) 15:05:09
とりあえず、
警告うんぬんと語るヤツは警告メッセージを貼れ。
169デフォルトの名無しさん:2009/09/08(火) 15:05:09
ある数値計算する処理(クラス)があって、それがとても遅くて高速化したい。
処理の中で、連立一次方程式を解く箇所があって
調べてみたら、同じ式を何度も重複して解いていたことがわかった。
(1例では、4500回中4200回も重複していた)
そこで、方程式の解をstlのmapに入れて使いまわすように変えてみた。
結果は次のとおり

○対策無し
full time(AVG) = 0.012447
le time(AVG) = 0.005351
rate(AVG) = 0.429899

○対策あり(map)
full time(AVG) = 0.026179
le time(AVG) = 0.003062
rate(AVG) = 0.116979

※full timeは処理全ての時間
le timeは方程式部分のみの時間
rateは、 le / full
AVGは2560回やった平均

le timeは3/5に減ったんでまだいいんですが、
全体としては逆に増えてしまった。
mapの検索、挿入処理を埋め込んだのは方程式部分の中だけで
それ以外違いはありません。
遅くなるとすれば方程式部分の時間になると思うのですが、
逆に、それ以外の時間が4倍近く遅くなってしまった。
なんでこうなるかわかりますか?
170デフォルトの名無しさん:2009/09/08(火) 15:12:12
使うメモリが増えてキャッシュに収まらなくなった、とか?
171デフォルトの名無しさん:2009/09/08(火) 15:32:16
質問。

基底クラスBを、とあるクラスAに包含した場合
基底クラスBを継承して作ったクラスCは、クラスAで使えるますか?

使えないのならば、どうすればクラスCはクラスAで使えるようになりますか?
172デフォルトの名無しさん:2009/09/08(火) 15:54:16
ポリモーフィングの話に近いような
173デフォルトの名無しさん:2009/09/08(火) 16:34:04
mapの中でコピーしまくってるとか?
内部コピーが多発してるようなら、map<T>をmap< shared_ptr<T> >に変えるとか。
検索時間が重いなら、mapをunordered_mapに変えるとか。
174デフォルトの名無しさん:2009/09/08(火) 17:15:34
>>170
>>173
お答えありがとうございます。
キャッシュミスの可能性ということで、
1つの処理も内部的には区切りがあることに気が付いたので、
区切りに合わせてmapの持ち方を変えて、2種類試してみました。

@は、mapの中にmapを入れる形
full time(AVG) = 0.015926
le time(AVG) = 0.001885
rate(AVG) = 0.118389

Aは、区切りでmapをクリアする形
full time(AVG) = 0.024784
le time(AVG) = 0.016827
rate(AVG) = 0.678919

元より良くはなりこそしませんでしたが、@は大きく改善しました。
どうやらmapが大きくなりすぎてキャッシュミスしていたようです。
一応方程式部分は改善されているので、バランスをとる方向で
考えてみたいと思います。ありがとうございました。

>>173
mapはキーもアイテムも、12~200byteぐらいで、コピーの重さも微妙です。
unordered_mapは知りませんでした。調べてみます。
175デフォルトの名無しさん:2009/09/08(火) 17:21:11
>>171
クラスAにクラスBのポインタを持つようにすれば、使えるますよ。
176デフォルトの名無しさん:2009/09/08(火) 18:24:11
mapは、メモリ食う。 googleのmapは消費量少ない。
基本的に、mapはプログラム使う側の負担減らす目的が主と考え
vectorなどに入れておき、一致するか確認した方が速い。
ケースにはよるが。 
177デフォルトの名無しさん:2009/09/08(火) 23:28:53
問題を見ないとわからないけど、そこまで何回も同じ式を解くってことは、
根本的に理屈/アルゴリズム見直した方が良さそうな気がする。
それで map なのかも知れないけど、map 持ち出す必要あるのかな。

178505:2009/09/09(水) 01:41:09
>>176-177
アルゴリズムはよく知られたもので、
それをそのまま使っているので改善は出来そうにありません。

なぜmapなのかですが、元の行列(今回のケースでは最大36x36)から、
一部の行列を抜き出して、連立方程式として解くという形であり
抜き出すパターンの組み合わせ数を考えるとmapになりました。
実際、解を再利用することで、求解処理時間は半分以下に
なっており、効果はありそうなだけに残念なところです。

また、何も手を加えない元の状況を更に調べてみたところ
std::count()でstd::vector< uint >の要素数を求めている箇所が2つあり
それが全体の処理時間の2割を占めていました。

処理時間の割合 「方程式求解 : ↑ : その他 = 4 : 2 : 4 (割)」

当初、求解にかかる時間が殆どで、それ以外はゴミみたいなものだと
考えていただけに、こんなものがこれほど時間を喰うとは以外です。
179デフォルトの名無しさん:2009/09/09(水) 01:45:22
なにをしたいのか、簡略化したものでも、書き込んだらいい方法でるかも?
180デフォルトの名無しさん:2009/09/09(水) 01:48:46
36次元から、何次元を抜き出すんだ?
181デフォルトの名無しさん:2009/09/09(水) 01:58:26
たとえば、double 10*10を解くとしたら、データ、解記録に800バイト程度必要。
4000ほど同じのが現れるという書き込みから、記録に必要な容量は、3Mバイト程度。
このくらいではメモリ不足にはならない。
mapの検索が遅い可能性あるから、解こうとする行列のハッシュを自前で計算してみるとかは?
10*10を一列に並べてCRC32計算して、そのうちの何ビットかをキーにして、データの一致を確かめるとか。
182デフォルトの名無しさん:2009/09/09(水) 02:29:29
なんで800バイトなんだろ
183デフォルトの名無しさん:2009/09/09(水) 02:30:52
行列記録に必要なのは、 8バイト * 100 だろ。
184デフォルトの名無しさん:2009/09/09(水) 02:35:48
なんで36*36*8byteじゃないのかなぁと思って
185184:2009/09/09(水) 02:36:36
あああ、ごめん。ほんとごめん。
186デフォルトの名無しさん:2009/09/09(水) 03:40:20
キーのサイズがそれだけあるってことは、二分木探索するmapよりハッシュ探索する
unordered_mapの方が適切な気がするけど
187デフォルトの名無しさん:2009/09/09(水) 08:28:16
>>169
そもそもちゃんと最適化して計測してるんだろうな?
188デフォルトの名無しさん:2009/09/09(水) 11:32:32
それにしても,ちゃんと profiler かけてるのかな。
ちゃんと時間を取る場所を押さえないで「最適化」するとロクな事無い。
状況証拠から多分あってるんだろうけど、他の場所もある程度
いじるわけだろうし。
189デフォルトの名無しさん:2009/09/09(水) 11:48:08
確かに最適化無しにコンパイルしてたら笑えないなw

しかし、uint(=unsigned intだよな?)が要素になってるvectorへのcount程度で
そんなに時間食ってるってのは、最適化されてないんじゃないかと疑いたくもなるな
190デフォルトの名無しさん:2009/09/09(水) 11:58:19
vectorに対するcountのオーダーはO(N)だから要素多ければそれなりの時間はかかるだろ。
しかし全体の2割ってのはなんだろうとは思うな。
191デフォルトの名無しさん:2009/09/09(水) 12:13:31
仮令巨大なsizeのvector<uint>であっても、先頭からシーケンシャルにアクセスするcount()は結構速いよ。
192デフォルトの名無しさん:2009/09/09(水) 19:50:27
using namespace std;
ofstream ofs("filepass");
で開いたofsに改行を出力したいのですが、
ofs << cout;
だと出力できないのでしょうか?
"\n"だとバッファがフラッシュされないとか聞いたものでして
coutでやろうと思ったのですが。
193192:2009/09/09(水) 19:55:12
具体的には
#include <iostream>
#include <fstream>
int main()
{
using namespace std;
ofstream ofs("filepass");
ofs << cout;
return 0;
}
で出力先のファイルに
0x46f0c4
と表示されるだけです。
194デフォルトの名無しさん:2009/09/09(水) 20:06:57
>>192
つ[endl]
195デフォルトの名無しさん:2009/09/09(水) 20:09:11
改行したいだけならstd::flushもある。
196デフォルトの名無しさん:2009/09/09(水) 20:09:35
>>195
×改行 ○フラッシュ
197192:2009/09/09(水) 20:45:23
>>194-196
ありがとうございました。
std::endlで出来ました。
なんか重大な理解不足をしでかしている気がしますので
1から勉強しなおしてきます。
198デフォルトの名無しさん:2009/09/09(水) 20:49:52
>>197
coutはostream型のオブジェクトだから、君が作ったofsの親戚みたいなもの。
>>193はいわば、カメラでカメラを撮影したみたいな感じ。
199デフォルトの名無しさん:2009/09/09(水) 21:15:40
>>198
ありがとうございます。
マニピュレータとやらも勉強してまいります。
200デフォルトの名無しさん:2009/09/09(水) 21:18:59
>>199
悪い事は言わないからロベール読め
201デフォルトの名無しさん:2009/09/09(水) 21:32:28
iostreamなんか勉強しても何も得しない
素直にprintf使いなさい
C++でCの関数使うななんていう妄言には耳を貸さなくていい
202デフォルトの名無しさん:2009/09/09(水) 21:38:11
>>201
得するわいカス
自前のクラスの入出力を自由にカスタマイズできるだろうが
printf()には到底無理です
でないとわざわざiostreamなんか作るわけない
203デフォルトの名無しさん:2009/09/09(水) 21:44:30
C++でもputsはよく使います(笑)
204デフォルトの名無しさん:2009/09/09(水) 21:57:58
sync_with_stdio()をtrueにしておかないと同時に使った場合の
動作は保証されないぞ
205デフォルトの名無しさん:2009/09/09(水) 22:01:02
stdioしか使わないから問題ない
206デフォルトの名無しさん:2009/09/09(水) 22:06:55

ios::sync_with_stdio()
C の標準入出力操作と C++ のストリーム操作を同じ標準ファ
イ ルで実行すると、同期の問題が発生します。入出力の各ス
タイルではそれぞれ独自のバッファリングが行われるた め、
プ ログラムの実行順序と入出力の順序は異なります。この同
期の問題を解決するため、標準ストリー ム で あ る cin、
cout、 cerr、clog のいずれかに入出力を行う場合は、その
前にこの静的関数を必ず呼び出してください。この関数 は、
各 標準ストリームを stdiobuf を使用するように再設定しま
す。これにより、標準入出力とストリームを介して行う入 出
力 が同期して行われます。パフォーマンスは、バッファつき
ストリーム入出力やバッファつき標準入出力をそれぞれ単 独
で 行 なった場合よりもかなり低下します。 stdiobuf(3CC4)
を参照してください。
注 : sync_with_stdio が必要になるのは、同じ標準入力ファ
イ ル、出力ファイル、エラーファイルに入出力を行うときだ
けです。 stdin 上で C の標準 (stdio) 入力関数を排他的に
使 用し、 cout 上でストリーム出力関数を排他的に使用する
ことは、難しくはありません。
207デフォルトの名無しさん:2009/09/09(水) 22:13:41
>>206
これは、例えば今回の
printf()

std::cout
を同時に使う場合にも
std::ios::sync_with_stdio()
が必要ということですよね?
208デフォルトの名無しさん:2009/09/09(水) 23:25:56
>>201
まぁ気分はわからんでもないが、iostream も慣れると悪くないよ。
確かに細かいフォーマッティングするときは printf が使いたくなるが。
209デフォルトの名無しさん:2009/09/09(水) 23:50:29
boostのformatってどうなんかね。
210デフォルトの名無しさん:2009/09/10(木) 00:07:58
>>209
それなしでは生きていけない体にされました
211デフォルトの名無しさん:2009/09/10(木) 11:40:04
>>202
>自前のクラスの入出力を自由にカスタマイズ
イミフ
>でないとわざわざiostreamなんか作るわけない
オナニ
212デフォルトの名無しさん:2009/09/10(木) 11:52:45
>>211
>>イミフ

202じゃないけど、Effective C++読んだことある?
213211:2009/09/10(木) 12:03:56
>>212
なんか書いてあったっけ?stream 絡みは読み飛ばしてた。
昼休みに読んでみる。thx!
214デフォルトの名無しさん:2009/09/10(木) 12:37:29
Effective C++でなくてもTCPLやD&Eにも書いてあると思う
215デフォルトの名無しさん:2009/09/10(木) 13:25:49
Cの話題ではないけど、一般的に関数の引数順って
Set( int &先, int 元 );
Copy( int 元, int &先 );
という感じなんでしょうか?
それともどっちかに統一すべき?
216デフォルトの名無しさん:2009/09/10(木) 13:32:13
私はmemcpyを参考にして(先,元)で統一してる
つかC++的には先.copy(元)じゃないんだろうか
217デフォルトの名無しさん:2009/09/10(木) 13:32:58
俺もmemcpy等にならって格納先を前にしてる
しかしstd::copyは逆なんだよな・・・
218デフォルトの名無しさん:2009/09/10(木) 13:58:56
Cでは前者、C++では後者。
わからなくなったら、Cではstrcpyを、
C++ではcopyを思い出すといい。
219デフォルトの名無しさん:2009/09/10(木) 14:51:35
アセンブリ言語の場合、
Intel構文(MASM系)→元、先
AT&T構文(gas系)→先、元
となってる。

C++的には >>216 じゃね。
220デフォルトの名無しさん:2009/09/10(木) 15:39:39
C++的と言ってもマルチパラダイムすぎるからなぁ
OOPだと dest.copy(src); とか dest = src; とか
ジェネリックプログラミングだと copy( src.begin(), src.end(), back_inserter(dest) ); とか
メタプログラミングだと typedef src dest; とか struct dest : src {}; とか
まぁ統一感なんか皆無だから雰囲気に合わせて好きに汁
221デフォルトの名無しさん:2009/09/10(木) 15:43:45
>>219
逆だぞ
222デフォルトの名無しさん:2009/09/10(木) 15:46:04
何でback_inserterとか書いたんだ俺
まぁいいか別に
223デフォルトの名無しさん:2009/09/10(木) 15:59:56
>>221
確かに逆だな。

Intel構文(MASM系)→先、元
AT&T構文(gas系)→元、先

が正解。
224215:2009/09/10(木) 19:07:43
ふむふむ。
統一している人が多そうですね。
自分も自作のものは統一することにしときます。
225デフォルトの名無しさん:2009/09/11(金) 02:48:59
ofstreamで書き出そうとしたファイルと同一名のファイルが既に存在している場合に
エラーを吐くようにしたいのですが、適切なオプションがありません。
どのようにすれば実装できるでしょうか?
226デフォルトの名無しさん:2009/09/11(金) 02:55:13
>>225
ifstreamで一度openして、ストリームの状態を確認するしかない
227デフォルトの名無しさん:2009/09/11(金) 03:34:18
>>225
アトミックにやろうとすると、標準じゃ無理っぽいねぇ。
http://www.google.co.jp/search?q=ofstream+O_EXCL
http://www.google.co.jp/search?q=ofstream+CREATE_NEW
228デフォルトの名無しさん:2009/09/11(金) 10:22:58
よくアトミックにっていう表現を聞くんですが、
それってどういう意味
229228:2009/09/11(金) 10:26:18
× それってどういう意味

○ それってどういう意味でしょうか?
230デフォルトの名無しさん:2009/09/11(金) 10:27:11
他の誰か (プロセスorスレッド) に割り込まれずにっていう意味
ここではファイルが無いことを確認してからそのファイルを作るまでの間に他のプロセスにそのファイルを作られてしまう事態
231デフォルトの名無しさん:2009/09/11(金) 10:32:35
排他的に処理するというのに近いニュアンスなのですね。

ありがとうございます。
232デフォルトの名無しさん:2009/09/11(金) 11:03:37
atomicは分割不能ってニュアンスだよ
つーかアトミックな操作でぐぐれば一発
233デフォルトの名無しさん:2009/09/11(金) 18:27:21
何のためにしたいんだかわかると代替案もでるよね。
234デフォルトの名無しさん:2009/09/11(金) 21:29:26
例外を投げるときは、オブジェクトの状態を元に戻す。
と書いてあったのですが、元に戻せない場合どうすればいいのでしょうか?



//ファイルのようなものを2つオープンする
void open() {
  FILE f1, f2;
  try { f1 = fopen(); } catch (exception &e) { throw e; }
  try { f2 = fopen(); } ←2つ目のオープンに失敗
  catch (exception &e) {
    try { close(f1); } ←1つ目を閉じようとするが失敗
    catch (exception &e { } ← 例外を投げるわけにもいかず、どうしていいかわからない
  }
}


235デフォルトの名無しさん:2009/09/11(金) 22:02:10
>>234
一般的に、ファイルクローズの失敗はオープンしていない状態に戻っていると思うが。
236デフォルトの名無しさん:2009/09/11(金) 22:05:49
普通の例外とより致命的な例外(プログラム全体での続行不能を示す)を用意する
一言で言えば「致命的なエラーが発生しました」で落とせということ
237デフォルトの名無しさん:2009/09/11(金) 22:27:00
try-catch しか使えないの? 戻り値見て判断できない?
あるいは try-catch 使うにしても flag 使ってなんとかならん?
238デフォルトの名無しさん:2009/09/11(金) 22:30:51
「致命的なエラー」を出すと営業マンが起こるんです。
「嘘でもいいから顧客の前でプログラムを止めるな」って。
239デフォルトの名無しさん:2009/09/11(金) 22:36:30
責任取らされるフラグはtrueのままでいいの?
240デフォルトの名無しさん:2009/09/11(金) 22:36:35
>>235
そうなの?

ディスクフルでクローズに失敗した場合
ディスクを開けてから再クローズとか出来ない?
241デフォルトの名無しさん:2009/09/11(金) 22:50:49
>>234
少なくともOpen失敗の例外はthrow再スローさせるんだろうから、
Open直後のClose失敗は無視すればいいんじゃね?
242デフォルトの名無しさん:2009/09/11(金) 22:58:12
醜いし、腕力系かも知れんが、1つずつ開けられることをチェックして、
一旦 close する。両方 OK ならば再度開けて操作に移るというのはダメ?

途中でディスクいっぱいになったり、他のプロセスが書き込んだりとかしたら
何があるかわからんが。その辺は状況によってどれがどこまで大事かというだろう。
243デフォルトの名無しさん:2009/09/11(金) 23:10:38
>ディスクフルでクローズに失敗した場合
普通は、ディスクフルで書き込みに失敗したためにエラーを返すことはあっても
クローズそのものができなくなることはない。
244デフォルトの名無しさん:2009/09/11(金) 23:24:07
>>234
2つめのオープン失敗が外に投げられないと困るでしょ。
close(f1) の失敗はできれば標準エラーやログに出力しとく程度で、最悪無視だろうな。
処理が中断したんなら、どうせ f1 の指すファイルの中身がどうなってるか保証は
できないんだし、そこは対策を考えても無駄でしょ。
245デフォルトの名無しさん:2009/09/11(金) 23:29:44
難しいねこれ
246デフォルトの名無しさん:2009/09/11(金) 23:31:13
ttp://codepad.org/zASwhl4f
このコード、codepadで実行させると上のリンクのように正常に動作しているようですが、
私の環境g++ (TDM-1 mingw32) 4.4.0ですと
0.1
-9.25596e+061
と表示されてしまいます。
どうすれば正常に動作させられるでしょうか?

よろしくお願い申し上げます。
247デフォルトの名無しさん:2009/09/11(金) 23:41:26
>>246
それは、むしろその環境の方がおかしいってことない?
まさかと思って念のため試したが、Linux g++ 4.3.3 で0.1,0.1 になったよ。

248246:2009/09/11(金) 23:50:16
>>247
ありがとうございます。
codepadはg++ 4.1.2 だそうです。

g++ 4.4.0系が悪いか、私のWindows XPが悪いか。。。
249246:2009/09/11(金) 23:55:16
VC++では
0.1
0.1
になりました。
g++かTDMかMinGWが悪いということのようです。
同じ症状の方いらっしゃいませんでしょうか?
250246:2009/09/12(土) 00:02:05
VC++では、long doubleを指定しても実質的にはdoubleと同じでした。
すなわち
std::cout << std::numeric_limits<double>::max() << std::endl;
std::cout << std::numeric_limits<long double>::max() << std::endl;
で得られる値に違いがありませんでした。

251247:2009/09/12(土) 00:17:46
>>250
Linux g++ で試したら違うね。x86_64, i686 どちらの kernel でも違って

1.79769e+308
1.18973e+4932

252デフォルトの名無しさん:2009/09/12(土) 00:20:00
規格ではfloat<=double<=long doubleとしか決まってないから
極端な話、全部charと一緒でも規格準拠
253247:2009/09/12(土) 00:24:06
>>252
規格だけではわからないから、わざわざ試したんだよ。
254デフォルトの名無しさん:2009/09/12(土) 00:24:06
VCはいつからか知らないけど、double == long double。
追い打ちをかけるように、x64ではFPU使わずSSE2で処理する方針。
FPUには32/64/80ビット形式があったが、SSE2には32/64ビットしかない。
255デフォルトの名無しさん:2009/09/12(土) 00:25:43
>>246
x86のGCCってビルド時のオプション次第でlong doubleの大きさが12バイトとか16バイトとか変えられたはず。
libcとgccとでそこら辺が食い違っているとかないかなあ?
256デフォルトの名無しさん:2009/09/12(土) 00:50:40
>>254
そりゃ無茶だろ
超越関数もSSE2で自前で計算するのか
クロック数多すぎるぞ
257デフォルトの名無しさん:2009/09/12(土) 00:56:33
>>246
バグ有りで現在ほとんど使われていないと思われる
TDM-MinGW4.4.1で走らせたら

0.1
0.1

となりました
258デフォルトの名無しさん:2009/09/12(土) 00:59:40
>>256
超越関数はFPUでやろうが
SSE使ってソフトでやろうが
速さは同じだよ。
259デフォルトの名無しさん:2009/09/12(土) 01:01:43
>>258
SSE2にsinとかcosないだろ
260デフォルトの名無しさん:2009/09/12(土) 01:03:22
>>259
誰もSSEに超越関数命令があるなんて言ってない
261デフォルトの名無しさん:2009/09/12(土) 01:07:38
>>260
ソフトでやってFPU並みの速度が出るのか
(;¬_¬)ぁ ゃι ぃ。。。
262デフォルトの名無しさん:2009/09/12(土) 01:12:33
どっかのサイトにSSE2で超越関数のプロファイル取った例書いてある?
Windowsなら QueryPerformanceCounter() 使えば測定できるだろ
263デフォルトの名無しさん:2009/09/12(土) 01:14:15
いいかげんにスレ違いだ。
↓こっちでやれ。
【C++】高速化手法【SSE】
http://pc12.2ch.net/test/read.cgi/tech/1130349336/
264デフォルトの名無しさん:2009/09/12(土) 01:15:43
>>261
未だにFPUが速いと思ってるのか?

755 :デフォルトの名無しさん:2009/07/04(土) 06:45:45
マイクロコード実装のFPU超越関数命令使うより、
四則演算で書かかれた超越関数サブルーチンを使った方が速い。
intelのコンパイラなんて、SSE2未対応CPU向けコードでも
fsin命令は使わず四則演算で計算してる。
265デフォルトの名無しさん:2009/09/12(土) 01:19:48
っていうか俺が適当作ったSSEのsin関数も
FPUより速かった
266デフォルトの名無しさん:2009/09/12(土) 01:29:27
>>264
だから文だけ書くならいくらでも書ける
証拠を見せてと言ってるんだが

>>265
単精度だろカス
倍精度の話してるんだよ
267デフォルトの名無しさん:2009/09/12(土) 01:41:44
>>266
おまえどこまで馬鹿なんだよ
> intelのコンパイラなんて、SSE2未対応CPU向けコードでも
> fsin命令は使わず四則演算で計算してる。
これが証拠なんだが。違うって言うならおまえこそ証拠出してみろよ
268デフォルトの名無しさん:2009/09/12(土) 01:43:14
嘘でも文書は書けるがな
269デフォルトの名無しさん:2009/09/12(土) 01:53:09
自分で手を動かさないような馬鹿に教えるつもりは無い
270デフォルトの名無しさん:2009/09/12(土) 01:53:48
>>267
Intelコンパイラ持ってないんだよ
どこかまとめサイトないのか
271デフォルトの名無しさん:2009/09/12(土) 02:46:00
俺の肛門は世界中の女子まんこより気持ちいい

そういってるのと同じ。
272デフォルトの名無しさん:2009/09/12(土) 03:14:04
>>250
せっかくなのでうちも。

環境
kernel.i686 2.6.18-128.1.14.el5
gcc-c++.i386 4.1.2-44.el5
出力
1.79769e+308
1.18973e+4932
273デフォルトの名無しさん:2009/09/12(土) 07:49:45
>>270 試してみた。
vc8
precise 4.23 mmx
fast 3.44 fsin
intel 11.1
precise 3.19 mmx
fast 2.77 mmx

#include <iostream>
#include <cmath>
#include <boost/progress.hpp>
int _tmain(int argc, _TCHAR* argv[])
{
double x=argc;
{
boost::progress_timer t;
for(int i=0;i<100000000;i++)
x=sin(x);
}
std::cout<<x<<std::endl;
return 0;
}

274デフォルトの名無しさん:2009/09/12(土) 07:53:33
floatでやるともっと速くなるかも。
275246:2009/09/12(土) 11:21:06
>>251
ありがとうございます。
どうやらg++はlong doubleをまともに導入しているようですね。

>>252
それは存じ上げておりますゆえ
std::cout << std::numeric_limits<double>::max() << std::endl;
std::cout << std::numeric_limits<long double>::max() << std::endl;
として確認したものでございます。

>>255
なるほど、その可能性はあるかもしれません。
探ってみます。

>>257
ありがとうございます。
TDM-MinGW4.4.1ですか・・・あまり入れたくないですね。

>>272
ありがとうございます。

276246:2009/09/12(土) 12:36:59
解決しました。

TDM-MinGW4.3.3 -> ×
TDM-MinGW4.4.0 -> ×
TDM-MinGW4.4.1 -> ○

ということで、
TDM-MinGW4.4.1で修正されたバグだったようです。

どうもありがとうございました。
277デフォルトの名無しさん:2009/09/12(土) 22:26:14
MyClass x, y;
 処理1(x, yを変更する。)
MyClass z, w;
 処理2(z, wを変更する。)

としたいのですが、最初からまとめて宣言して
MyClass x, y, z, w;
 処理1(x, yを変更する。)
 処理2(z, wを変更する。)
とした方が処理速度的に良いってことはありますか?

また、
MyClass hoge[4];
 処理1(hoge[0], hoge[1]を変更する。)
 処理2(hoge[2], hoge[3]を変更する。)
とした方が処理速度的に良いってことはありますか?
278デフォルトの名無しさん:2009/09/12(土) 22:33:08
ほとんど一緒かと
実際に遅くて困ってて、そこがボトルネックだと判明したんでもなければ、そんな細かいこと気にしない方がいい
いちいち気にしてたらプログラミングが進まない
普段は読みやすさを優先するべき
279277:2009/09/12(土) 22:34:14
>>278
> 普段は読みやすさを優先するべき
分かりました。
ありがとうございます。
可読性を優先していこうと思います。
280デフォルトの名無しさん:2009/09/12(土) 23:13:41
C++を勉強中なんだけど、メンバ関数ポインタとデリゲートの違いがよく分からない。

http://www7b.biglobe.ne.jp/~robe/pf/pf016.html
ここによると、特定のクラスに依存せずオブジェクトも保持できるように書いてるけど、
templateや、安全面には気を使うという前提でvoid*を使うとかで依存させずに
オブジェクトはメンバ変数で持つとかで対応できるような気がする。

JavaやC#で実装されてるので何かしら便利だと思うんですが何か違いがあるんですか?
281デフォルトの名無しさん:2009/09/12(土) 23:15:57
JavaやC#には関数ポインタがないから、便利とかいうより他にやりようがなかろう?
282デフォルトの名無しさん:2009/09/12(土) 23:18:37
>>280
メンバ関数ポインタは this ポインタを与えてやらないと呼び出せない。

「〜で対応できる」の部分については、 boost::function (および次期標準規格の
std::function )がその役割をカバーしている。 boost::function が「デリゲート」に近い。
283デフォルトの名無しさん:2009/09/12(土) 23:23:41
>>280
メンバ関数ポインタとデリゲートは目的は似てるといえるけど実装方法が違う。
C++でC#のデリゲート相当を使いたい場合は関数オブジェクトの使い方を勉強すると良い。
さらにboost::function boost::bind boost::signals2を使うとC#のデリゲートやイベント構文相当が簡単に使える。

284デフォルトの名無しさん:2009/09/12(土) 23:32:19
C++は、(Cのような)グローバルな関数・静的メンバ関数とメンバ関数とでポインタの扱いが異なるのが面倒。

C#のデリゲートは静的なメソッドもそうでないメソッドも同じように代入できるのがいい。
(もちろん、共に引数・戻り値の型が程度はともかく合っていないといけないけど)

そして、C++でもその手の仕組みを書けば、全部共通して扱えるのが便利。
普通はbindとfunctionを使うけど。
285デフォルトの名無しさん:2009/09/12(土) 23:41:57
>>276
そんな bug があるって恐ろしいね。使いたくない環境だ。
286デフォルトの名無しさん:2009/09/12(土) 23:45:04
確かにTDM 4.4.0はもうDLできないようにされてしまってるから
バグなんだろうなあ
287246:2009/09/13(日) 00:13:28
>>285-286
しかし TDM-MinGW4.3.3 -> × でもバグをもっているあたり、
TDMが気付いていなかったとしか。

   どなたか、私や>>257さん以外で
    「Windowsで」
    TDM-MinGW4.3.3 , TDM-MinGW4.4.0 , TDM-MinGW4.4.1
   を入れている方がいらっしゃいましたら、
   宜しければ是非
   ttp://codepad.org/zASwhl4f
   を試して頂けませんでしょうか?

ってttp://pc12.2ch.net/test/read.cgi/tech/1221233882/で聞いてみようかと思います
288280:2009/09/13(日) 01:42:37
なるほど、関数オブジェクトですか…
よく分かんないからとばしたんですよね、ちょっと勉強してみます。
289デフォルトの名無しさん:2009/09/13(日) 03:30:06
C++のABIについて詳しく書かれた書籍を教えてください。
290デフォルトの名無しさん:2009/09/13(日) 06:52:41
>>287
coutが対応していないだけでは?
数値はあってるけど、ふつうにdoubleとして出力しているとか
291デフォルトの名無しさん:2009/09/13(日) 07:11:12
関数オブジェクトなんてここの1レスで説明できるくらい簡単だと思うがなぁ。

// 関数定義例
int add ( int x, int y ) {
return x+y;
}
// その呼び出し例
int a,b;
add(a,b);

これが、関数オブジェクトだと
// 関数オブジェクト定義例
struct add {
operator () ( int x, int y ) {
return x+y;
}
};
// その呼び出し例
int a,b;
add()(a,b);
// 別の呼び出し例
int a,b;
add f;
f(a,b);

違いは、関数がオブジェクトになること。
例えばsortテンプレートに比較関数を与える場合、関数ポインタを与えると関数コール
が生成されるが、関数オブジェクトを与えるとインラインで展開される可能性が高く、
比較関数のような小さいコードではインライン化の利得が大きい。
まぁ述語関数オブジェクトには罠もあって、状態を持つような関数オブジェクトだと
関数オブジェクトのインスタンス自体をコピーしてしまうテンプレートアルゴリズム
では問題が出たりする。とはいえ、基本的には簡単な概念だ。
292280:2009/09/13(日) 07:47:29
>>291
うん、なんかすっげー簡単だね。難しく考えすぎてたみたい。
でも、自分のしたいことはクラスの特定のメンバ関数を別のクラスに渡したいんだけど、
これは、メンバ関数ポインタかデリゲートを使うところだよね?
293デフォルトの名無しさん:2009/09/13(日) 07:57:35
渡すってのが何をしたいんだか分からんけど、ポインタ的に渡すならboost::function
でいいんじゃね
294280:2009/09/13(日) 08:02:45
そうそうポインタ的に渡したい。
でも、boostは使えない環境なので何とか自分でやってみます。
295デフォルトの名無しさん:2009/09/13(日) 08:05:00
>>292
ロベールで言えばChapter13という事になるが、出来ないんじゃね?
メンバ関数を呼び出すにはあくまでもthisポインタが必要なので、
オブジェクトのインスタンスがどうしても必要になる

それだったらメンバ関数へのポインタを他のクラスに渡すという考え方を
やめて、コンポジションで処理すべき
296デフォルトの名無しさん:2009/09/13(日) 08:05:09
>>292
特定のメンバ関数を呼び出す関数オブジェクトを作って渡せば可能。
関数オブジェクトを作るのが面倒なら、boost::bindを使うと関数オブジェクトを
式内で簡単に作ってくれる。

297デフォルトの名無しさん:2009/09/13(日) 08:34:17
>>296
済まないがboost::bindを使わないでやるサンプルコードを
簡単な物でいいからCodePadに貼って欲しい

どうしても概念が理解できない
298デフォルトの名無しさん:2009/09/13(日) 08:46:59
>>297
それこそ>>280のページのIFoo/CFoo。
attach(Foo(this, &Test::hoge));をbindで書き直すとattach(bind(&Test::hoge, this))となる。
299デフォルトの名無しさん:2009/09/13(日) 08:57:04
別にメンバ関数ポインタでもいいんじゃよ
300デフォルトの名無しさん:2009/09/13(日) 09:03:27
ちなみにboost::functionのソースは相当難解だから、色々な前提知識無しにいきなり
読んでも多分挫折する
301デフォルトの名無しさん:2009/09/13(日) 09:09:18
>>298
サンクス
継承をうまく使うわけね
302デフォルトの名無しさん:2009/09/13(日) 09:22:57
>>297 bindを使いたくないなら関数オブジェクトで十分同じことができる。
303デフォルトの名無しさん:2009/09/13(日) 09:36:29
>>301
継承は実現するための1つの手段。それ以外のやり方もある。
304デフォルトの名無しさん:2009/09/13(日) 09:40:31
>>297 bindとfunctionのサンプル書いてみた
#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
class Hoge
{
public:
void print(int a,int b){std::cout<<"a="<<a<<" b="<<b<<std::endl;}
};
template<class F>void Fuga(const F& a){a(200);}

void Huga(const boost::function<void(int)>& a){a(30);}

int _tmain(int argc, _TCHAR* argv[])
{
Hoge a;
Fuga(boost::bind(&Hoge::print,&a,_1,100));
Huga(boost::bind(&Hoge::print,&a,_1,90));
boost::function<void(int)> f=boost::bind(&Hoge::print,&a,50,_1);
Fuga(f);
Huga(f);
return 0;
}

305デフォルトの名無しさん:2009/09/13(日) 09:45:52
>>294
ちなみに、新しいg++とかVC++とかだと標準でbindもfunctionも付いているよ。
そうでないなら仕方ないけど。
306デフォルトの名無しさん:2009/09/13(日) 09:46:16
関数オブジェクトも「それを使ったサンプルを作ろう」と思うと使えるのに、
アプリを書いているときに自然には書けないんだよな。
未だ自家薬籠に入ってないらしいw
307デフォルトの名無しさん:2009/09/13(日) 09:48:09
ゼロオーバーヘッドを目指すと自然に関数オブジェクトに辿り着く時はある
308デフォルトの名無しさん:2009/09/13(日) 10:12:38
>>304
こりゃまたエラい見た目簡単そうなコードになりますね
コンパイルすると引き延ばされて大きくなりそうだけど
309デフォルトの名無しさん:2009/09/13(日) 10:45:50
結局最適化で小さくなるなら問題なし
310デフォルトの名無しさん:2009/09/13(日) 10:55:27
>>307
functionはテンプレート関数にしなくてもファンクタが渡せて便利な分、
TypeErasureのために関数ポインタか仮想関数分のオーバーヘッドがあるってことだね。

311280:2009/09/13(日) 10:55:47
http://marupeke296.com/DP_Delegate.html
ここ見て何とかできました。ようは、クラスのメンバ関数をコールバック関数にしたかったんです。
312デフォルトの名無しさん:2009/09/13(日) 11:02:33
>>311
なかなかいいHPだな。
313デフォルトの名無しさん:2009/09/13(日) 11:05:17
いろんなとこからパクってるとこだな
まぁ見やすいし便利ではある
ただしやね信者
314デフォルトの名無しさん:2009/09/13(日) 13:04:22
たまには、boost総合スレを思い出してください。
315280:2009/09/13(日) 15:55:29
typedefでのtemplateって出来ないんですよね?
仕方がないからdefineでやるしかないのかなぁ。
316デフォルトの名無しさん:2009/09/13(日) 15:58:46
C++0xでできるようになるらしいから、あと1年まとうぜ。
317デフォルトの名無しさん:2009/09/13(日) 16:07:12
そう…ですか。それまでdefine様にすがってます。
318デフォルトの名無しさん:2009/09/13(日) 17:24:10
>>316
C++0xはあと3〜4ヶ月程度で本当に出来るのか?
まさかとは思うが
C++0fまでokとかじゃないよな?
319デフォルトの名無しさん:2009/09/13(日) 17:45:10
C++0xの一部の機能は既に実装され始めているからそう悲観するなって
320デフォルトの名無しさん:2009/09/13(日) 17:51:50
テンプレート引数としてクラステンプレートを渡す時、
閉じカッコが
>>
となると左ビットシフト演算子と同じになって…(ry

ってのは、C++0xでは例外的に認める方針で解決されるんだっけ?
321デフォルトの名無しさん:2009/09/13(日) 18:17:16
C++0xでは>>の閉じ括弧は仕様になったよ。現在のコンパイラでも使えるものもあるよ。
322デフォルトの名無しさん:2009/09/13(日) 18:35:35
>>321
よかった!
ありがとうございます。
323デフォルトの名無しさん:2009/09/13(日) 18:48:15
二次元配列の演算子オーバーロードって出来るんですか?
324デフォルトの名無しさん:2009/09/13(日) 18:52:24
>>318
禿はC++10か11になるだろうとどこかで言ってた気がする
325デフォルトの名無しさん:2009/09/13(日) 19:45:35
>>323 二次元配列の演算子というものは無い。[]演算子を2個組み合わせて二次元配列を作っている。
[]演算子そのものはオーバーロードができるのでこれを同様に2個組み合わせることになる。
具体的に言うと一個目の[]で2次元配列から1次元の配列を返し、それを2個目の[]で要素を返すようにする。
326デフォルトの名無しさん:2009/09/13(日) 20:26:44
>>325
実装の仕方がわかりません。
T &operator[](int i, int j) const { 中身省略 }
これだとエラーになるんで。
327デフォルトの名無しさん:2009/09/13(日) 20:33:54
>>326
お前、話聞いてなかったろwwww
328デフォルトの名無しさん:2009/09/13(日) 20:38:02
>>326 []演算子の引数は1個だけ。AというクラスでBというプロキシーオブジェクトを返し、Bオブジェクトから要素への参照を行う。
class A{
public:B& operator[](int i){省略}
};
class B
{
public:
int& operator[](int j){省略}
};

int s=a[100][100];
329デフォルトの名無しさん:2009/09/13(日) 20:47:14
libjpegというフリーのライブラリを使ったソフトを配布(ソースは配布せず、.exeのみ)したいのですが、
ライセンス表示をどのようにしようか迷っています。

ttp://www.syuhitu.org/other/jpeg/jpeg.html
>バイナリのみで配布するのなら、どこかに
>"this software is based in part on the work of the Independent JPEG Group"
>という記述を加えること。

今、考えているのは以下のどちらかなんですが、

A:ソフトを配布するWebサイト上でのみライセンス表示する

B:配布ソフトといっしょにReadMe.txtとかLicense.txtみたいなファイルを付けて、
  そこにライセンスを記述する

Aってマズいでしょうか??
330デフォルトの名無しさん:2009/09/13(日) 20:49:19
>>329
スレ違いだし、日本語読めないの?
331329:2009/09/13(日) 20:50:55
>>330
失礼しました。
こういうのって、どのスレで聞くべきなんでしょうか?
332デフォルトの名無しさん:2009/09/13(日) 20:53:58
>>331
このスレなどいかが?

【殺しの】ライセンス【道で拾った】
http://pc12.2ch.net/test/read.cgi/tech/1045006087/
333329:2009/09/13(日) 20:54:42
>>332
ありがとうございました!
334デフォルトの名無しさん:2009/09/13(日) 23:07:53
C++0xのstatic_assertに対応しているかどうかを
マクロで調べたいんですが、
どうすれば良いか教えていただけますでしょうか?

つまり
#ifdef C++0xのstatic_assertに対応している
static_assert( CONSTANT-EXPRESSION, "error-message" ) ;
#else
assert( CONSTANT-EXPRESSION ) ;
#endif
としたいのです。

BOOST_STATIC_ASSERTは訳あって使えないのですが、
よろしくお願い申し上げます。
335デフォルトの名無しさん:2009/09/13(日) 23:24:03
>>334
static_assert はコア言語の機能で、マクロはプリプロセッサのものだから、無理。
次期規格で __cplusplus の値が更新されたりすれば使えるかもしれないけどね。

そもそも static_assert() は assert() で代用できるようなもんじゃないし、
BOOST_STATIC_ASSERT が使えなくてもコンパイラさえ限定すれば自前で実装しても
たいして難しくないよ。
336334:2009/09/13(日) 23:36:23
>>335
なるほど、そうですか。
どうもありがとうございました。
337334:2009/09/14(月) 00:27:38
ttp://codepad.org/elvsrpFF
とりあえずconst bool型のコンパイル時定数のみに
対応させたmy_c_assertを作ってみました。
しかし、これではまだ
 typedef MyNS::my_c_assert<yyy> piyo;
の部分もコンパイルが通ってしまいます。
 piyo p;
としておけば
 aggregate 'main()::piyo p' has incomplete type and cannot be defined
の様に言われてコンパイル時エラーになるのでいいのですが、
それだとtrueの場合に
 hoge h;
に対して
 warning: unused variable 'h'
と言われてしまいます。

ここからどうすればfalseの時だけコンパイル時エラーになり、
trueの時はwarning: unused variableが出ないように出来るでしょうか?

よろしくお願い申し上げます。
338デフォルトの名無しさん:2009/09/14(月) 07:25:34
>>337
sizeof 使うとか。
339デフォルトの名無しさん:2009/09/14(月) 12:33:53
ttp://codepad.org/ExxXteng これでいけますね。 ありがとうございました
340デフォルトの名無しさん:2009/09/14(月) 13:14:22
俺は電車が好きで、中学生のころ
よく8つ離れた兄のところへ新幹線でいったんだ。

ちょっと高いからだけだからって、時々とうちゃんがグリーン車の代金をくれて
乗っていったんだが、そのたびに周りの客に「生意気ながきだ」みたいな目で見られて。

そういう大人にはならないどこうと肝に銘じたもんだ。
341デフォルトの名無しさん:2009/09/14(月) 14:33:36
placement newでクラスインスタンスを配列で生成しようとしたのですが、

void *vp = malloc( sizeof(T) * count );
T *tp = new(p) T[count];

これだと確保したメモリ領域の先まで上書きされるようなんです。
これはどうしてでしょうか?
また、どのように解決すればいいでしょうか?
342デフォルトの名無しさん:2009/09/14(月) 14:36:46
new(vp)じゃねえの
単なる写しミス?
343デフォルトの名無しさん:2009/09/14(月) 14:48:29
>>342
書き間違えました
それが原因ではないので気にしないで下さい
344デフォルトの名無しさん:2009/09/14(月) 15:02:29
確保した領域の先まで書くようなコードになってるんじゃないの?
345デフォルトの名無しさん:2009/09/14(月) 15:08:05
>>344
newの段階で書き込みが発生しました。
346デフォルトの名無しさん:2009/09/14(月) 15:11:40
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-3.html

なんか配列の個数の情報が入ったりするみたいですね。
347デフォルトの名無しさん:2009/09/14(月) 15:11:44
とりあえず
ttp://codepad.org/
に再現するsourcecodeを書いて。
話はそれからだ
348デフォルトの名無しさん:2009/09/14(月) 15:14:36
>>341
一般にnew T[N]はsizeof (T) * Nと同じだけのメモリを使うわけではない。
delete[]のときのため要素数を記録する分多くメモリを使う。

new(p) T[count]の場合もそうだと思う。
forなどで、new(p + sizeof(T) * i) T;などとすればいいと思う(pはchar型にでもして)。
ちなみに、forを使わずともuninitialized_fill_nなんかでもできる。
349デフォルトの名無しさん:2009/09/14(月) 16:37:21
>>341
短く言うとnew T[N]で必要な領域はsizeof(T)*Nじゃないから

配列形式のplacement newはC++の暗黒面だから諦めたほうが良い。
350デフォルトの名無しさん:2009/09/14(月) 17:00:39
alignment_ofとかあるんだよな…
351デフォルトの名無しさん:2009/09/14(月) 18:48:27
struct str{
vector<a> vec;
};
list<str> lst;
こんな感じでlistの中にvectorを使っている場合の削除について質問なんですが、lstでeraseまたはclearをすると
vectorではclearとかはしなくていいのですかねぇ。それともしたほうがいいの?
しなくてもメモリリークは起きなかったけれども
352デフォルトの名無しさん:2009/09/14(月) 19:12:36
しなくていい
353デフォルトの名無しさん:2009/09/14(月) 19:32:16
>>341
配列のplacement newはには何らかの情報が追加として必要になる。要素数の場合が多いであろうが決まっていない。そのため確実に動作を保証できないので使わないほうがいい。
実際は、多めにとったメモリブロックに普通のplacement newを実際に必要な数だけforしたほうが効率がいい。
354デフォルトの名無しさん:2009/09/14(月) 19:33:32
質問です。
同じプログラムをコピーして、同じVC++でコンパイルしているのですが、片方ではコンパイルできて、もう片方ではエラーが出てくるような場合は何が原因として考えられるでしょうか?

よろしければ自分で調べるヒントになるようなキーワードなども教えていただけるとありがたいです。よろしくお願いします。
355デフォルトの名無しさん:2009/09/14(月) 19:41:46
まずはエラーメッセージを貼ることから始めよう。
356デフォルトの名無しさん:2009/09/14(月) 19:42:41
せめてどんなエラーなのかくらい書かないと何も分からんだろうがボケナス
そんなだからお前のコードは後で読めなくなるんだ
357デフォルトの名無しさん:2009/09/14(月) 19:50:18
>>355
>>356
申し訳ありませんでした

error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
warning C4183: 'd1': 戻り値の型がありません。'int' を返すメンバ関数とみなします。
error C2236: 予期しない 'class' 'c2' です。';' が入力されていることを確認してください。
error C2143: 構文エラー : ';' が '{' の前にありません。
error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)

以上です。エラーが出ないほうのソースをコピーしても、コンパイルできないほうに全部貼り付けてみても無理でした
どうかよろしくお願いします
358デフォルトの名無しさん:2009/09/14(月) 19:53:20
どっかでinclude忘れてね?
359デフォルトの名無しさん:2009/09/14(月) 19:56:52
stdafx.hをコンパイルオプションでインクルードしてるケースもあるな
360354,357:2009/09/14(月) 20:01:38
>>358
コピーしてきてるので、忘れてるということはないと思います。(コピー範囲もちゃんとチェックしました)

>>359
具体的にどういうことでしょうか?
361デフォルトの名無しさん:2009/09/14(月) 20:04:17
最初にエラーの起きた行の周辺も必要かな。
362デフォルトの名無しさん:2009/09/14(月) 20:07:56
例えば、片方のプロジェクトのオプションで、
構成プロパティ→C/C++→詳細→必ずインクルード
のとこの設定が違ったりするとか。

まぁでもぶっちゃけまだ情報不足。エラーの出た行とその前後くらいは欲しい。
識別子が型として認識されてない時のエラーに似てるから、インクルードされてない
のかな、と思った程度で、結構エスパー訓練状態。
363354,357:2009/09/14(月) 20:13:35
>>361
レスありがとうございます。6行目、12行目のエラーなのですが、
1: #include <selen.h>
2:
3: nt WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
4:
5: using namespace Selene;
6: const Point2DI SCREEN_SIZE( 640, 480 );
7:
8: Engine::ICore *pCore = NULL;
9:
10: //エンジンアクセス用のコア生成
11:
12: #ifdef SLN_DEVELOP
13: if ( !Selene::InitializeEngine( L"Selene.Develop.dll" ) )
14: #else
15: #ifdef SLN_DEBUG
16: if( !Selene::InitializeEngine( L"Selene.Debug.dll" ) )
17: #else
18: if( !Selene::InitializeEngine( L"Selene.dll"))
19: #endif
20: #endif
{
goto EXIT;
}

いちおうSeleneというのはこちらのことです
http://selene-lue.halfmoon.jp/document/Engine/index.html
http://selene-lue.halfmoon.jp/document/Utility/index.html
364デフォルトの名無しさん:2009/09/14(月) 20:21:49
どうしてプロジェクトファイルはコピーしなかったのはなぜ?
365354,357:2009/09/14(月) 20:27:06
>>364
とくに理由はないのですが、強いて言うなら新しくSeleneというものを使ってみようと思い、自分でやってみました
366デフォルトの名無しさん:2009/09/14(月) 20:35:00
そのインクルード、パスはあってる?
右クリックで開けるか確認した方がいいかも
367354,357:2009/09/14(月) 20:47:28
>>366
開くことができました
すいません、今自分でも模索してたところでした
368デフォルトの名無しさん:2009/09/14(月) 21:18:56
確かにplacement newの配列版はC++の暗黒面だわ
予め正確なサイズを知る事が出来ないわけだからなあ
369デフォルトの名無しさん:2009/09/14(月) 22:12:49
カツカツにしなければよいのではないの?
370354,357:2009/09/14(月) 22:39:24
すいません、いまだにできません。
仕方ないのでいったん断念します。考えてくださった方ありがとうございました

また何かあったらよろしくお願いします。
371デフォルトの名無しさん:2009/09/15(火) 03:33:43
さすが東方厨
372デフォルトの名無しさん:2009/09/15(火) 08:07:46
>>369
要素数値の領域が何バイトとられるかも決まってないから
たとえ要素の並びのいっこ前が要素数だとしてもどこから配列として使えるのか分からない
それに要素の並びの1つ前が要素数だと決まってるわけでもない

ってことでムリっぽい
373デフォルトの名無しさん:2009/09/15(火) 16:47:59
>>371
なんで東方厨って分かった?
374デフォルトの名無しさん:2009/09/15(火) 17:18:36
ヲタへ話を広げんな
375デフォルトの名無しさん:2009/09/15(火) 17:20:22
>>374
だって気になるじゃん。
376デフォルトの名無しさん:2009/09/15(火) 19:47:44
>>372
カツカツじゃなくてもまともに動作する領域をくれないということ?
377デフォルトの名無しさん:2009/09/15(火) 21:15:13
>>341の事象がよくわからないのですが。
↓のコードでは特に問題ないよう。
何が間違ってますか?

#include "stdafx.h"
#include <iostream>
#include <new>

static int g_size   = 0;
class T
{
    int a;
public:
    static void*    operator new        (size_t size, void* buf) throw(){g_size+=size;return buf;}
    static void     operator delete     (void* buf) throw(){;}
    static void*    operator new[]      (size_t size, void* buf) throw(){g_size+=size;return buf;}
    static void     operator delete[]   (void* buf) throw(){;}
};

int _tmain(int argc, _TCHAR* argv[])
{
    int count = 2;
    void *vp = malloc( sizeof(T) * count );
    T* i = new(vp) T[count];
    delete [] i;
    std::cout << g_size << std::endl;
    return 0;
}
378デフォルトの名無しさん:2009/09/15(火) 21:43:07
>>377
デストラクタを持たせてみると落っこちるかもしれない。
あるいは、お前の実行環境ではちょっとくらい確保した量を超えての読み書きが許されていて、何も起きないのかもしれない。
379デフォルトの名無しさん:2009/09/15(火) 22:11:41
>>378
確かにデストラクタを入れたところ、freeで落ちました。
そこで、確保するヒープのサイズを適当に増やしたところ
落ちなくなりました。
それ以前に、newを呼び出したとき先頭4byteに個数が
入っているのを見落としていました。
理解しました。ありがとうございました。
380デフォルトの名無しさん:2009/09/15(火) 23:06:50
ttp://codepad.org/Ey88Jw2r
ttp://codepad.org/Voi7aXyd
ttp://codepad.org/zmCqqX6L
文字列ptrの先頭n文字を返すこのような関数fooを作りました。
これら3つは、関数fooの中身の一部分しか変わっておりません。
かなり無理矢理というかわざとらしい例ですみません。

この3つのうち、どれが望ましい(スピードや安全性などの面から言って)でしょうか?

よろしくお願い申し上げます。
381デフォルトの名無しさん:2009/09/15(火) 23:14:06
1はない。
2が無難。
速度的には3かな?
382デフォルトの名無しさん:2009/09/15(火) 23:28:30
速度的には3。
ただこれもまだ高速化の余地がありまくる。
383デフォルトの名無しさん:2009/09/15(火) 23:48:33
オブジェクトがオブジェクトに命令を与えるのがオブジェクト指向って何処かで見たけど

つまり
とあるクラスの実体Aが、別のクラスの実体Bに命令を出して
実体Bはその命令に従ったメンバ関数を実行する

って事で良いの?
384380:2009/09/15(火) 23:50:22
>>381-382
ありがとうございます。
3で行こうと思います。

> ただこれもまだ高速化の余地がありまくる。
すみませんだいぶ無理のある例で。
あくまで例のためのソースでして、ご容赦ください。
385デフォルトの名無しさん:2009/09/15(火) 23:52:01
>>383
別にそれだけじゃないとは思うけど、
醍醐味はそうだろうね。
386デフォルトの名無しさん:2009/09/15(火) 23:57:14
>>380
これじゃいかんの?
--
std::string foo(unsigned int num, const char * const ptr)
{
return std::string(ptr, ptr + num);
}
387デフォルトの名無しさん:2009/09/16(水) 00:02:17
>>386
ちょっと類似した件のための例ですので。
実務でしたら、私だったら
std::string(ptr).erase(num)
の1行で終わらせます。
388デフォルトの名無しさん:2009/09/16(水) 00:21:46
いや一行なら>>386さんのおっしゃる通り
std::string(ptr, ptr + num);
の一行の方が美しいですね。
ありがとうございます。

ですがあくまで例のためのソースでして、ご容赦ください。
389デフォルトの名無しさん:2009/09/16(水) 00:24:43
>>385
うーん。
命令を出すって言うのがいまいちパッと来ないで困る。

プログラムで簡単なサンプルとか無い?
390デフォルトの名無しさん:2009/09/16(水) 02:12:50
>>389
風が吹けば桶屋が儲かる
391デフォルトの名無しさん:2009/09/16(水) 02:22:54
ピタゴラスイッチ
392デフォルトの名無しさん:2009/09/16(水) 04:18:47
C++は力を得る為にあらゆるものを取り込んだ怪物だから、全面的にOOPで書くのは
異様。アルゴリズムと型の分離という抽象化も平気でやる言語だし。問題に合う方法論
を自由に選べるのがおいしい訳で、一つの方法論だけでやってくとおいしくない。
オブジェクトがオブジェクトに命令を送ってメンバ関数を、って形態をC++で素直に
表してるのは仮想関数のディスパッチあたりだろうけど、仮想関数じゃないなら単に
「メンバ関数コールは命令送出そのものである」くらいのシンプルな捉え方でいい。
つーか「全てがオブジェクトである」というタイプのOOPじゃないから、そういう世界
の話を持ち込むと混乱しがち。純OOPで表現しようとすると逆に複雑で訳分からなく
なることも多いし。そもそも標準ライブラリが純OOPじゃないし。
393デフォルトの名無しさん:2009/09/16(水) 05:29:20
使えそうならどんなスタイルでもやっちまうので結果カオスに
でも劇団「プロジェクトひとり」ならマイモンタイ
394デフォルトの名無しさん:2009/09/16(水) 07:00:07
395デフォルトの名無しさん:2009/09/16(水) 07:21:29
関数型以外で末尾再帰とかほとんど書かないのと同じことだよ。
OO特化言語でもなければ、オブジェクトと非オブジェクトが混在するのは自然だし、
設計に問題がある訳でもない。
396デフォルトの名無しさん:2009/09/16(水) 18:02:09
void F( std::string &s ){
 size_t size = data_size;
 s.resize( size );
 memmove( s.c_str(), data, size );
}

これって有効な操作?
ようは、渡されたsに対して、新しい文字列を割り当てたいんだけど。
397デフォルトの名無しさん:2009/09/16(水) 18:12:48
>>396
c_str()は読み取り専用だったはず。
std::string::assign()を使えよ。
398デフォルトの名無しさん:2009/09/16(水) 18:48:52
>>396
そもそもstringのc_str()で得られる内部の配列は、連続していることが保証されてないからダメだよ。
399デフォルトの名無しさん:2009/09/16(水) 18:52:54
>>398
c_strを根底から揺るがす新理論
400デフォルトの名無しさん:2009/09/16(水) 18:54:47
ああ、新し過ぎるな
401デフォルトの名無しさん:2009/09/16(水) 18:56:43
stringの内部バッファの連続性が(今のところ)保証されてないのはその通りだけど
それと勘違いしてるんじゃないの
402デフォルトの名無しさん:2009/09/16(水) 19:04:34
あるテキストファイルの内容を読み込むときに、
改行コードまで読み込むにはどうすればよいでしょうか?
今はgetlineでやっているのですが、読み込んでくれないようです。
403デフォルトの名無しさん:2009/09/16(水) 19:16:21
自分でくっつければいいじゃん

\nか\r\nかを見たいなら、そもそもテキストとして扱うと勝手に変換されちゃうから
バイナリモードで開いて直接探索するしかない
404デフォルトの名無しさん:2009/09/16(水) 19:19:45
なるほど見透かされてますね。
ありがとうございます。バイナリで開いて頑張ってみます。
405デフォルトの名無しさん:2009/09/16(水) 20:24:12
>>392
次世代の怪物Scalaはどうよ
JVM上でhlistが実装できるぜ
406デフォルトの名無しさん:2009/09/16(水) 20:25:42
JVMを使うならJavaで十分
407デフォルトの名無しさん:2009/09/16(水) 20:54:41
Javaで十分な人はそれでいいんじゃね
scalaは今後どんどん注目されるだろうな
アクターモデルとかすばらしい
408デフォルトの名無しさん:2009/09/16(水) 21:46:17
VMの鬼もっさりが解消されれば別だけど、携帯すらネイティブコードに向かってる
ご時世だからなぁ
409デフォルトの名無しさん:2009/09/16(水) 22:22:34
>>408
VMって結局インタプリタだしオーバーヘッドは大きいよな。
JITだといっても実行時にコンパイルするってオーバーヘッド大きすぎ。.NETなんか
初めて開くダイアログなんか遅すぎるよね。
410デフォルトの名無しさん:2009/09/16(水) 22:31:29
いや、一応Crusoeみたいに動的にボトルネックを探して最適化するから、ただの
インタプリタじゃない。
とはいえ、結局は重い。Crusoeと同様に。
ボトルネックの負荷が激しいなら、激しくヘタクソなC++コードよりは高速動作
することもある。海外にそんなブログがあって、どっかのスレで念入りな検証を
されてボコられてたが。
411デフォルトの名無しさん:2009/09/16(水) 22:38:18
JAVAはGCの結果効率的にオブジェクトが配置されるため高速化されることが期待できる
からネイティブより速くなることがあるとか読んだことがあるけど、実際どうなのかな。
それなら最初からメモリ配置を設計できるネイティブ系の言語のほうがいいような気もするけど。
412デフォルトの名無しさん:2009/09/16(水) 22:43:20
Googleの誰かが「将来はVMの方がネイティブコードより軽くなるかもしれない」と
講演で言ってたみたいだけど、現時点では遙かに遠い話に見えるなぁ。
Crusoe系列が生きていたら将来Core系列に勝てるようになっただろうか、という
想像に似ている気もする。
ただ、VMの方がマルチコアで慢性的に余ってるスレッドを活用しやすいから、それを
スカウトスレッドやら投機的MTやらに活用するようになってきたりしたら、逆転は
十分にあるな。
まぁその時は、乗り換えてもいいし、C++/CLIでVM使ってもいいし、両方使い分け
もいいし。JVMもCLIも大体同レベルで進歩するだろうから。
413デフォルトの名無しさん:2009/09/16(水) 22:54:18
>>412
ふーん、そんな予想が立ってるのか。
しかしそんな将来なら今度は
> マルチコアで慢性的に余ってるスレッドを活用しやすい
これをネイティブコードで解決する技術が出現してくるんじゃないかと思われる。
414デフォルトの名無しさん:2009/09/16(水) 22:59:22
まぁでもGoogle所属の人ってだけだし、予測が外れるなんてごく普通だからなぁ

>>411
次々期C++がGCを取り込もうとしてるのはその辺の関係もあるのかもしれないな
415デフォルトの名無しさん:2009/09/16(水) 23:19:19
質問なのですが、
sizeofって文脈によって意味が変わりますよね?

sizeof("hoge")では何が返るとか、
そういったsizeofの使い方はどこで分かるのでしょうか?

よろしくお願いいたします。
416デフォルトの名無しさん:2009/09/16(水) 23:33:10
>>45
型が指定されれば、メモリ上でその型のオブジェクトが占めるバイト数。
値が指定されれば、その値の型について上記と同様。

変わるっていってもこの2つだけでたいした違いはないはずなんだけど、
何か勘違いしてない?
417デフォルトの名無しさん:2009/09/16(水) 23:33:21
>>415
つまるところ、文脈によって意味が変わるのではないかという勘違いをしてるだけじゃないかなぁ
418デフォルトの名無しさん:2009/09/16(水) 23:34:08
>>416
あれ?その2つでしたか。
いまいちとらえどころがないなぁと思っていたのですが。

ありがとうございます。
419416:2009/09/16(水) 23:34:42
アンカーミスった。 × 45 ○ >>415
420デフォルトの名無しさん:2009/09/16(水) 23:48:28
もしかしてこれか?
int a[3]; sizeof(a) 配列全体のバイト数
int* a; sizeof(a) ポインタのサイズ
421デフォルトの名無しさん:2009/09/16(水) 23:54:16
>>420
まさにそれです。。。
配列が絡むと何を返してくるのかよく分からなくて。

しかしその2つの対比をしてくださったおかげでちょっと納得した気がします、
422デフォルトの名無しさん:2009/09/16(水) 23:55:15
全然関係ないけど、

 sizeof - Wikipedia
 ttp://ja.wikipedia.org/wiki/Sizeof

 > 厳密な大きさはsizeof(char)が1であることを除いて標準に定められていない。
って書いてあるけど、sizeof(char)が1ってホント?
俺の記憶では確かsizeof(char)すら処理系依存だったと思うのだが。
423デフォルトの名無しさん:2009/09/16(水) 23:56:38
1がバイト数とも限らないってことじゃないか?
424デフォルトの名無しさん:2009/09/16(水) 23:59:36
>>421
やっぱり勘違いだね。
ポインタはポインタのサイズであって、ポインタが指す内容のサイズではないですよ。

>>422
1byteが8bitであるとは限らないという話と混同してないかい?
425デフォルトの名無しさん:2009/09/17(木) 00:01:25
1バイトは8bitとは限らない
426422:2009/09/17(木) 00:04:36
それだ!!
ありがとう!
427デフォルトの名無しさん:2009/09/17(木) 06:15:06
VMの話ならLLVM。
「VM(笑)遅いし」ってのは過去になりつつある。
428デフォルトの名無しさん:2009/09/17(木) 07:03:32
#define HOGE(*****) *****
ってなマクロを、確か二重にしているのを見たりするんですが、
これって何のためにやっているのですか?
特定のコンパイラ向けとかでC++でも実際にそうしておく必要がありますか?
429デフォルトの名無しさん:2009/09/17(木) 07:16:32
>>428
マクロにマクロを渡すみたいなことをやり始めると、一重二重で意味が変わってくる。
紙幅が全く足りない上に俺もそこまで詳しくないのでプリプロセッサの仕様読んでくれとしか
430デフォルトの名無しさん:2009/09/17(木) 09:39:22
#define ABC XYZ
#define CONV_TO_STRING(x) #x
#define CONV_TO_STRING_EXPAND(x) CONV_TO_STRING(x)
ABC
CONV_TO_STRING(ABC)
CONV_TO_STRING_EXPAND(ABC)
-----プリプロセッサを通すと------
XYZ
"ABC"
"XYZ"
---------------------------
これのこと?
431428:2009/09/17(木) 20:50:17
ありがとうございます。
それです。

BOOST_PP_STRINGIZE
の実装でもそうなっているようですが、
正式なプリプロセッサの仕様はどこで学べるのでしょうか?

そして学んでおく必要はありますでしょうか?
432デフォルトの名無しさん:2009/09/17(木) 20:59:48
>>431
>正式なプリプロセッサの仕様はどこで学べるのでしょうか?
つ[google]

>そして学んでおく必要はありますでしょうか?
必要ないよ、そんな質問をするような間抜けには。
433デフォルトの名無しさん:2009/09/17(木) 21:09:35
>>432
何?君の自己紹介は要らないよ。
434デフォルトの名無しさん:2009/09/17(木) 21:18:12
大丈夫、私は私が必要と思うことを学んでいるから。
435デフォルトの名無しさん:2009/09/17(木) 21:54:07
http://www.jisc.go.jp/でCやC++の規格がただで読めるよ
プリプロセッサだけなら、
僕は”プログラム言語C”(JISX3010)がおすすめ。
436428:2009/09/17(木) 22:18:16
>>435
ありがとうございます。
さっそく”プログラム言語C”(JISX3010)を見に行ってきます。
437デフォルトの名無しさん:2009/09/18(金) 00:18:20
奥が深いですね、Cプリプロセッサは
438デフォルトの名無しさん:2009/09/18(金) 00:43:04
既存のコードの理解に必要ならしょうがないが、プリプロセッサの
サーカスやってるとミスの確率も高くなるし、後でわからなくなるよ。

あと、C++ ではむしろ C プリプロセッサの複雑な部分を普通使う
必要も無いし、使わない方が良いと思う。
439デフォルトの名無しさん:2009/09/18(金) 07:07:46
Boost.Preprocessorとか専用のライブラリを使うとミスは少なくなるし
可読性も(素でやるよりは)うpするよ
440デフォルトの名無しさん:2009/09/18(金) 07:57:57
残念ながらまだまだガチのメタプログラミング(マクロも含めた意味で)では
プリプロセッサの必要性は残る。Boostの実装もBOOST_PP使いまくりだったり
するしな。
C++0xはその辺の実装経験も元に、さらにプリプロセッサの必要性が下げられる
見込みだけど。
441デフォルトの名無しさん:2009/09/18(金) 08:19:57
>>440
BOOST_FOREACHやBOOST_AUTOは有用なプリプロセッサだけどc++0xではサポートされるしな。

プリプロセッサは基本的には、使うべきじゃないとは思っている。
しかし、膨大な繰り返しをミスなく記述するような有用に使うのは問題ないと思う。
例えばVisitorを使うには派生関係の無い似たような関数をたくさん作る場合など。
442デフォルトの名無しさん:2009/09/18(金) 08:35:40
メタプログラミングはエラー特定しにくいだろ。
なるべく使わず済ませよ。
443デフォルトの名無しさん:2009/09/18(金) 08:41:46
つ再利用性
444デフォルトの名無しさん:2009/09/18(金) 08:44:11
コピペで大量生産するならメタプログラミングを選ぶ
445デフォルトの名無しさん:2009/09/18(金) 08:55:11
いいか、同じコードは2度書くな。鉄則だ
446デフォルトの名無しさん:2009/09/18(金) 08:57:43
いいか、同じコードは2度書くな。鉄則だ

重要なことなので2度言いました。
447デフォルトの名無しさん:2009/09/18(金) 09:21:11
いいか、同じコードは2度書くな。鉄則だ

やっべ、車輪の歳発明またやっちまった
448デフォルトの名無しさん:2009/09/18(金) 09:42:51
再発明と言うより、バグ、デバック減らせるのが大きい。
しかし、メタプログラムはバグがわかりにくい。
なるべく使わず済むようにすべき。
使うならそこだけヘッダにして分割するとかが良い。
449デフォルトの名無しさん:2009/09/18(金) 09:49:18
メタプログラムは一度バグを乗り越えたら、修正が楽だし再利用性も容易になる。
メタは少しずつ階層を増やしながらコンパイルで確認しつつ書くのがいいかも試練。


450デフォルトの名無しさん:2009/09/18(金) 09:59:22
メタプログラミングはその利点に乏しい
利点より欠点の方がおおいよね?
451デフォルトの名無しさん:2009/09/18(金) 10:15:15
コンパイラのようなメタプログラミングの塊みたいな分野もある
あと外部ツールでコード生成するのも一種のメタプログラミングといえよう
後者の技法を使ってるプロジェクトは数え切れないぐらいあるだろう
その事実を以ってすれば欠点の方が多いと言い切ることは不可能である
452デフォルトの名無しさん:2009/09/18(金) 10:21:46
完成品を利用するならいいが、バグ取りの時点では、不利。
453デフォルトの名無しさん:2009/09/18(金) 10:34:59
>>450
無知?

まあメタプログラミングは天才にやらせてその成果物を凡人が使う。
これが鉄則。うん。
454デフォルトの名無しさん:2009/09/18(金) 10:43:33
確かに自分でメタプログラミングしようという気にはならない
というか再利用可能なクラスですら書きたくない

もちろん信頼できる第三者の成果物はメタもクラスも利用するよ!
455デフォルトの名無しさん:2009/09/18(金) 11:02:01
メタプログラミングを本来の意味で言ってるのか、テンプレートメタプログラミングの
ことを言ってるのか分からん
456デフォルトの名無しさん:2009/09/18(金) 11:07:38
メタプログラミング2.0が出たら本気出す
457デフォルトの名無しさん:2009/09/18(金) 11:09:34
ポインタ分からない人に限って「ポインタは一応分かってるけどあんなもの危険だし
不要だよ」と言うもんだ。
458デフォルトの名無しさん:2009/09/18(金) 11:10:25
>>454
俺、自分よりboostや他企業の製品のが信頼できる。
459デフォルトの名無しさん:2009/09/18(金) 11:15:31
>>458
自社製品は怖くて使えない・・・

これが世の共通認識w
460デフォルトの名無しさん:2009/09/18(金) 11:18:41
>458
あれ、俺いつの間に書き込んだっけ?
461デフォルトの名無しさん:2009/09/18(金) 11:20:48
C++で、ソースコードのコメントに
 hogeクラスは…(ry
と書くのと
 クラスhogeは…(ry
と書くのと、どっちがいいのでしょうか?

JISとかで決まっていますか?
462デフォルトの名無しさん:2009/09/18(金) 11:33:17
>>461
つ[doxygen]
463デフォルトの名無しさん:2009/09/18(金) 11:38:28
>>462
ありがとうございます。

 hogeクラスは…(ry
 クラスhogeは…(ry
とどっちがJIS等で正しい用語か決まっているでしょうか?
464デフォルトの名無しさん:2009/09/18(金) 11:50:45
答えになってないが、個人的な感覚では

hogeクラス → hoge というタイプのクラスがある。
クラスhoge → クラスの名前がhoge。

という感じがする。
465デフォルトの名無しさん:2009/09/18(金) 11:52:03
>>464
あーなるほど、
入出力クラス と class MyIO
みたいなかんじですね。
466464:2009/09/18(金) 12:18:26
解決しました。
以下にjisより引用します。
 ttp://imagepot.net/image/125324383539.gif
このようになっていました。
467デフォルトの名無しさん:2009/09/18(金) 13:12:14
え、hogeにそれを当てはめちゃうのか
class hoge についてだと思ってたのに。。。
468464:2009/09/18(金) 13:45:35
>>467
あ・・・確かにそうですね。。。
class hoge についてはもしかして違うかもしれませんね。
469デフォルトの名無しさん:2009/09/18(金) 13:47:40
ところでお前は464じゃないだろう
470461:2009/09/18(金) 13:49:46
すすす・・・すみません。
悪気は全くありませんでした。
471461:2009/09/18(金) 13:56:25
http://imagepot.net/image/125324969662.gif
同じでした。
クラスhogeという表記がJIS的には採用されているようです。

ありがとうございました。
472デフォルトの名無しさん:2009/09/18(金) 15:26:25
珍しく丁寧な人がw
なんだかこちらこそありがとう
473デフォルトの名無しさん:2009/09/18(金) 19:10:09
>>461
名探偵コナン
目暮警部
474デフォルトの名無しさん:2009/09/18(金) 19:54:32
>>473
何?
誤爆??
475デフォルトの名無しさん:2009/09/18(金) 20:14:12
誤爆にエスパーレスすると永沢くんのほうがわかりやすくね?
476デフォルトの名無しさん:2009/09/18(金) 20:25:07
黒幕はアガサ博士
477デフォルトの名無しさん:2009/09/18(金) 20:57:46
PDH.DLLについて質問なのですが、PCが高負担時(CPU或いはHDD読み書き?)にPdhCollectQueryDataを呼び出すと、
呼び出した側のプロセスの全スレッドがカタカタとラグが起こったように固まってしまいます。
PDHの内部に生成されるスレッドの優先度を上げてみては直るのではと考えて色々調べたのですが、PDHはプロセスではないためスレッドハンドルを取得する方法がわからず挫折しています。
PDHのラグ対処法、あるいはモジュール内のスレッドハンドルの取得方法をお知りの方がおられましたら教えていただけないでしょうか。
以下問題が起こる処理のサンプルです。よろしくお願いします。

PdhOpenQuery( null, 0, &hQuery );
PdhAddCounter( hQuery, "\\Processor(_Total)\\% Processor Time", 0, &hct );

ループ {
PdhCollectQueryData(hQuery);

PdhGetFormattedCounterValue( hct, PDH_FMT_LONG, null, &value );

printf( "%d\n", value.longValue );
Sleep(50);
}
478デフォルトの名無しさん:2009/09/18(金) 21:08:51
なんていうか、この処理自体は別スレッドで動いてると思えばいいの?
479デフォルトの名無しさん:2009/09/18(金) 21:22:45
Win32API?だったらWin32APIスレが的確だよ
480デフォルトの名無しさん:2009/09/18(金) 21:24:42
ああそういえばそんなスレもあったなと思ってのぞいたらカオスだった。
こわいよう
481デフォルトの名無しさん:2009/09/18(金) 22:10:15
スレ違いすみません。カオスなのですか…どうしよう。
別スレッドを作成してループさせても、main関数内でループさせても固まる現象は同じでした。
482479:2009/09/19(土) 09:24:14
>>481 本当にカオスだったな。すまんかった。
OS標準のパフォーマンスログも高負荷時にサンプルできなかったのエラーメッセージ
が出るくらいなので、APIが詰まるのはしかたないような気がするね。
APIの実行が遅れてもいいようにAPIの実行間隔を計測すればいいかもしれない。
プロセス内の他のスレッドに影響出るのはよく分からない
483デフォルトの名無しさん:2009/09/19(土) 14:37:56
OS標準のパフォーマンスログですらエラーになるのですね!
って事は、そもそもスレッド優先度云々の問題ではないのですね。
とてもすっきりしました。ありがとうございます。
とにかくコレクトが固まるのはあきらめて、別スレッドに影響でる原因の方を調べてみる事にします。
本当に迷走していたので助かりました。
改めて感謝です。
484デフォルトの名無しさん:2009/09/19(土) 14:52:31
何か同じリソースを激しくアクセスしてブロックが起きてないかを確認するのもいいかもしれない。
レジストリとかファイルとか
485デフォルトの名無しさん:2009/09/19(土) 14:55:13
struct float3{ float x, y, z;}

float3 v0;
float3 v1 = v0.zyx;
float2 v2 = v0.yz;

こういう風に記述したいんですが、メンバ関数「zyx()」等を作る以外で
何か方法はありませんか?
VisualC++なんですが、MSCコンパイラ依存拡張を使っても問題ないです。
486デフォルトの名無しさん:2009/09/19(土) 15:02:56
ないと思う
487デフォルトの名無しさん:2009/09/19(土) 15:05:05
>>485
C++ の悪魔が、ふいにこんな変態コードを俺の頭の中に叩き込んできた・・・。
怖いからお前にやる。

extern struct zyx {} const zyx;
struct float3{ float x, y, z;
float3 operator ->* (struct zyx const&) { float3 zyx = {z, y, x}; return zyx; }
};

float3 v0;
float3 v1 = v0->*zyx;
488デフォルトの名無しさん:2009/09/19(土) 15:12:04
>>485 プロパティな動作をさせたいってことか。C++永遠のテーマですね。面倒だけど困ったときのプロキシークラスを使えば無いことも無い。
class YZ
{
double y;
double z;
public:
YZ(double y0,double z0):y(y0),z(z0){}
};
class XYZ
{
double x;
double y;
double z;
class yz_prop
{
XYZ* a;
public:
yz_prop(XYZ* a0):a(a0){}
operator YZ(){return YZ(a->y,a->z);}
};
public:
XYZ(double x0,double y0,double z0):x(x0),y(y0),z(z0),yz(this){}
yz_prop yz;
};
int _tmain(int argc, _TCHAR* argv[])
{
XYZ v0(1,2,3);
XYZ v1=v0;
YZ v2=v0.yz;
return 0;
}
489デフォルトの名無しさん:2009/09/19(土) 15:16:50
そんでxzyとかzyxとかの全パターン生成にはboost::preprocessorを使うな。
490デフォルトの名無しさん:2009/09/19(土) 15:20:25
>>485
ベクトル演算(回転と写像)に見えた。
であれば、自分ならそういう風にオブジェクトを構築するかなぁ。
491デフォルトの名無しさん:2009/09/19(土) 15:20:49
      Y^´       ∨// /,∠ ,. ' /l/// /, ' , '/ ! | l }´     〈
       〉    変  〈/ , ' // ̄`>< /// /// _,.=‐|'"´l l〈  変  /
        〈    態.   ∨, '/l|   ,.'-‐、`//`7/  /''"´__ | ハ l丿  態   {
     人)   ! !   (/!  |ヽ〈_ ・.ノ〃  〃 /  '/⌒ヾ.! ,' !く   ! !  (_
 ト、__/   ヽ、_,.イ    /l l |:::::::```/:::::/...´..   //´。ヽ }! ,'  !! )     /
ト'    亦   ,イ⌒ヽ/   !l l ! l し   J ::::::::::::::::::::``‐-</ /  ,'、`Y´Τ`Y
l      夂   (ハ ヽ l i   ! l ', !   , -―-、_   ′::::::::::::: //! Λ ヽ、ヽl
ヽ          〉,\ ! i   ',.l `、'、/_,. ―- 、_``ヽ、  ι  〃,'/! ヽ、\ ヽ、
 !     能   // ,' lヽ! ii  ',l  ∨\'⌒ヽー-、 `ヽ、!   / ハ ノヽ._人_从_,. \
 |    心   { / ,' ' ,! ll  l`、 { ヽ' \     ヽ  '  '´   Λ ',}      ( \
.丿         ∨ // ,',! l l  l ヽ`、 \  \   ∨   し /! ∨  変   ,ゝ、
∧     / /   ヾノ //l l l  l、_ヽ\ \   ヽ , '   ,.イ |ノ    態   (ヽ
/ノ__  ゚ ゚  (⌒`〃'j | l  l   l `ヽ `ヽ、.ヽ _,.}'′ ,.イl {  | ヽ   ! !   ,ゝ\
/ /`Y⌒ヽ/⌒ 〃 ノ | l   l   l   } ヽ、._ } ノ,.イ l | ! !  |  )_
492デフォルトの名無しさん:2009/09/19(土) 15:27:13
>>490
ベクトルには違いないが単にシェーダーで使えるswizzlingをやりたいだけだろ
493デフォルトの名無しさん:2009/09/19(土) 15:28:48
>>485
本当に処理系依存でいいのなら__declspec(property)を使うというのはどうだ。俺は使った事は無いが。
494デフォルトの名無しさん:2009/09/19(土) 15:38:18
まぁ、やり方はすぐ思いつくが、もりもり不幸な予感がするのも間違いないw
495デフォルトの名無しさん:2009/09/19(土) 17:32:52
template<class T, class U, T (U::*F)(void)>
class ReadProperty
{
public:
ReadProperty() : pT_(0) {}
void operator(T* pT){pT_ = pT;}
operator U () const{return (pT_->*F)();}
private:
T* pT_;
};

class XYZ
{
YZ getYZ(){return YZ(y_, z_);}
public:
XYZ(z,y,z):x_(x),y_(y),z_(z){yz(this);}
ReadProperty<XYZ, YZ, &XYZ::YZ> yz;
private:
float z_, y_, z_;
};
496ぅゅ ◆e6.oHu1j.o :2009/09/19(土) 18:31:55
>>485

#include <iostream>
using namespace std;
void main(){

struct float3{ float x, y, z;};
struct float2{ float y, z;};

float3 v0 ={ 1 , 2 , 3,};
float3 v1 = v0;
float2 v2 = *((struct float2 *)&v0.y);

cout<<"v1x "<<v1.x <<endl;
cout<<"v1y "<<v1.y <<endl;
cout<<"v1z "<<v1.z <<endl;
cout<<"v2y "<<v2.y <<endl;
cout<<"v2z "<<v2.z <<endl;
}

まぁ多分うごく
規約には&v0.yのアドレスの次に&v0.zを置きましょうなんて無いと思うけど
たった4バイトだからそうそうズレやしないかと
497デフォルトの名無しさん:2009/09/19(土) 18:38:09
>>496 そのキャストは危険。派生させればキャストは不要。
class float2
{
float x;
float y;
};

class float3 :public float2
{
float z;
};


float3 v0;
float3 v1=v0;
float2 v2=v0;
498デフォルトの名無しさん:2009/09/19(土) 18:40:20
コピーの話はしてねぇから
499デフォルトの名無しさん:2009/09/19(土) 19:19:41
キャレット位置の取得の仕方について質問させて下さい。

使用しているエディタ(メモ帳、サクラエディタ等)のキャレットの位置に
ポップアップメニューを表示させたいのですが、
キャレット位置の取得の仕方が分かりません。
GetCaretPosという関数がそれに近いようなことをできるのかと思いましたが、
使ってみると、ポップアップメニューが毎回、画面左上に表示されます。

// キャレット位置
POINT pt;
//キャレット位置取得
GetCaretPos(&pt);

環境は
VC++2008 Express Editionです。

どのようにすればよいでしょうか。
よろしくお願いします。
500デフォルトの名無しさん:2009/09/19(土) 19:29:49
>499 誘導

Win32API質問箱 Build81
http://pc12.2ch.net/test/read.cgi/tech/1249140049/
501デフォルトの名無しさん:2009/09/19(土) 19:31:20
>>499
まずは MSDN を見て、戻り値を見て、まだ何かあれば Windows API スレへどうぞ。
502デフォルトの名無しさん:2009/09/19(土) 20:06:22
struct float3{
  float x,y,z;
  struct zyx_{
    float& x;
    float& y;
    float& z;
    zyx_(float& x,float& y,float& z):x(x),y(y),z(z){}
  }zyx;

  float3():zyx(x,y,z){}
  float3(float x_,float y_,float z_):zyx(x,y,z),x(x_),y(y_),z(z_){}
  float3(const zyx_& a):zyx(x,y,z),x(a.z),y(a.y),z(a.x){}
};

int main(){
  float3 v0(1,2,3);
  float3 v1 = v0.zyx;
  std::printf("%f,%f,%f\n",v0.x,v0.y,v0.z);
  std::printf("%f,%f,%f\n",v1.x,v1.y,v1.z);

  return 0;
}
503デフォルトの名無しさん:2009/09/19(土) 20:09:08
>>502のzyx_クラスのメンバはprivateで
504デフォルトの名無しさん:2009/09/19(土) 20:39:29
>>500
分かりました。
そちらで聞いてみます。
505デフォルトの名無しさん:2009/09/19(土) 20:52:11
マクロでもテンプレートメタプログラミングでも良いから、
ある識別子(?)が何回記述されているかをコンパイル時に取得する方法はない?

例えば
 #define M_A_C_R_O() ***
 int main()
 {
 char array[M_A_C_R_O()が出現した回数];
 
 M_A_C_R_O()
 M_A_C_R_O()
 
 return 0;
 }
という様なコードが通り、
コンパイル時に
char array[2];
となるようなもの。
506505:2009/09/19(土) 20:54:21
 #define M_A_C_R_O() ***
 int main()
 {
 M_A_C_R_O()
 char array[M_A_C_R_O()が出現した回数];
 
 M_A_C_R_O()
 M_A_C_R_O()
 M_A_C_R_O()
 
 return 0;
 M_A_C_R_O()
 }
これだったらchar array[5]になるってことで。
507デフォルトの名無しさん:2009/09/19(土) 21:23:04
多分不可能
508デフォルトの名無しさん:2009/09/19(土) 21:29:58
T array[] = {
 Macro(),
 Macro(),
 ...
 Macro(),
};

// 必要ならば
// #define arraysize (sizeof(array)/sizeof(array[0]))

では何が足りないのか知りたい。
509505:2009/09/19(土) 21:34:15
>>507
ですかねぇ。。。
今のところ、

 template <unsigned int linenum>
  hoge{〜〜〜〜};
 #define M_A_C_R_O() sizeof( hoge< __LINE__ > )

として、

  int main()
  {
  M_A_C_R_O();
  M_A_C_R_O();
  M_A_C_R_O();
  
  return 0;
  M_A_C_R_O();
  }

こんな感じでどうにか出来ないかと思っているんだが。
510485:2009/09/19(土) 22:29:35
いろいろなお答えありがとうございます。
出来ないと思って、駄目もとで聞いてみたんですが
C++標準で出来るんですね。凄いですね。
確認した結果、>>493のMS拡張が最も楽そうですので
まずはこちらから試してみたいと思います。
大変ありがとうございました。
511デフォルトの名無しさん:2009/09/19(土) 22:41:29
>>487さんの変態コードの意味がどうしても分かりません。
特に
> extern struct zyx {} const zyx;
が何を意味したいのがが分かりません。

どなたかご教示ください。
よろしくお願いいたします。
512デフォルトの名無しさん:2009/09/19(土) 23:10:58
>>509
テンプレートが実体化されたかどうかの情報は内部から得られない
そしてマクロは自分が展開される所から先の情報を得ることはできない

なので無理と判断した
513デフォルトの名無しさん:2009/09/19(土) 23:11:02
>>511
float3 operator ->* (struct zyx const&) で演算子を選択させるための識別子を作ってるんじゃないか?
識別子を増やして、演算子のオーバーロードを増やせばいろいろできるね。

514デフォルトの名無しさん:2009/09/19(土) 23:33:15
>>513
あーなるほど。
最適化で消えるっていうアレですか。
ありがとうございます。
515デフォルトの名無しさん:2009/09/19(土) 23:43:05
>>510
やりたいことがうまく伝わってない人もいっぱいいるように見えるけどね
zyxだけじゃなくて、yxzとかyzxとかはいらないの?
516デフォルトの名無しさん:2009/09/20(日) 03:22:42
>>509 boost::preprocessorのBOOST_PP_SLOTを使えば個数は取得できる
ただし#includeを使ってカウントする都合上__LINE__は取得できない
連番のヘッダファイルを用意して__FILE__を代用に使うという方法を試してみたが正直これはダサい
まあ一応貼ってみる

// ./counter/99 (0〜99まで100個用意:対象cppの行数分だけ)
#ifndef COUNTER_99_
#define COUNTER_99_
{ static int flag=0;
if(!flag){ std::cout << __FILE__ << std::endl; flag=1; } } //__FILE__に行数が入っている寸法
# define BOOST_PP_VALUE BOOST_PP_SLOT(1) + 1
# include BOOST_PP_ASSIGN_SLOT(1)
#endif

// main.cpp
#include <iostream>
#include <boost/preprocessor.hpp>
#define BOOST_PP_VALUE 0
#include BOOST_PP_ASSIGN_SLOT(1)
#define CURRENTLINE BOOST_PP_CAT(counter/,__LINE__) //行番号に対応するファイルをインクルード
#define M_A_C_R_O() BOOST_PP_STRINGIZE(CURRENTLINE)
#define M_A_C_R_O_C_O_U_N_T BOOST_PP_SLOT(1)

extern const int count;
int main() {
    #include M_A_C_R_O()    // .../counter/11
    #include M_A_C_R_O()    // .../counter/12
    std::cout << count << std::endl; //3
    return 0;
    #include M_A_C_R_O()
}
static const int count = M_A_C_R_O_C_O_U_N_T;
517デフォルトの名無しさん:2009/09/20(日) 10:57:09
>>510 C++ならプロパティにこだわらずゲッター関数を使うことをお勧めするぞ。手間は変わらない。
518デフォルトの名無しさん:2009/09/20(日) 11:15:10
プロパティとかインデクサっぽいことはできるけど
めんどくさいしちょっとコスト増えるから
type name(size_t index0, ...) const;
void name(size_t index0, ..., type val);
あるいは
const type& name(size_t index0, ...) const;
type& name(size_t index0, ...);
これで妥協しちゃうなぁ
519デフォルトの名無しさん:2009/09/20(日) 12:13:40
皆オラに力を!

やりたことは下記のとおり。
C言語でIRCに繋ぎ、メッセージを送る。

さっぱり知識不足なため、何をすればいいのかが全く分からない状態です。
で、調べた結果、下のライブラリを見つけたんです。
ttp://sourceforge.jp/projects/sfnet_pircbotcpp/

接続は成功するものの、エンコードの問題なのか
文字列の送受信が出来ないという問題があり困ってます。
520505:2009/09/20(日) 12:13:55
>>516
ありがとうございます。
すげぇ。

ご教示の通りに
 ttp://uproda.2ch-library.com/lib170991.zip.shtml
を作って動作させてみました。
VC++で問題無く動作することは確認いたしましたが、
g++ (TDM-1 mingw32) 4.4.1では
 main.cpp:12:1: error: pasting "/" and "12" does not give a valid preprocessing token
 main.cpp:13:1: error: pasting "/" and "13" does not give a valid preprocessing token
 main.cpp:16:1: error: pasting "/" and "16" does not give a valid preprocessing token
 main.cpp:18: error: 'count' was declared 'extern' and later 'static'
 main.cpp:10: error: previous declaration of 'count'
というエラーメッセージがでてコンパイルできません。
VC++とg++両方でコンパイルが通るようにするにはどうしたらよいでしょうか?
よろしくお願い申し上げます。

521デフォルトの名無しさん:2009/09/20(日) 14:56:08
>>517
若い命が真っ赤に燃えて〜
522デフォルトの名無しさん:2009/09/20(日) 15:34:08
>>520
516じゃないけど、多分これでいける

× #define CURRENTLINE BOOST_PP_CAT(counter/,__LINE__)
○ #define CURRENTLINE counter/__LINE__



523505:2009/09/20(日) 15:45:53
>>522
ありがとうございます。
それでかなりコンパイル成功まで近づきました。

しかしまだ
 main.cpp:18: error: 'count' was declared 'extern' and later 'static'
 main.cpp:10: error: previous declaration of 'count'
というエラーが出てしまいます。

どうしたものでしょう。。。
524516:2009/09/20(日) 16:29:11
>>523
悪い。VCでしか確認してなかった。
18行目のstaticを削ってみておくれ。

>>522
フォローthx
525505:2009/09/20(日) 23:11:10
C++ code - 18 lines - codepad
ttp://codepad.org/nySji4dD

ありがとうございます。
おかげさまでg++, VC++共に通るコードが出来ました。

お二方様 感謝いたします。
526505:2009/09/20(日) 23:22:45
と、気付いたのですが、これだとコンパイル時定数にはならないようです。
現在のところコンパイル時定数でなくても困っていないのですが、
将来的にはコンパイル時定数に出来ないかどうか頑張ってみます。

527505:2009/09/20(日) 23:46:49
自分でも
ttp://codepad.org/IhxI58eT
テンプレートメタプログラミングで階乗を求める方法をまねして
みたのですが、やはりダメでした。
// M_A_C_R_O();
をコメント解除するとエラーになります。

これは1パスでプリプロセス処理やコンパイル処理が行われる関係上、
当然な話なのですが、やはり無理でした。

>>525のソースが一番良さそうです。

528デフォルトの名無しさん:2009/09/21(月) 00:31:53
何も全部C++でやらんでビルド前にgrepとかで数を調べて
ヘッダにでも書いておけばいいんじゃねーかとも思う
529505:2009/09/21(月) 07:02:27
>>528
おっしゃるとおりです。
極論すれば
 「興味のため」に「それすら自動化したい」
といった理由です。
530デフォルトの名無しさん:2009/09/21(月) 09:59:59
さて、俺様が子一時間はまった宿題を出してやろう、このプログラムには致命的な間違いがある、どーこだ
もまいらは頭が良いから、直ぐにわかると思うが。
// CPoint.h
template <class T>
class CPoint {
 template<class> friend class CPoint;
private:
 T x_;
 T y_;
public:
 // Constructor
 CPoint(T x = T(), T y = T()) : x_(x), y_(y) {}
 CPoint(const CPoint& pt) : x_(pt.x_), y_(pt.y_) {}
 
 // Operator overload
 CPoint& operator+=( const CPoint& pt )
 {
  this->x_ += pt.x_;
  this->y_ += pt.y_;
  return *this;
 };

 CPoint& operator+( const CPoint& pt )
 {
  CPoint q(this->x_ + pt.x_, this->y_ + pt.y_);
  return q;
 };
 template <class U>
 CPoint(const CPoint<U>& r) : x_(r.x_), y_(r.y_) {}
};
531デフォルトの名無しさん:2009/09/21(月) 10:00:49
コンパイルのコマンドがclとしよう。

clの前に、単語を数えるexeを動かすBATファイル作れよ。
532デフォルトの名無しさん:2009/09/21(月) 10:01:45
>>529
>>528が言ってるのはビルドプロセスの中で

hoge.cpp
int main()
{
char array[
#include "hoge_count.h"
];
M_A_C_R_O()
M_A_C_R_O()
}

grep --count '^ *M_A_C_R_O()' hoge.cpp>hoge_count.h

みたいにしろってことじゃない?
だから自動化は出来るよ。
コメントとか文字列リテラルとかプリプロセッサ命令とかのことを考えるとアレだけど。

あとは、自分でプリプロセッサを作るとか。
533531:2009/09/21(月) 10:07:01
いちど、defineやメタプログラムなどを展開する必要があるな。
一度、展開してやつを数えるBATファイル作れよ。
534デフォルトの名無しさん:2009/09/21(月) 10:14:56
マクロ展開したらマクロ数えられないじゃんw
535デフォルトの名無しさん:2009/09/21(月) 10:19:10
マクロが動くときに動きそうな、何かの関数ポインタが参照された回数を数えればよろし
536デフォルトの名無しさん:2009/09/21(月) 10:20:02
>>530
クラス名がださい
537デフォルトの名無しさん:2009/09/21(月) 10:27:11
UltraMiracleSpecialThunderSuperKnuckle{
};

>>536これで満足か?
538デフォルトの名無しさん:2009/09/21(月) 10:33:05
>>530
> CPoint& operator+( const CPoint& pt )
> {
>  CPoint q(this->x_ + pt.x_, this->y_ + pt.y_);
>  return q;
> };
ナニコレ
539デフォルトの名無しさん:2009/09/21(月) 10:33:21
>>536
>>530だが、拙者もそれには気付かなかった、凄いねおまえ。
540デフォルトの名無しさん:2009/09/21(月) 10:35:51
>>538
>>530です、
流石2ちゃんねる、お前年収1000万以上だろ、素晴らしいね(・∀・)ニパ、正解です。
541デフォルトの名無しさん:2009/09/21(月) 11:43:17
ま、俺は三億ベリーだけどな
542デフォルトの名無しさん:2009/09/21(月) 13:08:57
そういやおまいら、>530見てて思ったんだけど、

> CPoint(T x = T(), T y = T()) : x_(x), y_(y) {}

みたいなデフォルトコンストラクタってどうよ?

なんか効率悪そうなんでわざわざ3つ用意するようにしているんだけど、どうなのかね?

CPoint(T x, T y) : x_(x), y_(y) {}
CPoint(T x) : x_(x), y_() {}
CPoint() : x_(), y_() {}

543デフォルトの名無しさん:2009/09/21(月) 13:28:12
>>538
それって警告が出ないか?
544デフォルトの名無しさん:2009/09/21(月) 13:49:12
CPoint(T x)は気持ち悪いから俺なら作らない
作るとしてもexplicitを付けるべきだ
545デフォルトの名無しさん:2009/09/21(月) 13:58:57
>>542
効率はともかく、>>530のそれは、自分の中で「引数の省略」というのを使うべき時
の条件に何となく合致しない感覚があるから、俺は素直に分けて書くな
あと>>544にも同意
546デフォルトの名無しさん:2009/09/21(月) 14:03:11
>542
アセンブラのソース見れば効率いいかどうかわかるが
気にするだけ無駄
547デフォルトの名無しさん:2009/09/21(月) 14:14:12
> 気にするだけ無駄
だな。
引数がコンパイル時定数で最適化しつつinline展開するならほぼ同じバイナリになるほうが自然だろうよ。
548505:2009/09/21(月) 14:19:12
>>532
あーなるほど、そう言う意味ですか。
確かにそれなら自動化できますね。

>>535
面白そうですね。
すみませんがどういう実装をすれば実現できますでしょうか?
549デフォルトの名無しさん:2009/09/21(月) 22:00:48
識別子を数えたいって…おまえさんLisp経験者?
550505:2009/09/21(月) 22:45:05
>>549
いいえ、あんなに高度な言語は分かるように努力する気がしません。。。

ただの趣味グラマでございます。
そのため>>529の様な、本職の方々からすればのんきなことを申しております。
551デフォルトの名無しさん:2009/09/22(火) 00:07:13
>>550
趣味プログラマでそのレベルまで出来るもんなんだね。
俺は
趣味プログラマ=Hello Worldに毛の生えたようなもの
だとしか思ってなかったわ。
552デフォルトの名無しさん:2009/09/22(火) 00:55:56
それはねーわw
つい最近趣味グラマから転職で本職にはなったけど
C++とQtで一通りGUIは扱えるし、Linux鯖云々も扱える
WinAPIは手を出したけど気持ち悪さから手を引いた

Cオンリーの超閉鎖的な組込みに入ったから、
持ってるもののほとんどはニアミスすらしないけど
553デフォルトの名無しさん:2009/09/22(火) 01:08:15
趣味上がりの人の方が知識は豊富なことが多いかも。
それで天狗になって業務の基礎知識を得ようとしない人も結構いるから、そうならなければ大事な戦力。
554デフォルトの名無しさん:2009/09/22(火) 01:15:33
>>552
そうでも、C++ を使い込んでいれば、Cで組んでも発想の引き出しが多いと思うよ。
あと、Linux でスクリプトとかも使ってれば QA のテストとかにも便利だし。
555デフォルトの名無しさん:2009/09/22(火) 02:01:46
>>553
うん、気をつけるよ
もともと一番弱い部分(HW)を得るためにってのもあって、
組込みに行ったんだし
556デフォルトの名無しさん:2009/09/22(火) 02:29:13
その辺のバランスは難しいんだよね
自分に無い能力を素直に認めて吸収するならどうにでも伸びるんだけど、例えば
C++で高度に抽象化したコードを見ると「現場の役には立たねぇ」とか逃げる奴も
いれば、逆に敢えてプリミティブに書かれたコードを見て「抽象化を進めないと
話にならない」と思いこむ奴もいて、そういうのはどっちも問題があるなぁとか
557デフォルトの名無しさん:2009/09/22(火) 03:51:39
ところで、Hello Worldに毛の生えたレベルの人は採用試験で落ちるような気がするのだが。
558デフォルトの名無しさん:2009/09/22(火) 04:07:43
それがそうでもないんだな・・・
原発で潤ってる某財閥の冠しょってる子会社に
ただ、情報系卒ってだけで採用された

職業訓練校通ってた同期で、
変数の宣言すら知らなかった
もちろんprintfなんて扱えるわけもなく
つーか、隣の人の丸写しすらできないほど
559デフォルトの名無しさん:2009/09/22(火) 04:41:08
人としての価値があったんだろ >>558 の思いも拠らない部分で
560デフォルトの名無しさん:2009/09/22(火) 04:49:21
そのために研修があるんじゃないの
561デフォルトの名無しさん:2009/09/22(火) 11:11:33
Cは3ヶ月でマスターできるけど
C++は3ヶ月でマスターするにはかなり一生懸命勉強する必要があるぞ。
562デフォルトの名無しさん:2009/09/22(火) 11:13:31
>>561
マスターってどのくらいの程度を言うのか知らんが・・・

> ○○言語で○○らしいプログラミングができる
を目標とするならそのくらいだろうな。
563デフォルトの名無しさん:2009/09/22(火) 11:38:23
マスターできない人はSEとして、マスターできた人はPGとして働く
そういう会社がすごく沢山あるよね
564デフォルトの名無しさん:2009/09/22(火) 14:12:01
exportは忘れるとして、それ以外でもC++の標準規格を100%完全に満足する実装は未だ存在していないと聞いたんだが。
Comeauが完全サポートに一番近いんだろうけど。

そんな中、C++0xの規格をさらに定めたりしているんだが、
本当に理論上可能で矛盾がない規格であることは確かめられているの?
つまり理論上は実現可能であることは分かっているものなの?

(例:テンプレートメタプログラミングはチューリング完全である
   よってチューリング機械が実現できることは
   何だろうと(理論上は)テンプレートメタプログラミングでも出来る)
565デフォルトの名無しさん:2009/09/22(火) 14:15:29
>>564
こういう人って論文の査読が通っても信じなさそう。
統合失調症?
566デフォルトの名無しさん:2009/09/22(火) 14:32:41
C++ なんて所詮現実主義で実用主義。
>>564 みたいな人は Lisp とかの方が良いと思う。
567デフォルトの名無しさん:2009/09/22(火) 14:36:16
>>564 矛盾があってもなにか実害が?
間違いは直せばいい。
568デフォルトの名無しさん:2009/09/22(火) 14:38:35
>>564はLispも実用主義すぎてだめだろ。たぶんHaskellが最適。
569564:2009/09/22(火) 14:42:04
ああいや、そうじゃないんだよ。

俺はC++大好きなんだが、
勝手にC++標準化委員会がC++0xで規格を追加したりして、
コンパイラベンダーは大変だなあと言いたかっただけだ。

本当に実現可能な規格じゃなかった(つまり内部に矛盾がある規格)としたら
コンパイラベンダーの標準準拠にかける努力はどうしてくれるのかと。

570564:2009/09/22(火) 14:43:37
>>565
ごめん何が言いたいのかわからん。
無視していい?

>>567
> 矛盾があってもなにか実害が?
そりゃさすがに実害ありまくりだろw
> 間違いは直せばいい。
ここは賛成。
571デフォルトの名無しさん:2009/09/22(火) 14:46:08
標準化委員会にはMSやGNUやインテルの中の人たちも参加してるぞ
572デフォルトの名無しさん:2009/09/22(火) 15:01:41
>>571
じゃあ彼らも覚悟の上で仕様を決めているということか。

コンパイラ作る人ってすげーなー
573デフォルトの名無しさん:2009/09/22(火) 17:29:05
まぁC++コンパイラを作るような人達は、いい意味でキチガイ限定だからな
常人がC++コンパイラを作ろうとすると、あまりの泥沼ぶりにC++の粘着批判を始めて
うざい人になったりする
574デフォルトの名無しさん:2009/09/22(火) 17:38:54
メモ代わり。
VC++2003。#includeするヘッダファイルと
ソリューションエクスプローラーで追加してやるヘッダファイルが違ってた。
それぞれのヘッダファイルはほぼ同じ内容。片方がテンプレ的存在。
それに気づかないままコンパイルするも
プログラム終了時にafter normal block(#47)を吐く。
ヘッダファイルに書かれたクラスをnewするとエラーを吐いて
newしなかったらエラーを吐かないという意味不明なエラー。
deleteしてもしなくても関係ないし、名前空間の問題でもなさそう。
ポインタ回りかと思って"64ビットへの対応"をきったらエラーを吐かなくなった。
最終的には上述の理由に気づいて正しくコーディングできたが
なんかよく分からんエラーが出たなぁ。
575デフォルトの名無しさん:2009/09/22(火) 18:13:22
お前の文章力がないのはわかったからチラシの裏に書け
576デフォルトの名無しさん:2009/09/22(火) 18:48:42
本気でイミフでワロタ
577デフォルトの名無しさん:2009/09/22(火) 18:49:22
スレ違いのチラ裏をメモとか頭おかしい
578デフォルトの名無しさん:2009/09/22(火) 19:12:36
C++文法全部投げ捨てて一から作り直したほうがいいんじゃないかって素人の俺は思う。互換性なんかしるかァァァァァ
579デフォルトの名無しさん:2009/09/22(火) 19:16:31
この弱虫ッ
580デフォルトの名無しさん:2009/09/22(火) 19:18:29
>>578 それなんて D ?
581デフォルトの名無しさん:2009/09/22(火) 19:30:25
分からないまま批判するのはみっともないからやめとけ
582デフォルトの名無しさん:2009/09/22(火) 19:34:21
一から言語を設計したら他人のコードを借用しずらいから。
583デフォルトの名無しさん:2009/09/22(火) 19:37:49
>>578 互換部分なんか使わなくなるよ。
ポインタなんかスマートポインタにパックしてしまえばまったく気にならなくなるし。リーク?なにそれ?
STLを使えば配列?なにそれ?状態だし。
参照使えば0オーバーヘッドで且つ安全だし。
584デフォルトの名無しさん:2009/09/22(火) 20:42:20
C#最高
速度?
そんなもん、すぐに解決だろw
かつてはCでさえ遅かった。
585デフォルトの名無しさん:2009/09/22(火) 20:53:29
boost::filesystem以外で
クロスプラットフォームな
ファイルシステムライブラリはありませんか?

opendirを使いたいのですが、日本語(UNICODE)対応で
困っています。

boost::filesystemは使い方が大きく変わってしまうので、
opendirと似たインターフェースがいいなぁ。
586デフォルトの名無しさん:2009/09/22(火) 21:08:39
クロスプラットフォームGUIフレームワークのライブラリQtやwxWidgetsにはファイル関係のライブラリが含まれてたよ。
587デフォルトの名無しさん:2009/09/22(火) 21:16:10
>>586
レスありがとうございます。

ただ、ファイル扱うだけに、GUIフレームワークとは
ちょっと大きすぎますね・・・。
(簡単に)部分取りできるのだろうか?

できれば、ファイルシステム関係のみの
ライブラリがあるといいんですが。
(現在ちょこちょこ作っていたりはする)
588デフォルトの名無しさん:2009/09/22(火) 21:18:22
>>585 apr どうよ? C++ じゃなくて C だったような気がするけど。
589デフォルトの名無しさん:2009/09/22(火) 21:31:04
おぉ aprがありましたね。
ざっと見たところ、opendirと似ているような、似ていないような?

これって文字コードは何で指定/取得するのだろう?
たとえばfopen相当の関数で開くときのパスとか、
readdir相当の関数で取得されるパスとか、
全部UTF-8で統一されているのかな?だといいなぁ。
590デフォルトの名無しさん:2009/09/22(火) 21:44:46
>>580
Dは弱虫
591デフォルトの名無しさん:2009/09/22(火) 21:46:04
C#使うぐらいならJavaでイナフ
592デフォルトの名無しさん:2009/09/22(火) 21:46:56
>>583
互換部分は俺は結構使うな。既存のライブラリとインタフェースするから。
よく使う時は wrapper 的に書くけど。既存のライブラリを使えるのがC++ の強み。

あと、互換部分は基本的に使わないけど I/O だけ使う(printf,scanf)という
人もよく見る。C に慣れてる人にはしっかりフォーマットするには楽だからね。
593デフォルトの名無しさん:2009/09/22(火) 21:51:02
printfを使ってコンソールに♥を出力してみろってンだ。
594デフォルトの名無しさん:2009/09/22(火) 22:46:44
>>593
std::coutでそれを出力しろって言ってるのと変わらんだろう。
595デフォルトの名無しさん:2009/09/22(火) 22:48:14
最近GUIばっか触らせられてて標準入出力と無縁なのでboost::formatだけの生活
596デフォルトの名無しさん:2009/09/22(火) 22:53:51
>>585
glibmm とか
597デフォルトの名無しさん:2009/09/23(水) 00:35:22
ほんと C++/GUI 生活になると、ちょっと計算するだけのテストexe作るのにすごい手間がかかってしまう
598デフォルトの名無しさん:2009/09/23(水) 01:14:40
>>597
計算だけなら GUI 無しとかスクリプトで組むとかなら楽では。
599デフォルトの名無しさん:2009/09/23(水) 01:15:05
まじキチ…ユダヤが人工地震を起こすぞ

【緊急情報カクサンよろしく】

ついに来ました。

大きい動きです。250nT超えてきました。ほぼ間違いありません。もう一度言います。

友人、知人、親類縁者、あらゆるつながりを駆使して巨大地震がくることを教えて下さい。

四川地震より大きいのが来る可能性があります。
http://g★olde★ntam★atama.b★lo★g84.fc2.c★om/

★★★★★危険度MAX★★★★★
★★★★★★★★★★★★★★★★

★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★
★千葉、静岡、東京、関東で大地震が起きる可能性が非常に高くなっています★★★

★★★★★★★★★★★★★★★★
★★★★★危険度MAX★★★★★

警告!連休中の21、22、23日が危ない!かも2
http://live24.2ch.net/test/read.cgi/eq/1★253494015/
【大気イオン】e-PISCO Part11【また延長】
http://live24.2ch.net/test/read.cgi/eq/1★252991726/

本当に地震が来たら、犯人は特権階級全員だということ2
600デフォルトの名無しさん:2009/09/23(水) 01:21:10
ttp://codepad.org/M7L42mMd
マクロをこんな風に使うことはできませんか?
boostを利用してもOKなので、どうにかできませんでしょうか?

よろしくお願いします。
601デフォルトの名無しさん:2009/09/23(水) 01:24:17
各ベンダの独自機能を使えばそれっぽい事はできる。
602デフォルトの名無しさん:2009/09/23(水) 11:25:40
>>601
やっぱり処理系依存ですか。
ありがとうございます。
603デフォルトの名無しさん:2009/09/23(水) 11:37:19
>>602
処理系依存ではないでしょ。
独自機能を使えばできるって言ってるだけ。

#define TEMP 1
#define MYVAL TEMP+1
#undef TEMP
#define RET MYVAL

RET は MYVAL に展開されて、MYVAL は TEMP + 1 に展開されるが、
この時の、TEMPはundefしちゃってるからエラーってところかな。
604602:2009/09/23(水) 11:51:17
>>603
ありがとうございます。
ええと、
> 処理系依存
でない
> 独自機能
とは、どういった意味でしょうか?
605デフォルトの名無しさん:2009/09/23(水) 12:10:18
仕様に入ってない機能ってことだろ
606デフォルトの名無しさん:2009/09/23(水) 14:05:44
仕様ていうか規格。
607デフォルトの名無しさん:2009/09/23(水) 14:29:31
>やっぱり処理系依存ですか。

処理系に依存しないと出来ないのですか。

じゃないの?
608デフォルトの名無しさん:2009/09/23(水) 14:39:49
何を言ってるんだ
609602:2009/09/23(水) 14:52:59
ああ、すみません。
理解致しました。
610デフォルトの名無しさん:2009/09/23(水) 15:59:33
そんなことができる処理系独自の機能について知りたい。
コンパイラの名前とその機能の使用例を教えみて。
611デフォルトの名無しさん:2009/09/23(水) 15:59:33
ttp://codepad.org/vE2Po53O
これら4つは全て標準C++では認められますでしょうか?
それとも必ず#は行頭にないとならないと言ったルールがあったりしますか?
612デフォルトの名無しさん:2009/09/23(水) 16:27:26
1と2だけおk
613デフォルトの名無しさん:2009/09/23(水) 16:47:11
>>612
そうだったんですか。
ありがとうございます。
初めて知りました。。。
614デフォルトの名無しさん:2009/09/23(水) 16:59:47
>>611
The C++ Standards Committee の 現在のドラフト
ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2914.pdf

の16章(450-451ページ)によると
A preprocessing directive consists of a sequence of preprocessing tokens. that satisfies the following constraints:
The first token in the sequence is a # preprocessing token that (at the start of translation phase 4) is either
the first character in the source file (optionally after white space containing no new-line characters) or that
follows white space containing at least one new-line character.

The only white-space characters that shall appear between preprocessing tokens within a preprocessing
directive (from just after the introducing # preprocessing token through just before the terminating new-line
character) are space and horizontal-tab.
とある。全部OKなような気もするが。。
615612:2009/09/23(水) 17:05:39
私も仕様書を読んでみたところ、
全部OKに思えてきました。

Boostでもそうなっているあたり、
やはりどれもOKなのでしょうね。
>>614
ありがとうございます。
616デフォルトの名無しさん:2009/09/23(水) 17:07:18
>>611
どれでもいい。 >>614 の挙げているとおり。
617615:2009/09/23(水) 17:11:39
すみません私は>>612氏ではなく>>611でございます。
ミスです。お詫び申し上げます。

>>616
ありがとうございます。
私も該当箇所を読んできました。
618デフォルトの名無しさん:2009/09/24(木) 07:17:47
例外を投げるときは、オブジェクトの状態を元に戻すって教わったのですが
C言語の FILE をラップしたようなクラスで
fclose がエラーを返した場合、例外を投げるとすると
もう一度クローズ処理が出来る用にしないといけないのでしょうか?

その場合、C言語の fclose は1度目の呼び出しで失敗した場合も
エラーを返してファイルをクローズしてしまうため、再びクローズを試みることが
出来ないのだけど、どうすればいいんでしょうか?
619デフォルトの名無しさん:2009/09/24(木) 09:41:23
>>618
「再びクローズ」ができないとわかっているなら、最初の質問が意味無いね。
620デフォルトの名無しさん:2009/09/24(木) 13:06:25
>>619
?
621デフォルトの名無しさん:2009/09/24(木) 13:08:34
基本保証しか提供できないってことじゃ炉。
622デフォルトの名無しさん:2009/09/24(木) 16:37:05
fcloseが失敗した時点でアプリができる事はないのでキニシナイ
623デフォルトの名無しさん:2009/09/24(木) 20:14:58
ちゃんとユーザーにエラー通知しろよw

ちゃんとファイルを書き込めてると思ってアプリを終了したら、後でユーザーが泣くぞ。
エラー通知されてればユーザーには別のファイルに保存するとかそういう選択も可能になるんだから。
624デフォルトの名無しさん:2009/09/24(木) 20:16:26
>>618
> 例外を投げるときは、オブジェクトの状態を元に戻すって教わったのですが

この一行目から既に意味が曖昧すぐる
625デフォルトの名無しさん:2009/09/24(木) 21:57:17
いや、だから、「例外」というエラー通知をしてるだろw
例外を発生しないなら戻り値による成否の通知が必要だが
ここは例外発生が前提だから。
626デフォルトの名無しさん:2009/09/25(金) 00:13:16
#include <utility>
#include <iterator>
#include <iostream>

template <class Left, class Right>
std::ostream& operator << (std::ostream& out, const std::pair<Left, Right>& pair)
{
return out << pair.first << ' ' << pair.second;
}

int main(void)
{
using namespace std;

cout << make_pair(10, 20) << endl; // ok

ostream_iterator<pair<int, int> > it(cout, "\n");

*it = make_pair(100, 200); // ng
*it = make_pair(300, 400); // ng
*it = make_pair(500, 600); // ng

return 0;
}

なぜイテレーターのほうがエラーになるのでしょうか?
627デフォルトの名無しさん:2009/09/25(金) 01:19:15
【審議中】
    ∧,,∧  ∧,,∧ サーベルというより槍か薙刀じゃね?
 ∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U (  ´・) (・`  ) と ノ
 u-u (l    ) (   ノu-u
     `u-u'. `u-u'

全長13m ただし刀身はわずか60cm ドイツの大学が“本物”の「ビームサーベル」開発に成功
http://gimpo.2ch.net/test/read.cgi/news7/1250876574/
628デフォルトの名無しさん:2009/09/25(金) 01:20:04
ミス。無視してくれ
629デフォルトの名無しさん:2009/09/25(金) 08:00:38
クラス型のstaticなメンバ変数を使う場合ですけど、そのクラスの
コンストラクタから例外がでたときはキャッチすることができないん
ですよね。

皆さんどうしてますか?

staticメンバには組み込み型か、自作クラスでコンストラクタがthrow()
なものしか使わないとか。
630デフォルトの名無しさん:2009/09/25(金) 08:34:45
エラーが起きるようなものは明示的に初期化してます
631デフォルトの名無しさん:2009/09/25(金) 08:47:01
>コンストラクタから例外がでたときはキャッチすることができないんですよね。
それは都市伝説だ
632デフォルトの名無しさん:2009/09/25(金) 09:10:01
>>618
オブジェクトの状態を元に戻すってのは
例外投げるなら、結果的に何もしなかった状態になってろってってことであって、
再びfcloseで閉じられる様にするってのはちょっとズレてる。
ファイルの例なら、例外が発生しても開いたファイルは何も変更されて無い状態を保証する。

で、そんな保証が出来るとは限らないから
そういうときは、変更しようとしてるデータが生きてることまでは保証して
>>623の言うような、なんかエラー通知して、他の手段を提供するとか。

まあEffective C++嫁
633デフォルトの名無しさん:2009/09/25(金) 09:10:13
>>629
別に、なんとも。実際に例外が発生すると terminate() するんだけど、当然だと思うし。

例外投げない保証があるオブジェクトじゃなくても、ヒープからメモリ確保する奴も
プログラム起動時に走るんなら問題ないだろうね。
634デフォルトの名無しさん:2009/09/25(金) 09:28:09
>>631
> クラス型のstaticなメンバ変数を使う場合ですけど、そのクラスの

この条件なら正しいだろ。
635デフォルトの名無しさん:2009/09/25(金) 09:31:00
>>630
それが妥当ですかね。私もそれを採用してます。

>>631
staticメンバだってとこ見落としてる?

>>633
terminate()は避けたいですわ。
例外はアプリで全てキャッチしたい。
636633:2009/09/25(金) 10:00:32
>>635
terminate() を避けたいなら、実際に例外が発生しないようにすればいいわけで、
>629 みたいに型の段階で絞る必要はないってこと。

プログラム起動時なんだから、たとえば bad_alloc が出るかどうかなら一回試せば
結果はすぐわかるし、ファイルの有無とか外部要因によって例外が出たり出なかったり
するんなら >630 だろうし。
637633:2009/09/25(金) 10:09:32
> プログラム起動時なんだから、たとえば bad_alloc が出るかどうかなら一回試せば
ごめん。これは環境に依存するね。
OS 無しのスタンドアロンでヒープサイズ固定な環境でしか通用しない話だった。
638デフォルトの名無しさん:2009/09/25(金) 10:47:22
>>487 のコード見てたら、こんなん思いついた。

struct float3{ float x, y, z;
float member(char c) const { switch (c) { case 'x': return x; case 'y': return y; case 'z': return z; } }
float3 operator ->* (char const (&order)[3+1]) const { float3 const result = {member(order[0]), member(order[1]), member(order[2])}; return result; }
};

float3 v0;
float3 v1 = v0->*"zyx";
float3 v2 = v0->*"xzy";
float3 v3 = v0->*"yxz";


operator ->* に、何かすごい可能性を感じた。
たぶん気のせいなんだろうけど。
639デフォルトの名無しさん:2009/09/25(金) 11:19:01
静的記憶に置くクラスを作る時は、コンストラクタは例外投げないように書いて、
init()で初期化してるなぁ。
つーかinit()で初期化するのって結構よく使われてるよね。Googleとかもそうじゃ
なかったっけ。GoogleのC++コーディング規約あんまり好きじゃないけど。
640デフォルトの名無しさん:2009/09/25(金) 11:24:10
>>639
> つーかinit()で初期化するのって結構よく使われてるよね。
めんどくさいから、そんなことしないほうがいいだろ。
そんなの付いてるのは古いクラスライブラリだけだよ。
641デフォルトの名無しさん:2009/09/25(金) 11:29:18
めんどくさいけどそうしなきゃならない時があるんだよ
642デフォルトの名無しさん:2009/09/25(金) 11:53:05
何のためのコンストラクタなんだ。
643デフォルトの名無しさん:2009/09/25(金) 11:55:22
コンストラクタも基本的な初期化で使う
初期化コードは必ず全部をコンストラクタに突っ込まなきゃいけない、という話じゃない
ってだけ

つーか静的領域とコンストラクタに関連する問題を理解してるんだろうか
644デフォルトの名無しさん:2009/09/25(金) 11:59:51
ユーティリティ関数としてprivateにinit()を用意することは良くやるけど
それをpublicに置いて自由にアクセスできるようにするのはあんまりやらんなぁ。
645デフォルトの名無しさん:2009/09/25(金) 12:02:14
じゃどうやって静的記憶に置くクラスの初期化の失敗を処理するんだ?
勝手にterminate()していいよ、なんてのは論外として。
646642:2009/09/25(金) 12:08:58
>>645
まあ確かにどうしても初期化に失敗する可能性のあるクラスを
かかなきゃいけないことはあるしなぁ。

コンストラクタから例外を投げたいところだが
静的記憶に置きたいならもうどうしようって感じだよね。
647デフォルトの名無しさん:2009/09/25(金) 12:12:31
>>645
ポインタ置いといて new とか、ローカルな static インスタンスへの参照を返す関数とか。

そもそも静的記憶に置くこと自体が一般的にはマイナーな使い方だし、こういった
回避方法もあるので、それだけで二段階初期化の根拠になるような問題ではない。

少なくとも、二段階初期化はやむをえない事情がある場合に限って使うべきもので
あって、変な理屈で「よく使われている」なんて話にされると迷惑。
648デフォルトの名無しさん:2009/09/25(金) 12:14:11
Googleのはこうだね。
ttp://www.henshi.net/k/hiki.cgi?GoogleCppStyleGuide#l20

コンストラクタはこのスタイルでいいと思う。
コピーコンストラクタの禁止に関してはboost::noncopyableの方が好きだけど。
649デフォルトの名無しさん:2009/09/25(金) 12:15:13
>>647
Googleとは真逆の意見すね。
まぁ、どっちが優れてるかは分からんけど。
650デフォルトの名無しさん:2009/09/25(金) 12:21:00
>>648
compressed_pairさんが採用されてるw
651デフォルトの名無しさん:2009/09/25(金) 12:31:02
>>648-649
Google のやつは前提として例外を禁止しているからそうなってるんだよ。
例外が使える環境で Google のそれに倣う必要はない。
652デフォルトの名無しさん:2009/09/25(金) 12:32:39
シングルトンの問題も仲間に入れてと思い書きます。

スレッドセーフにする為にstaticなmutexを置いたりする必要がありますよね。
mutexのコンストラクタが例外出さないなんて保障あんのかよと思いつつ面倒なんで黙って置いたりしてます。

これに触れてくれているの見たことないんですけど、どんなもんでしょうか?
まあ、mutexのコンストラクタで例外なんて99.9999%ないんですけどね。
653デフォルトの名無しさん:2009/09/25(金) 12:32:42
静的記憶は例外が使えない環境だよな
654デフォルトの名無しさん:2009/09/25(金) 12:36:10
>>652
シングルトンは正直、余計な面倒が多すぎてアンチパターンになりつつあるような。
Google式に初期化を分離してグローバルインスタンスにでもした方が綺麗に収まると思う。
655デフォルトの名無しさん:2009/09/25(金) 12:40:54
どっちのやり方でもやっていけるんなら、あとは質問者が選べばいい問題なんじゃね?
これ以上続けても宗教論争になるだけだし。
というか>>635で既に質問者の選択はされてるし。
656デフォルトの名無しさん:2009/09/25(金) 12:48:03
>>652
正直 C++ でシングルトンとか使ってるの見るとアホかと思うが。

少なくとも pthread_mutex なら問題なく静的初期化できるし、他の環境でも失敗するような
理由が思い当たらないから、気にしなくていいだろ。
どうせ「気にしろ」って言っても何もしないんだろうしな。

http://www.boost.org/doc/html/thread/synchronization.html#thread.synchronization.once
657デフォルトの名無しさん:2009/09/25(金) 13:21:31
>>626
operator<<をstd名前空間に入れる。
stdにある既存のoperator<<にglobalなoperator<<が隠される、というのが理由らしい。
規格的には知らん。
658デフォルトの名無しさん:2009/09/25(金) 13:31:49
>>657
おっとそいつは undefined behavior だぜ。
659デフォルトの名無しさん:2009/09/25(金) 13:33:45
>>657
std名前空間にはいかなる物も追加してはならない。
ただテンプレートの完全な特殊化のみ例外的に認められている。


・・・っと、あれ?クラステンプレートの部分特殊化もOKだっけか?
(関数テンプレートの部分特殊化はC++自体が当然不可能として。)
660デフォルトの名無しさん:2009/09/25(金) 13:34:55
661デフォルトの名無しさん:2009/09/25(金) 13:38:02
C++の名前空間は最初は便利なものだと思ってたけどだんだん嫌がらせに思えてきた
どうにかしてほしい
662デフォルトの名無しさん:2009/09/25(金) 13:42:53
なんか上の方に
C++の規格には矛盾はないのか?
という話題が出ていたけど
 C++ Standard Core Language Defect Reports
 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#197
矛盾なのか単なるミスなのか知らないが、
フツーにあったっぽいな。
修正されているけど。

>>661
そうか?やっぱり便利だよ。
もし無かったらどうすんのさ。
663デフォルトの名無しさん:2009/09/25(金) 13:56:24
>>659
確かに
  C++98 標準では、ユーザ定義型に対しては std::swap の
  完全特殊化のみ std 名前空間に定義することを認めている。
  部分特殊化や、関数オーバーロードは認められていない。
だそうだけど、 std 名前空間におけるクラステンプレートは
部分特殊化もOKだったと思う。
うん、何となく。

詳しくは有識者を待とう。
664デフォルトの名無しさん:2009/09/25(金) 18:30:37
665デフォルトの名無しさん:2009/09/25(金) 18:43:33
επιστημη…
666デフォルトの名無しさん:2009/09/25(金) 18:45:37
名前空間はなんか気持ち悪いから積極的に使おうとは思わん
stdは使いまくってるけど^p^
667デフォルトの名無しさん:2009/09/25(金) 18:46:27
^p^←こいつは偽者だと言っとるだろうがまだ分からんのかあああああああああああああああああああああ
668デフォルトの名無しさん:2009/09/25(金) 19:25:52
>>661
俺がいまやってるプロジェクトでは名前空間名だけで30文字
以上になるような規約を押し付けられてる。
テンプレートをネストさせたりするともう基地外状態。
669デフォルトの名無しさん:2009/09/25(金) 19:36:38
>>622
何のエラーも吐かず通るBCCが気持ち悪い・・・
670デフォルトの名無しさん:2009/09/25(金) 19:38:34
×>>622
>>626

BCCはとことん糞だなあ
C++の勉強をするには不向きだ・・・
671デフォルトの名無しさん:2009/09/25(金) 19:55:20
>>648
RTTIが禁止ってポリモーフィズムを使わないってこと?
なんか汎用性が低そうなモノが出来そうな気がするんだけど。
672デフォルトの名無しさん:2009/09/25(金) 20:01:13
typeidとdynamic_castが禁止なだけだろ
673デフォルトの名無しさん:2009/09/25(金) 20:21:34

「C++ template metaprogramming」と「C++ templates」はどっちが読み易い英語ですか?
(主観でいいです)
674デフォルトの名無しさん:2009/09/25(金) 20:29:23
両方変わらんよ。
両方読め。
675デフォルトの名無しさん:2009/09/25(金) 20:36:10
>>671
明示的には書かないけど、アップキャストもdynamic_castじゃないの?
676デフォルトの名無しさん:2009/09/25(金) 20:40:07
>二段階初期化
初期化時に自分のポインタをよそに渡したいというときがあるけど、
構築が完了するまでそのポインタは使い物にならないから
構築が完了したあとに初期化関数でポインタをよそに渡すという仕組みにすることはある

特に別スレッドにポインタが漏れる恐れがあるときはちゃんとやらないと死ねる
677デフォルトの名無しさん:2009/09/25(金) 20:54:52
相手に自分のポインタを渡すってのはろくなことにならないことが多い
相互に参照しあう関係って非常にだるい
678デフォルトの名無しさん:2009/09/25(金) 20:56:42
>>677
それはあんたの設計がヘタクソなだけだろう。
679デフォルトの名無しさん:2009/09/25(金) 20:57:38
>相互に参照しあう関係って非常にだるい
「参照」を「依存」に置き換えるとなんだか意味深♪
680デフォルトの名無しさん:2009/09/25(金) 21:22:16
>678 のが下手糞に思える俺は駄目ですか?
681デフォルトの名無しさん:2009/09/25(金) 21:25:00
>>648 コンストラクタのコーディングスタイルのところは、昔の自分を見ているようだ。
昔はデフォルトコンストラクタ、デフォルトコピーコンストラクタ、デフォルト代入演算子が
副作用起こしまくりで閉口したもんだ。
でも今はRAIIを徹底してデフォルト〜を期待して書いている。
早い話がデフォルトコンストラクタを持つクラスのみをメンバ変数にすればデフォルトコンストラクタが自動生成されるし、
デフォルトコンストラクタを持たないクラスをメンバ変数にすればデフォルトコンストラクタが作成できなくなる。
他のデフォルト〜も同様だね。
例えばコピーできないファイルハンドルはboost::nocopyableをつけてクラス化したメンバ変数を作っておけばコンパイラがデフォルトコピーコンストラクタをエラーにしてくれる。
共有できるポインタはboost::shared_ptrでメンバ変数を作ればコンパイラがデフォルトコピーコンストラクタを作ってくれるし、
共有できないポインタはboost::scoped_ptrでメンバ変数を作ればコンパイラがデフォルトコピーコンストラクタをエラーにしてくれる。

デフォルト〜を利用しようぜ。
682デフォルトの名無しさん:2009/09/25(金) 21:57:24
>>675
アップキャストはRAII使わないよ。static_castの範疇。
683デフォルトの名無しさん:2009/09/25(金) 21:57:25
デフォールドでヤックデカルチャーです。
684デフォルトの名無しさん:2009/09/25(金) 22:08:51
>>675 アップキャストはコンパイル時に絶対安全と保証される暗黙的型キャスト。RTTIは不要。
暗黙的型キャストに限定されたboost::implicit_castもある。間違ってダウンキャストを行おうとするとエラーになる。
685デフォルトの名無しさん:2009/09/25(金) 22:19:34
>>678
確かに相互参照はマジでろくな事にならない。設計を見直して相互参照はなくすべき。
どうしても相互参照が必要な場合があるとすればObserverパターン位だと思う。そんなときはsignal/slotを使うことで明確化させる。
686デフォルトの名無しさん:2009/09/25(金) 22:35:52
>>682
「わかってるねん わかってるねんで? バカにしたあかん
 dynamic_cast が RAII ・・・それがごっちゃに・・・・」
687デフォルトの名無しさん:2009/09/26(土) 02:21:16
違うとわかってても「あーるえーつー」って読んでしまう
688デフォルトの名無しさん:2009/09/26(土) 03:01:31
>>675
vtblとvptr勉強すれ
689デフォルトの名無しさん:2009/09/26(土) 03:02:38
すまん間違えた、>>675>>671
690デフォルトの名無しさん:2009/09/26(土) 10:35:15
相互参照はだるいっていうけどメディエーターとかないとゲームとか作れないじゃん
NPCがプレイヤーやほかのNPC(たとえば一番距離が近い)を追跡するアルゴリズムとか
メディエーターに問い合わせないとプレイヤーの位置とかどれが一番近いかとかわからないじゃん
691デフォルトの名無しさん:2009/09/26(土) 11:40:09
>>690
相互参照が必要な場面があることと、相互参照がだるいということは両立するから特に問題ないと思うよ。
692デフォルトの名無しさん:2009/09/26(土) 13:22:50
「なくすべき」まで言ってる奴がいるからこういう流れになるんじゃねーの
693デフォルトの名無しさん:2009/09/26(土) 17:07:53
ヘッダーファイルhoge.hにて, グローバル名前空間に
foo関数を以下のように定義することを考えます。

1:namespace NS{inline static int foo() {return 1;}}
2:namespace NS{static int foo() {return 1;}}
3:namespace NS{inline int foo() {return 1;}}

この時, 1と3は同じだと考えて宜しいでしょうか?
2と1, 2と3はインライン化されるかどうかを除いては同じと考えて宜しいでしょうか?

よろしくお願い申し上げます。
694デフォルトの名無しさん:2009/09/26(土) 17:27:31
>>693
1 と 3 はリンケージが違う。 1 は内部リンケージで 3 は外部リンケージ。
ヘッダファイルで定義した場合、 1 だとコンパイル単位ごとに別物になるが、
3 ならすべてのコンパイル単位で同じ物となる。

2 と 1 はインライン化される(されやすい)かどうかを除けば同じことになる。
2 と 3 は、 1 と 3 と同様にリンケージが違う。

質問とは関係なさそうだけど、「グローバル名前空間に foo 」といえば ::foo のことに
なってしまうと思う。
695693:2009/09/26(土) 17:59:08
>>694
リンケージの差異ですか。
ありがとうございます。

「グローバル名前空間に foo 」は確かにご指摘の通りです。
失礼しました。
696デフォルトの名無しさん:2009/09/26(土) 19:47:09
static関数の宣言の仕方は
 staticの使い方3〜静的関数〜
 ttp://www.paw.hi-ho.ne.jp/takadayouhei/technic/39.html
ここにあるとおり
/* 静的関数の関数プロトタイプ宣言の例 */
static int testfunction( int value );
/* 静的関数の関数定義の例 */
static int testfunction( int value )
{
  int a;
    :
  return a;
}
で良いとのことですが、inline関数の宣言の仕方は
同じく
/* inline関数の関数プロトタイプ宣言の例 */
inline int testfunction( int value );
/* inline関数の関数定義の例 */
inline int testfunction( int value )
{
  int a;
    :
  return a;
}
で宜しいのでしょうか?
それともどちらか片方にinlineを付ければ宜しいのでしょうか?
(なお、inlineになるかどうかはコンパイラによってうんぬんはおいといてください。)

よろしくお願い申し上げます。
697デフォルトの名無しさん:2009/09/26(土) 20:06:57
大学の講義でc++をするはめになったのですがCをある程度理解していることが前提でした。
Cは必修科目で一度やったからなのですが私はお情けで通してもらったようなものでCの知識がほとんどありません。

このスレのテンプレにあるような解説サイト読めばCの知識無しでも理解できますか?
今はスタック関数を動的にしてポインタでなんたら〜って問題で詰まってる感じです。
1回目にでた課題に10時間かけて半分も終わらない程度の能力なので
宿題をやってもらうスレに投下すると今後が思いやられるのでなんとか自分で理解したいのですが。
698デフォルトの名無しさん:2009/09/26(土) 20:11:35
K&R第2版を買いましょう。たった200ページ程度で
C言語のすべてがわかります。すべてです。
699デフォルトの名無しさん:2009/09/26(土) 20:15:07
>>696
それでいい。最初に現れた宣言と矛盾の無い宣言を繰り返すのであれば問題ない。
700デフォルトの名無しさん:2009/09/26(土) 20:17:43
>>698
K&R2 の読書会はどこぞでやってませんか。後ろ1/3 が全然理解できません。
付録Aとか。
いや、付録Bは異様に参照しています。

701デフォルトの名無しさん:2009/09/26(土) 20:30:48
>>698
それ初心者には向いてないって意見もあるんだけど実際のところどうなの?
702デフォルトの名無しさん:2009/09/26(土) 20:32:02
>>696
意味や動作上は問題ないんだけど、単純に分けて書くのは面倒だし、
離れた宣言の間で inline 関数を呼び出したときにはインライン展開が
起こりにくいなどのコンパイラ実装上の問題も考えられるので、
宜しくないと言えるかもしれない。

定義ひとつで済ませるのがおすすめ。
703696:2009/09/26(土) 20:49:13
>>699
>>702
お二方、ありがとうございます。
704659:2009/09/26(土) 20:51:33
std名前空間で定義されたテンプレートの完全or部分特殊化に対して
言及しているC++の仕様書の項目を教えていただけますでしょうか?
またはそれをコピペして示していただけますでしょうか?
なお、英語でOKです。
705デフォルトの名無しさん:2009/09/26(土) 20:56:23
>>704 17.4.3.1 Reserved names p1
706デフォルトの名無しさん:2009/09/26(土) 21:34:28
>>697
お情けでC++の単位ももらえばいいんじゃないかィ
なにCの単位をお情けで取れたお前ならできる
お前はやればできる子だって俺はわかってるからよ
707デフォルトの名無しさん:2009/09/26(土) 21:44:39
>>697
誰もが通る試練だ。あきらめずに続ければ物になるものだ。あきらめたらそこで終わりだぞ。
708704:2009/09/26(土) 22:46:04
>>705
ありがとうございます。
見てきます。
709704:2009/09/26(土) 22:50:27
>>705
おかげさまでIt is undefined for a …(ryのくだりが見つかり、そこから
 std名前空間にテンプレートの特殊化を追加する - Cry’s Diary
 ttp://d.hatena.ne.jp/Cryolite/01000227
ここを探し当てました。
ありがとうございました。
710デフォルトの名無しさん:2009/09/26(土) 23:20:45
標準C++で、1ファイルあたりの行数制限はありますか?
711デフォルトの名無しさん:2009/09/26(土) 23:41:56
そもそも規格上のソースコードにファイルという単位があるのかね。
712デフォルトの名無しさん:2009/09/26(土) 23:49:29
>>710 無いよ。
713デフォルトの名無しさん:2009/09/27(日) 00:00:29
ああ、確かにそうですね。
ありがとうございました。
714デフォルトの名無しさん:2009/09/27(日) 00:07:51
g++でコンパイルすると、
文字コードがS-JISのソースで
"能"が文字化けしてしまいます。
"能\"とすれば文字化けは解決しますが、
今度はVC++で困ります。
VC++では"能"で文字なく"能\"で問題が出ます。

これらg++とVC++で同時にこの問題を解決する方法は無いでしょうか。
715デフォルトの名無しさん:2009/09/27(日) 00:17:15
EUC UTF8
716デフォルトの名無しさん:2009/09/27(日) 00:24:05
16進 0x
717デフォルトの名無しさん:2009/09/27(日) 00:27:27
>>714
--input-charset=cp932 --exec-charset=cp932
718デフォルトの名無しさん:2009/09/27(日) 00:29:46
うにこーどをつかおーぜ。
719デフォルトの名無しさん:2009/09/27(日) 00:31:40
入出力なんて英語でいいじゃん楽だし
720714:2009/09/27(日) 00:47:07
みなさんありがとうございます。
やはりUTF8等といったユニコードが必要なようですね。
しかし今までSJISの財産(負債とも言う)がたまっていまして、今更UNICODEにするわけにも行かないんです。

>>717
コンパイルオプションで指定できるのですね。
ありがとうございます。
721デフォルトの名無しさん:2009/09/27(日) 01:38:35
逃げかも知れんが、

#ifdef __GNUC__
何かする
#else
同じようなことする
#endif

みたいな手もある。
コードに一切触るなとなると無理だけど、使える範囲は広い。
722デフォルトの名無しさん:2009/09/27(日) 06:46:15
>>720
SJISで動作するやつはそのままでいい。
SJIS UTF8はコンパイラ文字をが認識するとき以外には影響ないだろう。
723720:2009/09/27(日) 10:41:37
>>721
ありがとうございます。
しかしそれですと将来的にコンパイラが変わったら
またメンテナンスしなければならなくなりそうで
ちょっと気が引けています。

>>722
そうですね。。。問題の起こるヤツだけUTF-8にすれば良いわけですか。
なるほど。
724デフォルトの名無しさん:2009/09/27(日) 11:04:16
>>711
ファイルがなかったら、ファイルスコープの概念はなりたたない。
725デフォルトの名無しさん:2009/09/27(日) 11:10:23
ファイルスコープなんていう概念は標準にあったっけ
726デフォルトの名無しさん:2009/09/27(日) 11:18:46
>>724
http://unkar.jp/read/pc11.2ch.net/tech/1200044614#l544
> 557 :デフォルトの名無しさん[sage]:2008/02/16(土) 13:40:57
> 「ファイルスコープ」は C の規格で翻訳単位全体にわたるスコープとして使われてたけど、
> C++ の規格では使われなくなってる(引用略)
727デフォルトの名無しさん:2009/09/27(日) 11:26:00
翻訳単位だな
でもファイル有効範囲という言葉はあった気がする
728デフォルトの名無しさん:2009/09/27(日) 11:28:00
>>727
無いよ。
C の「ファイルスコープ」にあたるのは C++ では「グローバル名前空間スコープ」という。
729デフォルトの名無しさん:2009/09/27(日) 12:04:55
実際にはstatic宣言次第ではファイルスコープが実現しているような気がするんだけど。

C++0xではもっと現実の実装へ歩み寄って欲しいなあ。
730デフォルトの名無しさん:2009/09/27(日) 12:06:03
おまえら無名名前空間とかちゃんと使ってください
731デフォルトの名無しさん:2009/09/27(日) 12:07:53
>>729
名前空間スコープでの static 指定で変わるのはリンケージ。スコープじゃない。

> C++0xではもっと現実の実装へ歩み寄って欲しいなあ。
何が不満なの?
732729:2009/09/27(日) 12:17:59
>>731
> 名前空間スコープでの static 指定で変わるのはリンケージ。スコープじゃない。
そういやそんな会話が上で交わされていたような気がするな。

> > C++0xではもっと現実の実装へ歩み寄って欲しいなあ。
> 何が不満なの?
インクルードパスを指定する方法とかが環境依存。
ディレクトリの区切りが/か\かとか。
一応ディレクトリが存在しない環境への配慮…(ryとかあるんだろうけどさ。

あとはexport。

733デフォルトの名無しさん:2009/09/27(日) 12:42:22
>>732
> インクルードパスを指定する方法とかが環境依存。
最悪、ソースファイルに書かれたとおりで正しいファイルが選ばれるように
コンパイルオプションを調整すればいいわけで、あんまり問題だとは思わない。
そういった調整が可能なようにある程度ソースファイルを書く側で気をつけておく
ことになるんだけど、正直もう慣れたんであんまり問題だとは感じない。
boost レベルの汎用ライブラリが十分な移植性を持っていることを考えてもね。

> ディレクトリの区切りが/か\かとか。
#include で指定するパスに \ を含んでいると未定義動作になる。
単純に / で統一すれば良い。

> あとはexport。
これは確かに問題だと思う。
DR にもあった。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#820
734デフォルトの名無しさん:2009/09/27(日) 12:46:27
>>732
環境依存のゴタゴタを避けたきゃJavaかC#に移行するって手も
そこまでするほどでもないならそれまでで

正直.netの文字列周りはうらやましいと思う
735デフォルトの名無しさん:2009/09/27(日) 13:15:40
>>734
boostでイナフ
736デフォルトの名無しさん:2009/09/27(日) 13:20:12
>>733
思う思わないの議論をし始めると不毛だから避けるとしよう。

俺だって全部/に統一しているしBoostも非常に便利に使わせてもらっているけど、
それとは別に仕様がはっきりと定めて欲しいなぁと「思った」だけのこと。

exportもまあ無くても慣れたけど
どうせC++0xという大改革をするなら
もうちょっとどうにかしてほしかった。

まあいいや
どうもありがとうね。

737デフォルトの名無しさん:2009/09/27(日) 16:30:57
exportって、何すか? C++しかやってないから分からない。
738デフォルトの名無しさん:2009/09/27(日) 17:01:55
templateメタプロを整理して言語として綺麗に見えるようにしてほしかった
739デフォルトの名無しさん:2009/09/27(日) 17:12:57
>737
まぁネタだろうけど。
れっきとした C++ です。サポートしてる処理系が Comeau C++ ぐらいしかないけどな!

>736
>exportもまあ無くても慣れたけど
>どうせC++0xという大改革をするなら
>もうちょっとどうにかしてほしかった。
C++0x としては何かするにしても deprecated 扱いにするとか削る方向しかないような気がする。
将来的にはパスあたりも含めて Modules in C++ TR で提案されるんだろうけど。
740デフォルトの名無しさん:2009/09/27(日) 18:08:48
>>739
いや、素でそんなコンパイラは知らなかった。
ググってきたけど、プリコンパイルドヘッダみたいなもんか。まあ、あれば
便利だなとは思う。
741デフォルトの名無しさん:2009/09/27(日) 20:25:33
Fortranの配列のアクセスに使える : みたいなものをC++で実装できますかね?
742デフォルトの名無しさん:2009/09/27(日) 21:24:18
作れるよ。
743デフォルトの名無しさん:2009/09/27(日) 21:56:39
BoostのRangeとかは便利だな
744デフォルトの名無しさん:2009/09/27(日) 22:46:14
>>740
英語だけど
Comeau C/C++ - Wikipedia, the free encyclopedia
ttp://en.wikipedia.org/wiki/Comeau_C/C%2B%2B
ここが分かりやすい。
745デフォルトの名無しさん:2009/09/27(日) 23:40:08
初心者なんだが
string型の何文字目が○○か?
みたいな関数ってある?
もしくはint型の何桁目は何の数字か?とか
746デフォルトの名無しさん:2009/09/27(日) 23:42:57
>>745
何がしたいの?
書いてあるとおりだとしたら、普通に書くだけじゃ何か不満なの?
747デフォルトの名無しさん:2009/09/28(月) 00:00:28
>>746
ゲーム作り。二次元配列用意してマップ座標[0.0]番目の上に何が乗っているか?耐久力はどれくらいか?って事をやりたい
一桁目がそのマップにいる敵の種類二桁目がhpで・・とか。おかしい?
まじで手探り状態。多分こんな理屈じゃよくないんだとと思う
748デフォルトの名無しさん:2009/09/28(月) 00:04:30
マジレスすると構造体とかクラスとか勉強しないとだめだと思うよ。
749デフォルトの名無しさん:2009/09/28(月) 00:08:03
>>748
構造体はわかるけどクラスはいまいち知らん
勉強してきます
750デフォルトの名無しさん:2009/09/28(月) 00:08:04
とりあえず入門書は最後まで読み終えてから質問したほうが効率がいいと思うよ。
751デフォルトの名無しさん:2009/09/28(月) 00:12:28
>>749
> 構造体はわかるけどクラスはいまいち知らん
それ致命的だろ。
要するにC言語+一行コメントしか知らないと言うことにほぼ等しいよ。

C++は魔性の言語だから、まあ相当な覚悟が必要です。
趣味でやるなら真に覚悟を決めた者じゃないと
途中で挫折することは
間違いないから頑張ってください。

752デフォルトの名無しさん:2009/09/28(月) 00:16:04
標準Cは1月で十分かなって実感できたけどC++は数年やっても終着点が見える気配すらしない
753デフォルトの名無しさん:2009/09/28(月) 00:19:25
C++は定番の本を全部読むぐらいの意気込みで。デザインパターンの本も。
Cで巨大で複雑なことをやろうとすれば、どのみち自作C++に近づいていくので、
初めからC++を学んだほうが近道。
754デフォルトの名無しさん:2009/09/28(月) 01:15:27
いや、最初はCだけで覚えた方が色々便利だと思うよ
C縛りの仕事ってのはやっぱりあるし
755デフォルトの名無しさん:2009/09/28(月) 02:07:49
それはそうかも。CとC++の違いを知っていたほうがいいかも。
756デフォルトの名無しさん:2009/09/28(月) 02:16:28
ゲーム作りならC#でいいじゃろ。
C++使うほどじゃない。
757デフォルトの名無しさん:2009/09/28(月) 02:27:17
C#でゲームなんか作ったら間違っても金は取れないわフリーでも相手にされないわ
758デフォルトの名無しさん:2009/09/28(月) 02:58:56
>二次元配列用意してマップ座標[0.0]番目の上に何が乗っているか?耐久力はどれくらいか?って事をやりたい

これで金を取るつもりか。
759デフォルトの名無しさん:2009/09/28(月) 05:03:25
C縛りの仕事なんてやりたくないわな
760デフォルトの名無しさん:2009/09/28(月) 05:14:01
計算量が必要な処理は何でもGPUみたいな時代になりつつあるし、
そうなったらWindowsで作ってる分にはC#でいいな。
761デフォルトの名無しさん:2009/09/28(月) 06:04:59
まぁ、Windows限定でならそれでいいんじゃね。
762デフォルトの名無しさん:2009/09/28(月) 09:28:57
>>745
ちょっと書いてないみたいなんで

> string型の何文字目が○○か?

単純に文字配列的に使える s[n] みたいに。

> もしくはint型の何桁目は何の数字か?とか

こっちは知らん。自分で関数書くのかな。簡単だしいろいろな書き方ありそう。
763デフォルトの名無しさん:2009/09/28(月) 09:51:45
xのn桁目は x / (10のn-1乗) % 10 で求められるよ。
764デフォルトの名無しさん:2009/09/28(月) 11:16:16
> > string型の何文字目が○○か?
>
> 単純に文字配列的に使える s[n] みたいに。

実のところ、そう単純ではなく、
stringにSJISなどの二バイト文字が入っていると
何文字目と何バイト目の対応がずれるし、
UTF-8が入る場合もある。
765デフォルトの名無しさん:2009/09/28(月) 12:29:07
int getNthDigit(int x, int n)
{
char buf[100];
sprintf(buf, "%99d", x);
return buf[99 - n] - '0';
}
// いまいちすっきりしなかった
766デフォルトの名無しさん:2009/09/28(月) 19:22:28
>>759
組み込み系では今でも多いんじゃない? 現場から離れたので詳しくは知らないが。
C++は、仮想継承等、表に見えないデータ量増加等があって、知識がないと嵌るかも
しれないし。
767デフォルトの名無しさん:2009/09/28(月) 19:54:51
>>757
一方、iPhoneは・・・いや、なんでもない。
768デフォルトの名無しさん:2009/09/28(月) 21:56:00
>>723
SJISのままできるよ。
SJISソースの文字の2バイト目に\がくる場合に\\に
置き換えるフィルタをC++で作ればいいよ。
769デフォルトの名無しさん:2009/09/28(月) 22:01:15
>>764
環境依存になるけどwstringは?
770デフォルトの名無しさん:2009/09/28(月) 22:48:22
>>769
サロゲートペアとか結合文字とかあるから、だめなんじゃないの?
771デフォルトの名無しさん:2009/09/28(月) 23:19:34
wchar_tは存在自体が邪悪
772デフォルトの名無しさん:2009/09/28(月) 23:57:34
c++の言語仕様について詳しい方、お願いします。

(unsigned int)-1
-(unsigned int)1
-1u

これらは、unsigned int であらわせる最大の値であることは保障されますでしょうか?
それとも環境依存or不定でしょうか?

C++0x ではなく ISO/IEC 14882:2003 でお願いします。
773デフォルトの名無しさん:2009/09/29(火) 00:05:55
>>771
邪悪だろうがvector<bool>だろうが、
標準に入っちまえば正義。
774デフォルトの名無しさん:2009/09/29(火) 00:08:52
>>772
ごめんしらねぇけど
std::numeric_limitsじゃダメなの?
1.5 指定された整数型が表現可能な最小値および最大値を返す。 | 株式会社きじねこ
http://www.kijineko.co.jp/tech/cpptempls/integer/min_and_max.html
775デフォルトの名無しさん:2009/09/29(火) 00:18:54
光(移植性)あるところ常に影(ツギハギ)あり
776デフォルトの名無しさん:2009/09/29(火) 00:19:43
>>774
すみませんが
他の方法ではなく、
質問そのままの方法で回答がわかる方お願いします。
777デフォルトの名無しさん:2009/09/29(火) 00:45:24
そりゃあ…かまわない
おまえの質問に答えること それ自体は容易い 簡単だ
規格はこれこれこう そんな話は いくらでもできる

しかし 今 オレが そんな話を 仮にしたとしても その真偽はどうする…?
真偽など どうでもいいから 聞きたいと言うのか…?ククク……
778デフォルトの名無しさん:2009/09/29(火) 00:49:28
つまり、既存コードでそれがあって、そこが問題の原因になってるかどうかを知りたい?
779デフォルトの名無しさん:2009/09/29(火) 01:00:14
>>777
ご存知でしたら教えてください。
真偽はあなたを信用しますとしか言えません。
もし可能であれば規格の根拠となる部分を教えて頂けたらと思います。

>>778
そのように思っていただいてもかまいません。
詳細はすみませんが控えさせていただきます。
780デフォルトの名無しさん:2009/09/29(火) 01:12:10
>>773
標準はあくまでも標準でしかなく正義ではない
781デフォルトの名無しさん:2009/09/29(火) 01:23:37
邪悪の反対は善良であって、正義ではない。
782デフォルトの名無しさん:2009/09/29(火) 01:53:24
C++は数値の内部表現については規定してない。
そしてそれ故負の数が補数で示されるかどうかなどは分からない。
保障されない。
783デフォルトの名無しさん:2009/09/29(火) 02:06:54
とりあえずその処理系について、最大値と同じ値になるかどうかを調べてみたら?
既存システムの問題判定のためにはそれでいけるとおもうが、詳細(というか、状況)を伝えられないのなら
これ以上はむりだわ
784デフォルトの名無しさん:2009/09/29(火) 02:18:09
wchar_tは粘着アンチがいるなぁ
普通に使えるところでは使える
使わせる気がさらさら無い環境も少なくはないが
785デフォルトの名無しさん:2009/09/29(火) 02:20:18
>>772
unsigned intの算術はmod 2^sizeof(unsigned int)の世界に常に従うから
その3つはどれも2^sizeof(unsigned int)-1になることが保証されてる

不定だの処理系定義だの負の数の内部表現に依存するだのデタラメ言ってる奴らは自重しろ
786デフォルトの名無しさん:2009/09/29(火) 02:21:31
訂正
2^(sizeof(unsigned int)*CHAR_BIT)だな
787デフォルトの名無しさん:2009/09/29(火) 02:22:37
世界はもうやめろ
788デフォルトの名無しさん:2009/09/29(火) 02:24:50
ああ違う違う何言ってんだ
(unsigned int)-1
これはunsigned int型の2^(sizeof(unsigned int)*CHAR_BIT)-1

-(unsigned int)1
-1u
この2つはsigned int型の-1になる
またunsigned int型に変換すれば2^(sizeof(unsigned int)*CHAR_BIT)-1になるけど
789デフォルトの名無しさん:2009/09/29(火) 02:49:06
790デフォルトの名無しさん:2009/09/29(火) 02:50:33
知らなかった
ごめんなさい
791デフォルトの名無しさん:2009/09/29(火) 03:15:42
謝るほどではないw
792デフォルトの名無しさん:2009/09/29(火) 07:07:22
>>780
標準は正義では無いだろうが
勝者は正義と見なされる。

そして標準は勝者である。
793デフォルトの名無しさん:2009/09/29(火) 08:00:19
標準は勝者かな?
標準と聞いて俺が思い浮かべる言葉は主に妥協とか公約数で、
「勝」の字に見合うイメージはあまり無いけど。
794デフォルトの名無しさん:2009/09/29(火) 08:23:29
basic_string<> に、ちょっと機能(例えば文字コード変換だとか)を追加したような文字列
クラスを作りたいのですが、どうすべきか迷っています。

最初、安直に basic_string<> を継承しようかと思ったのですが、デストラクタが virtual じゃ
ないんですね。
basic_string<> をメンバーに持つクラスを作るという手もあるかもしれませんが、
基本的なインターフェースを basic_string<> と同じにしたいというのがあるので、
それを自分で一通り用意しないといけないですよね。単純作業かもしれませんが。
795デフォルトの名無しさん:2009/09/29(火) 09:18:20
string conv(string, option)でおけ。手間かけて得られる物は少ない。
796デフォルトの名無しさん:2009/09/29(火) 09:18:41
そういう機能は普通の関数にしとけ
797デフォルトの名無しさん:2009/09/29(火) 09:44:30
>>790
人の事を散々出鱈目だのなんだの言っておいて謝っただけで済むと思うな。
798デフォルトの名無しさん:2009/09/29(火) 10:04:33
何を勘違いしてるんだ。
謝らなくても済む場所で、わざわざ謝ってもらったんじゃないか。
799デフォルトの名無しさん:2009/09/29(火) 10:07:16
盛りあがってまいりました!
800デフォルトの名無しさん:2009/09/29(火) 10:11:58
足し算のみだと、char , short int , int(float) , doubleの順に時間掛かるな。
サイズに応じて掛かる時間が比例する。
char で1秒かかるとき、doubleだと8秒かかる。
forでカウントするときは、適切なサイズを用いた方が良いらしい。
unsigned intが最も速いんだと勘違いしてた。 intに変換し直すと思ってた。
801デフォルトの名無しさん:2009/09/29(火) 10:18:14
メモリは余分確保しない方がいいってことだ。ここを見直すだけで、速度が倍になったりする可能性がある。
802デフォルトの名無しさん:2009/09/29(火) 10:21:03
>>800
環境依存だから、環境を特定して言わないと意味無いよ。

しかしループカウンタに char を使ったほうが速い環境ってどんなだろう?
8bit CPU 向けコンパイラでカウンタの最大値が 256 未満とか?
803デフォルトの名無しさん:2009/09/29(火) 10:26:48
別方法で計測したら、char 2000とすると、double 3700くらいだった。順番は変わらず。
8倍の部分の訂正。
>>802 カウントを256未満しか使わない場合。環境はx86 windowsXP。
804デフォルトの名無しさん:2009/09/29(火) 10:28:51
いまの計測方法は、vector< int > vec(100000);という配列にランダムアクセスが来て
vec(・)++; とカウントしたときに合計時間です。
805デフォルトの名無しさん:2009/09/29(火) 10:32:10
>>803-804
それならメモリアクセスが足を引っ張るから、わりとあたりまえな話。
806デフォルトの名無しさん:2009/09/29(火) 11:21:31
>>798
>謝らなくても済む場所で
それを許すから便所の落書きになる。
807デフォルトの名無しさん:2009/09/29(火) 11:23:34
え?ここって便所の落書きコーナーじゃなかったの?
808デフォルトの名無しさん:2009/09/29(火) 11:41:35
>>806
許す許さないはこの話に全く関係無い。
試しに今、>>790をずっと許さないでいてみな。それが便所の落書きを
何か上等な物に昇格させるってんなら、見ててやるよw
俺は「C++関連の便所の落書き」が「C++の話すらできない便所の落書き」に
ランクダウンするだけだと思うけどね(人それを「荒れる」と言う)。
809デフォルトの名無しさん:2009/09/29(火) 14:03:34
関数にデストラクタがあったらいいのだが・・・
関数を使ってバッファ付きファイル出力したら、
終了時にバッファの残りを出力しないといけない。
クラス化するのも面倒。
810デフォルトの名無しさん:2009/09/29(火) 14:18:10
flush ではダメなの?
811デフォルトの名無しさん:2009/09/29(火) 14:20:17
>>809
それは関数の最後に処理を記述するのと何がちがうの?
812デフォルトの名無しさん:2009/09/29(火) 14:20:39
>>809
・関数の最後に出力処理を書き、その直前にラベルを置く。ショートカットしたいときはgotoする。
・その関数を呼ぶだけの関数を用意し、その関数で出力処理を書く。
・関数内で無名のクラスを作り、デストラクタで出力する。
813デフォルトの名無しさん:2009/09/29(火) 14:20:39
C++でUTF32の文字列を扱おうとしたら
どうやるのがセオリーなんですか?
814デフォルトの名無しさん:2009/09/29(火) 14:35:31
従来の文字コードと大体似たように扱えばおk
wchar_tがUTF32な環境限定で作るのが確定してるならwchar_tでもおk
815デフォルトの名無しさん:2009/09/29(火) 14:36:06
そもそもC系言語で日本語文字列を扱わないのがセオリー
816デフォルトの名無しさん:2009/09/29(火) 14:36:29
>>813
32bit 整数型( uint32_t とか)を符号単位として typedef して
std::basic_string とかの標準コンテナを使って文字列型を作り、
各種変換関数を用意する、って感じ?

自分の使った方法と、それについて具体的に不満な点を挙げて
もらったほうがいいと思う。
817809:2009/09/29(火) 14:46:56
すみません。こういうケースなんです。 
fwriteはバッファがたまったら出力します。staticやグローバルでメモリを確保します。


main(){

while(){
・・・
fwrite( x );
}

}
818デフォルトの名無しさん:2009/09/29(火) 14:50:09
RAIIを徹底せよ
819809:2009/09/29(火) 14:52:09
fwriteでstaticでクラスのオブジェクト生成すれば、いいですかね?
mainの終了時にデストラクタよばれますよね
820デフォルトの名無しさん:2009/09/29(火) 15:05:44
>>813
ICU使うのが一番簡単なんじゃないかな
821デフォルトの名無しさん:2009/09/29(火) 15:14:03
>>816
> 自分の使った方法と、
UTF32の文字列を使ったことはありません。

> それについて具体的に不満な点を挙げて
不満な点ですか?

どのOSでも同じように使えないのはイヤ。

フレームワークを使うときは、そのフレームワークにあわせますが、
使わない場合のやり方がほしい。

なるべくC++標準のやり方がいい。(C++0xではu32string?なんてのができるの?)
それが無ければ準標準(boostみたいな)のやり方、
それが無ければ、クロスプラットフォームなライブラリ(有名なもの)
822デフォルトの名無しさん:2009/09/29(火) 15:32:21
>>817
そんなアプローチでいいとは信じ難いのだが……
それはさて、staticなオブジェクトのデストラクタは呼ばれるよ。
exception含めて例外処理ができなくなるけど。
823デフォルトの名無しさん:2009/09/29(火) 15:33:25
なるほど
824デフォルトの名無しさん:2009/09/29(火) 17:47:34
std::stringにヌル文字入れられるみたいなんですけど
どうやって入れるのでしょうか?
825デフォルトの名無しさん:2009/09/29(火) 17:49:44
0
826デフォルトの名無しさん:2009/09/29(火) 17:52:38
proxyってようは参照っぽく振舞うオブジェクトのことでいいの?
827デフォルトの名無しさん:2009/09/29(火) 17:56:57
もしかしてクラスのメンバー関数に可変長引数を使うのはNGなんでしょうか?

AAA: texture (char* name, ... )

みたいな感じで定義すると va_args の戻り値が
有効な引数の数を越えて呼び出しても0になってくれないのですが…
(ので引数の数が判定できない)
828デフォルトの名無しさん:2009/09/29(火) 18:29:47
有効な引数の数を超えて呼び出したら0になるなんて、誰からそんな嘘を聞いたんだ?
829デフォルトの名無しさん:2009/09/29(火) 18:37:15
夢じゃないかな。
830827:2009/09/29(火) 19:06:41
いやPixieというとてもとても有名なフリーソフトがそうやってるのですが…

// Comments :
static inline void getArgs(va_list args) {
RtToken tmp;
tmp = va_arg(args,RtToken);
nTokens = 0;
while (tmp != RI_NULL) {

//

tmp = va_arg(args,RtToken);
}
831デフォルトの名無しさん:2009/09/29(火) 19:08:48
>>830
それで、呼ぶ側のコードは?
832デフォルトの名無しさん:2009/09/29(火) 19:25:11
833827:2009/09/29(火) 19:26:54
ごめん、Pixieには可変長引数の関数を呼び出すときは必ず最後0を入れて呼び出す、
という決まりを忘れてました。うっかりさんです。
解決しました。

このうっかりは検出できねー
834827:2009/09/29(火) 19:27:54
いい忘れ。
ありがとうございました。
835デフォルトの名無しさん:2009/09/29(火) 20:03:43
A g_a;
A& get_A1(){ return g_a; }
A get_A2(){ return A(); }

main(){
const A& a = get_A1(); // OK
const A& a = get_A2(); // ?
}

こういう風に、インスタンスを返す関数に対し、参照で受けても問題ないでしょうか?
836デフォルトの名無しさん:2009/09/29(火) 20:16:54
>>835
> こういう風に、インスタンスを返す関数に対し、参照で受けても問題ないでしょうか?
普通の参照はだめだけど、constな参照ならば特別にOKということになっている。
A& a = get_A2();
はダメだけど
const A& a = get_A2();
ならOKってこと。

 C++ Labyrinth
 ttp://www.fides.dti.ne.jp/~oka-t/cpplab-tips-1.html

 const な参照は一時オブジェクトを束縛する [5.5] [10.4.10]
参照。
837デフォルトの名無しさん:2009/09/29(火) 20:17:52
>>827
定義するのも使うのも構わないけど
非PODを省略部の実引数に渡すと未定義動作だから気を付けろ
838デフォルトの名無しさん:2009/09/29(火) 20:36:12
>>836
ありがとうございます。

やっぱり、「const A a = get_A0();」
よりは、「const A& a = get_A1();」の方が
代入が無い分、効率が良かったりするんでしょうか?
今まで書いたコードは全部前者なんですが、失敗したかなぁ?
839デフォルトの名無しさん:2009/09/29(火) 20:38:02
const参照ならテンポラリな返り値を受け取ってもいいのかしらなかった
840デフォルトの名無しさん:2009/09/29(火) 20:40:28
RVOだかNRVOだかでヤフれ
841デフォルトの名無しさん:2009/09/29(火) 20:46:27
>>840
NRVOはVC8で有効なようで、
自分の環境では前者でもいいみたいです。
ありがとうございました。
842デフォルトの名無しさん:2009/09/29(火) 21:02:40
>>838
とりあえず一定以上の品質のあるコンパイラに
最適化させればそのくらい空気読んで
戻り値最適化をしてくれるから
今までのでも大丈夫だと思うよ。
843デフォルトの名無しさん:2009/09/30(水) 18:03:01
>>833
vectorやfusionで渡すといいよ
844デフォルトの名無しさん:2009/10/01(木) 01:28:53
vector<string>、vector< vector<int> >型をファイルに記録するとき、
サイズなどの情報を含めて、HDDのイメージバックアップのように記録できませんか?
845デフォルトの名無しさん:2009/10/01(木) 01:37:02
boost::serialization
846デフォルトの名無しさん:2009/10/01(木) 09:28:33
thx
847デフォルトの名無しさん:2009/10/01(木) 15:43:43
>>813
正式にはstd::codecvtをカスタマイズするのだと思う。
ただめんどくさいし実用性が怪しいので誰もやらない。
やはりMFCやらQtやらのフレームワーク又はICUなど
の外部ライブラリを利用することになるはず。

後、boostの一部はロケールをあんまり考慮してないの
ではまる可能性有り。
boost::lexical_castはグローバルなロケール使ってるか
らドボンし易いのだけど、これを内部で利用しているもの
が色々あるので困る。
boostでロケールが絡むものは避けた方がいいかも。
848デフォルトの名無しさん:2009/10/01(木) 16:03:36
lexical_castは最初は神だと思ったなぁ…
今でも用途さえ合えば神なんだけどね。

C++がゼロオーバーヘッドを正義としている以上、ライブラリも同じ正義をおおむね
目指している訳で、抽象度と汎用性の高いライブラリでも「それがどんな仕組みで
動いてるのか」を把握した上で使う前提になってるのが、良さでもあり悪さでもある
んだろうなぁ。
849デフォルトの名無しさん:2009/10/01(木) 16:12:04
欧米人はロケールに全然興味なさそうだよね。
まあ、わかるがw。
850デフォルトの名無しさん:2009/10/01(木) 17:13:46
>>847
やっぱ、セオリーといえるほど一般化した方法はないんでしょうかね。

今回自分がやっていたのは、ある海外ソフトの日本語化なんですが、
フレームワークはそのソフトが使っていなかったので
そこまでやりたくなかった。

そうなるとICUかiconvかってことになるわけで、なんとなくiconvを選んでみました。
文字コードだけじゃなく、本格的な国際化するときはICUがいいんでしょうね。

それでstd::basic_string<uint_32> u32stringがC++0xで標準になるって
みたんで、u32stringを使うことにしました。

あとは、iconvのchar*のデータをu32string型に入れるとこなんですが、
さてどういうやり方が一番シンプルなんだろうか。
851デフォルトの名無しさん:2009/10/01(木) 17:17:55
ICUのほうがいい。
変換時に、バグってる文書でも、なるべく多くの情報が残る。
NKF ICU ICONVで比較した。
ICUだけがダントツで性能良かった。
852デフォルトの名無しさん:2009/10/01(木) 18:37:15
ICUってスレッドセーフ?
853デフォルトの名無しさん:2009/10/01(木) 18:58:51
ぶっちゃけ、コンピュータを扱う時点で英語以外はディスアドヴァンテージしかない。
英語以外はテキストでなく、特殊なバイナリデータとして扱うぐらいの気持ちでいる必要が。
854デフォルトの名無しさん:2009/10/01(木) 19:11:16
http://codepad.org/cBQ6OsB3

このプログラムですが、printfで出力される値と
fprintfにより算出される値が異なってしまいます。
特にfprintfにより出力される値は異常値になってしまいます。

どうか、ご教授のほどよろしくお願いします。
855デフォルトの名無しさん:2009/10/01(木) 19:18:25
doubleにカッコがなくてエラーででるじゃん
856デフォルトの名無しさん:2009/10/01(木) 19:27:14
それとdoubleなら%lfね。%fじゃないよ
857デフォルトの名無しさん:2009/10/01(木) 19:39:20
>>853
うん。それで?
858デフォルトの名無しさん:2009/10/01(木) 19:43:15
以下857がネタを提供してくれます。
859デフォルトの名無しさん:2009/10/01(木) 20:30:03
>>850
C++0xのu32stringはstd::basic_string<char32_t>
860デフォルトの名無しさん:2009/10/01(木) 20:32:58
UTF32を扱う(操作する)だけなら、32bitの配列に入れれば良いだけ。
コンバートしたりするなら、言語処理のプログラムが居る。
861デフォルトの名無しさん:2009/10/01(木) 20:50:45
>>856のためにはっておいた方が良い気がした
http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html
862デフォルトの名無しさん:2009/10/01(木) 21:30:05
イテレーターで一つ前の要素を使うにはどうしたらいいですか?
x_new = x_old + dt*v_old
みたいに
863デフォルトの名無しさん:2009/10/01(木) 21:32:51
ひとつ前の要素を覚えておけばいいじゃん
864デフォルトの名無しさん:2009/10/01(木) 21:45:31
>>860
で、その方法は?
865デフォルトの名無しさん:2009/10/01(木) 21:48:15
u32string str = "abc";

これ動かないよね。

もちろん、
char *str = "ファイルから読み込んだテキスト"
u32string text = str;
866デフォルトの名無しさん:2009/10/01(木) 21:49:36
>>863
どうやって?
867デフォルトの名無しさん:2009/10/01(木) 22:10:41
>>865
u32string str = U"abc";

下はファイルから読み込むときにchar32_tで読んどけばいい
868デフォルトの名無しさん:2009/10/01(木) 22:18:16
残念ながら、外部APIの仕様でcharに入っているんだ。

だからcharからu32stringに変換しないといけないんだよね。
869デフォルトの名無しさん:2009/10/01(木) 23:02:05
それは標準の範囲では難しいな…
870デフォルトの名無しさん:2009/10/01(木) 23:20:18
いったん、charでファイルに書き出して
char32_tで読み込むとかw
871デフォルトの名無しさん:2009/10/01(木) 23:23:17
for (xo = x; x != e; xo = x++)
*x = a * *xo + *v++;
872デフォルトの名無しさん:2009/10/01(木) 23:24:46
>>871
コンパイルエラーw
873デフォルトの名無しさん:2009/10/01(木) 23:36:34
どこが?
874デフォルトの名無しさん:2009/10/01(木) 23:39:53
型が書いていない。
875デフォルトの名無しさん:2009/10/01(木) 23:41:55
>>873
なにが?
876デフォルトの名無しさん:2009/10/02(金) 00:24:05
いきなりfor文書いたら、そりゃコンパイルエラーだろうよ。
877デフォルトの名無しさん:2009/10/02(金) 01:01:47
ぶっちゃけ何のコードかもさっぱりだw
878デフォルトの名無しさん:2009/10/02(金) 01:26:58
宣言なしで新しい名前を使ってるからC++ではないな
879デフォルトの名無しさん:2009/10/02(金) 02:17:52
実はプリプロセッサ
880デフォルトの名無しさん:2009/10/02(金) 04:33:25
>>851
> 変換時に、バグってる文書でも、なるべく多くの情報が残る。
それは、エラーになるべきじゃないの?
881デフォルトの名無しさん:2009/10/02(金) 05:05:01
そんなの場合によるだろうに。
少しのエラーなら無視して読み続けられる方が都合のよい場合もある
882デフォルトの名無しさん:2009/10/02(金) 06:01:10
少々バグってる文章ですぐエラーになる仕様のブラウザがあったとしたら、
そんなの使ってられないだろうな。
883デフォルトの名無しさん:2009/10/02(金) 07:46:00
RSSリーダでマルチバイト文字が途中でちぎれてる文書に出会ったときに全部読めなくなるのとかは結構存在する。
884デフォルトの名無しさん:2009/10/02(金) 15:43:37
class で[] を演算子に使ったときに、代入は出来ないんですか?
885デフォルトの名無しさん:2009/10/02(金) 15:46:08
[ n ] = x という演算子が出来ればいいのですが。
886デフォルトの名無しさん:2009/10/02(金) 15:51:45
方法1: [] 演算子で、参照を返す
方法2: [] 演算子で、代入演算子をオーバーロードしているクラスを返す
887デフォルトの名無しさん:2009/10/02(金) 16:14:13
>>886
A[n] の参照には直接代入できない場合にやりたいのですが、方法2だとできますか。
あと、値読み取りも出来るようにしたいんです。

888デフォルトの名無しさん:2009/10/02(金) 16:15:44
bitsetの様に、A[n]の読み取り書き込みがしたいです。
889デフォルトの名無しさん:2009/10/02(金) 16:23:04
bitset の実装を読めばいいと思います
bitset の operator[] は bitset::reference というクラスを返す
こいつは operator=(bool) や operator bool を実装しているので、bool を代入したり bool に変換したりできる
890デフォルトの名無しさん:2009/10/02(金) 16:27:00
サンクス
でも面倒そう、間違えそうなので、add(n)というメンバ関数で済まそうと思いました。
891デフォルトの名無しさん:2009/10/02(金) 17:03:20
プライベートメンバへのポインタを戻り値として戻すメンバ関数の作成を禁止する文法とかってありませんか・・・
892デフォルトの名無しさん:2009/10/02(金) 17:45:08
>>884
こんな感じかな

template <class T>
class proxy
{
public:
proxy(T *p) : p_(p) {}
void operator = (const T &t)
{
*p_ = t;
}
operator T ()
{
return *p_;
}
private:
T* p_;
};

class hoge
{
public:
proxy<int> operator [] (unsigned i)
{
return proxy<int>(&a_[i]);
}
private:
int a_[10];
};
893デフォルトの名無しさん:2009/10/02(金) 17:55:43
>>862
その反復子が双方向反復子として使えるならboostのpriorで取得できるよ
894デフォルトの名無しさん:2009/10/02(金) 18:12:05
>>892
サンクス
895デフォルトの名無しさん:2009/10/02(金) 21:52:16
C++初めて三日です。分からないとこがあるのですが

#include<stdio.h>

//グロバース変数
int globalx;

void Func(){ ←この部分のFunc01()に何の意味があるのですか?
glpbalx=10;
}

int main(coid){
Func();  ←それとこの部分のFunc01()にもなんの意味があるのですか
printf("%d",globalx);
}

すみません初心者で
896デフォルトの名無しさん:2009/10/02(金) 22:25:29
>>895
> //グロバース変数

グローバル変数かな?

> int globalx;
> void Func(){ ←この部分のFunc01()に何の意味があるのですか?

Func01 なんて無いんだけど…
Func 無しでも初期化はできる。

> glpbalx=10;

globalx=10; かな?

> int main(coid){

coid→void かしらん?

> Func();  ←それとこの部分のFunc01()にもなんの意味があるのですか

Func01 なんて無いんだけど。わからないなら抜いて見ればよろし。
これを入れないと globalx は初期化されない。

C++ なのに C コードだけなのは何故なんだろう。
897デフォルトの名無しさん:2009/10/02(金) 22:31:02
>>895
致命傷過ぎる
何なんだバカにしてんのか?あ?
898デフォルトの名無しさん:2009/10/02(金) 22:34:10
>>897
俺は3日目ぐらいには寝てたけどな
899デフォルトの名無しさん:2009/10/02(金) 22:41:04
C++はCの一部を含んでるから、Cコードだけってのはナンセンス。
900デフォルトの名無しさん:2009/10/02(金) 22:47:47
>>899
別にいいんだけど、C++ なら敢えて cout 使わずに
printf 使うのはなぜかな、とは思うな。
901デフォルトの名無しさん:2009/10/02(金) 22:51:57
>>899
一生言ってな。
902デフォルトの名無しさん:2009/10/02(金) 22:57:17
来世でも言い続けますが何か?
903デフォルトの名無しさん:2009/10/02(金) 23:26:28
>>896
ありがとうございました
これからも分からなくなったら来ても良いですか?
904デフォルトの名無しさん:2009/10/02(金) 23:31:10
だめだ
少しは自分で調べろ
調べてわからなかったら来ても良い
ただし何をどう調べてどうわからなかったか書くこと
905デフォルトの名無しさん:2009/10/02(金) 23:33:30
ノートに書き写した授業の課題だな。
906デフォルトの名無しさん:2009/10/02(金) 23:33:40
>>901
何言ってんの? 規格って知ってる?
907901:2009/10/02(金) 23:42:13
>>906
知ってますよもちろん。
908デフォルトの名無しさん:2009/10/02(金) 23:46:33
ならいいんだ。
909デフォルトの名無しさん:2009/10/02(金) 23:52:23
>>895 はさすがにネタだろ。
910デフォルトの名無しさん:2009/10/03(土) 00:51:55
ていうか、>>895のC++の要素ってFunc(){}で引数省略してるくらいなんじゃ。
911デフォルトの名無しさん:2009/10/03(土) 02:21:40
>>850-852
ICU なんてモノがあったんですね。初めて知りました
これまで nkf や iconv だけだったので、ありがたいです
912デフォルトの名無しさん:2009/10/03(土) 02:28:30
>>910
Cでもvalidですが
913デフォルトの名無しさん:2009/10/03(土) 04:17:43
知ってるよ
914デフォルトの名無しさん:2009/10/03(土) 13:02:47
>>913
嘘つくなよ
915デフォルトの名無しさん:2009/10/03(土) 13:10:58
嘘じゃないよ!
916デフォルトの名無しさん:2009/10/03(土) 16:31:30
次のエラーが出てしまって困っています。どうしたらいいでしょう?
Visual C++ 2003では使えたらしいですが、Visual C++ 2008でやるとこの
エラーが出てしまいます。よろしくお願いします。

error C2327: 'Multivac::CInitialCurve<T>::Curve' : 型名、スタティック、または列挙子ではありません。
コンパイルされたクラスの テンプレート のインスタンス化 'Multivac::CSetOfPoints<T>' の参照を確認してください
917916:2009/10/03(土) 16:39:28
エラー箇所を示します。
template <class T>
class CSetOfPoints: public CInitialCurve<T>
{
protected:
Curve<T> Front;  ←ここでエラー

918916:2009/10/03(土) 16:42:28
関連してそうなところも示します。
template <class T>
class CInitialCurve
{

/**************
* ATTRIBUTES *
**************/

protected:

Curve<T> Curve;


template <class T>
Curve<T>::Curve() throw()
{

n_=0;
orientation_ = -1;

}



919デフォルトの名無しさん:2009/10/03(土) 16:48:32
>>916 ライブラリのインストールやった?
920916:2009/10/03(土) 17:00:26
>>919
ヘッダファイルなどがあったのでそのフォルダにはパスを通しましたが
ライブラリファイルらしきものは無いので他はやっておりません。
921916:2009/10/03(土) 17:08:49
関連ありそうなところとして次もあげます。

template <class T>
class Curve
{

/************************
* TYPEDEF DECLARATIONS *
************************/

public:
typedef T value_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
922デフォルトの名無しさん:2009/10/03(土) 17:20:05
本当にエラーが出た場所はそこなのか気になる。
VC++ .NET 2003→2008でそのエラーなら、まず疑うのはtypenameを付けていないことなんだけど、
さすがにそこはtypename要らない場所だから。
923916:2009/10/03(土) 17:35:09
>>922
他にも似たようなエラーが916のエラーの後にもあるので示します。

error C2327: 'Multivac::CInitialCurve<T>::Curve' : 型名、スタティック、または列挙子ではありません。
error C2327: 'Multivac::CInitialCurve<T>::Curve' : 型名、スタティック、または列挙子ではありません。

template <class T>
class CSetOfPoints: public CInitialCurve<T>
{

protected:
Curve<T> Front;  ←>>916のエラー
//! Is the bottom left corner outside the front?
bool origin_out;
public:

CSetOfPoints();
CSetOfPoints(Curve<T>& InitialFront);  ←ここでのエラー
CSetOfPoints(string InitialFrontFile, int orientation, bool origin_out_);

~CSetOfPoints() throw();




924916:2009/10/03(土) 17:37:40
もう一箇所あるので示します。
それぞれのエラーがどう関係しているのかよく分かりませんが・・・

(1) error C2061: 構文エラー : 識別子 'Curve'
(2) error C2995: 'Multivac::CSetOfPoints<T>::CSetOfPoints(void)' : 関数テンプレートは既に定義されています

template <class T>
CSetOfPoints<T>::CSetOfPoints(Curve<T>& InitialFront) ←(1)のエラー
{

Front.Copy(InitialFront);
origin_out = true;

}←(2)のエラー

925デフォルトの名無しさん:2009/10/03(土) 17:47:30
それは2003でコンパイル出来たソースに全く手加えてないのが通らないの?
それとも新規に書いたとか、手加えたものが通らないの?
テンプレート使いまくったコードは断片的にコンパイルエラーとかソース見せられてもわからんよ。
使用側がミスってるだけでも、ライブラリ内でエラーでまくるしな。
あと、テンプレートクラスのエラーはエラー一覧じゃなくて、
出力の方でエラーの詳細でコンパイラがどうインスタンス化しようとしてんのか見ないと。
926916:2009/10/03(土) 17:57:24
>>925
全く手を加えていない状態です。
すみません。テンプレートなるものを初めて知ったもので・・・。
インスタンス化の詳細とかってvisual studio 2008で、
どうすれば見れるのでしょう?
927デフォルトの名無しさん:2009/10/03(土) 18:50:10
エラー一覧とか並んでるタブの中に出力ってのがあると思う。
エラー一覧ではライブラリ内でエラーってでるけど、出力の方見ると

理由: 'int' から 'const DisplayMode' へは変換できません。
コンストラクタはソース型を持てません、またはコンストラクタのオーバーロードの解決があいまいです。
d:\include\boost-1.3.9\boost\bind\bind_template.hpp(61) : コンパイルされたクラスの テンプレート のインスタンス化 'R boost::_bi::li(略)' の参照を確認してください
with
[
R=bool,         ←テンプレートの実引数
A1=boost::arg<1>,
A2=boost::_bi::value<int>,
T=bool,
.....
みたいな感じでずーっと並んでると思う。
これを辿っていくとそのエラーの最後の方に自分の書いたソース名が見つかるはず。
d:\myproject\mysource.hpp(120) : コンパイルされたクラスの テ(略  ←ここが本当の原因

これがテンプレートライブラリ使ったときのコンパイルエラーの読み方なんだけど、
全く手加えてないんなら単にライブラリに問題があるのかもね。
928916:2009/10/03(土) 19:10:30
>>927
ありがとうございます。
どうにか解決できました。

エラーの'Multivac::CInitialCurve<T>::Curve' の
CurveというクラスがCInitialCurve<T>クラスにもメンバとしてあるのですが、
Multivac空間内に直に定義されてもいて、
Curve<T> Curve; を
Multivac::Curve<T> Curve;
としてやることでエラーが無くなりました。
他のエラーも 同じことをしてなくなり、
実行結果も正しく得られるようになりました。

明らかにクラスのオブジェクトを宣言している文なのだから、
名前空間いらないんじゃないかと思うのですが・・・。
929デフォルトの名無しさん:2009/10/03(土) 20:59:05
>>928
これが通らないのと同じことかな。
struct a {};
struct b { a a; };
930デフォルトの名無しさん:2009/10/04(日) 14:24:58
コピーコンストラクタについてなんですけど

not const(not const) 可
const(const) 可
not const(const) 不可
const(not const) 可

といったように(参照のコピーコンストラクトのように)const性で処理を分岐させることは可能でしょうか?
931デフォルトの名無しさん:2009/10/04(日) 14:36:00
>>930
よく分からない。もう少し具体的に。

コピーコンストラクタというのは↓のようなもので、引数はconst参照以外ない。
hoge(const hoge&);
932デフォルトの名無しさん:2009/10/04(日) 14:39:17
Effective C++ 3版をよんだんですけど、
これ以上の知識が無くても大丈夫ですか?
modern C++ design とかも読まないと駄目ですか?
933デフォルトの名無しさん:2009/10/04(日) 14:44:38
身についてなきゃ何読んだって意味なし
個人的にはExceptionalC++をおすすめだが専用スレに行け

推薦図書/必読書のためのスレッド 52
http://pc12.2ch.net/test/read.cgi/tech/1254565176/
934デフォルトの名無しさん:2009/10/04(日) 14:55:30
>>931
コードで書くと↓みたいな感じで。ようは参照っぽく振舞うProxyを作りたいんですが・・・

class Hoge {・・・};

Hoge h;
const Hoge ch;

Hoge h1(h); // ok
Hoge h2(ch); // error
const Hoge ch1(h); // ok
const Hoge ch2(ch); // ok
935デフォルトの名無しさん:2009/10/04(日) 15:17:15
>>934
class Hoge {
private:
  Hoge(const Hoge& hoge);
public:
  Hoge(Hoge& hoge);
  Hoge(Hoge& hoge) const;
  Hoge(const Hoge& hoge) const;
};

これじゃだめ?
コンパイル通るか試してないけど。
936935:2009/10/04(日) 15:19:31
ごめん、>>931の理由でだめだった。
937デフォルトの名無しさん:2009/10/04(日) 16:01:11
>>934
コンストラクタにconst属性付けるのはNG
多分本当にやりたいことはこんな感じじゃない?
class HogeImpl; // 内部実装
class ImmutableHoge // 変更不可能なHoge
{
public:
  ImmutableHoge(const ImmutableHoge& rhs);// ok const(const)に該当 (copy constructor)
  ImmutableHoge(const Hoge& rhs);// OK const(not const)に該当
  HogeImpl* pimpl;
};

class Hoge // 変更可能なHoge
{
  Hoge(const Hoge& rhs); //OK not const(not const)に該当 (copy constructor)
private:
  Hoge(const ImmutableHoge& rhs); // NG not const(const)に該当
  HogeImpl* pimpl;
};
Immutableは当然中のデータが変更されない/できないように実装する。
デザパタ的にはImmutableパターンとかいうやつ?(GoF本しか持ってないからよく知らないけど)
constは「その変数を通しては中身を書き換えない」という意味で、インスタンスの不変性は保証できないよ。
それにクラス内部で自分がconstかどうか判別する方法もないと思う。
938デフォルトの名無しさん:2009/10/04(日) 17:03:29
それを使って何がしたいのかが説明されてないからあってるかわからんが、
引数が非constの時とconstの時で使われるコンストラクタを分けたいなら
右辺値参照(rvalue reference)とかmove semanticsとか
Boost.Moveでググると良いんじゃないかと思った。
939939:2009/10/04(日) 17:06:41
ああ、ちょっと上に書いてあったか
まったく的外れだった
940デフォルトの名無しさん:2009/10/04(日) 21:56:54
>>932
Effective C++ を読んで、その内容に納得できるなら良いと思うけど。
例えば、他人に説明できるレベルとか。

いずれにせよ、そんなことよりコード書かなきゃいつまでたっても
書けるようにはならん。知識だけではコードは書けない。
本の内容もコード書いていなければ実感できない。
941デフォルトの名無しさん:2009/10/05(月) 03:37:00
あるクラスの全メンバを、一気にゼロで初期化するにはどうすればいいですか?
Cのmemset(ptr, 0, size)のC++版が知りたいです。
memsetはvtblまで0にしてしまうから駄目という所までは調べて分かりました。
942デフォルトの名無しさん:2009/10/05(月) 03:57:56
自分で作ったクラスで無いなら、カプセル化に反するから普通の方法じゃ無理
自分で作ったクラスでそういうことがしたいなら、
普通はコンストラクタで明示的に書く
それが面倒なくらいメンバが多いようなら多分設計を見直した方が良い

まあ、恐らく組み込み型の初期化についての話だと思うから、
boost::value_intializedについてググると良いんじゃない?
943デフォルトの名無しさん:2009/10/05(月) 11:16:41
944デフォルトの名無しさん:2009/10/05(月) 13:34:26
>>941
初心者歓迎のスレの人だよね?

普通のクラスの初期化の場合、ゼロで初期化する必要は全くない。テンプレートで
汎用的に作るのなら尚更。だから、この件はデフォルトコンストラクタが走った
オブジェクトを代入で十分だよ。
945デフォルトの名無しさん:2009/10/05(月) 20:56:34
>>941
そのクラスがPODならmemsetしてもいい
PODについてはめんどくさいからぐぐれ
946デフォルトの名無しさん:2009/10/05(月) 21:32:46
>>945
そういうのもなんか気持ち悪いよね。
明示的にPODを示す構文があるべきだったかも。

pod_structとか
947デフォルトの名無しさん:2009/10/05(月) 21:36:42
>>946
基本的に素人お断りな言語なので不要だと思います
いやならJavaとか使えばいいわけだしね
948デフォルトの名無しさん:2009/10/05(月) 21:42:32
そのうちこれが出来るようになるから
static_assert(std::is_pod<Hoge>::value, "not POD");
949デフォルトの名無しさん:2009/10/05(月) 21:47:24
memset使いたいがためにTMPかよ
950デフォルトの名無しさん:2009/10/05(月) 22:29:52
無駄にゼロ初期化に拘ってるだけでしょ。
951デフォルトの名無しさん:2009/10/05(月) 22:31:34
TMPは絶対的正義だから仕方ない。
952デフォルトの名無しさん:2009/10/05(月) 22:59:06
コピーできないポインタみたいなのを作りたいんですけど
どんな方針でやるのがいいんでしょう?
953デフォルトの名無しさん:2009/10/06(火) 00:00:54
boost::scoped_ptrじゃダメなの? >952
954デフォルトの名無しさん:2009/10/06(火) 00:07:47
boostが使えない環境もあると思うのですぐにboostに頼るのは避けたいです
955デフォルトの名無しさん:2009/10/06(火) 00:22:09
>>954
ほんなら適当なクラスに->オペレータとプライベートなコピーコンストラクタでも定義したら?
956デフォルトの名無しさん:2009/10/06(火) 00:44:45
boostが使えないってのは組み込み系の話ですか?
957デフォルトの名無しさん:2009/10/06(火) 00:47:10
Boostが使えないとか、元STL系ライブラリも駄目とか言いそうだ。
958デフォルトの名無しさん:2009/10/06(火) 00:59:49
テンプレートの<>記号が出てくるとみんなが怯えるんです
959デフォルトの名無しさん:2009/10/06(火) 03:10:05
テンプレートのないC++を使うくらいならC#を使いたいぜ
960デフォルトの名無しさん:2009/10/06(火) 03:31:13
961デフォルトの名無しさん:2009/10/06(火) 03:45:49
■Books(Templateまわり)■
Effective STL
 http://amazon.com/dp/0201749629/
 http://amazon.co.jp/dp/4894714108/ (翻訳)
Modern C++ Design
 http://amazon.com/dp/0201704315/
 http://amazon.co.jp/dp/4894714353/ (翻訳)
C++ Templates
 http://amazon.com/dp/0201734842/
C++ Template Metaprogramming
 http://amazon.com/dp/0321227255/

よく分からないけど短くしておきました
962デフォルトの名無しさん:2009/10/06(火) 04:07:07
>>961
新スレの 1 がテンプレさぼったみたいなんで補完しようとしてて、
>960 はそのときの誤爆。

せっかく短くしてもらったけど Books はもう貼り終わってた。
次スレの終わりあたりでまた書き込みしてもらえると助かる。

いま >>4 のリンク先確認が済んで書き込みしようとしたら、連投規制で
詰まってる。
963デフォルトの名無しさん:2009/10/06(火) 04:07:13
static_assertしなくてもenable_ifとis_podでいいんじゃね
964デフォルトの名無しさん:2009/10/06(火) 04:10:21
codepad
http://codepad.org/

長いソースを貼るときはここへ
965デフォルトの名無しさん:2009/10/06(火) 04:33:16
>>962
はあく
966デフォルトの名無しさん:2009/10/06(火) 05:11:52
964 はまた誤爆。ほんとごめん。

で、新スレのテンプレ貼り終わったんで、リンクしとく。

C++相談室 part73
http://pc12.2ch.net/test/read.cgi/tech/1254746834/

まだちょっと早かったような気もするんだけどね。
967デフォルトの名無しさん:2009/10/06(火) 07:12:21
角さんの STL のページ確かに死んでるね。
何で?
一応
Internet Archive Wayback Machine
ttp://web.archive.org/web/*/http://www.wakhok.ac.jp/~sumi/stl/
で記録は残っているみたいだけど。
968デフォルトの名無しさん:2009/10/06(火) 07:35:18
>>967
そのページ、使いやすかったんで残念。
つーかSTLでググると、リファレンスへは飛ばずに
糞みたいな日記ばかりヒットするのは止めて欲しい。
969デフォルトの名無しさん:2009/10/06(火) 07:48:06
970デフォルトの名無しさん:2009/10/06(火) 07:48:31
残存と追加で同等以上のページをつくれ
971デフォルトの名無しさん:2009/10/06(火) 08:12:49
web.archive.orgからサルベージしてローカルに保存したよ
角さんのページじゃないと駄目なんだ俺
972デフォルトの名無しさん:2009/10/06(火) 12:27:36
c++ではマクロを使う場合inlineを使うみたいなんですが、
#define TEST( x ) "%d",x
これをinlineにできますか?
973デフォルトの名無しさん:2009/10/06(火) 12:30:08
あ?
974デフォルトの名無しさん:2009/10/06(火) 12:33:19
>>972
マクロは使える。
マクロはinlineに置き換えた方が良いだけ。エラーの特定などのため。
必須ではない。
975デフォルトの名無しさん:2009/10/06(火) 12:35:34
保守性無視しても効率高めたいなら、マクロの方が良い。
確実にコード内に埋め込めて、関数呼び出しのコストがない。
なるべく使わないが良いけど、用途次第。 forは展開出来ないとか。
976デフォルトの名無しさん:2009/10/06(火) 12:45:12
>>975
キャッシュって知ってるか?
必ず効率が高まるわけじゃないよ。

関数にしてコンパイラにまかせるのが正解。
どうしてもヘッダに定義をおきたいときに inline を使う。

必要性と計測に基づかない最適化は悪。
977デフォルトの名無しさん:2009/10/06(火) 12:47:03
> 必要性と計測に基づかない最適化は悪。
これは、ちょっと、言いすぎだな。

× 〜悪。
○ 〜保守性を損ねる理由としては不十分。
978デフォルトの名無しさん:2009/10/06(火) 12:47:26
>>972
できないのでそのままにしておくか、それを捨てるか。
979デフォルトの名無しさん:2009/10/06(火) 12:55:20
>>972
そのマクロどうやって使うの?
printf(TEST(x)) とかやるの?
それなら普通の関数 print_int(x) でいい、っていうかこっちのがいいよね。
inline にする必要も無い。
980デフォルトの名無しさん:2009/10/06(火) 12:58:33
ばか
981デフォルトの名無しさん:2009/10/06(火) 13:45:13
すみません。質問良いですか。
char *p = new char [1000];
このようにメモリを確保して、たとえば、char *q = &p[500]; delete q;
とすると、メモリは解放されますか?
982デフォルトの名無しさん:2009/10/06(火) 13:49:44
いいえ
それは未定義の動作です
983デフォルトの名無しさん:2009/10/06(火) 13:50:03
クラスのメンバ変数 char *qで、他所で確保されたメモリのアドレスを保持する場合と
自前で確保した場合があり、後者のみデストラクタでメモリを解放したいのですが。
他所のだけ解放し無いように出来るんですか?
984デフォルトの名無しさん:2009/10/06(火) 13:52:09
配列を解放するにはdelete [] を使えって意味じゃないの?
985デフォルトの名無しさん:2009/10/06(火) 13:54:19
そのクラスにもうひとつ bool qIsFromOuter; のようなメンバ変数を増やして、
q が他所で確保されたか自前で確保したか覚えておけば、出来ます
986デフォルトの名無しさん:2009/10/06(火) 13:55:18
トンクス
987デフォルトの名無しさん:2009/10/06(火) 14:45:31
Java謎落とし穴という書籍の中でC++に関するマニアックな記述があり、どうしても理解できない部分があるので教えてください。

「class Point{ int x; int y;} というクラスがある時、
ローカル変数 Point p; を宣言すると、Javaではpは参照になるがC++ではPointオブジェクトの実体が格納される変数になります。」
と、ここまでは分かるのですが、次の文が分かりません。
「よってC++では、ただPoint p;のようにして変数を宣言しただけでもコンパイラはそこにコンストラクタを呼び出すための機械語コードを生成します。」

Point p;と宣言した時点ではPointを格納できるだけの領域を用意すればいいだけであって、コンストラクタを呼び出すのは実際にnewする時なんだから
変数宣言時にコンストラクタの呼び出しコードなんて知らなくてもいいように思うのですが、間違ってますでしょうか?
988デフォルトの名無しさん:2009/10/06(火) 14:55:44
>>987
Point p;
に対して何をどうnewするつもりなんだ
989デフォルトの名無しさん:2009/10/06(火) 15:12:06
>>987
これはテンプレに入るレベルのJava脳www
990デフォルトの名無しさん:2009/10/06(火) 15:13:04
ローカルで Point p; とすればそれは宣言ではなくpの定義で実行時はそこでインスタンスを生成するだろ。
最適化がからめば実際のインスタンスの生成はpを参照する直前になるかも知れんがそれは別の話。
991デフォルトの名無しさん:2009/10/06(火) 15:18:15
彼はたぶんC#と間違えているんだろう
992987:2009/10/06(火) 15:33:16
回答ありがとうございます。
Point p;が定義であっても、Pointを格納できるだけの領域(ここではxとy)を用意すればいいだけで、
Pointがどのように作れれるかといったことは知らなくてもいいと思うのですが。
関数の外でnewされて引数として渡されてローカル変数pに代入される、ということを考えた場合、
コンパイラにとっては関数内でコンストラクタの生成コードなんて知らなくてもいいはずです。
993デフォルトの名無しさん:2009/10/06(火) 15:35:40
文字コードの判別ってみなさんどうやってるんですか?
ICUで出来るらしいですが、VC++でコンパイル通りません。
nkfだと日本語しか出来ません。するとやるやつがないです。
994993:2009/10/06(火) 15:40:32
これだけで構文エラーになるんですが。
ライブラリのセットアップはしてあります。

#include <stdio.h>
#include <unicode/ucsdet.h>
int main() { return 0; }
995デフォルトの名無しさん:2009/10/06(火) 15:51:19
>>992
だから、アンタはC++に関しての知識が無さすぎる。

本当に知りたいのならC++の入門書を読むべきだし
Javaを学んでいる途中で気になっただけなら、
「自分はC++の知識不足で理解出来ない」として読み飛ばしておけばよい。
996デフォルトの名無しさん:2009/10/06(火) 16:06:39
>>992
領域を用意するだけじゃなくてインスタンスを作るの。
インスタンスを作るためにコンストラクタを呼ぶの。
そんだけ。


>>994
それでエラーって、コンパイル環境ができてないんじゃ。
つかエラーって何よ? <unicode/ucsdet.h>にインクルードパスは通ってる?
ICU知らないけど。
997デフォルトの名無しさん:2009/10/06(火) 16:52:46
コンストラクタを呼ぶことによってカプセル化されたクラスとしての整合性を
取ることができるようになるのであって、ただ領域を確保するだけだったら
C時代の構造体と変わらなくてクラスの意味がない。
998デフォルトの名無しさん:2009/10/06(火) 17:10:01
>>992
値型と参照型について調べれ。
二つの違いが分かれば、
>関数の外でnewされて引数として渡されてローカル変数pに代入される、ということを考えた場合、
が、いかにアホな事言ってるか理解できる。
ヒント:Javaの変数は全て参照型
999デフォルトの名無しさん:2009/10/06(火) 17:29:43
あんまりJava脳とか言い過ぎるとアンチC++を無駄に増やすだけだろ…

Javaとはnewの意味が違う。
C++はそういう定義をしたら、その時点でそのインスタンスは普通に存在
するし使える。領域確保だけじゃなくて初期化も全てされる。
>>992の思ってるような、領域だけ取って後からnewで生成、という分割
した初期化構文もあるけど、それはplacement newといって、若干高度な
話。
1000デフォルトの名無しさん:2009/10/06(火) 17:32:08
ああ逆か。>>992はあらかじめ外でnewされてると思ってるのか。んじゃ
placement newの話は無しで。
とにかく、JavaとC++はnewの意味が違う。newは普通は極力使わない。
new演算子をカスタマイズしてバリバリ使う場合もあるけど。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。