【初心者歓迎】C/C++室 Ver.41【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.41【環境依存OK】 - 暇つぶし2ch331:デフォルトの名無しさん
07/08/15 10:26:15
マクロに放り込むんだり引数の評価順に左右されるような場合はマズいけど
別にこのケースは何の問題も無いわな

スタイルとして自分がそう心がけているというだけの話なら
ご立派ですねで終わりだが

実にどうでもいい


332:292
07/08/15 10:26:21
適切な日本語ではなかったけど、脳の衰え始めている先輩方には難しかったかな?
むしろ適切であったとしてもまともにこたえる気はなさそうにおもえる

333:デフォルトの名無しさん
07/08/15 10:27:23
2chで煽るのだけが生き甲斐の厨房に
煽り返す厨房か

334:309
07/08/15 10:44:58
>>331
今は問題無いからいいって考えはどうかと思うぞ。後々の仕様変更に耐えられるコードを書く方がいい。
もっとも今回は副作用で問題が出るマクロにするのが一番悪いが。

>>332
>まともにこたえる気はなさそうにおもえる
何でそう思ったか知らんが結局質問は「副作用があるコードを関数呼び出しで書いちゃ遺憾って言ってるけど、それって*++pではない場合にもいえなくない?」って事か?

335:デフォルトの名無しさん
07/08/15 10:49:04
>>331
話題がループするが、sub()がマクロなら問題だからするべきではないという話だろ。
件のサイトではsub()が何か提示されていないのだから、問題がないとは言えない。

336:292
07/08/15 10:54:44
皆さんの話がかみ合ってないかもしれないので整理しましょう

*++pってなんですか?

337:デフォルトの名無しさん
07/08/15 11:00:13
>>335
マクロにsub()なんて名前をつけてるのならそっちのが問題じゃね
マクロは大文字で目立たせるのが基本だし
subはサブルーチンのサブだろう

ま、標準ライブラリの一部の関数はマクロで実装することも許されているけどな

338:デフォルトの名無しさん
07/08/15 11:13:27
>>336
死ね

339:デフォルトの名無しさん
07/08/15 11:32:32
すみません、教えてください。

C++でコンテナからイテレータを取り出すときに、iterator とconst_iterator とを
区別するのはどうやっているんでしょうか?

std::vector<>::iterator begin();

std::vector<>::const_iterator begin() cons;

のように、同じ関数でiterator を返したりconst_iterator を返したりしたいんですが、上手くいかない……


340:339
07/08/15 11:40:56
ごめん、忘れてください。超間抜けなこと聞いた。

暑くて頭がボケてたみたい……

341:デフォルトの名無しさん
07/08/15 11:42:17
while(1) sub( *++p );

で意味をなす単項subってどんなマクロ(関数)なんだろ

342:デフォルトの名無しさん
07/08/15 11:46:15
>>337
<*grep*>:319:crt/src/minmax.h:21:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:333:crt/src/stdlib.h:166:#define __max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:340:crt/src/stdlib.h:472:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:342:crt/src/v2tov3.h:71:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:387:include/minmax.h:21:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:399:include/stdlib.h:146:#define __max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:406:include/stdlib.h:424:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:603:PlatformSDK/Include/WinDef.h:177:#define max(a,b) (((a) > (b)) ? (a) : (b))
なるほど、標準ライブラリにないmax()系がこんなにあるとはM$は問題だらけだね。

343:デフォルトの名無しさん
07/08/15 11:48:41
>>341
きっとこんなのだよ。
#define sub(x) putchar(x)

344:デフォルトの名無しさん
07/08/15 12:04:17
>>342
そうだな。実際最悪だろ。

345:デフォルトの名無しさん
07/08/15 12:06:28
マクロは名前空間にもくるめないしなあ

346:デフォルトの名無しさん
07/08/15 12:08:02
>>342
実際、それが問題になることがあって、
min,maxを定義しないようにするための NOMINMAX というマクロが存在する

347:デフォルトの名無しさん
07/08/15 12:08:48
>>342
実際そのマクロの存在の為に、VC6の<algorithm>にはstd::max, std::minがない。
これはC++の移植性において、由々しき問題である。

348:デフォルトの名無しさん
07/08/15 12:10:11
まあVC6はそれ以前に色々ダメすぎだけどな
今となっては

349:デフォルトの名無しさん
07/08/15 12:10:29
>>342
Effective C++でも第1項でいきなり問題視してるじゃん。

350:デフォルトの名無しさん
07/08/15 12:41:16
Effective C++(笑)

351:デフォルトの名無しさん
07/08/15 12:50:00
質問です。
Windows Vista買ったら、Borland C++5.01のダイアログエデイタが正常に動作しません。
Xpマシンもありますがどうすればいいでしょうか?
1.プログラムはXpマシンで作成してコピーする。
2.ダイアログの部分だけXpマシンで作成してコピーする。
3.Vistaで動作する開発環境を買って移植する。

352:デフォルトの名無しさん
07/08/15 12:57:03
マルチ死ね

353:デフォルトの名無しさん
07/08/15 14:18:31
>>349
URLリンク(kamaitachi.blogdns.net)
これか。別にそんなに問題視はしてないように見えるが。

354:デフォルトの名無しさん
07/08/15 14:21:04
問題視しまくりじゃないか。

355:デフォルトの名無しさん
07/08/15 14:47:21
ここで言う「マクロと関数に名前の区別」というような点は問題視してない

356:デフォルトの名無しさん
07/08/15 14:56:09
確かに>337が指摘しているような「大文字ではない」ことについてはなんら言及されていないね。

357:デフォルトの名無しさん
07/08/15 15:01:51
>>349>>342宛なんだから、「ここで言う」はmaxマクロに対応させないと。

358:デフォルトの名無しさん
07/08/15 15:14:41
なるほど。確かにそっちはそうだな。

359:デフォルトの名無しさん
07/08/15 18:25:13
今北産業。

>>284
> 「単独の文
> *++p;
> は間接参照の文が無意味である。」
> ってどう意味なのでしょうか?
> 実例を挙げていただけないでしょうか。

無意味でない例なら出せる。

volatile int* p;

とか宣言されていて、p が実はメモリマップド I/O
で読むだけでも意味がある場合がある。

>>293
> #define sub(x) (x < 0 ? -x : x)

sub(a+b) とかでおかしくなるから >>342 みたいに () 使おう。


360:デフォルトの名無しさん
07/08/15 18:29:58
>>359
p が volatile int* であっても
*++p; と書いて、pがdereferenceされることは保証されてないだろ。


361:デフォルトの名無しさん
07/08/15 19:14:24
>>360
すまん、よくわからんのだが「p が deference されることは保証されない」のは、特に

*++p;

に言える、と言ってる?それとも、

*p;

でも同様だと言ってる?

362:デフォルトの名無しさん
07/08/15 19:24:20
>>360
とりあえず volatile な *p; については

URLリンク(c0x.coding-guidelines.com)

の 1488-1489 辺りで「最適化で削除しちゃいかんよ」ってな事になってるが。
もっといえば

volatile int x;

x;

でも一緒。

363:デフォルトの名無しさん
07/08/15 20:19:08
更にいうと

const volatile int x;

x;

でも処理系は x の読み出しを削除してはいけないし、
x の値を何かに使う場合複数回の読み出しで同じ値だと仮定してもいけない。
この場合の const は「書き込めません」っていう意味だ。

364:デフォルトの名無しさん
07/08/16 07:37:42
char *p;
char *q;
p = "hoge" + 1;
q = "hoge"[1];
この場合pはoになることは正しいですよね。
pにはhのアドレスが代入される訳ですから。
んでqの場合は配列じゃないので、
char x[] = "hoge";
int r = x[1];
なら正しくrにはoが代入されますけれど、
q = "hoge"[1];とかいても警告は出ますし、
無意味な値が代入されるけれどもコンパイルはされてしまいます。
どうしてコンパイルエラーにならないんでしょうか?

365:デフォルトの名無しさん
07/08/16 07:55:01
"hoge" + 1
はポインタだが、
"hoge"[1]
はポインタではない。

366:デフォルトの名無しさん
07/08/16 08:01:25
それは分かるんですけれども、
なんでコンパイル出来るのか?
が疑問なんです。

367:デフォルトの名無しさん
07/08/16 08:04:43
>>364
char* p = 定数;

ならわかる?

368:デフォルトの名無しさん
07/08/16 08:13:50
>>366
>pにはhのアドレスが代入される訳ですから。
間違い。

369:デフォルトの名無しさん
07/08/16 08:20:38
>>364
C言語だと、整数からポインタへの代入は警告止まりになる。
C++ だとエラーになる。

370:デフォルトの名無しさん
07/08/16 08:38:00
>>367,369
char* p = 定数;
いや、もちろんポインタに数値をキャストしなくても
代入出来ることは知ってます。
q = "hoge"[1];
ってコンパイラはどういう風に解釈するんですか?
>>368
>pにはhのアドレスが代入される訳ですから。
え、じゃ文字列の先頭のアドレスで正しいですか?

371:デフォルトの名無しさん
07/08/16 08:42:22
>>370
"hoge"+1なんだから、当然'o'ヘのポインタだ。

372:デフォルトの名無しさん
07/08/16 08:43:32
>>370
hのアドレス=文字列の先頭のアドレス
代入は+1が行われたあとだろ?
だからすでにアドレスが変わってる

373:デフォルトの名無しさん
07/08/16 08:45:27
>>370
q = "hoge"[1];



static const char x[] = "hoge";
q = x[1];

は大体同じ。

374:デフォルトの名無しさん
07/08/16 08:59:29
>>372
すいません、勘違いしてました。
>>371,373
えっと自分が聞きたいのは、
char *q = "hoge"[1];
という文がなぜコンパイル出来るかってことなんです。
char q [] ="hoge";
char *p = "hoge";
はあきらかに違うのに
char *q = "hoge"[1];
がコンパイル出来るとまるでこの二つが同じように錯覚してしまって
間違いの元になるんじゃないかって思ったんです。
んで、そういう事が出来るのはきっと何か理由があるに違いないと思ったんです。


375:デフォルトの名無しさん
07/08/16 09:05:40
特に理由はない。
文法上問題がないから警告止まりでコンパイルされるだけ。

376:デフォルトの名無しさん
07/08/16 09:08:16
> char q [] ="hoge";
> char *p = "hoge";
> はあきらかに違うのに
> char *q = "hoge"[1];
> がコンパイル出来るとまるでこの二つが同じように錯覚してしまって
> 間違いの元になるんじゃないかって思ったんです。

なぜ二つが同じように錯覚するの?

377:デフォルトの名無しさん
07/08/16 09:27:30
>>375
ほんとだ。
char *x = "hoge";
p = x[1];
がコンパイル出来る。
x 0x85fd8
p 0x6f
pのアドレスってどこから出てきたんだろう?


378:デフォルトの名無しさん
07/08/16 09:28:33
>>374
= の右辺に書かれた T 型の文字リテラルは T 型の static 配列と同じです
= の右辺に書かれた T 型の配列は T 型の配列の先頭要素を指す「Tのポインタ型」になります

理由としてはっつーか便利だし~みたいな?

379:デフォルトの名無しさん
07/08/16 09:31:29
>>377
'o' に決まってるだろう。

380:デフォルトの名無しさん
07/08/16 09:36:05
>>377
m9(^Д^)プギャー

381:デフォルトの名無しさん
07/08/16 09:39:47
>>377
一応言っておくけど0x6fはアドレスじゃないよ
'o'に対応するアスキーコード
URLリンク(c-production.com)

382:デフォルトの名無しさん
07/08/16 10:00:58
qはそれ自身が配列であり、右辺の"hoge"はコンパイラに対する
初期化内容としてのみ解釈される。定数"hoge"は実行時には存在しない。
pの場合、実行時に定数"hoge"をメモリ上に用意して、そのポインタを利用する。
なので同じように見えても右辺の意味がまったく違う。

もともとqは以下のように記述すべきものだったんだろうけど、
char q[] = {'h', o'', g'', 'e', '\0'};
不便なので、利便性のために
char q[] = "hoge";
という書き方も受け入れるようになっただけ。
結果的にpとqの右辺が似ているけど、たまたま。

383:デフォルトの名無しさん
07/08/16 10:07:36
*p = "hooge"
p[] = "hooge"

は同じだろ

384:デフォルトの名無しさん
07/08/16 10:11:42
>>383
本気で言ってるのか

385:デフォルトの名無しさん
07/08/16 10:20:58
>>383
別物

386:デフォルトの名無しさん
07/08/16 10:44:01
>>383
どっちもセミコロンが無いからエラーになる→同じこと
ってオチは無しだぞw

387:デフォルトの名無しさん
07/08/16 10:49:20
>>383
>>364未満だな

388:デフォルトの名無しさん
07/08/16 10:49:57
型名もないしな

389:デフォルトの名無しさん
07/08/16 10:52:18
フフ

390:デフォルトの名無しさん
07/08/16 11:30:57
void foo() {
 auto char *p = "hoge";
 auto char p[] = "hoge";
 …
}
とした時の挙動からして違うことは判るだろ

391:デフォルトの名無しさん
07/08/16 11:48:08
char p1[] = "hoge";
char *p2 = "hoge";

p1[1] = 'a';
p2[1] = 'a'; // <=

392:デフォルトの名無しさん
07/08/16 12:16:13
Perlの無名配列みたいに
{1000,100,10}[0] もいけたらいいのに

393:デフォルトの名無しさん
07/08/16 12:24:01
C99

#include <stdio.h>
#include <string.h>

int main() {
printf("%d\n", (int[]){1,3,5,7,9}[1]);
}

394:デフォルトの名無しさん
07/08/16 12:33:57
>>393
こんな事出来るんだ。
知らんかった。

395:デフォルトの名無しさん
07/08/16 12:49:24
>>393
うは、いけるんやwありがと

396:デフォルトの名無しさん
07/08/16 21:01:08
配列として認識されるのか…すげー

397:デフォルトの名無しさん
07/08/16 21:45:24
これでC99準拠のコンパイラがもっと増えてくれれば

398:768
07/08/16 22:36:05
C99、便利だけどC言語としてみるとキモい・・・

399:デフォルトの名無しさん
07/08/16 22:38:18
C++と同期とって進化してくれれば歓迎なんだけどな。

400:デフォルトの名無しさん
07/08/16 22:57:51
C99準拠のコンパイラって少ないの?
GCCしか使ってないから知らんのだけど。

401:デフォルトの名無しさん
07/08/16 23:02:56
>>400
Comeau

402:デフォルトの名無しさん
07/08/16 23:06:00
前使ってた Borland C++ 5.5.1 は C99 非準拠だったな.

403:デフォルトの名無しさん
07/08/16 23:06:01
ICC

404:デフォルトの名無しさん
07/08/16 23:20:10
VC++ のやつが無視しやがってるから広まらないのかな。

405:デフォルトの名無しさん
07/08/16 23:20:51
C99はDと同じ運命をたどればいいんだよ

406:デフォルトの名無しさん
07/08/16 23:22:13
VC++はC++コンパイラだからC99対応しないよ、ってMSの
中の人が言ったんだっけか。

407:デフォルトの名無しさん
07/08/16 23:29:51
確かにVC++8.0で試すと凄い勢いでエラー出るな

408:デフォルトの名無しさん
07/08/16 23:35:47
まあ、C99 使うくらいなら C++ 使うってのは確かだが

409:デフォルトの名無しさん
07/08/17 00:35:35
数式を画面に表示させるためのライブラリって無いでしょうか?
x^2みたいなのを、綺麗に表示するためのライブラリがほしいのです。
できれば、ソース公開している奴で、無ければソースは無くてもいいのですが
とにかく、アプリに組み込んで開発できる奴がいいです。


ちなみに、開発環境はVC++2005、WinXPProを想定しています。
動作環境も同様にXPProです。

よろしくお願いします。

410:デフォルトの名無しさん
07/08/17 04:48:29
>>409
ググっただけなんで、中身はシラネ。
URLリンク(www.vector.co.jp)

411:デフォルトの名無しさん
07/08/17 05:26:10
ビット演算がうまくなるコツってないですかね?
全く使いこなせてないので、
他人のソース読んでて、使いこなせていると凄く羨ましいんですけれど。

412:デフォルトの名無しさん
07/08/17 05:27:47
才能ないよ諦めた方がいい

413:デフォルトの名無しさん
07/08/17 05:37:52
コラー!

414:デフォルトの名無しさん
07/08/17 05:49:50
自虐し過ぎ

415:デフォルトの名無しさん
07/08/17 06:14:34
>>411
グラフィックまわりをいじって変な画面効果とか作るのが楽しいかも
上達が見てわかるし

416:デフォルトの名無しさん
07/08/17 08:06:25
>>411
エンディアンと変数型のバイト幅を意識すること。
算術シフトと論理シフトを意識すること。
コツっていうとこんぐらい?

フラグ的な使い方の話だったら、
必要になった時だけ使うのが良いんじゃないかなぁ。


417:デフォルトの名無しさん
07/08/17 08:08:28
>>411
論理演算、真理値表、2進数⇔16進数変換。
この辺のキーワードを調べ使いこなせるようになるとずっと違うと思うよ。
例えばこんなの。
a b c r
0 0 0 0
0 0 1 0
0 1 0 1
0 1 1 0
1 0 0 x
1 0 1 x
1 1 0 0
1 1 1 1
こいつからrを求める式を導き出せれば一歩前進。

418:デフォルトの名無しさん
07/08/17 09:16:08
皆さんアドバイス有り難うございます。
ビット演算は大事ですからね。
精進します。
>>417
グヌヌ。
難しいぞ。分かんないっす。

419:デフォルトの名無しさん
07/08/17 09:22:07
プッ ヘボすぎ

420:デフォルトの名無しさん
07/08/17 09:29:14
~(a^c)&b
こうですか?

421:デフォルトの名無しさん
07/08/17 10:04:58
タンクローリーを運転する人に見えたのは俺だけでいい。

422:デフォルトの名無しさん
07/08/17 11:18:41
int foo;
int bar;
bar = (unsigned int)foo & 0x0fffffff;
という事をしょっちゅうしているプログラムがあるんですけど、
どういう意図を持ってこの処理をしてるんでしょうか?
最初は、int型の変数をunsigned int型にキャストしてint型の変数に代入すると、
例えば-5が代入されてたら4294967291になるのかなぁと思ってたんですが、
そういう訳でもないみたいですし。


423:デフォルトの名無しさん
07/08/17 11:21:44
>>422
意図については、そのプログラムを書いた人に聞くのが一番!

あと、もう少し基礎を勉強したほうが良いよ

424:デフォルトの名無しさん
07/08/17 20:27:31
動的な配列を作る時は
int* a=(int*)malloc(sizeof(int)*10);
if(a==NULL)
みたいにしてポインタが有効かチェクしますよね?
二次元の配列を作る目的で
int** b=(int*)malloc(sizeof(int*)*10);
とやったら、この時も
if(b==NULL)
で、bが有効なポインタかどうか判断していいんですか?


425:デフォルトの名無しさん
07/08/17 20:31:19
はい

426:デフォルトの名無しさん
07/08/17 21:12:36
>>424
if(b==(void**)0)

427:デフォルトの名無しさん
07/08/17 22:36:27
>>424
#include<stdio.h>
#include<stdlib.h>

#define X_SIZE 15
#define Y_SIZE 10

int main(void){
int x, y;
int **b;

b=malloc(sizeof(int*)*Y_SIZE);
if(b==NULL) exit(1);
b[0]=malloc(sizeof(int)*X_SIZE*Y_SIZE);
if(b[0]==NULL) exit(1);
for(y=1;y<Y_SIZE;y++) b[y]=&b[0][y*X_SIZE];

for(y=0;y<Y_SIZE;y++)
for(x=0;x<X_SIZE;x++) b[y][x]=y*X_SIZE+x;

for(y=0;y<Y_SIZE;y++){
for(x=0;x<X_SIZE;x++) printf(" %3d", b[y][x]);
printf("\n");
}

free(b[0]);
free(b);

return 0;
}

428:デフォルトの名無しさん
07/08/17 23:01:35
>>426
キャストしたらダメだろ。
意味変わる。

429:デフォルトの名無しさん
07/08/17 23:07:24
>>420
それでもいいけど、(b&~c)^aの方がシンプルだろう。

430:デフォルトの名無しさん
07/08/18 01:15:04
a^b&~c ってなところか。

>>411
最低限の論理学の勉強をする。
ド・モルガンの法則とかは必須。

431:デフォルトの名無しさん
07/08/18 07:42:18
#define NULL (void*)0
だから
ポインタへのポインタが"NULL"かどうかは
(void**)0で調べないといけない

432:デフォルトの名無しさん
07/08/18 08:20:03
>#define NULL (void*)0
>だから
いいえ。

433:デフォルトの名無しさん
07/08/18 10:12:01
世界中のC言語を使える人のコンピューターに対する理解度の高さの平均と、
世界中のJavaを使える人のコンピューターに対する理解度の高さの平均は、
どっちが高いですか?

434:デフォルトの名無しさん
07/08/18 10:16:53
マルチ死ね

435:デフォルトの名無しさん
07/08/18 10:18:08
>>433
スレ違い

436:DEFORTの名無し
07/08/18 13:41:52
ひさしぶりぶり
MinGWつかってみたけど微妙

437:デフォルトの名無しさん
07/08/18 13:47:02
またお前か

438:デフォルトの名無しさん
07/08/18 14:28:50
>>422
0x0fffffff でマスクってことは、下位28ビットが欲しいってだけじゃね。
あと、unsigned int へのキャストは無駄だな。

439:デフォルトの名無しさん
07/08/18 15:32:58
>>431
どこからそんなデマを仕入れてきた?

440:デフォルトの名無しさん
07/08/18 16:02:21
脳内

441:デフォルトの名無しさん
07/08/18 16:06:10
新聞

442:デフォルトの名無しさん
07/08/18 20:10:13
ある特定のウィンドウがアクティブになった時に、そのウィンドウのメニュー内の
特定のコマンドを実行するようにしたいのですが、どのよう記述したら良いでしょうか?
具体的にはXSIとゆう3DCGソフトの「アニメーションエディタ/編集/オリジナルコマンド」
を自動実行させたいのですが、、、

宜しくお願いします。

443:デフォルトの名無しさん
07/08/18 20:13:48
C/C++じゃなくてスクリプトで書けば?

444:デフォルトの名無しさん
07/08/18 20:16:44
C/C++の勉強すれば分かるよ

445:デフォルトの名無しさん
07/08/19 00:24:05
WSHとかの領域になるんかな?あっちの詳細を全部知ってるわけではないけれども

446:デフォルトの名無しさん
07/08/19 00:43:34
new int[n]; ← このnのところは、何の型で渡すのか決められてますか?
intとかlongとか(負数はあり得ないので、unsignedでしょうか)

あと、Windowsの32ビット環境では、intとlongはまったく同じ型として扱っても問題ないですか?

447:デフォルトの名無しさん
07/08/19 00:45:47
>>442
ウィンドウメニュー内の特定のメニュー項目が選択されたときって、
たぶん、WM_COMMANDとかのウィンドウメッセージが飛ぶと思うんだけど、
その具体的なパラメタを調べて、アクティブとかのイベント関係なく
直接呼んじゃだめなの?

もし、アクティブになると同時って条件をつけたいなら、
1)ウィンドウをアクティブにする
2)ウィンドウメッセージを送信する
っていうだけの簡単なプログラムを作るとか。

448:デフォルトの名無しさん
07/08/19 01:13:18
>>446
特定の型には決まっていない。整数ならいい。
負の数になったら未定義動作。

int と long は違う型です。

449:デフォルトの名無しさん
07/08/19 01:30:05
スレリンク(musicjf板:72番)
おもしろいIDでた

450:デフォルトの名無しさん
07/08/19 01:32:34
わざわざ他板のを持ってこなくてもいいんだよ

451:デフォルトの名無しさん
07/08/19 01:34:41
>>448,446
>特定の型には決まっていない。整数ならいい。
C++の言語仕様の詳細は知らないけど、VCならsize_tでいいんじゃね
URLリンク(msdn2.microsoft.com)(VS.80).aspx
URLリンク(msdn2.microsoft.com)

>int と long は違う型です。
これもVC(x86)の範囲内で同じようにつかえるかって質問なら、問題ないと思うけど
URLリンク(msdn2.microsoft.com)


452:デフォルトの名無しさん
07/08/19 01:36:23
>>450
この板ID無いが。

453:デフォルトの名無しさん
07/08/19 01:57:33
>>451
operator new 関数の第1引数は VC に限らず size_t 。
でもそれと new 式の配列要素数を表す式の型とは別。

サイズが同じだろうがなんだろうが int と long は違う型。
まったく同じ型として扱うのには問題がある。

454:デフォルトの名無しさん
07/08/19 03:13:14
>>453
ごめん、1点分からないので、教えていただきたい。
とりあえず、>>446はVCの利用上(実装上)の制限が知りたいんじゃないの、
と思ったので、その観点だけで書いたのは自分の思い込みで、それで意見が
すれ違うのは仕方ないんだけど、

>特定の型には決まっていない。整数ならいい。
>でもそれと new 式の配列要素数を表す式の型とは別。
の箇所。
そうはいっても、ソースをコンパイルしてバイナリに落とす以上、コンパイラ定義かも
しれないけど、具体的な値の有効範囲ってかならずあるんじゃないの?
実際、MSDNの配列定義のサイズ指定の箇所では
0以上の整数型、ただしMicrosoft仕様では... としてsize_tに言及してるわけだし。

それにoperator new 関数の第1引数がsize_tに決まってるなら、size_t以上の値を
記述して受け入れてくれるコンパイラがありそうにないので、
その意味でも「整数ならいい」ってのはあいまいな感じがする。

なので、「整数ならいい」ってのは純粋に言語仕様の話として語っているのか、
それとも、コンパイラの実装やソース記述上の制限を語る場合でも同じ回答
になるのか、気になって眠れなくなりそうなんで、正確なところが知りたいんだけど。

455:デフォルトの名無しさん
07/08/19 03:20:37
 
   ________    
     /   |         
    /__  |     
   /   /.  |-―‐.                
  / \ /     |              
 /  ./      |          
   ノ        ヽ__」    


   |
 .―┼‐フ  
   |/   
  /|/ ̄ ̄ ̄\ 
 //|       | 
   |       |  
   |     (二X

456:デフォルトの名無しさん
07/08/19 03:39:56
>>454
現行の規格ではだいたい >>453 みたいなことしか言えない。ある意味
これが正確なところ。

new とは別に、各処理系が定めるべきいろいろな数値の上限の中に
「オブジェクトのサイズ」というのがある。配列オブジェクトもこの制限を
うけるので、値の範囲はこれに基づくとも言える。これについて規格が
最低限のガイドラインとして提示しているのは 262144 。

まだ規格化はされてないけどこんな話もある。
URLリンク(www.open-std.org)

457:デフォルトの名無しさん
07/08/19 04:45:36
ありがとう、これで寝られる。
仕様自身は結局釈然としない部分があるけど、
>>448,453の回答が正確で誠実な回答というのは理解できた。

リンク先は策定中の次期規格?
また、膨大な項目が...
現状でさえ、もうついていけないくらいややこしいのに。

458:デフォルトの名無しさん
07/08/19 12:35:03
#include "DxLib.h"

int WINAPI Winmain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
}
ChangeWindowMode(TRUE);
if(DxLib_Init()==-1)return(-1);
DrawBox(0, 0, 120, 65535, TRUE);

WaitKey();
DxLib_End();
return(0);
}

というプログラム書くとエラー出るのはなぜでしょうか?ちなみに
14さいからはじめるリアルに動くゲーム物理プログラミング教室C言語編
という本に載ってます。

459:デフォルトの名無しさん
07/08/19 12:38:39
エラーの内容かけ。

460:458
07/08/19 12:40:14
エラー E2141 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 宣言の構文エラー
エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 不要な }
エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 不要な }
エラー E2303 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 型名が必要
エラー E2356 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 'ChangeWindowMode(int)' の再宣言で型が一致していない
エラー E2344 C:\Users\shiro\Desktop\MyC\プロジェクトに追加すべきファイル_BCC用\DxLib\DxLib.h 1017: 一つ前の 'ChangeWindowMode(int)' の定義位置
エラー E2063 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 不正な初期化
エラー E2293 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: ) が必要
エラー E2040 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 6: 宣言が正しく終了していない
エラー E2303 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 型名が必要
エラー E2356 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 'DrawBox(int,int,int,int,int,int)' の再宣言で型が一致していない
エラー E2344 C:\Users\shiro\Desktop\MyC\プロジェクトに追加すべきファイル_BCC用\DxLib\DxLib.h 1519: 一つ前の 'DrawBox(int,int,int,int,int,int)' の定義位置
エラー E2063 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 不正な初期化
エラー E2293 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: ) が必要
エラー E2040 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 11: 宣言が正しく終了していない
エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 12: 不要な }
*** 16 errors in Compile ***

** error 1 ** deleting Debug\dxtest.obj

です。
ちなみに今日勉強したばかりでさぱりとわかりません

461:デフォルトの名無しさん
07/08/19 12:41:46
勉強してないからエラーが出る

462:デフォルトの名無しさん
07/08/19 12:42:05
どんなエラーがでてるの?

463:デフォルトの名無しさん
07/08/19 12:42:21
最初に4行目にエラーが出ているだろう。
4行目を穴があくまでじっくり見ろ、その教科書とひたすら比較しろ。
それでわからなかったらもっかいおいで。

464:デフォルトの名無しさん
07/08/19 12:45:46
彼はエラーの見方がわからないと思う

465:デフォルトの名無しさん
07/08/19 12:46:33
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
ChangeWindowMode(TRUE);
if(DxLib_Init()==-1)return(-1);
DrawBox(0, 0, 0, 120, 65535, TRUE);

WaitKey();
DxLib_End();
return(0);
}

466:デフォルトの名無しさん
07/08/19 12:49:38
ChangeWindowMode(1);
こっちのがいいかも分からんね

467:458
07/08/19 13:11:31
>>465のように書いてみましたが
まだ
Fatal: ファイル VORBISFILE_STATIC.LIB が開けません
と出ます。
>>464
まったくおっしゃるとおりです

468:デフォルトの名無しさん
07/08/19 13:59:36
>>467
エラーの通りvorbisfile_static.libってファイルが見つからないんだろ。
あとは環境が分からないと何も言えないと思う。

自分の開発環境を検索ワードに入れて、
(「vorbisfile_static.lib VC++」とか「vorbisfile_static.lib BCC」とか)
その辺でググって見たらどうよ?

469:デフォルトの名無しさん
07/08/19 15:14:22
というか似たような質問を、DxLibのサイトで何度も見た気がするんだ。

470:デフォルトの名無しさん
07/08/19 15:55:17
vorbisfile_static.libはDxLibのアーカイブに同梱されてるから
それをソースと同じディレクトリにコピー
というか「このフォルダのファイルを全てコピー」みたいなフォルダなかったか?

471:230
07/08/19 23:24:29
GNU Compiler Collectionのg++コンパイラで
-std=c++98というコンパイラオプションというのがあるらしいのですが
ぐぐってもよく分かりませんでした。
誰か教えてください。

472:471
07/08/19 23:25:32
230というのははミスです。すみません(汗

473:デフォルトの名無しさん
07/08/19 23:42:30
コンパイラマニュアルとかないの?

474:デフォルトの名無しさん
07/08/19 23:48:12
>>471 URLリンク(gcc.gnu.org)

475:471
07/08/19 23:49:45
どもです。探し見てみます。

476:デフォルトの名無しさん
07/08/19 23:51:50
もう見てないかな
まるちか?2ちゃんではマルチポストは叩かれるですよ
せめて、主とする、質問したスレを付記
機嫌が良ければ、そこにヒント書きますから

477:デフォルトの名無しさん
07/08/19 23:56:08
今更VC++6.0のMFCなんですけれど、
ツリーコントロールのアイテムの文字列が長いときに
横スクロールにせず、文字列を折り返すことってできますでしょうか?

478:デフォルトの名無しさん
07/08/20 01:12:13
curses(ncurses)のプログラミングを euc-jp 環境で行って来たのですが、
訳あって utf-8 環境で行うことになりました。

euc-jp 環境で作ったファイルを utf-8 環境に持ってきて、
iconvで文字コードを変更し、コンパイル、実行すると、出力(日本語)が文字化けてしまいます。

utf-8 環境に持ってきた euc-jp のファイルを、
文字コードをそのままにして、端末の表示文字コードを utf-8 から euc-jp に変更した上で、コンパイル、実行すると、正しく表示されます。

これななぜでしょうか?
curses が utf-8に対応していないとかってありますか?

479:デフォルトの名無しさん
07/08/20 01:14:08
>>478
ソース文字セットと実行文字セットは別。
gcc のオプション -finput-charset と -fexec-charset を参照すべし。

480:デフォルトの名無しさん
07/08/20 01:15:56
>>478
curses 関係あるのか?
puts("あいうえお") とかで試せばわかると思うけど。

481:デフォルトの名無しさん
07/08/20 01:20:45
先ずは問題の切り分けだね。
>480の言うように標準出力に出力してみてその時点で文字化けしているならgccのオプションなどを調節。
その上でcurses使うと化けるのなら、cursesの設定か何か、その辺りの調査。

482:デフォルトの名無しさん
07/08/20 01:36:08
operator=で返す自分の参照は、constつけるべきですか?

483:デフォルトの名無しさん
07/08/20 01:42:23
>>482 いいえ。

484:デフォルトの名無しさん
07/08/20 01:48:55
寧ろつけてはいけません。

485:デフォルトの名無しさん
07/08/20 02:10:18
>>447
どうもです
XSIではコマンドを実行する際にエディタのIDのような物が必要で、
エディタウィンドウを複数開いている時には、コマンド実行前に
その時アクティブなウィンドウのIDを取得する必要があります。

WM_ACTIVATEとかを使えば良いのでしょうか?


486:デフォルトの名無しさん
07/08/20 02:24:33
動画とかをエンコードするデコーダって色々ありますよね。
あれ使えるソフト作るのって大変なんでしょうか?
AVIutlみたいなソフトって個人では簡単に作れないんですかね?
どの辺勉強したらいいんでしょうか?

487:デフォルトの名無しさん
07/08/20 02:27:35
>>478 です。

>>479,480,481
さんを参考にして少しいじってみました。

まず、480さんの言うように、単純に puts("あいうえお") を行うプログラムを書き実行してみました。
すると、”-finput-charset=utf-8 -fexec-charset=utf-8”が有る無しに関わらず、文字化けしませんでした。

次に、cursesのコンパイルを、”-finput-charset=utf-8 -fexec-charset=utf-8”を付けて実行してみたところ、やはり文字化けが発生しました。

488:デフォルトの名無しさん
07/08/20 02:43:20
単にcursesがutf-8に対応して無いんじゃないの?
utf-8だと端末上での漢字の幅がバイト長と単純に一致しなくなるし
naiveな実装だと色々問題起きそう

489:デフォルトの名無しさん
07/08/20 03:30:44
VC++2005で<cstdio>等をインクルードすると、
std::printf はもちろん、名前空間のない ::printf も使えてしまいます。

BCB2006だと逆に、<stdio.h>をインクルードすると
::printf を使えますが、 std::printf も使えます。

どちらが正しいのでしょうか。また、正しくない方を正しくする方法はありますか?

490:デフォルトの名無しさん
07/08/20 04:18:35
>>478です。
URLリンク(www.hakodate-ct.ac.jp)
というサイトがあったので、
・-lncurses ではなくて -lncursesw をリンクする
・#include <locale.h>
・setlocale( LC_ALL, "" );

を取り入れたところとりあえず、euc-jp 環境のファイルを utf-8 環境に持ってきて、
このファイルの文字コードを utf-8 に変えてコンパイルし実行すると、
文字化けしない ・・・というのは達成できました。

しかし、私は UNIX(LINUX) にあるような SLコマンド のクマAA バージョンを作って遊んでいたのですが、
euc-jp環境とutf-8環境では少し動きが変わってしまいました。
その動きの変わってしまう場所が、euc-jp環境で苦労して改良したところなので、
かなりショックです。

まぁ、なんとか解決策があればいいのですが、
私の知識ではちょっとつらいかも知れません。

491:デフォルトの名無しさん
07/08/20 07:47:38
for(;;)
;
こんなのあるのね
びっくり

492:デフォルトの名無しさん
07/08/20 09:25:05
無限ループの常套手段

493:デフォルトの名無しさん
07/08/20 09:27:33
俺はwhile(1)派

494:デフォルトの名無しさん
07/08/20 09:31:18
自分も無限ループはwhile派かな
カウンタが要るときはfor使うかもしらんけど

495:デフォルトの名無しさん
07/08/20 09:46:09
>>489
<cstdio> で std::printf が、 <stdio.h> で ::printf が使えるようになることになっている。
1つのヘッダで両方が使えるようになることは保証されない。

496:デフォルトの名無しさん
07/08/20 18:43:51
std::bad_allocを捕まえたりいろいろ例外処理を書いているのですが、
メモリ4GBもあるので、デバッグ中にbad_allocが投げられることは今まで一度もありません。
投げられた際の動作をデバッグしたいのですが、そういうときはどうすればいいでしょうか。
敢えてメモリを消費したりするんですか?

↑ではbad_allocのことですが、他にもWindowsのAPI関数が失敗したときとかも、
ちゃんと自分が書いた処理が動作するか確かめたいんですが。

497:デフォルトの名無しさん
07/08/20 19:07:29
throw std::bad_alloc();

498:デフォルトの名無しさん
07/08/20 19:37:17
>>496
適当にラップして失敗に相当する結果を返せばいいべ

499:デフォルトの名無しさん
07/08/20 20:47:05
起動時に malloc(100000000) とか適当にやっとけば足りなくなるんじゃない?

500:デフォルトの名無しさん
07/08/20 21:09:14
例えば、"a"とか"あ"の文字コードを出力する方法ってありますか?

501:デフォルトの名無しさん
07/08/20 21:11:15
printf( "%d", 'a' );

502:デフォルトの名無しさん
07/08/20 21:30:04
>>501
ありがとうございます。

このページ
URLリンク(ash.jp)
の、UTF-8の欄のような値を出力する方法ってありますか?

503:デフォルトの名無しさん
07/08/20 22:23:30
%Xでの表示をぐるぐるまわせばおわりだろうに。

504:デフォルトの名無しさん
07/08/20 22:26:44
>495
URLリンク(www.open-std.org)
によると、
> Including the header <cxxx> declares a C name in namespace std.
> Including the header <xxx.h> declares a C name in namespace std (effectively by including
> <cxxx>), then imports it into the global namespace with an individual using declaration.
ということで、xxx.h だと std とグローバル両方で宣言されるというのが規格の意図らしい。
なので、BCB2006 の挙動は(それだけ見ると)規格に合致している。

が、現実的には
> If you want to assuredly declare a C name in the global namespace, include <xxx.h>.
> You may or may not also get the declaration in namespace std.
> If you want to assuredly declare a C name in namespace std, include <cxxx>.
> You may or may not also get the declaration in the global namespace.
ということで、>495 が妥当な仮定。
規格もこの現状を追認する形での修正が提案されている。

>502
自分がやりたいと思っていることをもうちょい正確に表現して欲しい。
文字が表示されて欲しいのか、文字コードが表示されて欲しいのかどっち?
入力として考えているのはどんなデータ?外部から与えられる文字列か、文字列リテラルか。文字コードは?

505:504
07/08/20 22:28:32
最初のアンカーは >489 につけるべきだった。

506:デフォルトの名無しさん
07/08/21 02:01:29
別人ですが
>>499
バグでそんな値(もっとでかい、0x40000000とか)を与えたことがあるけど、
無理に仮想記憶拡大して確保しようとして、システムが実質操作不能になるだけだった

507:デフォルトの名無しさん
07/08/21 02:33:09
Windowsって1プロセスが使用できるメモリ空間のサイズって指定出来ないの?
Win2000の頃は2G制限とかあった記憶があるけど、今はどうなんだろ。

508:デフォルトの名無しさん
07/08/21 03:06:41
>>507
以下は単なる思いつき。
1. プログラムの改造が可能なら、自分用の一定量しか領域確保できないメモリマネージャを作る。
2. メモリ取得APIをフックして自力で制限する。
3. SetProcessWorkingSetSizeを指定して、同時にスワップを小さくする。


509:デフォルトの名無しさん
07/08/21 05:28:56
たった1000行のソースも完全に把握できねぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇ
もうだめだぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ

510:デフォルトの名無しさん
07/08/21 05:38:16
やっと気付いたか。
さっさと人生やり直せ。

511:デフォルトの名無しさん
07/08/21 08:15:52
>>509
1関数1000行なら窓から投げ捨てろ

512:デフォルトの名無しさん
07/08/21 08:40:46
10万行超えると見る気すら失せる

513:デフォルトの名無しさん
07/08/21 09:28:25
float hoge = new float[100];
foo->CopyArray(hoge);


Cfoo:Cfoo()
{
float m_array = new float[100];
}
void Cfoo:CopyArray( float arg[])
{
arg = m_array;
}

配列のコピーをしたいとき、
上のように配列の名前(=先頭のポインタ?)
だけコピーするだけではダメなようなのですが、なぜですか?
for(int i=0;i<100;i++)
arg[i]=m_array[i];
}
のように中身を一つずつきちんとコピーしないとダメなんでしょうか?

514:デフォルトの名無しさん
07/08/21 09:37:17
arg = m_arrayだとコピーじゃなくて同じ配列に別名を付けてるだけになる

515:デフォルトの名無しさん
07/08/21 09:43:12
::memcpy(arg, m_array, sizeof(float) * 100));

516:デフォルトの名無しさん
07/08/21 09:47:54
std::copy(&m_array[0], &m_array[100], &arg[0]);

517:デフォルトの名無しさん
07/08/21 11:12:35
>>513
>float hoge = new float[100];
コンパイルできるコードを提示しなさい。
>arg = m_array;
それは、仮引き数にメンバ変数の値を代入しているだけなので、仮引き数の寿命とともに無に帰します。

518:デフォルトの名無しさん
07/08/21 11:13:18
>>515
そんなコードを書く香具師は野垂れ死に値すると思います。

519:513
07/08/21 11:55:54
皆さんいろいろありがとうございます。

>>517
>コンパイルできるコードを提示しなさい。

float* hoge = new float[100];
でした。

>それは、仮引き数にメンバ変数の値を代入しているだけなので、仮引き数の寿命とともに無に帰します。

というわけで、分かっておられると思いますが渡してるのはポインタでして
寿命は関係あるんですかね?

>>514
これもちょっと理屈が分かりません。
なぜ配列に別名をつけてることになるんですか?
配列の名前って先頭のポインタをさしてるんじゃなかったでしょうか?

>>518
一行で済むのでforで要素を一つずつコピーするよりは>>515>>516はいいかなと思ったんですが、
どうして>>515はダメなんですか?

520:デフォルトの名無しさん
07/08/21 12:04:44
>>519
>寿命は関係あるんですかね?
その仮引き数の寿命は、その関数を抜けるまでです。
ポインタがポイントしている先のことは言及していませんね。
もう少し、ポインタ変数と言うものを理解しておいた方が良さそうです。

>なぜ配列に別名をつけてることになるんですか?
ポインタ変数にポインタ変数の値を代入するだけでは、
ポイント先の複写は行なわれません。
もう少し、ポインタ変数(ry

>どうして>>515はダメなんですか?
どうしてダメじゃないと思うんですか?

521:デフォルトの名無しさん
07/08/21 12:06:18
>>519
> どうして>>515はダメなんですか?
float配列ならば動くけど、一般のオブジェクトの配列なら破滅的。
たとえば、string配列をmemcpyしたらどうなると思う?


522:デフォルトの名無しさん
07/08/21 12:17:40
float で大丈夫ならダメとは言えないだろ。もっといい方法があるってだけで。

523:デフォルトの名無しさん
07/08/21 12:24:46
>>520
>ポインタ変数にポインタ変数の値を代入するだけでは、
>ポイント先の複写は行なわれません。

いま気づきました。狂ってました。すいません。

要するに考え方として
「呼ぶ側で作った配列を渡してm_arrayの中身をコピーして貰ってくる」んじゃなくて
「ポインタを渡してm_arrayの先頭のアドレスだけ貰ってくる」っていうような
感じの書き方はできないんですかね?
呼ぶ側で、m_arrayの先頭のアドレスとサイズだけ分かれば
中身にアクセスできそうに思うのですが。

例えば、クラスメンバで持っているprivateな普通のオブジェクトインスタンスのポインタなんかの場合は
わざわざ中身をコピーしないでアドレスだけGet~とかで貰って使ったりするじゃないですか?

>どうしてダメじゃないと思うんですか?

試したらとりあえずうまくいったんで・・・

>>521
わかりません。floatでは一応動きましたが、なんでダメなんでしょうか。
サイズ指定した範囲をコピーすればうまく動くと思うのですが。

524:デフォルトの名無しさん
07/08/21 12:29:27
>>523
> 「ポインタを渡してm_arrayの先頭のアドレスだけ貰ってくる」っていうような
> 感じの書き方はできないんですかね?

なんでできないと思うの?

525:デフォルトの名無しさん
07/08/21 12:31:36
>>524
書き方が分からないんで
そういう書き方が出来るなら教えてください、
ってことなんですが。

526:デフォルトの名無しさん
07/08/21 12:34:01
やっぱりポインタ変数とポイント先の関係がわかっていないような……

527:デフォルトの名無しさん
07/08/21 12:35:28
floatやint、char[]ならmemcpyしても問題ないが、下みたいなクラスだと問題が出てくる

class hoge {
 char *str;
 int length;
};

main() {
hoge* v1, v2;
v1 = new hoge;
v1->str = new char[100];
memcpy(v2, v1, sizeof(hoge));
strcpy(v1->str, "v1");
strcpy(v2->str, "v2");
printf("v1.str is %s.\nv2.str is %s", v1->str, v2->str);
}


528:デフォルトの名無しさん
07/08/21 12:41:40
>呼ぶ側で、m_arrayの先頭のアドレスとサイズだけ分かれば
>中身にアクセスできそうに思うのですが。

思いついて下のようにやったらうまくいったようなのですが、
これってなんか危険だったりしますか?

float* hoge = new float[100];
hoge = foo->GetArray();


Cfoo:Cfoo() {
float m_array = new float[100];
}

float* Cfoo:GetArray(){return m_array;}


529:デフォルトの名無しさん
07/08/21 12:47:45
>>528
最初のnew float[100]で確保したメモリはどうやって解放するんだい?

530:デフォルトの名無しさん
07/08/21 12:52:23
>>528
配列のコピーをしたいんじゃなかったのか?

531:デフォルトの名無しさん
07/08/21 12:58:48
>>527
理解にしばらく時間を要します。
脳のクロックが著しく劣っているのですいません。

>>529
これでもうまくいったっぽいですが、これならOKですか?

float* hoge;
hoge = foo->GetArray();

Cfoo:Cfoo() {
m_array = new float[100];
}

float* Cfoo:GetArray(){return m_array;}

>>530
すいません、コピーというか、m_arrayの中身を
どうにかして呼ぶ側で使えれば何でも良かったのですが。

532:デフォルトの名無しさん
07/08/21 13:00:55
floatの計算速度ってdoubleよりも遅いんですか?

533:デフォルトの名無しさん
07/08/21 13:02:09
>>528
巧くいってない巧くいってない。

>>531
だから、なんでコードの断片載せるんだって。
で、なんでまたfooはポインタなんだ?

534:デフォルトの名無しさん
07/08/21 13:03:27
>>532
足し算などは同じ。超越関数などは速い可能性が高い。
しかし、他の方への変換が入ったりすると遅くなることもある。

結論:一概には言えない。

535:デフォルトの名無しさん
07/08/21 13:06:07
もうスマートポインタコンテナとかRange conceptとか使う方がいいよ

536:513
07/08/21 13:14:09
つまりはどうしたらいいのでしょうか?もうわけ分かりません。

やりたいことはCfooのメンバとしてもってるfloatの配列m_arrayの中身を
コピーするなりポインタを貰うなり、どういう方法があるのか分かりませんが
正しい方法で使いたいってことなんですが。
元の中身を書き換える必要はありません。知れればいいです。
で、とりあえず531で動いてますが、これは危険でしょうか。
要素数は別個貰うなりすれば分かるので
その範囲内だけアクセスするなら大丈夫そうなんですが、ダメですか。


537:デフォルトの名無しさん
07/08/21 13:16:58
>>536
特に問題はないんじゃないの

538:デフォルトの名無しさん
07/08/21 13:28:14
>>537
そうですか。ではひとまずこれでやっときます。
どうもお騒がせしました。

539:デフォルトの名無しさん
07/08/21 13:36:29
書き換えないなら戻り値はfloat *ではなくconst float *にするべきだな。
それ以前に、Cfooを何故ポインタにしているかを知りたいんだが。

540:デフォルトの名無しさん
07/08/21 13:52:24
floatならSSEで高速化しやすい

541:513
07/08/21 13:53:03
>>539
>書き換えないなら戻り値はfloat *ではなくconst float *にするべきだな。

なるほど。

>Cfooを何故ポインタにしているかを知りたいんだが。

特に理由はないですが、
newしたCfooのポインタをメンバとして持ってるだけです。
ポインタで持ってるほうがいろいろ別のクラスに連れまわしたりするとき便利かなと。
むしろなぜそこが気になるのか知りたいんですが。

542:デフォルトの名無しさん
07/08/21 14:03:17
>>541
>むしろなぜそこが気になるのか知りたいんですが。
半ば個人的な興味だ。無条件にnewしたがるJava出身者が身近にいるもんでね。
# しかも、悪いことにdeleteする癖はついてないと来たもんだw

543:513
07/08/21 14:06:22
>>542
はい、まさに私のことです。

544:デフォルトの名無しさん
07/08/21 14:10:56
W

545:デフォルトの名無しさん
07/08/21 14:16:01
>>542
BCB使いもnewする癖が‥‥

546:デフォルトの名無しさん
07/08/21 15:40:21
OOっぽく書こうとするとそうなるんじゃないかな
C++的にはスマートポインタを使え、ということになるんだが
いずれにせよ常にownershipを意識している必要はあるね

547:デフォルトの名無しさん
07/08/21 16:02:26
ローカルなオブジェクトまでnewを使い始めたらもう、末期症状だ。
# オブジェクトは全てグローバルに管理されているとしたら、それはそれで難だけど。

548:デフォルトの名無しさん
07/08/21 16:03:31
>>545
VCL使ってると確かにnew癖つくなw

549:デフォルトの名無しさん
07/08/21 18:22:21
カウンタ付けて自動でdeleteするclassくらい自作しろ

550:デフォルトの名無しさん
07/08/21 21:25:00
何で既にあるもん作りなおさにゃならんのん・・・

551:デフォルトの名無しさん
07/08/21 22:27:07
boostの名前あげるとboost厨ウゼェとか言われるから

552:デフォルトの名無しさん
07/08/22 00:16:08
std::tr1::shared_ptrならいいのか?

553:デフォルトの名無しさん
07/08/22 04:50:10
俺はboost::intrusive_ptrが好きだが、めんどい人にはめんどいだろうな。

554:デフォルトの名無しさん
07/08/22 10:37:52
もうIUnknown/comdef.hでいいよw

555:デフォルトの名無しさん
07/08/22 12:21:10
int main (int argc, const char * argv[]) {
char string[] ="Hello,World";
char copystring[13];
stringcopy (string,copystring);
printf("%s¥n",copystring);
return 0;
}
void stringcopy (char *buff,char *copy){
int i = 0;
while(buff[i]){
copy[i] = buff[i];
i++;
}
copy[i] = '¥0';
}
でwhile(buff[i]){…}を
for(i=0;buff[i] == 0;i++)
copy[i] = buff[i];
とすると動かないんですけれど、何故ですか?

556:デフォルトの名無しさん
07/08/22 12:25:25
>>555 条件逆にして動くとでも思ってんの?

557:デフォルトの名無しさん
07/08/22 12:29:42
for(i=0;buff[i] == 0;i++){
printf("loop %d\n",i);
copy[i] = buff[i];
}

ってやってみたら、なにか気づくかも

558:デフォルトの名無しさん
07/08/22 12:36:13
わかった!
for(i=0;buff[i] != 0;i++)
ってすると動くぞ!

559:デフォルトの名無しさん
07/08/22 12:49:13
Containerというクラス名をAAというクラス名にしたら、

Container.h:9: an anonymous union cannot have function members
Container.h:26: abstract declarator `<無名 class>' used as declaration
Container.h:26: anonumous 名前空間の集合体は static でなければなりません



560:デフォルトの名無しさん
07/08/22 12:50:45
>>559
すいません、間違えて「書き込む」ボタン押してしまいました。

Containerというクラス名をAAというクラス名にしたら、

AA.h:9: an anonymous union cannot have function members
AA.h:26: abstract declarator `<無名 class>' used as declaration
AA.h:26: anonumous 名前空間の集合体は static でなければなりません

というエラーが出てきたのですが、このエラーの意味が理解できません。
教えてください。

561:デフォルトの名無しさん
07/08/22 13:12:06
エスパー募集するんでもなければコード貼れよ。

562:デフォルトの名無しさん
07/08/22 13:16:23
>>560
最初のエラーだけとってみれば
無名共用体には関数メンバを持つことができない
というエラー。
だから名前だけじゃなくて何か意味または構造が変わるような修正をしてると
思うけど、情報が不足してるのでこれ以上のことは分からない。

563:デフォルトの名無しさん
07/08/22 13:42:53
>>559です。
自己解決しました。

ContainerからAAに名前を変えたときに、

#ifndef CONTAINER
#define CONTAINER
#include "Container.h"
#endif



#ifndef AA
#define AA
#include "AA.h"
#endif

としていたためにエラーが出ていました。

情報の足りない質問で申し訳ありませんでした。m(_ _)m

564:デフォルトの名無しさん
07/08/22 13:51:53
>>563
まあ、解決したのはよかったけど、
そもそものソースの構造がおかしいんじゃないのか?
普通は Container.h の中で全体を

Container.h
-----------------
#ifndef CONTAINER
#define CONTAINER



#endif
-----------------
としてくくるんであって、includeする側では、二重取り込み防止マクロなんて書かないだろ。

565:でいびす
07/08/22 16:08:55
VC++5.0でファイルリードをやってます。

その時、読込んだ値を文字として認識できるか

調べたいのですが、やり方を教えてもらえませんか?

ループしながら、1文字づつ調べたいです。

ちなみに、文字列には半角の日本語と全角の日本語が混在しています。

お願いします。

566:デフォルトの名無しさん
07/08/22 16:23:15
文字として認識ってのがあいまいだけど
_ismbbprint
あたり使えるか調べて見れ

567:でいびす
07/08/22 16:51:43
>>566

_ismbbprintは使えませんでした。

ビルドが通らなかったです。


568:デフォルトの名無しさん
07/08/22 16:55:13
URLリンク(msdn2.microsoft.com)(VS.80).aspx

569:デフォルトの名無しさん
07/08/22 16:59:27
なんだってVC++5.0なんてもんを使ってるんだ

570:でいびす
07/08/22 17:04:29
>>569

古いプログラムをカスタマイズする事になったので使ってます。

571:でいびす
07/08/22 17:11:52
>>570

古いプログラムをカスタマイズする事になっても使う必要ありません。

572:デフォルトの名無しさん
07/08/22 17:23:18
いやー、そうとも限らんぞー

573:でいびす
07/08/22 17:24:06
>>570

いやー、そうとも限らんぞー

574:デフォルトの名無しさん
07/08/22 17:25:49
VC++5.0ってSTLがはじめてバンドルされた版だよな
無理やり使ったが、今にして思えばひでえ出来だった

575:デフォルトの名無しさん
07/08/22 19:20:05
new が失敗した時に NULL を返すことを前提にプログラムしてたりするんだろうなあ。

576:デフォルトの名無しさん
07/08/22 19:22:18
new が失敗した時に NULL を返すことを前提にプログラムしてたりしてます。

577:デフォルトの名無しさん
07/08/22 19:42:58
new(nothrow)使えば問題なし

578:デフォルトの名無しさん
07/08/22 19:45:10
newハンドラ使えば問題なし

579:デフォルトの名無しさん
07/08/22 20:49:37
set_new_handler じゃなくて _set_new_handler で、
new ヘッダじゃなくて eh.h で宣言されてたんだっけ。
bad_alloc は VC5 で宣言されてたっけ?

580:デフォルトの名無しさん
07/08/22 21:01:23
>>565
VCだと昔から日本語対応の関数はあって、どこかのバージョンで
_ismbXXXX のようなマルチバイト系関数であることを明示するような
関数名になったはず。
それがVC++5.0かどうか知らないが、でもだから対応する関数はあるはず。

で、ぐぐると以下のサイトに適度に古そうな関数名がならんでいるので
試してはどうだろうか。
URLリンク(www.geocities.co.jp)

581:デフォルトの名無しさん
07/08/22 21:08:46
UTF-8だったりEUC-JPだったりISO-2022-JPだったりする可能性は?
というのは余計なお世話か。

582:デフォルトの名無しさん
07/08/22 21:12:02
文字コードについては>>565が勝手に判断するでしょ。
だいたいVC++5.0の時代のアプリにShift_JIS以外使ってるとも思えないけど。

583:でいびす
07/08/22 21:14:17
VC9使うことにしますた

584:デフォルトの名無しさん
07/08/22 22:09:24
VC++はソースのエンコードすら指定できない糞コンパイラ

585:デフォルトの名無しさん
07/08/22 22:13:51
>>584はVC++はソースのエンコードすら指定できないコンパイラと思っている糞

586:デフォルトの名無しさん
07/08/22 22:20:15
できるの?
clにそれらしいオプションが見当たらないからできんのかと思ってた

587:デフォルトの名無しさん
07/08/22 22:24:34
>>585
どうやって指定するの?

588:デフォルトの名無しさん
07/08/22 22:31:21
>>585
おれもきになる

589:デフォルトの名無しさん
07/08/22 22:40:08
std::vector<foo> hoge という変数があるとして、
これを関数の引数に渡すときはhogeのポインタを渡した方が
hoge自体を値渡しするより動作は速いですか?

590:デフォルトの名無しさん
07/08/22 22:41:32
その通りだが、せっかくC++なのだからリファレンス渡しするか
iteratorを渡せ

591:デフォルトの名無しさん
07/08/22 22:43:22
何すかそれ

592:デフォルトの名無しさん
07/08/22 22:45:33
void hogehoge(std::vector<foo>& rhoge);

593:デフォルトの名無しさん
07/08/22 22:48:03
>>591
void swap_ptr(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; }
void swap_ref(int &a, int &b) { int tmp = a; a = b; b = tmp; }
main() { int m = 1, n = 2; swap_ptr(&m, &n); swap_ref(m, n); }

swap_ref()がリファレンス渡し。
この場合は入出力引数だが、入力だけでいいんならconstつけろ。

594:デフォルトの名無しさん
07/08/22 22:50:19
>>590
サンクスコ

595:デフォルトの名無しさん
07/08/22 22:55:22
>>593
サンクスコ

596:デフォルトの名無しさん
07/08/22 23:12:21
ドトネトのMicrosoft.VisualC.CppCodeProviderってもしかしてclのかわりに
C++コンパイルできんのか
マネージドじゃないと無理かな

597:デフォルトの名無しさん
07/08/22 23:37:33
vector<CHoge>::iterator itr;

このitrが指してる要素の中身のアドレスを取りたいときは
どうやって書けばいいんですか?

CHoge* p_hoge;
p_hoge = &itr;

とか書いたら怒られました。


598:デフォルトの名無しさん
07/08/22 23:40:54
p_hoge = &*itr;

599:デフォルトの名無しさん
07/08/22 23:42:12
CHoge* p_hoge = &*p_hoge;

vectorなら鼻からbegin()/end()を使わず、
&v[0]と&v[0] + v.size()でポインタを得て、
それをイテレータとしても使うという手もある。

600:デフォルトの名無しさん
07/08/22 23:42:39
>>598
出来ました。サンクスコ

601:デフォルトの名無しさん
07/08/23 01:12:40
鼻から悪魔に見えた

602:デフォルトの名無しさん
07/08/23 01:13:32
>>584
エンコードの指定は出来ないが、
BOMが付いてればUnicode LE/BEやUTF-8はそれで判定する。
BOMがなければANSI文字コードとみなしている。
javacやunix系のコンパイラはUTF-8にBOMが付いてると処理してくれないものが多く、
双方で利用しようとすると結構めんどい。

603:デフォルトの名無しさん
07/08/23 01:13:53
悪魔から鼻に見えた

604:デフォルトの名無しさん
07/08/23 01:49:46
>>577
そんなことしてもコンストラクタから飛んでくる例外は止まらないぜ。

605:デフォルトの名無しさん
07/08/23 01:50:20
なんかかっこいい

606:デフォルトの名無しさん
07/08/23 11:14:46
>>602
それなりに移植性考えたらC++のソースにBOMつけるとかありえんわな
で、当然boostのソースにはそんなもんついてないし、一部のヘッダにLatin-1な
人名が入ってるから、VC++8.0でコンパイルすると色々苦情を言ってくんのな


607:デフォルトの名無しさん
07/08/24 22:47:56
C++でHTMLのタグのようなものを使用していたり、『::』のようなものなどを見かけます。
Cには無く、C++では使用出来るようなことを幅広く説明している書籍でお勧めのものはありますでしょうか。
発売年や価格、本自体の厚さなど数多くありすぎて、どういうものを購入すればいいのか分かりません。
近くに本屋さんはあるのですがプログラム関係は少ないですのでネット通販で買おうかと考えております。
それ故、内容が確認できず判断が・・orz

608:デフォルトの名無しさん
07/08/24 22:50:21
HTMLのタグ・・・確かにそう見えんことはないw

609:デフォルトの名無しさん
07/08/24 22:58:28
なんだそりゃ、templateのことか?
あまりに斬新過ぎる見解でワロタ

それはそうと、wxWidgetsのWindowProcって、ウィンドウクラスのインスタンス
見つけるのにわざわざグローバルなハッシュテーブル引いてんだな、なんだこりゃ
せめてWin32ならGetWindowLongPtr()使ってくれよ
なんかそうできない技術的理由があんのか

ATLみたいなサンクに書き換えたら、そんだけで激高速化すんじゃね?

610:デフォルトの名無しさん
07/08/24 23:15:45
>>607
結局この本は必要…通読する対象ではない気がする、字引的にほぼ全部載ってる
URLリンク(www.amazon.co.jp)

611:デフォルトの名無しさん
07/08/25 00:31:15
そんなに高速化するわけない。
いったい一秒に何回メッセージが来て、
グローバルハッシュを引くのに何ナノ秒
余分にかかるというんだ?

612:デフォルトの名無しさん
07/08/25 00:37:41
一秒に何回メッセージが来て、
グローバルハッシュを引くのに何ナノ秒
余分にかかる

613:デフォルトの名無しさん
07/08/25 00:38:15
俺も初めて見たときはタグかと思った。
includeファイルに.hが付いていないことや、標準入出力に<<、>>を使うこと、
「::」の存在など何もかもが新鮮だったあの頃・・・
いまだに初心者の域を抜けられぬ現状orz


614:デフォルトの名無しさん
07/08/25 00:40:43
::は斬新だった。こうゆう記号ってなんか意味を持って決められてるのかな?

615:デフォルトの名無しさん
07/08/25 00:43:25
意味的に : を使いたいけど、ラベルと被るから :: にしたんじゃね?

616:デフォルトの名無しさん
07/08/25 01:44:24
斬新といえばいえなくもないが、: (コロン)は、通常のラベルどころか

・caseのラベル(厳密にいえば通常のラベルと変わらない)
・クラス継承
・コンストラクタの初期化子(?)
・条件演算子の一部

など、よくこれだけ機能を持たせられたと思うものだ。

さらに、ストリームにビットシフト演算子を使うなんて、どこのアホが考えたかと思う。
演算子オーバーロードを見せつけるための演出としか思われない。

さらに、マニピュレータだって?printf系の方がよっぽどうまく素早く整形できるわ。
あんなのC++委員会の遊びにすぎんよ。

もっとも、Cよりは便利なので使わせていただいていますけどね。

617:デフォルトの名無しさん
07/08/25 02:07:29
べ、別に好きでC++を使っているんじゃないんだからね!
Cより便利だから使ってあげているだけなんだからねっ!

618:デフォルトの名無しさん
07/08/25 02:11:22
おっさんが書いてるんだぜ?きめぇ

619:デフォルトの名無しさん
07/08/25 02:11:29
>>616
iostreamとマニピュレータの登場は、標準化委員会の発足より古いはず。

D&Eによれば入出力に演算子を使うのはDoug McIlroy、
マニピュレータはAndrew Koenigのアイデアだそう。



620:デフォルトの名無しさん
07/08/25 04:31:27
printf より優れてる点は型安全な点とポリモーフィズムだな。
printf 風マニピュレータを作らなかったのは C++ の汚点だな。

621:デフォルトの名無しさん
07/08/25 06:21:38
なんで queue には clear() が無いの?

622:デフォルトの名無しさん
07/08/25 10:13:32
ああ、すまん
作るの忘れてた

623:デフォルトの名無しさん
07/08/25 10:32:35
納得した

624:デフォルトの名無しさん
07/08/25 10:37:06
何のqueueにclearが無いの?

625:デフォルトの名無しさん
07/08/25 11:05:14
参照渡しでもらった引数をさらに別の関数に参照渡しするのって
なにか問題ありますか?

626:デフォルトの名無しさん
07/08/25 11:09:57
G++ の STL の queue, priority_queue, stack.
コンテナアダプタには clear() が用意されて無いけど何か理由があるんでしょうか.

627:デフォルトの名無しさん
07/08/25 11:55:33
G++wwwwwwなんという未来言語wwwwww

628:デフォルトの名無しさん
07/08/25 12:00:58
無知発見

629:デフォルトの名無しさん
07/08/25 12:13:16
自己解決しました.

630:デフォルトの名無しさん
07/08/25 12:15:02
>>627
これはひどいwwwwwww

631:デフォルトの名無しさん
07/08/25 12:27:56
>>627=630
そんなエサで俺様が釣られるかクマー

632:デフォルトの名無しさん
07/08/25 13:55:48
>>625
別に問題ない。
寧ろ、参照渡しでもらったものをポインタ渡しするほうがおかしいし、
参照渡しでもらったものを値渡ししてしまったら意味が違ってしまう。

633:デフォルトの名無しさん
07/08/25 15:43:54
何でないんだろうね。
プリンタジョブとかに queue を使ったとして、
ジョブを全部破棄とかすることあるだろうに。

634:デフォルトの名無しさん
07/08/25 16:01:42
1億と2000年前からpopしなさい、というお達しか

635:デフォルトの名無しさん
07/08/25 16:12:47
while(!q.empty()) { q.pop(); }

としろ、ということか。

636:デフォルトの名無しさん
07/08/25 17:14:26
そうだdequeをつかおう

637:デフォルトの名無しさん
07/08/25 17:16:04
q.~queue();
new(&q) std::queue<T>;
冗談だよ、冗談。

638:デフォルトの名無しさん
07/08/25 17:24:21
素直にq=std::queue<int>();と書いてやれよw

639:デフォルトの名無しさん
07/08/25 17:40:57
queue のソースを書き換えればいいんじゃね?

640:デフォルトの名無しさん
07/08/25 17:47:21
queue を継承した my_queue を(ry

641:デフォルトの名無しさん
07/08/25 18:26:24
(x = 1) = 2;

これ、Cだとエラーなんだが、C++ではコンパイルできる
何で?

642:デフォルトの名無しさん
07/08/25 19:11:39
x = 1の結果が、Cは右辺値、C++は左辺値と定められているから。

643:デフォルトの名無しさん
07/08/25 19:19:25
>>642
やっぱりそういうこと?
ストラウストラップの本とK&RとCの規格書調べたんだけど、それらしい記述を
見つけられなかったんだけど、どこかに明記されている?


644:デフォルトの名無しさん
07/08/25 19:26:25
=演算子が参照を返すからじゃね?

645:デフォルトの名無しさん
07/08/25 19:51:03
>>643
642じゃないけど

C言語はJIS X 3010の.5.16代入演算子
代入式は、代入後の左オペランドの値を持つが、左辺値ではない。

C++は手元にあるのが15年前のARM日本語版しかないけど、5.17代入演算子
代入演算子の結果は、代入が行われた後に左のオペランドに格納してある値である。従って、結果も左辺値である。

Cの規格書って何を調べたの?

646:デフォルトの名無しさん
07/08/25 19:54:07
>>644
>>642

647:デフォルトの名無しさん
07/08/25 19:58:03
>>645
脳内

648:デフォルトの名無しさん
07/08/25 20:23:22
X3014にも5.17 1節目の最後に「結果は,左辺値とする。」と書いてある。

>>644
型と右辺値左辺値は別の段階の話。

649:デフォルトの名無しさん
07/08/25 20:33:34
三項演算子で変数返すコード書いて左辺値にしても大丈夫

650:デフォルトの名無しさん
07/08/25 22:36:12
たくさんのレスthx

>>645
同じ規格書の同じとこ読んだんだけど、

代入式:
 条件式
 単項式 代入演算子 代入式
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ってなってたから、代入式ってのは上の3行目(波線部分)の代入式
のことを言ってるのかと勘違いしてた

単項式 代入演算子 代入式
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
これ全体を代入式と言ってるのか
とすれば x = 1 という代入式の結果は左辺値ではないということに
なるか

代入式は、代入後の左オペランドの値を持つが、左辺値ではない
と書いてあるけど、代入式の結果は と書いてくれたほうがクリアになるなあ
~~~~~~~~~~~~~~~~~
BNF記法が分かってなかった

>>648
なるほど
C++のほうはEffectiveにも参照を返すと書いてあるから
理解できた
C++の規格書も買うかな

651:デフォルトの名無しさん
07/08/25 22:42:13
禿の本がまだなら規格書よりそっちを先に読んだ方がいいよ

652:デフォルトの名無しさん
07/08/25 22:46:24
>>650
知ってるかもしれないが、JISの規格書なら以下で参照できる。

日本工業標準調査会
URLリンク(www.jisc.go.jp)
C JISX3010
C++ JISX3014

検索できないのは最悪だけど。

653:デフォルトの名無しさん
07/08/25 22:49:36
>>651
調べ物するときは同じ内容について
色々な本に目を通してるんだけど、
結局、規格書に明記されてると確信に変わる
んで安心できる

禿の本ってEffectiveのこと?
結構高度だから必要に応じて関連する項目を
潰していこうと思ってる

654:デフォルトの名無しさん
07/08/25 22:52:34
>>652
最初、Cの規格書もそこを見てたんだけど
検索できなくて疲れるから買ってしまった


655:デフォルトの名無しさん
07/08/25 22:59:44
禿本 : Bjarne Stroustrup著 プログラミング言語C++

656:デフォルトの名無しさん
07/08/25 23:52:51
>>650
代入式の結果が左辺値か右辺値かは、構文から
決定できる問題ではないので、構文を記した部分は関係ないぞ。

657:デフォルトの名無しさん
07/08/26 03:47:09
class Hoge{private:vector<CFoo> m_vecFoo;};

Hoge::Hoge(){
//落ちる場合1
CFoo foo = CFoo(age,sage);
m_vecFoo.push_back(foo);
//落ちる場合2
CFoo foo;
foo = CFoo(age,sage);
m_vecFoo.push_back(foo);

//落ちない場合
CFoo* foo = new CFoo(age,sage);
m_vecFoo.push_back(*foo)
}

あるクラスCFooについて、newでインスタンスを生成した場合は落ちないんですが、
newを使わないで直接生成した場合(そういうのをなんていうのか知りませんが)
push_backの行で落ちてしまいます。一応どの場合もコンパイルは通ってます。
原因がまったく分からないのでエスパーしてください^^;お願いします。

デバッグ結果:xutilityファイル内↓
inline void __CLR_OR_THIS_CALL _Container_base::_Orphan_all() const
{ // orphan all iterators
_Lockit _Lock(_LOCK_DEBUG);
if (_Myfirstiter != _IGNORE_MYITERLIST)
{
for (_Iterator_base **_Pnext = (_Iterator_base **)&_Myfirstiter;
*_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter)
(*_Pnext)->_Mycont = 0;                  ←この辺でとまってる模様
*(_Iterator_base **)&_Myfirstiter = 0;
}

658:657
07/08/26 03:53:14
//さらにもう一個、落ちる場合
CFoo foo(age,sage);
m_vecFoo.push_back(foo);

ちなみに、push_backをコメントアウトして飛ばせば一応落ちないで動いてるようなので
落ちているのはpush_backの行みたいです。

659:デフォルトの名無しさん
07/08/26 05:25:40
その「あるクラス」がどんなものなのか説明しろよ。
ちゃんとコピーコンストラクタでディープコピーしてるかとか。

660:デフォルトの名無しさん
07/08/26 09:15:04
>>659
すいません。力尽きて寝てました。
実際のCFooはでかいのでそのまま貼ることはできませんが、
・コンストラクタの引数にポインタ型がある
・メンバにもポインタ型がある
・引数つきで生成されること前提なのでデフォルトコンストラクタとか作ってない
・唯一書いてある引数ありのコンストラクタは、メンバを初期化リストで初期化せずに
コンストラクタの中身で初期化してる
・単純なGet~みたいな関数はヘッダに直接書いてある

この辺がなにか関係してるでしょうか?

661:デフォルトの名無しさん
07/08/26 09:36:45
レスに間が空いててもいいが、わざわざ寝てましたなどと言わなくていい

662:デフォルトの名無しさん
07/08/26 09:39:42
レスに間が空いててもいいし、わざわざ寝てましたなどと言ってもいい

663:デフォルトの名無しさん
07/08/26 09:43:44
>>660
>659の質問に答えたまえ。
コピーコンストラクタを設けていないのなら、C++を初歩から勉強しなおせ。

664:デフォルトの名無しさん
07/08/26 09:51:36
ディープコピーって何ですか?

665:デフォルトの名無しさん
07/08/26 10:28:29
本読め
Effective C++とかEffective STLとか

666:657
07/08/26 10:35:13
なんかポインタのメンバとかもってたりするクラスは
コピーコンストラクタなるものをきちんと実装しないと
値渡ししたりするときに問題が発生しやすいらしいので
m_vecFooにはポインタを渡すことにしました。

667:デフォルトの名無しさん
07/08/26 10:38:42
参照を参照のままコピーするのが浅いコピー
参照先を複製してコピーするのが深いコピー

668:デフォルトの名無しさん
07/08/26 10:52:14
コピーコンストラクタを実装してなかったことが原因な気がしてきてはいるのですが
なぜpush_backの段階で落ちてるんでしょうか?
二重でdeleteされてるわけでもないし、理屈がわかりません。



669:デフォルトの名無しさん
07/08/26 10:52:28
ディープキスって何ですか?

670:デフォルトの名無しさん
07/08/26 10:56:26
保育園でするもの

671:657
07/08/26 10:59:13
>コピーコンストラクタなるものをきちんと実装しないと
>値渡ししたりするときに問題が発生しやすいらしいので

訂正ですが、ポインタのメンバを持ってるクラスの
コピーコンストラクタをきちんと実装してない場合、
”値渡しする段階”で問題がでるのではなくて、
”後始末の段階”で二重のdeleteが起きたりするので危険なんですよね?

なんでpush_backしただけで落ちるんでしょうか?
どんな可能性が考えられますか?


672:デフォルトの名無しさん
07/08/26 11:10:13
とりあえず、デバッガで
本当に push_back の行で落ちてるのかどうか確認してみた方がいいんじゃない?


673:デフォルトの名無しさん
07/08/26 11:13:40
>>671
CFoo foo = CFoo(age, sage);
CFoo bar = foo;

とりあえずこのコードで落ちたりしないか?


674:デフォルトの名無しさん
07/08/26 11:23:30
あと、

>CFoo foo;
>foo = CFoo(age,sage);

これをちゃんと動かしたいなら、代入演算子も定義しとけ。

675:デフォルトの名無しさん
07/08/26 11:38:52
>>672>>673
CFoo foo = CFoo(age, sage);
CFoo bar = foo;

としたらpush_backをコメントアウトしても落ちました。
ってことはやっぱりコピーコンストラクタなるものが
きちんと実装されてないのが原因っぽいです。

でも実装してないときはコンパイラが勝手に作ってくれるんじゃないんですか?
で、勝手に作られたものでは”破棄時”に問題がでるので、
自分でうまく実装しないと危険ってだけなんじゃないんでしょうか?


676:デフォルトの名無しさん
07/08/26 11:39:52
>>671
それはもちろんだが、その前に、解放済みの動的資源を参照するオブジェクト
ができてしまうことがマズイだろ

677:657
07/08/26 11:43:25
あぁ、なんかコピーをした段階で落ちてるんじゃなくて、
一時オブジェクトが解放される段階で落ちてるみたいです。

678:デフォルトの名無しさん
07/08/26 11:44:10
>>656
式の結果が左辺値になるか右辺値になるかは構文ではなく
言語の仕様ということか
それなら黙って認めるしかないから明白だ

679:デフォルトの名無しさん
07/08/26 11:47:02
>675
>自分でうまく実装しないと危険ってだけなんじゃないんでしょうか?

その「危険」の内容が、落ちるってことだ。

680:デフォルトの名無しさん
07/08/26 11:49:39
誰かスレッドについて教えてくれ。

自プロセスのスレッド数を
CreateToolhelp32Snapshot、Process32First、Process32Next
使ってスレッド数を出力するだけのプログラムで
なんでcntThreadsの値が8になるんだ?
CreateThreadとかしてないのに・・・

681:デフォルトの名無しさん
07/08/26 12:00:10
知らんけど、システム的なDLLの誰かが作ったスレッドなんじゃない?

682:デフォルトの名無しさん
07/08/26 12:09:32
>>680
お前がアホだから

683:デフォルトの名無しさん
07/08/26 12:11:02
純粋に自分の作ったスレッドの数のみを知る方法ってないのかな?


684:デフォルトの名無しさん
07/08/26 12:11:39
>>680
せめて
URLリンク(www.microsoft.com)
あたりのツール使って、実際のスレッド数をまず確かめてはどうか?

685:デフォルトの名無しさん
07/08/26 12:11:47
ある

686:デフォルトの名無しさん
07/08/26 12:11:53
自分で作ったのなら自分で管理して数えればいいじゃん

687:デフォルトの名無しさん
07/08/26 12:27:41
ProcessWalkerを使ってみたんだが、やはり複数立ち上がってる・・・

確かに自分で数えればいいんだが、
パフォーマンスログでスレッド数見ると
自分で立ち上げたスレッド数以上立ち上がってて
たまに増減するんだよね。

688:デフォルトの名無しさん
07/08/26 12:28:33
だから何だ?チラシの裏にでも書いてろ。

689:デフォルトの名無しさん
07/08/26 12:36:37
そりゃ裏でスレッドを作られったって、それはWin32の勝手だろうに。

690:デフォルトの名無しさん
07/08/26 13:03:42
C/C++の文法自体は大体理解できたが、大規模なプログラムの作り方が
さっぱり分からん

大規模なものだと、だいたいフォルダごとに纏められていて総数数百、数千のファイルがあるが
どのような感じでそんな構造をつくっていけばいいのかさっぱりです。

Webにはどこも同じような、内容ばかりポリモを動物を使っての説明w

結局みんな大規模なものはかけないのかな?

691:デフォルトの名無しさん
07/08/26 13:07:39
はは

692:デフォルトの名無しさん
07/08/26 13:09:43
>>690
大規模っつーことで複数人での開発を想定するが
個人的にはプロセスやDLL等の境界で切ってあるほうがずっとやりやすかったかな
切らないんなら、適切にスタブを作るのが常套かと思う
Facadeなどの下に隠すのも良い
画面がいっぱいあるだけの良くある業務系なら、それぞれの画面に飛べるように
なっていて、それぞれが独立していれば概ね問題は無い
まあ所詮ケースバイケースで王道は無いだろ
「銀の弾丸はない」のだと知れ

693:デフォルトの名無しさん
07/08/26 13:10:03
大規模なプロジェクトと動物ポリモとどういうつながりが?

694:デフォルトの名無しさん
07/08/26 13:20:38
>>687
オーディオデータとか動画扱ってる場合とかWindowsが勝手にスレッド作る場合はよくあるお

695:デフォルトの名無しさん
07/08/26 13:25:54
>>675
>でも実装してないときはコンパイラが勝手に作ってくれるんじゃないんですか?

各メンバのコピーコンストラクタを呼び出す、というコピーコンストラクタを作ってくれる。
同様に代入の場合は各メンバに対しoperator=を呼ぶ。
メンバにポインタがある場合ポインタがコピーされるだけで、ポインタが指す先は複製されない。

696:デフォルトの名無しさん
07/08/26 13:30:15
まーメンバがコピーコンストラクタが上手く動くクラスとポインタ以外の
基本型だけならデフォのコンストラクタで問題ないことも多い
ポインタ生のままで保持せずにboost::shared_ptrでくるんだりしてれば
適切に参照カウント処理してくれる

そうでないならちと考えろってこった


697:デフォルトの名無しさん
07/08/26 13:31:27
>>693
私が言いたいのはWebで恰もC++知ってますみたいな講座書いてる奴の大半は
動物ポリモみたいなことかいてるだけで実用的なことは一切出来ないのかな?

と思っただけですよ

698:デフォルトの名無しさん
07/08/26 13:33:05
しらねぇ
つーかどうでもいい

動物ポリモは確かにくだらねぇしオリジナリティはねぇな

699:デフォルトの名無しさん
07/08/26 13:37:16
初心者の為に端折って説明してるだけなんだよ

700:デフォルトの名無しさん
07/08/26 13:39:50
あれで初心者が解るのか疑わしい

701:デフォルトの名無しさん
07/08/26 13:42:37
わからなかった?
精進するよ

702:デフォルトの名無しさん
07/08/26 13:44:29
>>697
動物ポリモみたいなこと書いてないで君もさっさと大規模なもの作れる頭持つか諦めなさい。

703:デフォルトの名無しさん
07/08/26 13:50:52
そうだね
スレ汚しすまそ

704:デフォルトの名無しさん
07/08/26 14:26:55
逆に実用的でコーディング時の仕様に依存しないポリモーフィズムってなに

705:デフォルトの名無しさん
07/08/26 14:30:57
まだ、いってんの?

C++ 講座
で検索してみなよ

どこもおなじようなことしか書いてないからw



706:デフォルトの名無しさん
07/08/26 14:35:06
そりゃC++ 講座だもん

707:デフォルトの名無しさん
07/08/26 14:41:55
偉そうに書いてるわりには、実際に作ったソフトを公開してる人いないよね

実際はC++の文法だけしか理解できていない可能性高し





708:デフォルトの名無しさん
07/08/26 14:42:57
だからなんだよ?どうでもいいだろ?
チラシの裏にでも書いてろよ。

709:デフォルトの名無しさん
07/08/26 14:45:45
有能だけどそこまで親切じゃない人もいるんだよ

710:デフォルトの名無しさん
07/08/26 14:54:36
>>707はアホそうに書いてるだけで、実際に作ったソフトを公開してないよね

実際はC++の文法ですら理解できていない可能性高し

711:デフォルトの名無しさん
07/08/26 14:56:11
大規模な開発なんて経験つんでやっていくものじゃないの
Webのしかも言語自体の解説に何期待してんだか

712:デフォルトの名無しさん
07/08/26 14:57:08
>>707
遊びの延長や使い捨てや自分専用で作るのと
公開するソフトを作るのではかかる手間が桁違いだろ

713:デフォルトの名無しさん
07/08/26 15:06:54
公開ライブラリを作ってる人達の実力は底が知れない
具体的にいうとboost関係の人達

714:デフォルトの名無しさん
07/08/26 15:23:49
知れるかどうかって話で言うと、何も公開していない人のほうが底が知れないね。

715:デフォルトの名無しさん
07/08/26 15:25:40
>>713
そうか?
以前正規表現を使いたくてboostを使ったが速度でイマイチだったから
自前で実装したけど?

716:デフォルトの名無しさん
07/08/26 15:30:47
>>715
そうか?
以前正規表現を使いたくてお前のを使ったが速度でイマイチだったから
自前で実装したけど?

717:デフォルトの名無しさん
07/08/26 15:32:20
どうでもいから出て行ってくれないかな。

718:デフォルトの名無しさん
07/08/26 16:38:43
boostはC++の実験場だから
チューニングはしてないよ


719:デフォルトの名無しさん
07/08/26 17:18:01
チューニングに関する実験でもチューニングしてないよ

720:デフォルトの名無しさん
07/08/26 18:59:25
boost::uniform_01< boost::mt11213b, float > rnd( boost::mt11213b( (unsigned long)(time(0)) ) );
oven::random_shuffle( vec, _1 * rnd() ); // std::random_shuffle( vec.begin, vec.end, _1 * rnd() );
std::random_shuffleの乱数生成関数オブジェクトにboost::uniform_01を使ってみたんですが
なんかうまくばらけてくれませぬ
というわけでstd::random_shuffle用のいい乱数発生方法を教えてください

721:デフォルトの名無しさん
07/08/26 20:48:44
Boostなんてたいしたこと無いだろ
これが一番典型的な例

____              progress_
|← reject|  boostの中の人  display   ユーザー
. ̄.|| ̄ ̄        ┗(^o^ )┳(^o^ )┳(^o^ )┛≡=-
  ||            ┏┗  ┗┗  ┏┗ ≡=-
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

722:デフォルトの名無しさん
07/08/26 20:58:05
それがboostの典型なら、boostの中でrejectされたりしないだろう。
boostの中で平均的に評価されているものが、他との比較でreject扱いになって
初めて「boostなんてたいしたことない」になる。

723:デフォルトの名無しさん
07/08/26 22:35:06
progress.hppには
まるで役に立たないprogress_displayと
すごく役に立つprogress_timerが同居しています
そんな兄弟いますよね

724:デフォルトの名無しさん
07/08/26 23:18:30
Visual Studio .NET 2003環境の問題について教えてください。

アラビア語リテラルの入った.ccのソース(MySQL)のコンパイルが出来ません。
 error C3209: '・ァル館・' : Unicode 識別子は現在サポートされていません。
というエラーが表示されます。(ソースUTF8の場合)

秀丸でShift-JISにしたり、UTF8にしたりしたのですが、どちらもエラーでした。
VSのエディターではShift-JISの場合、アラビア語が文字化けもなく表示されます。
(UTF8では文字化けして表示されます。)

2時間くらいググッても分かりませんでした。
この問題の解決法を教えてください。
エロイ人お願い! 

725:デフォルトの名無しさん
07/08/26 23:21:48
>>724
VC が UTF-8 を認識できてないんだろ。どうやるのか知らんけど。
Shift_JIS でアラビア語が扱えないのは確実。

726:デフォルトの名無しさん
07/08/26 23:26:42
英語版に言語パック入れたら?


727:デフォルトの名無しさん
07/08/26 23:29:28
BOMつきUTF-8ってVS2003で食えたっけ
VS2005なら大丈夫のはずだが

リテラルはワイド文字なのか?
そうだと仮定すると、ソース修正して
16進でUnicodeのコードポイントを記述してやるのが一番手早い
Perlか何かを使えば簡単だろ


728:724
07/08/26 23:45:35
素早いレス、感謝感激です。

>>725
アドバイス、㌧。
どこで聞けば分かりそうですか?ご存じでしたら教えてください。
オプションやらヘルプやら一通り見てみたのですが、分かりませんでした。

>>726
ちょっと難しそうです。㌧。

>>727
> BOMつきUTF-8ってVS2003で食えたっけ
BOMつきかどうかを確認する方法をご存じでしたら教えてください。

> リテラルはワイド文字なのか?
リテラルはワイド文字です。
確かにソース修正が一番簡単ですね。
ただ、ソースの下の方を見てみたら、ヒンディ語・ヘブライ語・・・と限りなく続いてますので、結構大変かも。

729:デフォルトの名無しさん
07/08/26 23:51:04
>>728
BOMを確認したければファイルの先頭をバイナリエディタで見てみろ。
BOMつきでなければ、VS2005でも食えない。

ワイド文字リテラルなら、話は簡単だな。
手でやらずに簡単なフィルタープログラムを書いて、機械的に変換してしまえ。
そんなら多国語でも関係ない。

730:デフォルトの名無しさん
07/08/26 23:55:03
助けて!以下のプログラムでメモリがおかしくなるお!
分母150 試行回数100000で繰り返すとなるお!
助けて!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
int i,j,dom,cnt,max,ret,k;
int ch;
int array[128];
int over, less;
long int times;

i = j = k = dom = cnt = times = max = 0;

printf("input dominator >");
scanf("%d", &dom);
printf("input times >");
scanf("%ld", ×);


731:730続き
07/08/26 23:55:39
LOOP:
k = 0;
over = less = 0;
while(getchar() != '\n');
printf("dominator = %d times = %d\n", dom, times);

sleep(1);
srand(time(NULL));
for(i=0; i<times; i++){
cnt++;
ret = rand() % dom;
if(ret == 7){
array[k] = cnt / 100;
array[k]++;
k++;
array[k] = -1;
printf("%d\n", cnt);
if(cnt > max){
max = cnt;
}
if(cnt > dom){
over++;
}
else{
less++;
}
cnt = 0;
}
}

732:730続き
07/08/26 23:56:15
for(i=0; array[i] != -1; i++){
for(j=0; j<array[i]; j++){
printf("*");
}
printf("\n");
}

printf("MAX = %d\n", max);
printf("OVER = %d ELSE =%d\n", over, less);
printf("%d/%d\n", over+less, times);
printf("%f\n", times / (double)(over + less));
printf("Retry ? (y/n) >");
ch = getchar();
if(ch == 'y' || ch == 'Y'){
goto LOOP;
}

return 0;
}


733:730
07/08/26 23:56:54
このままじゃパチンコで勝てないお!
助けてお!

734:デフォルトの名無しさん
07/08/27 00:00:33
こんなプログラム書いて何になるの?


735:デフォルトの名無しさん
07/08/27 00:01:41
>>734
>>733

736:724
07/08/27 00:01:41
>>729
ありが㌧。見てみたら、BOMついてませんね。
付けてオンパイルしてみます。ノシ

737:デフォルトの名無しさん
07/08/27 00:04:27
>>730
ざっとみだけど

>int array[128];

が足りてないだけじゃないの?

738:デフォルトの名無しさん
07/08/27 00:06:54
>>730
メモリをケチるな!
array[128] → array[2048]
期待値は (1/150)*100000=666.67

739:730
07/08/27 00:10:46
できたおおおおおおおおおお!
これで勝てるお!

740:730
07/08/27 00:11:55
期待値の詳細希望

741:730
07/08/27 00:14:06
なるほどお!ボヌスが666.67回くるってことかお!
ありがとお!

742:730
07/08/27 00:17:43
やっぱりすごいお
さっぱりわからなかったのに
すぐ回答がきたお
どうしたらそうなれるかお?

743:デフォルトの名無しさん
07/08/27 00:20:17
>>742
毎日2時間、電灯のヒモでボクシング。これを1年続けること。

744:デフォルトの名無しさん
07/08/27 00:21:02
みんな半年から1年ぐらい
アーバンチャンピオンと
スパルタンXで鍛えてるはず

745:デフォルトの名無しさん
07/08/27 00:26:58
>>740
100000回×(1/150)=666.67回 kがインクリメントされるわけだから
array[k]はarray[668]って式で参照される可能性があるわけで
array[128]と宣言したのではあきらかに足りないってことなんではないかと>期待値云々
こういう実行時に入力される値に依存するような大きさの配列はメモリの動的確保で扱うべきだとは思うけどね

746:724
07/08/27 01:39:46
>>736
ファイルの先頭にBOM(というか、ZERO WIDTH NON-BREAKING SPACE。ef bb bfの3バイト)を付加したら
無事、オンパイルできました。

747:デフォルトの名無しさん
07/08/27 01:42:28
>>746
いや、ファイル先頭にある場合、つまりBOMである限り、
それはBOMであってZERO WIDTH NON-BREAKING SPACEとは言わないんだ。

748:724
07/08/27 02:02:45
>>747
添削ありが㌧。

WikipediaのUTF-8(URLリンク(ja.wikipedia.org))のところに記述がありました。
> プロトコルが常にUTF-8である事を強制しているものである場合はBOMを禁止するべきで、
> この場合ファイル先頭のBOMは "ZERO WIDTH NO-BREAK SPACE" と見なされる。
> 逆にプロトコルがそれを保証しない場合BOMは禁止されずファイル先頭のそれはBOMと見なされる。(URLリンク(tools.ietf.org)

2文目ですね。

749:デフォルトの名無しさん
07/08/27 10:40:28
www.vista-osx.com/kensaku.htm


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch