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


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

C++相談室2
1 名前:デフォルトの名無しさん :2001/08/01(水) 13:42
v(^・^)v

http://www.kuzbass.ru/docs/isocpp/

2 名前:デフォルトの名無しさん :2001/08/01(水) 14:02
あは

3 名前:デフォルトの名無しさん :2001/08/04(土) 00:39
下のようなのを書いたんですが、ちゃんと動きました。
これはC++的にはアリなんでしょうか?

class foo
{
public:
  int bar;
};

int main( int, char **)
{
  foo a;
  a = 0xDEADBEEF;
  printf( "%08X\n", a);
  return 0;
}

4 名前:デフォルトの名無しさん :2001/08/04(土) 01:36
>>3
メンバ関数の無いクラスは構造体のようなもの。
メモリにべたコピーされてるだけで今のところ
うまくいってるだけ。

5 名前:デフォルトの名無しさん :2001/08/04(土) 01:49
>>3
良く動いたね。
正しくは、
a.bar = 0x0deadbeef;
ってやった方が良いよ
どう動いてるのか 俺にはさっぱりだ。
ウツダシノウ

6 名前:デフォルトの名無しさん :2001/08/04(土) 11:53
試してないけど、上のコードはコンパイル通るのか?
=演算子や型変換の演算子も定義してないぞ。。。。

7 名前:デフォルトの名無しさん :2001/08/04(土) 13:33
[C++ エラー] Unit1.cpp(19): E2034 'unsigned long' 型は 'foo' 型に変換できない

動きませんな。

8 名前:デフォルトの名無しさん :2001/08/07(火) 03:32
>>4
メンバ関数のあるなしでC++の構造体はメモリ上の配置の仕方がことなるのでしょうか?
Cと同じように構造体が実装されているようには思えないのですが。。

また独習C++を読むと、
classとstructはデフォルトのアクセス指定子が異なるだけ、なんて
書いてあるんですが、これはホントですか?

アセンブラが分からないヘタレですみません。

9 名前:デフォルトの名無しさん :2001/08/07(火) 03:39
$g++ samp.cc
samp.cc: In function `int main(int, char **)':
samp.cc:11: no match for `foo & = unsigned int'
samp.cc:6: candidates are: class foo & foo::operator =(const foo &)

gccでもダメでした。ところでコンパイルが通るってどんなコンパイラ
使ってるんですか?>>3

やっぱりネタですよね?w

10 名前:デフォルトの名無しさん :2001/08/07(火) 09:49
>>8
そうです。デフォルトでpublicかprivateかの差だけです。

メモリ上の配置が変るのは、処理系によっても違うかも
しれませんが、仮想関数を持った時に仮想関数テーブル
へのポインタが自動的に追加されます。

11 名前:デフォルトの名無しさん :2001/08/07(火) 21:17
C++のコードをCに変換してみよう!

"C++"

class CClass
{
private:
 int n;
public:
 void func1(int a);
 virtual void func2(int a);
};

CClass c;
c.func1(0);
c.func2(1);

"C"

void *CClassVTable[] = {
 CClass_func2;
};

typedef struct CClass
{
public:
 void **v_tbl = CClassVTable;
private:
 int n;
};

void CClass_func1(CClass *this, int a);
void CClass_func2(CClass *this, int a);

CClass c;
CClass_func1(&c, 0);
c.v_tbl->CClass_func2(&c, 1);

12 名前:デフォルトの名無しさん :2001/08/08(水) 11:01
Cのコードが分からない。。。鬱だ

13 名前:デフォルトの名無しさん :2001/08/10(金) 03:33
>>11
続きは?

14 名前:STL厨房 :2001/08/12(日) 00:37
あいまいなシンボルって何じゃー?どうせいっつんじゃー
さっきまで動いとったのに、2,3行目加えただけで
コンパイル不能になっとるし。

1 #include <fstream.h>
2 #include <string>
3 using namespace std;
4 int main()
5 {
6 ofstream obj("test.txt");
7 return 0;
8 }

>test0.cpp(6) : error C2872: 'ofstream' : あいまいなシンボルです。

15 名前:デフォルトの名無しさん :2001/08/12(日) 01:15
「C++相談室2」というタイトルと

↓この顔文字

v(^・^)v

の組み合せはまさに芸術だと思う。

16 名前:デフォルトの名無しさん :2001/08/12(日) 02:18
>>14
1行目が悪いんじゃないか?

17 名前:デフォルトの名無しさん :2001/08/12(日) 03:29
>>14 STL厨房
1c1
< #include <fstream.h>
---
> #include <fstream>
もしくは、
3c3
< using namespace std;
---
> //using namespace std;

SEE ALSO
http://www.microsoft.com/japan/developer/library/vccore/c2872.htm

18 名前:STL厨房 :2001/08/12(日) 08:04
>>16 >>17
レスどもっす。
.h の方を使うと内部で暗黙に namespace が有功になってて
外部で再び宣言すると、名前がかぶって ofstream がどっちに
属すのか特定できんって事なんかな。。。

19 名前:STL侍 :2001/08/16(木) 08:13
STLのリストに関して質問がござる。

いまリストの特定の要素を削除したいのじゃが、
そやつの『アドレスを知っている』場合の処理について
悩んでいるのでござる。それがしはこれまで
イテレータで頭から順繰りに伝って、

struct _hoge xxx; // 消したい要素の化身
list<struct _hoge>::iterator i;
for(i=hoge.begin(); i!=hoge.end(); ++i)
if(&(*i)==&(*xxx)) hoge.erase(i), break;

などとやってきたわけでござるが、
最近これはとても非効率な気がしてきたのでござる。
なんとなれば要素のアドレスを知っている限りにおいては
直接にその要素を削除して、リストの前後関係を
修復するような機能があってもよさそうではござらぬか。
つまりhoge.erase(pos)[posはイテレータ]の
アドレス版hoge.erase2(&xxx)みたいなものでござる。
しかし『C++標準ライブラリ チュートリアル&リファレンス』
なる書物を紐解いてみるに見つける能わなんだ。

当方、イテレータなるものについての理解が浅い故、
頓珍漢なことを申してるやも知れぬが、
右の点に関してなにとぞお知恵を拝借致したく候。

20 名前:デフォルトの名無しさん :2001/08/16(木) 10:03
「アドレスを知ってる場合」云々はおいといて
list::remove()を使わないで イテレータで自分で回して比較しているのには
何か理由があるのか?

まじめに質問しているのならふざけた口調はやめたほうがいいぞ

21 名前:STL侍 :2001/08/16(木) 11:32
かたじけない >>20
エセ侍風はお気に召されなかったようで、口調を戻します。

removeを使えばよいという指摘、その通りでした。半分解決です。
自分でイテレータを回して比較していることに意味はありませんでした。

で私の中で未解決の点というのは、removeは値が該当するもの全てを
削除するようなので、結局内部的には全検索しているのですね。
疑問に思ったのは、消したい要素のアドレスが判ってるならば、
その要素をピンポイントで消せる方法があってもいいのに、ということです。
この考え方は変でしょうか。

22 名前:デフォルトの名無しさん :2001/08/16(木) 11:55
listのメンバとしてstruct本体じゃなくてstructのポインタを持つ
ようにすればいいのでは?

23 名前:20 :2001/08/16(木) 12:06
>>21
消したい要素のアドレスがわかってたとして そのアドレスがlistのどこに
あるかは探さなければわからないのは当然じゃない?
要素自体を消したいんじゃなくて 要素を「listから」消したいんでしょ?

24 名前:STL侍 :2001/08/16(木) 12:30
>>23
> そのアドレスがlistのどこにあるかは探さなければ
> わからないのは当然じゃない?

リストって各要素が前後の要素とポインタで繋がれているだけの
単純な構造だと思っていたんですが、これが私のそもそもの誤解かな?

上のように考えていたので、要素を適切に削除するには、
要素のアドレスを知っている場合(該当要素に直接アクセスできる場合)は、
前後の要素についてポインタの繋ぎ変えをした後で、
該当要素のメモリを解放すればそれでおしまい、
つまり要素の前後関係だけが重要だから要素がリストのどこにあるかは
関係ないと思っていたんですが、そんなに単純ではないということでしょうか。

むむむ。

25 名前:20 :2001/08/16(木) 12:48
リストを構成しているそれぞれのノードはポインタでチェーンされているが
そのノード自身のアドレスと ノードが参照している中身のアドレスは別物。

26 名前:RIP_MAPIRO :2001/08/16(木) 13:51
STL内で
template <class Temp>
class Atom
{
Temp m_Youso;
Atom* p_next;
Atom* p_before;
};
のようにラップされているのだろうけど、それはSTLを作っている
ところ次第だし、ヒープの確保&解放の最適化を行うためにもう
一つラップクラスを用意しているだろう。このあたりはvectorの内部
ポインタ、_First,_Last,_Endの機能と同様のものだと思う。
 強引に
temlate <class Temp>
MyList : public list<Temp>
{
public:
void
erase2(Temp*);
};
のようなことも可能だがprotectedなメンバを書きかえるよな
操作はしたくないのが本音。複数のバージョンのSTLを考
えるとやりたくない。

27 名前:STL侍 :2001/08/16(木) 14:36
>>25
至極なっとくでござる。
お付き合いどうもありがとう。

28 名前:STL侍 :2001/08/16(木) 14:39
>>26
おぉ、これもレスですね。どうもありがとう。
今すぐには理解できないけど少し反芻してみます。
一度はヘッダの中身を覗いてみないとダメですね。

29 名前:デフォルトの名無しさん :2001/08/16(木) 16:37
>>28
STL じゃないが、格納されるデータ自体にポインタを持たせたコレク
ションの実装として 4.4BSD の <sys/queue.h> がある。もともと C
言語用のマクロだが、これに C++ 風のインターフェースをかぶせたも
のが、

http://diary.imou.to/~AoiMoe/2001.03/middle.html#2001.03.15_s04
http://www.issei.org/diary/d200104c.html#22-1

にあるぞ。

30 名前:デフォルトの名無しさん :2001/08/16(木) 16:57
葵萌えさんの日記は直林禁止だったはずだが。

31 名前:デフォルトの名無しさん :2001/08/16(木) 17:15
直リン禁止なんて言ってる奴も守ってる奴もDQNだ。
検索エンジンに引っかかったらロボットに向かって文句言うのか?

32 名前:デフォルトの名無しさん :2001/08/16(木) 21:17
>>30
最新版の日記を見ると、上のほうに「逆リンクを許容できる場合に限り、リンク
はご自由に」と書いてあるよ。

33 名前:デフォルトの名無しさん :2001/08/16(木) 21:18
virtualの使いどころがわからないっす。
だから使ったことないデス…。

34 名前:デフォルトの名無しさん :2001/08/16(木) 21:48
>>33
ネタ?

本気なら「憂鬱なプログラマのためのオブジェクト指向開発講座」を
買ってきて読みましょう。C++ は言語仕様から勉強するとワケ分から
なくなるが、先にオブジェクト指向の分析・設計手法を勉強して、そ
れを実装に落とすための道具として見ると、簡単に理解できる。

35 名前:デフォルトの名無しさん :2001/08/17(金) 00:42
ネタでしょ。
本気で分からんやつは、一度Javaを使ってみるといいかもしれんね。

36 名前:オプションの名無し :2001/08/17(金) 04:30
いや、Effective C++の第6章35項を8回、読み直せ。

37 名前:デフォルトの名無しさん :2001/08/17(金) 09:12
>>32
あれ、最近のには書いてないね。
昔は、MLとか掲示板とか不特定多数からアクセスが殺到するような場所に
URLを貼らないで欲しいというようなことが書かれてあったような。

サイト引っ越して環境が変わったからよくなったのかな。ま、もう書いてないからいいや。

38 名前:デフォルトの名無しさん :2001/08/17(金) 10:38
>>35 Javaはすべてのメソッドにvirtualついているようなものだから
かえって意識しにくいと思われ、、、

39 名前:RIP_MAPIRO :2001/08/17(金) 13:32
Javaは純粋仮想関数、抽象クラス、匿名クラスでどうこう
って感じだからかえって混乱するかも。
33は継承パターンを自分で作って動作を追跡すれば理解が
進むと思う。特にディストラクタの virtual 宣言は多態性を
表現する上で重要。

40 名前:デフォルトの名無しさん :2001/08/18(土) 03:24
C++と直接関係無いんだけど質問。

みなさん日本語処理(や文字列処理)ってどうしてますか?
やっぱりAnsiString?

実は日本語コードの変換機能付きのストリングクラスを作ったのですが
一文字ずつ文字を追加する処理が遅くて困ってます。
string += 'A'; <- こんなの。

みなさんの文字列処理のやり方を教えてくださいませ。

41 名前:デフォルトの名無しさん :2001/08/18(土) 03:53
>>40
どこが遅くなるのか分かりませんが、変換は必要なときだけ
やればイイですよね。

42 名前:40 :2001/08/18(土) 04:18
>>41
はい、変換は必要な時だけしかやってません。

遅くなるのは・・・
1、約5000行(380KB)のテキストファイルを読み込んでコードを調べて変換
2、一行ずつに分離して文字列リスト(これも自作のクラス)を作成
3、全部の行から特定のキーワード(約10文字)を検索
って処理をした時に2番目の処理で3秒ぐらいかかってしまいます。

コード変換無しなら一瞬で終わるような処理なんですけどね・・・。

43 名前:デフォルトの名無しさん :2001/08/18(土) 07:41
>>42 一行ずつに分離して文字列リスト(これも自作のクラス)を作成
の部分で
>>40 一文字ずつ文字を追加する処理が遅くて困ってます。
という問題があるという話なら
コード変換は全く関係ないと思うんだけど

44 名前:40 :2001/08/18(土) 08:06
>>43
まったくおっしゃるとおりです。
実はもう改良済みです。

で、ホントに聞きたいのは「日本語処理ってどうしてます?」ってことです。
もしかして普通は特定の日本語コード決め打ちなのかなぁ?

45 名前:デフォルトの名無しさん :2001/08/18(土) 08:45
>>44
俺のWindowsプログラムの場合、
内部コードは ShiftJIS か Unicode で持っておいて
ファイル入出力の時に[必要なら]変換…だなぁ。

エディタを作るんでもなけりゃ、あんまり多文字コード対応にしても意味ない気がする。

46 名前:すみません :2001/08/19(日) 23:44
すみません。誰か教えてください。
引数宣言リストというのは何なのでしょうか?
お願いします

47 名前:デフォルトの名無しさん :2001/08/20(月) 00:44
>>46
どういう文脈で「引数宣言リスト」という単語が出てきたのかを書いた
方がいいと思うぞ。

48 名前:デフォルトの名無しさん :2001/08/20(月) 01:56
>>45
日本語EUCとSJISだけでも対応しておくと
フィルタ系のツールなんかで便利だと思うよ。
ソースのフィルタとかさ。

…コード処理出来る人って少なそうだけど。

49 名前:デフォルトの名無しさん :2001/08/20(月) 02:17
便乗なんですが
UTF-8 8 ビット Unicode 変換形式
ってなんですか?

50 名前:48 :2001/08/20(月) 02:44
俺もあんまり詳しく無いんだけど。

UCS4を1〜6byteに変換する形式だよ。

51 名前:デフォルトの名無しさん :2001/08/20(月) 05:25
>>49
googleで検索してみそ
utf8はビット数固定じゃないから嫌いなり
日本語テキストなら UCS2 で十分なんだよね
ごくごく一部の限られた人を除いてだけど

52 名前:デフォルトの名無しさん :2001/08/20(月) 07:13
ネットワーク関連でフリーのクラスライブラリとかってあるんでしょうか?
もし何かあれば教えて下さい。

53 名前:デフォルトの名無しさん :2001/08/20(月) 07:16
書き忘れました。
環境はLinuxもしくは*BSD*で使えるものを探しています。

54 名前:デフォルトの名無しさん :2001/08/20(月) 07:40
>>52
SourceForge を見てみたら?

55 名前:デフォルトの名無しさん :2001/08/20(月) 07:49
ちなみにここのエキスパートの人はネットワークの機能を実装するときは、
そういったライブラリ使わないんでしょうか?
Windows以外の場合の話ですが。。

56 名前:デフォルトの名無しさん :2001/08/20(月) 08:00
networkでなにをするか、によるのでは。
簡単なことならsocket直で叩くだろうし。
……v6対応があるから、そうでもないかな?

57 名前:デフォルトの名無しさん :2001/08/20(月) 08:04
socket直ですか、、、分かりました。
正直、ネットワーク関連のプログラムは初めてなので、
コネクションのプーリング機能なんかを実装したクラスとかが
あればいいなって思ってました。
勉強がてら自分で実装するのがよさそうですね。

58 名前:デフォルトの名無しさん :2001/08/20(月) 22:44
コネクションのプーリング機能なんかを実装したクラス
TCPは無理だよね?

59 名前:デフォルトの名無しさん :2001/08/20(月) 23:31
プーリングって何?pooling?
具体的に何の為に必要なの?

60 名前:デフォルトの名無しさん :2001/08/20(月) 23:33
オブジェクトを何回も生成しないようにじゃない
Cだったら何度もmallocしないようにって事かな?

61 名前:デフォルトの名無しさん :2001/08/20(月) 23:36
コネクションをプールするってのは・・・
クライアント側の発想かな
サーバーに対してサービスを要求するのに
わざわざコネクションをはりなおさないって感じかな?
実用的じゃないね

62 名前:59 :2001/08/20(月) 23:46
connectしたソケットをcloseしないでずーっと持っておくの?
だけどTCPって放置したら勝手に切断するんじゃなかったっけ?

63 名前:デフォルトの名無しさん :2001/08/21(火) 00:03
>だけどTCPって放置したら勝手に切断するんじゃなかったっけ?
そりゃないっしょ
そうだったら不便だな・・・

64 名前:デフォルトの名無しさん :2001/08/21(火) 00:05
>>62
プロトコルによるんじゃない?

65 名前:デフォルトの名無しさん :2001/08/21(火) 00:19
近くにあるネットワークスレに聞いた方がいいかな?わらい

66 名前:デフォルトの名無しさん :2001/08/21(火) 00:23
>>64
そうだね。
俺の知ってる範囲だと、大抵は自動的に切断する。
つーか、切断される。

67 名前:デフォルトの名無しさん :2001/08/21(火) 00:33
>>63
するよー。
RFC読むのはきついから、setsockoptのkeepalive辺りを読んでちょ。
UNIXの仕様じゃなくて、TCPの仕様だよん。

Solaris辺りはndd(1M)で変更可能。
*BSDやLinuxはシリアスな用途に使ってないから知らん。

68 名前:デフォルトの名無しさん :2001/08/21(火) 00:43
>>61
HTTP1.1

69 名前:デフォルトの名無しさん :2001/08/21(火) 01:17
プロトコルじゃなくて
サーバーによる、だと思う
けど、サーバーによって切ったり切られなかったりって
当たり前すぎる話に帰結してしまう

70 名前:デフォルトの名無しさん :2001/08/21(火) 01:21
>>69
> プロトコルじゃなくて

ってなんだ?TCPやHTTP 1.1の仕様読んだ事あるか?

71 名前:デフォルトの名無しさん :2001/08/21(火) 01:23
ないです
HTTP1.1では、
応答が何秒以上なければ、
コネクションを切る事
なんて書いてあるんでしょうか?

TCPの仕様なら納得できますが、
書いてあるならどこに書いてあるのか教えていただけませんか?

72 名前:デフォルトの名無しさん :2001/08/21(火) 03:19
>>71
8.1 Persistent Connections
19.7.1 Compatibility with HTTP/1.0 Persistent Connections
詳しい内容はRFC2068を読んでね。翻訳もあると思うし。

>>58
ACEのACE_Cached_Connect_Strategyでも参考にして自分で作ったら?
http://www.cs.wustl.edu/~schmidt/ACE.html
ちょと仕様過剰かも知れないので

73 名前:デフォルトの名無しさん :2001/08/21(火) 05:12
プリプロセッサの文字列置換に関して質問があります。

#define LIST_TEMP(type)           \
 ##type *insert_back(){            \
  ##type *elm = new (##type) [1];    \ (注*1)
  …                       \
 }                         \
 void *copy(const ##type &src){      \ (注*2)
  if(this!=&src){                \
   …                      \
  }                        \
 }                         \
↑のようなマクロ(リストのテンプレート)を作って、

class _my_list{
 LIST_TEMP(int);
 …
};
みたいに使おうと思っています。
ここで困ってるのが(注*2)のところです。
例えば(注*1)のところのnewの後の##typeは
new (int) [1] と置換されるので問題ありません。
しかし(注*2)のところはconstintと置換されてしまいます。
もちろんconst (##type) &srcとしてもエラーになるので
困っています。何か良い方法はないでしょうか。

74 名前:デフォルトの名無しさん :2001/08/21(火) 07:24
ど,どこでそんな書き方を憶えたのさ?(´Д`)
## を全部削ってみてちょ。

75 名前:デフォルトの名無しさん :2001/08/21(火) 07:52
const##type
これは?(自信なし

76 名前:デフォルトの名無しさん :2001/08/21(火) 07:53
すいません馬鹿でした↑

77 名前:73 :2001/08/21(火) 08:06
はうっ。
100回死にます…。

78 名前:73 :2001/08/21(火) 08:22
struct _xxx{
 int *elm0, *elm1;
} xxx;

#define elm(a,b) (*(a->elm##b))

hoge = elm(xxx,0);

ずっと↑みたいな使い方をしていたので前後不覚になりました。

79 名前:73 :2001/08/21(火) 08:25
78に書いたのは間違ってるけど雰囲気だけ…。
お礼を忘れてました。74さんありがとう。

80 名前:74 :2001/08/21(火) 08:38
私が関心したのは \ が縦にきちんと揃ってるトコロ。
練習したですか?

81 名前:デフォルトの名無しさん :2001/08/21(火) 11:13
>>73
何故templateを使わん?

82 名前:73 :2001/08/21(火) 11:34
>>74
はい。メモ帳で練習しました。(カット&ペースト)

>>81
とても大切な理由があった気がするのですが
思い出せません…。

83 名前:デフォルトの名無しさん :2001/08/21(火) 12:14
>>82
では、さっそくtemplateに書き換えるのだ。

84 名前:デフォルトの名無しさん :2001/08/21(火) 12:18
function objectってなんですか?

85 名前:デフォルトの名無しさん :2001/08/21(火) 12:18
動名詞のことですか?

86 名前:デフォルトの名無しさん :2001/08/21(火) 12:48
>>84
C++だとI/O manipulatorみたいなやつのことだろ?
どんな文脈で出てきたの?

87 名前:デフォルトの名無しさん :2001/08/21(火) 12:49
あ、I/O manipulatorは、streamを引数にとってstreamを返す関数なのね。
extern ostream& endl(ostream& outs);

88 名前:デフォルトの名無しさん :2001/08/21(火) 12:54
>>86
そうじゃなくて <functional> にあるような、operator() を定義し
てあるクラスのことだと思うが。<algorithm> で定義してある汎用ア
ルゴリズムと組み合わせて使ったりする。

関数的オブジェクトに関する詳しい話は「プログラミング言語C++」
に載ってるよ。

89 名前:デフォルトの名無しさん :2001/08/21(火) 16:53
>8.1 Persistent Connections
>19.7.1 Compatibility with HTTP/1.0 Persistent Connections
これは関係ないじゃん(笑)
TCPコネクションはったまま
何もしなかったらって話じゃないの?

90 名前:デフォルトの名無しさん :2001/08/21(火) 17:01
>>89
とりあえず、8.1.4 Practical Considerations読んでくれ。
いきなりは切らんがserver/clientどちら側からも切断する可能性があり、

Clients and servers SHOULD both constantly watch for the other side of
the transport close, and respond to it as appropriate.

とある。他にもいろいろ書いてある。

そもそも規約になくても、相手がいきなり切断して、
それが分からないようなclass libraryなんて使いたいのか?

91 名前:デフォルトの名無しさん :2001/08/21(火) 17:27
int main()
{
return 0;
}

これはアリですか?

92 名前:デフォルトの名無しさん :2001/08/21(火) 17:55
>>91
質問の意図がよくわからんぞぃ。

93 名前:デフォルトの名無しさん :2001/08/21(火) 17:59
蟻です。

94 名前:73 :2001/08/23(木) 05:42
>>83
いまtemplateに書き直して思い出した。
例えば↓みたいなテンプレートにすると

*************************************
template<class type>
class _list{
 _list<type> *next, *prev;
 …
 type elm;
};

class _elm{
 int var;
}

_list<_elm> xxx;
*************************************

リストxxxの要素にアクセスするときにxxx.elm.varってしないといけない。
マクロで書いておくとxxx.varってできるから楽(だと当初思った)。
OpenGLの描画プログラムを書いてるんだけど、
いま両方のフレームレートを測ってみたら0.2%ほどマクロの方が速かった…。
おとなしくテンプレートの方にしておきます。

95 名前:デフォルトの名無しさん :2001/08/24(金) 00:55
>>94
なんでSTLのlistを使わない?
下手な車輪を再発明するなよ。

96 名前:デフォルトの名無しさん :2001/08/24(金) 01:07
>>95
勉強中なら別にいいんでないの?

仕事で同じことをやるのは痛いけどね

97 名前:73 :2001/08/24(金) 08:54
一番最初にSTLのリストを使って書いたんです。
でイテレータの使い勝手が(慣れてなかったので)悪いなぁと思いながら
じゃあ自分で作ってみようとすったもんだしているうちに、
やっぱりSTLのリストはよくできてるなぁと思うようになった昨今。
もう一度書き直すことになりそうです。

98 名前:デフォルトの名無しさん :2001/08/24(金) 14:54
超初心者なのですが、ルート計算を行う関数はどのように定義したらいいのでしょうか。

99 名前:98 :2001/08/24(金) 15:00
>>98
あっ、わかりました。スマソ

100 名前:73 :2001/08/25(土) 08:40
std::listを使ってまた書き直した挙句、なぜ自前で実装しようとしたのか
本当の理由をようやく思い出した。(すごい回り道だ…)
長くなるけど、時間があったら何か指摘してもらえればうれしいっす。

例えば

−□−□−□−□−□−□−□−□−
↑      ↑
リンク    ノード
(エッジ)

という構造を作りたいとき(ノードが持つリンクは2つとは限らない)、

// ノード
class _node{
 list<_link> link; // 隣接ノードへのリンク
}
list<_node> node;

// ノードが持つリンク(要素は相手ノードへのポインタ)
class _link{
 _node *node; // 相手ノードへのポインタ
 _edge *edge; // リンクの別体へのポインタ(*ここが重要)
}

// リンクの別体
class _edge{
 _node *node0; // 端点0のノードへのポインタ
 _node *node1; // 端点1のノードへのポインタ
}
list<_edge> edge;

このとき、ノードn0とn1の間にリンクがあるかないかは

list<_link>::itr edge_detect(list<_node>::itr n0, list<_node>::itr n1)

みたいな関数で判断するんだけど
(つまり戻り値がn0からn1へのリンクのlistのイテレータになっている)
こうすることで

(*n0).link.erase(edge_detect(n0, n1));

みたいに消去できる。ここまではよし。

しかし今同時にリンクの別体list<_edge>も更新したい。
リンクの別体というのは全リンクのlistで、
これがないといちいち各ノードに対してリンクをサーチしないといけないから
2重にカウントされて遅い&不便。すると当然、

edge.erase((*edge_detect(n0, n1)).edge);

としたくなるけどこれは不可。なぜなら上の引数はlist<_edge>の
要素本体へのアドレスであり、list<_edge>のイテレータではないから。
つまり消したいedgeの要素本体のアドレスは知っているのに、
それをイテレータに直さないといけない点がとても非効率的だと思ったんです。
自前で実装すれば要素の操作はイテレータではなくてリストの上部構造(?)も
含めたアドレスで行えるから、ここで望むような操作が可能だなと。
いじょ。

101 名前:PeFileWrapper :2001/08/25(土) 10:42
>>100
途中から読み出したのでアレだけど、
そもそも、ノードの論理的な構造をそのままデータ構造にしようと
しているところに、 list<_edge> edge の必要性を生み出している
原因があるような気がするんだが...。

要は、 list<_edge> edge をどうするか…でしょ?
漏れなら、単に _node の可変長配列を(テンプレート)クラスにして、
ノード間のつながりは隣接点行列を作るなりして仮想化させると思うな。


目に見えるものすべてを「実体」として実装しようとするから、
話がややこしくなるのでは?

102 名前:デフォルトの名無しさん :2001/08/25(土) 12:46
list< list<OneType> > hoge;
のようにするのは駄目なの?

103 名前:73 :2001/08/25(土) 14:54
うぅ。ありがとう(泣)。

>>101
>漏れなら、単に _node の可変長配列を(テンプレート)クラスにして、
>ノード間のつながりは隣接点行列を作るなりして仮想化させると思うな。

当初は

// ノード
class _node{
 list<_node*> link; // 隣接ノードへのリンク
};

のように実装していました。これが>>101で言わんとすることかな。
(というのを前提に話を進めると)
そうすると、例えばリンクを描画するときにn0→n1とn1→n0という
同じリンクを2重に描画することになっちゃうのがイヤンだったのです。
もちろん描画済みか否かの条件文を入れればいいんだけど、
要素の数が増えてくると計算速度に結構効いてくるので
リンクの別体(実体)を考えて重複をなくそうとしたのです。
答になってるかな…。

>>102
駄目な気がする。理由は…ぅぅ頭が割れそうだ…。

104 名前:sage :2001/08/25(土) 16:00
class obj {
public:
virtual draw();
};

class link : public objs {
node *pnode[2];
public
draw();
};

class node : public obj {
list<link*> linklist;
public
draw();
};

list<obj*> objects;

こういうこと?

105 名前:101 :2001/08/25(土) 17:39
>>103
あぁ、なるほど、リンクを描画したいわけね。それも効率よく。

計算するのが何なのかわからずに書いてしまうけど、
ノードを可変長配列として実現しておいて、
あらかじめ隣接点行列 bool isConnected[length][length] を
準備しておくと、

for (i=0;i<length-1;++i){
 for (j=i+1;j<length;++j) {
  if (isConnected[i][j]) {
   (計算とか);
   (描画とか);
  }
 }
}

で、できるような気がするんだけど。

106 名前:73 :2001/08/25(土) 20:05
>>104
この場合、ノードがリンク先をサーチしようとするときに、
『リンクの両端を見た上で自分じゃない方が相手』、
という余計な判断が入るから少しうれしくないです。

>>105
いま書いてるのは1000個以上のノードがバネ(=リンク:1000〜2000本)
で繋がれてグリングリン動くプログラムなんだけど、
隣接点行列でやると数十倍遅くなってしまうです…。
いまのところはノード数10000、リンク数10000(リング状)の
ばねアニメーションがFPS30ちょいで動いてます。

107 名前:105 :2001/08/25(土) 21:24
>>106
> 隣接点行列でやると数十倍遅くなってしまうです…。
ふぅ〜ん、そういうもんかなぁ..。

力になれなかったな。スマソ。

108 名前:sage :2001/08/25(土) 21:48
>106
いや、もうちょっとコード見てくれよ..
s/objs/obj/g

109 名前:73 :2001/08/26 08:42
>>108
あ、objsとobjがある…。
ごめん。まだよく理解できないから少し考えてみる。

110 名前:73 :01/08/26 09:10
それと補足だけど、各ノードはどんどん繋ぎ変えてリンクの状態が変わるから、
特定のノードが持つリンクの相手をできるだけ高速にサーチしたいです。
この繋ぎ変えの処理に関しては>>101にあった方法が一番速いんだけど、
同時に高速に描画も行おうとするとまたトレードオフが出てくるです。

ちなみに今リンクの本数をL、ノード数Nとすると、
存在し得る最大リンク数N(N-1)/2に比べてLが圧倒的に小さい条件(L∝N)で
やってるです。隣接点行列で判断すると計算時間はL∝N^2になるので
おいらがやってる条件に限って言えばキツイということです。

111 名前:デフォルトの名無しさん :01/08/28 22:42 ID:upwimQHI
初めてなのですが、質問させてください。

domain_errorって何なんでしょうか?
どんな関数が投げるものなんでしょうか?

112 名前:デフォルトの名無しさん :01/08/29 20:34 ID:QWMYzaCI
>>73
よくわからんけど、参照カウンタ付きのProxyをCompositeパターンで
リンクすればいいのではないの?
俺が勘違いしているかも知れんけど、それはともかくとしても、
73の設計にはオブジェクト指向の香りがしないよ。
デザインパターンの本をよく読むことをおすすめする。

113 名前:名無し :01/08/30 02:00 ID:1nQFo/p2
>>73
重複しない走査を実現するための特別な構造が
必要で、リストでは駄目ということなのでは。
自分で「サーチ」と言っているし。

114 名前:デフォルトの名無しさん :01/08/30 02:09 ID:1YbMhqvE
>>111
これってexceptionでlogic_errorなdomain_errorのこと?

115 名前:デフォルトの名無しさん :01/08/30 13:24 ID:msKDCwik
>>114
そうです。

116 名前:デフォルトの名無しさん :01/09/05 23:10 ID:5S9xtZF2
C++の反復子ってなんですか?

117 名前:デフォルトの名無しさん :01/09/05 23:16 ID:pPFDzhN.
走査子

118 名前:デフォルトの名無しさん :01/09/08 00:05
ほぇ

119 名前:デフォルトの名無しさん :01/09/08 00:57
>>115
logic_error自体は、引数チェックみたいな「runtimeじゃない」
例外のための基底クラス。

ある関数を呼び出すとする。
runtimeじゃないっていうのは、プログラミングをしている
時点で例外が起こらないように、関数の呼び出し側で
コントロールできるってこと。

runtimeエラーの代表的なものにout_of_memoryがあるわけだが、
ある関数を呼び出すのに、out_of_memoryにならないように、
っていうのは「プログラミングの時点では」コントロールできない。
だからruntime。で、logic_errorはそうじゃないやつ。

domain_errorってのは、length_errorとかout_of_range_error
とか、invalid_argumentではない、ソフトウェアの「対象ドメイン
特有の事前条件」に違反した場合に投げるべき例外。

基底クラスとして用意されているだけで、標準ライブラリの
中を捜しても多分使ってるところはないのだと思う。

下手な説明でスマソがわかる?

120 名前:デフォルトの名無しさん :01/09/08 00:58
繰返子

121 名前:111=115 :01/09/08 03:22
>>119レスどうもです。

ええと、、実はexceptionなやつのほとんどが
いまいちよくわかっていないのですが…。
logic_errorはちゃんとやってれば防げるはずのエラー?
runtime_errorは、メモリ不足とか、ファイルが無かった、
などの時に投げるのでしょうか。。

domain_errorはlength_errorとかに当てはまらない
logic_errorのときに投げることになるのでしょうか?
あと、基底クラスとして用意されているだけということは、
domain_errorはそのまま投げないで、domain_errorを
継承したクラスを投げたほうが良いのでしょうか?

それから、range_errorとout_of_rangeの
違いがいまいち分かりませんです…。
logicかruntimeかの違いでしょうか…?

122 名前:119 :01/09/08 04:27
回答がテキトーだったことを謝罪する。スマソ(鬱。

漏れの解釈では、out_of_rangeは添え字の範囲外エラーの類、
range_errorは、オーバフロー、アンダーフローの類だと思っていた。
(10まで入れていい数字で11というような値そのもののエラー)

考えて見れば根拠を示せない(鬱

> domain_errorはそのまま投げないで、domain_errorを
> 継承したクラスを投げたほうが良いのでしょうか?

標準例外自体、全てがexceptionから派生している、
というわけではないから、標準ライブラリのユーザーに
Javaのようなやり方を推奨しているわけではないと
考えている。

domain_error自体、インスタンスを作ることが認められていない
わけではないからそこをどうするかは、個々のプログラムでの
設計上の判断次第だと思う。
継承することによって、設計上の利点があるならば、、だ。

漏れはポリモーフィックに扱う必要がない場合は、極力継承は
使いたくないが。

123 名前:デフォルトの名無しさん :01/09/08 10:51
ド初心者ですが、教えてください。
C++を学習してるのですが、
コードを書いてみようとVC++を使ってやってみたのですが、
BOOLとかstringとかが使えません。
こういったものを使えるようにするには何をインクルードする
必要があるのでしょうか?iostream.hじゃだめなんですかね。
string.hをインクルードしても標準ライブラリのstringが使え
ないし・・。

124 名前:デフォルトの名無しさん :01/09/08 11:19
>>123
#include<windows.h>
#include<iostream>
#include<string>
namespace using std;

125 名前:123 :01/09/08 11:29
>>124
レスどうもです。いまからやってみます。
ところでwindows.hは何のためですか?

126 名前:123 :01/09/08 11:38
だめでした^^;。
iostreamやstringは確かに本とかでは.hついてないのですが、
つけないと開けないというエラーがでます。で、付けてコンパイル
すると

構文エラーusing
string 定義されてない識別子です

などが出ます。ちなみにこんな感じで書きました。

#include <iostream.h>
#include <string.h>
#include <windows.h>
namespace using std;

void main()
{
string a;
}

なんででしょう。

127 名前:デフォルトの名無しさん :01/09/08 11:40
std::string a;

128 名前:デフォルトの名無しさん :01/09/08 11:49
using namespace std;
じゃないのか?

ちなみにBOOL型はWindows固有の型。
C++汎用のはbool。

129 名前:デフォルトの名無しさん :01/09/08 11:50
BOOLのためだけにwindows.h入れるのかい
C++なら標準はBOOLでなくてbool

130 名前:129 :01/09/08 11:50
だぶった遅かった(´д`;)

131 名前:デフォルトの名無しさん :01/09/08 12:24
おれのマソコマークがいっぱい書き込まれた「独習C++」を
あげるから、基本からやり直すこと!!>1

132 名前:デフォルトの名無しさん :01/09/08 12:25
1じゃなくて123だった。。。鬱だ

133 名前:123 :01/09/08 13:21
using namespace std;
にしてみると、
'std':存在しないか名前空間ではありません。
と出ました。
なんでやねん・・・。
標準のC++やりたいだけなのに・・・。
boolすら使えません。

134 名前:123 :01/09/08 13:22
そういえばcoutとかsinもstdですよね。
それらはstdとか使わなくても使えるンですが・・・。
iostream.hを取りこむだけで。

135 名前:デフォルトの名無しさん :01/09/08 13:32
#include <iostream>
#include <string>

using namespace std;

int main()
{
string a;
return0;
}

まずは一通り、「最近発売された」 C++ の参考書を読むことをおすすめする。
90 年代後半に大きく C++ の規格が変わってるから。

136 名前:通行人 :01/09/08 13:35
#include <string>
#include <iostream>
using namespace std;
int main(){
  string s = "Hello, World!\n";
  cout << s << endl;
  return 0;
}
たったこれだけ貼り付けても動かんか?BCCではOK。VCは知らん

137 名前:通行人 :01/09/08 13:37
カブッタ...鬱氏

138 名前:123 :01/09/08 13:48
あ、もしかして・・・。
私が使ってるVC++がおもいっきり古いからでしょうかね・・・。
4.0です(藁。
実際、コードを書いてくださった方のをそのまま貼り付けても
だめでした。なにせ#include<string>の時点でダメなんです
から(藁。.hを付けないとダメなのでおかしいとは思っていま
したが。今のVC++の最新は7ぐらいっすかね。買ってこないと。

139 名前:デフォルトの名無しさん :01/09/08 13:55
SDKでいいよ。そのレベルなら。
もうちょっとレベルアップしてからの方がありがたみがわかる

140 名前:デフォルトの名無しさん :01/09/08 14:03
cygwinで十分だろ。
nestしたtemplateとか書けないけどな、gccはまだ。

141 名前:デフォルトの名無しさん :01/09/08 14:21
C++で初めてゲームつくってて、カメラのクラス作ってんだけど、
そこには視点とか、カメラ位置とかそういうメンバがあって、
でカメラの変換行列とかをGetするメソッドがあってって感じなんだけど、

それで、あるスコープでインスタンス作って、位置とか設定してカメラの行列
ゲットして3次元計算して、ってやるのはいいんだけど、
その他のスコープにいったら、またインスタンス作って位置とか視点とか
設定しなおしになるよね。

こういうときはグローバルにインスタンス作ればいいの?
でもなんかそれきもちわるい。

というかそもそも設計がおかしいの?

誰か教えてください。

142 名前:デフォルトの名無しさん :01/09/08 14:22
boolのサポートはVC5あたりからだと思う(´д`;)
VCがいいならMSから.Net framework SDK落とすか
gccでも使うかBCCにするか好きなのにすれ、全部ただだ

143 名前:sage :01/09/08 14:29
>>141
そういう用途なら位置と視点は別クラスじゃないの?

144 名前:デフォルトの名無しさん :01/09/08 14:37
>>143

カメラ位置って3次元ベクトルです。
視点(フォーカス)も同様に3次元ベクトルです。
それをクラスにするのでしょうか。
どういうことでしょう。
私がよくわかってないのかもしれません。

別クラスにしたとして、グローバルに持っとけばいいのですか?
というか、そこが一番ききたいところなのです。

他のスコープでも扱うものをどうしたら良いのかというところが。

145 名前:デフォルトの名無しさん :01/09/08 14:47
初歩的な質問なんですが、
イニシャライザに可変個引数を渡すのってどうやるんでしょうか?
B::B(char *format, ...) : A(format, ...) {}
こんな感じでやってみたんですがやっぱりだめでした・・・。

146 名前:デフォルトの名無しさん :01/09/08 14:52
>>145
可変個引数を使ってどうしたいかの方に興味がアリマス。

147 名前:注某厨房 :01/09/08 15:02
VC++を始めようと思うのですが、C/C++共に初心者です。
Cをある程度理解してからC++に入ったほうがやりやすいでしょうか。
それとも、余計なこと考えずにC++入ったほうがすんなりいくものでしょうか。

個人的見解で充分ですので、ご鞭撻を。

148 名前:デフォルトの名無しさん :01/09/08 15:16
>147
手段なんかどうでもいいから、
何か作れ
作りたいものがなにも無いってんなら、
やめろ

149 名前:デフォルトの名無しさん :01/09/08 15:48
>>147
C を理解することはコンピュータの原理を理解することに限りなく近いです。
どちらかというと C++ はその原理を覆い隠すようなとても「便利」な
仕組みがいっぱいあります。しかしながら C++ は便利すぎて、
その「仕組み」を 100% 使うには膨大な勉強と経験が必要です。

したがってお勧めとしては、まず C でコンピュータの仕組みを理解し、
その後で Java で C++ の基礎となる概念を学び、
そして C++ もしくは C# を学習するのが良いと思います。

とは言え何よりも大事なことは、>>148 さんも言ってるように、
作りたいことは何か? ということです。
作りたいものがあり、それを作るのに適した言語を選べるくらいになれば、
とても幸せなプログラマ生活が待ってるでしょう。
「作りたいものは何か」、これを大事にしてくださいね。

150 名前:デフォルトの名無しさん :01/09/08 16:12
Cの勉強つったって、たいがいはいきなりそこで挫折する(w

151 名前:デフォルトの名無しさん :01/09/08 17:24
最初にJavaを学ぶと、Java厨になってしまい、
決してC++やCなどに戻ることはできない。
C#は似てるから、強制力があれば可能かもしれない。

152 名前:デフォルトの名無しさん :01/09/08 18:19
CとC++でいいじゃない。

153 名前:123 :01/09/08 18:40
>>139
SDKって何の奴ですか?

154 名前:デフォルトの名無しさん :01/09/08 20:22
>>123
コンパイラのエラーにヘルプがついてるのを知ってるか?
当然十分な情報がるわけではないが、チェックすべきだぞ。
アウトプットウィンドウのメッセージだけ見たところで止まってないか?
CXXXX:の番号のところを選択してF1キー押すか、ヘルプのキーワードに
番号いれてみ。

155 名前:注某厨房 :01/09/08 20:30
>作りたいもの
今のところ、最終的にはVC++で自分向きの
ファイラーを作りたいと思っています。
けど、どうせやるのなら基礎からの方がいいかなと思って。
過去にも何度かやろうかと思ったことはあったのですが、
今回は腹をくくってますのでやる気だけはあります。
# もっとも、できるかどうか自信はないですが(汗

出来ればエディタも作ってみたいと思っていますが、
既存のフリーソフトとかのレベルまで追いつけるかどうか(汗
# 学習の一つとしては作ってみるかもしれませんが。

>>149
なるほど。なんとなくCやってから方がいい気はしてました。

皆さんの言う通り、以前にJAVAに手を出そうとして
やりたいことが無いのに気付いて、結局何もしなかったのと、
過去ログ(このスレに限らず)を見て目標は大事だと思いました。

>>151
危なかったッス(w

ありがとうございます。

156 名前:デフォルトの名無しさん :01/09/08 22:07
>>149
>C を理解することはコンピュータの原理を理解することに限りなく近いです。

それ言い過ぎと違う?
C学んだら、コンピュータの原理なんて理解できるかなあ。
せいぜいメモリ、CPUの割り込みとかぐらい?
それとも俺がバカ?

157 名前:デフォルトの名無しさん :01/09/08 22:21
一直線のメモリがイメージできるって意味だろ。
プロセスごとの境界はあるにしてもね。
VBとかスクリプトじゃ永遠にそういう考えには
いたらないな。

158 名前:デフォルトの名無しさん :01/09/08 22:22
じゃあメモリの原理(?)がわかるってことじゃん。
コンピュータじゃなくて。

159 名前:121 :01/09/08 22:23
>>119ありがとうございました。。

160 名前:デフォルトの名無しさん :01/09/08 22:25
>>141

私は、グローバルにインスタンス作ってやっています。
確かになんかいやですね。
私も初心者なのでよくわかっていませんが。

私も知りたいです。どなたか教えてください。

161 名前:デフォルトの名無しさん :01/09/08 22:54
>>156
>>149は哀れな勘違いだろ。
ALU内部で乗算・除算処理がどう行われているかを理解するのと
Cとかの高級言語を理解するのは全く別だからな。
そもそも149はCMOSの仕組みについて分かっているのか?
オーバークロックとかのたまって、規定よりも高い電圧をCPUにかけている
ドキュソじゃないだろうな(w

162 名前:デフォルトの名無しさん :01/09/08 23:03
自作のヘッダーファイルで作ったクラスを
グローバルで確保するにはどうしたら良いんですか?

#include"zisaku.h"

someclass *pt;
pt = new someclass;

グローバルで宣言するとエラーが出てしまいます。
他のクラスや関数内ではエラーがでません。
どうしてグローバルだとエラーが出てしまうのでしょうか?

163 名前:デフォルトの名無しさん :01/09/08 23:06
>>141, >>160
今の設計でも、その[位置]とか[視点]とかの情報はローカルスコープ外に
持たせてるんでそ?それと同じところで[カメラ]も管理すればいいんでないの?
どんなゲームやらわからんのでなんとも言えないけど、キャラクタ毎に持つなり
シーン毎に持つなりレンダリング用のクラスが持つなり。

164 名前:デフォルトの名無しさん :01/09/08 23:07
>>162
グローバルスコープには制御構文を書けない。

165 名前:デフォルトの名無しさん :01/09/08 23:11
>>164
ありがとうございます
pt = new someclassが駄目だったんですね
基本的な質問で申し訳ありませんでした

166 名前:123 :01/09/08 23:35
>>154
そういうやり方があったんですねぇ・・・なるほど。
でも、今回の原因は私のVC++が古いためであると思われます。
仕様がけっこう変わったんですね・・・。
新しいコンパイラ買わないと。
でも金かかるんでしょうね、はぁ。

167 名前:154 :01/09/09 00:37
>>166
VC++5.0でエラーでてるソースがVC++6.0で通ったり(vv
「それでいいのか、おい?」って。

168 名前:デフォルトの名無しさん :01/09/09 00:47
>166

#include <string.h>
#include <iostream.h>

int main(){
 string s = "Hello, World!\n";
 cout << s << endl;
 return 0;
}

169 名前:デフォルトの名無しさん :01/09/09 00:49
>>163
もしかして、カメラだけ特別扱い?
Worldを頂点とする、オブジェクトツリーの中の、
1つのオブジェクトとして定義するのが普通では?

逆行列さえ求められれば、どんなオブジェクトもカメラになりえるし。

170 名前:141 :01/09/09 01:02
>>163
アー、参考になります。
確かにレンダリング用のクラスでカメラクラスのインスタンス持っとけばいいな。

位置とか視点とかはカメラクラスのメンバです。

どんなゲームでどうこう、というよりも、
一般的な座標変換のことです。


>>169


あー、それも参考になるなあ。
カメラクラスって言うのが不自然なのかなあ。

171 名前:デフォルトの名無しさん :01/09/09 01:05
>>168 +これも。
----
#include <string>
#include <iostream>

int main(){
 using namespace std;
 string s = "Hello, World!";
 cout << s << endl;
 return 0;
}
----
#include <string>
#include <iostream>

int main(){
 std::string s = "Hello, World!";
 std::cout << s << std::endl;
 return 0;
}

余談だが、<iosfwd>も知れ。

172 名前:デフォルトの名無しさん :01/09/09 01:15
>>171
本題とずれるが operator=() 呼び出すより、コンストラクタに引数
渡したほうが良くないか?

string s = "Hello, World!";
string s("Hello, World!");

173 名前:123 :01/09/09 01:19
>>168
>>171
コンパイルしましたが、全滅です^^;。
上にも書きましたが
#include<iostream>
#include<string>
はだめで、.hを付けないとファイルをオープンできません。

それとstring.hをとりこんでもstring宣言すると、stringは定義
されてない識別子というエラーになります。
using namespace std;
とすると、stdは存在しないか名前空間ではないとエラーがでます。
これはコンパイラが古いせいで、解決法は無いと思われます。

174 名前:デフォルトの名無しさん :01/09/09 01:23
しつもぉ〜ん
VC4.0って、STL付いてるの?
iostreamだけじゃないの?

175 名前:デフォルトの名無しさん :01/09/09 01:24
http://www.stlport.com/
4.0に対応してるかはしらないけど、
ここで落すべし。

string.hは、cのヘッダだろ(藁

176 名前:123 :01/09/09 01:29
ということはC++のstringは無いってこってすか??

177 名前:デフォルトの名無しさん :01/09/09 01:48
>>172
この場合はoperator=呼ばれないんじゃないの?
代入じゃなくて初期化として扱われると思ってたけど。。

>>173 >>174 >>175
入ってないものは仕方ないな。VC++のヘッダディレクトリ見て、
存在してなかったらコンパイラがどうとかいう必要ないな。
stlportは、本家よりいいという噂もあるしな。
漏れは、Plaugerのソースが性に合ってるが。

178 名前:デフォルトの名無しさん :01/09/09 02:29
質問なんですけど、

char a = 'a';
cout << int(a); //文字じゃなくて数値を表示

このint(?)は何ですか?マクロかなんかですか?
それとこの場合、(int)aのようにキャストしても大丈夫みたいですが、
int(a)と(int)aの違いは何ですか?

179 名前:デフォルトの名無しさん :01/09/09 02:33
>>178
int(a)はC++固有のキャスト構文
(int)aでも問題ないけど。
詳しくは参考書読み返して

180 名前:デフォルトの名無しさん :01/09/09 02:46
typename(expression)は、プリミティブな型に使う明示的型変換構文。
マクロっていうよりは演算子。

Cでは使えなかったかも、ってのとポインタへ型への変換
には使えない、ってのが違うはず。効果は同じだと思うが。
static_cast<int>(a)とかの方が好きだが。

181 名前:180 :01/09/09 02:47
かぶった(鬱

182 名前:デフォルトの名無しさん :01/09/09 03:15
>>172
177 が正解。

183 名前:172 :01/09/09 04:12
>>177 >>182
そうなのか。勉強になったよ。

184 名前:178 :01/09/09 07:33
>>179
>>180
そうですか。ありがとうございます。
しかし、違いがポインタ型への型変換ができないということだけなら、
最初からキャストがあるわけなので、意味が無いように思える
のですがね。なんでC++でこんなの作ったんでしょうかね。
まあいいけど。

185 名前:デフォルトの名無しさん :01/09/09 07:48
>>184
あれってコンストラクタの構文と同じだよね。
C++(の作者)的には、コンストラクタとキャストを同一視したかったのだと思う。
ある型の値を与えられて「それと同等だけど別の型の」ものを生成するってのは
コンストラクタ(の使われカタの一部)とキャストとは似てるので。

で、そうしたまではいいが、hogehoge*みたいなメタ型に構文的に適用不可能という辺りが、間抜けだ。
ポインタ型への変換に使えないんじゃなくて、「1単語で表現できない型」に使えないんじゃなかったっけ?
だからたとえば、ポインタだってtypedefしとけば、その別名でtype()なキャストがやれる。

すげーどうでもいいが、Pascal/Delphiはこの構文だ。
Pascalはhoge*みたいな1語で表現できない型を使うのを許してない
(ほぼ常にtypedef相当を書かないとならない:だから面倒(藁))
ので、これで問題ないわけね。

186 名前:デフォルトの名無しさん :01/09/09 09:12
>>180
typedefしてればポインタ型もOK。*が構文中に使えないだけ。
typedef int* pint;
pint pi = pint(&i);

187 名前:デフォルトの名無しさん :01/09/09 09:43
メモリ最適化ツールって、どうやってるの。
例えば192MBのメモリがあったら192MB全部確保しちゃうの?
でもそれ、できなくない?

188 名前:デフォルトの名無しさん :01/09/09 10:13
またDel厨が・・・

189 名前:デフォルトの名無しさん :01/09/09 10:17
そんなにいわないでよ

190 名前:デフォルトの名無しさん :01/09/09 10:36
static_cast<>
dynamic_cast<>
reinterpret_cast<>
const_cast<>
あとなんかあったっけ?

誰か、これらの違いをわかりやすく説明してよ。
それぞれどういう場面で使うのかも。

191 名前:デフォルトの名無しさん :01/09/09 10:42
サーチエンジンで検索すればいいのに・・・

192 名前:190 :01/09/09 10:51
あ、そ。
つまんないネタで悪かった。

193 名前:デフォルトの名無しさん :01/09/09 11:37
>>190
このうち使い分けが微妙なのは static_cast<> と reinterpret_cast<>
だと思うけど、MSDN のコラムが詳しく説明してる。

http://www.microsoft.com/japan/developer/library/dsmsdn/deep05182000.htm
http://www.microsoft.com/japan/developer/library/dsmsdn/deep06012000.htm

194 名前:デフォルトの名無しさん :01/09/09 11:49
・dynamic_cast<>
Javaのキャストと同じ

・const_cast<>
const指定を除去する。型変換はできない。

・static_cast<>
dynamic_cast<>の逆をする。

・reinterpret_cast<>
Cのキャストと同じ。危険物。

あってる?

195 名前:190 :01/09/09 11:55
>>193
ありがとう。そこ面白かった。
static_cast<T> では operator T() が呼ばれることがあるけど、
reinterpret_cast<T> では常にビットパターンそのまま
ていうのが決定的な違いなのかにゃ?

>>194
君も 193 のリンク先を呼んだ方がいいぞ(藁

196 名前:180 :01/09/09 16:17
サンクスコ オモシロカターヨ > 各位
ついでだから漏れも質問。

struct HogeImpl; // class HogeImpl
struct Hoge{
 HogeImpl* _pimpl;
};

ってやった場合、先行宣言でstruct/classにしてしまった場合、
HogeImplにテンプレートインスタンスな構造体/クラスを使えない
ようなのだが、これって回避可能?
コンパイラはVC++5.0/6.0あたりなんだけど。

やりたいことは、DLLの外側にテンプレートインスタンスな
クラス/構造体を出したくないから、何かかぶせよう、って
ことなのだけど、これはC++スレ本来からは外れる気がするので
とりあえず、最初の疑問のみ回答キボンヌ。

197 名前:デフォルトの名無しさん :01/09/09 17:01
>>196
宣言の仕方が悪いだけのような気もするが...。

198 名前:デフォルトの名無しさん :01/09/09 21:29
列挙型の値の範囲ってありますよね?
あれって何の意味があるんでしょうか。
例えば

enum e{ a=1, b=3, c=5, d=9};

の場合、上限は15で下限は0ですよね?
この上下限て何かに役に立つのですか?

それと、列挙値に負数が含まれる場合の下限値の計算方法を
教えてください。

199 名前:デフォルトの名無しさん :01/09/09 21:34
なんで?
列挙型ってintでしょ

200 名前:デフォルトの名無しさん :01/09/09 22:04
>>196
HogeImpl には純粋仮想関数だけ持たせておいて、

template <typename T>
class Foo : public HogeImpl
{
};

で、良いんじゃない?

201 名前:デフォルトの名無しさん :01/09/09 22:12
>198-199
が何言ってるのか分からないのは俺だけか

202 名前:196 :01/09/09 22:53
>>200
サンクス。いや、実際今のところそんな感じにはなってるんだ。
結局typedefとかではダメで、サブクラス化が必要なのかぁ、、
素直に通らないのにはなんか理由があるのかなぁ、
というより漏れがやろうとしていることの方が素直じゃないんだね。。

structテンプレートの変数が全部解決されたら、それは
もうstructだろう、と漏れはいいたいのだが。
なんかできそうな気がするんだけど。

>>197 正しい宣言のしかたキボン。

203 名前:デフォルトの名無しさん :01/09/09 23:03
>>198
設計上ビットサイズが意味をもつ場合には、なんか使い途
があるのかもね。でもenumの使い方としてはやや本筋を
外れるかもしれない。

少し長いがプログラミング言語C++ 第3版 日本語訳から、、
--
列挙子は、整数データ型の定数式により初期設定できる。

列挙の上限は、列挙に含まれるすえての列挙子の値よりも
大きい2の累乗値マイナス1の中で最も小さい場合である。

列挙の下限は、列挙子の最小値が負数でない場合には0、
列挙子の最小値が負数の場合には、それより小さい
2の累乗値プラス1の中で最も大きい値である。

これは、列挙の値を保持できる最小のビットフィールド
のサイズである。

204 名前:198 :01/09/09 23:19
>>203
ビットサイズはenumの設定値によって違うということですかね・・・。

それと
>列挙子の最小値が負数の場合には、それより小さい
>2の累乗値プラス1の中で最も大きい値である。
の部分ですが、私はアホなのでよくわからんのですが、
例えば最小値が−10だったらどういう計算になるのでしょう?
最大値の方はわかるのですが・・・。

205 名前:デフォルトの名無しさん :01/09/09 23:26
このプログラムがなぜエラーになるのかわからないです。
o[i].hoge()だとコンパイル通るんですが。

#include <iostream>
using namespace std;

class A
{
public:
    void hoge(){ cout << "hello\n"; }
};

int main()
{
    A* o;

    o = new A [3];

    for( int i = 0;i < 3; i++ ) o[i]->hoge();

    delete [] o;

    return 0;
}

206 名前:デフォルトの名無しさん :01/09/09 23:31
>>205
o[i]が、A&なんじゃないの?

207 名前:デフォルトの名無しさん :01/09/09 23:36
o = new A;だと
o->hoge();でいけるんですが。

配列だと参照になっちゃうんdすか?

208 名前:デフォルトの名無しさん :01/09/09 23:47
>>207
operator[]使った時点でderefされてるのが普通だと思えるよ。
たしかにoperator new[]はvoid*返すんだけど。

int* a; でa[i]ならポインタでなくてint値が返るだろ?
o->hogeの配列版は(o+i)->hoge()じゃない?

209 名前:デフォルトの名無しさん :01/09/09 23:48
>>205
o は A の配列 (配列の名前)
o[i] は A 型のオブジェクト
だからメソッドを呼ぶときは o[i].hoge() でいい。


A * o = new A; だと
o は A 型のオブジェクトへのポインタ
だから o->hoge() でメソッドを呼ぶ

210 名前:205 :01/09/10 00:45
なるほど。どうもです。なんかややこしいな。

211 名前:初心者です :01/09/10 02:33
超初心者の質問です。
Cでmallocとかでメモリを確保した後、きちんとfreeしてあげないとだめなんですか?
すごくめんどくさくて別に問題ないのならやりたくないんだけど。
ちなみにOSはLinuxです。
教えてください。

212 名前:デフォルトの名無しさん :01/09/10 02:46
>>211
C++ じゃなくて C の話題のような気がするが…ともかく。

free() すると、free() したメモリが malloc(), realloc() で再利用可能になる。
もし何度も malloc() を行うプログラムなら free() しておくと使用メモリ量を
抑えられる。

サーバプロセスのように 24 時間実行されたり、エディタのようにいつまで実行
すればいいのか分からんアプリケーションで何度も malloc() する場合には
free() 必須。さもないとメモリを食いつぶしてしまう。

短期間だけ実行してすぐに終了してしまうプロセスや、malloc() で確保する
メモリ量が限られている場合には free() せずに終了して構わない。free()
していないメモリ領域も含めて、プロセスが使っていたメモリは OS がまとめ
て回収するから。

関連スレッド
始まった!malloc and free - fj.comp.lang.c
http://mentai.2ch.net/test/read.cgi?bbs=prog&key=981051921

あと free() するのが面倒だと感じるなら、ガベージコレクタを使っても良いよ。
プログラム中から参照されていないメモリ領域を勝手に free() してくれる。

BoehmGC
http://reality.sgi.com/boehm/gc.html

213 名前:デフォルトの名無しさん :01/09/10 03:12
>>211
>>212の手段の他に、処理系依存だけどallocaってのがある。
(処理系依存といってもほとんどの処理系に存在する)
これはスタック領域を使うんで、開放は必要無い。
でも呼び出せる場所に制限があるかも知れない。
システムに要求を出すわけではないから、
mallocより多少効率が良いかも知れない。
関数を抜けると開放されるので、永続的な用途には向かない。

214 名前:デフォルトの名無しさん :01/09/10 05:25
>211
>>210はネタのような気がするが

215 名前:デフォルトの名無しさん :01/09/10 05:25
ずれた
>>211-212

216 名前:デフォルトの名無しさん :01/09/10 12:31
> >>210はネタのような気がするが

VB野郎なんじゃないの?

217 名前:超初心者 :01/09/10 12:43
211です。
C++のスレッドと知らず書き込んでしまいました。
すみません。

212,213さんありがとうございます。
free()の意味がわかりました。
さんきゅーです。

ちなみにこれはネタじゃないんです。
本当に超初心者なだけです。

218 名前:小町算 :01/09/10 15:46
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i, s, sign[10];
long n, x;

for (i = 1; i <= 9; i++) sign[i] = -1;
do {
x = n = 0; s = 1;
for (i = 1; i <= 9; i++)
if (sign[i] == 0) n = 10 * n + i;
else {
x += s * n; s = sign[i]; n = i;
}
x += s * n;
if (x == 100) {
for (i = 1; i <= 9; i++) {
if (sign[i] == 1) printf(" + ");
else if (sign[i] == -1) printf(" - ");
printf("%d", i);
}
printf(" = 100\n");
}
i = 9; s = sign[i] + 1;
while (s > 1) {
sign[i] = -1; i--; s = sign[i] + 1;
}
sign[i] = s;
} while (sign[1] < 1);
return EXIT_SUCCESS;
}
-1+2-3+4+5+6+78+9=100を表示させないようにするにはどうしたらよいですか
おしえてください。お願いします。

219 名前:デフォルトの名無しさん :01/09/10 18:11
初心者ですが質問させて下さい。
整数を保存するリストに対し,
その順序を反転する関数を作成せよ。という問題なのですが、
これって各ノードを図であらわしたときの矢印の向きを変えろ,
と言っているようなものなのですか?
宜しくお願い致します、、、

220 名前:デフォルトの名無しさん :01/09/10 18:18
それ以外の可能性ってあるの?
双方向リストなら、書く量が少なくていいね
単方向でも、ルート不要なら、再帰で書くと
少ない努力でできるかな

なんでも定番は同じだね

221 名前:デフォルトの名無しさん :01/09/10 19:00
STLのlistだったりして…

222 名前:デフォルトの名無しさん :01/09/10 19:17
STLのlistだと問題にならないじゃん。

223 名前:デフォルトの名無しさん :01/09/10 23:10
>>222
自分で組むのは、STLで使えるようになってからでもいいじゃん。
問題出すほうがわかってないのかもよ。

224 名前:デフォルトの名無しさん :01/09/10 23:34
protectedについて質問。
派生クラスから基底クラスへのprotectedだったら見えると思ったんだけど、
下のコード、コンパイラ通らないです。
基底クラスへの参照は無理なの?
教えてください。

class A
{
protected:
  int xxx;
};

class B : public A
{
  void func(A* ptr);
};

void B::func(A* ptr)
{
  cout << ptr->xxx;
}

225 名前:デフォルトの名無しさん :01/09/11 00:05
class A
{
protected:
int xxx;
};

class B : public A
{
public:
void func();
};

void B::func()
{
cout << xxx;
}

void main(void)
{
B b;

b.func();
}

こうじゃなくて?

226 名前:_ :01/09/11 00:21
namespace使用時、friend class宣言が無視されます。
何が悪いのでしょうか?

ファイルA
namespace a

class A{
friend class B;

int i

};

};

ファイルB
#include "ファイルA"

using namespace a;

class B : public A{

B(){
i = 1; // ←privateメンバにアクセス出来ないとエラー。
}

};

227 名前:デフォルトの名無しさん :01/09/11 00:38
>>225
あ、クラスAを継承してるクラスが他にもあったりするので、
基底クラスであるクラスAに対して行いたいのです。

228 名前:デフォルトの名無しさん :01/09/11 01:01
class B;
namespace a {
class A{
friend class ::B;
int i ;
}; };

229 名前:226 :01/09/11 01:37
>>228
それでうまくいきました。
でもnamespaceを使う前は、プロトタイプ宣言無しでもいけてました。
それに複数のファイル間で同じnamespace名を使うとエラーが出まくります。
疑問だらけなんで、もうちょっと勉強してみます。
ありごとうございました。

230 名前:226 :01/09/11 02:56
理解できました。
C++ってやっぱ難しい!

231 名前:219 :01/09/11 06:33
219の質問をしたものです。
長いので2chに書くのを控えたのですが、
http://members.tripod.co.jp/giriam2001/c.html
のプログラムを参考にして解けというものなのです。
全く糸口さえわからないのですが、、、、、

232 名前:デフォルトの名無しさん :01/09/11 06:57
>>291

233 名前:デフォルトの名無しさん :01/09/11 06:59
>>219

234 名前:デフォルトの名無しさん :01/09/11 06:59
>>219
氏ね

235 名前:デフォルトの名無しさん :01/09/11 10:12
>>219

236 名前:デフォルトの名無しさん :01/09/11 10:31
>>224
のコードはBの基本クラス要素ptrを見てるんじゃなくて、新しい別のクラスAのptrを見ているよ。だから、*ptrには何も入っていないからcoutにNULLが渡されて、エラーがでてるんじゃない?

237 名前:デフォルトの名無しさん :01/09/11 10:47
>>236
その答えは思いっきり外してるぞ。

238 名前:236 :01/09/11 10:55
あ、しまった。coutには参照が渡されなければ行けないのに、
NULLが渡されたからエラーがでる。。
てことでOKだよね

239 名前:デフォルトの名無しさん :01/09/11 11:12
>>238
いや、そもそもコンパイルエラーが出るって話だろ…?
呼び出し側のコード見ないとなんとも言えないが func( NULL ) なんて呼び方してるとも思えんし。

つーか、解決 >>230 してるんだよね。(^^;

240 名前:236 :01/09/11 11:28
そうだったんだ。すまん。でも見ため224と226は同一人物ではないような気がして。。。

241 名前:デフォルトの名無しさん :01/09/11 12:49
>>236
前半は合ってるけど後半が違う。
>新しい別のクラスAのptrを見ている
から他人の保護メンバ xxx にアクセスできんということだ。

242 名前:デフォルトの名無しさん :01/09/11 12:50
>>231
リンク先のソースに付け加えるとしたらこんな感じか。
//要素の順序を逆にして新たな先頭ノード(旧末尾ノード)へのポインタを返す
Node *reverse(Node *n)
{
 Node *prev_node;
 Node *old_next;
 for (prev_node = NULL; n != NULL; prev_node = n, n = old_next) {
  old_next = n->next;
  n->next = prev_node;
 }
 return prev_node;
}

243 名前:236 :01/09/11 13:09
>>241
その通りでした。一番肝心なこと忘れてたYO。
まだまだっす勉強します。

244 名前:デフォルトの名無しさん :01/09/11 19:19
.NetのVisual開発ツールってframeworkSDKのbinの何ていうアプリケーション?

245 名前:デフォルトの名無しさん :01/09/11 19:45
あれ?protectedのメンバって例え派生クラスとはいえ
べつのオブジェクトのprotectedメンバにアクセスでき
るんだっけ?
protectedって単に継承したときに基底クラスのメンバ
をどのように扱えるかを決める物じゃないんすか?

246 名前:デフォルトの名無しさん :01/09/11 19:46
>245
ハァ?

247 名前:デフォルトの名無しさん :01/09/11 19:55
>>245
正解。

248 名前:デフォルトの名無しさん :01/09/11 19:56
>>245
>protectedって単に継承したときに基底クラスのメンバ
>をどのように扱えるかを決める物じゃないんすか?
意味不明。

249 名前:デフォルトの名無しさん :01/09/11 20:03
つまり、生成された同一クラスのインスタンス間で
protectedなど、アクセス制限は適用されるか?ってことか。
おいらもよくわからん。
誰か調べて。

250 名前:デフォルトの名無しさん :01/09/11 20:29
#include<stdio.h>

class pee{
protected:
int tinkasu;
public:
void peeing(pee p){tinkasu=p.tinkasu;}
};

int main(){
pee p1,p2;
p1.peeing(p2);
return 0;
}

こういうこと?


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