C++相談室 part62
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/05/27(火) 23:53:59ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part61
http://pc11.2ch.net/test/read.cgi/tech/1205059063/
0002デフォルトの名無しさん
2008/05/27(火) 23:54:50[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?&RKKNP_vJISJISNO=X3014
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0003デフォルトの名無しさん
2008/05/27(火) 23:55: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デフォルトの名無しさん
2008/05/27(火) 23:55:56[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デフォルトの名無しさん
2008/05/27(火) 23:56:33環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0006デフォルトの名無しさん
2008/05/27(火) 23:58:15http://pc11.2ch.net/test/read.cgi/tech/1205059063/
0007デフォルトの名無しさん
2008/05/27(火) 23:58:270008仕様書無しさん
2008/05/28(水) 00:01:060009デフォルトの名無しさん
2008/05/28(水) 00:11:09→ 親クラスが無いもしくは親もPOD型であること
→ メンバ変数が全てPOD型であること
→ 仮想関数を持っていないこと
でPOD型になるはず。
unionに突っ込んでコンパイル出来たらOK。
0010デフォルトの名無しさん
2008/05/28(水) 00:13:080011デフォルトの名無しさん
2008/05/28(水) 00:16:290012デフォルトの名無しさん
2008/05/28(水) 00:18:560013デフォルトの名無しさん
2008/05/28(水) 09:16:220014デフォルトの名無しさん
2008/05/28(水) 09:26:30暗黙定義のコンストラクタで POD じゃなくなるなら、 POD struct なんか作れないことになるぜ。
0015デフォルトの名無しさん
2008/05/28(水) 09:37:070016デフォルトの名無しさん
2008/05/28(水) 12:07:22暗黙の空の実装のコンストラクタは、
「コンストラクタが無い状態」というふうに思ってくれ。
分かりやすくかつ適切な言葉が見つからなかったんで。
実際、union内のPOD型は、空のコンストラクタすら
呼ばれている事にはなってないしね。
0017デフォルトの名無しさん
2008/05/28(水) 12:16:53それなら条件としては「明示的にコンストラクタ、デストラクタを宣言していない」でいいでしょ。
あーあと、コピー代入演算子も宣言しちゃだめな気がする。
0018デフォルトの名無しさん
2008/05/28(水) 12:20:25「明示的」じゃ駄目なんだ。
空ってところが重要だから。
0019デフォルトの名無しさん
2008/05/28(水) 12:24:40え? POD の条件にコンストラクタやデストラクタが空かどうかが関係あるの?
宣言した時点でアウトなはずなんだけど。
0020デフォルトの名無しさん
2008/05/28(水) 12:31:15暗黙の空でないコンストラクタが作られたら駄目ってこと。
0021デフォルトの名無しさん
2008/05/28(水) 12:41:19暗黙のコンストラクタが生成される条件を思いつかないが。
あ、もちろん、仮想関数を持つなら必要だが。
0022デフォルトの名無しさん
2008/05/28(水) 12:43:01つっても、これは
コンストラクタ(コピーコンストラクタ)や代入演算子が
「暗黙には作られない」だけかもしれないが。
0023デフォルトの名無しさん
2008/05/28(水) 12:47:17以外もなにも、それであってるよ。
>>9の矢印部分で書いた、
暗黙の空でないコンストラクタが作られる要因。
0024デフォルトの名無しさん
2008/05/28(水) 12:54:59あんまり使わないけど
0025デフォルトの名無しさん
2008/05/28(水) 12:59:02POD じゃないし、そもそも「コンストラクタが無い」っていう認識も規格上はそうなって
ないわけで無理が出てくる。
クラス型が POD であるためには以下すべての条件を満たすこと。
・明示的にコンストラクタ、デストラクタ、コピー代入演算子を宣言していないこと
・基底クラスおよび非 static データメンバがあればすべて POD 型であること
・仮想関数を持たないこと
これでいいでしょ。
仮想継承は、インスタンスごとの情報としてポインタメンバいっこと同等に POD として
実装できそうな気がする。
0026デフォルトの名無しさん
2008/05/28(水) 13:01:45たしか仮想継承も駄目だったはず。
昼休みオワタので去りまする。
002725
2008/05/28(水) 13:04:07あるなぁ。継承した時点で POD じゃないっぽい。非 static データメンバについては
private/protected もダメ。
やっぱり正確なところは規格を見るのが一番ってことだねぇ。
0028デフォルトの名無しさん
2008/05/28(水) 13:26:01厳密に伝えるための説明では目的が違うだろ
>>9-12の流れは前者
>>14-15は後者
規格には理由や経緯が書かれてないこともあるしな
要するにD&E最強
0029デフォルトの名無しさん
2008/05/28(水) 21:07:43POD 型のデフォルトコンストラクタは0初期化するよ。
ただ、POD 型の変数を宣言しても
そのデフォルトコンストラクタも何も呼ばれない、というだけ。
0030デフォルトの名無しさん
2008/05/28(水) 22:38:460031デフォルトの名無しさん
2008/05/28(水) 22:48:06struct X { int a, b; X() : a() {} };
int main()
{
X x;
std::cout << x.a << std::endl;
std::cout << x.b << std::endl;
return 0;
}
出力は
0
4262272
0032デフォルトの名無しさん
2008/05/29(木) 00:58:06ビルトイン型のT()は0初期化の別記法なので、
デフォルトコンストラクタとは呼ばない
テンプレートのために、ユーザー定義型のデフォルトコンストラクタと
同じ記法が使えるようにしてあるだけ
[6.2.8]
The value of an explicit use of the constructor for a builtin
type is 0 converted to that type (§4.9.5).
Thus, int() is another way of writing 0.
For a userdefined type T, T() is defined by the default
constructor (§10.4.2), if any.
The use of the constructor notation for builtin
types is particularly important when writing templates.
Then, the programmer does not know whether a template parameter
will refer to a builtin type or a userdefined
type (§16.3.4, §17.4.1.2).
0033デフォルトの名無しさん
2008/05/29(木) 00:59:51could not convert template argument 'a' to 'void*'
と怒られます。
VC9.0では問題なくコンパイルが通ります。
どちらの動きが正しいのでしょうか?
template<void* T>
class A
{
};
void f(){}
int main(void)
{
A<f> a;
return 0;
}
0034デフォルトの名無しさん
2008/05/29(木) 01:05:160035デフォルトの名無しさん
2008/05/29(木) 09:35:47関数のアドレスを渡したいなら
template<void(*T)()>
では?
0036デフォルトの名無しさん
2008/05/29(木) 14:48:23標準規格では、関数へのポインタから void* への変換は
認められてない筈。
VC は独自にこれを許してるけど。
0037デフォルトの名無しさん
2008/05/29(木) 15:38:09X func() { return X(); }
と定義したとき、
X().x = 0; は「左のオペランドが、左辺値になっていません」というエラーが出るのに
func().x = 0; がエラーにならないのはなぜですか?
0038デフォルトの名無しさん
2008/05/29(木) 15:58:25とりあえず自分の処理系書いたほうが問題が整理されやすいんじゃないかな。
0039デフォルトの名無しさん
2008/05/29(木) 16:08:010040デフォルトの名無しさん
2008/05/29(木) 16:30:09関数のアドレスでなく、traitsを受け取るべき。
004133
2008/05/30(金) 00:29:370042デフォルトの名無しさん
2008/05/30(金) 04:43:07コンパイラは何?
規格ではどちらもOKのはず。
0043デフォルトの名無しさん
2008/05/30(金) 12:46:33>>39 でも書きましたが VC8 です。
規格では非左辺値構造体の組み込み型メンバーでも書き込みOKということですか?
0044デフォルトの名無しさん
2008/05/30(金) 13:03:060045デフォルトの名無しさん
2008/05/30(金) 13:23:39え?一時オブジェクトは右辺値だろ?
一時オブジェクトが左辺値だったら他に何が右辺値になるんだ?
0046デフォルトの名無しさん
2008/05/30(金) 17:41:55寧ろ、>37の「エラーが出るのに」という根拠を知りたい。
0047デフォルトの名無しさん
2008/05/30(金) 17:43:49どうもバグっぽいね
0048デフォルトの名無しさん
2008/05/30(金) 18:51:510049デフォルトの名無しさん
2008/05/30(金) 19:03:150050デフォルトの名無しさん
2008/05/30(金) 19:15:40func().x = 0;がエラーにならないのって、
XがPOD型のときだけっぽい。
0051デフォルトの名無しさん
2008/05/30(金) 19:37:48func()経由でも出来なくなる。
struct X {
int x;
X(){}
};
...
X().x = 0; //エラー:左のオペ(ry
func().x = 0; //エラー:左のオペ(ry
・関数経由だと、どちらでも出来る。
struct X {
int x;
X(){}
int& xref(){return x;}
};
...
X().xref() = 0;
func().xref() = 0;
誰か仕様詳しい人・・・
0052デフォルトの名無しさん
2008/05/30(金) 19:56:000053デフォルトの名無しさん
2008/05/31(土) 02:12:49うちではvc9は重すぎて入れてないので検証できないのだが、
なんでvc9だと通るんだ??
template <void * P>
class A {};
void *f() { return NULL; }
int main() { A<f()> a; return 0; }
だったらわかるけど。
0054デフォルトの名無しさん
2008/05/31(土) 02:13:29自己レス。すまん、これか!
ほほぉ。ややこしいねぇ
0055デフォルトの名無しさん
2008/06/01(日) 19:52:42>ビルトイン型で明示的に「コンストラクタ」を使って得られる値は
>0 をその型に変換した値になる、
と、「コンストラクタ」と書かれているわけだが。
んで引数なしだから明らかにデフォルトコンストラクタだろ。
0056デフォルトの名無しさん
2008/06/02(月) 21:07:16その関数の中では、その参照からアドレスを得るか他の参照変数を初期化する操作しかしないとして。
0057デフォルトの名無しさん
2008/06/03(火) 00:09:19って言われてるけど、規格書レベルでの合法かどうかのソースは出てない。
規格書で保証があるなら、俺も知りたい所。
0058デフォルトの名無しさん
2008/06/03(火) 12:49:04あとで状態の種類を増やしたくなった時、Stateパターンの方が保守しやすいと思っているのですが、
私が見てきたサンプルコードでは、enumを使っている例が多く感じます。
この2つの実装方法は、どのような事を考えて使い分ければいいのでしょうか?
0059デフォルトの名無しさん
2008/06/03(火) 17:54:500060デフォルトの名無しさん
2008/06/03(火) 22:19:050061デフォルトの名無しさん
2008/06/03(火) 22:43:31状態の数少ないし、stateにしてクラス数増えるのもしんどいし
あんまり変更もなさそうだからenumでswitchしちゃえ
増えるようならstateに書き直そう
(2)能力不足
state間で情報を共有する美しい方法が思いつかない
グローバル変数使うとアイツが怒るし・・・
そうだ、enumでswitchしとけば全部同一クラス内だから問題ナシ
006258
2008/06/04(水) 12:33:24どうもです。
小規模なものならenumで十分ということですか。
state間で情報共有ですが、各stateに親クラスへのポインタを持たせて〜っていう方法では、
getter/setterが増えてしまうのが問題ということでしょうか。
0063デフォルトの名無しさん
2008/06/04(水) 18:20:21class Y { int y; Y(X a) : y(a.x) {} };
のようにメンバ変数の初期化で private にアクセスできるでしょうか?
0064デフォルトの名無しさん
2008/06/04(水) 18:26:490065デフォルトの名無しさん
2008/06/04(水) 20:42:00xの
Yが丸見えだと?
ごめんなんでもない
0066デフォルトの名無しさん
2008/06/04(水) 21:26:450067デフォルトの名無しさん
2008/06/05(木) 10:33:50buffonの針のシミュレーションでπを求めるプログラムなんですけど
Borland C++ Compilerでコンパイルすると
C:\borland\bcc55\src\C++>buffon.exe
Length of needle (0<L<=1): 1
Drop total of needle : 100
Number of hits = 55
Pi = 3.63636
という風にシミュレーション結果が出るんですが、
同じソースをcygwin g++(version4.2.4)でコンパイルすると
$ ./a.exe
Length of needle (<=1): 1
Drop total of needle : 100
Number of hits = 100
Pi = 2
という風におかしなシミュレーション結果になってしまうんですが、何が原因なんでしょうか?
0068デフォルトの名無しさん
2008/06/05(木) 11:26:10y座標の乱数生成に問題がある。
rand()関数が返す値の最大値は定数RAND_MAXで判るけど、
これが65536前後しかないコンパイラは多数ある。
その式だとy座標には0か1しか返ってこない。
0069デフォルトの名無しさん
2008/06/05(木) 11:55:10アドバイスありがとうございます。
ちゃんと動くようになりました。
0070デフォルトの名無しさん
2008/06/05(木) 19:41:00それで、templateで指定する型の取りうる範囲
を調べたいのですが、何か良い方法はありませんでしょうか?
template<T>
(略)
public:
int str[Tの取り得る範囲];
内部にこういう変数の宣言に関してもあるので・・・。
0071デフォルトの名無しさん
2008/06/05(木) 19:44:080072デフォルトの名無しさん
2008/06/05(木) 19:45:130073デフォルトの名無しさん
2008/06/05(木) 20:05:300074デフォルトの名無しさん
2008/06/05(木) 20:18:10numeric_limitsの特殊化も提供しろって
0075デフォルトの名無しさん
2008/06/06(金) 15:56:46下記みたいなソースを考えた。
GeoOpen関数へ引数無しだとちゃんとreturnされてくるんだが、
引数を作るとエラーが起こっちゃうんだよ。
printfはちゃんとされてるからまさにreturnでエラーが起こってる様子。
ちなみにエラー文はコレ↓
「The value of ESP was not properly saved across a funciton call.
This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.」
なんぞこれーー
コンパイラが違うから起こってるエラーなのか。。。
■MinGW側cpp(DLL作成側)
extern "C" __declspec(dllexport) int __stdcall GeoOpen(int inta) {
printf("%u", inta);
return 1;
}
■VC++側cpp(DLL読み込み側)
GEOOPEN geoOpen = (GEOOPEN)GetProcAddress(hGEOCODERDLL, "GeoOpen@4");
if (geoOpen != NULL){
int intRes = (*geoOpen)(testInt);
}
0076デフォルトの名無しさん
2008/06/06(金) 15:58:29もしかしてスレチなのかな。
0077デフォルトの名無しさん
2008/06/06(金) 16:00:59■VC++側cpp(DLL読み込み側)
testInt = 1;
0078デフォルトの名無しさん
2008/06/06(金) 16:05:270079デフォルトの名無しさん
2008/06/06(金) 16:07:09まあ呼び出し規約が一致してないんじゃないかなあ。
0080デフォルトの名無しさん
2008/06/06(金) 16:07:440082デフォルトの名無しさん
2008/06/06(金) 16:16:12ぐほー!
正にその通りでしたっ
ありがとうございます!
0083デフォルトの名無しさん
2008/06/07(土) 05:17:16どうやれば良いのでしょうか?
(unsigned T)num;
はエラーになってしまうので・・・。
0084デフォルトの名無しさん
2008/06/07(土) 05:32:20あるいは自分で同等のメタ関数を書く。
0085デフォルトの名無しさん
2008/06/07(土) 05:43:10ゲームを作るときに速度や位置といったよく変更するものは一箇所のヘッダーにまとめたほうがいいのでしょうか
それとも、その値を使うヘッダーごとに分けたほうがいいのでしょうか
前者だと、変更するたびにコンパイルの時間が長くなるし、
後者だと、書いてるヘッダーを探す手間が増えるというように、
長所と短所があるのでアドバイスをお願いします
0086デフォルトの名無しさん
2008/06/07(土) 06:19:35固定配列のサイズ指定でmax() の戻り値使うと、可変長配列にならね?
C99なら問題無いけど、C++だと規格上不正のような気がする。
とはいえGCC4は通っちゃったので俺が間違ってるのか
>>70
boost使えるのならこういうのがあるYo
boost::integer_traits<T>::const_max
0087デフォルトの名無しさん
2008/06/07(土) 10:03:09定義ファイルから読み込む
008883
2008/06/07(土) 12:18:14レスありがとうございます。
boostは環境で使えないので
メタ関数を書いたのですが・・・
template <typename T>
struct add_unsigned
{
typedef unsigned T type;
};
で、エラーが出ます。
unsignedではなくconstなどでは問題なくコンパイル通るのですが・・・
008983
2008/06/07(土) 12:24:42template <class T> struct add_unsigned{ typedef T type; };
template <> struct add_unsigned<char>{ typedef unsigned char type; };
template <> struct add_unsigned<wchar_t>{ typedef unsigned int type; };
template <> struct add_unsigned<int>{ typedef unsigned int type; };
こんな感じで解決する事にしました。
どうもありがとうございました。
009085
2008/06/07(土) 15:55:13定義ファイルだとユーザが変更出来るという点が気になって使ってなかったんですが、
気にしなくていいのでしょうか
それとも配布前にコードに埋め込んで配布という形を取るのでしょうか
0091デフォルトの名無しさん
2008/06/07(土) 16:54:34ヘッダで宣言してソースで定義すればいいんじゃないの?
0092デフォルトの名無しさん
2008/06/07(土) 17:50:01コードに埋め込めばユーザーが変更できないとでも?
0093デフォルトの名無しさん
2008/06/07(土) 18:03:16俺もそれ思ったけど、
定数自体よく増えそうじゃね?
その場合、定数取得用の関数に文字列渡して
ソースの方でマッピングするくらいしか無いと思う。
マクロ使って、開発中は関数+文字列渡しで、
リリース時は本当の定数にするのも手だけど、
うまいマクロ書けずに諦めた。
0094デフォルトの名無しさん
2008/06/07(土) 18:29:25適当なテキストファイルにa=bの形式でひたすら列挙したものを読み込むクラスとか、そんなに手間でないし便利だから作っておくといいんじゃね?
俺は保存とかコメント付けもしたいからxml使ってるが。
0095デフォルトの名無しさん
2008/06/07(土) 18:42:44>>93は同じような文字列(宣言と定義)を2箇所に書くのがいやだとかそういう話?
0096デフォルトの名無しさん
2008/06/07(土) 21:21:47じゃなくて、値だけがよく変わるならそれ(cppの書き換えだけ)で良いけど、
定数が増える場合は宣言も当然追加しないといけないので、
ヘッダ書き換える事になって、
結局includeしてる全cppがコンパイルし直しになるな、と。
まぁ、>>85が定数増やすこと有るかどうか分からないけどね。
0097デフォルトの名無しさん
2008/06/07(土) 21:25:14定数使うソースは使う定数の分だけヘッダをインクルードすればいいんじゃね?
0098デフォルトの名無しさん
2008/06/07(土) 22:40:18テンプレート引数にくるクラスが前方宣言されただけの時コンパイラに未定義の構造体と警告されてしまいます。
でもcppの方で実際の定義が分かるので、一応コンパイルは通ってるみたいなんですが、
コンパイラを黙らせるにはどのように書くのが良いのでしょうか?
ヘッダ
class hoge;
class piyo{
sokuseki_ptr<hoge> hoggee;
};
ソース
struct hoge{ 〜 }
(hoggeeの使用)
0099デフォルトの名無しさん
2008/06/07(土) 23:27:42公開するAPI関数の定義(XXX.h)を extern "C" {} ブロックで囲っているのですが、
関数の本体(XXX.cpp)も同じように extern "C" {} ブロックで囲う必要があるのか分かりません
もちろんインターネットで検索をかけていますが、今のところ有用な情報がないです
両方とも囲う必要があるのか教えてください
0100デフォルトの名無しさん
2008/06/07(土) 23:36:28試してみれば?
0101デフォルトの名無しさん
2008/06/07(土) 23:45:59コンパイルは通りました
defファイルも作成できました
しかし、これで正しいのかが分からないのです
0102デフォルトの名無しさん
2008/06/07(土) 23:48:23BCB2007の付属品のBCC5.9.3では何のエラーも警告も出ない。
5.5.1のバグというか癖では?
0103デフォルトの名無しさん
2008/06/08(日) 00:08:39ソート済みのvectorに対してupper_boundで取得してきたイテレータから
そもvectorにおけるインデックス番号はどうやれば取得できるでしょうか?
0104デフォルトの名無しさん
2008/06/08(日) 00:11:180105デフォルトの名無しさん
2008/06/08(日) 00:24:29名前マングルか名前マングリングでググれ。
0106デフォルトの名無しさん
2008/06/08(日) 01:22:37ほんとだ。ありがとうございます!
0107デフォルトの名無しさん
2008/06/08(日) 01:33:02いくつか有用な情報が得られました
ありがとうございました
0108デフォルトの名無しさん
2008/06/08(日) 02:07:53VC++2008を使用しているのですが
STLのvectorのsize()って、メソッドが呼ばれたらその都度数えているのでしょうか?
それとも、内部に、数量を管理する変数があって、その値を返しているのでしょうか?
0109デフォルトの名無しさん
2008/06/08(日) 02:11:13VC6 の STL なんかは begin と end のポインタを保持していてその差を返してるが、
全ての STL でそういう実装になっているとは限らない。
0110デフォルトの名無しさん
2008/06/08(日) 02:11:44とはいっても引き算1回
意味的には
vector<T> v;
v.end() - v.begin()
と同じ
0111デフォルトの名無しさん
2008/06/08(日) 02:17:45strlen みたいな O(N) の数え方はしていないな。
0112デフォルトの名無しさん
2008/06/08(日) 03:00:160113デフォルトの名無しさん
2008/06/08(日) 03:25:400114108
2008/06/08(日) 06:23:00それほど遅くはならない仕様なんですね。
今使ってるプログラムは
配列を使ってmalloc()で逐次拡張していくプログラムなんですが
これをvectorに置き換えたんですが、なんか100倍近く遅くなってるんですよね。
基本的に、配列と同じく[]しか使わなかったし
mallocで1つずつ拡張してた場所をresizeやらpush_backに置き換えただけなのに・・・。
元が1時間くらい回しっぱなしのプログラムなので、vectorに置き換えたら10時間くらいかかるようになってしまった・・・。
0115デフォルトの名無しさん
2008/06/08(日) 07:52:43vectorは一般的に[]は速く、resizeやpushu_backは遅い。reservを調べよ。
0116デフォルトの名無しさん
2008/06/08(日) 08:28:37vectorは1つの連続したメモリで管理しています。
resize()、push_back()は内部の配列のメモリは大体二倍ずつ増えるようになっています。
resize()は縮小しても内部のメモリを再割り当てしない様になっています。
STLのソースを読むのが早いのではないですか?
0117デフォルトの名無しさん
2008/06/08(日) 08:59:30void f(vector<A> v);
f(v);
とかやってるんではないですか?
void g(vector<A>& v);
ではなく。
011885
2008/06/08(日) 09:00:57アドバイスを参考に色々考えた結果、ヘッダで宣言して定義をソースに書き、
設定する値は、デバック時はINIファイルやXMLファイルから読み込み、
配布時は埋め込んだコードを使うということにします。
アドバイスありがとうございました。
0119デフォルトの名無しさん
2008/06/08(日) 10:17:40VC++2008のSTLはセキュリティのために色々やっていて遅い。
#define _SECURE_SCL=0を書いてからヘッダをインクルードすると
それがなくなってだいぶ速くなる。
0120デフォルトの名無しさん
2008/06/08(日) 10:41:43そんなうえーんな事って他のコンパイラにもありうる?
例えば2005とか
0121デフォルトの名無しさん
2008/06/08(日) 11:42:210122デフォルトの名無しさん
2008/06/08(日) 12:13:34typo ひどすぎw
0123デフォルトの名無しさん
2008/06/08(日) 14:54:030124デフォルトの名無しさん
2008/06/08(日) 15:03:540125デフォルトの名無しさん
2008/06/08(日) 17:34:260126デフォルトの名無しさん
2008/06/08(日) 17:43:430127デフォルトの名無しさん
2008/06/08(日) 17:47:00セキュリティとはどんなセキュリティで
なにをしているんですか?
0128デフォルトの名無しさん
2008/06/08(日) 18:27:56int* p = &hoge[0]; // NOT SECURE!!!
っていう
0129デフォルトの名無しさん
2008/06/08(日) 18:31:09それわざわざヘッダに書かずコンパイラオプションでいいよな
ポータブルなC/C++コードをコンパイルしたいときは
その手の呪文をやたらと唱える必要あるよね、VC++8以降だと
0130デフォルトの名無しさん
2008/06/08(日) 18:33:15operator []やイテレータでの範囲チェック。
ナントカ_sって関数に変えないCと違って、
何もしなくていいというのはC++さすがというべきところだけど、
どうしてもお節介という感じは否めない。
0131デフォルトの名無しさん
2008/06/08(日) 19:11:08そんなのはC#でやればいい話だ。
0132デフォルトの名無しさん
2008/06/08(日) 19:19:520133デフォルトの名無しさん
2008/06/08(日) 19:28:20オーバーヘッドのある冗長なチェックをどこまで行うかは、ライブラリの実装しだいで使用者の自由ってことかな。
0134デフォルトの名無しさん
2008/06/08(日) 19:38:38class使っちゃったら、コンストラクタが呼ばれてオーバーヘッドが起きたりとか・・・
工夫すりゃ回避できるけど、言語自体は"デフォルト"では、オーバーヘッドだらけでしょ。
0135デフォルトの名無しさん
2008/06/08(日) 19:43:07コンストラクタが呼ばれてオーバーヘッド?
どんな場合の話だ?
0136デフォルトの名無しさん
2008/06/08(日) 19:43:20実効速度を重視して言語を設計してますよね。
0137デフォルトの名無しさん
2008/06/08(日) 19:46:30>class使っちゃったら、コンストラクタが呼ばれてオーバーヘッドが
いいえ
>言語自体は"デフォルト"では、オーバーヘッドだらけでしょ。
いいえ
D&EのC++言語の設計ルールの章に書かれてるけど、
C++には「ゼロオーバーヘッドルール」というのがありまして。
0138デフォルトの名無しさん
2008/06/08(日) 20:24:490139デフォルトの名無しさん
2008/06/08(日) 20:56:29実際問題、速度差が出てるんだから、言い訳出来まい。
0140デフォルトの名無しさん
2008/06/08(日) 20:58:08仮想関数だって投機実行が効かないんだから
0141デフォルトの名無しさん
2008/06/08(日) 20:59:53理想論だけどね ;-)
0142デフォルトの名無しさん
2008/06/08(日) 21:08:260143デフォルトの名無しさん
2008/06/08(日) 21:13:070144デフォルトの名無しさん
2008/06/08(日) 21:14:33ただ、速度を犠牲にして抽象化したくなる誘惑が多いということで。
0145デフォルトの名無しさん
2008/06/08(日) 21:21:11それともメンテナンスを犠牲にしてベタコードでパフォーマンスを追及するかの選択は使用者が選べるのが利点だわな。
0146デフォルトの名無しさん
2008/06/08(日) 21:34:030147デフォルトの名無しさん
2008/06/08(日) 21:40:170148デフォルトの名無しさん
2008/06/08(日) 21:58:28バイナリ指向なwrite関数はvoid*が使いやすいよな。
0149デフォルトの名無しさん
2008/06/08(日) 21:59:080150デフォルトの名無しさん
2008/06/08(日) 22:04:590151デフォルトの名無しさん
2008/06/08(日) 22:09:550152デフォルトの名無しさん
2008/06/08(日) 22:12:39実は俺も「マジで?」って思ってググッたw
大丈夫const付いてる。146が省略しただけ。
0153デフォルトの名無しさん
2008/06/08(日) 22:22:340154デフォルトの名無しさん
2008/06/08(日) 22:33:58それもconstついているぞ。
0155デフォルトの名無しさん
2008/06/08(日) 22:35:510156デフォルトの名無しさん
2008/06/08(日) 22:39:310157デフォルトの名無しさん
2008/06/08(日) 22:42:33structだけで良いよ。
0158デフォルトの名無しさん
2008/06/08(日) 22:59:10classとstructの違いが分からないとは
0159デフォルトの名無しさん
2008/06/08(日) 23:05:22typename asdf<int>::type;
0160デフォルトの名無しさん
2008/06/08(日) 23:26:55分かった上で言ってるんだけど。
class無いと出来ないことってあったっけ?
0161デフォルトの名無しさん
2008/06/08(日) 23:32:05いらねーな、やっぱw
0162デフォルトの名無しさん
2008/06/08(日) 23:33:01basic_fstream<wchar_t> のことを考えると
已む無しなんだろうなあと思う。
0163デフォルトの名無しさん
2008/06/09(月) 00:22:27こんなのとか
template <template <typename T> class U>
0164デフォルトの名無しさん
2008/06/09(月) 00:25:05もういっその事
template <(template <typename T>) typename U >
にしちゃえば良かったのに
0165デフォルトの名無しさん
2008/06/09(月) 00:33:24をそのまま突っ込む形(現状)がベストだと思うけど。
0166デフォルトの名無しさん
2008/06/09(月) 00:38:57がよくて
template <template <typename T> typename U>
template <template <typename T> struct U>
がダメな理由がわからん。
0167デフォルトの名無しさん
2008/06/09(月) 00:39:49ただ、元からclassが無ければ↓という構文になっていただろうけどな
template <template <typename T> struct U>
まぁ、あの偉大な禿も万能なわけじゃないからな
0168デフォルトの名無しさん
2008/06/09(月) 00:41:49それなら typename も OK でいいだろって感じにして・・・
って感じに C++0x でなったりするのかな。
0169デフォルトの名無しさん
2008/06/09(月) 00:55:47むしろstructを非推奨に
ところで何で、びよよん先生を禿っていうの?
ハゲてるから?ハゲだから?
0170デフォルトの名無しさん
2008/06/09(月) 01:06:07C++の誕生当時はオブジェクト指向は一般的じゃなかったから
言語側がユーザーを啓蒙する必要があったんだと思う
0171デフォルトの名無しさん
2008/06/09(月) 01:36:18階級闘争でいうところの階級な
中産階級とか、総中流意識とか
ブルーカラー、ホワイトカラーとか
そういうイメージ
嘘だけど
0172デフォルトの名無しさん
2008/06/09(月) 08:52:460173デフォルトの名無しさん
2008/06/09(月) 19:20:370174デフォルトの名無しさん
2008/06/09(月) 19:58:320175デフォルトの名無しさん
2008/06/09(月) 21:06:430176デフォルトの名無しさん
2008/06/10(火) 14:37:260177デフォルトの名無しさん
2008/06/10(火) 18:25:190178デフォルトの名無しさん
2008/06/10(火) 22:36:39見慣れないうえにあんまり意味無いと思うからお勧めはしない。
0179デフォルトの名無しさん
2008/06/10(火) 23:31:490180デフォルトの名無しさん
2008/06/11(水) 01:13:48あるいは処理系に依存するのかをききたいんじゃね
0181デフォルトの名無しさん
2008/06/11(水) 01:15:29それでは std::char_traits 相当の UcharTraits を定義して
std::basic_fstream<unsigned char, UcharTraits>
とすると使えるでしょうか?
0182デフォルトの名無しさん
2008/06/11(水) 01:16:290183デフォルトの名無しさん
2008/06/11(水) 01:41:47やりたいことは
put( unsigned char ) と write( const unsigned char*, streamsize )
を使ってバイナリデータをファイルに書き込むことです。
このとき1バイトは0から255を表現できないといけないので最低 unsigned char の型が必要です。
型が char の場合、どの処理系でも使える範囲は0から127までなので目的を果たせません。
0184デフォルトの名無しさん
2008/06/11(水) 01:54:15バイナリデータとしてみると算術型は違ってもビットパターンを変更しないキャストは実質的に同じデータを指す。
writeはchar*を引数に取るけど、そのポインタがintであれwchar_tであれエンディアンとサイズが正常であれば問題ない。
つまり任意のデータのポインタをchar*として見ることは、その先にあるデータをビットパターンを変更せずにキャストする事に相当する。
0185デフォルトの名無しさん
2008/06/11(水) 02:01:01キャストとはちょっと違う。 char* はオブジェクトの内部表現となる
メモリの読み出し〜書き込みに使えることになっている。これは
unsigned char も signed char も同じ。
ってことで、バイナリ出入力したいだけなら普通の fstream で十分。
0186デフォルトの名無しさん
2008/06/11(水) 02:15:47fstream で何の問題も無くバイナリの入出力ができる。
0187デフォルトの名無しさん
2008/06/11(水) 13:00:02それは仕様書で言えばどのあたりで分かるでしょうか?
JIS X 3010-1993 は6章ぐらいまで目を通したのですが見当たりませんでした。
0188デフォルトの名無しさん
2008/06/11(水) 16:23:350189デフォルトの名無しさん
2008/06/11(水) 16:39:28185じゃないけど、
ISO/IEC 9899 [6.5.3.4] でどう?
sizeof(char)==1の保証 → 単位粒度で扱えることの保証。
0190デフォルトの名無しさん
2008/06/11(水) 16:56:053.9 Types
2 For any object (other than a base-class subobject) of trivial type T, whether or not the object holds a valid value of type
T, the underlying bytes (1.7) making up the object can be copied into an array of char or unsigned char.36) If the
content of the array of char or unsigned char is copied back into the object, the object shall subsequently hold its
original value.
36)By using, for example, the library functions (17.4.1.2) std::memcpy or std::memmove.
0191デフォルトの名無しさん
2008/06/11(水) 17:14:51ID出る板限定+多少巻き添え有りで良ければ、
NGワードのIDの欄に「O」を加えると消せる。
0192デフォルトの名無しさん
2008/06/11(水) 17:17:350193デフォルトの名無しさん
2008/06/11(水) 17:24:400194デフォルトの名無しさん
2008/06/11(水) 18:24:26ほとんど同じ構成(コード)でC++に移植したらサイズが900KBまでふくらみました
これって正常ですか?
VS2008、C++ 非MFCのアプリケーションです
0195デフォルトの名無しさん
2008/06/11(水) 18:28:090196デフォルトの名無しさん
2008/06/11(水) 18:32:280197デフォルトの名無しさん
2008/06/11(水) 18:39:43C++はランタイムライブラリが大きいということですか?
>>196
いえ、リリース用のビルドでそのサイズです
最適化オプションも分かる範囲で変更してみましたが あまり変化なしでした
0198デフォルトの名無しさん
2008/06/11(水) 18:43:50VBはランタイムDLLが別だからその分を考慮しろ。
0199デフォルトの名無しさん
2008/06/11(水) 18:44:49http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=7B9BA261-7A9C-43E7-9117-F673077FFB3C
>ダウンロード サイズ : 1.0 MB
>Visual Basic 6.0 を使用して作成されたあらゆるアプリケーションは、これらのファイルを必要とします。
0200デフォルトの名無しさん
2008/06/11(水) 18:48:10>>194のはVS2008のVBですが
それもDLLが別ということですよね?
0201デフォルトの名無しさん
2008/06/11(水) 18:48:240202デフォルトの名無しさん
2008/06/11(水) 18:50:36VB 2008のランタイムたる.NET Frameworkは数百MBある。
あと、一応聞いておくが、C++製はCLRフォームアプリケーションじゃないほうだよね?
0203デフォルトの名無しさん
2008/06/11(水) 18:52:49>C++製はCLRフォームアプリケーションじゃないほうだよね?
それです
0204デフォルトの名無しさん
2008/06/11(水) 20:28:33なかなかいい情報ありがとう。
でもここでいっているコピーって memcpy() や memmove() を想定しているような気がする。
普通に char, unsingned char ポインタ経由で代入した場合も同じことが言えるのかな?
0205デフォルトの名無しさん
2008/06/11(水) 21:48:42クリティカルセクション用のクラスを作成しています。
外部からCRITICAL_SECTION構造体を渡さなくても済むように、
staticなメンバ変数としてCRITICAL_SECTIONオブジェクトを作成し、
それに対してInitializeやEnter、Leave、Deleteを行うようにしています。
しかし、ネット上で似たようなコード見つけられていないことから、
本当にこれでスレッドセーフが実現できているのか不安です。
何か問題はありそうでしょうか?
0206デフォルトの名無しさん
2008/06/11(水) 22:46:43それだとお互いに無関係なクリティカルセクション同士でも排他してしまうな。
というか、二重にInitializeとかDeleteとかしてしまうのでアウト。
CRITICAL_SECTION構造体は非staticなメンバ変数にすればよろし。
0207デフォルトの名無しさん
2008/06/11(水) 23:11:40なるほど、考えが足らなかったです。
ありがとうございます。
0208デフォルトの名無しさん
2008/06/12(木) 00:14:55いいんだっけ?
0209デフォルトの名無しさん
2008/06/12(木) 00:27:16いかにもWinSTLが持っていそうだ。
0210デフォルトの名無しさん
2008/06/12(木) 00:37:070211デフォルトの名無しさん
2008/06/12(木) 02:49:00190 は明らかに char や unsigned char の配列として(ポインタ経由で)読み書きした
場合のことを想定した記述だろ。
ほかには 3.10 p15 にある aliasing rule でも char, unsigned char だけ、
そういう直接アクセスを許すように特別扱いされてたりすることから、任意のオブジェクトに
対する char, unsigned char 経由でのアクセスは規格の意図として想定されているものと
考えられる。
よく見ると signed char はダメみたい。微妙だなー。
0212デフォルトの名無しさん
2008/06/12(木) 12:08:090213デフォルトの名無しさん
2008/06/12(木) 12:14:00char が符号付きでも符号無しでも signed char とは関係ない
0214デフォルトの名無しさん
2008/06/12(木) 12:33:31c++で同じ構成の共通関数を作ろうとしても参照エラーが出てうまくいきません
下記のコードをc++用にした場合 クラス、関数はそれぞれ
どのように宣言するのが正しいでしょうか?
Public Class main
Sub ボタンクリック イベント
sub.関数() '違うクラスの共通メソッド呼び出し
End Sub
End Class
Public Class sub
Public Shared Sub 関数()
End Sub
End Class
0215デフォルトの名無しさん
2008/06/12(木) 12:43:19C++のソース貼らないと答えようがない。
0216デフォルトの名無しさん
2008/06/12(木) 12:44:18public:
void button_click_event();
};
class sub {
public:
static void kansu();
};
void main::button_click_event()
{
sub::kansu();
}
void sub::kansu()
{
}
たぶんこんな感じ?
0217デフォルトの名無しさん
2008/06/12(木) 13:10:00namespace test {//Namespace
public ref class Form1 : public System::Windows::Forms::Form{//Class Form
private: System::Void code_Click(System::Object^ sender, System::EventArgs^ e) {//イベント
sub::kansu(); //共通関数 呼び出し
}//イベント
};//Class Form
class Sub{//Class Sub
public :
void kansu();
};//Class Sub
void Sub::kansu(){// 共通関数
};//共通関数
}//Namespace
こんな感じです、共通関数を違うClassのForm1から呼びだして使いたいのですが
識別子が見つからない等のエラーが出てうまくいきません
>>216
そのコードのように修正してみましたが
クラス、識別子が見つからないという同じエラーが出てだめでした
0218デフォルトの名無しさん
2008/06/12(木) 13:22:02・sub::kansu() の呼び出しは sub の定義よりも下で行う
・class Sub と sub::kansu で sub の大文字と小文字が異なる
0219デフォルトの名無しさん
2008/06/12(木) 13:25:47・エラーメッセージは一字一句正確に書け
0220デフォルトの名無しさん
2008/06/12(木) 13:29:36うまく動きました、みなさんどうもありがとうございます
>・class Sub と sub::kansu で sub の大文字と小文字が異なる
コードではちゃんとなっているのですが
ここに書くときに記述ミスしていました、申し訳ないです
0221デフォルトの名無しさん
2008/06/12(木) 18:17:233.9 p2 は
「そのオブジェクトを構成するバイトは、char または unsigned char の配列にコピーできる」に対して
「例えば、ライブラリ関数 std::memcpy または std::memmove を使って」という注釈があるけど
char 配列の要素ごとの代入でコピーできるなら「std::memcpy や std::memmove も含まれる」のような
ニュアンスで注釈を付けるんじゃないかな?
それと 3.9 p2 はあるオブジェクトを char 配列にコピーして、その配列から元のオブジェクトにコピー
したときにオブジェクトが元の内容に戻ることを保障しているだけで、同型の他のオブジェクトに対しては
どうなるか分からないんじゃない?
3.9 p3 では char 配列を通さずに std::memcpy でコピーすればオブジェクトが同じ内容になるようです。
3.10 p15 は未定義ではないだけで結果は処理系定義ということもありえるんじゃない?
0222デフォルトの名無しさん
2008/06/13(金) 07:57:56> char 配列の要素ごとの代入でコピーできるなら「std::memcpy や std::memmove も含まれる」のような
> ニュアンスで注釈を付けるんじゃないかな?
"for example" って書いてあるんだから、そういうことだと思うよ。
1.7, 1.8 より、 POD 型のオブジェクトはメモリ上で連続する
バイト列とされている。
3.9.1 p1 により、 char, unsigned char はバイト中のすべての
ビットが値に反映されることになっているので、これらの型を介して
バイトを正確にコピーできる。
memcpy などの動作は引数の指すメモリ上の位置から連続する
バイト列に対する操作として定義されているので、 char* を使って
同様にバイト列をコピーするコードを書けば同じ意味になる。
そのような操作に対する意味が 3.9 p2, 3.9 p3 の範囲で確定する。
これ以外のバイト操作( POD 型のオブジェクトに属さないバイトの
操作や、オブジェクトひとつに満たない部分的な操作)については
意味も動作も規定はない。(不定?)
0223デフォルトの名無しさん
2008/06/13(金) 08:14:030224デフォルトの名無しさん
2008/06/13(金) 08:21:140225デフォルトの名無しさん
2008/06/13(金) 10:20:30初心者スレ、もしくはMFC, WTL, C++/CLIなどで該当するスレへ。
開発環境は必ず書くこと。
0226デフォルトの名無しさん
2008/06/13(金) 11:52:30array<String^> ^data = gcnew array<String^> (40)(40);
とするとエラーが出ます
どうやって宣言したらいいですか?
0228デフォルトの名無しさん
2008/06/13(金) 12:23:01CLIはC++じゃないのですれ違い。
0229デフォルトの名無しさん
2008/06/13(金) 13:51:26じゃ CLIなC++は何言語なんだよ?w
バカかお前ww
0230デフォルトの名無しさん
2008/06/13(金) 13:55:450231デフォルトの名無しさん
2008/06/13(金) 14:00:53static void Func()
{
・・・
};
を B.cpp、C.cppそれぞれでインクルードすると実体はそれぞれにできるんでしょうか?
0232デフォルトの名無しさん
2008/06/13(金) 14:02:42>227
0233デフォルトの名無しさん
2008/06/13(金) 14:03:33C++/CLIはC++を拡張した別の言語としてEcmaで標準化されてるよ。
0234デフォルトの名無しさん
2008/06/13(金) 14:03:59はい。但し、そのFunc()を例えばB.cppでは使いC.cppでは使わなかったとすると、一つだけになるかもしれません。
# 勿論、どちらでも使わない場合は一つもないかもしれないわけで。
0235デフォルトの名無しさん
2008/06/13(金) 14:05:250236デフォルトの名無しさん
2008/06/13(金) 14:13:59うわぁぁ。そうなんだ。
staticつければ必ずひとつになると思っていました。ありがとう。
こういう場合ひとつだけにするにはテンプレートにするしかないのかな。
ヘッダに記述すること自体の是非は別として。
0237デフォルトの名無しさん
2008/06/13(金) 14:19:46いや、テンプレートにするかしないかとstaticかどうかは別の問題だから。
つーか、>231の場合でもどうせインライン展開されるから消えてなくなると思うし、
テンプレート関数にしたところでインライン展開されなければ複数できてもおかしくはない。
で、一つにしたい積極的な理由があるの?
0238デフォルトの名無しさん
2008/06/13(金) 14:42:06が嫌だからなんです・・。
いろいろなコンパイラで使えればな〜と思っていたらどうしてもこれが邪魔で。
プリコンパイル済みヘッダーの設定変えればいいのでしょうけど、ファイルをコピー、
includeですぐに使えるような書き方はないかな〜と。
0239デフォルトの名無しさん
2008/06/13(金) 14:50:41上記理由でどうせ同じ関数なんだからひとつにしてファイルサイズ減らせないかなと
思っていた次第です。
0240デフォルトの名無しさん
2008/06/13(金) 14:52:05理由がそれだけなら、最適化するとどうせインライン展開されて消えてなくなるから気にするな。
0241デフォルトの名無しさん
2008/06/13(金) 15:27:25ファイルサイズは逆に増えるよね。
0242デフォルトの名無しさん
2008/06/13(金) 15:33:47とりあえず最適化に任せてみます。
0243デフォルトの名無しさん
2008/06/13(金) 16:11:17#include "bar.h"
class foo
{
(略)// barは出てこない
};
===foo.cxx===
#include "foo.h"
(略)// barが出てくる
とやるのと、
#include "bar.h"
をfoo.cxxの中に持ってくるのは、
どちらにどういうメリットデメリットがあるのでしょうか。
また、一般的にはどちらの書き方が推奨されますか。
0244デフォルトの名無しさん
2008/06/13(金) 16:13:13特に他言語で作ったクラスライブラリがそのまま使えるお得感は感動ものだ
0245デフォルトの名無しさん
2008/06/13(金) 16:17:15ヒント:依存関係、カプセル化
0246デフォルトの名無しさん
2008/06/13(金) 17:46:14後者。素直に使う所に書く、で必要十分。
前者にメリットは無い。fooを使うやつのコンパイルがbar.hの分遅くなるだけ。
0247デフォルトの名無しさん
2008/06/13(金) 18:14:43//データの構造体-----------
struct dataA
{
int m_dataA;
CLSA * m_next //クラスのポインター
};
//使用するクラス------------
class CLSA
{
dataA m_dat[100]; //データの配列
};
dataAの中にクラスのポインターを持つ。この状態ではCLSAが無いと言われます。
順番を変えるとクラスの中でdataA構造体が無いと言われます。
対処方法が無いでしょうか?
0248デフォルトの名無しさん
2008/06/13(金) 18:16:41CLSA * m_next; //クラスのポインター
0249デフォルトの名無しさん
2008/06/13(金) 18:32:36struct dataAの上に 「class CLSA;」を書く。
あと、どうでもいいけど何かよく分からないデータ構造だな。
dataA{ CLSA* m_parent; } とか
dataA{ dataA* m_next; } とか
CLSA{ CLSA* m_next; } なら分かるけど。
0250デフォルトの名無しさん
2008/06/13(金) 20:00:26データ構造は
root クラスインスタンス
|
|-ノード1クラスインスタンス
| : |-ノード1クラスインスタンス
| : |-ノード1クラスインスタンス
| :
|-ノード1クラスインスタンス
のような多段構造のようなもので、ノード分岐の意味をdataAの内部で示しています。
意味自体が単独で作られたり渡されたりするので、1つの構造体にしています。
0251デフォルトの名無しさん
2008/06/13(金) 20:08:54そのままシームレスに使えればだがな。
だが現実は・・・・ ハァー
0252デフォルトの名無しさん
2008/06/13(金) 22:04:323.9.1 p1 は「バイト中のすべてのビットが値に反映される」とはいっても、ビット列と値が
1 対 1 でないこともあるんじゃないかな。
例えば char が符号付きで符号ビットと絶対値で表現する場合、値 0 を表現するビット列が
2 パターンある。その処理系で char* を通して値 0 を読み、その値を char* を通して書く
とビット列が変わる可能性があるんじゃないかな?
0253デフォルトの名無しさん
2008/06/14(土) 00:03:390254デフォルトの名無しさん
2008/06/14(土) 04:05:09現行の規格で多少無理やり解釈すれば、 -0 と +0 は == で比較すれば
同じになるとしても、区別可能な(異なる value representation を持つ)二つの値
ということでコピーでビット列が変わる可能性は無い、とは言えそう。
ちょっと苦しいんで調べてみたところ、 C との互換性と合わせて見直しが
提案されているみたい。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2631.html
この中で C99 の規格を基本的にはそのままパクりながら、 C99 では
保証が無いものの、 C++ で半ば慣習的に行われてきた char による
object representation のコピーを保証するため、以下のような記述の追加が
見られる。
The types unsigned char and char may be used for “bitwise” copy.
[Note: this means that if signed char has a negative zero which is
either a trapping value, or will be forced to positive zero on assignment,
plain char must be unsigned. ?end note]
てきとう訳:
型 unsigned char と char は「ビット的」コピーに使ってもよい。
[注: これは、もし signed char が負のゼロをトラップ値として持つか
代入において正のゼロに強制されるのであれば、ただの char は
unsigned でなければならない、ということを意味する。 -注ここまで]
提案とは別に、議論の中では C++ では2の補数を強制してしまうような話も
出ていたらしい。実際のところはそれでもいいのかもしれない。
0255デフォルトの名無しさん
2008/06/14(土) 13:48:22どちらがより適切なのでしょうか?
struct A
{
int length; // textの長さ
unsigned char text[0]; // 利用者側で好きに領域を確保して先頭を格納。
};
struct B
{
int length;
unsigned char text[1];
};
違いはtext[1]とtext[0]だけなのですが、
text[1]としてしまうと、
unsigned char text[] = "aiueo";
A* a = (A*)malloc(sizeof(A) + strlen(text));
としたときに(処理系依存ですが)
intで4バイト、unsigned charがパディングされて4バイト
さらに文字列の長さで5バイト確保されます。
これだとunsigned charがパディングされた4バイトは無駄な領域の気がします。
text[1]とするメリットはあるのでしょうか?
0256デフォルトの名無しさん
2008/06/14(土) 14:12:25宣言より大きい配列のアクセスはお勧めできないと思う。
環境依存なしでそういう構造を作りたいなら
struct A
{
int length; // textの長さ
};
A* a = (A*)malloc(sizeof(A) + strlen(text));
で確保して
char* buff=(char*)(a+1);
で文字列にアクセス
文字列の構造体を作りたいなら以下の方がお勧めかな
struct A
{
int length; // textの長さ
unsigned char* text;
};
0257デフォルトの名無しさん
2008/06/14(土) 14:24:31unsigned char text[0]; はC89では認められていない。
C99から導入されたflexible array memberを使うなら、
unsigned char text[];
0258デフォルトの名無しさん
2008/06/14(土) 14:58:10なるほど。
今回初めてC++の仕様書に目を通してみたけど未定義や処理系定義の部分が多くて
正確に解釈するのははなかなか難しいですね。
現状の処理系に合わせて処理系定義の部分を削っていけばかなりシンプルになると
思いますけど。
0259デフォルトの名無しさん
2008/06/14(土) 15:18:36処理系を前提とした入門書を読もう。 処理系未定義はその後で。
0260255
2008/06/14(土) 19:20:57struct A{
int a;
unsigned char c[0];
};
gcc -c -pedantic test.c
としたら警告が出ました。
警告: ISO C forbids zero-size array 'b'
gccの独自拡張で可能になっているけれどC89自体では禁止されている
ということですね。
0261デフォルトの名無しさん
2008/06/14(土) 20:30:10http://www.google.co.jp/codesearch
0262デフォルトの名無しさん
2008/06/14(土) 20:31:460263デフォルトの名無しさん
2008/06/14(土) 20:32:490264デフォルトの名無しさん
2008/06/14(土) 20:34:410265デフォルトの名無しさん
2008/06/14(土) 20:54:240266デフォルトの名無しさん
2008/06/14(土) 20:56:31自演じゃねーよ、タコが
0267デフォルトの名無しさん
2008/06/14(土) 20:58:47イカですけど何か?
0268デフォルトの名無しさん
2008/06/14(土) 20:59:26創価、すまんかった
0269デフォルトの名無しさん
2008/06/14(土) 23:11:26using namespace std;
void func(int a = 0,long int b = 1000, double c = 2.9751)
{
cout<<"This is func[i].\n";
cout<<"a="<<a<<", b="<<b<<", c="<<c<<"\n\n";
}
void func(int a,double b =3.4152)
{
cout<<"This is func[ii].\n";
cout<<"a="<<a<<", b="<<b<<"\n\n";
}
void func(long int a)
{
cout<<"This is func[iii].\n";
cout<<"a="<<a<<"\n\n";
}
int main(void)
{
func(0,1000,2.9751);
func(0,3.14152);
func(0);
return 0;
}
オーバーロード関数が呼び出せませんと言うエラーが出るのですが、
何処が間違えているかわかりませんか?
未熟な私に教えていただけたらありがたいです。
0270デフォルトの名無しさん
2008/06/14(土) 23:16:36かわいそうな
つかいかたを
するな
0271デフォルトの名無しさん
2008/06/14(土) 23:22:17どれを呼んでいいのかワカンネ。とコンパイラ様は仰っておられる
0272デフォルトの名無しさん
2008/06/14(土) 23:23:24とりあえず、2個目と3個目のfuncを関数ごと
コメントアウトして実行してみ。
0273デフォルトの名無しさん
2008/06/15(日) 02:27:520274デフォルトの名無しさん
2008/06/15(日) 02:40:25危険といっても、だいたいコンパイルエラーか警告だけど。
必要なら既定引数を使わないで多重定義をがんばることもやる。
といってもこういうのはありにしているが。
void f(int x);
void f(double x);
void f(int x, int y, int z = 0);
//実引数1個なら多重定義の解決の候補に既定引数は関係しない。
//実引数2個ならデフォルト引数を使うがfの候補は1つに決まっているので良し。
0275デフォルトの名無しさん
2008/06/15(日) 03:02:24glibc-2.7のソースの中には無いようなのですが…
0276デフォルトの名無しさん
2008/06/15(日) 03:07:070277275
2008/06/15(日) 03:16:44ありがとうございます!
あった!なるほど#defineされてたわけですね。
#define fclose(fp) _IO_new_fclose(fp)
で、_IO_new_fcloseをたどっていくと
最終的に__closeという関数が呼ばれているようなのですが、
今度こそ定義がglibcにはありませんでした。
ここから先はどうやって追えばよいのやら…
0278デフォルトの名無しさん
2008/06/15(日) 03:17:10マクロになってるとかじゃないの?
0279275
2008/06/15(日) 03:22:33sysdeps/march/hurd/close.c
にありました。
実は、fcloseするときにバッファをディスクに同期する
部分がどうなってるのかを追いたかったのですが、
__closeから先はどうやら単にクローズしているだけのようです。
追いなおします。
0280デフォルトの名無しさん
2008/06/15(日) 03:25:42それはシステムコールじゃないかね。
そうだと、カーネルのソースを見る必要がある。
0281277
2008/06/15(日) 13:41:18ありがとうございます。
Linuxのソースを見てみました。
linux/include/asm-i386/unistd.h
の中に
#define __NR_close 6
というのがあって、
linux/arch/i386/kernel/syscall_tables.S
の中のテーブルの6番の位置は
sys_close
となっていたので、sys_closeで探すと
linux/fs/open.c
の中にあって、その中で呼んでいる
filp_close
の中でflushとかやっていました。
ただ、__closeから__NR_closeのつながりがわかりませんでした。
これをどこかで#defineされているものなのでしょうか。
0282デフォルトの名無しさん
2008/06/15(日) 13:58:38今時のOSだと、ユーザアプリがファイルをcloseした
からといって、いちいちディスクに同期は取らんと思うけど。
libcのfclose()は、fflush()を呼ぶなりして、少なくとも
ユーザアプリ(というかlibc)が握ってるデータがkernel側に渡るようにはする。
が、kernel側がダーティページをどう処理するかは、バッファキャッシュ管理の
問題になるんでは。
ぶっちゃけsyncとかがあるのはそのためでしょ。
0283デフォルトの名無しさん
2008/06/15(日) 22:44:48class X { class Impl; Impl* impl_; };
ユーザから見て A オブジェクトの生成と消去を X からしかできないようにしたいけど
impl_ の中で A を何らかのコンテナで管理するとき、そのコンテナは A と friend で
はないので A のコンストラクタとデストラクタを呼び出せません。A の中に実装のため
のクラスを friend として並べたくないし、実装の変更のたびに変更したくありません。
何か簡単に解決する方法はあるでしょうか?
0284デフォルトの名無しさん
2008/06/15(日) 23:10:00class A を class X か class X::Impl の private メンバにする。
0285デフォルトの名無しさん
2008/06/16(月) 00:39:28もちろんユーザは A の public メンバにアクセスできることが前提です。
0286デフォルトの名無しさん
2008/06/16(月) 00:57:47A を抽象インターフェースにして実体を >284
0287デフォルトの名無しさん
2008/06/16(月) 01:12:34template < class _T >
class C
{
public:
template < class _Ta >
void X();
};
template < class _T >
void F()
{
C< int > obj1;
obj1.X<int>();
C< _T > obj2;
obj2.X<_T>();
}
0288デフォルトの名無しさん
2008/06/16(月) 01:13:57その上のコードの、obj2.X<_T>();がコンパイルエラーで通りません。
何ででしょうか
代替案とかあるでしょうか
0289デフォルトの名無しさん
2008/06/16(月) 01:21:270290デフォルトの名無しさん
2008/06/16(月) 01:29:17class _Tの実体がない
0291デフォルトの名無しさん
2008/06/16(月) 01:29:370292デフォルトの名無しさん
2008/06/16(月) 01:33:42ああ、その手があったね。
しかも A の唯一の派生クラスを A の friend にしておけば抽象である必要もないし
X の中に入れる必要もないね。
ありがとう。
0293デフォルトの名無しさん
2008/06/16(月) 01:34:00_Tはテンプレート引数だろ。
0294デフォルトの名無しさん
2008/06/16(月) 01:57:05obj2.template X<_T>();
その名がテンプレートであることを示せ
>>289
この場合はいらんかも
0295デフォルトの名無しさん
2008/06/16(月) 02:02:54>>287-288
0296デフォルトの名無しさん
2008/06/16(月) 02:21:210297デフォルトの名無しさん
2008/06/16(月) 02:25:06> しかも A の唯一の派生クラスを A の friend にしておけば抽象である必要もないし
> X の中に入れる必要もないね。
何か変だな。一般的には、抽象でいいものに実装を混ぜる必要もないし、
スコープを無駄に広める必要もない、となりそうなもんなんだが。
まぁ望むものは得られたみたいなんで、書き込みに出てない部分の都合があっての
話ならどうでもいいけど。
0298デフォルトの名無しさん
2008/06/16(月) 07:38:23class A {
public:
virtual ~A() { }
virtual void Foo() = 0;
};
class X {
public:
X();
A* NewA();
private:
class Impl* impl_;
};
class X::Impl {
public:
A* NewA() {
return new AImpl;
}
private:
class AImpl : public A {
public:
virtual void Foo();
};
};
X::X() : impl_(new Impl) { }
A* X::NewA() { return impl_->NewA(); }
0299デフォルトの名無しさん
2008/06/16(月) 12:39:10抽象にしたくないのは単に性能のため。
Aは単純なクラスを想定しているのでそれほど実装を隠す必要はないから。
もしAの実装を隠したい場合はImpl方式にするかもしれない。
抽象クラスより優れている根拠は特にないが。
確かにAの派生はXに入れたほうが名前空間の汚染を軽減できるね。
>>298
デストラクタは private にしてユーザが削除できないようにしたい。
さらに特定のクラスにしか派生できないようにしほうが何となく安心。
0300デフォルトの名無しさん
2008/06/16(月) 12:47:35いや本当は知らないんですけどね
0301デフォルトの名無しさん
2008/06/16(月) 23:02:51>>300
thx。たすかりますた。thx。
>>287
解った。死ぬから_Tを使わせてくれ。
0302デフォルトの名無しさん
2008/06/16(月) 23:03:51処理系の予約語じゃねえか・・・
0303デフォルトの名無しさん
2008/06/17(火) 21:38:290304デフォルトの名無しさん
2008/06/17(火) 23:47:32operator++ はどうなるのかしらぁぁぁぁぁぁぁぁ
0305デフォルトの名無しさん
2008/06/17(火) 23:53:14x++ → operator++(int)
後者の引数はオーバーロードのためのダミー引数で、
それ以外の何かに使う物ではない。
0306デフォルトの名無しさん
2008/06/17(火) 23:55:50X X::operator ++ (int) ;
0307304
2008/06/17(火) 23:59:070308デフォルトの名無しさん
2008/06/18(水) 07:40:42テンプレート引数型で後置インクリメント使う馬鹿は氏ねと言いたい。
0309デフォルトの名無しさん
2008/06/18(水) 07:56:320310デフォルトの名無しさん
2008/06/18(水) 13:14:00ListViewに複数項目が登録されている場合、最下段での下キー押下で最上段へ、
また、最上段での上キー押下で最下段にフォーカスを移したいと思っています。
これをやるだけならキーイベントを拾って
「最下段で下キーが押された場合、フォーカス位置を0にする」
というようにすればいいのかと思ったのですが、ListViewのデフォルト機能(?)で
上下キー押下はフォーカス位置を1つずらすようになっています。
つまり、
1
2
3←フォーカス
この状態で下キーを押すと、フォーカス位置が0に戻る処理が実行された後、
フォーカス位置が1つ下にずれてしまうので
1
2←フォーカス
3
となってしまいました。
ListViewが持っているデフォルトのキーイベントを破棄できればいいのかと思ったのですが、
その捨て方も分かりませんでした・・・。
上記要件を満たす方法などがありますでしょうか?
0311デフォルトの名無しさん
2008/06/18(水) 13:39:20.NETスレ行け
0312デフォルトの名無しさん
2008/06/18(水) 13:39:59C++/CLIはC++を元にした別の独立した言語です。
なので基本的にはC++/CLIスレで質問して下さい。
しかし、言語自体でなく、
ListView(.NETコンポーネント)のことなので、
.NET総合スレか、人の多い(+構文が近い)C#スレをお勧めします。
System.Windows.Forms.ListView などは
C++/CLI, C#, VB.NETで同一のものです。
0313デフォルトの名無しさん
2008/06/18(水) 13:52:12C++/CLI関連の誘導を加えた方がよさそうだな
0314デフォルトの名無しさん
2008/06/18(水) 14:25:33失礼しました
他スレにて再質問します
ありがとうございました
0315デフォルトの名無しさん
2008/06/19(木) 14:53:55呼び出せるでしょうか?
struct B { void f(); };
struct D : B {};
void bbb( B* b[], int size ) { for ( int i = 0; i < size; ++i ) b[i]->f(); }
void ddd( D* d[], int size ) { bbb( static_cast<B**>( static_cast<void*>( d ) ), size ); }
0316デフォルトの名無しさん
2008/06/19(木) 15:46:32enumハックを使ってクラスの中でSIZE_MAXという名前の定数を定義したんですよ。
そしたら、「error C2143: 構文エラー : '}' が '定数' の前にありません。」などのエラーが何個か出ました。
いろいろコメントアウトして原因を探ったら、vectorやstringなどをインクルードするとエラーが出る事がわかったんです。
で、インクルードファイルが壊れてると思い、再インストールしたんですが直らず、
結局、limits.hでSIZE_MAXという名前のマクロが定義されていたのが原因でした。
エラーメッセージに名前は出ないし、ネームスペースも無視される。
マクロって最低じゃないですか?
0317デフォルトの名無しさん
2008/06/19(木) 16:00:250318デフォルトの名無しさん
2008/06/19(木) 20:39:42だからマクロは大文字を使うんだよ。
0319デフォルトの名無しさん
2008/06/19(木) 21:15:330320デフォルトの名無しさん
2008/06/19(木) 21:15:560321デフォルトの名無しさん
2008/06/19(木) 21:21:24お約束があるんだよ。
0322デフォルトの名無しさん
2008/06/19(木) 21:46:10すみません。特定の環境ということではなく一般的にできるかどうかです。
VC8で試したら動きます。
0323デフォルトの名無しさん
2008/06/19(木) 22:37:030324デフォルトの名無しさん
2008/06/19(木) 22:44:01列挙型や定数に大文字使ってるのよく見かけるけどそんなお約束あるの?
0325デフォルトの名無しさん
2008/06/19(木) 22:51:45定数もマクロだったりするし、列挙型はスコープ無いから定数の代わりに使ったりするから
0326デフォルトの名無しさん
2008/06/19(木) 23:29:25今までずっとATL::CStringWでやっていたのですが、std::wstringはいまいち不便で。
boostあたりになっちゃうんでしょうかね。
0327デフォルトの名無しさん
2008/06/19(木) 23:49:29>定数もマクロだったりするし、
定数をマクロで書くのはよくないんじゃない?
Effective C++ 1項に書いてあるように、これこそお約束なのでは。
>列挙型はスコープ無いから定数の代わりに使ったりするから
>>316の例だって列挙型を定数がわりに使ってハマってるように見えるんだが、何か違う?
0328デフォルトの名無しさん
2008/06/20(金) 00:13:55CreateWindowとか
0329デフォルトの名無しさん
2008/06/20(金) 00:35:20あるクラスのインナークラスを他のファイルで前方宣言したいと思っているのですが
どのように宣言すればよいのでしょうか…。
以下例です。
名前空間SpaceAに定義されたクラスClassAがあったとして
ClassA内部にはInnerClassAが定義されているとします。
namespace SpaceA {
class ClassA {
public:
class InnerClassA{}
}
}
このInnerClassAを他のファイルClassB.hで前方宣言して使うことはできるのでしょうか…。
// 前方宣言
namespace SpaceA {
class ClassA;
//struct ClassA::InnerClassA; // ClassAは名前空間じゃないからエラー…どう書けばいいのか
}
using SpaceA::ClassA;
namespace SpaceB {
class ClassB {
public:
ClassB( InnerClassA* p ); // イメージ的にはこんな感じで使いたい
}
}
よろしくお願いします。
0330デフォルトの名無しさん
2008/06/20(金) 01:44:36D* を B* としてアクセスするのは、規格の 3.10 p15 にあるエイリアスの制約に
違反するので、未定義動作。
ddd() の引数に B* の配列を似たようなキャストしてねじ込んだ場合は、上記の
制約を満たすことになるのでセーフ。
0331デフォルトの名無しさん
2008/06/20(金) 01:48:50無理。外側の ClassA の定義が必要。 ClassA の中で class InnerClassA; としてあれば
InnerClassA の定義は必要ない。
0332デフォルトの名無しさん
2008/06/20(金) 08:20:45>D* を B* としてアクセスするのは、規格の 3.10 p15 にあるエイリアスの制約に
>違反するので、未定義動作。
普通のアップキャストだからOKじゃないの?
0333332
2008/06/20(金) 08:34:45なおModern C++ Designでは、
仮想継承でなければstatic_castによる
アップキャストは問題ないとなってた。
規格でどうなってるかは知らない。
0336デフォルトの名無しさん
2008/06/20(金) 13:36:270337デフォルトの名無しさん
2008/06/20(金) 15:16:430338デフォルトの名無しさん
2008/06/20(金) 16:08:14operator++( X* x )みたくしたら
「クラス型パラメータがひとつもありません」と怒られました。
ハーバートシルト先生のSTL標準講座を読んでも解決法が書いてありません。
っていうか自作STLの書き方なんて載ってないし。
もうだめです。さようなら。
0339デフォルトの名無しさん
2008/06/20(金) 16:56:070340デフォルトの名無しさん
2008/06/20(金) 17:37:07>hogehoge.hh
namespace hogehoge{
#include "hoge.hh"
};
>hogehoge.cc
#include "hogehoge.hh"
……
ってやったらhoge.hhの中でhogehoge::stdをさがしにいきやがったのが納得いかないんですが、
using namespace std;っていうのはstdをグローバルスコープにする命令じゃないんですか?
0341デフォルトの名無しさん
2008/06/20(金) 17:52:33現在の名前空間から見てstd::以下にあるシンボルを現在のスコープにロードする命令だよ。
ちなみに、名前空間のなかから普通の"std"を読み込みたいなら
using namespace ::std;
とする必要がある。
0342デフォルトの名無しさん
2008/06/20(金) 18:11:09ポインタで横着しようとしないで、イテレータ用のクラスを作る。
0343デフォルトの名無しさん
2008/06/20(金) 18:16:56hogehoge::stdを探しにいったってことは、
hoge.hh内に namespace std {...} があるのか・・・。
using namespace std;で飽き足らず、
std空間にユーザー定義を追加するとは、不届きなヘッダだなw
とりあえず、
>hogehoge.hh
namespace hogehoge {
namespace std { using namespace ::std; } // これを追加
#include "hoge.hh"
};
しておけばおk。
0344343
2008/06/20(金) 18:54:470345デフォルトの名無しさん
2008/06/20(金) 19:01:52うむむ、namespaceは奥深いですね。
>>343
namespace stdは見つかりませんでした。。。
あと、その行を追加してもhogehoge::stdを探しに行ってるように見えます。。。
一番簡単なのはヘッダのusing namespace std;の行を削除することなんだろうけど、
ファイルの上の方のコメントみたらcopyrightとか書いてあるし……
諦めて裸のままインクルードして使うことにします。
ありがとうございました。
0346デフォルトの名無しさん
2008/06/21(土) 13:11:25hoge.hhの中にincludeがあるなら、
それを先にincludeしとけば良いんじゃね?
インクルードガードで無視されるから。
例えば #include <vector> があるなら↓のように。
#include <vector>
namespace hogehoge {
namespace std { using namespace ::std; }
#include "hoge.hh"
};
0347デフォルトの名無しさん
2008/06/22(日) 23:55:19C++ではconstな変数を使え、とモノの本に書いてありました
ところで、定数がint型で何個も欲しいのですが、
列挙型の列挙子で代用するのはアリでしょうか?
0348デフォルトの名無しさん
2008/06/23(月) 00:09:47どれくらいの個数かにもよるかもしれないけど、
列挙子で代用(?)している入門書は結構ある。
0349デフォルトの名無しさん
2008/06/23(月) 00:28:08enum なら問題ないと思うよ
0350デフォルトの名無しさん
2008/06/23(月) 00:30:07単なる数字より、文字のほうが読みやすいですし
ありがとうございました
0351デフォルトの名無しさん
2008/06/23(月) 00:34:33なんで数が増えたら enum で代用するなんてことになるの?
意味が違うだろ。
0352デフォルトの名無しさん
2008/06/23(月) 00:37:280353デフォルトの名無しさん
2008/06/23(月) 00:46:05いや、0から始まる連番なもんで
0354デフォルトの名無しさん
2008/06/23(月) 00:50:15それなら代用じゃなくて enum が正解。逆に int const で用意するほうがありえない。
0355デフォルトの名無しさん
2008/06/23(月) 03:11:09ここでする質問ではないかも知れませんが.
C++でMPEG2を取り扱うプログラムを作らなくてはならなくなりました.
MPEG2を扱うにはどのようなlibraryを使わなければならないでしょうか?
またそのマニュアルが詳しく掲載しているサイトを教えてくれません?
Directshowは抜きでお願いします.
0356デフォルトの名無しさん
2008/06/23(月) 03:25:18ただしMPEG2特許の利用ライセンスは自分でとってね!
0357デフォルトの名無しさん
2008/06/23(月) 16:44:37あるlist(Aとする)の情報をまるまる別のlist(Bとする)にassign()で写したのち、
Aのある位置を指しているイテレータをそのままBで使いたい
(Aで指していた位置にある情報を指させたい)
のですが、方法を探しても見つかりません。
アルゴリズムのfind()以外で何か方法はありますか?
0358デフォルトの名無しさん
2008/06/23(月) 17:13:09std::distance(), std::advance()
ただ、listだとランダムアクセス出来ないから
一応それぞれO(n)で、セットでO(2n)になる。
まぁとんでもない要素数でない限り一瞬だろうけど。
0359デフォルトの名無しさん
2008/06/23(月) 17:18:01要素が連続しているvectorよりも遅い。
0360デフォルトの名無しさん
2008/06/23(月) 17:24:45頭からの距離で考える発想は思いつきませんでした。
要素も少なく、実際に動かしてみても一瞬で処理できました。
ありがとうございました。
0361デフォルトの名無しさん
2008/06/23(月) 22:12:24begin()〜itとit〜end()の2回に分けてコピーするのもいいな。
0362355
2008/06/24(火) 02:37:33MS-DOSで動くオープンソースの動画変換アプリなんですね.
ソースを見て参照方法を探れということですね?
これも方法の一つとしますが時間がかかるので,なにか他の方法はないでしょうか?
それと商用配布は考えていないのでライセンス申請の必要はありません.
0363デフォルトの名無しさん
2008/06/24(火) 03:12:100364デフォルトの名無しさん
2008/06/24(火) 07:35:29商用かどうかは関係ないよ。
詳しくは法務に聞こうね。
0365デフォルトの名無しさん
2008/06/24(火) 10:47:36> MS-DOSで動くオープンソースの動画変換アプリなんですね.
違います。
> ソースを見て参照方法を探れということですね?
違います。
> これも方法の一つとしますが時間がかかるので,なにか他の方法はないでしょうか?
規格書読むより時間掛かりませんよ。
0366デフォルトの名無しさん
2008/06/24(火) 16:10:28例えば、
class hoge {
private:
static array[100];
};
となっていて、arrayの中身を
for(int i=0; i<100; i++){
array[i] = i*i;
}
のように初期化したいとします。
このよな作業はどの箇所で行えばいいでしょうか。
0367デフォルトの名無しさん
2008/06/24(火) 16:16:38クラスの外で一回やっておけばよい。
main()が呼ばれる前に初期化される保証がある。
0368デフォルトの名無しさん
2008/06/24(火) 16:19:150369366
2008/06/24(火) 16:27:24GCCですが、.cxxの先頭でやると怒られます。
src/hoge.cxx:24: error: expected unqualified-id before ‘for’
src/hoge.cxx:24: error: expected constructor, destructor, or type conversion before ‘<’ token
src/hoge.cxx:24: error: expected constructor, destructor, or type conversion before ‘++’ token
24: for(int i = 0; i < 100; i++){
0370デフォルトの名無しさん
2008/06/24(火) 16:28:58class hoge {
private:
static int array[100];
static int flag;
public:
hoge() {
if (flag) {
for (int i = 0; i < 100; i++)
array[i] = i * i;
flag = 0;
}
}
void printa() const {
for (int i = 0; i < 100; i++)
std::cout << array[i] << ' ';
}
};
int hoge::flag = 1;
int hoge::array[100];
int main()
{
hoge h;
h.printa();
}
0371366
2008/06/24(火) 16:31:18としておいて、constructorで
if(!array){
array = new short[100];
for(int i=0; i<100; i++){
array[i] = i*i;
}
}
でしょうか。それだと、いつdeleteするのでしょうか。
それとも、初期化フラグをメンバ変数に持っておいて、
それのtrue/falseでconstructorからfor文を呼び出す?
0373デフォルトの名無しさん
2008/06/24(火) 17:22:54コンストラクタとデストラクタは忘れないであげてくだちぃ
0374デフォルトの名無しさん
2008/06/24(火) 17:54:53staticだからこの場合は無理なのよ
0375355
2008/06/24(火) 18:33:23現在mpeg2dec-0.4.1 とでどちらを使うか考えています.
両方の向き不向きについて何か教えてくれませんか?
0376デフォルトの名無しさん
2008/06/24(火) 18:49:210377355
2008/06/24(火) 19:53:12そうでした.完全にスレ違いになってしまいました.
去ります
0378デフォルトの名無しさん
2008/06/25(水) 00:49:33だから↓はコンパイルエラーになりますよね。
void main(){
int a=func(3);
}
int func(int x){
return x+5;
}
なのに、なぜ↓はコンパイルエラーにならないんでしょうか?
class cA{
public:
cA(){a=10;}
private:
int a;
};
0379デフォルトの名無しさん
2008/06/25(水) 00:50:140380デフォルトの名無しさん
2008/06/25(水) 00:56:45そういう仕様に決まったから。
>>379
書き方や問題領域で当然変わってくるけど、大体Cと同じ。
0381デフォルトの名無しさん
2008/06/25(水) 00:58:44読む場所を行ったり来たりしうるんですね
ありがとうございました
0382デフォルトの名無しさん
2008/06/25(水) 02:00:09正確に述べると、クラス定義の中に関数定義を書くと、
そいつはクラス定義の終わった後に、inline付で定義されたものとして扱われるということになる。
0383デフォルトの名無しさん
2008/06/25(水) 02:15:490384デフォルトの名無しさん
2008/06/25(水) 07:37:290385デフォルトの名無しさん
2008/06/25(水) 07:51:00の時に使われる物?
0386デフォルトの名無しさん
2008/06/25(水) 08:26:280387デフォルトの名無しさん
2008/06/25(水) 09:26:57typename T::X test(){ return typename T::X(); }
};
struct A : base<A>{
struct X{}
};
継承するクラスのテンプレートに継承するクラス自身を渡して、
継承するクラス内の型を基底型で使いたいのですが不可能でしょうか?
0388デフォルトの名無しさん
2008/06/25(水) 10:55:21全く問題ない。
0389デフォルトの名無しさん
2008/06/25(水) 11:27:40弾かれました
template<typename T> struct base{
typename T::X test(){ return typename T::X(); } <-error C2039: 'X' : 'A' のメンバではありません。
};
struct A : base<A>{
struct X{}
};
0390デフォルトの名無しさん
2008/06/25(水) 13:48:24struct A { void add( X* x ); };
X* x = new X;
A a;
a.add( x );
A のオブジェクトは A::add() で追加した X のオブジェクトを delete する義務があります。
この場合 A::add() が失敗して例外を投げるとき A::add() は x を delete するべきでしょうか?
普通、関数が例外を投げるときその関数が何もしなかったことにするのが理想だと思いますが
delete したほうが便利な場合も多いと思うのですが。
0391デフォルトの名無しさん
2008/06/25(水) 14:02:32auto_ptrを使えばどうか
struct A{ void add(std::auto_ptr<X> x); };
std::auto_ptr<X> x(new X);
A a;
a.add(x);
0392デフォルトの名無しさん
2008/06/25(水) 20:30:13391に同意。
a.add(x)に渡すxはnewしないといけないという変な制約が発生してしまうから。
0393デフォルトの名無しさん
2008/06/25(水) 20:45:33確か失敗したら delete される設計になってた。
0394デフォルトの名無しさん
2008/06/26(木) 02:56:30そのインターフェースなら a.add(new X) したくなりそうだから、 delete したほうがいいと思う。
0395デフォルトの名無しさん
2008/06/26(木) 20:01:08スマートポインタと一緒にしちゃだめでしょ。
>>394
X x;
a.add(&x)で落ちてもいいんだね。
0396デフォルトの名無しさん
2008/06/26(木) 20:08:30boost::ptr_vector
0397デフォルトの名無しさん
2008/06/26(木) 20:27:030398デフォルトの名無しさん
2008/06/26(木) 21:13:040399デフォルトの名無しさん
2008/06/26(木) 21:34:130400デフォルトの名無しさん
2008/06/27(金) 00:34:47書かれてるけど、実際どうなん?
0401デフォルトの名無しさん
2008/06/27(金) 00:48:54パフォーマンス表も書いてある
http://boost.cppll.jp/HEAD/libs/numeric/ublas/doc/overview.htm
0402デフォルトの名無しさん
2008/06/27(金) 01:02:540403デフォルトの名無しさん
2008/06/27(金) 01:07:56するのが怖い
boostならまずそういう事はないだろうし
0404デフォルトの名無しさん
2008/06/27(金) 01:25:540405デフォルトの名無しさん
2008/06/27(金) 01:56:56一度使おうとして、あまりにも酷い出来で、ワイド文字対応がなってなかったんで、あきらめた。
内部的には全部マルチバイト文字にしてやがる。
そのため、ワイド文字でデフォルト値とか設定しようとするとコンパイルエラー。
少しいじって、utf16からutf8に変換するようにしてやれば動くが、
わざわざそんなことするぐらいなら、自前で書いたほうがいい。
ありゃ絶対に、一文字は絶対に一バイトで、しかも7bitに収まるって前提の南蛮人の書いたコードだ。
0406デフォルトの名無しさん
2008/06/27(金) 02:19:230407デフォルトの名無しさん
2008/06/27(金) 03:59:44ありがとうございました。
ありがとうございました。
ありがとうございました。
0408デフォルトの名無しさん
2008/06/27(金) 07:53:35> A のオブジェクトは A::add() で追加した X のオブジェクトを delete する義務があります。
これが前提じゃないのか? new してないものは最初から渡せないだろ。
0409デフォルトの名無しさん
2008/06/27(金) 08:08:550410デフォルトの名無しさん
2008/06/27(金) 09:33:28vc8でdebugモードとreleaseモードで結果が異なり、debugモードでのみ正常に動作します。
使用しているboostは1.34ですが、これにはバグがあるんでしょうか?
面倒なのでアップデートしたくないのですが・・・。
boostコード中で警告4267と4244が出てくるのでboostが原因かもしれませんが把捉しかねる状態です。
ご教示願います。
0411デフォルトの名無しさん
2008/06/27(金) 10:59:431.34.1で悪いけど。
結構厳しいね。
0412デフォルトの名無しさん
2008/06/27(金) 12:45:56俺はliboctave使ってたよ
もう遅いかもしれないけど…
0413デフォルトの名無しさん
2008/06/28(土) 21:07:42this はなんでポインタなんでしょうか
せっかく参照というものがあるのに...
そんで、今日は C++ のオブジェクトが自身への参照を
self という名前で持てるようにいろいろがんばってました。
具体的には、そのクラスを継承したらクラス定義の中で self が使えるようなクラスを作ろー...と思ってたんですが、うまくいかず。
結局
#define self (*this)
しか思いつきませんでした orz
こういうんじゃなくって、ちゃんと自分自身への参照をメンバ変数にもつオブジェクトは作れないのでしょうか。
0414デフォルトの名無しさん
2008/06/28(土) 21:18:51別の表記方法がないなら*thisでいいじゃん。表現に揺らぎがなくて結構なことじゃないか。同じものをいろんな名前で表現させるほうが混乱するんでないかい?
size length len count distance 同じ意味だったり違った忌みだったり混乱するね。
0415デフォルトの名無しさん
2008/06/28(土) 21:25:04昔、this = malloc(1); てな構文があったんだよ
0416デフォルトの名無しさん
2008/06/28(土) 21:29:05thisが C with Classes に導入されたときには参照はまだなかった
0417デフォルトの名無しさん
2008/06/28(土) 21:31:110418デフォルトの名無しさん
2008/06/28(土) 21:47:590419デフォルトの名無しさん
2008/06/28(土) 21:50:430420デフォルトの名無しさん
2008/06/28(土) 21:51:420421デフォルトの名無しさん
2008/06/28(土) 21:51:520422デフォルトの名無しさん
2008/06/28(土) 21:58:28一部はデフォになりつつある。
まあ、知って損はない。俺も最近使い始めた。今まで知らなくてずいぶん損したと思う。
0423デフォルトの名無しさん
2008/06/28(土) 21:59:31中にはそういう人間もいる(俺もその1人だがな)。
当然、すべての人間にとってそうとは限らない、いつだって使えるとは限らないから、
Boostデフォを妄信するのは危険。使えないときは反動でだるくなる。
0424440
2008/06/28(土) 22:49:03勉強しておくよ。
GCとか便利そうだし
>443
仕事の場合だと、使えない場合が多そうだな。
0425デフォルトの名無しさん
2008/06/28(土) 22:50:24未来から来たって話。
0426デフォルトの名無しさん
2008/06/28(土) 22:59:36440基準でも未来レスかよw
0427デフォルトの名無しさん
2008/06/28(土) 23:01:52Test.cppとTest.h用意?
Test.cxx作ってそこに全部記述?
0428デフォルトの名無しさん
2008/06/28(土) 23:02:560429デフォルトの名無しさん
2008/06/28(土) 23:05:050430デフォルトの名無しさん
2008/06/28(土) 23:11:42サンプルないかな?
0431デフォルトの名無しさん
2008/06/28(土) 23:14:010432デフォルトの名無しさん
2008/06/28(土) 23:14:07意味不明だよ。
0433デフォルトの名無しさん
2008/06/28(土) 23:15:010434デフォルトの名無しさん
2008/06/28(土) 23:16:10hppでの例
http://www.boost.org/doc/libs/1_35_0/boost/shared_array.hpp
ベストかどうかは・・・分からんけど。
0435デフォルトの名無しさん
2008/06/28(土) 23:17:05424 :440 [sage] :2008/06/28(土) 22:49:03
>442
勉強しておくよ。
0436デフォルトの名無しさん
2008/06/28(土) 23:18:40オペレータの定義だけ外だし?
0437413
2008/06/29(日) 04:39:41はっきりいってネタですw
でもthisが参照じゃないのは何でやろー && 参照だったら
Foo& Foo::operator=(const Foo& rhs) {
this.bar = rhs.bar;
return this;
}
こんな感じで(->)や(*)使わなくてすむのにと思ったので
>>415
kwsk
>>416
それじゃあ this が参照じゃないのは後方互換性のためなのか。
かつ *this があるから別の予約語を用意する必要もないと
>>419
ざっと見た感じでは self 使ってない雰囲気ですが
0438デフォルトの名無しさん
2008/06/29(日) 12:34:32Google社内でのコーディング規約らしい。例外は悪か、やっぱり。
0439デフォルトの名無しさん
2008/06/29(日) 12:55:16全部読んでないけど、「例外は悪」とは書いてないと思うよ。
Googleの場合はデメリットがメリットより大きいから使わないという話と思う。
0440デフォルトの名無しさん
2008/06/29(日) 14:13:45最近C++の書籍がどんどん廃刊したり、改訂版が出ないのは、やはりC++0x
待ちなのかな?早くして欲しいもんだ。
0441デフォルトの名無しさん
2008/06/29(日) 14:16:53標準に新たな機能が追加されるわけで、
boostは更なる進化を遂げるだろう。
0442デフォルトの名無しさん
2008/06/29(日) 14:17:180443デフォルトの名無しさん
2008/06/29(日) 16:03:010444デフォルトの名無しさん
2008/06/29(日) 16:03:44標準ライブラリ等で例外が投げられる奴らはどう使ってるんだろう?
使ってないのか?
new も nothrow で使ってんのかね。
0445デフォルトの名無しさん
2008/06/29(日) 16:09:020446デフォルトの名無しさん
2008/06/29(日) 16:16:47> string tableName; // Bad - mixed case.
おいらは google で仕事はできない
0447デフォルトの名無しさん
2008/06/29(日) 16:19:090448デフォルトの名無しさん
2008/06/29(日) 16:19:53よほど変なのでなければ。
0449デフォルトの名無しさん
2008/06/29(日) 16:20:16string tableName; // Bad - mixed case.
なんでバッドなんだよって教えて干しいぉ?
0450デフォルトの名無しさん
2008/06/29(日) 16:24:31誰がBADだと言っているのかは知らんが、MixedCaseなのがいかんと言っているだけじゃないか。
要は、caseをmixするなってことだろ。
0451デフォルトの名無しさん
2008/06/29(日) 16:26:28と書いてある。
0452デフォルトの名無しさん
2008/06/29(日) 16:28:250453デフォルトの名無しさん
2008/06/29(日) 17:01:58std::nothrowって知ってる?
0454デフォルトの名無しさん
2008/06/29(日) 17:05:12標準ライブラリが例外を投げないようにするのに、
どうやってstd::nothrowを使うのか教えてほしい。
0455445
2008/06/29(日) 17:08:180456デフォルトの名無しさん
2008/06/29(日) 17:34:59だけ、とか?
もしくは標準ライブラリも書き直して使っているとか。
0457デフォルトの名無しさん
2008/06/29(日) 17:40:280458デフォルトの名無しさん
2008/06/29(日) 17:50:040459デフォルトの名無しさん
2008/06/29(日) 17:56:070460デフォルトの名無しさん
2008/06/29(日) 17:57:11C++でも、全部defineかenum斬った値返すだけってこと?
0461デフォルトの名無しさん
2008/06/29(日) 18:04:01普段ほとんど気にしなくても、必要なときにキャッチするようにしておけば済むってのが強みだね。
0462デフォルトの名無しさん
2008/06/29(日) 18:08:41それを全部使ってプログラムする必要はない。
むしろSTLも含めて常時全部の機能を使うのは大変。
その人に合ったコーディングスタイルでいいんじゃないかと
思う。
0463デフォルトの名無しさん
2008/06/29(日) 18:10:39ダメそれ無理
0464デフォルトの名無しさん
2008/06/29(日) 18:12:33え?全部の機能を常時使えって?
その方が無理でしょ
常に10冊ほどの本を隣に置いておかないといけなくなるよ
0465デフォルトの名無しさん
2008/06/29(日) 18:13:35けっきょく頑固な保守派はC言語をやれば良いではないか
0466デフォルトの名無しさん
2008/06/29(日) 18:14:40全部の機能を覚えてれば本置いとく必要なくね?
0467デフォルトの名無しさん
2008/06/29(日) 18:16:04学生じゃないなら20万ぐらいのドキュスキャン買って
本を全部PDF化するでしょ?
それで2画面で検索+コーディングするよね?
しない奴はカス
0468デフォルトの名無しさん
2008/06/29(日) 18:17:02例えばSTLの関数名全部覚えられるか?
現在のC++のSTLは当初標準化に際して提出された文書の
サブセットだそうだがそれでも一冊の本が書けるほどだぞ
0469デフォルトの名無しさん
2008/06/29(日) 18:18:25RAIIしたら普通に例外に使わないか?
コンストラクタで例外出せないと、かなり面倒です・・・。
0470デフォルトの名無しさん
2008/06/29(日) 18:18:33という全体像を掴んでいれば、その都度調べて使えるし、いつの間にか
覚える。
0471デフォルトの名無しさん
2008/06/29(日) 18:19:33よくわからんけど、話食い違ってるだけじゃね?
0472デフォルトの名無しさん
2008/06/29(日) 18:24:490473デフォルトの名無しさん
2008/06/29(日) 18:38:08んな必要ねーし
憶え方なんざ ISO/IEC14882 にだって書いてあるぞ
たかが few 万円の費用が壁になるようなアマチュアの道具ではないってだけさ
0474デフォルトの名無しさん
2008/06/29(日) 18:40:20俺はC++関連の本だけで既に百万は超えてる
0475デフォルトの名無しさん
2008/06/29(日) 18:45:14スゲェ俺一冊w
0476デフォルトの名無しさん
2008/06/29(日) 18:46:37俺頭悪いから、というかCの悪い癖を徹底的に取り除きたかった
からそれなりの出費を強いられたよ
0477デフォルトの名無しさん
2008/06/29(日) 18:50:370478デフォルトの名無しさん
2008/06/29(日) 18:51:150479デフォルトの名無しさん
2008/06/29(日) 18:51:55卒業したらリクエスト出しづらくなるから、早く0xが出てくれないと困る。
0480デフォルトの名無しさん
2008/06/29(日) 18:54:06書籍が揃うまで、どのくらいかかるんだろうね。
0481デフォルトの名無しさん
2008/06/29(日) 18:55:03オープンソース系や、STLとかboostとか。
0482デフォルトの名無しさん
2008/06/29(日) 18:55:57書籍はそれから半年遅れてドバッと出てくるか
まあC++でほとんどのプログラミングテクニックは
出尽くしているから文法本しか買わないと思う
0483デフォルトの名無しさん
2008/06/29(日) 20:16:51何から始めたらいい?って聞いたら
C++とロキやれって言われたけど
ロキってなに?
0484デフォルトの名無しさん
2008/06/29(日) 20:18:270485デフォルトの名無しさん
2008/06/29(日) 21:19:50けっこうあるもん?
0486デフォルトの名無しさん
2008/06/29(日) 21:23:55inline は使いまくるほど最適化がかかりやすくなる
0487デフォルトの名無しさん
2008/06/29(日) 21:26:53プロファイルしてみれ
0488デフォルトの名無しさん
2008/06/29(日) 21:35:44explicit inline 指定はデフォ?
0489デフォルトの名無しさん
2008/06/29(日) 21:37:190490デフォルトの名無しさん
2008/06/29(日) 21:37:52デバッグするとき泣くぞ?
0491デフォルトの名無しさん
2008/06/29(日) 21:49:44最適化がかかりやすくなるかもしれんが、実装をヘッダに晒すようだとデメリットも大きい。
inline で向上する効率を確かめて、さらにそれが必要だといえる時だけ使うのがいい。
0492デフォルトの名無しさん
2008/06/29(日) 21:55:14吐くようになった場合はかえって性能が低下する事がある
実際に走らせてみるかプロファイル取ってみるかだな
0493デフォルトの名無しさん
2008/06/29(日) 21:56:360494デフォルトの名無しさん
2008/06/29(日) 22:11:510495デフォルトの名無しさん
2008/06/29(日) 22:19:36void hoge::hage(){...} ってクラス定義の後に分けて書けば良いんだっけ?
※コンパイラオプションはそのままで
0496デフォルトの名無しさん
2008/06/29(日) 22:23:45491と同じではないかと思うけど。
C++ coding standardに載っている時期尚早な最適化(だったかな)じゃないかと思う。
0497デフォルトの名無しさん
2008/06/29(日) 22:24:26翻訳単位それぞれに関数の定義ができて、重複エラーになるんでは?
0498デフォルトの名無しさん
2008/06/29(日) 22:30:16普通なるね。
0499デフォルトの名無しさん
2008/06/29(日) 22:33:20ならない。
inline 関数の定義が、リンクされるすべてのコンパイル単位間で矛盾して無い限りは問題ない。
0500デフォルトの名無しさん
2008/06/29(日) 22:33:33テンプレートクラスとかの型毎のインスタンスはリンク後は一つになるよね?
0501デフォルトの名無しさん
2008/06/29(日) 22:34:08非inline関数でっせ?
0502499
2008/06/29(日) 22:34:300503デフォルトの名無しさん
2008/06/29(日) 22:41:40static int a[] = {} かけないんだっけ?
0504デフォルトの名無しさん
2008/06/29(日) 22:50:36無理
static const int のみ初期化OK
0505デフォルトの名無しさん
2008/06/29(日) 22:52:14初期化おk
0506497
2008/06/29(日) 22:57:12メンバ関数ならOKで非メンバ関数だとNGじゃないかな。
0507デフォルトの名無しさん
2008/06/29(日) 22:59:55どっちでも同じ。ただしメンバ関数をクラス定義内で定義した時は自動的に inline 扱いになる。
0508デフォルトの名無しさん
2008/06/29(日) 23:35:16俺が497だwなりすますな
0509デフォルトの名無しさん
2008/06/29(日) 23:52:16getter/setterはどうやって書くの?
0510デフォルトの名無しさん
2008/06/29(日) 23:55:300511デフォルトの名無しさん
2008/06/29(日) 23:55:57基本みたいな話だね。ただ、inline指定してみて効果が顕著だったら
inlineにするみたいな。
しかし、ほとんどの参考書では、GetやSetはクラスの型定義内に
inlineとして実装されてるよね。あれが誤解の元なんだろうか。
0512デフォルトの名無しさん
2008/06/30(月) 00:00:230513デフォルトの名無しさん
2008/06/30(月) 00:02:22それか明示的にインスタンス化しておくとか
0514デフォルトの名無しさん
2008/06/30(月) 00:06:04あまり気にしなくていいんじゃないの?
CPUがリターンキャッシュ持ってれば
0515デフォルトの名無しさん
2008/06/30(月) 00:17:18P6のばやいL1じゃね?
0516デフォルトの名無しさん
2008/06/30(月) 00:26:54無視するコンパイラにも、なるべく広範囲のソースを見せたほうがいい
処理系には何がしたいのかを伝えよ、禿の格言にもあるぞ
0517デフォルトの名無しさん
2008/06/30(月) 00:27:04変数や関数、インスタンスは小文字から始まり、
クラス名は大文字からはじめるのが一般的なんでしょうか
また、分かりやすい名前をつけると、クラス名とそのインスタンス名がかぶってしまうんですが、
何か分け方はありませんか
0518デフォルトの名無しさん
2008/06/30(月) 00:31:40http://pc11.2ch.net/test/read.cgi/tech/1206118762/
ここで聞いてみるとか
0519デフォルトの名無しさん
2008/06/30(月) 00:36:48クラス名の最初にcを付けてる
0520デフォルトの名無しさん
2008/06/30(月) 00:41:40先生方のルールを参考にしてはどうかな
http://www.boost.org/doc/libs/1_35_0/boost/multi_array.hpp
0521デフォルトの名無しさん
2008/06/30(月) 00:53:51クラス名 :小文字+アンダーバーの組み合わせ(例:multi_array)
ネームスペース名 :クラス名同様
ローカル変数名 :クラス名同様のルールで短めに
メンバ変数名 :クラス名のルールに加えて最後にアンダーバー
短くなくても良い(例:allocated_elements_)
関数名 :クラス名同様
テンプレート型引数名:パスカルケース(例:NDims)
マクロ名 :大文字+アンダーバーの組み合わせ
(BOOST_STATIC_CONSTANT)
0522デフォルトの名無しさん
2008/06/30(月) 00:54:580523デフォルトの名無しさん
2008/06/30(月) 01:03:51enumはメンバ変数名と同じ
ただ、boostの中で完全に統一されてるわけでもないみたい
0524デフォルトの名無しさん
2008/06/30(月) 01:04:28unko_t unko;
0525デフォルトの名無しさん
2008/06/30(月) 01:16:04その後、似たものでシェアードライブラリ(.so)なるものがあるのを知ったのですが、
VCで作成することはできますか?
検索してもgccばかりが見つかってしまって。
ライブラリのファイルがないとexeの実行ができないようですが、dllと何が違うのか分かりません。
0526デフォルトの名無しさん
2008/06/30(月) 01:20:46dll と同じようなものです
UNIX系では shared object
Windows系では dynamic link library
0527デフォルトの名無しさん
2008/06/30(月) 01:41:04>438で出てたGoogleのルールのまとめ:
●ファイル名
ぜんぶ小文字で、単語は_か-で区切る。foo-bar.cc
●クラス名
各語の先頭を大文字にする。 FooBar
●名前空間名
ぜんぶ小文字。区切りについては明記してないけど、_? foo_bar
●変数名
ぜんぶ小文字で、単語は_で区切る。 foo_bar
●メンバ変数名
ぜんぶ小文字で、単語は_で区切り、最後は_にする。foo_bar_
●関数名
クラス名と同じ。アクセサだけは変数名と同じ。
●定数
先頭にkを付けて、単語区切りは大文字。 kFooBar
●マクロ名
マクロなんて使うな。
アクセサと定数が妙だなあ。
0528デフォルトの名無しさん
2008/06/30(月) 02:07:190529デフォルトの名無しさん
2008/06/30(月) 02:13:430530デフォルトの名無しさん
2008/06/30(月) 02:13:470531デフォルトの名無しさん
2008/06/30(月) 02:16:10細かくありがとうございます
いろいろな方法があるんですね
検討して、しっくりくる方法を選びたいと思います
0532デフォルトの名無しさん
2008/06/30(月) 03:23:02マクロ禁止なら全部大文字でもよさそうだが・・・
0533デフォルトの名無しさん
2008/06/30(月) 03:40:280534デフォルトの名無しさん
2008/06/30(月) 07:48:41boostにもあったりするよw
http://www.boost.org/doc/libs/1_35_0/boost/regex/v4/regex_format.hpp
> const traits& m_traits;
> const Results& m_results;
> OutputIterator m_out;
> ...
0535デフォルトの名無しさん
2008/06/30(月) 12:36:05てか、どこの会社でもまちまちなんだろうけど。
0536デフォルトの名無しさん
2008/06/30(月) 12:41:49命名ルールなら上で出てるgoogleかboostので十分だと思うけど。
0537デフォルトの名無しさん
2008/06/30(月) 15:27:37ポインタはpを付けるとか。C言語の時代か?
0538デフォルトの名無しさん
2008/06/30(月) 15:49:340539デフォルトの名無しさん
2008/06/30(月) 15:50:56http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95
ただし、ポインタにpを付けたりするのは
システムハンガリアンと呼ばれる間違ったハンガリアン記法。
本当のハンガリアン記法は
アプリケーションハンガリアンと呼ばれてる。
0540デフォルトの名無しさん
2008/06/30(月) 19:08:040541デフォルトの名無しさん
2008/06/30(月) 19:30:34おお、それそれ。なんか批判が多いみたいだね。保守が大変とか。
けっきょくプレフィックスなんてないほうがいいのかね……
0542デフォルトの名無しさん
2008/06/30(月) 19:44:44間違ったコードは間違って見えるようにする - The Joel on Software Translation Project
http://local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
0543デフォルトの名無しさん
2008/06/30(月) 20:29:03プレフィックスを付けるって感じ?
システムハンガリアンはデータ型を表すプレフィックスを付けてるのかな?
0545デフォルトの名無しさん
2008/06/30(月) 23:01:10という宣言をヘッダ(hoge.h)に書いたとき,fooを宣言している
ヘッダもhoge.hでインクルードしないといけないでしょうか?
それともhoge.hでは
class foo;
と書くだけでおkでしょうか?
0546デフォルトの名無しさん
2008/06/30(月) 23:50:55扱えるデータ構造ってありませんかね?
data[3].hogeみたいにアクセスもしたいし
dequeue(data)みたにもアクセスしたい
0547デフォルトの名無しさん
2008/06/30(月) 23:58:57std::dequeが火を噴くときが来たな
0548デフォルトの名無しさん
2008/07/01(火) 01:19:190549デフォルトの名無しさん
2008/07/01(火) 08:09:47標準ライブラリのテンプレート引数は基本的に完全型じゃないとダメ。
つまり class foo; だけじゃダメ。
0550デフォルトの名無しさん
2008/07/01(火) 10:33:311プロセスで三回printfを実行して別プロセスを作成
そこからまた三回printfを実行して別プロセス
10プロセス実行完了したら最初のプロセスから終了していく
そんな課題なのだけどforkが理解できなくて困っている…
申し訳ないですがバカな俺でも理解できるように解説してくださらんでしょうか?
0551デフォルトの名無しさん
2008/07/01(火) 10:59:33まずスレ違い。OSの話で言語と関係無い。
で、もうちょっと端的に質問しないと、ググって出るような解説をするしかないよ。
0552デフォルトの名無しさん
2008/07/01(火) 11:05:57fork → UNIX/Linux系のシステムコールで環境依存
printf → C言語
【初心者歓迎】C/C++室 Ver.55【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1213466622/l50
>そんな課題
C/C++の宿題を片付けます 111代目
http://pc11.2ch.net/test/read.cgi/tech/1214563642/l50
>解説して
http://www.google.com/search?q=fork
0553デフォルトの名無しさん
2008/07/01(火) 12:25:56newでメモリを動的確保する場合失敗するとNULLが返るのですが、
これを意図的に失敗させたい場合どのような手段があるでしょうか?
どういう場合にnewが確実に失敗するのかがよくわかりません。
よろしくお願いします。
0554デフォルトの名無しさん
2008/07/01(火) 12:33:52返らないよ.
newが失敗したらbad_allocって例外が投げられる
ためしに以下の失敗するコードを実行してみるといいよ
char *a = new char[0x7FFFFFFF];
if (a == NULL) printf("%s", "メモリ失敗"); // 標準準拠のコンパイラではこのコードは絶対に実行されない
0555デフォルトの名無しさん
2008/07/01(火) 13:11:01先生、失敗しないんですけど
0556デフォルトの名無しさん
2008/07/01(火) 13:24:110557デフォルトの名無しさん
2008/07/01(火) 14:00:19test_type *a = new test_type[0x7FFFFFFF];
if(a == NULL) printf("%s", "print format");
0558デフォルトの名無しさん
2008/07/01(火) 14:28:440559デフォルトの名無しさん
2008/07/01(火) 15:19:53古いやつとか組み込み用は標準と違う動作をするだろ
0560553
2008/07/01(火) 16:19:49コンパイラはVC++2005付属のMSコンパイラVer 8.00.50727.42です。
>>554のサンプルコードを試しましたが、確かにNULLでなく例外を投げていますた。
コンパイラが古いとNULLを返す仕様になっているのでしょうか?
0561デフォルトの名無しさん
2008/07/01(火) 16:27:37今はみんな bad_alloc を投げる
0562デフォルトの名無しさん
2008/07/01(火) 18:37:37>In Visual C++ 2005, the C Runtime Library's new function will also
>throw a std::bad_alloc exception if the memory allocation fails.
>If you still want the non-throwing version of new for the C Runtime Library,
>link your program with nothrownew.obj. However, when you link with nothrownew.obj,
>new in the Standard C++ Library will no longer function.
0563デフォルトの名無しさん
2008/07/01(火) 18:54:030564デフォルトの名無しさん
2008/07/01(火) 19:52:48数学的に破綻してるコード嫌い
0565デフォルトの名無しさん
2008/07/01(火) 19:57:04最新の2008を使うべきでは。商用コンパイラ必要になるほどの
大プロジェクトじゃないならね。
0566デフォルトの名無しさん
2008/07/01(火) 20:00:24数学的に破綻って?
0567デフォルトの名無しさん
2008/07/01(火) 20:18:41失敗しない環境がありうるだろ
7で始まるのがプゲラとか言う問題ではない
0568デフォルトの名無しさん
2008/07/01(火) 20:43:060569デフォルトの名無しさん
2008/07/01(火) 20:44:110570デフォルトの名無しさん
2008/07/01(火) 20:56:07Express Edition は無料でいいんだが、MFCが使えん。
お偉いさんは、見た目が一番なんだよ。
0571デフォルトの名無しさん
2008/07/01(火) 21:53:20見た目を気にするなら、なおさらMFCはダメだろ
0572デフォルトの名無しさん
2008/07/01(火) 22:11:16何が?
0573デフォルトの名無しさん
2008/07/01(火) 23:35:10それはともかく、普通に2Gも確保出来るってのが・・・w
>>565
2008はWin2Kに入らなかったりしてなw
2Kをバカにすん(ry
>>570
WTL+ATL使おうぜ
0574デフォルトの名無しさん
2008/07/02(水) 00:01:19メモリ確保操作は、物理メモリのサイズが足りなくても
アドレスだけ確保して返して成功してしまう場合がある。
実際に手元の2GBしかメモリ積んでないマシンで2.5GB確保してもなんなく成功する。
これは、デマンドページングといって、物理メモリの確保が
実際にメモリを踏んだ段階で初めて起こるような仕組みが存在するため。
C++のnewの場合は、コンストラクタでメモリを踏んでしまう場合があるから
この仕組みがあったからといって実際に得はしないような気はするけどな。
0575デフォルトの名無しさん
2008/07/02(水) 00:04:33まあVCには全く関係がないな
連続した大領域確保しようとするとよく失敗するし
0576デフォルトの名無しさん
2008/07/02(水) 00:11:04デマンドページングが動いている状態で、実際には確保されていない(&できない)アドレスにアクセスしたらどうなるの?
0577デフォルトの名無しさん
2008/07/02(水) 00:12:46単にスワップメモリで足りただけじゃね?
0578デフォルトの名無しさん
2008/07/02(水) 00:24:19典型的にはいらないページをスワップアウトしにいく
>>577
確保だけならスワップは発生せずに即終了する
0579デフォルトの名無しさん
2008/07/02(水) 00:35:06「スワップに余裕があるか判断しない」環境もある。
後者だと、アクセスした途端にシステム全体でのメモリが不足することになる。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html
>>578の世界はLinuxだけで出来ている模様。
あと、どうしても失敗したければ
new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが
この2を2Lにしないとオーバーフローする環境もあるし
逆にlong引数のnewを認めない環境もあるんだろうな。
0580デフォルトの名無しさん
2008/07/02(水) 01:31:51だから、何でそうなる
0581578
2008/07/02(水) 01:42:20ん? なんで自分がバカにされているのか全然理解できないんだけど
いろいろな環境があることを頭に置いているからこそ578では
「典型的には」と頭につけたんだけどな
あとそのコード変だよ
少なくともビットシフトされる方は 2 じゃなくて 1 じゃないとおかしいし
そういうことやりたいなら
new char[std::numeric_limits<size_t>::max()] で十分じゃないかな
# ちなみにこういう最大限のメモリ確保は常識的な環境ならば1回ですぐに失敗するはず
# なぜなら、普通はスタックのためのアドレス空間やカーネルアドレス空間が同居しているから
0582デフォルトの名無しさん
2008/07/02(水) 12:26:21やっと出てきたw
が途中UNIXが出てきたり、やっと出てきたこれもmay beな言い方なので合格点はやれんな
0583デフォルトの名無しさん
2008/07/02(水) 12:35:240584デフォルトの名無しさん
2008/07/02(水) 12:36:060585デフォルトの名無しさん
2008/07/02(水) 16:03:07以下の710の質問をしました。
711の回答をもらいました。
それはそうだ、と納得しました。
---
710 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:02:13
templateの使い方を教えてください
class parent;
class child : parent;
の2つのクラスがあって、
void hogeFunc(vector<shared_ptr<parent> > & param)
を呼び出したいとき、
vector<shared_ptr<parent> > vp;
は渡せるけど、
vector<shared_ptr<child> > vc;
が渡せないのはなんでかわからないです。
お分かりの方、理由を教えていただけないですか。
ちゃんと、pとcは親子関係にあるので問題ないと思っています。
711 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:07:53
vector<shared_ptr<child> >& から vector<shared_ptr<parent> >& に変換できないから。
---
で、解決方法について相談させてください。以下は正しいですか?
・ void hogeFunc(vector<shared_ptr<parent> > & param)
のように、多態をvectorでやろうとしてるのが根本的に間違っている。
間違っているならこういったコンテナの要素を多態で扱いたいときは、
どのようにコーディングされているのか教えてください。
0586デフォルトの名無しさん
2008/07/02(水) 16:27:04struct check{ void f(){ T* a=NULL; parent* b = a; } };
...
}
0587デフォルトの名無しさん
2008/07/02(水) 17:29:520588デフォルトの名無しさん
2008/07/02(水) 17:34:46Tree[] subtrees;
}
0589デフォルトの名無しさん
2008/07/02(水) 17:36:01こんなのでいいんじゃない
class Tree {
std::vector<Tree*> subtrees;
};
0590デフォルトの名無しさん
2008/07/02(水) 17:55:38T value;
node* prev;
node* next;
node* parent;
node* first_child;
static node* tree_next(node* n){
if(n==NULL){ return NULL; }
if(n->first_child!=NULL){ return n->first_child; }
return tree_next_no_child(n);
}
static node* tree_next_no_child(node* n){
if(n==NULL){ return NULL; }
if(n->next!=NULL){ return n->next; }
if(n->parent==NULL){ return NULL; }
return tree_next_no_child(n->parent);
}
};
for(node* it=n; it!=NULL; it=node::tree_next(it)){
}
0591デフォルトの名無しさん
2008/07/02(水) 18:27:09C++を使う
できない人は他のスレで聞く
0592デフォルトの名無しさん
2008/07/02(水) 18:47:12ここってC++スレじゃないのか??
0593デフォルトの名無しさん
2008/07/02(水) 20:33:00そうだけど、あの聞き方ではhello worldから教える必要があるだろ
0594デフォルトの名無しさん
2008/07/02(水) 20:53:29Aclass.Bclass.element = NULL
昔クラスのpublic下にクラスを定義し派生用の関数で増やせるようなものを作ろうとしたんだがうまくいかなかった記憶があるもんで…
0595デフォルトの名無しさん
2008/07/02(水) 21:03:01const char msg="nullpo";
}
これだとエラー出ますが、こういうことをconst付けてやるにはクラス外に書くか
クラス.cppの方に書くか、もしくは使用する関数の中で書くしか無いのでしょうか。
0596デフォルトの名無しさん
2008/07/02(水) 21:03:35staticつけとけ
0597デフォルトの名無しさん
2008/07/02(水) 21:22:21ただしbool/char/short/int/long系に限りできる。floatは×
0598デフォルトの名無しさん
2008/07/02(水) 21:23:550599デフォルトの名無しさん
2008/07/02(水) 21:40:220600デフォルトの名無しさん
2008/07/02(水) 21:45:090601デフォルトの名無しさん
2008/07/03(木) 00:45:52なんか第3版の次の版が洋書では出てたけど、日本語版はスルーなのかな。
まぁこのタイミングでだしてもしょうがないし、できればC++0x反映させた
版を出して欲しいけどね。
0602デフォルトの名無しさん
2008/07/03(木) 01:10:26あとこういうエラー用の定数クラスは1枚のファイルに1こずつ
定義するのが流儀?
0603デフォルトの名無しさん
2008/07/03(木) 01:14:110604デフォルトの名無しさん
2008/07/03(木) 01:29:34なんでクラスの中に定義する必要があるの
せいぜいネームスペースでいいじゃん
0605デフォルトの名無しさん
2008/07/03(木) 01:34:25Lokiぐらいしかないんでしょうか?
0606デフォルトの名無しさん
2008/07/03(木) 01:45:21C++ではハードあるいはOSレベルの例外(例えば零による除算)は
通常どのように扱うののでしょうか?
もう少し具体的に言うと、例えばVC++なら_ _try, __except という
構造化例外のための機能が提供されていますが、
gccなどの他のコンパイラではこれと同様な機能を実現する手段は
ないのでしょうか。
windows, linux 双方で稼動させる必要のあるシステムを作るとしたら、
例外処理をどのようにするべきなのか非常に疑問です。
0607606
2008/07/03(木) 01:47:54http://msdn.microsoft.com/ja-jp/library/cc440193(VS.71).aspx
>C++ でプログラミングしたり、コードに移植性を持たせたい場合は、
>可能な限り標準 C++ の例外を使うことを強くお勧めします。
http://developer.mozilla.org/ja/docs/C%2B%2B_Portability_Guide
>例外は、幅広くは実装されていない C++ の次なる一例です。
>そのため、それらの使用は C++ の移植性を低下させます。
>例外を使ってはいけません。運悪く、同じような機能をもったよい代替案はありません。
例外についての注意勧告がされていますが、では実際にどうするかという
代替案はないということなのか・・?
0608デフォルトの名無しさん
2008/07/03(木) 01:55:31http://209.85.175.104/search?q=cache:FXdOX_s6DgAJ:pc11.2ch.net/test/read.cgi/tech/1192662575/386-411+singleton
0609デフォルトの名無しさん
2008/07/03(木) 01:56:590610デフォルトの名無しさん
2008/07/03(木) 02:05:31俺はWinCE用のソースとかでは
std::auto_ptr<std::exception> を戻り値にしてる。
コンストラクタで失敗したものは fail() で返す。
で、毎回戻り値などのチェック。
パフォーマンス悪そうだし面倒なので全部そうしてるわけじゃないけど。
0611デフォルトの名無しさん
2008/07/03(木) 02:09:18VC++の話をすると、/EH系のオプションがあって最適化やパフォーマンスの関係で使い分ける。
オプションなしの場合C++例外は一切使わない。
/EHs(c) 同期例外だけをキャッチする。c で extern "C"関数は例外を発生させないと仮定する。
/EHa 同期と非同期例外をc++例外としてキャッチする。
で /EHaの場合は stack overflowを除くほとんどのハード系の例外をキャッチ出来る。
もちろんゼロ除算も。
0612デフォルトの名無しさん
2008/07/03(木) 02:09:23どうもです。
detailsの中にあることにはあるんですね。
とりあえずkろえを使っておきます。
0613デフォルトの名無しさん
2008/07/03(木) 02:26:36ありがとうございます。
VC++の場合はわかるのですが、
gccなどでは同じような処理を行えないのでしょうか?
メモリの不正アクセスにしろ零除算にしろ、いくらでも
起こりうる例外だと思うのですが、Javaのように
統一的にcatchできないものかと悩んでいます・・・。
実際、至るところで零除算の起こりうる数値解析の
ようなシステムを作ったとして、いざシステムを起動
したら零除算で処理が中断したが、どこで起こったかは
わからない、なんてことは有り得ないですよね・・?
0614デフォルトの名無しさん
2008/07/03(木) 03:24:19ゼロ除算ぐらいなら例外ではなくてプログラムで事前にチェックすべきもので、
メモリの不正アクセスはデバッグ時に潰すべきもので、
例外でキャッチしてリカバリーをかける類のものじゃない。
0615デフォルトの名無しさん
2008/07/03(木) 05:55:32最初から vector<shared_ptr<parent> > だけ使ってればいいんじゃね?
0616デフォルトの名無しさん
2008/07/03(木) 05:59:33struct { struct { void* element; } Bclass; } Aclass;
よくわからんが、これでやりたいことができたことになるの?
0617デフォルトの名無しさん
2008/07/03(木) 06:33:36どこまでの移植性が必要かで判断すればいい。
Windowsだけなら構造化例外を使ってもいいだろうし。、gccあたりを含めるならくらいなら例外は使えるだろうし。
0618デフォルトの名無しさん
2008/07/03(木) 09:30:37mozilla のページ、情報がえらく古いな
もっとも古いというだけでは済まされない記述も散見されるが
0620デフォルトの名無しさん
2008/07/03(木) 12:12:50getBBB1, getBBB2, getBBB3の実装をした場合、状況によるんでしょうが、適切なのはどれか教えてもらえないですか。
それぞれのメリット、デメリットがはっきりとわかっていません。
class AAA {
private:
shared_ptr<BBB> bbbptr;
public:
AAA() {
bbbptr = new BBB;
}
shared_ptr<BBB> getBBB1() {
return bbbptr;
}
shared_ptr<BBB>& getBBB2() {
return bbbptr;
}
BBB* getBBB3() {
return bbbptr;
}
};
0621デフォルトの名無しさん
2008/07/03(木) 12:55:48基本的にBBB1以外は間違った使い方だと思っていい。
0622デフォルトの名無しさん
2008/07/03(木) 13:00:22int main(void)
{
float f;
for(f=1.0; (int) f<=5; f=f + 0.1)
printf("%f \n", f);
return 0;
}
このプログラム実行したら
2.600000
2.700000
2.799999
2.899999
2.999999
3.099999
3.199999
3.299999
3.399999
3.499999
と2.7から普通に計算できなくなりました
2.700000
2.800000
2.900000
と計算するようにしたいのですがどればいいですか?
0623デフォルトの名無しさん
2008/07/03(木) 13:07:39float -> double
もしくは
二進化十進表現でgoogle
0624デフォルトの名無しさん
2008/07/03(木) 13:16:32できました><
floatって精度かなり悪いみたいですね・・・
0625デフォルトの名無しさん
2008/07/03(木) 13:40:07つうか思いっきりC言語じゃね?
0626デフォルトの名無しさん
2008/07/03(木) 13:48:35それをC++で利用できない場合って、どういう理由が考えられますか?
できない場合があるとしたら、回避方法は、自分でヘッダを修正するってことでしょうか?
0627デフォルトの名無しさん
2008/07/03(木) 13:57:25extern "C"
0628デフォルトの名無しさん
2008/07/03(木) 16:25:02#ifdef __cplusplus
#error C++ is not supported
#endif
とか書かれてるなら諦めるしかないだろ。
0629デフォルトの名無しさん
2008/07/03(木) 17:52:58現在プログラムでマウスクリックをさせるものを作っていて、
ボタンのクリックなどはできるようになったのですが、
タブ(TabControl)の切り替えができません。
だれかご存知の方がいましたらご教授いただけると助かります。。
以下プログラム抜粋----------------------------------
POINT pt = {任意の座標X , 任意の座標Y};
HWND hWnd = ::WindowFormPoint(pt.x , pt.y);
// マウスを任意の位置に移動
SetCursorPos(pt.x , pt.y);
// クリック (Down -> UP)
::SendMessage(hWnd , WM_LBUTTONDOWN , 0 , MAKELPARAM(pt.x , pt.y));
::SendMessage(hWnd , WM_LBUTTONUP , 0 , MAKELPARAM(pt.x , pt.y));
よろしくお願いします。
0630デフォルトの名無しさん
2008/07/03(木) 18:03:140631デフォルトの名無しさん
2008/07/03(木) 18:18:18BB1は安全。戻り値最適化が期待できるので速度も十分
BB2は参照が生きているうちにAAAが削除される場合に問題が発生するが、それに気をつければ高速に使える。
BB3は危険。別のshared_ptrに戻りを代入するミスを誘発しそう。
0632デフォルトの名無しさん
2008/07/03(木) 23:49:120633デフォルトの名無しさん
2008/07/05(土) 21:52:38if (...)
statement...;
else
statement...;
などのstatementがそれぞれ{}で囲まれたように扱われるようですが
これはC++から来たものなのですか?
0634デフォルトの名無しさん
2008/07/05(土) 21:54:360635デフォルトの名無しさん
2008/07/05(土) 21:59:52囲まれたように扱われる場合と
囲まれたように扱われない場合って何が違うの?
0636デフォルトの名無しさん
2008/07/05(土) 22:08:270637デフォルトの名無しさん
2008/07/05(土) 22:11:41そもそも{}で囲まないと変数は定義できないだろう。
0638デフォルトの名無しさん
2008/07/05(土) 22:14:32if (expr) statement [ else statement ]
expr ; の形の単文はstatementだから{}で囲む必要は無い
複文はstatementではないから、{}で囲んでstatementにしなければならない
そんだけのことだ
C99とかは関係ないだろ
0639デフォルトの名無しさん
2008/07/05(土) 23:36:13「選択文と反復文のブロック化」のことだな。
C++にもあるぞ、X3014:2003「6.4 選択文」の1, 2節目などなどに規定がある。
そこではこういう例が載せられている。
if (x)
int i;
このルールによって、if文を抜けたらiはもう使えないという具合。
>>637
C++だと、ブロック内の宣言は文だから、できるんだなこれが。
C99だと(なぜかC++と違って)文ではないから、お前の言うとおり出来ないけどな。
0640デフォルトの名無しさん
2008/07/06(日) 04:17:21そんなVC6の時代の知識で語られても。
0641デフォルトの名無しさん
2008/07/06(日) 04:23:29#define for if (0); else for
0642デフォルトの名無しさん
2008/07/06(日) 13:09:270643デフォルトの名無しさん
2008/07/06(日) 13:13:43それは生兵法というもの
0644デフォルトの名無しさん
2008/07/06(日) 13:30:48使うならせめて大文字ですよね
0645デフォルトの名無しさん
2008/07/06(日) 13:51:36OpenSSL脂肪wwwwwwwww
0646デフォルトの名無しさん
2008/07/06(日) 14:42:590647デフォルトの名無しさん
2008/07/06(日) 16:56:320648デフォルトの名無しさん
2008/07/06(日) 20:25:500649デフォルトの名無しさん
2008/07/07(月) 08:09:21hogehoge_iとかhogehoge_iiにしてる。
後で#undefで即死されるのは同じだが。
0650デフォルトの名無しさん
2008/07/08(火) 00:13:06gotoで抜ける手も考えましたがあまりスマートな方法じゃないのでできれば避けたいです
0651デフォルトの名無しさん
2008/07/08(火) 00:13:480652デフォルトの名無しさん
2008/07/08(火) 00:19:500653デフォルトの名無しさん
2008/07/08(火) 00:26:15フラグかgotoのどちらかを選ぶんだ。
0654デフォルトの名無しさん
2008/07/08(火) 00:29:06そのwhileブロックは、breakをreturnに変えて
何らかの意味のある名前を付けられるくらいの処理ではありませんか?
0655650
2008/07/08(火) 00:40:530656650
2008/07/08(火) 00:42:49レスありがとうございました
(うっかりEnterと一緒にShiftを押してしまい途中で書き込んでしまいました…)
0657デフォルトの名無しさん
2008/07/08(火) 05:41:190658デフォルトの名無しさん
2008/07/08(火) 06:09:440659デフォルトの名無しさん
2008/07/08(火) 06:25:050660デフォルトの名無しさん
2008/07/08(火) 09:38:38と言うからだろうw
0661デフォルトの名無しさん
2008/07/08(火) 09:56:400662デフォルトの名無しさん
2008/07/08(火) 11:15:01自己解決したと書かれたくらいで、もう質問すんなとか、
もうちょっと心に余裕を持った方が良いかと。
0663デフォルトの名無しさん
2008/07/08(火) 11:20:050664デフォルトの名無しさん
2008/07/08(火) 11:23:100665デフォルトの名無しさん
2008/07/08(火) 11:27:140666デフォルトの名無しさん
2008/07/08(火) 11:35:03ていうか、こう書けば誰を馬鹿と思ってるのかがわかると思ったんで。
なるほどね。
0667デフォルトの名無しさん
2008/07/08(火) 11:46:23>>662の後に>>663なら、普通は
「>>650(馬鹿)をかばう気持ち悪い空気」と捉えるでしょう?
そこでこう書けばというのは、それこそ馬鹿丸(ry
0668デフォルトの名無しさん
2008/07/08(火) 11:48:250669デフォルトの名無しさん
2008/07/08(火) 12:42:48うん、こう書けば、無駄に食い下がるかどうかで痛い人かどうかがわかると思ったんで。
なるほどね。
0670デフォルトの名無しさん
2008/07/08(火) 12:49:020671デフォルトの名無しさん
2008/07/08(火) 12:50:18それは自虐ギャグですか?
0672デフォルトの名無しさん
2008/07/08(火) 16:19:050673デフォルトの名無しさん
2008/07/08(火) 16:47:350674デフォルトの名無しさん
2008/07/08(火) 17:18:49お前がな
0675デフォルトの名無しさん
2008/07/08(火) 17:26:45オマエモナー
0676デフォルトの名無しさん
2008/07/08(火) 17:27:460677デフォルトの名無しさん
2008/07/08(火) 18:06:300678デフォルトの名無しさん
2008/07/08(火) 22:11:51なぜスマートな方法ではないと思うのかを誤魔化さずきちんと述べよ
0679デフォルトの名無しさん
2008/07/08(火) 22:13:35多分。
0680デフォルトの名無しさん
2008/07/08(火) 22:38:180681デフォルトの名無しさん
2008/07/09(水) 00:33:060682デフォルトの名無しさん
2008/07/09(水) 00:33:08Base* foo = new Base(int bar);
この書き方だとBaseの引数付きコンストラクタが呼ばれる事はわかるのですが
動的に配列を確保する場合に引数付きコンストラクタを呼ぶ事は可能なのでしょうか?
イメージ的には↓のようなことをしたいです
Base* foo = new Base[3] {Base(int bar), Base(int bar), Base(int bar), };
0683デフォルトの名無しさん
2008/07/09(水) 00:37:080684デフォルトの名無しさん
2008/07/09(水) 00:37:54ありがとうございます
0685デフォルトの名無しさん
2008/07/09(水) 07:03:55デストラクタに注意
0686デフォルトの名無しさん
2008/07/09(水) 12:38:32クラスのインスタンスじゃないとダメなのか再考してみたら?
0687デフォルトの名無しさん
2008/07/09(水) 12:41:11あとで初期化用メソッドを呼ぶかポインタの配列にしたほうがらくちん。
0688デフォルトの名無しさん
2008/07/09(水) 19:09:17DDE spyを分けて欲しいのですが・・・
0689デフォルトの名無しさん
2008/07/09(水) 19:18:310690デフォルトの名無しさん
2008/07/09(水) 19:56:05それってダメなんじゃないの?
0691デフォルトの名無しさん
2008/07/09(水) 20:48:29vectorじゃだめなのかい?
0692デフォルトの名無しさん
2008/07/10(木) 06:15:03思っていいの?
0693デフォルトの名無しさん
2008/07/10(木) 07:29:570694デフォルトの名無しさん
2008/07/10(木) 11:04:51今の所C99に準拠しているのはIntel C++程度
0695デフォルトの名無しさん
2008/07/10(木) 11:05:450696デフォルトの名無しさん
2008/07/10(木) 12:30:010697デフォルトの名無しさん
2008/07/10(木) 14:39:590698デフォルトの名無しさん
2008/07/10(木) 15:25:18C99のいくつかの有用な機能、一行コメントだとか、restrictだとかは取り入れたが、C99全部入れても、誰も使わないしなぁ。
Variable-length arrayなんて、いまどき誰が使うんだ。
0699デフォルトの名無しさん
2008/07/10(木) 15:51:390700デフォルトの名無しさん
2008/07/10(木) 16:16:020701デフォルトの名無しさん
2008/07/10(木) 17:36:420702デフォルトの名無しさん
2008/07/10(木) 17:39:47歴史的経緯でalloca()が実装されてないから、可変長配列はあれば便利だぞ。
0703デフォルトの名無しさん
2008/07/10(木) 18:04:05どこのはなし?
0704デフォルトの名無しさん
2008/07/10(木) 18:53:100705デフォルトの名無しさん
2008/07/10(木) 19:07:410706デフォルトの名無しさん
2008/07/10(木) 19:49:43ありゃPOSIX規格のモンだ。
このスレ的にはWin32 APIと同等に扱われるべき環境依存の関数。
なんだけど、itoaとかと同じで、事実上無視できない存在ではあるね。
とはいえ、90年代ならまだしも、
今日び、スタックからわずかなメモリを確保できたところで、それほど利点も無いだろ。
現代なら定数時間でメモリを確保解放できるメモリプールで良いじゃん。
0707デフォルトの名無しさん
2008/07/10(木) 20:24:39広く使われるようになるとは夢にも思ってなかったろう。
でないとあれだけ緻密なC99の規格、しかもC89と互換性を
犠牲にしてわざわざ新しい規格を作るはずがない。
0708デフォルトの名無しさん
2008/07/10(木) 20:42:07>702は、POSIXにはあるallocaがWin32にはないから、代わりに使いたいと言ってるんじゃないかと。
確かに、freeする必要がないメモリを好きに取れるのは楽かもしれんね。
それこそ、今時スタックサイズをけちることもないんだし。
0709デフォルトの名無しさん
2008/07/10(木) 20:50:59例えば、VCのリンカのデフォルトのスタックサイズは1MBだ。
何GBもメモリがある時代にたったの1MBだぞ。
*unixのことはよく知らんが、そう変わらんだろうよ。
現状の32bitコードで、スタックサイズが大きすぎると、
スレッドを数十個作っただけで、無駄にアドレス空間が浪費される。
だからスタックのサイズは小さいんだよ。
0710デフォルトの名無しさん
2008/07/10(木) 21:06:44_alloca()ならVC++でも普通に使えるよ
0711デフォルトの名無しさん
2008/07/10(木) 21:50:21って一度言ってみたいです
0712デフォルトの名無しさん
2008/07/10(木) 22:03:10|:;:;:;:;:;:;:;:;:;:;:;:;:;:i;:;:;:;:;:;:;:;:;:;:;:;:;|
|;:;:_:;:_:;:_:;:_;:;_:;:l:;_;:_:;:_:;:_:;:_;:_;|
|______|_____|
| 三| _ _ |三 !
| 三| 三シ ヾ三 |三 |
| 三′ .._ _,,.. i三 |
ト、ニ| <でiンヽ ;'i"ィでiン |三.|
', iヽ! 、 ‐' / !、 ーシ |シ,イ
i,ヽリ ,' : !. |f ノ
ヾ! i ,、 ,..、ヽ lノ
| _ _ イ l malloca
l ,ィチ‐-‐ヽ i /、
゙i、 ゝ、二フ′ ノ/'"\
| \ ー一 / / _,ン'゙\
,ィ|、 \ /_,、-'" _,.-''´ `丶、__
_, イ | ヽ_ 二=''" _,. -''´ """""´´ ``ー
0713デフォルトの名無しさん
2008/07/10(木) 22:19:030714デフォルトの名無しさん
2008/07/10(木) 22:20:10まだそんなカキコしてるんですか? にっぽんのドクターさん
0715デフォルトの名無しさん
2008/07/10(木) 23:11:490716デフォルトの名無しさん
2008/07/10(木) 23:15:460717デフォルトの名無しさん
2008/07/11(金) 00:06:24ベンダーが、C99実装しかねない。
0718デフォルトの名無しさん
2008/07/11(金) 00:13:54sizeofがコンパイル時定数にならないとか悪夢過ぎるだろ
0719デフォルトの名無しさん
2008/07/11(金) 00:51:13・stdint.hの声が何故大きくない?
0720デフォルトの名無しさん
2008/07/11(金) 00:58:560721デフォルトの名無しさん
2008/07/11(金) 01:06:430722デフォルトの名無しさん
2008/07/11(金) 01:26:23代わりになるいい言語がないのも事実
web限定とかだとPerl系に軍配が上がるが
0723デフォルトの名無しさん
2008/07/11(金) 01:40:53そして代わりに○○が台頭する
○○にはお好きな言語をどうぞ
0724デフォルトの名無しさん
2008/07/11(金) 01:55:570725デフォルトの名無しさん
2008/07/11(金) 01:58:450726デフォルトの名無しさん
2008/07/11(金) 02:01:16そんな風に考えていた時期がありました・・・
0727デフォルトの名無しさん
2008/07/11(金) 02:20:56君がすれ違いだということだけは、はっきりわかる。
プラットフォームすら記載されてないので、どのすれが適当かはしらん。
0728デフォルトの名無しさん
2008/07/11(金) 03:03:54今ひとつ流行らんよなアレ
0729デフォルトの名無しさん
2008/07/11(金) 04:15:06だってDは、「言語仕様が確定=開発終了」だもん。
D1の仕様は決まったけど、D2のほうが進歩してるのに誰がつかうよ。
0730デフォルトの名無しさん
2008/07/11(金) 12:54:57なんにせよ俺は指をくわえて見てるだけ
0731デフォルトの名無しさん
2008/07/12(土) 02:55:05名前のある名前空間の場合、
namespace hoge{
void f();
}
というように宣言して、後で
void hoge::f(){}
のように定義できますが、名前無しの場合
namespace{
void f();
}
として後で定義を書く場合、??::f()というような形式では定義できないのでしょうか?
もちろん定義のときも
namespace{
}で囲ってやればいいのでしょうが、関数定義のような長いものをブラケットで
囲むというのも、邪魔くさいなぁと思い。
0732デフォルトの名無しさん
2008/07/12(土) 03:05:35だからこそそんなもの使わないですむようしておけって話じゃね?
0733デフォルトの名無しさん
2008/07/12(土) 03:08:33>として後で定義を書く場合、??::f()というような形式では定義できないのでしょうか?
こういう参照が出来ないからこそ役に立つんだと思う
0734731
2008/07/12(土) 03:15:56基本的に、C++では翻訳単位内でのみ使用する変数や関数は、C言語のような
staticを付けるのではなく、無名名前空間を推奨しているようですが、
そうなると関数の定義は
namespace{
void f() { }
}
のようにするということでしょうか。みんなそうしてるのかな。
0735732
2008/07/12(土) 03:27:22"翻訳単位内でしか使わない"っていうことを明示したいなら、
その邪魔くさいnamespaseが(目立つから)役に立つだろうし、
邪魔くさいnamespaseを使いたくないってことは、
"翻訳単位内でしか使わない"っていうことを明示しなくてかまわない
と、俺は思うけど。
本当に邪魔だと思うなら、翻訳単位内でしか使わないとか、あきらめなよ。
0736731
2008/07/12(土) 03:51:39namespace{}に収めるところまでは、目立たせる意味でも
一覧という意味でも非常にスッキリしてると思うんですよね。
ただ、ここに関数のボディまで書いてしまうと、一望しづらくなるので
別途書くことになるのですが、関数定義をブラケットで囲むということに
少し拒否反応がでてしまった次第です。ただ、これしか方法がないなら
そうするしかないですね。邪魔だから使わないというわけにもいかない
機能ですし。あとは、関数定義1つ1つをnamespace{]で囲むのか、複数の
関数定義をまとめてnamespace[]で囲むのか、こだわれるところとしたら
そのくらいですか。
0737デフォルトの名無しさん
2008/07/12(土) 04:02:32関数本体をメンテナンスするとき、どの関数に使用されているかが問題になるので。
宣言が目立たないと、間違って呼び出そうとしてリンクエラーでるじゃん? それもいやじゃん?
ていわれりゃそうなんだけどさ。
0738デフォルトの名無しさん
2008/07/12(土) 08:09:05何か書き方があるのでしょうか。教えてください。
template<typename T> void hoge(T arg);
0739デフォルトの名無しさん
2008/07/12(土) 08:30:51void hoge(double arg);
void hoge(float arg);
0740デフォルトの名無しさん
2008/07/12(土) 08:33:12template<typename T> struct hoge_chk{hoge_chk(){ use_float_or_double(); }};
template<> struct hoge_chk<float>{};
template<> struct hoge_chk<double>{};
template<typename T> void hoge(T arg){
hoge_chk<T>();
...
}
0741740
2008/07/12(土) 08:35:10コンパイルエラーにさせるため。
0742デフォルトの名無しさん
2008/07/12(土) 08:39:49template<> void hoge(float arg) { }
template<> void hoge(double arg) { }
でいいじゃん。
0743デフォルトの名無しさん
2008/07/12(土) 08:44:11それだと
void hoge(float arg) {}
void hoge(double arg) {}
と同じだし、それぞれ実装書かないといけないから
テンプレート関数にする意味無いだろw
0744デフォルトの名無しさん
2008/07/12(土) 08:45:47template<typename T> void hoge(T arg);
template<> void hoge(float arg) { hoge_impl(arg); }
template<> void hoge(double arg) { hoge_impl(arg); }
0745デフォルトの名無しさん
2008/07/12(土) 08:52:53同じじゃねーよ。そのコードでhoge("hogehoge")はエラーだけど>>739と>>742はエラーじゃない。
テンプレートにする意味がないっていうのは質問者に言えって。
0746デフォルトの名無しさん
2008/07/12(土) 08:55:57いや、hoge("hogehoge")で>>742はエラーになるよ。
0747デフォルトの名無しさん
2008/07/12(土) 08:56:00だから下のテンプレート関数は意味無いってw
それでやるならこうだろ
template<typename T> void hoge_impl(T arg) {}
inline void hoge(float arg) { hoge_impl(arg); }
inline void hoge(double arg) { hoge_impl(arg); }
0748デフォルトの名無しさん
2008/07/12(土) 08:59:00使えてしまう>>739も駄目だな
0749デフォルトの名無しさん
2008/07/12(土) 09:04:54>テンプレートにする意味がないっていうのは質問者に言えって。
>>740と>>747はテンプレートにする意味あると思うけど。
0750デフォルトの名無しさん
2008/07/12(土) 09:16:21テンプレートの特殊化は関数の多重定義に優先するから
意味が違う
0751デフォルトの名無しさん
2008/07/12(土) 09:21:25意味分かって言ってる?
それで困る「まともな状況」書いてみ
0752デフォルトの名無しさん
2008/07/12(土) 09:22:41関数の多重定義の方が無視されるだろ
0753デフォルトの名無しさん
2008/07/12(土) 09:25:48>テンプレートの特殊化と関数の多重定義を二つかくと
それがまともな状況じゃないって言ってるんだよw
0754デフォルトの名無しさん
2008/07/12(土) 09:26:34メンテナンスの程度次第ではいくらでもあり得る。
まともかまともな状況じゃないかはお前が判断する事じゃない。
0755デフォルトの名無しさん
2008/07/12(土) 09:27:36>関数の多重定義の方が無視されるだろ
これ逆だよ。関数の多重定義の方が優先される。
だからテンプレートの特殊化と関数の多重定義は混ぜて
書くべきじゃない。
0756デフォルトの名無しさん
2008/07/12(土) 09:31:38ワロタwどんな糞メンテナンスだよw
0757デフォルトの名無しさん
2008/07/12(土) 12:06:440758デフォルトの名無しさん
2008/07/12(土) 12:52:15>>755
0759デフォルトの名無しさん
2008/07/13(日) 12:38:070760デフォルトの名無しさん
2008/07/13(日) 13:14:51この話題↓で盛り上げてください!
やねう企画代表者やねうらお(本名・磯崎元洋)が
・ソフトウェアの不正コピーを行っていた
・労働契約上の違反をしていた
・他は不正コピーしていないことを証明しようとしてエロゲーのパッケージを発見し、
写真に撮ってアップロードしようとした。
http://d.hatena.ne.jp/pmoky/19000106
やねう企画の裏側(競馬の詐欺ソフトの製作現場)
http://d.hatena.ne.jp/pmoky/20060510
http://d.hatena.ne.jp/pmoky/20060511
http://d.hatena.ne.jp/pmoky/20060512
有限会社やねう企画(所在地・大阪府八尾市末広町2−1−2)が計画倒産
http://www.sia.go.jp/~osaka/zenso/19.09.pdf
やねうらおプロフィール
性格:友達から「チンピラ」「ヤクザ」と呼ばれている。前世で殺人鬼だった宿業を背負っているという妄想(自覚)あり。
最終学歴:専門学校卒
主な職歴:有限会社センキ(凌辱系アダルトゲームの製作会社)を経て独立、有限会社やねう企画を設立、2006年に計画倒産
代表作:『夜這いマニア』『盗撮マニア』『お楽しみCDシリーズ』『競馬詐欺ソフト』『BM98』
やねうらお語録
>「ワシのほうが潔癖やと思うんやけどな。
>絶対に違法コピーのソフトしか使わんし。
>たとえば強盗に入ったときに、ちょっとかわいそうになって
>十万円だけ残してったら、おかしいやろ?
>自分の『強盗する』という意思に対して矛盾やろ?
>だからワシは、一個も買ったソフトを使ったことがない!!」
0761デフォルトの名無しさん
2008/07/13(日) 13:18:26boostスレ過疎ってんな・・・w
760 :デフォルトの名無しさん [sage] :2008/07/13(日) 13:14:51
このスレ過疎ってるのでしょうか?
日本語が不自由のようだなw
0762デフォルトの名無しさん
2008/07/13(日) 14:27:070763デフォルトの名無しさん
2008/07/13(日) 14:49:07memset(buff, 0, 0); や memcpy(buff, work, 0);
0764763
2008/07/13(日) 14:50:35memset(buff, 0, 0); や memcpy(buff, work, 0); のように
サイズが 0 の場合、何も行われないという認識で合っていますか?
MSDN では分らなかったです。
0765デフォルトの名無しさん
2008/07/13(日) 15:06:560766デフォルトの名無しさん
2008/07/13(日) 15:09:41そういう場合、不安だったらmy_memsetかなんか一個かましておけ
0767デフォルトの名無しさん
2008/07/13(日) 15:12:29関数の呼び出し元にバッファ領域のポインタと領域サイズを渡させる場合に役に立ちます
memset や memcpy にサイズ 0 を渡しても大丈夫ということであれば、
領域サイズに 0 が指定された場合のエラーチェックをせずに済むケースがあるからです
0768デフォルトの名無しさん
2008/07/13(日) 15:25:06詳しく知りたければJISのサイトでX3010を検索。
0769デフォルトの名無しさん
2008/07/13(日) 15:25:19>function, n can have the value zero on a call to that function. Unless explicitly stated
>otherwise in the description of a particular function in this subclause, pointer arguments
>on such a call shall still have valid values, as described in 7.1.4. On such a call, a
>function that locates a character finds no occurrence, a function that compares two
>character sequences returns zero, and a function that copies characters copies zero
>characters.
0を渡すことはできるが、その場合でもNULLはダメらしい
0770デフォルトの名無しさん
2008/07/13(日) 15:44:01なるほど、それは確かに賢いやり方ですね。
ちょっと考えてみます。
>>768
調べてみます。
>>769
NULL チェックだけは避けられないということですね。
やはり、エラーをチェックする自作関数をかました方が良いのかもしれないですね。
0771デフォルトの名無しさん
2008/07/13(日) 18:18:24宣言と定義両方に初期化リストつけなきゃいけないんだっけ?
0772デフォルトの名無しさん
2008/07/13(日) 18:20:42class A {
int a;
A();
};
A::A():a(0){}
0773771
2008/07/13(日) 18:25:330774デフォルトの名無しさん
2008/07/14(月) 05:20:26class hoge {
public:
template<typename T> T func(T a) const;
};
=== hoge.cxx ===
#include "hoge.h"
template<typename T>
T hoge::func(T a) const {
return a;
}
=== main.cxx ===
#include "hoge.h"
int main() {
hoge h;
int a;
h.func(a);
return 0;
}
0775774
2008/07/14(月) 05:22:22$ g++ -c hoge.cxx -o hoge.o
$ g++ -c main.cxx -o main.o
$ g++ main.o hoge.o -o main
Undefined symbols:
"int hoge::func<int>(int) const", referenced from:
_main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
となってしまいます。
templateのメンバ関数というのは、これではまずいですか?
0776デフォルトの名無しさん
2008/07/14(月) 05:41:04h.func(a); を書いたソースから hoge::func の実装が見えるようにして下さい。
ようするに hoge.h に実装を書いてください。
0777デフォルトの名無しさん
2008/07/14(月) 05:50:17exportキーワードをサポートしてないC++処理系では無理
0779デフォルトの名無しさん
2008/07/14(月) 20:11:370780デフォルトの名無しさん
2008/07/14(月) 20:14:37exportもサポートされるかもな。
0781デフォルトの名無しさん
2008/07/14(月) 20:19:250782デフォルトの名無しさん
2008/07/14(月) 20:57:28なんで?
0783デフォルトの名無しさん
2008/07/14(月) 23:23:50export実装がそんなに困難であるはずがない。
0784デフォルトの名無しさん
2008/07/14(月) 23:29:47D言語はうまいことやってるけど。
0785デフォルトの名無しさん
2008/07/14(月) 23:31:360786デフォルトの名無しさん
2008/07/14(月) 23:33:17それがないんだな。
0787デフォルトの名無しさん
2008/07/14(月) 23:39:110788デフォルトの名無しさん
2008/07/14(月) 23:49:190789デフォルトの名無しさん
2008/07/15(火) 01:19:300790デフォルトの名無しさん
2008/07/15(火) 01:23:380791デフォルトの名無しさん
2008/07/15(火) 01:25:140792デフォルトの名無しさん
2008/07/15(火) 01:28:060793デフォルトの名無しさん
2008/07/15(火) 08:20:16実際どうなの?読む価値ナッシングぅ?
0794デフォルトの名無しさん
2008/07/15(火) 21:27:54読解可能なら原書を。
そうでないなら、項目を中心に辞書的に活用。
読む本としては厳しい。
0795デフォルトの名無しさん
2008/07/15(火) 22:33:14そうでなければ他人の論評の受け売り
0796デフォルトの名無しさん
2008/07/15(火) 22:36:380797デフォルトの名無しさん
2008/07/15(火) 22:47:180798デフォルトの名無しさん
2008/07/15(火) 23:37:130799デフォルトの名無しさん
2008/07/16(水) 02:18:51新訂版は知らんが、旧版についてなら>>794でFAだと思う。
はっきり誤訳とわかる箇所が散見される
(例:p.139 コンストラクターメンバ関数 → 例示コードでconstメンバ関数とわかる)、
一般的な訳語を使わない(例:省略時コンストラクター)などの問題がある。
訳者まえがきに「翻訳を急いだ」と書いてあるが、そういう問題かなという感じ。
ttp://www.pej-hed.jp/washo/38.html に新訂版の目次があるけど、
少なくとも訳語の問題はあまり変わっていないようす。
訳者は旧版の3人+新任1人なので、自分は読み直す気にはならない。
0800デフォルトの名無しさん
2008/07/16(水) 02:39:210801デフォルトの名無しさん
2008/07/16(水) 02:56:32懲りてないな。
トールキンで言うと戸田&山本の最凶タッグが成立するようなもんか。
0802デフォルトの名無しさん
2008/07/16(水) 14:34:49const → コンストラクタ は酷いな… orz
C++使わない人が訳したんだろうね。
0803デフォルトの名無しさん
2008/07/16(水) 21:09:25異なるテンプレートを用いることはできるでしょうか?
例えば、
template<typename T>
class foo
{
//Tがコンテナの要件を満たしてなければこの実装
};
template<typename T>
class foo
{
//Tがコンテナの要件を満たしていればこの実装
};
という感じのコードを書きたいと思っていますが、
やはりredefinition of 'class foo<T>'と怒られます。
上手く解決する方法はありますか?
0804803
2008/07/16(水) 21:17:360805デフォルトの名無しさん
2008/07/16(水) 21:38:26特殊化すればよろし
template< typename T, bool is_container >
class foo
{ /* コンテナ以外 */ };
template< typename T >
class foo< T, true >
{ /* コンテナの場合 */ };
is_container を自動的に判定するにはメタ関数を作る必要がある
0806デフォルトの名無しさん
2008/07/16(水) 21:41:40よかったら教えてください。
public ref class Form1 : public System::Windows::Forms::Form
{
public:
...
int fn1(int,int);
int fn2(int,int);
int fn3(int,int);
int (*fp[])(int,int){
fn1,
fn2,
fn3
};
...
関数ポインタの配列が作りたいのですが、error C4368がでます。
0807デフォルトの名無しさん
2008/07/16(水) 21:43:35C++/CLIは最早別の言語なので、専用スレへどうぞ。
0808デフォルトの名無しさん
2008/07/16(水) 21:45:11これくらいなら出来る
#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_integral.hpp>
using namespace boost;
template<class T>
struct Y {};
template<class T>
struct Z {};
template<class T>
struct X {
typedef mpl::if_<is_integral<T>, Y<T>, Z<T> >::type type;
};
0809デフォルトの名無しさん
2008/07/16(水) 21:46:08ありがとうございます。
そのメタ関数の作り方を教えていただけないでしょうか?
あるいは、そのようなテンプレートプログラミングについて解説してあるサイトを紹介してくださると助かります。
0810デフォルトの名無しさん
2008/07/16(水) 21:46:10すみません。移動します。
0811デフォルトの名無しさん
2008/07/16(水) 21:57:08boost::MPLにはあまり詳しくないのですが、
Xが整数型なら X<T>::type == Y<T> 、そうでなければ X<T>::type == Z<T> ということでしょうか。
組み込み型か否かというような判断ではなく、
例えば「Tがメンバにbegin()とend()を持つか否か」や「Tがメンバにoperator()を持つか否か」で、
使うテンプレートを分岐させたいのですが、解決方法があれば幸いです。
0812デフォルトの名無しさん
2008/07/16(水) 22:27:34任意の型について
>「Tがメンバにbegin()とend()を持つか否か」や「Tがメンバにoperator()を持つか否か
を判定することは出来ないと思います
x.begin()
と呼ぶのではなく
begin(x)
などと呼んで型ごとにオーバーロードを用意するとかではダメですか?
Boost.Range がこの方法を採用して begin を持つ型にひ持たない型にも対応しています
私もたまにそうします
0813デフォルトの名無しさん
2008/07/16(水) 22:38:50うーん、やはり無理ですか。
コンテナに対するオペレータのオーバーロードを考えていて、
コンテナが高階か1階かによって適用させる関数を変えたいと考えていたのですが、
どうもそういう発想に基づかない実装が必要なようですね。
ありがとうございました。
0815デフォルトの名無しさん
2008/07/16(水) 23:03:42役に立たないかもしれないけど、要件はクリア?
#include <iostream>
template<class T> struct Y { T m; };
struct Z {};
template<template<class T> class C>
struct X
{
template<class A>
static void f(C<A> x)
{
std::cout << "f(C<A>)" << std::endl;
f(x.m);
}
template<class B>
static void f(B x)
{
std::cout << "f(B)" << std::endl;
}
};
int main()
{
Y<Y<Z> > y;
X<Y>::f(y);
return 0;
}
0816デフォルトの名無しさん
2008/07/17(木) 00:17:58この方法だと、型を1つ引数に取るテンプレートクラスか否かで分岐させているということでしょうか。
できればそれに限らないコンテナ(boost::arrayとか)も一括して扱いたいのですが、
確かにvectorやdeque, listに関してはこれで扱えそうですね。
教えてくださってありがとうございます。
0817デフォルトの名無しさん
2008/07/17(木) 22:37:21以下のようなことがしたいのです。
※以下の全ての例は当然コンパイルはできません。
// 動的にテンプレートの型
list* getList(int n) {
if(1 == n) {
// int型のリストをreturn
}
if(2 == n) {
// double型のリストをreturn
}
}
int main() {
// 型情報を持たないlistクラスの変数を用意(したい)
list* x;
int num;
std::cin>>num;
// キーボードで入力した値によって型を変える
x = getList(num);
}
このような処理を行いたいのですが、どうにかならないでしょうか…
JavaにおけるObjectクラスのようなクラスがあればいいのですが。
0818817
2008/07/17(木) 22:37:52(1)typedefを使う
(2)マクロを使う
で、どちらも上手くいきません。
(1)については、
// typedef の前方宣言(をしたい)
typdef typ_t;
// 動的に型情報を決定(これだとスコープ的にダメ?)
if(1 == n) {
typedef int type_t
}
if(2 == n) {
typedef double type_t
}
// 動的に定まった型を用いてインスタンス化
list<type_t> x;
こんな感じにできないかと思ったのですが、
宣言がの方法がわかりませんでした。(できない?)
0819デフォルトの名無しさん
2008/07/17(木) 22:38:30// とりあえず何か型を設定
#define TYPE_T int
// 動的に型情報を決定
if(1 == n) {
#undef TYPE_T
#define TYPE_T double
}
if(2 == n) {
#undef TYPE_T
#define TYPE_T char
}
// 動的に定まった型を用いてインスタンス化
list<TYPE_T> x;
これは n の値によらず最後に #defile された値
が常に適用されてしまい、ダメでした。
(今の場合でしたら常に list<char> が生成されてしまう。)
もう本当にお手上げ状態でして、みなさんのお知恵を
お借りしたいと思っている次第でございます;;
何卒よろしくお願いします
0820デフォルトの名無しさん
2008/07/17(木) 22:39:41×宣言がの方法が
○前方宣言の方法が
0821デフォルトの名無しさん
2008/07/17(木) 22:57:57テンプレートクラスを使わずに普通のクラスで対処したらいけないの?
class list { /* listの定義 */ };;
class IntegerList : public list { /* IntegerListの定義 */ };
class DoubleList : public list { /* DoubleListの定義 */ };
list* getList(int n) {
if ( n == 1 ) { return new IntegerList(); }
if ( n == 2 ) { return new DoubleList(); }
}
0822デフォルトの名無しさん
2008/07/17(木) 23:15:060823デフォルトの名無しさん
2008/07/17(木) 23:20:01実行時には役立ちません
実行時の問題は実行時用の道具で対処したほうが良いでしょう
0824デフォルトの名無しさん
2008/07/17(木) 23:29:17元々の目的が
「テンプレートクラスの型指定を実行時に動的に行いたい」
ということですので、それだと本来の目的に合わないのです。
が、>>822 >>823 さんの仰るように、そもそも本来の目的の
方向性が良くなかったようで…。
一度構成を考え直してみたいと思います。
みなさん、どうもありがとうございました。
0825デフォルトの名無しさん
2008/07/17(木) 23:53:050826デフォルトの名無しさん
2008/07/18(金) 04:24:38受け取る例外ハンドラがない場合、terminage()が呼ばれabort()が呼ばれると。
abort()は何の後処理もせずプログラムを終了させるから具合が悪いという
ことが書かれているのだが、プログラムが終了すればすべてメモリは解放
されるのと違うの?プログラムが終了してまで、何か禍根が残るなんてこと
あるの?
0827826
2008/07/18(金) 04:25:20terminage() → terminate()
0828デフォルトの名無しさん
2008/07/18(金) 04:33:50ファイルシステムとかデータベースとか。
mkdir() を使ったロックなんかがわかりやすいかな?
0829826
2008/07/18(金) 04:39:16つまりプログラムとは独立したなんらかのリソースを操作する場合に
影響が残るということか…
0830デフォルトの名無しさん
2008/07/18(金) 04:54:12void f() throw( hoge1, hoge2, hoge3);
みたいな例外指定ってサポートされてないんだね。
標準C++勉強してると、意外と最近のコンパイラが標準準拠していない
ことに気づく。
0831デフォルトの名無しさん
2008/07/18(金) 07:57:370832デフォルトの名無しさん
2008/07/18(金) 13:08:34googleのsparse_hash_mapを使おうとして、マニュアル通り
#include <iostream>
#include <google/sparse_hash_map>
using namespace std;
using google::sparse_hash_map;
..
int main () {
sparse_hash_map<const char *, int, hash<const char *>, eqstr> months;
とすると、
'hash' was not declared in this scope
と、hash<const char *> すら定義されていないと言って怒られてしまいます。
hash_mapの場合も同じだったのですが、どうするといいでしょうか。
環境は g++ (GCC) 4.1.1 20070105, Linux FC6です。
よろしくお願いします。
0833デフォルトの名無しさん
2008/07/18(金) 13:25:34を追加してみてはいかがでしょう。
0834デフォルトの名無しさん
2008/07/18(金) 14:28:03ありがとうございます。
もう一度追加してみたのですが、エラーメッセージは同じのようでした。
ちなみに using __gnu_cxx; したり、__gnu_cxx::hash<const char *>と
すると、もの凄いエラーメッセージが出ます。。
0835832
2008/07/18(金) 18:20:56上のコードの struct eqstr の持つ比較関数
bool operator() (const char *a, const char *b) const
で、最後の const が抜けていたのが原因のようでした。
using namespace __gnu_cxx; で const を加えると、問題なく通りました。
# たったそれだけで長大なエラーメッセージが表示されるとは、
C++、恐ろしい子・・・!!
0836デフォルトの名無しさん
2008/07/18(金) 18:31:34コンパイル時間と長大なエラーメッセージに怖気づくなよ。
0837デフォルトの名無しさん
2008/07/18(金) 23:32:51VCはずっとサポートされないままだね。(他は知らないけど)
やっぱ難しいんかな。
0838デフォルトの名無しさん
2008/07/18(金) 23:45:04/ ̄ ̄ ̄ ̄\
/ |
| ⌒ ⌒ /|
| (・) (・) |||||||
| ⊂⌒◯-----∂)___ ___
| ||||||||_ / ゙Y" \
\ヽ_/ \/ \
\ / \
/ ̄ ̄ ̄ ̄) * ( ̄ ̄ ̄ ̄)
| ─< |\ >─ (
| ) / (|ミ;\ ( )
ヽ  ̄ ̄) /(___人|,iミ'=;\ (  ̄ ̄ )
/" ̄ ̄ ̄ ̄ / 《v厂リiy\  ̄ ̄ ̄ ̄\
/ / ゙|,/'' v:,,、.¨)z,_ \
/ / ミ/ .-─ .゙》z、 \
/ / 〔」″ノ‐ 、u ¨\ )
( / ゙|, ..冫 .rー  ̄\_ |
| 〔 ミ./′ ..r-ー __,,ア┐ |
| | {. .,,,, .′ .´′ .¨\|
| | ∨ ノ冖′ =vvvvvv¨\
| / ミ. ,i' .゙\_
| / .{. ノ ,r¬″ .¨\
0839デフォルトの名無しさん
2008/07/18(金) 23:49:41実装するだけなら全く難しくないと思うが
関数に try, catch 差し込んで unexpected 呼ぶだけでしょ
0840デフォルトの名無しさん
2008/07/19(土) 00:32:210841デフォルトの名無しさん
2008/07/19(土) 16:56:54はっきり言って全くいらない機能
0842デフォルトの名無しさん
2008/07/19(土) 23:51:23http://www.artima.com/intv/handcuffs.html
0843デフォルトの名無しさん
2008/07/20(日) 07:52:16これって遠近法で描かれたウンコなのかドリルなのか気になる
0844デフォルトの名無しさん
2008/07/20(日) 09:28:32アナル vs ドリル
0845デフォルトの名無しさん
2008/07/20(日) 10:54:04これらの中からもとのnew/deleteを呼ぶにはどうしたらよいですか?
0846デフォルトの名無しさん
2008/07/20(日) 14:57:11::operator newと::operator deleteでどうよ。
0847デフォルトの名無しさん
2008/07/20(日) 17:09:26mallocでも呼んどきゃいいんでね?
0848デフォルトの名無しさん
2008/07/20(日) 17:58:46コンストラクタを呼びたいんじゃね?
0849デフォルトの名無しさん
2008/07/20(日) 18:09:06ひょっとしてたとえば、メモリ管理クラスがあって、operator new()で
そのメモリ管理クラスをインスタンス化するためにnewしたくなったけど、
メモリ管理クラスのメモリはどうするんだってな話?
0850デフォルトの名無しさん
2008/07/21(月) 04:35:49安全なのでしょうか?
つまりdelete this;ってことになるかな。
自分自身が解体された後にメンバ関数からリターンするって何か変ですよねぇ。
しかもdelete this;の後にも処理が続いてたらやばいですよね。
0851デフォルトの名無しさん
2008/07/21(月) 06:40:13安全。ただしもちろん、それやったあとにそのインスタンスを使っちゃいけない。
たとえばboost::intrusive_ptrみたいに、値に自身の参照カウンタを持たせるスマートポインタの場合、
値となる型に
void Release() { if (!--refCount_) delete this; }
みたいなメンバ関数を用意することになる。
0852デフォルトの名無しさん
2008/07/21(月) 06:41:32他のメンバーにアクセスせずにリターンするだけなら問題はないような。
実際どっちのデザインがいいのだろ。
A a = A::createInstance();
a.Free();
A::Free(a);
0853850
2008/07/21(月) 06:50:27deleteした後に余計なことしなければ、いけるってことですね。
0854デフォルトの名無しさん
2008/07/21(月) 16:09:12教えていただけないでしょうか?
ある行列を多くの行列演算の和として計算したいのですが、
代入を繰り返すことでおそくなってしまいます。
例えば以下のような例です。
for(i=0;i<100;i++){
MAT1+=some_matrix;
}
some_matrixには毎回べつの行列が計算されてはいります。
expression template でこれを高速可できるということですが、
for文の中で毎回代入していまうとその時点で式が評価されてしまうので遅くなってしまうようです。
式そのものを変数として保持しておくような事はできるのでしょうか?
初歩的な質問ですみませんがどなたかお願いします。
0855デフォルトの名無しさん
2008/07/21(月) 16:15:300856デフォルトの名無しさん
2008/07/21(月) 16:36:33draw_digit = rand() % 13 + 1;
if(h) {
printf("%sの%s\n", mark[draw_mark-1], digit[draw_digit-1]);
}
r = total[draw_digit-1];
この文の+1と-1はあってもなくても結果は同じですよね? 気になったので教えてください
0857デフォルトの名無しさん
2008/07/21(月) 16:46:490858デフォルトの名無しさん
2008/07/21(月) 18:23:52乱数の結果が+1してあれば「乱数値を1オリジンに変換している」というニュアンスが伝わるし、
配列のインデックスが-1してあれば「カード番号を0オリジンに変換している」というニュアンスが伝わる。
0859デフォルトの名無しさん
2008/07/21(月) 18:34:070860デフォルトの名無しさん
2008/07/21(月) 18:39:15そういう無意味な書き込みして楽しい?
そうかぁ、寂しい青春送っているんだね。
0861デフォルトの名無しさん
2008/07/21(月) 18:49:41>>860
0862デフォルトの名無しさん
2008/07/21(月) 19:45:36struct a { int x;
int y;
}
があったとして
struct b: public a{
int z;
}
これは構造体bに変数x,y,zの3つがあるという考え方でいいんでしょうか?
ほんと低レベルで申し訳ない…
別スレから誘導?されてきました…orz
0863デフォルトの名無しさん
2008/07/21(月) 19:53:010864デフォルトの名無しさん
2008/07/21(月) 19:53:18そういうことになるね。
0865デフォルトの名無しさん
2008/07/21(月) 19:54:28ありがとうございました!
0866デフォルトの名無しさん
2008/07/21(月) 20:04:32どういたしまして!
0867デフォルトの名無しさん
2008/07/21(月) 20:45:360868デフォルトの名無しさん
2008/07/21(月) 21:03:470869デフォルトの名無しさん
2008/07/22(火) 00:45:290870デフォルトの名無しさん
2008/07/22(火) 01:06:440871デフォルトの名無しさん
2008/07/22(火) 07:39:36別にいいけど、せっかくC++使うなら
class a {
public:
int x;
...
ってクラスにすべきだよね。内部では同じだとしても。
細かい?
0872デフォルトの名無しさん
2008/07/22(火) 07:44:50いや、どっちかというと struct が正解だろう。データに何の制約も課していないからね。
C の知識で読める( C でコンパイルできる)ってのもある。
C++ の言語的にはどっちも「クラス型」だから、 class にすべきってのもわからんでもないけど。
0873デフォルトの名無しさん
2008/07/22(火) 07:49:07なるほど、そういう考え方もあるんですね。参考になりました
0874デフォルトの名無しさん
2008/07/22(火) 12:01:38お勧めの関数はなんですか?
今自分ではiostreamとint(void)に目をつけています。
アドバイスよろしくお願いします
0875デフォルトの名無しさん
2008/07/22(火) 12:46:210876デフォルトの名無しさん
2008/07/22(火) 12:58:490877デフォルトの名無しさん
2008/07/22(火) 13:12:180878デフォルトの名無しさん
2008/07/22(火) 13:13:40質問なんですが
for(;; p_turn = !p_turn){
if(p_turn){
//プレイヤーに休みがある場合
if (player_h > 0) {
printf("\nプレイヤーはあと%d 回休みです\n", player_h);
player_h--;
continue;
}
//サイコロを振る
printf("\nプレイヤーの番です。サイコロを振る>");
while(getchar() != '\n'){}
player = rand() % 6 + 1;
↓続く
7行目のコンテニューが来たら最初のfor文に戻るんですか?
0879デフォルトの名無しさん
2008/07/22(火) 13:54:110880デフォルトの名無しさん
2008/07/22(火) 14:18:58それはない。
gotoにすべきものを無理矢理ループとcontinueに置き換えたというものでもない限り。
0881デフォルトの名無しさん
2008/07/22(火) 14:50:27じゃあこのContinueはforの所まで戻るってことでいいんですか?
0882デフォルトの名無しさん
2008/07/22(火) 14:51:510883デフォルトの名無しさん
2008/07/22(火) 14:57:54大変申し訳ございませんでした
>>そんなこと聞いてる間に動かしてみれば1分でわかるだろうに。。。
「百聞は一見にしかず」と言いますしね。
いまからビルドして実行してきます。
>>ALL
適切なアドバイス及び指摘、誠にありがとうございました。
それでは少しの間失礼させてもらいます。
0884デフォルトの名無しさん
2008/07/22(火) 14:58:57誤字脱字をしてしまい、大変申し訳ございません。
ならびに連続でレスしたことを謝罪します。
0885デフォルトの名無しさん
2008/07/22(火) 15:02:12ちょっとー
はやくしてくれる?
☆ チン ハラヘッタ〜
ハラヘッタ〜
☆ チン 〃 ∧_∧
ヽ___\(\・∀・)
\_/ ⊂ ⊂_)
/ ̄ ̄ ̄ ̄ ̄ /|
| ̄ ̄ ̄ ̄ ̄ ̄| |
|淡路たまねぎ|/
 ̄ ̄ ̄ ̄ ̄ ̄
0886デフォルトの名無しさん
2008/07/22(火) 16:17:000887デフォルトの名無しさん
2008/07/22(火) 17:57:090888デフォルトの名無しさん
2008/07/22(火) 18:06:29年齢をインクリメントさせると同時に
膣圧をデクリメントすればいいのでは?
#include <iostream.h>
.
.
.
.
age++;
hp--;
中略
return 0;
}
0889デフォルトの名無しさん
2008/07/22(火) 18:58:220890デフォルトの名無しさん
2008/07/22(火) 20:17:37ちょっと感激w
0891デフォルトの名無しさん
2008/07/22(火) 20:32:120892デフォルトの名無しさん
2008/07/22(火) 20:39:38ここでマンコと膣圧とオナホールの話題は止めるか
調子にのってスマンかった。本来あるべき姿に戻るべきだと思った
#include <stdlib.h>
main()
{
for(;;){
/*マンコと膣圧とオナホールの話題は終わり*/
age++;
hp--;
if(892) {break;}
}
return 0;
}
0893デフォルトの名無しさん
2008/07/23(水) 03:20:20typedef enum button_type { ... };
enum button_styles { ... };
のように enum に typedef を付けたり付けなかったりと区別して書かれています。
これって何か意味があるんでしょうか?
0894デフォルトの名無しさん
2008/07/23(水) 03:22:00肝心の typedef 名が無いから、 typedef を消し忘れただけだろ。
0895893
2008/07/23(水) 03:24:46そうなんですかね?
あからさまに区別して書かれているようなのですが…
で動作としては両者とも同じってことで大丈夫ですか?
0896デフォルトの名無しさん
2008/07/23(水) 03:50:13上は gcc だと「意味無い」って警告が出たような気がする。
0897デフォルトの名無しさん
2008/07/23(水) 09:02:08二重のfor文の処理方法がよくわからないのですが
わかりやすく説明してもらえませんか?
for(j=1; j <= MTX; j++){
for(i=1;i <= MTX; i++){
//最後のマスならば終了
if((j == MTX) && (i ==MTX)) {break;}
do{
r = rand() % (CMTX(MTX) - 1)+1;
} while(usedigit[r-1] == 1);
board[j-1][i-1] = r; //ボードに代入
usedigit[r-1] = 1; //使われた数値をチェック
printf(" %02d", r);
}
printf("\n");
}
board[MTX-1][MTX-1] = 0;
}
0898デフォルトの名無しさん
2008/07/23(水) 09:07:40>897が相談と言いつつ「説明してもらえませんか」と質問している理由がよく判らないのですが、
判りやすく説明してもらえませんか。
つーか、初心者スレにでも行け。
0899デフォルトの名無しさん
2008/07/23(水) 09:10:10ってゆうかもうプログラムできてんじゃないの??w
0900デフォルトの名無しさん
2008/07/23(水) 09:16:03だから解説しろってことなんでしょ。
0901デフォルトの名無しさん
2008/07/23(水) 09:17:140902デフォルトの名無しさん
2008/07/23(水) 09:18:33要するに、「私はこういうプログラムを書きましたが、このプログラムについて説明してください」
ってこと?
まずは自分で説明してみろ
そのうえでどこが疑問なのかはっきりしろ
0903デフォルトの名無しさん
2008/07/23(水) 09:22:440904デフォルトの名無しさん
2008/07/23(水) 09:31:22最初のfor文が実効されたら次のfor文に移って、
2個目のfor文を抜けたら最初のfor文に戻って2個目のfor文に移る
の繰り返しでいいんでしょうか?
ちなみに10日で覚えるC言語入門教室って本にあった一説です。
解説に載っていなかったので質問させていただきました。
2個目for文が実効されている間はiがインクリメントされていくけど
一度抜けて再度来た場合には初期化されて1になりますよね?
初心者すぎる質問ですいません;;
0905デフォルトの名無しさん
2008/07/23(水) 09:32:080906デフォルトの名無しさん
2008/07/23(水) 09:35:56本だけの脳内実行だったらもう一度読み直せ。
0907デフォルトの名無しさん
2008/07/23(水) 09:38:4708 01 07
06 05 04
02 03 00
と出力されました。
ありがとうございました。初心者スレ行ってきます。
0908デフォルトの名無しさん
2008/07/23(水) 14:07:49一度値を決めたらあとは絶対に値を変更できなくしたい、
でも、コンストラクタのイニシャライザの段階じゃその値は決まっていない、
から・・・
と思ったので、下のようなクラス作ったんですが、
他に同じようなことを実現する方法ってありますか?
template<typename T>
class const_value{
private:
T value;
bool flag;
public:
const_value(){
flag=false;
}
const_value(T val){
flag=true;
value=val;
}
0909デフォルトの名無しさん
2008/07/23(水) 14:08:21bool add_value(T val){
if(!flag){
value=val;
flag=true;
return true;
}
else{
return false;
}
}
T get_value(){
return value;
}
};
0910デフォルトの名無しさん
2008/07/23(水) 15:07:06Tが構造体みたいな容量の大きなものだったら参照を使おうね。
0911デフォルトの名無しさん
2008/07/23(水) 15:26:38throw logic_error(); とか、いっそ abort() でもいいかと
0912デフォルトの名無しさん
2008/07/23(水) 21:19:170913デフォルトの名無しさん
2008/07/23(水) 21:21:37違うのはC++じゃなくて、コンパイラとかエディタとかそういうのじゃね?
0914デフォルトの名無しさん
2008/07/23(水) 21:28:32標準化されてるの?
0915デフォルトの名無しさん
2008/07/23(水) 21:30:36wikipediaあたりで調べて出直してこいや
0916デフォルトの名無しさん
2008/07/23(水) 21:39:180917デフォルトの名無しさん
2008/07/23(水) 21:45:03実用上の観点からはバグと添付ライブラリが違う
0918デフォルトの名無しさん
2008/07/23(水) 22:15:02もっと罵ってください
気持ちよくなってきた
0919デフォルトの名無しさん
2008/07/23(水) 22:23:320920デフォルトの名無しさん
2008/07/23(水) 22:36:300921デフォルトの名無しさん
2008/07/23(水) 23:19:39�@
#include <stdio.h>
main()
{
int i,j;
for(i=1;i<=10;i++){
for(j=14;j>=i;j--){
printf("×");
}
printf("\n");
}
}
�A
#include <stdio.h>
main()
{
int i,j;
for (i=1;i<=11;i=i+2){
for(j=1;j<=i;j++){
printf("×");
}
printf("\n");
}
}
�@の方は×で台形のような形が出来るんですけど、上底が14で下底が5で高さ5なんです
�Aの方は直角三角形みたいな形で、底辺が11高さが6なんです
�@の方は1つ目のfor(i=1;i<=10;i++){のところで高さを出してるのに
�Aの方は1つ目のfor (i=1;i<=11;i=i+2){のところで底辺を出してるんです
�@の要領で�Aの一つ目のforで高さを出そうとしても出来ません
なぜ同じ要領で出来ないのですか?読解力に定評のある方教えてください><
0922デフォルトの名無しさん
2008/07/23(水) 23:21:34C宿題スレへ池
0923デフォルトの名無しさん
2008/07/23(水) 23:22:160924デフォルトの名無しさん
2008/07/24(木) 00:21:440925デフォルトの名無しさん
2008/07/24(木) 00:24:200926デフォルトの名無しさん
2008/07/24(木) 00:32:140927デフォルトの名無しさん
2008/07/24(木) 01:34:540928デフォルトの名無しさん
2008/07/24(木) 07:59:20D?
0929デフォルトの名無しさん
2008/07/24(木) 08:01:230930デフォルトの名無しさん
2008/07/24(木) 08:02:50世界中のアルファギークが注目してる
0931デフォルトの名無しさん
2008/07/24(木) 09:48:49この文で最初に\をつける意味は何ですか?
調べても分からなかったので教えてください。
0932デフォルトの名無しさん
2008/07/24(木) 09:51:39夢と希望・・・じゃないかな
0933デフォルトの名無しさん
2008/07/24(木) 10:01:150934デフォルトの名無しさん
2008/07/24(木) 10:10:39>>931
マジレスすると単なるタイプミス。余計な\が入ったか、
もしくは"\n-------終了-------\n"と書こうとした可能性もある。
0935デフォルトの名無しさん
2008/07/24(木) 10:11:250936デフォルトの名無しさん
2008/07/24(木) 10:22:49ありがとうございました。
不思議に思っていたことが解決しました。
ちなみに僕がC言語の中で大好きな言葉はvoidです。
0937デフォルトの名無しさん
2008/07/24(木) 10:24:220938デフォルトの名無しさん
2008/07/24(木) 10:26:500939デフォルトの名無しさん
2008/07/24(木) 10:42:230940デフォルトの名無しさん
2008/07/24(木) 10:46:43必殺技っぽくて好き。
0941908
2008/07/24(木) 14:34:18>>911
遅くなりましたが、ありがとうございます。
>>910
確かに。参照にするべきですね。
>>911
boolじゃ、わざわざif文書かなきゃだし、
それ忘れると、逆にバグだ出そうですもんね。
変更します。
m(_ _)m
0942デフォルトの名無しさん
2008/07/24(木) 15:50:12ハイパーボリックアークタンジェントが好きな中学生を思い出した
0943デフォルトの名無しさん
2008/07/24(木) 15:54:280944デフォルトの名無しさん
2008/07/24(木) 16:02:45http://www.google.com/search?q=%E5%BF%85%E6%AE%BA%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%9C%E3%83%AA%E3%83%83%E3%82%AF%E3%82%A2%E3%83%BC%E3%82%AF%E3%82%BF%E3%83%B3%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88
0945デフォルトの名無しさん
2008/07/24(木) 16:16:050946デフォルトの名無しさん
2008/07/24(木) 16:21:320947デフォルトの名無しさん
2008/07/24(木) 16:28:43ごめんなさい
0948デフォルトの名無しさん
2008/07/24(木) 22:29:510949デフォルトの名無しさん
2008/07/24(木) 22:38:210950デフォルトの名無しさん
2008/07/25(金) 15:44:03すると、デバッグ用のランタイムでビルドしてあれば、実行時に"vector iterator not dereferencable"というメッセージと、
行番号などが出て強制終了します。
単なるassertマクロより、これの方が便利だな〜と思いました。
ソースを見ると_DEBUG_ERRORというマクロを使っているみたいなのですが、
これって、環境依存のため自分のコードには使わない方がいいですよね?
ちなみに環境はVC2008EEです。
0951デフォルトの名無しさん
2008/07/25(金) 15:50:02それともHSPですか?
0952デフォルトの名無しさん
2008/07/25(金) 15:59:000953デフォルトの名無しさん
2008/07/25(金) 16:01:240954デフォルトの名無しさん
2008/07/25(金) 16:04:15別に使っていい。環境依存とわかってるならなお問題ない。
0955デフォルトの名無しさん
2008/07/25(金) 17:09:52「プログラミング言語C++第3版」とか
「C++標準ライブラリ チュートリアル&リファレンス」とか。良い本なのに。
EffectiveC++も以前はASCIIから出てたよね。
0956デフォルトの名無しさん
2008/07/25(金) 17:19:060957デフォルトの名無しさん
2008/07/25(金) 17:54:520959デフォルトの名無しさん
2008/07/25(金) 21:09:13個人でアルソイカンツォは記述することは可能なんですか?
使用ソフトはVS2008Proです。
0960デフォルトの名無しさん
2008/07/25(金) 21:19:200961デフォルトの名無しさん
2008/07/25(金) 21:29:20プログラムのソースコードをドラックアンドドロップすると
自動でヘッダーファイルを作成してくれるツールのコードです。
0962デフォルトの名無しさん
2008/07/25(金) 21:31:580963デフォルトの名無しさん
2008/07/25(金) 21:35:23Visual C++の/Zgのようなやつだよな、きっと。
0964959
2008/07/25(金) 21:47:43夏休みの課題になっているんです・・・。
提出できないとやばいので必至こいて頑張ります。
レスありがとうございました。
0965デフォルトの名無しさん
2008/07/25(金) 21:59:40C++のコンパイラ書く気合があるならともかく。
0966デフォルトの名無しさん
2008/07/25(金) 22:01:300967デフォルトの名無しさん
2008/07/25(金) 22:04:070968デフォルトの名無しさん
2008/07/25(金) 22:20:48外国語の綴りまではわかりません・・・。
0969デフォルトの名無しさん
2008/07/25(金) 22:25:43↓
そのうちこのスレだけ出るようになる
↓
>>959がここで質問してたことがバレる
0970959
2008/07/25(金) 22:34:53�@テ○ルズオブヴェ○ペリアのヒロインであるエス○ルをそっくりそのままモデリング
�AC++で「アルソイカンツォ」のコードを描く。
�B情○大陸の耳コピ。
とCG/PG/Soundから選択方式になっています。
�Aを選択したのは65人中3人だけだったのですが、
質問したことがばれたら足がつくのは時間の問題かもしれません。
話が外れてきてしまったのでそろそろ失礼します。
アドバイス等ありがとうございました。
0971デフォルトの名無しさん
2008/07/25(金) 22:36:24ある意味、俺もそんな課題出されたかった。
0972デフォルトの名無しさん
2008/07/25(金) 22:39:390973デフォルトの名無しさん
2008/07/25(金) 22:49:402.空白文字列開きカッコ文字列カンマ・・・閉じカッコ空白の文字列を切り出す
3.戻り値とかパラメータの型を判別するアルゴリズムができず困る
こんな感じかな。
0974デフォルトの名無しさん
2008/07/25(金) 22:51:240975デフォルトの名無しさん
2008/07/25(金) 22:54:33int /* ゆーれりほー */ hogehoge() /* やっほー */ { printf("hello world\n"); }
みたいなコードがあったらうまく変換できる自信がない。
コンパイラ並の字句/構文解析するなんて嫌だぁぁぁ
0976デフォルトの名無しさん
2008/07/25(金) 22:57:32ただし、宣言にstaticがついていたり、無名namespaceで囲まれていれば、その宣言は生成しない。
クラスなんてネストできるから悲惨なことになりそうだが。
つーか一番厄介なのはプリプロセッサだよな。
#define HOGE 0xdeadbeef
こういうのはやっぱりヘッダにも入れるべきだろ。
しかし、
#define macro(z, n, data) \
int const BOOST_PP_CAT(ID, n) ;
BOOST_PP_REPEAT(30, macro, ~)
#undef macro
こんなのはどうするんだ。
それこそ実際に動くプリプロセッサを使わなければいけないよな。
0977デフォルトの名無しさん
2008/07/25(金) 22:58:540978デフォルトの名無しさん
2008/07/25(金) 23:03:16少なくとも自分はこんな言葉聴いた事無いし、>>961の内容でも具体的にどんな情報からどんな情報を出力するのかよくわからん。
0979デフォルトの名無しさん
2008/07/25(金) 23:08:11了解しました、明日学校に先生いると思うので
直接聞きに行ってみます。
ちなみに、僕も「アルソイカンツォ」なんて聞いたことないです・・・。
0980デフォルトの名無しさん
2008/07/25(金) 23:09:38グーグル先生は最近2chのスレを半日でインデックスに入れたりするから気をつけろよw
0981デフォルトの名無しさん
2008/07/25(金) 23:16:26入力するファイルは絶対もらってきた方がいいぞ
検証できないプログラムっていうのは書いてて地獄だからな
0982デフォルトの名無しさん
2008/07/25(金) 23:18:05アルソイカンツォの機能としては、どの言語で書かれたソースコードを解析して、何のヘッダを出力するんだろうか。
0983デフォルトの名無しさん
2008/07/25(金) 23:19:38イタリアの詩人、ルドヴィーコ・アリオストの作品、
「狂えるオランダ人」の一節に由来する。
0984デフォルトの名無しさん
2008/07/25(金) 23:20:44out na kiosura
アウトな気をすらぁ
つまりこの設問は罠だ
0985デフォルトの名無しさん
2008/07/25(金) 23:43:560986デフォルトの名無しさん
2008/07/25(金) 23:46:020987デフォルトの名無しさん
2008/07/25(金) 23:49:55もしかして、音楽を再生しろって課題だったりして。
0988デフォルトの名無しさん
2008/07/25(金) 23:50:49いるなら基礎から教えてもらってスーパーC使いにしてもらおうと思ったのです
0989デフォルトの名無しさん
2008/07/25(金) 23:52:35ごめんなさい。
私、ほかに好きな人がいるんです。
0990デフォルトの名無しさん
2008/07/25(金) 23:55:45それはジャンルではなくてグループ名ではないのか
0991デフォルトの名無しさん
2008/07/26(土) 00:00:58え、バンドなの!?
俺ハズカシー
0992デフォルトの名無しさん
2008/07/26(土) 00:13:49ちなみに plala は規制されてるんで無理だった
0993デフォルトの名無しさん
2008/07/26(土) 00:19:090994デフォルトの名無しさん
2008/07/26(土) 00:23:430995デフォルトの名無しさん
2008/07/26(土) 00:43:01それだとスーパーじゃないし
0996デフォルトの名無しさん
2008/07/26(土) 01:58:51メガネをかけるだけでよかったときとは時代が変わっているのだよ
0997デフォルトの名無しさん
2008/07/26(土) 02:50:200998デフォルトの名無しさん
2008/07/26(土) 02:53:41http://pc11.2ch.net/test/read.cgi/tech/1217008269/
0999デフォルトの名無しさん
2008/07/26(土) 02:53:591000デフォルトの名無しさん
2008/07/26(土) 03:02:4310011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。