■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part9
251 名前:デフォルトの名無しさん :02/07/29 17:18
>>248 は?
ポインタと配列勉強しようね。


252 名前:デフォルトの名無しさん :02/07/29 17:24
・シンタックスシュガー
    文法を簡便化するために、作られた記法。

253 名前:デフォルトの名無しさん :02/07/29 17:27
でも、なんで 24になるわけ? 普通a[0]と解釈されるわけでしょ?
エラーとかならわかるけど

254 名前:デフォルトの名無しさん :02/07/29 17:28
>>245
それについての合理的な説明は今まで聴いたこと無い。
ただ文法としてそう決められているというだけ。
K&Rにもそんな記述は載っていないから
素直にsizeof(a)を使うほうが無難。

255 名前:デフォルトの名無しさん :02/07/29 17:43
書いてある本発見
様は、2次元配列か、ポインタの1次元配列か区別が出来ないということらしい

int a[2][3];
int *a[2];
int **a;
int (*a)[3];

どれも a[][]でアクセス出きるのが、上の4パターンのどの宣言かわからんらしい


256 名前:デフォルトの名無しさん :02/07/29 17:46
要は、int a[2][3]に関してsizeof(&a)なんてやるな、と。

257 名前:デフォルトの名無しさん :02/07/29 17:49
逆にsizeof(&a)を使う「べき」ってケースはあるの?


258 名前:11 :02/07/29 17:55
なんだとおおお!!
sizeof(a)==sizeof(&a)だなんて、そんな馬鹿な!!!!
bccで試したらtypeid(a)==typeid(&a)==INT[2][3]だと!そんなアホな!!!
The result of unary & operator is a pointer to its operand.
って書いてあるだろうが。どこにも特例は出てないぞ!!
でてたら誰か教えてくれ!!!

gccが正しいとみた

259 名前:デフォルトの名無しさん :02/07/29 17:56
↑の4パターン(添字を変えたところで)のどれも 24にはならないような…?

260 名前:デフォルトの名無しさん :02/07/29 17:58
>>247
sizeofの被演算子で配列名指定すると配列全体のサイズ
が返ってくるのは常識だが。その他の文脈ではaは&a[0]
の意味になるはず。

261 名前:デフォルトの名無しさん :02/07/29 18:07
ttp://member.nifty.ne.jp/maebashi/programmer/pointer.html より。

<配列→ポインタの読み換え>

式の中では、配列は「先頭要素へのポインタ」に読み換えられる。

int a[10];

の時、式の中では、a と &a[0]は同じ意味となる。

ただし、以下の個所は例外である。

1、sizeof演算子のオペランド

sizeof演算子は、ポインタのサイズではなく、配列自体のサイズを返す。


2、& 演算子のオペランド

& 演算子は、配列全体のアドレスを返す。
配列から読み換えられたポインタは左辺値を持たないため、
& 演算子のオペランドにはならないはずであるが、この例外規則のため、
& でアドレス(配列の先頭要素のアドレスではなく、配列全体のアドレス)が 取得できる。
この規則は初心者を混乱させることがある
(例えば scanf("%s", buf) でなく、scanf("%s", &buf)と書いても 正常に動いてしまう)が、
メリットは今ひとつわからない。


3、初期化時の文字列リテラル

char の「配列」を初期化する場合の文字列リテラルは、
中括弧内に文字を区切って書く初期化子の省略形である。
char の「ポインタ」を初期化する場合の文字列リテラルとの 違いに注意すること。

262 名前:245 :02/07/29 18:08
>>254
aは配列オブジェクトですよね。
型でいうとint [2][3]です。つまりサイズは24バイト。
&aは配列全体へのポインタで(ANSI規格より)、型は
int (*)[2][3]ですよね。ポインタなんだから、double d
に対するsizeof(&d)と同じく4バイトが正しいと思うんです。

>>255
なんか正しそう。なんて本ですか?

>>256,257
単なる興味だけです。。どうも気持ち悪くて。

263 名前:デフォルトの名無しさん :02/07/29 18:11
配列全体のアドレスっつうのは、範囲ということなのか?

264 名前:11 :02/07/29 18:14
>>262
>&aは配列全体へのポインタで(ANSI規格より)、型は
>int (*)[2][3]ですよね。ポインタなんだから、double d
>に対するsizeof(&d)と同じく4バイトが正しいと思うんです。

よしよし、同志だな。ただdouble*とint(*)[2][3]の
サイズが同じだとはどこにも決まっていないな。
問題はtypeid(a)==typeid(&a)なことだ!!


265 名前:デフォルトの名無しさん :02/07/29 18:15
動的に二次元配列もどきをつくるとき、いったんポインタの1次元配列を
つくるよね。
静的な配列にも概念的にはこれが存在するが、その実装はコンパイラ依存だし
直接アクセスすることもできないから、Cでは今回の件に関して
このような仕様になっているんじゃないの?

266 名前:11 :02/07/29 18:18
>>263
具体的にアドレスが何なのかは処理系依存だったと思う

267 名前:245 :02/07/29 18:20
>>258
gccが正しいのかな?それだと何も疑問無いんだけどな。

>>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です。

268 名前:254 :02/07/29 18:23
>>262=245
>...と同じく4バイトが正しいと思うんです。
思うんですとか言われても現実にはsizeof(&a)=24という
腐った仕様が厳然と存在してしまっている。
君の取るべき道は三つだ。
・そういうものかと納得する。
・あきらめてC/C++をやめる。
・憶測や妄想を捨て作者に歴史的経緯を聞いてここで報告する。

269 名前:デフォルトの名無しさん :02/07/29 18:23
気持ちはわからんでもないが、正直どうでもいい話だ。

270 名前:245 :02/07/29 18:24
>>264
>ただdouble*とint(*)[2][3]の
>サイズが同じだとはどこにも決まっていないな。
>問題はtypeid(a)==typeid(&a)なことだ!!

そうなんです。

271 名前:11 :02/07/29 18:28
>>268
設計者のミスに違いない!!!
次のバージョンに期待

272 名前:245 :02/07/29 18:30
>>268>>269
その仕様が言語仕様なのか処理系依存なのか
分かればスッキリするんですが。

・見なかったことにします。
皆さん忘れてください。

273 名前:デフォルトの名無しさん :02/07/29 18:32
仮想関数のアドレスを表示しようとすると "1" としか表示されない
のですが、なぜでしょうか?

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;
}

274 名前:デフォルトの名無しさん :02/07/29 18:33
>>272
言語仕様。

275 名前:デフォルトの名無しさん :02/07/29 18:36
>>273
A::printってなによ?非staticでしょ?

276 名前:11 :02/07/29 18:41
>>272
int 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から外れているのはまず間違いない。

277 名前:デフォルトの名無しさん :02/07/29 18:44
>>275
うーんメンバ関数のアドレスを表示したいんです。
例えば

A aa;

としておいて、

(aa.*a)(); とすれば、"a"、つまり10が表示されます。関数を呼び出す
のではなく、関数のアドレスを表示したいのです。

278 名前:デフォルトの名無しさん :02/07/29 18:46
>>277
((char*)aa + (char*)&A::print)

279 名前:デフォルトの名無しさん :02/07/29 18:52
>>278
エラー E2031 virtual.cpp 20: 'void (A::*)() const' から 'char *' へのキャストはできない(関数 main() )
と出てしまいました。

280 名前:245 :02/07/29 18:55
>>276
確かに、
int (*p)[2][3]=&a; で
sizeof(p)は4を返しますからね。

281 名前:デフォルトの名無しさん :02/07/29 18:56
>>277
メンバ変数なら0からキャストするとして、メンバ関数は無理じゃないの?
ましてや仮想関数だし

282 名前:デフォルトの名無しさん :02/07/29 18:58
>>279
&aa

283 名前:デフォルトの名無しさん :02/07/29 18:59
>>281
ということは、メンバ関数のアドレスを取って呼び出すことは可能でも、
メンバ関数のアドレスを表示することは不可能ということなのでしょうか。

仮想関数でなくしても(virtualを取っても)、やはりできないようです。

284 名前:デフォルトの名無しさん :02/07/29 19:04
>>282
(char *)&aa + (char *)&A::print としても同じエラーが出ます。

285 名前:デフォルトの名無しさん :02/07/29 19:04
reinterpret_cast<A*>(0)->print
は?

286 名前:11 :02/07/29 19:08
>>283
ど〜よ
class A{
public:
virtual void foo(void) {}
} ;
main(){
void (A::*t)(void)=&A::foo;
void *p=&t;
cout<<hex<<*(int*)p<<endl;
}

287 名前:デフォルトの名無しさん :02/07/29 19:11
>>285
だめみたいです。やはり無理みたいです。
エラー E2094 virtual.cpp 24: << 演算子が使われたがクラス ostream では void (* (_closure )())() 型のための定義が存在しない(関数 main() )

288 名前:デフォルトの名無しさん :02/07/29 19:12
>>287
printf("%xで出すのはどうだい?

289 名前:デフォルトの名無しさん :02/07/29 19:14
>>286
うまくいきました!どうやら、メンバ関数のポインタは、一度 void * に
代入して、コンパイラを騙してから、アドレスを見る必要がありそうですね!

290 名前:デフォルトの名無しさん :02/07/29 19:17
>>288
それでもうまくいきました。つまり、出力演算子 << が対応してないための
ようです。

291 名前:11 :02/07/29 19:17
ちと冗長だった
class A{
public:
virtual void foo(void) {}
} ;
main(){
void (A::*t)(void)=&A::foo;
cout << hex << *(int**)(void*)&t<<endl;}

>>288
その手があったか

292 名前:デフォルトの名無しさん :02/07/29 19:21
>>291ありがとうございます。
cout << hex << *(int*)(void*)&t<<endl;} でもいいようですね。

293 名前:デフォルトの名無しさん :02/07/29 19:24
もっと単純にしてもよい。
cout << hex << *(unsigned*)&t<<endl;

294 名前:11 :02/07/29 19:26
>>292
サイズが同じ型なら何でも。思いっきり処理系依存だけども
ただ、これがメンバ関数へのアドレスであるという保証はどこにも…
ビットパターンがそうだというだけで

295 名前:11 :02/07/29 19:28
>>293
あちゃ〜〜、下手うった

296 名前:デフォルトの名無しさん :02/07/29 19:29
>>294
そうですね。手持ちの本「C++標準ライブラリ」で、Cの "%p" に当たる
出力方法を探してみましたが見つかりませんでした。

処理系依存にならない方法があればいいのですがわかりません。
C++の内部のメカニズムをいじくり回すようなプログラムは書きにくく
なっているのかな。

297 名前:デフォルトの名無しさん :02/07/29 19:31
>>296
つーか、"%p"自体が元々処理系依存。

298 名前:11 :02/07/29 19:38
処理系依存はsizeof(void(A::*)(void))と
*(T*)&tのsizeof(T)を一致させる話ね。いちおう

299 名前:デフォルトの名無しさん :02/07/29 20:57
>>255 の本だけど
エキスパートCプログラミング 知られざるCの深層 アスキー出版

面白い本だけど、今回の問題はコラム扱いで >>255以上の事はあまりのってない
立ち読みするなら P261 だ


300 名前:デフォルトの名無しさん :02/07/29 21:06
>>255 の本に以下のような記述あり

次のような配列への参照は、最初の要素へのポインタに自動では置き換えられない
1sizeof()の中の配列
2&演算子によって配列のアドレスが取得される場合
3配列が、初期化に使われる文字列リテラル、またはワイド文字列リテラルの場合


301 名前:デフォルトの名無しさん :02/07/29 21:11
cout << sizeof("テストだゴルァ") <<endl;
cout << sizeof(&"テストだゴルァ") <<endl;

両方とも 同じ結果です

302 名前:300 :02/07/29 21:22
ガイシュツでした スマソ

303 名前:デフォルトの名無しさん :02/07/29 23:12
245の質問自体が112あたりの外出

304 名前:245 :02/07/30 01:54
>>299
どうもです。今度見てきます。

305 名前:デフォルトの名無しさん :02/07/30 05:44
http://www.bohyoh.com/CandCPP/FAQ/FAQ00084.html
this.じゃなくて、this->とか(*this).じゃないと駄目だよなぁ…。
でもメール受け付けてないし、直りそうに無いな。。


306 名前:デフォルトの名無しさん :02/07/30 06:16
C++とC言語ってどこがどう違うんですか?


307 名前:デフォルトの名無しさん :02/07/30 06:20
いやーC++最高
生産性が高くなるし、コードは簡潔で見易くこの上ない

308 名前:デフォルトの名無しさん :02/07/30 07:43
>>300>>261が正しいとすると、
&aで配列全体のアドレス(ポインタ)になって、sizeof(&a)で、
int (*p)[2][3]=&a;sizeof(p);になって結局4になるのが
正しいように見えるけど?
&aと書いた時点で、それはもう配列じゃなくて配列へのポインタ
に変わってしまってるわけだから、>>300の1番目の規則は
適用できないはず。

配列全体のサイズを返してしまう処理系が間違ってるか、もしくは
本の記述が間違ってるとしか考えられない。

309 名前:デフォルトの名無しさん :02/07/30 07:44
>>308
2番目の規則が適用されるんじゃないの?

310 名前:308 :02/07/30 07:47
&aのaは2の規則により特別に配列だけど、&aの返す値はアドレスってことね。
その値をsizeofに渡してるわけだから1の規則はあてはまらない。
1はアドレスじゃなくて配列の名前を渡した時だから。

311 名前:308 :02/07/30 07:48
>>309
二番目の規則が適用されるのはわかってるけど、
それでも1が無いとsizeofの値は4になるはずだと思うんだが。

312 名前:デフォルトの名無しさん :02/07/30 07:50
>>310
1はsizeof()の中の配列とかいてあるだけで、名前で渡すとか、
アドレスで渡すとか書いてないよ


313 名前:308 :02/07/30 07:57
>>312
いや、でも「配列へのアドレス」はポインタとは言えるかもしれないが、
配列じゃないだろ。
>>261のURL見ても、a[10]のaのことを配列と言ってるようだし。
まず、この場合は4にならなくちゃおかしい。

それで、「配列への参照」とは言えるかも知れない。だから、>>300
の方はあってるかもしれない。
でもそうなるとint (*p)[2][3]=&a;sizeof(p);だって、配列全体
の大きさにならなくちゃおかしい。これだって「配列への参照」だから。
でも過去レスでは4になったと言っている。
となると、結局どっちにしろ駄目だと思うんだが…

314 名前:デフォルトの名無しさん :02/07/30 07:59
>>313
pはポインタだろ。配列の先頭を指す

315 名前:308 :02/07/30 07:59
>>314
そう思うよ。だけど、&aだってそうだろ。

316 名前:デフォルトの名無しさん :02/07/30 08:01
>>315
pは左辺値になりうる。
&aは左辺値じゃないだろ?
別物だよ

317 名前:308 :02/07/30 08:03
>>316
まあそうだな。
だったら、左辺値のポインタならポインタのサイズになって、右辺値の
ポインタならsizeofは配列全体を返すというべきだ。
それなら、つじつまが合う。
でもそうだとすると>>300>>261の記述は間違ってるぞ。
右辺値とか左辺値とか言ってない。そもそも「右辺値のアドレス」には
変換されないと言ってるように感じられる。

318 名前:デフォルトの名無しさん :02/07/30 08:06
>>317
左辺値の話は、あなたが
>そう思うよ。だけど、&aだってそうだろ
と書き、pと&aを同一視しようとしたから書いただけ。

319 名前:308 :02/07/30 08:08
>>318
そう思ったのなら、俺の言い方が悪かったかな。
どちらもポインタではあるといいたかっただけ。

俺が一番問題にしたいのは、本の記述と処理系の動作が違ってるのでは
ないかということ。

320 名前:デフォルトの名無しさん :02/07/30 08:10
>どちらもポインタではあるといいたかっただけ
&aはポインタであると確定しているの?

321 名前:308 :02/07/30 08:14
>>320
少なくとも「アドレス」とは言ってるな。あと、>>261のリンク先では
&a[0]等、「&なになに」をポインタと言ってる。
それに、「配列はポインタに置き換えられる」と言ってる場合のポインタは
右辺値のアドレスじゃないとおかしい。a[10]の時のaは左辺値では無いから。

322 名前:デフォルトの名無しさん :02/07/30 08:15
ポインタの実装に関する規定は何ら無く、多くの処理系では直接アドレスを
割り当てているだけでは?つまり処理系依存

323 名前:308 :02/07/30 08:18
>>322
その件はまた一つの議論になるし、処理系依存でも俺はアドレスと言ってしまっていいと思うが、
ここではそういう議論は置いといて、便宜上「アドレス」と読んで話しをすすめれば
いいんじゃないかな。>>261もそうしているようだし。

324 名前:デフォルトの名無しさん :02/07/30 08:21
>>323
いいんじゃない?

325 名前:デフォルトの名無しさん :02/07/30 08:28
どうした?つづけてください。
(長文かいていたらすまそ)

326 名前:308 :02/07/30 08:29
とりあえず、俺は言いたいことは言ったよ。
俺の中では記述と現実が食い違ってるって結論だから、
返事待ち。

327 名前:デフォルトの名無しさん :02/07/30 08:32
323で話を切ったのはそっちだよ。
俺の中では処理系依存である部分の違いを細かく追及することが無意味だって
結論です。

328 名前:308 :02/07/30 08:34
>>327
だから、その話は関係ないのでは?それは表現の問題で、
>>300>>261はその問題を無視し(あるいは無視せず)、アドレスとして
話しを進めている。だから、それにのっとてここではポインタはアドレスと
して話を進めればいいのではないかって俺は言ってる。
で、sizeofの返す値の問題はまた別の問題だ。

329 名前:デフォルトの名無しさん :02/07/30 08:36
この件について、配列のアドレスとポインタの関係は中核なんだが。
あなたが納得できない理由がそこにある。

330 名前:デフォルトの名無しさん :02/07/30 08:38
fjくさいな

331 名前:デフォルトの名無しさん :02/07/30 08:43
おわったか。

332 名前:308 :02/07/30 08:43
>>329
もう少し詳しく説明してくれない?
>>300>>261も(便宜上?)アドレス=ポインタ(右辺値)としながら
話しを進めてると思うし、そうなってる以上、実際にアドレス=ポインタで
あろうとなかろうと、話には関係ないと思う。


333 名前:308 :02/07/30 08:44
まとめると、

<現実(過去レスによるとbccらしい)>
1.左辺値pの時sizeof(p);は4
2.右辺値&aの時sizeof(&a);は配列のサイズ
<本の記述>
A.sizeof(配列)は配列のサイズ
B.配列とアドレスは別物(そうでないと記述に整合性が無い)

334 名前:デフォルトの名無しさん :02/07/30 08:47
「便宜上」ポインタ=アドレスとするから、
>この規則は初心者を混乱させることがある
などという表記にいたる。
実際にはそうでないのだから。あくまで便宜上に過ぎない

335 名前:308 :02/07/30 08:49
>>334
俺は便宜上に過ぎなくても関係ないと思うが。
じゃあ、ポインタが実際は「アドレス」じゃなくて、現実には「アドレフ」なるものだったと
すると(w、今までの話は「アドレス」を「アドレフ」に置き換えて話せばいいだけじゃない。

336 名前:デフォルトの名無しさん :02/07/30 08:51
>>335
ちがうと思う。
便宜上の仮定を置いたために配列のアドレスに関して例外的条項が発生した。
これはよりおおきなルール(実際の仕様)に帰れば吸収される例外である。
アドレフってなんだ?名称の問題ではない。

337 名前:308 :02/07/30 08:53
>>336
ん?例外的条項なんて事はとっくにわかってるよ。
で、その例外的条項を解説したのが>>300>>261なんだろ?
でも、その解説と現実が違ってるじゃないかということ。

あと、アドレフは適当ね。俺が勝手に作った言葉。

338 名前:デフォルトの名無しさん :02/07/30 08:55
>>337
だから、解説は便宜上の仮定の下になされたものであるから、現実と違って
当然だ。それはここにおける便宜上の仮定が常には真でないことによる

339 名前:308 :02/07/30 08:56
てか、「便宜上の仮定を置いたため」だとは思わないけどね。
それに、処理系依存でもなんでも数値で位置を表してたらなんでも「アドレス」だ
よ。OSの割り当てた物理アドレスと同じ数値じゃなかったとしてもね。
まあ、この二つの論点は今までの議論とは全く関係ないと思うけど。


340 名前:デフォルトの名無しさん :02/07/30 08:58
>>339
>思わないけどね。
って根拠は無いのですか?(その後ろにそれに、と続いているから)
コンパイラを実装して多分見方が変わる。
そろそろ出かけねばならんので、早めに切り上げたい。

341 名前:308 :02/07/30 09:00
>>338
ということは、「便宜上の仮定」なるもので話してるため、仮定と
現実とが食い違ってるってこと?
でも、その違いは関係ないように見えるんだけど。今回の違い
には影響ないと思うんだけど。sizeofの値の違いね。
どこがどのように影響してるんだ?これが判らないので詳しく解説してほしい。
それに、仮に影響があるとしても、そうなると、仮定のもとで説明するのは
間違いというか、問題があることになる。でも、仮定で説明しちゃってる。
どっちにしろまずい。

342 名前:308 :02/07/30 09:02
>>340
便宜上の仮定を置いたためじゃなくて、それとは関係ない例外規則じゃない?
配列の先頭要素へのポインタに変換されない例を解説してるわけでしょ?

343 名前:308 :02/07/30 09:02
>>340
というか、ここは2chなので切り上げてもらっても結構ですよ。
後でまた話すこともできるし、このまま放置するのも自由だし。

344 名前:デフォルトの名無しさん :02/07/30 09:04
便宜上の仮定を正円とすれば、Cの仕様はそこからわずかに飛び出ている。
だが、その正円を超えた部分は極少しであるから通常は問題ない。
今回の件はたまたまはみ出した部分。すなわち自分が動的に配列を割り当てた
時に生じる先頭へのポインタに相当する静的な配列におけるそれがコード内
つまりプログラマが制御できる範囲内にないことに起因する

345 名前:デフォルトの名無しさん :02/07/30 09:05
>>343
お言葉に甘えて失礼する

346 名前:308 :02/07/30 09:08
>>344
なんか意味わからんけど、ポインタの値=アドレスという仮定には
関係ないように見えるね。
仮定が間違いだと言うなら、ポインタの値=何かの数値で良いんだろ?
これで文句ないだろ。
で「何かの値」と「配列」は別物なわけだ。
ところが、sizeof (&a)すなわちsizeof(何かの値)が配列全体のサイズを返してる。
これは一体どういうことなんだ?
記述では sizeof(配列)が配列全体のサイズなはずだったのでは?

347 名前:デフォルトの名無しさん :02/07/30 09:14
質問
「配列への参照は、最初の要素へのポインタになる」
っていうのは、規格書のどこに書かれてるんですか?

348 名前:デフォルトの名無しさん :02/07/30 09:21
sizeof(配列)が配列全体のサイズであることと、sizeof(&a)も
そうであることとは矛盾無いのに

349 名前:308 :02/07/30 09:27
>>347
例外がいくつかあるらしいけど、ISO99の方だと、6.3.2.1の3に書いてあった。
>3 Except when it is the operand of the sizeof operator or the unary & operator, or is a
>string literal used to initialize an array, an expression that has type ‘‘array of type’’ is
>converted to an expression with type ‘‘pointer to type’’ that points to the initial element of
>the array object and is not an lvalue. If the array object has register storage class, the
>behavior is undefined.
これみると、本の記述じゃなくて処理系が違ってる?ように思えるが・・・
1993の方は持ってない。

>>348
なんで?右側はsizeof(ポインタ)じゃあないの?

350 名前:308 :02/07/30 10:11
cygwinのg++使ったらちゃんとsizeof(&a)は4返した…
と思ったら過去ログにもそう書いてたったね。
g++と>>300>>261と規格書が正しくて、VCとBCCが間違ってると
すれば全てのつじつまが合う。。。
ていうか、もう俺はそうに違いないと確信しました。

351 名前:デフォルトの名無しさん :02/07/30 10:39
規格書にあってないとすると・・・・
完全準拠は名乗れない!?

352 名前:308 :02/07/30 10:59
あと、ISO99みると、&は「アドレスを返す」と明記されてるので、少なくとも
ISO99ではポインタはアドレスだな。
あと、「処理系にまかされてるから違う」って言うが、処理系がどんなめちゃくちゃな割り当てをし
ても、最低限、違うポインタを区別できるような値が割り当てられるわけだから、
「アドレス」と呼べるだろう。
ここでの「アドレス」はOSの割り当てた物理アドレスとは違って、もっと一般的な意味。
言葉の定義の問題。

353 名前:デフォルトの名無しさん :02/07/30 11:07
>>352
ついでに教えてくれ、どこに書いてあった?
教えてクンですまそ

354 名前:デフォルトの名無しさん :02/07/30 11:10
&a = ポインタ という大前提はどこに記述されてるのか教えちくり

355 名前:353 :02/07/30 11:16
自分で調べる前に掻きこんじまった
すまそ

C99の6.5.3.2
3
The unary & operator returns the address of its operand.
If the operand has type ‘‘type’’ ,
the result has type ‘‘pointer to type’’.

長いので後は略

356 名前:デフォルトの名無しさん :02/07/31 06:13
保守保守ほほ

357 名前:デフォルトの名無しさん :02/07/31 07:59
aが配列なら。aと&aはまったく同じだろ。

>>300は、aまたは&aを&(a[0])と読み替えるシンタックスシュガーが
働かない条件だろ?


358 名前:デフォルトの名無しさん :02/07/31 08:16
>>357
全然違う。
aは配列型であって、これは例外を除いて最初の要素へのポインタへ変換される。
次に、&aは配列全体へのポインタ。最初の要素へのポインタとは型が違う。
>>300は前者の例外。

359 名前:デフォルトの名無しさん :02/07/31 08:19
>>357
>aまたは&aを&(a[0])と読み替えるシンタックスシュガーが
>働かない条件だろ?

これを言うなら、
「aを(&a[0])と読み替えることができない条件だろ?」となる。
ついでに、これはシンタックスシュガーではない。あくまで
aと(&a[0])は違うものであって、前者の型変換作業が行われ
て結果的に同じなる事が多い。

360 名前:学生 :02/07/31 08:56
あの・・・
デフォルト実引数は関数の宣言・定義、どちらに書くべきでしょうか

361 名前:デフォルトの名無しさん :02/07/31 09:48
>>357
112から読み直せ

362 名前:デフォルトの名無しさん :02/07/31 09:49
宣言

363 名前:学生 :02/07/31 10:10
>>362
ご返答ありがとうございました。

364 名前:デフォルトの名無しさん :02/07/31 12:25
コメントについて質問なんだけど

""の中で*/を使うとそこでコメントが終了してるみたいなんだけど。
どうなん?

[例]

/*
" */ "




365 名前:デフォルトの名無しさん :02/07/31 12:29
>>364 そうなんよ なんや困りはりますえ?

366 名前:364 :02/07/31 12:35
" // "
" /* "
は無効化されてるのに
" */ "
だけ有効になってるのってどう考えてもおかしいと思うんだが。

一気にコメントアウトしたときに
めっちゃ不便やん。

/*
....
cout << " */ "; //ここでコメント終了かよ
....
*/

367 名前:デフォルトの名無しさん :02/07/31 12:37
>>364
だってコメントの中の"〜"は文字列と見なされないし。

368 名前:デフォルトの名無しさん :02/07/31 12:42
>>366 あんたはんちょかやな

コメントには /* */を使うのやえ コメントアウトは
普通 #if 〜#end でおすえ


369 名前:デフォルトの名無しさん :02/07/31 12:43
>>368
> #end

さらしあげ

370 名前:364 :02/07/31 12:46
ようわからんが、
複数行に渡るコメント/**/
は""の中にあるかも判断すると
コンパイラ作るのが面倒になるから
単純に最初の*/で判定してるってことで納得しました。

371 名前:デフォルトの名無しさん :02/07/31 12:47
//a.h
#ifndef __A__
#define __A__
int getvalue();
#endif

//a.c
#include "a.h"
int getvalue() { return 0; }

//main.c
#include "a.h"
int main() {
return getvalue();
}

//makefile
main : main.obj a.obj
bcc32 main.obj a.obj
main.obj : main.c a.h
bcc32 -c main.c
a.obj : a.c a.h
bcc32 -c b.c

というふうなプログラムをコンパイルしているのですが、
main.c をコンパイルすると getvalue の宣言がないと警告がでます。
一応実行は出来るようですが、どうすれば出なくなるでしょうか?

372 名前:デフォルトの名無しさん :02/07/31 12:50
>>370
ちげーよ
/*が来るとその後に*/が来るまでは何がこようとすべてコメントとみなして"があっても文字列としてみないだけ。もちろんint i;とあってもそれは単なるコメントと見なす。

373 名前:デフォルトの名無しさん :02/07/31 12:50
>>369 あんたはんはいけずや かなんわ

>>371 extern お使いやす

374 名前:デフォルトの名無しさん :02/07/31 12:52
>>371
とりあえずint getvalue();はint getvalue(void);にしろ

375 名前:11 :02/07/31 12:52
>>366
なんだそりゃ!!!!
つまり"〜*/〜"は"〜*""/〜"と書けということか

376 名前:デフォルトの名無しさん :02/07/31 12:54
コメントの中身を評価(?)されてしまったら困ると思うのだが・・・

377 名前:デフォルトの名無しさん :02/07/31 12:55
>>371
間違いはなさそうだが、とりあえずプリプロセッサにかけたものをみてみろ。

378 名前:11 :02/07/31 12:55
>>372
なるほど、よく考えたら当然だ

379 名前:371 :02/07/31 12:57
>>373-374
getvalue(void) に直したら extern を付けなくても警告が出なくなりました。
原因はよくわかりませんが。

どうもありがとうございました。


380 名前:364 :02/07/31 12:57
>>372
ああ、なるほど!!
/* " */ "
先に/*があるから後の"が無視されて*/が文字列になってないのか。

381 名前:デフォルトの名無しさん :02/07/31 12:59
>>379
まじ!?
結構細かいんだね。BCCって。
プロトタイプの場合、voidをつけないと関数呼び出し時に引数リストをどんなものにしてもコンパイラがエラーを出さないからつけたほうがいいよ。

382 名前:デフォルトの名無しさん :02/07/31 13:00
後の
~~~~?

383 名前:デフォルトの名無しさん :02/07/31 13:00
>>371
C++ なら void 書いても書かなくても同じだと思うけど。
a.c/main.c か。
あと、__A__ とか、インクルードガードに _ 使う人多いんだけど、
いちおうダメだよね。

384 名前:11 :02/07/31 13:01
>>381
それはCの場合でC++では空の引数リストはvoidと同じ

385 名前:デフォルトの名無しさん :02/07/31 13:02
>>383
何がだめなの?

386 名前:デフォルトの名無しさん :02/07/31 13:02
>>384
.cだからCだとオモタ

387 名前:11 :02/07/31 13:03
とおもったら>>371はCじゃん!!!1

388 名前:デフォルトの名無しさん :02/07/31 13:03
>>384
いいかげんに名無しに戻ったほうがいいと思うよ。

389 名前:364 :02/07/31 13:04
>>382
>後ろの"
/*の後ろの"


390 名前:デフォルトの名無しさん :02/07/31 13:04
__で始まるのは処理系依存の識別子だっけ?

391 名前:383 :02/07/31 13:05
>>385
予約されてる識別子。

392 名前:デフォルトの名無しさん :02/07/31 13:07
>>391
__FILE__とかか?

393 名前:デフォルトの名無しさん :02/07/31 13:08
float型の変数の値を標準出力に出力したいのです。
wsprintf でまず変換しようとしましたが、これは整数のみできないようなのです。
方法がありましたらお願いします。

394 名前:デフォルトの名無しさん :02/07/31 13:09
>>393
printf("%f\n",f);
これじゃだめなのか!?

395 名前:デフォルトの名無しさん :02/07/31 13:09
>>393
std::cout << f << std::endl;
じゃないの?

396 名前:デフォルトの名無しさん :02/07/31 13:10
>>394
あ!できました。すごい!!
ありがとうございました。


397 名前:デフォルトの名無しさん :02/07/31 13:11
>>396
あんたがすごいよ

398 名前:11 :02/07/31 13:12
>>393
>>396
何がなんだか分からん!

399 名前:C厨 :02/07/31 13:13
そういえばここってC++スレだったのね(^_^;)
ごめん。スレ立てるまでもない・・・スレかと思っていた。

400 名前:デフォルトの名無しさん :02/07/31 13:14
C厨はこのスレに来ないで。。(;;)
お願い

401 名前:デフォルトの名無しさん :02/07/31 13:15
>>400
ごめん。本当にごめん。

402 名前:400 :02/07/31 13:16
いや間違えただけならいいんだ。言い過ぎた。

403 名前:デフォルトの名無しさん :02/07/31 13:19
C++でprintf使ったら駄目ってこと?

404 名前:デフォルトの名無しさん :02/07/31 13:20
>>403
だめじゃない。でもC++らしくない。

405 名前:デフォルトの名無しさん :02/07/31 13:29
>>404
でも
cout << "(" << number << ")" << endl;
っていうようなのはなんとなくダセエ

406 名前:デフォルトの名無しさん :02/07/31 13:39
>>405
そゆときどうしてる?

407 名前:デフォルトの名無しさん :02/07/31 13:41
>>406
fprintfを使っていマス

408 名前:デフォルトの名無しさん :02/07/31 13:47
>>407
わしも。

409 名前:デフォルトの名無しさん :02/07/31 14:19
あるnamespace内にオーバーロードされた複数の同名の関数があって、
そのうちの片方だけをusingすることは可能ですか?

410 名前:デフォルトの名無しさん :02/07/31 14:20
>>405 boost使います。

411 名前:デフォルトの名無しさん :02/07/31 14:27
>>409
usingする方法は分からないのだけれども
インラインのラッパを用意してやれば片方だけ使えるようになるよ

412 名前:デフォルトの名無しさん :02/07/31 14:38
>>411
ありがとう。

413 名前:デフォルトの名無しさん :02/07/31 14:45
>>383
> あと、__A__ とか、インクルードガードに _ 使う人多いんだけど、
> いちおうダメだよね。
処理系が予約してるから、ね。俺は一度だけ、標準ヘッダのインクルードガードと
衝突して泣いた経験がある。

ただ VC++ みたく「処理系が勝手に _ 付きのインクルードガードをつける」場合に
は問題ないんじゃない? あれは重複しない文字列 (GUID) 使ってるし。

414 名前:デフォルトの名無しさん :02/07/31 14:56
float,doubleを最高の精度で
文字列にするにはどうすればいいのでしょうか?


415 名前:デフォルトの名無しさん :02/07/31 14:58
ポータビリティ無視なら、BASE64とか使えばいいじゃん。

416 名前:デフォルトの名無しさん :02/07/31 15:00
>>414
もとのデータはそんなに正確なのかい?


417 名前:414 :02/07/31 15:10
精度指定はあとから考えようと思うのですが、
まず初めは
float -> string -> float
みたいな処理をしても
一致させたいのです。


418 名前:デフォルトの名無しさん :02/07/31 15:11
>>417
なんでそんなことを?

419 名前:デフォルトの名無しさん :02/07/31 15:13
>>417 それは原理的に>>415のいうようなバイナリのまま保存しなければ無理だと思うよ

420 名前:414 :02/07/31 15:18
>>415〜419
ありがとう。がんばってみます。

421 名前:デフォルトの名無しさん :02/07/31 16:48
>>417
float の全ビットパターンについて
sprintf(buf, "%.15g", f1);
sscanf(buf, "%g", &f2);
assert(f1 == f2);
を試してみたことがあるが、NaN,Infを除いて一致したよ。


422 名前:デフォルトの名無しさん :02/07/31 17:07
>float の全ビットパターンについて
スゲー、floatが32bitってことは43億通りになるんかいな?

423 名前:デフォルトの名無しさん :02/07/31 17:13
なにがスゲーんだ???
たいして時間かからないでそ。

424 名前:デフォルトの名無しさん :02/07/31 17:16
>>421
ビットパターンのセットってintとかからキャストしてぶっこむの?

425 名前:421 :02/07/31 17:38
>>424
キャストで予期しない変換がおこると嫌なので、memcpy しました。
テストコードはこんな具合っす。

float f1, f2;
for (unsigned long u = 0; u != 0xFFFFFFFF; ++u) {
  int e = (u >> 23) & 0xff;
  if (e == 0 || e == 0xff) continue; // NaN or Inf
  memcpy(&f1, &u, sizeof(f1)); // f1 = *(float*) &u;
  sprintf(.... 以下 >>421 と同じなので略

PenIII 700MHz で2〜3日で終わったよ。


426 名前:デフォルトの名無しさん :02/07/31 17:39
>>425
そんなにかかるのかー。一瞬自分もやってみようとしたけど
それを聞いておいて良かったw

427 名前:デフォルトの名無しさん :02/07/31 17:49
c++に標準で用意されているらしい
複素数ライブラリってどうやって使うんですか?

428 名前:デフォルトの名無しさん :02/07/31 17:52
complexをincludeするんじゃないの?

429 名前:421 :02/07/31 17:57
>>426
実際に試したのは sscanf ではなく istringstream 経由の
istream >> float なので、sscanf なら3日もかからず早く終わるかも。
試してみるなら、途中経過を入れておくと良いっす。
if (u % 0x10000 == 0) printf("%08lx,%g", u, f1);



430 名前:421 :02/07/31 18:03
ちなみに >>425 のコメントは少々間違っていた。
e == 0 は 0 or Denormal です。
e == 0xff が NaN or Inf です。

431 名前:デフォルトの名無しさん :02/07/31 18:48
423 :デフォルトの名無しさん :02/07/31 17:13
なにがスゲーんだ???
たいして時間かからないでそ。


SETI@home、UDはカレにおまかせ♥


432 名前:デフォルトの名無しさん :02/07/31 19:03
なんで電気代を払ってまで奴らの金儲けに強力せにゃならんのだ
献血と同じで無意味だ


433 名前:デフォルトの名無しさん :02/07/31 19:40
献血は無意味じゃねぇよ

434 名前:デフォルトの名無しさん :02/07/31 19:43
>>433
献血も無意味だよ。
死ぬ奴は死なしておけば良いんだ。

435 名前:デフォルトの名無しさん :02/07/31 19:50
>>434 それはそれなりの主張だと思うけど、
 その主張の先は、
 「じゃキミ生きてなくてもいいよ。キミが生きてる事は俺には無意味だ」
 とか「俺には迷惑だよ」となる


436 名前:デフォルトの名無しさん :02/07/31 20:04

 こ こ は C + + に つ い て

 相 談 す る ス レ で す 。


437 名前:デフォルトの名無しさん :02/07/31 20:09
なぜ下の条件がないと
f1≠f2
になってしまうのでしょうか?

int e = (u >> 23) & 0xff;
if (e == 0 || e == 0xff) continue; // 0 or Denormal or  NaN or Inf


438 名前:デフォルトの名無しさん :02/07/31 20:13
348も355もC++じゃなくってc99じゃねえか。
どっかにC++の規格書落ちてねえのかよ。

439 名前:デフォルトの名無しさん :02/07/31 20:19
>>438
>>5

440 名前:デフォルトの名無しさん :02/07/31 20:21
>>439
それはまずかないですか?

441 名前:デフォルトの名無しさん :02/07/31 20:27
>>427
http://blackphase.hoops.ne.jp/BPProgram/complex.htm

442 名前:デフォルトの名無しさん :02/07/31 20:29
>>440
何故?

443 名前:デフォルトの名無しさん :02/07/31 20:30
>>442
売り物じゃないの?

444 名前:デフォルトの名無しさん :02/07/31 20:34
>>437
NaNもしくはInfの場合は、
f1==f2がfalseになるからではなくて?

ってかNaNかInfの時ってf1==f2はtrue?false?
どっち?


445 名前:デフォルトの名無しさん :02/07/31 20:41
例外がでますた

446 名前:デフォルトの名無しさん :02/07/31 20:43
数じゃないものを比較しちゃいけねえよ

447 名前:デフォルトの名無しさん :02/07/31 21:33
NaNはデータベースでいうところのnullみたいなもんだな

448 名前:デフォルトの名無しさん :02/07/31 21:47
C++の規格書にははっきりとはポインタがアドレスだって書いてないな…
しかし、allocation functionはアドレスを返し、返されたポインタがどうたら
と書いてあるところはある…。
アドレスとポインタを同一視してると思えるような文は所々にあるな。

449 名前:デフォルトの名無しさん :02/07/31 21:49
>>448
なにがいいたいの?

450 名前:デフォルトの名無しさん :02/07/31 21:55
>>449
ポインタはC++ではアドレスなのか。そうでないのか。
規格書の記述ではわかりづらいが前者のようだということ。


451 名前:デフォルトの名無しさん :02/07/31 21:57
>>450
それが重要なの?

452 名前:デフォルトの名無しさん :02/07/31 22:04
>>451
一応ね。人にポインタを説明する時に頻出事項だし。
ぜひ確認しておきたいことではあるね。

ただし、一般にアセンブラなどで使ってる「アドレス」とは
異なる意味でのアドレスだということは確かだな。
ポインタの値はimplementation-definedだとはっきり書いてあるし。

453 名前:デフォルトの名無しさん :02/07/31 22:07
>>450>>452が矛盾してやしない?

454 名前:デフォルトの名無しさん :02/07/31 22:08
>>453
いや、そう思いやすいかもしれないけど、そうではないと思う。
implementation-definedでかつアドレスなんだと思う。
勝手に処理系がつけた値を「アドレス」と呼んでしまえば、矛盾しない。
言葉の定義の問題だけど。

455 名前:デフォルトの名無しさん :02/07/31 22:16
>>454
implementation-defined は、ようはどう定義しても間違いではないって
意味でしょ?例えば「aが整数だ」というルールがあったときに、
あんたはa=0だと主張しているに過ぎないんじゃない?

456 名前:デフォルトの名無しさん :02/07/31 22:28
>>455
だから、もしも0という言葉が整数全体を表す言葉にも使える
ものだったとしたら(実際は違うけど)OKだよな?

あと、いくらimplementation-defined だと言っても
全く自由というわけではないぞ。当然他の規則と矛盾しない
ようにしなくてはならない。

457 名前:デフォルトの名無しさん :02/07/31 22:32
仮定法過去だね。

458 名前:デフォルトの名無しさん :02/07/31 22:36
>>457
そうだが。
いろいろな記述を見るに、アドレスはポインタだと考えないとつじつまが合わない。
決定的なのはさっきのallocation functionの記述。
それから、constやvolatileに関してはアドレスがポインタだと明記してある。
例えば、allocation functionの説明でもアドレスはポインタだとして
解説してるようだが、それ以外にもconstやvolatileに関してはアドレスが
ポインタだとはっきり明記してある。
この場合は確実にimplementation-definedで、かつアドレスなんだよ。

459 名前:デフォルトの名無しさん :02/07/31 22:37
ん?なんか二度同じことを説明してしまった。スマソ。

460 名前:デフォルトの名無しさん :02/07/31 22:52
>>448
本当に規格書読んだ?
ISO/IEC 14882:1998(E)
5.3.1
2
The result of unary & operator is a pointer to its operand.

461 名前:デフォルトの名無しさん :02/07/31 23:01
>>460
ん?その部分は勿論読んだぞ。
「&はポインタを返す」だろ。
でも、ポインタがアドレスとはその部分だけでは断定できまい。
「&がアドレスを返す」と書いてない以上。
まあ、&は「address-of operator」って名前らしいが…

しかし、それ以外のいろんな記述を見るに、アドレスがポインタらしいと
いうのが俺の意見。

462 名前:460 :02/07/31 23:04
アドレスとポインタを混同してたわ。

463 名前:11 :02/07/31 23:49
>constやvolatile(のT型)に関してはアドレスがポインタ
なだけでその他はそうであるとは限らない。ということだと思いまっせ。


464 名前:デフォルトの名無しさん :02/07/31 23:56
>>463
文脈から見るに、その部分は「〜へのポインタ」という言い方をconstなど
に適用するとどうなるかを説明した文であって、そこだけアドレスがポインタ
だということを説明した文じゃないと思うわけよ。
それに、何度も言ってるように、他でアドレスとポインタを混同したような文がいくつもある。
比較的証拠っぽいのは14.3.2のプログラムのコメントとか、thisポインタが
アドレスだとかな。

465 名前:11 :02/08/01 00:08
>>464
おおその通りだ。へたうった。例外はメンバポインタの場合だけだ
3.9.3.5 In this International Standard,
the notation {\it cv} (or {\it cv1}, {\it cv2}, etc.),
used in the description of Types,
represents an arbitrary set of cv-qualifiers,

466 名前:デフォルトの名無しさん :02/08/01 00:22
なんとなく、ニュアンス的には、&aがアドレスなのは当たり前の前提事項だから、
適当にアドレスと書いたり書かなかったりしてしまってるように見える。
まあ断定は出来ないけど。

467 名前:デフォルトの名無しさん :02/08/01 01:30
コピペできるpdfがほしい

468 名前:デフォルトの名無しさん :02/08/01 02:05
>>467
% cp foo.pdf bar.pdf
できますが、何か? もしかしてパーミッションの問題か?

469 名前:デフォルトの名無しさん :02/08/01 02:07
pdfコピペできるっしょ?

470 名前: :02/08/01 02:07
>>468
コピーしているようにしか見えないが、どこでペーストしてる?

471 名前:デフォルトの名無しさん :02/08/01 02:17
>>470
foo.pdf で取り込み(コピー)、bar.pdf で貼り付け(ペースト)では?

# cp コマンドで名前変えて連続コピーってできたっけか?
# シェルスクリプト書く方が早そうだけど

472 名前:デフォルトの名無しさん :02/08/01 02:29
int *i;

int* i;
の違いって何ですか?

473 名前:デフォルトの名無しさん :02/08/01 02:31
*の位置

474 名前:472 :02/08/01 02:38
・・・・・。


475 名前: :02/08/01 02:44
>>472
違いはない。書き手のセンスの問題。

476 名前:デフォルトの名無しさん :02/08/01 02:50
int * i;

477 名前:デフォルトの名無しさん :02/08/01 06:50
int/*
Accept: */*
i
;

478 名前:デフォルトの名無しさん :02/08/01 07:00
if (hoge) {

};

とかみたいにブロックの後に ; を付ける人が偶にいますが、
これってどうですか?

479 名前:デフォルトの名無しさん :02/08/01 07:04
意図が見えない。

480 名前:488 :02/08/01 08:40
漏れのアクロバットリーダーでは
テキスト選択のボタンが使えなくなってる。なんでだろ。

481 名前:デフォルトの名無しさん :02/08/01 09:32
ちゃんと ISO+IEC+14882-1998.pdf を購入した人なら、>>2 にある
html版の Final draft を使わせてもらってよいんじゃないかな。
つーか、html 化された正式版仕様書ってないの?
ちなみに >>5 にある ansi_iso_iec_14882_1998.pdf は海賊版ぽい。
ダウンロードした人の話では正式版とはファイルサイズが異なるらしい。

482 名前:デフォルトの名無しさん :02/08/01 09:52
(ΦωΦ)フフフ・・・・for_eachサイコー

483 名前:デフォルトの名無しさん :02/08/01 12:18
>>481 プ
ISO/IEC 14882は 2.8M 2.1M の2つのタイプが存在するのを知らないのか?
それから、なぜ正規購入者でなければwebのFDを利用できないんだ?
頭に虫沸いてない?

484 名前:デフォルトの名無しさん :02/08/01 13:43
>>483
> ISO/IEC 14882は 2.8M 2.1M の2つのタイプが存在するのを知らないのか?
うん、知らない。2.8M のやつってどこが配布してるの? 2.1M のやつとは
何か違いがある?

> なぜ正規購入者でなければwebのFDを利用できないんだ
FD って一般に公開されてなかったと思ったから。実際のところ、FDの
ライセンスはどうなってるの?

上記2点、よければ教えてよ。

485 名前:デフォルトの名無しさん :02/08/01 14:56
俺のは2.72Mだが何か?

486 名前:デフォルトの名無しさん :02/08/01 15:39
structの使い方についての質問です。例えば、
struct A { int i; float f; };のようなstructを定義して、
これをmain()の中で、A *a=new a[10];(あるいは、A a[10];)
として、他の関数の中で使うには、その関数はどう定義
すればよいのでしょうか?void func(A* a[]){}ではダメでした。
ここでいうfunc()の中で、a[5]->iを使いたいのです。
よろしくお願いします。


487 名前:デフォルトの名無しさん :02/08/01 15:43
>>478
struct{
...
};
でセミコロンをつけ忘れないように普段から慣れさせておくため。

488 名前:デフォルトの名無しさん :02/08/01 15:48
>>486
void func(A a[]) ;
とか
void func(A *a) ;

489 名前:486 :02/08/01 16:09
自分で解決できました。この場合
void func(A a[10])でいいのですね。

490 名前:489 :02/08/01 16:20
>>488さん、ありがとうございます。
そちらのほうが良さそうですね。
a[10]としてしまうのとどう違うんでしょうか。

491 名前:デフォルトの名無しさん :02/08/01 16:29
何故あなたはC++を使うのですか?

492 名前:デフォルトの名無しさん :02/08/01 16:35
>>490
結果に違いはないです。 ないからわざわざ10と書くこたな(略

493 名前:初心者 :02/08/01 17:00
ないなら別に10と書いても(略

494 名前:デフォルトの名無しさん :02/08/01 17:03
2文字余計にタイプするだけで指が疲れる。。

495 名前:デフォルトの名無しさん :02/08/01 17:24
>>494
そんなこと言ったら、2chに書き込む方がよっぽど指が疲れるYO!

496 名前:デフォルトの名無しさん :02/08/01 18:16
つか、10個の配列だよ、と断りを入れておけば、9個しか用意しないで呼び出したやつに文句(略

497 名前:デフォルトの名無しさん :02/08/01 19:10
っていうか、C++なんだからvector使えYO!

498 名前:デフォルトの名無しさん :02/08/01 19:29
>>493
C, C++ だと仮引数の配列はポインタに縮退するから、わざわざ a[10] と
書くのは

 誤解を助長してる

としか思えんなぁ。だいたい要素数 10 個の配列にしか適用できない関数って
時点で、何か間違ってるような気がする。

俺なら

1. 構造体にして、そのポインタを引き渡す
2. 要素数も同時に引数として渡す or vector 使う
3. 番兵を使う

どれかにするけどな。

499 名前:デフォルトの名無しさん :02/08/01 19:34
C++初心者です.RECT構造体についての質問です.
RECT myrect;
---------------------------------------------------
myrect.top = 0;
myrect.left = 0;      問題はこの部分です
myrect.bottom = 100;
myrect.right = 100;
---------------------------------------------------
CreateHatchBrush(HS_CROSS,GetSysColor(COLOR_WINDOW));
FillRect(hwnd,&myrect,hbrush);
のようにして,ウィンドウの任意の領域を白紙に戻したいのですが,
RECT構造体(myrect)の(座標の)初期化がうまくいきません.
GetClientRect(hwnd,&myrect);
として座標を取得するしかないのでしょうか?
また,任意の領域を白紙に戻す方法でもっと良い方法があるんでしょうか?
よろしくお願いします.

500 名前:かかし :02/08/01 19:46
あの相談したいことがあるのですか、
ここの掲示板に書くことではないと思うのですがどこに書けばいいか
分からないのでアドバイスをお願いします。

「DevelopperStudio」とは、何のことでしょうか?
探してもさっぱり  (+_+)
皆さん!!この件に関して知っていることがあれば
メールかRe>でお願いします。

@かかし


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.