C++相談室 part66
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/01/11(日) 11:21:38ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part65
http://pc11.2ch.net/test/read.cgi/tech/1230341243/
0002デフォルトの名無しさん
2009/01/12(月) 15:10:01じゃなかった。
>>1おばか。
0003デフォルトの名無しさん
2009/01/14(水) 21:19:060004デフォルトの名無しさん
2009/01/14(水) 23:46:07ttp://gcc.gnu.org/projects/cxx0x.html
0005デフォルトの名無しさん
2009/01/15(木) 11:16:32/ / パカッ
//⌒)∩__∩
/.| .| ノ ヽ
/ | | ● ● |
/ | 彡 ( _●_) ミ まピョーん☆
/ | ヽ |∪| /_
// │ ヽノ \/
" ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
0006デフォルトの名無しさん
2009/01/15(木) 19:35:311.書き込みウィンドウを出し半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
0007デフォルトの名無しさん
2009/01/15(木) 20:29:000008デフォルトの名無しさん
2009/01/15(木) 20:32:56問(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]を入力することで入力を終え,カウントできるように.
っていうのをやろうと思ったらどういう風にするのがいいですかね
0009デフォルトの名無しさん
2009/01/15(木) 21:03:52宿題スレに投下する
0010デフォルトの名無しさん
2009/01/15(木) 21:04:42宿題スレとは何ですか?
0011デフォルトの名無しさん
2009/01/15(木) 21:34:13http://pc11.2ch.net/test/read.cgi/tech/1232001038/l50
0012デフォルトの名無しさん
2009/01/16(金) 04:48:280013デフォルトの名無しさん
2009/01/18(日) 09:31:080014デフォルトの名無しさん
2009/01/21(水) 18:41:260015デフォルトの名無しさん
2009/01/21(水) 18:44:50http://pc11.2ch.net/test/read.cgi/tech/1230341243/
0016停止しました。。。
2009/02/03(火) 22:20:430017デフォルトの名無しさん
2009/02/03(火) 22:50:020018デフォルトの名無しさん
2009/02/03(火) 23:01:180019デフォルトの名無しさん
2009/02/03(火) 23:04:39物を動かしたりという処理は常に行うものの
(といってもあまりに重いときにどうするかを考える必要はあるが)、
描画が間に合わない時は描画のみをスキップする方法を使う。
0020デフォルトの名無しさん
2009/02/04(水) 06:42:52TickCountをつかう。OSの起動からの経過時間を計る比較的分解能の高いタイマーを使って速度を保つ。
0021停止しました。。。
2009/02/05(木) 19:06:080022デフォルトの名無しさん
2009/02/05(木) 19:07:300023止しました。。。
2009/02/08(日) 20:51:440024停止しました。。。
2009/02/10(火) 14:15:180025デフォルトの名無しさん
2009/02/10(火) 14:16:050026デフォルトの名無しさん
2009/02/10(火) 16:08:450027停止しました。。。
2009/02/10(火) 18:14:040028停止解除しました。。。
2009/02/10(火) 19:34:280029停止しました。。。
2009/02/10(火) 20:04:300030テンプレート朝鮮中
2009/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();
}
};
0031デフォルトの名無しさん
2009/02/11(水) 01:45:57特殊化するとテンプレートの意味がない気がする。
0032デフォルトの名無しさん
2009/02/11(水) 02:32:51後者は無理だ。
BASE<int>で特殊化するということは、BASE<int>の実装を乗っ取るということ。
つまり、BASE::func();が自分自身を呼び出す再帰になる。
大本のBASE<int>を使いたいというのであれば、
その中では継承しか手段が残らないな。
0033テンプレート朝鮮中
2009/02/11(水) 03:28:30先輩に、
テンプレートクラスにvirtualをつけるのは何故だ!!
静的ポリモフィズムと動的ポリモフィズムを理解していないんでない!!
と言われ悩んでました。(実際にはまだ悩んでいますが・・・)
明日、静的ポリモフィズムと動的ポリモフィズムの違いが明記してある
参考書を貸していただけるとのことなので、再度、勉強します。
勉強しても、分からなければ、もう一度、質問させていただきます。
0034デフォルトの名無しさん
2009/02/11(水) 07:25:55#define private
0035デフォルトの名無しさん
2009/02/11(水) 08:47:44WEBサイトのページから任意の文字列を取得したり
そのページの任意の場所をクリックしたりラジヲボタンを選択したり
これらをUWSCというツールで行っていました
プログラミングに興味があり今UWSCで行っていることをCもしくはC++でやってみたいと思います
紀伊国屋という大きな本屋さんでC関係の解説書を漁ってみたのですが
C言語でWEBページを開くということ自体解説されている本が見当たりませんでした
日本語表記でWEB操作を解説している本を教えてくださいm( _ _ )m
.NETやperlやPHPなら簡単だぞって解答は不要です
CまたはC++でやりたいです
よろしくお願いします
0036デフォルトの名無しさん
2009/02/11(水) 08:53:460037デフォルトの名無しさん
2009/02/11(水) 10:07:02どなたか>>35お願いします
0038デフォルトの名無しさん
2009/02/11(水) 12:50:38標準C / C++には通信の概念自体がない、だからなんか外部のライブラリを利用することになる
.NETがいやならなんか他の使えば?
0039デフォルトの名無しさん
2009/02/11(水) 12:52:39ttp://www.google.co.jp/search?hl=ja&safe=off&q=C%E8%A8%80%E8%AA%9E+CGI&btnG=%E6%A4%9C%E7%B4%A2&lr=
ttp://www.google.co.jp/search?hl=ja&safe=off&q=iconv&btnG=%E6%A4%9C%E7%B4%A2&lr=
0040デフォルトの名無しさん
2009/02/11(水) 12:54:23webページを開くって、ブラウザ起動するってことか?
0041デフォルトの名無しさん
2009/02/11(水) 14:00:300042デフォルトの名無しさん
2009/02/11(水) 14:09:56出先からなので携帯からです
39さん
帰宅したら見てみます
お忙しい中ありがとうございます
40さん
CGIじゃないです
ヤフーのアンケートに応募したり
株価のデータ取得して整理したりです
今はUWSCで満足できる操作できています
C言語覚えたいので
これらの操作をCで行うのが目標です
ありがとうございました
0043停止しました。。。
2009/02/11(水) 15:46:200044デフォルトの名無しさん
2009/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);
}
0045デフォルトの名無しさん
2009/02/11(水) 19:21:03とりあえず↓使おうぜ。
C++相談室 part65
http://pc11.2ch.net/test/read.cgi/tech/1230341243/
0046デフォルトの名無しさん
2009/02/11(水) 19:27:11初めて関数に入った時。
ただし、初期化に副作用が発生しない場合は
プログラム開始時に初期化される可能性もある
(いつ初期化されようが動作に変化が無いので)。
0047デフォルトの名無しさん
2009/02/11(水) 19:44:49環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0048デフォルトの名無しさん
2009/02/11(水) 21:47:18Boost.Asioとかソケットとかキーワードを挙げるくらいしてもいいじゃない。
まあウェブページのダウンロードくらいだったら、HTTP扱える高水準なライブラリを探すべきだと思うけど。
0049デフォルトの名無しさん
2009/02/11(水) 21:52:190050デフォルトの名無しさん
2009/02/12(木) 00:48:32糞本です買わないでください
0051デフォルトの名無しさん
2009/02/12(木) 16:42:10一応言っておくと、初期化は>>46の通りだが
現行C++ではスレッドの概念が無いので
同時にその関数に入った場合どうなるかは環境依存。
0052誘導
2009/02/12(木) 21:47:00C++相談室 part66
http://pc11.2ch.net/test/read.cgi/tech/1234420483/
0053デフォルトの名無しさん
2009/02/12(木) 21:51:250054デフォルトの名無しさん
2009/02/12(木) 22:36:02あとC++の共用体の扱いとかわからんのだが
0055デフォルトの名無しさん
2009/02/12(木) 23:18:03int hoge;
};
struct A a;
~~~~~~
0056デフォルトの名無しさん
2009/02/13(金) 01:24:30struct stat xx;
ではなく
stat xx;
と宣言できるのだが、それをやってしまうと
同スコープでのstat()関数の呼び出しでエラーになるんじゃなかったかな。
個人的には、「Cの標準」に含まれる構造体はC++で使うときも struct をつけるようにしている。
いや、statがCの標準じゃないのは百も承知だが struct tm とかの場合ね。
で、同様に、struct stat のように「Cでも一般的に使える」ものもそうしてる。
POSIX準拠のものとか。
0057デフォルトの名無しさん
2009/02/13(金) 01:39:31エラーになるから 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
0058デフォルトの名無しさん
2009/02/13(金) 07:24:230059デフォルトの名無しさん
2009/02/13(金) 07:24:52stat 関数があるからってことか。
0060デフォルトの名無しさん
2009/02/13(金) 08:55:07どこが間違っているのか教えてください。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)
0061デフォルトの名無しさん
2009/02/13(金) 12:32:46array_type::indexが型だということをコンパイラに教えてやる為にtypenameを付ける
typedef typename array_type::index array_index;
0062誘導
2009/02/13(金) 18:51:30C++相談室 part66
http://pc11.2ch.net/test/read.cgi/tech/1234420483/
0063デフォルトの名無しさん
2009/02/13(金) 18:58:42006444
2009/02/13(金) 22:21:20サンクス。
やっぱり無理でしたか・・・
関数内で
struct{static tbb::mutex m;}M;
みたいに書ければいいなと思ったけどだめぽでした。
関数外に出すしかないか・・・
0065誘導
2009/02/13(金) 22:36:44C++相談室 part66
http://pc11.2ch.net/test/read.cgi/tech/1234420483/
0066デフォルトの名無しさん
2009/02/13(金) 22:57:32{
private:
HAGE();
~HAGE();
protected:
HAGE();
~HAGE();
public:
HAGE();
~HAGE();
};
0067デフォルトの名無しさん
2009/02/13(金) 23:02:560068デフォルトの名無しさん
2009/02/13(金) 23:11:36HAGE *aderans = new HAGE();
0069デフォルトの名無しさん
2009/02/13(金) 23:15:470070デフォルトの名無しさん
2009/02/13(金) 23:42:28struct ADERANS{ /* */};
class HAGE{};
template <typename ZURA_TRAITS=LEAVE21> class ZURA : public HAGE{ /* */};
ZURA<> shokumou;
007160
2009/02/14(土) 00:56:480072281
2009/02/14(土) 15:16:38C++相談室 part66
http://pc11.2ch.net/test/read.cgi/tech/1234420483/
0073停止しました。。。
2009/02/14(土) 18:06:05http://qb5.2ch.net/test/read.cgi/saku/1098189517/282
C++相談室 part66
http://pc11.2ch.net/test/read.cgi/tech/1234420483/
0074デフォルトの名無しさん
2009/02/14(土) 18:49:23^^^^^^^
0075デフォルトの名無しさん
2009/02/15(日) 16:01:06[, -──- 、 _____]
, -──- 、 _____
/_____ \� //⌒ヽ ⌒ヽ `\
|/⌒ヽ ⌒ヽヽ | ヽ / | ^ |^ |- 、 ヽ
| / | ヽ |─| l // `ー ●ーU′ \ ヽ
/ ー ヘ ー ′ ´^V / ─ | ─ ヽ i
l \ / _丿 i 二 | 二 | |
. \ ` ー ´ / .l \ | / l !
>ー── く ヽ \ | / / /
/ |/\/ \ ヽ  ̄ ̄ ̄ / / 同じスレではこのままだけど
l l | l >━━5━━━━━く 違うスレにコピペするとドラえもんがスネ夫
ヽ、| | ノ / く / ヽ に変わる不思議なコピペ。
|ー───j l (⌒(⌒) / |
0076デフォルトの名無しさん
2009/02/15(日) 16:35:070077デフォルトの名無しさん
2009/02/15(日) 16:35:32スレ違い。
0078デフォルトの名無しさん
2009/02/15(日) 16:37:51どのスレにいけばいいでしょうか?
0079デフォルトの名無しさん
2009/02/15(日) 16:38:50Grass【ちょっと草植えときますね型言語】
http://pc11.2ch.net/test/read.cgi/tech/1219466260/
0080デフォルトの名無しさん
2009/02/16(月) 04:53:180081停止しました。。。
2009/02/16(月) 15:48:40http://qb5.2ch.net/test/read.cgi/saku/1098189517/282
C++相談室 part66
http://pc11.2ch.net/test/read.cgi/tech/1234420483/
0082デフォルトの名無しさん
2009/02/16(月) 22:23:360083デフォルトの名無しさん
2009/02/16(月) 22:31:590084デフォルトの名無しさん
2009/02/17(火) 01:47:18ところで<algorithm>ヘッダのテンプレートはほとんどistreamの入力イテレー
タに適用できません。
イテレータにバッファを内蔵し前進イテレータに変換すると適用できると思う
のですが、こういったものはすでに作られていないのでしょうか?
また、アイデアそのものに問題点はありますか?
よろしくお願いします。
0085デフォルトの名無しさん
2009/02/17(火) 02:02:04std::istream_iterator
std::istreambuf_iterator
0086デフォルトの名無しさん
2009/02/17(火) 02:07:09両方ともinput_iterator_tagが指定されています。
forward_iterator_tagを想定するとお考えください。
0087デフォルトの名無しさん
2009/02/17(火) 02:38:59Boost.Spiritがfile_iteratorというランダムアクセスできるイテレータを持っている。
内部でどんな実装をしているかは知らないが。
あと、イテレータではないけど、pstadeのovenというライブラリのmemorizedが
汎用的なバッファ機構(メモ化)を備えていて、
たとえ、元のカテゴリが入力だったとしてもこれを通せば前進になる。
http://p-stade.sourceforge.net/oven/doc/html/oven/range_adaptors.html#oven.range_adaptors.memoized
問題点はよく知らない。
ただ、memorizedは汎用なので、vectorやdequeに貯め込んだり、
file_iteratorのようにストリームに特化して作ったほうが、より効率が良いとは思う。
0088デフォルトの名無しさん
2009/02/17(火) 02:44:54boostのはたしか、ファイルをすべてメモリー上に読み込むような感じの
ものだったと思います。
若干意味合いが異なります。
ovenはちょっと見てみます。
0089デフォルトの名無しさん
2009/02/17(火) 03:34:25要素へのアクセスで、初めて読む部分かすでに読んだ部分かで処理を分けることになるので、
vector などのコンテナに必要な分を読み込んでから処理するのに比べて効率が悪くなりそう。
そのうえで、実際には必要な分を読み込んでから処理すれば十分なことがほとんどになるので
あんまり需要が無いんだと思う。
本当に必要だといえる状況だと言うことなら、興味があるのでどんな場面か教えて欲しい。
0090デフォルトの名無しさん
2009/02/17(火) 03:44:01入力がある場合すべてにおいて必要になるのではないかと思っています。
0091デフォルトの名無しさん
2009/02/17(火) 03:55:28それはないだろ。たとえばテキストファイルを1行ずつ読み込んで処理する場合、
getline() あたりで1行読んでの処理をループすればいい。
0092デフォルトの名無しさん
2009/02/17(火) 04:04:38入力を解析する必要がある場合すべて。
<algorithm>ヘッダを使用するという前提で。
0093デフォルトの名無しさん
2009/02/17(火) 04:12:17その説明だと、vectorとかに蓄えればいいのでは、という疑問が解消されない。
どういう利点があると考えるのか詳しく聞きたい。
0094デフォルトの名無しさん
2009/02/17(火) 04:15:40ストリームの存在意義についてですか?
いろいろ使い道はあるはずだと思いますけど。
0095デフォルトの名無しさん
2009/02/17(火) 04:23:34研究するのは勝手だけれど、具体例を出せないのに意義を語られても困る。
0096デフォルトの名無しさん
2009/02/17(火) 04:34:30いろいろと言うならひとつ挙げるくらい簡単だろ。
0097デフォルトの名無しさん
2009/02/17(火) 04:37:31ストリームの存在意義など聞いていない。
>84 で挙げてる入力イテレータから前進イテレータへの変換をすることが、
必要な分だけコンテナに読み込んでからコンテナのイテレータを使うことに対して、
どんな利点があるのか挙げろと言っている。
0098デフォルトの名無しさん
2009/02/17(火) 07:50:35せっかくだからGoFのデザインパターンを全て調べてみろ
0099デフォルトの名無しさん
2009/02/18(水) 02:33:36亀レスで申し訳ありませんが、ストリームの存在意義そのものが答えになら
ないでしょうか?
0100デフォルトの名無しさん
2009/02/18(水) 02:40:00それしか言えないなら聞き方を変えるけど、一旦コンテナに貯め込む方式の欠点は何?
0101デフォルトの名無しさん
2009/02/18(水) 02:56:05そう思うんならお前の脳内にある「ストリームの存在意義」を挙げればいいだろ。
それを聞く前に答えになるかならないかなんて、エスパーでもなけりゃわからん。
0102デフォルトの名無しさん
2009/02/18(水) 03:00:44処理することで少ないメモリで大量のデータを処理できると言う点があるだろう。
しかし >84 で挙げている方法は「バッファを内臓」することでこの点は失われているように見える。
0103デフォルトの名無しさん
2009/02/18(水) 03:31:07input_iterator it0;
input_wrapper_forward_iterator it1(it0);
input_wrapper_forward_iterator it2; // ?
find_if(it1,it2,cnd());
it2はどう定義するの?
0104デフォルトの名無しさん
2009/02/18(水) 03:33:560105デフォルトの名無しさん
2009/02/18(水) 03:46:48stream 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());
このレベルじゃ意味はまったくないな。
0106デフォルトの名無しさん
2009/02/18(水) 08:45:380107デフォルトの名無しさん
2009/02/18(水) 14:26:320108デフォルトの名無しさん
2009/02/18(水) 16:17:150109デフォルトの名無しさん
2009/02/18(水) 17:04:120110デフォルトの名無しさん
2009/02/18(水) 17:16:540111デフォルトの名無しさん
2009/02/18(水) 17:30:590112デフォルトの名無しさん
2009/02/18(水) 19:15:240113デフォルトの名無しさん
2009/02/18(水) 21:43:290114デフォルトの名無しさん
2009/02/18(水) 22:50:24::func()
って記述を見かけたのですが、::の前って省略できるんですか?
0115デフォルトの名無しさん
2009/02/18(水) 23:00:43#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()が呼ばれる
}
}
0116デフォルトの名無しさん
2009/02/18(水) 23:23:21ありがとうございます。
名前空間を念頭に置いてコードを読み直してみます。
0117デフォルトの名無しさん
2009/02/19(木) 01:46:02読むのはいいけど真似するなよ
0118デフォルトの名無しさん
2009/02/20(金) 01:09:130119デフォルトの名無しさん
2009/02/20(金) 01:12:34どなたかMPEG Audioのdist10というプログラム使ったことある方いらっしゃいませんか?
0120デフォルトの名無しさん
2009/02/20(金) 01:18:25ヒント:スコープの概念。
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
0121デフォルトの名無しさん
2009/02/25(水) 11:10:000122デフォルトの名無しさん
2009/03/13(金) 20:52:410123デフォルトの名無しさん
2009/03/14(土) 00:30:03newされたstd::runtime_error *
だと!そんなもんthrowされたらまさにサジを投げるしかないな。
0124デフォルトの名無しさん
2009/03/14(土) 07:13:32newはもちろんジョークだよな?
0125デフォルトの名無しさん
2009/03/18(水) 18:38:05C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part66
http://pc11.2ch.net/test/read.cgi/tech/1234420483/
0126デフォルトの名無しさん
2009/03/19(木) 17:24:050127デフォルトの名無しさん
2009/03/20(金) 09:58:48比較関数を与えると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 が比較関数の異常を検知して適当なところで処理を中断して例外でも
スローしてくれたらと思うのですがそこまで面倒は見てくれないようです。
0128デフォルトの名無しさん
2009/03/20(金) 10:47:27std::sortに渡すコンパレータは辻褄のあった結果を返さないといけないと仕様で決められている。
そうでない場合の動作は未定義。
つまり、でたらめな結果を返す可能性のあるコンパレータはstd::sortには使えない。
ソート関数を自作するか、コンパレータを検証する関数を追加するしかないだろうね。
いずれにしても矛盾を検知しようと思ったら、O(n log n)では済まないと思う。
0129デフォルトの名無しさん
2009/03/20(金) 16:49:420130デフォルトの名無しさん
2009/03/20(金) 17:16:32http://pc11.2ch.net/test/read.cgi/tech/1172916032/
0131デフォルトの名無しさん
2009/03/20(金) 17:20:20意味不明じゃね?
0132デフォルトの名無しさん
2009/03/20(金) 17:30:1680x86系統の命令コード表あると思うからそれ見ながら分解していけばいいかと
後単純なプログラムでコードがどうなるかをチェックし続けるっていうのが解析の基本><
0133デフォルトの名無しさん
2009/03/20(金) 17:34:18ありがとうございました。
>>131
IDA pro とか簡単に逆アセンブルしてくれて、しかもグラフィカルに構造を表示してくれるので
あんまり知識が無くてもなんとなく分かります
しかも無料で使えるし。
ソフト自体が英語だしあんまり解説サイトとかが無いのが辛いですが・・。
0134131
2009/03/20(金) 19:47:120135デフォルトの名無しさん
2009/03/20(金) 19:56:39g++ (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>(); }
0136デフォルトの名無しさん
2009/03/20(金) 20:01:56バイナリを解析したいのならスマソ。
0137デフォルトの名無しさん
2009/03/20(金) 20:32:041
0138デフォルトの名無しさん
2009/03/20(金) 20:43:392
0139デフォルトの名無しさん
2009/03/20(金) 20:44:56実際の動作は1にならないといけないみたいね。
vararg は言語によるすべての型チェックを無効にして
常にもっとも一致した型であることを強制するので
多重定義の解決では自動的に最優先になるみたい。
0140デフォルトの名無しさん
2009/03/20(金) 20:50:00g++ (GCC) 3.4.5 (mingw special)では返り値は1で、
Borland C++ 5.5.1 for Win32では返り値は2だった。
…つまりg++ 4.2.4はちゃんと正しい進化を遂げているということか。
0141133
2009/03/20(金) 20:54:37がっつりexeファイルです。
コマンドプロンプトで動く簡単(そう)なコンパイラがあるので、それを解析してデコンパイラを作ってみたくて・・。
にしても、2ちゃんねるのスレッド検索って、「アセンブラ」とか「アセンブリ」で検索すると結果が出るのに、
「アセンブ」で検索すると出ないんですね。ふしぎ!
0142デフォルトの名無しさん
2009/03/20(金) 21:02:36もしなければ現段階では鼻から悪魔ってことになっちゃうんだけど
0143デフォルトの名無しさん
2009/03/20(金) 21:21:21(...)
ってどうつかうんですか?
void func(int n, ...)
みたいのであればstdarg.hのマクロでやるのとは思うんですが
(...)みたいな...のみとはなんなんなんですか?
0144135
2009/03/20(金) 21:37:44>>139
...をvoid*にしても(2)はやっぱり1です。
ちなみにfの定義を非templateにすると両方とも
1になります。template関数が実体化されるときに
初めてオーバーロードの解決を行うっていう理屈で
あれば(1)が正しいような気もします。
ただそれはあまりにもマクロ的な発想だし(2)が
正しい?
NS1をNS2を書きかえると(2)が2に成るのも謎・・・。
0145デフォルトの名無しさん
2009/03/20(金) 23:05:110146デフォルトの名無しさん
2009/03/21(土) 00:58:20もちろんある。
っていうか、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.
0147デフォルトの名無しさん
2009/03/21(土) 01:07:07>っていうか、SFINAE を使う場合に用いられる場合がある。
Modern C++ Design に優先順位が最低であることがポイントであるとした上で載ってるので
変態 templater にはそれなりに知られたテクニックだと思われ。
0148デフォルトの名無しさん
2009/03/21(土) 01:13:140149135
2009/03/21(土) 01:20:21調べきれてないけど4.2.4の方が(規格的には)正しいような
気がしてきました。
NS2->NS1の書き換えはADLの関係でget(HUGA*)がヒット(2がかえる)。
だからget(HUGA*)を位置を変えずにNS1に持っていっても同様に
2がかえるのを確認しました。
get(void*)とget(HUGA*)をtemplate関数の特殊化とした場合
同様に2がかえる。
=> depend name?
それ以外の場合(オーバーロードの解決)は純粋に出現
順序で決定されると。
=> nondependent name?
もうちょっと調べてみます。ありがとうございます。
0150デフォルトの名無しさん
2009/03/21(土) 01:20:51ま事実だけ覚えときゃ十分か
0151デフォルトの名無しさん
2009/03/21(土) 01:48:31「NS2->NS1の書き換え」ってどこ書き換えたの?
テンプレート引数 T に依存するかどうかが dependent name かどうかの判断なので、
4.2.4 の挙動もおかしい気はする。
>それ以外の場合(オーバーロードの解決)は純粋に出現
>順序で決定されると。
先に宣言されたものが常に選ばれるみたいに読めて微妙。
>150
13.3.3.2/2
0152135
2009/03/21(土) 02:32:23> 「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>(); }
0153135
2009/03/21(土) 02:42:13152のサンプルは3.3.6では全部2になります。
4.2.4みたいにADLの対象か否かで解決遅延対処になるか
否かってのはなんかしっくりこない・・・。
0154127
2009/03/21(土) 05:46:58でたらめな比較結果を返す関数を与えた場合の動作は未定義なんですね。
致し方ないので既知の問題としてドキュメントに記載してユーザに注意
してもらうことにします。ありがとうございました。
0155デフォルトの名無しさん
2009/03/21(土) 08:00:42条件を(比較結果がデタラメにならない程度に)カスタマイズできるように
すればいい気がするなぁ。
0156デフォルトの名無しさん
2009/03/21(土) 13:19:32CPrint()に引数を設定ていないのに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;
}
0157デフォルトの名無しさん
2009/03/21(土) 13:22:22CPrint()(veciTable[0]) などのように operator () が呼び出されるから。
0158デフォルトの名無しさん
2009/03/21(土) 13:22:33Aのメンバ関数に引数を渡したいのではなくて、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;
};
0159デフォルトの名無しさん
2009/03/21(土) 13:24:23エラーメッセージは?
0160デフォルトの名無しさん
2009/03/21(土) 13:26:23X のインスタンス指定が抜けてるよ。
std::tr1::bind(&X::funcB, this, _1) でいけるんじゃない?
0161158
2009/03/21(土) 13:46:42昨日一晩の苦労が…。感激です。
>>159
thisがないときのエラーメッセージは(VC9ですが)
「error C2825: '_Fty': '::' が後に続くときは、クラスまたは名前空間でなければなりません」の後
「テンプレートのインスタンス化 'std::tr1::_Result_type1...' の参照を確認してください」という
bind特有の長いメッセージが続きます。
0162デフォルトの名無しさん
2009/03/21(土) 14:21:43>153
やっぱり 4.2.4 の挙動もおかしいと思う。
インスタンス化時点での名前解決の対象になるのは ADL のみみたいだけど、
そもそも、テンプレートパラメータに依存する dependent name に対するものだけなので。
ぴったりしたケースじゃないけど 4.3.1 に対してこんなバグレポもあがってるので、
gcc の挙動をそんなに信用できないと思う。
ttp://gcc.gnu.org/bugzilla/show_bug.cgi?id=36883
テンプレートパラメータに依存しないものならインスタンス化を待たなくとも結果は変わらない
はずだし、遅延すると通常の名前に対するものと異なる直感に反する結果を与えかねないので、
定義時点で名前解決を行えばいい。
一方、テンプレートパラメータに依存する名前について定義時点のみで名前解決を行うとすると、
制約が強すぎる。例えば STL を使う場合、コンテナのヘッダをインクルードする前にコンテナの要素型と
必要な操作が宣言されていなければならない。
従って、インスタンス化まで名前の解決を遅延したいが何でもかんでも名前解決の対象にすると、
これまた直感に反する結果を与えかねない。
ということで、ADL のみに制限しているという理解。
……なんだが、14.6.4 の規定自体に問題がある気がしてきた。
ADL じゃない lookup はインスタンス化時点では行わないようにも読めるんだが、qualified name lookup も
インスタンス化時点で行われないと、dependent name な基本クラスのメンバにアクセスできなくなるので
そんなわけないと思うのだが。
C++ Templates The Complete Guide では dependent qualified name もインスタンス化時点で名前解決されるって
書いてあるんだが、一方、インスタンス化時点で名前解決されるのは ADL のみという記述も結構見かける。
0163デフォルトの名無しさん
2009/03/21(土) 14:27:34有名なソフトじゃ禁止コーディング規約いっぱいあるよ
C++のインプリで世界最悪なのがg++だし
0164デフォルトの名無しさん
2009/03/21(土) 20:10:570165135
2009/03/21(土) 20:28:38つまみ食いみたいなレスになりますが・・・
>gcc の挙動をそんなに信用できないと思う。
私もgccのbugzilla幾つか確認したけどアサインされてないバグって
結構いっぱいありますな。外野があれこれいうのもなんだけどあれで
C++0x対応が収束するのやら。
> ということで、ADL のみに制限しているという理解。
そもそもオーバーロードは遅延名前解決の対象になるのか?
152の//3はnamespaceが違うのでget(void*)とはオーバーロードの
関係ではないわけで、そういう風に考えると、名前解決が遅延するのも
自然な気がしてきました(w
f()内でget呼び出しがTに依存していないのにも関わらず
名前解決が遅延するのがバグであったとしても、
本来はTに依存させて使用するのが普通で、そのバグを
前提にしたロジックを組まなければ何とかなるかと。
0166デフォルトの名無しさん
2009/03/21(土) 21:19:05> そもそもオーバーロードは遅延名前解決の対象になるのか?
> 152の//3はnamespaceが違うのでget(void*)とはオーバーロードの
> 関係ではないわけで、そういう風に考えると、名前解決が遅延するのも
> 自然な気がしてきました(w
名前解決(というより照合と呼ぶべきかもしれないが)とオーバーロードの解決は別のステップで、
まず名前の解決を行い、その後、名前解決によって発見された候補関数群から、呼び出すべき関数が
選び出される(これがオーバーロードの解決)。
なので、名前の解決が遅延された時点でオーバーロードの解決も遅延される。
ちなみに、private とかのアクセス制限が確認されるのはこの後。
0167デフォルトの名無しさん
2009/03/22(日) 01:01:10>C++のインプリで世界最悪なのがg++だし
いるいる、「絶対○○」とか「世界一○○」とか何の根拠もなしに比較したかのように語る人w
0168デフォルトの名無しさん
2009/03/22(日) 01:28:11名前空間なんて、
松坂大輔
宮川大輔
のようなものとしか理解してないんだがな、俺的には。
0169デフォルトの名無しさん
2009/03/22(日) 02:52:530170デフォルトの名無しさん
2009/03/22(日) 13:12:110171デフォルトの名無しさん
2009/03/22(日) 16:44:02gccの4.x系は、Linux上での動作はいいが、Windows上での動作は問題があるって聞いてるんだが。
だからMinGWも最新安定版はg++は3.4.5なんだと。
(アルファ版なら4.x系もあるだろうが。)
0172デフォルトの名無しさん
2009/03/22(日) 16:46:44GCCについて part8
http://pc11.2ch.net/test/read.cgi/tech/1192201659/
0173デフォルトの名無しさん
2009/03/23(月) 12:22:420174デフォルトの名無しさん
2009/03/23(月) 23:18:14どうして鼓膜を振るわせる話は信用しようとしないのだ。
0175デフォルトの名無しさん
2009/03/24(火) 00:30:19ソースファイルAでnewしたインスタンスを
別のソースファイルBでdeleteしたりしても大丈夫なんですか?
0176デフォルトの名無しさん
2009/03/24(火) 00:39:080177デフォルトの名無しさん
2009/03/24(火) 01:03:400178デフォルトの名無しさん
2009/03/24(火) 02:43:520179デフォルトの名無しさん
2009/03/24(火) 08:21:36そもそもどうしてあれはダメなんだろ?
0180デフォルトの名無しさん
2009/03/24(火) 09:21:41msvcr90.dllですべて統一するとか、shared_ptrのようにdeleteごと渡すとかすればいい。
そして、コンパイラが違うとvtblやRTTIの形式が違うという話へ続く……。
0181デフォルトの名無しさん
2009/03/24(火) 09:28:560183デフォルトの名無しさん
2009/03/24(火) 22:12:11詳しくなれる本ってありますかね?
0184デフォルトの名無しさん
2009/03/24(火) 22:25:18ない
0185デフォルトの名無しさん
2009/03/24(火) 22:26:32嘘つくな洋書で一冊出てるだろ
教えろよ
0186デフォルトの名無しさん
2009/03/24(火) 22:27:32詳しくなれるかどうかは別。
詳しく書いてるかもしれないけど。
0187デフォルトの名無しさん
2009/03/24(火) 22:29:14c++ template metaprogramming とか
0188デフォルトの名無しさん
2009/03/24(火) 22:30:100189デフォルトの名無しさん
2009/03/25(水) 01:24:12http://www.geocities.jp/ky_webid/cpp/library/027.html
ここで紹介されている
std::overflow_error
std::underflow_error
が起こる例は、例えばどんなのがあるの?
前者はともかく後者がわからん。。。
0190デフォルトの名無しさん
2009/03/25(水) 03:14:140192デフォルトの名無しさん
2009/03/25(水) 11:17:10http://www.google.com/codesearch?hl=en&lr=&q=std%3A%3Aunderflow_error&sbtn=Search
0193デフォルトの名無しさん
2009/03/25(水) 22:41:38これは分かる。
では
falseをintに変換すると0, trueをintに変換すると1
ってのは仕様上正しい?
特に後者が心配でならないんだが、標準で1になることが保証されている?
0194デフォルトの名無しさん
2009/03/25(水) 22:47:03> 4.5 汎整数昇格
> 4 bool 型の右辺値は,int型の右辺値に変換することができる。falseは,0になり,trueは,1になる。
0195デフォルトの名無しさん
2009/03/25(水) 23:15:060196デフォルトの名無しさん
2009/03/25(水) 23:18:49引き継いで逃げ切ればOK
0197デフォルトの名無しさん
2009/03/25(水) 23:30:32は正常に動作するけど
if ( int値を返す式 == true ) {}
とやると意図したとおりに動かない可能性がでてくる
妙なルール。
0198デフォルトの名無しさん
2009/03/26(木) 17:19:01は if ( int値を返す式 == 1 ) {} と同じ動作?
0199デフォルトの名無しさん
2009/03/26(木) 18:56:190200デフォルトの名無しさん
2009/03/26(木) 21:25:19変なルールだよな仕方ないけど
0201デフォルトの名無しさん
2009/03/26(木) 21:26:340202デフォルトの名無しさん
2009/03/27(金) 01:14:18C が 0 以外は true と決めてたわけで better C としての
C++ は、従うしかなかったんちゃう?
まぁ、そんな言語は山ほどあるわけだが………
0203デフォルトの名無しさん
2009/03/27(金) 10:41:29trueをそっちに合わせたんじゃね?
0204デフォルトの名無しさん
2009/03/27(金) 14:23:37#define false 0
typedef char bool;
昔ありそうな超手抜き実装
0205デフォルトの名無しさん
2009/03/27(金) 14:24:250206デフォルトの名無しさん
2009/03/27(金) 14:30:140207デフォルトの名無しさん
2009/03/27(金) 14:44:47だからint型とbool型を比較すると、暗黙の型変換のルールに従って、bool型の方がint型に昇格する。
結果、>>198のようになって、意図したとおりに動かなくなる。仕様どおり!・3・
0208デフォルトの名無しさん
2009/03/27(金) 21:09:51int a=0;
int b=0;
int func(int c){ b=a; return c; }
このとき、
func(++a);
を通ると、bに1が入ることは保障されますよね?
func(a++);
この場合はどうでしょうか?
bに0が入る?
bに1が入る?
鼻から悪魔?
0209デフォルトの名無しさん
2009/03/27(金) 21:16:01関数を呼ぶ直前と、関数から戻った直後に副作用完了点がある。
だから、どちらもbは1になる。
0210デフォルトの名無しさん
2009/03/27(金) 21:22:54有難うございます。
0211デフォルトの名無しさん
2009/03/27(金) 21:28:25すいません。もうひとつ教えてください。
&& || ?: , 以外の演算子は副作用完了点ではないんですよね?
自分でオーバーロードした演算子の場合は
通常の関数と同じように関数に入る直前と戻った直後に副作用完了点はありますか?
0212デフォルトの名無しさん
2009/03/27(金) 21:32:31ある。
ただし、最初にあげてる演算子をオーバーロードした場合、
組み込み演算子と違って、オペランドの評価順序が不定になったり、
ショートサーキットでなくなったりするのには注意。
0213デフォルトの名無しさん
2009/03/27(金) 21:42:28たびたびすみません。
「オペランドの評価順序が不定になる」とは何ですか?
組み込み演算子でも一般的に不定だと思うのですが、
オーバーロードによって不定でなかったものが不定になる場合があるのですか?
0214デフォルトの名無しさん
2009/03/27(金) 21:53:18組み込みの && || ?: , 演算子の評価順序のことですね?
自己解決しました。
0215デフォルトの名無しさん
2009/03/27(金) 22:22:2732bit環境では %llu
64bit環境では %lu
両対応でスマートな解決法ってないものだろうか?
define拾ってきて切り替えるくらいしか思いつかない
0216デフォルトの名無しさん
2009/03/27(金) 23:32:400217デフォルトの名無しさん
2009/03/27(金) 23:35:15defineで切り替えるしかないんじゃね?
0218デフォルトの名無しさん
2009/03/28(土) 00:21:240219デフォルトの名無しさん
2009/03/28(土) 00:25:57その手があったか!
思考がループしてそこまで考え付かなかった。 thx
0220デフォルトの名無しさん
2009/03/28(土) 01:23:020221デフォルトの名無しさん
2009/03/28(土) 19:28:24それだと、uint64_t使えというところから始めないと。
0223デフォルトの名無しさん
2009/03/28(土) 23:31:56それらの平均値や標準偏差を求めるプログラムを打ち込んだところ、
.\例題2.1.cpp(10) : error C2679: 二項演算子 '>>' : 型 'const char [2]' の
右オペランドを扱う演算子が見つかりません (または変換できません)。
というエラーが出てしまったんですが、なにが原因かさっぱりわかりません。
いつもと同じように打ち込んだつもりなのですが、原因分かる方いませんか?
0224デフォルトの名無しさん
2009/03/28(土) 23:33:210225デフォルトの名無しさん
2009/03/28(土) 23:43:10こうなっています。見たところどこにもミスはないと思うのですが・・・
0226デフォルトの名無しさん
2009/03/28(土) 23:45:320227デフォルトの名無しさん
2009/03/28(土) 23:47:54場合によって意味が変わるけど<<は出力、>>は入力
cin >>n
nに入力された値を入力
n>>"\n";
次に入力された値を"\n"に入力
だぞ?
おかしいだろ
0228デフォルトの名無しさん
2009/03/28(土) 23:50:52ああ、なるほど!入力と出力の指令が混同してましたね(汗)
こりゃ動かんわ・・・どうもありがとうございました!!
0229デフォルトの名無しさん
2009/03/29(日) 00:00:58これってC++のルール上、
((T*)NULL)->function() は安全にコールできるんでしょうか?
class T {
void function(){
if (this == NULL){
return;
}
メンバにアクセス
}
}
function() が virtual だとしたらヌルポ例外ですよね?
0230デフォルトの名無しさん
2009/03/29(日) 00:06:01C++にnull_pointer_exceptionなんて気の利いたもんはない。多分OSがそのプロセスを殺そうとするだけだろう。
経験則ではメンバに触れなければ落ちないけど規格で決まってる訳ではないだろうからお勧めしない。
0231デフォルトの名無しさん
2009/03/29(日) 00:07:05>>230は>>229宛
0232デフォルトの名無しさん
2009/03/29(日) 00:13:00((T*)NULL)-> が現れた時点で未定義動作になる。関数の中身は関係ない。
0233デフォルトの名無しさん
2009/03/29(日) 00:20:21ありがとうございます。
0234デフォルトの名無しさん
2009/03/29(日) 00:41:21このfunction()をstatic関数にしてみるとどうだろう?
有識者のご意見を聞きたい。
class T
{
public:
static void function(){}
};
int main()
{
((T*)NULL)->function();
return 0;
}
0235デフォルトの名無しさん
2009/03/29(日) 00:43:430236デフォルトの名無しさん
2009/03/29(日) 00:46:420237234
2009/03/29(日) 00:49:17通ったよ。g++ね。
C++では
(T*)NULL
自体は未定義じゃないよね?
>>232さんが言っているように
>((T*)NULL)-> が現れた時点で未定義動作になる。関数の中身は関係ない。
なのだとしたらstaticだろうが何だろうが確かに未定義になるのだろう。
が、static関数なら実質的にグローバル関数扱いなのではと思っているので疑問だった。
staticなメンバ関数はstaticなメンバ変数にしか触れることができないじゃん。
>>236
チェックしてくれてありがとう。
0238デフォルトの名無しさん
2009/03/29(日) 00:54:500239デフォルトの名無しさん
2009/03/29(日) 00:55:550240デフォルトの名無しさん
2009/03/29(日) 01:01:01{
public:
void func( void ){ std::cout << "test"; }
};
int main( void )
{
static_cast<Test*>(NULL)->func();
return 0;
}
メンバ変数に触れなければこれもコンパイル通って動きそうだけど
さすがに未定義か?
0241デフォルトの名無しさん
2009/03/29(日) 01:04:39括弧が足りなくないか?
0242デフォルトの名無しさん
2009/03/29(日) 01:06:19メンバ関数の呼び出しはつまるところ暗黙の引数thisを含む関数の呼び出しにすぎない。それがNULLであったとしても関数を実行するコードはあるので実行はされる。
でも未定義。
0243237
2009/03/29(日) 01:07:21メンバ関数に触れていても通るよ。
コンパイラにはNULLかどうかなんてコンパイル時に分からない。
全く問題無く通り、実行時に鼻から悪魔が出て来ることとなる。
0244デフォルトの名無しさん
2009/03/29(日) 01:09:10>>237
が言っているstatic関数になると話は別じゃね?
俺はstatic関数に詳しいとかいうわけじゃないから知らんけど、
グローバル関数に無理矢理クラス内というスコープつけたものという認識。
0245デフォルトの名無しさん
2009/03/29(日) 01:21:49未定義動作になるのは、オブジェクトを指していない参照に対して単項 & や sizeof など特殊な
ものを除く演算子を適用した場合はいつでも。
アロー演算子 -> の右にあるのが何だとか関数が static だとかそんなのは関係ない。
0247237
2009/03/29(日) 01:33:32ってのがあったな。めずらしく安全な例で。
0248デフォルトの名無しさん
2009/03/29(日) 01:41:17ポインタだからいいんじゃね?
4.10 Pointer conversions
(snip)
A null pointer constant can be converted to a pointer type;
the result is the null pointer value of that type and is distinguishable
from every other value of pointer to object or pointer to function type.
0249デフォルトの名無しさん
2009/03/29(日) 01:43:30p->x は (*p).x と定義されている。
0250デフォルトの名無しさん
2009/03/29(日) 01:47:04((T*)NULL);
0251デフォルトの名無しさん
2009/03/29(日) 02:09:54というのがあって
あるタイミングで
v.push_back(アドレス);
これやるとmemoty.stlの__rw_basis::data()で落ちるんです。どうやらタイミングとかが関係するみたいなんで
どなたかエスパーお願いできないでしょうか?再現ができなくて申し訳ないんですが・・・
0252デフォルトの名無しさん
2009/03/29(日) 02:13:33スレ違いです。↓へどうぞ。
http://pc12.2ch.net/test/read.cgi/tech/1187922645/
0253デフォルトの名無しさん
2009/03/29(日) 02:16:080254デフォルトの名無しさん
2009/03/29(日) 02:16:48それはあたりまえ。だれもそんなところ問題にしていない。
0255デフォルトの名無しさん
2009/03/29(日) 10:59:550256デフォルトの名無しさん
2009/03/29(日) 11:02:31コンパイラ拡張なら色々。
0257デフォルトの名無しさん
2009/03/29(日) 11:34:030258デフォルトの名無しさん
2009/03/29(日) 17:40:26関数の最後にreturnが無くても
関数の最後まで到達しないなら
C++の規格上は正しくコンパイル、実行できることは保障されますか?
たとえば以下のような記述は問題ないですか?
int a(int n){
if (n){
return 0;
}
else {
return 1;
}
}
int b(int n){
if (n*n>=0){
return 0;
}
}
int c(int n){
while(1);
}
0259デフォルトの名無しさん
2009/03/29(日) 17:45:520260デフォルトの名無しさん
2009/03/29(日) 17:48:43b()とc()は警告出るだろ
0261デフォルトの名無しさん
2009/03/29(日) 18:46:39戻り値が指定されてる関数で、
関数の最後にreturnが無くても
関数の最後まで到達しないなら
C++の規格上は正しくコンパイル、実行できることは保障される。
ただ、b() はその条件を満たしていない。
0262デフォルトの名無しさん
2009/03/29(日) 19:44:120263デフォルトの名無しさん
2009/03/29(日) 19:49:060264デフォルトの名無しさん
2009/03/29(日) 19:56:38int b(int n){
if (n*n>=0){
return 0;
}
assert(false);
return 1;
}
と書いても鼻から悪魔が出るだけだな
# スレ違いっぽいが
0265デフォルトの名無しさん
2009/03/29(日) 21:15:290266デフォルトの名無しさん
2009/03/29(日) 21:26:000267デフォルトの名無しさん
2009/03/29(日) 21:27:060268デフォルトの名無しさん
2009/03/29(日) 22:07:55と思っているのだが,bはNGなのか?
0269デフォルトの名無しさん
2009/03/29(日) 22:12:18それ以外はコンパイルも動作もOK
0270デフォルトの名無しさん
2009/03/30(月) 11:04:54なら大丈夫かな?
0271デフォルトの名無しさん
2009/03/30(月) 12:38:170272デフォルトの名無しさん
2009/03/30(月) 12:50:14もうsqrt(abs(n)) <= INT_MAXとかoptionalとか使って部分関数として定義するしかないのか
0273デフォルトの名無しさん
2009/03/30(月) 20:07:59関数の引数のコンマは副作用完了点ではないのは理解してますが、
初期化子のコンマは副作用完了点でしょうか?
たとえば、以下のコードは正しく動きますか?
struct T {
int a,b;
......
};
int f();
void g(){
T t={ f(), t.a };
.......
}
void h(){
int a[2] = { f(), a[0] };
.......
}
0274デフォルトの名無しさん
2009/03/30(月) 20:27:52たとえば、以下のコードは正しく動きますか?
void g(){
int a=f(),b=a;
......
}
0275デフォルトの名無しさん
2009/03/30(月) 22:21:29実現したいのですが、よい方法はないでしょうか?
メンバ関数を使えばよいのは承知しているのですが、できれば "()" を書かずに済ませたいのです
struct coord { int x; int y; } ///< これを親にしたい
class state {
coord position; ///< この部分をメンバ変数として持つのではなく親から継承したい
coord velocity;
void foo();
}
extern void bar(coord& param);
void state::foo() { bar(position); bar(velocity); }
現在は親の参照を返すメソッドを作り、マクロでごまかして無理矢理実現しています
しかしマクロがソース全域に作用してしまうのでなんとかしたいのです
class state: public coord {
coord velocity;
coord& position() { return *this; } ///< 参照を追加
const coord& position() const { return *this; } ///< const 参照を追加
#define position position() ///< 強引にマクロ…関係ない部分まで作用してしまうのが難点
void foo(); ///< foo() 内で親の実体を *this ではなく position と書いてアクセスしたい!
}
試しにこんな風に書いてみたのですが、うまくいきませんでした
class state: public coord {
coord velocity;
const coord& position; /// こんな感じの参照をメモリ消費なしで定義したい
state(): position(*this) {} /// ここでエラー orz
void foo();
}
0276デフォルトの名無しさん
2009/03/30(月) 23:02:24何かいろいろとアレな気がするが、少なくとも私の環境では
struct coord { int x; int y; };
class state: public coord {
coord velocity;
const coord& position;
state(): position(*this) {}
void foo();
};
というコードはコンパイルが通る。
エラーが出るというなら、コンパイラの名前とエラーメッセージを書いてほしい。
あと、クラス定義の最後のセミコロンを忘れていないかね?
0277デフォルトの名無しさん
2009/03/30(月) 23:11:06コンパイラはVC++6.0 SP5+プロセッサパックでエラーメッセージは以下の通りです
error C2758: 'position' : オブジェクト コンストラクタの初期化リストで初期化されませんでした。
'position' の宣言を確認してください。
最近のコンパイラではこのソースでも動くとのことなので、こちらでもコンパイラを変えて
試してみようと思います。
0278デフォルトの名無しさん
2009/03/30(月) 23:12:07なんか、やりたい動機がよくわからんのだが・・・。
stateからxは、継承関係にあるから当然そのまま参照できるよね。
void foo() { x = 1; }
親クラスのメンバであることが明示されたコードを書きたいってこと?
それなら
void foo() { coord::x = 1; }
これでいいと思うんだけど。
0279デフォルトの名無しさん
2009/03/30(月) 23:13:40warning C4355: 'this' : ベース メンバ初期化リストで使用されました。
エラーではなくワーニングが出ていたのが原因でした。お騒がせしました
0280デフォルトの名無しさん
2009/03/30(月) 23:15:01foo()内部で bar(*this); ではなく bar(position) と書きたい、というのが動機です
0281デフォルトの名無しさん
2009/03/30(月) 23:25:21あー、何となく気持ちはわかる。でも俺がやるとしたら
#define This (*this)
的な方法を選ぶかなぁ、実際にはやらないだろうけどww
0282デフォルトの名無しさん
2009/03/31(火) 00:17:31クラス同士が親子関係を持っていなかった時点と同じ可読性(できれば完全に同一の記述)を
クラス間に親子関係を持たせた後も維持したい、です
1. foo() 内部で bar((coord&)*this) や bar(position()) と書かずに以前のまま bar(position) と書きたい
2. foo()の外部で
state a;
coord b;
a = b;
a.position = b;
上記のように書いた場合に両者のコンストラクタを区別したい
区別のために ((coord&)a) = b と書きたくない
3. 親を参照するメンバ変数 position& が最適化後に実体を持たずに消えてほしい (調べてみたところ、VC6では消えませんでした)
マクロを使うことで制限つきながら上記3つは実現できたのですが
マクロの範囲が広すぎて関係ない部分まで影響が出るのが難点でした
要はほとんど好みの問題なのですが、どんな泥臭い方法でもいいので、
A. 無駄なメモリを消費しない自分自身(親の実体)への参照を定義するか、
B. プリプロセッサに頼らずにメンバ変数の記述でメンバ関数の呼び出しが行われるようにしたいのです
もしBが可能なのであれば、例えばコンストラクタがあってunion化できないメンバ変数へ
部分的なアクセスを行う擬似unionのようなことも(C++の理念的にどうなのかは別として)できそうです
0283デフォルトの名無しさん
2009/03/31(火) 00:20:18継承は is a の関係
包含の方が多くの場合適切
なぜ男なんだ
0284デフォルトの名無しさん
2009/03/31(火) 00:41:45なんか、説明聞いたらさらにツッコミたくなってしまったw
foo() の汎用性を持たせたいなら static foo(coord&) にして
メンバの場合
foo(*this);
変数の場合
coord c;
foo(c);
と俺はしたくなる。
ちなみに、bar((coord&)*this) は冗長なキャストだけど、わざとそう書いたんだよね・・・?
0286デフォルトの名無しさん
2009/03/31(火) 02:58:04少なくともVC++8で試してみたらコンパイルは通って動作も期待通りだった。
C++の言語仕様として保証されているものかどうかは知らん。
0287デフォルトの名無しさん
2009/03/31(火) 03:44:39挙げられた例では未初期化のオブジェクトを参照しているので、
副作用完了点に関わらず、値が不定となる。つまり int i = i; と同じ。
ちなみに、初期化子および初期化宣言を区切るカンマではそれぞれで
「完全式」が区切られるので、副作用完了点となる。
ただし並べられたそれらの順番について C++ 2003 では規格に記述がなかったので、
次期改定で記述順に評価されることが決まる予定。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#430
なお、同じく次期改定で追加される initializer list については、・・・アレ、
評価順についての記述が見当たらない。大丈夫なんだろうか?
0288デフォルトの名無しさん
2009/03/31(火) 06:18:52掲載されている本というとどんなのがありますかね?
0289デフォルトの名無しさん
2009/03/31(火) 21:09:06ありがとうございます。
リンク先は非常に参考になりました。
すみませんが、依然 >>274 がわかりません。
おわかりでないでしょうか?
> 挙げられた例では未初期化のオブジェクトを参照しているので、
これに >>274 も含まれていたりしますか?
英語版wikipediaでは、
> At the end of an initializer; for example, after the evaluation of 5 in the declaration int a = 5;.
とありますが、
an initializer がどういう単位か分かりません。
MSDNでは、
> The end of a full initialization expression, such as the end of an initialization in a declaration statement.
とありますが、a full initialization expression が、
int a=5, b=a*10, *c=&a, &d=a;
のa,b,c,d それぞれなのか、この文全体なのかわかりません。
よろしくお願いします。
0290デフォルトの名無しさん
2009/03/31(火) 21:32:20とした場合、
s.push(〜)はsの中に〜のコピーが出来る仕様でしょうか?
つまり
std::stack<std::string> s;
std::string *p=new std::string;
s.push(*p);
delete p;
としたとしても、スタックsは何の影響もなくs.top()とかしていいんでしょうか?
0291デフォルトの名無しさん
2009/03/31(火) 21:44:03コンテナは値セマンティクスを要求するから
値として振舞わないものは入れられないのじゃ。
入れるならしぇあぽを入れなされ。
そして、そのプログラムは「依頼人のいない弁護士」を
保持することになる。
0292デフォルトの名無しさん
2009/03/31(火) 21:46:58stackにpushした時点でstringがstack内にコピーされるから問題ない。
0295デフォルトの名無しさん
2009/03/31(火) 22:30:080296デフォルトの名無しさん
2009/03/31(火) 23:45:05データ構造がいまいちわかりません
0297デフォルトの名無しさん
2009/04/01(水) 00:09:25ttp://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%82%A4%E6%9C%A8
0298デフォルトの名無しさん
2009/04/01(水) 00:12:16A-B-C
| |-D
|
|-D-E
左端のAが木のトップで右側が子要素な。
親から末端ノードまでの要素を連結すると登録した要素になる。
ツリーの深さはキー長に比例するけど1回辺りの比較が超軽いのが特徴。
これを改良したのにパトリシア木とかあるけど詳細は略
0299デフォルトの名無しさん
2009/04/01(水) 00:23:02データ構造をどう表現していいの?
ノード毎にオブジェクト作るとかアホな
データ構造しか作れそうにないんだけど
意味あるのですかね?
0300デフォルトの名無しさん
2009/04/01(水) 00:42:580301デフォルトの名無しさん
2009/04/01(水) 00:47:310302デフォルトの名無しさん
2009/04/01(水) 01:19:15map<string, map<string, map<string, map<string, string> > > >
みたいなの扱ったことあったなぁ、デバッグしててわけわかんなくなったりしたけどw
これもトライ木と言え・・・ないか。
0303デフォルトの名無しさん
2009/04/01(水) 01:21:12発狂しそうだw
0304デフォルトの名無しさん
2009/04/01(水) 02:59:01利点としては多数のキーが格納されてるときに、
一般的な二分木と比べてキーの探索が速いのと、メモリの無駄が少ない事
ただ、キーが文字列みたいに分解可能であることを要求するから
データの制約は2分木よりあるからトライ木って結構使いどころを選ぶんだよなー
0305デフォルトの名無しさん
2009/04/01(水) 03:10:280306デフォルトの名無しさん
2009/04/01(水) 04:12:12int a = 5;
↑この宣言において、 "initializer" (初期化子)は "= 5" の部分。
あとはわかるよね?
MSDN の "full initialization expression" は規格中に現れる用語では
ないのではっきりしないけど、おそらく上記の宣言における 5 に対応するもの
だろうと考えられる。
0307デフォルトの名無しさん
2009/04/01(水) 04:15:18英語が読めるんなら規格のドラフトを読んだほうがいいかもね。
ただし「シーケンスポイント」というものは次期規格からはなくなってしまうようだ。
スレッド関連を規格化するための影響みたい。
"A finer-grained alternative to sequence points"
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2239.html
0308デフォルトの名無しさん
2009/04/01(水) 08:10:13わかりました。
有難うございます。
>>307
規格書は結構高かった気がするので....
そのうち手に入れます。
0309デフォルトの名無しさん
2009/04/01(水) 08:26:55> 規格書は結構高かった気がするので....
いや、だからダウンロードできるドラフトを読めば、って話なんでしょ。
買うといってるのを止めるわけじゃないけど。
0310デフォルトの名無しさん
2009/04/01(水) 18:42:08昔興味本位で買おうとしたけどあまりにもバカ高くてやめた覚えがある
0311デフォルトの名無しさん
2009/04/01(水) 19:07:36JISって営利目的の機関なの?
勝手に幻滅する俺がいる。
0312デフォルトの名無しさん
2009/04/01(水) 19:11:040313デフォルトの名無しさん
2009/04/01(水) 19:25:050314デフォルトの名無しさん
2009/04/01(水) 19:44:340315デフォルトの名無しさん
2009/04/01(水) 21:03:22俺も甘い汁をすする側になりたいものだ。
0316デフォルトの名無しさん
2009/04/01(水) 21:04:34この世の終わりみたいな気分になるよね。
JISの規格書が高いのもそのせい。
0317デフォルトの名無しさん
2009/04/01(水) 21:15:01生々しいな
俺まだ血が付いてたことはないんだけど。。。
0318デフォルトの名無しさん
2009/04/01(水) 21:24:24拭く前からわかるんだよね、硬さで。
0319デフォルトの名無しさん
2009/04/01(水) 22:02:250320デフォルトの名無しさん
2009/04/01(水) 22:13:05どうゆうアルゴリズムあるのLZ法とか
今でも使うの?
0321デフォルトの名無しさん
2009/04/01(水) 22:27:56>>320
流れから細部を省略しているのかもしれないけど
どれのことかわからん
0322デフォルトの名無しさん
2009/04/01(水) 22:42:35それよりはラッパーを噛ませた方がいいぞ
穴が開いてしまうのはプログラマとしては許せんだろうが、これが実にいい
ttp://item.rakuten.co.jp/popcute/sx-md-32901--33001/
0323デフォルトの名無しさん
2009/04/01(水) 22:57:11うちの職場にいる!! そんな感じの使ってる人!!
俺の脳内ではワッシャと呼んでいる。
0324デフォルトの名無しさん
2009/04/01(水) 23:27:35別に普通じゃね?
0325デフォルトの名無しさん
2009/04/01(水) 23:28:050326デフォルトの名無しさん
2009/04/01(水) 23:30:140327デフォルトの名無しさん
2009/04/01(水) 23:36:25どういうこと?
(俺が空気読めなくて)意図を察せないんだが。
0329デフォルトの名無しさん
2009/04/01(水) 23:43:21おまえにはがっかりだ
0330デフォルトの名無しさん
2009/04/02(木) 00:22:44ちょっとかわいそうに思うよ
G
0331デフォルトの名無しさん
2009/04/02(木) 01:04:39穴あきクッションって効くのかな?
0332デフォルトの名無しさん
2009/04/02(木) 01:14:48脅すつもりはないが、あまりに量が多いようなら内臓由来の可能性もあるから
一度診てもらったほうがいいぞ。
0333デフォルトの名無しさん
2009/04/02(木) 01:18:06さすがにそんなに高くない
JISは17,000円
ISOは380スイスフラン = 3万円くらい?
一応同じ内容の本をamazonから比較的安く購入することもできる
http://www.amazon.com/dp/0470846747/
18ドルで買えるPDFがどこかにあった気がするが忘れた
1998年の規格でよければ最終草案をタダで見れる
http://www.kuzbass.ru/docs/isocpp/
2003年の規格との差分はTC1としてまとめられてる
http://www.open-std.org/JTC1/sc22/wg21/docs/lwg-status.html
G++な方々はボラギノール塗って整腸剤飲んで水分多めに取ると治りやすい
治らなかったら病院へ
0334デフォルトの名無しさん
2009/04/02(木) 01:27:560335デフォルトの名無しさん
2009/04/02(木) 01:32:35http://www.google.co.jp/search?q=%22%8A%C3%82%A2%8F%60%82%F0%8Bz%82%A4%22
0336デフォルトの名無しさん
2009/04/02(木) 02:17:54慣用表現としてなら吸うものかな
0337デフォルトの名無しさん
2009/04/02(木) 02:37:130338デフォルトの名無しさん
2009/04/02(木) 02:38:29JBossとJSPとJava/CGIどれ選べば星界?
0339デフォルトの名無しさん
2009/04/02(木) 02:47:550340デフォルトの名無しさん
2009/04/02(木) 02:47:56ドラフトなら 1998 年よりあとのやつは全部タダで見れるぜ。
http://www.open-std.org/JTC1/sc22/wg21/ から .pdf でダウンロードできる。
ちなみに今の最新は n2857 。
0341デフォルトの名無しさん
2009/04/02(木) 03:46:11int i = i; は、値が不定じゃなくて未定義動作。
0342デフォルトの名無しさん
2009/04/02(木) 08:01:00最新のは規格書の代替にならないんじゃ?
0343340
2009/04/02(木) 09:22:07現行規格の代替なら 2003 年の直前のやつをダウンロードすればいい、
と思ったんだけど、あんまり古いのは無いみたいだった。 340 は嘘ね。ごめん。
ダウンロードできるいちばん古いのは 2004 年の N1577 だった。
途中で公開の方針が変わったのかな?
0344デフォルトの名無しさん
2009/04/02(木) 21:21:31英語の規格書を読みたい人ばっかなんですよね?
0345デフォルトの名無しさん
2009/04/02(木) 21:31:280346デフォルトの名無しさん
2009/04/02(木) 21:38:59JISなんていりません
0347デフォルトの名無しさん
2009/04/02(木) 21:42:180348デフォルトの名無しさん
2009/04/02(木) 21:43:080349デフォルトの名無しさん
2009/04/02(木) 21:52:04それってダウンロードすると白く塗りつぶされるんでしょ。
0350デフォルトの名無しさん
2009/04/02(木) 21:58:02うん。
でもクラック済み。
検索も印刷も普通にできるよ。
0351デフォルトの名無しさん
2009/04/02(木) 22:20:030352デフォルトの名無しさん
2009/04/02(木) 22:25:25ただし日本語とアラビア数字に限る。アルファベットは不可。何でこうなったんだろうね…
おれはJISのでもいいと思うけど、URLが決まらないのでこういうところで紹介するには不向きだと思う
テンプレに手順を書いてくれればいいんだけどね
0353デフォルトの名無しさん
2009/04/02(木) 22:25:26mediatorパターンみたいな感じになっちゃって、
mediatorに相当するクラスのヘッダを、他のクラスから必ずincludeするような設計になっちゃったんだけど、
これって間違ってる?
C++の話題とはズレてごめんね>禿
0354デフォルトの名無しさん
2009/04/02(木) 22:30:52私はLinux用のアクロバットリーダーのバージョン8を使っていますが検索機能付いてます。
JISの文書自体は文字単位で範囲選択できるので検索できない理由がわからないのですが?
0355デフォルトの名無しさん
2009/04/02(木) 22:33:350356デフォルトの名無しさん
2009/04/02(木) 22:46:440357デフォルトの名無しさん
2009/04/02(木) 22:48:120358デフォルトの名無しさん
2009/04/02(木) 22:55:060359デフォルトの名無しさん
2009/04/02(木) 23:00:37オマエ、ソレハナイダロウ
0360デフォルトの名無しさん
2009/04/02(木) 23:35:07俺もそれ思ったwwww
えええええええ!?!?ってオモタ
0361デフォルトの名無しさん
2009/04/02(木) 23:53:540362デフォルトの名無しさん
2009/04/03(金) 22:20:49喪前らも、服用しる
0363デフォルトの名無しさん
2009/04/04(土) 00:41:54strchrって何が違うの?
長さが既知だとすると性能一緒?
0364デフォルトの名無しさん
2009/04/04(土) 00:43:52memchrの方が速いと思われ。
0365デフォルトの名無しさん
2009/04/04(土) 00:47:26309 :動け動けウゴウゴ2ちゃんねる :09/03/30 23:16 ID:SGwSF7rQ
おねがいします。
【板名】 プログラム技術
【スレ名】C++相談室 part66
【スレのURL】http://pc12.2ch.net/test/read.cgi/tech/1231640498/
【名前欄】
【メール欄】
【本文】↓
すみませんが、
0366デフォルトの名無しさん
2009/04/04(土) 00:54:00NULLで止まらないか止まるか
0367デフォルトの名無しさん
2009/04/04(土) 00:54:07286 :動け動けウゴウゴ2ちゃんねる :09/03/30 20:26 ID:SGwSF7rQ
おねがいします。
【板名】 プログラム技術
【スレ名】C++相談室 part66
【スレのURL】http://pc12.2ch.net/test/read.cgi/tech/1231640498/
【名前欄】
【メール欄】
【本文】↓
あと、同じ型で複数の変数を定義する時のコンマは副作用完了点でしょうか?
たとえば、以下のコードは正しく動きますか?
0368デフォルトの名無しさん
2009/04/04(土) 00:58:310369デフォルトの名無しさん
2009/04/04(土) 01:06:430370デフォルトの名無しさん
2009/04/04(土) 01:11:040371デフォルトの名無しさん
2009/04/04(土) 01:16:09速度的にはどうなんですかね?
0372デフォルトの名無しさん
2009/04/04(土) 01:29:43memchar カウンタがアップの判定だけ
どんなコードに落ちるかはCPUのアーキテクチャ次第
0373デフォルトの名無しさん
2009/04/04(土) 01:32:54速度は実測が基本。
0374デフォルトの名無しさん
2009/04/04(土) 12:00:41全く変わらない。
0375デフォルトの名無しさん
2009/04/04(土) 13:33:02出来る限りmemchrを使う
基本的にmem○○とstr○○は常にmem○○優先
0376デフォルトの名無しさん
2009/04/04(土) 13:39:430377デフォルトの名無しさん
2009/04/04(土) 13:48:560378デフォルトの名無しさん
2009/04/04(土) 14:04:58根拠、或いは計測条件の提示を宜しく。
0379デフォルトの名無しさん
2009/04/04(土) 14:27:000380デフォルトの名無しさん
2009/04/04(土) 17:16:31で計測したらstrchrよりmemchrのほうが5パーセントほど
遅いという結果になりました。
どちらの関数もアセンブリ言語で書かれてあります。
0381デフォルトの名無しさん
2009/04/04(土) 19:10:53const char * const p = str.c_str();
こういう使い方ってして良いの?
このケースではまあ最初からp="hoge"とすれば良いことになるけどもね。
0382デフォルトの名無しさん
2009/04/04(土) 19:13:100383デフォルトの名無しさん
2009/04/04(土) 19:13:33str.c_str()がだめってこと?
どうして?
0384381
2009/04/04(土) 19:17:19const char * const p = str.c_str();
str="piyopiyo";
const char * const q = str.c_str();
std::cout << reinterpret_cast<unsigned long>(p) << "\n" << reinterpret_cast<unsigned long>(q) << std::endl;
結果:pとqが違う値。
このようにstrが変わった時にpが無効になってる可能性はあるよね。
あるサンプルソースで似たようなコードがあって疑問だった。
0385デフォルトの名無しさん
2009/04/04(土) 19:17:310387デフォルトの名無しさん
2009/04/04(土) 20:39:03次に const でないメンバ関数が呼ばれるまでの間のみ有効という「時限式」なので
ポインタは保持しないほうがいいよっていうのが一般的な話。
わかってやるなら >>381 自体は違法じゃない。
0389デフォルトの名無しさん
2009/04/05(日) 01:03:50ってやってるヤツがいるんだが
std::stringはデフォルトコンストラクタでは空文字列にしてくれることが仕様上保証されているんだよね?
つまりstr("")は無駄だよね?
0390デフォルトの名無しさん
2009/04/05(日) 01:12:17お前のようにデフォルトコンストラクタの仕様を知らないアホにも空文字列で初期化されることがわかるから無駄じゃない。
0391デフォルトの名無しさん
2009/04/05(日) 01:14:46動作速度の点では無駄。
0392デフォルトの名無しさん
2009/04/05(日) 01:19:08だよね。ありがと。
0393デフォルトの名無しさん
2009/04/05(日) 01:19:470394デフォルトの名無しさん
2009/04/05(日) 01:22:110395デフォルトの名無しさん
2009/04/05(日) 01:22:33動作速度でstr("")が無駄と言う奴は馬鹿。
0396デフォルトの名無しさん
2009/04/05(日) 01:23:24お前も馬鹿。
0397デフォルトの名無しさん
2009/04/05(日) 01:24:100398デフォルトの名無しさん
2009/04/05(日) 01:26:00優秀じゃなくてもふつうそれくらいするよ。
0399デフォルトの名無しさん
2009/04/05(日) 01:30:00何がおかしいの?
具体的に言ってみ、お前の脳で言えるのなら。
0400デフォルトの名無しさん
2009/04/05(日) 01:33:20str("")とデフォルトコンストラクタでは速度に差が無いから>>391はウソ。
以上。
0401デフォルトの名無しさん
2009/04/05(日) 01:35:560402デフォルトの名無しさん
2009/04/05(日) 01:37:190403デフォルトの名無しさん
2009/04/05(日) 01:38:58いや、その前も含めて全部。
・・・と思ったら俺自身安価付けてなかった
ごめん吊ってくる。
0404デフォルトの名無しさん
2009/04/05(日) 01:42:10残念ながら同じバイナリに落ち着かない以上、速度に差がないとはいえない。
出直しておいで坊や。
0405デフォルトの名無しさん
2009/04/05(日) 01:43:400406デフォルトの名無しさん
2009/04/05(日) 01:47:070407デフォルトの名無しさん
2009/04/05(日) 02:24:220408デフォルトの名無しさん
2009/04/05(日) 02:30:490409デフォルトの名無しさん
2009/04/05(日) 02:55:07同じ()バイナリ()落ち着く()
スイーツ()ですか
0410デフォルトの名無しさん
2009/04/05(日) 02:57:50str("")は無駄ではない。
0411デフォルトの名無しさん
2009/04/05(日) 02:58:050412デフォルトの名無しさん
2009/04/05(日) 03:01:33なんて醜態晒すくらいなら
std::string str("");
と書く方がよほどスマート。
0413デフォルトの名無しさん
2009/04/05(日) 04:02:57そうなれば本当に速度に差はなくなるだろう
今は知らん
0414デフォルトの名無しさん
2009/04/05(日) 04:48:42char* str = NULL;
char* str = "";
同じか?w
0415デフォルトの名無しさん
2009/04/05(日) 07:26:060416デフォルトの名無しさん
2009/04/05(日) 07:47:480417デフォルトの名無しさん
2009/04/05(日) 08:47:43> mediatorに相当するクラスのヘッダ
の中では前方宣言するのが吉。
そうしないと冗長すぎる依存関係になってしまう。
アプリケーション全体が10kくらいなら気にしないのも有りかも。
0418デフォルトの名無しさん
2009/04/05(日) 09:12:22C言語でWEB操作したいです
証券会社にログインして株価を監視して自動売買が目標です
まずはC言語でWEBページを開く方法を教えてください
0419デフォルトの名無しさん
2009/04/05(日) 09:58:03> 次期規格ではstring()はstring("")に委譲する実装になるだろうから
なんでそんなとこ変わるの?
0420デフォルトの名無しさん
2009/04/05(日) 10:40:31WebProg板へどうぞ。
0421デフォルトの名無しさん
2009/04/05(日) 13:12:14C Web Download をgoogle検索
あきらめろ
0422デフォルトの名無しさん
2009/04/05(日) 13:32:16http://pc12.2ch.net/test/read.cgi/tech/1182323579/
0423デフォルトの名無しさん
2009/04/05(日) 18:03:11privateで宣言すると、
まあ普通にコンパイルエラーになるんだけど、
特殊な状況でprivateなデストラクタってある?
なんか俺の知らないイディオムでありそうな気がしてきたんだが。
0424デフォルトの名無しさん
2009/04/05(日) 18:16:000425423
2009/04/05(日) 18:18:06そう、通らない。
でも例によってC++は深遠だからさ、
俺が知らないだけで便利なイディオムがあったりするかな〜って興味が出てきた。
0426デフォルトの名無しさん
2009/04/05(日) 18:21:590427デフォルトの名無しさん
2009/04/05(日) 18:22:20deleteはクラスのメンバ関数から出来る。
だから、使えないことはない。具体的にどう役立つのかは分からんが。
0428423
2009/04/05(日) 18:25:28なるほどね。
0429デフォルトの名無しさん
2009/04/05(日) 18:26:30const char* const authorName="ScottMeyers";//方式1
const std::string authorName="ScottMeyers";//方式2
この2つが紹介されていたんだけど、結局どっちが良いの?
本によれば方式2の方が良いよ的な書き方されていたんだけど、どうして方式2が良いのか分からない。
0430デフォルトの名無しさん
2009/04/05(日) 18:35:41として、
boost::shared_ptr<MyClass> p(new MyClass);
だと大丈夫なのに
boost::shared_ptr<MyClass> p=new MyClass;
だとダメなのは何故でしょうか?
私は宣言時に
(初期化値)とするのと
=初期化値とするのは
等価にコンストラクタを呼び出す物だと思っていたので驚きました。
0431デフォルトの名無しさん
2009/04/05(日) 18:38:14boost::shared_ptr<MyClass> p=boost::shared_ptr<MyClass>(new MyClass);
0432デフォルトの名無しさん
2009/04/05(日) 18:41:49コンストラクタに explicit がついていると
> boost::shared_ptr<MyClass> p=new MyClass;
は不可能になる。
例えば
class MyClassA {
MyClassA(int n);
};
class MyClassB {
explicit MyClassB(int n);
};
となっていた場合、
MyClassA a(3); // OK
MyClassA a = 3; // OK
MyClassB b(3); // OK
MyClassB b = 3; // NG
となる。
また、
void myFuncA(MyClassA a);
void myFuncB(MyClassB b);
という関数があった場合
myFuncA(3); // OK
myFuncB(3); // NG
となる。myFuncB(MyClassB(3)) は可能。
0433デフォルトの名無しさん
2009/04/05(日) 18:42:16それはキャストですよね。
つまりキャストしないとダメなんでしょうか?
なぜですか?
…あ、もしかして
boost::shared_ptr<MyClass>のコンストラクタが
explicitになっているということでしょうか?
0434433
2009/04/05(日) 18:43:20すみません。
再読込してませんでした(> <)
失礼致しました。
explicitですね。
もうちょっと勉強して出直してきます。
0435デフォルトの名無しさん
2009/04/05(日) 18:44:05http://pc12.2ch.net/test/read.cgi/tech/1232367742/106-109
0437433
2009/04/05(日) 18:51:15ありがとうございます。
>newしたらすぐにスマートポインタにセットさせるのが基本。
これがRAIIってやつでしょうか?
0438デフォルトの名無しさん
2009/04/05(日) 18:52:46カスタムデリータを使うときにデストラクタをprivateにして隠して、カスタムデリータ外から勝手に呼べなくする。
0440デフォルトの名無しさん
2009/04/05(日) 21:04:47例えば
class Base
{
public:
virtual void m_func(){std::cout << "Base m_func!" << std::endl;};
Base(){std::cout << "Base Constructor!" << std::endl;};
virtual ~Base(){std::cout << "Base Destructor!" << std::endl;};
};
class Derived : public Base
{
public:
void m_func(){std::cout << "Derived m_func!" << std::endl;};
Derived(){std::cout << "Derived Constructor!" << std::endl;};
virtual ~Derived(){std::cout << "Derived Destructor!" << std::endl;};
};
class Derived_Derived : public Derived
{
public:
void m_func(){std::cout << "Derived_Derived m_func!" << std::endl;};
Derived_Derived(){std::cout << "Derived_Derived Constructor!" << std::endl;};
virtual ~Derived_Derived(){std::cout << "Derived_Derived Destructor!" << std::endl;};
};
0441440
2009/04/05(日) 21:06:11void foo()
{
Base* p=new Derived;
Base* q=new Derived_Derived;
Derived* r=new Derived_Derived;
p->m_func();
q->m_func();
r->m_func();
delete p;
delete q;
delete r;
}
このように、俺はBaseのm_func()にしかキーワードvirtualを付けていないんだが、これであってる?
http://pc12.2ch.net/test/read.cgi/win/1237525619/127
0443デフォルトの名無しさん
2009/04/05(日) 21:17:07仮想関数になる
DerivedもDerived_Derivedもvirtualはつけてもつけなくても一緒
0444デフォルトの名無しさん
2009/04/05(日) 21:50:28ありがとう。
ちなみにどちらでも同じということだが、その場合
virtualは付ける方が良いとか付けない方が良いとかそういう慣習があったりする?
0445デフォルトの名無しさん
2009/04/05(日) 21:54:58Baseでvirtualを付けておき、DerivedとDerived_Derivedではvirtual付けない版と、
Baseでvirtualを付けておき、DerivedとDerived_Derivedでもvirtual付ける版と
両方を作ってビルドしてみた。
g++ -O2 〜〜.cpp
としたのだが、挙動は一緒みたいだが、バイナリは違うものになった。
何故?
0446デフォルトの名無しさん
2009/04/05(日) 22:09:480447デフォルトの名無しさん
2009/04/05(日) 22:24:44-Sだったら同じバイナリになったわ。
なんで??
0448447
2009/04/05(日) 22:25:58→アセンブラコード
0449デフォルトの名無しさん
2009/04/06(月) 00:14:09C++ Coding Standards では派生クラスでもつけたほうがよいと書いてある。
(38項.安全なオーバーライドを身につけよう)
単に利用者に意図を明確にするためだけどね。
0450デフォルトの名無しさん
2009/04/06(月) 00:15:07virtualってどう扱うべきなのですかね?
0451デフォルトの名無しさん
2009/04/06(月) 00:26:220452デフォルトの名無しさん
2009/04/06(月) 00:41:430453デフォルトの名無しさん
2009/04/06(月) 00:43:530454デフォルトの名無しさん
2009/04/06(月) 00:53:48遅レスだけど、削除を別のfriend classに委譲する時なんかで使う。
こんなの
class A {
private:
^A() {};
class deleter {
void operator()(A* target) { delete target; };
}
friend deleter;
public:
boost::shared_ptr<A> creator() { return boost::shared_ptr<A>(new A, deleter()); };
}
0455デフォルトの名無しさん
2009/04/06(月) 17:32:53Singleton() {}
~Singleton() {}
public:
static Singleton& Instance() {
static Singleton instance;
return instance;
}
};
みたいなやり方がどっかに載って無かったかな。
0457デフォルトの名無しさん
2009/04/07(火) 11:04:11singletonをtempleteにするとctorはpublicにせざるをえないのかな?
よくそういう実装をみかけるけど、新しいインスタンスを作れるのがイヤなのですが
0458デフォルトの名無しさん
2009/04/07(火) 11:20:520459デフォルトの名無しさん
2009/04/07(火) 11:22:590460デフォルトの名無しさん
2009/04/07(火) 19:15:55その基準とか主張とかメリットとかデメリットを知りたいんだが、
みんなどうしてる?
確かBoostは俺の知る限りunderscore_styleだったと思うのだが。
0461デフォルトの名無しさん
2009/04/07(火) 19:27:32量産するなんて誰か言ったの?
0462デフォルトの名無しさん
2009/04/07(火) 20:02:19テンプレートにしているから量産しようとしているとespしたんじゃない?
0463デフォルトの名無しさん
2009/04/07(火) 20:05:200464デフォルトの名無しさん
2009/04/07(火) 20:12:330465デフォルトの名無しさん
2009/04/07(火) 20:50:25ここで、
>「デストラクタがヘッダ中に記述されてしまっている」ことにある。
>更に言うと、「deleteがヘッダ中に行われてしまっている」ことが問題であり、
>よりつっこんで言うなら「deleteがCHoge::implの定義と別の場所で行われている」ことが問題なのだ。
>つまり、pimplにスマートポインタを使おうとするなら、デストラクタを必ず明示しなければならないのである。
>それも、implの定義(この場合はhoge.cpp)と同じ場所に、だ。
ってあるんだけど、その意味が分からない。
何でダメなの?
つーかコンパイルは一応通ったんだけど。
0466デフォルトの名無しさん
2009/04/07(火) 20:52:210467デフォルトの名無しさん
2009/04/07(火) 21:05:05まず、「不完全型(名前だけ分かってるけど完全な定義がまだ見えていない型)のポインタのdeleteは危険」
であることを知ってほしい。これはコンパイルは通るけどきちんと動かないことがある。
(その型に自分で定義したデストラクタやoperator deleteがある場合、ちゃんと呼ばれない。)
class CHogeのデストラクタを記述しない場合、コンパイラが勝手に ~CHoge() を作る。
その中でスマートポインタである pimpl のデストラクタが呼ばれ、不完全型であるimplのポインタをdeleteしようとする。
0468デフォルトの名無しさん
2009/04/07(火) 21:13:26たまたまデストラクタもdeleteも定義してなかったからスルーしちゃったのかな
0469デフォルトの名無しさん
2009/04/07(火) 21:53:18ありがとう。
「pimplがスマートポインタであるために特殊なdeleteが必要である。
だがコンパイル時にはpimplが不完全型であるためにその特殊なdeleteを呼び出すコードが作られない。」
ってことか。
となると、今回のケースでは
CHoge::~CHoge(){}
を自分で明示的に記述したとしても、それをhoge.hに書いている限りは解消されないんだよね。
hoge.cppのCHoge::implクラスの定義の後に自分で明示的に記述するならOKってことですかい?
0470デフォルトの名無しさん
2009/04/07(火) 22:00:43前半は違う。スマートポインタであることは本質的な問題ではない。
pimplが単なるポインタであっても、 hoge.h でCHogeの定義の中に
CHoge::~CHoge() { delete pimpl; }
と書いたら、全く同じ問題が生じる。
後半はあってる。とにかく、明示的にであれ暗黙的にであれdeleteが出てくるところでは、
そのdeleteされるものの完全な定義が分かっていなければまずい場合があるということ。
0471469
2009/04/07(火) 22:25:09なるほど。
根本的な問題は「デストラクタが云々」じゃなくて、
「不完全型のポインタのdelete」にあった訳か。
んで、その辺を全部気にせず丸投げしてもいけるのがshared_ptrなのか。
ありがとう。
・・・しかし
>>>468
>未定義動作だからまともなコンパイラなら警告くらい出すはずだけどな
VC++2008で試して見たのだが
>auto_ptrを用いた例ではVC++2008では警告しか吐かれない。
なぜか警告すら出てこなかったなぁ。
0472471
2009/04/07(火) 22:29:09警告でた。
お騒がせしました。
warning C4150: 'CHoge::impl' 型を削除するため delete 演算子が呼び出されましたが、定義がありません。
: 'CHoge::impl' の宣言を確認してください。
0473471
2009/04/07(火) 22:33:37g++でも警告出た。
note: neither the destructor nor the class-specific operator delete will be called,
even if they are declared when the class is defined.
bcc5.5.1では警告でなかった。
0474デフォルトの名無しさん
2009/04/07(火) 23:21:08また、explicitを引数を2つ以上取るコンストラクタに付ける意味はありますか?
0475デフォルトの名無しさん
2009/04/08(水) 00:39:212.付けても害はないのでとりあえずコンストラクタには全部付けるポリシーにして付け忘れを防ぐ
0476デフォルトの名無しさん
2009/04/08(水) 01:14:57implicitを付けさせる仕様にすべき
0477デフォルトの名無しさん
2009/04/08(水) 03:43:39いまさら仕様変更されても困るから、そうなってたらいいな、って話にしかならん。
0479デフォルトの名無しさん
2009/04/08(水) 19:07:19これって自作クラスのoperator=のオーバーロードの定義以外に使い道ある?
0480デフォルトの名無しさん
2009/04/08(水) 19:11:380481デフォルトの名無しさん
2009/04/08(水) 19:24:53例外安全なところ。
0482デフォルトの名無しさん
2009/04/08(水) 19:39:37コピーしないでスワップするだけなら、
参照型の引数で値を戻す場合にも。
void foo(hoge_t& result)
{
hoge_t x;
//xにあれこれ手を加える
swap(x, result);
}
まあ、何も考えなくていいときには、resultを直接いじることもあるけど。
0483デフォルトの名無しさん
2009/04/08(水) 20:12:230485デフォルトの名無しさん
2009/04/08(水) 21:10:57コピーコンストラクタの定義で使っても大丈夫?
0486デフォルトの名無しさん
2009/04/08(水) 21:34:30operatorほにゃららは普通の関数と全く同じように呼び出して可。
0487デフォルトの名無しさん
2009/04/08(水) 21:38:45ドラゴン・スゴイコビッチ!(とてもすごいの意)
用件としては、自作クラスに swap 関数を装備することと、
その swap が例外を投げないようにすること?
0488485
2009/04/08(水) 21:49:40ありがとう。
コピーコンストラクタ(に限らずコンストラクタ一般)から
メンバ関数を呼び出す時、
construct中なのにメンバ関数を呼び出しても
大丈夫なのだろうかと思ったのだ。。。
0489デフォルトの名無しさん
2009/04/08(水) 21:51:32virtualなら気をつけないといかんかもしれんが
そうじゃないなら大概大丈夫
0490デフォルトの名無しさん
2009/04/08(水) 21:54:370491デフォルトの名無しさん
2009/04/08(水) 21:56:15>virtualなら気をつけないといかんかもしれんが
ああ、
基底クラスのconstruct中にvirtualなメンバ関数呼ぶと
その基底クラスでの対応するメンバ関数が呼ばれるってやつね。
ありがとう。
>>490
ありがとう。
0492デフォルトの名無しさん
2009/04/08(水) 22:03:58されたとして、ちゃんと動作するコンパイラが出て来るのはいつだろうか。
・・・うむ、心配だ。
0493デフォルトの名無しさん
2009/04/08(水) 22:35:04まともなコンパイラが出てから考えればいいこと。
早く出てくれないと困る事情でもあるのか?
0494デフォルトの名無しさん
2009/04/08(水) 22:50:26もうすまぽを書くために何リットルのインクを消費したことやら。
(インク?)
0496デフォルトの名無しさん
2009/04/08(水) 23:00:35IntelC++は既にlambda関数がサポートされてるんだけど、IntelC++はコンパイル遅いんでdebugはVCでreleaseはIntelでやってるとlambda関数は使えなくて残念。
boost::lambda使えば済む話ではあるんだけど。
0497492
2009/04/08(水) 23:12:20確認されるまでは使わない方がいいんではないかと思うんだが。
それまではboostのが安心かなぁ。
でも標準に入ってる方が使うのは(気分的に)もっと楽になる事は確か。
0498デフォルトの名無しさん
2009/04/08(水) 23:56:20public: virtual ~A() = 0;
};
class B :public A {};
class C :public B
{
public: ~C(){};
};
gccでundefined reference to B::~B()って怒られるんだけど、Bでd-tor書かないとダメ?
0499デフォルトの名無しさん
2009/04/09(木) 00:13:430500デフォルトの名無しさん
2009/04/09(木) 00:17:10using std::swap;
swap(x,y);
で特殊化したstd::swap<MyClass>が呼び出せるかと思ったのだが、
以下のやり方だとなにか定義がかぶっているようなことを言われてエラーになってしまう。
再現するソースは次のようなもの。
//以下はMyClass.h
class MyClass
{
char *p;
public:
void swap(MyClass &hoge);
MyClass();
~MyClass();
};
//以下はMyClass.cpp
#include <algorithm>
#include "MyClass.h"
MyClass::MyClass():p("pointer"){}
MyClass::~MyClass(){}
void MyClass::swap(MyClass &hoge)
{std::swap(this->p, hoge.p);}
namespace std
{
template<>
void swap(MyClass &lhs,MyClass &rhs)
{lhs.swap(rhs);}
}
0501500
2009/04/09(木) 00:18:28#include <algorithm>
#include "MyClass.h"
int main()
{
MyClass x,y;
using std::swap;
swap(x,y);
return 0;
}
としたら、g++にて
MyClass.cpp:(.text+0x42): multiple definition of `void std::swap<MyClass>(MyClass&, MyClass&)'
main.cpp:(.text$_ZSt4swapI7MyClassEvRT_S2_[void std::swap<MyClass>(MyClass&, MyClass&)]+0x0): first defined here
collect2: ld returned 1 exit status
というエラーが出る。
どうしたらいい??
0502デフォルトの名無しさん
2009/04/09(木) 00:31:28ちょっと俺も確認してくるか。
0503502
2009/04/09(木) 00:33:030504デフォルトの名無しさん
2009/04/09(木) 00:37:36大丈夫だけど、普通operator =ってcopy (construct) and swapで書かない?
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E3%82%B3%E3%83%94%E3%83%BC%E3%81%97%E3%81%A6_swap(Copy-and-swap)
0505デフォルトの名無しさん
2009/04/09(木) 00:58:49std::swapの特殊化はヘッダに書かないと駄目だろう。
main.cppでは特殊化したstd::swapが見えないから標準のstd::swapが実体化され
MyClass.cppで特殊化した物と衝突してるんだろう。
0506デフォルトの名無しさん
2009/04/09(木) 06:57:11そうか。
コピーコンストラクタの定義に代入演算子を使うと定義が循環しちゃうのか。
0507500
2009/04/09(木) 06:58:19なるほど。
std::swapの特殊化をヘッダに書く場合はinline指定しないと、
そのヘッダをインクルードするたびにまたmultiple definitionってなっちゃうかな?
0508デフォルトの名無しさん
2009/04/09(木) 08:13:54いや、そういう話じゃない。
0509500
2009/04/09(木) 08:22:57(1)main.cppでは特殊化した定義がその前になされていないから通常通り実体化。
(2)MyClass.cppでも特殊化した。
この(1)と(2)でmultiple definitionってことか。
つーことで
MyClass.hにstd::swapの特殊化を書く(1)
main.cppでMyClass.hをインクルード
ってこと?
0510508
2009/04/09(木) 08:24:06あ、ヘッダに書かないといけないのは理解してるのか。ごめん
テンプレートの定義は inline じゃなくてもいいよ。 >500 の場合は inline が
適切だと思うけど。
0511デフォルトの名無しさん
2009/04/09(木) 08:25:44inline にならないといけなくなるな。
0512インドリ
2009/04/09(木) 10:05:14http://d.hatena.ne.jp/faith_and_brave/20090408
0513デフォルトの名無しさん
2009/04/09(木) 10:18:24広告ウゼェ
http://info.2ch.net/kiyaku.html
> ・投稿者は、話題と無関係な広告の投稿に関して、相応の費用を支払うことを承諾します
0514デフォルトの名無しさん
2009/04/09(木) 10:19:490515デフォルトの名無しさん
2009/04/09(木) 10:20:300516デフォルトの名無しさん
2009/04/09(木) 12:23:10粘着の意味わかってんの?
0517デフォルトの名無しさん
2009/04/09(木) 14:28:380518デフォルトの名無しさん
2009/04/09(木) 14:48:040519デフォルトの名無しさん
2009/04/09(木) 14:51:01OS;XP
0520デフォルトの名無しさん
2009/04/09(木) 15:00:29Turbo C++(C++ Builderの無料版 機能が削られていて少し古い)
Qt Creater(マルチプラットフォームのソフトが作れる コンパイルが遅い)
0521デフォルトの名無しさん
2009/04/09(木) 15:08:24turbo c++でGUIって開発できるの??
0522デフォルトの名無しさん
2009/04/09(木) 15:52:240523500
2009/04/09(木) 22:50:09そういえば関数テンプレートの定義は
ヘッダに書くけど、それは普通の関数の類推で
inlineじゃなきゃいけないなんて考えちゃだめなんだったな。
Effective C++に書いてあったような気がしてきた。。。
ありがとうお二方。
0524デフォルトの名無しさん
2009/04/09(木) 22:53:28っていうC++の仕様について学べるサイトを教えてください。
巻頭言 2000〜
http://park1.wakwak.com/~y-nagano/200001.html
一応ググったらこんなのがヒットしましたが、これ以外にも何かオススメをご存じであればお願いします。
0525デフォルトの名無しさん
2009/04/09(木) 23:10:23軽いに越したことはないずら
0526デフォルトの名無しさん
2009/04/09(木) 23:12:13って書こうとしたが、errnoとか気にしている?
0527デフォルトの名無しさん
2009/04/10(金) 00:16:23うーん、じゃあ他のところで変な風になってたのかにゃ・・・?
ありがとうござんした
0528デフォルトの名無しさん
2009/04/10(金) 02:35:260529デフォルトの名無しさん
2009/04/10(金) 08:30:050530デフォルトの名無しさん
2009/04/10(金) 11:55:32errnoはグローバル変数なので、
errno = 0;
std::pow(x, y);
if (errno != 0) { /* 失敗 */ }
みたいなコードを書いたときに、powとifの間で他のスレッドによってerrnoが変更されてしまう可能性がある
だから、errnoを気にするとpowとかはスレッドセーフじゃなくなる
たいていのコンパイラにはerrnoをTLSに置いてスャ激bドセーフにbキるオプションbニかがあるけどbヒ
0531デフォルャgの名無しさん
2009/04/10(金) 15:48:350532デフォルトの名無しさん
2009/04/10(金) 17:30:34いやTrue Love Storyです。
じゃなくてThread Local Storageです。
0533デフォルトの名無しさん
2009/04/10(金) 18:05:46手紙書くね たまに会えるよね
なんでかな 寂しいのに
寂しいよと 言えなかった
0534デフォルトの名無しさん
2009/04/10(金) 19:06:460535デフォルトの名無しさん
2009/04/10(金) 21:10:400536デフォルトの名無しさん
2009/04/10(金) 22:17:52よく分からんがerrornoへの代入って規格的に許されてたっけ?
0537デフォルトの名無しさん
2009/04/10(金) 22:27:300538デフォルトの名無しさん
2009/04/10(金) 22:32:320539デフォルトの名無しさん
2009/04/10(金) 23:13:490540デフォルトの名無しさん
2009/04/11(土) 00:09:13君の中ではその変数は1つだけ存在すれば十分だよね。
俺達他人に迷惑書けて欲しくないから、君の実装から外には出さないで欲しいなぁ。
ってことでeroeroは自動的に0に初期化されてます。
0541デフォルトの名無しさん
2009/04/11(土) 00:15:470542デフォルトの名無しさん
2009/04/11(土) 00:39:57static変数ってことか。
0543デフォルトの名無しさん
2009/04/11(土) 01:22:23大丈夫です
C99(ISO/IEC 9899:1999)の7.5の脚注170に「むしろそうするべき」って書いてある(C++の規格には「Cの規格を見てね」って書いてある)
0544デフォルトの名無しさん
2009/04/11(土) 21:07:03C++の書籍(他の言語は知らんけど)って正誤表無いor乏しいの多くない?
『Exceptional C++』を買ったんだけど、1ページ目から
誤植と思われる物があって困る。。。
だれか正誤表作ってくれている人とかコミュニティとか無い??
0545デフォルトの名無しさん
2009/04/11(土) 21:34:26std::string foo();
って書いたら、
std::string型を返す、引数のない、fooという名前の関数の宣言になるの?
それとも
std::string型のfooという変数の宣言とデフォルトコンストラクタ呼び出しになるの?
0546デフォルトの名無しさん
2009/04/11(土) 21:35:50前者
C++は関数の宣言が優先
0547デフォルトの名無しさん
2009/04/11(土) 21:37:26なるほど。
ありがとう。
0548デフォルトの名無しさん
2009/04/11(土) 23:09:01ローカルでも関数の宣言は出来るからね。
0549デフォルトの名無しさん
2009/04/11(土) 23:16:46強制的に変数の宣言とデフォルトコンストラクタと見なさせるには
std::string (foo());
と書けばよかったような
間違ってたらすまん
0550デフォルトの名無しさん
2009/04/11(土) 23:27:27カッコつけても関数宣言と見なされる
std::string foo("");
と何でもいいからパラメータ付けるしかないな
0551デフォルトの名無しさん
2009/04/11(土) 23:47:13ぐぐれよかす
ttp://www.gotw.ca/publications/xc++-errata.htm
ttp://www.informit.com/content/images/0201615622/errata%5Cxcerrata.pdf
0552デフォルトの名無しさん
2009/04/11(土) 23:49:150553544
2009/04/11(土) 23:51:04いや、日本語でググったりピアソンエデュケーション社の
Webページで検索してみたりしたんだが英語は見落としていた。
ありがとう、恩に着る。
0555デフォルトの名無しさん
2009/04/11(土) 23:57:37いや、カッコつけなければいいだけ。
0556デフォルトの名無しさん
2009/04/12(日) 00:31:48じゃなくてstd::stringのコンストラクタ呼び出したいんだけど
0557555とは別人
2009/04/12(日) 00:35:04だから括弧つけなければいいなじゃないの?
std::string foo;
これでデフォルトコンストラクタ呼び出しになるでしょ?
0558デフォルトの名無しさん
2009/04/12(日) 00:36:12デフォルトじゃないなら引き数書くのは当たり前だろ。
0559デフォルトの名無しさん
2009/04/12(日) 00:46:26未来指向なプログラムの話か?
0560まとめ
2009/04/12(日) 00:53:221.
std::string str="hogehoge";
ならstrの宣言&"hogehoge"を引数にとるコンストラクタの呼び出しとなる。
2.
std::string str("hogehoge");
って書いてもstrの宣言&"hogehoge"を引数にとるコンストラクタの呼び出しとなる。
3.
std::string str(const char* arg);
ならstd::string型を返し、const char*を引数にとる関数strの宣言となる。
これを引数なしverにすると
1'.
std::string str;
ならstrの宣言&デフォルトコンストラクタの呼び出しとなる。
2'&3'.
std::string str();
ならstd::string型を返し、引数のない関数strの宣言となる。
ってことだよね。
たぶんこのスレのみんなは分かっているけどレスが言葉足らずでカオスになっているだけかと。
0561デフォルトの名無しさん
2009/04/12(日) 01:17:31もし、本当に「デフォルトコンストラクタを呼び出したいだけ(変数は用意したくない)」なら
std::string();
と書けば呼べるだろうね。
もちろん、ソース上には現れない一時変数が用意されるだけだけど。
普通に「デフォルトコンストラクタで初期化される変数を用意したい」ならば
皆が書いているように
std::string str;
とすれば良いだけ。
0562デフォルトの名無しさん
2009/04/12(日) 15:26:49やるとしたらスパゲッティにならないで使える人なんだろうけど。
0563デフォルトの名無しさん
2009/04/12(日) 15:59:100564デフォルトの名無しさん
2009/04/12(日) 16:16:020565562
2009/04/12(日) 16:26:45別の方法としてわざと例外をthrowしてるヤツがいたけど
それよりはマシか。
変なフラグ変数用意するくらいならgotoのがいいのだろうか?
0566デフォルトの名無しさん
2009/04/12(日) 16:28:22プログラムの見通しが悪くなる
0567562
2009/04/12(日) 16:31:09ですよねー。
俺もそう思うよ。
サンプルソースならともかく
flagとかhogeっていうフラグ変数を
用意しているヤツを見ると
もう頭痛がしてくる。
0568デフォルトの名無しさん
2009/04/12(日) 16:35:57例えば基底クラスでpolymorphicな使い方を想定しているとして。
以下public指定なものだけを書く。
class 〜〜{
1.コンストラクタをずらずらと。
2.virtual デストラクタ。
3.swap()メンバ関数
4.これら以外の普通のdo_something()メンバ関数をずらずらと。
5.operator=
6.operator+
7.以下必要ならoperator云々
};
ってな感じにすれば良い?
今ひとつ経験不足でどんな感じが良いのかわからんのだ。
0569568
2009/04/12(日) 16:36:50ってまあ要するに基底クラスのポインタに派生クラスのポインタを変換して使うつもりって言いたい。
0570デフォルトの名無しさん
2009/04/12(日) 16:37:32その部分をカプソー化してれつるんで抜ける方が
スマートな気もするよね。
0571デフォルトの名無しさん
2009/04/12(日) 16:38:34れつるん
って南蛇井?
0573デフォルトの名無しさん
2009/04/12(日) 16:41:17下手するとgotoなんかよりずっとスパゲッティーになるな
フラグ変数が2つ出てきたり、状態が3つとかあったりすると死ねる
0574デフォルトの名無しさん
2009/04/12(日) 16:44:14やっぱ2重程度ならともかくそれ以上多重にネストしているあたりから
おかしくなり始めていると考えた方が良いのかなぁ。
0575デフォルトの名無しさん
2009/04/12(日) 20:26:39一切使うな的なことを初めのころ本で呼んで、
それ以来、可能な限り使わない方法を考えてる。
フラグを使わない方法を考えるだけで1日潰すなんてザラ。
でも、実際仕事を始めたら、普通にみんな使ってるし、
大体、DB自体がフラグのカラムでいっぱいだし、
そうなるとコード側でもフラグを操作しないとダメになる。
何が言いたいかっつーと、
フラグを使いまくってる職場のプログラム設計がおかしいのか、
フラグ排除主義の過激派が悪いのか、真理を教えてくれ
0576デフォルトの名無しさん
2009/04/12(日) 20:36:26>>567は逆に考えれば、明快な名前を持つフラグ変数ならマシってことでもある。
0577デフォルトの名無しさん
2009/04/12(日) 21:07:24単純なクラス構造に落とせると思うっス 使い捨てクラスが増殖するけど
後の状態変数の把握のし易さは別次元。
0578デフォルトの名無しさん
2009/04/12(日) 21:53:11そして、ダメだとわかったときにはリファクタリングする勇気。
でも、できればフラグやgotoは減らしていきたい。
0579デフォルトの名無しさん
2009/04/12(日) 21:58:37男ならsetjmp/longjmpだろ
と行きたいところだがある意味>>565で既出だった
0580デフォルトの名無しさん
2009/04/12(日) 22:02:40「ノォ!」
なので、gotoは使っちゃいけないと思うな。
(おっさん限定ネタ)
0581デフォルトの名無しさん
2009/04/12(日) 22:07:050582デフォルトの名無しさん
2009/04/12(日) 22:10:20「goto使用を避けるためにフラグを使う」というのが最悪、ってことだろ。
もちろんフラグなんて可能な限り使わないほうが良いが、避けられないケースはある。
また、よく言われるループ内のswitchからの脱出の話題で
「switch使うな、classにしろ」という論も
猫も杓子もそうしろと言い出すのはナンセンスとしか言い様が無い。
「return使え」も同様。
要は、臨機応変に適材適所で手元にある道具を使え、ってことだ。
0583デフォルトの名無しさん
2009/04/12(日) 22:20:54殆ど登場しないから、個人的には goto は要らないな。
STL やファンクタも併用すれば、ループそのものの登場機会が減るし。
0584デフォルトの名無しさん
2009/04/12(日) 22:22:10すばらしい。
理性的な人がそろっているな。
0585デフォルトの名無しさん
2009/04/12(日) 22:33:130586デフォルトの名無しさん
2009/04/12(日) 22:35:43著書の中で毒舌はきまくりだよ。
0587デフォルトの名無しさん
2009/04/12(日) 22:45:51BreakがTwoLevelsかどうかはcatch節によるんで、その名前はあんまりです。
0588デフォルトの名無しさん
2009/04/12(日) 23:09:040589デフォルトの名無しさん
2009/04/12(日) 23:12:42大局的にはフラグ専用の変数を用意してあちこちで状態を変更しまくってると
・フラグの状態を変更すべき処理を追加・変更したのにフラグの変更処理を忘れる
・フラグの今の状態がどこで変更された結果なのかがわからなくて状態の信頼性に欠ける
とかの問題がでやすくなるから気をつけろってことだろ。
0590デフォルトの名無しさん
2009/04/12(日) 23:21:330591デフォルトの名無しさん
2009/04/12(日) 23:31:53throw "hoge_loop"_break;
とか。
0592デフォルトの名無しさん
2009/04/12(日) 23:51:00それを実装ごと丸々ヘッダhoge.hに書きました。
特にinline指定はしなかったのですが、
そのhoge.hをインクルードするソースファイル.cppが複数あるにもかかわらず
g++で問題無くコンパイル・リンク・実行できました。
普通の関数だったらmultiple definitionとか言われるはずだと思うのですが、
static関数なら大丈夫だったりするのでしょうか?
0593デフォルトの名無しさん
2009/04/13(月) 00:04:180594デフォルトの名無しさん
2009/04/13(月) 01:33:22そう言われると、なんだか最近まったり進行している気がしてくる。
0595デフォルトの名無しさん
2009/04/13(月) 02:47:58(メンバ関数でない)static関数とはまさにそういうものだろ。
0596デフォルトの名無しさん
2009/04/13(月) 05:50:11毒舌っていうのは理性と知性によって導き出されるものだよ。
馬鹿な人間が感情のままに吐くのは、面白味も攻撃力も無い単なる罵倒。
0597デフォルトの名無しさん
2009/04/13(月) 15:16:18まぁ、すてきな毒舌なこと。
0598デフォルトの名無しさん
2009/04/13(月) 15:51:35>馬鹿な人間が
自虐?
0599デフォルトの名無しさん
2009/04/13(月) 16:04:21メイヤーズやサッターが理性的でないと言いたいのか、
それとも「毒舌というのが知性や理性の欠如から出るものなんだ」と主張したいのか、
それとも普段の自分が否定されたみたいで悔しいのか。
0600デフォルトの名無しさん
2009/04/13(月) 16:19:14いや、マジで
0601デフォルトの名無しさん
2009/04/13(月) 16:23:39かみつくという認識もないくらい、ただの脊髄反射煽りだから気にすんな。
0602デフォルトの名無しさん
2009/04/13(月) 16:24:42そうやって煽り返すから荒れるんだよ
もう少し自重しようよ
0603デフォルトの名無しさん
2009/04/13(月) 17:02:390604デフォルトの名無しさん
2009/04/13(月) 17:21:35面白味も攻撃力も無い単なる罵倒。
0605デフォルトの名無しさん
2009/04/13(月) 17:40:100606デフォルトの名無しさん
2009/04/13(月) 18:21:38素数の型の要素を持つa列b行の2次元配列を定義したいのですが、
------
#include <iostream>
#include <complex>
using namespace std;
void main(){
int a,b;
complex<double> c[][];
cin >> a;
cin >> b;
complex<double> *c = new int[a][b];
------
これでエラーが多発してしまいます。
配列の定義に問題があれば教えていただけないでしょうか。
0607デフォルトの名無しさん
2009/04/13(月) 18:25:000608デフォルトの名無しさん
2009/04/13(月) 18:27:27型が違うからね。
>>607 の方法が一番素直なやり方と思う。
0609デフォルトの名無しさん
2009/04/13(月) 18:28:31○(b)
0610デフォルトの名無しさん
2009/04/13(月) 18:29:35アクセスは c[1][2] のように書ける
0611デフォルトの名無しさん
2009/04/13(月) 18:51:410612デフォルトの名無しさん
2009/04/13(月) 22:26:09template<class T> class Parent {
void Umu() { Child* p = new Child; p->Method() }
};
file 2
template< class T > class Child {
void Umaseru() { m_pParent->Umu(); }
}
テンプレの場合、実装部分をcppに退避する事ができないので、
上記のような相互参照するクラスのテンプレートって実装できないのでしょうか?
0613デフォルトの名無しさん
2009/04/13(月) 22:29:150614デフォルトの名無しさん
2009/04/13(月) 22:46:200615デフォルトの名無しさん
2009/04/13(月) 23:03:590616デフォルトの名無しさん
2009/04/14(火) 07:26:030617デフォルトの名無しさん
2009/04/14(火) 09:59:34void Umu();
};
template< class T > class Child {
void Umaseru() { m_pParent->Umu(); }
}
template<class T>
void Parent::Umu() { Child<T>* p = new Child<T>; p->Method() }
0618デフォルトの名無しさん
2009/04/16(木) 06:30:03--------------------------------
class Base
{
// 省略
virtual size_t getSize() const { return sizeof(*this); }
};
class Derived : public Base
{
// 省略
};
int main()
{
Derived d;
d.getSize();
--------------------------------
d.getSize()の値がBaseなのですが、自分が期待していたのはDerivedのサイズの取得です。
DerivedではgetSize()を定義せず、
Derivedのサイズを返すメンバ関数をBaseで定義することはできるでしょうか?
何か良い方法があれば教えていただきたいです。
0619デフォルトの名無しさん
2009/04/16(木) 06:57:06もし、Derivedにprivateなメンバ関数を追加することが許されるのであれば、
BaseとDerivedに、それぞれsizeof(Base)とsizeof(Derived)を返すprivateでvirtualなメンバ関数を追加する。
で、Base::getSize() からはそれを呼び出すようにする。
原則としてsizeofの値はコンパイル時に決まるのであり、実行時の型で決まるものではないことに注意。
(C99の可変長配列は例外となる。)
0620デフォルトの名無しさん
2009/04/16(木) 08:53:01早速の返答ありがとうございます。
なるほどサイズは動的に決まるわけではないんですね。
そもそもこんな事をしたくなる設計がよくないんでしょうかね…
0621デフォルトの名無しさん
2009/04/16(木) 10:19:50現在の読み込み位置のアドレスを知る方法はないのでしょうか?
operator>>で読み込むたびにカウントするしかないのでしょうか?
0622デフォルトの名無しさん
2009/04/16(木) 11:18:42tellg()
0623デフォルトの名無しさん
2009/04/16(木) 12:05:180624デフォルトの名無しさん
2009/04/16(木) 13:02:25もしよければ、なんでサイズを取得する必要があるのかを教えてくれないか。
今までそういう場面に遭遇したことがない。
インスタンスの正体を調べたいなら、getClassのインプリメントなりdynamic_caseで済むと思うが・・・
0625592
2009/04/16(木) 13:48:03>>595
ありがとうございます。
どうやら私のstatic関数への理解がおかしいみたいなので、
勉強してきます。
なんか同じstaticという予約語を使っていながら、
使い方しだいでだいぶ意味が違う気がするんですが・・・。
0626デフォルトの名無しさん
2009/04/16(木) 17:28:05> なんか同じstaticという予約語を使っていながら、
> 使い方しだいでだいぶ意味が違う気がするんですが・・・。
いかにもそのとおり。
それが嫌なので、C++ではグローバルでstaticなものを宣言する代わりに、無名名前空間が推奨されている。
0627621
2009/04/16(木) 19:05:12ありがとうございます
おかげさまで tellg, tellp, seekp, seekg 等を知ることができ
無事プログラムを動かすことができました
0628デフォルトの名無しさん
2009/04/16(木) 21:08:54stringstreramではtellp!=tellg、seekp!=seekgなのに
この事に気づくのに手間取ってしまった
0629デフォルトの名無しさん
2009/04/16(木) 22:30:060630デフォルトの名無しさん
2009/04/16(木) 22:40:31ある
普通に使える
が、tellpはtellgと同じ意味になるし、seekpはseekgと同じ意味になる
やってみそ
0631デフォルトの名無しさん
2009/04/16(木) 22:44:140633デフォルトの名無しさん
2009/04/16(木) 22:58:26悪い
fstreamでなくてifstreamだったか
酔ってるスマソ
0634デフォルトの名無しさん
2009/04/17(金) 00:17:13g++ hoge.cpp piyo.cpp
みたいな感じで使えて、
標準準拠性も良くて、無料な
コンパイラ(リンカ付き)ってありませんか?
g++を使っていて、エラーメッセージがイミフな時に別のコンパイラで試すのに使いたいんです。
VC++だとコマンドから使えないですよね?
0635デフォルトの名無しさん
2009/04/17(金) 00:18:420636デフォルトの名無しさん
2009/04/17(金) 00:22:43まぢすか。
VC++が使えれば文句ありません。
もう一度調べ直してきます。
0637デフォルトの名無しさん
2009/04/17(金) 05:27:190638デフォルトの名無しさん
2009/04/17(金) 06:39:15巷で言われているメモリプール化というのをしようとしてるんですけど
概念として教えてもらいたいものがあります。
ヒープ領域とは全体の確保されたメモリ
チャンク領域とはこれから使う為にヒープ領域から必要なだけ小出しに取ってきたメモリ
って感じでいいんでしょうか?
プールとは?チャンクと同じような概念でよろしいでしょうか?
0639デフォルトの名無しさん
2009/04/17(金) 07:06:21プール=確保したもの、プール金とかのプールと意味は同じ。予めシステムから借りておく。
お金が必要なたびにいちいちATMに逝くのではなく、必要になる前に家に現金を置いておくイメージ。
チャンク=こまぎれ。
数バイト毎とかでチマチマ確保すると効率が悪いので、大きな単位で確保する。
必要な額だけをATMからおろすのではなく、必要な額を10万円単位で切り上げておろす、みたいなイメージ。
1万円必要になったら10万円おろし、
11万必要になったら20万円おろす。
0640デフォルトの名無しさん
2009/04/17(金) 08:00:39初期に読まされると余計混乱すると思うよ。
0641デフォルトの名無しさん
2009/04/17(金) 08:03:11>>638
「Effective C++」に確か、実例つきで説明があったはずだから、
それを読んでみるといいんじゃないかな。
0642デフォルトの名無しさん
2009/04/17(金) 10:10:02これは規約上予約されている?
例えば自分で
numeric_t
とかしちゃだめ?
0643デフォルトの名無しさん
2009/04/17(金) 10:33:180644デフォルトの名無しさん
2009/04/17(金) 10:52:01ありがとう。
MY__M__A__C__R__O
とか予約されてるじゃん。これと同じ感じで予約されてたらやだなと思ったのだ。
0645デフォルトの名無しさん
2009/04/17(金) 12:03:25なんだ俺の知らない世界の話か
Cのプリプロに名前を教え込むのは極力避けたい
0646デフォルトの名無しさん
2009/04/17(金) 12:50:47_tamura はグローバルでは予約されてるから使えない。
__tamura はどこでも予約されてるから使えない。
0647デフォルトの名無しさん
2009/04/17(金) 12:53:10namespace {
typedef int _INT;
}
int main() {}
std::でもグローバルでもないならおk?
0648デフォルトの名無しさん
2009/04/17(金) 12:58:46_INT みたいにアンダースコア〜英大文字で始まる名前は
ダブルアンダースコアを含む名前と同じくどこでも予約。ダメ。
0649デフォルトの名無しさん
2009/04/17(金) 13:04:41_が二連続した名前は予約済みなんだよ。
0650デフォルトの名無しさん
2009/04/17(金) 13:04:42# おk?
0651デフォルトの名無しさん
2009/04/17(金) 13:07:51ttp://msdn.microsoft.com/ja-jp/library/cc440188(VS.71).aspx
ここの
予約名の形式
ってところに書いてあるね。
0652デフォルトの名無しさん
2009/04/17(金) 13:12:26_hoge も __fuga もうちのコンパイラは全然大丈夫だよ。
0653デフォルトの名無しさん
2009/04/17(金) 13:14:29アンダースコア〜英小文字で始まる名前はグローバルで予約されてる。
処理系がグローバルに _iNT って名前を置いてたら曖昧になっちゃうから、
すぐに未定義動作とは言えなくてもやっぱりダメだろう。
早い話、そもそもアンダースコア始まりの名前なんか使わなきゃいい。
0654デフォルトの名無しさん
2009/04/17(金) 13:17:02予約されてるかどうかが問題なんだよ。
今大丈夫でも、コンパイラを変えたりコンパイラのバージョンやコンパイルオプションを
変えたりしただけでエラーになるコードじゃ困るだろう。
0655デフォルトの名無しさん
2009/04/17(金) 13:20:52すべての識別子において、
ファイルスコープを持つ ならば グローバルスコープを持つ
ということ??
0656655
2009/04/17(金) 13:24:200657デフォルトの名無しさん
2009/04/17(金) 13:36:11なるほど!
>>641
あー、よく聞く本です。ちょっと探してこようかな…
0658デフォルトの名無しさん
2009/04/17(金) 22:21:47(見やすさとか保守性とかは考えないとしてC++の規格上)
a と b が int 型の時、
以下の表現は問題無いでしょうか?
『 b ? a=b : a++; 』
? : よりも = の方が優先順位は低いのですが、
? と : は2個セットの演算子なので、
(b ? a) = (b : a++);
このように別々になることができず
b ? (a=b) : a++;
の解釈しか出来ないはずで、
VCでも正常にコンパイル出来、ちゃんと動作します。
0659デフォルトの名無しさん
2009/04/17(金) 22:30:15うん、大丈夫。
文法上、「論理和式 ? 式 : 代入式」となっているので問題ない。
そう、ついでに言えば、?と:の間に?:を入れ子にもできてしまうということも導かれる。
0660デフォルトの名無しさん
2009/04/17(金) 23:25:55ありがとうございます
0661デフォルトの名無しさん
2009/04/17(金) 23:54:12以下のようなものはdoubleからintへの暗黙の型変換は行われないのでしょうか?
私の環境ではコンパイルエラーになってしまいます。
int a[1.0];
int b = 1%1.0;
int c = 1&1.0;
enum{d=1.0};
暗黙の型変換が行われない例は他にありますでしょうか?
0662デフォルトの名無しさん
2009/04/18(土) 00:25:24基本的に情報落ちが発生する方へは暗黙で変換できない。
0663デフォルトの名無しさん
2009/04/18(土) 00:28:31VC9だと、
int i = 1 * 0.8;
は warning 扱いになる。(int)で黙る。
0664デフォルトの名無しさん
2009/04/18(土) 00:30:25算術式での格上げとか暗黙の型変換とか
0665おもち
2009/04/18(土) 00:39:160666デフォルトの名無しさん
2009/04/18(土) 00:41:43死ね
0667デフォルトの名無しさん
2009/04/18(土) 00:44:18久しぶりに激しくワラタwwwwwwwwwwww
・・・俺も寂しいな
>>665
感覚を養うために難しい本じゃなくまず
センスオブプログラミングみたいな素養本を読め
言語本は辞典代わりで十分
0668デフォルトの名無しさん
2009/04/18(土) 00:47:52大概の入門書はCを知っていることを前提に書かれているからなぁ。
ところで、大昔javaが出たての頃に読んだ入門書は
C++を知っていること前提みたいな内容だった。
どこでもかしこでもC++との比較が載っていて、
そんなのが全体の1/4くらいを占めていた。
何も知らないで使えるのはBASICとかRubyとかそのへんかな。
0669デフォルトの名無しさん
2009/04/18(土) 00:56:59別の知識がいるけど、基本は因数分解と展開(四則演算より単純な算術)なんで
人によっては普通の言語よりわかりやすいのかもしれない
ついでにC++は普通の言語と関数型言語の難しいところだけを集めたような言語だと思ってる
0670デフォルトの名無しさん
2009/04/18(土) 01:11:160671デフォルトの名無しさん
2009/04/18(土) 02:00:40関数の引数やコンストラクタはdoubleからintに暗黙的型変換が行われますよね?
int f(int a){ return 0 };
f(1.0);
int a = 1.0;
とかは大丈夫なはず。
これが大丈夫で、>>661 がダメだというのは、
規格書のどの辺に書かれているのですか?
もしわかれば教えていただけないでしょうか。
0672デフォルトの名無しさん
2009/04/18(土) 02:06:180673デフォルトの名無しさん
2009/04/18(土) 02:15:35> int b = 1%1.0;
がdoubleに余剰演算かけようとしてエラーになってるんじゃないの?
式の中での暗黙の型変換なんだから1の方がdoubleに変換されて
> int b = 1.0%1.0;
になると思うんだが。
>>671
それは代入時の暗黙の型変換なんだから左辺側に変換される。
0674デフォルトの名無しさん
2009/04/18(土) 08:12:20たとえば関数なら、
int a(int x,int y);
int a(double x,double y);
int b(int x,int y);
が定義されてたら、
a(1,1.0) は汎整数昇格の方が優先される為、
a(1.0,1.0) となりますが、
b(1,1.0) は b(1.0,1.0) の定義がないので
b(1,1) と変換されると思います。
%演算子の場合も同じように、1.0%1.0の定義が無いため
同じように1%1と型変換されたりしないのでしょうか?
あと、
int a[1.0];
enum{d=1.0};
これはNGですか?
0675デフォルトの名無しさん
2009/04/18(土) 10:33:21> 5.6/2
>The operands of * and / shall have arithmetic or enumeration type;
>the operands of % shall have integral or enumeration type. The usual
>arithmetic conversions are performed on the operands and determine
>the type of the result.
usual arithmetic conversion は 5/9 で規定されていて幅が広がる方向の
変換しか規定されていない。
>664 や >673 の言っている通り、どういう時にどういう変換がかかるかは一つじゃない。
0676デフォルトの名無しさん
2009/04/18(土) 10:46:32> int a[1.0];
> enum{d=1.0};
> これはNGですか?
integral constant expression ではないので NG。
論拠は7.2/1、8.3.4/1、5.19/1。
0677デフォルトの名無しさん
2009/04/18(土) 10:50:16ネット上で閲覧できるもの?
0678デフォルトの名無しさん
2009/04/18(土) 11:02:450679デフォルトの名無しさん
2009/04/18(土) 11:05:070680デフォルトの名無しさん
2009/04/18(土) 11:21:060681デフォルトの名無しさん
2009/04/18(土) 11:29:250682デフォルトの名無しさん
2009/04/18(土) 11:41:500683デフォルトの名無しさん
2009/04/18(土) 11:45:030684デフォルトの名無しさん
2009/04/18(土) 12:11:490685デフォルトの名無しさん
2009/04/18(土) 12:24:34この程度もぐぐれないのならネットやるなよ
0686デフォルトの名無しさん
2009/04/18(土) 12:33:52ありがとうございました。
書かれている場所まで記述していただいて
非常に参考になりました。
0687デフォルトの名無しさん
2009/04/18(土) 13:04:100688デフォルトの名無しさん
2009/04/18(土) 13:14:09ありません
購入しましょう
0689デフォルトの名無しさん
2009/04/18(土) 13:20:08日本語訳がJISのサイトで閲覧できる。
0690デフォルトの名無しさん
2009/04/18(土) 13:21:070691デフォルトの名無しさん
2009/04/18(土) 13:24:060692デフォルトの名無しさん
2009/04/18(土) 13:26:450693デフォルトの名無しさん
2009/04/18(土) 13:31:230694デフォルトの名無しさん
2009/04/18(土) 13:33:58この程度もぐぐれないのならネットやるなよ
0695デフォルトの名無しさん
2009/04/18(土) 13:34:11この程度もぐぐれないのならネットやるなよ
0696デフォルトの名無しさん
2009/04/18(土) 13:35:31お前を育てた奴は人間社会では、かなりレベルの低いバカだったんだな。
育てられたお前がかわいそうとか思わない。大人になって苦労するのはてめぇ。
いつか死ぬから、バカな存在として一生を無駄に過ごしなさい。
0697デフォルトの名無しさん
2009/04/18(土) 13:37:020698デフォルトの名無しさん
2009/04/18(土) 13:39:060699デフォルトの名無しさん
2009/04/18(土) 13:40:32お前らの怠慢を質問者になすりつけるな。
0700デフォルトの名無しさん
2009/04/18(土) 13:40:380701デフォルトの名無しさん
2009/04/18(土) 13:44:370702デフォルトの名無しさん
2009/04/18(土) 13:51:040703デフォルトの名無しさん
2009/04/18(土) 13:58:130704デフォルトの名無しさん
2009/04/18(土) 14:01:12データも渡したいんですが、関数オブジェクトが使えないので困っています。
データをグローバル変数にするしか方法はないのでしょうか?
0705デフォルトの名無しさん
2009/04/18(土) 14:03:140706デフォルトの名無しさん
2009/04/18(土) 14:14:28http://www.jisc.go.jp/app/JPS/JPSO0020.html
へ行ってX3014で検索してこい。章番号は変わらないはずだから。
ISOもANSIもJISも売り物なので、ちゃんとした物は金を払わなければ見られない。
ダウンロード販売のURLも貼ろうか?
0707デフォルトの名無しさん
2009/04/18(土) 14:14:42そいつが引数としてコールバックに渡される仕様になってるはずだが
そうでないならあきらめな
0708デフォルトの名無しさん
2009/04/18(土) 14:18:02ちゃんとした物とちゃんとしてない物は何が違うの?
0709デフォルトの名無しさん
2009/04/18(土) 14:23:52ちゃんとしていない物=非合法なコピー品。
提供した者の手が後ろに回る可能性がある。
あと、JISの規格書なんかは閲覧は出来てもダウンロードしてオフラインで見ることは出来ない。
0710デフォルトの名無しさん
2009/04/18(土) 14:26:02ちゃんとしていない物=非合法なコピー品が何故公式ページからリンクされてるの?
0711デフォルトの名無しさん
2009/04/18(土) 14:30:52ISOのストアで販売しているものをISOが別のページでタダで配るわけないだろ。
0712デフォルトの名無しさん
2009/04/18(土) 14:35:48誰に言ってるの?
0714デフォルトの名無しさん
2009/04/18(土) 14:38:40ありました。
thxでした。
0715デフォルトの名無しさん
2009/04/18(土) 14:42:56http://www.jisc.go.jp/app/pager?id=4555
から
javascript:openPDF('X3014,01');
でPDFが開く。
0716デフォルトの名無しさん
2009/04/18(土) 15:02:24あ、公式っていうのはISOではなくJISのこと?
それはタダで見られる数少ない合法的なものだよ。
(ちなみにそのURLは検索結果のものだから他の人には見えないよ)
>>709の文章の書き方が悪いって言う話?
ちゃんとしていないものの例=非合法なコピー品
と書くべきだったかな?
0717デフォルトの名無しさん
2009/04/18(土) 15:04:58初めからそう書けよ
0718デフォルトの名無しさん
2009/04/18(土) 15:05:440719デフォルトの名無しさん
2009/04/18(土) 15:08:12>>708が言ってるのは、
>タダで見られる数少ない合法的なもの
と
>金を払わなければ見られないもの
の違いを教えて、ってことだと思うよ。
0720デフォルトの名無しさん
2009/04/18(土) 15:11:32おい。
0721デフォルトの名無しさん
2009/04/18(土) 15:12:14まったり進行していた時代はどこへ行った!
大人は黙ってまとめてあぼんだな。
0722デフォルトの名無しさん
2009/04/18(土) 15:13:200723デフォルトの名無しさん
2009/04/18(土) 16:45:31とかあったとするじゃん。
この前のC++における型名や修飾子の順番ってどう規定されている?
どんな順番が望ましいとか、どこまで好き勝手並べて良いとか。。。
0724デフォルトの名無しさん
2009/04/18(土) 16:54:590725デフォルトの名無しさん
2009/04/18(土) 17:08:54日本語おかしかったか。
static const volatile int x=42;
とかあったとするじゃん。
このように変数名の前につけるような
型名や修飾子の順番ってC++においてどう規定されている?
どんな順番が望ましいとか、どこまで好き勝手並べて良いとか。。。
0726デフォルトの名無しさん
2009/04/18(土) 17:25:350727デフォルトの名無しさん
2009/04/18(土) 17:28:18ハードウェアが書き込み,プロセッサが読み出す領域: const volatile
ハードウェアが書き込み,プロセッサが読み書きする領域: volatile
プロセッサが書き込み,ハードウェアが読み出す領域: volatile
っていうのを見つけた。
[C,C++] const と volatile - bnez の日記
ttp://slashdot.jp/~bnez/journal/281985
0728デフォルトの名無しさん
2009/04/18(土) 17:41:23別に決まりはないけど、まあみんな常識で考えて
記憶クラス指定子→cv修飾→型名の順番にしているね。
コンパイラを通すだけならint const volatile staticなんて並べても通る。
0729デフォルトの名無しさん
2009/04/18(土) 17:42:24int *p; int* q;とか。
const int* p2; int const* q2;
上のq2は、constなポインタへのconstで一貫性があるように見える。
const int* const p3; int const* const q3;
0730デフォルトの名無しさん
2009/04/18(土) 17:54:08ストレージクラス(static) 型(int) cv修飾(const volatile) 識別子(x)
基本的にcvはその直前(左)にある型を修飾するけど、例外的にその左に型がない場合は直後の型を修飾する
規格では7.1あたりに書いてあるよ
0731デフォルトの名無しさん
2009/04/18(土) 18:10:15static const volatile int x でok
0733デフォルトの名無しさん
2009/04/18(土) 18:40:53struct fruit{
int apple;
int banana;
void clear(){
ZeroMemory(this, sizeof(*this));
}
int orange;
};
この構造体をローカル変数に定義した場合、メモリ見るとそれぞれの
3つの値がスタックに順に並びました。
clear を呼ぶと、確かに apple, banana, orange が
クリアされます。
ZeroMemory で this を渡していますが、clear() は含まれていないようです。
この構造体の場合、fruit.clear() は main() と同じように、
code セグメントに配置されるんでしょうか。
class も同じ考え方になるのでしょうか。
0734デフォルトの名無しさん
2009/04/18(土) 18:42:50当然、そうしないといけないという決まりはないが、
自然に実装すればだいたいそんな感じになる。classでも同じ。
0735デフォルトの名無しさん
2009/04/18(土) 19:49:59コンパイラーによっては前付きは古いって怒られることあるよ。
ここらへんに増築の限界感を感じる・・・
0736デフォルトの名無しさん
2009/04/18(土) 21:56:222) int const *p;
3) int *const p;
1と2がpointer to const intで、3はconst pointer to intであってますよね?
0737デフォルトの名無しさん
2009/04/18(土) 21:57:06あってる。
0738デフォルトの名無しさん
2009/04/18(土) 21:57:160739デフォルトの名無しさん
2009/04/18(土) 21:59:07っていうか、構文解析法は頭に叩き込みましょう^^
0740デフォルトの名無しさん
2009/04/18(土) 22:00:58基底クラスで同じメンバ関数foo()がvirtualと指定されていれば
基底クラスのポインタを介した場合のみ呼び出せるのか。
実際やってみるとうまくいくんだが、別におかしくはないよね?
class Base
{
public:
virtual void foo(){std::cout << "Base foo!" << std::endl;};
Base(){std::cout << "Base Constructor!" << std::endl;};
virtual ~Base(){std::cout << "Base Destructor!" << std::endl;};
};
class Derived : public Base
{
void foo(){std::cout << "Derived foo!" << std::endl;};
public:
Derived(){std::cout << "Derived Constructor!" << std::endl;};
virtual ~Derived(){std::cout << "Derived Destructor!" << std::endl;};
};
void foo()
{
Base* pbd(new Derived);
pbd->foo();
delete pbd;
}
0741デフォルトの名無しさん
2009/04/18(土) 22:07:06派生クラス(Derived)のポインタを介した場合でも呼び出せるでしょ?
0742デフォルトの名無しさん
2009/04/18(土) 22:08:11もし呼び出せなくなったりするのなら
ポリシークラスとか存在価値なくなっちゃうし。
0743デフォルトの名無しさん
2009/04/18(土) 22:08:22コンパイルエラーになったよ。
0744デフォルトの名無しさん
2009/04/18(土) 22:09:530745デフォルトの名無しさん
2009/04/18(土) 22:11:160746740
2009/04/18(土) 22:11:19error: `virtual void Derived::foo()' is private
って言われますね。
>>744
「自分のメンバ関数から」ならprivateメンバ関数も呼出せるけどね。
0747740
2009/04/18(土) 22:19:08派生クラスのデストラクタがpublic指定されていれば
boost::shared_ptrを使った場合なら呼出せるのね。
必要条件:
基底クラスのデストラクタがprivateでないこと。
また、派生クラスのデストラクタがpublicであること。
さらに生のポインタじゃダメなようだ。
0748740
2009/04/18(土) 22:20:08class Base
{
protected:
virtual ~Base(){std::cout << "Base Destructor!" << std::endl;};
public:
virtual void foo(){std::cout << "Base foo!" << std::endl;};
Base(){std::cout << "Base Constructor!" << std::endl;};
};
class Derived : public Base
{
virtual void foo(){std::cout << "Derived foo!" << std::endl;};
public:
Derived(){std::cout << "Derived Constructor!" << std::endl;};
virtual ~Derived(){std::cout << "Derived Destructor!" << std::endl;};
};
void foo()
{
boost::shared_ptr<Base> pbd(new Derived);
pbd->foo();
}
しかもboost::shared_ptrの動的削除子のおかげでデストラクタにvirtualすら付けなくてもいけるのか。
0749デフォルトの名無しさん
2009/04/19(日) 00:39:350750デフォルトの名無しさん
2009/04/19(日) 11:55:04>ハードウェアが書き込み,プロセッサが読み出す領域: const volatile
この使い方って本当に大丈夫?
例示できないけどconst有り無しのオーバーロード関数とか・・・
0751デフォルトの名無しさん
2009/04/19(日) 12:10:18これも疑問だよな
プロセッサもハードウェアも読み書きする領域じゃないのか?
0752デフォルトの名無しさん
2009/04/19(日) 12:16:380753デフォルトの名無しさん
2009/04/19(日) 13:47:07volatileって常に最新の実体を参照するようにするだけだよね?
0754デフォルトの名無しさん
2009/04/19(日) 13:52:460755デフォルトの名無しさん
2009/04/19(日) 14:38:46volatile int i;
int j;
if ( i == 1 ) j = i;
で j == 1 でないときがありえる変数。
constをつけるとそのプログラムからは内容が変更できないのに参照するたびに内容はかわるかもしれない変数になる。
ポインタ経由でアドレスにマッピングされたI/Oポートとやり取りするのに使ったりする。
0756733
2009/04/19(日) 14:51:18thx! 亀レススマソ
「自然に実装すれば」というのは、アセンブル段階で
構造体やクラスのコードはすべて code セグメントに集約している
場合、ということでしょうか。
もう1つ謎なのは、インスタンス化を可能とするために、
clear() を呼んだ際に、どのメモリ領域が this に該当するのかを
どうにかして渡しているはずですが、その文献が見当たりません。
どのように処理しているんでしょうか。
0757デフォルトの名無しさん
2009/04/19(日) 16:36:28> 「自然に実装すれば」というのは、アセンブル段階で
> 構造体やクラスのコードはすべて code セグメントに集約している
> 場合、ということでしょうか。
クラス(あるいは構造体)のメンバ変数は、
インスタンス毎に値が違うので、各インスタンスごとに
用意してやる必要があるが、メンバ関数は各クラス毎に
一つだけ用意してやればよい。
よって、>>733の場合だと、スタックにメンバ関数(へのポインタ)が
用意される必要はない(virtual関数は微妙に別)
> もう1つ謎なのは、インスタンス化を可能とするために、
> clear() を呼んだ際に、どのメモリ領域が this に該当するのかを
> どうにかして渡しているはずですが、
>>733の例のclear()の場合、処理系が勝手に
__struct_fruit_clear(fruit* this)
のような関数に置き換える(ことが多い)。ただし、処理系依存。
0758733
2009/04/19(日) 17:46:48丁寧な説明、本当にありがとうございます。
かなり理解できました。
0759デフォルトの名無しさん
2009/04/19(日) 20:32:45.NET や Java では interface が言語仕様として存在しますが、
C++ では言語仕様レベルで Java のような interface は存在しません。
なので、単一継承とは別に、
純粋仮想関数だけで固められたクラスのみ、多重継承を許可して実装しようと思ってます。
そのような実装で問題点などありますでしょうか。
よろしくお願いします。
0760デフォルトの名無しさん
2009/04/19(日) 20:35:38結局は規約次第だと思うが
0761デフォルトの名無しさん
2009/04/19(日) 20:59:23レスありがとうございます。
やっぱり規約や、実装者の意識の問題になりそうですよね。
個人(自分だけ)での開発なので、その辺の問題は薄そうですが・・・
コンパイラで上手くカスタマイズして、
間違った実装したときに警告とか出せればいいんですけどね。
0762デフォルトの名無しさん
2009/04/19(日) 21:03:35struct IHoge {virtual ~IHoge();};
struct IFoo : IHoge {};
struct IBar : IHoge {};
class Piyo : IFoo, IBar {};
Piyo piyo;
このとき、(IHoge*)(IFoo*)&piyo == (IHoge*)(IBar*)&piyoが
真になるとは限らないということを許容できないなら、仮想継承を使うべきと言っておく。
処理系間や多言語間での互換性を高めるため、仮想継承を使っていないMSのCOMでは、
これが理由でポインタの比較が面倒(仮想継承の代わりに規約で縛りを入れて対処している)。
0763デフォルトの名無しさん
2009/04/19(日) 21:45:10operatorの再定義のことを言ってる?
よく分からん。
0764デフォルトの名無しさん
2009/04/19(日) 22:00:25仮想継承しなければ、IFooの部分オブジェクトのIHogeとIBarの部分オブジェクトのIHogeは別物ということ。
インタフェースという元のお題からは外れるが、IHogeに非静的メンバ変数xがあれば、
IFoo側のxとIBar側のxは、仮想継承しないなら別々、仮想継承したら同一の存在だろ。
(かなり乱暴な言い方だけど)
それと同じ話。単にメンバ変数がないからポインタの比較でもしないと問題が発覚しないだけで。
0765デフォルトの名無しさん
2009/04/19(日) 22:20:17「仮想継承」も調べておいた方がいいとかで済ませればいいのに
0766デフォルトの名無しさん
2009/04/19(日) 23:49:51レスありがとうございます。
仮想継承はよく理解してなかったんで、Wikipedia とかで調べてました。
多重継承する上で理解しておかないといけない概念ですね。
ありがとうございました。
0767デフォルトの名無しさん
2009/04/19(日) 23:52:40>>765さんが教科書で覚えたことはいちいち説明するなよ。
ググレカス。
0768デフォルトの名無しさん
2009/04/19(日) 23:56:49たしかにこれはググればわかる気がする
今後は namespace C++{ 仮想継承 } とか名前空間で囲んでくれると名前的にわかりやすい
RDFでも可
0769デフォルトの名無しさん
2009/04/20(月) 13:17:27これさえあればC言語風に書けるしなw
クラス?
そんなもんいらね。
0770デフォルトの名無しさん
2009/04/20(月) 13:26:09コメントの//より優先されるべきだった
0771デフォルトの名無しさん
2009/04/20(月) 14:31:19どうだろうか
0772デフォルトの名無しさん
2009/04/20(月) 14:33:160773デフォルトの名無しさん
2009/04/20(月) 15:40:24namespaceだとC++と同じだから、miniascapeでCに取り込んだらどうだろうか
0774デフォルトの名無しさん
2009/04/20(月) 19:37:14namespaceでいいよ。だからさっさと取り込んでくれ。
0775デフォルトの名無しさん
2009/04/20(月) 22:17:270776デフォルトの名無しさん
2009/04/20(月) 22:20:400777デフォルトの名無しさん
2009/04/20(月) 23:33:280778デフォルトの名無しさん
2009/04/20(月) 23:35:43staticいちいち付けるの面倒なんじゃ。
0779デフォルトの名無しさん
2009/04/21(火) 14:16:50#include "child/inc.h"
みたいに子フォルダにあるファイルのインクルードは認められているんだよね?Boostにもあるくらいだし。
#include "../my_typedefs.h"
みたいに親フォルダにあるファイルのインクルードは認められている?
0780デフォルトの名無しさん
2009/04/21(火) 14:27:45残念ながら #include の指定と実際のファイルとの対応付けはほぼすべて実装依存。
規格で決まってるのは "" が <> の検索範囲を含むということだけ。
0781デフォルトの名無しさん
2009/04/21(火) 14:33:000783デフォルトの名無しさん
2009/04/21(火) 15:08:27「です・ます調」じゃないですよね?
0784デフォルトの名無しさん
2009/04/21(火) 15:43:520785デフォルトの名無しさん
2009/04/21(火) 15:54:15そうなんですね。
0786デフォルトの名無しさん
2009/04/21(火) 17:24:480787デフォルトの名無しさん
2009/04/21(火) 17:42:15自分用のメモ代わりならどう書こうと完全に自由だし日本語表示できる環境の人だけしか読まないだろうっていうなら日本語でいい(文字コードには気を配る必要はあるけどな)。
0788デフォルトの名無しさん
2009/04/21(火) 17:48:130789デフォルトの名無しさん
2009/04/21(火) 20:26:20「だ・である調」でコメント書いてる商用ライブラリってみたことある?
みんな「です・ます調」だよね。
あ、自分は「だ・である調」^^;
0790デフォルトの名無しさん
2009/04/21(火) 20:33:080791デフォルトの名無しさん
2009/04/21(火) 20:34:35日本語で書くか、書かなくてもいいように関数名にひたすら意味を込める。
0792デフォルトの名無しさん
2009/04/21(火) 20:39:390793デフォルトの名無しさん
2009/04/21(火) 20:40:290795デフォルトの名無しさん
2009/04/21(火) 20:58:400796デフォルトの名無しさん
2009/04/21(火) 21:07:420797デフォルトの名無しさん
2009/04/21(火) 21:32:510798デフォルトの名無しさん
2009/04/21(火) 21:39:02行末に空白一個打っておけばおk
0799デフォルトの名無しさん
2009/04/21(火) 22:45:17{
puts( "F()" );
}
struct Test
{
typedef boost::function<void()> func_t;
Test( func_t )
{
};
void F()
{
}
};
int main()
{
Test t( Test::func_t( &F ) );
t.F();
return 0;
}
これ通らないんだけど、なんで?
ctorが関数宣言に解釈されてる?
0800デフォルトの名無しさん
2009/04/21(火) 22:49:08末尾空白を除去するフィルタやDoxygen対応も考えて、ドットを推奨しておく。
>>799
何はともあれ、エラーメッセージを貼るべき。
0801デフォルトの名無しさん
2009/04/21(火) 22:52:24{
}
0802デフォルトの名無しさん
2009/04/21(火) 23:08:42最初の引数を型名以外にしたら変数宣言になったけど、最初が型名なら
関数宣言になるとかルールがあるのかな?
0803デフォルトの名無しさん
2009/04/21(火) 23:12:16とか
0804デフォルトの名無しさん
2009/04/21(火) 23:26:56そう、変数宣言とも関数宣言とも取れるときには、関数宣言として解釈されるということ。
>>803とかTest t( (Test::func_t( &F )) );と書くのが直接的な常套手段。
0805デフォルトの名無しさん
2009/04/21(火) 23:30:50そんなルール何処に書いてる?
0806デフォルトの名無しさん
2009/04/21(火) 23:32:56規格票に書いてある
0807デフォルトの名無しさん
2009/04/21(火) 23:38:360808デフォルトの名無しさん
2009/04/21(火) 23:39:48実際書いてあるし
0809デフォルトの名無しさん
2009/04/21(火) 23:42:460810デフォルトの名無しさん
2009/04/22(水) 00:12:37レス時間の短さから信憑性が低いといわざるをえない
0811デフォルトの名無しさん
2009/04/22(水) 00:30:34thx
俺もTest t = ryでわーくあろうんどしてた
()でくくると評価順が変わる?
0812デフォルトの名無しさん
2009/04/22(水) 00:32:59Test( func_t )
だとコピーコストかかりそうだったから山椒にした
constかからんし、結局1行での初期化諦めたわー
まぁほんとにthx
0813デフォルトの名無しさん
2009/04/22(水) 00:59:078.2、JIS X 3014 : 2003だと「あいまい性の解決」の箇所が該当する部分。
> 関数型のキャストと宣言との間の類似性から起こるあいまい性(6.8参照)は,
> 宣言の文脈においても起こりえる。この文脈では,仮引数名を囲む括弧を冗長に持った関数宣言と,
> 関数型のキャストを初期化子として持つオブジェクト宣言との間の選択となる。
> 6.8に示したあいまい性に対しては,宣言となる可能性のある構文は宣言とすることで解決法とする。
> 参考 関数型でないキャストを使うこと,初期化子を示すのに“a =”と記述すること,
> または仮引数名を囲む冗長な括弧を除去することによって,
> 宣言を明示的にあいまい性のないものにすることができる。
この後に例がいくつか続くんだけど省略
0814デフォルトの名無しさん
2009/04/22(水) 15:25:04これを上手い事クラスに出来ないものだろうか
0815デフォルトの名無しさん
2009/04/22(水) 15:52:170816デフォルトの名無しさん
2009/04/22(水) 16:56:55resizeを使いたいためにstd::vectorで定義した配列でcomplex<double>を代入するにはどんな方法を取ると良いでしょうか?
宜しくお願いします。
0817デフォルトの名無しさん
2009/04/22(水) 17:06:11質問の意味がよくわからないが
vec[0] = std::complex<double>(1.0, -1.0);
のようにコンストラクタで一時オブジェクトを使うとかそういう意味?
0818デフォルトの名無しさん
2009/04/22(水) 17:08:48エスパーしてみる…
class BaseCase
{
public:
static BaseCase* Create(int condition);
BaseCase(){}
virtual void F() = 0;
};
class CaseA : BaseCase {
public:
void F(){ printf("Case A\n"); };
};
class CaseB : BaseCase {
public:
void F(){ printf("Case B\n"); };
};
BaseCase* BaseCase::Create(int condition){
switch(condition){
case X: return (BaseCase*)(new CaseA());
case Y: return (BaseCase*)(new CaseB());
}
}
int main(int, char**){
BaseCase* obj1 = BaseCase::Create(X);
BaseCase* obj2 = BaseCase::Create(Y);
obj1->F();
obj2->F();
}
0819デフォルトの名無しさん
2009/04/22(水) 17:14:24auto_ptrとかshared_ptrとか使えよ。
0820デフォルトの名無しさん
2009/04/22(水) 17:18:550821デフォルトの名無しさん
2009/04/22(水) 18:45:29コンパイル時は無理臭い
0822816
2009/04/22(水) 20:33:30お返事ありがとうございます。
1次元の配列に複素数を使いたいのですが、std::vectorを使用するとdoubleやintで上手くいく処理もcomplexだと上手くいかずに困っているのです。
ご指摘の方法も試したのですが、
> sample.cpp(56) : error C2440: '=' : 'std::complex<double>' から 'double'に変換できません。
> この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。
このようなエラーが出てしまいます。
0823デフォルトの名無しさん
2009/04/22(水) 20:54:16そんなエラーが出ると いうことは、std::vector<double>にしているようにしか思えないのだけど。
0824デフォルトの名無しさん
2009/04/22(水) 20:54:48そのエラーの起きたコードを張ってくれ。
0825デフォルトの名無しさん
2009/04/22(水) 21:19:52まさか>>823なのか?俺も一瞬そう思ったけどさすがにそれはないよなあと
思って書かなかったんだが
0826デフォルトの名無しさん
2009/04/22(水) 21:32:440827デフォルトの名無しさん
2009/04/22(水) 21:43:54ノンケなら食っちゃうけど^^
0828デフォルトの名無しさん
2009/04/22(水) 22:44:390829デフォルトの名無しさん
2009/04/23(木) 02:01:45インクルードするヘッダは、ヘッダの中でインクルードされたヘッダも考えて、必要最小限にした方がいいんですかね?
それともヘッダの先で何がインクルードされてるか気にするより、使うもののヘッダ全部インクルードするべきですか?
#include "Hoge.h"
Fuga fuga = hoge.GetFuga();// 明らかにFuga.hはHoge.hでインクルードされてそう
std::vector<int> vec; // Hogeの内部で使われてたvectorがdequeに変更されたらエラーに
0830デフォルトの名無しさん
2009/04/23(木) 02:16:43ヘッダの中まで気にする手間をかけ、ヘッダの中身への依存関係を増やして、
いったい何が得られるというのかね?
0831デフォルトの名無しさん
2009/04/23(木) 02:25:12コンパイルにかかる時間が短縮されるかなーと(冗長インクルードガードにすると速くなると聞いた記憶が)。
>>829の例の場合、Fuga.hもインクルードしますか?
0832デフォルトの名無しさん
2009/04/23(木) 02:30:510833デフォルトの名無しさん
2009/04/23(木) 02:40:11俺ならvector, Fuga.h, Hoge.hすべてインクルードする
0834デフォルトの名無しさん
2009/04/23(木) 02:48:37どうもです。
参考になりました。
0835デフォルトの名無しさん
2009/04/23(木) 02:56:19そう思うんなら測ってみろ。それで速度向上がコストに見合うと思うんなら、思うとおりにすればいい。
ただ、コンパイラ側の進歩によって冗長インクルードガードでの速度向上はほぼ過去のものと
言っていい状況になっている。
http://www.google.co.jp/search?q=%22%E5%86%97%E9%95%B7%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AB%E3%83%BC%E3%83%89%E3%82%AC%E3%83%BC%E3%83%89%22
0836デフォルトの名無しさん
2009/04/24(金) 14:20:32これは、そのローカルでない静的オブジェクトを無名名前空間に入れてしまえば、そのファイルに対してだけ有効なスコープとなるので、問題はありませんよね?
0837デフォルトの名無しさん
2009/04/24(金) 15:30:56標準の例外クラスは皆what()メンバ関数を持っているものですか?
0838デフォルトの名無しさん
2009/04/24(金) 16:59:56その名前空間内に extern を一個も書かないなら問題ないです
書くなら問題あるかもね…
3.6.2に、初期化順序の説明と未規定になってしまうコード例が掲載されてます
>>837
もってます
0839836
2009/04/24(金) 17:42:23その無名名前空間の中にあるものを外部からexternしようとしてももちろん出来ないので大丈夫で、
またその無名名前空間の中から外部の変数をexternしないように気をつけてあります。
ありがとうございました。
0840デフォルトの名無しさん
2009/04/24(金) 19:14:23呼び出したりするとそれらに依存関係が出来るので対策がいる。
遅延初期化は静的初期化タイミング以前に使用することは出来ないので、
静的初期化時に使用出来る必要がある場合、こういう方法が必要になる。
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E5%B0%8F%E7%B2%8B%E3%81%AA%E3%82%AB%E3%82%A6%E3%83%B3%E3%82%BF(Nifty_Counter)
0842837
2009/04/24(金) 20:26:45ありがとうございます。
boostの例外クラスなどが持っていて、
またいくつか調べた標準例外クラスも持っていたので、
もしかするとと思っていました。
0843デフォルトの名無しさん
2009/04/25(土) 17:27:23有効な場合はそのまま使えるが無効な場合はエラーメッセージを取得するようにしたい。
ただしこのメンバ関数m_func()は例外を投げさせたくない。
この場合はどうすればいいと思う?
俺としてはboost::variantで
boost::variant<boost::shared_ptr<MyClass>, std::string>
を返す様にし、呼び出し側でその返り値を検査する方法を考えているのだが、
もうちょっとエレガントな方法はないかなぁ?
0844デフォルトの名無しさん
2009/04/25(土) 17:33:380845デフォルトの名無しさん
2009/04/25(土) 17:35:120846845
2009/04/25(土) 17:40:17気にしないで
0847843
2009/04/25(土) 17:50:21ありがとう。
0848デフォルトの名無しさん
2009/04/25(土) 17:56:37try
{
//**例外を投げるかもしれない処理**//
}
catch(const expected_error1 &ex)
{throw ex;}
catch(const expected_error2 &ex)
{throw ex;}
catch(const expected_error3 &ex)
{throw ex;}
catch(const expected_error4 &ex)
{throw ex;}
catch(const expected_error5 &ex)
{throw ex;}
catch(...)
{throw unexpected_error();}
このように、
//**例外を投げるかもしれない処理**//
の部分で生じた例外が予想の範疇(expected_error1〜5)の場合は例外をそのまま外に投げ、
想定外の例外の場合にはunexpected_error構造体を投げたいという場合は上のようなコーディングになると思うのだが、
これ以外にはどうしようもない?
expected_error1〜5は独立した型で、継承関係はないとして。
0849デフォルトの名無しさん
2009/04/25(土) 18:05:170850デフォルトの名無しさん
2009/04/25(土) 18:07:23>再送出ならthrow
そうなんだ!
ありがとう。
0851デフォルトの名無しさん
2009/04/25(土) 23:08:58class MyInt
{
public :
int num;
各種メンバ関数
}
このように自分でintをラップしたクラスを作った。
このままだとMyIntが表現できる値がint型の取れる値に限られるので、
これにスペシャルな値として
special_val1, spcial_val2, special_val3, special_val4
の4つを取りうるようにしたい。(例えば無効値を表すとか∞を表すとか考えてる。)
どういった実装にすればいいかな?
unionとか使うの?
0852デフォルトの名無しさん
2009/04/25(土) 23:19:03いつスペシャルになるのかわからないけど、
メンバ関数でアクセスされたときにスペシャルな時だったら
スペシャルな値を返すようにすればいいと思うよ。
別にnumのメモリと同じ位置にスペシャルな値が入ってなければならないというキマリはないから。
0853デフォルトの名無しさん
2009/04/25(土) 23:20:17enum { normal, invalid, infinite } で、 num は normal のときだけアクセスできるようにする、
とか。
0855デフォルトの名無しさん
2009/04/26(日) 08:45:40例えば
class MyClass
{
const int num;
public:
MyClass();
//メンバ関数
};
これだったら
MyClass::MyClass() : num(42)
{}
だよね。ではconst int num;がconst int num[3];だったら
num[0], num[1], num[2]
のコンストラクタによる初期化はどうすればいい?
0856デフォルトの名無しさん
2009/04/26(日) 09:39:25{
static const int num[3];
public:
};
const int MyClass::num[3] = { 1, 2, 4 };
staticにしてしまう(キリッ)
0857デフォルトの名無しさん
2009/04/26(日) 09:47:21敢えて別の解を検討してみる
class MyClass{
const int (&num)[3];
MyClass(const int (&_num)[3]):num(_num){};
};
func(){
const int num[3];
MyClass myclass(num);
0858デフォルトの名無しさん
2009/04/26(日) 09:50:17なるほど、申し訳ないんだが、実はコンストラクタの引数で初期化したい。
すなわちclass MyClass
{
const int num[3];
public:
MyClass(int first, int second, int third);
//メンバ関数
};
MyClass::MyClass(int first, int second, int third) : num[0], num[1], num[2]を引数で初期化
{}
だった。まあconstあきらめてコンストラクタで代入すりゃいいんだけど。。。
>>857
配列への参照をメンバに持たせるってことか。面白そうだが。
0859デフォルトの名無しさん
2009/04/26(日) 09:54:38継承しても生成できないようにすることはできますか?
たとえば
1.デフォルトコンストラクタだけを定義し、private指定する。
2.デストラクタを純粋仮想として定義し、private指定する。
この2つを行えば大丈夫ですか?
0860デフォルトの名無しさん
2009/04/26(日) 09:59:30MyClass(int fst, int snd, int trd) : num({fst,snd,trd}) {}
とかできないのかなぁ…(gcc-4.4では駄目だったorg)
0861デフォルトの名無しさん
2009/04/26(日) 10:00:190862デフォルトの名無しさん
2009/04/26(日) 11:58:23unionって初期化子で使えないんだっけ?
class A{
union{
int a1,a2;
int a[2];
};
public:
A():a1(50),a2(200){}
};
みたいな。試してないけど
0863デフォルトの名無しさん
2009/04/26(日) 12:48:26それやるなら
MyClass(int fst, int snd, int trd) : num{fst,snd,trd} {}
じゃね?()付けると意味が変わると思う
0864デフォルトの名無しさん
2009/04/27(月) 01:10:44boost使っていいなら
#include <boost/array.hpp>
#include <boost/assign.hpp>
class MyClass
{
const boost::array<int, 3> num;
public:
MyClass(int first, int second, int third);
};
MyClass::MyClass(int first, int second, int third)
: num(boost::assign::list_of(first)(second)(third))
{
}
くらいかな
boost::array<int, 3>はstd::vector<int>で置き換え可能です
>>859
1だけで大丈夫だと思う
不安ならコンストラクタの中にassert(!"生成しないで")って書いとけばおk
0865858
2009/04/27(月) 16:50:13boost::arrayって単なるラップだと思ってたわ。
boost::assign::list_of(first)(second)(third)で初期化できるんだね。
初めて知ったわ。
ありがとう。
0866デフォルトの名無しさん
2009/04/27(月) 16:55:35自作してるとか、仕事先にライブラリがあるとか、
フリーでライセンスの制限の緩いものを商用利用しているとか?
0867デフォルトの名無しさん
2009/04/27(月) 20:17:010868デフォルトの名無しさん
2009/04/27(月) 20:25:260869デフォルトの名無しさん
2009/04/27(月) 21:33:36なるほど、自作か。
>>868
LGPLだとライセンスが厳しすぎるなぁ。
0870デフォルトの名無しさん
2009/04/27(月) 22:59:41enum GET { AAA };
enum SET { AAA };
ってやると、コンフリクトしちゃうの?
セットする値と、ゲットする値を訳て面倒な分岐処理をなくそうとか思ってるんだけど、
structとかでラップするしかないのかなぁ?
0871デフォルトの名無しさん
2009/04/27(月) 23:33:02共通にして一個にまとめればいいんじゃないか?
0872デフォルトの名無しさん
2009/04/27(月) 23:36:040873デフォルトの名無しさん
2009/04/28(火) 00:36:120874デフォルトの名無しさん
2009/04/28(火) 00:50:25enum GETorSET{AAA,BBB,amountGETorSET};
enum GET{GET_AAA=9,GET_BBB=10};
enum SET{SET_AAA=11,SET_BBB=4989};
int get(GETorSET _x){
const int enumGET[amountGETorSET]={GET_AAA,GET_BBB};
const int x = enumGET[_x];
}
bool set(GETorSET _x){
const int enumGET[amountGETorSET]={SET_AAA,SET_BBB};
const int x = enumSET[_x];
}
でいいんじゃないか?
0875デフォルトの名無しさん
2009/04/28(火) 21:01:12色々ライブラリがあるけど、えらく巨大だったり充分デバッグされていなかったりなにより
ドキュメントがしっかりしてないのが大杉...
結局自作した
0876デフォルトの名無しさん
2009/04/28(火) 21:14:22で、お前は十分デバッグしてドキュメントもしっかり書いたんだよな?
0877デフォルトの名無しさん
2009/04/28(火) 23:34:22公開してるわけじゃないから手元のノートだけ
0879デフォルトの名無しさん
2009/04/29(水) 00:21:190880デフォルトの名無しさん
2009/04/29(水) 00:23:320881878
2009/04/29(水) 00:30:52おお、ありがとう。
さっそく調べて検討してみるわ。
俺が自作すると
メモリ効率悪く・遅く・バグがあり・枯れていない・信用がない・車輪の再発明
的なデメリットばっか思いつく。
0882デフォルトの名無しさん
2009/04/29(水) 00:41:21商用の場合は無料じゃないけどね
自作するときはknuthのThe Art of Computer Programming Vol.2を参考にするといいよ
0883デフォルトの名無しさん
2009/04/29(水) 01:32:19いったい何を企んでるんだ。
0884デフォルトの名無しさん
2009/04/29(水) 02:33:22メンバー変数にクラスAAAのインスタンスaを持つクラスBBBを
class BBB
{
public:
AAA a (10);
};
こんな感じに書きたいんですけど、これをコンパイルすると
構文エラー:定数
って言われて怒られます!どうして!?
0885デフォルトの名無しさん
2009/04/29(水) 02:35:220886デフォルトの名無しさん
2009/04/29(水) 02:35:35関数とみなされるから
C++0xからそういう風に書けるようになる
0887デフォルトの名無しさん
2009/04/29(水) 02:42:10通常のC++でこの問題を回避することはできませんか?
0888デフォルトの名無しさん
2009/04/29(水) 02:42:45class BBB
{
AAA a;
public:
BBB() : a(10){}
};
0889デフォルトの名無しさん
2009/04/29(水) 02:44:49なるほど、そういう方法があるんですね
ありがとうございます
0890デフォルトの名無しさん
2009/04/29(水) 09:34:14>C++0xからそういう風に書けるようになる
マジか。それ絶対便利だな。すばらしい改良。
0891デフォルトの名無しさん
2009/04/29(水) 09:35:23LGPLって再配布時にソース公開だよね?これって厳しい条件じゃない?
0892デフォルトの名無しさん
2009/04/29(水) 10:05:48なるほど。
俺は
MIST: ファイル索引
ttp://mist.suenaga.cse.nagoya-u.ac.jp/document/files.html
ここのinteger.hとdecimal.hを見つけただけだ。
BSDライセンスらしいが。
0893デフォルトの名無しさん
2009/04/29(水) 11:34:55GMP自体をいじり倒したいわけ?
0894デフォルトの名無しさん
2009/04/29(水) 22:32:45いやそういうつもりはないんだけど、
もしかしてGMPを使って実装したプログラムを配布する場合
のソースコードの公開は不要なのかい?
例えば静的リンクでも?
0895デフォルトの名無しさん
2009/04/30(木) 00:46:37LGPLは、LGPLなソースそのものは当然(L)GPLで出さなければならないが、
それにリンクしたプログラムはGPLよりもだいぶ弱い毒性しか伝染しない。
http://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License
0896デフォルトの名無しさん
2009/04/30(木) 01:17:37個人的にはどうでもいいけど仕事で使いにくい
0897デフォルトの名無しさん
2009/04/30(木) 01:32:50どうにかならないかなあ
0898デフォルトの名無しさん
2009/04/30(木) 01:38:270899デフォルトの名無しさん
2009/04/30(木) 01:39:520900894
2009/04/30(木) 06:47:57ありがとう。
そうだったのか。GPLと大差ない物かと思っていた。
>ライブラリAに静的リンクしたプログラムBを配布する場合、
>Bのソースコードまたはオブジェクトコードの配布を拒否してはならない。
これは恐ろしい。。。
静的リンクはやめたとして、それでもなおリバースエンジニアリング禁止が
できないっていうのは諦めるしかないよね。
0901デフォルトの名無しさん
2009/04/30(木) 11:23:230903デフォルトの名無しさん
2009/05/01(金) 08:49:550904デフォルトの名無しさん
2009/05/01(金) 09:49:380905デフォルトの名無しさん
2009/05/01(金) 13:52:03main()
{
vector< int > v;
f( &*v.begin(),
&*v.end() ); // <- ここでイテレータの不正アクセス例外
}
このようなコードだと、v.end()のアドレスを得るところで落ちるケースがあります。
(C#から↑のようなコードが含まれたC++DLLをコールした場合など)
v.end()をポインタ参照せずにアドレスを得る方法などありませんか?
「&*v.begin() + v.size()」は駄目でした。
0906デフォルトの名無しさん
2009/05/01(金) 14:00:240907デフォルトの名無しさん
2009/05/01(金) 14:10:29&*v.begin() + v.size()でいいと思うんだが。
ただvが空だと&*v.begin()も駄目だろう。
0908デフォルトの名無しさん
2009/05/01(金) 14:11:44空の vector には要素が無いんだけど、何のアドレスを得るつもりなの?
>906 も未定義動作ね。
empty() なら両方ぬるぽでも渡すようにすればいいような気がする。
0909デフォルトの名無しさん
2009/05/01(金) 14:12:33文法が間違えてる
0910デフォルトの名無しさん
2009/05/01(金) 14:13:530911デフォルトの名無しさん
2009/05/01(金) 14:15:31ここで assert() かなんかにひっかかるんじゃないかな?
0912デフォルトの名無しさん
2009/05/01(金) 14:23:55&v[v.size()]は int*型
0913デフォルトの名無しさん
2009/05/01(金) 15:21:270914デフォルトの名無しさん
2009/05/01(金) 15:22:37型は正しいが空の vector v に対して評価すると未定義動作。
0916デフォルトの名無しさん
2009/05/01(金) 15:27:010917デフォルトの名無しさん
2009/05/01(金) 15:38:23f(&v[0], &v[0] + v.size())
なら、!v.empty()の時は常に大丈夫
v.empty()の時は、(実装によっては大丈夫なものもあるが)未定義動作
0918デフォルトの名無しさん
2009/05/01(金) 16:21:440919デフォルトの名無しさん
2009/05/01(金) 18:33:05f(v.data(), v.data()+v.size())
って書けるようになるといいな
0920デフォルトの名無しさん
2009/05/01(金) 19:53:48というのを追加して、
f(v.begin_p(), v.end_p())
って書けるようにするのが一番素直
0921デフォルトの名無しさん
2009/05/01(金) 19:58:48最後の要素を指すポインタを返すend_p()ってのは
end()と統一性が無くて紛らわしかないか?
0922デフォルトの名無しさん
2009/05/01(金) 20:19:07戻り値が不定なだけで異常終了はしないとか、規格はそうはなっていないの?
そもそも、やること自体が危険だという意味の実装定義と
得られる値が実装系で決まる(不定値含む)という意味の実装定義に区別はないの?
0923デフォルトの名無しさん
2009/05/01(金) 20:26:180924デフォルトの名無しさん
2009/05/01(金) 20:50:47不定(unspecified)、未定義動作(undefined behavior)、処理系定義(implementation-defined)は全て異なる概念です。
0925デフォルトの名無しさん
2009/05/01(金) 22:43:340926デフォルトの名無しさん
2009/05/01(金) 23:01:530927デフォルトの名無しさん
2009/05/01(金) 23:22:100928デフォルトの名無しさん
2009/05/01(金) 23:31:03>&*v.begin() + v.size()でいいと思うんだが。
自分もそう思うんですが、VCのアサートマクロに引っかかってしまいます。
(vector iterator not dereferencableと出る)
仮に、vにダミーの要素を1つpush_back()して、
「&*v.begin() + v.size() -1」とすると出なくなります。
C++のホストから問題のC++のDLL(デバッグビルド)を呼ぶと出ないのですが、
C#のホストからC++のDLLを呼ぶと出ます。なので、デバッグトレースで追えない。
>空の vector には要素が無いんだけど、何のアドレスを得るつもりなの?
すみません、実際は空のチェックはしてました。
>>925
f( &v.front(), (&v.back())+1 );
でも同様に駄目でした。
なんとなく他のバグの影響のような気がします。
f()の中でend_pを参照するようなバグがあるか、
そこらへんを調査してみます。
アドバイスありがとうございました。
0929デフォルトの名無しさん
2009/05/02(土) 00:39:20それは同意。>>925は>>920へのレスね。
0930デフォルトの名無しさん
2009/05/02(土) 01:24:07把握。
0931デフォルトの名無しさん
2009/05/02(土) 02:43:54空のチェックをして、空じゃないときに &*v.begin() してれば
"vector iterator not dereferencable" とはならないはずだ。
空のチェック含めたなるべく実際のものに近いコードを晒せ。
変に省略するのは良くない。
0932デフォルトの名無しさん
2009/05/02(土) 04:31:53みんなテンプレート覚えたての頃に必ずvectorみたいなものを自作してるってばっちゃが言ってた
0933デフォルトの名無しさん
2009/05/02(土) 17:14:170934デフォルトの名無しさん
2009/05/02(土) 17:50:14> ずぶり
アッー!
0935デフォルトの名無しさん
2009/05/03(日) 19:14:19たまにippとかいう拡張子を見ることがある。
ただのテキストファイルっぽいんだけど、これは何物?
0936デフォルトの名無しさん
2009/05/03(日) 19:17:45デバッグ版では.cppに、リリース版では.hにincludeするために分離してるファイル
0937デフォルトの名無しさん
2009/05/03(日) 19:20:54全て合点がいった!
となると、一応分類するなら
.cppの仲間ではなくて.hないし.hppの仲間ってことね。
ありがとう!!
0938デフォルトの名無しさん
2009/05/03(日) 20:10:13って書けるのはどのスコープまで?
グローバルスコープだけしか書けないとか?
・・・と思いきや自作の名前空間の中にも書けたり、クラススコープ内には書けなかったりと
よく分からない。。
0939デフォルトの名無しさん
2009/05/03(日) 20:14:300940デフォルトの名無しさん
2009/05/03(日) 20:17:13usingで外部のを引っ張ってくるアレね。
サンクス
0941デフォルトの名無しさん
2009/05/04(月) 03:17:24linux+emacs+C++で開発してるんだけど、単体開発のスマートなやり方を教えてください
単純にみんなg++ hoge.cpp -c とかやってコンパイル通るかどうかやってるの?
もしくは、hoge.hpp/hoge.cppごとにmakefile書くとか?
なんかVisualStudio厨だったから、こういうのが非常に面倒で開発遅れぎみです。
助けてください!誰か、助けてください!
0942デフォルトの名無しさん
2009/05/04(月) 04:10:59そしたら
>hoge.hpp/hoge.cppごとにmakefile書くとか?
なんて質問が出るわけない。
0943デフォルトの名無しさん
2009/05/04(月) 09:09:55いやまぁMakefileは適当に書き方覚えただけで、autotools使うようになっちゃったんであれなんだけど。
Makefileの書き方知ってる人はどうするんですか?
0944デフォルトの名無しさん
2009/05/04(月) 09:50:54VisualStudioだとコンパイルする前にコンパイル通るかどうかわかるの?
0945デフォルトの名無しさん
2009/05/04(月) 10:28:51suffix rule か pattern rule を使って、ファイル毎にルール書いたりはしない。
そもそも組み込みのルールがあるんで suffix rule とか書く必要もない場合も多い。
Visual Studio でファイルを追加するのと同じようなレベルで Makefile を書いて、
Visual Studio でビルドするのと同じようなレベルで make 打つだけ。
依存関係の処理は多少問題だが、Autotools 使ってるならそれでいいんじゃね?
0946デフォルトの名無しさん
2009/05/04(月) 11:52:56下のコードの a?b:c = 4; のところは
?: よりも = の方が優先順位が低い為、
(a?b:c) = 4; の意味になるはずだと思うのですが、
私の環境で動作させると、
a?b:(c=4); の動作をしているようで、
bに4が代入されずに main の戻り値は2になります。
これはC++の仕様でしょうか?それともコンパイラのバグでしょうか?
コンパイラはVisual C++ 2005です。
int main(){
int a=1,b=2,c=3;
a?b:c = 4;
return b;
}
0947デフォルトの名無しさん
2009/05/04(月) 12:25:410948デフォルトの名無しさん
2009/05/04(月) 12:32:20俺も何がおきてるんだろうかと考えてみた。
> ?: よりも = の方が優先順位が低い為、
> (a?b:c) = 4; の意味になるはずだと思うのですが、
正しい。
> a?b:(c=4); の動作をしているようで、
ここは間違いじゃね?
> コンパイラはVisual C++ 2005です。
g++でも2が返ったよ。
俺の考えでは
a?b:c
の返り値であるテンポラリオブジェクト(int型の値2をもつ一時変数)にたいして = 4;
が実行される。実行直後にそのテンポラリオブジェクトは要らなくなるので破棄される。
その後、何事もなかったかのように
return b;
が実行され、bの値である2が返るとか。
0949948
2009/05/04(月) 12:35:22実際に、cの値を返させると4でなく3が返ってくるだろう。
>>947
仕様ではないと思う。
C++の仕様では組み込み型の一時オブジェクトの値を変更したら
動作は未定義となるのでは?
すなわち今回の場合、mainの戻り値がいかなる数字でも
あるいは鼻から悪魔が出てきてもおかしくないのでは?
0950デフォルトの名無しさん
2009/05/04(月) 12:35:30ありがとうございます。
できれば、なぜ = の方が強くなるのかの説明をしていただけるとうれしいです。
0951デフォルトの名無しさん
2009/05/04(月) 12:52:11cの値が3なのは
a?b:(c=4) で a != 0 の場合は c=4 が実行されないからだと思います。
以下のようにすると、bと(c=4) の型が異なるのでエラーになりますが、
(a?b:c) = 4; とするとコンパイルが通ります。
やっぱり a?b:(c=4) となっているのだと思います。
class T {
public:
int operator=(int n){
return 0;
}
};
int main(){
int a=1;
T b,c;
a?b:c = 4;
return 0;
}
0952デフォルトの名無しさん
2009/05/04(月) 12:54:050953デフォルトの名無しさん
2009/05/04(月) 12:59:13そーいうことはせめて (a?b:c) = 4; を実行してみてから言うべきじゃね?
> 14882:2003 5.16/4
> If the second and third operands are lvalues and have the same type, the result is of that type and is an
> lvalue.
なので a?b:c なら左辺値が返るので代入はそのまま動作する。
>949
>実際に、cの値を返させると4でなく3が返ってくるだろう。
a?b:(c=4) で a は真になるから c=4 は評価されない。
>950
構文的に
> conditional-expression:
> logical-or-expression
> logical-or-expression ? expression : assignment-expression
> assignment-expression:
> conditional-expression
> logical-or-expression assignment-operator assignment-expression
> throw-expression
logical-or-expression はもっと優先順位の高い演算子を含む式ね。
assignment-expression の左辺には logical-or-expression 以上のものしか現れないので、
conditional-expression が直接現れることはできない。
一方、conditional-expression の第2、第3引数には assignment-expression が現れることが可能
(expression は任意の式を含む)。
conditional-expression が三項演算子なので二項演算子等の単純な優先順位の話とは異なるということだと思われ。
0954デフォルトの名無しさん
2009/05/04(月) 12:59:42左辺値をそういう指定しちゃダメじゃないか?
0955デフォルトの名無しさん
2009/05/04(月) 13:00:58規格票で条件演算子のところを見てみようぜ。
> 5.16 二択条件演算子
> 二択条件式:
> 論理和式
> 論理和式 ? 式 : 代入式
コロンの後ろには代入式が来ると定義されているのでa ? b : c = 4はa ? b : (c = 4)と解釈される。
条件演算子が代入演算子より優先順位が高いというのは「a = c ? 1 : 2」のような場合。
なお、C++では括弧付けて(a ? b : c) = 4と書けば、bまたはcに4が代入されるという意味になる。
ANSI Cと違ってbとcが同じ型の左辺値なら、条件式の結果も左辺値になるためエラーにならない。
0956948
2009/05/04(月) 13:10:19本当だ、規格引いてなかった。
吊ってくる。
0957デフォルトの名無しさん
2009/05/04(月) 13:16:04ありがとうございます。
演算子には単に優先順位と結合規則以外にも
いろいろなルールがあるんですね。
すごく複雑。
0958デフォルトの名無しさん
2009/05/04(月) 14:37:23同時にアクセスされない2つのメンバ変数int iとchar cがあるとき、
これらをunionでまとめるとメモリが節約できるとの事だけど、
これは代償として遅くなる?
structでまとめた方が速かったりする?
0959デフォルトの名無しさん
2009/05/04(月) 14:39:44速くない。
0960デフォルトの名無しさん
2009/05/04(月) 14:42:42じゃあunionのが言い訳か。thx
0961960
2009/05/04(月) 14:44:33○unionのが良いわけ
0962デフォルトの名無しさん
2009/05/04(月) 14:46:48この言葉で,unionの危険性は回避されない
0963デフォルトの名無しさん
2009/05/04(月) 14:47:43具体的に。
0964デフォルトの名無しさん
2009/05/04(月) 14:49:27メンバ変数int iを持つクラスと、char cを持つクラスを別に作った方がいいんじゃない?
0965デフォルトの名無しさん
2009/05/04(月) 14:50:110966デフォルトの名無しさん
2009/05/04(月) 14:50:400967デフォルトの名無しさん
2009/05/04(月) 14:51:29あまりいじめるなww
0968デフォルトの名無しさん
2009/05/04(月) 14:52:380969960
2009/05/04(月) 14:53:122つのメンバ変数int iとchar cに同時にアクセスせず、
その値を取り出す時は現在どちらの値として入っているのかを
ちゃんとチェックして取り出すつもりだったんだが
それだけではunionは危険なのかい?
俺はこの条件で大丈夫だと思っていたのだが。。。
0970デフォルトの名無しさん
2009/05/04(月) 14:54:170972デフォルトの名無しさん
2009/05/04(月) 14:56:16>ちゃんとチェックして取り出すつもりだったんだが
この説明が入っていれば問題はない。
後出しじゃんけんんの勝利おめでとw
0973デフォルトの名無しさん
2009/05/04(月) 14:56:220974デフォルトの名無しさん
2009/05/04(月) 14:58:000975デフォルトの名無しさん
2009/05/04(月) 14:59:120976960
2009/05/04(月) 14:59:13煽らないでくれよ、
俺は喧嘩したいわけじゃないんだ。
みんな仲良くしてくれ、俺の質問のために喧嘩しないでくれ。
教えてくれた人たちありがとう。
0977デフォルトの名無しさん
2009/05/04(月) 15:02:29そういう仕様がほしいなら、boost::variantを授けよう。
0978デフォルトの名無しさん
2009/05/04(月) 15:04:43知って使えば有用だし、濫用すれば毒になる。
毒にも薬にもなるって典型だよね。
0980デフォルトの名無しさん
2009/05/04(月) 15:06:150981デフォルトの名無しさん
2009/05/04(月) 15:08:49あれってメモリ節約できないんか。
じゃあ一方を有効にした時 他方へアクセスできないようにしなきゃならない事情のある時に使う代物か。
0982デフォルトの名無しさん
2009/05/04(月) 15:10:15チェック処理を入れるなら、チェック処理の分遅くなるんじゃない?
0983デフォルトの名無しさん
2009/05/04(月) 15:11:390984960
2009/05/04(月) 15:13:03必ずしもチェック処理入れるつもりはありません。
状況次第で確実にどちらか判別付くならチェック処理しません。
例えばある関数fooから呼び出した時はunionのint xの方へアクセスすることが確実で、
しかも前後関係からunionのint xが必ず有効だと分かっているなど。
0986デフォルトの名無しさん
2009/05/04(月) 15:15:120987デフォルトの名無しさん
2009/05/04(月) 15:45:030988デフォルトの名無しさん
2009/05/04(月) 15:47:190989デフォルトの名無しさん
2009/05/04(月) 15:52:23価値があるかどうかはその人の価値観と状況の差だと思う。
組み込み系だったりするとまた話も違うだろう。
0990デフォルトの名無しさん
2009/05/04(月) 16:06:13クラスならPODじゃないと入れられないから気を付けろよ
0991デフォルトの名無しさん
2009/05/04(月) 16:19:24チェックされるならデバッグが簡単になる。
0992デフォルトの名無しさん
2009/05/04(月) 16:31:25そういやそんな制限もあったなぁ。unionなんて久しく使ってなかった。
0993デフォルトの名無しさん
2009/05/04(月) 16:44:280994デフォルトの名無しさん
2009/05/04(月) 17:04:38もしくはそう言ったのが分かる参考サイト教えてくださいませんか?
0995デフォルトの名無しさん
2009/05/04(月) 17:17:311001以後が立てる
0996デフォルトの名無しさん
2009/05/04(月) 21:07:11part63, part66 が重複していたようですのでとりあえず part69 としました。
スレ番、次スレ誰が立てるか、テンプレ等は適当に議論してもらえればと思います。
C++相談室 part69
http://pc12.2ch.net/test/read.cgi/tech/1241438694/
0997デフォルトの名無しさん
2009/05/04(月) 21:10:42ありがとう!
0998デフォルトの名無しさん
2009/05/04(月) 21:11:06乙
0999デフォルトの名無しさん
2009/05/04(月) 21:23:421000デフォルトの名無しさん
2009/05/04(月) 21:24:5310011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。