C++相談室 part66
at TECH
1:デフォルトの名無しさん
09/01/11 11:21:38
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part65
スレリンク(tech板)
2:デフォルトの名無しさん
09/01/12 15:10:01
>>1おつ……
じゃなかった。
>>1おばか。
3:デフォルトの名無しさん
09/01/14 21:19:06
次のGCCで0xはどこまでサポートされるのでしょう?
4:デフォルトの名無しさん
09/01/14 23:46:07
>3
URLリンク(gcc.gnu.org)
5:デフォルトの名無しさん
09/01/15 11:16:32
//
/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ まピョーん☆
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
6:デフォルトの名無しさん
09/01/15 19:35:31
janeの隠し機能
1.書き込みウィンドウを出し半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
7:デフォルトの名無しさん
09/01/15 20:29:00
wwwwwwwwwwwwwwwwwwwwwww
8:デフォルトの名無しさん
09/01/15 20:32:56
次の課題A,Bから一方を選び,そこに書かれている数値について,
問(1) 100.0以上1000未満の数
問(2) 1000以上10000未満の数
問(3) 10000以上の数
はそれぞれいくつあるか数え表示するプログラムを完成せよ.
課題[A] JRAのホームページから左にある「競争成績」をクリックし,
下部にある過去の競争成績(カレンダー)から5阪(12月7日阪神)をクリック,
下のほうにスクロールすると11Rとあるがそこをクリックせずにその行の一番右にある
「最終オッズ」をクリック,その後,「3連単オッズ」をクリック.そこに表示されるページの表について。URLを入力するなどして
他のレースの数値についても同様にすぐに数値を数えられるプログラムにすること。(激難)
課題[B] 課題[A]が難しいので,通常はこちらを解くとよい.次のテキストは課題[A]の数値の一部を
コピー・アンド・ペーストしたものである.これを[Ctrl+C]でコピーし,scanfの入力において
[Ctrl+V]で貼り付け,[Ctrl+D]を入力すると入力を終え,数え始めるようにせよ.他の数値を入力
するときも,[Ctrl+D]を入力することで入力を終え,カウントできるように.
っていうのをやろうと思ったらどういう風にするのがいいですかね
9:デフォルトの名無しさん
09/01/15 21:03:52
>>8
宿題スレに投下する
10:デフォルトの名無しさん
09/01/15 21:04:42
>>9
宿題スレとは何ですか?
11:デフォルトの名無しさん
09/01/15 21:34:13
C/C++の宿題を片付けます 122代目
スレリンク(tech板)l50
12:デフォルトの名無しさん
09/01/16 04:48:28
ありがとうございます
13:デフォルトの名無しさん
09/01/18 09:31:08
wwwwwwww
14:デフォルトの名無しさん
09/01/21 18:41:26
スレリンク(saku板:282番)
15:デフォルトの名無しさん
09/01/21 18:44:50
C++相談室 part65
スレリンク(tech板)
16:停止しました。。。
09/02/03 22:20:43
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
17:デフォルトの名無しさん
09/02/03 22:50:02
さあ次の質問をどうぞ!
18:デフォルトの名無しさん
09/02/03 23:01:18
大抵のゲームプログラムはFPSでゲーム速度を管理されてますが、FPSが変動してもゲーム速度を常に一定に保つようにするにはどうプログラムを組めばよいのでしょうか?
19:デフォルトの名無しさん
09/02/03 23:04:39
スキップフレームといって、
物を動かしたりという処理は常に行うものの
(といってもあまりに重いときにどうするかを考える必要はあるが)、
描画が間に合わない時は描画のみをスキップする方法を使う。
20:デフォルトの名無しさん
09/02/04 06:42:52
>>18
TickCountをつかう。OSの起動からの経過時間を計る比較的分解能の高いタイマーを使って速度を保つ。
21:停止しました。。。
09/02/05 19:06:08
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
22:デフォルトの名無しさん
09/02/05 19:07:30
名前がぶっといのれすううう
23:止しました。。。
09/02/08 20:51:44
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
24:停止しました。。。
09/02/10 14:15:18
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
25:デフォルトの名無しさん
09/02/10 14:16:05
この子何がしたいのかしら
26:デフォルトの名無しさん
09/02/10 16:08:45
昔このスレでいじめられたんだよ
27:停止しました。。。
09/02/10 18:14:04
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
28:停止解除しました。。。
09/02/10 19:34:28
タスクマネージャ。。。( ̄ー ̄)ニヤリッ
29:停止しました。。。
09/02/10 20:04:30
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
30:テンプレート朝鮮中
09/02/11 00:01:08
質問です。
テンプレートクラスを継承しているクラスがあるとします。
継承先のクラスで継承元のメンバー関数の処理の動作を変えたい場合、
特殊化とオーバーライドの両方が使えそうな気がしています。
仮に両方が使用できる場合、メリットとデメリットはどのようなものがあるのでしょうか?
template <typename T> class BASE {
T t;
public:
virtual void func() {....}
};
---- オーバーライド -----
class A : public BASE<int> {
public:
virtual void func() {
func2();
BASE::func();
}
};
---- 特殊化 -----
template <>
class BASE <int> {
public:
void func() {
func2();
BASE::func();
}
};
31:デフォルトの名無しさん
09/02/11 01:45:57
継承すれば、継承元をインターフェイスとして扱える。
特殊化するとテンプレートの意味がない気がする。
32:デフォルトの名無しさん
09/02/11 02:32:51
>>30
後者は無理だ。
BASE<int>で特殊化するということは、BASE<int>の実装を乗っ取るということ。
つまり、BASE::func();が自分自身を呼び出す再帰になる。
大本のBASE<int>を使いたいというのであれば、
その中では継承しか手段が残らないな。
33:テンプレート朝鮮中
09/02/11 03:28:30
回答ありがとうございます。
先輩に、
テンプレートクラスにvirtualをつけるのは何故だ!!
静的ポリモフィズムと動的ポリモフィズムを理解していないんでない!!
と言われ悩んでました。(実際にはまだ悩んでいますが・・・)
明日、静的ポリモフィズムと動的ポリモフィズムの違いが明記してある
参考書を貸していただけるとのことなので、再度、勉強します。
勉強しても、分からなければ、もう一度、質問させていただきます。
34:デフォルトの名無しさん
09/02/11 07:25:55
#define const
#define private
35:デフォルトの名無しさん
09/02/11 08:47:44
CもしくはC++でWEB操作の解説してる本があれば教えてください
WEBサイトのページから任意の文字列を取得したり
そのページの任意の場所をクリックしたりラジヲボタンを選択したり
これらをUWSCというツールで行っていました
プログラミングに興味があり今UWSCで行っていることをCもしくはC++でやってみたいと思います
紀伊国屋という大きな本屋さんでC関係の解説書を漁ってみたのですが
C言語でWEBページを開くということ自体解説されている本が見当たりませんでした
日本語表記でWEB操作を解説している本を教えてくださいm( _ _ )m
.NETやperlやPHPなら簡単だぞって解答は不要です
CまたはC++でやりたいです
よろしくお願いします
36:デフォルトの名無しさん
09/02/11 08:53:46
諦めろ。
37:デフォルトの名無しさん
09/02/11 10:07:02
そんなぁorz
どなたか>>35お願いします
38:デフォルトの名無しさん
09/02/11 12:50:38
>>37
標準C / C++には通信の概念自体がない、だからなんか外部のライブラリを利用することになる
.NETがいやならなんか他の使えば?
39:デフォルトの名無しさん
09/02/11 12:52:39
>>35
URLリンク(www.google.co.jp)
URLリンク(www.google.co.jp)
40:デフォルトの名無しさん
09/02/11 12:54:23
webページを操作って、CGIってことじゃないのか。
webページを開くって、ブラウザ起動するってことか?
41:デフォルトの名無しさん
09/02/11 14:00:30
携帯からてす
42:デフォルトの名無しさん
09/02/11 14:09:56
みなさんありがとうございます
出先からなので携帯からです
39さん
帰宅したら見てみます
お忙しい中ありがとうございます
40さん
CGIじゃないです
ヤフーのアンケートに応募したり
株価のデータ取得して整理したりです
今はUWSCで満足できる操作できています
C言語覚えたいので
これらの操作をCで行うのが目標です
ありがとうございました
43:停止しました。。。
09/02/11 15:46:20
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
44:デフォルトの名無しさん
09/02/11 19:18:58
関数のローカル変数はいつ初期化されるのでしょうか?
これはOK?
void push_back(std::vector<int>& v,int val)
{
static tbb::spin_mutex m;
tbb::spin_mutex::scoped_lock locked(m);
v.push_back(val);
}
45:デフォルトの名無しさん
09/02/11 19:21:03
このスレの状況がよくわからんが、
とりあえず↓使おうぜ。
C++相談室 part65
スレリンク(tech板)
46:デフォルトの名無しさん
09/02/11 19:27:11
>>44
初めて関数に入った時。
ただし、初期化に副作用が発生しない場合は
プログラム開始時に初期化される可能性もある
(いつ初期化されようが動作に変化が無いので)。
47:デフォルトの名無しさん
09/02/11 19:44:49
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
48:デフォルトの名無しさん
09/02/11 21:47:18
>>36>>38
Boost.Asioとかソケットとかキーワードを挙げるくらいしてもいいじゃない。
まあウェブページのダウンロードくらいだったら、HTTP扱える高水準なライブラリを探すべきだと思うけど。
49:デフォルトの名無しさん
09/02/11 21:52:19
となるとcurlあたりか
50:デフォルトの名無しさん
09/02/12 00:48:32
C++ for Programmersは
糞本です買わないでください
51:デフォルトの名無しさん
09/02/12 16:42:10
>>44
一応言っておくと、初期化は>>46の通りだが
現行C++ではスレッドの概念が無いので
同時にその関数に入った場合どうなるかは環境依存。
52:誘導
09/02/12 21:47:00
スレリンク(saku板:282番)
C++相談室 part66
スレリンク(tech板)
53:デフォルトの名無しさん
09/02/12 21:51:25
後から立てといて意味分からね
54:デフォルトの名無しさん
09/02/12 22:36:02
C++とC言語では構造体を作るときCのほうでしか必要でないものって何なんだ?
あとC++の共用体の扱いとかわからんのだが
55:デフォルトの名無しさん
09/02/12 23:18:03
struct A {
int hoge;
};
struct A a;
~~~~~~
56:デフォルトの名無しさん
09/02/13 01:24:30
そういえば、C++では
struct stat xx;
ではなく
stat xx;
と宣言できるのだが、それをやってしまうと
同スコープでのstat()関数の呼び出しでエラーになるんじゃなかったかな。
個人的には、「Cの標準」に含まれる構造体はC++で使うときも struct をつけるようにしている。
いや、statがCの標準じゃないのは百も承知だが struct tm とかの場合ね。
で、同様に、struct stat のように「Cでも一般的に使える」ものもそうしてる。
POSIX準拠のものとか。
57:デフォルトの名無しさん
09/02/13 01:39:31
>>56
エラーになるから struct stat じゃないとダメ。
struct a;
int a();
a x;
3: error: `a' does not name a type
3: error: extra `;'
Process gcc exited with code 1
58:デフォルトの名無しさん
09/02/13 07:24:23
C++ の話だぞ?
59:デフォルトの名無しさん
09/02/13 07:24:52
って、ああ、stat の話か。
stat 関数があるからってことか。
60:デフォルトの名無しさん
09/02/13 08:55:07
boost::multi_arrayで、以下のようなソースがコンパイルが通らなくて困っています。
どこが間違っているのか教えてください。nの代わりに即値を使うとコンパイルできます。
array_type自体のtypedefはうまくいっているようです。
#include <boost/multi_array.hpp>
template <unsigned int n>
class Test
{
typedef boost::multi_array<int, n> array_type;
typedef array_type::index array_index; // ここでエラー
array_type array;
public:
Test(){}
};
int main () {
Test<3> m3;
Test<4> m4;
}
----
g++ -Wall -g -I /usr/include/boost-1_33_1 -o a.exe multiarray.cpp
multiarray.cpp:7: error: type `boost::multi_array<int, n, std::allocator<int> >' is not derived from type `Test<n>'
multiarray.cpp:7: error: ISO C++ forbids declaration of `index' with no type
multiarray.cpp:7: error: expected `;' before "array_index"
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
61:デフォルトの名無しさん
09/02/13 12:32:46
>>60
array_type::indexが型だということをコンパイラに教えてやる為にtypenameを付ける
typedef typename array_type::index array_index;
62:誘導
09/02/13 18:51:30
スレリンク(saku板:282番)
C++相談室 part66
スレリンク(tech板)
63:デフォルトの名無しさん
09/02/13 18:58:42
こっちが先だな
64:44
09/02/13 22:21:20
>>51
サンクス。
やっぱり無理でしたか・・・
関数内で
struct{static tbb::mutex m;}M;
みたいに書ければいいなと思ったけどだめぽでした。
関数外に出すしかないか・・・
65:誘導
09/02/13 22:36:44
スレリンク(saku板:282番)
C++相談室 part66
スレリンク(tech板)
66:デフォルトの名無しさん
09/02/13 22:57:32
class HAGE
{
private:
HAGE();
~HAGE();
protected:
HAGE();
~HAGE();
public:
HAGE();
~HAGE();
};
67:デフォルトの名無しさん
09/02/13 23:02:56
コンパイルエラー
68:デフォルトの名無しさん
09/02/13 23:11:36
HAGE *leave21 = new HAGE();
HAGE *aderans = new HAGE();
69:デフォルトの名無しさん
09/02/13 23:15:47
class ZURA : public HAGE { };
70:デフォルトの名無しさん
09/02/13 23:42:28
struct LEAVE21{ /* */ };
struct ADERANS{ /* */};
class HAGE{};
template <typename ZURA_TRAITS=LEAVE21> class ZURA : public HAGE{ /* */};
ZURA<> shokumou;
71:60
09/02/14 00:56:48
ありがとうございました!
72:281
09/02/14 15:16:38
スレリンク(saku板:282番)
C++相談室 part66
スレリンク(tech板)
73:停止しました。。。
09/02/14 18:06:05
真・スレッドリスターター。。。( ̄ー ̄)ニヤリッ
スレリンク(saku板:282番)
C++相談室 part66
スレリンク(tech板)
74:デフォルトの名無しさん
09/02/14 18:49:23
1 名前:デフォルトの名無しさん[] 投稿日:2009/01/11(日) 11:21:38
^^^^^^^
75:デフォルトの名無しさん
09/02/15 16:01:06
☆, -─- 、 _____
[, -─- 、 _____]
, -─- 、 _____
/_____ \� //⌒ヽ ⌒ヽ `\
|/⌒ヽ ⌒ヽヽ | ヽ / | ^ |^ |- 、 ヽ
| / | ヽ |─| l // `ー ●ーU′ \ ヽ
/ ー ヘ ー ′ ´^V / ─ | ─ ヽ i
l \ / _丿 i 二 | 二 | |
. \ ` ー ´ / .l \ | / l !
>ー─ く ヽ \ | / / /
/ |/\/ \ ヽ  ̄ ̄ ̄ / / 同じスレではこのままだけど
l l | l >━5━━━く 違うスレにコピペするとドラえもんがスネ夫
ヽ、| | ノ / く / ヽ に変わる不思議なコピペ。
|ー──j l (⌒(⌒) / |
76:デフォルトの名無しさん
09/02/15 16:35:07
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
77:デフォルトの名無しさん
09/02/15 16:35:32
>>76
スレ違い。
78:デフォルトの名無しさん
09/02/15 16:37:51
>>77
どのスレにいけばいいでしょうか?
79:デフォルトの名無しさん
09/02/15 16:38:50
>>78
Grass【ちょっと草植えときますね型言語】
スレリンク(tech板)
80:デフォルトの名無しさん
09/02/16 04:53:18
せめて10分は間隔あけようぜ・・・
81:停止しました。。。
09/02/16 15:48:40
真・スレッドリスターター。。。( ̄ー ̄)ニヤリッ
スレリンク(saku板:282番)
C++相談室 part66
スレリンク(tech板)
82:デフォルトの名無しさん
09/02/16 22:23:36
え?
83:デフォルトの名無しさん
09/02/16 22:31:59
後発スレで自演厨が暴れてるな
84:デフォルトの名無しさん
09/02/17 01:47:18
イテレータのコンセプトは素晴らしいと思います。
ところで<algorithm>ヘッダのテンプレートはほとんどistreamの入力イテレー
タに適用できません。
イテレータにバッファを内蔵し前進イテレータに変換すると適用できると思う
のですが、こういったものはすでに作られていないのでしょうか?
また、アイデアそのものに問題点はありますか?
よろしくお願いします。
85:デフォルトの名無しさん
09/02/17 02:02:04
>>84
std::istream_iterator
std::istreambuf_iterator
86:デフォルトの名無しさん
09/02/17 02:07:09
>>85
両方ともinput_iterator_tagが指定されています。
forward_iterator_tagを想定するとお考えください。
87:デフォルトの名無しさん
09/02/17 02:38:59
>>84
Boost.Spiritがfile_iteratorというランダムアクセスできるイテレータを持っている。
内部でどんな実装をしているかは知らないが。
あと、イテレータではないけど、pstadeのovenというライブラリのmemorizedが
汎用的なバッファ機構(メモ化)を備えていて、
たとえ、元のカテゴリが入力だったとしてもこれを通せば前進になる。
URLリンク(p-stade.sourceforge.net)
問題点はよく知らない。
ただ、memorizedは汎用なので、vectorやdequeに貯め込んだり、
file_iteratorのようにストリームに特化して作ったほうが、より効率が良いとは思う。
88:デフォルトの名無しさん
09/02/17 02:44:54
>>87
boostのはたしか、ファイルをすべてメモリー上に読み込むような感じの
ものだったと思います。
若干意味合いが異なります。
ovenはちょっと見てみます。
89:デフォルトの名無しさん
09/02/17 03:34:25
>>84
要素へのアクセスで、初めて読む部分かすでに読んだ部分かで処理を分けることになるので、
vector などのコンテナに必要な分を読み込んでから処理するのに比べて効率が悪くなりそう。
そのうえで、実際には必要な分を読み込んでから処理すれば十分なことがほとんどになるので
あんまり需要が無いんだと思う。
本当に必要だといえる状況だと言うことなら、興味があるのでどんな場面か教えて欲しい。
90:デフォルトの名無しさん
09/02/17 03:44:01
>>89
入力がある場合すべてにおいて必要になるのではないかと思っています。
91:デフォルトの名無しさん
09/02/17 03:55:28
>>90
それはないだろ。たとえばテキストファイルを1行ずつ読み込んで処理する場合、
getline() あたりで1行読んでの処理をループすればいい。
92:デフォルトの名無しさん
09/02/17 04:04:38
>>91
入力を解析する必要がある場合すべて。
<algorithm>ヘッダを使用するという前提で。
93:デフォルトの名無しさん
09/02/17 04:12:17
>>92
その説明だと、vectorとかに蓄えればいいのでは、という疑問が解消されない。
どういう利点があると考えるのか詳しく聞きたい。
94:デフォルトの名無しさん
09/02/17 04:15:40
>>93
ストリームの存在意義についてですか?
いろいろ使い道はあるはずだと思いますけど。
95:デフォルトの名無しさん
09/02/17 04:23:34
>>94
研究するのは勝手だけれど、具体例を出せないのに意義を語られても困る。
96:デフォルトの名無しさん
09/02/17 04:34:30
>>94
いろいろと言うならひとつ挙げるくらい簡単だろ。
97:デフォルトの名無しさん
09/02/17 04:37:31
>>94
ストリームの存在意義など聞いていない。
>84 で挙げてる入力イテレータから前進イテレータへの変換をすることが、
必要な分だけコンテナに読み込んでからコンテナのイテレータを使うことに対して、
どんな利点があるのか挙げろと言っている。
98:デフォルトの名無しさん
09/02/17 07:50:35
>>84
せっかくだからGoFのデザインパターンを全て調べてみろ
99:デフォルトの名無しさん
09/02/18 02:33:36
>>97
亀レスで申し訳ありませんが、ストリームの存在意義そのものが答えになら
ないでしょうか?
100:デフォルトの名無しさん
09/02/18 02:40:00
>>99
それしか言えないなら聞き方を変えるけど、一旦コンテナに貯め込む方式の欠点は何?
101:デフォルトの名無しさん
09/02/18 02:56:05
>>99
そう思うんならお前の脳内にある「ストリームの存在意義」を挙げればいいだろ。
それを聞く前に答えになるかならないかなんて、エスパーでもなけりゃわからん。
102:デフォルトの名無しさん
09/02/18 03:00:44
一般的なストリームの存在意義といえば、一度にメモリ上に読み込まずにちょっとずつ
処理することで少ないメモリで大量のデータを処理できると言う点があるだろう。
しかし >84 で挙げている方法は「バッファを内臓」することでこの点は失われているように見える。
103:デフォルトの名無しさん
09/02/18 03:31:07
いろいろ適当。
input_iterator it0;
input_wrapper_forward_iterator it1(it0);
input_wrapper_forward_iterator it2; // ?
find_if(it1,it2,cnd());
it2はどう定義するの?
104:デフォルトの名無しさん
09/02/18 03:33:56
find_ifはinputでいけるねごめん。
105:デフォルトの名無しさん
09/02/18 03:46:48
こうか
stream st;
input_iterator it00(st.begin()),it01(st.end());
input_wrapper_forward_iterator it10(it00),it11(it01);
algorithm(it10,it11);
stream st;
input_iterator it00(st.begin()),it01(st.end());
vector v(it00,it01);
algorithm(v.begin(),v.end());
このレベルじゃ意味はまったくないな。
106:デフォルトの名無しさん
09/02/18 08:45:38
変態だな
107:デフォルトの名無しさん
09/02/18 14:26:32
ゆとり
108:デフォルトの名無しさん
09/02/18 16:17:15
C++を使うなら妥協って物も覚えたほうがいいよ
109:デフォルトの名無しさん
09/02/18 17:04:12
妥協は物じゃないよ
110:デフォルトの名無しさん
09/02/18 17:16:54
名詞だから物だよ
111:デフォルトの名無しさん
09/02/18 17:30:59
じゃあ、名詞としての”妥協”を覚えればいいんだな
112:デフォルトの名無しさん
09/02/18 19:15:24
屁理屈こねないの。
113:デフォルトの名無しさん
09/02/18 21:43:29
形式名詞はひらがなで書けということですね。
114:デフォルトの名無しさん
09/02/18 22:50:24
::func()
って記述を見かけたのですが、::の前って省略できるんですか?
115:デフォルトの名無しさん
09/02/18 23:00:43
>>114
#include <iostream>
void func() { std::cout << "This is ::func()" << std::endl; }
namespace AAA
{
void func() { std::cout << "This is AAA::func()" << std::endl; }
void aaa() {
func(); // AAA名前空間のfunc()が呼ばれる
::func(); // グローバル名前空間のfunc()が呼ばれる
}
}
116:デフォルトの名無しさん
09/02/18 23:23:21
>>115さん
ありがとうございます。
名前空間を念頭に置いてコードを読み直してみます。
117:デフォルトの名無しさん
09/02/19 01:46:02
>>116
読むのはいいけど真似するなよ
118:デフォルトの名無しさん
09/02/20 01:09:13
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
119:デフォルトの名無しさん
09/02/20 01:12:34
すみません。
どなたかMPEG Audioのdist10というプログラム使ったことある方いらっしゃいませんか?
120:デフォルトの名無しさん
09/02/20 01:18:25
>>116
ヒント:スコープの概念。
static const int32_t var = 1; グローバルスコープ
namespace foo { static const int32_t var = 2; } fooスコープ
class hoge { public: static const int32_t var = 3; } hogeスコープ
::varは1
foo::varは2
hoge::varは3
121:デフォルトの名無しさん
09/02/25 11:10:00
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
122:デフォルトの名無しさん
09/03/13 20:52:41
throw new std::runtime_error("saji");
123:デフォルトの名無しさん
09/03/14 00:30:03
>>122
newされたstd::runtime_error *
だと!そんなもんthrowされたらまさにサジを投げるしかないな。
124:デフォルトの名無しさん
09/03/14 07:13:32
>>122
newはもちろんジョークだよな?
125:デフォルトの名無しさん
09/03/18 18:38:05
C++相談室 part67
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part66
スレリンク(tech板)
126:デフォルトの名無しさん
09/03/19 17:24:05
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
127:デフォルトの名無しさん
09/03/20 09:58:48
std::sort で std::vector の要素をソートしようとしています。std::sort の第三引数にでたらめな比較結果を返す
比較関数を与えるとvector の要素の一部がおかしな値に置き換わってしまい、場合によってはプログラムが
異常終了してしまう現象に悩まされています。問題を再現するプログラムを用意しました。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
int a[10] = {0, 0, 0, 1, 1, 1, 1, 0, 1, 1}, pos = 0;
class ComparisonFunc {
public: bool operator()(int i, int j) { return a[pos++] == 1; } };
void main() {
int t[] = {3, 5, 1, 4, 2}; std::vector<int> v(t, t+5);
std::sort(v.begin(), v.end(), ComparisonFunc()); assert(pos == 10);
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
std::cout << *it << std::endl; }
このプログラムを実行すると第3要素の値がおかしくなります。VC++ 2008 Express Edition と
g++ 4.3.0 (MinGW) では一応実行が終了しますがIntel C コンパイラ 9.0 だと異常終了します。
環境は Windows XP SP3 (32ビット) です。「でたらめな比較結果を返す比較関数」を考えているのは、
ユーザが比較関数をスクリプト言語で定義できるシステムを作っているからです。operator() メソッドの
中でスクリプト言語で定義された比較関数を呼んで、その戻り値を operator() の戻り値として返す仕組みです。
そのためどんな比較関数が来てもプログラムが異常終了しないようにしたいと思います。どんな対策が
考えられるでしょうか? std::sort が比較関数の異常を検知して適当なところで処理を中断して例外でも
スローしてくれたらと思うのですがそこまで面倒は見てくれないようです。
128:デフォルトの名無しさん
09/03/20 10:47:27
>>127
std::sortに渡すコンパレータは辻褄のあった結果を返さないといけないと仕様で決められている。
そうでない場合の動作は未定義。
つまり、でたらめな結果を返す可能性のあるコンパレータはstd::sortには使えない。
ソート関数を自作するか、コンパレータを検証する関数を追加するしかないだろうね。
いずれにしても矛盾を検知しようと思ったら、O(n log n)では済まないと思う。
129:デフォルトの名無しさん
09/03/20 16:49:42
c++で作られたプログラムを逆アセンブルしてるんですが、アセンブリ言語について質問できるスレってありませんか?
130:デフォルトの名無しさん
09/03/20 17:16:32
このへんじゃね?
スレリンク(tech板)
131:デフォルトの名無しさん
09/03/20 17:20:20
C++で書かれたプログラムを逆アセ出来る人ってすごいなぁ。
意味不明じゃね?
132:デフォルトの名無しさん
09/03/20 17:30:16
逆アセするならそもそもアセンブラ理解しないと・・・。
80x86系統の命令コード表あると思うからそれ見ながら分解していけばいいかと
後単純なプログラムでコードがどうなるかをチェックし続けるっていうのが解析の基本><
133:デフォルトの名無しさん
09/03/20 17:34:18
>>130
ありがとうございました。
>>131
IDA pro とか簡単に逆アセンブルしてくれて、しかもグラフィカルに構造を表示してくれるので
あんまり知識が無くてもなんとなく分かります
しかも無料で使えるし。
ソフト自体が英語だしあんまり解説サイトとかが無いのが辛いですが・・。
134:131
09/03/20 19:47:12
IDA proってすげーー
135:デフォルトの名無しさん
09/03/20 19:56:39
引数オーバーロードによって戻り値を変えるプログラムが
g++ (1)3.3.6と(2)4.2.4で挙動が違います。
実行後 main戻り値が (1) => 2 / (2) => 1 となります。
NS1をNS2に書き換えると両方とも2が戻ります。
どっちの挙動が標準規格的には正しいですか?
//以下そのプログラム
#include <stdio.h>
namespace NS1 {
struct HUGA {};
}
namespace NS2 {
int get(...) { return 1; }
template <typename T>
int f() {
NS1::HUGA huga;
return get(&huga);
}
int get(NS1::HUGA * ) { return 2; }
}
int main() { return NS2::f<int>(); }
136:デフォルトの名無しさん
09/03/20 20:01:56
うーん。もしかして、Cのソースがあるものなら、直接アセンブラソース吐かせれば良いんじゃね?
バイナリを解析したいのならスマソ。
137:デフォルトの名無しさん
09/03/20 20:32:04
>>135
1
138:デフォルトの名無しさん
09/03/20 20:43:39
>>135
2
139:デフォルトの名無しさん
09/03/20 20:44:56
Visual C++2008では 2 になったけど
実際の動作は1にならないといけないみたいね。
vararg は言語によるすべての型チェックを無効にして
常にもっとも一致した型であることを強制するので
多重定義の解決では自動的に最優先になるみたい。
140:デフォルトの名無しさん
09/03/20 20:50:00
俺も気になってやってみた。
g++ (GCC) 3.4.5 (mingw special)では返り値は1で、
Borland C++ 5.5.1 for Win32では返り値は2だった。
…つまりg++ 4.2.4はちゃんと正しい進化を遂げているということか。
141:133
09/03/20 20:54:37
>>136
がっつりexeファイルです。
コマンドプロンプトで動く簡単(そう)なコンパイラがあるので、それを解析してデコンパイラを作ってみたくて・・。
にしても、2ちゃんねるのスレッド検索って、「アセンブラ」とか「アセンブリ」で検索すると結果が出るのに、
「アセンブ」で検索すると出ないんですね。ふしぎ!
142:デフォルトの名無しさん
09/03/20 21:02:36
(...)の絡む名前解決の定義ってISO/IEC 14882:2003にあるの?
もしなければ現段階では鼻から悪魔ってことになっちゃうんだけど
143:デフォルトの名無しさん
09/03/20 21:21:21
よこから質問なんですが
(...)
ってどうつかうんですか?
void func(int n, ...)
みたいのであればstdarg.hのマクロでやるのとは思うんですが
(...)みたいな...のみとはなんなんなんですか?
144:135
09/03/20 21:37:44
試してくれた人ありがとうございます。
>>139
...をvoid*にしても(2)はやっぱり1です。
ちなみにfの定義を非templateにすると両方とも
1になります。template関数が実体化されるときに
初めてオーバーロードの解決を行うっていう理屈で
あれば(1)が正しいような気もします。
ただそれはあまりにもマクロ的な発想だし(2)が
正しい?
NS1をNS2を書きかえると(2)が2に成るのも謎・・・。
145:デフォルトの名無しさん
09/03/20 23:05:11
URLリンク(page4.auctions.yahoo.co.jp)
146:デフォルトの名無しさん
09/03/21 00:58:20
>142
もちろんある。
っていうか、SFINAE を使う場合に用いられる場合がある。
>139
そして ... のオーバーロード解決の優先度は最低だ。
>常にもっとも一致した型であることを強制するので
これで優先されるのは関数テンプレートの時。
>144
> template関数が実体化されるときに
> 初めてオーバーロードの解決を行うっていう理屈で
> あれば(1)が正しいような気もします。
two phase lookup でぐぐれ。
dependent name の名前解決は実体化時まで遅延される。
nondependent name の名前解決は通常通り行われる。
get(&huga) は nondependent name なので名前解決は
通常通り行われ、この場合は get(...) に解決されるはず。
> 14882:2003
> 14.6 Name resolution/9
> If a name does not depend on a template-parameter (as defined in 14.6.2), a declaration (or set of declarations)
> for that name shall be in scope at the point where the name appears in the template definition; the
> name is bound to the declaration (or declarations) found at that point and this binding is not affected by
> declarations that are visible at the point of instantiation.
>
> 14.6.3 Non-dependent names/1
> Non-dependent names used in a template definition are
> found using the usual name lookup and bound at the
> point they are used.
147:デフォルトの名無しさん
09/03/21 01:07:07
補足。
>っていうか、SFINAE を使う場合に用いられる場合がある。
Modern C++ Design に優先順位が最低であることがポイントであるとした上で載ってるので
変態 templater にはそれなりに知られたテクニックだと思われ。
148:デフォルトの名無しさん
09/03/21 01:13:14
む・・・むずいw
149:135
09/03/21 01:20:21
>146
調べきれてないけど4.2.4の方が(規格的には)正しいような
気がしてきました。
NS2->NS1の書き換えはADLの関係でget(HUGA*)がヒット(2がかえる)。
だからget(HUGA*)を位置を変えずにNS1に持っていっても同様に
2がかえるのを確認しました。
get(void*)とget(HUGA*)をtemplate関数の特殊化とした場合
同様に2がかえる。
=> depend name?
それ以外の場合(オーバーロードの解決)は純粋に出現
順序で決定されると。
=> nondependent name?
もうちょっと調べてみます。ありがとうございます。
150:デフォルトの名無しさん
09/03/21 01:20:51
解決されるときに(...)の優先度が最低になるのが見付からないなぁ
ま事実だけ覚えときゃ十分か
151:デフォルトの名無しさん
09/03/21 01:48:31
>149
「NS2->NS1の書き換え」ってどこ書き換えたの?
テンプレート引数 T に依存するかどうかが dependent name かどうかの判断なので、
4.2.4 の挙動もおかしい気はする。
>それ以外の場合(オーバーロードの解決)は純粋に出現
>順序で決定されると。
先に宣言されたものが常に選ばれるみたいに読めて微妙。
>150
13.3.3.2/2
152:135
09/03/21 02:32:23
>151
> 「NS2->NS1の書き換え」ってどこ書き換えたの?
135のサンプルを「NS1->NS2の書き換え」の間違えです。
まとめると
//1を有効 & 他無効 => 2
//2を有効 & 他無効 => 1
//3を有効 & 他無効 => 2
#include <stdio.h>
namespace NS1 { struct HUGA {}; }
namespace NS2 {
int get(void*) { return 1; }
// int get(NS1::HUGA * ) { return 2; } //1
template <typename T>
int f() {
NS1::HUGA huga;
return get(&huga);
}
int get(NS1::HUGA * ) { return 2; } //2
}
namespace NS1 {
// int get(NS1::HUGA * ) { return 2; } //3
}
int main() { return NS2::f<int>(); }
153:135
09/03/21 02:42:13
補足
152のサンプルは3.3.6では全部2になります。
4.2.4みたいにADLの対象か否かで解決遅延対処になるか
否かってのはなんかしっくりこない・・・。
154:127
09/03/21 05:46:58
>>128
でたらめな比較結果を返す関数を与えた場合の動作は未定義なんですね。
致し方ないので既知の問題としてドキュメントに記載してユーザに注意
してもらうことにします。ありがとうございました。
155:デフォルトの名無しさん
09/03/21 08:00:42
比較関数全体をユーザ定義にするんじゃなくて、比較処理はC++で書いて、
条件を(比較結果がデタラメにならない程度に)カスタマイズできるように
すればいい気がするなぁ。
156:デフォルトの名無しさん
09/03/21 13:19:32
for_eachについて教えてほしいのですが、下記のコードでfor_eachの三番目の引数である
CPrint()に引数を設定ていないのにveciTableの要素が、void operator()(int iValue) 〜へ渡されているのはどうしてですか?
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
struct CPrint {
void operator()(int iValue) { printf("%d\n", iValue); }
};
int main() {
vector<int> veciTable(3);
veciTable[0] = 111;
veciTable[1] = 222;
veciTable[2] = 333;
for_each(veciTable.begin(), veciTable.end(), CPrint());
return 0;
}
157:デフォルトの名無しさん
09/03/21 13:22:22
>>156
CPrint()(veciTable[0]) などのように operator () が呼び出されるから。
158:デフォルトの名無しさん
09/03/21 13:22:33
std::tr1::bindですが、↓がコンパイルできません。
Aのメンバ関数に引数を渡したいのではなくて、X::funcBにAを渡したいのです。
どうすればいいでしょうか。
class X {
class A { ... };
void funcA(void) { for_each(container.begin(), container.end(), std::tr1::bind(&X::funcB, _1)); }
void funcB(const A& a) { ... }
std::vector<A> container;
};
159:デフォルトの名無しさん
09/03/21 13:24:23
>>158
エラーメッセージは?
160:デフォルトの名無しさん
09/03/21 13:26:23
>>158
X のインスタンス指定が抜けてるよ。
std::tr1::bind(&X::funcB, this, _1) でいけるんじゃない?
161:158
09/03/21 13:46:42
>>160 であっさりうまくいきました!
昨日一晩の苦労が…。感激です。
>>159
thisがないときのエラーメッセージは(VC9ですが)
「error C2825: '_Fty': '::' が後に続くときは、クラスまたは名前空間でなければなりません」の後
「テンプレートのインスタンス化 'std::tr1::_Result_type1...' の参照を確認してください」という
bind特有の長いメッセージが続きます。
162:デフォルトの名無しさん
09/03/21 14:21:43
長文で申し訳ない。
>153
やっぱり 4.2.4 の挙動もおかしいと思う。
インスタンス化時点での名前解決の対象になるのは ADL のみみたいだけど、
そもそも、テンプレートパラメータに依存する dependent name に対するものだけなので。
ぴったりしたケースじゃないけど 4.3.1 に対してこんなバグレポもあがってるので、
gcc の挙動をそんなに信用できないと思う。
URLリンク(gcc.gnu.org)
テンプレートパラメータに依存しないものならインスタンス化を待たなくとも結果は変わらない
はずだし、遅延すると通常の名前に対するものと異なる直感に反する結果を与えかねないので、
定義時点で名前解決を行えばいい。
一方、テンプレートパラメータに依存する名前について定義時点のみで名前解決を行うとすると、
制約が強すぎる。例えば STL を使う場合、コンテナのヘッダをインクルードする前にコンテナの要素型と
必要な操作が宣言されていなければならない。
従って、インスタンス化まで名前の解決を遅延したいが何でもかんでも名前解決の対象にすると、
これまた直感に反する結果を与えかねない。
ということで、ADL のみに制限しているという理解。
……なんだが、14.6.4 の規定自体に問題がある気がしてきた。
ADL じゃない lookup はインスタンス化時点では行わないようにも読めるんだが、qualified name lookup も
インスタンス化時点で行われないと、dependent name な基本クラスのメンバにアクセスできなくなるので
そんなわけないと思うのだが。
C++ Templates The Complete Guide では dependent qualified name もインスタンス化時点で名前解決されるって
書いてあるんだが、一方、インスタンス化時点で名前解決されるのは ADL のみという記述も結構見かける。
163:デフォルトの名無しさん
09/03/21 14:27:34
g++の挙動はおかしいから
有名なソフトじゃ禁止コーディング規約いっぱいあるよ
C++のインプリで世界最悪なのがg++だし
164:デフォルトの名無しさん
09/03/21 20:10:57
アンチg++必死だなw
165:135
09/03/21 20:28:38
>162
つまみ食いみたいなレスになりますが・・・
>gcc の挙動をそんなに信用できないと思う。
私もgccのbugzilla幾つか確認したけどアサインされてないバグって
結構いっぱいありますな。外野があれこれいうのもなんだけどあれで
C++0x対応が収束するのやら。
> ということで、ADL のみに制限しているという理解。
そもそもオーバーロードは遅延名前解決の対象になるのか?
152の//3はnamespaceが違うのでget(void*)とはオーバーロードの
関係ではないわけで、そういう風に考えると、名前解決が遅延するのも
自然な気がしてきました(w
f()内でget呼び出しがTに依存していないのにも関わらず
名前解決が遅延するのがバグであったとしても、
本来はTに依存させて使用するのが普通で、そのバグを
前提にしたロジックを組まなければ何とかなるかと。
166:デフォルトの名無しさん
09/03/21 21:19:05
>165
> そもそもオーバーロードは遅延名前解決の対象になるのか?
> 152の//3はnamespaceが違うのでget(void*)とはオーバーロードの
> 関係ではないわけで、そういう風に考えると、名前解決が遅延するのも
> 自然な気がしてきました(w
名前解決(というより照合と呼ぶべきかもしれないが)とオーバーロードの解決は別のステップで、
まず名前の解決を行い、その後、名前解決によって発見された候補関数群から、呼び出すべき関数が
選び出される(これがオーバーロードの解決)。
なので、名前の解決が遅延された時点でオーバーロードの解決も遅延される。
ちなみに、private とかのアクセス制限が確認されるのはこの後。
167:デフォルトの名無しさん
09/03/22 01:01:10
>>163
>C++のインプリで世界最悪なのがg++だし
いるいる、「絶対○○」とか「世界一○○」とか何の根拠もなしに比較したかのように語る人w
168:デフォルトの名無しさん
09/03/22 01:28:11
ここの住人は頭がみんな良さそう
名前空間なんて、
松坂大輔
宮川大輔
のようなものとしか理解してないんだがな、俺的には。
169:デフォルトの名無しさん
09/03/22 02:52:53
よくわからんけど、gccは新しいのでやってくれ。windowsもlinuxも4.3.3以前のは入れてない。
170:デフォルトの名無しさん
09/03/22 13:12:11
gccについて疑問に感じたのなら、本家のforumが待ってるよ。
171:デフォルトの名無しさん
09/03/22 16:44:02
>>169
gccの4.x系は、Linux上での動作はいいが、Windows上での動作は問題があるって聞いてるんだが。
だからMinGWも最新安定版はg++は3.4.5なんだと。
(アルファ版なら4.x系もあるだろうが。)
172:デフォルトの名無しさん
09/03/22 16:46:44
gcc の話は↓こちらでどうぞ。
GCCについて part8
スレリンク(tech板)
173:デフォルトの名無しさん
09/03/23 12:22:42
聞いた話じゃなぁ
174:デフォルトの名無しさん
09/03/23 23:18:14
心を振るわせる話なら信用するのに
どうして鼓膜を振るわせる話は信用しようとしないのだ。
175:デフォルトの名無しさん
09/03/24 00:30:19
質問です
ソースファイルAでnewしたインスタンスを
別のソースファイルBでdeleteしたりしても大丈夫なんですか?
176:デフォルトの名無しさん
09/03/24 00:39:08
インスタンスの実体が対応してれば大丈夫だろ
177:デフォルトの名無しさん
09/03/24 01:03:40
変な設計だとは思うけどな
178:デフォルトの名無しさん
09/03/24 02:43:52
コンストラクタをcppに書いて、デストラクタをインラインでヘッダに書けば普通に起こる状況だな
179:デフォルトの名無しさん
09/03/24 08:21:36
クロスDLL問題ってのとは全くの別物だよね?
そもそもどうしてあれはダメなんだろ?
180:デフォルトの名無しさん
09/03/24 09:21:41
それは、それぞれでnewとdeleteの実装が別物だとうまくいかないという話。
msvcr90.dllですべて統一するとか、shared_ptrのようにdeleteごと渡すとかすればいい。
そして、コンパイラが違うとvtblやRTTIの形式が違うという話へ続く……。
181:デフォルトの名無しさん
09/03/24 09:28:56
そんな面倒事に悩まされる前に一つのモジュールに閉じ込める工夫に労力注げ…と
182:179
09/03/24 09:35:57
>>180-181
へーそういうことか。
ありがとう!
183:デフォルトの名無しさん
09/03/24 22:12:11
テンプレートの規則や仕様に
詳しくなれる本ってありますかね?
184:デフォルトの名無しさん
09/03/24 22:25:18
>>183
ない
185:デフォルトの名無しさん
09/03/24 22:26:32
>>184
嘘つくな洋書で一冊出てるだろ
教えろよ
186:デフォルトの名無しさん
09/03/24 22:27:32
>>185
詳しくなれるかどうかは別。
詳しく書いてるかもしれないけど。
187:デフォルトの名無しさん
09/03/24 22:29:14
c++ templatesとか
c++ template metaprogramming とか
188:デフォルトの名無しさん
09/03/24 22:30:10
URLリンク(books.google.com)
189:デフォルトの名無しさん
09/03/25 01:24:12
C++編(標準ライブラリ) 第27章 例外クラス
URLリンク(www.geocities.jp)
ここで紹介されている
std::overflow_error
std::underflow_error
が起こる例は、例えばどんなのがあるの?
前者はともかく後者がわからん。。。
190:デフォルトの名無しさん
09/03/25 03:14:14
標準じゃunderflow_error投げる規定は無さそうだな。 >189
191:189
09/03/25 09:38:25
>>190
そうなのか。
とりあえず作っちゃった謎の例外か?
どうも。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5008日前に更新/185 KB
担当:undef