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


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

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;
}



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