C++相談室 part72
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/09/01(火) 11:52:47ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part71
http://pc12.2ch.net/test/read.cgi/tech/1247853298/
0002デフォルトの名無しさん
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)に対応。
0003デフォルトの名無しさん
2009/09/01(火) 11:56:14Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0004デフォルトの名無しさん
2009/09/01(火) 11:58:54[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 STDCXX http://incubator.apache.org/stdcxx/
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
0005デフォルトの名無しさん
2009/09/01(火) 12:03:11>> は
>> 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
0006デフォルトの名無しさん
2009/09/01(火) 12:09:21http://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/
0007デフォルトの名無しさん
2009/09/01(火) 12:11:41http://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/
0008デフォルトの名無しさん
2009/09/01(火) 15:46:180009デフォルトの名無しさん
2009/09/01(火) 17:02:07上記のようなエラーが発生してしまいました。
どうか、ご指導・ご鞭撻のほどよろしくお願いします。
00109です
2009/09/01(火) 17:04:16貼りつけられるサイトをどなたかご存知でしょうか?
0011デフォルトの名無しさん
2009/09/01(火) 17:22:24codepad.org
00129
2009/09/01(火) 17:33:59ありがとうございます。
プログラムの内容は下記の通りです
http://codepad.org/mdRuRQ2g
0013デフォルトの名無しさん
2009/09/01(火) 17:57:02ttp://codepad.org/
長いソースを貼るときはここへ!
ってテンプレに入れようぜ。
0014デフォルトの名無しさん
2009/09/01(火) 17:58:59j+k>=8927 にしてみたらどうなる?
0015デフォルトの名無しさん
2009/09/01(火) 18:03:11Cでコンパイルするなよ。
0016デフォルトの名無しさん
2009/09/01(火) 18:20:210017デフォルトの名無しさん
2009/09/01(火) 18:22:420018デフォルトの名無しさん
2009/09/01(火) 18:42:23デストラクタでクローズしています。
0019デフォルトの名無しさん
2009/09/01(火) 18:51:27クローズに失敗したということは、書き込まれなかったデータがいくらかあるかもしれないということだ
書き込みが失敗したという事実をユーザに通知するべき
0020デフォルトの名無しさん
2009/09/01(火) 19:06:180021デフォルトの名無しさん
2009/09/01(火) 19:14:36自分専用なら別にいいかもしれないが (何かあっても自業自得なだけだし)
0022デフォルトの名無しさん
2009/09/01(火) 19:34:24環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
002320
2009/09/01(火) 19:57:260024デフォルトの名無しさん
2009/09/01(火) 20:13:39ファイルを閉じる処理とそれに失敗したときの処理を明示的に行う。
0025デフォルトの名無しさん
2009/09/01(火) 20:41:46virtual ~test() = 0 {}
};
この文法って相変わらずVC++専用?
0026デフォルトの名無しさん
2009/09/01(火) 21:06:350027デフォルトの名無しさん
2009/09/01(火) 21:18:480028デフォルトの名無しさん
2009/09/01(火) 23:49:14これって何?
仕事のない純粋仮想デストラクタ?
0029デフォルトの名無しさん
2009/09/01(火) 23:56:43char 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',' '
が読み込まれるのでしょうか?
0030デフォルトの名無しさん
2009/09/03(木) 06:05:49結果がただ一通りだけになるような順序関係のこと。
この場合、等値関係 "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" と呼ぶことから付けられた
記号的なもので、言葉どおりの意味を表すものではない。
003130
2009/09/03(木) 06:06:42わかりやすい記事が出てこなかったんで、むしゃくしゃして C++ プログラマ
向けの(数学用語をなるべく避けた)説明をがんばって1レスにまとめてみた。
間違ってるとか、もっと短くできるとか、もっと簡単にできるとか、添削して
もらえると助かる。
特に最後に挙げた "strict" の由来あたり、英語版 Wikipedia をうろうろして
ひねり出したものなのでいまいち自信が無い。
0032デフォルトの名無しさん
2009/09/03(木) 11:27:53いかにも数学っぽくてかなりの人が拒否反応を示しそう。
・比較したいものの対象全体を考えます。
・同じと見なすものでグループごとに分けます。
・グループ間で順序付けします。
・同じグループ内の要素間では false を返し、別グループの要素間では先ほどグループ間で決めた
順序付けに従って、true か false を返します(func(a,b) で a < b なら true, b > a なら false)。
これが strict weak ordering になります。
これで実用上問題ないんじゃない?
0033デフォルトの名無しさん
2009/09/03(木) 12:09:360034デフォルトの名無しさん
2009/09/03(木) 18:13:450035デフォルトの名無しさん
2009/09/03(木) 18:29:510036デフォルトの名無しさん
2009/09/03(木) 20:02:33std::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()コールを追加することは出来ますか?
0037デフォルトの名無しさん
2009/09/03(木) 20:05:130038デフォルトの名無しさん
2009/09/03(木) 20:25:41お答えありがとうございます。
それが正攻法だとは私も思ってますが、
std::streamの知識が無いので、出来ればやりたくない。
恒久的に残すつもりはないので、楽ならどんな方法でもかまわない。
何かありませんか?
また、stringstreamはコンストラクタでopenmodeを指定しますが、
もう既にあるインスタンスを再構築したい場合は、どうすればいいんでしょうか?
debug_stream = stringstream(std::ios::out);
これは駄目のようです。
0039デフォルトの名無しさん
2009/09/03(木) 20:32:30#define endl debugendl
とかやってもいいし
004030
2009/09/03(木) 20:52:19ありがとう。
うーん。あれでもだいぶ削ったつもりだったんだけど、確かに挙げてもらったのと
比べるとまだまだ数学っぽさが色濃いね。
で、今回調べたきっかけが、「厳密って何?」「弱ってことは強もあるの?」とか、
「結局 "<" と同じようにすればいいだけなのに、なんでそんな変な名前なの?」とか、
そういうところだったんで、なんとかそこらへんの疑問がひととおり片付くようなものを
書いたつもり。
これはつまり「背景まで知る」のを前提にしてたってことになるね。後出しでごめん。
0041デフォルトの名無しさん
2009/09/03(木) 21:34:11大分前に書いたコードから抜粋してきたけどこれでそれなりに動かない?
#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;
}
0042デフォルトの名無しさん
2009/09/03(木) 22:10:02それを使ったらうまくいきました。
今後もそれを使っていきます。
ありがとうございました。
0043デフォルトの名無しさん
2009/09/03(木) 23:43:04をお願いします
0044デフォルトの名無しさん
2009/09/03(木) 23:50:06read() は書式なしの読み込み処理として備えられているものなので、問題ない。
0046デフォルトの名無しさん
2009/09/04(金) 16:45:390047デフォルトの名無しさん
2009/09/04(金) 16:46:48何を言っているのか分からん。
分かるように書き直して
0048デフォルトの名無しさん
2009/09/04(金) 16:53:090049デフォルトの名無しさん
2009/09/04(金) 17:10:38あーなるほど、
if(is)とかでエラーになったことはわかるけど、
具体的に何バイトでエラーになったかはどうやって調べるのか、って意味か。
・・・ごめん分かんない。
有識者plz
0050デフォルトの名無しさん
2009/09/04(金) 18:56:010051デフォルトの名無しさん
2009/09/04(金) 20:07:28面倒なのでstd::vectorをpublic継承したい。
メンバ変数がなければ問題ないのかもしれないが、
メンバ変数を持ちたいとき、なにか妙案はない?
・std::vectorをメンバ変数として持つ
・private継承する
だと、メンバやtypedefを全部書かなきゃならん。
要はstd::vector&へのキャストを禁止したいんだが。
005251
2009/09/04(金) 20:28:08template <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();
}
こういうのを作っておいて継承するわ。
0053デフォルトの名無しさん
2009/09/04(金) 20:34:470054デフォルトの名無しさん
2009/09/04(金) 20:42:09gcountで解決しそうです。
0055デフォルトの名無しさん
2009/09/04(金) 20:46:24行の先頭位置を設定するマニプレータはありますか?
cout << tab(4) << "aaa" << endl << "bbb" << endl;
↓
____aaa
____bbb
例えばこうすると、常に4文字分スペースが入って出力されるようになるような。
0057デフォルトの名無しさん
2009/09/04(金) 21:20:59typedef してるところは using でいいんじゃね?
std::vector<... > とか書くのが嫌なのかもしれないけど、いっこ base_type を typedef すれば
よさそう。
0059デフォルトの名無しさん
2009/09/04(金) 23:35:070060デフォルトの名無しさん
2009/09/04(金) 23:56:09単にreturn 0;と書いているサンプルもあるので
0061デフォルトの名無しさん
2009/09/05(土) 00:01:44http://www27.atwiki.jp/freememo/pages/93.html
006261
2009/09/05(土) 00:02:40http://msdn.microsoft.com/ja-jp/library/hw264s73(VS.80).aspx
0063デフォルトの名無しさん
2009/09/05(土) 00:38:35わかりました。ありがとうございます
0064デフォルトの名無しさん
2009/09/05(土) 00:39:01既存のVC++でやるにはどうすればいいのですか?
0065デフォルトの名無しさん
2009/09/05(土) 00:46:41VC++でC++0xコンパイラを開発する
0066デフォルトの名無しさん
2009/09/05(土) 01:39:26PHPか何か埋め込んで計算させるのはどうだ
0067デフォルトの名無しさん
2009/09/05(土) 04:15:34http://codepad.org/2Xe82VfM
ソートしないのですが‥‥‥。
0068デフォルトの名無しさん
2009/09/05(土) 04:30:50釣り?
comparatorの仕様をちゃんと調べればすぐに判ることだが、
qsort()の比較関数とは違うぞ。
0070デフォルトの名無しさん
2009/09/05(土) 12:55:43こういうことはできない?
VC++だとassertっぽいので落ちるんだが。
イテレータの代わりにポインタで書かれたプログラムを書き直していて躓いた。
0071デフォルトの名無しさん
2009/09/05(土) 13:05:160072デフォルトの名無しさん
2009/09/05(土) 14:43:27これを普通のC++で書くとどうなるの?
0073デフォルトの名無しさん
2009/09/05(土) 14:51:21これは何したいコード?
意味論的に狂ってないか?
0074デフォルトの名無しさん
2009/09/05(土) 14:53:49C++0xですか?
0075デフォルトの名無しさん
2009/09/05(土) 15:00:54C++0xのコードを普通のC++に書き直したいの
0076デフォルトの名無しさん
2009/09/05(土) 15:05:57// hogel() = default;
0077デフォルトの名無しさん
2009/09/05(土) 15:09:47えええー
それ以外なんかないのですか?
0078デフォルトの名無しさん
2009/09/05(土) 15:13:03諦めて書きましょう。
0079デフォルトの名無しさん
2009/09/05(土) 15:15:31普通のC++で明示的に書けないからC++0xで追加されたんじゃないか。
0080デフォルトの名無しさん
2009/09/05(土) 15:37:48ポインタをイテレータで置き換えてるんで、
NULLポインタを表すものがほしかった。
0081デフォルトの名無しさん
2009/09/05(土) 15:41:36それは何か方針が間違っているよーな。。。
詳しくは次の方どーぞ
0082デフォルトの名無しさん
2009/09/05(土) 15:45:52コンテナの end() が、だいたいその役割。
0083デフォルトの名無しさん
2009/09/05(土) 15:54:16暗黙のデフォルトコンストラクターとかコピーコンストラクターとかコピー演算子とかが副作用バリバリで余計なお世話だと、昔は思っていた。
でも今は、メンバーにPOD型を止めてshared_ptrとか他のオブジェクトとか使うことでRAII前提にしたら、暗黙の系との親和性が良くなってすごく便利に感じるようになった。例外安全にもなるし一石二鳥ということで
0084デフォルトの名無しさん
2009/09/05(土) 17:39:05廃止されたらしいけど、こんなのあったなんて知らなかったよママン
0085デフォルトの名無しさん
2009/09/05(土) 17:44:33普通のC++でコンパイルとおらねーぞ
助けてください
0086デフォルトの名無しさん
2009/09/05(土) 17:52:27今度の規格改定で入る予定のキーワード。constがもっと強くなったようなもの。
普通のプログラムならまだ使っていないと思うんだけど。
0087デフォルトの名無しさん
2009/09/05(土) 18:38:11したいんですが、複雑で柔軟なマッピングがしたいです。
//型のマッピングをしてくれる構造体。Tを与えるとtypeにマッピングされた型が定義される
template<typename T>
struct type_map{
typedef なにか type;
};
という構造体があったとして、「なにか」の部分をうまいことして単純な1対1対応のマッピングだったり
「あるクラスの派生型ならこの型」というような継承関係を利用した多対1のマッピングだったり
マッピングの定義箇所がソース上で何箇所かに分かれていたり(例えば、返したい型の定義されているヘッダ)
こういうことをしたいんですが、何か方法はありますか?
C+
0088デフォルトの名無しさん
2009/09/05(土) 18:47:27>単純な1対1対応のマッピングだったり
テンプレートの特殊化でできるよ
>「あるクラスの派生型ならこの型」というような継承関係を利用した多対1のマッピングだったり
boostのis_系メタ関数使って特殊化
>マッピングの定義箇所がソース上で何箇所かに分かれていたり(例えば、返したい型の定義されているヘッダ)
たぶんムリ
0089デフォルトの名無しさん
2009/09/05(土) 19:26:58typedef boost::mpl::list<hoge,huga,piyo> katalist;
これにboost::mpl::foreachとかでいろいろ処理を記述できる。
boost::mpl::mapを使えばマッピングが簡単になるかもしれない。mpl::mapは使ったことないんで自信ない。
0090デフォルトの名無しさん
2009/09/05(土) 20:49:16HANDLE 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()も失敗する可能性があるので
その処理も追加すると、煩雑になってしまう。
なにかいい方法ありませんか?
0091デフォルトの名無しさん
2009/09/05(土) 20:53:530092デフォルトの名無しさん
2009/09/05(土) 20:59:11どうしてもメモリを先に確保したい?別にいいんじゃないの?
0093デフォルトの名無しさん
2009/09/05(土) 21:26:510094デフォルトの名無しさん
2009/09/05(土) 22:12:53HANDLEを管理するオブジェクトを作って包含させる。
すると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);
0095デフォルトの名無しさん
2009/09/05(土) 22:49:27なんか違ってたスマン
#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);
0096デフォルトの名無しさん
2009/09/05(土) 22:56:590097デフォルトの名無しさん
2009/09/05(土) 23:05:220098デフォルトの名無しさん
2009/09/06(日) 01:35:01ありがとうございました。
やはり、それなりにはできそうですね。でもあまり柔軟性は高くないようで・・・
この辺C++0xとかで改善されるといいですね〜
0099デフォルトの名無しさん
2009/09/06(日) 03:43:380100デフォルトの名無しさん
2009/09/06(日) 05:02:26コンセプト亡き今は可変長引数のサポートくらいしかないからなぁ
あとはboostよりずっと貧弱な標準ライブラリがあるくらいで
0101デフォルトの名無しさん
2009/09/06(日) 05:57:230102デフォルトの名無しさん
2009/09/06(日) 09:02:54C#でtypedefのないジェネリックスを使うと、mplでのtypedefのやばいほどの便利さをひしひしと感じる。何で無いの?
0103デフォルトの名無しさん
2009/09/06(日) 10:25:130104デフォルトの名無しさん
2009/09/06(日) 11:02:53いや、BoostがC++0xに準拠したらもうとんでもないライブラリが
できるだろう。期待しちゃうぞ。
0105デフォルトの名無しさん
2009/09/06(日) 11:20:400106デフォルトの名無しさん
2009/09/06(日) 11:26:172015年まで出ないぞ
0107デフォルトの名無しさん
2009/09/06(日) 12:08:290108デフォルトの名無しさん
2009/09/06(日) 12:11:15boostがその辺のコンパイラのサポート状況の違いを吸収してくれると嬉しいんだが。
0109デフォルトの名無しさん
2009/09/06(日) 12:56:2216進にしても、0fにはならんぞ
0110デフォルトの名無しさん
2009/09/06(日) 13:30:31constが感染するような感じの挙動で
0111デフォルトの名無しさん
2009/09/06(日) 16:15:32T *NewInstance()
{
void *p = AllocMemory( sizeof(T) );
return new(p) T;
}
これの配列版を作りたいんですが、どういう実装になるんでしょうか。
0112デフォルトの名無しさん
2009/09/06(日) 16:17:270113デフォルトの名無しさん
2009/09/06(日) 16:18:18十分なサイズの領域を確保して、ループをまわす。
ちなみに、その実装だと T のコンストラクタで例外が発生したときに p が漏れるよ。
0114デフォルトの名無しさん
2009/09/06(日) 20:44:58>auto decltype rvalue lambda
このあたりは既に吸収しはじめてると思う。
少なくとも BOOST_NO_XXXX マクロは全て存在する。
>111
std::uninitialized_fill() とか使えばいいんじゃね?
0115デフォルトの名無しさん
2009/09/06(日) 21:43:21rvalue reference: Boost.Move
lambda: Boost.Lambda
ってとこか。Moveはまだacceptされてないけど。
0116デフォルトの名無しさん
2009/09/07(月) 03:07:41生成時以外だと無理なのね。
既に使用済みのvectorを0クリアしようとこれ使っていたら、消えてない。
初期化はどうやったら良いんですか?
0117116
2009/09/07(月) 03:08:070118デフォルトの名無しさん
2009/09/07(月) 05:33:13vector<type>().swap(v);
0119デフォルトの名無しさん
2009/09/07(月) 05:34:31Effective STL読んだ方がいい
0120デフォルトの名無しさん
2009/09/07(月) 05:36:39v.resize(N, 0);
0121デフォルトの名無しさん
2009/09/07(月) 05:58:08>>119 読んでないけど既にある領域を壊さないを壊さない仕組みなんだろうけど。
0122デフォルトの名無しさん
2009/09/07(月) 06:26:54Effective STLではそう書いてあるけど
v.swap( vector< type >() );
じゃなんでいけないんだろう。
こっちのほうがわかりやすいと思うんだけど^^;
0123デフォルトの名無しさん
2009/09/07(月) 06:37:40vector::swap()の引数は非constなわけで(スワップするんだから当然)、
そこに一時オブジェクトを渡しちゃダメでしょ。
0124デフォルトの名無しさん
2009/09/07(月) 06:40:02一時オブジェクトとconst云々は元のやり方にも言えることか。
0125デフォルトの名無しさん
2009/09/07(月) 09:36:29一時オブジェクトは非const参照引数には渡せない。
一時オブジェクトのメンバ関数を呼ぶのは問題ない。
0126デフォルトの名無しさん
2009/09/07(月) 11:29:580127デフォルトの名無しさん
2009/09/07(月) 11:54:23または v = vector( n, 0 );
ここでswapを出してくる感覚が理解できん
0128デフォルトの名無しさん
2009/09/07(月) 11:59:23「capacityを0にしたいらしい」という意図を汲み取れ
0129デフォルトの名無しさん
2009/09/07(月) 12:19:01最初に resize(N, 0) って書いてあるんだから、ただの誤読じゃねーか。
0130デフォルトの名無しさん
2009/09/07(月) 12:21:450131デフォルトの名無しさん
2009/09/07(月) 12:24:460132デフォルトの名無しさん
2009/09/07(月) 12:31:42だろ?
0133デフォルトの名無しさん
2009/09/07(月) 12:37:05vectorのswapはO(1)が保障されているから
swapしたほうが速いかも。
vector< int >( n, 0 ).swap( v );
0134デフォルトの名無しさん
2009/09/07(月) 12:41:29assignのことすっかり忘れてた
>>128
俺はエスパーになれそうにないな
ところでswapの方が早いとかあり得るのか?
無駄なメモリ確保が入りそうなんだが
0135デフォルトの名無しさん
2009/09/07(月) 12:41:30resize(0) なら、そうとも取れるが、 N はどっから出てきたことになるんだ?
0136デフォルトの名無しさん
2009/09/07(月) 12:41:44いやいや、その一時オブジェクトの構築に結局O(N)かかるだろ。
0137デフォルトの名無しさん
2009/09/07(月) 12:47:23いや、そりゃそうだけど、
>または v = vector( n, 0 );
の右辺の構築も同じくO(N)かかるじゃろが。w
実際、今VCで実験したらswapの方が倍くらい速かった。^^
0138デフォルトの名無しさん
2009/09/07(月) 12:51:50v = vector< int >( n, 0 );
vector< int >( n, 0 ).swap( v );
ちなみに、マッサー本によると
vectorにおいて代入とassignは線形時間、swapは定数時間となってるから
結果どおりでいいんじゃないかと。
0139デフォルトの名無しさん
2009/09/07(月) 12:52:280140デフォルトの名無しさん
2009/09/07(月) 12:53:13いや、 v.assign(n, 0) でいいから。
0141デフォルトの名無しさん
2009/09/07(月) 12:54:200142デフォルトの名無しさん
2009/09/07(月) 12:58:410143デフォルトの名無しさん
2009/09/07(月) 13:02:30おぉ、v.assign( n, 0 ) でやったらswapより2%速くなった^^;;;
なお、マッサー本には assign は clear(); insert( begin(), n , u ); と同値と書かれていて(p.329)、
代入と同じではないね。
というわけで、やるならassignかな。代入はコスト的に間違いってことでF/A?
0144デフォルトの名無しさん
2009/09/07(月) 13:04:49fill はそもそも resize の要求にこたえてないので実験しません^^あしからず。
0145デフォルトの名無しさん
2009/09/07(月) 13:07:430146デフォルトの名無しさん
2009/09/07(月) 13:12:45だから、最初から capacity を変えたかった人なんていないんだってば。
0148デフォルトの名無しさん
2009/09/07(月) 17:43:34VC++のダイアログ形式でプログラムしているのですが
下記のプログラムで
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;
}
0149デフォルトの名無しさん
2009/09/07(月) 17:49:36MFCスレへどうぞ。
0150デフォルトの名無しさん
2009/09/07(月) 17:55:19MFC相談室ってスレですかね?
誘導どうもです.
0151デフォルトの名無しさん
2009/09/08(火) 03:23:54「関数は値を返すべき」という警告出ます。 つけないと出ないのですが。
これは、予定通りの動作しなかったりしますか?
0152デフォルトの名無しさん
2009/09/08(火) 03:25:380153151
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; }
0154デフォルトの名無しさん
2009/09/08(火) 03:34:03int F() { return 1; }
__inline int G() { return 1; }
0155デフォルトの名無しさん
2009/09/08(火) 03:36:33↓こっちいきな。
【初心者歓迎】C/C++室 Ver.67【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1247937958/
そのコードと合わせて、コンパイラと、そのバージョンと、エラーメッセージを
「なるべくすべて、正確に」貼れば、きっと解決に繋がるよ。
0156デフォルトの名無しさん
2009/09/08(火) 03:36:51153とほぼ同じ別の判定関数で、警告でない物もあるので。
0157デフォルトの名無しさん
2009/09/08(火) 03:37:340158デフォルトの名無しさん
2009/09/08(火) 07:17:16字下げを正しくすれば分かる。
0159デフォルトの名無しさん
2009/09/08(火) 08:27:01if ( p[0]==0xa4 )
if( p[1]==0xf3 || (p[1] >= 0xa1 && p[1] <= 0xf1 ) )
return 1;
return 0;
}
?
0160デフォルトの名無しさん
2009/09/08(火) 08:42:30中身を削って確認して欲しい
0161デフォルトの名無しさん
2009/09/08(火) 08:48:43値はちゃんと返してると思うけど?
0162デフォルトの名無しさん
2009/09/08(火) 08:51:54if ( A ) if( B ) return 1;
return 0; return 0; }
にすると警告でなくなるな。一つ目のreturn 0; はif文の影響うけてるって事?
理由わからん。
0163デフォルトの名無しさん
2009/09/08(火) 08:54:29return 0;
と
if ( A ) { if( B ) return 1; }
return 0;
は別物だったの? しらなかった。 下は警告でない。
0164デフォルトの名無しさん
2009/09/08(火) 09:33:10ifの構文規則なんかを覚えて頑張ってブロックを省略するより、&&と||の優先順位を
覚える方がまだしも役に立つぞ
0165デフォルトの名無しさん
2009/09/08(火) 09:39:300166デフォルトの名無しさん
2009/09/08(火) 11:20:540167デフォルトの名無しさん
2009/09/08(火) 15:02:27http://www.wakhok.ac.jp/~sumi/stl/
0168デフォルトの名無しさん
2009/09/08(火) 15:05:09警告うんぬんと語るヤツは警告メッセージを貼れ。
0169デフォルトの名無しさん
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倍近く遅くなってしまった。
なんでこうなるかわかりますか?
0170デフォルトの名無しさん
2009/09/08(火) 15:12:120171デフォルトの名無しさん
2009/09/08(火) 15:32:16基底クラスBを、とあるクラスAに包含した場合
基底クラスBを継承して作ったクラスCは、クラスAで使えるますか?
使えないのならば、どうすればクラスCはクラスAで使えるようになりますか?
0172デフォルトの名無しさん
2009/09/08(火) 15:54:160173デフォルトの名無しさん
2009/09/08(火) 16:34:04内部コピーが多発してるようなら、map<T>をmap< shared_ptr<T> >に変えるとか。
検索時間が重いなら、mapをunordered_mapに変えるとか。
0174デフォルトの名無しさん
2009/09/08(火) 17:15:34>>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は知りませんでした。調べてみます。
0175デフォルトの名無しさん
2009/09/08(火) 17:21:11クラスAにクラスBのポインタを持つようにすれば、使えるますよ。
0176デフォルトの名無しさん
2009/09/08(火) 18:24:11基本的に、mapはプログラム使う側の負担減らす目的が主と考え
vectorなどに入れておき、一致するか確認した方が速い。
ケースにはよるが。
0177デフォルトの名無しさん
2009/09/08(火) 23:28:53根本的に理屈/アルゴリズム見直した方が良さそうな気がする。
それで map なのかも知れないけど、map 持ち出す必要あるのかな。
0178505
2009/09/09(水) 01:41:09アルゴリズムはよく知られたもので、
それをそのまま使っているので改善は出来そうにありません。
なぜmapなのかですが、元の行列(今回のケースでは最大36x36)から、
一部の行列を抜き出して、連立方程式として解くという形であり
抜き出すパターンの組み合わせ数を考えるとmapになりました。
実際、解を再利用することで、求解処理時間は半分以下に
なっており、効果はありそうなだけに残念なところです。
また、何も手を加えない元の状況を更に調べてみたところ
std::count()でstd::vector< uint >の要素数を求めている箇所が2つあり
それが全体の処理時間の2割を占めていました。
処理時間の割合 「方程式求解 : ↑ : その他 = 4 : 2 : 4 (割)」
当初、求解にかかる時間が殆どで、それ以外はゴミみたいなものだと
考えていただけに、こんなものがこれほど時間を喰うとは以外です。
0179デフォルトの名無しさん
2009/09/09(水) 01:45:220180デフォルトの名無しさん
2009/09/09(水) 01:48:460181デフォルトの名無しさん
2009/09/09(水) 01:58:264000ほど同じのが現れるという書き込みから、記録に必要な容量は、3Mバイト程度。
このくらいではメモリ不足にはならない。
mapの検索が遅い可能性あるから、解こうとする行列のハッシュを自前で計算してみるとかは?
10*10を一列に並べてCRC32計算して、そのうちの何ビットかをキーにして、データの一致を確かめるとか。
0182デフォルトの名無しさん
2009/09/09(水) 02:29:290183デフォルトの名無しさん
2009/09/09(水) 02:30:520184デフォルトの名無しさん
2009/09/09(水) 02:35:480185184
2009/09/09(水) 02:36:360186デフォルトの名無しさん
2009/09/09(水) 03:40:20unordered_mapの方が適切な気がするけど
0187デフォルトの名無しさん
2009/09/09(水) 08:28:16そもそもちゃんと最適化して計測してるんだろうな?
0188デフォルトの名無しさん
2009/09/09(水) 11:32:32ちゃんと時間を取る場所を押さえないで「最適化」するとロクな事無い。
状況証拠から多分あってるんだろうけど、他の場所もある程度
いじるわけだろうし。
0189デフォルトの名無しさん
2009/09/09(水) 11:48:08しかし、uint(=unsigned intだよな?)が要素になってるvectorへのcount程度で
そんなに時間食ってるってのは、最適化されてないんじゃないかと疑いたくもなるな
0190デフォルトの名無しさん
2009/09/09(水) 11:58:19しかし全体の2割ってのはなんだろうとは思うな。
0191デフォルトの名無しさん
2009/09/09(水) 12:13:310192デフォルトの名無しさん
2009/09/09(水) 19:50:27ofstream ofs("filepass");
で開いたofsに改行を出力したいのですが、
ofs << cout;
だと出力できないのでしょうか?
"\n"だとバッファがフラッシュされないとか聞いたものでして
coutでやろうと思ったのですが。
0193192
2009/09/09(水) 19:55:12#include <iostream>
#include <fstream>
int main()
{
using namespace std;
ofstream ofs("filepass");
ofs << cout;
return 0;
}
で出力先のファイルに
0x46f0c4
と表示されるだけです。
0194デフォルトの名無しさん
2009/09/09(水) 20:06:57つ[endl]
0195デフォルトの名無しさん
2009/09/09(水) 20:09:110196デフォルトの名無しさん
2009/09/09(水) 20:09:35×改行 ○フラッシュ
0197192
2009/09/09(水) 20:45:23ありがとうございました。
std::endlで出来ました。
なんか重大な理解不足をしでかしている気がしますので
1から勉強しなおしてきます。
0198デフォルトの名無しさん
2009/09/09(水) 20:49:52coutはostream型のオブジェクトだから、君が作ったofsの親戚みたいなもの。
>>193はいわば、カメラでカメラを撮影したみたいな感じ。
0199デフォルトの名無しさん
2009/09/09(水) 21:15:40ありがとうございます。
マニピュレータとやらも勉強してまいります。
0200デフォルトの名無しさん
2009/09/09(水) 21:18:59悪い事は言わないからロベール読め
0201デフォルトの名無しさん
2009/09/09(水) 21:32:28素直にprintf使いなさい
C++でCの関数使うななんていう妄言には耳を貸さなくていい
0202デフォルトの名無しさん
2009/09/09(水) 21:38:11得するわいカス
自前のクラスの入出力を自由にカスタマイズできるだろうが
printf()には到底無理です
でないとわざわざiostreamなんか作るわけない
0203デフォルトの名無しさん
2009/09/09(水) 21:44:300204デフォルトの名無しさん
2009/09/09(水) 21:57:58動作は保証されないぞ
0205デフォルトの名無しさん
2009/09/09(水) 22:01:020206デフォルトの名無しさん
2009/09/09(水) 22:06:55ios::sync_with_stdio()
C の標準入出力操作と C++ のストリーム操作を同じ標準ファ
イ ルで実行すると、同期の問題が発生します。入出力の各ス
タイルではそれぞれ独自のバッファリングが行われるた め、
プ ログラムの実行順序と入出力の順序は異なります。この同
期の問題を解決するため、標準ストリー ム で あ る cin、
cout、 cerr、clog のいずれかに入出力を行う場合は、その
前にこの静的関数を必ず呼び出してください。この関数 は、
各 標準ストリームを stdiobuf を使用するように再設定しま
す。これにより、標準入出力とストリームを介して行う入 出
力 が同期して行われます。パフォーマンスは、バッファつき
ストリーム入出力やバッファつき標準入出力をそれぞれ単 独
で 行 なった場合よりもかなり低下します。 stdiobuf(3CC4)
を参照してください。
注 : sync_with_stdio が必要になるのは、同じ標準入力ファ
イ ル、出力ファイル、エラーファイルに入出力を行うときだ
けです。 stdin 上で C の標準 (stdio) 入力関数を排他的に
使 用し、 cout 上でストリーム出力関数を排他的に使用する
ことは、難しくはありません。
0207デフォルトの名無しさん
2009/09/09(水) 22:13:41これは、例えば今回の
printf()
と
std::cout
を同時に使う場合にも
std::ios::sync_with_stdio()
が必要ということですよね?
0208デフォルトの名無しさん
2009/09/09(水) 23:25:56まぁ気分はわからんでもないが、iostream も慣れると悪くないよ。
確かに細かいフォーマッティングするときは printf が使いたくなるが。
0209デフォルトの名無しさん
2009/09/09(水) 23:50:290210デフォルトの名無しさん
2009/09/10(木) 00:07:58それなしでは生きていけない体にされました
0211デフォルトの名無しさん
2009/09/10(木) 11:40:04>自前のクラスの入出力を自由にカスタマイズ
イミフ
>でないとわざわざiostreamなんか作るわけない
オナニ
0212デフォルトの名無しさん
2009/09/10(木) 11:52:45>>イミフ
202じゃないけど、Effective C++読んだことある?
0214デフォルトの名無しさん
2009/09/10(木) 12:37:290215デフォルトの名無しさん
2009/09/10(木) 13:25:49Set( int &先, int 元 );
Copy( int 元, int &先 );
という感じなんでしょうか?
それともどっちかに統一すべき?
0216デフォルトの名無しさん
2009/09/10(木) 13:32:13つかC++的には先.copy(元)じゃないんだろうか
0217デフォルトの名無しさん
2009/09/10(木) 13:32:58しかしstd::copyは逆なんだよな・・・
0218デフォルトの名無しさん
2009/09/10(木) 13:58:56わからなくなったら、Cではstrcpyを、
C++ではcopyを思い出すといい。
0219デフォルトの名無しさん
2009/09/10(木) 14:51:35Intel構文(MASM系)→元、先
AT&T構文(gas系)→先、元
となってる。
C++的には >>216 じゃね。
0220デフォルトの名無しさん
2009/09/10(木) 15:39:39OOPだと dest.copy(src); とか dest = src; とか
ジェネリックプログラミングだと copy( src.begin(), src.end(), back_inserter(dest) ); とか
メタプログラミングだと typedef src dest; とか struct dest : src {}; とか
まぁ統一感なんか皆無だから雰囲気に合わせて好きに汁
0221デフォルトの名無しさん
2009/09/10(木) 15:43:45逆だぞ
0222デフォルトの名無しさん
2009/09/10(木) 15:46:04まぁいいか別に
0223デフォルトの名無しさん
2009/09/10(木) 15:59:56確かに逆だな。
Intel構文(MASM系)→先、元
AT&T構文(gas系)→元、先
が正解。
0224215
2009/09/10(木) 19:07:43統一している人が多そうですね。
自分も自作のものは統一することにしときます。
0225デフォルトの名無しさん
2009/09/11(金) 02:48:59エラーを吐くようにしたいのですが、適切なオプションがありません。
どのようにすれば実装できるでしょうか?
0226デフォルトの名無しさん
2009/09/11(金) 02:55:13ifstreamで一度openして、ストリームの状態を確認するしかない
0227デフォルトの名無しさん
2009/09/11(金) 03:34:18アトミックにやろうとすると、標準じゃ無理っぽいねぇ。
http://www.google.co.jp/search?q=ofstream+O_EXCL
http://www.google.co.jp/search?q=ofstream+CREATE_NEW
0228デフォルトの名無しさん
2009/09/11(金) 10:22:58それってどういう意味
0229228
2009/09/11(金) 10:26:18○ それってどういう意味でしょうか?
0230デフォルトの名無しさん
2009/09/11(金) 10:27:11ここではファイルが無いことを確認してからそのファイルを作るまでの間に他のプロセスにそのファイルを作られてしまう事態
0231デフォルトの名無しさん
2009/09/11(金) 10:32:35ありがとうございます。
0232デフォルトの名無しさん
2009/09/11(金) 11:03:37つーかアトミックな操作でぐぐれば一発
0233デフォルトの名無しさん
2009/09/11(金) 18:27:210234デフォルトの名無しさん
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 { } ← 例外を投げるわけにもいかず、どうしていいかわからない
}
}
0235デフォルトの名無しさん
2009/09/11(金) 22:02:10一般的に、ファイルクローズの失敗はオープンしていない状態に戻っていると思うが。
0236デフォルトの名無しさん
2009/09/11(金) 22:05:49一言で言えば「致命的なエラーが発生しました」で落とせということ
0237デフォルトの名無しさん
2009/09/11(金) 22:27:00あるいは try-catch 使うにしても flag 使ってなんとかならん?
0238デフォルトの名無しさん
2009/09/11(金) 22:30:51「嘘でもいいから顧客の前でプログラムを止めるな」って。
0239デフォルトの名無しさん
2009/09/11(金) 22:36:300240デフォルトの名無しさん
2009/09/11(金) 22:36:35そうなの?
ディスクフルでクローズに失敗した場合
ディスクを開けてから再クローズとか出来ない?
0241デフォルトの名無しさん
2009/09/11(金) 22:50:49少なくともOpen失敗の例外はthrow再スローさせるんだろうから、
Open直後のClose失敗は無視すればいいんじゃね?
0242デフォルトの名無しさん
2009/09/11(金) 22:58:12一旦 close する。両方 OK ならば再度開けて操作に移るというのはダメ?
途中でディスクいっぱいになったり、他のプロセスが書き込んだりとかしたら
何があるかわからんが。その辺は状況によってどれがどこまで大事かというだろう。
0243デフォルトの名無しさん
2009/09/11(金) 23:10:38普通は、ディスクフルで書き込みに失敗したためにエラーを返すことはあっても
クローズそのものができなくなることはない。
0244デフォルトの名無しさん
2009/09/11(金) 23:24:072つめのオープン失敗が外に投げられないと困るでしょ。
close(f1) の失敗はできれば標準エラーやログに出力しとく程度で、最悪無視だろうな。
処理が中断したんなら、どうせ f1 の指すファイルの中身がどうなってるか保証は
できないんだし、そこは対策を考えても無駄でしょ。
0245デフォルトの名無しさん
2009/09/11(金) 23:29:440246デフォルトの名無しさん
2009/09/11(金) 23:31:13このコード、codepadで実行させると上のリンクのように正常に動作しているようですが、
私の環境g++ (TDM-1 mingw32) 4.4.0ですと
0.1
-9.25596e+061
と表示されてしまいます。
どうすれば正常に動作させられるでしょうか?
よろしくお願い申し上げます。
0247デフォルトの名無しさん
2009/09/11(金) 23:41:26それは、むしろその環境の方がおかしいってことない?
まさかと思って念のため試したが、Linux g++ 4.3.3 で0.1,0.1 になったよ。
0248246
2009/09/11(金) 23:50:16ありがとうございます。
codepadはg++ 4.1.2 だそうです。
g++ 4.4.0系が悪いか、私のWindows XPが悪いか。。。
0249246
2009/09/11(金) 23:55:160.1
0.1
になりました。
g++かTDMかMinGWが悪いということのようです。
同じ症状の方いらっしゃいませんでしょうか?
0250246
2009/09/12(土) 00:02:05すなわち
std::cout << std::numeric_limits<double>::max() << std::endl;
std::cout << std::numeric_limits<long double>::max() << std::endl;
で得られる値に違いがありませんでした。
0251247
2009/09/12(土) 00:17:46Linux g++ で試したら違うね。x86_64, i686 どちらの kernel でも違って
1.79769e+308
1.18973e+4932
0252デフォルトの名無しさん
2009/09/12(土) 00:20:00極端な話、全部charと一緒でも規格準拠
0254デフォルトの名無しさん
2009/09/12(土) 00:24:06追い打ちをかけるように、x64ではFPU使わずSSE2で処理する方針。
FPUには32/64/80ビット形式があったが、SSE2には32/64ビットしかない。
0255デフォルトの名無しさん
2009/09/12(土) 00:25:43x86のGCCってビルド時のオプション次第でlong doubleの大きさが12バイトとか16バイトとか変えられたはず。
libcとgccとでそこら辺が食い違っているとかないかなあ?
0256デフォルトの名無しさん
2009/09/12(土) 00:50:40そりゃ無茶だろ
超越関数もSSE2で自前で計算するのか
クロック数多すぎるぞ
0257デフォルトの名無しさん
2009/09/12(土) 00:56:33バグ有りで現在ほとんど使われていないと思われる
TDM-MinGW4.4.1で走らせたら
0.1
0.1
となりました
0258デフォルトの名無しさん
2009/09/12(土) 00:59:40超越関数はFPUでやろうが
SSE使ってソフトでやろうが
速さは同じだよ。
0259デフォルトの名無しさん
2009/09/12(土) 01:01:43SSE2にsinとかcosないだろ
0260デフォルトの名無しさん
2009/09/12(土) 01:03:22誰もSSEに超越関数命令があるなんて言ってない
0261デフォルトの名無しさん
2009/09/12(土) 01:07:38ソフトでやってFPU並みの速度が出るのか
(;¬_¬)ぁ ゃι ぃ。。。
0262デフォルトの名無しさん
2009/09/12(土) 01:12:33Windowsなら QueryPerformanceCounter() 使えば測定できるだろ
0263デフォルトの名無しさん
2009/09/12(土) 01:14:15↓こっちでやれ。
【C++】高速化手法【SSE】
http://pc12.2ch.net/test/read.cgi/tech/1130349336/
0264デフォルトの名無しさん
2009/09/12(土) 01:15:43未だにFPUが速いと思ってるのか?
755 :デフォルトの名無しさん:2009/07/04(土) 06:45:45
マイクロコード実装のFPU超越関数命令使うより、
四則演算で書かかれた超越関数サブルーチンを使った方が速い。
intelのコンパイラなんて、SSE2未対応CPU向けコードでも
fsin命令は使わず四則演算で計算してる。
0265デフォルトの名無しさん
2009/09/12(土) 01:19:48FPUより速かった
0266デフォルトの名無しさん
2009/09/12(土) 01:29:27だから文だけ書くならいくらでも書ける
証拠を見せてと言ってるんだが
>>265
単精度だろカス
倍精度の話してるんだよ
0267デフォルトの名無しさん
2009/09/12(土) 01:41:44おまえどこまで馬鹿なんだよ
> intelのコンパイラなんて、SSE2未対応CPU向けコードでも
> fsin命令は使わず四則演算で計算してる。
これが証拠なんだが。違うって言うならおまえこそ証拠出してみろよ
0268デフォルトの名無しさん
2009/09/12(土) 01:43:140269デフォルトの名無しさん
2009/09/12(土) 01:53:090270デフォルトの名無しさん
2009/09/12(土) 01:53:48Intelコンパイラ持ってないんだよ
どこかまとめサイトないのか
0271デフォルトの名無しさん
2009/09/12(土) 02:46:00そういってるのと同じ。
0272デフォルトの名無しさん
2009/09/12(土) 03:14:04せっかくなのでうちも。
環境
kernel.i686 2.6.18-128.1.14.el5
gcc-c++.i386 4.1.2-44.el5
出力
1.79769e+308
1.18973e+4932
0273デフォルトの名無しさん
2009/09/12(土) 07:49:45vc8
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;
}
0274デフォルトの名無しさん
2009/09/12(土) 07:53:330275246
2009/09/12(土) 11:21:06ありがとうございます。
どうやら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
ありがとうございます。
0276246
2009/09/12(土) 12:36:59TDM-MinGW4.3.3 -> ×
TDM-MinGW4.4.0 -> ×
TDM-MinGW4.4.1 -> ○
ということで、
TDM-MinGW4.4.1で修正されたバグだったようです。
どうもありがとうございました。
0277デフォルトの名無しさん
2009/09/12(土) 22:26:14処理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]を変更する。)
とした方が処理速度的に良いってことはありますか?
0278デフォルトの名無しさん
2009/09/12(土) 22:33:08実際に遅くて困ってて、そこがボトルネックだと判明したんでもなければ、そんな細かいこと気にしない方がいい
いちいち気にしてたらプログラミングが進まない
普段は読みやすさを優先するべき
0280デフォルトの名無しさん
2009/09/12(土) 23:13:41http://www7b.biglobe.ne.jp/~robe/pf/pf016.html
ここによると、特定のクラスに依存せずオブジェクトも保持できるように書いてるけど、
templateや、安全面には気を使うという前提でvoid*を使うとかで依存させずに
オブジェクトはメンバ変数で持つとかで対応できるような気がする。
JavaやC#で実装されてるので何かしら便利だと思うんですが何か違いがあるんですか?
0281デフォルトの名無しさん
2009/09/12(土) 23:15:570282デフォルトの名無しさん
2009/09/12(土) 23:18:37メンバ関数ポインタは this ポインタを与えてやらないと呼び出せない。
「〜で対応できる」の部分については、 boost::function (および次期標準規格の
std::function )がその役割をカバーしている。 boost::function が「デリゲート」に近い。
0283デフォルトの名無しさん
2009/09/12(土) 23:23:41メンバ関数ポインタとデリゲートは目的は似てるといえるけど実装方法が違う。
C++でC#のデリゲート相当を使いたい場合は関数オブジェクトの使い方を勉強すると良い。
さらにboost::function boost::bind boost::signals2を使うとC#のデリゲートやイベント構文相当が簡単に使える。
0284デフォルトの名無しさん
2009/09/12(土) 23:32:19C#のデリゲートは静的なメソッドもそうでないメソッドも同じように代入できるのがいい。
(もちろん、共に引数・戻り値の型が程度はともかく合っていないといけないけど)
そして、C++でもその手の仕組みを書けば、全部共通して扱えるのが便利。
普通はbindとfunctionを使うけど。
0285デフォルトの名無しさん
2009/09/12(土) 23:41:57そんな bug があるって恐ろしいね。使いたくない環境だ。
0286デフォルトの名無しさん
2009/09/12(土) 23:45:04バグなんだろうなあ
0287246
2009/09/13(日) 00:13:28しかし 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/で聞いてみようかと思います。
0288280
2009/09/13(日) 01:42:37よく分かんないからとばしたんですよね、ちょっと勉強してみます。
0289デフォルトの名無しさん
2009/09/13(日) 03:30:060290デフォルトの名無しさん
2009/09/13(日) 06:52:41coutが対応していないだけでは?
数値はあってるけど、ふつうにdoubleとして出力しているとか
0291デフォルトの名無しさん
2009/09/13(日) 07:11:12// 関数定義例
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テンプレートに比較関数を与える場合、関数ポインタを与えると関数コール
が生成されるが、関数オブジェクトを与えるとインラインで展開される可能性が高く、
比較関数のような小さいコードではインライン化の利得が大きい。
まぁ述語関数オブジェクトには罠もあって、状態を持つような関数オブジェクトだと
関数オブジェクトのインスタンス自体をコピーしてしまうテンプレートアルゴリズム
では問題が出たりする。とはいえ、基本的には簡単な概念だ。
0292280
2009/09/13(日) 07:47:29うん、なんかすっげー簡単だね。難しく考えすぎてたみたい。
でも、自分のしたいことはクラスの特定のメンバ関数を別のクラスに渡したいんだけど、
これは、メンバ関数ポインタかデリゲートを使うところだよね?
0293デフォルトの名無しさん
2009/09/13(日) 07:57:35でいいんじゃね
0294280
2009/09/13(日) 08:02:45でも、boostは使えない環境なので何とか自分でやってみます。
0295デフォルトの名無しさん
2009/09/13(日) 08:05:00ロベールで言えばChapter13という事になるが、出来ないんじゃね?
メンバ関数を呼び出すにはあくまでもthisポインタが必要なので、
オブジェクトのインスタンスがどうしても必要になる
それだったらメンバ関数へのポインタを他のクラスに渡すという考え方を
やめて、コンポジションで処理すべき
0296デフォルトの名無しさん
2009/09/13(日) 08:05:09特定のメンバ関数を呼び出す関数オブジェクトを作って渡せば可能。
関数オブジェクトを作るのが面倒なら、boost::bindを使うと関数オブジェクトを
式内で簡単に作ってくれる。
0297デフォルトの名無しさん
2009/09/13(日) 08:34:17済まないがboost::bindを使わないでやるサンプルコードを
簡単な物でいいからCodePadに貼って欲しい
どうしても概念が理解できない
0298デフォルトの名無しさん
2009/09/13(日) 08:46:59それこそ>>280のページのIFoo/CFoo。
attach(Foo(this, &Test::hoge));をbindで書き直すとattach(bind(&Test::hoge, this))となる。
0299デフォルトの名無しさん
2009/09/13(日) 08:57:040300デフォルトの名無しさん
2009/09/13(日) 09:03:27読んでも多分挫折する
0301デフォルトの名無しさん
2009/09/13(日) 09:09:18サンクス
継承をうまく使うわけね
0302デフォルトの名無しさん
2009/09/13(日) 09:22:570303デフォルトの名無しさん
2009/09/13(日) 09:36:29継承は実現するための1つの手段。それ以外のやり方もある。
0304デフォルトの名無しさん
2009/09/13(日) 09:40:31#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;
}
0305デフォルトの名無しさん
2009/09/13(日) 09:45:52ちなみに、新しいg++とかVC++とかだと標準でbindもfunctionも付いているよ。
そうでないなら仕方ないけど。
0306デフォルトの名無しさん
2009/09/13(日) 09:46:16アプリを書いているときに自然には書けないんだよな。
未だ自家薬籠に入ってないらしいw
0307デフォルトの名無しさん
2009/09/13(日) 09:48:090308デフォルトの名無しさん
2009/09/13(日) 10:12:38こりゃまたエラい見た目簡単そうなコードになりますね
コンパイルすると引き延ばされて大きくなりそうだけど
0309デフォルトの名無しさん
2009/09/13(日) 10:45:500310デフォルトの名無しさん
2009/09/13(日) 10:55:27functionはテンプレート関数にしなくてもファンクタが渡せて便利な分、
TypeErasureのために関数ポインタか仮想関数分のオーバーヘッドがあるってことだね。
0311280
2009/09/13(日) 10:55:47ここ見て何とかできました。ようは、クラスのメンバ関数をコールバック関数にしたかったんです。
0312デフォルトの名無しさん
2009/09/13(日) 11:02:33なかなかいいHPだな。
0313デフォルトの名無しさん
2009/09/13(日) 11:05:17まぁ見やすいし便利ではある
ただしやね信者
0314デフォルトの名無しさん
2009/09/13(日) 13:04:220315280
2009/09/13(日) 15:55:29仕方がないからdefineでやるしかないのかなぁ。
0316デフォルトの名無しさん
2009/09/13(日) 15:58:460317デフォルトの名無しさん
2009/09/13(日) 16:07:120318デフォルトの名無しさん
2009/09/13(日) 17:24:10C++0xはあと3〜4ヶ月程度で本当に出来るのか?
まさかとは思うが
C++0fまでokとかじゃないよな?
0319デフォルトの名無しさん
2009/09/13(日) 17:45:100320デフォルトの名無しさん
2009/09/13(日) 17:51:50閉じカッコが
>>
となると左ビットシフト演算子と同じになって…(ry
ってのは、C++0xでは例外的に認める方針で解決されるんだっけ?
0321デフォルトの名無しさん
2009/09/13(日) 18:17:160322デフォルトの名無しさん
2009/09/13(日) 18:35:35よかった!
ありがとうございます。
0323デフォルトの名無しさん
2009/09/13(日) 18:48:150324デフォルトの名無しさん
2009/09/13(日) 18:52:24禿はC++10か11になるだろうとどこかで言ってた気がする
0325デフォルトの名無しさん
2009/09/13(日) 19:45:35[]演算子そのものはオーバーロードができるのでこれを同様に2個組み合わせることになる。
具体的に言うと一個目の[]で2次元配列から1次元の配列を返し、それを2個目の[]で要素を返すようにする。
0326デフォルトの名無しさん
2009/09/13(日) 20:26:44実装の仕方がわかりません。
T &operator[](int i, int j) const { 中身省略 }
これだとエラーになるんで。
0327デフォルトの名無しさん
2009/09/13(日) 20:33:54お前、話聞いてなかったろwwww
0328デフォルトの名無しさん
2009/09/13(日) 20:38:02class A{
public:B& operator[](int i){省略}
};
class B
{
public:
int& operator[](int j){省略}
};
int s=a[100][100];
0329デフォルトの名無しさん
2009/09/13(日) 20:47:14ライセンス表示をどのようにしようか迷っています。
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ってマズいでしょうか??
0330デフォルトの名無しさん
2009/09/13(日) 20:49:19スレ違いだし、日本語読めないの?
0332デフォルトの名無しさん
2009/09/13(日) 20:53:58このスレなどいかが?
【殺しの】ライセンス【道で拾った】
http://pc12.2ch.net/test/read.cgi/tech/1045006087/
0334デフォルトの名無しさん
2009/09/13(日) 23:07:53マクロで調べたいんですが、
どうすれば良いか教えていただけますでしょうか?
つまり
#ifdef C++0xのstatic_assertに対応している
static_assert( CONSTANT-EXPRESSION, "error-message" ) ;
#else
assert( CONSTANT-EXPRESSION ) ;
#endif
としたいのです。
BOOST_STATIC_ASSERTは訳あって使えないのですが、
よろしくお願い申し上げます。
0335デフォルトの名無しさん
2009/09/13(日) 23:24:03static_assert はコア言語の機能で、マクロはプリプロセッサのものだから、無理。
次期規格で __cplusplus の値が更新されたりすれば使えるかもしれないけどね。
そもそも static_assert() は assert() で代用できるようなもんじゃないし、
BOOST_STATIC_ASSERT が使えなくてもコンパイラさえ限定すれば自前で実装しても
たいして難しくないよ。
0337334
2009/09/14(月) 00:27:38とりあえず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が出ないように出来るでしょうか?
よろしくお願い申し上げます。
0338デフォルトの名無しさん
2009/09/14(月) 07:25:34sizeof 使うとか。
0339デフォルトの名無しさん
2009/09/14(月) 12:33:530340デフォルトの名無しさん
2009/09/14(月) 13:14:22よく8つ離れた兄のところへ新幹線でいったんだ。
ちょっと高いからだけだからって、時々とうちゃんがグリーン車の代金をくれて
乗っていったんだが、そのたびに周りの客に「生意気ながきだ」みたいな目で見られて。
そういう大人にはならないどこうと肝に銘じたもんだ。
0341デフォルトの名無しさん
2009/09/14(月) 14:33:36void *vp = malloc( sizeof(T) * count );
T *tp = new(p) T[count];
これだと確保したメモリ領域の先まで上書きされるようなんです。
これはどうしてでしょうか?
また、どのように解決すればいいでしょうか?
0342デフォルトの名無しさん
2009/09/14(月) 14:36:46単なる写しミス?
0343デフォルトの名無しさん
2009/09/14(月) 14:48:29書き間違えました
それが原因ではないので気にしないで下さい
0344デフォルトの名無しさん
2009/09/14(月) 15:02:290345デフォルトの名無しさん
2009/09/14(月) 15:08:05newの段階で書き込みが発生しました。
0346デフォルトの名無しさん
2009/09/14(月) 15:11:40なんか配列の個数の情報が入ったりするみたいですね。
0347デフォルトの名無しさん
2009/09/14(月) 15:11:44ttp://codepad.org/
に再現するsourcecodeを書いて。
話はそれからだ
0348デフォルトの名無しさん
2009/09/14(月) 15:14:36一般にnew T[N]はsizeof (T) * Nと同じだけのメモリを使うわけではない。
delete[]のときのため要素数を記録する分多くメモリを使う。
new(p) T[count]の場合もそうだと思う。
forなどで、new(p + sizeof(T) * i) T;などとすればいいと思う(pはchar型にでもして)。
ちなみに、forを使わずともuninitialized_fill_nなんかでもできる。
0349デフォルトの名無しさん
2009/09/14(月) 16:37:21短く言うとnew T[N]で必要な領域はsizeof(T)*Nじゃないから
配列形式のplacement newはC++の暗黒面だから諦めたほうが良い。
0350デフォルトの名無しさん
2009/09/14(月) 17:00:390351デフォルトの名無しさん
2009/09/14(月) 18:48:27vector<a> vec;
};
list<str> lst;
こんな感じでlistの中にvectorを使っている場合の削除について質問なんですが、lstでeraseまたはclearをすると
vectorではclearとかはしなくていいのですかねぇ。それともしたほうがいいの?
しなくてもメモリリークは起きなかったけれども
0352デフォルトの名無しさん
2009/09/14(月) 19:12:360353デフォルトの名無しさん
2009/09/14(月) 19:32:16配列のplacement newはには何らかの情報が追加として必要になる。要素数の場合が多いであろうが決まっていない。そのため確実に動作を保証できないので使わないほうがいい。
実際は、多めにとったメモリブロックに普通のplacement newを実際に必要な数だけforしたほうが効率がいい。
0354デフォルトの名無しさん
2009/09/14(月) 19:33:32同じプログラムをコピーして、同じVC++でコンパイルしているのですが、片方ではコンパイルできて、もう片方ではエラーが出てくるような場合は何が原因として考えられるでしょうか?
よろしければ自分で調べるヒントになるようなキーワードなども教えていただけるとありがたいです。よろしくお願いします。
0355デフォルトの名無しさん
2009/09/14(月) 19:41:460356デフォルトの名無しさん
2009/09/14(月) 19:42:41そんなだからお前のコードは後で読めなくなるんだ
0357デフォルトの名無しさん
2009/09/14(月) 19:50:18>>356
申し訳ありませんでした
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
warning C4183: 'd1': 戻り値の型がありません。'int' を返すメンバ関数とみなします。
error C2236: 予期しない 'class' 'c2' です。';' が入力されていることを確認してください。
error C2143: 構文エラー : ';' が '{' の前にありません。
error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
以上です。エラーが出ないほうのソースをコピーしても、コンパイルできないほうに全部貼り付けてみても無理でした
どうかよろしくお願いします
0358デフォルトの名無しさん
2009/09/14(月) 19:53:200359デフォルトの名無しさん
2009/09/14(月) 19:56:520360354,357
2009/09/14(月) 20:01:38コピーしてきてるので、忘れてるということはないと思います。(コピー範囲もちゃんとチェックしました)
>>359
具体的にどういうことでしょうか?
0361デフォルトの名無しさん
2009/09/14(月) 20:04:170362デフォルトの名無しさん
2009/09/14(月) 20:07:56構成プロパティ→C/C++→詳細→必ずインクルード
のとこの設定が違ったりするとか。
まぁでもぶっちゃけまだ情報不足。エラーの出た行とその前後くらいは欲しい。
識別子が型として認識されてない時のエラーに似てるから、インクルードされてない
のかな、と思った程度で、結構エスパー訓練状態。
0363354,357
2009/09/14(月) 20:13:35レスありがとうございます。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
0364デフォルトの名無しさん
2009/09/14(月) 20:21:490366デフォルトの名無しさん
2009/09/14(月) 20:35:00右クリックで開けるか確認した方がいいかも
0368デフォルトの名無しさん
2009/09/14(月) 21:18:56予め正確なサイズを知る事が出来ないわけだからなあ
0369デフォルトの名無しさん
2009/09/14(月) 22:12:490370354,357
2009/09/14(月) 22:39:24仕方ないのでいったん断念します。考えてくださった方ありがとうございました
また何かあったらよろしくお願いします。
0371デフォルトの名無しさん
2009/09/15(火) 03:33:430372デフォルトの名無しさん
2009/09/15(火) 08:07:46要素数値の領域が何バイトとられるかも決まってないから
たとえ要素の並びのいっこ前が要素数だとしてもどこから配列として使えるのか分からない
それに要素の並びの1つ前が要素数だと決まってるわけでもない
ってことでムリっぽい
0373デフォルトの名無しさん
2009/09/15(火) 16:47:59なんで東方厨って分かった?
0374デフォルトの名無しさん
2009/09/15(火) 17:18:360375デフォルトの名無しさん
2009/09/15(火) 17:20:22だって気になるじゃん。
0376デフォルトの名無しさん
2009/09/15(火) 19:47:44カツカツじゃなくてもまともに動作する領域をくれないということ?
0377デフォルトの名無しさん
2009/09/15(火) 21:15:13↓のコードでは特に問題ないよう。
何が間違ってますか?
#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;
}
0378デフォルトの名無しさん
2009/09/15(火) 21:43:07デストラクタを持たせてみると落っこちるかもしれない。
あるいは、お前の実行環境ではちょっとくらい確保した量を超えての読み書きが許されていて、何も起きないのかもしれない。
0379デフォルトの名無しさん
2009/09/15(火) 22:11:41確かにデストラクタを入れたところ、freeで落ちました。
そこで、確保するヒープのサイズを適当に増やしたところ
落ちなくなりました。
それ以前に、newを呼び出したとき先頭4byteに個数が
入っているのを見落としていました。
理解しました。ありがとうございました。
0380デフォルトの名無しさん
2009/09/15(火) 23:06:50ttp://codepad.org/Voi7aXyd
ttp://codepad.org/zmCqqX6L
文字列ptrの先頭n文字を返すこのような関数fooを作りました。
これら3つは、関数fooの中身の一部分しか変わっておりません。
かなり無理矢理というかわざとらしい例ですみません。
この3つのうち、どれが望ましい(スピードや安全性などの面から言って)でしょうか?
よろしくお願い申し上げます。
0381デフォルトの名無しさん
2009/09/15(火) 23:14:062が無難。
速度的には3かな?
0382デフォルトの名無しさん
2009/09/15(火) 23:28:30ただこれもまだ高速化の余地がありまくる。
0383デフォルトの名無しさん
2009/09/15(火) 23:48:33つまり
とあるクラスの実体Aが、別のクラスの実体Bに命令を出して
実体Bはその命令に従ったメンバ関数を実行する
って事で良いの?
0384380
2009/09/15(火) 23:50:22ありがとうございます。
3で行こうと思います。
> ただこれもまだ高速化の余地がありまくる。
すみませんだいぶ無理のある例で。
あくまで例のためのソースでして、ご容赦ください。
0385デフォルトの名無しさん
2009/09/15(火) 23:52:01別にそれだけじゃないとは思うけど、
醍醐味はそうだろうね。
0386デフォルトの名無しさん
2009/09/15(火) 23:57:14これじゃいかんの?
--
std::string foo(unsigned int num, const char * const ptr)
{
return std::string(ptr, ptr + num);
}
0387デフォルトの名無しさん
2009/09/16(水) 00:02:17ちょっと類似した件のための例ですので。
実務でしたら、私だったら
std::string(ptr).erase(num)
の1行で終わらせます。
0388デフォルトの名無しさん
2009/09/16(水) 00:21:46std::string(ptr, ptr + num);
の一行の方が美しいですね。
ありがとうございます。
ですがあくまで例のためのソースでして、ご容赦ください。
0389デフォルトの名無しさん
2009/09/16(水) 00:24:43うーん。
命令を出すって言うのがいまいちパッと来ないで困る。
プログラムで簡単なサンプルとか無い?
0390デフォルトの名無しさん
2009/09/16(水) 02:12:50風が吹けば桶屋が儲かる
0391デフォルトの名無しさん
2009/09/16(水) 02:22:540392デフォルトの名無しさん
2009/09/16(水) 04:18:47異様。アルゴリズムと型の分離という抽象化も平気でやる言語だし。問題に合う方法論
を自由に選べるのがおいしい訳で、一つの方法論だけでやってくとおいしくない。
オブジェクトがオブジェクトに命令を送ってメンバ関数を、って形態をC++で素直に
表してるのは仮想関数のディスパッチあたりだろうけど、仮想関数じゃないなら単に
「メンバ関数コールは命令送出そのものである」くらいのシンプルな捉え方でいい。
つーか「全てがオブジェクトである」というタイプのOOPじゃないから、そういう世界
の話を持ち込むと混乱しがち。純OOPで表現しようとすると逆に複雑で訳分からなく
なることも多いし。そもそも標準ライブラリが純OOPじゃないし。
0393デフォルトの名無しさん
2009/09/16(水) 05:29:20でも劇団「プロジェクトひとり」ならマイモンタイ
0394デフォルトの名無しさん
2009/09/16(水) 07:00:07正しく意味を理解してる?
風(かぜ)が吹けば桶屋(おけや)が儲(もう)かる
ttp://dic.yahoo.co.jp/dsearch?enc=UTF-8&p=%E9%A2%A8%E3%81%8C%E5%90%B9%E3%81%91%E3%81%B0%E6%A1%B6%E5%B1%8B%E3%81%8C%E5%84%B2%E3%81%8B%E3%82%8B&dtype=0&dname=0na&stype=0&pagenum=1&index=04003203269400
0395デフォルトの名無しさん
2009/09/16(水) 07:21:29OO特化言語でもなければ、オブジェクトと非オブジェクトが混在するのは自然だし、
設計に問題がある訳でもない。
0396デフォルトの名無しさん
2009/09/16(水) 18:02:09size_t size = data_size;
s.resize( size );
memmove( s.c_str(), data, size );
}
これって有効な操作?
ようは、渡されたsに対して、新しい文字列を割り当てたいんだけど。
0397デフォルトの名無しさん
2009/09/16(水) 18:12:48c_str()は読み取り専用だったはず。
std::string::assign()を使えよ。
0398デフォルトの名無しさん
2009/09/16(水) 18:48:52そもそもstringのc_str()で得られる内部の配列は、連続していることが保証されてないからダメだよ。
0399デフォルトの名無しさん
2009/09/16(水) 18:52:54c_strを根底から揺るがす新理論
0400デフォルトの名無しさん
2009/09/16(水) 18:54:470401デフォルトの名無しさん
2009/09/16(水) 18:56:43それと勘違いしてるんじゃないの
0402デフォルトの名無しさん
2009/09/16(水) 19:04:34改行コードまで読み込むにはどうすればよいでしょうか?
今はgetlineでやっているのですが、読み込んでくれないようです。
0403デフォルトの名無しさん
2009/09/16(水) 19:16:21\nか\r\nかを見たいなら、そもそもテキストとして扱うと勝手に変換されちゃうから
バイナリモードで開いて直接探索するしかない
0404デフォルトの名無しさん
2009/09/16(水) 19:19:45ありがとうございます。バイナリで開いて頑張ってみます。
0405デフォルトの名無しさん
2009/09/16(水) 20:24:12次世代の怪物Scalaはどうよ
JVM上でhlistが実装できるぜ
0406デフォルトの名無しさん
2009/09/16(水) 20:25:420407デフォルトの名無しさん
2009/09/16(水) 20:54:41scalaは今後どんどん注目されるだろうな
アクターモデルとかすばらしい
0408デフォルトの名無しさん
2009/09/16(水) 21:46:17ご時世だからなぁ
0409デフォルトの名無しさん
2009/09/16(水) 22:22:34VMって結局インタプリタだしオーバーヘッドは大きいよな。
JITだといっても実行時にコンパイルするってオーバーヘッド大きすぎ。.NETなんか
初めて開くダイアログなんか遅すぎるよね。
0410デフォルトの名無しさん
2009/09/16(水) 22:31:29インタプリタじゃない。
とはいえ、結局は重い。Crusoeと同様に。
ボトルネックの負荷が激しいなら、激しくヘタクソなC++コードよりは高速動作
することもある。海外にそんなブログがあって、どっかのスレで念入りな検証を
されてボコられてたが。
0411デフォルトの名無しさん
2009/09/16(水) 22:38:18からネイティブより速くなることがあるとか読んだことがあるけど、実際どうなのかな。
それなら最初からメモリ配置を設計できるネイティブ系の言語のほうがいいような気もするけど。
0412デフォルトの名無しさん
2009/09/16(水) 22:43:20講演で言ってたみたいだけど、現時点では遙かに遠い話に見えるなぁ。
Crusoe系列が生きていたら将来Core系列に勝てるようになっただろうか、という
想像に似ている気もする。
ただ、VMの方がマルチコアで慢性的に余ってるスレッドを活用しやすいから、それを
スカウトスレッドやら投機的MTやらに活用するようになってきたりしたら、逆転は
十分にあるな。
まぁその時は、乗り換えてもいいし、C++/CLIでVM使ってもいいし、両方使い分け
もいいし。JVMもCLIも大体同レベルで進歩するだろうから。
0413デフォルトの名無しさん
2009/09/16(水) 22:54:18ふーん、そんな予想が立ってるのか。
しかしそんな将来なら今度は
> マルチコアで慢性的に余ってるスレッドを活用しやすい
これをネイティブコードで解決する技術が出現してくるんじゃないかと思われる。
0414デフォルトの名無しさん
2009/09/16(水) 22:59:22>>411
次々期C++がGCを取り込もうとしてるのはその辺の関係もあるのかもしれないな
0415デフォルトの名無しさん
2009/09/16(水) 23:19:19sizeofって文脈によって意味が変わりますよね?
sizeof("hoge")では何が返るとか、
そういったsizeofの使い方はどこで分かるのでしょうか?
よろしくお願いいたします。
0416デフォルトの名無しさん
2009/09/16(水) 23:33:10型が指定されれば、メモリ上でその型のオブジェクトが占めるバイト数。
値が指定されれば、その値の型について上記と同様。
変わるっていってもこの2つだけでたいした違いはないはずなんだけど、
何か勘違いしてない?
0417デフォルトの名無しさん
2009/09/16(水) 23:33:21つまるところ、文脈によって意味が変わるのではないかという勘違いをしてるだけじゃないかなぁ
0418デフォルトの名無しさん
2009/09/16(水) 23:34:08あれ?その2つでしたか。
いまいちとらえどころがないなぁと思っていたのですが。
ありがとうございます。
0420デフォルトの名無しさん
2009/09/16(水) 23:48:28int a[3]; sizeof(a) 配列全体のバイト数
int* a; sizeof(a) ポインタのサイズ
0421デフォルトの名無しさん
2009/09/16(水) 23:54:16まさにそれです。。。
配列が絡むと何を返してくるのかよく分からなくて。
しかしその2つの対比をしてくださったおかげでちょっと納得した気がします、
0422デフォルトの名無しさん
2009/09/16(水) 23:55:15sizeof - Wikipedia
ttp://ja.wikipedia.org/wiki/Sizeof
に
> 厳密な大きさはsizeof(char)が1であることを除いて標準に定められていない。
って書いてあるけど、sizeof(char)が1ってホント?
俺の記憶では確かsizeof(char)すら処理系依存だったと思うのだが。
0423デフォルトの名無しさん
2009/09/16(水) 23:56:380424デフォルトの名無しさん
2009/09/16(水) 23:59:36やっぱり勘違いだね。
ポインタはポインタのサイズであって、ポインタが指す内容のサイズではないですよ。
>>422
1byteが8bitであるとは限らないという話と混同してないかい?
0425デフォルトの名無しさん
2009/09/17(木) 00:01:250426422
2009/09/17(木) 00:04:36ありがとう!
0427デフォルトの名無しさん
2009/09/17(木) 06:15:06「VM(笑)遅いし」ってのは過去になりつつある。
0428デフォルトの名無しさん
2009/09/17(木) 07:03:32ってなマクロを、確か二重にしているのを見たりするんですが、
これって何のためにやっているのですか?
特定のコンパイラ向けとかでC++でも実際にそうしておく必要がありますか?
0429デフォルトの名無しさん
2009/09/17(木) 07:16:32マクロにマクロを渡すみたいなことをやり始めると、一重二重で意味が変わってくる。
紙幅が全く足りない上に俺もそこまで詳しくないのでプリプロセッサの仕様読んでくれとしか
0430デフォルトの名無しさん
2009/09/17(木) 09:39:22#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"
---------------------------
これのこと?
0431428
2009/09/17(木) 20:50:17それです。
BOOST_PP_STRINGIZE
の実装でもそうなっているようですが、
正式なプリプロセッサの仕様はどこで学べるのでしょうか?
そして学んでおく必要はありますでしょうか?
0432デフォルトの名無しさん
2009/09/17(木) 20:59:48>正式なプリプロセッサの仕様はどこで学べるのでしょうか?
つ[google]
>そして学んでおく必要はありますでしょうか?
必要ないよ、そんな質問をするような間抜けには。
0433デフォルトの名無しさん
2009/09/17(木) 21:09:35何?君の自己紹介は要らないよ。
0434デフォルトの名無しさん
2009/09/17(木) 21:18:120435デフォルトの名無しさん
2009/09/17(木) 21:54:07プリプロセッサだけなら、
僕は”プログラム言語C”(JISX3010)がおすすめ。
0437デフォルトの名無しさん
2009/09/18(金) 00:18:200438デフォルトの名無しさん
2009/09/18(金) 00:43:04サーカスやってるとミスの確率も高くなるし、後でわからなくなるよ。
あと、C++ ではむしろ C プリプロセッサの複雑な部分を普通使う
必要も無いし、使わない方が良いと思う。
0439デフォルトの名無しさん
2009/09/18(金) 07:07:46可読性も(素でやるよりは)うpするよ
0440デフォルトの名無しさん
2009/09/18(金) 07:57:57プリプロセッサの必要性は残る。Boostの実装もBOOST_PP使いまくりだったり
するしな。
C++0xはその辺の実装経験も元に、さらにプリプロセッサの必要性が下げられる
見込みだけど。
0441デフォルトの名無しさん
2009/09/18(金) 08:19:57BOOST_FOREACHやBOOST_AUTOは有用なプリプロセッサだけどc++0xではサポートされるしな。
プリプロセッサは基本的には、使うべきじゃないとは思っている。
しかし、膨大な繰り返しをミスなく記述するような有用に使うのは問題ないと思う。
例えばVisitorを使うには派生関係の無い似たような関数をたくさん作る場合など。
0442デフォルトの名無しさん
2009/09/18(金) 08:35:40なるべく使わず済ませよ。
0443デフォルトの名無しさん
2009/09/18(金) 08:41:460444デフォルトの名無しさん
2009/09/18(金) 08:44:110445デフォルトの名無しさん
2009/09/18(金) 08:55:110446デフォルトの名無しさん
2009/09/18(金) 08:57:43重要なことなので2度言いました。
0447デフォルトの名無しさん
2009/09/18(金) 09:21:11やっべ、車輪の歳発明またやっちまった
0448デフォルトの名無しさん
2009/09/18(金) 09:42:51しかし、メタプログラムはバグがわかりにくい。
なるべく使わず済むようにすべき。
使うならそこだけヘッダにして分割するとかが良い。
0449デフォルトの名無しさん
2009/09/18(金) 09:49:18メタは少しずつ階層を増やしながらコンパイルで確認しつつ書くのがいいかも試練。
0450デフォルトの名無しさん
2009/09/18(金) 09:59:22利点より欠点の方がおおいよね?
0451デフォルトの名無しさん
2009/09/18(金) 10:15:15あと外部ツールでコード生成するのも一種のメタプログラミングといえよう
後者の技法を使ってるプロジェクトは数え切れないぐらいあるだろう
その事実を以ってすれば欠点の方が多いと言い切ることは不可能である
0452デフォルトの名無しさん
2009/09/18(金) 10:21:460453デフォルトの名無しさん
2009/09/18(金) 10:34:59無知?
まあメタプログラミングは天才にやらせてその成果物を凡人が使う。
これが鉄則。うん。
0454デフォルトの名無しさん
2009/09/18(金) 10:43:33というか再利用可能なクラスですら書きたくない
もちろん信頼できる第三者の成果物はメタもクラスも利用するよ!
0455デフォルトの名無しさん
2009/09/18(金) 11:02:01ことを言ってるのか分からん
0456デフォルトの名無しさん
2009/09/18(金) 11:07:380457デフォルトの名無しさん
2009/09/18(金) 11:09:34不要だよ」と言うもんだ。
0458デフォルトの名無しさん
2009/09/18(金) 11:10:25俺、自分よりboostや他企業の製品のが信頼できる。
0459デフォルトの名無しさん
2009/09/18(金) 11:15:31自社製品は怖くて使えない・・・
これが世の共通認識w
0460デフォルトの名無しさん
2009/09/18(金) 11:18:41あれ、俺いつの間に書き込んだっけ?
0461デフォルトの名無しさん
2009/09/18(金) 11:20:48hogeクラスは…(ry
と書くのと
クラスhogeは…(ry
と書くのと、どっちがいいのでしょうか?
JISとかで決まっていますか?
0462デフォルトの名無しさん
2009/09/18(金) 11:33:17つ[doxygen]
0463デフォルトの名無しさん
2009/09/18(金) 11:38:28ありがとうございます。
hogeクラスは…(ry
クラスhogeは…(ry
とどっちがJIS等で正しい用語か決まっているでしょうか?
0464デフォルトの名無しさん
2009/09/18(金) 11:50:45hogeクラス → hoge というタイプのクラスがある。
クラスhoge → クラスの名前がhoge。
という感じがする。
0465デフォルトの名無しさん
2009/09/18(金) 11:52:03あーなるほど、
入出力クラス と class MyIO
みたいなかんじですね。
0466464
2009/09/18(金) 12:18:26以下にjisより引用します。
ttp://imagepot.net/image/125324383539.gif
このようになっていました。
0467デフォルトの名無しさん
2009/09/18(金) 13:12:14class hoge についてだと思ってたのに。。。
0469デフォルトの名無しさん
2009/09/18(金) 13:47:400470461
2009/09/18(金) 13:49:46悪気は全くありませんでした。
0471461
2009/09/18(金) 13:56:25同じでした。
クラスhogeという表記がJIS的には採用されているようです。
ありがとうございました。
0472デフォルトの名無しさん
2009/09/18(金) 15:26:25なんだかこちらこそありがとう
0473デフォルトの名無しさん
2009/09/18(金) 19:10:09名探偵コナン
目暮警部
0474デフォルトの名無しさん
2009/09/18(金) 19:54:32何?
誤爆??
0475デフォルトの名無しさん
2009/09/18(金) 20:14:120476デフォルトの名無しさん
2009/09/18(金) 20:25:070477デフォルトの名無しさん
2009/09/18(金) 20:57:46呼び出した側のプロセスの全スレッドがカタカタとラグが起こったように固まってしまいます。
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);
}
0478デフォルトの名無しさん
2009/09/18(金) 21:08:510479デフォルトの名無しさん
2009/09/18(金) 21:22:450480デフォルトの名無しさん
2009/09/18(金) 21:24:42こわいよう
0481デフォルトの名無しさん
2009/09/18(金) 22:10:15別スレッドを作成してループさせても、main関数内でループさせても固まる現象は同じでした。
0482479
2009/09/19(土) 09:24:14OS標準のパフォーマンスログも高負荷時にサンプルできなかったのエラーメッセージ
が出るくらいなので、APIが詰まるのはしかたないような気がするね。
APIの実行が遅れてもいいようにAPIの実行間隔を計測すればいいかもしれない。
プロセス内の他のスレッドに影響出るのはよく分からない
0483デフォルトの名無しさん
2009/09/19(土) 14:37:56って事は、そもそもスレッド優先度云々の問題ではないのですね。
とてもすっきりしました。ありがとうございます。
とにかくコレクトが固まるのはあきらめて、別スレッドに影響でる原因の方を調べてみる事にします。
本当に迷走していたので助かりました。
改めて感謝です。
0484デフォルトの名無しさん
2009/09/19(土) 14:52:31レジストリとかファイルとか
0485デフォルトの名無しさん
2009/09/19(土) 14:55:13float3 v0;
float3 v1 = v0.zyx;
float2 v2 = v0.yz;
こういう風に記述したいんですが、メンバ関数「zyx()」等を作る以外で
何か方法はありませんか?
VisualC++なんですが、MSCコンパイラ依存拡張を使っても問題ないです。
0486デフォルトの名無しさん
2009/09/19(土) 15:02:560487デフォルトの名無しさん
2009/09/19(土) 15:05:05C++ の悪魔が、ふいにこんな変態コードを俺の頭の中に叩き込んできた・・・。
怖いからお前にやる。
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;
0488デフォルトの名無しさん
2009/09/19(土) 15:12:04class 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;
}
0489デフォルトの名無しさん
2009/09/19(土) 15:16:500490デフォルトの名無しさん
2009/09/19(土) 15:20:25ベクトル演算(回転と写像)に見えた。
であれば、自分ならそういう風にオブジェクトを構築するかなぁ。
0491デフォルトの名無しさん
2009/09/19(土) 15:20:49〉 変 〈/ , ' // ̄`>< /// /// _,.=‐|'"´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 | ! ! | )_
0492デフォルトの名無しさん
2009/09/19(土) 15:27:13ベクトルには違いないが単にシェーダーで使えるswizzlingをやりたいだけだろ
0493デフォルトの名無しさん
2009/09/19(土) 15:28:48本当に処理系依存でいいのなら__declspec(property)を使うというのはどうだ。俺は使った事は無いが。
0494デフォルトの名無しさん
2009/09/19(土) 15:38:180495デフォルトの名無しさん
2009/09/19(土) 17:32:52class 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_;
};
0496ぅゅ ◆e6.oHu1j.o
2009/09/19(土) 18:31:55#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バイトだからそうそうズレやしないかと
0497デフォルトの名無しさん
2009/09/19(土) 18:38:09class float2
{
float x;
float y;
};
class float3 :public float2
{
float z;
};
float3 v0;
float3 v1=v0;
float2 v2=v0;
0498デフォルトの名無しさん
2009/09/19(土) 18:40:200499デフォルトの名無しさん
2009/09/19(土) 19:19:41使用しているエディタ(メモ帳、サクラエディタ等)のキャレットの位置に
ポップアップメニューを表示させたいのですが、
キャレット位置の取得の仕方が分かりません。
GetCaretPosという関数がそれに近いようなことをできるのかと思いましたが、
使ってみると、ポップアップメニューが毎回、画面左上に表示されます。
// キャレット位置
POINT pt;
//キャレット位置取得
GetCaretPos(&pt);
環境は
VC++2008 Express Editionです。
どのようにすればよいでしょうか。
よろしくお願いします。
0500デフォルトの名無しさん
2009/09/19(土) 19:29:49Win32API質問箱 Build81
http://pc12.2ch.net/test/read.cgi/tech/1249140049/
0501デフォルトの名無しさん
2009/09/19(土) 19:31:20まずは MSDN を見て、戻り値を見て、まだ何かあれば Windows API スレへどうぞ。
0502デフォルトの名無しさん
2009/09/19(土) 20:06:22float 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;
}
0503デフォルトの名無しさん
2009/09/19(土) 20:09:080504デフォルトの名無しさん
2009/09/19(土) 20:39:29分かりました。
そちらで聞いてみます。
0505デフォルトの名無しさん
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];
となるようなもの。
0506505
2009/09/19(土) 20:54:21int 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]になるってことで。
0507デフォルトの名無しさん
2009/09/19(土) 21:23:040508デフォルトの名無しさん
2009/09/19(土) 21:29:58Macro(),
Macro(),
...
Macro(),
};
// 必要ならば
// #define arraysize (sizeof(array)/sizeof(array[0]))
では何が足りないのか知りたい。
0509505
2009/09/19(土) 21:34:15ですかねぇ。。。
今のところ、
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();
}
こんな感じでどうにか出来ないかと思っているんだが。
0510485
2009/09/19(土) 22:29:35出来ないと思って、駄目もとで聞いてみたんですが
C++標準で出来るんですね。凄いですね。
確認した結果、>>493のMS拡張が最も楽そうですので
まずはこちらから試してみたいと思います。
大変ありがとうございました。
0511デフォルトの名無しさん
2009/09/19(土) 22:41:29特に
> extern struct zyx {} const zyx;
が何を意味したいのがが分かりません。
どなたかご教示ください。
よろしくお願いいたします。
0512デフォルトの名無しさん
2009/09/19(土) 23:10:58テンプレートが実体化されたかどうかの情報は内部から得られない
そしてマクロは自分が展開される所から先の情報を得ることはできない
なので無理と判断した
0513デフォルトの名無しさん
2009/09/19(土) 23:11:02float3 operator ->* (struct zyx const&) で演算子を選択させるための識別子を作ってるんじゃないか?
識別子を増やして、演算子のオーバーロードを増やせばいろいろできるね。
0514デフォルトの名無しさん
2009/09/19(土) 23:33:15あーなるほど。
最適化で消えるっていうアレですか。
ありがとうございます。
0515デフォルトの名無しさん
2009/09/19(土) 23:43:05やりたいことがうまく伝わってない人もいっぱいいるように見えるけどね
zyxだけじゃなくて、yxzとかyzxとかはいらないの?
0516デフォルトの名無しさん
2009/09/20(日) 03:22:42ただし#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;
0517デフォルトの名無しさん
2009/09/20(日) 10:57:090518デフォルトの名無しさん
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, ...);
これで妥協しちゃうなぁ
0519デフォルトの名無しさん
2009/09/20(日) 12:13:40やりたことは下記のとおり。
C言語でIRCに繋ぎ、メッセージを送る。
さっぱり知識不足なため、何をすればいいのかが全く分からない状態です。
で、調べた結果、下のライブラリを見つけたんです。
ttp://sourceforge.jp/projects/sfnet_pircbotcpp/
接続は成功するものの、エンコードの問題なのか
文字列の送受信が出来ないという問題があり困ってます。
0520505
2009/09/20(日) 12:13:55ありがとうございます。
すげぇ。
ご教示の通りに
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++両方でコンパイルが通るようにするにはどうしたらよいでしょうか?
よろしくお願い申し上げます。
0521デフォルトの名無しさん
2009/09/20(日) 14:56:08若い命が真っ赤に燃えて〜
0522デフォルトの名無しさん
2009/09/20(日) 15:34:08516じゃないけど、多分これでいける
× #define CURRENTLINE BOOST_PP_CAT(counter/,__LINE__)
○ #define CURRENTLINE counter/__LINE__
0523505
2009/09/20(日) 15:45:53ありがとうございます。
それでかなりコンパイル成功まで近づきました。
しかしまだ
main.cpp:18: error: 'count' was declared 'extern' and later 'static'
main.cpp:10: error: previous declaration of 'count'
というエラーが出てしまいます。
どうしたものでしょう。。。
0525505
2009/09/20(日) 23:11:10ttp://codepad.org/nySji4dD
ありがとうございます。
おかげさまでg++, VC++共に通るコードが出来ました。
お二方様 感謝いたします。
0526505
2009/09/20(日) 23:22:45現在のところコンパイル時定数でなくても困っていないのですが、
将来的にはコンパイル時定数に出来ないかどうか頑張ってみます。
0527505
2009/09/20(日) 23:46:49ttp://codepad.org/IhxI58eT
テンプレートメタプログラミングで階乗を求める方法をまねして
みたのですが、やはりダメでした。
// M_A_C_R_O();
をコメント解除するとエラーになります。
これは1パスでプリプロセス処理やコンパイル処理が行われる関係上、
当然な話なのですが、やはり無理でした。
>>525のソースが一番良さそうです。
0528デフォルトの名無しさん
2009/09/21(月) 00:31:53ヘッダにでも書いておけばいいんじゃねーかとも思う
0530デフォルトの名無しさん
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_) {}
};
0531デフォルトの名無しさん
2009/09/21(月) 10:00:49clの前に、単語を数えるexeを動かすBATファイル作れよ。
0532デフォルトの名無しさん
2009/09/21(月) 10:01:45>>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
みたいにしろってことじゃない?
だから自動化は出来るよ。
コメントとか文字列リテラルとかプリプロセッサ命令とかのことを考えるとアレだけど。
あとは、自分でプリプロセッサを作るとか。
0533531
2009/09/21(月) 10:07:01一度、展開してやつを数えるBATファイル作れよ。
0534デフォルトの名無しさん
2009/09/21(月) 10:14:560535デフォルトの名無しさん
2009/09/21(月) 10:19:100536デフォルトの名無しさん
2009/09/21(月) 10:20:02クラス名がださい
0537デフォルトの名無しさん
2009/09/21(月) 10:27:11};
>>536これで満足か?
0538デフォルトの名無しさん
2009/09/21(月) 10:33:05> CPoint& operator+( const CPoint& pt )
> {
> CPoint q(this->x_ + pt.x_, this->y_ + pt.y_);
> return q;
> };
ナニコレ
0539デフォルトの名無しさん
2009/09/21(月) 10:33:21>>530だが、拙者もそれには気付かなかった、凄いねおまえ。
0540デフォルトの名無しさん
2009/09/21(月) 10:35:51>>530です、
流石2ちゃんねる、お前年収1000万以上だろ、素晴らしいね(・∀・)ニパ、正解です。
0541デフォルトの名無しさん
2009/09/21(月) 11:43:170542デフォルトの名無しさん
2009/09/21(月) 13:08:57> 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_() {}
0543デフォルトの名無しさん
2009/09/21(月) 13:28:12それって警告が出ないか?
0544デフォルトの名無しさん
2009/09/21(月) 13:49:12作るとしてもexplicitを付けるべきだ
0545デフォルトの名無しさん
2009/09/21(月) 13:58:57効率はともかく、>>530のそれは、自分の中で「引数の省略」というのを使うべき時
の条件に何となく合致しない感覚があるから、俺は素直に分けて書くな
あと>>544にも同意
0546デフォルトの名無しさん
2009/09/21(月) 14:03:11アセンブラのソース見れば効率いいかどうかわかるが
気にするだけ無駄
0547デフォルトの名無しさん
2009/09/21(月) 14:14:12だな。
引数がコンパイル時定数で最適化しつつinline展開するならほぼ同じバイナリになるほうが自然だろうよ。
0548505
2009/09/21(月) 14:19:12あーなるほど、そう言う意味ですか。
確かにそれなら自動化できますね。
>>535
面白そうですね。
すみませんがどういう実装をすれば実現できますでしょうか?
0549デフォルトの名無しさん
2009/09/21(月) 22:00:480550505
2009/09/21(月) 22:45:05いいえ、あんなに高度な言語は分かるように努力する気がしません。。。
ただの趣味グラマでございます。
そのため>>529の様な、本職の方々からすればのんきなことを申しております。
0551デフォルトの名無しさん
2009/09/22(火) 00:07:13趣味プログラマでそのレベルまで出来るもんなんだね。
俺は
趣味プログラマ=Hello Worldに毛の生えたようなもの
だとしか思ってなかったわ。
0552デフォルトの名無しさん
2009/09/22(火) 00:55:56つい最近趣味グラマから転職で本職にはなったけど
C++とQtで一通りGUIは扱えるし、Linux鯖云々も扱える
WinAPIは手を出したけど気持ち悪さから手を引いた
Cオンリーの超閉鎖的な組込みに入ったから、
持ってるもののほとんどはニアミスすらしないけど
0553デフォルトの名無しさん
2009/09/22(火) 01:08:15それで天狗になって業務の基礎知識を得ようとしない人も結構いるから、そうならなければ大事な戦力。
0554デフォルトの名無しさん
2009/09/22(火) 01:15:33そうでも、C++ を使い込んでいれば、Cで組んでも発想の引き出しが多いと思うよ。
あと、Linux でスクリプトとかも使ってれば QA のテストとかにも便利だし。
0555デフォルトの名無しさん
2009/09/22(火) 02:01:46うん、気をつけるよ
もともと一番弱い部分(HW)を得るためにってのもあって、
組込みに行ったんだし
0556デフォルトの名無しさん
2009/09/22(火) 02:29:13自分に無い能力を素直に認めて吸収するならどうにでも伸びるんだけど、例えば
C++で高度に抽象化したコードを見ると「現場の役には立たねぇ」とか逃げる奴も
いれば、逆に敢えてプリミティブに書かれたコードを見て「抽象化を進めないと
話にならない」と思いこむ奴もいて、そういうのはどっちも問題があるなぁとか
0557デフォルトの名無しさん
2009/09/22(火) 03:51:390558デフォルトの名無しさん
2009/09/22(火) 04:07:43原発で潤ってる某財閥の冠しょってる子会社に
ただ、情報系卒ってだけで採用された
職業訓練校通ってた同期で、
変数の宣言すら知らなかった
もちろんprintfなんて扱えるわけもなく
つーか、隣の人の丸写しすらできないほど
0559デフォルトの名無しさん
2009/09/22(火) 04:41:080560デフォルトの名無しさん
2009/09/22(火) 04:49:210561デフォルトの名無しさん
2009/09/22(火) 11:11:33C++は3ヶ月でマスターするにはかなり一生懸命勉強する必要があるぞ。
0562デフォルトの名無しさん
2009/09/22(火) 11:13:31マスターってどのくらいの程度を言うのか知らんが・・・
> ○○言語で○○らしいプログラミングができる
を目標とするならそのくらいだろうな。
0563デフォルトの名無しさん
2009/09/22(火) 11:38:23そういう会社がすごく沢山あるよね
0564デフォルトの名無しさん
2009/09/22(火) 14:12:01Comeauが完全サポートに一番近いんだろうけど。
そんな中、C++0xの規格をさらに定めたりしているんだが、
本当に理論上可能で矛盾がない規格であることは確かめられているの?
つまり理論上は実現可能であることは分かっているものなの?
(例:テンプレートメタプログラミングはチューリング完全である
よってチューリング機械が実現できることは
何だろうと(理論上は)テンプレートメタプログラミングでも出来る)
0565デフォルトの名無しさん
2009/09/22(火) 14:15:29こういう人って論文の査読が通っても信じなさそう。
統合失調症?
0566デフォルトの名無しさん
2009/09/22(火) 14:32:41>>564 みたいな人は Lisp とかの方が良いと思う。
0567デフォルトの名無しさん
2009/09/22(火) 14:36:16間違いは直せばいい。
0568デフォルトの名無しさん
2009/09/22(火) 14:38:350569564
2009/09/22(火) 14:42:04俺はC++大好きなんだが、
勝手にC++標準化委員会がC++0xで規格を追加したりして、
コンパイラベンダーは大変だなあと言いたかっただけだ。
本当に実現可能な規格じゃなかった(つまり内部に矛盾がある規格)としたら
コンパイラベンダーの標準準拠にかける努力はどうしてくれるのかと。
0570564
2009/09/22(火) 14:43:37ごめん何が言いたいのかわからん。
無視していい?
>>567
> 矛盾があってもなにか実害が?
そりゃさすがに実害ありまくりだろw
> 間違いは直せばいい。
ここは賛成。
0571デフォルトの名無しさん
2009/09/22(火) 14:46:080572デフォルトの名無しさん
2009/09/22(火) 15:01:41じゃあ彼らも覚悟の上で仕様を決めているということか。
コンパイラ作る人ってすげーなー
0573デフォルトの名無しさん
2009/09/22(火) 17:29:05常人がC++コンパイラを作ろうとすると、あまりの泥沼ぶりにC++の粘着批判を始めて
うざい人になったりする
0574デフォルトの名無しさん
2009/09/22(火) 17:38:54VC++2003。#includeするヘッダファイルと
ソリューションエクスプローラーで追加してやるヘッダファイルが違ってた。
それぞれのヘッダファイルはほぼ同じ内容。片方がテンプレ的存在。
それに気づかないままコンパイルするも
プログラム終了時にafter normal block(#47)を吐く。
ヘッダファイルに書かれたクラスをnewするとエラーを吐いて
newしなかったらエラーを吐かないという意味不明なエラー。
deleteしてもしなくても関係ないし、名前空間の問題でもなさそう。
ポインタ回りかと思って"64ビットへの対応"をきったらエラーを吐かなくなった。
最終的には上述の理由に気づいて正しくコーディングできたが
なんかよく分からんエラーが出たなぁ。
0575デフォルトの名無しさん
2009/09/22(火) 18:13:220576デフォルトの名無しさん
2009/09/22(火) 18:48:420577デフォルトの名無しさん
2009/09/22(火) 18:49:220578デフォルトの名無しさん
2009/09/22(火) 19:12:360579デフォルトの名無しさん
2009/09/22(火) 19:16:310580デフォルトの名無しさん
2009/09/22(火) 19:18:290581デフォルトの名無しさん
2009/09/22(火) 19:30:250582デフォルトの名無しさん
2009/09/22(火) 19:34:210583デフォルトの名無しさん
2009/09/22(火) 19:37:49ポインタなんかスマートポインタにパックしてしまえばまったく気にならなくなるし。リーク?なにそれ?
STLを使えば配列?なにそれ?状態だし。
参照使えば0オーバーヘッドで且つ安全だし。
0584デフォルトの名無しさん
2009/09/22(火) 20:42:20速度?
そんなもん、すぐに解決だろw
かつてはCでさえ遅かった。
0585デフォルトの名無しさん
2009/09/22(火) 20:53:29クロスプラットフォームな
ファイルシステムライブラリはありませんか?
opendirを使いたいのですが、日本語(UNICODE)対応で
困っています。
boost::filesystemは使い方が大きく変わってしまうので、
opendirと似たインターフェースがいいなぁ。
0586デフォルトの名無しさん
2009/09/22(火) 21:08:390587デフォルトの名無しさん
2009/09/22(火) 21:16:10レスありがとうございます。
ただ、ファイル扱うだけに、GUIフレームワークとは
ちょっと大きすぎますね・・・。
(簡単に)部分取りできるのだろうか?
できれば、ファイルシステム関係のみの
ライブラリがあるといいんですが。
(現在ちょこちょこ作っていたりはする)
0588デフォルトの名無しさん
2009/09/22(火) 21:18:220589デフォルトの名無しさん
2009/09/22(火) 21:31:04ざっと見たところ、opendirと似ているような、似ていないような?
これって文字コードは何で指定/取得するのだろう?
たとえばfopen相当の関数で開くときのパスとか、
readdir相当の関数で取得されるパスとか、
全部UTF-8で統一されているのかな?だといいなぁ。
0590デフォルトの名無しさん
2009/09/22(火) 21:44:46Dは弱虫
0591デフォルトの名無しさん
2009/09/22(火) 21:46:040592デフォルトの名無しさん
2009/09/22(火) 21:46:56互換部分は俺は結構使うな。既存のライブラリとインタフェースするから。
よく使う時は wrapper 的に書くけど。既存のライブラリを使えるのがC++ の強み。
あと、互換部分は基本的に使わないけど I/O だけ使う(printf,scanf)という
人もよく見る。C に慣れてる人にはしっかりフォーマットするには楽だからね。
0593デフォルトの名無しさん
2009/09/22(火) 21:51:020594デフォルトの名無しさん
2009/09/22(火) 22:46:44std::coutでそれを出力しろって言ってるのと変わらんだろう。
0595デフォルトの名無しさん
2009/09/22(火) 22:48:140596デフォルトの名無しさん
2009/09/22(火) 22:53:51glibmm とか
0597デフォルトの名無しさん
2009/09/23(水) 00:35:220598デフォルトの名無しさん
2009/09/23(水) 01:14:40計算だけなら GUI 無しとかスクリプトで組むとかなら楽では。
0599デフォルトの名無しさん
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
0600デフォルトの名無しさん
2009/09/23(水) 01:21:10マクロをこんな風に使うことはできませんか?
boostを利用してもOKなので、どうにかできませんでしょうか?
よろしくお願いします。
0601デフォルトの名無しさん
2009/09/23(水) 01:24:170602デフォルトの名無しさん
2009/09/23(水) 11:25:40やっぱり処理系依存ですか。
ありがとうございます。
0603デフォルトの名無しさん
2009/09/23(水) 11:37:19処理系依存ではないでしょ。
独自機能を使えばできるって言ってるだけ。
#define TEMP 1
#define MYVAL TEMP+1
#undef TEMP
#define RET MYVAL
RET は MYVAL に展開されて、MYVAL は TEMP + 1 に展開されるが、
この時の、TEMPはundefしちゃってるからエラーってところかな。
0605デフォルトの名無しさん
2009/09/23(水) 12:10:180606デフォルトの名無しさん
2009/09/23(水) 14:05:440607デフォルトの名無しさん
2009/09/23(水) 14:29:31処理系に依存しないと出来ないのですか。
じゃないの?
0608デフォルトの名無しさん
2009/09/23(水) 14:39:490609602
2009/09/23(水) 14:52:59理解致しました。
0610デフォルトの名無しさん
2009/09/23(水) 15:59:33コンパイラの名前とその機能の使用例を教えみて。
0611デフォルトの名無しさん
2009/09/23(水) 15:59:33これら4つは全て標準C++では認められますでしょうか?
それとも必ず#は行頭にないとならないと言ったルールがあったりしますか?
0612デフォルトの名無しさん
2009/09/23(水) 16:27:260613デフォルトの名無しさん
2009/09/23(水) 16:47:11そうだったんですか。
ありがとうございます。
初めて知りました。。。
0614デフォルトの名無しさん
2009/09/23(水) 16:59:47The 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なような気もするが。。
0615612
2009/09/23(水) 17:05:39全部OKに思えてきました。
Boostでもそうなっているあたり、
やはりどれもOKなのでしょうね。
>>614
ありがとうございます。
0616デフォルトの名無しさん
2009/09/23(水) 17:07:18どれでもいい。 >>614 の挙げているとおり。
0617615
2009/09/23(水) 17:11:39ミスです。お詫び申し上げます。
>>616
ありがとうございます。
私も該当箇所を読んできました。
0618デフォルトの名無しさん
2009/09/24(木) 07:17:47C言語の FILE をラップしたようなクラスで
fclose がエラーを返した場合、例外を投げるとすると
もう一度クローズ処理が出来る用にしないといけないのでしょうか?
その場合、C言語の fclose は1度目の呼び出しで失敗した場合も
エラーを返してファイルをクローズしてしまうため、再びクローズを試みることが
出来ないのだけど、どうすればいいんでしょうか?
0619デフォルトの名無しさん
2009/09/24(木) 09:41:23「再びクローズ」ができないとわかっているなら、最初の質問が意味無いね。
0620デフォルトの名無しさん
2009/09/24(木) 13:06:25?
0621デフォルトの名無しさん
2009/09/24(木) 13:08:340622デフォルトの名無しさん
2009/09/24(木) 16:37:050623デフォルトの名無しさん
2009/09/24(木) 20:14:58ちゃんとファイルを書き込めてると思ってアプリを終了したら、後でユーザーが泣くぞ。
エラー通知されてればユーザーには別のファイルに保存するとかそういう選択も可能になるんだから。
0624デフォルトの名無しさん
2009/09/24(木) 20:16:26> 例外を投げるときは、オブジェクトの状態を元に戻すって教わったのですが
この一行目から既に意味が曖昧すぐる
0625デフォルトの名無しさん
2009/09/24(木) 21:57:17例外を発生しないなら戻り値による成否の通知が必要だが
ここは例外発生が前提だから。
0626デフォルトの名無しさん
2009/09/25(金) 00:13:16#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;
}
なぜイテレーターのほうがエラーになるのでしょうか?
0627デフォルトの名無しさん
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/
0628デフォルトの名無しさん
2009/09/25(金) 01:20:040629デフォルトの名無しさん
2009/09/25(金) 08:00:38コンストラクタから例外がでたときはキャッチすることができないん
ですよね。
皆さんどうしてますか?
staticメンバには組み込み型か、自作クラスでコンストラクタがthrow()
なものしか使わないとか。
0630デフォルトの名無しさん
2009/09/25(金) 08:34:450631デフォルトの名無しさん
2009/09/25(金) 08:47:01それは都市伝説だ
0632デフォルトの名無しさん
2009/09/25(金) 09:10:01オブジェクトの状態を元に戻すってのは
例外投げるなら、結果的に何もしなかった状態になってろってってことであって、
再びfcloseで閉じられる様にするってのはちょっとズレてる。
ファイルの例なら、例外が発生しても開いたファイルは何も変更されて無い状態を保証する。
で、そんな保証が出来るとは限らないから
そういうときは、変更しようとしてるデータが生きてることまでは保証して
>>623の言うような、なんかエラー通知して、他の手段を提供するとか。
まあEffective C++嫁
0633デフォルトの名無しさん
2009/09/25(金) 09:10:13別に、なんとも。実際に例外が発生すると terminate() するんだけど、当然だと思うし。
例外投げない保証があるオブジェクトじゃなくても、ヒープからメモリ確保する奴も
プログラム起動時に走るんなら問題ないだろうね。
0634デフォルトの名無しさん
2009/09/25(金) 09:28:09> クラス型のstaticなメンバ変数を使う場合ですけど、そのクラスの
この条件なら正しいだろ。
0635デフォルトの名無しさん
2009/09/25(金) 09:31:00それが妥当ですかね。私もそれを採用してます。
>>631
staticメンバだってとこ見落としてる?
>>633
terminate()は避けたいですわ。
例外はアプリで全てキャッチしたい。
0636633
2009/09/25(金) 10:00:32terminate() を避けたいなら、実際に例外が発生しないようにすればいいわけで、
>629 みたいに型の段階で絞る必要はないってこと。
プログラム起動時なんだから、たとえば bad_alloc が出るかどうかなら一回試せば
結果はすぐわかるし、ファイルの有無とか外部要因によって例外が出たり出なかったり
するんなら >630 だろうし。
0637633
2009/09/25(金) 10:09:32ごめん。これは環境に依存するね。
OS 無しのスタンドアロンでヒープサイズ固定な環境でしか通用しない話だった。
0638デフォルトの名無しさん
2009/09/25(金) 10:47:22struct 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 ->* に、何かすごい可能性を感じた。
たぶん気のせいなんだろうけど。
0639デフォルトの名無しさん
2009/09/25(金) 11:19:01init()で初期化してるなぁ。
つーかinit()で初期化するのって結構よく使われてるよね。Googleとかもそうじゃ
なかったっけ。GoogleのC++コーディング規約あんまり好きじゃないけど。
0640デフォルトの名無しさん
2009/09/25(金) 11:24:10> つーかinit()で初期化するのって結構よく使われてるよね。
めんどくさいから、そんなことしないほうがいいだろ。
そんなの付いてるのは古いクラスライブラリだけだよ。
0641デフォルトの名無しさん
2009/09/25(金) 11:29:180642デフォルトの名無しさん
2009/09/25(金) 11:53:050643デフォルトの名無しさん
2009/09/25(金) 11:55:22初期化コードは必ず全部をコンストラクタに突っ込まなきゃいけない、という話じゃない
ってだけ
つーか静的領域とコンストラクタに関連する問題を理解してるんだろうか
0644デフォルトの名無しさん
2009/09/25(金) 11:59:51それをpublicに置いて自由にアクセスできるようにするのはあんまりやらんなぁ。
0645デフォルトの名無しさん
2009/09/25(金) 12:02:14勝手にterminate()していいよ、なんてのは論外として。
0646642
2009/09/25(金) 12:08:58まあ確かにどうしても初期化に失敗する可能性のあるクラスを
かかなきゃいけないことはあるしなぁ。
コンストラクタから例外を投げたいところだが
静的記憶に置きたいならもうどうしようって感じだよね。
0647デフォルトの名無しさん
2009/09/25(金) 12:12:31ポインタ置いといて new とか、ローカルな static インスタンスへの参照を返す関数とか。
そもそも静的記憶に置くこと自体が一般的にはマイナーな使い方だし、こういった
回避方法もあるので、それだけで二段階初期化の根拠になるような問題ではない。
少なくとも、二段階初期化はやむをえない事情がある場合に限って使うべきもので
あって、変な理屈で「よく使われている」なんて話にされると迷惑。
0648デフォルトの名無しさん
2009/09/25(金) 12:14:11ttp://www.henshi.net/k/hiki.cgi?GoogleCppStyleGuide#l20
コンストラクタはこのスタイルでいいと思う。
コピーコンストラクタの禁止に関してはboost::noncopyableの方が好きだけど。
0649デフォルトの名無しさん
2009/09/25(金) 12:15:13Googleとは真逆の意見すね。
まぁ、どっちが優れてるかは分からんけど。
0650デフォルトの名無しさん
2009/09/25(金) 12:21:00compressed_pairさんが採用されてるw
0651デフォルトの名無しさん
2009/09/25(金) 12:31:02Google のやつは前提として例外を禁止しているからそうなってるんだよ。
例外が使える環境で Google のそれに倣う必要はない。
0652デフォルトの名無しさん
2009/09/25(金) 12:32:39スレッドセーフにする為にstaticなmutexを置いたりする必要がありますよね。
mutexのコンストラクタが例外出さないなんて保障あんのかよと思いつつ面倒なんで黙って置いたりしてます。
これに触れてくれているの見たことないんですけど、どんなもんでしょうか?
まあ、mutexのコンストラクタで例外なんて99.9999%ないんですけどね。
0653デフォルトの名無しさん
2009/09/25(金) 12:32:420654デフォルトの名無しさん
2009/09/25(金) 12:36:10シングルトンは正直、余計な面倒が多すぎてアンチパターンになりつつあるような。
Google式に初期化を分離してグローバルインスタンスにでもした方が綺麗に収まると思う。
0655デフォルトの名無しさん
2009/09/25(金) 12:40:54これ以上続けても宗教論争になるだけだし。
というか>>635で既に質問者の選択はされてるし。
0656デフォルトの名無しさん
2009/09/25(金) 12:48:03正直 C++ でシングルトンとか使ってるの見るとアホかと思うが。
少なくとも pthread_mutex なら問題なく静的初期化できるし、他の環境でも失敗するような
理由が思い当たらないから、気にしなくていいだろ。
どうせ「気にしろ」って言っても何もしないんだろうしな。
http://www.boost.org/doc/html/thread/synchronization.html#thread.synchronization.once
0657デフォルトの名無しさん
2009/09/25(金) 13:21:31operator<<をstd名前空間に入れる。
stdにある既存のoperator<<にglobalなoperator<<が隠される、というのが理由らしい。
規格的には知らん。
0658デフォルトの名無しさん
2009/09/25(金) 13:31:49おっとそいつは undefined behavior だぜ。
0659デフォルトの名無しさん
2009/09/25(金) 13:33:45std名前空間にはいかなる物も追加してはならない。
ただテンプレートの完全な特殊化のみ例外的に認められている。
・・・っと、あれ?クラステンプレートの部分特殊化もOKだっけか?
(関数テンプレートの部分特殊化はC++自体が当然不可能として。)
0660デフォルトの名無しさん
2009/09/25(金) 13:34:550661デフォルトの名無しさん
2009/09/25(金) 13:38:02どうにかしてほしい
0662デフォルトの名無しさん
2009/09/25(金) 13:42:53C++の規格には矛盾はないのか?
という話題が出ていたけど
C++ Standard Core Language Defect Reports
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#197
矛盾なのか単なるミスなのか知らないが、
フツーにあったっぽいな。
修正されているけど。
>>661
そうか?やっぱり便利だよ。
もし無かったらどうすんのさ。
0663デフォルトの名無しさん
2009/09/25(金) 13:56:24確かに
C++98 標準では、ユーザ定義型に対しては std::swap の
完全特殊化のみ std 名前空間に定義することを認めている。
部分特殊化や、関数オーバーロードは認められていない。
だそうだけど、 std 名前空間におけるクラステンプレートは
部分特殊化もOKだったと思う。
うん、何となく。
詳しくは有識者を待とう。
0664デフォルトの名無しさん
2009/09/25(金) 18:30:37http://ml.tietew.jp/cppll/cppll/article/12484
0665デフォルトの名無しさん
2009/09/25(金) 18:43:330666デフォルトの名無しさん
2009/09/25(金) 18:45:37stdは使いまくってるけど^p^
0667デフォルトの名無しさん
2009/09/25(金) 18:46:270668デフォルトの名無しさん
2009/09/25(金) 19:25:52俺がいまやってるプロジェクトでは名前空間名だけで30文字
以上になるような規約を押し付けられてる。
テンプレートをネストさせたりするともう基地外状態。
0669デフォルトの名無しさん
2009/09/25(金) 19:36:38何のエラーも吐かず通るBCCが気持ち悪い・・・
0670デフォルトの名無しさん
2009/09/25(金) 19:38:34○>>626
BCCはとことん糞だなあ
C++の勉強をするには不向きだ・・・
0671デフォルトの名無しさん
2009/09/25(金) 19:55:20RTTIが禁止ってポリモーフィズムを使わないってこと?
なんか汎用性が低そうなモノが出来そうな気がするんだけど。
0672デフォルトの名無しさん
2009/09/25(金) 20:01:130673デフォルトの名無しさん
2009/09/25(金) 20:21:34「C++ template metaprogramming」と「C++ templates」はどっちが読み易い英語ですか?
(主観でいいです)
0674デフォルトの名無しさん
2009/09/25(金) 20:29:23両方読め。
0675デフォルトの名無しさん
2009/09/25(金) 20:36:10明示的には書かないけど、アップキャストもdynamic_castじゃないの?
0676デフォルトの名無しさん
2009/09/25(金) 20:40:07初期化時に自分のポインタをよそに渡したいというときがあるけど、
構築が完了するまでそのポインタは使い物にならないから
構築が完了したあとに初期化関数でポインタをよそに渡すという仕組みにすることはある
特に別スレッドにポインタが漏れる恐れがあるときはちゃんとやらないと死ねる
0677デフォルトの名無しさん
2009/09/25(金) 20:54:52相互に参照しあう関係って非常にだるい
0678デフォルトの名無しさん
2009/09/25(金) 20:56:42それはあんたの設計がヘタクソなだけだろう。
0679デフォルトの名無しさん
2009/09/25(金) 20:57:38「参照」を「依存」に置き換えるとなんだか意味深♪
0680デフォルトの名無しさん
2009/09/25(金) 21:22:160681デフォルトの名無しさん
2009/09/25(金) 21:25:00昔はデフォルトコンストラクタ、デフォルトコピーコンストラクタ、デフォルト代入演算子が
副作用起こしまくりで閉口したもんだ。
でも今はRAIIを徹底してデフォルト〜を期待して書いている。
早い話がデフォルトコンストラクタを持つクラスのみをメンバ変数にすればデフォルトコンストラクタが自動生成されるし、
デフォルトコンストラクタを持たないクラスをメンバ変数にすればデフォルトコンストラクタが作成できなくなる。
他のデフォルト〜も同様だね。
例えばコピーできないファイルハンドルはboost::nocopyableをつけてクラス化したメンバ変数を作っておけばコンパイラがデフォルトコピーコンストラクタをエラーにしてくれる。
共有できるポインタはboost::shared_ptrでメンバ変数を作ればコンパイラがデフォルトコピーコンストラクタを作ってくれるし、
共有できないポインタはboost::scoped_ptrでメンバ変数を作ればコンパイラがデフォルトコピーコンストラクタをエラーにしてくれる。
デフォルト〜を利用しようぜ。
0682デフォルトの名無しさん
2009/09/25(金) 21:57:24アップキャストはRAII使わないよ。static_castの範疇。
0683デフォルトの名無しさん
2009/09/25(金) 21:57:250684デフォルトの名無しさん
2009/09/25(金) 22:08:51暗黙的型キャストに限定されたboost::implicit_castもある。間違ってダウンキャストを行おうとするとエラーになる。
0685デフォルトの名無しさん
2009/09/25(金) 22:19:34確かに相互参照はマジでろくな事にならない。設計を見直して相互参照はなくすべき。
どうしても相互参照が必要な場合があるとすればObserverパターン位だと思う。そんなときはsignal/slotを使うことで明確化させる。
0686デフォルトの名無しさん
2009/09/25(金) 22:35:52「わかってるねん わかってるねんで? バカにしたあかん
dynamic_cast が RAII ・・・それがごっちゃに・・・・」
0687デフォルトの名無しさん
2009/09/26(土) 02:21:160688デフォルトの名無しさん
2009/09/26(土) 03:01:31vtblとvptr勉強すれ
0689デフォルトの名無しさん
2009/09/26(土) 03:02:380690デフォルトの名無しさん
2009/09/26(土) 10:35:15NPCがプレイヤーやほかのNPC(たとえば一番距離が近い)を追跡するアルゴリズムとか
メディエーターに問い合わせないとプレイヤーの位置とかどれが一番近いかとかわからないじゃん
0691デフォルトの名無しさん
2009/09/26(土) 11:40:09相互参照が必要な場面があることと、相互参照がだるいということは両立するから特に問題ないと思うよ。
0692デフォルトの名無しさん
2009/09/26(土) 13:22:500693デフォルトの名無しさん
2009/09/26(土) 17:07:53foo関数を以下のように定義することを考えます。
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はインライン化されるかどうかを除いては同じと考えて宜しいでしょうか?
よろしくお願い申し上げます。
0694デフォルトの名無しさん
2009/09/26(土) 17:27:311 と 3 はリンケージが違う。 1 は内部リンケージで 3 は外部リンケージ。
ヘッダファイルで定義した場合、 1 だとコンパイル単位ごとに別物になるが、
3 ならすべてのコンパイル単位で同じ物となる。
2 と 1 はインライン化される(されやすい)かどうかを除けば同じことになる。
2 と 3 は、 1 と 3 と同様にリンケージが違う。
質問とは関係なさそうだけど、「グローバル名前空間に foo 」といえば ::foo のことに
なってしまうと思う。
0696デフォルトの名無しさん
2009/09/26(土) 19:47:09staticの使い方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になるかどうかはコンパイラによってうんぬんはおいといてください。)
よろしくお願い申し上げます。
0697デフォルトの名無しさん
2009/09/26(土) 20:06:57Cは必修科目で一度やったからなのですが私はお情けで通してもらったようなものでCの知識がほとんどありません。
このスレのテンプレにあるような解説サイト読めばCの知識無しでも理解できますか?
今はスタック関数を動的にしてポインタでなんたら〜って問題で詰まってる感じです。
1回目にでた課題に10時間かけて半分も終わらない程度の能力なので
宿題をやってもらうスレに投下すると今後が思いやられるのでなんとか自分で理解したいのですが。
0698デフォルトの名無しさん
2009/09/26(土) 20:11:35C言語のすべてがわかります。すべてです。
0699デフォルトの名無しさん
2009/09/26(土) 20:15:07それでいい。最初に現れた宣言と矛盾の無い宣言を繰り返すのであれば問題ない。
0700デフォルトの名無しさん
2009/09/26(土) 20:17:43K&R2 の読書会はどこぞでやってませんか。後ろ1/3 が全然理解できません。
付録Aとか。
いや、付録Bは異様に参照しています。
0701デフォルトの名無しさん
2009/09/26(土) 20:30:48それ初心者には向いてないって意見もあるんだけど実際のところどうなの?
0702デフォルトの名無しさん
2009/09/26(土) 20:32:02意味や動作上は問題ないんだけど、単純に分けて書くのは面倒だし、
離れた宣言の間で inline 関数を呼び出したときにはインライン展開が
起こりにくいなどのコンパイラ実装上の問題も考えられるので、
宜しくないと言えるかもしれない。
定義ひとつで済ませるのがおすすめ。
0704659
2009/09/26(土) 20:51:33言及しているC++の仕様書の項目を教えていただけますでしょうか?
またはそれをコピペして示していただけますでしょうか?
なお、英語でOKです。
0705デフォルトの名無しさん
2009/09/26(土) 20:56:230706デフォルトの名無しさん
2009/09/26(土) 21:34:28お情けでC++の単位ももらえばいいんじゃないかィ
なにCの単位をお情けで取れたお前ならできる
お前はやればできる子だって俺はわかってるからよ
0707デフォルトの名無しさん
2009/09/26(土) 21:44:39誰もが通る試練だ。あきらめずに続ければ物になるものだ。あきらめたらそこで終わりだぞ。
0709704
2009/09/26(土) 22:50:27おかげさまでIt is undefined for a …(ryのくだりが見つかり、そこから
std名前空間にテンプレートの特殊化を追加する - Cry’s Diary
ttp://d.hatena.ne.jp/Cryolite/01000227
ここを探し当てました。
ありがとうございました。
0710デフォルトの名無しさん
2009/09/26(土) 23:20:450711デフォルトの名無しさん
2009/09/26(土) 23:41:560712デフォルトの名無しさん
2009/09/26(土) 23:49:290713デフォルトの名無しさん
2009/09/27(日) 00:00:29ありがとうございました。
0714デフォルトの名無しさん
2009/09/27(日) 00:07:51文字コードがS-JISのソースで
"能"が文字化けしてしまいます。
"能\"とすれば文字化けは解決しますが、
今度はVC++で困ります。
VC++では"能"で文字なく"能\"で問題が出ます。
これらg++とVC++で同時にこの問題を解決する方法は無いでしょうか。
0715デフォルトの名無しさん
2009/09/27(日) 00:17:150716デフォルトの名無しさん
2009/09/27(日) 00:24:050717デフォルトの名無しさん
2009/09/27(日) 00:27:27--input-charset=cp932 --exec-charset=cp932
0718デフォルトの名無しさん
2009/09/27(日) 00:29:460719デフォルトの名無しさん
2009/09/27(日) 00:31:400720714
2009/09/27(日) 00:47:07やはりUTF8等といったユニコードが必要なようですね。
しかし今までSJISの財産(負債とも言う)がたまっていまして、今更UNICODEにするわけにも行かないんです。
>>717
コンパイルオプションで指定できるのですね。
ありがとうございます。
0721デフォルトの名無しさん
2009/09/27(日) 01:38:35#ifdef __GNUC__
何かする
#else
同じようなことする
#endif
みたいな手もある。
コードに一切触るなとなると無理だけど、使える範囲は広い。
0722デフォルトの名無しさん
2009/09/27(日) 06:46:15SJISで動作するやつはそのままでいい。
SJIS UTF8はコンパイラ文字をが認識するとき以外には影響ないだろう。
0723720
2009/09/27(日) 10:41:37ありがとうございます。
しかしそれですと将来的にコンパイラが変わったら
またメンテナンスしなければならなくなりそうで
ちょっと気が引けています。
>>722
そうですね。。。問題の起こるヤツだけUTF-8にすれば良いわけですか。
なるほど。
0724デフォルトの名無しさん
2009/09/27(日) 11:04:16ファイルがなかったら、ファイルスコープの概念はなりたたない。
0725デフォルトの名無しさん
2009/09/27(日) 11:10:230726デフォルトの名無しさん
2009/09/27(日) 11:18:46http://unkar.jp/read/pc11.2ch.net/tech/1200044614#l544
> 557 :デフォルトの名無しさん[sage]:2008/02/16(土) 13:40:57
> 「ファイルスコープ」は C の規格で翻訳単位全体にわたるスコープとして使われてたけど、
> C++ の規格では使われなくなってる(引用略)
0727デフォルトの名無しさん
2009/09/27(日) 11:26:00でもファイル有効範囲という言葉はあった気がする
0728デフォルトの名無しさん
2009/09/27(日) 11:28:00無いよ。
C の「ファイルスコープ」にあたるのは C++ では「グローバル名前空間スコープ」という。
0729デフォルトの名無しさん
2009/09/27(日) 12:04:55C++0xではもっと現実の実装へ歩み寄って欲しいなあ。
0730デフォルトの名無しさん
2009/09/27(日) 12:06:030731デフォルトの名無しさん
2009/09/27(日) 12:07:53名前空間スコープでの static 指定で変わるのはリンケージ。スコープじゃない。
> C++0xではもっと現実の実装へ歩み寄って欲しいなあ。
何が不満なの?
0732729
2009/09/27(日) 12:17:59> 名前空間スコープでの static 指定で変わるのはリンケージ。スコープじゃない。
そういやそんな会話が上で交わされていたような気がするな。
> > C++0xではもっと現実の実装へ歩み寄って欲しいなあ。
> 何が不満なの?
インクルードパスを指定する方法とかが環境依存。
ディレクトリの区切りが/か\かとか。
一応ディレクトリが存在しない環境への配慮…(ryとかあるんだろうけどさ。
あとはexport。
0733デフォルトの名無しさん
2009/09/27(日) 12:42:22> インクルードパスを指定する方法とかが環境依存。
最悪、ソースファイルに書かれたとおりで正しいファイルが選ばれるように
コンパイルオプションを調整すればいいわけで、あんまり問題だとは思わない。
そういった調整が可能なようにある程度ソースファイルを書く側で気をつけておく
ことになるんだけど、正直もう慣れたんであんまり問題だとは感じない。
boost レベルの汎用ライブラリが十分な移植性を持っていることを考えてもね。
> ディレクトリの区切りが/か\かとか。
#include で指定するパスに \ を含んでいると未定義動作になる。
単純に / で統一すれば良い。
> あとはexport。
これは確かに問題だと思う。
DR にもあった。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#820
0734デフォルトの名無しさん
2009/09/27(日) 12:46:27環境依存のゴタゴタを避けたきゃJavaかC#に移行するって手も
そこまでするほどでもないならそれまでで
正直.netの文字列周りはうらやましいと思う
0735デフォルトの名無しさん
2009/09/27(日) 13:15:40boostでイナフ
0736デフォルトの名無しさん
2009/09/27(日) 13:20:12思う思わないの議論をし始めると不毛だから避けるとしよう。
俺だって全部/に統一しているしBoostも非常に便利に使わせてもらっているけど、
それとは別に仕様がはっきりと定めて欲しいなぁと「思った」だけのこと。
exportもまあ無くても慣れたけど
どうせC++0xという大改革をするなら
もうちょっとどうにかしてほしかった。
まあいいや
どうもありがとうね。
0737デフォルトの名無しさん
2009/09/27(日) 16:30:570738デフォルトの名無しさん
2009/09/27(日) 17:01:550739デフォルトの名無しさん
2009/09/27(日) 17:12:57まぁネタだろうけど。
れっきとした C++ です。サポートしてる処理系が Comeau C++ ぐらいしかないけどな!
>736
>exportもまあ無くても慣れたけど
>どうせC++0xという大改革をするなら
>もうちょっとどうにかしてほしかった。
C++0x としては何かするにしても deprecated 扱いにするとか削る方向しかないような気がする。
将来的にはパスあたりも含めて Modules in C++ TR で提案されるんだろうけど。
0740デフォルトの名無しさん
2009/09/27(日) 18:08:48いや、素でそんなコンパイラは知らなかった。
ググってきたけど、プリコンパイルドヘッダみたいなもんか。まあ、あれば
便利だなとは思う。
0741デフォルトの名無しさん
2009/09/27(日) 20:25:330742デフォルトの名無しさん
2009/09/27(日) 21:24:180743デフォルトの名無しさん
2009/09/27(日) 21:56:390744デフォルトの名無しさん
2009/09/27(日) 22:46:14英語だけど
Comeau C/C++ - Wikipedia, the free encyclopedia
ttp://en.wikipedia.org/wiki/Comeau_C/C%2B%2B
ここが分かりやすい。
0745デフォルトの名無しさん
2009/09/27(日) 23:40:08string型の何文字目が○○か?
みたいな関数ってある?
もしくはint型の何桁目は何の数字か?とか
0746デフォルトの名無しさん
2009/09/27(日) 23:42:57何がしたいの?
書いてあるとおりだとしたら、普通に書くだけじゃ何か不満なの?
0747デフォルトの名無しさん
2009/09/28(月) 00:00:28ゲーム作り。二次元配列用意してマップ座標[0.0]番目の上に何が乗っているか?耐久力はどれくらいか?って事をやりたい
一桁目がそのマップにいる敵の種類二桁目がhpで・・とか。おかしい?
まじで手探り状態。多分こんな理屈じゃよくないんだとと思う
0748デフォルトの名無しさん
2009/09/28(月) 00:04:300749デフォルトの名無しさん
2009/09/28(月) 00:08:03構造体はわかるけどクラスはいまいち知らん
勉強してきます
0750デフォルトの名無しさん
2009/09/28(月) 00:08:040751デフォルトの名無しさん
2009/09/28(月) 00:12:28> 構造体はわかるけどクラスはいまいち知らん
それ致命的だろ。
要するにC言語+一行コメントしか知らないと言うことにほぼ等しいよ。
C++は魔性の言語だから、まあ相当な覚悟が必要です。
趣味でやるなら真に覚悟を決めた者じゃないと
途中で挫折することは
間違いないから頑張ってください。
0752デフォルトの名無しさん
2009/09/28(月) 00:16:040753デフォルトの名無しさん
2009/09/28(月) 00:19:25Cで巨大で複雑なことをやろうとすれば、どのみち自作C++に近づいていくので、
初めからC++を学んだほうが近道。
0754デフォルトの名無しさん
2009/09/28(月) 01:15:27C縛りの仕事ってのはやっぱりあるし
0755デフォルトの名無しさん
2009/09/28(月) 02:07:490756デフォルトの名無しさん
2009/09/28(月) 02:16:28C++使うほどじゃない。
0757デフォルトの名無しさん
2009/09/28(月) 02:27:170758デフォルトの名無しさん
2009/09/28(月) 02:58:56これで金を取るつもりか。
0759デフォルトの名無しさん
2009/09/28(月) 05:03:250760デフォルトの名無しさん
2009/09/28(月) 05:14:01そうなったらWindowsで作ってる分にはC#でいいな。
0761デフォルトの名無しさん
2009/09/28(月) 06:04:590762デフォルトの名無しさん
2009/09/28(月) 09:28:57ちょっと書いてないみたいなんで
> string型の何文字目が○○か?
単純に文字配列的に使える s[n] みたいに。
> もしくはint型の何桁目は何の数字か?とか
こっちは知らん。自分で関数書くのかな。簡単だしいろいろな書き方ありそう。
0763デフォルトの名無しさん
2009/09/28(月) 09:51:450764デフォルトの名無しさん
2009/09/28(月) 11:16:16>
> 単純に文字配列的に使える s[n] みたいに。
実のところ、そう単純ではなく、
stringにSJISなどの二バイト文字が入っていると
何文字目と何バイト目の対応がずれるし、
UTF-8が入る場合もある。
0765デフォルトの名無しさん
2009/09/28(月) 12:29:07{
char buf[100];
sprintf(buf, "%99d", x);
return buf[99 - n] - '0';
}
// いまいちすっきりしなかった
0766デフォルトの名無しさん
2009/09/28(月) 19:22:28組み込み系では今でも多いんじゃない? 現場から離れたので詳しくは知らないが。
C++は、仮想継承等、表に見えないデータ量増加等があって、知識がないと嵌るかも
しれないし。
0767デフォルトの名無しさん
2009/09/28(月) 19:54:51一方、iPhoneは・・・いや、なんでもない。
0768デフォルトの名無しさん
2009/09/28(月) 21:56:00SJISのままできるよ。
SJISソースの文字の2バイト目に\がくる場合に\\に
置き換えるフィルタをC++で作ればいいよ。
0769デフォルトの名無しさん
2009/09/28(月) 22:01:15環境依存になるけどwstringは?
0770デフォルトの名無しさん
2009/09/28(月) 22:48:22サロゲートペアとか結合文字とかあるから、だめなんじゃないの?
0771デフォルトの名無しさん
2009/09/28(月) 23:19:340772デフォルトの名無しさん
2009/09/28(月) 23:57:34(unsigned int)-1
-(unsigned int)1
-1u
これらは、unsigned int であらわせる最大の値であることは保障されますでしょうか?
それとも環境依存or不定でしょうか?
C++0x ではなく ISO/IEC 14882:2003 でお願いします。
0773デフォルトの名無しさん
2009/09/29(火) 00:05:55邪悪だろうがvector<bool>だろうが、
標準に入っちまえば正義。
0774デフォルトの名無しさん
2009/09/29(火) 00:08:52ごめんしらねぇけど
std::numeric_limitsじゃダメなの?
1.5 指定された整数型が表現可能な最小値および最大値を返す。 | 株式会社きじねこ
http://www.kijineko.co.jp/tech/cpptempls/integer/min_and_max.html
0775デフォルトの名無しさん
2009/09/29(火) 00:18:540776デフォルトの名無しさん
2009/09/29(火) 00:19:43すみませんが
他の方法ではなく、
質問そのままの方法で回答がわかる方お願いします。
0777デフォルトの名無しさん
2009/09/29(火) 00:45:24おまえの質問に答えること それ自体は容易い 簡単だ
規格はこれこれこう そんな話は いくらでもできる
しかし 今 オレが そんな話を 仮にしたとしても その真偽はどうする…?
真偽など どうでもいいから 聞きたいと言うのか…?ククク……
0778デフォルトの名無しさん
2009/09/29(火) 00:49:280779デフォルトの名無しさん
2009/09/29(火) 01:00:14ご存知でしたら教えてください。
真偽はあなたを信用しますとしか言えません。
もし可能であれば規格の根拠となる部分を教えて頂けたらと思います。
>>778
そのように思っていただいてもかまいません。
詳細はすみませんが控えさせていただきます。
0780デフォルトの名無しさん
2009/09/29(火) 01:12:10標準はあくまでも標準でしかなく正義ではない
0781デフォルトの名無しさん
2009/09/29(火) 01:23:370782デフォルトの名無しさん
2009/09/29(火) 01:53:24そしてそれ故負の数が補数で示されるかどうかなどは分からない。
保障されない。
0783デフォルトの名無しさん
2009/09/29(火) 02:06:54既存システムの問題判定のためにはそれでいけるとおもうが、詳細(というか、状況)を伝えられないのなら
これ以上はむりだわ
0784デフォルトの名無しさん
2009/09/29(火) 02:18:09普通に使えるところでは使える
使わせる気がさらさら無い環境も少なくはないが
0785デフォルトの名無しさん
2009/09/29(火) 02:20:18unsigned intの算術はmod 2^sizeof(unsigned int)の世界に常に従うから
その3つはどれも2^sizeof(unsigned int)-1になることが保証されてる
不定だの処理系定義だの負の数の内部表現に依存するだのデタラメ言ってる奴らは自重しろ
0786デフォルトの名無しさん
2009/09/29(火) 02:21:312^(sizeof(unsigned int)*CHAR_BIT)だな
0787デフォルトの名無しさん
2009/09/29(火) 02:22:370788デフォルトの名無しさん
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になるけど
0789デフォルトの名無しさん
2009/09/29(火) 02:49:06お前もな
ttp://portable-c.jugem.jp/?day=20060712
0790デフォルトの名無しさん
2009/09/29(火) 02:50:33ごめんなさい
0791デフォルトの名無しさん
2009/09/29(火) 03:15:420792デフォルトの名無しさん
2009/09/29(火) 07:07:22標準は正義では無いだろうが
勝者は正義と見なされる。
そして標準は勝者である。
0793デフォルトの名無しさん
2009/09/29(火) 08:00:19標準と聞いて俺が思い浮かべる言葉は主に妥協とか公約数で、
「勝」の字に見合うイメージはあまり無いけど。
0794デフォルトの名無しさん
2009/09/29(火) 08:23:29クラスを作りたいのですが、どうすべきか迷っています。
最初、安直に basic_string<> を継承しようかと思ったのですが、デストラクタが virtual じゃ
ないんですね。
basic_string<> をメンバーに持つクラスを作るという手もあるかもしれませんが、
基本的なインターフェースを basic_string<> と同じにしたいというのがあるので、
それを自分で一通り用意しないといけないですよね。単純作業かもしれませんが。
0795デフォルトの名無しさん
2009/09/29(火) 09:18:200796デフォルトの名無しさん
2009/09/29(火) 09:18:410797デフォルトの名無しさん
2009/09/29(火) 09:44:30人の事を散々出鱈目だのなんだの言っておいて謝っただけで済むと思うな。
0798デフォルトの名無しさん
2009/09/29(火) 10:04:33謝らなくても済む場所で、わざわざ謝ってもらったんじゃないか。
0799デフォルトの名無しさん
2009/09/29(火) 10:07:160800デフォルトの名無しさん
2009/09/29(火) 10:11:58サイズに応じて掛かる時間が比例する。
char で1秒かかるとき、doubleだと8秒かかる。
forでカウントするときは、適切なサイズを用いた方が良いらしい。
unsigned intが最も速いんだと勘違いしてた。 intに変換し直すと思ってた。
0801デフォルトの名無しさん
2009/09/29(火) 10:18:140802デフォルトの名無しさん
2009/09/29(火) 10:21:03環境依存だから、環境を特定して言わないと意味無いよ。
しかしループカウンタに char を使ったほうが速い環境ってどんなだろう?
8bit CPU 向けコンパイラでカウンタの最大値が 256 未満とか?
0803デフォルトの名無しさん
2009/09/29(火) 10:26:488倍の部分の訂正。
>>802 カウントを256未満しか使わない場合。環境はx86 windowsXP。
0804デフォルトの名無しさん
2009/09/29(火) 10:28:51vec(・)++; とカウントしたときに合計時間です。
0805デフォルトの名無しさん
2009/09/29(火) 10:32:10それならメモリアクセスが足を引っ張るから、わりとあたりまえな話。
0806デフォルトの名無しさん
2009/09/29(火) 11:21:31>謝らなくても済む場所で
それを許すから便所の落書きになる。
0807デフォルトの名無しさん
2009/09/29(火) 11:23:340808デフォルトの名無しさん
2009/09/29(火) 11:41:35許す許さないはこの話に全く関係無い。
試しに今、>>790をずっと許さないでいてみな。それが便所の落書きを
何か上等な物に昇格させるってんなら、見ててやるよw
俺は「C++関連の便所の落書き」が「C++の話すらできない便所の落書き」に
ランクダウンするだけだと思うけどね(人それを「荒れる」と言う)。
0809デフォルトの名無しさん
2009/09/29(火) 14:03:34関数を使ってバッファ付きファイル出力したら、
終了時にバッファの残りを出力しないといけない。
クラス化するのも面倒。
0810デフォルトの名無しさん
2009/09/29(火) 14:18:100811デフォルトの名無しさん
2009/09/29(火) 14:20:17それは関数の最後に処理を記述するのと何がちがうの?
0812デフォルトの名無しさん
2009/09/29(火) 14:20:39・関数の最後に出力処理を書き、その直前にラベルを置く。ショートカットしたいときはgotoする。
・その関数を呼ぶだけの関数を用意し、その関数で出力処理を書く。
・関数内で無名のクラスを作り、デストラクタで出力する。
0813デフォルトの名無しさん
2009/09/29(火) 14:20:39どうやるのがセオリーなんですか?
0814デフォルトの名無しさん
2009/09/29(火) 14:35:31wchar_tがUTF32な環境限定で作るのが確定してるならwchar_tでもおk
0815デフォルトの名無しさん
2009/09/29(火) 14:36:060816デフォルトの名無しさん
2009/09/29(火) 14:36:2932bit 整数型( uint32_t とか)を符号単位として typedef して
std::basic_string とかの標準コンテナを使って文字列型を作り、
各種変換関数を用意する、って感じ?
自分の使った方法と、それについて具体的に不満な点を挙げて
もらったほうがいいと思う。
0817809
2009/09/29(火) 14:46:56fwriteはバッファがたまったら出力します。staticやグローバルでメモリを確保します。
main(){
while(){
・・・
fwrite( x );
}
}
0818デフォルトの名無しさん
2009/09/29(火) 14:50:090819809
2009/09/29(火) 14:52:09mainの終了時にデストラクタよばれますよね
0820デフォルトの名無しさん
2009/09/29(火) 15:05:44ICU使うのが一番簡単なんじゃないかな
0821デフォルトの名無しさん
2009/09/29(火) 15:14:03> 自分の使った方法と、
UTF32の文字列を使ったことはありません。
> それについて具体的に不満な点を挙げて
不満な点ですか?
どのOSでも同じように使えないのはイヤ。
フレームワークを使うときは、そのフレームワークにあわせますが、
使わない場合のやり方がほしい。
なるべくC++標準のやり方がいい。(C++0xではu32string?なんてのができるの?)
それが無ければ準標準(boostみたいな)のやり方、
それが無ければ、クロスプラットフォームなライブラリ(有名なもの)
0822デフォルトの名無しさん
2009/09/29(火) 15:32:21そんなアプローチでいいとは信じ難いのだが……
それはさて、staticなオブジェクトのデストラクタは呼ばれるよ。
exception含めて例外処理ができなくなるけど。
0823デフォルトの名無しさん
2009/09/29(火) 15:33:250824デフォルトの名無しさん
2009/09/29(火) 17:47:34どうやって入れるのでしょうか?
0825デフォルトの名無しさん
2009/09/29(火) 17:49:440826デフォルトの名無しさん
2009/09/29(火) 17:52:380827デフォルトの名無しさん
2009/09/29(火) 17:56:57AAA: texture (char* name, ... )
みたいな感じで定義すると va_args の戻り値が
有効な引数の数を越えて呼び出しても0になってくれないのですが…
(ので引数の数が判定できない)
0828デフォルトの名無しさん
2009/09/29(火) 18:29:470829デフォルトの名無しさん
2009/09/29(火) 18:37:150830827
2009/09/29(火) 19:06:41// 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);
}
0831デフォルトの名無しさん
2009/09/29(火) 19:08:48それで、呼ぶ側のコードは?
0832デフォルトの名無しさん
2009/09/29(火) 19:25:110833827
2009/09/29(火) 19:26:54という決まりを忘れてました。うっかりさんです。
解決しました。
このうっかりは検出できねー
0834827
2009/09/29(火) 19:27:54ありがとうございました。
0835デフォルトの名無しさん
2009/09/29(火) 20:03:43A& get_A1(){ return g_a; }
A get_A2(){ return A(); }
main(){
const A& a = get_A1(); // OK
const A& a = get_A2(); // ?
}
こういう風に、インスタンスを返す関数に対し、参照で受けても問題ないでしょうか?
0836デフォルトの名無しさん
2009/09/29(火) 20:16:54> こういう風に、インスタンスを返す関数に対し、参照で受けても問題ないでしょうか?
普通の参照はだめだけど、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]
参照。
0837デフォルトの名無しさん
2009/09/29(火) 20:17:52定義するのも使うのも構わないけど
非PODを省略部の実引数に渡すと未定義動作だから気を付けろ
0838デフォルトの名無しさん
2009/09/29(火) 20:36:12ありがとうございます。
やっぱり、「const A a = get_A0();」
よりは、「const A& a = get_A1();」の方が
代入が無い分、効率が良かったりするんでしょうか?
今まで書いたコードは全部前者なんですが、失敗したかなぁ?
0839デフォルトの名無しさん
2009/09/29(火) 20:38:020840デフォルトの名無しさん
2009/09/29(火) 20:40:280841デフォルトの名無しさん
2009/09/29(火) 20:46:27NRVOはVC8で有効なようで、
自分の環境では前者でもいいみたいです。
ありがとうございました。
0842デフォルトの名無しさん
2009/09/29(火) 21:02:40とりあえず一定以上の品質のあるコンパイラに
最適化させればそのくらい空気読んで
戻り値最適化をしてくれるから
今までのでも大丈夫だと思うよ。
0843デフォルトの名無しさん
2009/09/30(水) 18:03:01vectorやfusionで渡すといいよ
0844デフォルトの名無しさん
2009/10/01(木) 01:28:53サイズなどの情報を含めて、HDDのイメージバックアップのように記録できませんか?
0845デフォルトの名無しさん
2009/10/01(木) 01:37:020846デフォルトの名無しさん
2009/10/01(木) 09:28:330847デフォルトの名無しさん
2009/10/01(木) 15:43:43正式にはstd::codecvtをカスタマイズするのだと思う。
ただめんどくさいし実用性が怪しいので誰もやらない。
やはりMFCやらQtやらのフレームワーク又はICUなど
の外部ライブラリを利用することになるはず。
後、boostの一部はロケールをあんまり考慮してないの
ではまる可能性有り。
boost::lexical_castはグローバルなロケール使ってるか
らドボンし易いのだけど、これを内部で利用しているもの
が色々あるので困る。
boostでロケールが絡むものは避けた方がいいかも。
0848デフォルトの名無しさん
2009/10/01(木) 16:03:36今でも用途さえ合えば神なんだけどね。
C++がゼロオーバーヘッドを正義としている以上、ライブラリも同じ正義をおおむね
目指している訳で、抽象度と汎用性の高いライブラリでも「それがどんな仕組みで
動いてるのか」を把握した上で使う前提になってるのが、良さでもあり悪さでもある
んだろうなぁ。
0849デフォルトの名無しさん
2009/10/01(木) 16:12:04まあ、わかるがw。
0850デフォルトの名無しさん
2009/10/01(木) 17:13:46やっぱ、セオリーといえるほど一般化した方法はないんでしょうかね。
今回自分がやっていたのは、ある海外ソフトの日本語化なんですが、
フレームワークはそのソフトが使っていなかったので
そこまでやりたくなかった。
そうなるとICUかiconvかってことになるわけで、なんとなくiconvを選んでみました。
文字コードだけじゃなく、本格的な国際化するときはICUがいいんでしょうね。
それでstd::basic_string<uint_32> u32stringがC++0xで標準になるって
みたんで、u32stringを使うことにしました。
あとは、iconvのchar*のデータをu32string型に入れるとこなんですが、
さてどういうやり方が一番シンプルなんだろうか。
0851デフォルトの名無しさん
2009/10/01(木) 17:17:55変換時に、バグってる文書でも、なるべく多くの情報が残る。
NKF ICU ICONVで比較した。
ICUだけがダントツで性能良かった。
0852デフォルトの名無しさん
2009/10/01(木) 18:37:150853デフォルトの名無しさん
2009/10/01(木) 18:58:51英語以外はテキストでなく、特殊なバイナリデータとして扱うぐらいの気持ちでいる必要が。
0854デフォルトの名無しさん
2009/10/01(木) 19:11:16このプログラムですが、printfで出力される値と
fprintfにより算出される値が異なってしまいます。
特にfprintfにより出力される値は異常値になってしまいます。
どうか、ご教授のほどよろしくお願いします。
0855デフォルトの名無しさん
2009/10/01(木) 19:18:250856デフォルトの名無しさん
2009/10/01(木) 19:27:140857デフォルトの名無しさん
2009/10/01(木) 19:39:20うん。それで?
0858デフォルトの名無しさん
2009/10/01(木) 19:43:150859デフォルトの名無しさん
2009/10/01(木) 20:30:03C++0xのu32stringはstd::basic_string<char32_t>
0860デフォルトの名無しさん
2009/10/01(木) 20:32:58コンバートしたりするなら、言語処理のプログラムが居る。
0861デフォルトの名無しさん
2009/10/01(木) 20:50:45http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html
0862デフォルトの名無しさん
2009/10/01(木) 21:30:05x_new = x_old + dt*v_old
みたいに
0863デフォルトの名無しさん
2009/10/01(木) 21:32:510864デフォルトの名無しさん
2009/10/01(木) 21:45:31で、その方法は?
0865デフォルトの名無しさん
2009/10/01(木) 21:48:15これ動かないよね。
もちろん、
char *str = "ファイルから読み込んだテキスト"
u32string text = str;
も
0866デフォルトの名無しさん
2009/10/01(木) 21:49:36どうやって?
0867デフォルトの名無しさん
2009/10/01(木) 22:10:41u32string str = U"abc";
下はファイルから読み込むときにchar32_tで読んどけばいい
0868デフォルトの名無しさん
2009/10/01(木) 22:18:16だからcharからu32stringに変換しないといけないんだよね。
0869デフォルトの名無しさん
2009/10/01(木) 23:02:050870デフォルトの名無しさん
2009/10/01(木) 23:20:18char32_tで読み込むとかw
0871デフォルトの名無しさん
2009/10/01(木) 23:23:17*x = a * *xo + *v++;
0872デフォルトの名無しさん
2009/10/01(木) 23:24:46コンパイルエラーw
0873デフォルトの名無しさん
2009/10/01(木) 23:36:340874デフォルトの名無しさん
2009/10/01(木) 23:39:530875デフォルトの名無しさん
2009/10/01(木) 23:41:55なにが?
0876デフォルトの名無しさん
2009/10/02(金) 00:24:050877デフォルトの名無しさん
2009/10/02(金) 01:01:470878デフォルトの名無しさん
2009/10/02(金) 01:26:580879デフォルトの名無しさん
2009/10/02(金) 02:17:520880デフォルトの名無しさん
2009/10/02(金) 04:33:25> 変換時に、バグってる文書でも、なるべく多くの情報が残る。
それは、エラーになるべきじゃないの?
0881デフォルトの名無しさん
2009/10/02(金) 05:05:01少しのエラーなら無視して読み続けられる方が都合のよい場合もある
0882デフォルトの名無しさん
2009/10/02(金) 06:01:10そんなの使ってられないだろうな。
0883デフォルトの名無しさん
2009/10/02(金) 07:46:000884デフォルトの名無しさん
2009/10/02(金) 15:43:370885デフォルトの名無しさん
2009/10/02(金) 15:46:080886デフォルトの名無しさん
2009/10/02(金) 15:51:45方法2: [] 演算子で、代入演算子をオーバーロードしているクラスを返す
0887デフォルトの名無しさん
2009/10/02(金) 16:14:13A[n] の参照には直接代入できない場合にやりたいのですが、方法2だとできますか。
あと、値読み取りも出来るようにしたいんです。
0888デフォルトの名無しさん
2009/10/02(金) 16:15:440889デフォルトの名無しさん
2009/10/02(金) 16:23:04bitset の operator[] は bitset::reference というクラスを返す
こいつは operator=(bool) や operator bool を実装しているので、bool を代入したり bool に変換したりできる
0890デフォルトの名無しさん
2009/10/02(金) 16:27:00でも面倒そう、間違えそうなので、add(n)というメンバ関数で済まそうと思いました。
0891デフォルトの名無しさん
2009/10/02(金) 17:03:200892デフォルトの名無しさん
2009/10/02(金) 17:45:08こんな感じかな
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];
};
0893デフォルトの名無しさん
2009/10/02(金) 17:55:43その反復子が双方向反復子として使えるならboostのpriorで取得できるよ
0894デフォルトの名無しさん
2009/10/02(金) 18:12:05サンクス
0895デフォルトの名無しさん
2009/10/02(金) 21:52:16#include<stdio.h>
//グロバース変数
int globalx;
void Func(){ ←この部分のFunc01()に何の意味があるのですか?
glpbalx=10;
}
int main(coid){
Func(); ←それとこの部分のFunc01()にもなんの意味があるのですか
printf("%d",globalx);
}
すみません初心者で
0896デフォルトの名無しさん
2009/10/02(金) 22:25:29> //グロバース変数
グローバル変数かな?
> int globalx;
> void Func(){ ←この部分のFunc01()に何の意味があるのですか?
Func01 なんて無いんだけど…
Func 無しでも初期化はできる。
> glpbalx=10;
globalx=10; かな?
> int main(coid){
coid→void かしらん?
> Func(); ←それとこの部分のFunc01()にもなんの意味があるのですか
Func01 なんて無いんだけど。わからないなら抜いて見ればよろし。
これを入れないと globalx は初期化されない。
C++ なのに C コードだけなのは何故なんだろう。
0897デフォルトの名無しさん
2009/10/02(金) 22:31:02致命傷過ぎる
何なんだバカにしてんのか?あ?
0898デフォルトの名無しさん
2009/10/02(金) 22:34:10俺は3日目ぐらいには寝てたけどな
0899デフォルトの名無しさん
2009/10/02(金) 22:41:040900デフォルトの名無しさん
2009/10/02(金) 22:47:47別にいいんだけど、C++ なら敢えて cout 使わずに
printf 使うのはなぜかな、とは思うな。
0901デフォルトの名無しさん
2009/10/02(金) 22:51:57一生言ってな。
0902デフォルトの名無しさん
2009/10/02(金) 22:57:170903デフォルトの名無しさん
2009/10/02(金) 23:26:28ありがとうございました
これからも分からなくなったら来ても良いですか?
0904デフォルトの名無しさん
2009/10/02(金) 23:31:10少しは自分で調べろ
調べてわからなかったら来ても良い
ただし何をどう調べてどうわからなかったか書くこと
0905デフォルトの名無しさん
2009/10/02(金) 23:33:300906デフォルトの名無しさん
2009/10/02(金) 23:33:40何言ってんの? 規格って知ってる?
0908デフォルトの名無しさん
2009/10/02(金) 23:46:330909デフォルトの名無しさん
2009/10/02(金) 23:52:230910デフォルトの名無しさん
2009/10/03(土) 00:51:550911デフォルトの名無しさん
2009/10/03(土) 02:21:40ICU なんてモノがあったんですね。初めて知りました
これまで nkf や iconv だけだったので、ありがたいです
0912デフォルトの名無しさん
2009/10/03(土) 02:28:30Cでもvalidですが
0913デフォルトの名無しさん
2009/10/03(土) 04:17:430914デフォルトの名無しさん
2009/10/03(土) 13:02:47嘘つくなよ
0915デフォルトの名無しさん
2009/10/03(土) 13:10:580916デフォルトの名無しさん
2009/10/03(土) 16:31:30Visual C++ 2003では使えたらしいですが、Visual C++ 2008でやるとこの
エラーが出てしまいます。よろしくお願いします。
error C2327: 'Multivac::CInitialCurve<T>::Curve' : 型名、スタティック、または列挙子ではありません。
コンパイルされたクラスの テンプレート のインスタンス化 'Multivac::CSetOfPoints<T>' の参照を確認してください
0917916
2009/10/03(土) 16:39:28template <class T>
class CSetOfPoints: public CInitialCurve<T>
{
protected:
Curve<T> Front; ←ここでエラー
0918916
2009/10/03(土) 16:42:28template <class T>
class CInitialCurve
{
/**************
* ATTRIBUTES *
**************/
protected:
Curve<T> Curve;
template <class T>
Curve<T>::Curve() throw()
{
n_=0;
orientation_ = -1;
}
0919デフォルトの名無しさん
2009/10/03(土) 16:48:320920916
2009/10/03(土) 17:00:26ヘッダファイルなどがあったのでそのフォルダにはパスを通しましたが
ライブラリファイルらしきものは無いので他はやっておりません。
0921916
2009/10/03(土) 17:08:49template <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;
0922デフォルトの名無しさん
2009/10/03(土) 17:20:05VC++ .NET 2003→2008でそのエラーなら、まず疑うのはtypenameを付けていないことなんだけど、
さすがにそこはtypename要らない場所だから。
0923916
2009/10/03(土) 17:35:09他にも似たようなエラーが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();
0924916
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)のエラー
0925デフォルトの名無しさん
2009/10/03(土) 17:47:30それとも新規に書いたとか、手加えたものが通らないの?
テンプレート使いまくったコードは断片的にコンパイルエラーとかソース見せられてもわからんよ。
使用側がミスってるだけでも、ライブラリ内でエラーでまくるしな。
あと、テンプレートクラスのエラーはエラー一覧じゃなくて、
出力の方でエラーの詳細でコンパイラがどうインスタンス化しようとしてんのか見ないと。
0926916
2009/10/03(土) 17:57:24全く手を加えていない状態です。
すみません。テンプレートなるものを初めて知ったもので・・・。
インスタンス化の詳細とかってvisual studio 2008で、
どうすれば見れるのでしょう?
0927デフォルトの名無しさん
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) : コンパイルされたクラスの テ(略 ←ここが本当の原因
これがテンプレートライブラリ使ったときのコンパイルエラーの読み方なんだけど、
全く手加えてないんなら単にライブラリに問題があるのかもね。
0928916
2009/10/03(土) 19:10:30ありがとうございます。
どうにか解決できました。
エラーの'Multivac::CInitialCurve<T>::Curve' の
CurveというクラスがCInitialCurve<T>クラスにもメンバとしてあるのですが、
Multivac空間内に直に定義されてもいて、
Curve<T> Curve; を
Multivac::Curve<T> Curve;
としてやることでエラーが無くなりました。
他のエラーも 同じことをしてなくなり、
実行結果も正しく得られるようになりました。
明らかにクラスのオブジェクトを宣言している文なのだから、
名前空間いらないんじゃないかと思うのですが・・・。
0929デフォルトの名無しさん
2009/10/03(土) 20:59:05これが通らないのと同じことかな。
struct a {};
struct b { a a; };
0930デフォルトの名無しさん
2009/10/04(日) 14:24:58not const(not const) 可
const(const) 可
not const(const) 不可
const(not const) 可
といったように(参照のコピーコンストラクトのように)const性で処理を分岐させることは可能でしょうか?
0931デフォルトの名無しさん
2009/10/04(日) 14:36:00よく分からない。もう少し具体的に。
コピーコンストラクタというのは↓のようなもので、引数はconst参照以外ない。
hoge(const hoge&);
0932デフォルトの名無しさん
2009/10/04(日) 14:39:17これ以上の知識が無くても大丈夫ですか?
modern C++ design とかも読まないと駄目ですか?
0933デフォルトの名無しさん
2009/10/04(日) 14:44:38個人的にはExceptionalC++をおすすめだが専用スレに行け
推薦図書/必読書のためのスレッド 52
http://pc12.2ch.net/test/read.cgi/tech/1254565176/
0934デフォルトの名無しさん
2009/10/04(日) 14:55:30コードで書くと↓みたいな感じで。ようは参照っぽく振舞う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
0935デフォルトの名無しさん
2009/10/04(日) 15:17:15class Hoge {
private:
Hoge(const Hoge& hoge);
public:
Hoge(Hoge& hoge);
Hoge(Hoge& hoge) const;
Hoge(const Hoge& hoge) const;
};
これじゃだめ?
コンパイル通るか試してないけど。
0937デフォルトの名無しさん
2009/10/04(日) 16:01:11コンストラクタに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かどうか判別する方法もないと思う。
0938デフォルトの名無しさん
2009/10/04(日) 17:03:29引数が非constの時とconstの時で使われるコンストラクタを分けたいなら
右辺値参照(rvalue reference)とかmove semanticsとか
Boost.Moveでググると良いんじゃないかと思った。
0939939
2009/10/04(日) 17:06:41まったく的外れだった
0940デフォルトの名無しさん
2009/10/04(日) 21:56:54Effective C++ を読んで、その内容に納得できるなら良いと思うけど。
例えば、他人に説明できるレベルとか。
いずれにせよ、そんなことよりコード書かなきゃいつまでたっても
書けるようにはならん。知識だけではコードは書けない。
本の内容もコード書いていなければ実感できない。
0941デフォルトの名無しさん
2009/10/05(月) 03:37:00Cのmemset(ptr, 0, size)のC++版が知りたいです。
memsetはvtblまで0にしてしまうから駄目という所までは調べて分かりました。
0942デフォルトの名無しさん
2009/10/05(月) 03:57:56自分で作ったクラスでそういうことがしたいなら、
普通はコンストラクタで明示的に書く
それが面倒なくらいメンバが多いようなら多分設計を見直した方が良い
まあ、恐らく組み込み型の初期化についての話だと思うから、
boost::value_intializedについてググると良いんじゃない?
0943デフォルトの名無しさん
2009/10/05(月) 11:16:41http://www.kijineko.co.jp/tech/superstitions/initialization-by-memset.html
http://www.kijineko.co.jp/node/163
0944デフォルトの名無しさん
2009/10/05(月) 13:34:26初心者歓迎のスレの人だよね?
普通のクラスの初期化の場合、ゼロで初期化する必要は全くない。テンプレートで
汎用的に作るのなら尚更。だから、この件はデフォルトコンストラクタが走った
オブジェクトを代入で十分だよ。
0945デフォルトの名無しさん
2009/10/05(月) 20:56:34そのクラスがPODならmemsetしてもいい
PODについてはめんどくさいからぐぐれ
0946デフォルトの名無しさん
2009/10/05(月) 21:32:46そういうのもなんか気持ち悪いよね。
明示的にPODを示す構文があるべきだったかも。
pod_structとか
0947デフォルトの名無しさん
2009/10/05(月) 21:36:42基本的に素人お断りな言語なので不要だと思います
いやならJavaとか使えばいいわけだしね
0948デフォルトの名無しさん
2009/10/05(月) 21:42:32static_assert(std::is_pod<Hoge>::value, "not POD");
0949デフォルトの名無しさん
2009/10/05(月) 21:47:240950デフォルトの名無しさん
2009/10/05(月) 22:29:520951デフォルトの名無しさん
2009/10/05(月) 22:31:340952デフォルトの名無しさん
2009/10/05(月) 22:59:06どんな方針でやるのがいいんでしょう?
0953デフォルトの名無しさん
2009/10/06(火) 00:00:540954デフォルトの名無しさん
2009/10/06(火) 00:07:470955デフォルトの名無しさん
2009/10/06(火) 00:22:09ほんなら適当なクラスに->オペレータとプライベートなコピーコンストラクタでも定義したら?
0956デフォルトの名無しさん
2009/10/06(火) 00:44:450957デフォルトの名無しさん
2009/10/06(火) 00:47:100958デフォルトの名無しさん
2009/10/06(火) 00:59:490959デフォルトの名無しさん
2009/10/06(火) 03:10:050960デフォルトの名無しさん
2009/10/06(火) 03:31:13Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0961デフォルトの名無しさん
2009/10/06(火) 03:45:49Effective 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/
よく分からないけど短くしておきました
0962デフォルトの名無しさん
2009/10/06(火) 04:07:07新スレの 1 がテンプレさぼったみたいなんで補完しようとしてて、
>960 はそのときの誤爆。
せっかく短くしてもらったけど Books はもう貼り終わってた。
次スレの終わりあたりでまた書き込みしてもらえると助かる。
いま >>4 のリンク先確認が済んで書き込みしようとしたら、連投規制で
詰まってる。
0963デフォルトの名無しさん
2009/10/06(火) 04:07:130964デフォルトの名無しさん
2009/10/06(火) 04:10:21http://codepad.org/
長いソースを貼るときはここへ
0965デフォルトの名無しさん
2009/10/06(火) 04:33:16はあく
0966デフォルトの名無しさん
2009/10/06(火) 05:11:52で、新スレのテンプレ貼り終わったんで、リンクしとく。
C++相談室 part73
http://pc12.2ch.net/test/read.cgi/tech/1254746834/
まだちょっと早かったような気もするんだけどね。
0967デフォルトの名無しさん
2009/10/06(火) 07:12:21何で?
一応
Internet Archive Wayback Machine
ttp://web.archive.org/web/*/http://www.wakhok.ac.jp/~sumi/stl/
で記録は残っているみたいだけど。
0968デフォルトの名無しさん
2009/10/06(火) 07:35:18そのページ、使いやすかったんで残念。
つーかSTLでググると、リファレンスへは飛ばずに
糞みたいな日記ばかりヒットするのは止めて欲しい。
0969デフォルトの名無しさん
2009/10/06(火) 07:48:06ttp://d.hatena.ne.jp/sumi_wakhok/20090903/p4
ttp://d.hatena.ne.jp/sumi_wakhok/20090904/p3
0970デフォルトの名無しさん
2009/10/06(火) 07:48:310971デフォルトの名無しさん
2009/10/06(火) 08:12:49角さんのページじゃないと駄目なんだ俺
0972デフォルトの名無しさん
2009/10/06(火) 12:27:36#define TEST( x ) "%d",x
これをinlineにできますか?
0973デフォルトの名無しさん
2009/10/06(火) 12:30:080974デフォルトの名無しさん
2009/10/06(火) 12:33:19マクロは使える。
マクロはinlineに置き換えた方が良いだけ。エラーの特定などのため。
必須ではない。
0975デフォルトの名無しさん
2009/10/06(火) 12:35:34確実にコード内に埋め込めて、関数呼び出しのコストがない。
なるべく使わないが良いけど、用途次第。 forは展開出来ないとか。
0976デフォルトの名無しさん
2009/10/06(火) 12:45:12キャッシュって知ってるか?
必ず効率が高まるわけじゃないよ。
関数にしてコンパイラにまかせるのが正解。
どうしてもヘッダに定義をおきたいときに inline を使う。
必要性と計測に基づかない最適化は悪。
0977デフォルトの名無しさん
2009/10/06(火) 12:47:03これは、ちょっと、言いすぎだな。
× 〜悪。
○ 〜保守性を損ねる理由としては不十分。
0978デフォルトの名無しさん
2009/10/06(火) 12:47:26できないのでそのままにしておくか、それを捨てるか。
0979デフォルトの名無しさん
2009/10/06(火) 12:55:20そのマクロどうやって使うの?
printf(TEST(x)) とかやるの?
それなら普通の関数 print_int(x) でいい、っていうかこっちのがいいよね。
inline にする必要も無い。
0980デフォルトの名無しさん
2009/10/06(火) 12:58:330981デフォルトの名無しさん
2009/10/06(火) 13:45:13char *p = new char [1000];
このようにメモリを確保して、たとえば、char *q = &p[500]; delete q;
とすると、メモリは解放されますか?
0982デフォルトの名無しさん
2009/10/06(火) 13:49:44それは未定義の動作です
0983デフォルトの名無しさん
2009/10/06(火) 13:50:03自前で確保した場合があり、後者のみデストラクタでメモリを解放したいのですが。
他所のだけ解放し無いように出来るんですか?
0984デフォルトの名無しさん
2009/10/06(火) 13:52:090985デフォルトの名無しさん
2009/10/06(火) 13:54:19q が他所で確保されたか自前で確保したか覚えておけば、出来ます
0986デフォルトの名無しさん
2009/10/06(火) 13:55:180987デフォルトの名無しさん
2009/10/06(火) 14:45:31「class Point{ int x; int y;} というクラスがある時、
ローカル変数 Point p; を宣言すると、Javaではpは参照になるがC++ではPointオブジェクトの実体が格納される変数になります。」
と、ここまでは分かるのですが、次の文が分かりません。
「よってC++では、ただPoint p;のようにして変数を宣言しただけでもコンパイラはそこにコンストラクタを呼び出すための機械語コードを生成します。」
Point p;と宣言した時点ではPointを格納できるだけの領域を用意すればいいだけであって、コンストラクタを呼び出すのは実際にnewする時なんだから
変数宣言時にコンストラクタの呼び出しコードなんて知らなくてもいいように思うのですが、間違ってますでしょうか?
0988デフォルトの名無しさん
2009/10/06(火) 14:55:44Point p;
に対して何をどうnewするつもりなんだ
0989デフォルトの名無しさん
2009/10/06(火) 15:12:06これはテンプレに入るレベルのJava脳www
0990デフォルトの名無しさん
2009/10/06(火) 15:13:04最適化がからめば実際のインスタンスの生成はpを参照する直前になるかも知れんがそれは別の話。
0991デフォルトの名無しさん
2009/10/06(火) 15:18:150992987
2009/10/06(火) 15:33:16Point p;が定義であっても、Pointを格納できるだけの領域(ここではxとy)を用意すればいいだけで、
Pointがどのように作れれるかといったことは知らなくてもいいと思うのですが。
関数の外でnewされて引数として渡されてローカル変数pに代入される、ということを考えた場合、
コンパイラにとっては関数内でコンストラクタの生成コードなんて知らなくてもいいはずです。
0993デフォルトの名無しさん
2009/10/06(火) 15:35:40ICUで出来るらしいですが、VC++でコンパイル通りません。
nkfだと日本語しか出来ません。するとやるやつがないです。
0994993
2009/10/06(火) 15:40:32ライブラリのセットアップはしてあります。
#include <stdio.h>
#include <unicode/ucsdet.h>
int main() { return 0; }
0995デフォルトの名無しさん
2009/10/06(火) 15:51:19だから、アンタはC++に関しての知識が無さすぎる。
本当に知りたいのならC++の入門書を読むべきだし
Javaを学んでいる途中で気になっただけなら、
「自分はC++の知識不足で理解出来ない」として読み飛ばしておけばよい。
0996デフォルトの名無しさん
2009/10/06(火) 16:06:39領域を用意するだけじゃなくてインスタンスを作るの。
インスタンスを作るためにコンストラクタを呼ぶの。
そんだけ。
>>994
それでエラーって、コンパイル環境ができてないんじゃ。
つかエラーって何よ? <unicode/ucsdet.h>にインクルードパスは通ってる?
ICU知らないけど。
0997デフォルトの名無しさん
2009/10/06(火) 16:52:46取ることができるようになるのであって、ただ領域を確保するだけだったら
C時代の構造体と変わらなくてクラスの意味がない。
0998デフォルトの名無しさん
2009/10/06(火) 17:10:01値型と参照型について調べれ。
二つの違いが分かれば、
>関数の外でnewされて引数として渡されてローカル変数pに代入される、ということを考えた場合、
が、いかにアホな事言ってるか理解できる。
ヒント:Javaの変数は全て参照型
0999デフォルトの名無しさん
2009/10/06(火) 17:29:43Javaとはnewの意味が違う。
C++はそういう定義をしたら、その時点でそのインスタンスは普通に存在
するし使える。領域確保だけじゃなくて初期化も全てされる。
>>992の思ってるような、領域だけ取って後からnewで生成、という分割
した初期化構文もあるけど、それはplacement newといって、若干高度な
話。
1000デフォルトの名無しさん
2009/10/06(火) 17:32:08placement newの話は無しで。
とにかく、JavaとC++はnewの意味が違う。newは普通は極力使わない。
new演算子をカスタマイズしてバリバリ使う場合もあるけど。
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。