5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C++相談室 part20

1 :v(^・^)v :03/06/09 21:38
C++に関する質問はこちらへどうぞ。
ただし質問の前にFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。

過去スレ、関連スレ、関連リンクなどはこちら>>2-10

2 :デフォルトの名無しさん:03/06/09 21:38
よくやった感動した

3 :v(^・^)v:03/06/09 21:38
■基本■
[Stroustrup]
禿 http://www.research.att.com/~bs/
C++に関するリンクの総本山でもあります。

[C++ Final Draft International Standard]
http://www.kuzbass.ru/docs/isocpp/
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf

[JTC1/SC22/WG21 - C++]
http://std.dkuug.dk/jtc1/sc22/wg21/
規格書の重箱の隅的な話題などが読めます。

[C/C++ Users Journal]
http://www.cuj.com/
[Object Management Group]
http://www.omg.org/
[Association of C & C++ Users]
http://www.accu.org/

[news]
news:comp.lang.c++
news:comp.lang.c++.moderated

[ML]
cppll(日本語) http://www.trickpalace.net/cppll/
メインページにC++に関する良質なC++日本語リンク集があります。

4 :デフォルトの名無しさん:03/06/09 21:39
>>1
おつ

5 :デフォルトの名無しさん:03/06/09 21:39
>>1


6 :v(^・^)v:03/06/09 21:39
■Document■

C++FAQ Lite http://www.parashift.com/c++-faq-lite/
C++FAQ(日本語) http://www.bohyoh.com/CandCPP/FAQ/
Cとその仕様を比較しながらの解説なので分かりやすい。
*** 質問の前に必ずこの二つに目を通してください ***

[STL]
http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
Standard Template Library プログラミング on the Web
リファレンス的内容。http://www.wakhok.ac.jp/~sumi/stl/
STL Programmer's Guide http://www.sgi.com/tech/stl/
[boost]
これに関しては公式のドキュメント、又はソースを読むのが一番です。
ただし日本語でいくつか有益な情報が読めます。
Let's boost http://www.kmonos.net/alang/boost/
shinichiroさん http://user.ecc.u-tokyo.ac.jp/~s31552/wp/boost/
news news:gmare.comp.lib.boost.devel

7 :デフォルトの名無しさん:03/06/09 21:39
>>1
z

8 :v(^・^)v:03/06/09 21:39
■Books■
amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/(翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/(翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/(翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/(翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/(翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/(翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/(翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/(翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/

9 :v(^・^)v:03/06/09 21:40
■Compiler■
[GCC]
http://gcc.gnu.org/
(Windows上でのPOSIX環境構築 http://www.cygwin.com)
[Borland C++ Compiler]
http://www.borland.co.jp/cppbuilder/freecompiler/
[.NET Framework SDK]
1.0 http://www.microsoft.com/japan/msdn/netframework/downloads/sdk.asp
1.1 http://msdn.microsoft.com/library/default.asp?url=/downloads/list/netdevframework.asp
[MSVC] コンパイラ以外のツール、ドキュメントです。
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
(一括ダウンロードの時は上のURLに続けてこちらを入力してください
default.htm?p=/msdownload/platformsdk/sdkupdate/psdk-full.htm)

なお上記三者を組み合わせたプログラミングにおいてはこちらが分かりやすいです。
http://www.geocities.com/Tokyo/Ginza/5432/documents/winprog/index.html

[DigitalMars]
http://www.digitalmars.com/
[OpenWatcom]
http://www.openwatcom.org/
[Comeau]
http://www.comeaucomputing.com/
[intel C++ Compiler]
http://www.intel.com/software/products/compilers/
[metrowerks]
http://www.metrowerks.com/mw/default.htm

10 :v(^・^)v:03/06/09 21:41
■Libraries■
Boost http://www.boost.org/
STLport http://www.stlport.org/
Loki http://www.moderncppdesign.com/
LokiPort
MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
MSVC6.0 SP5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

ACE/TAO http://www.cs.wustl.edu/~schmidt/
Network、Thread、ORBなどのポータブルなライブラリ
Blitz++ http://www.oonumerics.org/blitz/
数値計算ライブラリとして人気がある、らしい
antlr http://www.antlr.org/
flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
パーサジェネレータ

他ライブラリリンク集
http://www.trumphurst.com/cpplibs/cpplibs.phtml

11 :v(^・^)v:03/06/09 21:41
■過去スレ■
Part1 http://piza.2ch.net/tech/kako/980/980175292.html
Part2 http://pc.2ch.net/tech/kako/996/996640937.html
Part3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
Part4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
Part5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
Part6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
Part7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
Part8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
Part9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
Part10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
Part11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
part12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
part13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
part14 http://pc2.2ch.net/tech/kako/1041/10413/1041328679.html
part15 http://pc2.2ch.net/tech/kako/1043/10436/1043605481.html
part16 http://pc2.2ch.net/tech/kako/1045/10457/1045746245.html
part17 http://pc2.2ch.net/tech/kako/1047/10475/1047560042.html
part18 http://pc2.2ch.net/tech/kako/1050/10501/1050177746.html
part19 http://pc2.2ch.net/test/read.cgi/tech/1052625846/

12 :v(^・^)v:03/06/09 21:42
■関連スレ(テンプレートを用いたライブラリ中心)■
【C++】template 統合スレ -- STL/Boost/Loki, etc.
part1 http://pc2.2ch.net/tech/kako/1037/10377/1037795348.html
part2 http://pc2.2ch.net/test/read.cgi/tech/1047978546/l50
【C++】Boost使い集まれ!
http://pc2.2ch.net/test/read.cgi/tech/1033830935/l50

STLスレッド
part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
part2 http://pc3.2ch.net/tech/kako/1026/10267/1026793823.html
Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html

13 :Java!:03/06/09 21:42
Java!

14 :v(^・^)v:03/06/09 21:43
■関連スレ(環境依存の話題)■
[GCC]
GCCについて
part1 http://pc2.2ch.net/tech/kako/1007/10077/1007731543.html
part2 http://pc2.2ch.net/test/read.cgi/tech/1046179115/l50
祝・GCC 3.0リリース http://pc.2ch.net/test/read.cgi/unix/992942337/l50
[Digital Mars]
Code of the Nerds" Digital Mars C/C++
http://pc2.2ch.net/test/read.cgi/tech/1044210976/l50
[Borland]
C++Builder相談室
part1 http://piza2.2ch.net/tech/kako/969/969458279.html
part2 http://pc.2ch.net/tech/kako/997/997074601.html
part3 http://pc3.2ch.net/tech/kako/1016/10160/1016065855.html
part4 http://pc2.2ch.net/tech/kako/1035/10355/1035596146.html
part5 http://pc2.2ch.net/tech/kako/1045/10455/1045542179.html
part6 http://pc2.2ch.net/test/read.cgi/tech/1054280736/l50
タダで使えるBorland C++!
part1 http://pc3.2ch.net/tech/kako/1002/10023/1002377328.html
part2 http://pc2.2ch.net/tech/kako/1030/10304/1030493157.html
[VisualC++]
VisualC++相談室
part 1 http://piza.2ch.net/tech/kako/970/970607517.html
part 2 http://piza.2ch.net/tech/kako/981/981630730.html
part 3 http://piza2.2ch.net/tech/kako/993/993186053.html
part 4 http://pc.2ch.net/tech/kako/1002/10021/1002165477.html
part 5 http://pc.2ch.net/tech/kako/1006/10068/1006834463.html
part 6 http://pc.2ch.net/tech/kako/1011/10116/1011615035.html
part 7 http://pc.2ch.net/tech/kako/1017/10178/1017843192.html
part 8 http://pc.2ch.net/tech/kako/1022/10224/1022499000.html
part 9 http://pc2.2ch.net/tech/kako/1036/10368/1036897197.html


15 :v(^・^)v:03/06/09 21:43
初心者にVisual C++を教えるスレ
part1 http://pc3.2ch.net/tech/kako/1023/10235/1023530449.html
part2 http://pc3.2ch.net/tech/kako/1030/10309/1030985362.html
part3 http://pc2.2ch.net/tech/kako/1038/10381/1038160750.html
part4 http://pc2.2ch.net/test/read.cgi/tech/1044196393/l50
part5 http://pc2.2ch.net/test/read.cgi/tech/1048698321/l50


VisualC++(MFC限定)相談室 MFC7.dll
http://pc2.2ch.net/test/read.cgi/tech/1047949606/l50
Windows Programing for C/C++(Not MFC)
http://pc2.2ch.net/test/read.cgi/tech/1018239290/l50
COM の世界を斬る!
http://pc2.2ch.net/test/read.cgi/tech/981823340/l50
ATL 相談室
http://pc2.2ch.net/test/read.cgi/tech/1029029882/l50
managed C++ やろうぜ!!
http://pc2.2ch.net/test/read.cgi/tech/1014486422/l50

16 :デフォルトの名無しさん:03/06/09 21:44
>>1
おつカレー。

17 :デフォルトの名無しさん:03/06/09 21:46
>>1
あんがと

18 :デフォルトの名無しさん:03/06/09 21:53
1乙。
>>2 >>4 >>5 >>7
テンプレ割りこみはマズイよな。>>11はわざとだが。
なんか折れ、自治厨みたいだな。他スレ逝ってくる。

19 :デフォルトの名無しさん:03/06/09 21:54
>>11>>13だった。鬱氏。

20 :デフォルトの名無しさん:03/06/09 22:24
>>16
ムァー、今日は夜飯ぬいて寝るつもりだったのに、激しくカレー食いたくなった。

21 :デフォルトの名無しさん:03/06/09 23:43
>>13
ワラタがいい大人なんだからこういうことはやめような。

ところで前スレの標準化うんぬんについてだが、
標準化されてないと、プロジェクトによってはライブラリ使わしてくれんなんてこともある可能性があるから
可能な限り標準化してほしい。
あと、他人のソース読むときにいかにもコンテナってライブラリのソースを何度もみる羽目になりそーなのもいやだ。


22 :名無し:03/06/10 00:05
コンストラクタ中にデフォルトコンストラクタを呼び出したいんですけど、
どうすればいいですか?Javaだとthis();でできたんだけど

23 :7:03/06/10 00:33
>>18
許してママン

24 :ぷらぷらー:03/06/10 00:35
>>22
struct A{
A(){}
A(int){
new(this) A;
}
};

25 :デフォルトの名無しさん:03/06/10 01:22
>>24
確かに呼ぶ事はできるけど、
基底クラスのコンストラクタが二度呼ばれない?

26 :デフォルトの名無しさん:03/06/10 01:35
2度呼ばれます。

>>22
答えはこちら
ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.3

27 :デフォルトの名無しさん:03/06/10 02:14
>>26
だよねー。
C++ も別のコンストラクタを綺麗に呼ぶ構文くらい
作ってくれよなー、と言いたい。
基底クラスのコンストラクタが二度呼ばれるようなものか、
初期化指定子に書いてあるものが無視されるものか、
どちらか1つなんてイヤン。

28 :デフォルトの名無しさん:03/06/10 02:25
>>27
「コンストラクタの実行完了」を以って
「オブジェクトの構築完了」とするルールがあるので、
そう簡単に作れるものではない。

29 :デフォルトの名無しさん:03/06/10 08:56
>>28
初期化指定子のみ継承する構文と、内容を呼ぶ構文と、
両方用意すればいいんじゃないかなぁ。

30 :デフォルトの名無しさん:03/06/10 11:21
>>27
> 初期化指定子に書いてあるものが無視される
どうやったらこんなことになるのですか?

31 :デフォルトの名無しさん:03/06/10 12:37
struct A{
A(){
hoge();
}
A(int){

hoge();
}
hoge(){
}
};
でごまかしちゃダメかしらん。


32 :デフォルトの名無しさん:03/06/10 16:03
初心者ですみません。
c++は型のチェックが厳格ということで使い始めたのですが、
代入や引数の渡しでdoubleにintやcharが代入できたりして
しまうのですが、これで厳格な型チェックといえるのでしょうか?


33 :デフォルトの名無しさん:03/06/10 16:05
doubleにintやcharが代入できて何か不都合が?

34 :32:03/06/10 16:10
>>33
初心者なものでまだ不都合に出くわしてないのですが、
c++コンパイラがどんな基準で型チェックを行っているのか
が仕様がわからなかったもので。
数値型間なら上位型へは自動キャストするとかいうのなら
分かるのですが、doubleにcharを入れるときなどはキャスト
指定させるべきなのではと思いまして。
またコンパイラのオプションで型チェックの厳密性を設定
できたりするのでしょうか?

35 :デフォルトの名無しさん:03/06/10 16:13
charも数値ですが・・・

36 :デフォルトの名無しさん:03/06/10 16:15
charも数値型なんだが。

37 :デフォルトの名無しさん:03/06/10 16:17
>>34
charは"1文字を表現できる値範囲を持つ数値型"っていう感じ。
C/C++は厳密な意味での"文字型"というもの自体が無いよ。

38 :34:03/06/10 16:28
>>35,36,37

39 :34:03/06/10 16:29
>>35,36,37
レスありがとうございます。
そういうことなんですネ。

40 :鈴木健一郎 (NT4.0/2000/XP):03/06/10 16:58
C++の質問:

参照型っておおよそどんなものかは分かるんですが、具体的には
どのような使い方をするんですか? デバッグ専用?

41 :デフォルトの名無しさん:03/06/10 17:12
>>40がなぜ「デバッグ専用?」と考えるに至ったか知りたい。

42 :デフォルトの名無しさん:03/06/10 17:23
>>40
コピーコンストラクタ

あと、個人的(?)には引数で const xxx * の代わりに const xxx &
呼び出し側からみるとポインタで渡してる場合は内容をいじってるとか区別がつくので。

43 :デフォルトの名無しさん:03/06/10 20:16
10進数を2進数に変換するやり方は分かったのですが
8進数や16進数に変換するやり方がどうしてもわかりません。
一つ一つの数値を配列に入れて表示させればイイと思うのですが・・・

教えてエロイ人(*´Д`)人

44 :デフォルトの名無しさん:03/06/10 20:22
宿題なら宿題スレへ

45 :デフォルトの名無しさん:03/06/10 20:31
>>43
G(o^−^o)gle < 検索しようね

46 :デフォルトの名無しさん:03/06/10 21:29
std::cout<<std::hex<<10<<' '<<std::oct<<10<<std::endl;

47 :デフォルトの名無しさん:03/06/10 21:36
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉


     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉


(^^)

48 :デフォルトの名無しさん:03/06/10 22:25
デカいテキストファイルを高速に開くのってどうすればいいんだろ。
char ch[9999];
while ( MyFile.getline(ch, 9999) ) {
 mBuffer = mBuffer + ch + "\n";
}
だと遅いんでつよ。
なんか他に方法あると思うんだけど。

49 :あぼーん:03/06/10 22:27
http://homepage.mac.com/hiroyuki44/hankaku03.html

50 :デフォルトの名無しさん:03/06/10 22:31
>>48
コンピュータの処理速度を上げる


51 :デフォルトの名無しさん:03/06/10 22:32
>>48
思いっきり遅くなる原因が含まれているような気がするにょ。

52 :デフォルトの名無しさん:03/06/10 22:32
cstdio
fread
setvbuf
あたりで調べる

53 :デフォルトの名無しさん:03/06/10 22:33
mBuffer = mBuffer + ch + "\n";

mBuffer += ch;
mBuffer += "\n";

多少速くなるよ。

54 :デフォルトの名無しさん:03/06/10 22:34

mBuffer = mBuffer + ch + "\n";

なかなか高度なネタですね…

55 :デフォルトの名無しさん:03/06/10 22:39
環境によってmmapかCreateFileMapping使ってそのまま
mBuffer = static_cast<char*>map;
でok

56 :デフォルトの名無しさん:03/06/10 23:10
質問おながいします。
クラスの関数にアクセスするのに
@CHoge::Func()
Athis->Func()
BFunc()
この3つでは意味が違うのでしょうか?またパフォーマンスに
違いはあるのでしょうか?(自分はVCなのですが自動メンバ
が出てほしいのでAで行ってしまうのですが...)

57 :デフォルトの名無しさん:03/06/10 23:11
>>51-55
なるほど。いろいろ方法はあるんですね。サンクスです。

いま気付いたんだけど、mBufferをstringにしてるから最強に遅くなるぽい。
こういうところで使っちゃいかんのかな。

58 :デフォルトの名無しさん:03/06/10 23:23
質問です。
class Test{
enum {NUM=10};
static int data[NUM];
};
このようなクラスを作ります。このとき、data[]を定義するときに
static Test::data[]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
これしか方法はありませんか?これだとNUMを変えたときに、定義も書き換える
必要がありますよね。なにか、スマートな書き方はありますか?


59 :デフォルトの名無しさん:03/06/10 23:26
static なら黙ってても全要素 0 で埋めてくれるのでは。

60 :デフォルトの名無しさん:03/06/10 23:31
黙ってても てのは明示的に0で初期化しなくてもよいという意味で。

61 :デフォルトの名無しさん:03/06/10 23:37
>>58
いまいちやりたいことがわかんないな。

62 :デフォルトの名無しさん:03/06/10 23:45
>>56
もし Func が仮想関数で、
CHoge から派生したクラスでそれをオーバーライドしてた場合、
1は2&3とは違う。
2と3は多分常に同じ。
パフォーマンスは気にしなくていい。

ただ、自動的にメンバリストを出すのって、
this-> 以外でも何か方法なかったっけ?
最近 VC 使ってないんで忘れたけど。

63 :デフォルトの名無しさん:03/06/11 00:02
>>58
static Test::data[]={0};
って書くと、不足分は0で初期化される。
あと、
memset( Test::data, 0, sizeof Test::data );
ってやってもいい。

最も重要なのは、スタティックメンバTest::dataが、
ほんとに必要なのかどうかを再検討することだ。


64 :56:03/06/11 00:15
>>62
レスどうもです。m(__)m
書籍の例とかはほとんどBで書いているので不安
だったのですが見づらいからなんですかね。
あと仮想関数があるから@も意義があるのですね。

自動メンバはメニューとショートカットにもありました(^^);;


65 :デフォルトの名無しさん:03/06/11 00:20
>>56
仮想関数、継承について勉強することをお勧めする。
あと、関数のスコープについても。

66 :56:03/06/11 00:26
>>65
どもどもです。
勉強しま〜す。

67 :デフォルトの名無しさん:03/06/11 00:32
>>59, 63
どうも、ありがとうございます。

スタティックメンバを使うのって、設計の仕方としてはだめなんですか?

あるメンバ関数の戻り値を決めるときに、自分自身のデータだけでなく、別の
インスタンスのデータも必要なときに使おうと思ったんです。例えば、自分自身の
データが作成されたインスタンスのデータの平均値よりも大きいかどうかを
返すメンバ関数とかです。
class Test{
 static Test* tests[100];
 int value;
public:
 bool IsOverAve();
}
こんな感じで、コンストラクタは呼ばれたときに、自分自身のポインタを配列の
あいているところに登録するようにします。

こうしておけば、うまくいくように思ったんですが・・・。

68 :デフォルトの名無しさん:03/06/11 00:39
>>57
> いま気付いたんだけど、mBufferをstringにしてるから最強に遅くなるぽい。
> こういうところで使っちゃいかんのかな。

stringが中で何をやっているかを理解すれば、
皆がキミのコード見て卒倒しそうになった(笑)理由も理解できると思うにょ。

69 :デフォルトの名無しさん:03/06/11 00:52
>>67
static メンバにしたら「唯一」しか存在しなくなっちゃうから、
2 つ作りたいなー、ってときに困る。
2 つ作ることは無いな、ってものだけ static メンバにする。

その例の場合はそれが何の比喩か分からないので微妙だけど、
確かにそういう感じのことをするときに static メンバを使うことがある。
もしそういうデータの集合を複数扱いたい場合は、
データの集合とデータとでクラスを分けると良い。

70 :デフォルトの名無しさん:03/06/11 01:05
>>67
何故それを static にする必要があるのか、というかそういう思考になってしまうのか謎だな。
クラスの汎用性も拡張性もすべてパーだ。

Test のインスタンスを保持するような別のクラスを作って、
平均値だのなんだのっていう処理はそっちに任せれば?

71 :100人に1人:03/06/11 19:10

◎人の嫌がることをズケッと言うのはこんな奴!
<アスペルガー症候群(自閉症スペクトラム)←脳の機能的疾患(遺伝が要因)>
●変化を嫌う
http://web.kyoto-inet.or.jp/org/atoz3/kado/book1/Williams-Asp.htm

●接し方のルールがわからず無邪気に周囲の人に対して迷惑なことをしてしまうことがある。人を傷つけるということには鈍感(相手の立場に立って考えられない)。
●パターン的行動、生真面目すぎて融通が利かない
 毎朝の通学電車では同じホームの同じ場所から、同じ時間の同じ号車に乗ることに決めていたりする。パターンを好むということは反復を厭わないことでもある。
●アスペルガー症候群の子どもは(大人も)感覚刺激に対して敏感。敏感さは聴覚、視覚、味覚、嗅覚、温痛覚などのいずれの感覚の敏感さもありえる(特に視覚が敏感)。
●アスペルガー症候群の子ども(大人も)は予測できないことや変化に対して苦痛を感じることが多い。
http://www.autism.jp/l-02-03-aspe3.htm

●独り言を言うことが多い(考えていることを口に出す)
●物事をいつまでも同じにしておこうとする欲求が強く、そうでないと非常に不安。いわゆる「こだわり」。
●自発的に行動することが少なく、興味の幅が狭い
●物まねをしているような不自然な言語表現
●自閉症スペクトラム全体としては一万人に91人(およそ100人に1人)。
http://www.ypdc.net/asuperugar.htm

★自閉症スペクトラムの考え方(アスペルガーに至らない気質の偏りもある(遺伝性))
http://www.imaizumi-web.com/030413.html  
   
★アスペルガー症候群(自閉症スペクトラム)かどうかのテスト
http://twitwi.s10.xrea.com/psy/add.htm 
http://www.geocities.co.jp/Beautycare/5917/as/marksheetmake.html




72 :デフォルトの名無しさん:03/06/11 19:13
巨大なメモリ(数十MB)を動的に確保することは可能でしょうか?
   long **Data;
try{
Data = new long *[4000];
for (int i = 0; i < 4000; i++){
Data[i] = new long [4000];
}
}
catch (bad_alloc) {
cout <<, "割り当てができません。これで終了します。";
exit (-1);
}
とすると、特に異常なメッセージは出ません。
しかし、Data[i][j] に代入するとき、死にます。なぜでしょうか?


73 :デフォルトの名無しさん:03/06/11 19:30
>>72
VC6 だとしたら、VC6 は new が失敗した時に
bad_alloc 例外を投げずに NULL を返す仕様になっているので、
NULL を参照して死にます。

STL なんかも new が bad_alloc 例外を投げることを前提に書かれてるので、
そのまま使ってるとメモリフルの時に NULL を参照して死にます。

_set_new_handler でも使って
new が失敗した時には bad_alloc を投げるように設定するがよろし。

あと、new(nothrow) も対応してなかったと思う。

74 :デフォルトの名無しさん:03/06/11 19:45
ありがとうございます。コンパイラーは C++ Builder Ver 4を使ってます。
bad_alloc例外が出されるのは確かです。というか、上のソースは、
BCBのヘルプから、そのまま取ってきています。
変えたのは、配列の大きさだけです。

Cだと、64KB以上のメモリを確保する場合には
malloc ではなく farmalloc を使い、farポインターでアクセスする
とかいうのがありますよね。C++ のnew でもそういうことがあるのでしょうか?

75 :デフォルトの名無しさん:03/06/11 19:49
>>74
64KうんぬんはCとかC++とかいう話ではない。
言語とは関係なく、16bit DOS用コンパイラの場合の制約だよ。

76 :デフォルトの名無しさん:03/06/11 19:49
>>74
ヘルプが常に正しいとは限らない...。
とはいえ、BCB4 を使った事無いので実際どうなのか分からない...。

try {
 int* a = new int[0x7FFFFFFF];
 if(a == NULL) {
  cout << "NULL です" << endl;
 }
} catch(bad_alloc&) {
 cout << "bad_alloc です" << endl;
} catch(...) {
 cout << "その他の例外です" << endl;
}

これで何て表示されるか確かめてみ。

77 :デフォルトの名無しさん:03/06/11 19:57
「bad_alloc です」と出ました。

78 :デフォルトの名無しさん:03/06/11 19:58
うちは「その他の例外です」とでた。

79 :デフォルトの名無しさん:03/06/11 19:59
何も表示されない強者はいるか?

80 :デフォルトの名無しさん:03/06/11 20:02
NULL @ VC6

81 :デフォルトの名無しさん:03/06/11 20:03
っというか、delete [] a; 入れとけよ!

82 :デフォルトの名無しさん:03/06/11 20:04
>>81
どうせ失敗するしすぐに終了するからいいYO!

83 :デフォルトの名無しさん:03/06/11 20:05
えっと、>76 のプログラムの後、Data[i][j]に値を代入していき、
どこでエラーが出るか確かめました。
(76では、配列の大きさを[4000][4000]と書きましたが、
実際には[4097][4097]でテストしました)

その結果、16388番目までは代入可能。16389番目に死にます。
(つまり、[3][4097]まではOK、[4][0]で死ぬ。)
65552バイト以降のメモリーがおかしいようですが、なぜでしょうか?

84 :デフォルトの名無しさん:03/06/11 20:06
>>83
sizeof(int)はいくつ?

85 :72:03/06/11 20:08
間違えました。
83に書いた「76のプログラムで」は「72のプログラムで」です。

あと、例外はbad_allocが出ることを確認しました。
>76で。

86 :デフォルトの名無しさん:03/06/11 20:09
C++ Builder なら Win32用だし sizeof(int)=4なはずだが。
Borland C++ Ver.4の間違いじゃないよな? (笑)

87 :72:03/06/11 20:10
>84 int, long ともに4です。確認しました。

88 :C++しらん:03/06/11 20:12
catch (bad_alloc)とcatch (bad_alloc&)って違うの?

89 :デフォルトの名無しさん:03/06/11 20:14
んー。待てよ。

bad_alloc 捕まえた後に delete してないから
メモリが足りなくて cout や exit が
変な挙動を示してるってことはない?
>>72 の例は小分けに確保してるので、
bad_alloc 捕まえた時点ではかなりメモリが使われてるけど、
>>76 の例では一気に確保してるので
bad_alloc 捕まえた時点ではメモリの確保は行われていない。

カウンタ変数 i を try の外に確保して、
catch 内で Data[i - 1] から Data[0] まで delete [] して
Data を delete [] して、
その上で cout とか呼んでみ。
あと、cout の最後に << endl はしとこうな。

90 :72:03/06/11 20:16
もしかして、でかいメモリー空間を使う場合には
コンパイラーオプションをいじる必要があるとかいうことは
ありますか? いまはデフォルトで使ってます。
BCBスレで聞いたほうがいいかなあ

91 :デフォルトの名無しさん:03/06/11 20:17
overcommitは考えられないしな・・・

92 :72:03/06/11 20:26
>89 こういうことでしょうか? 結果は >83 と同じでした。

#define MAXCH 4096

long **Data;
int i;
try{
Data = new long *[MAXCH+1];
for (i = 0; i < MAXCH+1; i++){
Data[i] = new long [MAXCH+1];
}
}
catch (bad_alloc) {
for (int j = i-1; j <= 0; j--){
delete [] Data[j]; Data[j] = NULL;
}
delete [] Data; Data = NULL;
cout << "割り当てができません。これで終了します。" << endl;
exit (-1);
}


93 :YUIS:03/06/11 20:26
「2chからきました」ってコメントに書いたら値引きしちゃうよ(^_^)v
↓↓↓
 http://www.dvd-yuis.com/

94 :デフォルトの名無しさん:03/06/11 20:28
>>92
j>=0 だよ。

95 :72:03/06/11 20:29
あっ失礼。でも、結果は変わりませんでした。

96 :デフォルトの名無しさん:03/06/11 20:30
>>83
確保が4097なのに[4097]でアクセスしたら範囲外だべ

97 :72:03/06/11 20:34
たびたびすみません。>96
[4096]でした。具体的には、

Data[3][MAXCH]++; printf("3MAXCHOK\n");
Data[4][0]++; printf("40OK\n");

とすると、「3MAXCHOK」表示後、死にます。
「40OK」は表示されません。

98 :デフォルトの名無しさん:03/06/11 20:37
>>97
そのまま1ファイルでコンパイルできるコード貼ってくれると確認しやすいのだが。
貼らなかった部分に問題あるかもしれんし

手元にはBCB6ならあるから試してみるか。

99 :デフォルトの名無しさん:03/06/11 20:42
Data を確保した後に、
Data[i] を NULL で初期化しておいて、
Data[i] の値を後から確認してみるのも手かと。
いちいちアクセスバイオレーションするのもアレだし。

100 :72:03/06/11 20:43
みなさま、大変申し訳ございませんでした。
解決いたしました。>98さまのおっしゃるとおり、
別のところに問題がありましたです。
プログラムは無事動きました。
車に轢かれて逝ってきます。
                    ノ∩
                  ⊂    ヽ
                       /( 。A。 )っ
    __________  U ∨ ∨
  / 000    /    ・@;∴‥
 /______/______:: :|
__||  ∧ ∧     .||__   |:: ::||.|
|::||. (゜Д゜ )     .||::| :  :'| ||:|
.~|| ⊆⊇、 )     ||O :::: || ||:|
 || ̄゜ ̄ ̄゜|\/L~:: ̄ ̄| ̄|:|
 ||_=0.< ガ  >.___|_/|.!ニニニニニニニニニニl
...|00| 三 三Z  ン Z/⌒ヽ|__|:::::__:::::::/⌒ /⌒ヘ⊇
.〔⊆__[二]____|/\|〕_|.∴.|::|  | ||::||::::| |||||.∴.||| ∴.|ヘ
 ~ゞゝ__ノ ̄ ̄ ̄~ ゞゝ∵ノ ̄.ゞゞゝノ ̄ゞゞゝ∵ノゝ∵ノ

101 :デフォルトの名無しさん:03/06/11 20:46
>>100
解決してよかったね。
ところで std::vectorとか boost::multi_arrayつかうと便利かもよ

102 :72:03/06/11 20:58
>101 ありがとうございます。後で調べてみます。
恥をかいたついでに、書きますが、はじめは↓のようにしてました。
InitData()の中身をmain に書いたら、無事に動きました。
動的に確保する内容を、メイン以外の関数には書けないのでしょうか?
(←そんなことは無いと思うが)

void InitData(long **Data){
// 中身は >92
// メモリを動的に確保
}

main関数内で
{
long **Data;
InitData(Data);
// このあと、Data[i][[j]に代入する関数を呼ぶ
}


103 :デフォルトの名無しさん:03/06/11 21:00
>>102
void InitData(long ***Data){

InitData(&Data);

普通は
long **InitData(void){

Data=InitData();

104 :デフォルトの名無しさん:03/06/11 21:01
>>102
(´д`)
Dataが値渡しじゃん。結果が呼出元のDataに反映されてない。
void InitData(long **&Data){...}になってれば反映はしただろうが。

105 :デフォルトの名無しさん:03/06/11 21:07
vc6 なんだけど以下のソースでNEWMODE.OBJにリンクさせても、bad_alloc なげねー。
デバッグモードだとダイアログボックスでてきて、リリースモードだとNULLですが表示される・・・。
何がいくないんでそうか?

#include <new.h>
#include <new>

int hoge(size_t){
throw std::bad_alloc();
return 0;
}

int main(){
  _set_new_mode(1);//_set_new_handlerの下に書いても同じ
_set_new_handler( hoge );

try{
int* a = new int[0x3FFFFFFF];
if(a == NULL) {
  cout << "NULL です" << endl;
}

delete [] p;
}catch( std::bad_alloc& e){
cout << e.what() << endl;
return 1;
}
return 0;
}

106 :72:03/06/11 21:10
できたー!
>103-104 できました! 103さんお勧めの方法で。
ありがとうございます。(よく理解できてないけど)
おなかがすいたので、今日はこれで帰ります。
おやすみなさい。

107 :デフォルトの名無しさん:03/06/11 21:45
_set_new_mode は使った事無いなー。

108 :デフォルトの名無しさん:03/06/11 23:56
テンプレートで、
template <int n> int add(int i) { return n + i; }
とするのと同様に
template <string s> void message(void) { cerr << s << endl; }
と定義して、message<string("hello world!")>(); などと関数を
生成できそうだと思うのですが、テンプレートの定義でエラーになってしま
います。何か根本的に勘違いしているのでしょうか?教えてください。

109 :デフォルトの名無しさん:03/06/12 00:15
>>108
template パラメータになれるのは、
「コンパイル時にプログラム全体で一意に決まる情報」 だけ。

> string("hello world!")
stringクラスのコンストラクタに文字列リテラル"hello world!"を
渡して呼び出した結果、というのはコンパイル時には決まらない。

110 :デフォルトの名無しさん:03/06/12 08:32
>>108
templateに使えるのは型か整数型のみなのだが。

111 :デフォルトの名無しさん:03/06/12 17:32
C++にモジュール名、クラス名、関数名、などに展開されるマクロはありますか?
あったらthrowで投げたいのですが・・・。

112 :デフォルトの名無しさん:03/06/12 17:32
あげ

113 :デフォルトの名無しさん:03/06/12 18:01
>>110
規格書を穴が開くまで読んでこい!
今はポインタと参照も可能になってるぞ。

>>111


114 :デフォルトの名無しさん:03/06/12 18:12
__FILE__や__LINE__みたいな奴のことかな

115 :自己レス:03/06/12 18:17
>>105
int* a = new int[0x3FFFFFFF];
ここの値(1回で得るメモリ量?)をあまり大きくしすぎると、動作不定になるっぽい。
ていうか、早くvc2003つかいてー。

116 :デフォルトの名無しさん:03/06/12 18:23
1GBもアロケートするのか

117 :デフォルトの名無しさん:03/06/12 18:28
4GBだろ


118 :111:03/06/12 18:45
>>114
です。

119 :デフォルトの名無しさん:03/06/12 19:36
C99 なら関数名を返すマクロがあるんだけどね...。

120 :デフォルトの名無しさん:03/06/12 19:45
492 名前:111[sage] 投稿日:03/06/12 19:31
まずfor(;;)をwhile(1)にする

121 :デフォルトの名無しさん:03/06/12 20:00
>>113
え?今ってこんなのできんの。
template<typename T*>struct NonPtrType
{
    typedef T nonpointee_type;
}


122 :デフォルトの名無しさん:03/06/12 20:07
>>121
それは出来るが、それはまた別の話

123 :デフォルトの名無しさん:03/06/12 20:13
>>122
ほんと!
特殊部分テンプレートじゃなくともできるんですか。

124 :デフォルトの名無しさん:03/06/12 20:35
ありゃできなかったっけ。特殊化で不都合は何?

125 :113:03/06/12 20:36
>>121
>>113 で言ったのは、
template<double* PD> struct ...
template<double& D> struct ...
ってのも可能ってこと。

126 :デフォルトの名無しさん:03/06/12 21:01
110 名前:デフォルトの名無しさん 投稿日:03/06/12 08:32
>>108
templateに使えるのは型か整数型のみなのだが。

113 名前:デフォルトの名無しさん 投稿日:03/06/12 18:01
>>110
規格書を穴が開くまで読んでこい!
今はポインタと参照も可能になってるぞ。

ポインタと参照ってのは型じゃないのか

127 :デフォルトの名無しさん:03/06/12 21:08
>>126
型ってのは typename の事でしょ?
型と整数型とを何で分けて言ってるのか考えれ...。

128 :デフォルトの名無しさん:03/06/12 21:52
>>113
その規格はどこに載ってる


129 :デフォルトの名無しさん:03/06/12 22:03
237ページ(PDFでは通算263ページ目)の14.1.4から

130 :ぷらぷらー:03/06/12 22:07
template <void (*)()> struct A{

};

void test(){}

A<test> a;


こういうのもできるよー テンプレート最高

131 :デフォルトの名無しさん:03/06/12 22:31
>>129
嘘いわないで下さいよ、先輩♥
p.391ですよ(うふ♥)

132 :デフォルトの名無しさん:03/06/12 22:33
なるほど外部リンケージね。
どうりでうまくいかなかったわけね。

133 :デフォルトの名無しさん:03/06/12 22:36
>>131
>>3 にあるやつだと >>129 の位置にあるんだけど。
モノが違うのかな?

134 :デフォルトの名無しさん:03/06/12 23:07
>>133
ごみん。Stroustrup本で見てたよ。♥
C++ Final Draft International Standard←ここね
しかもこちらの方が詳しく載ってるよ。
先輩ありがとう。

135 :デフォルトの名無しさん:03/06/12 23:11
error C2583: 'Check::Check' : 'const' 'this' ポインタをコンストラクタまたはデストラクタで使っています。


class Check
{
public:
Check() const { cout << "コンストラクタが呼ばれた" << endl; };
~Check() const { cout << "デストラクタが呼ばれた" << endl; };
};

どこがだめなんでしょうか?
データないのにconstつかったから?

136 :_:03/06/12 23:16
http://homepage.mac.com/hiroyuki44/jaz03.html

137 :デフォルトの名無しさん:03/06/13 00:15
鬱だ死のう・・・・

138 :デフォルトの名無しさん:03/06/13 02:22
分割コンパイルがうまくいきません。
誰か教えて(つД`)
(Windows 2000 VC++6.0)
///////////////////////// ClassA.h
#ifndef CLASSA_H
#define CLASSA_H
#include "ClassB.h"
class CClassA
{
CClassB m_objB;
};
#endif
///////////////////////// ClassA.cpp
#include "ClassA.h"
///////////////////////// ClassB.h
#ifndef CLASSB_H
#define CLASSB_H
#include "ClassC.h"
class CClassB
{
CClassC m_objC;
};
#endif

//続く


139 :138の続き:03/06/13 02:23
///////////////////////// ClassB.cpp
#include "ClassB.h"
///////////////////////// ClassC.h
#ifndef CLASSC_H
#define CLASSC_H
#include "ClassA.h"
class CClassC
{
CClassA m_objA;
};
#endif
///////////////////////// ClassC.cpp
#include "ClassC.h"
///////////////////////// main.cpp
#include "ClassA.h"
int main( int argc, char *argv[] )
{
CClassA objA;
return 0;
}

//続く


140 :138の続き:03/06/13 02:24
//エラーの内容の一部
コンパイル中...
main.cpp
classc.h(9) : error C2146: 構文エラー : ';' が、識別子 'm_objA' の前に必要です。
classc.h(9) : error C2501: 'CClassA' : 識別名を宣言するのに、型が指定されていません。
classc.h(9) : error C2501: 'm_objA' : 識別名を宣言するのに、型が指定されていません。
(略)
test.exe - エラー 12、警告 0

はじめ、part15の>>949と同じエラーが出ていて、
インクルードガードを書いたら別なエラーがでますた。
長々とすみません。どのような解決法でいけばいいでしょうか?m(_ _)m


141 :デフォルトの名無しさん:03/06/13 02:33
>>138-140
CClassA は CClassB を持っている。
CClassB は CClassC を持っている。
CClassC は CClassA を持っている。
CClassA は CClassB を持っている。
CClassB は CClassC を持っている。
CClassC は CClassA を持っている。
CClassA は CClassB を持っている。
CClassB は CClassC を持っている。
CClassC は CClassA を持っている。
CClassA は CClassB を持っている。
CClassB は CClassC を持っている。
    :
    :
    :
(以下無限に続く)

142 :デフォルトの名無しさん:03/06/13 02:46
>>130
http://pc2.2ch.net/test/read.cgi/tech/1047978546/l50
templateについて詳しくやるなら。

>>138-140
プリプロセッサ・マクロを展開するとどうなるか考えてみる。
エラーの内容は'CClassA'が定義されてないことによるエラー
分割コンパイル関係ない(^^;
//class A;class B;class C;//先に型が存在することを宣言しておく
class A
{
    C o;
};
class B
{
    A o;
};
class C
{
    A o;
};

とここまで書いて>>141見て問題の本質からずれてることに気がついたり(^^;
ポインターとnew演算子などを使って管理するしかないのでは?
boost::shared_ptrとか使う場合、循環参照に注意する必要あるだろうけど。

143 :デフォルトの名無しさん:03/06/13 02:55
>>138
ああこれね。よくやる人いるんだよね。
結論これはコンパイルできない。
CClassA,B,Cはそれぞれ相手のサイズがコンパイル時にわからないから。だったかな?
解決策はポインター持たせることやね。


144 :143:03/06/13 02:57
>>143
士ね

145 :デフォルトの名無しさん:03/06/13 03:00
ヘッダーファイル内でのインクルードはできるだけ避けたい。

146 :138:03/06/13 03:50
あああぁぁぁ!みなさんどうもありがとうございました!!(感涙)
勉強なりますたm(_ _)m


147 :超初心者:03/06/13 18:38
教えてください。この文はまずいでしょうか?

while(...) {
    while(...) {
        int x;
        .
        .
        if(...) goto loopEnd;
    }
}
loopEnd:;

148 :デフォルトの名無しさん:03/06/13 18:54
>>147
多重ループからの脱出か。
goto を使わないと面倒なパターンのひとつではある。
gotoのやみくもな利用はまずいが、こういうパターンに限って使えば合理的ってことで
まあまずくはないよ。

ただ、gotoを見るだけで文句言われる場合もあるので、
gotoなしでも、そのループ全体をinline関数に分割してreturnで抜けることで
実質的に同じ形にできたりするが。


149 :デフォルトの名無しさん:03/06/13 18:55
goto loopEnd;で一足飛びに外側のループを抜けてるが、
それは内側のループと外側のループに強固な依存関係を作ってしまってる。
リファクタリングで内側のループを関数に切り出したりする際に大きな障害になる。
ループの結果を受け取る変数を使って
while(...){
bool found = false;
while(...){
 if (...){ found = true; break; }
}
if ( found ) break;
}
とした方が良い

150 :147:03/06/13 19:22
>148
>149
素早い回答、どうもありがとうございます。
147の文についてあともう一つ質問したいのですが、
内側のwhileループ内で宣言している変数 x は、goto文でそのスコープを
抜けた時、無事にスタックから解放されるのでしょうか?

151 :デフォルトの名無しさん:03/06/13 19:24
>>150
それは仕様では決められていないんじゃないのかな。
外のスコープからでたからといって、解放されるとは限らないんじゃないの?
コンパイラ依存だと思われ。

152 :デフォルトの名無しさん:03/06/13 20:40
文字列を数字にするのはatoi関数じゃないですか。
逆に数字を文字列にする関数って何をつかえばいいんですか?
おねがいします

153 :デフォルトの名無しさん:03/06/13 20:43
sprintf

154 :デフォルトの名無しさん:03/06/13 21:04
>>152
atoiの反対ならitoa使えばいいんでないの?

155 :デフォルトの名無しさん:03/06/13 21:26
boost::formatって便利だけど、boostなしでそれっぽいことをしようとすると
やっぱり、sprintf / printfしかないですかねぇ…

156 :デフォルトの名無しさん:03/06/13 21:30
>>151
スタックの扱いは仕様外だけど、
デストラクタはちゃんと呼ばれる(6.6.2)。
まぁ、この場合は int なんで何もしないわけだけど。

>>154
itoa はコンパイラ独自の拡張関数。

157 :デフォルトの名無しさん:03/06/14 00:15
ガイシュツかもしれんが、
VC++6ではnewに失敗するとデフォでNULL。
だけども、MFCを使用の設定になってると
直接クラスライブラリ使っていなくても
newの失敗はNULLじゃなくてCMemoryException例外だよ。
AFXなんとかのプリプロセッサで決まるはず。
スレ違いといわれればそれまでだが。

158 :デフォルトの名無しさん:03/06/14 00:34
shared_ptr が標準に組み込まれないのはなんでだろ〜

159 :デフォルトの名無しさん:03/06/14 00:36
>>158
名前が長いから

160 :デフォルトの名無しさん:03/06/14 00:37
>>158
循環参照に対応してないから

161 :デフォルトの名無しさん:03/06/14 00:44
weak_ptrごと取り込めば

162 :犬すき:03/06/14 00:45
標準委員会で作れんかったから

163 :デフォルトの名無しさん:03/06/14 01:02
C++では裸の配列は使わないの?

164 :デフォルトの名無しさん:03/06/14 01:05
動的にとる時はdelete[]が嫌ー!
vectorで頑張る。
固定長なら普通に配列

165 :デフォルトの名無しさん:03/06/14 01:07
>>163
きちっと処理できんならいっぱい使ってくれ。

166 :デフォルトの名無しさん:03/06/14 01:11
>>161
weak_ptrは仕様がイマイチ

167 :デフォルトの名無しさん:03/06/14 11:46
(1)全てのエラーを拾いたいんですけれどcatch部分にはどのようなメッセージを
   かけばよいですか?主に、メモリーの不正使用によるコアダンプとかの
   エラーを拾いたいです。
   
  VBにおいては、On Error goto trap
Javaにおいては、
try{

}catch(ErrException){ // <-こんな感じのメッセージ
  〜
   }

  

168 :デフォルトの名無しさん:03/06/14 11:48
>>167
catch(...)

169 :_:03/06/14 11:49
http://homepage.mac.com/hiroyuki44/jaz03.html

170 :167:03/06/14 12:04
>>168
ありがとうございます。さっそく以下のように試して見ましたが
エラーは拾えなかったのですが、何が悪いのでしょう?
//Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland

int main(int argc, char* argv[]){
int i=0,j=0;
try{
j=100/i;
printf("j=%d",j);
return 0;
}catch(...){
printf("err!");
}
}


171 :デフォルトの名無しさん:03/06/14 12:23
>>170

C++が送出する例外を全てキャッチするわけであって
ランタイムのエラーなんか捕まえられるわけありませんがな。

VMで動いているJavaとは違う。


172 :デフォルトの名無しさん:03/06/14 12:32
>>170
Windows なら http://hata.cc/docs/Win32Map/2-1.html
しかしVC++ならcatch( ... )でも行けるはずだが、Borlandはそうでもないのか。

173 :167:03/06/14 12:34
>>171
なるほど。
本当に全てのエラーを拾えるわけではないんですね?

数字を0で割ったエラーはC++(BCB)では拾えない見たいですが
C++が拾えるエラーと拾えないエラーの見極めはどうしたらよいのでしょうか?


174 :167:03/06/14 12:46
>>172
VC++で試した見たら、確かにエラーは拾えました。
どうも、コンパイラ依存のようですね。ありがとうございました。

int func(int i);

int main(int argc, char* argv[]){
int i=0;
try{
if(func(0) !=0 );
}catch(...){
printf("err!");
}

printf("exit\n");
scanf("%d",&i);
return 0;

}


int func(int i){
int j=0;
j=100/i;
printf("j=%d",j);
return 0;
}


175 :デフォルトの名無しさん:03/06/14 12:49
>>170
BCB6up4ではちゃんとerr!って出たヨ

176 :デフォルトの名無しさん:03/06/14 13:02
>>173
BCB(6)では拾えるってことでバージョンアップ汁

177 :デフォルトの名無しさん:03/06/14 13:04
>>176
フリーコンパイラですもん。
バージョンアップもなにも(w


178 :デフォルトの名無しさん:03/06/14 13:08
>>177
BCBって書いてるから誤解してたよ。
BC++5.5のことか。それはBCB(Borland C++ Builder)とは違うコンパイラだよ。

179 :デフォルトの名無しさん:03/06/14 13:37
>>173
C++のコード内で throw std::exception("err"); とかやって投げてる
例外は catch で捕まえることができる。他のゼロ除算とか
ページ違反とかの OS が投げてくる例外は、拾い方は環境依存。

別の言い方をすると、「この関数はこの例外を投げるかもしれない」と
C++のドキュメントに書いてあればcatchで捕まえられる。それ以外は×。

180 :デフォルトの名無しさん:03/06/14 14:12
>>178
コンパイラ(エンジン)は同じだろ

181 :デフォルトの名無しさん:03/06/14 14:20
>>180
昔のバージョンのものみたいだから、概ね同じか。

182 :デフォルトの名無しさん:03/06/14 14:24
BC++5.5はBCB5に付属

183 :デフォルトの名無しさん:03/06/14 16:11
みなさんコンパイラのツールはなにつかってるの?
VC++が多いのだろうけど。

184 :デフォルトの名無しさん:03/06/14 16:43
コンパイラのツールってなんだ?

185 :デフォルトの名無しさん:03/06/14 16:44
細かいこと言ってやるなって

186 :デフォルトの名無しさん:03/06/14 16:44
そこツッコまない

187 :デフォルトの名無しさん:03/06/14 16:45
はもねぷ〜〜〜〜〜

188 :デフォルトの名無しさん:03/06/14 16:48
>>183
cpp32

189 :デフォルトの名無しさん:03/06/14 17:36
Visual C++ 7.1(.NET 2003)ってオリジナルの Loki そのまま使えるの?

190 :デフォルトの名無しさん:03/06/14 21:57
MaxOSX の gcc。つか、宿題スレでしか使わないけどな。

191 :デフォルトの名無しさん:03/06/14 23:35
>>190
同志がいた。

192 :デフォルトの名無しさん:03/06/15 01:06
#include <iostream>
#include <fstream>
using namespace std;
ostream &operator<<( ostream &stream, unsigned char ret ){
stream << (unsigned short)ret;
return stream;
}
int main(){
unsigned char x=62;
cout << x;
ofstream out("Result.txt");
out << x;
out << " " << x;
out.close();
return 1;
}

12行目のxのみがunsigned charで表示されてしまいます。
恐らくは12行目の<<のみがオーバーロードできていないのでしょうが、
原因と対策を教えていただけないでしょうか?
コンパイラはVC++6.0を使用しています。
宜しくお願いします。

193 :デフォルトの名無しさん:03/06/15 01:11
char と unsigned char は違う型なので
char にキャストするか、元から char に汁。

194 :193:03/06/15 01:36
いえ、数値表示したいのです。
10行目と13行目は思惑通り数値で表記されるのですが、
12行目(左辺値に直接ostreamを持っていったとき)のみ、数値表示できません。
言葉足らず申し訳ありません。

195 :192:03/06/15 01:37
すみません、名前欄は193ではなく192の間違いです

196 :デフォルトの名無しさん:03/06/15 01:48
BC++5.5.1では3度ともグローバルのが呼ばれた。
VC++6.0のバグぽ。

197 :デフォルトの名無しさん:03/06/15 01:52
それぞれが発売された時期を考えろ

198 :デフォルトの名無しさん:03/06/15 01:52
gcc-2.95だとambiguous overloadと言われてコンパイルできなかった。
gcc-3.3だと全てちゃんと数値表示された。

199 :197:03/06/15 01:52
Borlandの方は発売とはいわないけど

200 :デフォルトの名無しさん:03/06/15 02:39
>>194
じゃぁ、int でキャスト汁。

規格でどちらが使われるのか決まってるかどうかは分からんが、
unsigned char でオーバーロードされてない時に char, int のどちらが使われるか
一意に決められないコンパイラがあるということだけは事実のようだし。

201 :デフォルトの名無しさん:03/06/15 02:39
もしくは元から int にするか。

202 :デフォルトの名無しさん:03/06/15 03:07
>>193=>>200-201
さっきから君は何を言っとるんだ?

203 :デフォルトの名無しさん:03/06/15 03:14
なんだ。よく見たら自分でオーバーロードしてたのね...。
スマソ。
何でだろね。

204 :192:03/06/15 03:31
バグですか…どうもありがとうございました。
BC++の導入を検討します。
現在CからC++への移行のために勉強中なので
もしまたお世話になるときは宜しくお願いします。

205 :デフォルトの名無しさん:03/06/15 06:14
>>192
ostreamからの派生クラスofstreamへのオーバーロードができていない可能性がありますね
ofstream &operator<<(ofstream &stream, unsigned char ret){
(ostream)stream << (unsigned short)ret;
return stream;
}
を追加してはどうですか

206 :デフォルトの名無しさん:03/06/15 06:17
>>197
vc7でも表示のしかたvc6と変わりませんけど。
>>192
わざわざコンパイラ変える必要なんてない。
>>200の言っているようにキャストすりゃオーバーロードも必要性がない
>>205
それはオーバーロード関数があいまいと表示されるかと

207 :デフォルトの名無しさん:03/06/15 06:31
>>206
205です。
当方VC6ですが、(ostream)キャストを使うため
あいまいさはなくなります。

208 :206:03/06/15 06:38
俺のvc7じゃキャストできん。

209 :206:03/06/15 06:41
ちなみにg++でも無効やって、怒られちゃいます。

210 :デフォルトの名無しさん:03/06/15 07:10
(ostream&)

211 :デフォルトの名無しさん:03/06/15 08:44
MSVC++6.0で以下のように、hoge.hでCHogeのなかにFOOという定数を宣言し、hoge.cppでその定義を行います。すると、hoge.cppのなかでは問題なく定数として扱われてcase文にも使えるのですが、宣言をincludeしているだけのbar.cppでは
"error C2051: case 式は、整数型定数でなければなりません。"
というエラーが出ます。

定数の定義文をbar.cppに書くとbar.cppは正常にコンパイルされ、hoge.cppのcase文で上記エラーが出ます。両方に定義を書くと、多重定義でエラーが出ます。

どうすればいいのでしょうか?

hoge.h
class CHoge {
static const int FOO; // 定数の宣言
...
}

hoge.cpp
#include "hoge.h"
const int CHoge::FOO = 1; // 定数の定義
...
switch (i) {
case CHoge::FOO: // ここではエラーにならない
...
}

bar.cpp
#include "hoge.h"
...
switch (i) {
case CHoge::FOO: // ここではエラーになる
...
}


212 :デフォルトの名無しさん:03/06/15 08:58
hoge.h
class CHoge {
enum { FOO = 1 }; // 定数の定義
...
};

213 :デフォルトの名無しさん:03/06/15 10:16
>>211
値が hoge.cpp で指定されているので、
bar.cpp のコンパイル時にその値を参照できないのだ。
C++ の仕様上は
 class CHoge {
  static const int FOO = 1;
  ...
 };
とすればいいんだが、
VC++6.0 ではこの仕様に準拠してないので
>>212 のようにする。

214 :デフォルトの名無しさん:03/06/15 11:13
enumファックですな

215 :211:03/06/15 14:37
>> 212-214
case文に使うような整数定数はenum使えばいいんですね。
解決できました。ありがとうございます!


216 :デフォルトの名無しさん:03/06/15 14:43
C++の標準クラスに数値→文字列変換できるメソッドってありますか?
sprintfをつかわにゃならないのですか?

217 :デフォルトの名無しさん:03/06/15 15:05
>>216
ostream::operator<<

218 :217:03/06/15 15:09
>>216
いやどちらかといえばostringstreamかostrstream

219 :デフォルトの名無しさん:03/06/15 16:31
C++の例外処理が説明とかを読んでも意味が分かりません
もしよろしければ、わかりやすく教えてください

220 :デフォルトの名無しさん:03/06/15 17:21
>>219
説明とか読んでも分からないと言う人にどうやって説明すればいいのかわかりません。

221 :デフォルトの名無しさん:03/06/15 17:46
#include<iostream>
#include<vector>
#include<stdexcept>

int main()
{
    try
    {
        std::vector<int> v(10);
        v.at(10);
    }
    catch(std::out_of_range& out)
    {
        std::cout<<out.what();
    }
    return 0;
}


222 :デフォルトの名無しさん:03/06/15 17:57
みてね〜♪
http://www1.free-city.net/home/s-rf9/page004.html
http://www1.free-city.net/home/s-rf9/page005.html

223 :デフォルトの名無しさん:03/06/16 00:29
□□□□□□□□□□□■■■■■□□□□□□□□□□□□□
□□□□□□□□□□■■■■■■■□□□□□□□□□□□□
□□□□□□□□□■■■■■■■■■□□□□□□□□□□□
□□□□□□□□■■□□■■■□□■■□□□□□□□□□□
□□□□□□□■■■□□■■■□□■■■□□□□□□□□□
□□□□□□□■■■□□■■■□□■■■□□□□□□□□□
□□□□□□□■■■■■■□■■■■■■□□□□□□□□□
□□□□□□□■■■■■■□■■■■■■□□□□□□□□□
□□□■■■□□■■■■□■□■■■■■□■■■□□□□□
□□□■■■□□■■■■■■■■■■■□□■■■□□□□□
□□□■■■■□□□■■■■■■■□□□■■■■□□□□□
□□□□□■■■□□□■■■■■□□□■■■□□□□□□□
□□□□□□■■■□□□□□□□□□■■■□□□□□□□□
□□□□□□□■■■□■■■■■□■■■□□□□□□□□□
□□□□□□□□■■■□■■■□■■■□□□□□□□□□□
□□■■■■■■□■■■□□□■■■□■■■■■■□□□□
□□□■□■□□□□■■■□■■■□□□□■□■□□□□□
□□■□■■□■□□□■■■■■□□□■□■■□■□□□□
□□□■■■■□□□□□■■■□□□□□■■■■□□□□□
□□□□■■□□□□□■■■■■□□□□□■■□□□□□□
□□□■□■□□■□■■■□■■■□■□□■□■□□□□□
□□■□□■■■■■■■□□□■■■■■■■□□■□□□□
□□□□□□□□■■■□□□□□■■■□□□□□□□□□□
□□□□□□□■■■□□□□□□□■■■□□□□□□□□□
□□□□□■■■■□□□□□□□□□■■■■□□□□□□□
□□□■■■■■□□□□□□□□□□□■■■■■□□□□□
□□□■■■■□□□□□□□□□□□□□■■■■□□□□□
□□□■■■□□□□□□□□□□□□□□□■■■□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□


224 :デフォルトの名無しさん:03/06/16 01:30
>>221
ださいJavaを見習え

225 :デフォルトの名無しさん:03/06/16 01:34
ぷ、Javaとかいってんのみ手ラン内

226 :デフォルトの名無しさん:03/06/16 01:45
>>224
ぬるぽ

227 :デフォルトの名無しさん:03/06/16 02:24
javaのなにをどう見習えというの
所詮C++の派生のくせして。

228 :デフォルトの名無しさん:03/06/16 02:44
#include <iostream>
using namespace std;
int func(){
    throw "hello\n";
    return 0;
}
int hello(){
    return func();
}
class Test{public:
    ~Test(){cout << "Test::~Test()が呼ばれました"<<endl;}
};
int main(){
    try{
        Test o;
        hello();
        Test o2;
    }
    catch(const char * p){cout << p << endl;}
    return 0;
}


229 :デフォルトの名無しさん:03/06/16 02:44
>>227
所詮Cの(ry
所詮アセンブラの(ry


230 :デフォルトの名無しさん:03/06/16 03:33
>>229
所詮Simulaの(ry
が抜けてるぞ

231 :デフォルトの名無しさん:03/06/16 10:27
所詮チューリングマシンの(略

232 :デフォルトの名無しさん:03/06/16 14:08
環境はBCB6なのですが、double型の4次元配列 (サイズは 130×20×20×20 程度で
配列の大きさは固定) のデータを簡単にファイルに書き込み・読み出して
変数に代入できるメソッドはC++にあるのでしょうか?


233 :デフォルトの名無しさん:03/06/16 14:13
四次元配列 Σ( ̄□ ̄;)!!

234 :デフォルトの名無しさん:03/06/16 14:22
なぜ4次元も使うことになったのか興味が

235 :デフォルトの名無しさん:03/06/16 14:25
>>232
fwriteとfread

236 :デフォルトの名無しさん:03/06/16 14:50
130*20*20*20*8=8,320,000
そんなに巨大なわけでもないな。

237 :デフォルトの名無しさん:03/06/16 14:57
4次元配列にするならクラスか
構造体にしたほうがよくないか・・・?

238 :デフォルトの名無しさん:03/06/16 15:01
>>236
10年ちょっとくらい昔ならパンクしてるけどね。

239 :デフォルトの名無しさん:03/06/17 12:52
質問お願いします。
いろんなサンプルコードを見て勉強しているのですが、
構造体変数をコピーするのに、単に代入で済ましている
ものと、memcpy()で行っているものとがあります。
これはどんな違いがあるのでしょうか?

240 :_:03/06/17 12:57
http://homepage.mac.com/hiroyuki44/

241 :デフォルトの名無しさん:03/06/17 12:59
>>239
構造体の代入演算子がオーバーロードされている場合がある

242 :239:03/06/17 13:01
>>241
あっ、なるほど!!
ありがとう。。。

243 :デフォルトの名無しさん:03/06/17 13:08
>>239
VCなんかの場合は出力コードを見ると、メンバを一つ一つ代入処理するように展開される
よってmemcpyより遅くなる

244 :239:03/06/17 13:24
>>243
そうなんですか!
グリッドのサンプルを見ていたら、各セルのLOGFONTを
設定するのにmemcpyを使っていたのですが、スピード
が要求されるからなんですネ。
どうもです。。。

245 :デフォルトの名無しさん:03/06/17 15:18
いや、その程度の処理ならどっち使っても、人間には認識できないレベルの速度差にしかならない

246 :デフォルトの名無しさん:03/06/17 15:50
プログラムを始めて間もない初心者なんですが
分割コンパイルとか言うのをやろうと思って
ソースファイルを2つ用意して片方に関数プログラムを書いて
もう片方にその関数を実行した結果を表示するプログラムを
書いてコンパイルしてみたんですが。ソース自体にはエラーは
でなかったんですが、
bunkatu error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 _WinMainCRTStartup で参照されました。
とかいうよくわからないエラーが出ちゃって困ってます
分割コンパイルってC++.netでやるとき何か設定とかひつようなんですか?

247 :デフォルトの名無しさん:03/06/17 15:53
ウィンドーズアプリケーションはmainではなくWinMainからはじまる。OK?

248 :246:03/06/17 16:11
>>247
ありがとうございます。
でも、mainをWinMain()に変えてもエラーは消えませんでした・・・
なぜでしょう?

249 :デフォルトの名無しさん:03/06/17 16:15
というか、
Windows アプリケーションから
コンソールアプリケーションに変えた方がいいんでは?

250 :デフォルトの名無しさん:03/06/17 16:20
WinMainはint WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)で
mainとは違うが、>>246の問題はそこに留まらないだろうから>>249のとおり

251 :246:03/06/17 16:26
>>249
.netってコンソールアプリケーションつくれるんですか?

252 :デフォルトの名無しさん:03/06/17 16:31
作れるよ

253 :246:03/06/17 16:42
>>252
どうやって?
っていうかwinアプリから分割コンパイルってできないん?

254 :デフォルトの名無しさん:03/06/17 16:46
出来るよ

255 :デフォルトの名無しさん:03/06/17 17:07
>>246
新規作成⇒C++プロジェクト⇒WIN32⇒アプリケーション設定⇒コンソール
OK

256 :246:03/06/17 17:21
>>255
ごめんなさい
やっぱコンソールでやってもやっぱりできないや・・・・
なんでだろう?
やっぱ本を買ったほうが手っ取りばやいと思うんだけど
.netでプログラムするときのお勧めの本知りません?

257 :デフォルトの名無しさん:03/06/17 17:40
違います.
externというのを追加してますか。
extern void fun();//こんふうに使いたいcppソースに

258 :デフォルトの名無しさん:03/06/17 17:42
それかソリューションにファイルが追加されているか。

259 :246:03/06/17 17:47
>>257
ソースファイルはfile1とfile2というのがあるんですが
file2.cppのほうに
extern g;
extern nibai(){
g*=2;
}
と関数を定義してみたんですがエラーがでてしまいます。
>>258
はい。ソリューションのところに2つともちゃんと追加されてます。

260 :デフォルトの名無しさん:03/06/17 17:50
だから、エラーて何よ?
>未解決の外部シンボル _WinMain@16 が
ってリンクエラーまだ出てるなら
WinMain関数がプロジェクトの何処にも無えって言われてるんだから
>>255

261 :デフォルトの名無しさん:03/06/17 17:54
#file2.cpp
int f(){}
#file1.cpp
extern int f();
int main(){
    f();
    return 0;
}


262 :デフォルトの名無しさん:03/06/17 18:01
#こちらにしたら
#test.h
int x2(int);
#file.cpp
int x2(int i)
{
    return i*2;
}
#main.cpp
#include "test.h"

int main()
{
    x2(10);
    return 0;
}


263 :246:03/06/17 18:04
>>260
コンソールファイルにしたらそちらのエラーは消えたみたいです。でも
もうひとつのほうのエラーが消えないです・・・↓

error LNK2005: "int __cdecl nibai(void)" (?nibai@@YAHXZ) は既に file1.obj で定義されています。



264 :デフォルトの名無しさん:03/06/17 18:26
そのまま解釈してfile1.cppのint nibai(void)がどこかでも
定義されています。それはいけないよ。と言う事。

#file.cpp
int g = 0;

void f(int i)
{
    g = i*2;
}

#main.cpp

#include <iostream>
extern int g;
extern void f(int);

int main(){
    f(20);
    std::cout<<g;
    return 0;
}


265 :デフォルトの名無しさん:03/06/17 18:31
>>256
どこかのサーバにupして指示を仰ぐのが一番早いと思われ

266 :246 :03/06/17 19:17
>>264
できました
ありがとうございました。

externってメインの方に書くんですね
勘違いしてた・・・

267 :デフォルトの名無しさん:03/06/17 19:53
>>239
構造体がポインタを持っているときは、
場合によるがmemcpyはよろしくない。

268 :デフォルトの名無しさん:03/06/17 19:56
>>267
さらに、構造体のメンバにクラスや構造体の変数があれば・・
それがスマートポインタ(auto_ptrやboost::shared_ptr)やstringだったりすると
参照数の不整合が起きるな。

269 :デフォルトの名無しさん:03/06/17 20:49
クラスをcppに書くのと
ヘッダーファイルに書くのとでは
何がどう違うんでしょうふぁ?

270 :デフォルトの名無しさん:03/06/17 21:21
何も違わないよ

271 :デフォルトの名無しさん:03/06/17 21:29
>>267
メンバにクラスのインスタンスがあるときは問題が出るだろうけど、
ポインタの場合はmemcpyだろうが関係ない気がする
メンバを一つずつコピーする場合と動作は変わらないし
で、具体的にどのような場合に問題が出るの?

272 :デフォルトの名無しさん:03/06/17 21:32
コピー戦略は基本的なことだから解説しているホームページでも本でも見て
体系的に知っていたほうが良い

273 :デフォルトの名無しさん:03/06/17 21:34
>>272
意味不明

274 :デフォルトの名無しさん:03/06/17 21:47
>>271
struct my_string{ char *buf;int length;};

struct my_string s1,s2;
s1.buf = malloc(256);
strcpy(s1.buf,src);
s1.length = strlrn(s1buf);
memcpy(&s2,&s1,sizeof(struct mystring));
strcat(s2.buf,hoge);
s2.length = strlen(s2.buf);

これでやばいことになりますた。

275 :デフォルトの名無しさん:03/06/17 21:49
>>271
メンバが new で確保した領域を保持してるとか
struct T {
 int* p;
 T() : p(new int[3]) {}
 ~T() { delete[] p; }
};

276 :274:03/06/17 21:51
あ、ここC++スレか。なら>>275の方が適切な例だ。
classの場合、普通は代入演算子を定義して=でコポーするのがセオリーやね。

277 :デフォルトの名無しさん:03/06/17 21:59
>>269
cpp に書くと、他から参照しにくい。

278 :デフォルトの名無しさん:03/06/17 22:03
いっぱいきけんやな。
>>271は何もわかってないとこ見るとCプログラマーやな。

279 :デフォルトの名無しさん:03/06/17 22:05
>>276
コポーってなんでつか?

280 :269:03/06/17 22:06
>>277
なぜ?
詳しく教えて。

281 :デフォルトの名無しさん:03/06/17 22:09
>>275
その例だと代入を利用しても、memcpyと同じように問題が発生する

282 :デフォルトの名無しさん:03/06/17 22:11
>>279
ぐぐれ

283 :デフォルトの名無しさん:03/06/17 22:16
>>278
代入する場合とmemcpyをする場合の比較の話なのに
コピーコンストラクタが存在するのが前提の話になっているんだが?

挙げられた例ではコピーコンストラクタが存在しておらず、
この場合、メンバにポインタがある時に、
代入では発生せずmemcpyでのみ発生する問題点が示されていない

で、クラスのインスタンスについては既に挙げたから、
それ以外で具体的に何が危険なの?

284 :デフォルトの名無しさん:03/06/17 22:25
>>283
memcpyだと、複製先と元で同じデータを共有している上に、お互い他のインスタンスがそのデータを参照していることを知らない。
だから、知らないうちにその共有データの内容を変更されたりして、処理の整合性が取れなくなる。

285 :デフォルトの名無しさん:03/06/17 22:26
C++ではC由来の古いライブラリは使うな。

****終了****

286 :デフォルトの名無しさん:03/06/17 22:27
>>283
挙げられた例ってどれ?


287 :デフォルトの名無しさん:03/06/17 22:29
あげあしとり中学校の予感

288 :デフォルトの名無しさん:03/06/17 22:31
おっと、ちょっと意図を外したかな。
この場合、コピーコンストラクタではなく代入演算子のオーバーライドの方が適切だよね?
クラスインスタンス生成時にmemcpyは使えない。

確かに代入演算子がオーバーライドされていない場合、memcpyでも代入でも同じ。
代入演算子がオーバーライドされている時には、memcpyで問題が発生する。

では最初の質問に立ち返ってみると、classを使用する場合一般に代入演算子がオーバーライドされているかどうかわからない。
それならば最悪の場合を想定して、一般にmemcpyを使わないほうがいい、ということで間違っていないとおもうよ。

289 :デフォルトの名無しさん:03/06/17 22:32
>>288は284です。


290 :デフォルトの名無しさん:03/06/17 22:37
ちんぷんかんぷん。

291 :デフォルトの名無しさん:03/06/17 22:38
オーバーロードじゃないの?

292 :デフォルトの名無しさん:03/06/17 22:39
>>285
同感。
デフォルトでmemcpyなんて使わんでも、たしか、ビットレベルでの
コピーがされる、だか、なんだか、とう言う事をどっかで読んだ。
たしか、メイヤちゃんやったような気がする。

293 :デフォルトの名無しさん:03/06/17 22:39
>>248
だからメンバにインスタンスが含まれていた場合は除外しているんだけど、何故きちんと読まないの?
ポインタの場合はmemcpyでも代入でも結果は変わらないと言っているんだけど

>>288
>演算子のオーバーライド
オーバーライドとオーバーロードを混同してない?

>それならば最悪の場合を想定して、一般にmemcpyを使わないほうがいい
インスタンスが含まれている場合は当然memcpyを使うべきではないのは同意

294 :デフォルトの名無しさん:03/06/17 22:40
Cでmemcpy使うのも構造体を=で代入できなかった頃の名残だし

295 :288:03/06/17 22:40
そうでした。代入演算子の場合はオーバーロードだ。スマソ。

296 :デフォルトの名無しさん:03/06/17 22:41
>>292
C時代の代入についての挙動は処理系依存
古い規格だと根本的に構造体の代入自体が不可能だった

297 :デフォルトの名無しさん:03/06/17 22:42
>>293
構造体のメンバにポインタがあるとき、場合によっては
memcpy()は不適切だといってるのに、それに対する君の
突っ込みが意味不明。

298 :デフォルトの名無しさん:03/06/17 22:45
クラスをmemcpyでコピーなんて考えたこともないな。

299 :デフォルトの名無しさん:03/06/17 22:45
>>293のところの最初のポイント先を>>288に修正

>>297
だからその問題点が示されてないんだけど
代入では発生せずmemcpyの場合のみ起こりえる問題点とは?


300 :デフォルトの名無しさん:03/06/17 22:47
>>298
クラスをmemcpyする話はだれもしてないよ

301 :デフォルトの名無しさん:03/06/17 22:48
>>299
問題点は示されてるから読み返したら?
それともオーバーロードされた代入演算子を使った代入は
代入じゃないとでも言いたいのだろうか。

302 :298:03/06/17 22:48
あ、構造体か。でもC++なら同じだろ。そもそもC++でmemcpy(ry

303 :288:03/06/17 22:48
>>299
ポインタを持つクラスが代入演算子をオーバーロードしていたとする。
それをmemcpyしても問題ないということ?

304 :288:03/06/17 22:50
そもそも、なんでそんな場合分けするのか分からない。
インスタンスを持っているのか、ポインタなのか、
オーバーロードがあるのか、
そんなの外から見ても分からないでしょ?

305 :デフォルトの名無しさん:03/06/17 22:50
=でできることをなぜmemcpyでやろうとするのか理解できないんですが。

306 :デフォルトの名無しさん:03/06/17 22:52
確かにオーバーロードがあれば挙動は変わる
>>278
>いっぱいきけんやな。
となっているんだけど他には?

307 :デフォルトの名無しさん:03/06/17 22:53
>>239
そのソースってのは本当にC++で書かれたもの?Cじゃなくて?

308 :288:03/06/17 22:53
さらに言わせてもらうと、
インスタンスだって
struct Point {int x;int y;};
こういう構造体のインスタンスを持っているだけなら、memcpyで問題は起こらないよ?

309 :デフォルトの名無しさん:03/06/17 22:54
>>305
実際にやるかどうかではなく、問題点の洗い出しをしてるんだけど

310 :デフォルトの名無しさん:03/06/17 22:54
>>309
そんな無意味なことをしていたんですか・・・ばからしい・・・・

311 :デフォルトの名無しさん:03/06/17 22:56
>>308
>>271でクラスのインスタンスと言っているんだけど、
いつから構造体のインスタンスになったの?

312 :239:03/06/17 22:56
>>307
>そのソースってのは本当にC++で書かれたもの?Cじゃなくて?

スマソ。ROMらしてもらってますた。
1999年ごろのc++のコードです。


313 :288:03/06/17 22:57
>>311
C++ではどちらも本質的に同じだから混同して使っています。

314 :デフォルトの名無しさん:03/06/17 22:57
>>312
=で構造体をコピーできることをしらない頭の古いC厨の書いたコードの予感

315 :デフォルトの名無しさん:03/06/17 22:58
>>310
少なくとも>>274-275のような頓珍漢な例は洗い出せたけど

316 :デフォルトの名無しさん:03/06/17 22:59
>>306
仮想関数を持っていたら vtblを指すポインタまでコピーされるから
基底クラスレベルで memcpy() されればそれが書き換えられる可能性
もあり得るな。

317 :デフォルトの名無しさん:03/06/17 23:00
>>313
本質的に同じではないんだけど
クラスのインスタンスをコピーしてはいけない理由は分かってる?

318 :デフォルトの名無しさん:03/06/17 23:00
構造体はfunctor位にしか使わないなぁ

319 :デフォルトの名無しさん:03/06/17 23:00
c++使ってても、cやら、うんこVBやらに文字列渡すときに
しょうがなく、memcpyつかっておりますが
やっぱりstd::copyとか使ったほうがよさげなんですかね?

320 :デフォルトの名無しさん:03/06/17 23:00
>>316
構造体は仮想関数は持てない

321 :デフォルトの名無しさん:03/06/17 23:01
プログラムを新規で作るときって
新しいプロジェクトを作って新しいソースファイル作って
それを保存してソリューションに追加するって流れが
めんどくさくてしょうがないです。
どうにかなりませんか?

322 :デフォルトの名無しさん:03/06/17 23:01
>>320
やっぱり勉強し直せ。

323 :デフォルトの名無しさん:03/06/17 23:01
>>321
空気読め。質問できる雰囲気ではないだろ。
ちなみにスレ違い。

324 :288:03/06/17 23:02
>>317
あ、わからないかも。

class Point{int x; int y;};

こういうクラス、memcpyすると、何か問題起こるの?
純粋に知らない。

325 :デフォルトの名無しさん:03/06/17 23:02
=にはない、memcpyならではのメリットはある?

326 :239:03/06/17 23:03
>>314
いちおうCodeProjectに載ってた、幾度となくバグフィクス
されたっぽいものなんですが。。。
アドレスをば 
ttp://www.codeproject.com/miscctrl/gridctrl.asp

327 :288:03/06/17 23:04
まぁ、確かに彼の最初の指摘は正しいな。
そのあとのレスのつけ方がどうもな。
まぁ、ここは2chだからいいんだけど。
どこか糞壁を思い出してしまいました。

328 :デフォルトの名無しさん:03/06/17 23:09
= を使うようにしておけば、
operator= をオーバーロードしても、
ソースコードを変更する必要が無い。
そのクラスが = オーバーロードしてあるかどうかも
気にしなくて良い。

329 :デフォルトの名無しさん:03/06/17 23:10
構造体の配列をコピーする時なんかは、memcpyのほうが効率いいことあるな。
もとろんmemcpyで問題のない構造体に限るが。

330 :デフォルトの名無しさん:03/06/17 23:11
>>325
大量のインスタンスをコピーする時に速い。
けど、危険冒してまでやりたくない気が・・・
まあcharとかintなどなら大丈夫だけど


331 :288:03/06/17 23:16
>>324はどうなの?
ここで終わったら気になるじゃないか。

332 :デフォルトの名無しさん:03/06/17 23:20
>331
それなら問題ない。
std::stringとか入ったりデストラクタ加わったりするとだめだけど。


333 :デフォルトの名無しさん:03/06/17 23:21
>>324
public:つけろよ

334 :デフォルトの名無しさん:03/06/17 23:23
>>333
すまんス
アクセス指定子以外、C++のclassとstructは同じと考えてよいよね?

335 :デフォルトの名無しさん:03/06/17 23:26
良いよ。

336 :デフォルトの名無しさん:03/06/17 23:27
>>320はなんなの?

337 :デフォルトの名無しさん:03/06/17 23:27
>>334
structの方が1文字多い

338 :デフォルトの名無しさん:03/06/17 23:28
構造体はBO(略

339 :デフォルトの名無しさん:03/06/17 23:32
Boxing?

340 :デフォルトの名無しさん:03/06/17 23:33
>>336
317、320 (=271?)は知ったかのアフォです。

341 :デフォルトの名無しさん:03/06/17 23:53
293は「インスタンス」の意味を間違えていると思われ。


342 :341:03/06/17 23:56
ごめん

343 :デフォルトの名無しさん:03/06/18 00:00
えーと急いで探してみたのだが
POD(Pure Old Data) typeはmemcopyでコピーできると書いてあるけど
一般のC++のクラスについては記述が見つからないんだよね。
わざわざPOD typeと限定しているところからして駄目に見えるのだが
だれか見つけられた?

344 :343:03/06/18 00:02
ちょい間違い。PODはPlain Old Dataだった

345 :デフォルトの名無しさん:03/06/18 00:12
>>343
例えば class Point { int x, y; }; とか
class Hoge { Point* ptr; } とかは POD だが。意味わかってる?

346 :デフォルトの名無しさん:03/06/18 00:31
つーか、Cいらね。
素直にoperator=とか、コピーコンストラクタとかを使え。


以上。

347 :デフォルトの名無しさん:03/06/18 00:57
>>345
A POD class is a class that is either a POD-struct or a POD-union.

であるから、それはPODではない。分かってる?

348 :デフォルトの名無しさん:03/06/18 01:28
345じゃないけどさ
>>347
どうみても >>345 の例は POD だよ。
キーワードにだまされるな。>>334->>335 のやりとりを見よ。

349 :デフォルトの名無しさん:03/06/18 01:29
>>348
だまされてるのは藻前だ。
PODはprivate非スタティックデータメンバをもてない。

350 :デフォルトの名無しさん:03/06/18 01:44
なんでこんなくっだらない言い争いでここまで伸びるんだ?

351 :デフォルトの名無しさん:03/06/18 01:56
結論

ごちゃごちゃ言わず = を使え、と。

352 :デフォルトの名無しさん:03/06/18 05:10
えーと、C++の質問なんでが
テンプレートを使わないで動的メモリの再確保をしたい場合(再確保前のメモリDATAも保護)
Cの方でrealloc()ってあるので使っちゃってるのですが、
別の領域にDATAコピーして、古い領域をdeleteして新たに必要な領域をnewして
そこにコピーしなおしてって感じで使える領域を増やすのを思いついたのですが
なにか別にC++ならではの良い方法はあるのでしょうか?

353 :デフォルトの名無しさん:03/06/18 05:50
>別の領域にDATAコピーして、古い領域をdeleteして新たに必要な領域をnewして
>そこにコピーしなおして

普通は、新たに必要な領域をnewしてそこにコピーしなおして古い領域をdelete、する。
という手順を踏む。標準ライブラリなども大体そうしているはず


354 :デフォルトの名無しさん:03/06/18 05:51
>>352
vectorのソースでも見てみれば?


ところで
http://oita.cool.ne.jp/ja6hfa/ja6hfa/dpfaq/singleton.html
↑のQ7で、staticオブジェクトはデストラクタが呼ばれないって書いてあるけどマジ?
それと同じくQ12でなぜかauto_ptrのデストラクタは呼ばれるような話してるんだけど矛盾してない?


355 :デフォルトの名無しさん:03/06/18 06:10
そんなばかな。mainからreturnまたはexitした後に
生成の逆順でデストラクタが呼ばれるとなっているが

356 :デフォルトの名無しさん:03/06/18 06:48
あんまりそのページの記述信用しないほうがいいと思うが。
auto_ptrは代入つかって開放することができるし。

357 :デフォルトの名無しさん:03/06/18 07:17
やっぱりそうだよね。
ちょっと安心したよ。

358 :デフォルトの名無しさん:03/06/18 14:57
>>355
main終了時の話ではないと思われ

359 :デフォルトの名無しさん:03/06/18 15:21
みてね〜♪
http://www1.free-city.net/home/s-rf9/page004.html

360 :デフォルトの名無しさん:03/06/18 16:50
>>354
static objectつくって実験してみればいいと思われ

361 :デフォルトの名無しさん:03/06/18 20:46
#Includeで別のヘッダを取り込んでいるのですが、その別のヘッダ
ファイル内での#Includeファイルがダブってしまいコンパイル
できません。
間接的にすでにインクルードされているかをチェックして
されてない場合のみインクルードするディレクティブって
ないのでしょうか?

#ifdef ならぬ #ifinclude みたいなの...

わかりにくい説明ですみません。

362 :デフォルトの名無しさん:03/06/18 20:52
>>361
標準ヘッダのソース見てみ

363 :デフォルトの名無しさん:03/06/18 20:52
>>361
-----------------------------
#ifndef HOGEHOGE_INC
#define HOGEHOGE_INC

定義


#endif
-------------------------------

ただし、includeファイルがお互いをinludeしていると上手くいかない。

364 :デフォルトの名無しさん:03/06/18 20:52
>>361
VCなら#pragma onceで一発

365 :デフォルトの名無しさん:03/06/18 20:54
>>363
お互いをincludeするのは論理的におかしいからうまくいかなくてもかまわないと思うぞ

366 :デフォルトの名無しさん:03/06/18 20:57
>>361
ぶっちゃけC++の話題ではない。

367 :デフォルトの名無しさん:03/06/18 21:04
お互いをインクルードて出来ないなら双方向関係ってどうやってやるんですか?

368 :361:03/06/18 21:08
みなさんありがとう。
初心者なものですんませんでした。m(__)m

369 :デフォルトの名無しさん:03/06/18 21:09
>>367
双方向関係が具体的に何を意味するのか知らんが
ヘッダの相互インクルードは全然必要ないとおもうぞ。
実装は普通ヘッダじゃなくてソースファイルに書くんだから。

370 :デフォルトの名無しさん:03/06/18 22:00
>>363 のようにしてれば、互いにincludeしてても別に問題ないだろ。
もしかして >>363 のようにしててもうまくいかない処理系とかあんの?

371 :デフォルトの名無しさん:03/06/18 22:06
お互いにインクルードしてたらプリプロセスで無限に展開されないか?

372 :デフォルトの名無しさん:03/06/18 22:10
>>371
いや、だからそれを防ぐ意味ためのインクルードガード(>>363のようなコード)だろ。

373 :372:03/06/18 22:12
誤:それを防ぐ意味ための
正:それを防ぐ為の

スマソ。

374 :デフォルトの名無しさん:03/06/18 23:26
インライン関数がある場合や
クラステンプレートの場合にはこうやる。

// test1.h
#ifndef TEST1_H
#define TEST1_H
class Test2;
class Test1 {
 // Test2* や Test2& を使って何やらする
};
#include "test2.h"
// Test2* や Test2& の実体を参照するインライン関数の実装
#endif

// Test2.h
#ifndef TEST2_H
#define TEST2_H
class Test1;
class Test2 {
 // Test1* や Test1& を使って何やらする
};
#include "test1.h"
// Test1* や Test1& の実体を参照するインライン関数の実装
#endif

375 :デフォルトの名無しさん:03/06/18 23:30
あ、引数ならポインタや参照じゃなくてもいいね。

376 :デフォルトの名無しさん:03/06/19 00:19
あるライブラリのC言語のソースをC++へ書き直しているのですが、

int Func( arg1)
ARGTYPE *arg1;
{
  .....
}

はどのように書き直せばいいのでしょうか?

int Func(ARGTYPE *arg1){

}

のように書き直してみましたが、別の箇所で引数の数が一致しないとコンパイラに
怒られます。何かキーワードのようなものがあれば教えてください。

377 :_:03/06/19 00:20
http://homepage.mac.com/hiroyuki44/

378 :デフォルトの名無しさん:03/06/19 00:24
>>376
それでいいはず。

379 :デフォルトの名無しさん:03/06/19 00:27
三角行列クラステンプレートを作ったんだけど、
テンプレート引数が double の時だけ
diagonalize(対角化)メンバ関数を定義する、ってことをしたい。
int とか char とかの時には diagonalize を定義したくない。
でも、うまく出来なくて困ってる。

1. partial specialization を使う。
partial specialization を使って
double 用のクラスを別に定義する方法でとりあえずは可能だけど、
その他の定義も全部やり直さないといけないのはエレガントじゃない。

2. diagonalize をデフォルトで無効にする。
デフォルトで例外を投げるとか。
あまり美しくない。

3. 継承して partial specialization する。
実体を返す関数は基底クラスを返すようになってるので、
これを再定義しないといけない。
あとはコンストラクタと代入演算子も。
また、その関数を呼んでいる関数も再定義する必要がある。
これなら 1. を使った方がすっきりして良い。

他に何かいい方法はない?

380 :デフォルトの名無しさん:03/06/19 00:32
STLの話になっちゃうけど、
mapに格納したデータをイテレータで全て表示させると、
キーをもとにして勝手にソートされるのって無効にできないのかな。

381 :デフォルトの名無しさん:03/06/19 00:37
>>379
デフォルトで無効にするのが一番すっきりしてわかりやすいと思うけど。

382 :デフォルトの名無しさん:03/06/19 00:40
>>379
試してないんでうまく行くかどうかわからんが
デフォで diagonalize の宣言だけ提供して
double 用の実装だけ書くって出来ないかな?
double 以外で使おうとするとリンクエラーではじけるかも

383 :デフォルトの名無しさん:03/06/19 00:44
>>380
キー以外に順序づける方法が無いのにそれ以外でいったいどんな順番で表示しろと

384 :デフォルトの名無しさん:03/06/19 00:49
>>382
迂闊!
それ試してなかった。
diagonalize 使わない限りはエラーにならないみたいね。
で、diagonalize 使うとリンクエラーになる、と。
double だけはうまくいく。

ありがとやんした。

385 :デフォルトの名無しさん:03/06/19 00:50
>>383
格納した順に表示させることはできないだろうか。

386 :デフォルトの名無しさん:03/06/19 00:51
>>385
mapは格納した順番を保持しているという保証はないよ。

387 :デフォルトの名無しさん:03/06/19 00:53
>>>379
Policyでも使ってみれば?

388 :デフォルトの名無しさん:03/06/19 00:53
>>379
4. static_assert を使う。

diagonalize() {
 // ここに型がdoubleでないとコンパイルエラーになる式を書く
 // 対角化の計算
 return *this;
}

5. CRTP を使う。

template<class TriM> class typespecific_impl {};

template<typename T>
class TriMatrix : public typespecific_impl< TriMatrix<T> > {
public: // 共通の関数いろいろ
//...
private: // 特定の型に限りたい関数色々
friend class typespecific_impl< TriMatrix<T> >;
TriMatrix& diagonalize_impl() { /*対角化*/ return *this; }
};

template<>
class typespecific_impl< TriMatrix<double> > {
typedef TriMatrix<double> Self;
public:
Self& diagonalize() {
return static_cast<Self&>(*this).diagonalize_impl();
}
};

389 :デフォルトの名無しさん:03/06/19 02:03
C#
これって、C言語の半音アップ版でつか?
シー が セィー って読む?

390 :デフォルトの名無しさん:03/06/19 02:23
C++は言語だけインクリメントされたがそのリターンはインクリメント前とおなじだった。
C#はせめて半音だけでもいいものをと考えられた。

391 :デフォルトの名無しさん:03/06/19 03:18
まぁくだらん言葉遊びよ

392 :デフォルトの名無しさん:03/06/19 08:06
C#だからツィスと読むんじゃないのか。
とどうでもよいレスをしてみるtest.

393 :デフォルトの名無しさん:03/06/19 09:05
>>380
vector に pair 代入すればいいではないか?
必要なときに、sort。
find遅そうだけどな。

394 :デフォルトの名無しさん:03/06/19 11:57
catchした内容をそのままthrow出来ますか?

395 :デフォルトの名無しさん:03/06/19 11:58
>>394
pass

396 :デフォルトの名無しさん:03/06/19 11:58
catch(...)
{
 throw;
}

397 :デフォルトの名無しさん:03/06/19 14:23
>>389
スレ違い
と今更レスをしてみるtest.

398 :デフォルトの名無しさん:03/06/19 16:51
>>389
Cはツェーと読むぞ<ちなみに音階はドだ。
だからC#はドの斜め上にある黒い鍵盤だ。

いいかおまえら、C#はD(レ)になり損ねた黒い鍵盤だ!ワカッタカゴラァ!

激しく板違いなレススレtest

399 :デフォルトの名無しさん:03/06/19 19:48
C++ での無名インナークラスの書き方ってどうするか教えてください。
例えば、
class POINT { int X , int Y , … }  ってのがあって、
Draw (POINT p)   ってのがあるときは、

Draw ( POINT(10,20, …) )

で呼び出せますよね?
この場合 POINT クラスのデストラクタはいつ呼び出されるんですか?

400 :デフォルトの名無しさん:03/06/19 19:50
>>399
foo(){
POINT P(10,20,・・・);
Draw ( P );
}

とおなじ。


401 :デフォルトの名無しさん:03/06/19 20:08
>>400
できれば P(オブジェクト)は生成したくないんです。

相当数のオブジェクトが必要になりそうなんで、new 〜 delete の
繰り返しになりそう・・・。

402 :デフォルトの名無しさん:03/06/19 20:22
何をやりたいのか分からない。
沢山のインスタンスを持つならvecterとか使えばいいんじゃないの?

403 :デフォルトの名無しさん:03/06/19 20:25
ただ単にDrawを沢山よびたいだけなら。

for(int x=0;x<1000;x+=10){
Draw(Point(x,10));
}

とか。
スコープを抜ければ、インスタンスは解放されてデストラクタは呼ばれる。

404 :デフォルトの名無しさん:03/06/19 20:26
お邪魔します。m(__)m
おせてくさい。
typedefですが、これはなんのために
あるのですか?
#defineで十分だと思うのですが。。。

405 :デフォルトの名無しさん:03/06/19 20:31
>>404
関数ポインタの型はどうしましょう。

406 :デフォルトの名無しさん:03/06/19 20:31
>>404
#defineはいろいろ問題がある。
C++的には、More Exceptional C++のItem 35(#DEFINITION)と38(Typedef)を読むべし、
とかいってみたり

407 :デフォルトの名無しさん:03/06/19 20:31
>>404
#defineでどうやって、typedefの代わりをするの?
ちょっと例を書いて見せろ。


408 :デフォルトの名無しさん:03/06/19 20:33
typedef関数ポインタといわずとも

typedef unsigned int uint;

を#defineで定義するのは無理だね。

409 :デフォルトの名無しさん:03/06/19 20:38
>>401
引数に指定した一時オブジェクトは関数の呼び出し前に構築されて
呼出し後に解体される。ただし解体のタイミングが厳密にいつであるかは
規定されてない。

410 :デフォルトの名無しさん:03/06/19 20:41
>>401
一時オブジェクト自体はスタック上に配置され、別にnew/deleteはされないよ。
コンストラクタ、デストラクタも、それが定義されてるなら呼ばれるけど
単なる構造体みたいにそれらを記述してないならオーバーヘッドは無い。

まあDrawに値渡ししてる点でコピーコンスとラクトされるのが気になる程度?

411 :404:03/06/19 20:55
みなさん、しみませんでしたm(TT)m

412 :デフォルトの名無しさん:03/06/19 22:02
>>409
解体のタイミングは、その文を最後まで実行し終えた瞬間だろ?

413 :409:03/06/19 22:08
>>412
一時オブジェクトの生存が保証されるのは関数呼び出し式の終端まで。
その後いつ解体されるかは実装による。

414 :デフォルトの名無しさん:03/06/19 22:45
>>413
なるほど。確かに。

415 :デフォルトの名無しさん:03/06/19 22:59
>>408
なぜ?

416 :デフォルトの名無しさん:03/06/19 23:46
>>408
なんのこと?

417 :デフォルトの名無しさん:03/06/19 23:54
それなら
#define uint unsigned int
って書けないか、ってことだろ。たぶん。
(本人じゃないんで勘違いしてたらスマソ)

418 :デフォルトの名無しさん:03/06/20 00:43
>>417
マクロに渡した時のトークン結合での挙動が
マクロと typedef で違うね。

419 :デフォルトの名無しさん:03/06/20 01:29
>>413
んーと、たしか、完全式の終了までは生存しているはず。
たとえば、

struct A {
int x_;

A(int x) : x_(x) {}

int operator+(const A& a) const {
return x_ * a.x_;
}
};

const A& foo( const A& a ) {
return a; // ※良い子はこんなコードを書いちゃいけません
}

int main()
{
cout << foo(A(2)) + foo(A(3)) << endl;
}


420 :デフォルトの名無しさん:03/06/20 01:45
>>419 意味わかんない

421 :413:03/06/20 01:51
その通りです
>>399 の例では Draw(一時オブジェクトの生成を含む)の末尾までが
完全式になるので、保証されるのは Draw()の終了時までということに
なると思います。言葉足らずでした。

422 :デフォルトの名無しさん:03/06/20 01:51
>>420
+ 演算子を実行する時に A(2) と A(3) の
両方のオブジェクトが生存してることが保証されてるよ、
ってことでしょ。

423 :デフォルトの名無しさん:03/06/20 02:15
1つのコンテナに複数の要素を詰め込めて、要素ごとにソートしたり検索できる
ようなコンテナクラスってどこかにあります?
ようするにオンメモリで動くちょっとしたデータベース的なコンテナというか、
Excelなんかが一番イメージに近いんだけど。
要素の数が予めわかっていれば構造体のvectorとかでもいいんだけど、実行時に
要素数が変更されるような場合はどうしようって感じ。

424 :デフォルトの名無しさん:03/06/20 08:59
>>423
実行時に要素数が変更されるような場合でも、vectorは使えると思うが、
なんかvectorが使えない理由があるの?

425 :r:03/06/20 12:10
コンストラクタの呼ばれる順番がわかんねぇ!!!!
メンバ変数がどの順番で初期化されるのかわかんねぇです。

1. 初期化子の順に初期化される
    漏れが最初に読んだC++の本、柴田望洋先生の
    「CプログラマのためのC++入門(softbank)」には、そう説明してある。
    ただし、これは C++ Release2.0の頃の本。

2. クラス内での、メンバ変数の宣言の順に初期化される。
    ぐぐって見つけた「ttp://www.kab-studio.com/Programing/Codian/Cpp/07.html」
    では、初期化子の順序は関係ないと書いてある。

3. 初期化子の逆順に初期化される。
    cygwinのg++で実験したところ、どうも初期化子の逆順に
    初期化されてるっぽかった...

なにがなんだかわかんねーよ!
この辺の事情に詳しい人、レスお願い。

426 :r/425:03/06/20 12:14
ちなみに、実験に使ったコードはこれ。
#include <iostream>
class Elem {
public:
    Elem( int i ) { std::cout << "create : " << i << std::endl; }
};
class Col {
    Elem e1;
    Elem e2;
    Elem e3;
public:
    Col() : e3(3), e2(1), e1(2) { }
};
int main() {
    Col c;
    return 0;
}

実行結果は
constructed : 2
constructed : 1
constructed : 3

あと、
%g++ --ver
gcc version 3.2 20020927 (prerelease)
ですって。

427 :r/425:03/06/20 12:15
constructed じゃねーよ!
create だよ。てへっち。

428 :デフォルトの名無しさん:03/06/20 13:12
>>425
C++仕様書 12.6.2.5

初期化の順番は以下の通りである。

1.(仮想継承の場合の仕様。省略)
2. 直接の基底クラスのコンストラクタは、
  継承宣言リストに書いた順番で呼び出される。
  初期化指定子の順番は無視される。
3. 静的でないデータメンバはクラス宣言に登場した順番で初期化する。
  初期化指定子の順番は無視される。
4. 最後に、自分自身のコンストラクタが呼ばれる。

註:デストラクタはこの逆順で実行される。

429 :デフォルトの名無しさん:03/06/20 14:54
>>424
vectorが使えないんじゃなくて、構造体が使えないってことです。
要素毎に型が違うから、vectorのvectorというわけにもいきませんし。
(同じ基底クラスから派生させとけばいいんだけどさ)

自分で作るのは大して難しいわけじゃないけど、既に効率的な実装があれば
知りたいなぁと。そこそこ需要のあるコンテナだと思うし。

430 :r/425:03/06/20 15:54
>>429
意味がわかんねぇ!!!
要素ごとに型が違うのにどうやってソートするんだ?


431 :r/425:03/06/20 15:58
operator<とか定義しとけばいいのか。そか。

...だったら別にvectorのvectorとかでもいいんじゃねーの?


432 :r/425:03/06/20 16:46
>>428
ありがと〜
そか...しかし何で宣言順、とかなんだろう....
自分のコード、コンストラクタでこゆの良く書いてる。
危険っぽいので、修正しヨット。

class HanageArray {
int lim;
Hanage* body;
HanageArray::HanageArray( int aLim ) : lim( aLim ), body( new Hanage[lim ] ) {}
};
limとbodyの宣言順が異なると死ぬはず。


...いや、g++ の動きはいいのか?

433 :デフォルトの名無しさん:03/06/20 16:53
>>432
g++ 使ってるという事なので、
-Wall 付けてコンパイルしてみ。
宣言順に初期化子書いてないと警告されると思う。

434 :デフォルトの名無しさん:03/06/20 16:57
>>433
そうそう。g++はそういう点で助かるよね。

435 :r/425:03/06/20 17:21
>>432
俺>...いや、g++ の動きはいいのか?
とか書きましたが、g++は、ちゃんと>>428の解説どおりに動いてますね。

>>433
-Wallだと警告してくれるんですねぇ。
ありがたき★

436 :デフォルトの名無しさん:03/06/20 19:54
C形式の入出力機能(printfなど)と、C++のストリーム形式の入出力機能のバッファを共有すると、
どういうことができますか?

437 :デフォルトの名無しさん:03/06/20 20:04
>>430
mapで言うところのpairの1番目と2番目の型が違うって意味だよ?
1番目の要素は全て同じ型だからソートは普通にできるかと。

438 :デフォルトの名無しさん:03/06/20 21:16
>>423
boost::graph とかは違うかな・・・。
やっぱ違うか・・・。

439 :デフォルトの名無しさん:03/06/20 21:24
c++では、ファイル名指定のとき、\\の代わりに/も許されているみたいですが、みなさんはwindoswの場合どっちを使っていますか?

440 :デフォルトの名無しさん:03/06/20 22:24
>>439
Windows では両方使える API と
片方しか使えない API とがあった気がするし、
パスを返す API はバックスラッシュ(円記号)使って返してくるので、
バックスラッシュを使うので統一しておくのがよろしい。

利便性からユーザがスラッシュも使えるようにしたい、
というのであれば、
それなりのカラクリを使ってバグの出にくいようにすべし。

441 :デフォルトの名無しさん:03/06/20 23:23
組み込み用のヒープ管理プログラムを書きたいんだけど、
ターゲットがまだ手に入らなくて、とりあえず Windows 上で
最低限機能が正しいかどうかテストしたいんだけど
アドレスとサイズをテンプレート引数にしちゃったから
ソースにアドレスを埋め込まなきゃいけない。
だけど Windows なので利用できるアドレスは実行時までわからない。
こんな時どうすればいい?
テスト環境でがっぽりメモリ確保して、そのアドレスをメモして
それをハードコートして再コンパイル以上にいいアイディアってありますか?

442 :デフォルトの名無しさん:03/06/20 23:30
placement newをオーバーロード

443 :デフォルトの名無しさん:03/06/21 00:36
>>441
VC++の__basedとかみたいな、コンパイラ拡張で頑張るとか。

444 :デフォルトの名無しさん:03/06/21 00:37
>>441
アドレスとサイズを実行時引数ではなくて
テンプレート引数にすることによるメリットが思いつかないんだけど、
どんなのがありますか?

445 :441:03/06/21 01:03
>>442
いや、そういう事じゃなくて

>>443
そんなのあるんですね。知らなかった。ちょっと便利かも。
でも VC もってないし、たとえそれでもベース位置が決められない以上は
状況は変わらないですよね。

>>444
アドレスの方は安心感だけですかね。構築もちょっとだけ速くなるでしょうけど
それは些細すぎますしね。
サイズの方は最大サイズのチェックの値がコンパイル時の定数にできるので
微量ですが割り当て時のコストが減らせるはずです。

まぁ総じて「安心感」というメリットがあるっていう感じですが
それを「くだらない」という人は C++ じゃなくて C か汗使えって事で。

446 :444:03/06/21 01:14
>>445
実行時引数にした場合のどんな危険に対する安心感が得られるのか
全然わからないのですが・・・。

> サイズの方は最大サイズのチェックの値がコンパイル時の定数にできるので
> 微量ですが割り当て時のコストが減らせるはずです。
実際に割り当て可能なサイズは結局実行時にしか決まらないのだから、
これもメリットとは思えません。

447 :デフォルトの名無しさん:03/06/21 02:18
素直にがばっと領域とって
そこの先頭アドレスからのオフセットでいろいろすれば

448 :デフォルトの名無しさん:03/06/21 02:20
javaのgenericsについてのスレを見てて思ったんだが
きっと445みたいなやつが増えるんだろうなあ。

449 :デフォルトの名無しさん:03/06/21 02:55
確かに。なぜにテンプレート?って感じだ


450 :デフォルトの名無しさん:03/06/21 03:36
なぜなにテンプレート

451 :441:03/06/21 04:07
>>446
> 実際に割り当て可能なサイズは結局実行時にしか決まらないのだから、
いや、なんか話誤解してると思う。
自分で物理アドレス切ってメモリ管理するって話なんですけど。
標準的な malloc の実装でいう所の初回の sbrk の戻り値を固定にするっていう意味ですよ。
(もちろん足りないからって OS から追加のメモリがもらえるわけではない)

>>447
その「がばっと取る領域」が決められないから困ってるんです。

>>448
Java の generics は駄目だね。あれこそ彼らの言う所の「シンタックスシュガー」そのもので
generic の先にある generative に対応してないね。

>>449
オブジェクトコードに展開された後の姿を思い浮かべてごらん?


452 :デフォルトの名無しさん:03/06/21 04:13
言いたいことがよくわからんのでコードみせてください

453 :441:03/06/21 04:49
>>452
つまりこういう事。

template <byte* addr, std::size_t size>
class CStaticHeap
{
public:
void* Alloc(std::size_t reqSize);
void Free(void* obj);
};

CStaticHeap<0x80000000, 1024> chibiHeap;

void Hoge()
{
int* p = chibiHeap.Alloc(sizeof(int)); // 0x80000000 にあるヒープ領域から int の為の領域か切り分けられるんだろうなぁ
chibiHeap.Free(p);
}

454 :デフォルトの名無しさん:03/06/21 04:49
普通に
char buffer[10000] ;
とかしといて、実際のときは
const char *buffer = 0x0f0f0f ;
とかに変えればいいんではないの

455 :441:03/06/21 04:53
ごめん byte -> void ね。
あとキャスト忘れてたけど気にすんな。

>>454
いや >>453 に晒した擬似コード見てもらえれば
ぜんぜん違う話だってわかってもらえると思う。

456 :デフォルトの名無しさん:03/06/21 05:02
全然分からん。まず
const buffer_size=10000 ;
char buffer_temp[buffer_size] ;
const char *buffer_prac=(const char*)0x0f0f0f ;

template<char *p,int size> class hoge {} ;

hoge<buffer_temp,buffer_size> temp ;
hoge<buffer_prac,buffer_size> prac ;

のような話ではない?

457 :454==456:03/06/21 05:21
455で違うといわれているからなあ
それともWindows環境では動的に確保するというのが441の要請なのか

458 :441:03/06/21 05:23
>>456
あぁ、それでよかったんだわ。
なんで思いつかなかったんだろう?
っていうかなんでこんな簡単な事聞くのにこんなに手間取ってるんだろう。
鬱だありがとう。

459 :441:03/06/21 05:29
>>457==454==456
みんなが「インスタンス確保時のサイズをテンプレート引数にしたがってる」と誤解していると誤解してたから
素直に読んでなかったみたい。
ごめんね、そしてありがとう。

460 :441:03/06/21 05:33
だいぶ蛇足だけど、よく考えたら
「インスタンス確保時のサイズをテンプレート引数にする」は妙案な気がしてきた。
これで実行時コストなしで大きなオブジェクト用のヒープと
小さなオブジェクト用のヒープを分けられるかも。

「なんでそんな事すんねん」って言われるかもしれないけど
マルチスレッド時の直列化部分を別にできるとか、ヒープの分断への対応としては
なかなかいい考えかも。なんて。

461 :456:03/06/21 06:36
ちょっと嘘だった。
const char *buffer_prac=(const char*)0x0f0f0f ;
のところは多分
extern char * const buffer_prac =...
に違いない

462 :439:03/06/21 14:15
>>440
勉強になりました

463 :デフォルトの名無しさん:03/06/21 15:38
コンストラクタの時で
引数の型名が違う時は、
aa(int n=10);
aa(char nn=20);
のようにデフォルト引数は使えないのでしょうか?

464 :デフォルトの名無しさん:03/06/21 15:39
aa()をどうやって区別するんだよ

465 :デフォルトの名無しさん:03/06/21 15:56
キャスト

466 :444:03/06/21 16:03
>>441
453と↓を比べたときの利点が未だにわからないのですが、解説お願いできますか?
class CHeap
{
public:
 CHeap(void* addr, std::size_t size);
 void* Alloc(std::size_t reqSize);
 void Free(void* obj);
};
CHeap chibiHeap(reinterpret_cast<void*>(0x80000000), 1024);


467 :デフォルトの名無しさん:03/06/21 18:15
>>441
メモリ管理はアロケータでやってください。
そして、手持ちのコードは捨てて。おねがいだから。

468 :デフォルトの名無しさん:03/06/21 18:39
質問。
std::string str;
size_t pos;
で、pos >= str.size() のとき、str.find("hoge", pos); は正しく動作(nposを返す)しますか?
それとも未定義な動作でしょうか。

469 :_:03/06/21 18:43
http://homepage.mac.com/hiroyuki44/

470 :デフォルトの名無しさん:03/06/21 18:48
>>468
nposを返す、と定義されている。

471 :デフォルトの名無しさん:03/06/21 20:16
>>460
> 「インスタンス確保時のサイズをテンプレート引数にする」は妙案な気がしてきた。
いやたぶんそれ、7,8年前からの常識だと思う。

472 :468:03/06/21 20:32
>>470
ありがとう。実際、文字列にアクセスする前に結果がわかるわけだから、
例外を投げなくてもいいわけですね。

473 :デフォルトの名無しさん:03/06/21 20:51
> 文字列にアクセスする前に結果がわかるわけだから、例外を投げなくてもいい
ヘンな納得の仕方すんなよ。

474 :デフォルトの名無しさん:03/06/21 21:42
もまいら!こんばんわです。
会社勤めの人ご苦労さまですm(__)m
質問おながいします。
c++のdeleteオペレータですが、
char* psz=new char[10];
と宣言、初期化した場合
delete [] psz;
で破棄するとのことですが
これってコンパイラがpszには配列が入っている
と分かっているのになんで[]なんて書く必要が
あるのですか?
また
char* tmp;
tmp=psz;
delete [] tmp;
と書いてもちゃんと走りました。
コンパイラはポインタ変数を見たら
それが配列か配列でないかどうやって
わかるんですか?
長文スマソ。。。


475 :デフォルトの名無しさん:03/06/21 21:48
> コンパイラはポインタ変数を見たら
> それが配列か配列でないかどうやって
> わかるんですか?
それがわからないからdelete[]があるんだよ。

まぁそんなもん使わずになるべくvectorで済ましとけ。

476 :デフォルトの名無しさん:03/06/21 21:49
>>474
動いたのはたまたま。

477 :474:03/06/21 21:53
>>475
>それがわからないからdelete[]があるんだよ。

なるへそ。じゃあ次元はどうやってわかるんですか?

478 :デフォルトの名無しさん:03/06/21 21:55
>>477
次元は型からわかるだろ。
最も次元がわからなくてもdeleteは正しく動くだろうけど

479 :デフォルトの名無しさん:03/06/21 21:57
>>477
次元じゃなくて大きさだろう?

480 :474:03/06/21 21:59
>>478
すみません。次元ではなく要素数ですた。。。



481 :デフォルトの名無しさん:03/06/21 22:02
>>474
配列形式で new した場合、
本当に確保される領域は (クラスのサイズ)×(要素数)+α だ。
単体で new した場合にはこういう余分なものは付かない。

このαがいくつかはコンパイラ依存だけど、
大抵は確保した数を保存するための領域のサイズ
(多分4バイト)になると思う。
これはデストラクタを呼ぶときに必要になる。
+αを許している仕様は、こういうことができるようにするためらしい。
実際に new から返されるアドレスは、確保されたメモリの先頭+αになる。

ここで重要なのは、ポインタ変数を見ただけでは+αがあるか分かんないってことだ。
だから+αがあるものとないもので解放処理は変わってくるので、
delete [] と delete をきちんと使い分ける必要が出てくるわけだ。

そのコードがたまたま動いてるのは、多分基本型でデストラクタがないからだと思う。
そのコンパイラは基本型の場合はα=0にしてるんじゃないかな。
でもこういうのはコンパイラ依存なんで、それに頼ったコードは書いちゃダメ。
一応+αをつけるコンパイラがあったら、
メモリを解放させる位置がαだけずれるので変になる。

482 :474:03/06/21 22:05
>>481
確かにデストラクタはありませんです。
本当にすっきりしますた。TT
どうもありがとう。。。

483 :デフォルトの名無しさん:03/06/21 22:06
>char* tmp;
>tmp=psz;
>delete [] tmp;
>と書いてもちゃんと走りました

無問題。

484 :デフォルトの名無しさん:03/06/21 22:11
>>481
俺もすっきりした。
あんたみたいな良い人がいると本当助かるよ。

485 :デフォルトの名無しさん:03/06/21 22:26
>>481
そういう知識ってどこで手に入れるのですか?

486 :デフォルトの名無しさん:03/06/21 22:53
>>485 >>3

487 :デフォルトの名無しさん:03/06/21 22:55
>>486
m(__)m

488 :デフォルトの名無しさん:03/06/21 23:25
> const A& foo( const A& a ) {
> return a; // ※良い子はこんなコードを書いちゃいけません
> }
この関数を抜けた時点で、デストラクタが呼ばれてaがあぼーん
( ̄Д ̄;)

489 :デフォルトの名無しさん:03/06/21 23:28
>>488
実体持ってないのにデストラクトするの?

490 :デフォルトの名無しさん:03/06/21 23:40

>c++のdeleteオペレータですが、
>char* psz=new char[10];
>と宣言、初期化した場合
>delete [] psz;
>で破棄するとのことですが
>これってコンパイラがpszには配列が入っている
>と分かっているのになんで[]なんて書く必要が
>あるのですか?
仕様です。

>また
>char* tmp;
>tmp=psz;
>delete [] tmp;
>と書いてもちゃんと走りました。
>コンパイラはポインタ変数を見たら
>それが配列か配列でないかどうやって
>わかるんですか?
>長文スマソ。。。
たぶん区別せずに解放しちゃって、後々バグの元になると思います。

491 :デフォルトの名無しさん:03/06/21 23:43
>>490 うざい

492 :デフォルトの名無しさん:03/06/21 23:45
最近感じてることだけどC++って思ってたより普及していないような気が・・・
C#の方が勢いがあるような・・・

493 :デフォルトの名無しさん:03/06/21 23:47
>489
参照元のデストラクタが呼ばれる。
コピーコンストラクタと言う物を調べてください。

494 :デフォルトの名無しさん:03/06/21 23:48
このスレは玉石混交ですな。

495 :デフォルトの名無しさん:03/06/21 23:50
>>488,>>493
いいかげんなこといってんじゃねぇよ。

496 :デフォルトの名無しさん:03/06/21 23:50
クラスのメンバポインタ使う時ってありますか?

497 :デフォルトの名無しさん:03/06/21 23:51
>>493
コピーコンストラクトされる場所がないような・・

498 :デフォルトの名無しさん:03/06/22 00:00
>497
どういう意味ですか?
コピーされてないので、問題だと言ってるのですが?


499 :デフォルトの名無しさん:03/06/22 00:01
>>498
どんな問題が発生するのか、実例だしてくんろ

500 :デフォルトの名無しさん:03/06/22 00:05
例えるならこんなかんじだろ?

const A* foo( const A* a ) {
return a;
}

激しく問題ねーじゃねーか。

501 :デフォルトの名無しさん:03/06/22 00:07
> const A& foo( const A& a ) {
> return a; // ※良い子はこんなコードを書いちゃいけません
> }
a は参照だからコピーコンストラクタは呼ばれないし、
だからこの中でデストラクタも呼ばれない。

ここで問題になるのは、a が一時オブジェクトかもしれないということだ。

502 :デフォルトの名無しさん:03/06/22 00:09
確かに一時オブジェクトのときは:
const A& a = foo( A() );
この実行後、aの実体はデストラクトされてるかもしれんね。

対して
const A& a = A();
このときはaのスコープの範囲まで一時オブジェクトの生存が延長されるんだっけ。
そういう意味では落とし穴ではあるか。


503 :デフォルトの名無しさん:03/06/22 00:09
>>501
一時オブジェクトでもfooには何も問題ないと思うんですけど。

504 :デフォルトの名無しさん:03/06/22 00:18
>>502
その通り。

505 :500:03/06/22 00:28
まだまだ修行がタリンでした。

506 :デフォルトの名無しさん:03/06/22 21:03
func(string s)
{
...
}
とあって

func(string("aaa"));
という風に呼んでいるコードがある。

stringオブジェクトって名前無しオブジェクトになるのでしょうか?
このスコープから抜けたらデストラクタが呼ばれるのでしょうか?
関数を呼び出したときにはコピーコンストラクタが呼ばれている?


507 :デフォルトの名無しさん:03/06/22 21:12
全然問題ない

508 :デフォルトの名無しさん:03/06/22 21:14
でも普通
void func(const string& s){}
void test()
{ func("test"); }
こうする。

509 :デフォルトの名無しさん:03/06/22 21:16
意味合いが違ったね

510 :506:03/06/22 21:21
>>508
thanks!

うちの処理系だと "test" は const char * と認識されて
コンパイル通らないんです。



511 :506:03/06/22 21:38
class Test {
public:
Test()
{ cout << "Test::Test()" << endl;
}
Test(const Test& test)
{ cout << "Test::Test(const Test& test)" << endl;
}
virtual ~Test()
{ cout << "Test::~Test()" << endl;
}
};
とありまして

func(Test test)
{ ...
}
とあります。

test()
{ func(Test());
}
と呼び出すと
オブジェクトが途中で消失してしまいます。
コピーコンストラクタが呼ばれない。

なぜ string だと上のようなことがOKなのでしょうか?


512 :デフォルトの名無しさん:03/06/22 21:56
const char* から std::string へは暗黙の変換が行われるはず。
511のコードはコンパイルできないはずだが、関数の引数の話に限れば、
それで問題ないはず。

まともな処理系じゃないんじゃないの?

513 :デフォルトの名無しさん:03/06/22 22:21
A->method(new B());

C++ でこういうのあり?
これデーモンプログラムなんだけど。
どこにも delete がないんだよね。


514 :デフォルトの名無しさん:03/06/22 22:25
>>513
それだけの情報で判断できるヤツなどいないと思われ。

515 :デフォルトの名無しさん:03/06/22 22:28
>>515
俺様がいる

516 :515:03/06/22 22:29
誤爆った(TДT)

517 :デフォルトの名無しさん:03/06/22 22:29
>>513
処理系によりけりかな?


518 :デフォルトの名無しさん:03/06/22 22:30
>>517
どういうこと?

519 :デフォルトの名無しさん:03/06/22 22:32
>>513
昔BorlandのOWLだか(いやもっと前か?)では
new TWindow(parent, ...);
とかいうふうにnewの戻り値を受け取らない構築が普通なやつがあったような。

とにかく受け取り手が開放の責任を持つとかなってるんじゃないの。

520 :513:03/06/22 22:33
このデーモン、メモリ使用量が目茶目茶多いんですが・・・
190MB越えている・・・


521 :デフォルトの名無しさん:03/06/22 22:35
>>520
で、ここで何を答えて欲しいんだ?

522 :デフォルトの名無しさん:03/06/22 22:37
class A {
  method(B* obj) {
    ...
    delete obj;
  }
}

A->method(new B());

523 :513:03/06/22 22:37
>>520
引き継いだプログラムなんですが
明示的に delete するべきですよね。



524 :デフォルトの名無しさん:03/06/22 22:40
明示的にって・・・

525 :デフォルトの名無しさん:03/06/22 22:45
>>513
必ずしもそうとはいえないけど。

526 :デフォルトの名無しさん:03/06/22 22:45
ガベージコレクションも調べてみて

527 :デフォルトの名無しさん:03/06/22 22:48
placement newでdeleteの必要を無くす場合もあるんじゃない

528 :デフォルトの名無しさん:03/06/22 23:23
method 内部で何してるか分かんないのに
自分で delete する必要性があるのかなんて分からん。

method の引数の型が auto_ptr<B> だったり、
内部で delete してたり、
A 内にポインタを保持しておいて、
別のタイミングで勝手に delete してくれたりする場合は
何もしなくていいわけだし。

529 :デフォルトの名無しさん:03/06/22 23:37
>>528
auto_ptrのコンストラクタはexplicitだからあそこではマッチしないけどな(笑)

530 :デフォルトの名無しさん:03/06/23 00:05
あー、explicit やったんや。スマソ。

531 :441:03/06/23 00:37
>>466
もう書いてある。もう一度書いてもあなたはそれを利点だとは思わないから理解してもらえない。
一つだけあるのは >>446 であなたが否定した事。これはここまでのやりとりで
あなたが誤解してただけで、微かな利点である事はわかってもらえるかなとも思う。

>>467
あれがメモリーアロケータですが何か?
っていうか、sbrk も HeapAlloc もない環境なんだよ。
自分でヒープ管理書かなきゃ駄目なの。
メモリー無尽蔵な PC での富豪的プログラミングの経験しかない香具師はすっこんでろ。

>471
おじいちゃん。ぼく最近まで C++ 知らなかったんだ。
てんぷれーとっていうのも最近つかいはじめたばっかりなんだお。


532 :デフォルトの名無しさん:03/06/23 00:43
そういう悪態をつくと正しくても味方しようとは思わなくなるもんだ。

533 :デフォルトの名無しさん:03/06/23 00:47
ヒープ管理なんて要らね
0x9FFFFまでは俺様の領域

534 :デフォルトの名無しさん:03/06/23 01:00
>>467の言ってる意味を全然理解してないな バカ?

535 :444:03/06/23 01:28
>>531
> 一つだけあるのは >>446 であなたが否定した事。これはここまでのやりとりで
> あなたが誤解してただけで、微かな利点である事はわかってもらえるかなとも思う。

「わからない」と言って解説お願いしたのに、「わかってもらえるかなとも思う」とは、
勝手な妄想の激しい方ですね。

安易にテンプレートを使うことによるデメリットを受け入れた上で、
その微かな利点を優先させるほどの理由がわからない。
と、こういうわけで、解説お願いしたいのですが、いかがでしょうか?

536 :ひよこ名無しさん ◆ZCZKn7MbRM :03/06/23 01:40
構造体を表す struct ですけど、正式な名称って
・structure
・structural
どちら?

随分マニアックな質問ですが、よろしくお願いします。

537 :デフォルトの名無しさん:03/06/23 01:42
>>536
C言語より英語を勉強したほうがいいぞ

538 :デフォルトの名無しさん:03/06/23 01:43
>>536
中学校の英語のレベル。
品詞ってわかりますか?

539 :441:03/06/23 01:53
>>532
煽りには煽りで応じるのが2ちゃんの礼儀だと思ってたんだけど。

>>533
0xA0000 からは何がはじまるのですか?

>>534=>>467
おまえの脳内の事なんて知るかばか

>>535
>「わからない」と言って解説お願いしたのに、「わかってもらえるかなとも思う」とは、
勝手な妄想の激しい方ですね。
ワケワカラン。「おまえのいってる事が全部わからない」に対して「これだけはわかってもらえるか?」は
受け答えとして何かおかしいですか?

> 解説お願いしたいのですが、いかがでしょうか?
だってあなた実利主義者でしょ?
「ここの具合がこう美しい」とか(目に見えない心理的な利益を)説明しても
共感してくれないって、今までのやりとりから感じられるんだもん。
あとヒープ管理なんて一度書いたら滅多に直さないからテンプレートにするデメリットはたいしてないという罠。




540 :デフォルトの名無しさん:03/06/23 01:54
「随分マニアックな」

541 :デフォルトの名無しさん:03/06/23 01:54
structuralism

542 :デフォルトの名無しさん:03/06/23 01:56
問題は片付いたんだろ?しつこいよ

543 :デフォルトの名無しさん:03/06/23 01:57
rhythm red beat black

544 :デフォルトの名無しさん:03/06/23 01:58
「安易にテンプレートを使うことによるデメリットを受け入れた上で」
の「安易に」って部分に
「俺はテンプレートの利点も欠点も分かってるんだ」って雰囲気が読み取れる。
単純に煽ってるだけだな。

545 :デフォルトの名無しさん:03/06/23 02:01
いや俺もテンプレートをわざわざ使う意味がわからない。
何のためにつかうんだろ?
>>466じゃダメなの?


546 :デフォルトの名無しさん:03/06/23 02:05
こんなところで何を聞いてもだめさ。
ヒープ管理?ああOSが勝手にやってるだろってなレベルしかいないから。
こいつらじゃ標準入出力程度のコードも書けないだろ。

547 :デフォルトの名無しさん:03/06/23 02:11
>>546
だから偉そうにいうなら教えてくれよ。FreeBSDのソース嫁とか言うなよ

548 :デフォルトの名無しさん:03/06/23 02:15
>>547
>>546はFreeBSDなんて知りません。

549 :444:03/06/23 02:36
> ワケワカラン。「おまえのいってる事が全部わからない」に対して「これだけはわかってもらえるか?」は
> 受け答えとして何かおかしいですか?

535でそう受け答えしたつもりなら、文章にもっと気をつけてください。
少なくともあの文章では、どうやっても「わかってもらえるか?」などという解釈には至りません。
で、「わかってもらえるか?」に対する答えは「それはわかります」です。

> だってあなた実利主義者でしょ?
> 「ここの具合がこう美しい」とか(目に見えない心理的な利益を)説明しても
> 共感してくれないって、今までのやりとりから感じられるんだもん。

あなたの勝手な観察結果などどうでもいいですから、解説してもらえませんか?
実利面で共感してもらえないと自覚している実装を
(おそらく実際の仕事で)選択する理由もわかりません。

> あとヒープ管理なんて一度書いたら滅多に直さないから
> テンプレートにするデメリットはたいしてないという罠。

テンプレートを使った場合のデメリットが
ソースの修正時にしか発生しないということですか?
そんなことはないと思いますよ。

550 :441:03/06/23 02:43
>>542
正直、スンマソンかった。

>>543
趣味同じだね。

>>544
俺やっぱ煽られてますか?

>>545
心理的な物。その方が生成物が美しそうな気がするだけ。

>>546
って言えるくらいラベルの高いあなたがいるじゃないですか。

ラベルの高い人ハッケソしたので質問ー。
日本で買える本でヒープ管理とかについての良本ってないかな?
Modern C++ design のは遅すぎだし(サイズについては最適化されてる?)、
Efficient C++ のは事実上のリーク(プール管理オブジェクトの解体まで一切解放しないじゃねーかばかぁ)だし、
みんなもっともらしい嘘ばっかりなんだよね。

Efficient C++ の参考書籍の Secrets of C++ Master ってのを買おうと思ったら
Amazon では品切れだし、他では売ってないし、Amazon 以外で洋書買ったことないし…。

非 PC な世界では日常的なテーマな気がするんだけど、なんでこんなに参考書がないんだろう?

551 :441:03/06/23 02:54
>>549
> 535でそう受け答えしたつもりなら、文章にもっと気をつけてください。
すまんすまん。お互い文章にはもっと気を使わなきゃいかんね。

> (おそらく実際の仕事で)
ごめんこれ趣味。仕事の時はもっと気を使ってます(そもそもテンプレート使ったコード読めない人も多いので)。

> あなたの勝手な観察結果などどうでもいいですから、解説してもらえませんか?
> 実利面で共感してもらえないと自覚している実装を
うまく言葉にはし難いんだよね。あえて言うなら
オブジェクトコードみた時に、専用に見えるような(汎用性がないように見える)美しさ。かな。
まさしく実利とはまったく関係ない「おいらの(おいらの)世界(せかい)やっほ(やっほ)やほほほ(やほほほ)」てな感じなわけですが。

> テンプレートを使った場合のデメリットが
> ソースの修正時にしか発生しないということですか?
> そんなことはないと思いますよ。
似たようなコードの重複やそれが回避された時の最適化の抑制を心配してる?
最近のコンパイラだとできるだけ重複しないようにしてくれるし、
最適化も既知の型の部分には他と変わらないようにかかるはずだけど。

552 :デフォルトの名無しさん:03/06/23 03:41
> ごめんこれ趣味。
趣味で組み込み用?・・・某携帯ゲーム機でしょうか。

> テンプレートを使った場合のデメリット
exportをサポートしない処理系では、ほとんどの実装をヘッダに晒す羽目になる。
メモリ管理アルゴリズムとして再利用しようと思っても、コンパイル時に決定する引数しか渡せない。
など。

> オブジェクトコードみた時に、専用に見えるような(汎用性がないように見える)美しさ。かな。
なるほど。共感しかねます。

ヒープ管理の自作なら、本なんか買わなくても、
googleで十分な記事が拾えると思いますよ。
参考書が無いのもそのせいではないでしょうか?

553 :デフォルトの名無しさん:03/06/23 06:33
>>441
>Modern C++ design のは遅すぎだし(サイズについては最適化されてる?)、
おまえはばか?これはtemplateを使うための入門本だよ。
まさか、Lokiをそのまま使って喜んでないよな。


554 :デフォルトの名無しさん:03/06/23 14:22
そろそろ441には消えて欲しいんだが。
真面目な話は大いに結構だが、煽りながらやる必要もあるまい。

555 :デフォルトの名無しさん:03/06/23 17:43
あるモジュール(ハードウェアデバイスを管理するもの)を考えていて、
それをクラスにするか名前空間にするかで悩んでいます。
初期化・終了処理が必要なのでクラスにしたい気もするんですが、
インスタンスを複数生成されると困るので名前空間のほうが良いような気もします。
よろしければアドバイスをお願いします。

556 :デフォルトの名無しさん:03/06/23 17:48
シングルトーン!

557 :デフォルトの名無しさん:03/06/23 17:56
allocatorは未完成だからな

558 :デフォルトの名無しさん:03/06/23 18:01
コピーコンストラクタっていまいちわからんが、自分のクラスを実体化して
それを引数にさらに自クラスを呼ぶってこと?Cの再帰処理みたいな感じですか?

559 :デフォルトの名無しさん:03/06/23 18:01
>>556
サンクスです。良さそうです。検討してみます。

560 :デフォルトの名無しさん:03/06/23 18:24
>>558
その言葉遣いで言えば、実体化するときに同じクラスの
既にあるインスタンスを参考にすること。じゃないか?

561 :デフォルトの名無しさん:03/06/23 18:25
>>558
初期化時にしかコピーコンストラクタは呼ばれないんだから
自分自身が引数になることはあり得ませんです。

562 :デフォルトの名無しさん:03/06/23 18:37
new で割り当てたメモリに対して
realloc でメモリを再割り当てしても大丈夫なのでしょうか?
何か後々問題とか出るのでしょうか?

563 :デフォルトの名無しさん:03/06/23 18:41
>>562
んなことやるな

564 :デフォルトの名無しさん:03/06/23 19:37
>>562
reallocが必要なときはstd::vectorなどがあります。
C++ではどうしても必要なとき意外mallocすらつかわない。

565 :デフォルトの名無しさん:03/06/23 19:53
>>564
>C++ではどうしても必要なとき意外mallocすらつかわない。
後学のために教えてくれ。
どういった場合に必要なんだ?
俺はそういった場面に出くわしたことがないのだが。
リソースが限られている環境とかか?


566 :デフォルトの名無しさん:03/06/23 19:59
コーディング規約:STL使用禁止

567 :566:03/06/23 20:00
あ、いやなんでもない。

568 :デフォルトの名無しさん:03/06/23 20:09
最初に確保した容量だけを使いまわす場合とかだろ
実行の中途でメモリ確保に失敗して(きちんと終了処理してまたは
何もしないで)終了するアプリケーションがあるが、
一番よいのは最初にのみ確保してみて失敗すれば実行しないことだろう。

MS Officeはメモリ確保に失敗すると遠慮なく落ちるがあれは最悪
セーブダイアログを出そうとしたタイミングとかだともうやるかたなし

569 :デフォルトの名無しさん:03/06/23 20:26
>558
クラスがコピーされるときに呼ばれる、コンストラクタのこと。
特別なコンストラクタがあるのじゃなくて。
引数が違うだけ。


570 :デフォルトの名無しさん:03/06/23 20:26
>>565
たとえばへたれMFCがCWinApp::m_pszProfileNameの開放にfree()を使ってたりするときとか。

571 :562:03/06/23 20:27
>>563
>>564
realloc はやっぱりまずいですか。
std::vector を調べてがんばってみることにします。

572 :デフォルトの名無しさん:03/06/23 20:28
>>565
new をオーバーロードしたい時とか。

573 :デフォルトの名無しさん:03/06/23 20:35
boost exeでかくなるし、メモリーも食うよー
これ生姜ないの?

便利さの犠牲
どうしよう?

574 :デフォルトの名無しさん:03/06/23 21:44
しかたないね。C++は型ごとにコードを複製しているから。
その点Javaのgenericsはコードを複製しないから最高だよ。

575 :デフォルトの名無しさん:03/06/23 22:08
>>574
その代わり実行速度は(略

576 :デフォルトの名無しさん:03/06/23 22:17
>>573
それを補ってあまりある強力さがあるように思うが。

>>574
Javaはメモリ管理しなくていいぐらい
本体がメモリを食うからなぁ…

577 :デフォルトの名無しさん:03/06/23 22:20
>>574
>最高だよ。
こいつ死滅系スレにいるバカだな。トレードオフのことを全然分かっちゃいない。

578 :デフォルトの名無しさん:03/06/23 22:21
boost::regex++使ったらあっという間に実行ファイルサイズが2MB超えた…

579 :デフォルトの名無しさん:03/06/23 22:35
>>576
サイズが大きいってのを補えるわけないじゃん。バカ?

580 :デフォルトの名無しさん:03/06/23 23:55
STLつかうと一気に実行ファイルサイズが10倍に?!

581 :デフォルトの名無しさん:03/06/23 23:58
>580
1の十倍と10の十倍は違うからなぁ

582 :デフォルトの名無しさん:03/06/24 00:02
結構時間かかって納期がおした物件納品するときに
フロッピーに収まるサイズだったらなんか気まずいよね。


583 :デフォルトの名無しさん:03/06/24 00:03
サイズが大きいからといって使わないのは馬鹿
そういう奴はWindowsもUNIXも使うな。MS-DOSでも使ってろ

584 :デフォルトの名無しさん:03/06/24 00:11
サイズよりエラーメッセージが呪文のようになることのほうが問題
スクリプトで加工したりしてめんどい

585 :デフォルトの名無しさん:03/06/24 00:12
まぁ、UPXとかで圧縮という手もあるわけだが。

586 :デフォルトの名無しさん:03/06/24 01:44
サイズ気になるならC++をつかうな

587 :デフォルトの名無しさん:03/06/24 01:45
>>586
では何を使えと?

588 :デフォルトの名無しさん:03/06/24 01:48
>587
マシン語

589 :デフォルトの名無しさん:03/06/24 01:55
そういや昔マシンマンってあったな。
マシン空間光に乗って〜

590 :デフォルトの名無しさん:03/06/24 01:59
>>587
スクリプト言語だと、とりあえずファイル容量だけは減らせるYO!
それに意味があるかは別として。

591 :デフォルトの名無しさん:03/06/24 05:19
WHSに決まってんじゃん

592 :神戸市民:03/06/24 05:39
質問させて頂きます。
当方、ボーランドC++コンパイラー(無料の物)を使用しております。

キーの入力時に、エンター(リターン)キーを押さずに、「a」を
押したらそのまま「a」と入力されるようにする事は可能でしょうか?

「DOS窓で動作するテキストベースのRPG」の「キャラクターの移動」で、
現在は「a」「エンター」「a」「エンター」「a」「エンター」・・・
とキーを打っています。



593 :デフォルトの名無しさん:03/06/24 06:47
Windowsのコマンドプロンプトはほとんど何も出来ない。
Win32APIのConsoleなら色々できるがWindowsProgrammingになる。
conio.hを用いればMS-DOSプロンプト用(激ノロ)になる。

#include<conio.h>
int getch(void);エコーなし一文字入力
int getche(void):エコーあり
int kbhit(void);キー入力有無のチェック
void gotoxy(int x,int y);カーソルの移動
int wherex(void);カーソル位置x
int wherey(void);y
void clrscr(void);画面消去
void textcolor(int newcolor);文字の色

594 :デフォルトの名無しさん:03/06/24 14:09
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), ENABLE_ECHO_INPUT)

595 :神戸市民:03/06/25 00:18
>>593
ありがとう御座います。
ウインドウズAPI使ったら出来るのですね。

週末にでも、書籍買ってきます。




596 :デフォルトの名無しさん:03/06/25 00:27
>>595
止 め と け 。

自前でウィンドウを作って
背景を黒に塗りつぶして作るほうがはるかにマシ。

597 :デフォルトの名無しさん:03/06/25 00:30
GCC でコンパイルしたプログラムを GUI でデバッグできるデバッガってありますか?
GUI のデバッガ付きのコンパイラで、テンプレートがイケてるのでもいいのですが。
CodeWarrior ってテンプレートはどうなんでしょうか?
ご存知の方いらっしゃいましたらよろしくお願いします。

598 :596:03/06/25 00:32
って質問よく読んでなかった。スマソ。

599 :デフォルトの名無しさん:03/06/25 00:37
>>597
gdb

600 :デフォルトの名無しさん:03/06/25 00:42
char型の可変長配列を vector<char> buf; とでも定義して、bufにいろいろ
操作をします。
次に、char型の配列の先頭アドレスを要求してくる関数にbufを渡したいん
ですが、これって普通に &buf[0] とやっちゃっていいもんでしょうか?
vector内のバッファのアドレスを取る関数とかがあれば、それを使うのが
適当だと思うんですが、見当たらないもので。

601 :デフォルトの名無しさん:03/06/25 00:44
何かの本に
「vectorは引数に配列を取るようなレガシー関数との互換性がある」
って書いてあったけど本当かどうか試したことないからわからん

602 :デフォルトの名無しさん:03/06/25 00:48
>>600
OK。
EffectiveSTLかなんかで
○ &buf[0]
× buf.begin()
って読んだ覚えがある。試したことないから漏れも知らんが。

603 :デフォルトの名無しさん:03/06/25 00:48
>>597
> GCC でコンパイルしたプログラムを GUI でデバッグできるデバッガってありますか?
insight, ddd
> GUI のデバッガ付きのコンパイラで、テンプレートがイケてるのでもいいのですが。
文句なしに VC++.NET 2003。
> CodeWarrior ってテンプレートはどうなんでしょうか?
Lokiの開発環境であったくらいにOk。

604 :r:03/06/25 00:52
>>600
std::vectorって、そこまで内部構造が外に透けて見えてるのかなぁ。
charの可変長配列が、ナル終端される...つまり文字列だったら
std::stringを使いさえすれば万事OKなんだろうけど、
そうしてないのは、きっとstd::vectorを使うことになんか意味があるんだろうなぁ。

&buf[0] よりも、 ((char*)buf)[0]のほうがよさそうな気もするなあ。

あー、適当なことばっかりゆってて、信用されたら嫌だなぁ。

605 :600:03/06/25 00:53
>>601-602
なるほど、ありがとうございます。
動いてはいるけど不安が拭いきれなかったんですが、すっきりしました。

606 :597:03/06/25 00:57
みなさんレスありがとうございます。

>>599
gdb って GUI 版もあるんですか?それよりも Windows でも使えるんでしょうか?

>>603
情報ありがとうございます。 insight と ddd というのは知らなかったので
調べてみますね。
Loki は CodeWarrior で書かれたのですかー。じゃあ十分購入候補になりそうです。
で、VC++.NET は大丈夫なのでしょうか?2003ってメジャーバージョン上がってるんでしたっけ?
cl.exe 13.x は無料のを触ってみたのですが、VC6 の頃からたいして変わってなかった印象なのですが…。

607 :デフォルトの名無しさん:03/06/25 00:57
>>604
> ((char*)buf)[0]
それは動かない可能性が大いにあるぞっていうか意味全然ちげーし。

608 :デフォルトの名無しさん:03/06/25 00:58
> &buf[0] よりも、 ((char*)buf)[0]のほうがよさそうな気もするなあ。
どこか感覚が狂っていると思われ。

609 :デフォルトの名無しさん:03/06/25 00:58
>>602
buf.begin() が返すのは iterator

>>604
> &buf[0] よりも、 ((char*)buf)[0]のほうがよさそうな気もするなあ。

意味不明

610 :r/604:03/06/25 01:00
607-609
指摘サンクス。
つーか、すまん。

611 :デフォルトの名無しさん:03/06/25 11:02
enumの要素数を取得したり、pascalでいう、lowやhiを取れますか?

612 :デフォルトの名無しさん:03/06/25 11:05
取れません。

613 :デフォルトの名無しさん:03/06/25 11:24
有難うございます>>612

じゃ、みなさんどうやって固定値保存されてるんでしょう。
無理やりSTLのvectorとかに入れて、sizeやlow、highを取れるようにしたり、なんかします?

614 :デフォルトの名無しさん:03/06/25 11:29
>>613
どういうことがしたいのか例示キボン
まあ普通そもそもlow, highなんて使わずに定数名を直接書いたりしてる気が < C/C++

615 :デフォルトの名無しさん:03/06/25 11:37
>>614

例えば、全テーブルに操作に処理を行うとかです

for (int iCount = low(EnumTable); iCount < high(EnumTable); iCount++)
  Proc(TableNameArray[iCount]);

616 :デフォルトの名無しさん:03/06/25 11:40
>>615
テーブルなら添え字は列挙ではなく整数で、普通vectorとかなので
「無理やり」という感覚ではなく、普通に
for(Table::iterator p = table.begin() ; p != table.end(); p++ ) {
 Proc(*p);
}
なかんじ

617 :デフォルトの名無しさん:03/06/25 11:42
なるほど。>>616
で、念のため確認ですが、固定値をenumじゃなくて、stl保存しててもふつー、ですか?

618 :デフォルトの名無しさん:03/06/25 11:45
>>617
「stl保存」の意味がわからんが・・

619 :デフォルトの名無しさん:03/06/25 11:49
>>618
保存じゃなかった、記述。
固定値をソースコードに記述する場合に、
enumじゃなくて、vectorクラスを一個用意してても、変と思われないですか?
という意味です。

620 :デフォルトの名無しさん:03/06/25 11:53
>>619
それが指す先がテーブルの添え字で、上下端を表すだけの意味なら
vectorとかを使うだけだな。

その定数がテーブルの添え字じゃないのてならenumかcont intなどだけど。
(添え字でもenumも使うこともあるが、あくまでも特定のインデックスに特別な意味があるとき)

621 :デフォルトの名無しさん:03/06/25 12:58
NoneからEndまでのループのんが自然ですかね?

enum TestNumber {
TestNumber_None = 0,
TestNumber_Data1,
TestNumber_Data2,
TestNumber_End,
};

for (iCount = TestNumber_None; iCount < TestNumber_End; iCount++)
Proc(TableNames[iCount]);


622 :デフォルトの名無しさん:03/06/25 13:06
そのTableNameArrayとやらが定数の配列で、配列の上下端をループの
境界に使いたいなら、上下端も定数にしとけばいいじゃん。

それが一番普通と思われ。

623 :デフォルトの名無しさん:03/06/25 13:14
>>622
じゃ、上下指定値もenumメンバにしときます。

で、TableNamesみたいなのは、
char const *TableNames[5] = {
"Table1",
"Table2",
"Table3",
};
で、良いですよね?

624 :デフォルトの名無しさん:03/06/25 13:23
>>623
なんで[5]で中身が3つなんだ?

定数配列なら不一致を防ぐためにむしろ
((sizeof TableNames)/(sizeof TableNames[0]))を個数として使うかなー
ループは0から(個数-1)まで。

625 :デフォルトの名無しさん:03/06/25 13:25
じゃ、中身とenumを一致させる形にして...>>624

enum TableNumber {
TableNumber_None = 0,
TableNumber_Data1,
TableNumber_Data2,
TableNumber_End,
};

char const *TableNames[TestNumber_End] = {
"Table1",
"Table2",
"Table3",
};

for (iCount = TableNumber_None; iCount < TableNumber_End; iCount++)
 Proc(TableNames[iCount]);

で、どうでつか?

626 :デフォルトの名無しさん:03/06/25 14:07
const char* TableNames[] = {
  "Table1",
  "Table2",
  "Table3",
  0,
};
for (const char** p = TableNames; *p != 0; ++p)
  cout << *p << endl;

はダメか?

627 :625:03/06/25 14:16
>>626
そうも書けますよね。どっちが良いのかな。

実行時にTableNames[]の個数を取るにも、sizeof(*TableNames)で良さそうですしね。

628 :デフォルトの名無しさん:03/06/25 16:47
C++の場合
char *p[5]={&a,&b,&c,0,0};

のようにNULLではなくて、0を入れておくべきなんだっけ?

629 :デフォルトの名無しさん:03/06/25 18:01
>>628
別にどっちでもいい。0かNULLかは単に表記上の問題。C FAQ読んでみ。

630 :デフォルトの名無しさん:03/06/25 18:06
ぬるぽ

631 :デフォルトの名無しさん:03/06/25 18:24
ガッ

632 :デフォルトの名無しさん:03/06/25 18:28
>>628
c++ではNULLマクロより0を使う
>>629
それはCでのはなし

633 :デフォルトの名無しさん:03/06/25 18:46
どうせ#define NULL 0になっているでしょ。

634 :デフォルトの名無しさん:03/06/25 18:54
C では NULL は 0 か ((void*)0) のどちらで定義されていても良い。
C++ では NULL は 0 と定義される。

>>632
可読性下がるから今すぐ NULL 使え。

635 :デフォルトの名無しさん:03/06/25 19:22
素数を求めるプログラムを
エラトステネスのふるいを用いて配列を使った時と、
配列を使わないで作成した時との
コンピューターが必要とする変数の数、計算のかかる手間等の
違いはどのようなものですか?

636 :デフォルトの名無しさん:03/06/25 19:26
#define ぬるぽ 0

637 :デフォルトの名無しさん:03/06/25 19:28
>>636
       _
┌――─┴┴─――┐
│ セルフサービス .│
└―――┬┬─――┘
        ││   ./   
      ゛゛'゛'゛ /    
         /
     | \/
     \ \
      \ノ


638 :デフォルトの名無しさん:03/06/25 19:38
>>634
まともな処理系だけ使っていればいいなら、null pointer
はNULLと書きたいけど、そうでない処理系を相手に
する場合は、やっぱり0と書くしか無い。
#if defined(__cplusplus) && defined(BROKEN_NULL)
# undef NULL
# define NULL 0
#endif
なんて荒技もあるにはあるが・・・。

639 :デフォルトの名無しさん:03/06/25 19:40
>>635
自分で作って見れ。そして比較して考えろ。
それが一番成長する。

プログラムは作って実感していくことが大事だ。

640 :デフォルトの名無しさん:03/06/25 19:58
もまいらこんばんわです!
おながいします。
標準ライブラリではないかもしれないのですが
関数のatoi()には_atoi()ってのもVCにはあるのですが
これってどう使い分けるのですか?
またどう違うのですか?
そもそもよく見かける_や__ってなんなんでしょう?

641 :デフォルトの名無しさん:03/06/25 20:00
VC++は勝手に先頭に_をつける。

642 :デフォルトの名無しさん:03/06/25 21:27
>>638
まともでない処理系にはどんなものがあるの?

643 :デフォルトの名無しさん:03/06/25 21:29
>>640
VC の命名規則では
_ : 処理系依存識別子(関数、変数など)
__ : 機能拡張(キーワード)
だったと思う。
うろ覚えだけど。

644 :デフォルトの名無しさん:03/06/25 21:45
>>642
古いコンパイラとかじゃない

645 :640:03/06/25 21:55
>>641-643
標準c++でないコンパイラ実装なのかなと思って
いたのですがスッキリしますた。
どうもありがとうございますた。m(__)m

646 :597:03/06/26 01:17
いろいろ有益情報教えてもらったので "We can bring back tech and peace♪"

>>634 >>638
-- null.h --
class NullPointer{
 public:
  template <typename T> operator T* () const { return 0; }
 …その他こまごました便利機能は自分で考えれ…
};
extern const NullPointer null;
-- null.cpp --
#include "null.h"
const NullPointer null;

こんな感じでドゥ〜?
詳しくは effective あたりに。

647 :デフォルトの名無しさん:03/06/26 02:24
NULL の定義のおかしいようなコンパイラで
テンプレートを、あまつさえメンバ関数テンプレートを使えるとは思えんけどね。

648 :デフォルトの名無しさん:03/06/26 06:57
>>640
ちなみにC言語の決まりで、頭に_を付けるのはライブラリやコンパイラの
製作者のために予約されていて、普通のプログラマは付けてはいけないこと
になってるゾ。

649 :デフォルトの名無しさん:03/06/26 09:27
>>648
でも、3 つ以上ならいいんだっけ?
___a とか。

650 :デフォルトの名無しさん:03/06/26 09:58
>>649 んなわけない。

651 :デフォルトの名無しさん:03/06/26 11:06
>>649-650
2つ以上からOKだよ。
__aとか。

652 :デフォルトの名無しさん:03/06/26 11:25
>600
やばいんじゃないかと思います。
char配列がconstでよいなら、stringのc_strを使えばok

653 :640:03/06/26 11:30
>>648
サンクスコ!
ちなみにアンダバー2つ__についてはMSDNに書かれていますた。
ちゃんと読んでなくてすんまそんですた。

Microsoft 固有の仕様 →
Visual C++ では、先頭に 2 つのアンダースコアを続けた識別子を
コンパイラ処理系用として予約しています。
したがって、Microsoft 固有のキーワードの先頭にはアンダースコア
を 2 つ続けることになっています。


654 :640:03/06/26 11:31
>>651もあんがとさん!
忘れた(--;;

655 :デフォルトの名無しさん:03/06/26 11:31
>>651 ハァ?

656 :デフォルトの名無しさん:03/06/26 12:08
C++ 仕様書 17.4.3.1.2.1

2つの連続するアンダースコア __ を含む名前か、
アンダースコアで始まりそれに大文字が続く名前は
どんな場合においても処理系のために予約されています。

グローバル名前空間内においては
アンダースコアで始まる名前全体も
処理系のために予約されています。

657 :デフォルトの名無しさん:03/06/26 12:19
>>652
うそはよくないです。

658 :600:03/06/26 12:30
>>652
スマソ。説明の為に変えたんだけど、実はcharじゃなくてintのvectorです。
良ければ、やばいと思う理由を教えてください。

漏れが心配したのはvectorが伸張するときなんかに、分断された領域を
確保して、[]演算子で辻褄を合わせる、なんてことが許されてたら、&buf[0]
で取るアドレスから配列が連続して続いていると仮定するのはまずいよなあ、
という点です。

で、質問させてもらったわけですが、おかげさまでその心配は解消したわけです。

659 :デフォルトの名無しさん:03/06/26 14:01
>>656
これって、
「2つの連続するアンダースコアを含む名前」
「アンダースコアで始まる名前全体」
ってのがアンダースコア3つ以上繋がったのを
含むのか含まないのかが曖昧な文だよねぇ。

660 :デフォルトの名無しさん:03/06/26 14:06
>>600
ぜんぜんやばくない。
>>652
求めてるのが文字列以外なら
c_str()つかえばサイズ、あわねーじゃん

661 :デフォルトの名無しさん:03/06/26 15:39
>>635
ここでも読んでみて
http://pc.2ch.net/tech/kako/993/993457354.html


662 :デフォルトの名無しさん:03/06/26 15:50
>>600
ISO 9899-1999ではまだそうなってはいない
やめたほうがいい

663 :662:03/06/26 15:52
ISO 14882-1998の間違い。

664 :600:03/06/26 16:29
>>662
「そうなってはいない」の「そう」の意味を教えてもらえませんか?

665 :600:03/06/26 16:31
ではどうするべきか、も是非。

666 :デフォルトの名無しさん:03/06/26 17:00
>>600
vectorを配列として扱える保証が今のところの最終仕様にはない。
vectorは使う限りコピーする位しかどうにもならないような
とは言っても私の知る限りvector<T>::iteratorはT*だけど
basic_stringにはconst charT *data()があるがconstだし

667 :デフォルトの名無しさん:03/06/26 17:09
>>602もいっているけどvectorだけは要素数を変更しない限り
問題がないとスコット・メイヤーズの本に書いてある。
>>662
どこにのってる。みつけれなっかった。
>>666悪魔の数字
operator [] はiteratorを返すわけじゃありません。


668 :デフォルトの名無しさん:03/06/26 17:10
>658
あなたが心配していることが、あり得るのでやばいです。


669 :662:03/06/26 17:11
>>667
「のっていない」と言っている

670 :デフォルトの名無しさん:03/06/26 17:14
>>667
>operator [] はiteratorを返すわけじゃありません。
そういうことじゃない。内部表現の話だ

671 :デフォルトの名無しさん:03/06/26 17:22
>665
呼び出す関数を、変えるのがいいかな。
テンプレート化して、イテレータで、最初と最後を渡すようにすれば、
どんなコンテナでも配列でも、使えるようになる。


672 :600:03/06/26 17:28
なるほど。
すると、>>602 のEffectiveSTLに書いてあることや、>>601 の「何かの本」
の記述が間違っているかどうか、ということですか。

最終仕様にvectorの内部表現が言及されていない限り、vectorを配列と
して扱いたい場合は、他に用意した配列にvectorの内容をコピーするの
が最も安全、ということですね。

>>671
呼び出す関数はレガシーなライブラリだったりすると変えられないのです。

673 :デフォルトの名無しさん:03/06/26 17:36
>>602 のEffectiveSTLに書いてあることや、>>601 の「何かの本」
>の記述が間違っているかどうか

実際にそうでない処理系が挙げられないという点で間違ってはいないし
そういう著者が主張しているということは将来盛り込まれる可能性も高い。

674 :デフォルトの名無しさん:03/06/26 17:43
たしかに読み返したら
「通常は問題ない。」と書いてあるね。

675 :tantei:03/06/26 17:45
★あなたのお悩み解決致します!!
●浮気素行調査
彼氏、彼女、妻、夫の浮気を調査致します!!
●別れさせ工作
あらゆる手段を使ってターゲットを別れさせます!!
●盗聴器盗撮機発見
あなたの部屋に誰かが仕掛けているかも!!
●行方調査
行方不明になっている家族の消息を調査致します!!
●電話番号から住所割り出し
一般電話、携帯から住所を割り出し致します!!
その他人生相談からどんなお悩みでも解決いたします!!
 直通  090−8505−3086
URL  http://www.h5.dion.ne.jp/~grobal/
メール  hentaimtt@k9.dion.ne.jp
   ■グローバル探偵事務所 



676 :667:03/06/26 17:46
>>662
ああ。なるほど。すみません。

677 :デフォルトの名無しさん:03/06/26 18:57
仕様の本文じゃなくて補足に書いてあるんじゃなかったか?

678 :デフォルトの名無しさん:03/06/26 19:01
ないなあ

679 :デフォルトの名無しさん:03/06/26 19:06
クラスの静的メンバ関数ってどういうときに使うんですか?
静的にするメリットがないような気がするのですが

680 :デフォルトの名無しさん:03/06/26 19:50
■■■かわいそうな「ゲーム君」を2ちゃんの力でトップにしよう!■■■
                               
HSPプログラムコンテスト2003オンライン投票
http://www.onionsoft.net/hsp/contest2003/entryn1.html

HSPプログラムコンテスト2003に一番乗りで出展したものの              
Windowsに標準でついてくるゲームを手軽に起動できるという(というかただのショートカットつめあわせ)
しょーもないプログラムでたたかれまくっているプログラミング暦3年(!)の高校生の
作品、ゲーム君をみんなの力で一位にしよう。
【【【 投票方法 】】】
http://www.onionsoft.net/hsp/contest2003/entryn1.html の一番下、エントリーNo8の「ゲーム君」
評価を「A」で選んでコメントを記入して「送信」(コメントいれるとなおよし)           
http://www.onionsoft.net/hsp/contest2003/eval/eval.cgi?md=cmt&id=8
でいままで送信されたコメントが見えるよ!(けっこう笑える)    
順位 http://www.onionsoft.net/hsp/contest2003/eval/eval.cgi                                     

681 :デフォルトの名無しさん:03/06/26 20:44
>>679
俺はシングルトンクラスのインスタンスの構築、破棄に使ったりするね。
Cxxx::CreateInstance()みたいな。
何かCで出来ないことが出来るって意味合いのもんじゃないよね、
こういうのって。

682 :デフォルトの名無しさん:03/06/26 20:58
>>673
C++98の時にはそうなっていなかったけど、TCが出て、
現行仕様ではOKとなっている。実際には、どこのコンパイラでも
配列として扱えるでしょ。
http://std.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#69

683 :デフォルトの名無しさん:03/06/26 21:00
>>681
シ、シングルトン・・・?

684 :132:03/06/26 21:06
>>683
気になる!
なんだろう?なんかおかしい?

685 :デフォルトの名無しさん:03/06/26 21:07
>>684
お前だけじゃないから、安心しろ。>>683 がアフォなだけ
だから相手にするな。

686 :デフォルトの名無しさん:03/06/26 21:33
何の話をしているんだ?
俺にも教えろ!

687 :デフォルトの名無しさん:03/06/26 21:35
C-FAQは最低でも10回は読もうという話しだよ。

688 :デフォルトの名無しさん:03/06/26 21:36
>>687
ここはC++スレなんですが

689 :デフォルトの名無しさん:03/06/26 21:37
C++でも十二分に役に立つ。

690 :デフォルトの名無しさん:03/06/27 00:30
コマンドの実行ってsystem()使うしかないんでしょうか?
#include <stdlib.h>して。

691 :デフォルトの名無しさん:03/06/27 00:31
>>690
環境依存でなら他にいくらでも。
でも、このスレよりも目的の環境のスレで聞くがよろし。

692 :デフォルトの名無しさん:03/06/27 00:33
>>687
×話し
○話

693 :デフォルトの名無しさん:03/06/27 00:35
C++-FAQも読んでください。

694 :690:03/06/27 00:39
>>691
了解。gcc逝ってきます。

695 :デフォルトの名無しさん:03/06/27 00:42
>>692
頭の上に蝿がとまってるよ。

696 :デフォルトの名無しさん:03/06/27 00:51
>>695
話 = 名詞
話し = 動詞(連用形)

697 :デフォルトの名無しさん:03/06/27 01:32
Kusakabe Youichiの予感

698 :デフォルトの名無しさん:03/06/27 01:36
実際の用例で行くと
「話」で送らない形は連用形「はなし」と終止形「はなす」に多く見られる。
(名詞は連用形が名詞化するのであって特別な場合ではない。)
(〜に候(さうらふ)。〜に候(さうらひ)て、などまだしばしば見るだろう。)
あくまでも訓は借字であり、あまり国語審議会の言うことに
こだわらない方がよい。

699 :デフォルトの名無しさん:03/06/27 01:46
国語相談室ですか?



700 :デフォルトの名無しさん:03/06/27 05:56
「話しをする」だと「はなししをする」だけどな。

701 :デフォルトの名無しさん:03/06/27 06:15
そうもいえない。
用例から言っても必ずしも送りがなくなるわけではない
だから「はなし」は名詞でも連用形でも「話し」と送る場合がある
「おはなし」「お話し」「お話」、「つり」「釣り」「釣」
「あゆみ」「歩み」「歩」、「みずあび」「水浴び」「水浴」
とどのつまり、他の言葉の問題と同じく各人の慣れに帰着する。

702 :デフォルトの名無しさん:03/06/27 09:56
C++のint型はCPUのビット数になる

703 :デフォルトの名無しさん:03/06/27 10:22
>>702
ダウト。

704 :デフォルトの名無しさん:03/06/27 10:26
>>703
http://pc2.2ch.net/test/read.cgi/tech/1056109884/748

705 :703:03/06/27 12:31
>>704
なぜ俺に?
ひょっとして「自然なサイズ」=「CPU のビット数」だと思ってる?

64ビット機での int サイズ問題とか知らないんかね。
最近どっちかのスレで盛り上がったと思うけど。

706 :600:03/06/27 15:00
>>682
ANSI/ISO 14882-1998中の欠陥として既に広く知られているんですか。
これが最終仕様かと思ってましたが、まだ先があったんですね。

というわけで、二転三転しましたが、vectorの要素は連続した領域に確保
されていると仮定して、配列と同じように使ってよい、と言うことですね。

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

707 :デフォルトの名無しさん:03/06/27 15:35
typeid関数のメンバ関数beforeは、なにの順位判定をしてくれるのでしょうか?

708 :702,704:03/06/27 18:23
>>705
元ネタはこいつという意味で提示しただけなんだけど・・・
一緒に笑ってくれると思ったのに。

709 :デフォルトの名無しさん:03/06/27 18:28
>>703
ダウトってどっから流行ったん?
単語の意味を考えると、どうも用法がズレてる気がしないでもない。

710 :デフォルトの名無しさん:03/06/27 18:30
>>709
同名のトランプゲームの用法ではないかな

711 :デフォルトの名無しさん:03/06/27 18:35
>>709
おかしなところを「ダウト!」と言ってから指摘するクイズ番組があった。

712 :703:03/06/27 18:49
>>708
向こうで散々ループして鬱陶しかったネタを
こっちにまで持ってくんな!
このぬるぽ!

713 :デフォルトの名無しさん:03/06/27 18:55
>>712
ム板でぬるぽとか言うな。鬱陶しい。

714 :デフォルトの名無しさん:03/06/27 19:12
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ
ぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽぬるぽ


715 :デフォルトの名無しさん:03/06/27 19:12
>>712
鬱陶しい。

716 :デフォルトの名無しさん:03/06/27 20:10
>>707
型の順序の判定。
順番の決め方の基準は環境依存だが、とにかく
何かしら順序をつけてくれることが保証されている。

717 :707:03/06/27 21:47
>>716
型の順序ですか・・・
一般プログラマは使うことはまずないですよね?

718 :デフォルトの名無しさん:03/06/27 21:59
ぬるぽ:Null Pointer Exception [無効ポインター例外]
>>713
なぜ?

719 :716:03/06/27 22:25
>>717
もし typeid を積極的に使おうと考えてるなら、そのうち
一度や二度は必要になるんじゃないかと。そうでないなら
確かに使わないと思う。

720 :デフォルトの名無しさん:03/06/27 22:42
型をキーとした二分探索木とか作る時に
必要になるのかな? >before

721 :デフォルトの名無しさん:03/06/27 22:42
すいません ちょっと文法の質問させてください ほんとごめん

class Test {
Test *cursor;
public:
explicit Test( Test *p = 0 ) : cursor( p ) {}

ってのがあるんですが、コンストラクタ部分のcursor(p)ってのは
仮引数をそのままcursorに代入するんですか?

722 :デフォルトの名無しさん:03/06/27 22:45
>>721
代入じゃなくて初期化。
まぁ、この場合は大した違いは無いけど。

723 :721:03/06/27 22:46
>>722 thx! 助かりました

724 :デフォルトの名無しさん:03/06/27 23:32
>>721
ちなみに、
仮に const なメンバ変数だったりするとコンストラクタの中で
cursor = p;
とかすらできなくなるので、そういうときに必須の機能なりよ。

725 :デフォルトの名無しさん:03/06/27 23:36
>>656
> C++ 仕様書 17.4.3.1.2.1
> 2つの連続するアンダースコア __ を含む名前か、
> アンダースコアで始まりそれに大文字が続く名前は
> どんな場合においても処理系のために予約されています。

小文字ならOKだったの?

> グローバル名前空間内においては
> アンダースコアで始まる名前全体も
> 処理系のために予約されています。

グローバル名前空間ってどういうこと?
クラスのメンバ変数とかならOKってこと?

プログラミング言語C++第3版のどっかに書いてある?

726 :デフォルトの名無しさん:03/06/27 23:40
>>725
::kore

727 :デフォルトの名無しさん:03/06/27 23:42
>>725
メンバーなら処理系定義の識別子とかぶらないし。

728 :デフォルトの名無しさん:03/06/27 23:47
>>727

そんなことないべ?

729 :デフォルトの名無しさん:03/06/27 23:49
キーワードとはかぶる可能性が。
__declspec とか。

730 :727:03/06/27 23:51
>>729
ああそうか。うっかりしていた。

731 :730:03/06/27 23:52
型名ともかぶる可能性があるじゃねーか(鬱

732 :デフォルトの名無しさん:03/06/27 23:57
class asdf{
int _zxcv;
};
これはOKということ?

733 :デフォルトの名無しさん:03/06/28 00:00
>>732
ok

734 :デフォルトの名無しさん:03/06/28 00:26
アンダースコアで始終する名前付けをするなよ

735 :デフォルトの名無しさん:03/06/28 00:31
>>734
終わりはよいという罠。
ジャンガリアン嫌い派の一部が m_xxx を嫌がって xxx_ とかつける。

俺はジャンガリアン派じゃないがポインタの pXxxx とメンバの m_xxx はするね。

736 :デフォルトの名無しさん:03/06/28 00:34
>>735
ジャンガリアン? ハンガリアンじゃなくて?

737 :725:03/06/28 00:38
よし、アンスコ始まりは、とにかくダメってことだな。

738 :デフォルトの名無しさん:03/06/28 00:39
>>737
格好悪いから駄目。

739 :デフォルトの名無しさん:03/06/28 00:44
>>735
ハムスター?

740 :デフォルトの名無しさん:03/06/28 01:28
terapad がさ、*.cpp の中で thread を太字にしたんだけどさ、
いつから thread ってキーワードよ?作者の気の迷い?

741 :デフォルトの名無しさん:03/06/28 01:32
>>740
__declspec(thread) のことか?

742 :デフォルトの名無しさん:03/06/28 01:45
>>735
アンスコ2つだと後ろでもだめね。

743 :デフォルトの名無しさん:03/06/28 09:07
>>740
事実上のキーワードは太字にしてもかまわないというか害はないと思うが…

744 :デフォルトの名無しさん:03/06/28 10:06
public:
const static int a;
public:
static const int a;

どう違う?

745 :デフォルトの名無しさん:03/06/28 14:13
>>744
書いてる順番が違う以外に
違うところは全く存在しない。
int const statc a; でも構わない。
ただ、普通は static const int a; の順で書く。

746 :デフォルトの名無しさん:03/06/28 14:13
statc → static

747 :デフォルトの名無しさん:03/06/28 14:15
staticなconst int型のa

748 :デフォルトの名無しさん:03/06/28 14:58
>>745
ふつうは
static int constだろ

749 :デフォルトの名無しさん:03/06/28 15:00
s/普通/自分/g

750 :デフォルトの名無しさん:03/06/28 15:01
static int constは少数派。

751 :デフォルトの名無しさん:03/06/28 15:08
int constはboostかぶれ。

752 :デフォルトの名無しさん:03/06/28 15:12
http://www.google.co.jp/search?num=50&q=%22static+const+int%22
http://www.google.co.jp/search?num=50&q=%22static+int+const%22  ←少ないYO

753 :デフォルトの名無しさん:03/06/28 15:54
http://www.google.com/search?q=%22const+int%22 → 120000
http://www.google.com/search?q=%22int+const%22 → 37400

http://www.google.com/search?q=%22constant+integer%22 → 9580
http://www.google.com/search?q=%22integer+constant%22 → 26100

どっちがいいんでしょうねぇ?

754 :デフォルトの名無しさん:03/06/28 16:01
C++は constantではなくconst、intergerではなくint だって知ってる?

755 :デフォルトの名無しさん:03/06/28 17:20
どっかに書いてある?と言われても、あの分厚いプログラミング言語C++の
中から探し出すのは厳しいな。
書いてあったとしても、そんなとこにしおり挟んであるわけじゃないし。

ところで、ポインタの*は型名に付ける派?それとも変数につける派?
(typedefする派ってのは無しの方向で)

756 :デフォルトの名無しさん:03/06/28 17:27
>>755
型名に付けるって typedef Hoge * PHoge; とかかと思ったらtypedefなしで
すぐ意味わからんかった。

スペースを入れる場所の話ね? 一応4種類考えられるが
A) type*var;
B) type* var;
C) type *var;
D) type * var;
コーディングマナーかコーディング規約スレのネタでは。
(漏れはDだが、通常typedefの中で。)

757 :デフォルトの名無しさん:03/06/28 17:29
C 使いは C が、C++ 使いは B が多い気がする。

758 :デフォルトの名無しさん:03/06/28 17:37
説明する時には「int*型の〜」ってなるから int* var (B)だな。

759 :デフォルトの名無しさん:03/06/28 17:41
と言ってみたものの、確信はない

760 :デフォルトの名無しさん:03/06/28 17:43
>758
int* a, b;
見たいにする香具師が出るから、もれは
int *a, *b;

761 :デフォルトの名無しさん:03/06/28 17:45
>>760
×
int* a, b;


int* a;
int* b;


762 :デフォルトの名無しさん:03/06/28 17:50
C++第3版にも出てた気もするな、このネタ。
意味的には型のはずだが、C言語からの仕様で変数宣言上では型に対する修飾は変数に
付くのでややこしいね。
type* a, b;
こうしたときにbが紛らわしくなってしまう。
これを予防するには、1行1変数方式とtypedef方式が考えられる。

1行1変数)
type* a;
type b;

typedef)
typedef int* ptype;
ptype a, b; /* 上記と意味は違うが、間違えにくい */

C++的には初期化をなるべく遅らせる観点からも1行1変数が望ましいとされてるね。
Cではtypedef方式になるか。

763 :デフォルトの名無しさん:03/06/28 19:02
>>762
C++的には初期化をなるべく遅らせる観点からも1行1変数が望ましいとされてるね。

へー

764 :760:03/06/28 19:57
>761
いやいや、
int * a, b;

見たいな間違いを犯すやつが出てくるから

int *a, *b;
にしろと…

765 :デフォルトの名無しさん:03/06/28 20:12
>>764
そのaとbはどうやって初期化するつもりだ?

766 :760:03/06/28 20:21
>765
う、そっか

int* a = NULL;
int* b = NULL;

767 :デフォルトの名無しさん:03/06/28 20:39
>>766
どんまい

768 :デフォルトの名無しさん:03/06/28 21:11
>>766
int *a = NULL, *b =NULL;

じゃダメなのか?

769 :デフォルトの名無しさん:03/06/28 21:17
>>768
コンパイルして見

770 :デフォルトの名無しさん:03/06/28 21:40
>>769
コンパイルした

何がダメなの?

771 :デフォルトの名無しさん:03/06/28 21:48
>>764
a,bそれぞれの型名は何?

772 :デフォルトの名無しさん:03/06/28 21:50
>>764
両方ともint *だと思うが?

773 :デフォルトの名無しさん:03/06/28 22:06
type* varなんつー邪道な書き方する奴がいるから悪いんだよな・・・
かく言う俺もだが。
757の指摘はあってるかもしれん。
ちょっと考えればわかることなのにな。
class A{}* a, b;
だったら、誰がどう見てもbはA*じゃなくてAになるからな。
Aを定義済みにすれば
A* a, b; でもbがAになることくらい容易に理解できる。

774 :デフォルトの名無しさん:03/06/28 23:06
>>769
もしかして >>768 のような書き方を知らないのか?

775 :デフォルトの名無しさん:03/06/28 23:24
C++ってnull=0だから入りそうな感じだね!
入らないのか。

776 :デフォルトの名無しさん:03/06/29 00:19
レベルが低い話題で盛り上がるスレですか?

777 :デフォルトの名無しさん:03/06/29 00:22
>>772
だったら何故型名と変数名の間に区切り(空白)を入れない?

778 :デフォルトの名無しさん:03/06/29 00:24
>>772
あと、>両方ともint *だと思うが?
だったら、
int *a, *b;

型名a, *b

となるのが不自然だ。bの前の*って一体何なんだ?

int*型なら

int* a;
int* b;

型名 a;
型名 b;

の方がよっぽど自然だ。

779 :デフォルトの名無しさん:03/06/29 00:29
そんな低レベルな事が気になるならtypedefしろよ…

780 :デフォルトの名無しさん:03/06/29 00:34
>>778
そもそも、変数の宣言が
型名 変数名;
と思ってる時点で大間違いなんだが。
関数ポインタはどう書くつもりでいるんだ?
int *a;
は式*aの結果がint型という意味だ。

781 :デフォルトの名無しさん:03/06/29 00:37
typedef すると const の振る舞いがアレだよねー。

782 :デフォルトの名無しさん:03/06/29 00:38
>>778
引数以外での数少ない','の出番を奪わないで下さい

783 :デフォルトの名無しさん:03/06/29 00:42
>>781
アレって何?

784 :デフォルトの名無しさん:03/06/29 00:43
>>783
typedef int * pint;

int a;
const pint b = &a;

*b = 0; // 書けてしまう
b = &b; // 代入ができない

785 :デフォルトの名無しさん:03/06/29 00:44
>>784
最後、b = &a; ね

786 :デフォルトの名無しさん:03/06/29 00:44
だからconstは右から使えと何度(ry

787 :デフォルトの名無しさん:03/06/29 00:44
>>781
typedef int const ic ;
typedef ic * icp ;
typedef icp const icpc ;
icpc *a ;
こうやって、const すべき所に const しやすいから、
const する時こそ typedef 使うべきだと思うな…

788 :デフォルトの名無しさん:03/06/29 00:47
>>784
何を当たり前のことを・・・

789 :デフォルトの名無しさん:03/06/29 00:54
テンプレート絡み以外でtypedefなんて使わないしなぁ。

790 :デフォルトの名無しさん:03/06/29 00:56
int *a = NULL; は * が間接参照演算子に見えて気持ち悪い。記憶違いかも
しれんけど、C++ は int* a, b; を int *a, *b; と等価にしたかったが C
との互換のためにやむを得なかったみたいな話、どこかになかったっけか。

791 :デフォルトの名無しさん:03/06/29 01:00
Cのしがらみを断ち切ったexp(C)の開発が望まれる

792 :デフォルトの名無しさん:03/06/29 01:01
>>787
const なところは const と書いてあった方が
分かりやすくていいと思うが...。

793 :デフォルトの名無しさん:03/06/29 01:03
constはIDEがキーワードで色分けしてくれるしな

794 :769:03/06/29 01:03
>>774
はぁ?
質問しないで試して見ろという意味で書いたんだよ

795 :デフォルトの名無しさん:03/06/29 01:05
>>794
それを言ったらそもそも768は質問じゃないだろ

796 :デフォルトの名無しさん:03/06/29 01:10
>>790
int* a, b; を int *a,*b; を等価にするなら
配列の宣言の仕方も
char[10] s1, s2; になるのだと思う…
で、こんな宣言の仕方は、Cをやってる俺にとっては、とってもキモイ…

797 :デフォルトの名無しさん:03/06/29 01:12
pointerキーワードを作ればよかったんだよ

798 :デフォルトの名無しさん:03/06/29 01:12
>>796
でも関数ポインタとかが
void (*)(int,char) hoge, hage;
とかになって、初心者にもわかりやすいかもよ。

799 :796:03/06/29 01:15
>>798
それは一理あるかも…

800 :デフォルトの名無しさん:03/06/29 01:15
C++がCと宣言変わってたら誰も使わなかっただろうな・・・

801 :デフォルトの名無しさん:03/06/29 01:19
typedef char T[10]; と
typedef char[10] T;
なら断然後者がいい。

802 :デフォルトの名無しさん:03/06/29 16:23
例外処理が使えない環境でのエラー処理は
どうするのが良いんでしょうか。
戻り値、ってのは基本だと思うけれど、コンストラクタで使えなかったり、
いちいちテストするのは面倒だったりするので・・・
setjmp/longjmp なんかを使って、系統的なエラー処理ってできませんかね?


803 :デフォルトの名無しさん:03/06/29 17:33
assert

804 :デフォルトの名無しさん:03/06/29 18:36
あなたが探してるのってこれだよね?でも眠れなくなるよ!
http://nuts.free-city.net/index.html

805 :デフォルトの名無しさん:03/06/29 18:48
C++でsetjump,longjumpは使用禁止でげす

806 :貧乏脱出!これであなたはお金持ち:03/06/29 18:48
普通に働いてお金持ちになれるのは全体の1%のみって本当!?
本当にお金持ちになるにはやはり「副収入」が必要!
一日30分 おうちでコピペ、コピペ!
嘘だと思うんならランキング見てみてくださいよ↓↓
(直リン不可)
http://www.adultshoping.com/addclickport.cgi?pid=1053353765(直リン不可)

///////// ////////

807 :デフォルトの名無しさん:03/06/29 18:48
>>805
uは余計

808 :デフォルトの名無しさん:03/06/29 18:49
>>802
この期に及んで例外処理なしって
環境のほうを見直すべきな感じだが

809 :デフォルトの名無しさん:03/06/29 18:57
>>808
はげどうです

810 :デフォルトの名無しさん:03/06/29 20:44
関数の引数にデフォルト値を持たせる場合に関してなんだが…、
  ISO/IEC 14882:1998(E) -- C++ -- Declarators
  http://www.kuzbass.ru/docs/isocpp/decl.html

  8.3.6 - Default arguments [dcl.fct.default]
の部分にある
> -4- ……In a given function declaration, all parameters subsequent to a parameter with
> a default argument shall have default arguments supplied in this or previous declarations.
は、part19(前スレ)の726-728
  http://pc2.2ch.net/test/read.cgi/tech/1052625846/726-728
の話だよね。で、それに続く以下の文:
> A default argument shall not be redefined by a later declaration (not even to the same value).
の文は、「同じscope内では同じ引数に対してdefault値を(たとえ同じ値であって
も)複数回指定することはできない」なんだろうけど…、コンパイルできたぞ
(@_@)?!!

なんで?

811 :810:03/06/29 20:47
あ、使用したコンパイラは FreeBSD付属のg++(2.95.4相当)です。

812 :810:03/06/29 20:55
以下のソースコード(a1.cpp):
----------(ここから)
#include <iostream.h>

/*
* プロトタイプ宣言
*/
//int foo ( int a , int b , int c ) ;
int foo ( int a , int b , int c=3 ) ;
int foo ( int a=1, int b=2, int c=3 ) ;/* 第3引数(c)のデフォルト値を再定義 */

/*
* 定義
*/
int foo ( int a, int b, int c )
{
return (a+b+c);
}

int main ( void )
{
cout << "foo()=" << foo() << endl ;
return 0 ;
}
----------(ここまで)


  % g++ -o a1 a1.cpp
のようにしてコンパイルしたが全く警告・エラーが出ない。。。

813 :デフォルトの名無しさん:03/06/29 20:58
>>803
それはjava1.4でしょ!
Cには#if #else #ifdefがあるでしょ!

814 :810:03/06/29 20:58
g++の「独自拡張」なのでしょうか??

815 :デフォルトの名無しさん:03/06/29 21:30
>>810
とりあえず、3.2ではエラー出たから、バグなんじゃない?

816 :デフォルトの名無しさん:03/06/29 23:55
>>815
バグというか、古すぎてちゃんと仕様に準拠してないか、
昔は再定義に関する仕様が特になかったのか、
そんなところでは。

817 :デフォルトの名無しさん:03/06/29 23:57
>>813
assert を知らないの?
<cassert> ヘッダファイルでも探してみなされ。

818 :デフォルトの名無しさん:03/06/30 00:05

BOOL Apl::InitApp( int _ii, double _dd )




こういう「 _ 」の使い方はOK?

819 :デフォルトの名無しさん:03/06/30 00:12
>>818
規格的にはOK。
だが、人に見せたときに要らぬ物議を醸さぬよう、
そういう使い方でもやめたほうがいい。

820 :デフォルトの名無しさん:03/06/30 00:18

良いとはいえない。
激しく既出。
それより、sageで質問じゃ、だれも気づかねーぞ。
会議中にボソボソ独り言いってんのとかわんね。


821 :デフォルトの名無しさん:03/06/30 00:32


822 :デフォルトの名無しさん:03/06/30 00:58
int p =
      !!  !   !  !  !    !
      ! ! !  !  !  !    !
      ! ! !  !  !  !    !
      !  !!  !  !  !    !
      !  !   !!!!!!!  !!!!!!!  !!!!!!!1;

823 :デフォルトの名無しさん:03/06/30 01:25
p == 0ですか?

824 :デフォルトの名無しさん:03/06/30 08:07
int* p =
      !!  !   !  !  !    !
      ! ! !  !  !  !    !
      ! ! !  !  !  !    !
      !  !!  !  !  !    !
      !  !   !!!!!!!  !!!!!!!  !!!!!!!1;

825 :デフォルトの名無しさん:03/06/30 10:54
p == 0ですか?

826 :デフォルトの名無しさん:03/06/30 11:55
>824
ぬ、ぬるぽ

827 :デフォルトの名無しさん:03/06/30 13:15
>>821-826
ガッガッガッ(ry
AAも略

828 :デフォルトの名無しさん:03/06/30 13:25
>>818
_ は後ろに付けた方がいいと思う。


829 :818:03/06/30 13:30
>>828
あ、そんな発想なかったw
同じ名前の変数の場合、関数側の変数の名前迷うんだよね

830 :デフォルトの名無しさん:03/06/30 16:39
>>818
同じ名前にすりゃいいじゃん。
別に問題ないよ。

831 :818:03/06/30 16:47
>>830
class{
HWND hwnd;
〜〜
};

winapi winmain(〜〜〜)
{
gethwnd(hwnd);
}

void gethwnd(HWND hwnd)
{
hwnd=hnwd;
}

OK?

832 :デフォルトの名無しさん:03/06/30 16:53
>>831
普通に間違ってるぞ。
void gethwnd(HWND hwnd)
{
this->hwnd = hnwd;
}
だろ。釣りか?

833 :_:03/06/30 16:53
http://homepage.mac.com/hiroyuki44/jaz04.html

834 :832(!=830):03/06/30 16:54
いや、待てよ。gethwndがclassのメンバ関数とは限らないな。
もうちょっとちゃんと書け>>>831

835 :デフォルトの名無しさん:03/06/30 16:55
>>830
問題はないがデバッグがしづらくないか?

836 :デフォルトの名無しさん:03/06/30 17:04
hnwd

837 :デフォルトの名無しさん:03/06/30 17:32
#include <iostream>

class Interface
{
public:
virtual ~Interface() {}
virtual void method() const = 0;
};

class MixIn : virtual public Interface
{
public:
virtual ~MixIn() {}
virtual void method() const {
std::cout << "OK" << std::endl;
}
};

// 続く


838 :デフォルトの名無しさん:03/06/30 17:35
>>837 からの続き

class Concreate : virtual public Interface,
private MixIn
{
public:
// using MixIn::method;
};

int main()
{
Interface *i = new Concreate;
i->method(); // OK
delete i;

Concreate c;
c.method(); // コンパイルエラー
}

GCC 3.2.2 で、Concreate::method() が private 扱いになって、
コンパイルエラーになるのは、正しい仕様なの?

using MixIn::method; をコメントアウトすると、
ちゃんと動くのはなんかわかる気がするけど。


839 :デフォルトの名無しさん:03/06/30 17:49
>>835
なんで?
グローバル変数と同じにするわけじゃないんだから
問題ナッシングでしょ。

840 :818:03/06/30 17:59
>>832
あ、thisがあったか・・・
プログラムかなり書きなおさな・・・

841 :デフォルトの名無しさん:03/06/30 21:06
>>838
class Concreate : virtual public Interface,private MixIn{
親クラスは全部publicなのに、ここでなんでprivateで継承するんだ?
サブクラスは全部privateになるだろ!


842 :デフォルトの名無しさん:03/06/30 22:14
>>831,832
> hnwd
hwndだろ。ネタか?

843 :デフォルトの名無しさん:03/06/30 22:21
くだらん突っ込みを・・・

844 :デフォルトの名無しさん:03/06/30 22:26
#define TREU TRUE
#define hnwd hwnd

// (゚д゚)ウマー?

845 :デフォルトの名無しさん:03/07/01 02:31
>>841
MixIn へのキャストを禁止したいのよ。Interface の実現に、
MixIn を利用しているかどうかは public な情報ではないので。

>>838 については、よく考えてみると、

class Concreate : virtual public Interface
{
private:
void method() {}// Interface::method() としては外部から呼べる
};

というのと同じパターンか。

846 :学生C経験1ヶ月:03/07/01 08:46
VC++で _T("文字列")っていつ使い方をしている処理を見かけるのですが、
_Tって何の処理をしているんですか?
ここでつまづいてます。
ヘルプみてもよーわかりませんのでどなたかご指導ください。

847 :デフォルトの名無しさん:03/07/01 08:59
>>844
\(≧▽≦)丿ウマー!!

848 :デフォルトの名無しさん:03/07/01 09:27
>>847
マズー

849 :デフォルトの名無しさん:03/07/01 09:27
>>846
char/char*とwchar_t/wchar_t*の切り替えを透過的に行う為の仕組み。
ヘッダファイル tchar.h を見てみな

850 :デフォルトの名無しさん:03/07/01 11:55
>>847
#define retrun return
を忘れているからマズー

851 :デフォルトの名無しさん:03/07/01 12:59
class CBase {
public:
  typedef void (CBase::*ClassProc)(void);
  ClassProc ptr;
  CBase(void) {
    ptr = Proc1;
  }
  virtual void Proc1(void) {
    printf("CBase::Proc1\n");
  }
};
class CFoo : public CBase {
public:
  CFoo(void) {
    ptr = (ClassProc)Proc1;
  }
  virtual void Proc1(void) {
    printf("CFoo::Proc1\n");
  }
};
int main(void) {
  CBase* lpBase1 = new CBase();
  (lpBase1->*lpBase1->ptr)();  // CBase::Proc1() の呼び出し

  CBase* lpBase2 = new CFoo();
  (lpBase2->*lpBase2->ptr)();  // CFoo::Proc1() の呼び出し

  return 0;
}
CFoo の ptr = (ClassProc)Proc1;
このキャストは安全?

852 :デフォルトの名無しさん:03/07/01 14:14
>>822
>>824
スパルタ斉木

853 :デフォルトの名無しさん:03/07/01 15:31
>>851
その代入は不必要。
Proc1 は仮想関数だから、勝手に呼び分けてくれる。

854 :851:03/07/01 15:53
>>853
うん。単純にCFoo::Proc1を呼び出すんならこんな面倒な事しないね。
やってる事がうまく伝わってなかった模様。
関数ポインタ経由で呼び出してるのは呼び出し元に修正を加えずに、
クラス内で呼び出す関数をifなどの判定なしに切り替えられるようにする為だよ。
CFoo::Proc2が定義されていると仮定して、
ptr = (ClassProc)Proc2;
とすれば次の呼び出しからCFoo::Proc2が呼ばれるようになる。

855 :853:03/07/01 16:45
>>854
こちらの言ってる事も伝わってない気が。
メンバ関数ポインタは仮想関数の呼び分けも
ちゃんとやってくれるので、
CBase で既に ptr に代入したのに
CFoo のコンストラクタで再代入する必要は無いよ、
ということが言いたかった。

代入するメンバ関数は常に &CBase::Proc1 のように
&CBase:: というのも書かないと文句言われるけど、
CBase:: がついているからといって CBase::Proc1 しか呼ばれないわけじゃなくて、
CFoo のインスタンスから ptr を使って呼ぼうとすると
ちゃんと CFoo::Proc1 が呼ばれる。

856 :デフォルトの名無しさん:03/07/01 16:57
>>855
CBaseコンストラクタ内ではProc1はまだCBase::Proc1を指してしまっているのでは?

857 :853:03/07/01 17:07
>>856
コンストラクタ内で仮想関数がちゃんと呼べないのは当たり前。
まだコンストラクタが呼ばれてないクラスのメンバ関数が呼べたら大変だ。
CFoo のコンストラクタが呼ばれれば
仮想関数テーブルが初期化されて、
これでちゃんと CFoo::Proc1 が呼べるようになる。

858 :856:03/07/01 17:20
>>857
すまん、頓珍漢言ってた。
&CBase::Proc1は特定のインスタンスに依存しないもんな。
コンストラクタ内でどうとかは無関係だった。

859 :デフォルトの名無しさん:03/07/01 20:52
.netでは、#include<iostream.h>
の書き方サポートされていないの?

860 :デフォルトの名無しさん:03/07/01 20:55
#define defalt default

構文的にエラーじゃないのが痛い>default間違い

861 :デフォルトの名無しさん:03/07/01 20:55
できますよ

862 :デフォルトの名無しさん:03/07/01 20:57
C実践プログラミングの間違い探しにあったな。
見つかるまでかなり時間がかかった。
まさかdefault:がdefualt:になっているとはね。

863 :デフォルトの名無しさん:03/07/01 21:07
>>860
仕様書にも注意しろと書いてあったっけ。

864 :デフォルトの名無しさん:03/07/01 21:14
一部のエディタでは予約語と同じで
色が変わるからわかるけど > defualt

865 :デフォルトの名無しさん:03/07/01 21:18
>>864
本に書いてあるだけじゃ分からないだろ

866 :デフォルトの名無しさん:03/07/01 21:24
まぁ、ちゃんとしたコンパイラなら
「defalt というラベルは使われていません」
とかいう警告が出るので大丈夫なんじゃない?

867 :デフォルトの名無しさん:03/07/01 21:53
コンパイルオプションつかっていますか?

868 :デフォルトの名無しさん:03/07/01 21:54
-oとか-cとか

869 :デフォルトの名無しさん:03/07/01 22:14
-ansi -pedantic -Wall

870 :851:03/07/01 22:40
>>855
CFooでしか定義されていないCFoo::Proc2を最初の呼び出しで呼ばせたい場合にはCFooのコンストラクタで
ptr = (ClassProc)Proc2;
が必要になってくるけど、
CFoo::Proc1の場合はCBaseで既に初期化されており、インスタンスによる呼び分けがされるので必要なし、と。
なるほどご指摘の通り。

で、本題のキャストだけどこれに触れてる人が居ないって事は気にする必要なし?
本当はキャスト無しで突っ込める方法があればいいんだが。

871 :デフォルトの名無しさん:03/07/01 22:57
>>870
CBase のメンバ関数へのポインタなんだから、
CFoo にしかない関数を突っ込もうとするのはどうかと。
どうしてもやりたければ、仮想関数にでもしとき。

872 :851:03/07/01 23:23
>>871
戻り値、引数が一致しててもマズイんかな。
仮想関数となればCFooを拡張したらCBaseも拡張しなくては(ry
普通の関数ポインタにstaticなメンバ関数突っ込むしか・・・。

873 :デフォルトの名無しさん:03/07/01 23:28
おねがいtchar

874 :デフォルトの名無しさん:03/07/01 23:29
>>872
まぁ、注意して使えば一応問題は無いと思うけど。

875 :デフォルトの名無しさん:03/07/02 20:57
おながい darwin

876 :デフォルトの名無しさん:03/07/03 02:54
STLでvectorのメモリを余分な解放するのにテンポラリのvectorとswap、
ってのがあるけどmapやlist、stringの場合はどうなんでしょ?

877 :デフォルトの名無しさん:03/07/03 03:04
>>876
メモリが連続している必要が無いlistとmapには余分なメモリは無いかと。
stringはvectorと同じでそ。

878 :876:03/07/03 03:12
>>877
listは確かにそうかな〜と思えるのだがmapは実装によってはvector使ってる
場合もあるんでないの?

879 :デフォルトの名無しさん:03/07/03 03:26
>>878 ムリ。

880 :デフォルトの名無しさん:03/07/03 03:26
>>878
そんな実装してあるSTLはPCごと窓から投げ捨てろ。

881 :876:03/07/03 03:32
>>879 >>880
そうなん? じゃSTLportのstlport/stl/_hashtable.hの

# ifndef _STLP_INTERNAL_VECTOR_H
# include <stl/_vector.h>
# endif
(中略)
typedef __vector__<void*, _M_node_ptr_allocator_type> _BucketVector;

というのは無問題? それとも投げ捨てる?

882 :デフォルトの名無しさん:03/07/03 03:33
>>880
どうやって窓から投げ捨てればいいの?

883 :876:03/07/03 03:33
>>881 あーつまりhash_mapの実装ですスマソ

884 :_:03/07/03 03:50
http://homepage.mac.com/hiroyuki44/jaz09.html

885 :デフォルトの名無しさん:03/07/03 05:19
>A Hashed Associative Container is an Associative Container
>whose implementation is a hash table.

何か問題あるのか?

886 :876:03/07/03 06:42
>>885 ん? アタシに聞いてるのかい? >>883はmapとhash_mapじゃ普通
実装違うはずだからmapではvectorは使われないのねスマンということ。
(つまりメモリ使いすぎにならないと)
であらためて聞きますがhash_mapがvector使ってる場合は全要素新しい
方へコピーとかしかないのかな?

887 :デフォルトの名無しさん:03/07/03 08:55
>>886
コード読んでないけど、
Hash テーブルに vector 使ってるだけなんじゃないの?
もしそうなら、Hash テーブルのサイズを変えない限り
再確保なんか起こらないと思われ。

888 :デフォルトの名無しさん:03/07/03 11:40
listやmapの要素にプールアロケータを使う実装がありえないとはいえないか?

889 :デフォルトの名無しさん:03/07/03 21:21
ソースが公開されているC++で書かれた良いプログラムを教えてください。

890 :デフォルトの名無しさん:03/07/03 21:23
http://www.k-514.com/
ボッキンキン

891 :デフォルトの名無しさん:03/07/03 21:34
>>889
boost

892 :デフォルトの名無しさん:03/07/03 21:46
>>891
レスありがとうございます
ライブラリはコード書いて使ってみながら読まないとだめですよね

893 :デフォルトの名無しさん:03/07/03 21:58
>>892
そんなことはない

894 :デフォルトの名無しさん:03/07/03 22:32
例外を投げないのにいちいちthrows書くのがめんどいんですけど
みなさんどの程度手抜きしてます?

895 :デフォルトの名無しさん:03/07/03 22:53
例外仕様は書かない

896 :デフォルトの名無しさん:03/07/03 23:42
class Super {
public:
  Super(int i){}
};

class Sub1 : public Super {
public:
  Sub1(string s) : Super(10) {}
};

class Sub2 : public Super {
public:
  Sub2(double* d) : Super(20) {}
};

class Sub3 : public Super {
public:
  Sub3(int i, double d, string s) : Super(30) {}
};

みたいにサブクラスのコンストラクタのシグネチャを変更しても問題ないのけ?

897 :デフォルトの名無しさん:03/07/03 23:44
>>896
ない

898 :デフォルトの名無しさん:03/07/05 01:24
質問させてください。
クラスAとクラスBとの間で相互に型変換ができるように、
キャストをオーバーロードすることは可能でしょうか?

899 :デフォルトの名無しさん:03/07/05 01:34
意味がわからん
struct A{
A(B &b){...}
operator B(){...}
};
ということか?

900 :デフォルトの名無しさん:03/07/05 01:37
>>898
// a.h
class B;
class A {
public:
 operator B();
};

// b.h
class A;
class B {
public:
 operator A();
};

901 :デフォルトの名無しさん:03/07/05 01:39
if ( get(900) ){
std::cout<< "zusa-" << std::endl;
}else{
throw std::exceptin("abo-n");
}

902 :901:03/07/05 01:43
catch( ... ){
std::cout << "鬱だ氏のう" << std::endl;
int* hoge = new int[0xffffffff];
}

903 :デフォルトの名無しさん:03/07/05 01:43
try {
 run(901);
} catch(std::exceptin& e) {
 std::cout << e.what() << std::endl;
}

`exceptin' undeclared in namespace `std'

904 :デフォルトの名無しさん:03/07/05 02:21
ちとワロタ

905 :デフォルトの名無しさん:03/07/05 12:15
(・∀・)エクセプチン!

906 :デフォルトの名無しさん:03/07/05 14:46
Java見たいにC++の試験ってないの?

907 :デフォルトの名無しさん:03/07/05 15:23
試験に通ったかどうかが何かの目安になるような
単純な言語じゃないからねえ・・・

908 :デフォルトの名無しさん:03/07/05 15:29
まあ試験あると参考書が出るのはいいかも

909 :デフォルトの名無しさん:03/07/05 17:32
C++の参考書なんざ十分あるだろ

910 :デフォルトの名無しさん:03/07/05 18:31
>>909
ほとんど、うんこ。

911 :デフォルトの名無しさん:03/07/05 18:45
gcc 2.91.57 だとローカルクラスから親クラスの private メンバにアクセスできるんだけど、
VC++ 6.0 だとアクセスできません。
規約的にはどちらが正しいですか?

912 :デフォルトの名無しさん:03/07/05 18:46
>>911
ローカルクラスとは?
クラス内クラス、インナークラスのことかな?

913 :911:03/07/05 19:10
>>912
レスありがとございまつ。
ファンクションローカルでつ。
int cameraPinvoke(CJoke joke)
{
 struct Local
 {
  int hogya;
 } local;
 return local.hogya;
}
こんなんでつ。


914 :デフォルトの名無しさん:03/07/05 19:37
>>913
質問とコードが矛盾してないか?
>ローカルクラスから親クラスの private メンバにアクセス


915 :911:03/07/05 19:52
>>914
スイマセン。ローカルクラスって何?って言われたので、はしょってそれだけに対して答えました。
class CCamera {
private:
 CFilm* m_pFilm;
public:
 void Reject();
};

void CCamera::Reject() {
 struct Guardian {
  CCamera& parent;
  Guardian(CCamera& camera) : parent(camera){}
  ~Guardian() { delete parent.m_pFilm; parent.m_pFilm = NULL; }
 } guardian(*this);
}
やりたいのはこんな感じでつ。よろしくおながいします。

916 :デフォルトの名無しさん:03/07/05 19:57
>>915
アクセスできるほうがおかしい気が

917 :デフォルトの名無しさん:03/07/06 04:27
最近スレの進みが悪いぞage

918 :デフォルトの名無しさん:03/07/06 05:25
>>911
ローカルクラスより先に
アクセス制御の使い方しっかり覚えて。

919 :デフォルトの名無しさん:03/07/06 10:28
>>915
ローカルにする必要性がわからない。

920 :デフォルトの名無しさん:03/07/06 17:07
delete[]はnew[]した配列要素数を知っているのだから
これを問い合わせることはできる気がする

そこで一応お聞きします。
newした要素数を得る方法を教えてください


921 :標準じゃないけど:03/07/06 17:15
_msize(buffer) / sizeof(T) とか

922 :デフォルトの名無しさん:03/07/06 17:22
VCで、デストラクタが存在する場合のみ。
reinterpret_cast<int*>(classvector)[-1]

923 :デフォルトの名無しさん:03/07/06 17:35
やっぱきいてみるもんですね。
教えてくれてありがとう。
標準であってもよさそうですけど無いんですね。


924 :名無し:03/07/06 17:50
>delete[]はnew[]した配列要素数を知っているのだから
>これを問い合わせることはできる気がする

言われてみれば

925 :889:03/07/06 18:14
889ですがソースが公開されてるC++で書かれたゲームのプログラムとかありませんか?

926 :デフォルトの名無しさん:03/07/06 18:17
素人が作った超大作があったような気がしたが…誰か思い出してくれる人は
いないのかのぅ。

927 :デフォルトの名無しさん:03/07/06 18:21
ありますよ

928 :デフォルトの名無しさん:03/07/06 18:21
>素人が作った超大作

さて、どうしたものか。

929 :デフォルトの名無しさん:03/07/06 18:22
C++汎用のゲームか

930 :デフォルトの名無しさん:03/07/06 20:01
>>920
> delete[]はnew[]した配列要素数を知っているのだから
そうとも限らん。デストラクタを持たない POD な構造体なんかを new[] したときは
全体のサイズだけわかっていればよいので要素数は覚えていないこともある。
>>922 が書いてるのはまさにこのことだね。

931 :デフォルトの名無しさん:03/07/06 23:30
システム内部までいけば確保したメモリのサイズが分かるんじゃとか思ったけど、
要求したサイズと等しいサイズを確保するとは限んないね
(多分ある数の倍数まで拡張されるやね)。

932 :デフォルトの名無しさん:03/07/06 23:33
最近new[] なんて使わないなぁ

933 :デフォルトの名無しさん:03/07/07 01:35
error C2679: 二項演算子 '<<' : 型 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' の右オペランドを扱う演算子は定義されていません。

#include <iostream>
をインクルードしているのですが・・・

using namespace std;

void aaa( const string ss );

int main()
{
char ss[80]="あいうえお";

aaa(ss);

return 0;
}

void aaa( const string ss )
{
cout << ss << endl;
}

string型にchar型を渡した時にどう動作するかの確認プログラムです

934 :デフォルトの名無しさん:03/07/07 01:41
>>933
当然 #include <string> もしとるとして...。

VC6 はそれに対応してなかった気もするなぁ。
いつも ss.c_str() 使ってた気がする。
うろ覚えだけど。

935 :デフォルトの名無しさん:03/07/07 02:02
>>934
<string>は、この場合関係ないなーと思ってしなかった・・・(ヒンズースクワット2回の刑)
知らない方だから、<<やられてもこまるよぼけという意味だったんですね
const String ssの引数の関数にchar型の配列渡してもちゃんとうまくいきました。
自動でキャストしてくれるみたい。
この逆はうまくいかないけどね(あたりまえだ)。

936 :デフォルトの名無しさん:03/07/07 02:17
クラスの変数で、const宣言している変数なら公開しても大丈夫ですよね?

937 :デフォルトの名無しさん:03/07/07 02:21
>>934 自己レス
c_str 使ってたの VC5 だったかもしんない。

938 :デフォルトの名無しさん:03/07/07 02:24
>>936
別に inline 関数で getter 作っとけばいいんじゃない?

いつどのように加工して外部に公開するか分かんないんだし、
その時にコードを変えないで済むための保険になるっしょ?

939 :デフォルトの名無しさん:03/07/07 02:38
>>938
確かにそうですね
絶対にかえないと思っても変えることはありますしね

940 :デフォルトの名無しさん:03/07/07 09:00
void aaa( const string ss );

void aaa( const string& ss );

にしたほうがいいのでは?

941 :デフォルトの名無しさん:03/07/07 10:24
>>940
参照っすか?
そうですね
確かにそのほうが良いかも

942 :デフォルトの名無しさん:03/07/07 10:52
参照カウントとか使ってないヘタレな実装だと
その都度文字列の複製/削除があるしな。

943 :デフォルトの名無しさん:03/07/07 11:44
>>942
マルチスレッド対応だと参照カウント使うほうがヘタレなんだよな

944 :デフォルトの名無しさん:03/07/07 12:19
共通のコンストラクタを持つクラスを対応のID渡すだけで、生成してくれる
関数を作ろうと思っていますが、
↓こんな感じ

基底クラスがあり(他にも仮想関数等がある予定。改行多くなるのでpublic等省略)
class IUnko{
IFoo(void* lpParam);
};
それを継承したクラスを複数個書く
class CTestA : public IUnko{
CTestA(void* lpParam);
};
class CTestB : public IUnko{
CTestB(void* lpParam);
};

これの生成をIDで指定したいのです。
IUnko* Make(long id,void* lpParam);
id に 1を渡すとCTestAが作られ、
id に 2を渡すとCTestBが作られる。
みたいな。

現在、生成関数を、クラス別に作り
その関数ポインタをテーブルにして、生成する方法を考えていますが
↓こんな感じ。関数の型宣言こまかいこと忘れたので、てきとうに書いた。
IUnko* MakeA(void* lpParam);//CTestAを作る
IUnko* MakeB(void* lpParam);//CTestBを作る
MakeTbl[] = { MakeA,MakeB };
IUnko* Make(long id,void* lpParam){ return MakeTbl[id]; }

他にスマートなやり方(C++チックな方法)ありませんか?

945 :デフォルトの名無しさん:03/07/07 12:55
Factory Method だろうな、普通は。

946 :デフォルトの名無しさん:03/07/07 15:24
>>944
イベントによってIDが変化するなら普通にswitchで対処してみては。
ソース上で決まってるなら>>945のtemplate使用で決まりだな。

947 :ひよこ名無しさん ◆jECjLpAzb6 :03/07/07 15:26
純粋仮想関数って、英語で言うと、
Pure Virtual Function でOKですよね?

948 :デフォルトの名無しさん:03/07/07 15:52
はい。

949 :デフォルトの名無しさん:03/07/07 16:03
↓次スレを立ててpush_backしる。

950 :デフォルトの名無しさん:03/07/07 16:38
今日は暑い。

951 :デフォルトの名無しさん:03/07/07 17:27
あしたはさむい

952 :デフォルトの名無しさん:03/07/07 17:28
>>947
いいえ。
Virgin virtual function

953 :デフォルトの名無しさん:03/07/07 18:02
>>947
C++ 規格書 10.4.2 より抜粋
A class is abstract if it has at least one pure virtual function.

954 :デフォルトの名無しさん:03/07/07 20:37
>>943
参照カウントのロックのコストがかかるのは確かだけど、
毎回コピーするより重くなるの?
mallocだってそれなりのロックが必要だし。

955 :v(^・^)v:03/07/07 20:39
じゃあ次スレたててくるか

956 :名無し@沢山:03/07/07 20:44
>>954
おまいらよ、stringの毎回コピーするような実装では何文字以下は
フリーストア領域を使わないような実装になっているものだよ。
おまいらよ、つまりmallocは使わないんだよ。

957 :デフォルトの名無しさん:03/07/07 20:51
代わりにcallocを使うだけだけどな。

958 :名無し@沢山:03/07/07 20:57
>>957
>代わりにcallocを使うだけだけどな。
>>代わりにcallocを使うだけだけどな。
>>>代わりにcallocを使うだけだけどな。
>>>>代わりにcallocを使うだけだけどな。

おまいらよ、無知とは怖いよ。
おまいらよ、今時EffectiveSTLも読まずに議論に参加しようなんてアホだよ。

959 :デフォルトの名無しさん:03/07/07 21:01
キモイレスだなー、とおもったら、なんだ沢村だったのか。

960 :デフォルトの名無しさん:03/07/07 21:02
沢「山」

961 :名無し@沢山:03/07/07 21:08
>>959
おまいらよ、無知を暴かれたからといって
負けイヌの遠吠えのようなカコワルイのはだめだよ。

962 :デフォルトの名無しさん:03/07/07 21:13
>>954
const string に対する操作がほとんどなら、CopyOnWriteの方が
速いことが多い。内容を書き換える操作や、書き換えるかもしれない
操作(char& operator[] とか iterator begin() とか)が多いと
毎回素直にコピーする実装にしてallocatorをチューンした方がマシな
ことが多い、らしい。More Exceptional C++ 曰く。

963 :デフォルトの名無しさん:03/07/07 21:27
ヌヒらよ。

964 :v(^・^)v:03/07/07 21:32
http://pc2.2ch.net/test/read.cgi/tech/1057580107/
新スレ

やっとコピペ終わった
連投規制も沢山もうぜーー!

965 :911:03/07/07 22:38
>>916
俺も原則はそうだと思う。だけど例外的に認められてるんだっけ?という話です。
>>918
あなたの3倍はよく知ってるつもりですが:p
>>919
本当に? >>915 で私が示した void CCamera::Reject() が複雑な関数で
複数の return と例外の throw を含んでいるとしたら何が起こるか理解できますか?


966 :名無し@沢山:03/07/07 22:42
>>965
ヌヒらよ、これじゃダメなのかよ。

class CCamera {
private:
 CFilm* m_pFilm;
 struct Guardian {
  CCamera& parent;
  Guardian(CCamera& camera) : parent(camera){}
  ~Guardian() { delete parent.m_pFilm; parent.m_pFilm = NULL; }
 };
public:
 void Reject();
};

void CCamera::Reject() {
Guardian guardian(*this);
}

ヌヒらよ、これを踏まえた上でローカルクラスにする必要性があるか説明せよ。

967 :911:03/07/07 23:05
>>966
沢村よ…、たしかにそれでもできる。いやこの場合は「それでしかできない。」の方が正しかろう。
だがな、まず情報が離散しすぎてる。俺がほしいのは Java でいう finally だ。
それは言ってみれば関数の実装の詳細なのだ。
たとえ前述の例の Guardian の実装を実装ファイルに書いても
ヘッダを汚している事には変わりはない。別の関数で同じような物が必要になってもまたヘッダを汚すことになる。
いいか、これは「シンタックスシュガー」ではない。
あるべきものをあるべき姿で記述しよう!という現代的プログラミングにとって必要な事だ。
だから g++ はわざとそうしているのか?または次期仕様として濃厚なのか?というあたりが知りたかった。

あとな、「ヌヒらよ」は複数形だと思うから単数に使うのは変だと思うぞ。
最後に、age ちゃったスマソだ。

968 :名無し@沢山:03/07/07 23:12
ヌヒらよ、おれは911の三倍はよく知っているつもりだよ。

class CCamera {
private:
 CFilm* m_pFilm;
public:
 void Reject();
};

void CCamera::Reject() {
std::auto_ptr<CCamera> g(this);
}


969 :名無し@沢山:03/07/07 23:14
:p


970 :911:03/07/07 23:23
>>968==969!=966
沢村よ…。966 の沢村なら話し相手になるが、おまえはマ板かドラゴンボール板にでも移動してくれ。

971 :デフォルトの名無しさん:03/07/07 23:25
おいおい沢村じゃね〜よ。沢山くんだよ。

972 :デフォルトの名無しさん:03/07/07 23:26
たくさんくんか。

973 :デフォルトの名無しさん:03/07/07 23:27
自己顕示欲旺盛な沢村がsageでメッセージを投稿するわけないな

974 :911:03/07/07 23:29
>>971
ヌヒよ…、漏れは長い間騙されていたのだね?
いつからタクさんなんてのが蔓延るようになっていたのかね?

975 :名無し@沢山:03/07/07 23:31
ヌヒらよ、おれは「名前が無い人たちが、あっと驚くぐらい沢山いるなぁ。。」という
2ちゃんに初めて来た人の心情を表したよい名の持ち主だよ。

>>970
ヌヒよ、>>968-969むかついたのか?
ヌヒよ、おれはヌヒと同じことをしたまでだよ。

>>965
>あなたの3倍はよく知ってるつもりですが:p

976 :911(ちょっと電波板チックに):03/07/07 23:33
沢山の意味がわかたーよ。
沢山→宅さん→お宅さん→ヲタク→夏混み合ってるデヴ
でファイナリーアンサー?

977 :デフォルトの名無しさん:03/07/07 23:33


978 :デフォルトの名無しさん:03/07/07 23:37
どうでもいいから、911 は規格書の 9.8 を読んでから出直せや。

979 :911:03/07/07 23:38
>>975(デブ)
>むかついたのか?ヌヒと同じことをしたまでだよ。
違うな。>>918 は俺の能力を判断する状況もないまま「見下した表現」を使っただろ?
「あなたの3倍はよく知ってるつもりですが:p」は、それに対するメッセージだ。

ついでに言うと >>968 はもともと漏れが提示した物の意味と完全に外れた事しかしてないし、
スタックに確保されたオブジェクトだったらコアダンプ吐くだけだぞ?

もう少し勉強して出直してこいや >> 968


980 :911:03/07/07 23:41
>>978
I wrote:
> だから g++ はわざとそうしているのか?または次期仕様として濃厚なのか?というあたりが知りたかった。

981 :名無し@沢山:03/07/07 23:42
ヌヒらよ、おれはちゃんとコード読んで無かったよ。
ヌヒらよ、911とおれを生暖かく見守ってくれよ。
ヌヒらよ、ヌヒってなんだよ。

982 :デフォルトの名無しさん:03/07/07 23:44
 _ _
(o∀o) <おまいらええかげんにせえよと…

983 :911:03/07/07 23:46
>>981
> ヌヒらよ、ヌヒってなんだよ。
漏れはジョンとか沢村が頭角表してた時期にリアルヒッキーしてて
ム板に入り浸ってたけど、その時の沢村の説明だと、多分標準語でいう
「おぬし等よ」みたいな意味だという事だったと思われ。

何よりちゃんとコード読んでくれたなら天才宅さんなら何かアイディア持ってるんだろ?

984 :名無し@沢山:03/07/07 23:46
ヌヒらよ、もうおれは一度反撃にでるよ。

>>むかついたのか?ヌヒと同じことをしたまでだよ。
>違うな。>>918 は俺の能力を判断する状況もないまま「見下した表現」を使っただろ?
>「あなたの3倍はよく知ってるつもりですが:p」は、それに対するメッセージだ。

ヌヒよ、違うよ。>>911>>918の能力を判断する状況もないまま「見下した表現」を使っただろ?
ヌヒよ、以下略

985 :名無し@沢山:03/07/07 23:51
ヌヒよ、これで満足か?
ヌヒよ、精進せいよ。

class CCamera {
private:
 CFilm* m_pFilm;
public:
 void Reject();
};

void CCamera::Reject() {
 struct Guardian {
  CFilm *&p_;
  Guardian(CFilm *&p) : p_(p){}
  ~Guardian() { delete p_; p_ = NULL; }
 } guardian(m_pFilm);
}


986 :911:03/07/07 23:52
>>982
スマソ、だけど2ちゃんなんて結局そんなもんだよ。次スレ立ったなら埋め立て必要だろうし。

>>984
沢山よ、>>918==984むかついたのか?
>>918>>911の能力を判断する状況もないまま「見下した表現」を使っただろ?
>>918よ、>>911>>918と同じことをしたまでだよ。
recursive....stack over flow.

987 :911:03/07/07 23:54
>>985
いや、解放するべきメンバが複数個あった時には?解放するべきか判断する材料が他のメンバだった時には?
いちいち全部渡すのは面倒くさすぎるという話からすべて始まってるわけですよ。

988 :911:03/07/07 23:56
ちなみにローカルクラスと関数内のローカル変数の関係は more exceptional C++ あたりに
興味深い解説が載ってるよ。

とかせめてもの罪滅ぼしにちょっと情報提供とかしてみた。

989 :名無し@沢山:03/07/08 00:00
ヌヒよ、おれは918じゃないよ。
ヌヒよ、おれには918はやさしいアドバイスに見えるよ。

ヌヒよ、これでおれのやさしいアドバイスもこれで最後だよ。

class CCamera {
private:
 CFilm* m_pFilm;
void Reject_impl();
public:
 void Reject();
};

void CCamera::Reject() {
try{
Regect_impl();
}catch(...){
}
delete m_pFlim;
m_pFlim=0;
}
void CCamera::Reject_impl() {
}

990 :デフォルトの名無しさん:03/07/08 00:08
ヌヒ=奴婢=召し使い

991 :911:03/07/08 00:15
>>989
やさしいアドバイスをたくさんありがとう。

その手法は厨房の頃からやってるが…
・戻り値が参照やポインタではなくて大きなオブジェクトだった場合の負荷が大きい
という大問題があるのだよ。
さらにそのソースだと Reject_impl が意味のある例外を投げたけど投げなおしたい時どうする?
Reject() の catch の中に同じ事何度も書くのは無駄かつミスの元だよね?

992 :デフォルトの名無しさん:03/07/08 00:18
>>987
ScopeGuard 使おう。

993 :デフォルトの名無しさん:03/07/08 00:19
よし藻前ら!セントリーノモバイルテクノロジ合戦いくぞー!

994 :911:03/07/08 00:27
>>992
ありがとうございまふ。
ぐぐったけど英語のページしか出てこないです。
(もっと詳しく調べるために)ある程度あたりをつけたいので
何なのかさらっと教えていただけると助かります。
つたない英語力でちょびっと読んだ所は boost の一部?もしくはパターン名?


995 :デフォルトの名無しさん:03/07/08 04:55


996 :デフォルトの名無しさん:03/07/08 05:33


997 :デフォルトの名無しさん:03/07/08 05:45
犯人は松子

998 :デフォルトの名無しさん:03/07/08 05:49


999 :デフォルトの名無しさん:03/07/08 06:33
1000を取るのは誰でしょね?

1000 :デフォルトの名無しさん:03/07/08 06:47
1000

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

241 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)