C++相談室 part9
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG(´∀`).。o(関連URLは>>2-5の辺り)
0232デフォルトの名無しさん
NGNG0233デフォルトの名無しさん
NGNG実際のところはsendだけでいいんでしょうか?
0234デフォルトの名無しさん
NGNG当然sendをするに当たって前準備などをしなければならない。
0235デフォルトの名無しさん
NGNGとりあえずインターネット(つーか、TCP/IP)とのデータのやりとりには
WinSockっつーAPI体系を使うのが普通なのでそれを調べてみては。
っていうか、このスレって処理系依存、環境依存の話もOKなのか?
漏れは最近見始めたからよく知らないんだが。
C++のスレって言うと、言語仕様だとかライブラリだとかの話題
なんじゃないの?とふと思った。
0236デフォルトの名無しさん
NGNG環境に依存していたとしても、C++的な問題の可能性があるなら
ここで振ってもいいのでは?
おしえて君は勘弁だが、なんでもかんでも環境依存うぜえという
わけではないと思うぞ。
0237デフォルトの名無しさん
NGNG> C++のスレって言うと、言語仕様だとかライブラリだとかの話題
原則としてはそうだけど、C++ だと Java や Perl と比較すると標準ライブラリが
全然充実してないし、非標準でも TCP/IP の話などは多くの環境で共通する話
題なので、あまり厳密にやらんでも良いかと。
もし他に適切なスレがあるようなら、やんわりと誘導するって事で。
0238デフォルトの名無しさん
NGNGシリアライズまでは求めません
つか、みんなどうしてんの??
初心者本はfwirte止まりだし、アホかと。
0239デフォルトの名無しさん
NGNG普通はoperator <<をオーバーロードするんじゃないかな。
#include <iostream>
namespace my{
class Foo{};
// この関数はnamespaceの中にあるにもかかわらず、適切に呼ばれる
template <class charT >
std::basic_ostream<charT>&
operator << (std::basic_ostream<charT>& os, Foo&)
{
return os << "Foo";
}
} // namespace my
int main ()
{
my::Foo a;
std::cout << a << std::endl;
std::wcout << a << std::endl;
}
0241デフォルトの名無しさん
NGNGsave対象の全種のオブジェクトに対して書く必要があるでしょ。それはエレガントじゃないと。
基本形 MyObj について書くのはいいけど MyObj をSTLと組み合わせた場合なんかどうするのかと。
template<classT> saver& oeprator<<(saver&, T &t) と
template<classT> saver& operator<<(saver&, vector<T> &t)
はあいまいさが解決できずに共存できない罠…
STLとの組み合わせならfor_each()を使うなりすればいいし。
ていうか
template<class T> saver& oeprator<<(saver&, T &t)
template<class T> saver& operator<<(saver&, vector<T> &t)
これがどう曖昧なのか分からないんですが、私の知識不足?
0244デフォルトの名無しさん
NGNGT::const_iterator i, e;
e = t.end();
for(i=t.begin(); i!=e; ++i) o << *i;
}
template<> ostream& operator<<(ostream &o, const 任意& t){...}
0245デフォルトの名無しさん
NGNGサイズでなく、配列全体のサイズを返すのですが何故ですか?
その他は納得しています。
int main()
{
double d;
int a[2][3];
cout << sizeof(d) << endl; //8と表示
cout << sizeof(&d) << endl; //4と表示
cout << sizeof(int) << endl; //4と表示
cout << sizeof(a) << endl; //24と表示
cout << sizeof(a[0]) << endl;//12と表示
cout << sizeof(&a) << endl; //24と表示??なんで?
}
0246デフォルトの名無しさん
NGNG親切設計
0247デフォルトの名無しさん
NGNG&a[0]と汁
0248デフォルトの名無しさん
NGNGaは存在するでしょ?a[0]とかがシンタックスシュガーでしょ?
0249デフォルトの名無しさん
NGNG0250デフォルトの名無しさん
NGNGvc++: 8 4 4 24 12 24
g++: 8 4 4 24 12 4
0251デフォルトの名無しさん
NGNGポインタと配列勉強しようね。
0252デフォルトの名無しさん
NGNG文法を簡便化するために、作られた記法。
0253デフォルトの名無しさん
NGNGエラーとかならわかるけど
0254デフォルトの名無しさん
NGNGそれについての合理的な説明は今まで聴いたこと無い。
ただ文法としてそう決められているというだけ。
K&Rにもそんな記述は載っていないから
素直にsizeof(a)を使うほうが無難。
0255デフォルトの名無しさん
NGNG様は、2次元配列か、ポインタの1次元配列か区別が出来ないということらしい
int a[2][3];
int *a[2];
int **a;
int (*a)[3];
どれも a[][]でアクセス出きるのが、上の4パターンのどの宣言かわからんらしい
0256デフォルトの名無しさん
NGNG0257デフォルトの名無しさん
NGNG025811
NGNGsizeof(a)==sizeof(&a)だなんて、そんな馬鹿な!!!!
bccで試したらtypeid(a)==typeid(&a)==INT[2][3]だと!そんなアホな!!!
The result of unary & operator is a pointer to its operand.
って書いてあるだろうが。どこにも特例は出てないぞ!!
でてたら誰か教えてくれ!!!
gccが正しいとみた
0259デフォルトの名無しさん
NGNG0260デフォルトの名無しさん
NGNGsizeofの被演算子で配列名指定すると配列全体のサイズ
が返ってくるのは常識だが。その他の文脈ではaは&a[0]
の意味になるはず。
0261デフォルトの名無しさん
NGNG<配列→ポインタの読み換え>
式の中では、配列は「先頭要素へのポインタ」に読み換えられる。
int a[10];
の時、式の中では、a と &a[0]は同じ意味となる。
ただし、以下の個所は例外である。
1、sizeof演算子のオペランド
sizeof演算子は、ポインタのサイズではなく、配列自体のサイズを返す。
2、& 演算子のオペランド
& 演算子は、配列全体のアドレスを返す。
配列から読み換えられたポインタは左辺値を持たないため、
& 演算子のオペランドにはならないはずであるが、この例外規則のため、
& でアドレス(配列の先頭要素のアドレスではなく、配列全体のアドレス)が 取得できる。
この規則は初心者を混乱させることがある
(例えば scanf("%s", buf) でなく、scanf("%s", &buf)と書いても 正常に動いてしまう)が、
メリットは今ひとつわからない。
3、初期化時の文字列リテラル
char の「配列」を初期化する場合の文字列リテラルは、
中括弧内に文字を区切って書く初期化子の省略形である。
char の「ポインタ」を初期化する場合の文字列リテラルとの 違いに注意すること。
0262245
NGNGaは配列オブジェクトですよね。
型でいうとint [2][3]です。つまりサイズは24バイト。
&aは配列全体へのポインタで(ANSI規格より)、型は
int (*)[2][3]ですよね。ポインタなんだから、double d
に対するsizeof(&d)と同じく4バイトが正しいと思うんです。
>>255
なんか正しそう。なんて本ですか?
>>256,257
単なる興味だけです。。どうも気持ち悪くて。
0263デフォルトの名無しさん
NGNG026411
NGNG>&aは配列全体へのポインタで(ANSI規格より)、型は
>int (*)[2][3]ですよね。ポインタなんだから、double d
>に対するsizeof(&d)と同じく4バイトが正しいと思うんです。
よしよし、同志だな。ただdouble*とint(*)[2][3]の
サイズが同じだとはどこにも決まっていないな。
問題はtypeid(a)==typeid(&a)なことだ!!
0265デフォルトの名無しさん
NGNGつくるよね。
静的な配列にも概念的にはこれが存在するが、その実装はコンパイラ依存だし
直接アクセスすることもできないから、Cでは今回の件に関して
このような仕様になっているんじゃないの?
026611
NGNG具体的にアドレスが何なのかは処理系依存だったと思う
0267245
NGNGgccが正しいのかな?それだと何も疑問無いんだけどな。
>>255
int a[2][3]; --> int [2][3]型 -->配列全体のサイズ
int *a[2]; --> int* [2]型 -->ポインタ二つ分のサイズ
int **a; --> int **型 -->int*へのポインタのサイズ
int (*a)[3]; --> int (*)[3]型 -->配列へのポインタのサイズ
cout << sizeof(int [2][3]) << endl;
cout << sizeof(int* [2]) << endl;
cout << sizeof(int **) << endl;
cout << sizeof(int (*)[3]) << endl;
と明示的に型指定すると24,8,4,4と出るなあ。
これは納得。bcc5.5.1です。
0268254
NGNG>...と同じく4バイトが正しいと思うんです。
思うんですとか言われても現実にはsizeof(&a)=24という
腐った仕様が厳然と存在してしまっている。
君の取るべき道は三つだ。
・そういうものかと納得する。
・あきらめてC/C++をやめる。
・憶測や妄想を捨て作者に歴史的経緯を聞いてここで報告する。
0269デフォルトの名無しさん
NGNG0270245
NGNG>ただdouble*とint(*)[2][3]の
>サイズが同じだとはどこにも決まっていないな。
>問題はtypeid(a)==typeid(&a)なことだ!!
そうなんです。
027111
NGNG設計者のミスに違いない!!!
次のバージョンに期待
0273デフォルトの名無しさん
NGNGのですが、なぜでしょうか?
class A {
public:
virtual void print() const { cout << 10 << endl; }
};
class B : public A {
public:
void print() const { cout << 20 << endl; }
};
int main()
{
typedef void (A::*afunc)() const;
cout << "A::print = " << hex << (afunc)A::print << endl;
cout << "B::print = " << hex << (afunc)B::print << endl;
}
0274デフォルトの名無しさん
NGNG言語仕様。
0275デフォルトの名無しさん
NGNGA::printってなによ?非staticでしょ?
027611
NGNGint a[2][3];
について
int (*p)[2][3]=&a;
が可能であるが、
array to pointer conversionではint[2][3]はint(*)[3]へ
変換されるはずだから、typeid(a)==typeid(&a)だとすると
上のはおかしい。つまり変換(standard convertion)は行われていない。
そこで&aはsizeof(&a)でもtypid(&a)でも式でもint(*)[2][3]となるはず。
だから(typeid(a)==typeid(&a)が)ANSIから外れているのはまず間違いない。
0277デフォルトの名無しさん
NGNGうーんメンバ関数のアドレスを表示したいんです。
例えば
A aa;
としておいて、
(aa.*a)(); とすれば、"a"、つまり10が表示されます。関数を呼び出す
のではなく、関数のアドレスを表示したいのです。
0278デフォルトの名無しさん
NGNG((char*)aa + (char*)&A::print)
0279デフォルトの名無しさん
NGNGエラー E2031 virtual.cpp 20: 'void (A::*)() const' から 'char *' へのキャストはできない(関数 main() )
と出てしまいました。
0280245
NGNG確かに、
int (*p)[2][3]=&a; で
sizeof(p)は4を返しますからね。
0281デフォルトの名無しさん
NGNGメンバ変数なら0からキャストするとして、メンバ関数は無理じゃないの?
ましてや仮想関数だし
0282デフォルトの名無しさん
NGNG&aa
0283デフォルトの名無しさん
NGNGということは、メンバ関数のアドレスを取って呼び出すことは可能でも、
メンバ関数のアドレスを表示することは不可能ということなのでしょうか。
仮想関数でなくしても(virtualを取っても)、やはりできないようです。
0284デフォルトの名無しさん
NGNG(char *)&aa + (char *)&A::print としても同じエラーが出ます。
0285デフォルトの名無しさん
NGNGは?
028611
NGNGど〜よ
class A{
public:
virtual void foo(void) {}
} ;
main(){
void (A::*t)(void)=&A::foo;
void *p=&t;
cout<<hex<<*(int*)p<<endl;
}
0287デフォルトの名無しさん
NGNGだめみたいです。やはり無理みたいです。
エラー E2094 virtual.cpp 24: << 演算子が使われたがクラス ostream では void (* (_closure )())() 型のための定義が存在しない(関数 main() )
0288デフォルトの名無しさん
NGNGprintf("%xで出すのはどうだい?
0289デフォルトの名無しさん
NGNGうまくいきました!どうやら、メンバ関数のポインタは、一度 void * に
代入して、コンパイラを騙してから、アドレスを見る必要がありそうですね!
0290デフォルトの名無しさん
NGNGそれでもうまくいきました。つまり、出力演算子 << が対応してないための
ようです。
029111
NGNGclass A{
public:
virtual void foo(void) {}
} ;
main(){
void (A::*t)(void)=&A::foo;
cout << hex << *(int**)(void*)&t<<endl;}
>>288
その手があったか
0292デフォルトの名無しさん
NGNGcout << hex << *(int*)(void*)&t<<endl;} でもいいようですね。
0293デフォルトの名無しさん
NGNGcout << hex << *(unsigned*)&t<<endl;
029411
NGNGサイズが同じ型なら何でも。思いっきり処理系依存だけども
ただ、これがメンバ関数へのアドレスであるという保証はどこにも…
ビットパターンがそうだというだけで
029511
NGNGあちゃ〜〜、下手うった
0296デフォルトの名無しさん
NGNGそうですね。手持ちの本「C++標準ライブラリ」で、Cの "%p" に当たる
出力方法を探してみましたが見つかりませんでした。
処理系依存にならない方法があればいいのですがわかりません。
C++の内部のメカニズムをいじくり回すようなプログラムは書きにくく
なっているのかな。
0297デフォルトの名無しさん
NGNGつーか、"%p"自体が元々処理系依存。
029811
NGNG*(T*)&tのsizeof(T)を一致させる話ね。いちおう
0299デフォルトの名無しさん
NGNGエキスパートCプログラミング 知られざるCの深層 アスキー出版
面白い本だけど、今回の問題はコラム扱いで >>255以上の事はあまりのってない
立ち読みするなら P261 だ
0300デフォルトの名無しさん
NGNG次のような配列への参照は、最初の要素へのポインタに自動では置き換えられない
1sizeof()の中の配列
2&演算子によって配列のアドレスが取得される場合
3配列が、初期化に使われる文字列リテラル、またはワイド文字列リテラルの場合
0301デフォルトの名無しさん
NGNGcout << sizeof(&"テストだゴルァ") <<endl;
両方とも 同じ結果です
0302300
NGNG0303デフォルトの名無しさん
NGNG0304245
NGNGどうもです。今度見てきます。
0305デフォルトの名無しさん
NGNGthis.じゃなくて、this->とか(*this).じゃないと駄目だよなぁ…。
でもメール受け付けてないし、直りそうに無いな。。
0306デフォルトの名無しさん
NGNG0307デフォルトの名無しさん
NGNG生産性が高くなるし、コードは簡潔で見易くこの上ない
0308デフォルトの名無しさん
NGNG&aで配列全体のアドレス(ポインタ)になって、sizeof(&a)で、
int (*p)[2][3]=&a;sizeof(p);になって結局4になるのが
正しいように見えるけど?
&aと書いた時点で、それはもう配列じゃなくて配列へのポインタ
に変わってしまってるわけだから、>>300の1番目の規則は
適用できないはず。
配列全体のサイズを返してしまう処理系が間違ってるか、もしくは
本の記述が間違ってるとしか考えられない。
0309デフォルトの名無しさん
NGNG2番目の規則が適用されるんじゃないの?
0310308
NGNGその値をsizeofに渡してるわけだから1の規則はあてはまらない。
1はアドレスじゃなくて配列の名前を渡した時だから。
0312デフォルトの名無しさん
NGNG1はsizeof()の中の配列とかいてあるだけで、名前で渡すとか、
アドレスで渡すとか書いてないよ
0313308
NGNGいや、でも「配列へのアドレス」はポインタとは言えるかもしれないが、
配列じゃないだろ。
>>261のURL見ても、a[10]のaのことを配列と言ってるようだし。
まず、この場合は4にならなくちゃおかしい。
それで、「配列への参照」とは言えるかも知れない。だから、>>300
の方はあってるかもしれない。
でもそうなるとint (*p)[2][3]=&a;sizeof(p);だって、配列全体
の大きさにならなくちゃおかしい。これだって「配列への参照」だから。
でも過去レスでは4になったと言っている。
となると、結局どっちにしろ駄目だと思うんだが…
0314デフォルトの名無しさん
NGNGpはポインタだろ。配列の先頭を指す
0316デフォルトの名無しさん
NGNGpは左辺値になりうる。
&aは左辺値じゃないだろ?
別物だよ
0317308
NGNGまあそうだな。
だったら、左辺値のポインタならポインタのサイズになって、右辺値の
ポインタならsizeofは配列全体を返すというべきだ。
それなら、つじつまが合う。
でもそうだとすると>>300と>>261の記述は間違ってるぞ。
右辺値とか左辺値とか言ってない。そもそも「右辺値のアドレス」には
変換されないと言ってるように感じられる。
0318デフォルトの名無しさん
NGNG左辺値の話は、あなたが
>そう思うよ。だけど、&aだってそうだろ
と書き、pと&aを同一視しようとしたから書いただけ。
0319308
NGNGそう思ったのなら、俺の言い方が悪かったかな。
どちらもポインタではあるといいたかっただけ。
俺が一番問題にしたいのは、本の記述と処理系の動作が違ってるのでは
ないかということ。
0320デフォルトの名無しさん
NGNG&aはポインタであると確定しているの?
0321308
NGNG少なくとも「アドレス」とは言ってるな。あと、>>261のリンク先では
&a[0]等、「&なになに」をポインタと言ってる。
それに、「配列はポインタに置き換えられる」と言ってる場合のポインタは
右辺値のアドレスじゃないとおかしい。a[10]の時のaは左辺値では無いから。
0322デフォルトの名無しさん
NGNG割り当てているだけでは?つまり処理系依存
0323308
NGNGその件はまた一つの議論になるし、処理系依存でも俺はアドレスと言ってしまっていいと思うが、
ここではそういう議論は置いといて、便宜上「アドレス」と読んで話しをすすめれば
いいんじゃないかな。>>261もそうしているようだし。
0324デフォルトの名無しさん
NGNGいいんじゃない?
0325デフォルトの名無しさん
NGNG(長文かいていたらすまそ)
0326308
NGNG俺の中では記述と現実が食い違ってるって結論だから、
返事待ち。
0327デフォルトの名無しさん
NGNG俺の中では処理系依存である部分の違いを細かく追及することが無意味だって
結論です。
0328308
NGNGだから、その話は関係ないのでは?それは表現の問題で、
>>300と>>261はその問題を無視し(あるいは無視せず)、アドレスとして
話しを進めている。だから、それにのっとてここではポインタはアドレスと
して話を進めればいいのではないかって俺は言ってる。
で、sizeofの返す値の問題はまた別の問題だ。
0329デフォルトの名無しさん
NGNGあなたが納得できない理由がそこにある。
0330デフォルトの名無しさん
NGNG0331デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています