[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 12/22 20:21 / Filesize : 245 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.50【環境依存OK】



1 名前:デフォルトの名無しさん [2008/02/28(木) 00:01:39 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1203478421/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

237 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:14:44 ]
>>236

失礼しました。
環境に依存する内容は避けたほうがよいですね。

238 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:52:21 ]
>>237
環境依存OKのスレだから問題ないんだけどC/C++よりも
linuxの話になるね

ちなみにWindowsの仮想メモリとメモリマップトファイルも似たような
機構で実現している

239 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 07:59:34 ]
複数ある単語から文字列中最初にマッチする物を探す用途で、
こんなのを考えてみたのですが、こういう2分木辞書ってなんて
名前になるんでしょうか?
サフィックスツリー?(これよりもっと複雑なようですが)

typedef std::map<char, Node> Tree;
//char に単語の1文字が入る

struct Node {
 Node *pChild; //次の文字ノード
 int No;      //登録番号、兼、非末端(-1)
}

単語がab,ba,ac,abcとあるなら、子ノードの繋がりが下記のようになる。
先頭   <a,-1>       <b,-1>
      / \       /
    <b,0>  <c,3>   <a,1>
    /
  <c,3>

240 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 08:01:07 ]
訂正
struct Node {
 Tree *pChild;
 int No;
}

241 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:10:06 ]
&ClassName::memberVarName;

って演算はいったい何を行っているのでしょうか?
最初オフセット値を得ているのかと思ったんですが、ためしに出力しても、1が出力
されるだけです。

元ソースでは、これを引数にしてメンバ変数のオフセット値を得ているようですが…

242 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:11:38 ]
>>241
メンバポインタでぐぐれ

243 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:27:45 ]
>>242
ありがとうございます。おかげで理解できました。

メンバポインタからオフセット値を得るには、

&( static_cast<A*>(0)->*memPtr )

で仕様上問題ないでしょうか?

244 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 09:35:43 ]
単にオフセットが欲しいんなら offsetof を使えばいい

245 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 11:13:30 ]
>>243
実際には動くだろうけど、仕様上は良くないような
ちゃんとインスタンスを用意した方がいいんじゃない



246 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 11:30:26 ]
>>243
オフセットは POD 型に対しての offsetof でしか取れないよ。
素直にメンバポインタ通して参照しちゃダメなの?

247 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 12:07:59 ]
>>229
仕様上正しい。

以下はJosuttis本の記述の要約。

istream& istream::ignore(streamsize count, int delim)
This form ignores up to count characters until delim is extracted and discarded.
(ストリームから改行まで抽出されて捨てられる。)

ちなみにg++ 4.0では無問題だった。

248 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 12:50:21 ]
>>239
トライ木じゃねえの

249 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 15:03:37 ]
>>236
割り込みなんかかからない。
ページング機構を備えるどんなプロセッサでも(俺の知る限り)
プロセッサ自体に、書き込まれたかどうかのフラグ
(いわゆる、dirty bit と呼ばれるもの)をセットする機構がある。
例えばx86ならば、ページテーブルの該当ページを示すエントリ内にこれがある。
で、ファイルから読み込んだときにOSがこのフラグをリセットしておき
OSは、ページが不要になった時やsync要求が来たときにこのフラグを確認して
書き戻すか破棄するかを決定する。

250 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 15:09:16 ]
>>248
それみたいですね。
すっきりしました、感謝。

251 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 16:48:21 ]
>>245,246
仕様上ダメですか…違う方法を模索することにします。

252 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 20:58:31 ]
>>249

すみません。

read write のようなシステムコールを実行するとOSデバイスドライバが
あとは処理してくれますよね?
代入演算子を使ってmmapした領域に書き込むとき、
そのフラグもセットするようにgccが実行ファイルを生成してくれるのでしょうか?
でもそれだと操作するアドレスがどこなのかをプログラムソースには書かなくても実行ファイルの中では
毎回見ているということでよろしいのでしょうか?

253 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 21:15:49 ]
dirty bitを立てるのは249に書いてあるとおりCPUの仕事。
特にコンパイラがすることはない。

254 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 21:47:57 ]
仮想記憶でぐぐればいいと思うよ。

255 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 21:51:42 ]
ちなみに、少し前のLinuxカーネルのバグは
この複数からの同一ページへのアクセス時に
このフラグをうまく処理しなかったかららしい。

また、少し違うが
phenomのバグはキャッシュに対するdirty bitの反映が
高負荷時に滞るというものらしい。



256 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:03:13 ]
もう少し補足すると、
普通のページング可能なプロセッサは、
TLBと呼ばれる、ページテーブルのキャッシュを内部に持っている。
(x86以外では呼び方が違うかもしれない)
したがって、該当ページへの書き込みがある度に
毎回物理メモリ上のページテーブルに書き込んだりはしない。
(TLB内の情報と変更があった場合のみ、書き込む)

で、このTLBの内容を書き戻すときにまずキャッシュに書き込むわけだけど
これがうまくいかない場合がある、というのがphenomのバグらしい。
L1とL2の関係もあるとかどっかで読んだが詳しくは覚えてない。

257 名前:デフォルトの名無しさん [2008/03/03(月) 22:37:05 ]
enumってプリプロセッサが解釈するのでしょうか??

258 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:41:16 ]
いいえ。コンパイラたんがせっせこお仕事します。

259 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:41:58 ]
>>258
サンクスでちゅ。

260 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:51:12 ]
>>253

ありがとう。
CPUのやるとことまで押さえるのは難しいな。

もちろん仮想記憶で調べたりもしてるんですが、
なかなか自分の知りたいところのたどり着けない。
使い方はソースも含めて載ってたりするんだが。

261 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:31:23 ]
>>260
そういうCPUまわりのことを色々知りたいなら、
www.intel.co.jp/jp/download/index.htm
ここにあるIA-32なんとかなんとか下巻:システム・プログラミング・ガイドが参考になるかも

262 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:00:20 ]
ちょっとお聞きしたいのですが
stringクラスの関数でcompareというのがありますが、参考書によると

int compare(const string& str) const;

のように定義されているとあります。
この定義のconst string& の&ってどういう意味の&なんでしょうか?
最後のconstも、なぜここにconstがあるのか分かりません。

また、上の定義が宣言されている場所を探してみたのですが、そもそもそれが見つかりません。string.hの中にはないのでしょうか??
質問ばかりで申し訳ないのですが、どなたか教えていただけると幸いです。

263 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:15:09 ]
>>262
C++をもちっと勉強するといいよん。
&は参照。C++で導入された機能。参照についてはぐぐるよろし。
constは簡単に言うと「この関数はメンバ変数を変更しません」って宣言。
compare関数を呼ぶことで元の文字列を弄られちゃ話にならんだろ?

264 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:15:17 ]
たぶん、これからも山ほど疑問が出てくるだろうから
入門書を読んだほうが早いと思う。

265 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:16:31 ]
あと定義はstring.hではなくてstringの中だ。
string.hはCのヘッダーだからそりゃないだろうね。



266 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:19:45 ]
>>262
> ちょっとお聞きしたいのですが
> stringクラスの関数でcompareというのがありますが、参考書によると
>
> int compare(const string& str) const;
>
> のように定義されているとあります。
> この定義のconst string& の&ってどういう意味の&なんでしょうか?
> 最後のconstも、なぜここにconstがあるのか分かりません。
>
> また、上の定義が宣言されている場所を探してみたのですが、そもそもそれが見つかりません。string.hの中にはないのでしょうか??
> 質問ばかりで申し訳ないのですが、どなたか教えていただけると幸いです。
例えばcompare(const string str)だとすると引数にstd::string型のオブジェを入れると
std::stringのコピーコンストラクタがstrに働いて無駄なメモリ間のコピーが働く
compare(const string& str) とする理由は引数に参照を取る事となり
コピーが働かないので無駄なメモリの消費がなくなる。
最後のconstはメンバ関数を呼び出したオブジェクトを修正できないようにすることです

267 名前:252 mailto:sage [2008/03/04(火) 01:45:56 ]
レスくださった方々ありがとうございます。

>std::stringのコピーコンストラクタがstrに働いて無駄なメモリ間のコピーが働く
>compare(const string& str) とする理由は引数に参照を取る事となり
>コピーが働かないので無駄なメモリの消費がなくなる。

なるほど!勉強になります。

あと、compareの宣言ですが、stringやcstringの中も見てみたのですが、みつからないんです。

268 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:54:48 ]
>>267
更にstringからインクルードしている先にあるんじゃないか?
例えばcygwinのgccだと/lib/gcc/i686-cygwin/3.4.4/include/c++/bits/basic_string.hにある。

269 名前:デフォルトの名無しさん [2008/03/04(火) 02:19:09 ]
>>262
VSならソースコード中に#include <string>として
stringの所にカーソルあわせて右クリックでstringを開くを選択すれば
中身は見れるよ

270 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 04:14:40 ]
適当なcompareのとこで右クリック→定義を参照すれば、basic_string::compare()かなにか出ると思うよ

271 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 04:15:02 ]
あ、VSの話ね

272 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 04:30:57 ]
たまにはBCBとかのことも思い出してね

273 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 08:34:19 ]
grepくらい使えよ(´・ω・`)

274 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 08:37:41 ]
findも使えよと混ぜ返したらDOSのfind.exeと誤解される罠。

275 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 08:46:55 ]
プリプロセッサだけ通したモノにエディタで検索かけるのはダメですか…?



276 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 09:40:08 ]
vector型で
vector<int> num;
num[i*j]=a;

見たいなことしたいのですが
どうやるのでしょうか

277 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 09:48:22 ]
templateで、特定の型以外が渡された場合にエラーなり
分岐なりする方法ってあるんでしょうか?
たとえば
template<class T>
class Hoge {
 void Fuga(T &ref) {
  //ここで渡された型を知りたい
 };
}

C++だと無理?

278 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:01:47 ]
クラスAからそれぞれ派生したクラスB系統とクラスC系統のクラスがあるのですが
Aのポインタ*pがどちらの系統か判別する方法はありますか?

RTTIだとpの中身は分かるけどどういう系統までは追えないようですが良い方法はありますか?


279 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:04:16 ]
意味が良くわからんかったけどメンバに識別子でもいれればいいんじゃない

280 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:07:13 ]
>>277
テンプレートの特殊化の話かな

281 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:08:10 ]
>>278
dynamic_cast

282 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:08:45 ]
>>279
デコレータパターンのConcreteComponentの型を判別する方法はないかな、ということです

283 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:10:30 ]
>>278
dynamic_castはダウンキャストに失敗すると0を返す。

284 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:14:25 ]
>>282
それ、パターンの使い方っていうか、設計ができてないんじゃないの?
ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B9%E3%82%B3%E3%83%95%E3%81%AE%E7%BD%AE%E6%8F%9B%E5%8E%9F%E5%89%87

285 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:19:42 ]
>>276
operator[](size_type)があるやん



286 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:20:04 ]
>>284
そうなんですけど
出来れば再帰的に
DecoratorA-DecoratorB-DecoratorC-ConcreteComponent
と順番に型情報をたどって行く必要ができてしまって・・・
最悪でも、根元の情報だけでも何とかならないかと

287 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:22:42 ]
じゃあまさに>>279の方法なんじゃないの?

288 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:26:38 ]
>>285
なんですかそれ

289 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:31:02 ]
>>287
Decoratorの方はいくらでもいじれるのですが
ConcreateComponentの方はこちらの一存ではいじれないので識別子を埋め込むのは難しいかと

やはりcastの成否で判別していくのが無難か・・・
castに失敗するとNULLが返る?
bad_castがthrowされるのは参照のキャストの時だっけ・・・


290 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:38:55 ]
>>288
普通にnum[i * j] = aとすればいいということ。勿論、num.size()がi * jより大きいことが条件になるけど。

291 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:40:16 ]
>>277
テンプレートで先ず全ての型で失敗するコードを書いておいて、
特別な型だけ特殊化しておくとか。

292 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:56:49 ]
全く関係ないが
キャストとくにdynamic_castを使用する度に
クラス設計に問題があったんじゃないかと不安な気分になるのは自分だけか?

293 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:58:43 ]
>>292 それが正常。

294 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 11:03:25 ]
俺なんか気づいたら継承が全部public、メンバもほとんどpublicだったことがあるぜ!


(´・ω・`)

295 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 11:32:26 ]
でもcast使わざるをえない時ってあるから嫌らしいよな



296 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 11:36:08 ]
>>280,291
すみません、説明がたりませんでした。
templateでtemplate型を受け取った時にも対応できる方法が
あるかが知りたかったんです。
例えばtempate関数でstd::vector<何でもOK>は受け取れるが
std::list<>はだめな場合など。
こういう場合、特殊化だとvector<int>、vector<float>〜という具合に
OKにしたい型を全て記述しないとダメなんじゃないですか?

297 名前:291 mailto:sage [2008/03/04(火) 11:45:15 ]
>>296
「特定の(少数の)型」だけ有効にしたいのかと思ったから特殊化を提示した。
そうでないんだったらtypeidで動的に型を調べることになるのかな?
templateスレ辺りの方が喰い付きがいいかも知らん。

298 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 11:52:37 ]
>>296
こんなの?

#include <vector>

template<typename T> void foo(T const& x);

template<typename E> void foo(std::vector<E> const& x) {}

int main()
{
std::vector<int> vi;
std::vector<float> vf;
foo(vi);
foo(vf);
return 0;
}

299 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 12:00:49 ]
concept check

300 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 12:07:36 ]
>>296
mplを駆使すればできるだろ

301 名前:267 mailto:sage [2008/03/04(火) 13:06:56 ]
grepは使ったのですが、なぜかうまく検索できなかったので困ってました。
Eclipse CDT 使ってるんですが同じようなことができました。
ありがとうございました。


302 名前:267 mailto:sage [2008/03/04(火) 13:07:28 ]
grepは使ったのですが、なぜかうまく検索できなかったので困ってました。
Eclipse CDT 使ってるんですが同じようなことができました。
ありがとうございました。


303 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 13:18:46 ]
[゚Д゚] castトキイテラグオルカラキマシタ, アイシテ!

304 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 13:21:32 ]
野郎銃器ロボはお帰りください。
野郎近接ロボとなおんロボはOK。

305 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 13:34:47 ]
>>298
>template<typename E> void foo(std::vector<E> const& x) {}
あーこういう書き方でいいんですね。助かりました。

いつかさらに複雑な選別が必要になったら、mplやconcept checkも
調べてみます。どうもでした。



306 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 14:49:30 ]
ちょっとお尋ねした胃のですが

void qsort(void* base, size_t n, size_t size, int(*fnc)(const void*, const void*));

という定義がありますが、const void* ってなんなのでしょうか?
voidってのは「空の型」ってことだと思うのですが、空のものをconst(固定)するってどういうことなのでしょうか?
何もないのだから固定しようがないと思うのですが・・

また、引数がvoid*になっているのもよく分かりません。void(何もない)のポインタを引数にするってどういうことなのでしょうか??


307 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 14:51:16 ]
void*は汎用ポインタ。voidとは関係ない。

308 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 14:53:05 ]
>>306
Cでは「何かへのポインタ」をあらわずときに void* を使う。qsort()で
はソート対象の型が決まっていないので、何でも受け取れるように
void*を使っている。

const void* ってのは、「そのポインタが指している先は書き換えしま
せんよ」という意味。



309 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 14:56:06 ]
ポインタにはアドレスと「そのアドレスから先にどういうデータが入っているか」という情報が含まれる。
void型ポインタってのは「そのアドレスに何が入っているかを指定しないポインタ」という意味。
受け取った関数内で適切な型にキャストしてやって使うことになる。
qsortはintでもcharでも構造体でもソートできる汎用的な関数にするためそういう形になってる。
constってのは「そのポインタの場所に入ってる変数を変更してはいけません」って意味。
constつけた関数内でうっかり書き換えるとコンパイルエラーになるから、ミスを予防できる。

310 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:30:54 ]
下記のソースを
bcc32 test.cpp
でコンパイルすると★の行で
エラー2423 存在しないテンプレート'show_array'の明示的な特化またはインスタンス化
*** 2 errors in Compail ***
が表示されなす。

存在しないって言われても直前に・・・・
テンプレートの定義が間違ってるのでしょうか?


311 名前:310 mailto:sage [2008/03/04(火) 16:31:43 ]

--- test.cpp ---
#include <iostream.h>

/*-------------------------------------------------------*/
/* 配列の表示テンプレート */
/*-------------------------------------------------------*/
template<class T, class T1, class T2> T show_array( T1 *array, T2 count )
{
T2 index;

if( count == 0 ){ /* 表示しない ? (YES) */
return( 0 ); /* 非表示 */
}

/* 配列を表示 */
for( index = 0; index < count; index++ ){
cout << array[index] << ' ';
}
return( 1 ); /* 表示 */
}

312 名前:310 mailto:sage [2008/03/04(火) 16:32:59 ]
template char show_array( int *array, int count );      ★
template int show_array( float *array, unsigned char count ); ★

/*-------------------------------------------------------*/
/* main関数 */
/*-------------------------------------------------------*/
void main( void )
{
int pages[] = { 100, 200, 300, 400, 500 };
float price[] = { 10.05, 20.10, 30.15 };

/* int型の配列 */
show_array( pages, 5 );
cout << '\n';

/* float型の配列 */
cout << show_array( price, 3 ) << endl;
cout << show_array( price, 0 ) << endl;
cout << '\n';

return;
}

313 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:53:01 ]
unsigned char String[9] = "S2KTI2G7";
unsigned char KeyTable[11] = "0123456789";
char *id = "0";
int i;

for(i = 0; i < 8; i++)
  String[i] ^= *id;

このプログラムの動作がよくわかりません
たとえばString[0]はSのアスキーコードが83、0のアスキーコードが48なので
String[0] = 83^48になるのかと思ったのですが、実際は99になっているようです。
どうして99になるのでしょうか?

314 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:53:46 ]
>>310
>*** 2 errors in Compail ***
恥ずかしいからちゃんとコピペしようね。

315 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:56:05 ]
>>313
Cではハット(^)はビット毎の排他論理和演算子なので、83^48はちゃんと99になる。



316 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:58:09 ]
>>313
83^48
=1010011^0110000
=1100011
=99

317 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:01:12 ]
>>315-316
なるほど
ここしばらく他の言語しかやってなかったのですっかり忘れてました
すばやい回答ありがとうございます

318 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:01:17 ]
>>310
こんな感じじゃないかなたぶん

return( 1 ); /* 表示 */ 
}; <----- ここテンプレートの最後にセミコロンが必要

template char show_array..... → template<> char show_array.....
template int show_array..... → template<> int show_array.....

show_array( pages, 5 ); → show_array<char>( pages, 5 );
show_array( price, 3 ) → show_array<int>( price, 3 )
show_array( price, 0 ) → show_array<int>( price, 0 )

319 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:02:30 ]
>>310
そのテンプレート関数の目的が意味不明なんだが、取り敢えず「所謂」全角空白が見えるエディタを使おう。

320 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:05:25 ]
>>310
多分、テンプレート関数では配列の一部を出力してその有無を返すだけと判断して勝手に修正してみた。
--
#include <iostream>
using namespace std;

template<class T> bool show_array(T array[], int N)
{
for (unsigned ic = 0; ic < N; ++ic) {
cout << array[ic] << ' ';
}
return N != 0;
}

int main( void )
{
int pages[] = { 100, 200, 300, 400, 500 };
float price[] = { 10.05, 20.10, 30.15 };

/* int型の配列 */
show_array( pages, 5 );
cout << '\n';

/* float型の配列 */
cout << show_array( price, 3 ) << endl;
cout << show_array( price, 0 ) << endl;
cout << '\n';

return 0;
}

321 名前:320 mailto:sage [2008/03/04(火) 17:09:21 ]
いかん、配列の要素数を勝手に取得するバージョンの名残で引き数Nが大文字だw
ついでなんで、そのバージョンも貼っておこう。
--
template<class T, size_t N> bool show_array(T (& array)[N])
{
for (unsigned ic = 0; ic < N; ++ic) {
cout << array[ic] << ' ';
}
return N != 0;
}
--
これだと、show_array(price)で使える。でも戻り値の意味がないw

322 名前:306 mailto:sage [2008/03/04(火) 17:33:00 ]
なるほど。
レスくださった方々、わかりやすい説明ありがとうございましたm(_ _)m

323 名前:310 mailto:sage [2008/03/04(火) 17:34:28 ]
レスありがとうございます!

314 >> あ、aが余分でした (;ω;`)


318 >>
テンプレートの最後にセミコロン付加
templateの後に<>付加
show_arrayの後に<型>付加
をやってみましたが、エラー内容は変わりませんでした・・

319 >>
練習用に色々やってみた感じで作りました。
エディタはさくらエディタ使ってます。

320 >>
> 多分、テンプレート関数では配列の一部を出力してその有無を返すだけと判断して
させたい動作はその通りです。
320さんのソース読んできます。


324 名前:310 mailto:sage [2008/03/04(火) 17:36:39 ]
アンカーの付け方まちがえたぁぁ〜

325 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:47:39 ]
>>324
全角空白を見えるようにしろって言うのは、>320に全角空白が入っているからなんだが。
# 勿論、後から追加したであろう★印のところ以外にね。



326 名前:325 mailto:sage [2008/03/04(火) 17:48:15 ]
いや、全角空白が入っているのは>320じゃなくて>310だった_/ ̄|○

327 名前:310 mailto:sage [2008/03/04(火) 17:57:39 ]
>>320さんのソースを元に、自分との違いを考えて
>>311-312
のソースの★の記述を削除し、
>>318さんの変更を加えたら、コンパイル通りました〜。

ソースの書き方がコテコテ素人なんで、
>>320さんのソース見て勉強します。

>>318さんの追加が無い場合はエラーが出るのですが、内容読んでも
show_array<char>( pages, 5 ); の<char>が何で必要か
わからんです、ヒントお願いできないでしょうか。
エラー内容は↓です。
エラー2285 show_array<T,T1,t2>(int *, int)に一致するものが見当たらない


328 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 18:00:40 ]
>>327
template<class T, class T1, class T2> T show_array( T1 *array, T2 count )
というテンプレートがあるので、show_array( pages, 5 ); は
show_array<char, int*, int> かもしれんし
show_array<int, int*, int> かもしれんし
show_array<long, int*, int> かもしれんし
T1とT2は引数見ればわかるけどTの型は決定できないので

329 名前:310 mailto:sage [2008/03/04(火) 18:03:50 ]
>>326
!? お
template<class T, class T1, class T2>と
T show_array( T1 *array, T2 count )
の間に全角空白が!!!!!!

コピペした後に入れちゃったみたいです。('A`)
ご指摘ありがとうございます。

330 名前:310 mailto:sage [2008/03/04(火) 18:13:08 ]
>> 328
なるほど!
分かりやすいご説明ありがとうございます。

試しに
<char>show_array( pages, 5 );
してみたら、構文エラーでしまた。
show_array<char>( pages, 5 );
って書き方なんですね。


ご回答下さった皆様、ありがとうございました(。。)゛


331 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 19:37:21 ]
oprator void *() const
{ if (state&(badbit|failbit)) return 0; return (void *) this; }

のopratorはここではどういう意味で使われているのでしょうか?
この位置にあるのを初めて見まして、よくわからないんです。

332 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 19:41:08 ]
>>331
型変換の演算子。

333 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 20:00:13 ]
>>331
例えば
class Foo {
public:
 operator int() { return 42; }
};
main() {
 Foo foo;
 int x = foo; // <-- ここ
 cout << x;
}
というふうに、クラスを別の型に変換するときに呼ばれる。

334 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 21:54:20 ]
ちなみに、このvoid*への変換演算子は
if (str)のように条件式で用いるために用意されている。

なぜoperator boolでないかというと、boolでは整数へ変換できてしまうから。
int x = str;のような想定外の変換を行わせないためである。

335 名前:デフォルトの名無しさん [2008/03/04(火) 23:21:45 ]
C#で開発したプログラムを、事情で一部C++.Netで書き直さないといけなくなったのですが
[C#]
List<int[]> foo;
の書式が、C++.Netではどう直せばいいのかわかりません。
intの配列ではテンプレートを適応できないのでしょうか?



336 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 23:24:05 ]
>>335
List<array<int>^>^ foo;

337 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 23:24:19 ]
vene.wankuma.com/ecma372/24_cli_array.aspx
これ?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<245KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef