[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 20:36 / Filesize : 218 KB / Number-of Response : 953
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part78



1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part77
pc12.2ch.net/test/read.cgi/tech/1263556932/

321 名前:デフォルトの名無しさん [2010/02/23(火) 05:41:33 ]
禿本の邦訳にも係わってる人だよ

322 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 12:14:03 ]
えぴなんとかさんってすごいのかどうかよくわからん
昔の掲示板ログとか見るととんちんかんな感じだよね
えぴなんとかさんが初心者だったころなのかもしれないけど

323 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 18:19:02 ]
これのことかな
episteme.wankuma.com/stlprog/index.html


324 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 18:48:30 ]
わんくま同盟ってなんか気持ち悪いよね
公開しているドキュメントでお世話になってはいるけど、近づきたくない感じ

325 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 19:14:15 ]
気持ち悪いというあいまいで感覚的な概念が気持ち悪い



326 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 19:41:10 ]
単に偉そうでむかつくんだろ

327 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 19:47:58 ]
「気持ち悪い」のはともかく、「よね」が意味わからん

328 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 20:52:33 ]
内輪ネタを表に出したがるあたりと偉そうなのはむかつくが同意は求めない

329 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:19:05 ]
えぴなんとかさんって
インなんとかさんみたいなもんか?



330 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:42:06 ]
ペンネームに機種依存文字を使うプログラマの人って…

331 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:50:37 ]
ビル☆ゲイツの悪口はそこまでだ

332 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 01:07:23 ]
C++学ぶのにいい本ありませんか?


333 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 01:08:02 ]
>>332 >>4-5

334 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 01:11:44 ]
>>330
今チェックしたんだけど
機種依存文字じゃなかったぞ

335 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 06:51:15 ]
>>332
こいつはマルチポストだから相手にしないように!


336 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 18:30:19 ]
単項演算子-のオーバーロードについて質問があります。
独習C++という本で勉強しているのですが、以下のようなサンプルコードがあります。(※一部省略)
class coord{
int x,y;
public:
coord(){x=0;y=0;}

coord operator-(coord ob2);//2項負符号
coord operator-();//単項負符号
};
//単項-をcoordクラスに対してオーバーロードする
coord coord::operator-(){
x=-x;
y=-y;
return *this;
}
上記の場合、
coord ob1;
coord ob2;
ob2=-ob1;
としただけで、ob1の内容が変わってしまうと思うのですが、
このサンプルコードは正しいのでしょうか?
以下のほうがいいと思うのですが。
//単項-をcoordクラスに対してオーバーロードする
coord coord::operator-()
{
coord temp;
temp.x=-x;
temp.y=-y;
return temp;
}

337 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 18:33:57 ]
俺もそのほうが良いと思う
一般に組み込み型と同じ挙動になるようにデザインするほうが良いと
EffectiveC++にも書いてあるし

338 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 18:40:12 ]
そしてconstを付けるべき

339 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 19:21:48 ]
>>336
君の意見は正しい。
coord coord::operator-()const;
とすれば納得できると思う。



340 名前:336 mailto:sage [2010/02/24(水) 19:57:51 ]
>337-339
ありがとうございました。
これで先に進めます。

341 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:20:04 ]

*thisを返すからいいんじゃないの?

342 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:23:33 ]
this->xが変わるからダメなんじゃないの

343 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:28:54 ]
プログラムに致命的なエラーがあり
(取り扱えない例外をキャッチしたなど。)
そこで即座に終了したい場合、
assert(0);
exit(1);
のどちらが望ましいのでしょうか?

また、この2つにはどんな違いがあるのでしょうか?

よろしくお願い申し上げます。

344 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:33:31 ]
>>342
ああ、すまない。ぼけてたorz
もう寝る…

345 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:42:17 ]
>>343
assertは、ここでこうなってるはずがない、というプログラマの意思表示
んで、それはリリースビルドだとなくなるロジック

346 名前:デフォルトの名無しさん [2010/02/24(水) 23:59:19 ]
インターフェースと実装を分離したいと思ってて、pImplイディオムを利用しようと考えています。
一般的なpImplイディオムは、コンストラクタでimpクラスをnewしていますが、
いま設計しているpImplを利用したクラスは、何度もインスタンス化されるので、newしたくありません。
また、Factory関数を作って、利用者側にわざわざ呼ばせたくありません。

つまり、クラスの利用者から、実装クラスを隠蔽し、かつインスタンス化時に何度もnewしないような方法はありますでしょうか?
(妥協して、メンバ変数だけインターフェース部に持ってきて、実装クラスをSingletonにする、など考えてみましたが、案の定イマイチでした)


347 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 00:22:00 ]
一つ一つ中身が違うならプールして再利用ぐらいしか思い付かないなぁ


348 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:11:41 ]
>>343
その用途だと abort() あるいは terminate() が正解だと思う。
assert() と exit() 含めて、それぞれの違いはライブラリのドキュメント読んでね。

349 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:14:23 ]
>>346
new したくないっていうのは動的メモリ確保のコストを嫌っての話だよね?
そういうことなら、外側のクラスに char impl_storage[max_size] みたいな領域だけ
置いといて、実装クラスでは new (impl_storage) impl(....) すればいいかもしれない。



350 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:16:15 ]
>>346
dlmallocなんて単純だからすぐ作れるし
自分でmalloc作ればいいよ

351 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:20:56 ]
>>346
まず、ふつうに new する状態でパフォーマンスに問題があって、次にそのボトルネックが
new にあるという確認を済ませ、さらに >350 の言うように dlmalloc などによる高速化を試みた後、
それでも問題が残るようなら >349 のような奇怪なコードを、十分なコメントを添えたうえであれば、
書いても良い。

それ以外は許さん。

352 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:51:00 ]
>346
実装インスタンスのnewコストを気にするんだったら、不要になったら再利用できるように簡単なGC作ったら?
実装インスタンス自体は利用者から見えないから、別にFactory関数で管理しても問題ないだろうし。
お手軽に実装するんだったらboost::shared_ptr + deleterかね。


353 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 02:01:58 ]
>>343
assertは開発作業中のマーキングや「しおり」のようなものだと考えたほうがいいと思う。
exitはatexitの登録関数やストリームI/Oの後始末をしてから終了する。
C用の例外の代替物と見るべきで、C++では使わないだろう。デストラクタは実行されないし。
terminate(abort)なら後始末もせずに割り込みを掛けて即座に終了するが、
そこまでしたい状況は考えにくい。
結局、例外をそのまま放っておいてmainでキャッチしてreturn 1;とかするのが
常道だと思う。

354 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 02:05:19 ]
>>343
取り扱えない例外ははじめからキャッチするなよ。
万一そんな状況がやむを得ないとすれば、 throw; で外に向けて投げとけばいいよ。
そうすれば勝手に terminate() するかもしれないし、誰かがキャッチしてくれるかもしれない。

355 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 03:30:24 ]
enum型を引数に持つときって参照渡しにした方がいいの?
構造体とは違うっぽいのでしなくてもいい?速度的に

356 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 03:38:12 ]
>>355
速度が気になるなら計測してみるがいい。

参照渡しがよくあるポインタと同様の実装だと考えると、 enum のサイズがポインタより
大きくなることはなさそうで、あまりメリットはなさそうな感じではある。

357 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 03:54:59 ]
>>351
配置newって嫌われ者なの?

358 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 05:48:41 ]
>>355
列挙型の実態が整数"ではない”実装を見たことがない。

359 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 09:35:37 ]
>>357
別に配置newは嫌いじゃないですが、必要ないところで使うような人は嫌いです。



360 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 10:53:34 ]
誰もつっこまないけどchar impl_storage[max_size]なんてしたらアライメントどうするんだよ。

361 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 10:55:15 ]
>>360 boost::aligned_storage あたりでおきかえる。

362 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 11:33:04 ]
じゃあ最初からboost::aligned_storageって書けよ

363 名前:349 mailto:sage [2010/02/25(木) 12:07:15 ]
>>362
boost::aligned_storage は標準ライブラリでもないし、コンパイラの拡張機能で指定した
ほうがいいかもしれないし、その場で適当な union 作ってしのぐのがいいかもしれないし、
そんな気持ちを込めて「〜みたいな領域」と書きました。

364 名前:343 mailto:sage [2010/02/25(木) 12:49:32 ]
>>345>>348>>353-354
ありがとうございます。
assert() exit() terminate() abort()
について勉強してきます。



365 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 17:02:41 ]
>>363
>そんな気持ちを込めて「〜みたいな領域」と書きました。
どう考えてもそれだけの情報からその気持ちは伝わらないから。
頭大丈夫?日本語分かる?精神鑑定してもらったら?

366 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 20:49:40 ]
解析で使う

  A-Z  a-z  0-9
1  1   2   3
2  1   2 3
3
4

な表ってなんて名前だっけ?

367 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 20:57:50 ]
>>366
LR解析表なのか?状態複数あって
LR衝突してないのか?

368 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 21:03:59 ]
>>367
表の中は説明で適当に書いただで意味はないんだ。
どんな名前だったか忘れてしまったもんで。
助かったよ。ありがとう


369 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 22:34:38 ]
>>365
俺には伝わっていたが、伝わらない人がいるのもわかる。
そして、伝わらなかったからといってそのようなレスをするあなたが心配です。



370 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 13:26:29 ]
一般に、
g++ -lhoge test.cpp
という調子でライブラリを読み込んで成功したとき、
hogeの場所を知るコマンドってありますか?

具体的には
g++ -llapack test.cpp
なのですが、これは
Fortranのライブラリをリンクしているそうです。

Fortranでは
DSYEV
という関数名なのがC系だと
dsyev_
と、アンダーバーがつくようになるというのがよく分からないので・・・。


371 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 14:38:16 ]
よくわからんが、場所っていうのはディレクトリ名じゃなくて関数名のことかい
それにOS依存の話題だったら微妙にスレ違いだぜ

372 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 15:45:41 ]
LD_LIBRARY_PATHとか

373 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 15:47:09 ]
・リンカが検索に用いるパスを探すことで場所を知ることができる
・ラッピングした際に小文字にしたんでしょう

374 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 16:06:37 ]
>>370
www.netlib.org/clapack/faq.html
As previously stated, the CLAPACK library was built using
a Fortran to C conversion utility called f2c. The entire
Fortran 77 LAPACK library is run through f2c to obtain C
code, and then modified to improve readability. CLAPACK's
goal is to provide LAPACK for someone who does not have
access to a Fortran compiler.

It is important to note that this f2c conversion was run on
a machine that appends an underscore to differentiate C
and Fortran 77 namespaces. If your machine does not append
an underscore to differentiate namespaces, then CLAPACK
will not work on your machine.


375 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 17:11:46 ]
ありがとうございます。
だんだん事情が分かってきました。
人間がCに移植しているわけではないのですね。
clapack.h
をみても、単に宣言が書いてあるだけなので、
Cのソースコードとしてincludeするわけでもないのか。

あと前半はたしかにOS依存の話ですね。
手元の環境ではLD_LIBRARY_PATHも空だったし。
すみませんでした。

376 名前:デフォルトの名無しさん [2010/02/26(金) 20:04:26 ]
/*******************************************************/
 #define MAX(x,y) ((x)>(y) ? (x):(y))
 int a = 3;
 int b = 3;
 int m = MAX(a,++b);
はプリプロセッサによって
 int a = 3;
 int b = 3;
 int m = ((a)>(++b) ? (a):(++b));
と展開されます。
結果的に++bが2度評価され、bとmは5になってしまいます。
/*******************************************************/
という記述を見たのですが、標準C++の規格ではbとmは5になるってのは保証されますか?
私には未定義の動作になりそうに見えるのですが。

よろしくお願いします。



377 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:07:07 ]
保証されますよ

378 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:25:05 ]
>>377
 int m =++b, a , ++b;
の場合はどうなりますか?
bとmが5になりますか?
それとも未定義の動作でしょうか?

379 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:30:14 ]
未定義の動作ですよ



380 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:39:49 ]
 int m = (a)>(++b) ? (a):(++b);
だとOKで、
 int m =++b, a , ++b;
だと未定義の動作なのですね。

うーん、ややこしいです。
両方とも一つの式の中で2回bの値が
変化しているように思うのですが、
どういった相違により
片方がOKでもう一方はダメに
なるのでしょうか?


381 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:41:58 ]
カンマがね、ヤバイんですよ・・・ここだけの話

382 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:54:23 ]
unsigned A(){
struct{unsigned a;unsigned operator()(int x){return ++a<<x;}}r={1};
retrun r(0)|r(8)|r(16)|r(24);}

0x04030201 // 式中でオブジェクトの順状態て保証される?

383 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 21:00:47 ]
>>382
されない

384 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 21:42:11 ]
なんか関数の実引数の区切りのカンマと、カンマ演算子を間違っているやつがいるようだ。
>>378 の m, b ともに 5 になることは保証されているぞ (5.18-1)
m=func(++b, a, ++b); だと未定義動作だけどな。

>>376 副作用完了点でぐぐってみるべし

385 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:03:09 ]
a++, a++;

未定義

386 名前:380 mailto:sage [2010/02/26(金) 22:23:55 ]
int m=func(++x, ++x); が未定義動作というのは全会一致ってことですね。

 int m = (a)>(++b) ? (a):(++b); は正当で
 int m =++b, a , ++b; も正当
ですが
 int m =++b, ++b;
は未定義ということなのですか?

int m=(++x) + (++x); は未定義動作になりますか?



387 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:39:06 ]
未定義

388 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:39:58 ]
>>384
int a=3;
int b=3;
int m =++b, a , ++b;

このときにmが5になることが保証されているといっている?

389 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:40:35 ]
>>378 これはコンパイルエラーでしょ。



390 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:43:36 ]
>>384
カンマ演算子は副作用完了点たりえないのでは?

391 名前:390 mailto:sage [2010/02/26(金) 22:45:15 ]
間違えて覚えてたみたい。ごめんなさい。

392 名前:384 mailto:sage [2010/02/26(金) 22:46:49 ]
章番号までちゃんと示してある。言語規格書呼んでから話するんだな。

393 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:54:23 ]
>>392
自信満々のところ水を差すようだけど、 >389 の言うとおりコンパイルエラーになると思うんだ。

カンマ演算子とか言ってるところを見ると、
 int m =(++b, a , ++b);
こう解釈したんだろうとは思うけど。

394 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:54:31 ]
特例は3項演算子、カンマ演算子のほかに&&と||もあるから
int b=1;
int a=++b&&++b&&b;
こんなのでもちゃんとa=3になるな
しかしひどいコードだ

395 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:57:41 ]
もういいから黙って二行に分けろよカス

396 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:59:04 ]
>>393
その程度だろ
codepad.org/8ZqDzVjC
今話してる話題と関係ないだろ

397 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:07:28 ]
何そのイン○リさんみたいな返し?流行ってんの?

398 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:08:14 ]
何言ってんだか

399 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:11:21 ]
>>393
コンパイルエラーにはならず、カンマ演算子の最後、つまり2回目の++bが値として使われるので
mに4が代入された後、bはインクリメントされる。
なので、>>388を書いた。



400 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:16:56 ]
>>399
なんだか知らんが
++bは前置増分演算子って呼ぶってことは知ってるの?

401 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:20:01 ]
ttp://codepad.org/xadcb34S
ああこういう意味でコンパイルエラーってことね。

上記の話をまとめると
 int m =(++b, a , ++b);

 ttp://codepad.org/J7jHthUQ
のようになり、正当な動作をするって考えていいのね。



402 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:21:46 ]
つまり
3項演算子(条件演算子
カンマ演算子
&&
||
の4つは、副作用完了点となるから
それらのオペランドに++aが複数回出現しても
未定義の動作にならないってこと?


403 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:29:57 ]
>>400
なんだかどうしようもないところでボケていてすまんかった

404 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:45:55 ]
>>402
「オーバーロードされてなければ」それで合ってる

405 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 15:54:25 ]
ttp://codepad.org/AsWip2mX
このコードで
std::cout << hairetsunoyousosuu(arr) << std::endl;
の部分は 期待通りになるのですが
std::cout << foo(arr) << std::endl;
の部分が期待通りになりません。

どうすれば
「引数として渡された配列の要素数を返す『関数』」
が書けるでしょうか?

よろしくお願い申し上げます。


406 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:00:57 ]
関数の仮引数の[]はただのポインタに変わる
コンパイル時にわかるものなら_countofを参考にする
それをDLLとして公開するとか誰が渡すんだかわからないものを自動で取得する汎用的な方法はない

407 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:03:23 ]
>>405
main::arrはint[5]型
foo::argはint[]型
sizeof(int[5])はsizeof(int*) * 5
sizeof(int[])はsizeof(int*)
int*とintの大きさがたまたま同じだっただけ。

408 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:05:30 ]
>>406
ポインタとは違ってmainで定義したarrの要素全部がコピーされるけどね。

409 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:34:50 ]
構造体と勘違いしてんじゃねえのお前



410 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:42:25 ]
こまけぇことはいいんだ、vector使え!

411 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 18:23:11 ]
>>405
なんか codepad は Error 500 で見れなかったんだけども、こういう話?
d.hatena.ne.jp/matsutakegohan1/20071006/1191643652

412 名前:405 mailto:sage [2010/02/27(土) 19:19:17 ]
>>406-411
みなさんありがとうございます。

template<class T, int N> int len(T (&)[N]){return N;}

#include <cstddef>
template<typename T, std::size_t N>
char (&lengthof_helper_char_array(T (&a)[N]))[N];
#define lengthof(a) (sizeof(lengthof_helper_char_array(a)))
ですと、どちらが望ましいのでしょうか?


413 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:24:04 ]
>>412
どちらが望ましいかは場合によるね。
前者はコンパイル時定数としては使えない。
後者はコンパイル時定数として使えるようにしてあるけど、そのために読みにくく
なっているし、基本的に避けるべきであるマクロまで組み合わされている。

414 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:39:51 ]
>>413
なるほど、そう言った違いがあるのですね。

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

415 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:43:00 ]
ttp://www.kijineko.co.jp/tech/superstitions/parameter-of-isalpha-is-char.html
ここに書いてあることについてお伺いしたいのですが。


const char str[] = "abc123";
for (char* s = str; *s != '\0'; s++)
{
 if (isalpha(static_cast<unsigned char>(s)))
 {
  ...
 }
}
こうすべきとのことですが、これは
const char str[] = "abc123";
for (char* s = str; *s != '\0'; s++)
{
 if (isalpha(s))
 {
  ...
 }
}
の用にキャストを外すと動かないことがあるということでしょうか?
"abc123"のように、内容全てがASCII文字であってもだめなのでしょうか?

よろしくお願い申し上げます。



416 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:46:07 ]
>通常は問題ないのですが、多バイト文字を含む文字列の各要素を順に is 系関数で調べる場合などは、

417 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:04:49 ]
>>416
多バイト文字を含む文字列の各要素も
isalphaでアルファベットかどうかを調べることが可能と言うことでしょうか?

たとえば
"あいうえおabcd"
のような全角文字でもできるのでしょうか?

418 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:10:47 ]
その記事も含めてそんなことをいってる奴は居ない

419 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:11:28 ]
> is 系関数に実引数として渡すことができる値は、0 〜 UCHAR_MAX または EOF だけです



420 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:30:00 ]
ASCIIだけなら問題ないんじゃない?
他の文字コード入ってたら知らんけど

421 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:58:27 ]
"abc123"は多バイト文字を含む文字列ではありませんよね。
では多バイト文字を含む文字列の各要素を順に is 系関数で調べる場合など
とは、具体的にはどんな文字列のことなのでしょうか?








[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<218KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef