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


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

C++相談室 part11
1 名前:v(^・^)v :02/09/18 19:42
文法が汚くてもいいから、懐の広い言語を望むあなた。そんな
あなたにぴったりの言語、C++。
(´∀`).。o(関連URLは>>2-5の辺り)

2 名前:デフォルトの名無しさん :02/09/18 19:44
松本コンチータ

3 名前:v(^・^)v :02/09/18 19:50
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/

Boost
http://www.boost.org/
STLport
http://www.stlport.org/
Loki
http://www.moderncppdesign.com/
Loki for VC7(LokiPort)
http://www.geocities.com/rani_sharoni/LokiPort.html


4 名前:v(^・^)v :02/09/18 19:52
過去ログ
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/test/read.cgi/tech/1021787032/
Part8
http://pc3.2ch.net/test/read.cgi/tech/1025010364/
Part9
http://pc3.2ch.net/test/read.cgi/tech/1027347982/
part10
http://pc3.2ch.net/test/read.cgi/tech/1029315669/

5 名前:v(^・^)v :02/09/18 19:52
ISO/IEC 14882 International Standard
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf

■関連スレ■

VisualC++相談室 3
http://piza2.2ch.net/tech/kako/993/993186053.html
VisualC++相談室 4
http://pc.2ch.net/tech/kako/1002/10021/1002165477.html
VisualC++相談室 5
http://pc.2ch.net/tech/kako/1006/10068/1006834463.html
VisualC++相談室 6
http://pc.2ch.net/tech/kako/1011/10116/1011615035.html
VisualC++相談室 【7】
http://pc.2ch.net/tech/kako/1017/10178/1017843192.html
VisualC相談室 【8】
http://pc.2ch.net/test/read.cgi/tech/1022499000/

C++Builder相談室
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=969458279
新C++Builder相談室(C++Builder相談室 Part2)
http://pc.2ch.net/test/read.cgi/tech/997074601/
C Builder相談室 Part3
http://pc3.2ch.net/test/read.cgi/tech/1016065855/

6 名前:デフォルトの名無しさん :02/09/18 20:05
C++にはクラスとかSTLとか色々ありますけど、最低限どれを覚えれば
C++を使いこなしているといえますか?
あと、C++を覚えただけじゃプログラムは作れないと聞きましたが、
他にどんな事を知る必要がありますか?
数学関係とかの知識なら大丈夫だと思います。

7 名前:デフォルトの名無しさん :02/09/18 20:16
>>1
ギリギリスレ勃テ乙ー

8 名前:デフォルトの名無しさん :02/09/18 20:18
>6
//が使えれば大丈夫。

9 名前:デフォルトの名無しさん :02/09/18 20:19
>374 名前:デフォルトの名無しさん sage 投稿日:2002/09/18(水) 03:03
>オブジェクトを直接宣言する場合と、
> CTest oObj(Hoge);
>一旦ポインタの形で宣言しnewする場合は、
> CTest* pObj;
> pObj = new CTest(Hoge);
>どのように使い分ければいいのでしょうか?
>375 名前:デフォルトの名無しさん sage 投稿日:2002/09/18(水) 03:10
>スコープを外れても残したい時はnew

前スレで↑を見て「なるほど」と納得していたのですが、
newするしたらdeleteしなければならない、となぜかわからずでも覚えてるの
ですが、この場合スコープ抜けちゃうとdeleteできませんよね?
本にはnet<->deleteとセットで書かれているので
理解できません。どうしてでしょうか?



10 名前:デフォルトの名無しさん :02/09/18 20:22
>>9
コンストラクタでnewしてデストラクタでdeleteするとか。<スコープ抜けてからdelete

>>6
ちょとずれるが,C++プログラミングとSTLプログラミングは何となく毛色が違うと思う。
自称C++プログラマがListクラスとか作っててアフォかとオモタ。

11 名前:10 :02/09/18 20:24
切れた。

だからSTLバリバリの人はSTLプログラマと名乗って欲しい。

で,「C++を使いこなしている」とは
>>8
・クラス
・iostream
ぐらいでよいのでは?

12 名前:10 :02/09/18 20:25
・new delete
・例外
も。

13 名前:デフォルトの名無しさん :02/09/18 20:26
>>10
ということは変数をクラスに持たせるということですよね。
そうすると、クラスに
CTest oObj(Hoge);
で宣言するのと
CTest* pObj;
pObj = new CTest(Hoge);
で宣言しnewするのとはどのように使い分ければいいのでしょうか?

>>9の代わりに質問してみるテスト

14 名前:10 :02/09/18 20:28
>>13
ポインタ宣言しておくのは多態性を実現したい時とか,
生成を遅らせたい時とか場合によっては生成しなくてもいい時とか。


15 名前:9 :02/09/18 20:28
>10
えっとさっきの例で話すと、
CTest *pObj(Hoge);
pObj=new CTest(Hoge);
って領域確報しちゃうとスコープ抜けたら
領域は確保されたままですが、*pObjはもう使えないですよね?
スコープ内でdelete pObjとするならわかるのですが、
この例だとスコープ抜けたらdeleteできないんじゃないんでしょうか?
deleteする必要はあるんですよね?

16 名前:10 :02/09/18 20:30
>>15
func()
{
  CTest* pObj;
  pObj = new CTest(Hoge);
  return;
}
だと思ってるの?
たぶん前スレ375はそういう風には捕らえてないと思われ。

17 名前:9 :02/09/18 20:39
>16
元質問者の方のオリジナルのコードは
VCでMDIを作成する時に自動作成される↓なんですが、
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_MDITYPE,
RUNTIME_CLASS(CMDIDoc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CMDIView));
この例だと>16に書かれている形式と同じですよね?
もちろんこの後deleteはありませんでした。
スコープ抜けたらdelete pDocTemplateはできないでしょうし、
なぜdeleteしなくていいのか、というのが悩みの種です。

18 名前:デフォルトの名無しさん :02/09/18 20:39
>>16
正しくは?

19 名前:10 :02/09/18 20:59
>>17
deleteしてないんだったらしてないんじゃない?

>>18
CTest* pObj; // どこか(グローバルとかクラス面罵とか)
---------------------
pObj = new CTest(Hoge); // どこか

だと思ったんだと思う…。

20 名前:デフォルトの名無しさん :02/09/18 21:01
>>19
deleteしなくてメモリリークは起きないの?

21 名前:10 :02/09/18 21:10
>>20
起きるよ?

22 名前:デフォルトの名無しさん :02/09/18 21:19
pDocTemplateをその後一切さわってないの?
どこかに登録とかしてるはずなんだが。

もし、そうでないならリークしてるかnewをオーバーライドしてる

23 名前:9 :02/09/18 21:20
>19
じゃなぜ>17のコードはdeleteしてないんでしょうか?
>21を見るとnew したら deleteしなきゃいけないんですよね?
少なくとも>17のコードはreturn TRUE;までの間に
delete pDocTemplate;
という文はありませんでした。
deleteしなければメモリリークが発生するというなら
どこでdeleteしてるのでしょうか?
話しがVCに流れてますがVCスレへ戻った方がいいでしょうか??

24 名前:デフォルトの名無しさん :02/09/18 21:21
ちなみに、この場合無限に生成される物じゃないから
リークしても別に構わない程度の物だとは思うが。

25 名前:10 :02/09/18 21:22
>>17
「元質問者」さんに聞いて見るのが吉なのでは?

26 名前:10 :02/09/18 21:24
>>23
何かかたくなに「deleteしなきゃいけない」って思いこんでるみたいだけど,
deleteしないコードは動かないってわけじゃないですよ。
実装がちゃんとしてる環境ではdeleteしなくてもプログラム終了時には解放されますよ。
(細かく突っ込まないでね。fjじゃないんだからさ)

あとC++の話題だと思うんで大丈夫だと思います。

27 名前:9 :02/09/18 21:26
>22
確かに基底クラス(CObject)でオーバーライドされてました。
void* CAge::operator new(size_t nSize)
{
return malloc(nSize);
}
こんな感じです。
私は「malloc」のことよくわかっていないので
これ以上追求できないようです。
基本的にnew したら deleteしなければならないのは確か。
ということはわかりました。
またおいおい覚えていきたいと思います。
ありがとうございました。

28 名前:デフォルトの名無しさん :02/09/18 21:27
>>26
ちゃんとデストラクタは呼ばれますか?

29 名前:9 :02/09/18 21:28
>27で結論付けたはずが
>26を読ませてもらったところ間違いだと早速気付きました。
newすればかならずdeleteしなくてはならないというわけではない。
に訂正いたします。
実際私のレベルではこれ以上ついていけないっぽいので
例外を除いてdeleteは必ずしろっ、
と覚えておきますw
ありがとうございました。

30 名前:10 :02/09/18 21:29
>>28
呼ばれませんよ?

31 名前:デフォルトの名無しさん :02/09/18 21:30
>>27
mallocはメモリを確保する命令。確保した後はfreeで解放しなければならない。

32 名前:10 :02/09/18 21:32
>>29
いや,deleteはしなきゃいかん。
が,deleteしてないからといって「動かない」というわけではない。
しかし,「動く」と言っても,「完全に設計どおりに動く」というわけではない。(>>28が指摘してるけど)

33 名前:デフォルトの名無しさん :02/09/18 21:33
>>30
deleteしない終了時に解放されるのはメモリだけということですか。
deleteして終了するのとdeleteしないで終了するので違いがあるということですね。

34 名前:10 :02/09/18 21:33
最後の行訂正します。

しかし,「動く」と言っても,「完全に設計どおりに動く」というわけではない。(>>28が指摘してるけど)

しかし,「動く」と言っても,「完全に設計どおりに動く」とは限らない。
「設計通りに動くかもしれないし動かないかもしれない」(>>28が指摘してるけど)


35 名前:10 :02/09/18 21:34
>>33
そういうことです。メモリ以外の資源はリークする可能性があります(使っている場合)

36 名前:デフォルトの名無しさん :02/09/18 21:42
deleteしたときしなかったとき…の動作については10氏の通りだが、

>>23
特に CMultiDocTemplate に関して言うなら、こいつはコンストラクタの中で自分を
CDocManagerというクラスのオブジェクトに自分を登録しておいて、
 // pDocTemplate = new CMultiDocTemplate(IDR_MDITYPE, ... );
 // ここの中でDocManagerに登録↑
で、例えばCDocManagerのデストラクタの中からdeleteが呼ばれる
ようになっているのでとりあえず心配は要らん。

37 名前:9 :02/09/18 21:46
>36
あぁ、なるほど、
全て納得いきました。
そいういう流れだったんですね。
全部納得いってすっきりしました。
ありがとうございました。
感謝。

38 名前:デフォルトの名無しさん :02/09/18 21:47
ごちゃごちゃしてきたな。さかのぼって始めらへんのやつ>>15をコピペしてみよう。
答えが出てないみたいだから。

15 :9 :02/09/18 20:28
>10
えっとさっきの例で話すと、
CTest *pObj(Hoge);
pObj=new CTest(Hoge);
って領域確報しちゃうとスコープ抜けたら
領域は確保されたままですが、*pObjはもう使えないですよね?
スコープ内でdelete pObjとするならわかるのですが、
この例だとスコープ抜けたらdeleteできないんじゃないんでしょうか?
deleteする必要はあるんですよね?


39 名前:デフォルトの名無しさん :02/09/18 21:51
>>38
混乱させるな

40 名前:10 :02/09/18 22:01
>>38->>39
ワラタ

41 名前:10 :02/09/18 22:02
>>36さん解説ありがとう。ぼくも納得しました。
>>37お疲れ様

42 名前:元質問者 :02/09/18 22:25
私の質問が続いているみたいだったので顔を出しました。
まず、
>25
これは私が書いたコードではなくVC++というツールが吐く
スケルトンです。

なぜMDIスケルトンがnewを使うかを確認するために、下記にコード変更
staticCMultiDocTemplate oDocTemplate(
IDR_TEST33TYPE,
RUNTIME_CLASS(CTest333Doc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CTest333View));
AddDocTemplate(&oDocTemplate);
ビルドして実行すると、予想に反して何事もなく動作しました。
(アプリ抜けるときに例外発生するけど、もともとnewを想定した>36辺りの処
理の問題だと思われます。あまり重要でないと思う。)

→普通のオブジェクトでいいものを何でnewしてるんだろう?
 →Win9X系のリソース(640KByteの)問題で、ヒープにCMultiDocTemplate
  のエリアを確保したかったのでは?(子ウインドが何枚開かれるのか分か
  らないので)
と言うことでリソースメータを起動して、オブジェクトの場合とnewの場合と
で、それぞれ子ウインドを1000枚開いて比較。
→結果、リソース使用量変わらず。

ここまでやって、”なんか知らんがnew使った方がいいんだろう。”
という結論に達しました。また気が向いたら解析することにします。
(今度はこっちがスレ違いに、、、)

43 名前:元質問者 :02/09/18 22:39
よく考えたらstaticもヒープに取られるんだっけ?
>42 ではリソース問題の確認にならない可能性大。

44 名前:デフォルトの名無しさん :02/09/18 23:04
MFC のことはよく分からんが、
>>42
> 普通のオブジェクトでいいものを何でnewしてるんだろう?
その CMultiDocTemplate っつーのをクライアントが動的に生成できる
ようにするためなんでは。

しかし、おれは 36 の説明じゃ訳分からんかったよ。42 の
> AddDocTemplate(&oDocTemplate);
で分かったけど。36 もこのことが言いたかったんだね。

>>43
> よく考えたらstaticもヒープに取られるんだっけ?
んなことはない。

45 名前:デフォルトの名無しさん :02/09/18 23:13
>>44
うお、じゃstaticはどこに取られるんだ?急に足下がおぼつかなく
思えてきたYO…。


46 名前:デフォルトの名無しさん :02/09/18 23:22
data とか bss とか。

47 名前:  :02/09/19 00:20
>>42
CWinAppのメンバ
CDocManager* m_pDocManager;
オブジェクトにCDocTemplate*渡されてポインタ管理が任されているみたいだね。
それで
CDocManager::~CDocManager()できちんと解放されているようだ。
delete m_pDocManager;
はCWinAppのデストラクタで呼ばれている。

staticにするとアプリ終了時に2重にデストラクタが呼ばれるから例外が呼ばれる
ようだけど。

48 名前:デフォルトの名無しさん :02/09/19 03:20
ちょっと話ズレるんですけど、実体で持つ場合とポインタで持つ場合の違いで
クラスAがクラスBをメンバに持ちたい時
実体持ちの場合のクラスAのサイズ=sizeof(クラスA)+sizeof(クラスB)
ポインタ持ちの場合=sizeof(クラスA)+sizeof(ポインタ)
となって、実体持ちだとコピーの時にオーバーヘッドが発生
という事であってますか?

更に突っ込んで、実体持ちだとクラスBの実装が変わってサイズも変わったりすると
クラスAに関しても再コンパイルが必要になるけど
ポインタ持ちだとクラスBの再コンパイルだけでいいって事であってますか?

49 名前:デフォルトの名無しさん :02/09/19 03:27
全然違う

50 名前:デフォルトの名無しさん :02/09/19 09:53
CreateWindowで作ったボタンのフォントを変えたいのですが
CreateFontしてGetDCしてSelectObjectしてみたのですが変わりません
やり方的にはこれでいいんでしょうか?

51 名前:デフォルトの名無しさん :02/09/19 09:58
>>50
スレ違い。

Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/


52 名前:!=49 だが :02/09/19 10:50
>>48
49> 全然違う、だけじゃアレなんで (w

> 実体持ちの場合のクラスAのサイズ=sizeof(クラスA)+sizeof(クラスB)
実体持ちの場合のクラスAのサイズ=sizeof(クラスA) だが?
というツッコミは置いといて、48 の言いたいことは、
実体持ちの場合のクラスAのサイズ=sizeof(クラスA - クラスBのメンバ) + sizeof(クラスB)
ってことだろうけど、メンバを4バイトとか8バイト境界にアライメント
させてる場合は、違ってくる可能性がある。

> 実体持ちだとコピーの時にオーバーヘッドが発生
ポインタ持ちだとオーバーヘッドが発生しないわけでもない。
クラスAのコピーコンストラクタの作りによる。

> ポインタ持ちだとクラスBの再コンパイルだけでいいって事であってますか?
これは合ってるかな。この場合は、クラスAを定義しているところで
クラス B を定義しているヘッダファイルをインクルードしないようにね。

53 名前:52 :02/09/19 10:55
まちがえた。
> > ポインタ持ちだとクラスBの再コンパイルだけでいいって事であってますか?
> これは合ってるかな。
合ってない(w
クラス A の定義をインクルードしている、他のファイルは再コンパイルの
必要がない。クラス A の実装ファイルは、(たぶん クラス B を使っているので)
再コンパイルが必要だろう。

54 名前:デフォルトの名無しさん :02/09/19 11:01
C++のコンパイル速度はこれ以上速くなりそうもないな。

55 名前:52 :02/09/19 11:03
再三スマソ。
ようするに、クラス A の実装からクラス B の実装が見えるのなら再コンパイル。
見えないなら不要、ということ。クラス間の依存はできるだけ減らすようにがんがれ。
ちなみにおれは、pimpl パターンがお気に入りだ。

56 名前:デフォルトの名無しさん :02/09/19 12:29
>>54
何を基準にして「これ以上」なのか知らんが、書き方に気をつけると、それなりに
は速くなる。インターフェースと実装を分離して、ヘッダファイル間の依存関係を
減らすとかさ。

(あと gcc は遅すぎ)

57 名前:デフォルトの名無しさん :02/09/19 13:59
今家(linux)で作ったプログラムを学校(solaris)コンパイルしています。
でも、家では警告だけだった
char* a = NULL;

char* a = (char*)NULL;
に直さないと駄目になりました。
なぜでしょうか?また直さないでコンパイル通したいのですが駄目ですか?

58 名前:デフォルトの名無しさん :02/09/19 14:08
>>57
C++だから NULLが(void *)0などと定義されているためエラーになったの
だろう。

検索かけてNULLを0にしる。

59 名前:デフォルトの名無しさん :02/09/19 14:09
もっと簡単な方法があった。

#undef NULL
const int NULL = 0;

60 名前:デフォルトの名無しさん :02/09/19 14:14
>>57
ちょっとstddef.hを覗いてみて欲しい。次のような行が書かれてないか?

#ifndef NULL
# if defined(__cplusplus)
# define NULL 0
# else
# define NULL ((void *)0)
# endif
#endif

61 名前:デフォルトの名無しさん :02/09/19 14:16
コンパイル時間って何かに影響すんの?

62 名前:デフォルトの名無しさん :02/09/19 14:18
>>58, 59, 60
みんな、がりがとう。自分で
#define NULL((void*) 0)
と定義してたのが不味かったみたいです(w;

63 名前:デフォルトの名無しさん :02/09/19 14:55
メンバ関数ポインタを作ろうとしているのですがうまくいきません
下の(a.*pP)()のところでコンパイルエラーになってしまいます
書き方が違うのでしょうかおしえてください

class A{
private:
int a;
public:
void (A::*pP) ();
A(){pP = Print;}
void SetA(int s){a = s;}

};
int main()
{
A a;
a.SetA(100);
(a.*pP)(); //error
return 0;
}

64 名前:デフォルトの名無しさん :02/09/19 15:53
>>61
開発効率

とくにバグとりのときに、

1. バグをとる
2. コンパイルする
3. テストする

のサイクルが遅いと嫌。

65 名前:デフォルトの名無しさん :02/09/19 15:56
>>61
精神的ストレス

66 名前:デフォルトの名無しさん :02/09/19 16:35
>>63
えーと・・・
ネタ?

67 名前:デフォルトの名無しさん :02/09/19 16:50
>>63
PrintってAのメンバなのかい?

68 名前:63 :02/09/19 16:56
すいません
A::Print() がぬけてました

69 名前:デフォルトの名無しさん :02/09/19 16:56
>>61
コンパイルに12時間もかかるプロジェクトとかやったやつ、いる?
そんな本読んだよ。

70 名前:デフォルトの名無しさん :02/09/19 17:01
大体平均的なコンパイル時間ってどのくらい? 規模にもよるとは思うが。

71 名前:デフォルトの名無しさん :02/09/19 17:02
>>63
もっぺんソースさらせ

72 名前:デフォルトの名無しさん :02/09/19 17:04
pPがAのメンバなのだから (a.*(a.pP))(); こうしなければならないんでは。


73 名前:デフォルトの名無しさん :02/09/19 17:09
>>70
俺のプロジェクトは大体20秒だな。

74 名前:デフォルトの名無しさん :02/09/19 17:23
>>72
それだ!

75 名前:デフォルトの名無しさん :02/09/19 17:25
ビルドに1時間かかるプロジェクトってどんなもんよ?
100万行くらい?

76 名前:63 :02/09/19 17:48
>>72
ああコンパイル出来ました
ありがとうございます。

77 名前:デフォルトの名無しさん :02/09/19 18:08
なるほどこのようになるのか。

class A {
private:
int a;
public:
void (A::*pP)() const;
A() { pP = &A::Print; }
void SetA(int s) {a = s;}
void Print() const { std::cout << "a = " << a << std::endl; }
};
int main()
{
A a;
void (A::*pP2)() const;

pP2 = A::Print;
a.SetA(100);
(a.*(a.pP))();
(a.*pP2)();
}

78 名前:デフォルトの名無しさん :02/09/19 18:22
>>70
手元のテンプレートライブラリ使いまくりの C++ 20,000 行のコードで、フルビルド
2分30秒。Pentium III-M 800MHz / VC6 / 最適化 速度優先

C++ が危険なのは、注意して書かないとファイル間に依存関係が容易に発生
してしまい、ひとつファイルを書き換えたらフルビルドに近い状態になってしまう
こと。上でも誰かが言ってた pimpl イディオムや、インターフェースと実装の分
離を徹底しないと、規模が大きいプロジェイクトでは破綻するよ。

79 名前:デフォルトの名無しさん :02/09/19 18:40
pimplはテンプレートの旨みを2つ消す
・インライン展開
・コードの短縮、簡略化

80 名前:デフォルトの名無しさん :02/09/19 18:48
インターフェースと実装の分離でよい本ある?
具体例のあるやつ。

81 名前:デフォルトの名無しさん :02/09/19 19:42
>>78
プリコンパイル済みヘッダは適切に設定してる?
テンプレート使いまくり、33万行のC++コード
Pentium III 800MHz / VC6 / 最適化 速度優先
でフルビルド2分。

82 名前:前スレ979 :02/09/19 21:38
遅レスだけど前スレ982と984へ。

intやらshortやらも含めて全てのクラスの基底にvoid型のクラスがあるという仮定での話。
この仮定の下ではvoid *はvoidを指すポインタと言う事ができる。

83 名前:78 :02/09/20 00:03
>>81
抜かりはないつもりだったんだが、設定ミス見付けた(w
修正後は 40 秒に短縮。Thanks.

84 名前:デフォルトの名無しさん :02/09/20 00:05
>>79
前者は、それは使いどころを間違ってる。pimpl を使って実装を隠すべき
なのは、もともと仮想関数経由で呼ばれるような部分。

85 名前:デフォルトの名無しさん :02/09/20 00:50
>>84
勿論そんなことわかってるよ。
ただ、テンプレート使いまくりでのコンパイル速度の低下の
解消法として使った場合は>>79のようになるだろ?


86 名前:デフォルトの名無しさん :02/09/20 02:09
>>85
テンプレートの場合には、ヘッダ間の依存関係は (それほど) 発生しないと
思うんだが。気のせい?

87 名前:デフォルトの名無しさん :02/09/20 02:55
コンパイルが遅いとかいうのは処理系依存の話だよねえ

88 名前:デフォルトの名無しさん :02/09/20 11:30
>>87
フルビルドの場合はそういう側面が強いが、
差分コンパイル(という言い方あるよな)なら処理系に依存しない
テクニックがあってよくネタになる。
上の pimpl イディオムとかな。

89 名前:デフォルトの名無しさん :02/09/20 13:29
>>87
処理系間の比較みたいな話になると、逆にこのスレの方が良いかも。gcc スレ
や VC スレだと、その処理系以外の話はスレ違いだからねぇ。

90 名前:デフォルトの名無しさん :02/09/20 22:46
VC++ って、メンバ関数テンプレートの特殊化はできなかったっけ?

class Foo {
public:
template<class T> void func( const T& obj );
};
template<> void Foo::func( const int& obj ) { } // これがエラー
int main(){
Foo().func( int() );
return 0;
}

foo.cpp(5) : error C2511: 'func' : オーバーロードされたメンバ関数が '<Unknown>' にありません。
というようなエラーになるんだけど。

91 名前:デフォルトの名無しさん :02/09/20 22:50
C++コンパイルおせーな。
2分や40秒もかかるのかよ。

92 名前:デフォルトの名無しさん :02/09/20 23:03
昔は一晩がかりでしたが何か

93 名前:デフォルトの名無しさん :02/09/20 23:33
昔結果出るまでに1週間かかったことありましたが何か

94 名前:93 :02/09/20 23:34
しまった。コンパイルの話じゃなかった。スモァソ。
プログラム作って穴開けてもらって実行してもらって結果もらうまでが1週間ですた

95 名前:デフォルトの名無しさん :02/09/21 00:13
おじいさん、昔話ばっかり言わないでよ。

96 名前:デフォルトの名無しさん :02/09/21 00:35
昔はマイコンにつきっきりでフロッピー入れ替えながらコンパイルしましたが何か

97 名前:デフォルトの名無しさん :02/09/21 00:51
>>91
だから分割コンパイル重要なんですよ。

98 名前:デフォルトの名無しさん :02/09/21 01:02
カーネルのリビルドやユーザーランドのリビルドは時間かかるぞ〜
この間のリゾルバの騒ぎのときは、リコンパイルに20時間かかった。

99 名前:デフォルトの名無しさん :02/09/21 01:36
> template<> void Foo::func( const int& obj ) { } // これがエラー
じゃなくて
template<int> void Foo::func( const int& obj ) { }
だったりしなかったっけ。

100 名前:デフォルトの名無しさん :02/09/21 04:52
>>90
VCはまだクラス定義の外でのスペシャライゼーション定義には対応してないよ。

101 名前:90 :02/09/21 14:19
さいでしたか…
しかたがない、非メンバ関数でやることにします。
でも、クラス内で specialization できても意味ないよねぇ。
たんなる多重定義と変わらんもん。

102 名前:デフォルトの名無しさん :02/09/21 20:40
>>101
まったく無意味でもないかな
ユーザーによるクラス定義外でのスペシャライゼーション
定義を可能にすることは、隠蔽されるべき非公開メンバへの
自由なアクセスを許すに等しいからね。

103 名前:デフォルトの名無しさん :02/09/21 21:56
なるほど。その視点は気づきませんでした。
ということは、非メンバ関数のテンプレートでも friend にしたら
同じ問題をかかえるということか。


104 名前:デフォルトの名無しさん :02/09/22 19:06
struct A
{ int a; };

struct B : A
{ int b; };

void func(A arry[4])
{
 for(int i = 0; i < 4; i++)
  arry[i].a = 0;
}

void test(void)
{
 B m[4];
 func(m);
}
これコンパイル通るのっていいの?

105 名前:デフォルトの名無しさん :02/09/22 19:21
>>104
何か問題?
func(A arry[4])はfunc(A *arry)と同等で
func(m)ではmが標準変換でB*に変換され
B*からA*へのアップキャストは標準だから

106 名前:デフォルトの名無しさん :02/09/22 19:32
コンパイルは通るのが正しい(↑のようにポインタの変換だから)
でも、一般的に、親クラスの配列(の先頭要素へのポインタ)が求められているところに
子クラスの配列を渡してはいけない。参照扱いでも同様。
理由はEffective C++(Moreかも)に書いてあったと思った。

107 名前:104 :02/09/22 19:41
よくよく考えればそうだった。
実はそれが本題でなく…
後少し時間をください。

108 名前:104 :02/09/22 19:59
template<class T>
struct A
{
 T a,b;
};

struct B : A<int>
{
 //関数だけ
};

template<class T>
void func(A<T> *a)
{
}

void test(void)
{
 B m[3],*n;
 func(m); // NG
 func(n); // OK
}

'B [3]' から 'A<T> *' に変換できません。
と言われます。なぜm[3]を*mと解釈してくれないんですかねぇ?


109 名前:デフォルトの名無しさん :02/09/22 20:05
>>108
キャストが行われないから

110 名前:デフォルトの名無しさん :02/09/22 20:18
stringの配列の個数分ループさせるロジックを使いたいのですが、
配列の個数を取得する方法がわかりません、教えてアルゴマン。

111 名前:デフォルトの名無しさん :02/09/22 20:23
vector使え

112 名前:104 :02/09/22 20:23
テンプレートを使うとキャストされないんでしょうか??
func<int>(m);
func(&m[0]);
なら可能なんですが、他の型同様にfunc(m)で素直に渡したいと考えいるので・・・
なんとかfunc(m)で渡す方法はないですか?

飯買いに行ってきます。

113 名前:デフォルトの名無しさん :02/09/22 20:30
bcc では通った。> func(m);


114 名前:デフォルトの名無しさん :02/09/22 20:41
C++ 3rd の 13.3.2 [3] によれば
「テンプレート引数の推測によって決まったテンプレート関数引数には、
格上げ、標準変換、ユーザー定義変換を適用することはできない」とある。
ということは、引数の推測の際には、継承関係などは全く考慮されない
ということではないか。


115 名前:デフォルトの名無しさん :02/09/22 20:44
>他の型同様にfunc(m)で素直に渡したい
のであれば、
inline void func(B *a) { func<int>(a); }
でも定義しておけばよいかと。

116 名前:デフォルトの名無しさん :02/09/22 20:52
ということは func(&m[0]) も本当なら駄目っていうことになるか。

117 名前:デフォルトの名無しさん :02/09/22 21:12
>>108
実際問題として、変更されたら困ることが多いからだろう。struct B にメンバ変数が
あったら func 内で a[1] とかに触ると、確実に値を壊すし。

っつか継承を使うなら配列は忘れて vector 使え。その方が身のためだ。

118 名前:デフォルトの名無しさん :02/09/22 22:59
>>117
継承との関わりで、配列とvectorの間に特別な違いは無いと思う。
どっちを使っても一緒。
そして、継承するようなオブジェクトの実体はvectorなどに入れるべきでは
ない。m1, m2, m3という3個の変数と同じ程度の気持ちで配列に入れるのは
問題ないけど、vectorを使う、ということは実行時に値を追加したい、
ということで、その場合はvector<B*>かvector<shared_ptr<B> >を使うべき。

119 名前:デフォルトの名無しさん :02/09/22 23:05
>>118
> 継承との関わりで、配列とvectorの間に特別な違いは無いと思う。
いや delete[] の罠がある。

120 名前:デフォルトの名無しさん :02/09/23 01:05
保守

121 名前:104 :02/09/23 01:49
かなり遅くなってしまいましたが、レスを。
色々やって見ましたが駄目でした。
func(T *a)で取って、内部でA<T>に変換するこで妥協を…
こんな感じに↓
template<class T>
void func(T *a)
{
 A<T::value_type> *b = a;
 // (;´Д`)ハァハァ・・・な処理
}

やっぱり標準変換ということで引っかかってるようでした。
func(&m[0])は通るのに・・・
標準変換とかでエラーをだすのはVCだけなんかな?bccはOkらしいし。
STLは覚え中なんで今度の機会に・・・。
mで渡すのにこだわっていたのは&m[0]でしか渡せないのは
非常に分かりにくいと思いまして。(実はもう少し複雑)
ご迷惑お掛けしました。そしてありがとうございました。

寝ます。

122 名前:デフォルトの名無しさん :02/09/23 02:33
>>121
// (;´Д`)ハァハァ・・・な処理

どんな処理やねん(w


123 名前:デフォルトの名無しさん :02/09/23 14:46
下記のようなプログラムを書いたのですが、コンパイルエラーが出ます。
エラーの中身を見るとchar型にint型を入れることができないと言うことなのですが
どうすればよいかイマイチわかりません。わかる方、教えてください。

main()
{
int a,b,c,title;
char file[64];
char name[64];
FILE *fp;
a=0;
b=1;
c=10;
title=10;

for(int x=0;x<title;title++)
{
name=title".dat";
strcpy(file,name);
fp=fopen(file,"a");
for(a=0;a<c;++a)
{
b=b+b;
printf("%d\n",b);
fprintf(fp,"%d\n",b);
}
fclose(file);
}
}

124 名前:デフォルトの名無しさん :02/09/23 15:02
エラーの原因は
name=title".dat"; <-- ここ
C++は int(整数) から文字列への自動変換はサポートしていないので
自分で、やらなければならない。

しかし、このプログラムにはそれ以外にも
title=10;
for(int x=0;x<title;title++)
fclose(file); 
などなど、バグだらけだからもう一回初めから作り直した方が
良いと思ふ

125 名前:123 :02/09/23 16:16
>>124
ありがとうございます。
一から書き直します

126 名前:デフォルトの名無しさん :02/09/23 17:02
みんなstringをintにするのどうしてる?
それと逆の場合。

127 名前:デフォルトの名無しさん :02/09/23 17:06
string → int ... atoi()
int → string ... stringstream

128 名前:デフォルトの名無しさん :02/09/23 17:06
>>126
> みんなstringをintにするのどうしてる?
> それと逆の場合。

その時次第。

129 名前:デフォルトの名無しさん :02/09/23 17:14
boost::lexical_cast


130 名前:デフォルトの名無しさん :02/09/23 17:58
>>123 さんの場合は snprintf が最適解かもっすね。
snprintf( name, 64, "%d.dat", title );
# snprintf がなければ sprintf っすか。
# C++ というよりは C なので sage

131 名前:デフォルトの名無しさん :02/09/23 21:01

#include <boost/lexical_cast.hpp>
#include <string>

void f(){
std::string s = "10";
int i = boost::lexical_cast<int>(s);
i += 2;
s = boost::lexical_cast<string>(i);
}

132 名前:126 :02/09/23 21:07
意外に多くのレスありがとう。
ちなみに俺は、>>127さんと同じです。
もちろん、ケースにもよりますが。
実は、ちょっとatoiはなんか古臭い感じがして、
stringstreamは大げさな感じがしていたのですが、
ちょと安心しますた。

133 名前:デフォルトの名無しさん :02/09/23 22:05
lexical_cast は、"0x10~ とかの16進数を扱えない気がしたが

134 名前:デフォルトの名無しさん :02/09/23 22:27
>>133
lexical_castは内部でstringstreamを使ってるので、ちょこっといじれば出来るようになる。

135 名前:デフォルトの名無しさん :02/09/23 23:58
>>133
特殊化すれば出来る。

136 名前:デフォルトの名無しさん :02/09/24 00:12
>>135
おいおい、文字列を扱う部分をフル実装しなけりゃならんの?

137 名前:デフォルトの名無しさん :02/09/24 01:17
136==あふぉ


138 名前:デフォルトの名無しさん :02/09/24 02:39
とりあえずlexical_cast.hppを見れ。激しく短いぞ。

139 名前:デフォルトの名無しさん :02/09/24 03:25
>>138
激しく短くても、lexical_cast<const char*>を特別化したら
自分で中身を全部かかなきゃだめと言ってみるテスト

140 名前:デフォルトの名無しさん :02/09/24 03:29
>>139
それは仕方ないかと。
lexical_castは拡張を予想して作られたものではないだろうし。

141 名前:デフォルトの名無しさん :02/09/24 04:46
何進数でも使えるように lexical_cast を書き直せば良いと。

142 名前:デフォルトの名無しさん :02/09/24 07:56
>>139
全部ったって、中身は5行だぞ、確か。

143 名前:デフォルトの名無しさん :02/09/24 09:58
template<typename Target, typename Source, class Manip>
Target lexical_cast(Source arg, Manip manip)
{
# ifdef BOOST_LEXICAL_CAST_USE_STRSTREAM
std::strstream interpreter; // for out-of-the-box g++ 2.95.2
# else
std::stringstream interpreter;
# endif
Target result;

if(!(interpreter << manip << arg) || !(interpreter >> result) ||
!(interpreter >> std::ws).eof())
throw bad_lexical_cast();

return result;
}


144 名前:デフォルトの名無しさん :02/09/24 10:16
>>143
C++のキャストの構文と違うからダウト


145 名前:デフォルトの名無しさん :02/09/24 12:25
>>144
お前ヴァカだろ。

146 名前:デフォルトの名無しさん :02/09/24 12:38
template<typename T, class Manip>
class manip_adapter
{
 T val;
 Manip manip;
public:
 manip_adapter(const T& v, Manip m) : val(v), manip(m){}
 friend std::ostream& operator<<(std::ostream& os, const manip_adapter& rhs)
 { return (os << rhs.manip << rhs.val); }
};

template<typename T, class Manip>
manip_adapter<T, Manip> make_adapter(const T& v, Manip m)
{ return manip_adapter<T, Manip>(v, m); }

int main()
{
 std::string temp( boost::lexical_cast<std::string>(
            make_adapter(make_adapter(100, std::hex), std::showbase)));
 std::cout << temp << std::endl;
 return 0;
}

おもっきり実装依存だが
つか、ここまでするくらいなら素直に stringstream 使えって言われる罠

147 名前:デフォルトの名無しさん :02/09/24 15:43
本で安全のために記号定数よりconst定数を使う事の方が多いと書いてありましたが,
なぜでしょうか?
マクロは危険?
副作用はありますが,
#define N_MAX 100
とかなら安全のような気もしますが
constの方が,コンパイラが厳密にミスを見つけてくれるということでしょうか?

148 名前:デフォルトの名無しさん :02/09/24 15:56
名前空間の安全性の事かなぁ?

149 名前:デフォルトの名無しさん :02/09/24 15:59
>>147

>>148に追加

マクロはコンパイラではなく、プリプロセッサで処理される。

処理系によってはconstやenumにしておけばデバッガから
シンボルとして追えたりするので便利なことも多い。

マクロの場合は#undefすれば再定義できるので危険。

他になんかあるかな?


150 名前:デフォルトの名無しさん :02/09/24 16:11
float f;

f=100.0/3.0;

warning C4305: '=' : 'const double' から 'float' へ切り詰めます。

なぜに?

小数の計算は,元々doubleで計算されるから?

151 名前:デフォルトの名無しさん :02/09/24 16:25
100.0f/3.0f

152 名前:デフォルトの名無しさん :02/09/24 16:25
>>150
yes


153 名前:150 :02/09/24 16:30
>>151
グッジョブ

154 名前:デフォルトの名無しさん :02/09/24 16:50
string s;

s="metjgetijgse;9gjser;0gj;sejge09u4g5;4sejgso4ejmo;gnje;oirjge905gjm;e0j5g:;ejmg;e5jge5jg;0erjg;erjhgo59rhjg;rhjgn0p;strhjg";

可能?

155 名前:デフォルトの名無しさん :02/09/24 18:20
マクロ定数とconst定数の話だけど、
const定数は宣言した分のメモリ空間しか占有しないけど
マクロ定数は利用されているところに展開されるから
いっぱい使われてると、その分メモリ圧迫するとか
そういう事ってあったりするんでしょうか?

というか、そういう違いを吸収するのがコンパイラの性能なんでしょうか?

156 名前:デフォルトの名無しさん :02/09/24 18:38
>>155
> const定数は宣言した分のメモリ空間しか占有しないけど
その代わり変数アドレスをそこら中にばらまくことになるから、大差ない。

157 名前:デフォルトの名無しさん :02/09/24 18:41
文字列の場合はそうともいえない。

158 名前:デフォルトの名無しさん :02/09/24 19:01
const std::complex<zero> zero(0);

#define ZERO std::complex<double>(0)
はエライちがいじゃないか。


159 名前:デフォルトの名無しさん :02/09/24 20:22
>>158
一方が const で他方が非 const だと、全く意味が違うと思われ。
(言いたいことは分かるが)

160 名前:デフォルトの名無しさん :02/09/24 20:49
const int GLOBAL=0; のような定数宣言をヘッダファイルに書いて、
これを複数の cpp ファイルにインクルードしたとき、実行時には
cpp ファイル毎に定数のためのメモリが取られるんでしたっけ。
(最適化で変わることもある?)

161 名前:デフォルトの名無しさん :02/09/24 21:29
俺はやっぱ名前空間の問題が一番大きいと思うな。
#define はめったなことじゃ使わないで欲しい
Winプログラムしてると泣けてくる

162 名前:デフォルトの名無しさん :02/09/24 22:04
int i=0;
a[6]={1,1,1,1,-1,1};

while(a[i] != -1)
{
 //処理

 ++i;
}

この場合,別にi++でも問題ないよね?
普通は,どっちを採用した方がいいんだろうか?

163 名前:名無しさん@XEmacs :02/09/24 22:14
>162
++i

164 名前:デフォルトの名無しさん :02/09/24 22:14
>>162
かわらない

165 名前:デフォルトの名無しさん :02/09/24 22:15
>>161

#define N '\n'

cout << "a=" << a << N;

ウマー

166 名前:デフォルトの名無しさん :02/09/24 22:37
endl使えよ!

167 名前:デフォルトの名無しさん :02/09/24 22:38
>>165
素直にendl使えよ。

ところで、streamって<<演算子呼ばれたら勝手にflush呼ぶんだっけ?

168 名前: ◆k/Ubp.Kg :02/09/24 22:42
>>167
<<演算子じゃなくて、endlん中でflushしてるんじゃなかったっけ?

169 名前: ◆k/Ubp.Kg :02/09/24 22:47
手もとにソースがあったので、glibcでの実装。

ostream& endl(ostream& outs)
{
    return flush(outs.put('\n'));
}

operator<<()ではflushしてないっす。

170 名前:デフォルトの名無しさん :02/09/24 22:56
std::coutの直後にstd::cinを呼ぶとflushされる。

171 名前:デフォルトの名無しさん :02/09/24 22:58
>>160
gccでconst intの場合を試してみたら、Cの時は実体が作られたけど、
C++の場合は最適化すると実体が消えるみたい。
最適化をしなくても、constを付けるとファイルスコープになるらしく、
hoge.c(cc):
extern const int i;
int main(void) {
  return i;
}
moge.c(cc):
const int i = 1;
fuga.c(cc):
const int i = 2;
とすると、Cでコンパイルするとmultiple definition of 'i'に
なって、C++でコンパイルするとundefined reference to 'i'に
なった。
ちなみに、Cで最適化ありの場合、
static const int i = 0;
int main(void) {
  return i;
}
をコンパイルすると、return i;はxorになって、iはどこからも
使われていないのに、iの実体だけは作られていた。
Cのこの挙動の理由が分かる人いない?

172 名前:139 :02/09/24 23:15
>>171
> 最適化をしなくても、constを付けるとファイルスコープになるらしく、
> とすると、Cでコンパイルするとmultiple definition of 'i'に
> なって、C++でコンパイルするとundefined reference to 'i'に
> なった。

仕様だ。C++ では、const つけるとディフェルトはファイルスコープになる。

173 名前:デフォルトの名無しさん :02/09/24 23:32
>>172
ディフェルト?どういう意味?

174 名前:172 :02/09/24 23:44
>>173
> ディフェルト?どういう意味?

D-Felt だ。手触りがいいフェルトなんだよ...、って Typo だよ、いちいち指摘すんじゃねー。

175 名前:デフォルトの名無しさん :02/09/24 23:57
>>174
乗りツッコミにワラタ

176 名前:デフォルトの名無しさん :02/09/25 00:02
素直にstringstream使えよ

177 名前:デフォルトの名無しさん :02/09/25 01:15
>>168-170
Thx.

なんでそんなこと聞いたかというと、
>>165はstd::flushを呼び出してないので、
画面に表示されないこともあるのかなぁ…と。。。
でも、どこかで、'\n'を書き込んだら自動的にフラッシュされるとか
書いてあったような気がする。。。

自信がなくてスマソ

178 名前:vcpp6 :02/09/25 12:05

すみません。質問させてください。
クラスのメンバ関数のデフォルトの引数は、

class A{ void func( int = 1 ); }; void A::func( int i ){}

↑以外の方法で指定できますか?
ホントは↓のように指定したいのですが、エラーが出ます。

class A{ void func( int ); }; void A::func( int i = 1 ){}



179 名前:デフォルトの名無しさん :02/09/25 12:16
class A
{
 void func();
 void func( int i );
};

void A::func(){ func( 1 ); }
void A::func( int i ){}

180 名前:vcpp6 :02/09/25 12:21
オーバーロードですか。ソースが長くなりますね。
まあ、ほんの2行ですが。>>179さん回答どうも

引数が複数あるときはその引数数×2行分長くなりますね。


181 名前:デフォルトの名無しさん :02/09/25 12:24
>>180
まぁ、しょーがないよ

class A{ void func( int ); };

と宣言されたメンバ関数を
a.func(); と呼び出すことは不可能だもんよ
コンパイラは

void A::func( int i = 1 ){}

なんてされてるなんて知らないからね

182 名前:vcpp6 :02/09/25 12:31
レスどうも。>>181さん

なんか、インラインなら出来そうですが、
インラインはやめたほうがいいでしょうか。
メモリを食うとか、何とか、デメリットが有ったような気がします。
↑この辺忘れてしまったので御教授お願いします。

183 名前:デフォルトの名無しさん :02/09/25 12:36
WindowsでFindWindow関数の第一引数は
そのアプリケーションのウィンドウ名ということですが、
他の方の作ったアプリケーションのウィンドウ名の
取得はどのようにすればよいのでしょうか?

184 名前:デフォルトの名無しさん :02/09/25 12:43
>>182
インライン化しても意味無いと思う

>>183
スレ違いだと思う

185 名前:デフォルトの名無しさん :02/09/25 12:48
誘導>>183 http://pc3.2ch.net/test/read.cgi/tech/1032548635

186 名前:171 :02/09/25 13:11
>>172
なんか、先に宣言してから定義するとグローバルになるっぽいけど、
何だかなあ。

187 名前:デフォルトの名無しさん :02/09/25 13:12
>>182
インライン(ヘッダに実装がある)ならば技術的に実装は可能だろうけど、
仕様がそれを許してないから意味無い

188 名前:160 :02/09/25 14:08
>>171 
>gccでconst intの場合を試してみたら、Cの時は実体が作られたけど、
>C++の場合は最適化すると実体が消えるみたい。
やっぱりそうですか。
宣言の数がかなり多いので、cpp ファイル毎に領域が取られると
すると無駄になってしまいますよね。最適化を考えない場合は
素直に extern したほうが無難ですかね。。
以前 const 定数について、& 演算子で定数のアドレスを取るなど
しない限りにおいては、#define のように値が定数の使用個所に
埋め込まれる(ことがある?) というような話を聞いたことが
あります。激しくうろ覚えですが、最適化の話だったかも
しれません。

189 名前:デフォルトの名無しさん :02/09/25 14:24
>>188
C++だとconstはデフォルトでstaticだから、
アドレス参照などで必要にならない限り実体を持つ必要はない。

念のために書いておくけど、実装上は&を使うかだけでは判断できない。
複合型やdoubleなんかの場合は使っただけで割り当てられる場合もある。

190 名前:デフォルトの名無しさん :02/09/25 14:51
#define KAKOU a '[' << a << ']'

cout << KAKOU(a) << N;

ウマー

191 名前:デフォルトの名無しさん :02/09/25 15:27
cout << a '[' << a << ']'(a) << N;

192 名前:189 :02/09/25 15:35
#define KAKOU (a) '[' << (a) << ']'

193 名前:190 :02/09/25 15:36
つーかどうみても189じゃなくて,190だろうが

194 名前:デフォルトの名無しさん :02/09/25 17:27
externがよくわからん俺はドキュでつか?
(どっかに実体があってって話わわかるけど、
あんまり使えないっつーこってす。)

195 名前:デフォルトの名無しさん :02/09/25 18:06
よく使う実体(Appインスタンスとか)をexternしてるけど

196 名前:ブタ :02/09/25 18:14
コード 44 (0x2C) で終了って正しく終了できているのですか?


197 名前:デフォルトの名無しさん :02/09/25 18:15
>>196
コンパイラは?

198 名前:デフォルトの名無しさん :02/09/25 18:18
>>196
それか、mainをint型にして0で終了汁

199 名前:ブタ :02/09/25 18:18
VC++をつかってます.
C:\Windows\デスクトップ\Hossaka\新しいフォルダver2\visual.c(190) : warning C4715: 'mean' : 値を返さないコントロール パスがあります
って警告がでます.どうしたらいいのでしょうか?

200 名前:デフォルトの名無しさん :02/09/25 18:21
>>199
int func1( int i )
{
if( i )
return 3; // 警告。i == 0 では何も返さない。
}
こういうこと


201 名前:200 :02/09/25 18:31
>>199
>>200みたいになってない?
だから
int func1( int i )
{
 if( i ) return 3;
 return 0;
}
に汁

202 名前:  :02/09/25 18:43
>>201
俺はそういう場合,elseをつける派

203 名前:デフォルトの名無しさん :02/09/25 18:53
int hoge()
{
 ・・・
 switch(i)
 {
 case 1: return 1;
 default: return 0;
 }
}
これは警告オプションとかきつくしたりしても警告出ませんか?

204 名前:デフォルトの名無しさん :02/09/25 19:00
3項演算子だったら大丈夫

(i?1) return 1:return 0;

そっちは知らんけど,必ず実行されるならいいんでない?
おすすめはしないけど

205 名前:デフォルトの名無しさん :02/09/25 19:12
>>204
それを書くなら return (i == 1) ? 1 : 0; だろう。

206 名前:204 :02/09/25 19:25
ワラタ

207 名前:ブタ :02/09/25 19:52
int mean(unsigned char c[])
{
int i,buf;

buf=0;
for(i=0;i<27;i++){
buf+=(int)c[i];
return(buf/27);
}
}
ってなってます

208 名前:デフォルトの名無しさん :02/09/25 20:01
それは、
int mean( unsigned char c[])
{ return c[0]/27; }
とどう違うのか?

209 名前:デフォルトの名無しさん :02/09/25 20:17
ワラタ

210 名前:デフォルトの名無しさん :02/09/25 20:29
ワラタ

211 名前:デフォルトの名無しさん :02/09/25 20:33
extern int A;

extern "C"{}
でなぜ同じキーワードを使うのかワカラン

212 名前:デフォルトの名無しさん :02/09/25 20:42
>>211
予約語を増やしたくないから。

213 名前:188 :02/09/25 21:06
>>189
>C++だとconstはデフォルトでstaticだから、
>アドレス参照などで必要にならない限り実体を持つ必要はない。
なるほどです。
このことは言語仕様で決められているとかではなくて
各コンパイラが、こういうケースでは実体は必要ないと
解釈しても良い(実体を生成しなくても良い)という
ことでしょうか。

>念のために書いておくけど、実装上は&を使うかだけでは判断できない。
>複合型やdoubleなんかの場合は使っただけで割り当てられる場合もある。
例えば double 型の定数に記憶が割り当てられるか
どうかは、それぞれのコンパイラの解釈に依るという
ことですよね。

214 名前:デフォルトの名無しさん :02/09/25 22:55
>>160
const はデフォルトでは static linkage だから、それをヘッダに書くと
翻訳単位毎に別々の実体が割り当てられるが。

215 名前:214 :02/09/25 22:59
既出もいいところだったな。すまん。

ところで extern で const int a; とかとったとしても

printf("%d", a);

というプログラムをコンパイルすると「変数 a のアドレス」が出てくる。
オブジェクトコードのサイズだけ見ると

printf("%d", 1);

も全く変わらんぞ。

216 名前:デフォルトの名無しさん :02/09/25 23:09
intで比べてもしょうがないだろ(藁

217 名前:デフォルトの名無しさん :02/09/26 00:53
>>216
なにゆえ?

218 名前:デフォルトの名無しさん :02/09/26 01:53
大抵ポインタのサイズはintと同じだから

extern const char str[];
cout << str << endl;



cout << "asdfghjklqwertyuiopzxcvbnm" << endl;

が同じだったら考え直す

219 名前:デフォルトの名無しさん :02/09/26 12:17
>>215
アセンブリ言語のコード吐かせて比較汁。

220 名前:引きこもり :02/09/26 16:51
お前らintって聞いたらinteger思い浮かべるか?
interrupt思い浮かべるか?

221 名前:デフォルトの名無しさん :02/09/26 17:02
int86ならinterrupt
int32ならinteger

222 名前:デフォルトの名無しさん :02/09/26 17:02
integer
interruptはINTって大文字じゃなきゃ。

223 名前:デフォルトの名無しさん :02/09/26 17:04
21でもinterruptかな

224 名前:デフォルトの名無しさん :02/09/26 20:15
IRQは俺だけか、、、

225 名前:デフォルトの名無しさん :02/09/26 20:54
http://www.int-ngy.com/

226 名前:デフォルトの名無しさん :02/09/26 21:34
>>224
> IRQは俺だけか、、、

俺もだよ。68系は IRQ だからな。でも、68系のソフトウェア割り込みは、SWI か TRAP だから 86 みたいに混乱 (はしてないようだが...) は無いね。

227 名前:デフォルトの名無しさん :02/09/27 01:25
intをあえて日本語で言えば整数となるだろう。
しかし、断じてこれはintegerではない!
intはintなのだ。ひとつの単語なのだ。
あ〜int、愛しのint・・・

228 名前:デフォルトの名無しさん :02/09/27 01:38
>>227
intは積分記号だろ?

229 名前: ◆k/Ubp.Kg :02/09/27 02:44
>>228
TeXnicianですね( ̄ー ̄)ニヤリッ

>>227
>しかし、断じてこれはintegerではない!
分かる気がする…Pascalとかでhoge:integerという表記を見るとなんか違和感がある。
hoge:intじゃないのか、と。たまに人のDelphiのソースいじったりすると、hoge:intと書いて
コンパイラに怒られています…(;´Д`)

230 名前:デフォルトの名無しさん :02/09/27 02:48
charも混ぜてください

231 名前:デフォルトの名無しさん :02/09/27 06:08
>>230
ほんとうは文字列でもなんでもないくせに、自分の所在をchar *で表すようなやつはダメ。

232 名前:デフォルトの名無しさん :02/09/27 18:24
>>231
BYTEならいいですか?typedefで見せ掛けだけですが・・・


ofstreamでバイナリで開いてもバイナリで書き込んでくれませんが
こんなにファイルサイズが勿体無い仕様にしたのは何故でしょう?

233 名前:デフォルトの名無しさん :02/09/27 18:41
>>232


234 名前:デフォルトの名無しさん :02/09/27 18:46
>>233
ofstream fout("aaa.a",ios::out|ios::trunc|ios::binary);
fout<<0x12345678<<'\n';
fout.close();
とやってもファイルには
305419896
と書かれるのですが・・・

235 名前:デフォルトの名無しさん :02/09/27 18:52
文字列はstringだってママンから習わなかったの?

236 名前:デフォルトの名無しさん :02/09/27 18:55
いやバイナリで開いてるんだから数値を直接入れてくれてもいいのかなと

237 名前:デフォルトの名無しさん :02/09/27 18:58
neta ha sine

238 名前:デフォルトの名無しさん :02/09/27 19:05
>>234
どういう結果を期待してたの?

239 名前:234 :02/09/27 19:09
バイナリで 78 56 34 12 0a ってなればいいかなと0aは'\n'でし

240 名前:234 :02/09/27 19:13
>>239
ああ0a取れないか・・・馬鹿でした

241 名前:234 :02/09/27 19:15
でも
fin>>iで
iのサイズとれば値を取得できるような・・・

242 名前:234 :02/09/27 19:30
連続カキコすいません

テンプレート関数内でTのサイズ計れなかったですか?
計れるのならばバイナリで直接数値をぶち込んでも問題はないかと

時間なのでもうすぐ帰ります

243 名前:デフォルトの名無しさん :02/09/27 23:13
>>232
> typedefで見せ掛けだけですが・・・
身分詐証、それがイカンのよ。


244 名前:デフォルトの名無しさん :02/09/27 23:42
>>236
>いやバイナリで開いてるんだから数値を直接入れてくれてもいいのかなと
ネタとしか思えん…

245 名前:デフォルトの名無しさん :02/09/27 23:48
「バイナリを使えば何でもできる」
そう純粋に信じていた無垢な時代が、漏れたちにだって……なかったなあ

246 名前:デフォルトの名無しさん :02/09/27 23:54
XMLなんて文字ばっかり

247 名前:デフォルトの名無しさん :02/09/27 23:55
釣れた釣れた

ってそろそろ来るんだろうな・・・。

248 名前:デフォルトの名無しさん :02/09/28 06:37
C++でpimplイディオムを利用すると自分が敗者になったような錯覚を覚えます。
どうしたらいいでしょうか?

249 名前:デフォルトの名無しさん :02/09/28 08:03
漢なら全部テンプレートにしろ。
cppファイル1つにhファイルが2000、とかの状況に萌えろ。

250 名前:デフォルトの名無しさん :02/09/28 11:17
>>248
C++ 廃業する。


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