C++相談室 part62 ..
[2ch|▼Menu]
446:デフォルトの名無しさん
08/06/29 16:16:47
>>438
> string tableName; // Bad - mixed case.
おいらは google で仕事はできない


447:デフォルトの名無しさん
08/06/29 16:19:09
Googleに限らずどんな環境にも適合する人じゃないと駄目だよね。

448:デフォルトの名無しさん
08/06/29 16:19:53
まあ、その辺は統一取れてりゃ合わせるよ。
よほど変なのでなければ。

449:デフォルトの名無しさん
08/06/29 16:20:16
初心者もれに
string tableName; // Bad - mixed case.

なんでバッドなんだよって教えて干しいぉ?

450:デフォルトの名無しさん
08/06/29 16:24:31
>>449
誰がBADだと言っているのかは知らんが、MixedCaseなのがいかんと言っているだけじゃないか。
要は、caseをmixするなってことだろ。

451:デフォルトの名無しさん
08/06/29 16:26:28
変数名は全て小文字で。単語の区切りはアンダースコアで。
と書いてある。

452:デフォルトの名無しさん
08/06/29 16:28:25
コーディング規約に違反しているから bad なだけ

453:デフォルトの名無しさん
08/06/29 17:01:58
>>445
std::nothrowって知ってる?

454:デフォルトの名無しさん
08/06/29 17:05:12
>>453
標準ライブラリが例外を投げないようにするのに、
どうやってstd::nothrowを使うのか教えてほしい。

455:445
08/06/29 17:08:18
知りませんですた

456:デフォルトの名無しさん
08/06/29 17:34:59
標準ライブラリから例外が投げられてもそのままキャッチしないで死ぬ
だけ、とか?
もしくは標準ライブラリも書き直して使っているとか。



457:デフォルトの名無しさん
08/06/29 17:40:28
俺C++2年以上使ってるけど、例外処理ほとんどしたことない

458:デフォルトの名無しさん
08/06/29 17:50:04
Cの癖が抜けてないんじゃね?

459:デフォルトの名無しさん
08/06/29 17:56:07
まさにそれ…

460:デフォルトの名無しさん
08/06/29 17:57:11
googleって例外使わないってことは
C++でも、全部defineかenum斬った値返すだけってこと?

461:デフォルトの名無しさん
08/06/29 18:04:01
>>457
普段ほとんど気にしなくても、必要なときにキャッチするようにしておけば済むってのが強みだね。

462:デフォルトの名無しさん
08/06/29 18:08:41
C++はマルチパラダイム言語でしかも多機能だけど、別に
それを全部使ってプログラムする必要はない。

むしろSTLも含めて常時全部の機能を使うのは大変。
その人に合ったコーディングスタイルでいいんじゃないかと
思う。

463:デフォルトの名無しさん
08/06/29 18:10:39
>>462
ダメそれ無理

464:デフォルトの名無しさん
08/06/29 18:12:33
>>463
え?全部の機能を常時使えって?
その方が無理でしょ
常に10冊ほどの本を隣に置いておかないといけなくなるよ

465:デフォルトの名無しさん
08/06/29 18:13:35
より良い選択肢を無視するのは悪ではないか
けっきょく頑固な保守派はC言語をやれば良いではないか

466:デフォルトの名無しさん
08/06/29 18:14:40
>>464
全部の機能を覚えてれば本置いとく必要なくね?

467:デフォルトの名無しさん
08/06/29 18:16:04
>>464
学生じゃないなら20万ぐらいのドキュスキャン買って
本を全部PDF化するでしょ?

それで2画面で検索+コーディングするよね?
しない奴はカス

468:デフォルトの名無しさん
08/06/29 18:17:02
ええっ
例えばSTLの関数名全部覚えられるか?
現在のC++のSTLは当初標準化に際して提出された文書の
サブセットだそうだがそれでも一冊の本が書けるほどだぞ

469:デフォルトの名無しさん
08/06/29 18:18:25
例外大好きってわけじゃないけど、
RAIIしたら普通に例外に使わないか?
コンストラクタで例外出せないと、かなり面倒です・・・。

470:デフォルトの名無しさん
08/06/29 18:18:33
関数名なんて覚える必要ないが、だいたいどういうことが出来るか
という全体像を掴んでいれば、その都度調べて使えるし、いつの間にか
覚える。

471:デフォルトの名無しさん
08/06/29 18:19:33
>>462-464
よくわからんけど、話食い違ってるだけじゃね?

472:デフォルトの名無しさん
08/06/29 18:24:49
std::locale とか std::codecvt とか一度も使ったことないや

473:デフォルトの名無しさん
08/06/29 18:38:08
>>468
んな必要ねーし
憶え方なんざ ISO/IEC14882 にだって書いてあるぞ

たかが few 万円の費用が壁になるようなアマチュアの道具ではないってだけさ

474:デフォルトの名無しさん
08/06/29 18:40:20
few 万円で済めばいいが
俺はC++関連の本だけで既に百万は超えてる

475:デフォルトの名無しさん
08/06/29 18:45:14
>>474
スゲェ俺一冊w

476:デフォルトの名無しさん
08/06/29 18:46:37
一冊で済む奴はいいよな
俺頭悪いから、というかCの悪い癖を徹底的に取り除きたかった
からそれなりの出費を強いられたよ

477:デフォルトの名無しさん
08/06/29 18:50:37
俺は入門書とD&Eで2冊だった。あとはweb。

478:デフォルトの名無しさん
08/06/29 18:51:15
webって手もあるね。

479:デフォルトの名無しさん
08/06/29 18:51:55
学校の図書館に散々リクエストしまくっている俺がいる。
卒業したらリクエスト出しづらくなるから、早く0xが出てくれないと困る。

480:デフォルトの名無しさん
08/06/29 18:54:06
0xが2009年末くらいに出たとして、そこからそれに対応したコンパイラや
書籍が揃うまで、どのくらいかかるんだろうね。

481:デフォルトの名無しさん
08/06/29 18:55:03
webも含めて、他人のソースを見るのは結構効果的だと思う。
オープンソース系や、STLとかboostとか。

482:デフォルトの名無しさん
08/06/29 18:55:57
コンパイラの方はすぐだろ
書籍はそれから半年遅れてドバッと出てくるか

まあC++でほとんどのプログラミングテクニックは
出尽くしているから文法本しか買わないと思う

483:デフォルトの名無しさん
08/06/29 20:16:51
知り合いの達人プログラマーに
何から始めたらいい?って聞いたら
C++とロキやれって言われたけど

ロキってなに?

484:デフォルトの名無しさん
08/06/29 20:18:27
Lokiは今更だなぁ。boostで良いと思うよ。

485:デフォルトの名無しさん
08/06/29 21:19:50
コンストラクタやデストラクタにinline指定をして、メリットって
けっこうあるもん?

486:デフォルトの名無しさん
08/06/29 21:23:55
>>485
inline は使いまくるほど最適化がかかりやすくなる

487:デフォルトの名無しさん
08/06/29 21:26:53
>>485
プロファイルしてみれ

488:デフォルトの名無しさん
08/06/29 21:35:44
するってぇと、もはやコンストラクタは一般に
explicit inline 指定はデフォ?

489:デフォルトの名無しさん
08/06/29 21:37:19
場合による。吐き出すコードのサイズと相談だ。

490:デフォルトの名無しさん
08/06/29 21:37:52
force inlineして結果変った場合だけつけろよ
デバッグするとき泣くぞ?

491:デフォルトの名無しさん
08/06/29 21:49:44
>>485
最適化がかかりやすくなるかもしれんが、実装をヘッダに晒すようだとデメリットも大きい。
inline で向上する効率を確かめて、さらにそれが必要だといえる時だけ使うのがいい。

492:デフォルトの名無しさん
08/06/29 21:55:14
L2キャッシュに収まりきらないコード量をinline指定によって
吐くようになった場合はかえって性能が低下する事がある

実際に走らせてみるかプロファイル取ってみるかだな

493:デフォルトの名無しさん
08/06/29 21:56:36
アクセッサ程度のメンバ関数なら、無条件でinlineでおk?

494:デフォルトの名無しさん
08/06/29 22:11:51
おk

495:デフォルトの名無しさん
08/06/29 22:19:36
逆にヘッダに実装書きつつ、inlineにしたくない場合って
void hoge::hage(){...} ってクラス定義の後に分けて書けば良いんだっけ?
※コンパイラオプションはそのままで

496:デフォルトの名無しさん
08/06/29 22:23:45
>>493
491と同じではないかと思うけど。
C++ coding standardに載っている時期尚早な最適化(だったかな)じゃないかと思う。

497:デフォルトの名無しさん
08/06/29 22:24:26
ヘッダに非inline関数の実装を書いたら、そのヘッダを取り込んだ
翻訳単位それぞれに関数の定義ができて、重複エラーになるんでは?

498:デフォルトの名無しさん
08/06/29 22:30:16
>>497
普通なるね。

499:デフォルトの名無しさん
08/06/29 22:33:20
>>497
ならない。

inline 関数の定義が、リンクされるすべてのコンパイル単位間で矛盾して無い限りは問題ない。

500:デフォルトの名無しさん
08/06/29 22:33:33
重複した同じ定義を一つにする方法って無いんだったっけ?
テンプレートクラスとかの型毎のインスタンスはリンク後は一つになるよね?

501:デフォルトの名無しさん
08/06/29 22:34:08
>>499
非inline関数でっせ?

502:499
08/06/29 22:34:30
あれ?非inlineか。ごめん。

503:デフォルトの名無しさん
08/06/29 22:41:40
クラスの中に

static int a[] = {} かけないんだっけ?

504:デフォルトの名無しさん
08/06/29 22:50:36
>>503
無理
static const int のみ初期化OK

505:デフォルトの名無しさん
08/06/29 22:52:14
もっというと整数型がOKってことみたいだね。long や shortも
初期化おk

506:497
08/06/29 22:57:12
よく考えたら、
メンバ関数ならOKで非メンバ関数だとNGじゃないかな。

507:デフォルトの名無しさん
08/06/29 22:59:55
>>506
どっちでも同じ。ただしメンバ関数をクラス定義内で定義した時は自動的に inline 扱いになる。

508:デフォルトの名無しさん
08/06/29 23:35:16
>>506
俺が497だwなりすますな

509:デフォルトの名無しさん
08/06/29 23:52:16
最近のC++の流行では
getter/setterはどうやって書くの?

510:デフォルトの名無しさん
08/06/29 23:55:30
マクロを使って読みにくく且つ簡潔に書きます

511:デフォルトの名無しさん
08/06/29 23:55:57
今までの話の流れからすると、実装はソースファイルに書くのが
基本みたいな話だね。ただ、inline指定してみて効果が顕著だったら
inlineにするみたいな。
しかし、ほとんどの参考書では、GetやSetはクラスの型定義内に
inlineとして実装されてるよね。あれが誤解の元なんだろうか。

512:デフォルトの名無しさん
08/06/30 00:00:23
誰か>>500教えて〜

513:デフォルトの名無しさん
08/06/30 00:02:22
リンカがよきにはからってくれるんじゃないの?

それか明示的にインスタンス化しておくとか

514:デフォルトの名無しさん
08/06/30 00:06:04
inlineはコンパイラによってはデフォルトで無視されるし
あまり気にしなくていいんじゃないの?
CPUがリターンキャッシュ持ってれば

515:デフォルトの名無しさん
08/06/30 00:17:18
>>492
P6のばやいL1じゃね?

516:デフォルトの名無しさん
08/06/30 00:26:54
>>514
無視するコンパイラにも、なるべく広範囲のソースを見せたほうがいい
処理系には何がしたいのかを伝えよ、禿の格言にもあるぞ

517:デフォルトの名無しさん
08/06/30 00:27:04
なんか初歩的な質問かもしれませんが、変数名やクラス名ってどう名づけてます?
変数や関数、インスタンスは小文字から始まり、
クラス名は大文字からはじめるのが一般的なんでしょうか
また、分かりやすい名前をつけると、クラス名とそのインスタンス名がかぶってしまうんですが、
何か分け方はありませんか

518:デフォルトの名無しさん
08/06/30 00:31:40
クラス名・変数名に迷ったら書き込むスレ。Part12
スレリンク(tech板)

ここで聞いてみるとか

519:デフォルトの名無しさん
08/06/30 00:36:48
>>517
クラス名の最初にcを付けてる

520:デフォルトの名無しさん
08/06/30 00:41:40
>>517
先生方のルールを参考にしてはどうかな
URLリンク(www.boost.org)

521:デフォルトの名無しさん
08/06/30 00:53:51
一応>>520のを書いておくと

クラス名        :小文字+アンダーバーの組み合わせ(例:multi_array)
ネームスペース名 :クラス名同様
ローカル変数名  :クラス名同様のルールで短めに
メンバ変数名    :クラス名のルールに加えて最後にアンダーバー
             短くなくても良い(例:allocated_elements_)
関数名        :クラス名同様
テンプレート型引数名:パスカルケース(例:NDims)
マクロ名       :大文字+アンダーバーの組み合わせ
             (BOOST_STATIC_CONSTANT)

522:デフォルトの名無しさん
08/06/30 00:54:58
typedef enumはどうすれあいいの?

523:デフォルトの名無しさん
08/06/30 01:03:51
typedefはクラス名同様
enumはメンバ変数名と同じ

ただ、boostの中で完全に統一されてるわけでもないみたい

524:デフォルトの名無しさん
08/06/30 01:04:28
>>517
unko_t unko;

525:デフォルトの名無しさん
08/06/30 01:16:04
Cの勉強をしているのですが、VCでスタティックライブラリを作ってみたりしました。
その後、似たものでシェアードライブラリ(.so)なるものがあるのを知ったのですが、
VCで作成することはできますか?
検索してもgccばかりが見つかってしまって。

ライブラリのファイルがないとexeの実行ができないようですが、dllと何が違うのか分かりません。

526:デフォルトの名無しさん
08/06/30 01:20:46
>>525
dll と同じようなものです
UNIX系では shared object
Windows系では dynamic link library

527:デフォルトの名無しさん
08/06/30 01:41:04
>>517
>438で出てたGoogleのルールのまとめ:
●ファイル名
ぜんぶ小文字で、単語は_か-で区切る。foo-bar.cc
●クラス名
各語の先頭を大文字にする。 FooBar
●名前空間名
ぜんぶ小文字。区切りについては明記してないけど、_? foo_bar
●変数名
ぜんぶ小文字で、単語は_で区切る。 foo_bar
●メンバ変数名
ぜんぶ小文字で、単語は_で区切り、最後は_にする。foo_bar_
●関数名
クラス名と同じ。アクセサだけは変数名と同じ。
●定数
先頭にkを付けて、単語区切りは大文字。 kFooBar
●マクロ名
マクロなんて使うな。

アクセサと定数が妙だなあ。


528:デフォルトの名無しさん
08/06/30 02:07:19
定数の接頭語のkって何の意味?

529:デフォルトの名無しさん
08/06/30 02:13:43
konstant。なぜかこれだけドイツ語。

530:デフォルトの名無しさん
08/06/30 02:13:47
koteiのk

531:デフォルトの名無しさん
08/06/30 02:16:10
>>518-521,527
細かくありがとうございます
いろいろな方法があるんですね
検討して、しっくりくる方法を選びたいと思います


532:デフォルトの名無しさん
08/06/30 03:23:02
constant でプレフィクス c だと、コーディング規約にも関わらず class と混同しそうだな
マクロ禁止なら全部大文字でもよさそうだが・・・

533:デフォルトの名無しさん
08/06/30 03:40:28
メンバはm_というつまらん駄洒落をまだやってる俺はどーせM$かぶれだい

534:デフォルトの名無しさん
08/06/30 07:48:41
>>533
boostにもあったりするよw
URLリンク(www.boost.org)
> const traits& m_traits;
> const Results& m_results;
> OutputIterator m_out;
> ...

535:デフォルトの名無しさん
08/06/30 12:36:05
標準的な識別子のプレフィックス一覧みたいなのなーい?
てか、どこの会社でもまちまちなんだろうけど。

536:デフォルトの名無しさん
08/06/30 12:41:49
プレフィックス一覧って?
命名ルールなら上で出てるgoogleかboostので十分だと思うけど。

537:デフォルトの名無しさん
08/06/30 15:27:37
なんか、なんちゃら記法みたいなのなかったっけ?
ポインタはpを付けるとか。C言語の時代か?

538:デフォルトの名無しさん
08/06/30 15:49:34
ジャンガリアン

539:デフォルトの名無しさん
08/06/30 15:50:56
ハンガリアン記法
Wikipedia項目リンク

ただし、ポインタにpを付けたりするのは
システムハンガリアンと呼ばれる間違ったハンガリアン記法。

本当のハンガリアン記法は
アプリケーションハンガリアンと呼ばれてる。

540:デフォルトの名無しさん
08/06/30 19:08:04
禿リアン

541:デフォルトの名無しさん
08/06/30 19:30:34
>>539
おお、それそれ。なんか批判が多いみたいだね。保守が大変とか。
けっきょくプレフィックスなんてないほうがいいのかね……


542:デフォルトの名無しさん
08/06/30 19:44:44
プレフィクスの使い方を間違わなければ有用らしいよ

間違ったコードは間違って見えるようにする - The Joel on Software Translation Project
URLリンク(local.joelonsoftware.com)


543:デフォルトの名無しさん
08/06/30 20:29:03
つまりアプリケーションハンガリアンてのは、識別子の補助的な意味を表す
プレフィックスを付けるって感じ?
システムハンガリアンはデータ型を表すプレフィックスを付けてるのかな?

544:506
08/06/30 21:13:12
>>508
ごめん。眠かったから間違えた。 by498

545:デフォルトの名無しさん
08/06/30 23:01:10
void hoge(const std::vector<foo>& foos);
という宣言をヘッダ(hoge.h)に書いたとき,fooを宣言している
ヘッダもhoge.hでインクルードしないといけないでしょうか?
それともhoge.hでは
class foo;
と書くだけでおkでしょうか?

546:デフォルトの名無しさん
08/06/30 23:50:55
データを線形リストでアクセス可能かつキューのように
扱えるデータ構造ってありませんかね?

data[3].hogeみたいにアクセスもしたいし
dequeue(data)みたにもアクセスしたい

547:デフォルトの名無しさん
08/06/30 23:58:57
>>546
std::dequeが火を噴くときが来たな

548:デフォルトの名無しさん
08/07/01 01:19:19
なんという出番w

549:デフォルトの名無しさん
08/07/01 08:09:47
>>545
標準ライブラリのテンプレート引数は基本的に完全型じゃないとダメ。
つまり class foo; だけじゃダメ。

550:デフォルトの名無しさん
08/07/01 10:33:31
forkについて

1プロセスで三回printfを実行して別プロセスを作成
そこからまた三回printfを実行して別プロセス
10プロセス実行完了したら最初のプロセスから終了していく

そんな課題なのだけどforkが理解できなくて困っている…
申し訳ないですがバカな俺でも理解できるように解説してくださらんでしょうか?

551:デフォルトの名無しさん
08/07/01 10:59:33
>>550
まずスレ違い。OSの話で言語と関係無い。
で、もうちょっと端的に質問しないと、ググって出るような解説をするしかないよ。

552:デフォルトの名無しさん
08/07/01 11:05:57
>>550
fork → UNIX/Linux系のシステムコールで環境依存
printf → C言語
【初心者歓迎】C/C++室 Ver.55【環境依存OK】
スレリンク(tech板)l50

>そんな課題
C/C++の宿題を片付けます 111代目
スレリンク(tech板)l50

>解説して
URLリンク(www.google.com)

553:デフォルトの名無しさん
08/07/01 12:25:56
質問です。
newでメモリを動的確保する場合失敗するとNULLが返るのですが、
これを意図的に失敗させたい場合どのような手段があるでしょうか?
どういう場合にnewが確実に失敗するのかがよくわかりません。
よろしくお願いします。

554:デフォルトの名無しさん
08/07/01 12:33:52
>newでメモリを動的確保する場合失敗するとNULLが返るのですが
返らないよ.
newが失敗したらbad_allocって例外が投げられる
ためしに以下の失敗するコードを実行してみるといいよ
char *a = new char[0x7FFFFFFF];
if (a == NULL) printf("%s", "メモリ失敗"); // 標準準拠のコンパイラではこのコードは絶対に実行されない

555:デフォルトの名無しさん
08/07/01 13:11:01
>>554
先生、失敗しないんですけど

556:デフォルトの名無しさん
08/07/01 13:24:11
ワロタ

557:デフォルトの名無しさん
08/07/01 14:00:19
struct test_type{ char mem[0x7FFFFFFF]; };

test_type *a = new test_type[0x7FFFFFFF];
if(a == NULL) printf("%s", "print format");

558:デフォルトの名無しさん
08/07/01 14:28:44
>>555 for (;;) で囲め。

559:デフォルトの名無しさん
08/07/01 15:19:53
コンパイラのバージョンを聞いたほうがいい
古いやつとか組み込み用は標準と違う動作をするだろ

560:553
08/07/01 16:19:49
ご回答ありがとうございます。
コンパイラはVC++2005付属のMSコンパイラVer 8.00.50727.42です。
>>554のサンプルコードを試しましたが、確かにNULLでなく例外を投げていますた。
コンパイラが古いとNULLを返す仕様になっているのでしょうか?

561:デフォルトの名無しさん
08/07/01 16:27:37
10年くらい前なら NULL を返したかもしれない
今はみんな bad_alloc を投げる

562:デフォルトの名無しさん
08/07/01 18:37:37
URLリンク(msdn.microsoft.com)(VS.80).aspx
>In Visual C++ 2005, the C Runtime Library's new function will also
>throw a std::bad_alloc exception if the memory allocation fails.
>If you still want the non-throwing version of new for the C Runtime Library,
>link your program with nothrownew.obj. However, when you link with nothrownew.obj,
>new in the Standard C++ Library will no longer function.

563:デフォルトの名無しさん
08/07/01 18:54:03
失敗時に NULLがほしいときは new (std::nothrow) じゃなかったっけ。

564:デフォルトの名無しさん
08/07/01 19:52:48
>>557
数学的に破綻してるコード嫌い

565:デフォルトの名無しさん
08/07/01 19:57:04
今、MSもVC++ Express Editionなる、無料コンパイラ配布してんだし、
最新の2008を使うべきでは。商用コンパイラ必要になるほどの
大プロジェクトじゃないならね。

566:デフォルトの名無しさん
08/07/01 20:00:24
>>564
数学的に破綻って?

567:デフォルトの名無しさん
08/07/01 20:18:41
>>566
失敗しない環境がありうるだろ
7で始まるのがプゲラとか言う問題ではない

568:デフォルトの名無しさん
08/07/01 20:43:06
大抵の環境で失敗するだろうから細かいことはいいんだお!

569:デフォルトの名無しさん
08/07/01 20:44:11
size_tの最大値じゃん。

570:デフォルトの名無しさん
08/07/01 20:56:07
>565
Express Edition は無料でいいんだが、MFCが使えん。

お偉いさんは、見た目が一番なんだよ。

571:デフォルトの名無しさん
08/07/01 21:53:20
>>570
見た目を気にするなら、なおさらMFCはダメだろ

572:デフォルトの名無しさん
08/07/01 22:11:16
>>569
何が?

573:デフォルトの名無しさん
08/07/01 23:35:10
size_tは符号無し整数だよ。サイズは処理系定義だけど。
それはともかく、普通に2Gも確保出来るってのが・・・w

>>565
2008はWin2Kに入らなかったりしてなw
2Kをバカにすん(ry

>>570
WTL+ATL使おうぜ

574:デフォルトの名無しさん
08/07/02 00:01:19
>>573
メモリ確保操作は、物理メモリのサイズが足りなくても
アドレスだけ確保して返して成功してしまう場合がある。
実際に手元の2GBしかメモリ積んでないマシンで2.5GB確保してもなんなく成功する。

これは、デマンドページングといって、物理メモリの確保が
実際にメモリを踏んだ段階で初めて起こるような仕組みが存在するため。
C++のnewの場合は、コンストラクタでメモリを踏んでしまう場合があるから
この仕組みがあったからといって実際に得はしないような気はするけどな。

575:デフォルトの名無しさん
08/07/02 00:04:33
UNIX系はそうなんだっけか
まあVCには全く関係がないな
連続した大領域確保しようとするとよく失敗するし

576:デフォルトの名無しさん
08/07/02 00:11:04
>>574
デマンドページングが動いている状態で、実際には確保されていない(&できない)アドレスにアクセスしたらどうなるの?

577:デフォルトの名無しさん
08/07/02 00:12:46
>>574
単にスワップメモリで足りただけじゃね?

578:デフォルトの名無しさん
08/07/02 00:24:19
>>576
典型的にはいらないページをスワップアウトしにいく

>>577
確保だけならスワップは発生せずに即終了する

579:デフォルトの名無しさん
08/07/02 00:35:06
「スワップに充分な領域が必要」な環境もあるし
「スワップに余裕があるか判断しない」環境もある。
後者だと、アクセスした途端にシステム全体でのメモリが不足することになる。
URLリンク(www.linux.or.jp)
>>578の世界はLinuxだけで出来ている模様。

あと、どうしても失敗したければ
new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが
この2を2Lにしないとオーバーフローする環境もあるし
逆にlong引数のnewを認めない環境もあるんだろうな。

580:デフォルトの名無しさん
08/07/02 01:31:51
> new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが

だから、何でそうなる

581:578
08/07/02 01:42:20
>>579
ん? なんで自分がバカにされているのか全然理解できないんだけど
いろいろな環境があることを頭に置いているからこそ578では
「典型的には」と頭につけたんだけどな

あとそのコード変だよ
少なくともビットシフトされる方は 2 じゃなくて 1 じゃないとおかしいし
そういうことやりたいなら
new char[std::numeric_limits<size_t>::max()] で十分じゃないかな
# ちなみにこういう最大限のメモリ確保は常識的な環境ならば1回ですぐに失敗するはず
# なぜなら、普通はスタックのためのアドレス空間やカーネルアドレス空間が同居しているから

582:デフォルトの名無しさん
08/07/02 12:26:21
> new char[std::numeric_limits<size_t>::max()] で十分じゃないかな

やっと出てきたw
が途中UNIXが出てきたり、やっと出てきたこれもmay beな言い方なので合格点はやれんな

583:デフォルトの名無しさん
08/07/02 12:35:24
std::size_t

584:デフォルトの名無しさん
08/07/02 12:36:06
SIZE_MAX

585:デフォルトの名無しさん
08/07/02 16:03:07
VC++のスレから来ました。相談させてください。

以下の710の質問をしました。
711の回答をもらいました。
それはそうだ、と納得しました。

---
710 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:02:13
templateの使い方を教えてください
class parent;
class child : parent;
の2つのクラスがあって、
void hogeFunc(vector<shared_ptr<parent> > & param)
を呼び出したいとき、
vector<shared_ptr<parent> > vp;
は渡せるけど、
vector<shared_ptr<child> > vc;
が渡せないのはなんでかわからないです。
お分かりの方、理由を教えていただけないですか。
ちゃんと、pとcは親子関係にあるので問題ないと思っています。

711 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:07:53
vector<shared_ptr<child> >& から vector<shared_ptr<parent> >& に変換できないから。
---

で、解決方法について相談させてください。以下は正しいですか?
・ void hogeFunc(vector<shared_ptr<parent> > & param)
 のように、多態をvectorでやろうとしてるのが根本的に間違っている。
間違っているならこういったコンテナの要素を多態で扱いたいときは、
どのようにコーディングされているのか教えてください。

586:デフォルトの名無しさん
08/07/02 16:27:04
template<typename T> void hogeFunc(vector<shared_ptr<T> > & param){
   struct check{ void f(){ T* a=NULL; parent* b = a; } };

   ...
}

587:デフォルトの名無しさん
08/07/02 17:29:52
樹木型(IPアドレスのような)のクラスを作成するにはどのようにしたらいいですか?

588:デフォルトの名無しさん
08/07/02 17:34:46
class Tree {
Tree[] subtrees;
}

589:デフォルトの名無しさん
08/07/02 17:36:01
ここC++だったorz
こんなのでいいんじゃない
class Tree {
std::vector<Tree*> subtrees;
};

590:デフォルトの名無しさん
08/07/02 17:55:38
template<typename T> struct node<T> {
  T value;
  node* prev;
  node* next;
  node* parent;
  node* first_child;

  static node* tree_next(node* n){
    if(n==NULL){ return NULL; }
    if(n->first_child!=NULL){ return n->first_child; }
    return tree_next_no_child(n);
  }
  static node* tree_next_no_child(node* n){
    if(n==NULL){ return NULL; }
    if(n->next!=NULL){ return n->next; }
    if(n->parent==NULL){ return NULL; }
    return tree_next_no_child(n->parent);
  }
};

for(node* it=n; it!=NULL; it=node::tree_next(it)){
  
}

591:デフォルトの名無しさん
08/07/02 18:27:09
>>587
C++を使う
できない人は他のスレで聞く

592:デフォルトの名無しさん
08/07/02 18:47:12
>>591
ここってC++スレじゃないのか??

593:デフォルトの名無しさん
08/07/02 20:33:00
>>592
そうだけど、あの聞き方ではhello worldから教える必要があるだろ

594:デフォルトの名無しさん
08/07/02 20:53:29
俺も興味あるんだが多階層にクラスを定義した場合下みたいな使いかたってできる?
Aclass.Bclass.element = NULL
昔クラスのpublic下にクラスを定義し派生用の関数で増やせるようなものを作ろうとしたんだがうまくいかなかった記憶があるもんで…

595:デフォルトの名無しさん
08/07/02 21:03:01
class Hoge {
const char msg="nullpo";
}

これだとエラー出ますが、こういうことをconst付けてやるにはクラス外に書くか
クラス.cppの方に書くか、もしくは使用する関数の中で書くしか無いのでしょうか。

596:デフォルトの名無しさん
08/07/02 21:03:35
大体型がおかしいだろ。
staticつけとけ

597:デフォルトの名無しさん
08/07/02 21:22:21
よーだょ。
ただしbool/char/short/int/long系に限りできる。floatは×

598:デフォルトの名無しさん
08/07/02 21:23:55
どうも、static付けてみます

599:デフォルトの名無しさん
08/07/02 21:40:22
enumが便利だよ

600:デフォルトの名無しさん
08/07/02 21:45:09
あ、なるほど。すっかり忘れてました。

601:デフォルトの名無しさん
08/07/03 00:45:52
C++0x出たら、ハゲはプログラミング言語C++の改訂版だすのかな?
なんか第3版の次の版が洋書では出てたけど、日本語版はスルーなのかな。
まぁこのタイミングでだしてもしょうがないし、できればC++0x反映させた
版を出して欲しいけどね。

602:デフォルトの名無しさん
08/07/03 01:10:26
const 定数のみのクラスってどうやってかけばいいのですか?
あとこういうエラー用の定数クラスは1枚のファイルに1こずつ
定義するのが流儀?

603:デフォルトの名無しさん
08/07/03 01:14:11
Javaじゃあるまいし

604:デフォルトの名無しさん
08/07/03 01:29:34
>>602
なんでクラスの中に定義する必要があるの
せいぜいネームスペースでいいじゃん

605:デフォルトの名無しさん
08/07/03 01:34:25
シングルトンですけど、boostに入ってないですよね?
Lokiぐらいしかないんでしょうか?

606:デフォルトの名無しさん
08/07/03 01:45:21
すみません、素朴な疑問なのですが
C++ではハードあるいはOSレベルの例外(例えば零による除算)は
通常どのように扱うののでしょうか?

もう少し具体的に言うと、例えばVC++なら_ _try, __except という
構造化例外のための機能が提供されていますが、
gccなどの他のコンパイラではこれと同様な機能を実現する手段は
ないのでしょうか。

windows, linux 双方で稼動させる必要のあるシステムを作るとしたら、
例外処理をどのようにするべきなのか非常に疑問です。

607:606
08/07/03 01:47:54
うーん・・・

URLリンク(msdn.microsoft.com)(VS.71).aspx
>C++ でプログラミングしたり、コードに移植性を持たせたい場合は、
>可能な限り標準 C++ の例外を使うことを強くお勧めします。

URLリンク(developer.mozilla.org)
>例外は、幅広くは実装されていない C++ の次なる一例です。
>そのため、それらの使用は C++ の移植性を低下させます。
>例外を使ってはいけません。運悪く、同じような機能をもったよい代替案はありません。

例外についての注意勧告がされていますが、では実際にどうするかという
代替案はないということなのか・・?

608:デフォルトの名無しさん
08/07/03 01:55:31
>>605
URLリンク(209.85.175.104)

609:デフォルトの名無しさん
08/07/03 01:56:59
鼻から悪魔という言葉があってな

610:デフォルトの名無しさん
08/07/03 02:05:31
>>607
俺はWinCE用のソースとかでは
std::auto_ptr<std::exception> を戻り値にしてる。
コンストラクタで失敗したものは fail() で返す。
で、毎回戻り値などのチェック。

パフォーマンス悪そうだし面倒なので全部そうしてるわけじゃないけど。

611:デフォルトの名無しさん
08/07/03 02:09:18
>>607
VC++の話をすると、/EH系のオプションがあって最適化やパフォーマンスの関係で使い分ける。
 オプションなしの場合C++例外は一切使わない。
 /EHs(c) 同期例外だけをキャッチする。c で extern "C"関数は例外を発生させないと仮定する。
 /EHa  同期と非同期例外をc++例外としてキャッチする。
で /EHaの場合は stack overflowを除くほとんどのハード系の例外をキャッチ出来る。
もちろんゼロ除算も。

612:デフォルトの名無しさん
08/07/03 02:09:23
>>608
どうもです。
detailsの中にあることにはあるんですね。
とりあえずkろえを使っておきます。

613:デフォルトの名無しさん
08/07/03 02:26:36
>>610-611
ありがとうございます。

VC++の場合はわかるのですが、
gccなどでは同じような処理を行えないのでしょうか?
メモリの不正アクセスにしろ零除算にしろ、いくらでも
起こりうる例外だと思うのですが、Javaのように
統一的にcatchできないものかと悩んでいます・・・。

実際、至るところで零除算の起こりうる数値解析の
ようなシステムを作ったとして、いざシステムを起動
したら零除算で処理が中断したが、どこで起こったかは
わからない、なんてことは有り得ないですよね・・?

614:デフォルトの名無しさん
08/07/03 03:24:19
gccというよりunix系だとそういうのはsignalではないかな。
ゼロ除算ぐらいなら例外ではなくてプログラムで事前にチェックすべきもので、
メモリの不正アクセスはデバッグ時に潰すべきもので、
例外でキャッチしてリカバリーをかける類のものじゃない。


615:デフォルトの名無しさん
08/07/03 05:55:32
>>585
最初から vector<shared_ptr<parent> > だけ使ってればいいんじゃね?

616:デフォルトの名無しさん
08/07/03 05:59:33
>>594
struct { struct { void* element; } Bclass; } Aclass;
よくわからんが、これでやりたいことができたことになるの?

617:デフォルトの名無しさん
08/07/03 06:33:36
>>607
どこまでの移植性が必要かで判断すればいい。
Windowsだけなら構造化例外を使ってもいいだろうし。、gccあたりを含めるならくらいなら例外は使えるだろうし。


618:デフォルトの名無しさん
08/07/03 09:30:37
>>607
mozilla のページ、情報がえらく古いな
もっとも古いというだけでは済まされない記述も散見されるが

619:585
08/07/03 10:09:51
>>586
目からうろこがぼろぼろでた気分です。
ありがとうございました。

620:デフォルトの名無しさん
08/07/03 12:12:50
shared_ptrをメンバとして持つクラスで、そのメンバを取得したいとき、
getBBB1, getBBB2, getBBB3の実装をした場合、状況によるんでしょうが、適切なのはどれか教えてもらえないですか。
それぞれのメリット、デメリットがはっきりとわかっていません。
class AAA {
private:
  shared_ptr<BBB> bbbptr;
public:
  AAA() {
    bbbptr = new BBB;
  }
  shared_ptr<BBB> getBBB1() {
    return bbbptr;
  }
  shared_ptr<BBB>& getBBB2() {
    return bbbptr;
  }
  BBB* getBBB3() {
    return bbbptr;
  }
};


621:デフォルトの名無しさん
08/07/03 12:55:48
状況による面もあるけど、
基本的にBBB1以外は間違った使い方だと思っていい。

622:デフォルトの名無しさん
08/07/03 13:00:22
#include <stdio.h>

int main(void)
{
float f;

for(f=1.0; (int) f<=5; f=f + 0.1)
printf("%f \n", f);

return 0;
}

このプログラム実行したら

2.600000
2.700000
2.799999
2.899999
2.999999
3.099999
3.199999
3.299999
3.399999
3.499999

と2.7から普通に計算できなくなりました
2.700000
2.800000
2.900000
と計算するようにしたいのですがどればいいですか?


623:デフォルトの名無しさん
08/07/03 13:07:39
>>622
float -> double
もしくは
二進化十進表現でgoogle

624:デフォルトの名無しさん
08/07/03 13:16:32
>>623
できました><
floatって精度かなり悪いみたいですね・・・

625:デフォルトの名無しさん
08/07/03 13:40:07
>>622
つうか思いっきりC言語じゃね?

626:デフォルトの名無しさん
08/07/03 13:48:35
Cで利用されることが推奨されているDLLがあって、そのヘッダファイルがC用に提供されていて、
それをC++で利用できない場合って、どういう理由が考えられますか?

できない場合があるとしたら、回避方法は、自分でヘッダを修正するってことでしょうか?

627:デフォルトの名無しさん
08/07/03 13:57:25
マングリング
extern "C"

628:デフォルトの名無しさん
08/07/03 16:25:02
>>626
#ifdef __cplusplus
#error C++ is not supported
#endif
とか書かれてるなら諦めるしかないだろ。

629:デフォルトの名無しさん
08/07/03 17:52:58
誰か教えてください。。。

現在プログラムでマウスクリックをさせるものを作っていて、
ボタンのクリックなどはできるようになったのですが、
タブ(TabControl)の切り替えができません。

だれかご存知の方がいましたらご教授いただけると助かります。。

以下プログラム抜粋----------------------------------
POINT pt = {任意の座標X , 任意の座標Y};
HWND hWnd = ::WindowFormPoint(pt.x , pt.y);

// マウスを任意の位置に移動
SetCursorPos(pt.x , pt.y);
// クリック (Down -> UP)
::SendMessage(hWnd , WM_LBUTTONDOWN , 0 , MAKELPARAM(pt.x , pt.y));
::SendMessage(hWnd , WM_LBUTTONUP , 0 , MAKELPARAM(pt.x , pt.y));

よろしくお願いします。

630:デフォルトの名無しさん
08/07/03 18:03:14
スレ違い、Win32APIスレで聞いたら

631:デフォルトの名無しさん
08/07/03 18:18:18
>>620
BB1は安全。戻り値最適化が期待できるので速度も十分
BB2は参照が生きているうちにAAAが削除される場合に問題が発生するが、それに気をつければ高速に使える。
BB3は危険。別のshared_ptrに戻りを代入するミスを誘発しそう。

632:デフォルトの名無しさん
08/07/03 23:49:12
BBB2も代入できるだろ

633:デフォルトの名無しさん
08/07/05 21:52:38
C99では
if (...)
statement...;
else
statement...;
などのstatementがそれぞれ{}で囲まれたように扱われるようですが
これはC++から来たものなのですか?

634:デフォルトの名無しさん
08/07/05 21:54:36
元から (C89から) そうでは?

635:デフォルトの名無しさん
08/07/05 21:59:52
C99よく知らないんだけど、
囲まれたように扱われる場合と
囲まれたように扱われない場合って何が違うの?

636:デフォルトの名無しさん
08/07/05 22:08:27
変数のスコープのこといってるんじゃね?

637:デフォルトの名無しさん
08/07/05 22:11:41
>>636
そもそも{}で囲まないと変数は定義できないだろう。

638:デフォルトの名無しさん
08/07/05 22:14:32
もともとif文の構文は
if (expr) statement [ else statement ]

expr ; の形の単文はstatementだから{}で囲む必要は無い
複文はstatementではないから、{}で囲んでstatementにしなければならない

そんだけのことだ
C99とかは関係ないだろ

639:デフォルトの名無しさん
08/07/05 23:36:13
URLリンク(seclan.dll.jp)
「選択文と反復文のブロック化」のことだな。
C++にもあるぞ、X3014:2003「6.4 選択文」の1, 2節目などなどに規定がある。

そこではこういう例が載せられている。
if (x)
  int i;
このルールによって、if文を抜けたらiはもう使えないという具合。

>>637
C++だと、ブロック内の宣言は文だから、できるんだなこれが。
C99だと(なぜかC++と違って)文ではないから、お前の言うとおり出来ないけどな。

640:デフォルトの名無しさん
08/07/06 04:17:21
>>639
そんなVC6の時代の知識で語られても。

641:デフォルトの名無しさん
08/07/06 04:23:29
VC6でお世話になったマクロの意味がわかる
#define for if (0); else for


642:デフォルトの名無しさん
08/07/06 13:09:27
#define 定義は極力使わない方がいい、と、セキュアプログラミング系の本に書いてあったが

643:デフォルトの名無しさん
08/07/06 13:13:43
>>642
それは生兵法というもの

644:デフォルトの名無しさん
08/07/06 13:30:48
#define SubclassWindowみたいなマクロは死ねばいいと思う
使うならせめて大文字ですよね

645:デフォルトの名無しさん
08/07/06 13:51:36
>>642
OpenSSL脂肪wwwwwwwww

646:デフォルトの名無しさん
08/07/06 14:42:59
あとで#undefで即死されるマクロはいつもasdfだとかzxcvだとかに命名してる

647:デフォルトの名無しさん
08/07/06 16:56:32
>>646のコードはメンテしたくない。

648:デフォルトの名無しさん
08/07/06 20:25:50
同じく

649:デフォルトの名無しさん
08/07/07 08:09:21
hogehogeマクロ内でboost.pp.repeatとかつかってて子マクロが必要なら、
hogehoge_iとかhogehoge_iiにしてる。
後で#undefで即死されるのは同じだが。

650:デフォルトの名無しさん
08/07/08 00:13:06
while(1)中のswtch文で特定のcaseの場合whileから抜けたいのですが2重の構造をbreakさせる方法はありませんか?
gotoで抜ける手も考えましたがあまりスマートな方法じゃないのでできれば避けたいです

651:デフォルトの名無しさん
08/07/08 00:13:48
while(1)をやめる

652:デフォルトの名無しさん
08/07/08 00:19:50
whileの代わりにgotoをつかえばいい

653:デフォルトの名無しさん
08/07/08 00:26:15
>>650
フラグかgotoのどちらかを選ぶんだ。

654:デフォルトの名無しさん
08/07/08 00:29:06
>>650
そのwhileブロックは、breakをreturnに変えて
何らかの意味のある名前を付けられるくらいの処理ではありませんか?

655:650
08/07/08 00:40:53
whileを続行するかどうかのフラグ判定式に変更しwhileを抜ける場合はFALSEにセットしてからcontinueすればいい

656:650
08/07/08 00:42:49
ということに気づき自己解決しました。
レスありがとうございました
(うっかりEnterと一緒にShiftを押してしまい途中で書き込んでしまいました…)

657:デフォルトの名無しさん
08/07/08 05:41:19
あくまで自己解決と言い張るならもう質問すんなよ

658:デフォルトの名無しさん
08/07/08 06:09:44
何怒ってんだよw

659:デフォルトの名無しさん
08/07/08 06:25:05
657は別に怒ってないと思うが、658はなんでちょっぴり興奮してるんだろ、とは思う

660:デフォルトの名無しさん
08/07/08 09:38:38
>>653 でフラグ使えと書いてるのに、そんなレスみるまでもなく自分で解決したよ
と言うからだろうw

661:デフォルトの名無しさん
08/07/08 09:56:40
時間を鑑みるに、おっきしてるのを鎮めてる最中だったんだよきっと

662:デフォルトの名無しさん
08/07/08 11:15:01
自分のレスの後、同じような内容で
自己解決したと書かれたくらいで、もう質問すんなとか、
もうちょっと心に余裕を持った方が良いかと。

663:デフォルトの名無しさん
08/07/08 11:20:05
良いなぁこの馬鹿をかばう気持ち悪い空気

664:デフォルトの名無しさん
08/07/08 11:23:10
相当頭に来てる御様子ですね。

665:デフォルトの名無しさん
08/07/08 11:27:14
自己解決と書くのは、質問者が「お前ら役立たず」と言ってるようなもんだからなw

666:デフォルトの名無しさん
08/07/08 11:35:03
>>664
ていうか、こう書けば誰を馬鹿と思ってるのかがわかると思ったんで。

なるほどね。

667:デフォルトの名無しさん
08/07/08 11:46:23
>>666
>>662の後に>>663なら、普通は
>>650(馬鹿)をかばう気持ち悪い空気」と捉えるでしょう?
そこでこう書けばというのは、それこそ馬鹿丸(ry

668:デフォルトの名無しさん
08/07/08 11:48:25
もう質問者にとって、このスレは用済みだからこねえよ

669:デフォルトの名無しさん
08/07/08 12:42:48
>>667
うん、こう書けば、無駄に食い下がるかどうかで痛い人かどうかがわかると思ったんで。

なるほどね。

670:デフォルトの名無しさん
08/07/08 12:49:02
オレには悔しいから一歩引いた視点の第3者を装って「なるほどね」と書いてるように見える。

671:デフォルトの名無しさん
08/07/08 12:50:18
>>669
それは自虐ギャグですか?

672:デフォルトの名無しさん
08/07/08 16:19:05
unique_ptrって本当にC++0xに入ってくれるんだろうか

673:デフォルトの名無しさん
08/07/08 16:47:35
ばかばっか

674:デフォルトの名無しさん
08/07/08 17:18:49
>>673
お前がな

675:デフォルトの名無しさん
08/07/08 17:26:45
>>674
オマエモナー

676:デフォルトの名無しさん
08/07/08 17:27:46
いってよし?

677:デフォルトの名無しさん
08/07/08 18:06:30
逝ってよし

678:デフォルトの名無しさん
08/07/08 22:11:51
>>650
なぜスマートな方法ではないと思うのかを誤魔化さずきちんと述べよ

679:デフォルトの名無しさん
08/07/08 22:13:35
gotoは悪って(事実かどうかは別にしても)よく言われてるからだろ。
多分。

680:デフォルトの名無しさん
08/07/08 22:38:18
初心者スレと分けてる意味が無いように思う

681:デフォルトの名無しさん
08/07/09 00:33:06
初心者スレってVC++しかなくね?

682:デフォルトの名無しさん
08/07/09 00:33:08
newで動的確保をする際の質問なのですが
Base* foo = new Base(int bar);
この書き方だとBaseの引数付きコンストラクタが呼ばれる事はわかるのですが
動的に配列を確保する場合に引数付きコンストラクタを呼ぶ事は可能なのでしょうか?

イメージ的には↓のようなことをしたいです
Base* foo = new Base[3] {Base(int bar), Base(int bar), Base(int bar), };


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

4766日前に更新/209 KB
担当:undef