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

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

C++相談室 part14

1 :デフォルトの名無しさん:02/12/31 18:57
System.out.println("前スレが埋まったので新しく作りました。");
System.out.println("みなさんC++をやりましょう。");
System.out.println("てか突っ込めよ!>>2-1000");

前スレpart13 http://pc3.2ch.net/test/read.cgi/tech/1038031395/
関連スレは前スレを見ましょう。

2 :デフォルトの名無しさん:02/12/31 19:05
おぃおぃ、なんか違うんじゃ?

3 :デフォルトの名無しさん:02/12/31 19:11
Java・・・

4 :デフォルトの名無しさん:02/12/31 19:34
┌──────────────────────―─―┐
│                                      |
│                                      |
│                                      |
│                                      |
│                _@◎@                      |
│               ( ・∀・)                |
│               (    )                 |
│               | | |                     |
│               (__)_)                  |
|            finalize Cplusplus              |
│                                      |
│           C++相談室part14 を終了しています…      |
│                           by Gosling     |
│                                      |
|                                      |
|                                      |
└───────────────────────――┘

5 :終了:02/12/31 20:08
finally {
 System.exit(-1);
}

6 :デフォルトの名無しさん:02/12/31 20:13
C++ってJAVAのことだったんですね!!

7 :デフォルトの名無しさん:02/12/31 20:40
#include <iostream>

class base_out {
void println(String s) { cout << s << endl; };
}
class base_System {
base_out base;
}
base_System System;


main(){
System.out.println("abc"); // こんな感じ?
}

8 :C++厨:02/12/31 20:53
そうです。

9 :デフォルトの名無しさん:02/12/31 20:57
>>7
こうでは?

#include <iostream>

class base_out {
void println(String s) { cout << s << endl; };
}
class base_System {
base_out out;
}
base_System System;


main(){
System.out.println("abc"); // こんな感じ?
}

10 :デフォルトの名無しさん:03/01/01 02:20
あけおめことよろ〜!
shared_ptr, scoped_ptr, weak_ptr のある C++ 最凶!
安部零滋プログラマの糞Javaラーさんは黙っててね♪
低レベルは C++, 高レベルは C# でこれからの世界は廻って行くのよ!

11 :最小版じゃ:03/01/01 02:59
#include<iostream>
struct {
 struct {
  template <typename T>
  void println(const T& t) { std::cout << t << std::endl; }
 } out;
} System;

int main()
{
 System.out.println("あけおめ");
}

12 :デフォルトの名無しさん:03/01/01 11:37
超低レベルな質問をさせてください。

placement newは予め静的に確保したメモリにオブジェクトを構築すると
思うのですが、だとしたらplacement deleteの役割って何ですか?
静的に確保しているのだから、メモリを削れないと思うのですが。

13 :デフォルトの名無しさん:03/01/01 14:59
>>12
メモリを解放せずにオブジェクトを解体するんじゃな〜い?

14 :デフォルトの名無しさん:03/01/01 15:22
配置newは同一のメモリチャンクから何度も領域を確保できないのか。
わからなくなってきた。

class A {
int i;
public:
A(int j) : i(j) {}
void func() { std::cout << i << std::endl; }
};

int main()
{
char arena[1024];
A *a[10];

std::cout << std::hex << reinterpret_cast<int*>(arena) << std::endl;
for (int i = 0; i < 10; i++) {
a[i] = new(arena) A(i);
std::cout << std::hex << a[i] << std::endl;
}

for (int i = 0; i < 10; i++) {
a[i]->func();
delete a[i];
}
}

15 :デフォルトの名無しさん:03/01/01 16:22
delete (´∀`);

16 :デフォルトの名無しさん:03/01/01 16:27
本当にこれを使うの?

17 :デフォルトの名無しさん:03/01/01 16:36
>>14
あけましておめでとう!新年早々、糞コードを目にしちゃって鬱。

18 :デフォルトの名無しさん:03/01/01 16:36
嫌なら立てろヴぉけ

19 :デフォルトの名無しさん:03/01/01 16:42
>>18
何を?

20 :デフォルトの名無しさん:03/01/01 16:46
( *´Д`) ナニ・・・

21 :デフォルトの名無しさん:03/01/01 16:51
何だろう・・・

22 :15:03/01/01 16:56
スマソ、やってみたかったんだ…

23 :デフォルトの名無しさん:03/01/01 16:57
何でだろう?

24 :デフォルトの名無しさん:03/01/01 18:13
厨な質問ですみません。
C++でObjectPascalの try .. finally .. end と同じことをやりたいんですけど、
どのように記述すればいいのかわかりません。
おしえてください。

25 :デフォルトの名無しさん:03/01/01 18:19
恥ずかしい質問なんですが、誰か教えて下さい。

extern

って、なんで必要なんですか?スコープ越えるだけ?
いまいち本を読んでも理解できないので....。

26 :デフォルトの名無しさん:03/01/01 18:24
うあっ・・・恥ずかしー

27 :デフォルトの名無しさん:03/01/01 18:26
>>25-26
そんなに恥ずかしがらんでも良いような気がするが・・・

28 :デフォルトの名無しさん:03/01/01 18:35
キャッ、ハズカシ(-ノノ)

29 :C++厨:03/01/01 18:36
try .. finally .. end

わからん(・∀・)
try {} catch () {}しかないよ

30 :24:03/01/01 18:44
本当に?
C++つかえないね。

31 :デフォルトの名無しさん:03/01/01 18:46
//hoge.c
int hoge;
//piyo.c
extern int hoge;

//foobar.c
static int forbar;

32 :デフォルトの名無しさん:03/01/01 20:15
>>31
これって...
「piyo.cで使用する"int hoge"は、外部(hoge.c)で定義されたものと同一です」
って意味ですか?

じゃ、"foobar.c"の"static int forbar"は何の関係が??

33 :デフォルトの名無しさん:03/01/01 20:16
あ、ちなみに >>25=>>32 です。

34 :デフォルトの名無しさん:03/01/01 20:45
>>32
31 じゃないけど,typo では?
// foobar.c
static int hoge;
この static を外すとリンカが「hoge.c にも int hoge があるやん!」と
ストライキを起こします。ていうか C++ 特有の話じゃないので sage。

35 :24:03/01/01 21:03
>>29
try .. finally .. end は、

メモリ動的確保;
try
 いろいろ;
finally
 メモリ開放;
end

のように記述することで、「いろいろ」を実行中に例外が発生したり break などで
処理をジャンプさせたりしても、必ずメモリ開放を実行することを保証する、という
用途で使います。
べつにメモリ確保/開放に限らず、後始末が必要な処理では全般的に用いますが。

で、同じようなことをC++でやりたいんですけど、どうすればいいのかな、と思ったのです。
Borlandコンパイラでは __finally という独自の拡張がありますが、一般的にはどうすれば
いいのでしょうか?

ちなみに>>30は私ではありませんのであしからず。

36 :デフォルトの名無しさん:03/01/01 21:04
mannko

37 :25:03/01/01 21:22
>>34
なんとなくわかりました、ありがとうございました。
って、ここって良く見たら "C/C++相談室"ではなかったですね。
..失礼しました。(重ね重ね、恥

38 :デフォルトの名無しさん:03/01/01 21:28
>>35
> 一般的にはどうすればいいのでしょうか?

スマートポインタって知ってる?
少なくとも>>35に書かれている動作のためには、try..finallyより(以下略

39 :デフォルトの名無しさん:03/01/01 21:37
>>24
クラスを巧く使うのが C++ のやり方。その究極形が>>38さんの提案したスマートポインタ。
とりあえず私が確認できた限り VC++5.0 には __try .. __finally があるんだけど,
g++ 3.2 にはそれっぽいのがないっぽいし,やっぱしこのあたりの互換性を
考えたい場合にはオススメできないっすかね。。。

int func() {
  Resource *r1=0, *r2=0, *r3=0;
  struct Finalizer {
    typedef Resource *Resource_ptr;
    Resource_ptr &r1_, &r2_, &r3_;
    Finalizer(Resource_ptr &r1, Resource_ptr &r2, Resource_ptr &r3):
      r1_(r1), r2_(r2), r3_(r3) {}
    ~Finalizer() {
      delete r1_;
      delete r2_;
      delete r3_;
    }
  } finalizer(r1, r2, r3);
  r1 = new Resource();
  if ( some_func() == FAILED ) return 0;
  r2 = new Resource();
  if ( some_func() == FAILED ) return 0;
  r3 = new Resource();
  return 0;
}
長文失礼。コンパイラ依存コードが混じってたらすまそ。

40 :デフォルトの名無しさん:03/01/01 21:41
変な質問ですみませんが
new int[0]ってした場合の挙動ってどうなるんでしょうか
何かがどうにかなってますか?

41 :24:03/01/01 21:42
>クラスを巧く使うのが C++ のやり方。
Javaにもありますよ、finally。
C++つかえませんね。

42 :デフォルトの名無しさん:03/01/01 21:43
>>40
その通りになります。

43 :38:03/01/01 21:52
delphiもjavaもよく知ってるけど、auto_ptrの方がよほどエレガント。
ローカル変数だけじゃなく、デストラクタでの書き忘れも心配ないし。

ま、どうしてもfinally形式を使いたきゃ、「スタックに置いたオブジェクトのデストラクタ」
で代用するのがいいかもね。

44 :24:03/01/01 22:07
うを、auto_ptr理解しました。どうも。ちなみに>>41は偽者です。
確かにコード記述はスマートだけど、なんかfinallyの方がバイナリがシンプルで
処理が早そうな気がします。
言語使用としては両方サポートしてた方が望ましいのかな?

45 :24:03/01/01 22:13
× 使用
○ 仕様

失礼。

46 :24:03/01/01 22:18
>>45
偽者が訂正してくれるとは・・・

47 :デフォルトの名無しさん:03/01/01 22:49
>>44
デストラクタで全部やる方法の利点は、再利用性と安全性。
 | メモリ確保;
 | try { do_something; }
 | finally { メモリ解放; }
と決まり事のように毎回書く必要がなくなって、
 | auto_ptr<> = メモリ確保;
 | do_something;
で済む。メモリ確保の他にも、例えばロック操作もメンバ関数の頭に
 | mutex_locker lk( my_mutex );
と一行だけ入れればよい、みたいにできて嬉しいね、とか。

もっと話を進めて、privateを上手く使えば、「↑のようなスタック上でのコンストラクタ/
デストラクタ方式でしかロックをかけられない」ようなライブラリも作れる。こうすると、
「利用者が相当頑張ってもロックを解放し忘れることが出来ない」レベルに安全な
ライブラリが作れたりする。

finally の利点は、そのブロックに特有の(おそらくは再利用なんてしないような)
終了処理を簡単に書けることだろうと思う。その手の機能を現在のC++で実現する、という
 ScopeGuard http://www.cuj.com/experts/1812/alexandr.htm?topic=experts
という話もあったりするが、まぁ、その、結構使いにくい。

というわけで、finallyのみというのは論外だが、両方あったら便利かな? と言われれば
賛成できなくもない。が、finallyってfriend とかポインタとかと同じで乱用すると質の低い
コードだらけになるので、それを押さえる意味でfinallyが無い方がベターかも、と個人的には思う。

最終的な実行バイナリは、コンパイラの性能の問題であってあまり変わらんのでは。

48 :デフォルトの名無しさん:03/01/02 00:25
>>44
> なんかfinallyの方がバイナリがシンプルで処理が早そうな気がします。
アセンブルコードで確認汁!
一般的には例外処理関連の機構は重くなりがちです。
デストラクタが必ず実行されるのも Java の ファイナライザと違う所で
C++ 使いと Javaラーの文化を大きく分けている部分であります。

49 :デフォルトの名無しさん:03/01/02 00:29
catch(...)
だとちょっと違うの?

50 :デフォルトの名無しさん:03/01/02 00:37
>>49
catch(...)は例外が起こらないと到達しない。
finallyは例外が起こらなくても到達する。

漏れ的にはboost::shared_ptrの方がfinallyなんかより(・∀・)イイ!と思うけどね。

51 :デフォルトの名無しさん:03/01/02 00:48
catchと__finallyは併用できないのか・・・・初めて知った。

52 :デフォルトの名無しさん:03/01/02 00:54
>>12
newに伴って呼び出したコンストラクタが完了しなかった時に、
deleteが呼び出されるのがお約束。
で、operator newの各バージョンごとに、対応するoperator deleteが呼ばれるわけよ。

対応するってのは、引数並びで対応させるらしいんだが、
なんだかそこらへんでも、妙な事情があって妖しい物議をかもしたりするわけで、以下略とす。

53 :デフォルトの名無しさん:03/01/02 02:10
sizeof の後に () が必要なのは仕様なんだっけ?
VC++6は無くても通っちゃったけど
G++ 2.95.3-5 はないとパースエラーだわ。

仕様書持ってる人おしえてくだちい。

54 :デフォルトの名無しさん:03/01/02 02:25
sizeof type_nameは不可で
sizeof object_nameは可能だったと思う。

仕様書読んだわけじゃないから、違ったらごめん。
俺は必ず()付ける人だし。

55 :デフォルトの名無しさん:03/01/02 02:26
>>53
sizeof(型名) は () が必要。
sizeof(式) は演算子の優先順位に従って、要るときと要らないときと。

56 :53:03/01/02 09:03
>>54, >>55
なるほど、VC++ がチョンボしてたのね。
ありがとうございまちた。

57 :デフォルトの名無しさん:03/01/02 09:39
struct A{
A(X* xa){}
};
class X{};

int main(){
A a(new X);
}
とやったときのAのコンストラクタで引いているxaにXがnewされている
と思うのですが、これってほっといてもメモリリークしませんよね?

58 :デフォルトの名無しさん:03/01/02 09:43
ごめんなさい。当然リークしますね。

59 :デフォルトの名無しさん:03/01/02 10:02
ところでこの糞スレいつまで使うつもり?
誰かまともなの立てたら?

60 :デフォルトの名無しさん:03/01/02 10:54
C++用語としての「代入演算子」は substitution operator でいいのでしょうか?
メリケンは意外と operator equals とか呼んでるとか?

61 : ◆F52DmOxJlc :03/01/02 12:47
assignment operator かな。

62 :60:03/01/02 12:57
>>61
google った所、どうやらそのようですね。
ありがとうございました。

63 :デフォルトの名無しさん:03/01/02 15:00
自作クラスで iosfwd みたいな事をしようと思ったんですが、
私は省略せずに名前をつける主義なのでちゃんとしようと思ったのです。
しかし、用語がよくわかりませんでした。
Forward-reference でしょうか?
Forward-declaration でしょうか?

64 :デフォルトの名無しさん:03/01/02 15:25
タイプライブラリの作り方ってここで聞いてもいいことですか?

65 :デフォルトの名無しさん:03/01/02 15:38
>>64
まずはあなたの考える タイプライブラリ が何なのか小一時間説明してもらおうか。

66 :デフォルトの名無しさん:03/01/02 15:50
拡張子がtlbの、#importで指定するやつ。




ひょっとしてスレ違い?

67 :デフォルトの名無しさん:03/01/02 18:24
>>66
ぎょっとするほどすれ違い。

68 :デフォルトの名無しさん:03/01/03 11:56
どこで聞けばいいの?

69 :デフォルトの名無しさん:03/01/03 12:08
>>68
多分 .NET 系のスレでいいんだと思うんだけど、
もしかしたら COM 系技術の所かもしれない。
それ以外のタイプライブラリの話なら知らない。
とりあえずそっち系(MS系)行って聞けや。ここは完全なすれ違いだと思うで。

70 :デフォルトの名無しさん:03/01/03 13:25
cstddef を include したけど size_t が std に入ってこないんですが
これって正しいのでしょうか?(VC6)


71 :デフォルトの名無しさん:03/01/03 13:42
俺のVC6も入ってないよ
まあM$だし。

72 :デフォルトの名無しさん:03/01/03 14:00
>>70
size_tはマクロだから、stdには入らないのでは?

73 :デフォルトの名無しさん:03/01/03 14:33
>>72
普通の実装ではstd-namespaceにいれるためにtypedefしてます。
VCの標準ライブラリがおかしいのれす。

74 :70:03/01/03 14:41
>>71, >>72
レスありがとうございます。
ちょっと質問が曖昧でした。VC6 の動作として正しいのかどうかではなく
VC6 の振る舞いが標準 C++ として正しいのかどうか。を知りたかったのです。
VC++ の cstddef 内では、わざわざ _STD_USING マクロを #undef までして
無理矢理 std から外しているみたいなので…
(そこでヘッダを書き換えると cstddef との整合性が取れなくなって、
cstddef も書き換えると size_t が曖昧なシンボルになってたくさんエラー…)

<Cの標準ヘッダ.h> ではなく <Cxxxx> の形式を使った時は
size_t は std::size_t になるべきなのでしょうか?
malloc や free は? これらは全部 std::xxx になるべきなのかどうか。
仕様書はもってないし、ストラウストラップ本は
「サンプルの簡素な表記の為」に std:: をつけないという無茶苦茶な事をしてるし(これ聖典としては最悪だと思う)、
さっぱりです…。

75 :70:03/01/03 14:45
>>73
そうですよね。見たところ wchar_t もでした。
(C++ では wchar_t は組込み型になったはず…たぶん)

VC.NET では直っているんでしょうか…あれは C はもう切り捨てたのかな…?

76 :デフォルトの名無しさん:03/01/03 20:57
STLを使ったクラスを継承したのですが、
そのメンバ関数から親クラス(STL使用)の関数が呼べません。

class Ext : public std::map<CString, SOCKET>
{
public:
virtual ~Ext();

SOCKET insert(CString& str){
SOCKET s = ... ;
std::map<CString, SOCKET>::insert(std::pair<CString, SOCKET>(str, s)); <--ここでエラー
return s;
}
}

VC++6.0で静的メンバを呼ぶなというコンパイルエラーになるのですが、
記述として間違ってますか?

77 :デフォルトの名無しさん:03/01/03 21:01
すいません。くだらない質問なんですが・・・。
doubleとかintとかの数値をstringに入れて表現するにはどうしたら?

string str;
double d = 3.3;
int i 3;



str = "数値は"
str += d;
str += i;

てできませんよね?
charに変換してしまうんで。

78 :デフォルトの名無しさん:03/01/03 21:16
sprintf

79 :77:03/01/03 21:19
>78
C++風でもそんな感じですか?

80 :デフォルトの名無しさん:03/01/03 21:21
strstreamというのがあったと思うけど
よくわからない

81 :デフォルトの名無しさん:03/01/03 21:22
漏れは ostrstream 使うけど。

82 :デフォルトの名無しさん:03/01/03 23:10
ostringstreamに一票。

83 :デフォルトの名無しさん:03/01/03 23:42
>>76
先生があれほど継承ではなくメンバシップを使いましょうと言ってるのに
まだわからないのですか?

84 :デフォルトの名無しさん:03/01/03 23:53
>>76
・構文的には間違ってない。
・VC6で通すには親をtypedefしといて…とかで、対処すると良い。
・そこで継承しないように。

>>77
stringstream か boost::lexical_cast<> で。

85 :76:03/01/03 23:59
>>83-84
ありがd
うかつに継承すると漏れが遭ったようなエラーが出てくるわけか。
データメンバとして持つのが定石?

86 :デフォルトの名無しさん:03/01/04 08:44
>>85
実装継承は is-a でなければ「ならない」場合にのみ使う
ライブラリ目的での継承はよろしくないと思う
(private継承なら可かもしれない)

87 :デフォルトの名無しさん:03/01/04 12:10
>>74
そうです。mallocもstrcpyもprintfもみんなstd::に入るべきなのです。
そういう訳でVCは糞。

88 :デフォルトの名無しさん:03/01/04 14:42
>87
糞というか、M$はそもそも仕様に合わせる気がさらさらないような気がする。

89 :デフォルトの名無しさん:03/01/04 14:56
main(){
X xa,xb;
xa=xb;
}
としたときの、xbがxaに代入される時のoperatorの書き方でいい方法ありますか?
やっぱ、ムリ?

90 :デフォルトの名無しさん:03/01/04 15:01
>>89
お前の言う「いい方法」って何?
フツウの代入オペレータとどう違うの?

91 :デフォルトの名無しさん:03/01/04 15:06
operator=(){....}が普通。
これの逆をやりたいの。

92 :デフォルトの名無しさん:03/01/04 15:09
>>91
逆って意味がわからん。
xa=xb;
をするとxbにxaの値がはいるってことか?

93 :デフォルトの名無しさん:03/01/04 15:11
そうです!!
まさしく「そういうこと」がやりたいんです。

94 :デフォルトの名無しさん:03/01/04 15:16
>>91
演算子の結合規則はオーバロードできません。


95 :デフォルトの名無しさん:03/01/04 15:54
>>87
前にも書いたんだけど、NULLは?
NULLはstd::に入れなくていいの?
誰か教えて〜!!

96 :デフォルトの名無しさん:03/01/04 16:14
>>91
X& op= (/*not const*/ X& rhs){
 rhs.member = this->member;
}

>>95
ストラウ糞ラップは NULL の代わりに 0 を使えと布教してやがるからな。
おまいの仕事は空ポインタ null キーワードを C++ に入れることだと小一時間…。

97 :デフォルトの名無しさん:03/01/04 16:20
>>96
ヴァカかてめえは
標準化してほしいならてめえがやれボケ

98 :デフォルトの名無しさん:03/01/04 16:25
>>96
ついでに参照にnull突っ込めるようにしといてね。

99 :96:03/01/04 16:42
>>97
0 == empty だと思ってるヴァカハッケソですか?
数値0 と 無 は別の概念だよ。

>>98
C++ の参照は常に有効なオブジェクトへの参照であることが保証されてるのがいいんじゃん。
それが嫌な時はポインタ使いなよ

100 :デフォルトの名無しさん:03/01/04 16:53
>C++ の参照は常に有効なオブジェクトへの参照であることが保証されてるのがいいんじゃん。
たったそれだけの違いでポインタと参照分けるセンスが理解できないよ。
んなもん全部参照にして初期化保証付修飾子でもつけりゃ良かったんだよ。

クラスのインターフェース設計するとき、
コンストラクタで渡せるときは参照で、
着脱可能にしたいときはポインタでなんてかっこ悪すぎ。

101 :デフォルトの名無しさん:03/01/04 17:15
>>99
馬鹿すぎて何も言う気がしない。
取り合えず頑張れ。

102 :デフォルトの名無しさん:03/01/04 18:37
しつもーん。

namespace Z {
 class A;
 class B;
}
と先行宣言され、続いて
class Z::A {・・・};
class Z::B {・・・};
と定義部が書かれているとします。

このとき、Z::BのメンバとしてZ::Aを持ちたいので
class Z::B {
 A a;
};
としたら、
bcc5.4では通ったのに、bcc5.6ではエラーになりました。
(もちろん、A a; ではなく、Z::A a; と宣言すれば通ります)
どちらが正しいのでしょう?

BがZ::にあっても定義部を::に書くようにした場合
Bのメンバ宣言時の名前解決に暗黙にZ::を参照する、これが正しいかどうかです。

103 :デフォルトの名無しさん:03/01/04 19:07
>>100
そもそも C++ は C への比較的簡単な拡張として実装され、発展して
きた経緯があるから仕方ないって。いまさら言っても詮無き事。

逆にまっさらの状態から C++ を作ったら、たぶん見向きもされずに消
えたと思うけど。

104 :デフォルトの名無しさん:03/01/04 19:14
>>95
std::NULLなんて書きたく無いなぁ。
あきらめて0と書くしか


105 :デフォルトの名無しさん:03/01/04 19:24
インクルードガードってありますよね。
あれについての質問なんですが。

例えば、
a.h b.h
というヘッダファイルがあるとする。
当然それぞれインクルードガードしています。

で、aa.cppでa.hをインクルード、bb.hでa.hとb.hをインクルードする。
オブジェクトファイルはaa.objとbb.objができ、
実行ファイルを作るなら最後に、aa.exeみたいなのができる。

この場合、a.hが一回だけ結合されてるのでしょうか?
それとも、インクルードガードの効果ってオブジェクトファイルごとの
効果ですか?

106 :105:03/01/04 19:26
追記ですが、

それぞれコンパイル、リンクていう作業ではなく
VC等で、一気にビルドした場合の事です。

107 :デフォルトの名無しさん:03/01/04 19:48
>>105
質問の意味がよくわからんけど
最終的にどのように結合されているかはmapファイルを生成させれば
わかるのでは?

C++のリンカはinline等でできる重複するコードを除去する機能がある、
というようなことをLinkers&Loadersで読んだような読まなかったような・・・


108 :デフォルトの名無しさん:03/01/04 19:49
>>105
#includeは単に.hをテキストファイルとして.cppに展開するだけで、
オブジェクトの生成や結合とは一切関係ないぞ。

109 :99:03/01/04 20:59
>>101
A「ねぇ、その箱の中には何が入ってるの?」
B「え、入ってるのは 0 だよ。」
A「0 が入ってる?意味わかんないよ、開けるよ?」

 A は箱の蓋を開いた、しかし箱の中には何も入っていなかった。

A「何も入ってないじゃん? 0が入ってるってどういう意味?」
B「だから 0 が入ってるって言っただろ。」

110 :105:03/01/04 21:06
>>107
>>108
ありがとうございます。

VC7でコンパイルエラーが出るときなんですが、
同じエラーが何行も続けて出るので、インクルード関係かと
思いました。

例えば、
;がありません
;がありません
;がありません
引数が間違っています
引数が間違っています
引数が間違っています

といった具合に、同じ行のエラーが同じ数ずつでます。
どういうことなんでしょう

111 :99:03/01/04 21:16
>>110

#ifndef Hoge_h_INCLUDED // (1)Hoge_h_INCLUDED が定義されていない場合
#define Hoge_h_INCLUDED // (2)Hoge_h_INCLUDED を定義する

(3) 実装ファイルが「どんな事ができるのか、それはどんなサイズなのか」を定義

#endif // (4)もし(1) の時点で Hoge_h_INCLUDED が定義されているえば (2) と (3) を無視してここまでくる

ちゃんとガードできていれば一回のコンパイルで (2) と (3) には複数回到達しない。

112 :105:03/01/04 21:23
>>111
それはやってます。

113 :デフォルトの名無しさん:03/01/04 21:33
>>112
やってるか、やってないか、ではなくね。

# 一回のコンパイルで (2) と (3) には複数回到達しない。

の意味はわかる?
一回のコンパイルでは到達しないが、
コンパイルを複数回すれば、それぞれのコンパイル時には重複して
到達する可能性があるのさ。
複数の .cpp なり .cc なり .c(←これはスレ違いだが) がある場合は
複数個のオブジェクトファイルを作る為に、複数回のコンパイルが
行われる(だろう。ビルドに使っているツールによるけど、普通はそう)。

結果、ヘッダ中の間違いが何度もエラーとして報告される可能性はある。

114 :105:03/01/04 21:40
>>112
あぁ、なるほど。

てことは、やはり
ビルドしてると、多数のオブジェクトファイルができるから
インクルードガードしていても、何回も参照されて、組み込まれる
ってことでいいんですかね。

115 :113:03/01/04 21:54
>>114
だいたい OK だけど。
> 何回も参照されて、組み込まれる
何回も参照されるけど、(通常は)何も組み込まれない(はず)。
ヘッダファイルには
「こういうものがありますよ。これを前提にオブジェクトコードを作ってね。」
という情報しか含まれるべきではない。
コンパイラ依存だと思うし、今後はうまく処理してくれるコンパイラが増えると思うけど、
ヘッダファイルに実装を書くとリンク時に
「たくさんのオブジェクトファイルに同じものが入ってるんですけど、
どれを使えばいいかわかんないっす。」
というエラーになるのが基本だ。

116 :デフォルトの名無しさん:03/01/04 21:59
半島の組織票に詰め寄られてます
http://live.2ch.net/test/read.cgi/festival/1039531056/926
CNNのアンケート
合衆国は北朝鮮と不可侵条約を締結するべきか?
Noに投票してください!

投票所:http://asia.cnn.com/
祭り会場:http://news2.2ch.net/test/read.cgi/liveplus/1041638621/

急募
    
     97氏のような天才プログラマー。

誰か御願いだ! NOに入れるツール、スクリプトを作ってくれ。

QUICK VOTEから投票できます。
クッキーを判定してるみたいです。
しかしTIMEみたいに、画像の番号まではやってません。

求む!英雄!

WE WANT YOU!

117 :デフォルトの名無しさん:03/01/04 21:59
すみません、質問です。
1 == 3
とか
1 == 1
の結果って1か0で返ってくるんじゃないんですか?
それとも偽は0だけど真のときは0以外ならなにが帰ってきてもいいの?

118 :デフォルトの名無しさん:03/01/04 22:02
> それとも偽は0だけど真のときは0以外ならなにが帰ってきてもいいの?

Cの仕様ではそうなんじゃないかな。C++も互換性のためにそうだろうよ。

119 :標準マクロ一覧:03/01/04 22:07
offsetof( ARG_1, ARG_2 )
CHAR_BIT INT_MAX LONG_MIN SCHAR_MIN UCHAR_MAX USHRT_MAX
CHAR_MAX INT_MIN MB_LEN_MAX SHRT_MAX UINT_MAX
CHAR_MIN LONG_MAX SCHAR_MAX SHRT_MIN ULONG_MAX
DBL_DIG DBL_MIN_EXP FLT_MIN_10_EXP LDBL_MAX_10_EXP
DBL_EPSILON FLT_DIG FLT_MIN_EXP LDBL_MAX_EXP
DBL_MANT_DIG FLT_EPSILON FLT_RADIX LDBL_MIN
DBL_MAX FLT_MANT_DIG FLT_ROUNDS LDBL_MIN_10_EXP
DBL_MAX_10_EXP FLT_MAX LDBL_DIG LDBL_MIN_EXP
DBL_MAX_EXP FLT_MAX_10_EXP LDBL_EPSILON
DBL_MIN FLT_MAX_EXP LDBL_MANT_DIG
DBL_MIN_10_EXP FLT_MIN LDBL_MAX
EXIT_FAILURE EXIT_SUCCESS
va_arg va_end va_start( ARG_1, ARG_2 )
setjmp( ARG )
CLOCKS_PER_SEC
SIGABRT SIGILL SIGSEGV SIG_DFL
SIG_IGN SIGFPE SIGINT SIGTERM SIG_ERR
assert( ARG )
EDOM ERANGE errno
WCHAR_MAX WCHAR_MIN
MB_CUR_MAX
LC_ALL LC_COLLATE LC_CTYPE
LC_MONETARY LC_NUMERIC LC_TIME
HUGE_VAL
RAND_MAX
BUFSIZ FOPEN_MAX SEEK_CUR TMP_MAX _IONBF stdout
EOF L_tmpnam SEEK_END _IOFBF stderr
FILENAME_MAX SEEK_SET _IOLBF stdin

120 :120:03/01/04 22:08
結構知らないのがいっぱいあるもんだな。
うっかりかぶったらハマりそうだ。
BUFSIZとか。

121 :119:03/01/04 22:09
あ、120名前間違えた。

122 :デフォルトの名無しさん:03/01/04 22:10
>>117
0が偽で、非0が真、として扱われるのは確かだが、
ユーザー定義でない == とか < とか >= とか ! とかの結果は常に 0 か 1。

123 :117:03/01/04 22:12
>>122
それって仕様ですよね、確か。
マ版の人がそんな仕様はないと断定してるんですが・・・

124 :デフォルトの名無しさん:03/01/04 22:19
昔のコンパイラが、真を1以外で返してたとかいう
歴史があるんじゃないかな。

つか == 等の結果が 0 or 1 っていつ頃からの仕様だっけ?
以前はそうじゃなかったような・・・

まさかC99とか言わないよねえ

125 :122:03/01/04 22:22
C++ならC++98の最初から
 > 5.9 Relational operators
 > 7 ...(略)... The operators < (less than), > (greater than), <= (less than or equal to),
 > and >= (greater than or equal to) all yield false or true. The type of the result is bool
で、 == とかは略すけど同様で、
 > 4.5. Integral promotions
 > 4 An rvalue of type bool can be converted to an rvalue of type int, with
 > false becoming zero and true becoming one.
となってる。まぁ、0/1じゃなくてfalse/trueが帰ってくるのだー、
と言う意味なら「そんな仕様はない」でもあながち間違いではないが…

126 :デフォルトの名無しさん:03/01/04 22:23
>>123
数値を bool に変換すると 0 が false でそれ以外 true 。
これ以外の事はもう忘れろ。

そしてこれからは常に bool 型を使え、それだけの事だ。

127 :デフォルトの名無しさん:03/01/04 22:24
C++98の最初って・・・全然最初じゃないやん
bool以前はどうだったの?

128 :122:03/01/04 22:26
>>124
ANSI Cの規格は手元にないからわからんが、その翻訳のJISのCなら

> 6.3.8 …の各演算子は、指定された関係が真の場合は 1 を、偽の場合は 0 を
> 返さなければならない。その結果は、型 int をもつ。

129 :デフォルトの名無しさん:03/01/04 22:28
>>127
それ以前ってC++の規格なんてないじゃん?ARMでも調べるのか。

130 :126:03/01/04 22:29
BASIC だと 0 が偽 で -1 が真だったりするから、
それとごっちゃになってる事もあるだろうな。
ビットパターンを想像すると BASIC の仕様の方が美しいんだけど、
C/C++ には unsigned があるからな。

だからもう bool を使う事だけ考えようって、
過去の醜い実装の詳細を考えたって鬱になるだけだって。

131 :117:03/01/04 22:30
>>122
Cで0か1で、C++ではtrueとfalseが仕様ということですか。
わかりました、ありがとうございます。

132 :デフォルトの名無しさん:03/01/04 22:36
Cで条件演算子が1/0を返すのは、ずーーっと前から。
確かK&R2ndにもそれを確かめる練習問題があったはず。

C++も、boolが導入される前はそれに従ったはずだけど(トランスレータだったし)。

133 :デフォルトの名無しさん:03/01/04 22:37
大変盛り上がっているところ、すみません。
別クラスのオブジェクトへのアクセスについて質問があります。

現在トランプゲームを作成していて、下記のクラス&オブジェクトがあります。
●基底クラスA(シーンを表すクラス)
├派生クラスA1─オブジェクトA1(タイトル画面)
├派生クラスA2─オブジェクトA2(1Pの行動シーン)─∞回繰り返す
└派生クラスA3─オブジェクトA3(2Pの行動シーン)─┘
●クラスB┬オブジェクトB1(1Pの手札)
      └オブジェクトB2(2Pの手札)
●クラスC─オブジェクトC(共通の山札)

私がやりたいことは、下記のとおりです。
・A2・A3ではB1・B2の手札がなくなったらゲームが終了するのでB1・B2にアクセスできるようにする。
・A2・A3ではCの山札がなくなったらゲームが終了するのでCにアクセスできるようにする。
・B1・B2ではCの山札の情報を取り込むのでCにアクセスできるようにする。

問題になっている点は下記のとおりです。
・"ClassB ObjectB1;"などの宣言をどこでするか。
・クラスA・B・Cそれぞれに、cppファイルとhファイルがありまして、
 どのファイルからどのファイルのヘッダをincludeしたら良いか。
・オブジェクト作成時にstaticを付けるのか付けないのかなどがよくわからない。

「私のやりたいこと」で述べたアクセスを実現するには、どうしたら良いのでしょうか。
簡単な骨組みを作っていただけませんでしょうか。おねがいします。

134 :デフォルトの名無しさん:03/01/04 22:41
このスレはクラスウィザードになりました

135 :デフォルトの名無しさん:03/01/04 22:48
>>133
言えることは
・設計からやりなおせ。
・勉強しなおせ。
・自分で考える力をつけよう。
だな。

・"ClassB ObjectB1;"などの宣言をどこでするか。
自分で考えろ、情報が少なすぎて判断できん。

・どのファイルからどのファイルのヘッダをincludeしたら良いか。
基本を勉強した上で自分で考えろ。

・オブジェクト作成時にstaticを付けるのか付けないのかなどがよくわからない
勉強しろ、自分が書いている事の意味を理解しろ。

・簡単な骨組みを作っていただけませんでしょうか。
上記の話のものだと、簡単な骨組みだけで、もう簡単じゃない。

特にひどいのは1Pの行動シーンと2Pの行動シーンを別クラスにしてある事だな。
Strategy とか覚えた方がいい。

136 :デフォルトの名無しさん:03/01/04 23:42
>>135
きみも勉強しようね。www

137 :デフォルトの名無しさん:03/01/04 23:51
>>133
>私がやりたいことは、下記のとおりです。
>・A2・A3…アクセスできるようにする。
>・A2・A3…アクセスできるようにする。
>・B1・B2…アクセスできるようにする。

アクセスできるようにするだけなら、
さほど問題は無いだろうに……


138 :136:03/01/04 23:56
厨は放っておきましょうよ・・・

139 :デフォルトの名無しさん:03/01/05 00:00
プレイヤー数が2より多くなったときってのを考えてないな…

140 :135:03/01/05 00:06
>>136
理由を言えない馬鹿を発見しました。

>>133
あとな、基底クラスA のあたりの仕組みには Task を使うといいぞ。


141 :136:03/01/05 00:09
>きみも勉強しようね。www
厨房は放っておくことを勉強しろこのカス。

142 :デフォルトの名無しさん:03/01/05 00:11
>>133
全部一つのファイルの中に書いたら?
そうすれば悩まずにすむ。

それがいやなら、なぜ嫌なのか考えてみたら?
自分が本当は何をしたいのかを。


143 :140:03/01/05 00:12
>>141
ごめん、そういう意味か…。
でも誰かが「駄目だ」って言ってあげないと…。

144 :デフォルトの名無しさん:03/01/05 01:07
>>115
static リンケージにしとけば、とりあえずリンク時には問題でないよ。
template 関数とか inline 関数の類は、そうだよね。

145 :115:03/01/05 01:13
>>144
テンプレートは本来 export キーワードでエクスポートされるべきなんだけどね。
はやくメジャーなコンパイラが対応しないかな…。

146 :デフォルトの名無しさん:03/01/05 01:44
>>141
カスは放っておかなくていいの?

147 :デフォルトの名無しさん:03/01/05 04:11
Unix C++で下記の2つのキャストってどうやるの?

unsigned int abcd;

struct test {
unsigned char a;
unsigned char b;
unsigned char c;
unsigned char d;
}

unsigned int⇔struct testは共に4バイトデータ


148 :デフォルトの名無しさん:03/01/05 04:18
>>147
struct test {
operator unsigned int()
{return a | (b << 8) | (c << 16) | (d << 24);}
}
ってこと?

149 :147:03/01/05 04:25
unsigned int aaa;
unsigned char bbb;

aaa = (int)bbb;
こんな感じで出来なかったかなと^^;

150 :デフォルトの名無しさん:03/01/05 05:11
>>147
環境依存コードはイクナイ!
char に 3 バイトずつパディングが入って struct test が 16バイトになる環境もありうるぞ。

151 :デフォルトの名無しさん:03/01/05 05:21
struct test {
 union {
  int abcd;
  struct {
   unsigned char a;
   unsigned char b;
   unsigned char c;
   unsigned char d;
  };
 }
};

152 :デフォルトの名無しさん:03/01/05 08:51
超初心者な質問ですが、

int a;
cout << "aを入力してください。\n";
cin >> a;

cout << "8進数:";
cout.setf(ios::oct, ios::basefield);
cout << a << '\n';

cout << "10進数:";
cout.setf(ios::dec, ios::basefield);
cout << a << '\n';

cout << "16進数:";
cout.setf(ios::hex, ios::basefield);
cout << a << " または ";
cout.setf(ios::uppercase);
cout << a << '\n';

intをdoubleに変えるとうまくいきません。
なんで?

153 :デフォルトの名無しさん:03/01/05 08:54
>>152
どう上手くいかないのかを良く観察汁。
そして、それが何故なのかを考える。
そして、型の違いに注目すると...。

154 :デフォルトの名無しさん:03/01/05 09:08
もう一度本をよく読んでみると、
「整数の出力は8進、10進、16進の3種類で行えます」
ってあったけど、それが答えかな?
とすれば、浮動小数点は10進のみ?

155 :デフォルトの名無しさん:03/01/05 09:36
型は型でも、注目すべきはむしろそのサイズ。

156 :デフォルトの名無しさん:03/01/05 10:05
市販本についてるプログラムをコンパイルすると
次のようなエラーが出てしまって困っています。

LINK : fatal error LNK1104: ファイル "nafxcwd.lib" を開けません。

どうしたらよいのでしょうか?

157 :デフォルトの名無しさん:03/01/05 10:07
>>156
nafxcwd.libをパスの通っているところに置く

158 :デフォルトの名無しさん:03/01/05 10:09
>>157
初心者で書いてることが分からないのですが・・・、
nafxcwd.libは何なのでしょうか?
パスの通っているところに置くというのも分からないので
教えてください。



159 :デフォルトの名無しさん:03/01/05 10:14
>>158
コマンドラインに何とタイプしてコンパイルしてる?

160 :デフォルトの名無しさん:03/01/05 10:16
lib = ライブラリ。
パスの意味がわからなかったら、
とりあえず、コマンドプロンプトから *.exe を実行しようと試みよ。
怒られたら

set PATH

とタイプして、[Enter]を押せ。そして、そこに表示されるものの意味を調べろ。

161 :デフォルトの名無しさん:03/01/05 10:16
>>158
見てみたらnafxwd.libってMFCのデバッグのスタティック用のライブラリみたい。
君のコンパイラがVCでかつProfessional以上ならコンパイルできるはず。
スタンダードならコンパイルできない。設定で共有MFCを使用するに変更しないと。


162 :デフォルトの名無しさん:03/01/05 10:17
あ、>>160 は、>>158 へのレス。

163 :デフォルトの名無しさん:03/01/05 10:19
>>158
Microsoft Visual C++でビルドしていて
コマンドを打って無いのですが、
そこを直すにはどうすればいいのでしょう?

164 :156:03/01/05 10:27
すみません、
163は>>159です。

>>160
すみません。コマンドプロンプトがよく分からなくて・・・。

とりあえず161さんの言うように設定を変えてみたのですが、
次のようなエラーが出てしまいました。

MSVCRTD.lib(crtexe.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/CJpegDecoder.exe : fatal error LNK1120: 外部参照 1 が未解決です。

どうしたら良いのかまた分からず・・・。
すみませんが教えてください。



165 :デフォルトの名無しさん:03/01/05 10:31
>>164
なんか別の設定をさわったろ?

166 :156:03/01/05 10:34
>>165
161で書かれてあるところを直しただけなのですが、
設定が悪いのでしょうか?
どうすれば良いですか?

167 :デフォルトの名無しさん:03/01/05 10:39
>>166
じゃあ、とりあえずプロジェクトの設定のリンクで
/SUBSYSTEM:WINDOWSを消せ

168 :デフォルトの名無しさん:03/01/05 10:40
>>166
ちゃう、
/SUBSYSTEM:CONSOLEになってるかも、とりあえずどっちかあったら消せ

169 :デフォルトの名無しさん:03/01/05 10:42
152ですが、int型でも負の値をいれると8進、16進でうまくいきません。
double型の場合、ios::oct等が対応していないためcout.setfの行を無視していると思ったのですが・・・
これも155さんが言うサイズと関係しているような気がするのですがよくわかりません。
(もしかしたらこの質問自体が意味不明な文になってるかも・・・)

170 :156:03/01/05 10:47
>>168
/SUBSYSTEM:CONSOLEを消したら

LINK : fatal error LNK1561: エントリー ポイントを定義しなければなりません
とエラーが出てしまいました。
まだ何かあるのでしょうか?



171 :デフォルトの名無しさん:03/01/05 10:51
>>169
doubleは普通の整数型とは値の表し方(フォーマット)がぜんぜん違うから16進で表示しても無意味だから対応していないんだろうね。


172 :デフォルトの名無しさん:03/01/05 10:52
>>170
メイン関数がないんだろ。
その本についていたプログラムはそれだけで動くものじゃないんじゃないのか?


173 :デフォルトの名無しさん:03/01/05 10:55
>>169
負の値でうまくいかないってのはなにがうまくいかないんだ?
16進数なら
-1 → ffffffff
だぞ

174 :デフォルトの名無しさん:03/01/05 10:58
8進数なら37777777777?
なんかプログラム勉強する以前のような気がしてきた・・・

175 :156:03/01/05 11:01
>>172
確かにmainが無いみたいです。
そういう説明が書いてなかったので気づきませんでした。
VC++の設定を初めていじって不安なのですが、
元に戻しておいた方が良いのでしょうか?

176 :デフォルトの名無しさん:03/01/05 11:04
VC++ネタは専門スレがあったとおもふ

177 :デフォルトの名無しさん:03/01/05 11:04
>>175
ぜんぜん問題ない。

178 :デフォルトの名無しさん:03/01/05 11:12
class A{}
class B : public virtual A{}
というような継承でvirtualを書くとどうなるんですか?

179 :デフォルトの名無しさん:03/01/05 11:15
virtual継承になる。

180 :デフォルトの名無しさん:03/01/05 11:20
>>179
すいません、virtual継承って何ですか?

181 :デフォルトの名無しさん:03/01/05 11:24
>>180
http://www.google.co.jp/search?q=virtual%E7%B6%99%E6%89%BF&ie=UTF-8&oe=UTF-8&hl=ja&lr=

182 :デフォルトの名無しさん:03/01/05 11:28
仮想クラスってありましたよね?
それの継承版ですか?

183 :デフォルトの名無しさん:03/01/05 11:36
>>182
多重継承について勉強しなされ。

184 :デフォルトの名無しさん:03/01/05 11:56
>>182
仮想クラスなんて存在しません。あるのは抽象基底クラスでしょ。仮想継承は、
多重継承時に基底クラスのサブオブジェクトを一つだけにする。

…っつかプログラミング言語 C++ 読むと、図付きで解説してると思うぞ。

185 :デフォルトの名無しさん:03/01/05 14:27
学校で、「男根の機能をC++のクラスで詳細に設計せよ」という課題が出ました。
手淫をすると、長さと太さの変数を上げ精子が飛び出させるというところまでは簡単なのですが、
一回射精をするとしばらく射精ができなくなるのが難しいです。
しかも、射精の直後でもがんばればできますし・・・

誰か作っていただけませんか?

186 :デフォルトの名無しさん:03/01/05 14:28
>>185
Stateパターン

187 :デフォルトの名無しさん:03/01/05 14:40
X* pca=new X;
X* pcb;
pcb=pca;
pcb->func();
delete pcb;
pcb=NULL;
pcb->func();これが落ちもせずに走るのは、どういうわけでしょう?
これはそういうものなんでしょうか?

188 :デフォルトの名無しさん:03/01/05 14:47
未定義とか、不定とか?

189 :デフォルトの名無しさん:03/01/05 14:54
さー!みんなで考えよう〜!
X::func() がメンバ変数を一切触っていないか、もしくは
delete 後のメモリが他の動作で破壊されていない事。
で NULL の定義が
#define NULL pca
もしくは
#define NULL pcb
だったりすると…

あら不思議!

190 :デフォルトの名無しさん:03/01/05 15:17
ahoka

191 :デフォルトの名無しさん:03/01/05 15:17
>>187
X::func() が非仮想メンバ関数で、かつ、直接または間接にそのインスタンスのメンバ変数の参照や
仮想メンバ関数の呼び出しを一切していないならば、そうなる場合もある。

>>189
pcb=NULL とした後では、たとえ delete 後もメモリがそのまま残っていたとしても、
インスタンスを参照しようとした瞬間に落ちると思われ。


192 :デフォルトの名無しさん:03/01/05 15:50
>>187
thisポインタに一切アクセスしないならば動くような気もする。

193 :デフォルトの名無しさん :03/01/05 15:57
Microsoft VC++で構造体のメンバーになっているポインタ
の指すデータを見るにはどうすれば良いでしょうか?

194 :デフォルトの名無しさん:03/01/05 16:05
>>193
デバッガの使い方って事?

195 :デフォルトの名無しさん:03/01/05 16:05
VCのSystem.out.println的関数情報キボンヌ
わかんねーよ

196 :193:03/01/05 16:22
>>194
デバッガでシンボル名を指定するとポインタのアドレスのデータが分かるのですが
その次以降のアドレスに入っているデータが見れないで困っています。
>>195
System.out.println的関数って何を見たらいいのでしょう?
初心者なので良く分からなくて・・・。

197 :デフォルトの名無しさん:03/01/05 16:30
>>196
ウオッチウィンドウを使え

198 :デフォルトの名無しさん:03/01/05 16:32
funcがstaticメンバ関数なんでしょ。

199 :デフォルトの名無しさん:03/01/05 16:41
>>198
非 static でも、呼び出す関数が静的に決定されるなら、関数呼び出しでは
落ちんよ。逆に言えば、関数呼び出しで保護違反を食らう可能性があるのは、
func が仮想関数の場合だけ。

もちろん非仮想関数であっても、中でメンバ変数を触ったらアウトだけど。


200 :デフォルトの名無しさん:03/01/05 16:44
>>199
そこまでムキにならなくても・・・

201 :デフォルトの名無しさん:03/01/05 19:20
クラス内で関数の定義を書いてしまうのと、
inlineをつけてクラス定義の外に書くのとでは
どういう違いがあるんでしょうか?

202 :デフォルトの名無しさん:03/01/05 19:28
>>201
別に違いはない

203 :デフォルトの名無しさん:03/01/05 21:43
>>202
処理系によるけど、外に書くと定義順によっては inline 展開されない場合が
ある。

inline void Foo::func1() { func2(); }
inline void Foo::func2() {}

これだと func1() をコンパイルする時点で func2() の定義が見えないので、
インライン展開されなかったりさ。

204 :デフォルトの名無しさん:03/01/05 21:56
コード生成はかなり後のフェーズっしょ
そりゃあよほどアホなコンパイラじゃないのかね

205 :デフォルトの名無しさん :03/01/05 22:02
配列が大きすぎてすぐ強制終了させられるんですけど、
メモリを確保するいい方法がありますでしょうか?

206 :デフォルトの名無しさん:03/01/05 22:10
newもmallocも知らないんスか?

207 :デフォルトの名無しさん:03/01/05 22:22
newやmalloc使ってもダメなんです。
他にいい方法ありますか?


208 :デフォルトの名無しさん:03/01/05 22:24
>>207
コンパイラオプションのヘルプをよく見ると、
メモリ量の上限を指定する方法が書いてあると思うよ。

209 :デフォルトの名無しさん:03/01/05 22:29
>>208
Microsofr VC++ ver6使ってるんですけど、
上限を増やす方法知ってたら教えてください。

210 :デフォルトの名無しさん:03/01/05 22:30
いったい何バイト確保したいんだ?

211 :デフォルトの名無しさん:03/01/05 22:31
>>210
後、2000×1000×3バイトなんですけど、
1000×1000で限界みたいなのです・・・。

212 :デフォルトの名無しさん:03/01/05 22:35
>>211 これかな?
http://www.microsoft.com/japan/developer/library/vccore/_core_.2f.zm.htm

213 :デフォルトの名無しさん:03/01/05 22:41
>>212
設定の変更したことないので、どうすればいいのかよく分からず・・・。
どうしたら良いのでしょう?

214 :デフォルトの名無しさん:03/01/05 22:42
>>212 アナタヒドイヒトネ

215 :デフォルトの名無しさん:03/01/05 22:42
>>211

new でも malloc でもその程度楽勝で確保できるぞ。
だいたい「強制終了」させられるんなら、プログラムのバグだと
思うし。

216 :デフォルトの名無しさん:03/01/05 22:50
>>211
具体的にどんなエラーが発生しているんだ?
エラーメッセージ晒せ

217 :デフォルトの名無しさん:03/01/05 22:54
>>215
new 使って2次元配列を定義しようとしてもできないのですが、
どうしたらいいのでしょうか?

218 :デフォルトの名無しさん:03/01/05 22:55
すいません。こうしてました。
int *data1 = new[1000 * 1000];
int i = 0;
for(i = 0;i <= 1000 * 1000;i++)
  data1[i] = 0;


219 :212:03/01/05 22:57
まあ、ネタはおいといて、、、
>>216
強制終了されるってことは、コンパイルエラーなしでコンパイル通って
実行時に落ちるってことでは?

220 :デフォルトの名無しさん:03/01/05 22:59
friendクラス、関数の宣言はprivateでもpublicでも意味的には全く同じ?

221 :205:03/01/05 23:02
そうです。コンパイルエラーなしです。
>>218のようにはしていないので
二次元配列のnewでの定義の仕方お願いします。


222 :デフォルトの名無しさん:03/01/05 23:03
>>204
> そりゃあよほどアホなコンパイラじゃないのかね
俺が確認したのは gcc 2.95.x
gcc 3 系列は試してないので知らんけど。

223 :デフォルトの名無しさん:03/01/05 23:11
>>221
int **data = new int[1000][1000];

224 :205:03/01/05 23:16
>>223
コンパイル出来ないのですが・・・。
何かおかしいのでしょうか?

225 :デフォルトの名無しさん:03/01/05 23:23
>>224
からかわれたんだ。
自分の書いたソースをあげてみそ

226 :デフォルトの名無しさん:03/01/05 23:23
>>220
friend クラス、関数はメンバじゃないから、アクセス制御とは当然関係ない。
だからこういうこともできる。

#include <iostream>
class Foo;
class Bar {
public:
    void print(const Foo&);
};

class Foo {
    int m_;
    friend void Bar::print(const Foo& f) { std::cout << f.m_ << std::endl; }
public:
    Foo(int n = 0) : m_(n) {}
};

int main()
{
    Foo foo;
    Bar bar;
    bar.print(foo);
}

227 :デフォルトの名無しさん:03/01/05 23:32
>>226
ありがとうございます。
教えてもらったところで申し訳ないのですが、
上のコードはg++だと2.95,3.2どちらでも
エラーになります。

228 :デフォルトの名無しさん:03/01/05 23:33
typedef int* LPINT;
int **data = new LPINT[1000];
for(int i = 0;i < 1000;i++)
  data[i] = new int[1000];


229 :デフォルトの名無しさん:03/01/05 23:35
struct
{
 int data[1000][1000];
}

230 :デフォルトの名無しさん:03/01/05 23:35
data;

231 :デフォルトの名無しさん:03/01/05 23:38
int (*data)[1000] = new int[1000][1000];

232 :デフォルトの名無しさん:03/01/05 23:38
typedef int* LPINT;
int **data = new LPINT[1000];
int *temp = new int[1000 * 1000];
for(int i = 0;i < 1000;i++)
  data[i] = temp[i * 1000];


233 :デフォルトの名無しさん:03/01/05 23:40
>>232
ちょっと修正
typedef int* LPINT;
int **data = new LPINT[1000];
int *temp = new int[1000 * 1000];
for(int i = 0;i < 1000;i++)
  data[i] = &temp[i * 1000];

234 :デフォルトの名無しさん:03/01/05 23:43
さて、正解は?

235 :デフォルトの名無しさん:03/01/05 23:44
あらかた出尽くした?

236 :デフォルトの名無しさん:03/01/05 23:45
>>234
ちょっと受けた

237 :デフォルトの名無しさん:03/01/05 23:53
typedef data[1000][1000];

238 :デフォルトの名無しさん:03/01/05 23:57
>>227
あ、gcc の挙動の方が正しいみたいだね。
VC7しか手元に無いんで深く考えずに、書いてしまった。
まあ、friend 宣言を定義化したのはただの行数稼ぎで
本筋ではないので……スンマソン、欝氏。

239 :デフォルトの名無しさん:03/01/06 00:43
ソースの書き方教えてください。

unsigned int aaa; ← 0xFFDDEECCの4byte Data
下記のように1byte Dataにしたいのですが
どのようにやればうまくいきますか?
unsigned char a1; ← 0xFF
unsigned char a2; ← 0xDD
unsigned char a3; ← 0xEE
unsigned char a4; ← 0xCC
また逆に詰め込みたい場合はどうするのが良いのでしょう。


240 :デフォルトの名無しさん:03/01/06 00:45
& >>と | <<

241 :239:03/01/06 00:55
>>240
具体的にどのようにすればよいのでしょう
素人ですまそん


242 :デフォルトの名無しさん:03/01/06 01:02
>>241
C++じゃなくてCなのでそっちで探せ

243 :デフォルトの名無しさん:03/01/06 01:18
unsigned char *a;
a = (unsigned char *) &aaa;

244 :デフォルトの名無しさん:03/01/06 01:19
afo

245 :デフォルトの名無しさん:03/01/06 02:08
>>244
あながちそうでもない

246 :デフォルトの名無しさん:03/01/06 02:49
>>245
同意だが #ifdef BIG_ENDIAN とかで括っとけよ。

247 :デフォルトの名無しさん:03/01/06 06:43
// int は 32 ビットを想定
void int2charArray(int src, char* dst)
{
 dst[0] = src     & 0xFF;
 dst[1] = (src >> 8) & 0xFF;
 dst[2] = (src >> 16) & 0xFF;
 dst[3] = (src >> 24) & 0xFF;
}

こんなんでどーだ?

248 :デフォルトの名無しさん:03/01/06 07:41
>>247
別にunsigned long使えばいいと思うが。
あと、unsigned charの方が良いな。


249 :デフォルトの名無しさん:03/01/06 08:01
union を使うのがいいような気も……

250 :デフォルトの名無しさん:03/01/06 11:13
>>249
むりやりC++にしてみた(藁
配列じゃなく、std::vectorなのは勘弁しれ

#include <iostream>
#include <vector>
#include <algorithm>

template<typename T>
union Foo {
    T val;
    unsigned char byte[sizeof(T)];
};

template<typename T>
std::vector<unsigned char> toUchar(const T& val)
{
    std::vector<unsigned char> result(sizeof(T));
    Foo<T> foo;
    foo.val = val;
    std::copy(foo.byte, foo.byte+sizeof(T), result.begin());
    return result;
}

template<typename T>
T toVal(const std::vector<unsigned char>& vec)
{
    Foo<T> foo;
    std::copy(vec.begin(), vec.end(), foo.byte);
    return foo.val;
}


251 :デフォルトの名無しさん:03/01/06 11:15
unsigned int aaa = 0xFFDDEECC;
unsigned char a1 = (aaa >> 24) & 0xff;
unsigned char a2 = (aaa >> 16) & 0xff;
unsigned char a3 = (aaa >> 8) & 0xff;
unsigned char a4 = (aaa >> 0) & 0xff;
unsigned int bbb = (a1 << 24) | (a2 << 16) | (a3 << 8) | (a4 << 0);


252 :デフォルトの名無しさん:03/01/06 11:19
& 0xffはいらないだろ。

と思いつついつも書いてしまう小心者の俺...

253 :248:03/01/06 11:24
初心者には勉強になるかと思ってあえて超丁寧に書いただけだよ。
ワーニングが出る処理系もあるし。

254 :デフォルトの名無しさん:03/01/06 14:01
> そりゃあよほどアホなコンパイラじゃないのかね

あんたほどじゃないだろうけどね(w

255 :デフォルトの名無しさん:03/01/06 14:09
関数の先頭で変数宣言するのと、途中で宣言するのは
なにか違いはありますか?必要になり次第処理の途中で
スタックに積む方が効率がいいと思うのですがどうでしょうか?

256 :デフォルトの名無しさん:03/01/06 14:14
>>255
それはコンパイラの実装次第。例えばBorland-C++5.5.1では、変数が出てくる
度にスタックに積むのではなく、最初に関数の中身を全部調べて、必要なだけ
のスタックを関数の入り口で確保してしまう。

257 :デフォルトの名無しさん:03/01/06 14:18
>>256
つまりそのあたりのスタックの使い方に標準はないということですね。
当たり前かもしれませんが。。。自分のコンパイラをよく調べてみます。
ありがとうございました。

258 :デフォルトの名無しさん:03/01/06 14:26
initialize…ハァハァビヨーンタソ

259 :デフォルトの名無しさん:03/01/06 15:26
二次元配列の動的確保ってどうやってやるんですか?

260 :bloom:03/01/06 15:27


http://www.agemasukudasai.com/bloom/

261 :デフォルトの名無しさん:03/01/06 15:46
>>259
列の次元が決まっていてもいいなら

TYPE (*p)[100] = new TYPE[n][100];

行、列とも可変なら

TYPE** p = new TYPE*[m];
for (int i = 0; i < m; i++)
p[i] = new TYPE[n];

262 :デフォルトの名無しさん:03/01/06 15:48
>261
サンクスです♪
これでrenewが作れます。

263 :デフォルトの名無しさん:03/01/06 18:10
main(){
int* pa=new int;
pa=(int*)new double;
delete pa;
}
これがメモリリークしてしまうのは、何故ですか?

264 :デフォルトの名無しさん:03/01/06 18:13
new * 2
delete * 1

265 :デフォルトの名無しさん:03/01/06 18:32
>>263

int* pa = (int*)new double;
delete pa;

こういう事か?

266 :デフォルトの名無しさん:03/01/06 19:46
>264
二回deleteしたら当たり前のように落ちるんですが・・・

267 :デフォルトの名無しさん :03/01/06 20:05
市販本についているVC++のプログラムで、
main関数が無いのに実行できるのですが、どうしてでしょうか?
それが分からないと改造できないので、よろしくお願いします。

268 :デフォルトの名無しさん:03/01/06 20:06
( ´,_ゝ`)プッ

269 :デフォルトの名無しさん:03/01/06 20:21
>>266
同じアドレスに対して二回deleteしたら落ちるのは当然。
delete pa;
pa = 0;
delete pa;
とすれば落ちない。でもメモリリークは治らない。

270 :デフォルトの名無しさん:03/01/06 20:32
>>267
君みたいな奴に限って、違法コピーのVisualStudioを使ってるんだよなあ。

271 :デフォルトの名無しさん:03/01/06 20:34
>267
WinMainじゃないだろうな?

272 :デフォルトの名無しさん:03/01/06 20:56
>>271
実行するとWindowsが開くんですけど、WinMainってそれに関係してるんですか?


273 :PGバイト人(学生):03/01/06 20:59
MFC使ってんだと思われ。

274 : :03/01/06 21:01
コピペお願いします

半島の組織票で逆転されました。
一人でも多くの協力が必要なんです
http://live.2ch.net/test/read.cgi/festival/1039531056/926
CNNのアンケート
合衆国は北朝鮮と不可侵条約を締結するべきか?
Noに投票してください!

投票所:http://asia.cnn.com/の右下
祭り会場:http://live.2ch.net/test/read.cgi/festival/1041681450/
ハングルhttp://ex.2ch.net/test/read.cgi/korea/1041848026/

275 :デフォルトの名無しさん:03/01/06 21:02
MFCって?
どうすれば見れるんですか?


276 :デフォルトの名無しさん:03/01/06 21:09
・・・君の買った本には書いてないのか?
っていうか
>WinMainってそれに関係してるんですか?
で、MFCは無茶。
で、ここは「C++」のスレ。winもMFCもスレ違い。

277 :PGバイト人(学生):03/01/06 21:11
>>275
スレ違いなのだが・・・。

まだ>>275はその市販本で勉強するには知識が足りない。
(もしくは市販本の説明が悪い)

簡潔に言うとWinMain関数はWindowsのMain関数みたいなもんで
MFC内で定義されている。
この話題はこのスレの趣旨に合っていないので、

初心者にVisual C++を教えるスレ★

を勧める。
以上

278 :デフォルトの名無しさん:03/01/06 21:16
>>276
買った本にはMFCについて書いておりませんので・・・。

>>277
そちらのスレで聞いてみます。


279 :デフォルトの名無しさん:03/01/06 23:00
>>277
フリーターが何を偉そうに

280 :デフォルトの名無しさん:03/01/06 23:09
環境依存の話はそちらのスレでどうぞ

281 :デフォルトの名無しさん:03/01/07 01:11
> 簡潔に言うとWinMain関数はWindowsのMain関数みたいなもんで
> MFC内で定義されている。
( ´,_ゝ`)プッ

282 :デフォルトの名無しさん:03/01/07 01:26
_tWinMainはあるね。

283 :デフォルトの名無しさん:03/01/07 01:31
class A {};

void func1(A& a) {...}
void func2(const A& a) {...}

void caller() {
 func1(A());
 func2(A());
}

func1のが怒られる理由って何だっけ

284 :デフォルトの名無しさん:03/01/07 01:52
>>283
怒られませんが・・・・・

285 :デフォルトの名無しさん:03/01/07 01:54
マジ?gcc3.2は怒った

286 :デフォルトの名無しさん:03/01/07 02:07
>>284
貴様MSVCだな!

287 :デフォルトの名無しさん:03/01/07 02:13
>>283
一時変数はconstなんじゃ?

288 :デフォルトの名無しさん:03/01/07 02:17
Borland C++ ではお咎めなし、引数つかってねーよって警告は出たが…。
gcc は 2.95.3-5 でも怒られるね…なんで?
呼び出し中に非const の A が作られてるのに、そいつが const A& にはなれて
A& にはなれない理由は〜〜?俺も知りたいー。

289 :288:03/01/07 02:19
>>287
マジっすか?プログラミング言語C++ か仕様書で書いてある所あったら
セクション番号きぼんぬ!

290 :デフォルトの名無しさん:03/01/07 02:27
>>289
一時変数はconstではないが、変数のリファレンスに一時変数を与える
事は禁止されているらしい。
プログラミング言語C++第3版、P135、§5.5

291 :デフォルトの名無しさん:03/01/07 02:45
多分これと同じ理由だろう。

int main() {
A& a = A(); // エラー
const A& aa = A(); // OK
}

292 :デフォルトの名無しさん:03/01/07 07:19
291が何故ダメなのか分からない…(´・ω・`)

293 :デフォルトの名無しさん:03/01/07 07:33
>>292
こういう風に書き換えたらわかるかな?
int main() {
int& a = 1; // エラー
const int& aa = 1; // OK
}

294 :デフォルトの名無しさん:03/01/07 09:03
メンバ変数に触っていない関数をstatic関数のように呼び出すのは
いいの?というかそれなら最初からstatic関数にしておけばいいのに
と思いません?

295 :デフォルトの名無しさん:03/01/07 09:38
しろよ。

296 :292:03/01/07 10:22
>>293
それは理解できたのですが、また疑問が沸き上がりました。
A& a = A();で確保したaはスコープが外れるとデストラクトされるのですか?

297 :デフォルトの名無しさん:03/01/07 11:41
>>296
なんで試してみないんだ?
ちなみに、結果はコンパイルエラーのはずだが。

298 :288:03/01/07 12:49
>>291
ありがとうございます。家に帰ったら読んでみます。

>>296
new で作ったものじゃなければスコープ外になったらデストラクトされるでしょう。(多分)


299 :292:03/01/07 13:25
>>297-298
試してみたらちゃんと呼ばれてました。
混乱して済みません。

環境:VC++7.0

#include <iostream>

class A {
public:
A() { std::cout << "constract A()" << std::endl; }
virtual ~A() { std::cout << "deconstract ~A()" << std::endl; }
int m_i;
};

int main() {
A& a = A(); // 通る
const A& aa = A(); // 通る

int& b = 1; // エラー
const int& bb = 1; // 通る
}



300 :デフォルトの名無しさん:03/01/07 13:49
>>292
見境なく仮想デストラクタにするのはやめたほうが…

301 :デフォルトの名無しさん:03/01/07 15:01
IEEEで取り込んだ画像をC++で入出力する
プログラムがあります
それをいち早く編集したいのです!
なにを学べばいいかわかりません。。。。
助けて

302 :デフォルトの名無しさん:03/01/07 15:07
>>301
早くそのプログラムを送って!
助けて!

303 :デフォルトの名無しさん:03/01/07 15:19
cout << (char*)NULL << endl;
これって何も言わずにexitしちゃうんだけどいいの?

304 :デフォルトの名無しさん:03/01/07 15:36
>>303
C++ には NullPointerException なんかねーよ。


305 :303:03/01/07 15:40
文字列の初期化なんだけど、
どっちにしてますか?

char* szA = NULL;
cout << szA << endl; // 落ちる
...
if(szA != NULL){
 delete szA;
 szA = NULL;
}

char* szB = "";
cout << szB << endl // 改行
...
if(strcmp(szB, "")){
 delete szB;
 strcpy(szB, "");
}


306 :デフォルトの名無しさん:03/01/07 16:01
>>302
おくりました!
助けてーくーだーさーい


307 :デフォルトの名無しさん:03/01/07 16:09
誰のメアドかも分からんに送っちゃ駄目だろ

308 :デフォルトの名無しさん:03/01/07 16:15
>>305
どっちでもいいけど、後始末が両方ダメ。

309 :303:03/01/07 16:26
>>304
実行時エラーだったら何か言って欲しいと思うのです。

>>305
訂正。
delete szB;
szB = new sizeof(char);
strcpy(szB, "");

>>308
どこがダメ?


310 :デフォルトの名無しさん:03/01/07 16:29
送ってといわれたので・・・


311 :デフォルトの名無しさん:03/01/07 17:12
>> 309
あのな、C++で文字列を扱いたかったら、std::string 使え。
ほかに、文字列変数に sz プレフィクスつけると、ガンガリアンが混乱するからやめれ。
で、文字列初期化の仕方も間違ってるし。
すこし勉強してからまたきなさい。
なにがしたいのかもわからないし。

312 :302:03/01/07 17:36
受け取りますた

本当に送ってくるとは思ってなかったけども

313 :デフォルトの名無しさん:03/01/07 17:38
X x;
x[][];

と、いう風に書きたいのですが、opeator[][]()はエラーになります。
何かいい方法ありませんか?

314 :デフォルトの名無しさん:03/01/07 17:44
>>305
文字列には、string を使う。

 std::string s;

これで初期化も確保も一発。
つーか >>303 は何がしたいのさ?

315 :303:03/01/07 17:52
勉強のため文字列クラスを自作してます。

>>311
だからどう間違ってるのかって聞いてるのに・・・


316 :デフォルトの名無しさん:03/01/07 17:55
>>313
template<class T, int M, int N>
class X {
T array[M*N];
public:
T* operator[](size_t i) { return array + N*i; }
};
とか?

317 :デフォルトの名無しさん:03/01/07 18:06
class X{
int a[10][10];
};

X x;
x[0][0];
こんな感じです。

318 :デフォルトの名無しさん:03/01/07 18:12
a を public にして、
x.a[0][0];
じゃだめなの?

319 :デフォルトの名無しさん:03/01/07 18:15
その方法が一番まっとうだと思うんですが、xを配列のように扱って
みたいんです。

320 :デフォルトの名無しさん:03/01/07 18:15
オイオイオイオイ…

321 :デフォルトの名無しさん:03/01/07 18:20
すみません・・・
なんとかならないですかねぇ

322 :デフォルトの名無しさん:03/01/07 18:21
>321
アンタ誰だよ・・・

323 :302:03/01/07 18:33
>>321
俺は鬱病なんでやる気ない、すまん

324 :デフォルトの名無しさん:03/01/07 18:38

どっかにうpして晒すとか…

325 :303:03/01/07 18:48
delete [] szA;
szA = new char [1];
だった(;´Д`)逝ってきます

つか自作文字列クラスの仕様では
デフォルトコンスタクタ以外、文字列を空にする必要って無かった


326 :デフォルトの名無しさん:03/01/07 20:01
>>325
あなた、一回、そのクラス定義をさらしなさい。みんな、あなたが何をやりたいのか
わからないから何もアドバイスできないのよ。

327 :デフォルトの名無しさん:03/01/07 20:18
>>315
std::cout << (char*)NULL << std::endl;
gcc3.2.1(MinGW)では落ちないぞ。何も表示されなかったけど。

std::printf("%s", NULL);
と同じような意味だと思う。但し、printfの%sはアドレスに0を渡すと、"(null)"って
表示してくれる。

328 :デフォルトの名無しさん:03/01/07 20:38
何故、nullポインタを出力したいのか、その意図がわからん

329 :デフォルトの名無しさん :03/01/07 20:48
ファイル "nafxcwd.lib" を開けません。
というエラーメッセージが出てしまうのですが
どうすればいいのか教えてください。

330 :デフォルトの名無しさん:03/01/07 20:55
このようなsample.dsp sample.cpp sample.rc sample.clw
sapleDoc.cpp sampleView.cpp Stdafx.cpp ともともとあるファイルで、
どのファイルをいじくれば編集できるのですか?(画像処理で色変換がしたいです)
初心すぎてすみません、教えてください


331 :デフォルトの名無しさん:03/01/07 20:58
スレ違いだと何遍言えば(略

332 :デフォルトの名無しさん:03/01/07 22:06
>>329-330
VC++のスレへ逝け

333 :デフォルトの名無しさん:03/01/07 23:32
>>319
struct X {
 int a[10][10];
 struct proxy {
  int& operator[] ( int j ) { return x->a[i][j]; }
  proxy( X*x, int i ) : x(x),i(i) {}
  X* const x;
  int const i;
 };
 proxy operator[](int i) { return proxy(this,i); }
};

334 :デフォルトの名無しさん:03/01/08 10:52
std::max<int>はconst int& を受け渡ししますが、
このおかげで値渡しによる実装に比べて効率が悪くなるのは、
コンパイラの最適化の責任ですか?
STL実装の責任ですか?
利用者の責任(代替の実装を使うべし)ですか?

335 :!:03/01/08 11:05
Proxy Pattern come from?

336 :308じゃないけど:03/01/08 13:12

>>303

T* obj = new T; と確保したら、解放は delete obj;
T* obj = new T[size]; と確保したら、解放は delete[] obj;
基本中の基本です。

>>303 は、ポインタを new していないのに、 delete で消そうとしているからだめだめ。
>>305 で、char* szB = ""; と、定数へのポインタを delete で消すなんていうのはもってのほか。

メモリリークで苦しみたくなければ、メモリや変数について、1から勉強したほうがよいと思われ。
それが嫌なら、C/C++ やめて Java か C# でもやってなさい

337 :デフォルトの名無しさん:03/01/08 13:15
>>334
inline展開が効けばマクロ並になると思われ。

338 :334:03/01/08 13:54
>>337
そうおもってたんですが、アセンブリ見たら、
値をレジスタからメモリに移してアドレス取ってるんですよ。
もうね、(中略)と。
ちなみに、cygwin gcc3.2 でも同様の結果を確認。

339 :デフォルトの名無しさん:03/01/08 14:19
>>338
const int&は必ず一時変数を必要とするので、レジスタ変数が使える場面
でも一度メモリに入れるのかもしれません。

RISC CPUで動くg++の結果も見たいものです。

340 :デフォルトの名無しさん:03/01/08 14:25
>>338
ちなみに一時変数を必要としない変数の参照版ではちゃんとレジスタで
比較してくれました。

template <typename T>
inline T mymax(T& a, T& b)
{
return (a > b) ? a : b;
}

但し変数の参照は一時変数をバインドできないので、mymax(1, 2)なんて
やるとエラーが出ます。

341 :デフォルトの名無しさん:03/01/08 14:39
ごめそ。そう思ったけど、やってみたら、

template <typename T>
inline T& mymax(T& a, T& b)
{
return (a > b) ? a : b;
}

ではやっぱりアドレスとるね。それから

template <typename T>
inline T mymax(const T& a, const T& b)
{
return (a > b) ? a : b;
}

ではレジスタで比較してくれた。だから、constがあるかないかではなく、返り値が
参照かそうでないかで最適化が決まるみたい。intのような小さいオブジェクトでは
効率が悪くなるが、class変数に対してはアドレス取った方が効率が良くなるから
痛し痒しですな。

342 :デフォルトの名無しさん:03/01/08 17:02
TypeTraits<int>::ParameterType は解決にならんか?

343 :デフォルトの名無しさん:03/01/08 17:12
intで特化した関数maxを多重定義しておけば?

344 :IP記録実験:03/01/08 21:30
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/

1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。

27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?

38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27
鋭いです。

73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。

345 :デフォルトの名無しさん:03/01/08 22:54
ほぜむ

346 :デフォルトの名無しさん:03/01/08 23:03
保守

347 :デフォルトの名無しさん:03/01/08 23:07
C++の例外で質問があります
例外クラスを作ったんですが、
例外は実体を投げたほうがいいんでしょうか
それともnewしてポインタを投げたほうがいいんでしょうか

348 :デフォルトの名無しさん:03/01/08 23:09
>>347
実体というか、コンストラクタを使って作った一時変数を投げてconst & で
受けるとよい。
newするとdeleteしないといけないし面倒くさい。

349 :デフォルトの名無しさん:03/01/08 23:13
>>348
即レスありがとうございます。
 throw A(); とかですよね。
こいつが削除されるタイミングっていつになるんでしょう。
catch節を抜けたとき、であってますか?

あと、例外クラスを継承したとき、
たとえば class B : public A {}; としたとき
 throw B();
したのが
 } catch ( const A& a ) {
で捕まえられるもんなのでしょうか。
また、たとえば、この場合に
 } catch ( A a ) {
なんてやるとどうなるんでしょう・・・

350 :デフォルトの名無しさん:03/01/08 23:16
intとかの型ってどうやって定義されているんだろう?
気になる。いっぺんでいいから定義文を見てみたい

351 :デフォルトの名無しさん:03/01/08 23:24
削除されるタイミングは、もちろんcatchを抜けた時。一時変数が削除される。
B()をconst A&で受けると、型が違うので多分ダメ。

Aで受けると、文法的には一時変数のコピーを受けることになるが、最適化
によって大抵一時変数そのものを受けるので効率的には変わらないのでは
ないかと思う。これについては確信無し。


352 :デフォルトの名無しさん:03/01/08 23:32
'あ'はchar型?

353 :デフォルトの名無しさん:03/01/08 23:33
あちゃー

354 :デフォルトの名無しさん:03/01/08 23:46
>351
> B()をconst A&で受けると、型が違うので多分ダメ。
基底クラスへの参照なら、問題ないぞ。っつーか A& ではなく A で受けると
スライシングが起こるから、たいてい不幸な結果になる。

355 :デフォルトの名無しさん:03/01/09 00:02
>>354
継承したクラスを基底クラスで受けられるって初めて知った。
目から鱗です∈( ̄o ̄)∋。勉強し直しです。

それから、確かにAで受けると、先に~A()が呼び出されてしまうから
まずいね。

356 :デフォルトの名無しさん:03/01/09 00:10
ちょっと質問です。

class Except {
public:
const char* what() const { return "abc"; }
Except() { std::cout << "Except()" << std::endl; }
~Except() { std::cout << "~Except()" << std::endl; }
};

class Ex2 : public Except {
public:
Ex2() { std::cout << "Ex2()" << std::endl; }
~Ex2() { std::cout << "~Ex2()" << std::endl; }
};

int main()
{
try {
throw Ex2();
}
catch (const Except& e) {
std::cout << e.what() << std::endl;
}
}

357 :デフォルトの名無しさん:03/01/09 00:11
何を?

358 :デフォルトの名無しさん:03/01/09 00:11
上のプログラムを実行すると次のような出力が得られます。

Except()
Ex2()
~Ex2()
~Except()
abc
~Ex2()
~Except()

なんか、デストラクタが1回ずつ余計に実行されているように見えるのですが、
大丈夫なんでしょうか?

359 :デフォルトの名無しさん:03/01/09 00:11
引数が
char*& pStreamData
となってる関数があるのですが、
これってどういう意味なんですか?
最初の宣言は
char  pStreamData
としていいのでしょうか?




360 :age2ch.pl 0.03.28:03/01/09 00:12
そんなわけで、qbサーバでIPの記録実験をはじめましたー。


361 :デフォルトの名無しさん:03/01/09 00:13
>>358
コピーコンストラクタも cout に表示するようにしてみ。

362 :デフォルトの名無しさん:03/01/09 00:14
>>359
ポインタのリファレンス。簡単に言うと、ポインタのポインタみたいな使い方を
する。
最初の宣言はchar* pStreamDataでは?

363 :デフォルトの名無しさん:03/01/09 00:17
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!

364 :デフォルトの名無しさん:03/01/09 00:17
>>361
なるほど、すっかり忘れていました!
特にポインタ変数があるような場合はコピーコンストラクタを書いて
おかないといけないんでしたね。

365 :デフォルトの名無しさん:03/01/09 00:22
>>361
これで、継承したクラスを基底クラスの参照ではなく変数で受けると
ヤバイ理由がわかりました。基底クラスのコピーコンストラクタと
デストラクタが呼び出されてしまうわけですね。でも基底クラスの
コピーコンストラクタなら大丈夫な気もするのですが・・・気のせいでしょうか?

366 :デフォルトの名無しさん:03/01/09 00:29
家族構成と小学校時代の恥ずかしかった思い出も記録されます。

367 :デフォルトの名無しさん:03/01/09 00:49
>>155
2ちゃんねるはアングラなの? △ ▽  ▲ ▼
 誰もが自由に書き込みが出来る匿名掲示板(←ここ)のシステムには

368 :デフォルトの名無しさん:03/01/09 00:52
なんかさっきからトンチンカンな書き込みが多いが・・・・・
2chビューアのバグ?

369 :デフォルトの名無しさん:03/01/09 00:54
小食にします。>>265

370 :デフォルトの名無しさん:03/01/09 01:01
一回あげてみる。

371 :デフォルトの名無しさん:03/01/09 01:04
>>386
IP記録うんぬんのやつに引き続き荒らされてる。

372 :デフォルトの名無しさん:03/01/09 01:05
IP記録うんぬん=ダウン厨

373 :デフォルトの名無しさん:03/01/09 01:09
>>366>>367>>369>>371>>372
だからお前らいったいどこのスレの住人なんだよ?

374 :デフォルトの名無しさん:03/01/09 01:09
>>339

わかってます。
でも心の2ちゃんは荒れまくってます。
AAのオンパレードです。

375 :371:03/01/09 01:15
>>373
すまん。>>368 のつもりだった。
PC 系の板で同じように荒らされているみたい。

376 :デフォルトの名無しさん:03/01/09 01:15
そろそろ1ch.tvの出番か?(藁

377 :デフォルトの名無しさん:03/01/09 01:24
>>446
ソナチネとか結構好きです。
>>449
もうすでに。

378 :デフォルトの名無しさん:03/01/09 01:58
IPの記録はまじでやめてほしい


379 :デフォルトの名無しさん:03/01/09 02:02
>>378
悪いことしなければ問題ないだろ

380 :デフォルトの名無しさん:03/01/09 02:56
nyの掲示板に来い!

381 :デフォルトの名無しさん:03/01/09 03:41
最高裁への上告は認められなくなったから、これで事実上判決確定だよ。
逆転も何もないって。
勢いで上告なんかしても一発で上告却下(門前払い)だよ。

二審も一審を支持。これに対して上告しようにも、
刑事訴訟と同様、自由に上告できるってもんでもないのです。
民事訴訟法312条 (上告の理由) 1項
「上告は、判決に憲法の解釈の誤りがあること
その他憲法の違反があることを理由とするときに、することができる。」
http://www.m-net.ne.jp/~doba/goto/hon.htm

ようするに上告しても今の制度では100%無駄。
これで完全終了ってことか。



382 :デフォルトの名無しさん:03/01/09 12:20
スレ違い馬鹿はどっか行ってくれ

↓↓ 次の方、質問をどうぞ ↓↓

383 :デフォルトの名無しさん:03/01/09 12:38
>>135
最後自宅かよ!

384 :デフォルトの名無しさん:03/01/09 13:08
>>382
昨晩からどうやらスクリプトが狂っていて、どこか他のスレへの書き込みが
このスレへスルーしてくるみたい。
書き込みしているヤシには見えないらしいので、このスレが埋まるまで
待つか、新しいスレ立てるしかないかもしれん。

385 :!:03/01/09 15:07
>>378
厨房は一生厨房のままです。

386 :デフォルトの名無しさん:03/01/09 15:37
trye{
// ...
}
template <class T>
catch(const T& e){
std::cout << e.what() << std::endl;
}


387 :デフォルトの名無しさん:03/01/09 15:46
if you think C++ is difficult, trye English.

by Byo-n.

388 :デフォルトの名無しさん:03/01/09 17:20
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 138720人 発行日:2003/1/9

年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。

そんなわけで、年末に予告したIP記録ですが実験を開始しています。

「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────

389 :303 文字列クラスその1:03/01/09 22:04
遅くなりましたが、>>336さんありがとうございます。
一応動くようになったんですが、晒して見ます。
よろしければ突っ込み入れてください。

class UString
{
protected:
 char* m_sz;
 int m_len;

public:
 UString();
 UString(const char* a_sz);
 UString(const UString& a_str);
 ~UString();

 UString& operator = (const UString& a_str);
 UString& operator = (const char* a_sz);
 UString& operator += (const UString& a_str);

 int GetLengthSz(const char* a_sz);
 const char* GetSz();
 int GetLength();

 bool CopySz (char* a_dst, const char* a_src);
 bool EqualSz (const char* a_szA, const char* a_szB);

 friend UString& operator + (const UString& a_strA, const UString& a_strB);
 friend bool operator == (const UString& a_strA, const UString& a_strB);
 friend bool operator != (const UString& a_strA, const UString& a_strB);
 friend ostream& operator << (ostream& a_ostream, const UString& a_str);
};

390 :303 文字列クラスその2:03/01/09 22:22
UString :: UString ()
{
 m_len = 0;
 m_sz = new char [1];
 m_sz[0] = '\0';
}

UString :: UString (const UString& a_str)
{
 m_len = a_str.m_len;
 m_sz = new char [m_len + 1];
 CopySz(m_sz, a_str.m_sz);
}

UString :: ~UString ()
{
 if(m_sz != NULL)
  delete [] m_sz;
}

UString& UString :: operator = (const UString& a_str)
{
 if(m_sz != NULL)
  delete [] m_sz;
 m_len = a_str.m_len;
 m_sz = new char [m_len + 1];
 CopySz(m_sz, a_str.m_sz);
 return *this;
}


391 :303 文字列クラスその3:03/01/09 22:41
UString& operator + (const UString& a_strA, const UString& a_strB)
{
 UString* ret_str = new UString();
 *ret_str += a_strA;
 *ret_str += a_strB;
 return *ret_str;
}

UString& UString :: operator += (const UString& a_str)
{
 int lennew = m_len + a_str.m_len;
 char* sznew = new char [lennew + 1];
 int i = 0;
 int k = 0;
 for(i=0; i<m_len; i++)
  sznew[i] = m_sz[i];
 for(k=0; i<lennew; i++,k++)
  sznew[i] = a_str.m_sz[k];
 sznew[i] = '\0';
 delete [] m_sz;
 m_sz = sznew;
 m_len = lennew;
 return *this;
}

重なる部分、あまり重要でない部分は端折ってありますが、以上です。
長文失礼しました。


392 :デフォルトの名無しさん:03/01/09 22:55
>>389
・メンバの初期化は初期化リストを使え。
・delete前の分岐は冗長。
・protectedメンバがあるのに、デストラクタがvirtualじゃないのはおかしい。
・operator + の型が、慣用的なものと異なる。
・operator + が、効率が悪い上、メモリーリークする。
・newでbad_allocが飛ぶことが考慮されていない。

393 :デフォルトの名無しさん:03/01/09 23:12
記念かきこ

394 :デフォルトの名無しさん:03/01/09 23:36
void func(int){}
main(){
void* vp=func;
}
とあるとき、vpからfuncの返値、引値の型をとる方法ありますか?

395 :デフォルトの名無しさん:03/01/09 23:39
>>386
それほしいんだけど・・・
catchをズラズラ書くのはダサイし・・・

396 :デフォルトの名無しさん:03/01/09 23:39
typeidはなしの方向で

397 :303:03/01/09 23:58
>>392
的確なアドバイスありがとうございます。
疑問点がまた幾つか浮かび上がってきまた。
修行してきまつ

398 :デフォルトの名無しさん:03/01/10 00:02
クラスライブラリを作成してるんですが、拡張性を持たせようと
ほとんどのメンバ関数をvirtual指定しました。
そしたら、友人から「virtual指定すると遅くなるから、必要な物だけにしたほうがいい」
と言われたんですが、実際そうなんでしょうか?
(なんか仮想関数テーブルがなんたらかんたらで遅くなるといっていました)

399 :デフォルトの名無しさん:03/01/10 00:06
>>398
ディスアセンブルしてみろ。

400 :398:03/01/10 00:08
アセンブリ言語よくわからないんでつ。。

401 :デフォルトの名無しさん:03/01/10 00:09
それ以前の問題で
「拡張性を持たせるためにvirtualにする」
が変。

どこをどう拡張するかを決めずに設計しても無駄。

402 :デフォルトの名無しさん:03/01/10 00:09
>>398
そもそも、拡張性のために何でもvirtualという考え方がどうかと・・・
何でもvirtualじゃないと拡張性が無いのだとすれば、
クラス設計自体に問題があるのかもしれません。

403 :デフォルトの名無しさん:03/01/10 00:12
>>402
そうそう。
ポリモーフィズムが必要な場合を判断できなきゃね。

404 :398:03/01/10 00:17
>>401-403
なるほど。。クラス設計考え直して見ます。
ありがとうござますた。
(C++の基本的な考えとして、virtualしたものはしないものより遅くなるんでしょうか?)


405 :デフォルトの名無しさん:03/01/10 00:21
398叩かれまくり。かわいそうだからフォローしてやろう。
"拡張性"の定義はしっかりしたほうがいい。

プラグイン的なものを組み込めるような拡張性
多くの用途に対応するための拡張性
環境への依存度を下げるための拡張性

これらは重なる部分もあるけど微妙に違う。
どの拡張性を求めているのか、検討しとけ。

virtualのコストは確かにあるが、最近のCPUではわずかなもんだ。
そこにハマって効率を上げる努力より、
しっかりクラス設計をする努力のほうが何万倍も効果があるぞ。
言語仕様に流されすぎないようにな。

406 :デフォルトの名無しさん:03/01/10 00:37
余談だが
同人コミケ板のバナーにC++って書いてあるような気がするのは俺だけか?
一体何の関係が?

407 :デフォルトの名無しさん:03/01/10 00:45
>>406
あれは2CHと書いてあるんだと思われ。

408 :デフォルトの名無しさん:03/01/10 00:45
ループの内側だと一生懸命になる罠

409 :デフォルトの名無しさん:03/01/10 00:50
ひろゆき氏が発行するメールマガジンで明らかにした。
ってあるけど、電波2ch以外にメルマガってあった?

410 :デフォルトの名無しさん:03/01/10 01:53
>>398
ここは C++ のスレなので(当然) C++ 文化が濃厚だから、
他(Java厨やC#厨のすくつ)でも聞いてみるといい。

(Java厨の所では「メソッドは final が基本って本当ですか?
C#厨の所では「sealed が基本って本当ですか?
と書けば、C++ でいう非 virtual が基本ですか?と聞いてるのとほぼ同じような意味になる)

色々な文化の人の意見を聞いて、自分で実践してみて、
自分が正しいと思ったものを選べばいいさ。

411 :デフォルトの名無しさん:03/01/10 02:00
言語仕様マンセーな連中にバカにされて終わりだろ
言語に強く依存した設計してるうちは仕方ないかもしれんけど

412 :デフォルトの名無しさん:03/01/10 02:11
JavaやC#はMethodTableのようなもので全てのメンバ関数を管理してるから、
virtualかどうかはパフォーマンスに関係ない。C++はそういうものとは違う。
非virtual関数はC関数のように直接callする。Cで理由もなく全ての関数に
関数ポインタを作って、それ経由で呼び出してるのと同じぐらい馬鹿げてる。
virtualは必要なところでだけ使うべき。

ただ、、、Cで書くほど最適化されている必要はないけど、VM上では遅すぎる。
こういうニーズってのがやっぱりあって、また設計上の柔軟性(いい加減さ)も
必要となれば、virtual多用も悪くないかもしれないとは思う。

413 :デフォルトの名無しさん:03/01/10 07:13
昨日の教訓。
暗黙のコピーコンストラクタでは、各メンバのコピーは
やっぱりコピーコンストラクタで行われる。代入(operator=())ではコピーされない。
つまり、「暗黙のコピーコンストラクタは、コピーコンストラクタしか呼ばない。」
「何だ当然じゃん」という意見もあるだろうが、バグって改めて実感。
これが昨日の教訓。

ポインタ型のメンバを持つデータ型をSTLコンテナへ突っ込む場合、
一応コンストラクタを再確認した方がよろしいですね。
「そのポインタの先は生きているか?」(藁
代入演算子は頑張ったんですけど、暗黙のコピーコンストラクタに関しては・・・片手落ちでした。
これが昨日の教訓。

414 :デフォルトの名無しさん:03/01/10 08:14
>>412
> JavaやC#はMethodTableのようなもので全てのメンバ関数を管理してるから、
> virtualかどうかはパフォーマンスに関係ない。C++はそういうものとは違う。
本気で言ってるのか?

415 :デフォルトの名無しさん:03/01/10 09:32
>>42
ん?おそらく伝わってないと思われ。
まず、普通、企業が内容証明で削除依頼を出すとき、
内容証明で名誉毀損の部分を削除しろって言うわけでしょ。
その時点で、ひろゆきは名誉毀損を知るから、削除義務が生じるって言いたいだけ。
内容証明が来る=名誉毀損でなくても削除する
とは俺は一言もいってないですよ。

416 :デフォルトの名無しさん:03/01/10 09:53
>>42
ん?おそらく伝わってないと思われ。
まず、普通、企業が内容証明で削除依頼を出すとき、
内容証明で名誉毀損の部分を削除しろって言うわけでしょ。
その時点で、ひろゆきは名誉毀損を知るから、削除義務が生じるって言いたいだけ。
内容証明が来る=名誉毀損でなくても削除する
とは俺は一言もいってないですよ。

417 :デフォルトの名無しさん:03/01/10 10:11
俺が言ってる前提が
内容証明=削除依頼になっていて、削除してほしいリストが書いてあるはず
だからおそらくかみ合ってないのだな。

内容証明が来て、名誉毀損箇所を削除してねって書いてあって、
それが名誉毀損だったら削除しなきゃダメよってことかな。

418 :デフォルトの名無しさん:03/01/10 10:46
裁判官は西村博之に自分の子供の心臓手術をさせて藪か層でないか確かめろ。

半ケツはそれからだ。

419 :デフォルトの名無しさん:03/01/10 11:27

実質的には上告はもう無理らしい。

うれしいなぁ。




420 :デフォルトの名無しさん:03/01/10 11:51
文字列 "sensor:10.00000, 20, 30, 40, 50.00000 ,60"
の各値を
配列 double sensor_data[6]
に格納できる関数とかってありますか?

421 :デフォルトの名無しさん:03/01/10 11:53
>>549
そうです・・・

422 :!:03/01/10 14:56
>>420
std::sprintf or std::istringstream
do yo?

423 :デフォルトの名無しさん:03/01/10 15:02
どよ?

424 :デフォルトの名無しさん:03/01/10 15:03
ここは排他的なボランティアですね。

425 :デフォルトの名無しさん:03/01/10 15:45
名前(アルファベット)五人分入力
         ↓
     辞書式に並び替える
         ↓
  "meido.doc"ファイルに書き込む
というプログラムを教えてください。
まじ困ってます。

426 :デフォルトの名無しさん:03/01/10 16:09
conservation!

427 :デフォルトの名無しさん:03/01/10 16:10
>>425
宿題スレいけ

428 :デフォルトの名無しさん:03/01/10 16:17
2

429 :デフォルトの名無しさん:03/01/10 16:18
マルチは放置しろ、と。

430 :デフォルトの名無しさん:03/01/10 16:33
これ解析してください。お願いします・・心から
if ( pix == NULL ) {
pix = new BYTE[dim_x*dim_y];
{BITMAPINFOHEADERinfoHeader;
int i;
if(pMapBits)delete pMapBits;
infoHeader.biSize = sizeof(BITMAPINFOHEADER);
infoHeader.biWidth = DIM_X;
infoHeader.biHeight = DIM_Y;
infoHeader.biBitCount = 8;
infoHeader.biPlanes = 1;
infoHeader.biXPelsPerMeter = 0;
infoHeader.biYPelsPerMeter = 0;
infoHeader.biClrUsed = 256;
infoHeader.biClrImportant = 0; // nColors;
infoHeader.biCompression = BI_RGB;
infoHeader.biSizeImage = DIM_X * DIM_Y;
int colorAlloc = 256 * sizeof(RGBQUAD); // size of color tables
int bitsAlloc = infoHeader.biSize + colorAlloc;//+ infoHeader.biSizeImage;
pMapBits = (LPBITMAPINFO)new BYTE[bitsAlloc];
memset(pMapBits,80,bitsAlloc*sizeof(BYTE));
pMapBits->bmiHeader = infoHeader;
LPSTR pColor = ((LPSTR)pMapBits + (WORD)(pMapBits->bmiHeader.biSize));
for (i = 0; i < 256; i++)
((WORD*)pColor)[i] = i;

431 :デフォルトの名無しさん:03/01/10 16:41
>>430
宿題スレいけ

432 :デフォルトの名無しさん:03/01/10 21:09
>412
それ以前に、virtual 関数だろうが型が明示的に決まってれば間接ジャンプに
ならんでしょ。

struct B { virtual void foo(); };
struct D : B { virtual void foo(); };

D d;
d.foo();  // これは直接ジャンプになる

virtual で間接ジャンプになるのはポインタや参照を使った場合だが、それって
同等のコードを仮想関数なしで書こうと思ったら、switch - case 使うことになる
だけ。どっちにしても必要なコストだよ。

433 :デフォルトの名無しさん:03/01/10 22:39
誰かtypeof作ってくれよ。

434 :デフォルトの名無しさん:03/01/10 22:39
質の低い書きこみを減らすのが趣旨です。

435 :デフォルトの名無しさん:03/01/10 22:47
この板、荒れなくなったね

436 :デフォルトの名無しさん:03/01/11 00:13
ZDNetは2chネタ好きだからな

437 :デフォルトの名無しさん:03/01/11 01:09
>>434
C++ Template 統合スレで目にしたような気がする。
GCC の typeof のようにはいってないけど

438 :デフォルトの名無しさん:03/01/11 01:17
>>412
いい加減さの為にvirtual多用したら、
保守が大変で再利用不可のクラスが出来るだけじゃない?

>>432
静的に使うなら、virtualにしなくても良いのでは?
virtualって、動的な使い方しないなら不要かと思うのだが。

ただ、必要なコストってのは同意。
むしろ、virtual使って動的にした方が、
コードがスッキリして保守が楽だと感じる。
ただし、設計がおかしくてvirtualの罠にハマって無い場合ね。


439 :デフォルトの名無しさん:03/01/11 01:23
> D d;
> d.foo();  // これは直接ジャンプになる
なにが直接ジャンプだ。頼むからウソ書かないでくれよ。 >>432


440 :デフォルトの名無しさん:03/01/11 01:37
コンストラクタのイニシャライザで
配列のデータメンバを初期化することはできますか?

class A{
bool flags[2];
A() : flags( { FALSE, FALSE }){}
};

を試しましたが、ダメでした。

441 :デフォルトの名無しさん:03/01/11 01:41
>>440
標準ではできない。g++の拡張使えばできるんじゃないかな。

442 :デフォルトの名無しさん:03/01/11 01:55
>>440
これじゃダメ?

class A{
bool flags[2];
A(BOOL bA, BOOL bB)
};

A::A(BOOL bA, BOOL bB){
flags[0]=bA;
flags[1]=bB;
}


A myA(FALSE,FALSE);


443 :デフォルトの名無しさん:03/01/11 01:57
>>439
g++だとテーブル経由にならないよ。
それともジャンプじゃなくてコールだって言いたかった?

444 :432:03/01/11 01:59
>>439
論より証拠やね。
void test() { D d; d.foo(); }
これを gcc でコンパイルした結果。

.globl _test__Fv
  .def  _test__Fv; .scl  2; .type 32; .endef
_test__Fv:
  subl $28,%esp
  movl $__vt$1D,(%esp)
  addl $-12,%esp
  leal 12(%esp),%eax
  pushl %eax
  call _foo__1D
  addl $16,%esp
  addl $28,%esp
  ret

vptr 介さず、直で D::foo (_foo__1D) 呼んでるでしょ。

445 :デフォルトの名無しさん:03/01/11 02:04
それって最適化の範疇に含まれるの?それとも言語仕様的に
そうするのがいいっていう暗黙の了解みたいなやつ?

446 :デフォルトの名無しさん:03/01/11 02:08
>>445
コンパイルされた後のコードの話だから言語仕様とは無関係。


447 :デフォルトの名無しさん:03/01/11 02:10
>>446
いや、そういう仕様に含まれるのかどうかの話じゃなくて
他のコンパイラもそうなってるのかっていう話

448 :デフォルトの名無しさん:03/01/11 02:17
>>447
少なくともVC++6.0は仮想関数テーブル経由しないみたいだが。

449 :デフォルトの名無しさん:03/01/11 03:01
>>447
C++にはオブジェクトの仮想テーブルを直接変更する手段は用意されていないので
普通そうなる、でいい?

450 :デフォルトの名無しさん:03/01/11 03:23
>449
いや、そういう問題では…。

444 のコード見ても分かるように D d; の時点で vtbl ($__vt$1D) はインスタンス
に書き込まれている。

一般には仮想関数は vtbl->vptr 経由で呼ばれるんだが、変数の実際の型が
ソースコードを呼んで分かる場合 (D&, D* ではなく D そのものを使ってる時)
には vtbl->vptr を介さずに直に D::func() を呼ぶ。

って話でしょ。

451 :440:03/01/11 03:25
>>441-442
ありがとうございます。素直に代入文で書こうと思います。
ちなみにg++でも無理でした。

452 :デフォルトの名無しさん:03/01/11 03:33
>>450
同じことだからもう少し考えてみそ。

453 :デフォルトの名無しさん:03/01/11 03:33
キタ━━━━━━(゚∀゚)━━━━━━!!!!! キタ━━━━━━(゚∀゚)━━━━━━!!!!!
現在ダウンロード数130000
2ちゃんねらー創作の作品
すみださつじんじけん
http://my.vector.co.jp/servlet/System.FileDownload/download/http/0/253012/pack/win95/game/avg/SUMIDA-Exe.LZH
過去ベクター1位
キタ━━━━━━(゚∀゚)━━━━━━!!!!! キタ━━━━━━(゚∀゚)━━━━━━!!!!!


454 :デフォルトの名無しさん:03/01/11 03:41
多胎がやっと理解できますたこうゆーことだったんですね

#include <cstdio>
class Juukan{public:virtual Juukan& operator=(int nani){return *this;}};
class Usi:Juukan{public:Juukan& operator=(int nani){printf("モッモォォオ〜〜\n");return *(Juukan*)this;}};
class Uma:Juukan{public:Juukan& operator=(int nani){printf("ヒッヒィィイン\n");return *(Juukan*)this;}};
class Hituji:Juukan{public:Juukan& operator=(int nani){printf("メェェェエエ〜〜\n");return *(Juukan*)this;}};
int main(){Juukan *p;
p=(Juukan*)new Usi;(*p)=1;delete(p);
p=(Juukan*)new Uma;(*p)=1;delete(p);
p=(Juukan*)new Hituji;(*p)=1;delete(p);}


455 :デフォルトの名無しさん:03/01/11 09:19
312 :ひろゆき ◆3SHRUNYAXA :03/01/10 19:59 ID:jWxHxvti
全部にいれてみた。

http://qb.2ch.net/test/read.cgi/accuse/1042131034/312

456 :デフォルトの名無しさん:03/01/11 09:20
クソスレは今から立てようと思ってるんだけど

457 :デフォルトの名無しさん:03/01/11 10:49
           ◎●●●●●◎
           ◎●ミ.|.|.|.|.|.|.|彡●◎
         ◎●ミ    口  彡●◎
         ◎●三  口 .| .|   三●◎
         ◎●彡   ノ └-.ミ●◎
          ◎●彡川.|.|.|.ミミ●◎
           ◎●●●●●◎
            __◎' ◎' ◎_
            |   友    |
            |   枝    |
            |   小    |
            |   P     |
            |   T     |
            |   A     |
           /7 ̄ ̄ ̄ ̄ ̄キヘ
          /7         キヘ
         /7           キヘ

458 :デフォルトの名無しさん:03/01/11 11:18
半島人に占領されたこの国での最後のフロンティアだったのに・・・

これで、レジスタンスの活動の場が一つ減った・・

459 :632:03/01/11 11:35
>>444
それは同一ソースにすべてを書いたときのgccの最適化の結果。

ソースの書き方や、処理系、最適化などがそのような条件を満たさないと
「これは直接ジャンプになる」なんてこと、断言できないでしょ?

>>432 ではそんなこと、どこにも書いてないじゃん。

ここは特定の処理系がどのような実装をしているかのスレじゃないわけだから、
純粋に C++ の言語仕様などに関して、初心者があらぬ誤解をしないように書かないと...。

...と、いうことが言いたいんだがな。


460 :デフォルトの名無しさん:03/01/11 11:51
struct A
{
std::stringstream _Base;
typedef std::basic_ostream< char, std::char_traits<char> > _Myt;
_Myt& operator<<(wchar_t a){}
_Myt& operator<<(unsigned short a){}
};

wchar_t と unsigned short て区別できないのかな。

数字と文字で区別したいとき困る気がするのだが...。


461 :デフォルトの名無しさん:03/01/11 12:09
>>455
> それって最適化の範疇に含まれるの?

C++のクラスってコンパイル時に静的に決定するから、例の呼び出しは
直接コールにしてもvtbl経由でも結果は同じ。つか同じにならないと変。

直接コールにすることを最適化と呼ぶかどうかは
コンパイラ実装者の気分次第。

>>459
> それは同一ソースにすべてを

すべてって?
この例ではD::foo()の実装しか追い出せないと思うが、
D d; d.foo();
は常に直接コールにすることが可能じゃないか?

> 断言できないでしょ

おそらく皆々皆様方((c)沢村)が知りたいのは、
直接コールにすることが仕様上問題ないか、であって、
必ず直接コールになるかどうか、じゃないと思う。

462 :デフォルトの名無しさん:03/01/11 12:16
          ,,-'  _,,-''"      "''- ,,_   ̄"''-,,__  ''--,,__
           ,,-''"  ,, --''"ニ_―- _  ''-,,_    ゞ    "-
          て   / ,,-",-''i|   ̄|i''-、  ヾ   {
         ("  ./   i {;;;;;;;i|    .|i;;;;;;) ,ノ    ii
     ,,       (    l, `'-i|    |i;;-'     ,,-'"   _,,-"
     "'-,,     `-,,,,-'--''::: ̄:::::::''ニ;;-==,_____ '"  _,,--''"
         ̄"''-- _-'':::::" ̄::::::::::::::::;;;;----;;;;;;;;::::`::"''::---,,_  __,,-''"
        ._,,-'ニ-''ニ--''" ̄.i| ̄   |i-----,, ̄`"''-;;::''-`-,,
      ,,-''::::二-''"     .--i|     .|i          "- ;;:::`、
    ._,-"::::/    ̄"''---  i|     |i            ヽ::::i
    .(:::::{:(i(____         i|     .|i          _,,-':/:::}
     `''-,_ヽ:::::''- ,,__,,,, _______i|      .|i--__,,----..--'''":::::ノ,,-'
       "--;;;;;;;;;;;;;;;;;""''--;;i|      .|i二;;;;;::---;;;;;;;::--''"~
               ̄ ̄"..i|       .|i
                 .i|        |i
                 i|        |i
                 .i|          .|i
 キタ━━━━━━━━━ i|   (゚∀゚)   .|i ━━━━━━━━━━!!!
                .i|           |i
               .i|      ,,-、 、  |i
               i|      ノ::::i:::トiヽ、_.|i
           _,,  i|/"ヽ/:iヽ!::::::::ノ:::::Λ::::ヽ|i__n、ト、
     ,,/^ヽ,-''":::i/::::::::/:::::|i/;;;;;;/::::;;;;ノ⌒ヽノ::::::::::::ヽ,_Λ
     ;;;;;;:::::;;;;;;;;;;:::::;;;;;;;;:::/;;;;;;:::::::::;;;;;;/;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::;;:;;;;:::ヽ

463 :デフォルトの名無しさん:03/01/11 13:03
フレンドは無理な設計変更に対応するための非常用という
認識で間違ってないですか?。今見てるソースは親クラスを
フレンドにしてたりしてわけわかめです。

464 :デフォルトの名無しさん:03/01/11 13:18
アフォにはその認識でいいのでは。

465 :デフォルトの名無しさん:03/01/11 13:20
>>463
非常用というより、必ずフレンドを使う場面はある。
+演算子の実装とか。
フレンドクラスはコンポジションを使って複数のクラスを協調動作
させ、なおかつカプセル化も維持したい場合よく使う。

466 :デフォルトの名無しさん:03/01/11 13:21
アフォでない人はどのような認識を持ってると??

467 :デフォルトの名無しさん:03/01/11 13:24
>>465
なるほど、勉強になりました。ありがとうございます。

468 :デフォルトの名無しさん:03/01/11 13:44
DMC貧相すぎ
iostream使えねえ

469 :デフォルトの名無しさん:03/01/11 15:25
>>422
さんきゅうです。
遅レスすまそ。

470 :デフォルトの名無しさん:03/01/11 15:34
2げっとさ

471 :デフォルトの名無しさん:03/01/11 15:41
半角板がおもしろい

472 :デフォルトの名無しさん:03/01/11 16:16
ぼんやりと思ったのだが、文字列をコードとして認識する機能ってC++にないのか?
ありゃ便利だと思うのだが。

473 :デフォルトの名無しさん:03/01/11 17:18
いばーる

474 :デフォルトの名無しさん:03/01/11 18:42
>いばーる
そりゃなんすか?関数?クラス?

475 :デフォルトの名無しさん:03/01/11 19:08
>>472
それは、実行ファイルにコンパイラを埋め込めといってるのか?

スクリプト系の言語だと eval() とかあるけど、コンパイラ言語だと自前で
マクロ言語を組み込むのが普通かと。yacc + lex 使えると幸せになれるぞ。

476 :デフォルトの名無しさん:03/01/11 19:23
文字列にマシン語ルーチンを入れてコールしれ。

477 :デフォルトの名無しさん:03/01/11 20:30
>476
例を

478 :デフォルトの名無しさん:03/01/11 23:36
ひろゆきの腐れチンコめ
氏ね

479 :デフォルトの名無しさん:03/01/11 23:38
まぢかよ。

480 :デフォルトの名無しさん:03/01/11 23:46
IP記録しても構いませんので、スレッドをもっと立てやすくしてください。

IPが記録されるような掲示板は匿名掲示板とはいえませんが、

スレッドが立てられないような掲示板はもはや掲示板ですらありません。


481 :デフォルトの名無しさん:03/01/11 23:47
文字列じゃないが構造体にマシン語ぶちこんでる例が見たければATLのソース。

482 :デフォルトの名無しさん:03/01/11 23:53
だいぶ昔とらわざコンピュータで「文字列のマシン語」見たいなやつがあったな。
普通にテキストファイルで開けるんだけど、実は実行形式みたいなやつ。

483 :デフォルトの名無しさん:03/01/12 01:04
>直接コールにすることが仕様上問題ないか、であって、
>必ず直接コールになるかどうか、じゃないと思う。
おっと、問題をすり替えないでくださいよ。

直接コールになるとは「断言できない」ってことを、
>>461 は自分から認めてしまいましたね。


484 :デフォルトの名無しさん:03/01/12 01:11
>>459
> ソースの書き方や、処理系、最適化などがそのような条件を満たさないと
> 「これは直接ジャンプになる」なんてこと、断言できないでしょ?
まぁ C++ の規格って、そういうもんだからな。

ただ「型が明示的に分かる場面では仮想関数でも直接コールされる」ってのは、
「inline と指定した関数はインライン展開される」のと同程度には、信用して良い
でしょ。

485 :デフォルトの名無しさん:03/01/12 01:15
>>483
おちつけ…

> 直接コールになるとは「断言できない」ってことを、
agree.

ただし、ポインタ・参照を介さずに仮想関数を呼び出す場合、呼び出す関数を
コンパイル時に確定できるってのは理論的に正しい。で、実際に最適化を有効
にしたにも関わらず、間接呼び出しにしてるコンパイラの実例が一つも挙がっ
てないのも確か。

後は「読んだ人間が自分で判断してくれ」で、良いんじゃないの?

486 :デフォルトの名無しさん:03/01/12 01:24
inline void somefunc(B* pB)
{
 pB->method();
}

foo() {
 D d;
 somefunc(&d);
}

これはどうだろう。

487 :デフォルトの名無しさん:03/01/12 01:33
>>486
君初心者だね。


488 :デフォルトの名無しさん:03/01/12 01:42
> 間接呼び出しにしてるコンパイラの実例

マイナーなC++コンパイラが列挙されるだけだと思う

489 :デフォルトの名無しさん:03/01/12 02:02
マイナーなコンパイラ一覧がみたいぞよ

490 :デフォルトの名無しさん:03/01/12 02:14
&マジでやったんかい。







俺もびびったよ。

491 :デフォルトの名無しさん:03/01/12 02:18
メルマガ転載きぼん

492 :デフォルトの名無しさん:03/01/12 02:18
>>489
UNIX WS 用のベンダ純正品とかだと、一般人は見たことない「マイナー」な
コンパイラだろうけど、最適化はしっかりしてるし…。Comeau とか Digital
Mars あたりは、ちょっとマイナーかねぇ。

ttp://www.research.att.com/~bs/compilers.html
ttp://www.parashift.com/c++-faq-lite/compiler-dependencies.html#faq-37.5

っつか ANSI C++ 規格をそれなりにでも満たすコンパイラを作るのって技術
的なハードルが高いから、その技術力を持ってしてあの程度の最適化を省
くってのは考えにくい気がする。

493 :デフォルトの名無しさん:03/01/12 09:49
結局、キラーは何もしなかったんだな、
まぁ、それでいいわけだが。


少し、ほんの少し、祭りを期待していた自分がいる(´・ω・`)

494 :デフォルトの名無しさん:03/01/12 09:51
こっちか。

他に、今、裁判中なのは何??



495 :デフォルトの名無しさん:03/01/12 11:19
ラミチンマ ワウゼゴゾ ベオ アチヨ ダ トキャエ
http://pc.2ch.net/test/read.cgi/prog/1042301604/l50

496 :デフォルトの名無しさん:03/01/12 11:33
>>483
なんだまだやってんのか、結論のみ言う。

型が静的に確定できる場合、例えば
obj.fun() (obj は参照ではないとする) とか pobj->class_name::fun() の時
仮想関数テーブルは参照されない。
あるいは virtual 非virtual を区別しないと言うべきか。
ただ単に無用であるばかりでなく、有害な場合さえある。
最適化は関係無い。

497 :デフォルトの名無しさん:03/01/12 11:43
>>496
> 仮想関数テーブルは参照されない。

されない?してはならない?するべきでない?しなくてもよい?

はっきりさせてくださいよ。

498 :デフォルトの名無しさん:03/01/12 11:50
>>497
そんなこと言う前に本を嫁よ。
言語仕様には関係ないってんだろ。コンパイラの実装にまかされてるよ。

499 :デフォルトの名無しさん:03/01/12 13:11
>>498
構ってクンを相手にするな。ほっとけ。

500 :デフォルトの名無しさん:03/01/12 13:20
pobj->class_name::fun() については規格書に
Explicit qualification with the scope operator suppresses the virtual call mechanism.
と書いてあるんだが、obj.fun() については記述を見つけられなかった。

501 :デフォルトの名無しさん:03/01/12 13:39
>>500
自明なことですね。確かにこの場合、直接コールになると「断言」できます。
でなければ、その処理系は"C++"ではありません。

しかしobj.fun()の方は直接コールになるとは「断言できない」ということで、
この件、既に結論は出ていると思います。


502 :C++厨:03/01/12 13:53
ハーブ・サッターまんせー
浜田真理まんせー

まっちくたびれたのはSO-
君がランチ忘れテレビきょときょとー
カラフルな地球眺めてもっとー
憂鬱なんて忘れてとびだそー
ASHITA!
マニアーナ

503 :デフォルトの名無しさん:03/01/12 18:35
>>501
> しかしobj.fun()の方は直接コールになるとは「断言できない」
それ以前に「直接コール」「間接コール」が使われるということさえ、
規格には書いてないけどな。

504 :デフォルトの名無しさん:03/01/12 20:42
IP取得開始前の過去ログが晒されたら、またその時点で侵害行為発生じゃん。
で、書き込み者が特定できないから云々・・となると思うが・・・。

505 :デフォルトの名無しさん:03/01/12 20:50
嘘はついていないんだろうけど…。(;^ ^


506 :デフォルトの名無しさん:03/01/12 21:04
CトランスレーターCfrontって今でもありますか?
勉強としてすごくほしいんですが

507 ::03/01/12 21:44
質問です
PC:A、B、CがあってAがB、Cから二秒おきくらいに4ビットの数字を受け取るように
したいのですが LANとUSB、シリアルとパラレルのどれを使ったほうが良いでしょうか?
ちなみに送信する側のB、Cは重い処理をやってるので早く通信が終った方がいいです。
またプログラミング初心者なので(デルファイでソケット程度の通信しかやった事が無い)
なるべく簡潔なソースで済む方が嬉しいです。
これが分かれば調べるのも捗るのでよろしくお願いします。


508 :デフォルトの名無しさん:03/01/12 21:47
UDPかTCPでパケット投げろ。
ソケット使えば簡単だろ。

509 ::03/01/12 21:53
>>508 レスありがとうございます。やってみます。

510 :デフォルトの名無しさん:03/01/12 23:30
>>506
そもそも Cfront ってフリーソフトじゃないし、UNIX System V 向けの
ものしか提供されてないと思ったが。

x86 で動いてかつ C のソースを出力する C++ front-end ってことだと
Comeau C++ Compiler かね。使ったことないけど Web Page 見る限りで
は。

http://www.comeaucomputing.com/

511 :デフォルトの名無しさん:03/01/13 00:02
#include <windows.h>#include <cstdio>
#define DATA_AXIS_NUM 2048
int main(){int x,y,z,t; BYTE **pData;
 pData=(BYTE**)new BYTE *[DATA_AXIS_NUM];
 for(y=0;y<DATA_AXIS_NUM;y++) pData[y]=(BYTE*)new BYTE[DATA_AXIS_NUM];

 for(z=y=0;y<DATA_AXIS_NUM;y++)
  {
   for(x=0;x<DATA_AXIS_NUM;x++)
   {
    if(z==0&&z!=x%256)
     t=0;
    if(223<z&&z<230)
     t=0;
    pData[y][x]=(BYTE)z++;
   }
  z=0;
 }

 for(y=0;y<DATA_AXIS_NUM;y++) delete[] pData[y];
 delete[] pData;
 return 0;
}
(BYTE)223辺りから0を返してきますが、メモリ破壊してる?
VC++.NET&WinXP

512 :デフォルトの名無しさん:03/01/13 00:32
> (BYTE)223辺りから0を返してきますが、
何を言ってるのかサッパリなのは、俺だけ?

513 :デフォルトの名無しさん:03/01/13 00:38
>>512
(BYTE)z++がz=223辺りから255位まで0を返してくるのですが
メモリ破壊のせいでつか?それとも実体の取り方がおかしいでつか?

514 :デフォルトの名無しさん:03/01/13 02:37
>>511
宿題スレに行…

515 :デフォルトの名無しさん:03/01/13 05:58
g++(3.2)を初めて触ってみてるのですが、
ひょっとして、std::wstringが使えなかったりします?

それと、setのconst_iteratorをtypedefすると、implicit typenameという警告が出ますが
これはどういう意味でしょうか。(bcc32だと素通りするコード)

516 :デフォルトの名無しさん:03/01/13 06:41
>511
tはなんのためにあるん?

517 :511:03/01/13 10:55
>>516
tは条件ブレークポイントの為でつ
宿題擦れに言ってきます

518 :デフォルトの名無しさん:03/01/13 11:31
>>515
> ひょっとして、std::wstringが使えなかったりします?
gcc スレに行ったほうがよいかも。おそらく、glibc が古くて wchar_t を扱う
関数 (wprintf とか) が未実装のため、configure 時に _GLIBCPP_USE_WCHAR_T が
undef されているんだと思う。

> setのconst_iteratorをtypedefすると、implicit typenameという警告が出ます
set<T>::const_iterator の前に typename を付ける。

519 :C++厨:03/01/13 14:24
credit card ホスィー

520 :デフォルトの名無しさん:03/01/13 14:27


521 :515:03/01/13 14:37
>>518
回答ありがとうございます。

typenameは、見事に警告が消えました。
これは、どういう時に必要なのでしょうか。

wstringはよくわからなかったので(該当しそうなのをdefineしても駄目)、
また必要になった時にgccスレで聞いてみます。

522 :デフォルトの名無しさん:03/01/13 14:50
>>521
テンプレートクラス内の識別子を、型名から探すようにコンパイラーに指令を出すのです。
↓こんなクサレコードを想像しる。
struct X
{
  struct const_iterator {};
  struct const_iterator const_iterator;
};


523 :デフォルトの名無しさん:03/01/13 15:02
>>521
gcc スレより、その OS のスレで聞いた方が良いかもしれん。

524 :デフォルトの名無しさん:03/01/13 16:07
仮想関数&純粋仮想関数のメリットとデメリットを教えて〜

525 :デフォルトの名無しさん:03/01/13 16:23
   ______________
 /:\.____\
 |: ̄\(∩´∀`) \  <先生!こんなのがありました!
 |:在  |: ̄ ̄ U ̄:|
http://freeweb2.kakiko.com/mona/

526 :デフォルトの名無しさん:03/01/13 16:23
>>524
polymorphism(ポリモーフィズム)と仮想関数でググってみな。


527 :515:03/01/13 16:35
>>522
え?え?え?
最初のが構造体で、次が変数で…
でも同じスコープで同じ名前なので識別子の多重定義エラーでは?
????

528 :デフォルトの名無しさん:03/01/13 17:11
>>527
構造体と変数の名前は、別個に管理されてる。重複しても問題ないぞ。

(試せ)

529 :山崎渉:03/01/13 18:24
(^^)

530 :デフォルトの名無しさん:03/01/13 21:17
文字列の中のある文字(たとえばABC)とかを検索して、それが見つかったら何かを返す関数とかってないですか?

531 :デフォルトの名無しさん:03/01/13 21:20
>>530
strtok()

532 :デフォルトの名無しさん:03/01/13 21:40
>>531
ありがとです。

533 :デフォルトの名無しさん:03/01/13 21:45
strchr
strstr

534 :デフォルトの名無しさん:03/01/13 22:09
ファイルのサイズを返す関数ってありますでしょうか?

535 :デフォルトの名無しさん:03/01/13 22:23
>>534
OS依存だが
unix系、MS系どちらもstat()/fstat()が使える
MS系ならio.hの_filelength()というのもある

536 :デフォルトの名無しさん:03/01/13 22:27
>>535
win98で使えるのは何か無いでしょうか?

537 :デフォルトの名無しさん:03/01/13 22:33
win98はMSの製品です

538 :デフォルトの名無しさん:03/01/13 22:42
>>536
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/vclrfIHttpFileGetFileSize.asp
って,そのまんまの関数名やん

539 :デフォルトの名無しさん:03/01/13 22:45
>>537
そうでしたか。すみません。
long _filelength( int handle );
handolって何ですか?
ターゲット ファイルのハンドルって書いてありますが、
何なのでしょう?



540 :538:03/01/13 22:45
わり,URL張り間違い
ttp://www.microsoft.com/japan/msdn/library/ja/jpfileio/html/_win32_getfilesize.asp?frame=true
鬱駄氏脳

541 :デフォルトの名無しさん:03/01/13 22:50
>>539
OSに近い、ファイルへのローレベルなアクセス用ハンドル。
unixでいう0がstdin, 1がstdout, 2がstderrってのとほぼ同じ。

FILE* fp = fopen("fairu ne-mu", "r");
int handoru = _fileno(fp);
long saizu = _filelength(handoru);

542 :デフォルトの名無しさん:03/01/13 22:56
>>541
どうでもいいがハンドルの綴りは handle で頼む。

543 :デフォルトの名無しさん:03/01/13 23:01
>>541
ありがとうございます。
後、聞きたいことが・・・。
ファイルを読み込んだときのデータへのポインタは
どうしたら得られますか?

544 :デフォルトの名無しさん:03/01/13 23:20
>>530
strpbrk()

545 :デフォルトの名無しさん:03/01/13 23:21
>>530
ゴメソ
strstr()

546 :デフォルトの名無しさん:03/01/14 00:26
現在VCで開発しています。

グローバルで
CFileControl cfc();
と宣言し、
cfc.FileOpen("ReadMe.txt");
sFRead=(char*)cfc.FileRead(4);
cfc.FileClose();
といった形でクラスのメンバ関数を使っているのですが、
error C2228: '.FileOpen' : 左側がクラス、構造体、共用体ではありません。
というエラーが出ます。
この原因はどういったことが考えられるんでしょうか?
御教授お願いします。

547 :デフォルトの名無しさん:03/01/14 00:30
>>546
CFileControl cfc(); ←このカッコをつけた事で、cfcの関数プロトタイプ宣言
だとみなされれてるんじゃない?カッコ取ったらどうでしたか?

548 :デフォルトの名無しさん:03/01/14 00:30
× CFileControl cfc();
 CFileControl クラスのインスタンスを返す cfc という名前の関数
○ CFileControl cfc();
 CFileControl クラスの変数 cfc をデフォルトコンストラクタで初期化

549 :548:03/01/14 00:30
かぶつた。。。

550 :デフォルトの名無しさん:03/01/14 00:31
>>546 ()

551 :548:03/01/14 00:31
× ○ CFileControl cfc();
○ ○ CFileControl cfc;
しかも間違えてるし、俺。。。

552 :546:03/01/14 00:31
>>547さん ありがとうございます。

その通りでした。
お騒がせしました。

553 :デフォルトの名無しさん:03/01/14 00:32
いっぱいかぶったね、釣り師ならかなりの釣り吉だね。

554 :C++厨:03/01/14 12:18
>>530
string::find(〜);

とかは

555 :デフォルトの名無しさん:03/01/14 12:50
それはメソッド。

556 :C++厨:03/01/14 12:54
Σ(´∀`lll)

そうか…
functionを聞いてたのか…

557 :デフォルトの名無しさん:03/01/14 18:08
c++でgetlineを使っているのですがどうもうまく動作してくれません。
MSDNのヘルプを調べたのですが
getline 関数は、次のどれかが起きるまで、
入力ストリームからのすべての文字を含む文字列を作成します。
- EOF (end of file)。
- 区切り記号を検出した。
- is.max_str() 個の要素を抽出した。
と書いてありました。
ここでいう区切り記号というのは何のことでしょうか?
文字列内のタブなども含まれるのでしょうか?
ご回答よろしくお願いします。

558 :デフォルトの名無しさん:03/01/14 19:53
ファイルからデータを指定のバッファに読み込むプログラムを
作ったのですが読み込まれません。
どこがおかしいのでしょうか?
よろしくお願いします。
void main()
{
FILE *fin;
int i;
fin = fopen("right.jpg","rb");
// ファイルサイズの取得
int dwSize = 0;
while (fgetc(fin) != -1)
dwSize ++;
printf("ファイルサイズ=%d\n", dwSize);
// データの格納領域の取得
char *pFileBuf = new char[dwSize];
// ファイル構造体の最初のアドレス
pFileBuf = fin->_base;
fread(pFileBuf, dwSize, 1, fin);
}



559 :デフォルトの名無しさん:03/01/14 20:19
>>558
fgetc()で全部読んでるからだよ。

560 :デフォルトの名無しさん:03/01/14 20:21
>>559
dwSize++の前ってことですか?
読み込んだ場所のところからは値が無くなるってことですか?

561 :558:03/01/14 20:39
改良したら読み込めました。
ありがとうございました

562 :デフォルトの名無しさん :03/01/14 21:06
#include< iostream.h>
main()
{ int num;
do{
while(cin>> num)
{
}
}while(cin >> num);
return0;
}

繰り返しが行われません、理由を教えていただけませんか、入門者ですレベルが低くてすいません





563 :デフォルトの名無しさん:03/01/14 21:06
>>558 void main()と書くは氏ね。int main()と書け

564 :デフォルトの名無しさん:03/01/14 21:24
>>563
まったくよー
//が書けるようになって喜んでいる自称C++使いと同レベルだな
色んなスレで馬鹿の一つ覚えを繰り返している能無しこそ早く氏ね

565 :デフォルトの名無しさん:03/01/14 21:30
つーかさ、>>563はnewを使っている点以外はCの範疇じゃん。
newをmallocに書き直してCスレに逝け。

566 :デフォルトの名無しさん:03/01/14 21:31
まちごた >>558に対するレスです。
>>563さんゴメソ。

567 :デフォルトの名無しさん:03/01/14 21:31
>>557
区切り記号とは改行コードのこと。引数で指定することもできる。

568 :デフォルトの名無しさん:03/01/14 21:40
>>562
入力に数値以外を与えてない?

569 :デフォルトの名無しさん:03/01/14 21:49
>>568
do-while文が勝手に値が入力されて終わってしまいます

570 :デフォルトの名無しさん:03/01/14 21:55
void foo(void){
int a;
}
のaに直接アクセスする方法ないですか?

571 :デフォルトの名無しさん:03/01/14 22:06
>>570
多分無理だろうな,aは実行環境に存在しないから

572 :債務不履行の名無しさん:03/01/14 22:06
>>570


573 :デフォルトの名無しさん:03/01/14 22:08
ローカル変数に外からアクセスしたいって事だろう。無理だけど。

574 :デフォルトの名無しさん:03/01/14 22:10
いや、例えば
template<typename T>struct X{
tyoedef T type;
};
template<typename T>void foo(T t){
X<T> tx;
}
となっていれば、変数を渡して型を摂れるかなと思いまして。
やっぱムリですね。

575 :デフォルトの名無しさん:03/01/14 22:14
>>574
bind1stのようなことか?

576 :デフォルトの名無しさん:03/01/14 22:18
>bind1stのようなことか?

すいません。初心者なのでわからないです。
が、もし>>574のようになっていたら、
main(){
int a;
foo(a)A=10;//あるいはtxに直にアクセスできるとしたら、tx::typeとか
}
という実行時に型を生成できるかなと思いまして。

577 :デフォルトの名無しさん:03/01/14 22:30
>>576
すると,こんなことか?
struct object
{
virtual object* create() const = 0;
};
template<typename T>struct X : object
{
virtual object* create() const
{
return new X<T>();
}
};
main()
{
X<int> a;
object* p = a.create();
X<int>* px = dynamic_cast<X<int>*>(p);
}

578 :デフォルトの名無しさん:03/01/14 23:30
この時間に見てらっしゃる方>> 562を看ていただけませんでしょうか

579 :デフォルトの名無しさん:03/01/14 23:37
>>578
「cin >> num」 は num じゃなくて cin を返すわけだ。
あとはわかるだろ?

580 :デフォルトの名無しさん:03/01/14 23:39
>>578
std::cin >> num はEOFもしくはエラーを検出したらfalseを返す。
それを念頭においておけば簡単。

581 :デフォルトの名無しさん:03/01/14 23:40
template<typename T>void typeof(T t){
typedef T TYPE;
}
このTYPEにアクセスできたら・・・

582 :デフォルトの名無しさん:03/01/14 23:42
>>562
・コンパイラは何なのかは必ず書けい。
・#include< iostream.h> よりは
  #include <iostream>
  using namespace std;
 にしておこう。
・↑と、return0; を return 0; に直したら VC++7 と bcc5.51 と gcc3.2 では
 何回数字を入力しても終わらないようにちゃんとなったが。

>>579
cin はエラーが発生してなければtrue扱いになるように
キャスト演算子が定義されてるわけだが。

583 :デフォルトの名無しさん:03/01/14 23:42
>>581
引数とTYPEに結合がなく戻りがvoidじゃ無理だろうな

584 :デフォルトの名無しさん:03/01/14 23:49
object* dup(object* org)
{
if(mona* p = dynamic_cast<mona*>(org))
{
return p->create();
}
else if(giko* p = dynamic_cast<giko*>(org))
{
return p->create();
}
else if(zonu* p = dynamic_cast<zonu*>(org))
{
return p->create();
}
else if(baya* p = dynamic_cast<baya*>(org))
{
/*
  ■■ ■■ ■ ■ ■■
  ■■ ■■ ■ ■ ■■■■■■■■
 ■■ ■■ ■■■■■■■■
■■ ■■ ■■■■■■ ■■ ■■
■■ ■■ ■■■■■■ ■■ ■■
■■ ■■ ■■ ■■
*/
return p->create();
}
else
{
return 0;
}
}

585 :デフォルトの名無しさん:03/01/14 23:56
>>578
マルチがうざいので答えもマルチしてやる。

C++のストリームは一度eofbitが立ってしまうと、明示的にクリアしてやらないと
元に戻らない。下のプログラムのようにしたらどうか。

#include <iostream>
int main()
{
int num;
do {
while (std::cin >> num)
{
}
std::cin.clear();
} while (std::cin >> num);
}

586 :579:03/01/14 23:56
>>582
漏れが何か間違った事書いたかい?
operator>> が bool を返すとか言わないよな?

587 :デフォルトの名無しさん:03/01/14 23:57
寝るぞ

588 :デフォルトの名無しさん:03/01/15 00:02
>>586
operator>>をcinの文脈で使えばcinが返るが、ブール式中で使うと
operator *() が適用されてtrueかfalseを返す。
ソース:C++標準ライブラリ、P573、§13.4.3

589 :デフォルトの名無しさん:03/01/15 00:07
スマソ。operator ()ね。
operator *()なんてのは無い。

590 :デフォルトの名無しさん:03/01/15 00:07
>>588
>>operator *()
ヴォケ

591 :デフォルトの名無しさん:03/01/15 00:07
>>585
見せて頂きました、おなじかたなのでしょうか、こちらでは見てのとおりの対応を受けております…
返答を頂、うれしかったです

592 :デフォルトの名無しさん:03/01/15 00:08
>>589
>operator ()
ヴォケ
double faultぢゃstupid!

593 :デフォルトの名無しさん:03/01/15 00:13
>>592
あの・・・・・そしたら、C++標準ライブラリP573、§13.4.3に書いてある事は
デタラメって事でしょうか?真面目に質問します。

594 :582:03/01/15 00:17
>>588
operator void* () ではなかったっけか。

>>593
その本読んだことはないが、 本当に operator() と書いてあるなら
誤植か何か。 if( cin ) ... とは書けても if( cin() ) は無理っしょ?

595 :デフォルトの名無しさん:03/01/15 00:19
>>594
あっその通りです!operator void* ()と書いてあります。
勝手に書き換えてしまってすみません。

596 :デフォルトの名無しさん:03/01/15 00:23
>>595
え?
operator bool じゃないのか?

597 :デフォルトの名無しさん:03/01/15 00:26
>>596
これは多分ストリームの変換演算子なんですね。
C++第3版で言うと、P706、§21.3.3に書いてあります。

598 :デフォルトの名無しさん:03/01/15 00:27
operator bool()は整数に変換されてしまうので、
boolの文脈のみを許可したい場合にはoperator void*()を使うことがある。

599 :デフォルトの名無しさん:03/01/15 00:30
>>593
これだ. . . 自分で確かめも考えもせずに何を撒き散らしてやがる
while(cin>> num)のどこがどんな根拠でどのようにoperator()の呼び出しになるのか書いてみろや

600 :デフォルトの名無しさん :03/01/15 00:32
f(char * x)関数を呼び出すときは
f(y)の引数yの型は何にすれば良いですか?

601 :デフォルトの名無しさん:03/01/15 00:33
>>597
実験したら、そのようだ。

けど、何でそうなってるんだ?
if() の中では operator bool が真っ先に呼ばれるのに、operator bool を実装
してない理由がわからない。

602 :601:03/01/15 00:34
>>598 を読んで納得しますた。

603 :デフォルトの名無しさん:03/01/15 00:35
>>587
だめ

604 :デフォルトの名無しさん:03/01/15 00:38
>>600
char* 型以外の何で呼びたい?

605 :デフォルトの名無しさん:03/01/15 00:38
今度こそ寝るぞ

606 :デフォルトの名無しさん:03/01/15 00:40
>>604
yをchar*型にしても、
xの値がyに反映されないのですが、どうしてでしょう?

607 :デフォルトの名無しさん:03/01/15 00:42
>>605
まだ

608 :デフォルトの名無しさん:03/01/15 00:49
"operator void*() reason"でgoogleで検索したら、たくさんヒットした。
何か的確な理由がないかどうか探している。

609 :デフォルトの名無しさん:03/01/15 00:53
>>606
引数が参照渡しではなく値渡しだから。
f(int x) に int y を渡して、y を変更できると思うか?

610 :デフォルトの名無しさん:03/01/15 00:58
>>608
http://pc3.2ch.net/test/read.cgi/tech/1037795348/491-498n
辺りが参考になるかと。

611 :デフォルトの名無しさん:03/01/15 01:03
>>610
今そのリンク読んでみました。
なるほど、void*なら、ポインタの演算ができませんから、使われる場所を
限定する効果があるのですね。
ありがとうございました。

612 :デフォルトの名無しさん:03/01/15 04:03
テンプレートの型引数で int を受け取った時に
unsigned int になるような型って取れないですか?

template <typename T> class Hoge{
 typedef unsigned T UnsignedType;
};
ではダメみたい(VC++6)なのですが。

613 :デフォルトの名無しさん:03/01/15 05:29
templete の < > が不等号の記号と間違われてコンパイルエラーが出ることがあるんだけど
どういう場合に出るんだっけ?
<>まわりの空白の有無で回避できるんだけど。

614 :デフォルトの名無しさん:03/01/15 06:08
>612

template <typename T> class Hoge{
unsigned int UnsignedType;
public:
Hoge(T x){
if(typeid(T) == typeid(int)){
UnsignedType=static_cast<unsigned int>(x);
}
}
};

こんな感じでいいんじゃない?

615 :デフォルトの名無しさん:03/01/15 06:34
template <int> class Hoge{
 typedef unsigned int UnsignedType;
};
特殊化スレ


616 :デフォルトの名無しさん:03/01/15 14:15
メモリリークを見つけるツールとかってあるのでしょうか?
Visual C++.NETを持っているのですが、そのデバッガの使い方は
まったくわかりません。
もしデバッガでできるのでしたら、その方法を教えてください。

よろしくお願いします。

617 :デフォルトの名無しさん:03/01/15 14:20
DEBUG_NEW

618 :デフォルトの名無しさん:03/01/15 14:24
BoundsChecker とか。

619 :デフォルトの名無しさん:03/01/15 14:27
C++Builder買ってCodeGuard使え!最強だぞ。

620 :デフォルトの名無しさん:03/01/15 16:53
cout.flush()ってたとえば↓のような場合、どういう役に立っているのですか?

例:
cout<<"test\n";
cout.flush();

621 :山崎渉:03/01/15 17:43
(^^)

622 :C++厨:03/01/15 19:36
>>620

streamのflushれす
MSDNでも見ればわかるよ

623 :デフォルトの名無しさん:03/01/15 20:26
>>620
バッファのフラッシュ(書き出しみたいなモン)たとえば
cout<<"test\n";
cout.flush();
BugFunc();
とあって、 BugFunc() の実行でプログラムが落ちても
test
は出力される。


624 :デフォルトの名無しさん:03/01/15 20:49
>622-623
親切丁寧な解説Thanxd
理解できました。
MSDN読んでも判んなかった物で…

625 :デフォルトの名無しさん:03/01/15 21:14
>>623
普通は '\n' がきた時点で flush されるから、
その例だと cout.flush(); あってもなくても変わらなくない?

626 :デフォルトの名無しさん:03/01/15 21:16
>>625
> '\n' がきた時点で flush される
そいつぁ初耳

627 :デフォルトの名無しさん:03/01/15 22:13
>>626
きっとstdioが下請けになってるとでも思い込んでテストもしてないんだろ

628 :デフォルトの名無しさん:03/01/15 22:31
ダイアログのピクチャーボックスに描かれた絵をウインドウを閉じたり、縮小しても消えないようにしたいです。BITMAPINFOHEADERやStretchDIBitsを使えばいいのかなとおもうのですけど、やり方がいまいちわかりません・・教えてください。
私が足したプログラムは次のだけです。
void CMy00000View::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

int x, y;

CWnd* h = GetDlgItem(IDC_FIGURE);
CRect r;
h->GetClientRect(r);
CDC* pDC=h->GetDC();
x = r.right/2;
y = r.bottom/2;
CPen p(PS_SOLID, 1, RGB(255, 255, 0));
CPen* oldp=pDC->SelectObject(&p);
pDC->MoveTo(0, y); pDC->LineTo(2*x, y);
pDC->MoveTo(x,0); pDC->LineTo(x, 2*y);
pDC->SelectObject(oldp);
h->ReleaseDC(pDC);


629 :デフォルトの名無しさん:03/01/15 22:46
マルチ
(・A・)イクナイ!

630 :デフォルトの名無しさん:03/01/15 22:46
Comeau C++ってコンパイラ使ってる人います?
C++→Cのトランスレータ機能があるっぽいんですが、実際のところ
どんな感じで出力されるんでしょうか?
もしくはほかに現在入手できるC++→Cのトランスレータってあります?

・・・ってスレ違い?

631 :デフォルトの名無しさん:03/01/16 07:01
例外や継承はどう実装するんだ?

632 :とけますか?:03/01/16 13:48
下記のコードで、標準出力に Giko の所持金が正しく表示されるように、
クラス Human を修正せよ。
クラス Giko および main() 内部を変更してはいけない。

#include <iostream>

class Human {
public:
int getMoney() { return 10000; }
};

class Giko : public Human {
public:
int getMoney() { return 10; }
};

int main() {
Human* usual = new Human();
Human* giko = new Giko();

cout << " usual : " << usual->getMoney() << endl;
cout << " giko : " << giko->getMoney() << endl;

delete usual;
delete giko;

return 0;
}

633 :デフォルトの名無しさん:03/01/16 13:57
>>632
宿題スレいけよボケ
二度と来るな。

634 :632:03/01/16 14:06
いきました。
どうもどうも。

635 :デフォルトの名無しさん:03/01/16 15:32
632ではないが

class Human {
 virtual int getMoney() ;
};

class Giko : public Human {
 int getMoney() ;
};

のようなときに派生クラスのgetMoney()はvirtualつけなくていいけど
派生クラスだけ見たときに仮想関数かわかりにくいのとコピペで書くから
virtual つけちゃうんだけど、これってよくないの? vtable とか大きく
なったりする?

636 :デフォルトの名無しさん:03/01/16 16:53
>>635
親クラスのgetMoneyがvirtualなんだから自動的にGikoのもvirtualになる。
vtableのサイズは変わらん。
お作法的にはvirtual付けるべき。


637 :635:03/01/16 17:53
>>636
どーも、
>vtableのサイズは変わらん。
パフォーマンス的には変わらないんですね?
>お作法的にはvirtual付けるべき。
これからもコピペでつけ続けます。アリガトーゴザイスマタ

638 :デフォルトの名無しさん:03/01/16 19:58
int *d = new int[size];
として
delete [] d;
とするとエラーが出てしまいます。
何が原因でしょう?



639 :デフォルトの名無しさん:03/01/16 20:19
>>638
1. 途中で、d の値が書き換わってる
2. d で確保された領域の前後が書き換えられている
のいずれかだと思われ。
おそらく、2. の方。


640 :デフォルトの名無しさん:03/01/16 23:02
char m_IdNumber[10][20];
の中に文字列を代入し、

void A(char*)のパラメータに渡すにはどうすればいいんでしょうか?
A(m_IdNumber)とするとエラーになります。
よろしくお願いします。

641 :デフォルトの名無しさん:03/01/16 23:30
>>640
A((char*)m_IdNumber);
期待した動作になるかどうかはわからんが。

642 :デフォルトの名無しさん:03/01/16 23:36
>>640
やりたいことを小一時間考えなおして、もう一度きちんと書け。

643 :デフォルトの名無しさん:03/01/17 01:46
auto_ptrをlistやmapの要素にすると、
insertでコンパイルエラーになるのですが、そういうもの?

644 :デフォルトの名無しさん:03/01/17 01:53
>>643
だからあれほどauto_ptrをコンテナの要素に使うなと……
詳しい理由はそこらじゅうに書きまくられていることなので省略。

645 :デフォルトの名無しさん:03/01/17 03:19
>>643
Effective STLの第8項を読むよろし。

646 :C++厨:03/01/17 14:41
>>640
A(m_IdNumber[0]);とかじゃなくて?


647 :デフォルトの名無しさん:03/01/17 15:18
最近暇になったので久々にC++に触ろうと思います。
が、最後に触ったのが1995〜1996あたりなので、
すっかり浦島状態です。

んで、どんな拡張がされてきたか解説してあるサイトがあったらおせーて


648 :デフォルトの名無しさん:03/01/17 22:40
とりあえずTCPLの第3版が出てるから、
それを読んでみるのがいいと思う。

649 :デフォルトの名無しさん:03/01/17 22:55
すみませんただの興味なんですが、

typename* data = new typename[3, 4];

とかすると何が起こってるんでしょうか。

650 :デフォルトの名無しさん:03/01/17 22:59
new typename[4];
と同じ


651 :デフォルトの名無しさん:03/01/17 23:02
予約語?

652 :デフォルトの名無しさん:03/01/17 23:03
カンマ演算子やね

653 :デフォルトの名無しさん:03/01/17 23:03
>>650
サンクス。
じゃあ初めの引数は何のために書けるようにしてるんですか?

654 :デフォルトの名無しさん:03/01/17 23:06
>>652
理解しました。というか変数宣言とかでも普通に使うモノでしたね。
なんか変わった所に使うと分からなくなってしまう。

655 :デフォルトの名無しさん:03/01/17 23:09
コンストラクタの初期設定子で配列の要素が初期化できないのは
C++構文の仕様のためなんですか?

656 :デフォルトの名無しさん:03/01/17 23:29
wara::wara() : morara[0](mona), morara[1](giko), morara[2](zonu)
{
}
とかなってたとして
wara::moraraのサイズをどう管理する罠??

657 :デフォルトの名無しさん:03/01/17 23:36
>>656
ちょっと分からないんですが、安全のためできないようにしているという
ことでしょうか。
int morara[3]のようにサイズ指定していても無理なんですか。
いや初心者で申し訳ないですが。

658 :デフォルトの名無しさん:03/01/17 23:40
3を2にしたり10000にしたり
お客さんの注文ってのはぐちぐち(板違いすまそ

659 :i = 10 + 20 + 30;:03/01/17 23:46
i = 10 + 20 + 30; は、一般のコンピウタでは、
(イ)、(炉) のどちらになるのでつか?

(イ) i = ( 10 + 20 ) + 30;

(炉) i = 10 + ( 20 + 30 );

660 : :03/01/17 23:49
教えてください

C++でsnprintfを自作することになりました。
参考になる資料とかありましたら教えてください。
フリーで使えるソースが何処かに落ちていると良いのですが。

661 :デフォルトの名無しさん:03/01/17 23:55
ここにもか。

662 :デフォルトの名無しさん:03/01/17 23:55
>>659
一般のコンピュウタかどうかじゃなくて、
その文を解釈するルールに依存する。

>>660
glibc

663 :デフォルトの名無しさん:03/01/17 23:56
>>660
マルチはやめれ!

664 :デフォルトの名無しさん:03/01/18 00:02
>>655
結論から言うと無い。が、漏れも欲しい。
Hoge::Hoge():m_array({1, 2, 3}){ }
って書けたら便利なのに。

665 :デフォルトの名無しさん:03/01/18 01:15
>>659
ここはC++スレであるからその文がC++であると仮定すると、必ず (イ)になる。

>>664
同意。C99には (int[]){1,2,3} みたいに配列リテラルを作れる機能が
ついたのでいずれC++にも流れてくると思うけど、より一層文法が
酷いことになりそうなのが少し怖い。

666 :デフォルトの名無しさん:03/01/18 01:18
C99ってあいまいなところを整えた反面、
妙な文法を変に導入されてるのが怖いよ・・・
つかgcc3がc99をデフォにしてるのってどうなのかなあ

667 :デフォルトの名無しさん:03/01/18 01:50
例外処理を最近触り始めたのですが、
アセンブラコードを吐かせたらとても悲しいコードになってました。
こういうものなのでしょうか。

668 :デフォルトの名無しさん:03/01/18 02:04
>>667
処理系によって異なる。

669 :デフォルトの名無しさん:03/01/18 02:36
ものすごく簡単なのかもしれませんが
コンソール出力で小数を出力する場合に、
特定の桁で四捨五入して出力させることはできませんか?
d = 0.12345 とあったとして、coutで
0.123と表示したいのですが。

670 :デフォルトの名無しさん:03/01/18 02:52
表示する小数点以下の桁数をしてやればよいです

671 :デフォルトの名無しさん:03/01/18 02:56
std::cout.precision(3);
って感じに。たぶん。

672 :デフォルトの名無しさん :03/01/18 02:59
LPCTSTR str[] = {"aaa","bbb"};
この配列の要素の数を返す関数を教えて下さい。
この場合だと、1か2を返す関数です。

673 :デフォルトの名無しさん:03/01/18 03:00
>>672
関数でなくても
sizeof(str) / sizeof(str[0]); でいいのでは。

674 :デフォルトの名無しさん:03/01/18 03:02
あ、だめかもしれん。スマソ。

675 :デフォルトの名無しさん:03/01/18 03:08
LPCTSTRってのがchar*のtypedefなら、
sizeof(str) / sizeof(str[0]); で行けるよ。

676 :デフォルトの名無しさん:03/01/18 03:16
できました。
sizeof(str) / sizeof(str[0]); で、要素の数の2が得られました。
しかし、理由が分かりません。
解説キボンヌ。

677 :デフォルトの名無しさん:03/01/18 03:22
あ、わかりまそた。ありまん。

678 :デフォルトの名無しさん:03/01/18 03:23
>>676
(1).sizeof(str)で、str[]全体のサイズがわかる。
(2).sizeof(str[0])で、str[]の要素一個当たりのサイズがわかる。
(1)を(2)で割れば、str[]の中にある要素の個数が求まる。

679 :デフォルトの名無しさん:03/01/18 03:32
#define ELEMOF(array) (sizeof (array) / sizeof *(array))
とかすると便利でつ。

全体のサイズを各要素のサイズで割れば要素数が得られるというわけです。

ELEMOF にポインタを入れると破綻することに注意。

680 :デフォルトの名無しさん:03/01/18 03:35
>>674が気になる。
Unicodeとかでも関係ないよね?

681 :デフォルトの名無しさん:03/01/18 03:41
>>680
関係ないというか、ポインタの配列なんで完全に無関係。

でも、もちろん文字列バッファの長さを返すこともできるわけで、
その場合 MBCS でも Unicode でもちゃんと要素数を返してくれる。
だから、TCHAR buf[128]; とか使ってるときに
sizeof buf とかで要素数を得ようとしちゃダメなのね。

682 :デフォルトの名無しさん:03/01/18 03:44
>>680
だめな事はあるのだろうか?
例えばchar str[][5] = {"abc", "defg"}; のような場合でも、
sizeof(str) / sizeof(str[0])) で行けるはずだ。

683 :デフォルトの名無しさん:03/01/18 04:01
きめうちで良いじゃん。それが嫌ならCなんかやめれ。

684 :デフォルトの名無しさん:03/01/18 04:06
>>683
マジックナンバー厨は(・∀・)カエレ!!

685 :デフォルトの名無しさん:03/01/18 04:39
しかたないじゃん。Cがヘボいんだから。

686 :デフォルトの名無しさん:03/01/18 04:40
#define ARGOF(s) (sizeof(s)/sizeof(*(s)))
俺は↑だけど、
struct {
char buf[256] ;
int i[5] ;
} TEST, test[10] ;
ARGOF(test);
ARGOF(test[0].buf); /* ARGOF(test->buf) */
ARGOF(test[0].i); / *ARGOF(test->i) */
でも、ちゃんと配列の数を取れるYO!

687 :デフォルトの名無しさん:03/01/18 04:53
>>682 ポインタじゃなくてもそうやるんだね。
今コンパイルしてそれで出来ました。ありまん。

688 :デフォルトの名無しさん:03/01/18 08:44
int sw;
scanf("%d\n",&sw);
printf("読み込み完了\n");
というコードなのに2回数字を読み込まないと
”読み込み完了”が表示されません。
なぜなんでしょう?

689 :デフォルトの名無しさん:03/01/18 09:22
fflush(stdout);をprintfの後にいれてみて

690 :638:03/01/18 09:26
>>639
確保された領域と前後に関係ありますか?
どういうこと?

691 :デフォルトの名無しさん:03/01/18 09:32
通常、new/mallocで確保される領域は
返されるポインタの直前に、サイズと次の領域へのポインタを持っている(実装依存)。
ここが壊れるとdelete/freeが異常終了する。

692 :デフォルトの名無しさん:03/01/18 09:34
>>690
639じゃないが
メモリ領域を確保するとき、メモリ領域の前後に
管理用のデータを入れている処理系もある
これが壊れると管理もぐちゃぐちゃになってエラーがおきる場合もあるだろう
たとえば
[アロケートサイズ][アロケート領域] を確保して、new が アロケート領域を
返すとき[アロケートサイズ]が狂えばどうなるか…ということ

639じゃないから違うかもしれないが

693 :デフォルトの名無しさん:03/01/18 09:41
>>688
scanf("%d\n", &sw)の\nは"入力ストリーム中の次の空白でない文字とマッチ
するもの"なのです。従って、"2回数字を読み込まないと"ではなく、"1回
数字を読み込み、空白でない文字と\nをマッチさせる"ということになりま
す。わかりましたか?


694 :638:03/01/18 09:41
>>691,692
なるほど。
でも692で言うところのアロケート領域(よく分からないけど・・・)
の破壊を防ぐ方法ってあるんですか?

695 :638:03/01/18 09:47
>>694
アロケート領域のところはアロケートサイズの間違いでした。


696 :デフォルトの名無しさん:03/01/18 09:54
>>694
コードをちゃんと書くこと
int *d = new int[size];
d++; // ←こういうの!
delete [] d;
のようなタココードにならないように

697 :638:03/01/18 10:05
>>696
d++はないようで、
何が原因なのか分かりません。
他に可能性としてどういうのがありますか?

698 :デフォルトの名無しさん:03/01/18 10:18
>>679
どこで見たか忘れたけど、配列だけに適用される (つまりポインタに
適用するとエラーになる) サイズ取得関数
template<class T, int N>
inline int ARRAY_SIZE( T (&)[N] )
{
return N;
}
ただし、VC++ では使えない。

699 :デフォルトの名無しさん:03/01/18 10:23
>>697
dより前(後)にmalloc/newされたメモリ領域へのアクセスでのバッファオーバーラン。
誤ったポインタ演算。


700 :デフォルトの名無しさん:03/01/18 11:11
>>697
int *d = new int[size];
int giko[1];
giko[1]=0; // ←こういうのは?
delete [] d;

701 :デフォルトの名無しさん:03/01/18 11:27
>>700
それと似たようなことに一度遭遇したことがあるよ
自分書いたコードが原因じゃなかったから死ぬほど焦った

702 :C++厨:03/01/18 15:20
おい、皆さん
例外安全をどう思われますか?

703 :デフォルトの名無しさん:03/01/18 15:27
>>702
重要と思われます。

704 :669:03/01/18 16:00
>>670 671 さんありがとうございます。
その応用で出力先をファイルにしたいと思い
ofstream fout
でファイルに書き込もうとしたのですが桁数がどうしてもしていできません。
ソースは

string a;
double d;
string g;

fout << a;
fout.precision(3);
fout << d;
fout << g << endl;
という感じで書いています。
つまり一行にstringと桁数指定したdoubleを書き込みたいのです。
このまま実行すると書き込みはしてくれるのですが桁数が指定できません。
どこがちがうのでしょうか?よろしくお願いします。


705 :デフォルトの名無しさん:03/01/18 16:27
>>704
<iomanip> ヘッダファイルと setw と setprecision を調べてみれ。

706 :デフォルトの名無しさん:03/01/18 16:53
int *pp
と、ポインタの宣言をしてその後値を代入すると
値が割り当てられていないローカルな変数 'pp' に対して参照が行われました。
とエラーが出てしまうのはなぜ?

707 :デフォルトの名無しさん:03/01/18 16:54
template<typename T> struct C1 {
  void operator = (T) { }
};

template<typename T> struct C2: public C1<const T *>{
  // wow!
  // void operator = (const T * a) {
  //   C1<const T *>::operator = (a);
  // }
};

int main(int ac, const char *av[]) {
  C2<char> c;
  c = "foo"; // <-!!??
  return 0;
}

C2::operator = () を定義してやらないと "!!??" の部分で
コンパイルエラーになるのが悔しくて悔しくてアタシ夜も眠れません。
エラーメッセージはこんな感じ ( g++ 3.2 )

> no match for `C2<char>& = const char[4]' operator

g++ も VC++ も同様なのでコンパイラのバグじゃないと思うんだけど
これはれっきとした仕様でしょうか?

708 :デフォルトの名無しさん:03/01/18 16:59
>>706
int *pp;
*pp = 2;

とかやってませんか? pp は「数値の入れ物のありか」を指すだけで
実際にはどこにも「入れ物」は存在していません。

int i; // <- 数値の入れ物
int *pp; // <- 入れ物のありかを示すもの
pp = &i; // <- ありかを示す
*pp = 2; // <- ok.

709 :デフォルトの名無しさん:03/01/18 17:20
>>707
仕様だな。

http://www.kuzbass.ru/docs/isocpp/over.html#over.ass
> Because a copy assignment operator operator= is implicitly declared for a class if not declared by the user,
> a base class assignment operator is always hidden by the copy assignment operator of the derived class.

710 :709:03/01/18 17:24
>>707
template<typename T> struct C2: public C1<const T *>{
  using C1<const T *>::operator =;
};

定義しなくてもusing宣言でいける。
これで眠れるか?

711 :709:03/01/18 17:28
アァ、
using したら、

struct B { void operator = ( int ); };
struct D : B { using B::operator =; };
void f()
{
  D d;
  B b;
  d = b;
}

これが通っちまう。
定義するしかないやも知れぬ。

712 :デフォルトの名無しさん:03/01/18 17:41
error LNK2001: 外部シンボル ""int __cdecl LeastSquare_GA
(double *,unsigned int *,unsigned int *,unsigned int *,unsigned int *,int)"
(?LeastSquare_GA@@YAHPANPAI111H@Z)" は未解決です
というエラーはどうすればよいですか?
何が未解決なのでしょうか?

713 :デフォルトの名無しさん:03/01/18 17:52
>>712
LeastSquare_GA とかいう名前の関数のありかが未解決。

宣言だけ書いて定義を書き忘れてるとか、定義を書いたファイルを
コンパイルし忘れてるとか、定義の入ったライブラリをリンクし忘れてるとか、
だろう。


714 :デフォルトの名無しさん:03/01/18 17:58
>>709-711
サンクスコヽ(´ー`)ノサンクスコ
今日はいい夢が観られそうです。

715 :デフォルトの名無しさん:03/01/18 18:09
・コンストラクタ
・デストラクタ
・代入演算子関数
・friend属性
は継承されません。

716 :デフォルトの名無しさん:03/01/18 18:24
>>713
コンパイルもしてるし、
extern宣言もしてるのにダメです。
他に何が原因なのでしょう?

717 :デフォルトの名無しさん:03/01/18 18:41
>>716
extern C とかかな。

その関数は自分が作ったもの?

718 :709:03/01/18 19:33
>>715
継承の問題じゃなくて、派生クラスで暗黙に定義される operator= が
基底クラスのやつを隠してしまうという話。

719 :718:03/01/18 19:34
スマソ。718 は 709 じゃない。「709じゃないが…」と入力しようとして
手がすべった (w

720 :デフォルトの名無しさん:03/01/18 20:21
>>718
なるほどそういう事か。
物の本には、デフォルトの代入演算子が基本クラスの代入演算子を「隠す」
という表現の代わりに、「継承されない」という表現を使っているが、同じ意味
なのだな。

721 :デフォルトの名無しさん:03/01/18 20:51
operator=をvirtualにする意味ってありますか?

722 :デフォルトの名無しさん:03/01/18 23:13
mem_funの存在理由がマジわからん。
なんでこんなものが必要なんだ?

723 :デフォルトの名無しさん:03/01/18 23:17
最初の目的は、メンバ関数の呼び出しをカプセル化して、
リストのforeachに適用するためのもんだと思った。

724 :デフォルトの名無しさん:03/01/18 23:29
>>722
仮想関数をアルゴリズムに渡す時にないとマズイ。

725 :デフォルトの名無しさん:03/01/18 23:33
>>721
あまりない。どうせ=演算子は継承されないから、再定義が必要だし。

726 :デフォルトの名無しさん:03/01/18 23:34
>>722
class Timer {
 vector<EventHandler*> handlers;
 void on_timer() {
  std::for_each( handlers.begin(), handlers.end(), mem_fun(&EventHander::fire) );
 }
};

とかなんとか。

727 :デフォルトの名無しさん:03/01/19 00:40
>>724
あと関数オブジェクトにしておかないと、not1 みたいな関数アダプタが
使えんし。

728 :デフォルトの名無しさん:03/01/19 13:40
質問でーす。
テンプレートクラス A があって、
unsigned char と signed char で特殊化している時に
A<char> と書いたら unsigned char 版にも signed char 版にもならずに
特殊化していない方で展開されるのは仕様でしょうか?

729 :デフォルトの名無しさん:03/01/19 13:46
仕様

730 :デフォルトの名無しさん:03/01/19 13:47
>>728
仕様だと思うよ。ちなみに配列にした場合その要素数が異なると
異なる型とみなされます。これは関数オーバーロード(このときは
char*とみなされる)とは違ってくるので注意が必要かも。
って俺だけか。。

731 :729:03/01/19 13:49
理由:char, signed char, unsigned char はそれぞれ別の型だから

732 :デフォルトの名無しさん:03/01/19 13:49
signed char と unsigned char と char は別の型ということですかね?

733 :C++厨:03/01/19 13:54
>>722
Effective STLにmem_fun, mem_fun_refの使い方が載ってますよ

# 余談ですがこの本(ESTL)を読んでいる時は日曜洋画劇場でファントムという
# よくわからない映画をやっている時でした。

734 :728:03/01/19 14:14
>>729, 730
char は別の型なんですね…知らなかった。
てっきり signed char か unsigned char の別名だと思ってました。
(どっちの別名なのかが環境依存なだけだと思ってました。)

別の型ならどっちにもかからないのが正常ですね。I Understood.
ありがとうございました。

735 :デフォルトの名無しさん:03/01/19 14:17
mem_fnはもうboostのを標準にしてもいいんじゃないかな

736 :デフォルトの名無しさん:03/01/19 22:30
モスバーガーでやってる
tea plus plus(お茶にもう一品)
はC++のもじりなのではないかと小一時間…(略

ガイシュツだったらスマソ

737 :デフォルトの名無しさん:03/01/20 00:17
昔のライブラリを引っ張り出して使おうとしたら新しいコンパイラになってて(borland の5.5)
さっぱりわかならい。

basic_ostreamなんちゃらってなんなんだ……例をコピペしてもうまくいかないし。
<<のオーバーロードって、テンプレートつかってるときは駄目なんでつか?

738 :デフォルトの名無しさん:03/01/20 02:47
>>734
> てっきり signed char か unsigned char の別名だと思ってました。

C++ でなくて C ならば、その認識で合ってるよ。

739 :デフォルトの名無しさん:03/01/20 03:29
え?

740 :デフォルトの名無しさん:03/01/20 14:29
憂鬱本のC++コードってかなり糞だよな?

741 :デフォルトの名無しさん:03/01/20 18:30
デバッグ用にcout使ってDOS窓に文字列出力してるんだけど、
文字の色を変えることって出来ないの?

環境によって違う??
VC6です。

742 :C++厨:03/01/20 18:45
#include <conio.h>
textcolor(YELLOW);
cprintf("まんこ\r\n");

前bccで遊んだときはこうですた

743 :デフォルトの名無しさん:03/01/20 19:07
>>740
あれはC++の本ではないので深く考えてはいけません。

744 :デフォルトの名無しさん:03/01/20 20:31
//---------------------------------------------------------------------------

#include <conio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
textcolor(YELLOW);
cprintf("YELLOW\r\n");
return 0;
}
//---------------------------------------------------------------------------


745 :741:03/01/21 10:34
それはネットで検索してすぐみつかったからやったんだけど
textcolorが宣言されてないって言われるよ。
conio.hの中もみたけど無かった。

コンパイラは何ですか?>>744


746 :デフォルトの名無しさん:03/01/21 10:54
ifstream input(INPUTFILE);
input >> fftData.in[i];

みたいな感じで、標準入出力してるソースがあるんですけど、
inてのはメソッドでしょうか演算子でしょうか。
受けてるメソッドが見あたらないんですが、
クラスに対して標準入力されたときの動作を教えて下さい。

747 :デフォルトの名無しさん:03/01/21 11:18
fftData オブジェクトのクラスの定義を見なさい。

748 :デフォルトの名無しさん:03/01/21 11:29
>>746
なんか勘違いしてる気がする

749 :デフォルトの名無しさん:03/01/21 11:47
in[] ならともかく、in がメソッドではないのは明らかだろう。

750 :デフォルトの名無しさん:03/01/21 14:18
>>746
fftDataの中身は知らんが、
in[]はfftDataのクラスなり構造体なりのメンバ変数。
メソッドなら()とかつくし、少なくともそんな名前の演算子は俺は知らん。
あと、標準入力じゃなくて入力ファイルストリームからの入力。

751 :デフォルトの名無しさん:03/01/21 14:37
inがなにがしかのコンパイラ拡張のプロパティという可能性はありうるな。
この場合のinの実体はメソッドだ。

752 :デフォルトの名無しさん:03/01/21 14:50
struct {
 class {
  int data[10];
  public:
  int& operator [](int n) {
   if (n < 0 || (sizeof(data)/sizeof(data[0])) <= n) {
    throw なんちゃら_error();
   }
   return data[n];
  }
 } in;
} fftData;

753 :746:03/01/21 15:01
thanx>>752
でも、operatorの文字は無いみたい。

http://sourceforge.net/project/showfiles.php?group_id=51043&release_id=134725
から拾いますた。


754 :デフォルトの名無しさん:03/01/21 18:24
fftDataは、inていう実数の配列を持っとるわけだが。

755 :746:03/01/21 18:48
>>754
あ、本当ですね。有難うございました。

なんか、inという名前と標準入力で混乱してました。

756 :デフォルトの名無しさん:03/01/21 20:27
今さ、ふっと
「テンプレート使えば Power(べき乗)をコンパイル時に計算できるなぁ」と
思ったんだけど、なんかうまくいかない。

考えがうまくまとまってないんだけど、だれかアドバイスくんない?
以下、書きかけのコードね。
template <typename T, int X, int Y>
struct Power
{
public: enum
{
Value = Power<T, X, Y - 1>::Value * X;
};
};

template <typename T, int X>
struct Power<1>
{
public: enum
{
Value = X;
};
};
よろしくおながいします。

757 :デフォルトの名無しさん:03/01/21 20:43
>>756

template <int N>
struct Power {
enum { Value = Power<N - 1>::Value * N };
};

template <>
struct Power<1> {
enum { Value = 1 };
};

int main()
{
Power<10> p;

std::cout << p.Value << std::endl;
}

758 :デフォルトの名無しさん:03/01/21 21:01
前VCで再帰テンプレートやったら
あきまへんでー言うエラー吐かれた気が。
C++の規格ではどうなってるんでしょ?

759 :C++厨:03/01/21 21:25
>あきまへんで

(*゚∀゚)=3
大阪まだ〜?

760 :デフォルトの名無しさん:03/01/21 21:46
>>756
ちょっと前にいろいろ作ったなぁ・・・。
最大公約数、最小公倍数、フィボナッチ数、log、順列、組合せ、etc. ...
もっと応用範囲はありそうだけど、ここよりはtemplate統合スレ向きの話題かも。

>>757
インスタンスつくらなくても、
std::cout << Power<10>::Value << std::endl;
でいける。

761 :756:03/01/21 21:53
>>757
引数減ってるじゃん?っていうか、それは何を求めてるんですか?


762 :デフォルトの名無しさん:03/01/21 21:55
>>757
はべき乗ではなくて階乗を求めていると思われ。

763 :デフォルトの名無しさん:03/01/21 21:58
ワロタ

764 :デフォルトの名無しさん:03/01/21 22:00
べき乗ならこうでは?

template <int A, int N>
struct Power {
enum { Value = Power<A, N - 1>::Value * A };
};

template <int A>
struct Power <A, 1>{
enum { Value = A };
};

int main()
{
std::cout << Power<5, 3>::Value << std::endl;
}

765 :デフォルトの名無しさん:03/01/21 22:06
ちなみにこういうのはコンパイルが通らない。

template <typename T, T A, int N>
struct Power {
enum T { Value = Power<T, A, N - 1>::Value * A };
};

template <typename T, T A>
struct Power <T, A, 1>{
enum T { Value = A };
};

int main()
{
std::cout << Power<double, 5, 3>::Value << std::endl;
}

766 :デフォルトの名無しさん:03/01/21 22:13
>>765
enum T ってのは何か意味あんの?タグ名?

767 :デフォルトの名無しさん:03/01/21 22:15
どちらにしてもenumはdouble型にはならんわな。

768 :デフォルトの名無しさん:03/01/22 03:51
>>760
うぷキボソヌ

769 :デフォルトの名無しさん:03/01/22 14:58
情報系の人間ではないんですが、ソフトの改良をすることになり困っております。
処理した画像を連番で指定したフォルダに保存するようにしたいのです。
どのように考えればいいかだけでもご指導お願いします。

770 :デフォルトの名無しさん:03/01/22 15:31
>>769
画像を処理する→連番で指定したフォルダに保存

ってかんじでOKかい?

771 :C++厨:03/01/22 15:35
for (uint i = 1; i < 10; ++i) {
&nsp;ostringstream os;
&nsp;os<<"hikky"<<i<<".jpg";
&nsp;ofstream fo(os.str().c_str(), std::ios::binary | std::ios::out);
&nsp;//君のofstreamに入りたいハァハァ...
}

みたいなのはどうでしょうか?

772 :C++厨:03/01/22 15:37
ナンカチガウ(-_-)

773 :760:03/01/22 15:48
>>768
>>760
> うぷキボソヌ
家帰らんとコヲド持ってこれん。
明日まで待ってくれ。

774 :デフォルトの名無しさん:03/01/22 15:52
>>771
&nbsp;

775 :デフォルトの名無しさん:03/01/22 16:07
例えば最大公約数なら

#include <iostream>

template <int M, int N>
struct GCD {
enum { Value = GCD<N, M % N>::Value };
};

template <int M>
struct GCD<M, 0> {
enum { Value = M };
};

int main()
{
std::cout << GCD<121, 77>::Value << std::endl;
}

776 :デフォルトの名無しさん:03/01/22 16:09
最大公約数を利用して最小公倍数を求める:

template <int M, int N>
struct LCM {
enum { Value = M * N / GCD<M, N>::Value };
}

777 :デフォルトの名無しさん:03/01/22 16:13
フィボナッチ数を求める:

#include <iostream>

template <int M>
struct Fibonacci {
enum { Value = Fibonacci<M - 2>::Value + Fibonacci<M - 1>::Value };
};

template <>
struct Fibonacci<0> {
enum { Value = 1 };
};

template <>
struct Fibonacci<1> {
enum { Value = 1 };
};

int main()
{
std::cout << Fibonacci<8>::Value << std::endl;
}

778 :デフォルトの名無しさん:03/01/22 16:15
順列とか組み合わせはどういう考え方で行くのかな・・・・・

779 :デフォルトの名無しさん:03/01/22 16:16
スマソ。フィボナッチ数を若干修正。

template <>
struct Fibonacci<1> {
enum { Value = 1 };
};

template <>
struct Fibonacci<2> {
enum { Value = 1 };
};

780 :デフォルトの名無しさん:03/01/22 16:25
アッカーマン関数

#include <iostream>

template <int M, int N>
struct Ackermann {
enum { Value = Ackermann<M - 1, Ackermann<M, N - 1>::Value>::Value };
};

template <int N>
struct Ackermann <0, N> {
enum { Value = N + 1 };
};

template <int M>
struct Ackermann <M, 0> {
enum { Value = Ackermann<M - 1, 1>::Value };
};

int main()
{
std::cout << Ackermann<3, 4>::Value << std::endl;
}

781 :デフォルトの名無しさん:03/01/22 16:30
こういうテンプレートプログラムを書いていると、感覚的にはPrologで
書くのとよく似ていると思うのは俺だけか?

782 :デフォルトの名無しさん:03/01/22 16:41
>>781
漏れは関数型言語(Haskellとか)で書いてるような気がしてくる。

783 :デフォルトの名無しさん:03/01/22 16:56
・・・と思ったら他の方がいろいろ書いてくれてますね。

>>778
残るは順列と組合せだけ。記憶を頼りに書いてみます。

#include <iostream>

// 順列
template<int M, int N> struct P {
  enum{ value = M * P<M - 1, N - 1>::value };
};

template<int M> struct P<M, 0> {
  enum{ value = 1 };
};

// 組合せ
template<int M, int N> struct C {
  enum{ value = C<M - 1, N>::value + C<M - 1, N - 1>::value };
};

template<int M> struct C<M, 0> {
  enum{ value = 1 };
};

template<int M> struct C<M, M> {
  enum{ value = 1 };
};

int main() {
  std::cout << P<5, 3>::value << ", " << C<5, 3>::value << std::endl;
}

784 :760:03/01/22 16:59
スマソ>>783>>760です。
上のコードはg++ 3.2で通ることを確認・

785 :デフォルトの名無しさん:03/01/22 17:03
>>783>>784
ああなるほど、順列と組み合わせは、順列の数とnPr組み合わせの数nCrを
求めるだけなのか。
どうやって(1,2,3)のような表現をするのかと悩んでいますた。

786 :デフォルトの名無しさん:03/01/22 19:31
標準入出力が無いOSで、コンパイル通すためにダミークラス作ろうと思います。
std::cerr
みたいなのはネームスペースstdにcerrという変数かメソッド(どっち?)用意するとして、
std::cerr<<"realFF
みたいな標準入力受けたり出来ますか?

787 :ブラシさん:03/01/22 19:53
実行と終了を繰り返すと、OSがフリーズします。怪しい部分を書きます。
このソースでのブラシの使い方で問題点があったら指摘してください。

 case WM_RBUTTONDOWN:

  hDC = GetDC(hWnd);

  hBrush = CreateSolidBrush(255);
  rect.left = 10;
  rect.top = 10;
  FillRect(hDC, &rect, hBrush);
  DeleteObject(hBrush);

  hBrush = CreateSolidBrush(128);
  rect.left = 20;
  rect.top = 20;
  FillRect(hDC, &rect, hBrush);
  DeleteObject(hBrush);

  ReleaseDC(hWnd, hDC);

 break;

788 :デフォルトの名無しさん:03/01/22 20:53
>>787
ここじゃないと思うが・・

789 :誘導するのも面倒なので:03/01/22 20:59
>>787
rect.right と rect.bottom は初期化してますか?

790 :デフォルトの名無しさん:03/01/22 21:03
loki の SmallObject を試してみたら
標準のアロケータより遅い。圧倒的に遅い。

みんなのところは本当に早くなってる?
ちなみに VC6Std と BCC5.5 と gcc-2.91.57 で試したが
全部標準のアロケータの倍近く時間がかかってるみたい。

791 :790:03/01/22 21:04
ちなみに ThreadingModell は外した状態ね。
シングルスレッド同士のガチンコ対決だけど遅いのです。

792 :デフォルトの名無しさん:03/01/22 21:21
そりゃシングルスレッドだったら標準のが一番はやかろーもん

793 :デフォルトの名無しさん:03/01/22 21:26
>>792
malloc(), free() と比較すると、そうとも言えんよ。STL のアロケータだと、最初から
かなりキッチリ最適化されてるヤツが多いけど。

>>791
比較環境が良く分からん…

794 :デフォルトの名無しさん:03/01/22 22:21
C++始めたばかりなんですがクラスがいまいち理解できません。
クラスを詳しく説明してるサイトはありますでしょうか?

795 :デフォルトの名無しさん:03/01/22 22:25
ここにあるような、高度なテンプレートの使い方を解説しているサイトはありますか?

796 :デフォルトの名無しさん:03/01/22 22:26
>>794
http://www.em-sphere.com/rule/class.htm

797 :794:03/01/22 22:29
>>796
RPG系はあまり好きじゃないんで、すいません

798 :デフォルトの名無しさん:03/01/22 23:00
>>795
そんなに高度でもないと思うけど・・・・・
こちらの方が高度かも

http://pc3.2ch.net/test/read.cgi/tech/1037795348/l50

799 :デフォルトの名無しさん:03/01/22 23:48
>>796
なんでやねん ( ´∀)fつ

800 :デフォルトの名無しさん:03/01/22 23:52
>>795
金を払って書籍「Generic Programming」と「Modern C++ Design」でも読むのが近道。


801 :デフォルトの名無しさん:03/01/22 23:57
>>800
ありがとう。

802 :ブラシさん:03/01/23 00:43
>>788,789
書いてなかった rect.right と rect.bottom はまともな数字が入っています。
別の部分でのバグのようなので、他を探してみます。
ありがとうございました。
SelectObjectが必要と言われるかもしれないと思っていました。

803 :769:03/01/23 00:45
>770
現在のプログラムでは、撮影して画像処理した後に自分で名前を付けてBMP形式で保存するようになっています。
それを何とか連番で自動保存したいのです。

804 :デフォルトの名無しさん:03/01/23 00:57
throwがある関数は必ずtry{}でくくらないと駄目なんでしょうか?
例外を捕捉しなくても良いときもあるのですが、
今はそんなときにもtry,catchをしてます。
これは無駄なような気がしているのですが…

805 :デフォルトの名無しさん:03/01/23 00:59
>>804
補足しなくても良いときがあるならくくらなくて良いでしょ

806 :756:03/01/23 01:04
みんなありがとん。
<ストライク>パクらせて</ストライク>参考にさせてもらいました。

807 :ブラシさん:03/01/23 01:10
オーバーフローの問題。
型を超える数字計算は、計算の途中で型を超えても、
型に納まる範囲内の結果は正常に得ることができるのか

例えば、クリックするたびに、3の累乗の1の位の値を
表示するというプログラム。
3, 9, 7, 1 ............

static BYTE byte = 3;
char buf[10];

 case WM_LBUTTONDOWN:
  wsprintf(buf, "%u", byte);
  MessageBox(NULL, buf, "", MB_OK);
  byte*=7;
  break;

これは byte が255を越えてからも正しい結果を得られるんでしょうか?

808 :804:03/01/23 01:11
>>805
そうすると、プログラムは終了してしまいますよね?
…私のthrowの使い方間違ってるのかな…?

例えば、
mallocでメモリ確保失敗してもNULLが返るだけですが、
newだと例外が発生するのでtry,catchしないと終了してしまうのではないかなあ、と。

809 :デフォルトの名無しさん:03/01/23 01:17
>>808
その通りです。
例外が発生してcatchしないとunexpected()が呼び出されて
異常終了します。

810 :デフォルトの名無しさん:03/01/23 01:17
>>808
間違ってない。
ってゆーかどういう動作を期待してるわけ?
newの失敗を無視してどうやってプログラムを続けることができるだろうか?
アクセス違反で即アボンじゃん

811 :768:03/01/23 01:28
>>760をぉ、色々サンクスコ。家帰ってまた何かあったらヨロシコ。

812 :808:03/01/23 03:31
>>809-810
返答ありがとうございます。
Cから移ってきたばかりなので、C++の作法がまだよくわかってないみたいです…

>>808では、例えでnewを出しただけでして、
実際は自作の関数にthrowを導入することを考えてました。

少し調べてみたのですが、BCBやVC++にはnew(nothrow)という
例外出さないnewもあるみたいですね。
こういうことをやりたかったのですが、ヘッダファイルを見る限り
今の私には手に負えそうに無いです…
もう少しC++の勉強してからまたチャレンジしたいと思います。

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

813 :デフォルトの名無しさん:03/01/23 03:50
>>807
オーバーフローすると正確な値は得られんよ。
例えば4ビットのコンピュータで8があるとする。
1000
4倍すると
100000
しかし、4ビットだから右の0000しか得られない。
8の4倍と0の区別ができないから。

814 :デフォルトの名無しさん:03/01/23 04:05
オーバーフローは例外でトラップできないからチェックするには計算のたびに
いちいちキャリーフラグ調べないといけないんだよな。 めんどくさ。

815 :デフォルトの名無しさん:03/01/23 04:43
>>813
> 型に納まる範囲内の結果は正常に得ることができるのか
ということだから、>>813 の形だと「できる」ってことになるね。

でも、これってどんな CPU 、どんなコンパイラを使っても
そうなるって保証されてることなのかな?
足し算引き算は大抵大丈夫だと思うけど、掛け算はどうなの?

816 :レゴ:03/01/23 04:45
あちらの方から飛んで来ました。
実行結果をファイルに出力するやり方を教えて欲しいです。
自分でずっとやってるんですが、中々うまくいきません。

817 :デフォルトの名無しさん:03/01/23 04:47
計算の途中ではいったんintに拡張されてその後元の型に押し込められる・・・はず

818 :レゴ:03/01/23 04:47
#include <iostream.h>
#include<stdio.h>

void main()
{
FILE *fp,*fc;
fp=fopen("素数−実行結果.txt","w");
int i, j ,f,n=1000,c=0;
// 1から1000までの数の素数を求める
// i, jはループ変数
// fは一回でも割り切れたら1。
// 一度も割り切れなかったら0。
for(i = 2; i <= n; i++) // i(==2,3,4,..,1000)について調べる。
{
f = 0;
for(j = 2; j < i; j++) // j(==2,3,...,i)で割ってみる。
{
if(i % j == 0) // あるjで割り切れたらfは1。
f = 1;
}
if(f == 0){// iを割り切るjがなかった場合
cout << i << "は素数です。" << endl;
c++;
}
}
printf("%d個です。",c);
fc=fclose("素数−実行結果.txt","w");
}
ここから、どう直していけば良いのか分からないんです。

819 :デフォルトの名無しさん:03/01/23 04:49
>>818
宿題スレ行け。つーか、どう直すも一から書き直せって感じだが。

820 :レゴ:03/01/23 04:49
817>>
はい。何か、エラーが出ました。
変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。って・・・

821 :デフォルトの名無しさん:03/01/23 04:51
>>818
予想以上だな・・・
とりあえずこっち来たってことはC++風の書き方がしたいわけだな?

822 :レゴ:03/01/23 04:53
でも、一応
#include <iostream.h>
#include<stdio.h>

void main()
{
int i, j ,f,n=1000,c=0;
// 1から1000までの数の素数を求める
// i, jはループ変数
// fは一回でも割り切れたら1。
// 一度も割り切れなかったら0。
for(i = 2; i <= n; i++) // i(==2,3,4,..,1000)について調べる。
{
f = 0;
for(j = 2; j < i; j++) // j(==2,3,...,i)で割ってみる。
{
if(i % j == 0) // あるjで割り切れたらfは1。
f = 1;
}
if(f == 0){// iを割り切るjがなかった場合
cout << i << "は素数です。" << endl;
c++;
}
}
printf("%d個です。",c);
}
だけなら、普通に動くんですよ☆

823 :デフォルトの名無しさん:03/01/23 04:54
プロcなんてしらんが、まずC言語というのでやってみたらどうだ?

824 :レゴ:03/01/23 04:58
ファイル名がcppなだけで、
殆ど、C言語で書いてるんだと思います。
あんまし理解してないので、今死でやってたんですけど。

825 :レゴ:03/01/23 05:00
今あるプログラムを出来るだけ形を残しつつ、
テキストファイルに出力出来るようにしたいんです。


826 :デフォルトの名無しさん:03/01/23 05:00
とりあえず
822の1行目を
#include <iostream.h>

#include <fstream.h>

に直し、
void main()
{
の次の行に
ofstream cout( "素数−実行結果.txt" );

を挿入するだけで君の期待する物は得られる

827 :デフォルトの名無しさん:03/01/23 05:05
>>826
えーそうなのー?簡単だね。
>>825
多分だけど時間がありそうだから、「C言語 fopen」とかで検索して
関数の使い方を調べてみたらどう?
そこまで組めたならチョコっと調べたら出来ると思うんだけどなー

828 :レゴ:03/01/23 05:07
凄いです!
coutの部分が全てファイルに出力されてました。
どうしてそんなに分かるんですかぁ〜?凄いですねぇ〜。

後、最後の printf("%d個です。",c);
という部分も結果としてテキストへ出したいのですが、
ofstream printf( "素数−実行結果.txt");
って書けば良いんですかね?


829 :デフォルトの名無しさん:03/01/23 05:11
>>828
ちゃうちゃう
cout に出力してるところと同じ方法で出力すれば良い
上の方で
cout << i << "は素数です。" << endl;
とやっているのだから、
同じように
cout <<*************(宿題)****************

しかしその分だとC++どころかCの文法もあいまいなようだし、
なぜcout << で文章が出力されるのかもわかってないっしょ?
そのままだと今後厳しいだろうからちゃんと入門書読んどいたほうが良いよ

830 :レゴ:03/01/23 05:18
はぅ〜
頑張ります☆

831 :レゴ:03/01/23 05:20
出来ましたぁ〜!
めっちゃ感動です!!!

832 :デフォルトの名無しさん:03/01/23 05:21
壮大なネタだったな

833 :レゴ:03/01/23 05:23
#include <fstream.h>
#include<stdio.h>

void main()
{
ofstream cout( "素数−実行結果.txt" );
int i, j ,f,n=1000,c=0;
// 1から1000までの数の素数を求める
// i, jはループ変数
// fは一回でも割り切れたら1。
// 一度も割り切れなかったら0。
for(i = 2; i <= n; i++) // i(==2,3,4,..,1000)について調べる。
{
f = 0;
for(j = 2; j < i; j++) // j(==2,3,...,i)で割ってみる。
{
if(i % j == 0) // あるjで割り切れたらfは1。
f = 1;
}
if(f == 0){// iを割り切るjがなかった場合
cout << i << "は素数です。" << endl;
c++;
}
}

cout << "素数は、" << c << "個です。" << endl;
}
こんな感じです。
本当にありがとう御座いました。
本当に感謝してます☆ありがとう御座いました。

834 :デフォルトの名無しさん:03/01/23 05:30
>>833
(*⌒ー')ノやったね♪
>>829
C++には便利な関数あるのね。勉強になった。 

835 :レゴ:03/01/23 05:32
ネタって・・・、
こっちは、訳分かんなくて、必死だったんですよぉ。
色々、ありがとう御座いました。助かりました。

836 :デフォルトの名無しさん:03/01/23 05:35
結局coutのままか…

837 :デフォルトの名無しさん:03/01/23 05:36
そういえば前sendmail?が判らないって駄々こねてた人がいたんね。

838 :レゴ:03/01/23 05:41
今から、爆睡したいトコなんですが、
他の課題が在るので、そっち頑張ります。
また来た時は、宜しく御願いします。
御休み為さいです☆☆

839 :デフォルトの名無しさん:03/01/23 06:28
もう来なくていいよ(・ε・)

840 :デフォルトの名無しさん:03/01/23 07:00
そういえばC++を勉強し始めた頃はcoutが出力を行っているんだと思っていた。
coutはCのstdoutみたいなもので、出力を行っているのは<<なんだよな。

841 :デフォルトの名無しさん:03/01/23 07:07
>>840微妙

842 :デフォルトの名無しさん:03/01/23 07:58
>>840美乳

843 :デフォルトの名無しさん:03/01/23 08:05
>>840陰毛

844 :デフォルトの名無しさん:03/01/23 08:06
>>840微尿

845 :デフォルトの名無しさん:03/01/23 09:00
>>840飲尿

846 :デフォルトの名無しさん:03/01/23 09:02
>>840美称


847 :ブラシさん:03/01/23 09:41
>>813,814
ありがとうございます。キャリーフラグはアセンブラでないと無理みたいですね。

848 :ageMAN:03/01/23 10:00
ファイルをドロップした時、ドロップされたウインドウを一番手前に
持ってくるには特殊な処理が必要だと思うけど、そういうすごいテクニックを
やってるソースはどこかにないかな?

849 :デフォルトの名無しさん:03/01/23 10:02
>>848
別にすごくないよ。

850 :デフォルトの名無しさん:03/01/23 11:05
>>レゴ
 ちゃんと勉強しろ…っていいたくなる人だね

851 :デフォルトの名無しさん:03/01/23 11:12
>>790
亀レスだが、
Loki のスモールオブジェクトは
VC++.NET でリリースビルドすると、標準 new よりやや速くなる。



852 :840:03/01/23 11:24
>>842-846
なんなんだよあんたたちは(T_T)


853 :デフォルトの名無しさん:03/01/23 14:35
>>852微妙

854 :デフォルトの名無しさん:03/01/23 14:52
>>852
美乳

855 :デフォルトの名無しさん:03/01/23 15:33
>>852陰毛

856 :デフォルトの名無しさん:03/01/23 15:59
fstreamでテキストファイルを開いてstring型変数に
行を読み込む処理はどうやればいいですか?
f>>s;とやっても行の途中までしか読み込めません。

857 :デフォルトの名無しさん:03/01/23 16:05
>>856
std::getline(f, s, '\n');

858 :C++厨:03/01/23 16:05
std::getline(f, s);

とかで、どうよ。

859 :デフォルトの名無しさん:03/01/23 16:07
>>856
やっぱり
std::getline(f, s); でいいや。

860 :C++厨:03/01/23 16:12
( ゚∀゚ )ぱぱぱぱ〜ん
ぱぱぱぱ〜ん
ぱぱぱぱ、ぱぱぱ〜
ぱぱぱぱ、ぱぱぱ〜
I love you forever
I'll want you to fuck me

ついに俺もケコーンの時期が北か(*゚∀゚)
>>857-858ハァハアx

861 :デフォルトの名無しさん:03/01/23 16:16
>>860
C++の標準ライブラリを理解している人が増えてきてうれしいよ。

862 :856:03/01/23 16:22
>>857-858
ありがとうございます。見落としていました。
ifstream::open/getにstringが渡せないのは不便ですが
char*/string両方サポートするのは面倒ということなんでしょうか。

863 :デフォルトの名無しさん:03/01/23 16:30
>>862
面倒というより、開発してきた経緯があって、多分別々のスタッフが
担当していたので整合が取れてないだけの話では?C++のライブラリ
にはそういう面がいっぱいある。

864 :デフォルトの名無しさん:03/01/23 18:14
basic_stringはSTLだがiostreamはSTLじゃない
元々別のライブラリだったものを同じstdネームスペースに突っ込んでるだけ

865 :デフォルトの名無しさん:03/01/23 18:25
basic_stringもSTL由来じゃないだろ。

866 :山崎渉:03/01/23 20:00
(^^)

867 :デフォルトの名無しさん:03/01/23 20:14
        iostream, ... : C++ 標準ヘッダ
                ↓
vector, list, ... : STL → std ← char_trait : basic_string, ...

868 :デフォルトの名無しさん:03/01/23 20:32
おまいら
using namespace std;
はもちろんデフォだよな?

869 :デフォルトの名無しさん:03/01/23 20:33
>>868
付けてません。

870 :デフォルトの名無しさん:03/01/23 20:37
>>868
付けてません。

871 :デフォルトの名無しさん:03/01/23 20:55
>>868
まさか。*.cpp 内で

using std::vector;

とか並べることはあるが。

872 :デフォルトの名無しさん:03/01/23 20:57
>>871
同意。

873 :デフォルトの名無しさん:03/01/23 22:37
>>868
氏ね

874 :868:03/01/23 23:37
何で付けないんだよ。ブルッてんのか?
なんも実害ないだろ。

875 :デフォルトの名無しさん:03/01/23 23:39
名前空間の外はできるだけ綺麗にしておきたい。

876 :デフォルトの名無しさん:03/01/23 23:44
使わないなら using namespace って何のためにあるんだ?

877 :デフォルトの名無しさん:03/01/23 23:47
宗教戦争

878 :デフォルトの名無しさん:03/01/23 23:50
>>876
初心者&なまぐさ坊主のため。

879 :474:03/01/23 23:52
>>876
ライブラリのサンプルコードをすっきりさせるため。

880 :デフォルトの名無しさん:03/01/23 23:53
>>874
> なんも実害ないだろ。
いや using namespace std; するとコンパイルが通らなくなるソースは、すぐに
書けるだろ。

> 使わないなら using namespace って何のためにあるんだ?
歴史的事情

881 :デフォルトの名無しさん:03/01/24 00:02
using〜 を
ヘッダに書く奴は馬鹿。
ソースでグローバルに書くのは好きずき。
関数の中で書くのはデフォ。

882 :876:03/01/24 00:08
>>877
一億光年くらい納得した。

883 :デフォルトの名無しさん:03/01/24 00:09
>>880
書こうと思えば書けるが、標準で使われてしまっている名前はなるべく避けるのが
常識じゃないか?
とすれば、名前の衝突はそうそう発生しない。

884 :デフォルトの名無しさん:03/01/24 00:10
おいおい、ここで宗教戦争始めるのか?
なら ↓ こっち逝ってくれ。
http://pc3.2ch.net/test/read.cgi/tech/1031355713/l50

885 :デフォルトの名無しさん:03/01/24 00:14
うちの会社はstd::を付ける事にきまってるので、using使ったソースを
納入した場合全部書き直しとなります。

886 :デフォルトの名無しさん:03/01/24 01:01
それはマ板のネタ

887 :デフォルトの名無しさん:03/01/24 01:16
ある保守を任されたソースに書かれてることについて疑問があるのですが、
クラス内においてメンバ関数の処理を記述してあるようなもの。
これの宣言にinlineがついているのですが、これってなにか意味があるんでしょうか?
クラス内のメンバ関数宣言にinlineがつくというのは、クラス定義の
外側で関数定義するときにinlineを省略できる。このためだけに使うものだと
思っていたのですが、他になにか理由があるのでしょうか?

888 :デフォルトの名無しさん:03/01/24 01:19
しばらくするとstd::を書くのが快感になってくるんです

889 :デフォルトの名無しさん:03/01/24 01:21
>>887
> 外側で関数定義するときにinlineを省略できる

省略できたっけ?

890 :デフォルトの名無しさん:03/01/24 01:26
>>889
中で関数定義する時にinlineを省略できると間違えたと思われ。

891 :デフォルトの名無しさん:03/01/24 01:26
>>888
禿同

892 :デフォルトの名無しさん:03/01/24 01:29
>>888
同じく。時々手が震えて::が;;になったり:::になったりするのがまたイイ。

893 :デフォルトの名無しさん:03/01/24 01:29
class CLS{
inline char get();
};
char CLS::get(){
こういう書き方ができるとC++Primerには書いてあるんだけど・・・

894 :デフォルトの名無しさん:03/01/24 01:33
>>893
それはインラインにならないんじゃ・・・・

895 :デフォルトの名無しさん:03/01/24 01:36
>>893
げっ、こういう書き方も有効みたいだ。初めて知ったよ。
規格書ではどの辺を読めばいいのだろうか。

896 :デフォルトの名無しさん:03/01/24 01:42
で、、、なにか理由があるんでしょうか?

897 :デフォルトの名無しさん:03/01/24 01:46
>>896
普通外部で関数を定義するとinlineにならないが、クラス宣言の所で
inlineと書いておくと、外で関数を定義してもちゃんとinlineになるみたいだ。

規格書読んだけど目がちかちかしてどこに書いてあるのかわからなかった。
識者のレスをきぼん。

898 :デフォルトの名無しさん:03/01/24 01:50
>>897
クラス定義の中でメンバ関数の処理が書いてあるということは
inlineキーワードは付いても付いてなくても無条件でinlineに
なるから、意味ないですよね?ネームスペーススコープで
メンバ関数を定義するときは上の例みたいにいろいろと
あるみたいですが。。。

899 :デフォルトの名無しさん:03/01/24 01:52
それともinline関数にはちゃんとキーワードを付けた方が
コードが見やすいから、これをコーディング規約にしてしまおう
なんてのがあったのかな。その辺のドキュメントが残ってないから
ちょっと分からないのでなんともいえないですけどね。

900 :デフォルトの名無しさん:03/01/24 01:53
>>897 9.3.3

901 :デフォルトの名無しさん:03/01/24 02:00
>>898
class内部でメンバ関数の定義を書いてしまった場合は、そのメンバ関数
はinlineになりますが、class外部でメンバ関数の定義を書いた場合、その
関数がinlineになるかどうかは、メンバ関数の宣言の所にinlineと書いて
あるかどうかで決まるようです。

>>900
thanks.

902 :デフォルトの名無しさん:03/01/24 02:02
>>898
そのため、クラスの内部に定義を書こうと、外部に書こうと常にinlineに
なるように、クラス内部でメンバ関数全部にinlineと書くことに決めてある
んじゃないでしょうか。

903 :デフォルトの名無しさん:03/01/24 02:20
>>902
やっぱりコーディング規約的な話ですかね。
関数の処理実体があるかどうかなんて一目瞭然だと
思うのだけど、C屋さんには紛らわしかったりしたのかな。
とりあえず、このことは忘れて作業に戻ります。
みなさんどうもでした。

904 :デフォルトの名無しさん:03/01/24 02:26
903です902さんのよく読んでませんでした。
クラス定義においてinline関数にはinlineキーワードを
付けることを必須と決めておけば、メンバ関数を外に
出したときにinlineキーワードを付け忘れてもinline化
されるという意味ですね。この規則ってC++的常識から見て
どうなんでしょうかね。

905 :デフォルトの名無しさん:03/01/24 02:29
>>904
どうなんだろ
俺はコンパイラの最適化を盲信してinlineはどこにも使わないけどな

906 :デフォルトの名無しさん:03/01/24 02:45
>>904
>>900さんの規格書の項目を読んでみられるといいよ(英文だけど)。
拙い和訳をすれば、「メンバ関数をinline化するにははクラスの宣言部に
inlineと書いても、定義部でinlineと書いてもよい。」のような意味になると
思います。

規格書にちゃんと書いてあるので、文法的にも正しいはずです。
というか俺もこれから使わせてもらいますね。

907 :デフォルトの名無しさん:03/01/24 08:42
次スレのテンプレ、いいの作ったからスレ立ては>>907に任しとき

908 :デフォルトの名無しさん:03/01/24 09:40
>>883
常識、で済めば話は簡単なんだがな…

909 :デフォルトの名無しさん:03/01/24 12:58
コンストラクタの暗黙の変換は役に立たないのか?

#include<iostream>
using namespace std;

struct A
{
A(int){}
};

void F(double i)
{
std::cout << "F(double)";
}

void F(A a)
{
std::cout << "F(A)";
}

int main()
{
F((int)123);//F(double)
}

910 :デフォルトの名無しさん:03/01/24 13:27
それは無理なんじゃ。。
Fのパラメータを評価する段階でint型の値をAにマッチさせる
理由はないわな。

911 :デフォルトの名無しさん:03/01/24 15:27
オーバーロードの解決では、標準変換 (int => double) のほうが
ユーザ定義変換 (A(int) {}) より優先するからね。C++3rd 7.4 参照。

912 :デフォルトの名無しさん:03/01/24 19:45
すみません。質問させてください。
プログラムからファイルの名前を変えたり、ファイルを削除する必要がでてきました。
環境はWindowsですが、なるべく「標準」でやりたいと思います。
ところが、調べてみると、C++でどうするか書いてある本が見当たりません。
Cでは、removeやrenameが使えるようなのですが、他にC++らしい方法はないのでしょうか。
ご存知の方、お願いします。

913 :デフォルトの名無しさん:03/01/24 19:50
>>912
std::remove
std::rename

914 :デフォルトの名無しさん:03/01/24 21:41
#pragma comment(linker, "/nodefaultlib:\"libc.lib\"")
#pragma comment(linker, "/entry:\"DllMain\"")
↑を使ってビルドすると、
すごく小さいサイズのファイルが出来上がって、
普通に動作してる気がするけど、
他の環境で使ったときに不具合がでるとか
何か問題ってあるのでしょうか?

915 :デフォルトの名無しさん:03/01/24 21:45
>>914
pragmaつかっといて、他の環境ってどういうこと?
まぁまずはスレ違いダナ。VCスレいけば?

916 :デフォルトの名無しさん:03/01/25 01:06
#include <unistd.h>
main()
{
int i,j;
printf("program start");
j=fork();
if(j>0)
{
printf("parent-1");
sleep(5);
printf("parent-2");
sleep(5);
printf("parent-3");
}
if(i==0){
printf("child-1");
sleep(8);
printf("child-2")
}
return(0);
}

すみませんがエラー1になるのですが、実行の仕方を教えてください

917 :デフォルトの名無しさん:03/01/25 01:08
>>916
UNIX板へ逝け。

918 :デフォルトの名無しさん:03/01/25 01:24
#include <cstdio>
#include <unistd.h>
int main(){
int i,j;
printf("program start\n");
j=fork();
if (j>0) {
printf("parent-1\n");
sleep(5);
printf("parent-2\n");
sleep(5);
printf("parent-3\n");
}
if (i==0) {
printf("child-1\n");
sleep(8);
printf("child-2\n");
}
return(0);
}

919 :デフォルトの名無しさん:03/01/25 01:27
#include <cstdio>
#include <unistd.h>
int main(){
int i,j;
std::printf("program start\n");
j = ::fork();
if (j > 0) {
std::printf("parent-1\n");
::sleep(5);
std::printf("parent-2\n");
::sleep(5);
std::printf("parent-3\n");
}
if (i == 0) {
std::printf("child-1\n");
::sleep(8);
std::printf("child-2\n");
}
return(0);
}
本当はこうしないとダメかな??

920 :マルチはだめですよ〜:03/01/25 01:44
はわわ〜

921 :デフォルトの名無しさん:03/01/25 04:15
ファイルサイズを取得するには、C言語ならファイルをバイナリモードで
開いておき、
fseek(fi, 0, SEEK_END);
size = ftell(fi);
のような感じで簡単にできましたが、C++ではtellg()の返す値の型が
std::ios::pos_typeのためにそれができません。
もちろん大概のコンパイラのstd::ios::pos_typeはunsignedもしくは
unsigned longのtypedefなのですが、それに依存せずファイルサイズ
を簡単に取得する方法はありますでしょうか?

922 :デフォルトの名無しさん:03/01/25 04:46
ない。
何故なら、「ファイルサイズ」 が環境依存の概念だから。
環境依存でないのなら、それを取得する標準関数が用意されるはずだ。

923 :デフォルトの名無しさん:03/01/25 04:59
>>922
そうですか・・・・ありがとうございました。
どうしても必要な時はstd::fseek()などを使ってやる事にします。

924 :デフォルトの名無しさん:03/01/25 05:24
>>919
いいかげん荒らすのはやめてくれんかね。

925 :デフォルトの名無しさん:03/01/25 11:03
string型は積極的に使うべき?

926 :デフォルトの名無しさん:03/01/25 11:31
やってはいけないことが分かっているなら使うべき

927 :デフォルトの名無しさん:03/01/25 11:56
やってはいけないこととは何?

928 :デフォルトの名無しさん:03/01/25 12:14
>>927
タイトなループ中で const string& をとる関数 foo() に

 foo("string");

と書くとか。毎回 string オブジェクトのコンストラクト・デストラクトが行われて
泣ける。

929 :デフォルトの名無しさん:03/01/25 12:31
なるほど

930 :デフォルトの名無しさん:03/01/26 00:47
最適化されるだろ。

931 :デフォルトの名無しさん:03/01/26 01:15
コンストラクタ・デストラクタの最適化はうまく逝くのだろうか?

932 :デフォルトの名無しさん:03/01/26 01:19
されないだろ。つかされたら困る。

933 :デフォルトの名無しさん:03/01/26 01:33
ベンチマークテストでもやってみるべ。
風呂入ってくるから後で。

934 :デフォルトの名無しさん:03/01/26 01:43
>>933
ハァァ?ベンチマークとるまでもないだろ。
理性的に考えれば結果は明白。これだからベンチマーク厨は・・・




とかいう芳しいのが別のスレに居た。

935 :デフォルトの名無しさん:03/01/26 02:09
>>934
まあそう言わずに、どれだけ実際に違うのか見てみましょうよ。

g++3.2.1(MinGW)で以下の関数を QueryPerformanceCounterで測定。

void dummy(const std::string& s)
{
}

void func1()
{
for (int i = 0; i < LOOP; i++)
dummy("test");
}

void func2()
{
std::string s("test");
for (int i = 0; i < LOOP; i++)
dummy(s);
}

936 :デフォルトの名無しさん:03/01/26 02:12
コンパイルオプションは -O3。

LOOP = 500000 で実験。

func1 = 365125
func2 = 1944

ご覧のように、std::stringのコンストラクタを呼んだ方は100倍以上も
遅くなってしまいますた。

-O2だと
func1 = 371604
func2 = 7711

これでも全然遅いです。

937 :デフォルトの名無しさん:03/01/26 02:17
933じゃないけど試してみたよ。

VC7, gcc3ともに毎回コンストラクト/デストラクトしてた。
最適化オプションつけたらvc7は5倍ぐらい速くなったけど、
gcc3は1.2倍程度だった。

stringの生成をループの外に持ってったら、
最適化オプションなしで20倍ぐらい速くなった。

ところで、foo()の中身を、引数のstringの長さをグローバル変数に足しこむ
のにしてたんだけど、
ループ外にもってったのをvc7で最適化したら、ループが無くなってました。
gcc3は残ってた。

938 :937:03/01/26 02:20
書いてるうちに別の方が書き込みを・・・
やってることはほぼ同じです。

939 :デフォルトの名無しさん:03/01/26 02:29
>>937
VC7の方もなかなか速いね。gccは-O3にしたらループは
残るものの、callが無くなっていました。

int len;

void dummy(const std::string& s)
{
len += s.length();
}

でやったら、-O3で

func1 = 379483
func2 = 9185

という結果。これがまあ実際の使用上の差かもしれません。

940 :デフォルトの名無しさん:03/01/26 02:58
enumって何ナノ?定数のtypedef?
継承できないよね?
勝手にできないと思って、拡張するとき
#defineでごまかしてるんだけど。

classにstatic constならべたclassを継承すれば
継承っぽいなぁ。めんどいけど。

詳しい方ご教授ください。

941 :デフォルトの名無しさん:03/01/26 03:11
enumに整数以外の型も使えたらなあ・・・

942 :デフォルトの名無しさん:03/01/26 03:13
>>940
enum は列挙型で、それ自身独立した型。enum から整数には暗黙の変換が
利くけど、整数から enum や異なる enum 間の変換にはキャストが必要。

おそらく

class Foo {
public:
 enum TYPE1 { A, B, C, ... };
 virtual func(TYPE1 t);
};

なんてのがあって enum を拡張したいのだと思うけど、それは設計が腐ってる。

func() の中で t の値で処理を場合分けしていて、かつ t に対して将来の追加が
考えられるなら、処理自体をカプセル化して別のクラスに括り出すことを考えた
方が良い。

class Cmd {
public:
  virtual func(Cmd& foo) = 0;
};
// enum に対応して Cmd の派生クラスを作っておく
// Cmd 派生クラスのインスタンス生成は Factory パターンでも使って下さい

class Foo {
public:
  virtual func(Cmd* cmd);
};


943 :C++厨:03/01/26 13:20
enumeration
【名】《【複】enumerations》
(1)数え上げること; 列挙.
(2)目録, 表 (=list).
 by Roboword

944 :デフォルトの名無しさん:03/01/26 16:16
cygwin 上の g++ で

$ g++ hoge.cpp -I /hogeinc

と書いてコンパイルしてるんですが、この -I /hogeinc を書かなくても
自動的に対象ディレクトリを見てくれるようにするにはどうしたらいいですか?

945 :デフォルトの名無しさん:03/01/26 16:18
知らん。
makefile工夫すれば書くのはめんどくさくないと思うが。

946 :デフォルトの名無しさん:03/01/26 16:19
>>944
specs に書いておく。gcc -v すると specs ファイルのパス名分かるから、あとは
それをエディタで開いて書き換えましょう。

947 :944:03/01/26 16:48
>>945
make 使うまでもないちいさなプログラムのテストとかで面倒くさいんです。

>>946
できましたー!ありがとうございます!!
これは gcc ならどんな環境でも有効な方法なんでしょうか?

948 :デフォルトの名無しさん:03/01/26 18:40
質問があります。
非常に日本語で表しにくいのですが…
ある範囲内の数値でIDを自動的に生成するようなクラスは
どのように実装したらよいでしょうか?
例えば、Get()で新しいIDを、Release(ID)でIDの解放を行うような
ID管理のクラスを作りたいのですが。
最初はstd::vector<bool>を使って使用中か否か管理しようかと
思ったのですが、intの全範囲で使用可能などとなると管理が
できなくなってしまうので…
皆様のご意見をお聞かせください。

949 :デフォルトの名無しさん:03/01/26 18:53
>>948
それしか方法が無いと思うが。
できるのは、容量を縮めるのに bitset を応用できるくらい?

950 :デフォルトの名無しさん:03/01/26 19:08
>>949
Get, Release に特定のパターンがあるなら、最適化する余地はある。たとえば
多くの場合、

 まとめて Get
 まとめて Release

するなら、

 ここから、ここまで確保されている (最小 ID と最大 ID のタプル)

っつーのを持たせた方が良い。

何の前提もつけられないとなると、完全に全範囲持たせるしかないよな…

951 :デフォルトの名無しさん:03/01/26 19:59
>>948
std::set<int>、で、どう?

952 :デフォルトの名無しさん:03/01/26 22:11
>>907
立てるの?立てないの?
■過去スレ■
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://pc3.2ch.net/test/read.cgi/tech/1041328679/
■関連スレ■
【C++】template 統合スレ -- STL/Boost/Loki, etc.
http://pc3.2ch.net/test/read.cgi/tech/1037795348/

STLスレッド     http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
STLスレッド part2 http://pc3.2ch.net/tech/kako/1026/10267/1026793823.html

953 :デフォルトの名無しさん:03/01/27 00:33
class A
{
  A();
}
class B : public A
{
  B();
}
この場合手持ちのコンパイラでは
A::A()が先に実行されるのですが
これは規格で保証されてる事なのでしょうか?

954 :デフォルトの名無しさん:03/01/27 00:34
>>953
保証されてる。デストラクタがその逆であることも。

955 :デフォルトの名無しさん:03/01/27 00:38
>>954
ありがとうございます

956 :デフォルトの名無しさん:03/01/27 02:27
>>928->>939の書き込みに感動しました。
実行時間の測定は、gccというかUNIXの場合timeを使うのですよね。
VCの場合、どうやって測定するのでしょうか。

957 :デフォルトの名無しさん:03/01/27 02:32
>>956
トリッキーなコード2より転載。windows.hをインクルードして呼ぶ。

int prof(void (*func)())
{
__int64 start, end, freq;
HANDLE hprocess;
DWORD oldclass;

hprocess = GetCurrentProcess();
oldclass = GetPriorityClass(hprocess);

Sleep(10);
SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start);

func();

QueryPerformanceCounter((LARGE_INTEGER*)&end);
SetPriorityClass(hprocess, oldclass);

return (int)(end - start);
}

958 :デフォルトの名無しさん:03/01/27 02:35
>>949
VC++6では既に, std::vector<bool>は1要素1bitで保持してる(はず)。
激しく環境依存だけど。


959 :デフォルトの名無しさん:03/01/27 03:55
新スレ立てました C++相談室 part15
http://pc3.2ch.net/test/read.cgi/tech/1043605481/

960 :デフォルトの名無しさん:03/01/27 04:01
足りないと思われるものがあるなら今のうちに次スレの
方に貼り付けておいてください。今日はもう寝ます、お休みなさい。

961 :デフォルトの名無しさん:03/01/27 06:12
漏れの脳みそは足りないと思うのですが、何を貼り付ければいいですか?

962 :デフォルトの名無しさん:03/01/27 07:33
汝には、当家に伝わる秘伝中の秘伝である
ありがた〜い、塗り薬を授けるので
今すぐ、頭をかちわって、脳みそを送るが良いぞ

963 :デフォルトの名無しさん:03/01/27 08:28
これから頭をかち割ってみます

964 :デフォルトの名無しさん:03/01/27 11:52
v(^・^)v

965 :デフォルトの名無しさん:03/01/27 12:03
963 は絶息しますた。

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

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)