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


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

C++相談室 Part3
1 名前:デフォルトの名無しさん :01/10/23 19:26
v(^・^)v

C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/

STLport
http://www.stlport.org/
Boost C++ Libraries
http://www.boost.org/

2 名前:v(^・^)v :01/10/23 19:37
>>1 v(^・^)v
なんすか、コレ

3 名前:v(^・^)v :01/10/23 19:39
>>2
v(^・^)vカエレ!

4 名前:デフォルトの名無しさん :01/10/23 20:23
前スレでも聞いたけど、ファイルを読み書きするときに
FILE構造体とfstreamとどっちを使ってますか?

5 名前:デフォルトの名無しさん :01/10/23 20:30
>>4
まず、どうして、そういうことを気にするのかを聞きたい。

6 名前:なんのつもりだ :01/10/23 20:31
>>1 v(^・^)v
なんすか!、コレ!(怒

7 名前:なんのつもりだ :01/10/23 20:32
>>4
FILE構造体に決まってんじゃん(w

8 名前:デフォルトの名無しさん :01/10/23 20:33
CFileだ

9 名前:デフォルトの名無しさん :01/10/23 20:35
>>>1 v(^・^)v
>なんすか!、コレ!(怒
なんすか!、コレ!(怒

10 名前:デフォルトの名無しさん :01/10/23 20:36
>>>1 v(^・^)v
意味フメイで怖いんですけど!?

11 名前:デフォルトの名無しさん :01/10/23 20:39
v(^Д^)v ギャハ!
に似てる?ムカツク!>>1

12 名前:デフォルトの名無しさん :01/10/23 20:41
v(^・^)v
やっぱりこれがないと。

13 名前:デフォルトの名無しさん :01/10/23 20:43
v(^・^)v
  (C++)
  ノ∪ヽ

14 名前:デフォルトの名無しさん :01/10/23 20:44
v(^・^)v
 ( * )
 ノ∪ヽ

15 名前:デフォルトの名無しさん :01/10/23 20:45
v(^・^)v
(∩∩)

16 名前:デフォルトの名無しさん :01/10/23 20:46
      ∧_∧
      v(^・^)v
   γ⌒" ̄ `Y" ̄`⌒ヽ
  /´  、   ¥   ノ  `ヽ.
 / ,-ュ人` -‐´;`ー イ` ェ-、 ヽ
 l 「  } i 彡 i ミ/ {  `ノ
 ` `ー' .}    {  `ー'´/ ̄ ̄\
     /      \||  |  グシャ  |
    /   /`ヽ、 i |i  \  _/
   /  ノ    l| | i|   //
   \  `ヽ    |    ||  /
     \ \  l|| l|i | ,, '⌒Y
      ノ  _>‘、|l  |・i/ノ , ノ >>1
     <.,,_/~,-・i |゚;・li。i,・'(__,.J

17 名前:デフォルトの名無しさん :01/10/23 20:50
なんつーか……最近芸術的なAAが増えたな。

18 名前:デフォルトの名無しさん :01/10/23 20:50
 ∧∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
v( ^・^)v < こういう生き物です。
 U U   \_____________

19 名前:デフォルトの名無しさん :01/10/23 20:53
 ∧∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
v( ^・^)v < ミカン星人に近づいたかな?
  )) ))   \_____________

20 名前:デフォルトの名無しさん :01/10/23 20:57
          ┌─────────
         < ガオガオシテナイーヨ
   v( ^・^)v   └───/|────
    \.\______//
      \ 観鈴ちん /
       ∪∪ ̄∪∪

21 名前:デフォルトの名無しさん :01/10/23 20:59
>>5
理由は無いけど、同じ事が出来る手段が2つあるから。
パフォーマンスとかポータビリティとかについてはどうなんだろ?

テキストファイルだとfstreamが便利そう
バイナリファイルだとFILEの方が書きやすそう

という漏れの認識はおかしい?
っていうかどうして荒らされてるの?

22 名前:デフォルトの名無しさん :01/10/23 21:52
fstreamに決まってるだろ。
C++らしい方使っとけ。

23 名前:デフォルトの名無しさん :01/10/23 22:22
>>21
VCだと、FILEの方が、かなり軽いね。

24 名前:デフォルトの名無しさん :01/10/23 23:39
 ∧ ∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
v( *^・^*)v < >>22 FILEに決まってんだろ。
  )) ))    \_____________

25 名前:デフォルトの名無しさん :01/10/24 11:10
最近C++を勉強を始めました。
静的メンバ関数をclassの宣言外にだそうとする(2)と、
>error C2352: 静的でないメンバ関数の中で呼び出しが正しくありません。
なんて言われてしまいます。
静的メンバ関数は、外にだしちゃダメなのですか?
-----(1)
class mydat {
   static int num ;
public:
   static int foo(){ return num } ;
} ;
-----(2)
class hoo {
   static int num ;
public:
   static int foo();
} ;
static int hoo::foo()
{
   return num ;
}

26 名前:デフォルトの名無しさん :01/10/24 11:24
// MSDN, C2352
指定された関数は静的なメンバ関数ではありませんでしたが、static メンバ関数内で呼び出されています。

次にこのエラーの例を示します。

class X
{
public:
static void func1();
void func2();
static void func3()
{
func1(); // OK, 静的な関数 func1 を呼び出しています
func2(); // エラー, 非静的関数 func2 を呼び出しています
}
};

27 名前:デフォルトの名無しさん :01/10/24 11:37
コンパイラ エラー C2724
'identifier' : 'static' をファイル スコープでのメンバ関数の定義に使うことはできません。

static メンバ関数がファイル スコープで定義されています。static メンバ関数は、外部リンケージで宣言しなければなりません。

この誤りは、Microsoft の拡張機能を使っているとき (/Ze オプション指定) には警告となり、Microsoft の拡張機能を無効にしているとき (/Za オプション指定) はエラーとなります。

次にこのエラーの例を示します。

class C
{
static void func();
};

static void C::func(){}; // エラー

28 名前:デフォルトの名無しさん :01/10/24 14:01
>>25
class hoo {
   static int num ;
public:
   static int foo();
} ;
int hoo::foo()
{
   return num ;
}
int hoo::num;

29 名前:25 :01/10/24 14:41
>>28 様、ありがとうございます。それで、できました。

30 名前:デフォルトの名無しさん :01/10/25 09:35
純粋仮想関数を使用する意味はなんですか?

31 名前:デフォルトの名無しさん :01/10/25 09:36
インタフェースの提供>30
下位クラスでoverrideする

32 名前:30 :01/10/25 11:22
>>31 レスありがとう。

C++勉強したてでよくわからんのです。
純粋仮想関数って、なにもないのと同じじゃないかって思うんです。
枠だけ作って、中は下位クラスで作ろうってことなら、
初めから上位に関係なく下位で作ればすむなんて思ったんです。
なんかメリットは、あるんですか?

33 名前:デフォルトの名無しさん :01/10/25 11:30
>>32
polymorph

34 名前:デフォルトの名無しさん :01/10/25 12:10
>>32
よくあるAnimal、Cat、Dogの例で説明すると、CatやDogクラスの
オブジェクトをAnimalのインタフェースを使って呼び出したいが、
Animalは抽象的過ぎて実際の処理をまかせられないので、インタ
フェースだけを定義しておく。

こんな時にC++では純粋仮想クラスを使います。

っていうか、GoF本とか読んだほうがいいかも。

35 名前:デフォルトの名無しさん :01/10/26 10:14
Animal クラスに 足の本数を返すメンバ関数を純粋仮想関数で作る。

class Animal {
public:
  virtual int get_ashi() = 0 ;
}

class Neko : public Animal {
public:
  int get_ashi() { return 4 ; }
}

class Tako : public Animal {
public:
  int get_ashi() { return 10 ; }
}

class Ototake : public Animal {
public:
  int get_ashi() { return 0 ; }
}

と。

36 名前:デフォルトの名無しさん :01/10/26 10:38
僕はテストの時に楽できるように、親クラスではデフォルト値を返すようなメソッドを設定して、
純粋仮想クラスにはしないことが多いんですが、なんか副作用とか出てきたりするもんなんでしょうか。

37 名前:デフォルトの名無しさん :01/10/26 10:57
>>36
サブクラスで override を忘れたときに、コンパイラが文句をいってくれない。

個人でやってる分にはどうでもいいけど、複数人で行うプロジェクトの場合には、
「これは絶対にサブクラスで上書きしろ」と主張するために、純粋仮想メソッドに
しておくのが吉。

それに、そもそも「デフォルトの振る舞い」が想定できないケースもある。実装継
承ではなくインターフェース継承を重視するようになると、よくある。

38 名前:デフォルトの名無しさん :01/10/26 13:53
>>36
オーバーヘッドが掛かり遅くなる

39 名前:デフォルトの名無しさん :01/10/26 14:22
全スレ900の

> string line_buf;
> ifstream file("text.txt");
> getline(file, line_buf);
> こんなクソコード書いていいのは初心者のうちだけだぞ!

がクソな理由を教えてください。今ちょうどこんなの書いてたので……

40 名前:デフォルトの名無しさん :01/10/26 14:28
>>38
えっ?

たしかにインスタンス構築時に vptr を 2 回(親クラスのコンストラクタで一回、子クラス
のコンストラクタで一回)埋めるオーバーヘッドはかかるけど、仮想メソッド呼び出しにか
かるコストは同じだと思うが。

41 名前:デフォルトの名無しさん :01/10/26 16:57
>>40
>たしかにインスタンス構築時に vptr を 2 回(親クラスのコンストラクタで一回、子クラス
>のコンストラクタで一回)埋めるオーバーヘッドはかかる

これだけで十分遅くなる&メモリを無駄に使う気がするけど? そういうことじゃなくて?
もっとも、コンパイラ依存だろうけど。無理して継承関係を採用するのをやめてテンプ
レートにすれば抽象クラスにするよりもっとうまくやってくれるかもしれない。

42 名前:デフォルトの名無しさん :01/10/26 17:20
>>41
クラスを継承すれば、純粋仮想関数があってもなくても
複数回のvptrのセットが行われるんで、純粋仮想関数が
必要な理由にはならんでしょ?

43 名前:デフォルトの名無しさん :01/10/27 17:18
あげとく

44 名前:デフォルトの名無しさん :01/10/27 18:32
>>41
template だとコンパイル時に型が決まっていしまうから多態できないじゃない。Generic Programming
と OO は対立するよりは、むしろ直交する概念でしょう。

それと VC++ 限定ですが __declspec(novtable) という拡張指定があります。これをつけたクラスは
コンストラクタ/デストラクタから vtbl 初期化用のコードが削除されます。

45 名前:デフォルトの名無しさん :01/10/27 21:54
int* dat;
dat = new int[100];
てすると
delete [] dat;
しなっきゃいけないのに
int dat[100];
だとなんでデリートしなくていいのですか?

46 名前:デフォルトの名無しさん :01/10/27 21:59
stackに確保されるから。

47 名前:45 :01/10/27 22:03
>46
サンクス

ってもsatcckってなんだかわからんから
勉強してきます
push,popとかってやつ?んなわけないか。。。

48 名前:デフォルトの名無しさん :01/10/27 22:06
>>47
スコープ

49 名前:45 :01/10/27 22:11
>>48
スコープっていうと変数の通用範囲ですよね??
スタックにつまれた変数はそのプログラマぐが終わると
かってに開放されて
動的に確保した奴はされないとか???

50 名前:デフォルトの名無しさん :01/10/27 22:15
そういうことだ。>>49

> スタックにつまれた変数はそのプログラマぐが終わると
スタックにつまれた変数はスコープを出ると

だけどな。


51 名前:45 :01/10/27 22:19
>>50
なるほど。。。。
勉強になりました
なんかすごく基本的なことなんだろうけど
目からうろこです
はずかちっ!

52 名前:デフォルトの名無しさん :01/10/27 22:25
>>51
スタック上のオブジェクトについても同様だ。もしdeleteしなければ
ならんと仮定すると、std::string なんて使いものにならんと思わん?
(わらい

53 名前:デフォルトの名無しさん :01/10/27 22:26
int d[100];
delete d [];
ってできないにょ?

54 名前:デフォルトの名無しさん :01/10/27 22:27
質問の意図がわからん。
コンパイル通らないんですけど。

delete[] d; できるか?という意味ならできない。

55 名前:51 :01/10/27 22:30
すいまっせん。。。
std::stringってのがわからないので。。。
なにぶんCc++はじめて二日な門で。。。
勉強してきます!

56 名前:デフォルトの名無しさん :01/10/27 22:31
おれは最初autoオブジェクトが必ずデストラクトされるのが不思議というか、
どうやってスコープを抜けたことを判断してるのか謎だった。
あれは実行時に動的に判断してるんだと思い込んでたから。
動的?んなわきゃねー、と言えるのは今だからこそである。

57 名前:52 :01/10/27 22:32
そうか…。stringの使い方覚えたらCには戻れなくなる(なれる)ぞ。
がんばれ。

58 名前:デフォルトの名無しさん :01/10/27 22:34
>>57
VBやPerlには戻れるかもな(藁
Javaには…戻る方が賢明だったりしてw

59 名前:39 :01/10/27 22:47
どなたか>>39にも愛を!気になって先進まないよ〜

60 名前:デフォルトの名無しさん :01/10/27 23:29
string使うのはいいが、それなりにパフォーマンスを犠牲にすることは
念頭に置くようにしよーね

61 名前:デフォルトの名無しさん :01/10/27 23:45
char*文字列でstrlen連発の方がよっぽど(以下略)

62 名前:デフォルトの名無しさん :01/10/28 00:06
どうせCではsprintfを多用してたから、std::basic_stringに変えたからってそれほど効率が落ちるもんでもない。

63 名前:デフォルトの名無しさん :01/10/28 00:09
どきゅんコードによる文字列操作のバグが減るならよいが、
std::string input_data1;
std::string input_data2;
char buf[1024];
std::string input_data3;

strcpy(buf, input_data1.c_str());
strcat(buf, ",");
strcat(buf, input_data2.c_str());

input_data3 = buf;

とかやられて鬱確定。

64 名前:デフォルトの名無しさん :01/10/28 00:11
>>35 を真面目に読んでて最後のオトタケで激しくワラタ

65 名前:デフォルトの名無しさん :01/10/28 01:19
>>35
>>64
死ね

66 名前:デフォルトの名無しさん :01/10/28 01:28
>>35 >>64-65
オトタケって何ですか?
それと、タコの足は8本だった気がします。どうでも良い事ですが。
10本はイカだったような?

67 名前:デフォルトの名無しさん :01/10/28 01:59
だれか・・このファイルの設定方法を
教えてもらえませんか
http://www.geocities.com/sr77798/Istoapp.def.txt
一夜づけでkeybd_eventについて研究したのですが
さっぱりわかりませんでした。パラメーター1に
アスキーコードが混ざってることはわかったんですが
keybd_event以外に調べるものがあるのなら教えてください。

68 名前:デフォルトの名無しさん :01/10/28 02:03
一夜漬け程度でネオ上げるとは情け納屋。

69 名前:デフォルトの名無しさん :01/10/28 17:08
float* pfBuf = reinterpret_cast<float*>(pnBuf);
のコードの
<float*>はキャストでしょうか?
C++をコードを読んで勉強しているのですが、
参考書をよんでもちょっと調べられませんでした

70 名前:デフォルトの名無しさん :01/10/28 17:11
そう。
http://www.microsoft.com/japan/developer/library/dsmsdn/deep05182000.htm
http://www.microsoft.com/japan/developer/library/dsmsdn/deep06012000.htm
を読むことを推奨する。

71 名前:デフォルトの名無しさん :01/10/28 17:12
キャストでしょうか?って、わけわかんない日本語
を使ってしまいました
どういうキャストなんでしょうか?
「根本的に別の方に変換する」と書いてありますが

72 名前:デフォルトの名無しさん :01/10/28 17:12
>>69
「プログラミング言語C++」は読んだ?

reinterpret_cast はビットパターンを変えずにデータを再解釈するキャストだと思っておけば、
だいたい合ってる。C では型を変える (int -> float とか) タイプのキャストと型再解釈のキャ
ストは両方とも同じ構文を使っていたけど、違いを明確にするために reinterpret_cast が規定
されてる。

73 名前:デフォルトの名無しさん :01/10/28 17:13
まぁ、 float* pfBuf = (float*)pnBuf; だと思ってるだけでもいいと思うわ。
とりあえずは。

74 名前:デフォルトの名無しさん :01/10/28 17:50
>>72
>reinterpret_cast はビットパターンを変えずにデータを再解釈するキャスト

ビットパターンを変えるキャストって?

75 名前:デフォルトの名無しさん :01/10/28 17:51
int n = (int)5.0f // -> 5

76 名前:デフォルトの名無しさん :01/10/28 18:11
>70
>72
どうもです

shortをfloatで扱うと,各演算(+-*/%)はどうなるのでしょうか?
ちなみにプログラムは以下のうような感じです
BOOL CClip::Transform( short* pnBuf, long cSampBuf )
{
CCriticalSection cs( &m_csState );
float* pfBuf = reinterpret_cast<float*>(pnBuf);
for(int i=0;i<cSampBuf * m_wfx.nChannels; i++)
{
if(pfBuf[i] > m_p.fClipLevel)pfBuf[i]=m_p.fClipLevel;
else if(pfBuf[i] < -m_p.fClipLevel)pfBuf[i]=-m_p.fClipLevel;
}
return TRUE;
}

77 名前:デフォルトの名無しさん :01/10/28 18:15
pnBufをdereferenceしてからfloatにキャストしないとダメでわ。

78 名前:デフォルトの名無しさん :01/10/28 18:36
ポインタはどうあがいても32ビットのビットパターンだぞよ

79 名前:デフォルトの名無しさん :01/10/28 18:40
>>78
32bit かどうかは処理系依存だし、float* と short* の内部表現が違うかもしれない……という
話は置いといて、

unsigned char *buf;
int *np = reinterpret_cast<short*>(buf);

としたときに *buf, *np が異なるコードを生成することは良いよね? buf を int へのポインタ
として扱うために必要になるのが reinterpret_cast。これをやらんとコンパイル時エラーになる。

80 名前:デフォルトの名無しさん :01/10/28 19:09
charのサイズは1。これ、C++の常識だぞよ

81 名前:デフォルトの名無しさん :01/10/28 19:35
shortもfloatも16bitですよね
という事は、本来floatの値が、shortとして流れて来て
ここでfloatとして計算していると言う事かもしれません
いろいろなご意見どうもありがとうございました

82 名前:79 :01/10/28 19:37
>shortもfloatも16bitですよね
処理系依存だがな

83 名前:デフォルトの名無しさん :01/10/28 19:42
>>81
単精度浮動小数点は、ふつうは (IEEE の規格に従ってる場合は) 32bit ですって。

おそらく、件のプログラムは pBuf が指しているメモリ領域に、場合によって short やら float やら
各種のデータを詰め込んでるのだと思う。読み出す部分だけではなく、書き込んでる部分も読んで
みては?

84 名前:デフォルトの名無しさん :01/10/28 19:50
>>79
内部表現や実装はC++という言語規格とは関係ありません。実装が言語を
規定するのではなく、言語が実装を規定するのです。

85 名前:デフォルトの名無しさん :01/10/28 19:54
>>84
ごめん、言ってることがよく分からん。

reinterpret_cast に関しては実装を踏まえた上で使わないと意味がないと思うが、どうよ?

86 名前:デフォルトの名無しさん :01/10/28 20:28
>>83
なるほど
そう言う事かもしれません
書き込む部分探してみます
というかCOMになってて、他からデータ渡される気がします

float32bitですね(^_^;

87 名前:デフォルトの名無しさん :01/10/28 20:37
>>84
言語規格は、実装に絶望的なほど影響される。
実装のために削除された提案が多数ある。

88 名前:a :01/10/29 03:54
プログラムのぷの字もワカラン全くの初心者です。
自分でゲームとかいろんなソフト作れるようになったらカッコいいなと思い
C++プログラミングVol.1 H・Mダイテル+P・Jダイテル著を買ってきました。
この本の評価はどの程度なんでしょう?

89 名前:サポートパンク :01/10/29 03:58
Cから始めたほうがいいかも〜。

90 名前:a :01/10/29 04:02
C++からプログラムをやるってのは無謀なんすか?
Cの方が簡単なのすかね?

91 名前:デフォルトの名無しさん :01/10/29 04:09
プログラミングを独習するには10年かかるらしいからCからのんびりやれば。
ttp://www1.neweb.ne.jp/wa/yamdas/column/technique/21-daysj.html

92 名前:デフォルトの名無しさん :01/10/29 04:15
>>88
悪くないと思うが、それ読んだあとできちんと「プログラミング言語C++」
も読むこと

93 名前:サポートパンク :01/10/29 04:19
VisualStudio.NETベータ版で
BCCみたいにコンソールプログラミング
って出来ますか?

94 名前:デフォルトの名無しさん :01/10/29 04:49
>>93
C:\Program Files\Microsoft Visual Studio.NET\common7\tools\vsvars32.bat
に環境変数の設定バッチがあるから
あとは好きなように。
cl : C/C++コンパイラ
nmake : makeユーティリティー
csc : C#コンパイラ (おまけ)

95 名前:age :01/10/29 04:50
>>88
いい本だが初心者にはきびしいかも

96 名前:デフォルトの名無しさん :01/10/29 06:09
Cからプログラムをやるというのは、当座はUNIX専門でやるということ
でなければ今の時代無意味だよ。
本当はC++をやってからCやJava、C#をやるのがお勧めだが(というの
はそれらの言語は大体C++の古いバージョンやサブセット/微少な拡張
として手間をかけずに理解できるので)、最近の状況からすると、
JavaやC#をやってから必要になったらC++なんてのも悪くないかも
しれない。アメリカの大学だと最初はJavaってところが増えている
ようだから。
CをやってからC++だと、変な癖が付く恐れがあるので、既存のCの
参考書を売ろうという出版社や古い教育者の謀略に乗らない方が
良いと思われ。

97 名前:デフォルトの名無しさん :01/10/30 01:54
>107
初心者な質問なのですが
「CをやってからC++」というパターンでつく可能性のある
変な癖って具体的にどういう感じなんでしょう。
私はそのパターンで勉強してしまったので
実際もしそういう癖があるなら直したいのですが…。

98 名前:デフォルトの名無しさん :01/10/30 03:42
>>97
「107」って?
C++の参考書の著者にはCくらい先にやっとけと言う者とやらんでよろしいと
言う者の2通り真っ二つに分かれているので、かなり異論が出そうだが。
ま主観的な問題なんでどっちが正解という話でもない。Stroustrupは後者。

- Cプリプロセッサの多用
- グローバル/スタティック-変数/関数、関数ポインタの多用
- Cスタイル文字列ならびにCスタイル文字列関数の多用
- ローカルオブジェクトの先頭宣言
- 異様に長いメンバ関数(とデータメンバの準グローバル変数化)
- private/protected/publicの不適切な使い分け/実装継承の多用
- 別スレのOO不要/C万能/GNOMEサイコー/UNIXマンセー論者の種になる(藁)

なんで濫用が問題かというと、別に禁止されているわけではない
ので少しくらいやっても良い。Cライブラリの文字列関数だって中身
はアセンブリだからそれなりに速い。
他のオブジェクト指向言語では禁止されている物が、C++の場合たま
たま許容されているところを悪用できる点が問題になる。煙草を吸う
ような開放感があるのかもしれない。周囲には少々迷惑をかけるけども。
ただし、他とも協調するための制度もそれなりに備わっている。

C++はリアリティを持った、自由な大人のための言語だから好きだ。

99 名前:デフォルトの名無しさん :01/10/30 04:31
>>98
「自由な大人」が二人集まると,お互いの自由が相手を束縛することに
気がつく。そこで喧嘩せずに目標を達成するためにルールを作る。

ルールのある言語を使って協調するか
協調するためにルールを作るか。

結局、最後に行き着くところは同じさ。

100 名前:デフォルトの名無しさん :01/10/30 05:23
C++Builderの無料版かKylixのC++版が出れば、C++から始めろと言えるのだが。

101 名前:  :01/10/30 09:31
Cライブラリの文字列関数ってCで書かれたソースがどこかにあったような...

102 名前:デフォルトの名無しさん :01/10/30 16:01
現在,C++で画面を100×100のブロックに分割して,指定された
ブロックから指定されたブロックまでの経路の全通りを作り出す
プログラムを作っています.これを作るアルゴリズム難しくてで
きません.どうしたらよいのでしょうか?

103 名前:デフォルトの名無しさん :01/10/30 16:03
>>100
C++ builderのコマンドライン版でないということは、無料のGUI開発
環境でなきゃ駄目ってこと? 探せばそれなりにあると思うけど。

104 名前:デフォルトの名無しさん :01/10/30 16:04
338 名前:心得をよく読みましょう :01/10/14 22:17 ID:5r0xorkP
ひろゆきもそろそろ管理人としての姿勢を見直すべき
珍走団がひろゆきに土下座をさせたのは、荒らしの責任を取らせたのではなく
あくまでも、ひろゆきの電話での態度について落とし前をつけたまで
日本生命やINSIのように、安全を確信できる相手には、イキガッテみて、
珍走団のように理屈の通じない相手には遜って土下座までするようでは
あまりにもカッコワルイ

105 名前:デフォルトの名無しさん :01/10/30 16:10
>>99
>ルールのある言語を使って協調するか
>協調するためにルールを作るか。
>結局、最後に行き着くところは同じさ。

本当に同じか?
ルールを毎回一から作るより、再利用する方が効率的だよね!

106 名前:デフォルトの名無しさん :01/10/30 16:53
ルールを必要としない言語が良いYO!>>99

C言語だと配列の上限ルールが居る。から、プリプロセッサに頼る。

107 名前:デフォルトの名無しさん :01/10/30 17:16
>>106
絵に描いたような...

108 名前:ルビ厨な入 :01/10/30 17:41
>>106
日本語が不自由な方ですか?(苦笑)

109 名前:デフォルトの名無しさん :01/10/30 17:48
>>102 宿題スレ→ http://pc.2ch.net/test/read.cgi/tech/1003838158/l50

110 名前:デフォルトの名無しさん :01/10/30 19:59
C++でファイル(HD)に書き込む動作を含むプログラムを
作ろうと思っているのですが
linuxとwindowsで違いますか?

111 名前:デフォルトの名無しさん :01/10/30 20:15
>>110 宿題スレ→ http://pc.2ch.net/test/read.cgi/tech/1003838158/l50

112 名前:デフォルトの名無しさん :01/10/30 21:52
>>102
最短距離だよね?
●○○○○○
○○○○○○
○○○◎○○
○○○○○●

黒丸から黒丸まで行くとすると、(◎は障害物)
→5回
↓3回の全ての組み合わせから
◎の通る、組み合わせを引けばいいのでは?
5×3の全通りの配列を作って、右=1、下=2みたいな感じで。
11111222
11112122
11112212
・・・
・・・

こっから、最初の5個を見て、右3下2のを取り除く。
11111222→11111→OK
11112122→11112→OK
・・・
・・・
11122112→11122→だめ
・・・
ってなところじゃね?
問題自体が違ったらすまん

113 名前:デフォルトの名無しさん :01/10/30 23:31
これからVisualCとか普通のCとか勉強したいと思ってるんですけど
初心者にも分かりやすい入門書 ありますか?
ホントにアホみたいな質問でスマソ

114 名前:102 :01/10/31 00:27
>>112
すいません。最短距離ではないのです。
一度とおったブロックは通過しないのですが、
●○○○○○○
○○○○○○○
○○○○○○○
○○◎○○●○
○○○○○○○
○○○○○○○
障害物を回避するときに
↓4回、→5回、↑一回って経路も必要なのです。

115 名前:デフォルトの名無しさん :01/10/31 00:30
>>113
入門書よりも、作りたいと思う物が無いならやっても無駄。

116 名前:デフォルトの名無しさん :01/10/31 00:31
>>114
キーワードは再帰。スレ違いだから、続きは宿題スレなどで頼む。

117 名前:気になる新刊情報 :01/10/31 06:23
やはりMoreなのね・・
More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions
発売予定日は 2001/11/23 です。
価格: ¥4,121

んでこれ。上の入れて5冊全部入っとる・・。
C++ In-Depth Box Set
価格: ¥17,076
発売予定日は 2001/12/07 です。

コードきれいなってるのかな。
Bundle of Algorithms in C++, Parts 1-5: Fundamentals, Data Structures, Sorting, Searching, and Graph Algorithms
Robert Sedgewick (著)
価格: ¥8,832
発売予定日は 2001/12/28 です。

118 名前:デフォルトの名無しさん :01/10/31 17:30
>>115
とりあえず勉強したいんです、
色々応用の利くような気がして・・・

119 名前:デフォルトの名無しさん :01/11/01 09:28
クラス内のconst配列を初期化したいのですが、
どう記述したらよいのでしょうか?

120 名前:デフォルトの名無しさん :01/11/01 09:33
const int a_class::table[] = {0, 1, 2, ...};

121 名前:119 :01/11/01 09:50
>>120
ありがとうございます。
その方法は知りませんでしたが、私がやろうとしているのは
staticではないconst arrayの初期化です。
要素も大量にあるので、すべて記述するのには抵抗があります。

122 名前:デフォルトの名無しさん :01/11/01 09:58
const_cast〜

123 名前:デフォルトの名無しさん :01/11/01 13:03
>>122
メンバ変数だと mutable が使えるかもね。(場合によりけりだが)

あと Immutable パターンなんてのもある
http://www.hyuki.com/dp/dpinfo.html#Immutable

124 名前:119 :01/11/01 13:11
>>112
for(int i=size-1; i>=0; i--) { const_cast<int*>(table)[i] = INITIAL; }
こういうことですね?ありがとうございました。

125 名前:119 :01/11/01 13:19
おっと>>122でした。

126 名前:デフォルトの名無しさん :01/11/01 21:52
VCだとクラスのメンバに
const変数つくれないの?

127 名前:デフォルトの名無しさん :01/11/01 21:57
>>126
全然作れるが何か?

128 名前:デフォルトの名無しさん :01/11/01 21:58
>>126
つくれるよ。初期設定もコンストラクタで簡単にできる。
上のはconst配列の初期設定の話だが別の話か?

129 名前:デフォルトの名無しさん :01/11/01 23:03
値を決めるのを
コンストラクタでやらなきゃいけないとか?
class A{
public:
const int a=8;
}
ってやるとエラーが出る

130 名前:名無しさん++ :01/11/01 23:24
>>129
> 値を決めるのを コンストラクタでやらなきゃいけないとか?
そうです。

> 9.2 Class members
> 4 A member declarator can contain a constant initializer only if it declares a static member (9.4) of integral
> or enumeration type, see 9.4.2.

というわけで、次の選択肢からお好きなものをどうぞ。

1. コンストラクタで初期化する。(実体が複数必要な場合)
2. 変数を static にする。(実体が一つ必要な場合)
3. enum にする。(実体は不要で、値だけあれば良い場合)

なお 2 に関して、規格では

class A {
  static const int a = 8;
};

という書き方が許されていますが、残念ながらこれは VC ではコンパイルできません。宣言と定義を
分離して、次のように書き換えてください。

class A {
  static const int a;
};

const int A::a = 8;

131 名前:デフォルトの名無しさん :01/11/01 23:43
aho VC sine

132 名前:デフォルトの名無しさん :01/11/01 23:56
VC7でもコンパイルできなかたよ・・・。

133 名前:デフォルトの名無しさん :01/11/01 23:56
ANSI(だっけ?)C++にもっとも準拠していると思われるコンパイラって、どれになるんでしょ。

134 名前:デフォルトの名無しさん :01/11/02 00:27
>>133
私は使ったことはありませんが Win32 では CodeWarrier の評判が良いようです。Modern C++ Design
というテンプレートの限界に挑んでるような書籍があるのですが、これのサンプルコードは

- CodeWarrier Pro 6.0
- Comeau C++ 4.2.38
- KAI C++

でテストした、とのこと。

135 名前:デフォルトの名無しさん :01/11/02 00:42
>>134
thx!
CodeWarrierかぁ。見直したぜ。
VCもgccも便利だから手放せないけど、もうちょっとテンプレート周りはなんとかならないものか。

136 名前:デフォルトの名無しさん :01/11/02 00:43
>>128
これでもできるよ

---aaa.h---
class A{
 public:
 A();
 ~A();
 const int a;
}

---aaa.cpp---
#include "aaa.h"

const int a = 8;
A::A() { ... }
A::~A() { ... }

つまりコンストラクタじゃなくても初期化できるよって事

137 名前:136 :01/11/02 00:45
すいません上のは無視してください
思いっきりがいしゅつでした
しかもstatic付け忘れてるし討つだし膿

138 名前:PG :01/11/02 01:56
手元の資料では、分からなかったので教えてください。
純粋仮想関数の関数定義は、ANSI/ISOではどういう扱いに
なってるんでしょうか?
gcc だとコンパイルが通って、定義した関数が普通に呼べてます。

139 名前:デフォルトの名無しさん :01/11/02 02:04
>>138
意図が良くわからないので、

- サンプルコード
- それが、どう動作するべきだと思うのか? 実際にはどう動作しているのか。

を書いてもらえませんか?

140 名前:PG :01/11/02 02:15
>>139
コピペではないので、誤字脱字は勘弁して下さい。
class abst
{
virtual void pvf()=0;
};
void abst::pvf() {}
class deriv : public abst
{
void f() {abst::pvf();} // 呼べる
};

私自身は、どう動作してもいいと思うのですが、
ANSI/ISO での、純粋仮想関数呼び出し時の扱いを押さえて
おきたいと思い、書き込みました。

141 名前:名無しさん++ :01/11/02 02:45
>>140
純粋仮想関数は宣言だけでなく定義もできたのですね。初めて知りました。

> 10.4 Abstract classes
> 2 (略) A pure virtual function need be defined only if explicitly called with the qualifiedid
> syntax (5.1).

規格書には上記のように書いてあるので、純粋仮想関数を定義した上で、クラス名を明示して呼び
出すことは想定されているようです。


別のスレッドでも書きましたが ANSI C++ の規格書は英語の PDF 版でよければ $18 で購入できます。
こういう事態に備えて、一つ手元においておくと便利かと。

ISO/IEC 14882
Programming languages -- C++
http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%2D1998

142 名前:デフォルトの名無しさん :01/11/02 02:46
単に仮想関数扱いされてないようだが。というかそんな
コード実際書いてなんの役に立つの。

143 名前:デフォルトの名無しさん :01/11/02 02:48
>>142 仮想->抽象

144 名前:デフォルトの名無しさん :01/11/02 03:04
C++って自分の知らない仕様が見つかるのはよくあることですか?

145 名前:デフォルトの名無しさん :01/11/02 03:49
>>141
そのPDFとhttp://www.kuzbass.ru/docs/isocpp/
の内容は異なるのでしょうか?

146 名前:デフォルトの名無しさん :01/11/02 04:20
>>145
異ならないよ
まPDF版もってても損はないがコピぺできないようにプロテクトされてないかい

147 名前:デフォルトの名無しさん :01/11/02 09:05
JISのC++の規格ってないの?

148 名前:デフォルトの名無しさん :01/11/02 09:29
>>140
オレもミスって純粋仮想の関数内容書いたことある。
派生クラスでは普通にオーバライドできて動作的に問題は無かった。
だからなかなか気づかなかった。コンパイラはVCとgcc

149 名前:148 :01/11/02 09:32
あ、規格でオッケーなんだ・・・。
むしろコンパイルエラーにしてほしい・・・。

150 名前:デフォルトの名無しさん :01/11/02 11:12
>>142
派生クラスで独自に定義してほしいけど、ディフォルトの実装は用意しておきたい
ときに使います。
ディフォルト実装はprotectedなメンバにしておいてもいいけど、余計なメンバ関数が
増えてイヤな人とかは、定義のある純粋仮想関数を使ったりします。

151 名前:デフォルトの名無しさん :01/11/02 11:34
んー、結局
定義のある純粋仮想をオーバーライドした場合と
普通の仮想関数をオーバーライドした場合で
違いはあるの?

152 名前:デフォルトの名無しさん :01/11/02 13:08
>>151
オーバーライドした場合に違いはない

ただ、定義があったとしても純粋仮想関数を持ったクラスの派生クラスは、
明示的にオーバーライドしないと抽象クラスになる

153 名前:デフォルトの名無しさん :01/11/02 13:35
>>151
ない。オーバーライド「しなければならない」か「しなくてもいい」かの違いだけ。

154 名前:デフォルトの名無しさん :01/11/02 13:49
>>152>>153で食い違ってるな

155 名前:151 :01/11/02 13:58
ああ、なるほど。

くいちがってないでしょ。
>>153はちょっと言葉が足りないけど。
性格には、インスタンス化するならば「しなければならない」
つまり、オーバライドしなければ抽象クラスになる。

だよね?

156 名前:デフォルトの名無しさん :01/11/02 20:15
クラスを複数のファイルに分けてるんですが
こんなエラーでてしまいます

Base.h
class Base{
〜〜
};

Der1.h
class Der1 : public Base{
〜〜
};

Der2,h
class Der2.h : public Base{
〜〜
};

main.cpp
#include "Der1.h"
#inlucde "Der2.h"

Base.h(7) : error C2011: 'Base' : 'class' で示される型としてすでに
定義されています。

どうしたらいいでしょう?

157 名前:デフォルトの名無しさん :01/11/02 20:33
>>156
#ifndef か #if !defined つかいなはれ。

158 名前:デフォルトの名無しさん :01/11/02 20:44
main.cpp
#include "Base.h"
#include "Der1.h"
#inlucde "Der2.h"
でいいだろ。

だがそれ以前に、本当に継承しなきゃいかんのかと、聞きたい。
問いつめたい。

159 名前:デフォルトの名無しさん :01/11/02 20:55
>>158
なんで?

160 名前:156 :01/11/02 21:42
>>156
それもよくわからないので
ちょっと調べてみます

>>158
勉強中なので特に意味はないのです。。。

161 名前:デフォルトの名無しさん :01/11/02 22:54
>>160
こんな風に各ヘッダにおまじないしておけば、一度読み込まれたヘッダが
二度読み込まれることがなくなり、再定義errorを防げるんだよ〜。>>157
(INC_BASEとかの名称はお好きなものを)

Base.h
#ifndef INC_BASE
#define INC_BASE

class Base{
〜〜
};

#endif

162 名前:デフォルトの名無しさん :01/11/03 00:06
↑俗称: インクルードガード

163 名前:デフォルトの名無しさん :01/11/03 00:39
>>162
適当な名前でインクルードガードをつけると、あとでハマルことがあるので注意ね。昔 "Types.h" と
"DLib/Types.h" が両方 _H_TYPES_ というインクルードガード使ってたことが(元々別のプロジェクト
から持ってきたファイルだから、仕方ないんだが)。

私はファイル名と GUID からインクルードガードの文字列を作るプログラムを書いて、使ってます。

164 名前:デフォルトの名無しさん :01/11/03 01:24
_で始まる名前は予約語だっつーの。
K&R嫁。
K&R読んで理解スレ。

165 名前:デフォルトの名無しさん :01/11/03 01:30
>>164
C++ スレで K&R 読め、というのは初めて見たが(w

166 名前:デフォルトの名無しさん :01/11/03 01:30
>>164
マジデスカ?

167 名前:163 :01/11/03 01:42
>>166
164 が何を憤ってるのか良く分からんが(_H_TYPES_ なんてつけたの俺じゃないぞ) _ で始まる名前は
使わんほうが良いというのは正しい。ANSI C++ の規格書から抜粋ね。

17.4.3.1.2 Global names
1 Certain sets of names and function signatures are always reserved to the implementation:
- Each name that contains a double underscore (_ _) or begins with an underscore followed by an uppercase
 letter (2.11) is reserved to the implementation for any use.
- Each name that begins with an underscore is reserved to the implementation for use as a name in the
 global namespace.

168 名前:デフォルトの名無しさん :01/11/03 02:00
>>167
__はまるきりだめで
M_aとかも駄目なんですね。
テンプレート仮引数とかも分けたいと思うから
悩み増えます。本当はSGI風のまねたかった。

169 名前:デフォルトの名無しさん :01/11/03 02:06
__で始まる名前と _ + 大文字 で始まる名前がダメ、といっているように読めるが?

170 名前:166 :01/11/03 02:07
>>167
うわ、、、ちょっとビツクリ
_fooみたいなグローバルな名前はダメそうだと思っていたんだけど、
_Foo とか hoge__hoge みたいのはあらゆるところでダメ(であってる?)
ていうのは初耳・・・

で、これってマクロにも当てはまるの?

171 名前:デフォルトの名無しさん :01/11/03 02:28
>>170
> で、これってマクロにも当てはまるの?
当てはまるでしょ。

たとえば cygwin だ <errno.h> に関数 __errno() の宣言が書いてあります。もし、ユーザが

#define __errno  1

なんてマクロを定義して <errno.h> を include すると、宣言部分でエラーになりますよね。
それに、標準ヘッダのコードガードとかち合う可能性もありますし。

172 名前:166 :01/11/03 03:20
>>171
そういえばそうですね・・・
いままで
#ifndef __MyTools_h
みたいなやつでいっぱいくくってるよ・・・まあ、かち合わなきゃいいや

173 名前:デフォルトの名無しさん :01/11/03 10:13
constは確かにstaticにするべきですね
勉強になりました
3つも方法を教えていただきありがとうございました

174 名前:デフォルトの名無しさん :01/11/03 14:57
>>173
おまえは誰だ!?

175 名前:デフォルトの名無しさん :01/11/03 15:32
>>174
126の亀さんと思われ

176 名前:名無しサソ :01/11/04 09:36
 クラスの中でクラスの定義を行っていて、中のクラスから
外のクラスのメンバにアクセスしたいのですが、

class A{
int a

class B{
void b();
}
}

void A::B::b()
{
A::a = 2;
}

でb内でaにアクセスしようとしたら、
「スタティック メンバ関数内の不正なデータ メンバへの参照です」
と言われて、怒られてしまいます(コンパイラはVC6)。
この場合、A::aにアクセスする方法はあるんでしょうか?

177 名前:名無しサソ :01/11/04 09:37
 すみません。忘れていたのでageます。

178 名前:デフォルトの名無しさん :01/11/04 10:17
やりたいことが良くわからないが、一応これでコンパイルはできる。

class A
{
public:
static int a;

class B
{
public:
void b();
};
};

int A::a;

void A::B::b()
{
A::a =2;
};

179 名前:補足178 :01/11/04 10:19
Bが定義されてる場所は特に関係なく、
たんにstaticメンバ定義方法が間違って板だけ。

180 名前:178 :01/11/04 10:25
あ、早とちりしたかも。
staticにしたくないのなら、たとえばこんな方法。

class A
{
public:
int a;

class B
{
public:
void b(A& arg);
};
};

void A::B::b(A& arg)
{
arg.a = 2;
};

181 名前:デフォルトの名無しさん :01/11/04 11:08
>>180
A::A() : B(this) { }
ってやるの?
たしか、この位置でthis使っちゃいけないはずだけど

182 名前:デフォルトの名無しさん :01/11/04 11:18
>>181
んー、どーもやりたいことが良くわかんないけど
クラスBは何のためにネストしてるの?
AはメンバとしてBを持ってないの?

183 名前:181 :01/11/04 11:49
いや、俺は176じゃないっす。
ただ、文法的に間違いだと思ったから突っ込んだだけ

184 名前:デフォルトの名無しさん :01/11/04 12:06
>>183
まちがってないよ、コンパイルできたし。
>>180で定義されてる void A::B::b(A& arg)をコンストラクタと
勘違いしてない?

185 名前:デフォルトの名無しさん :01/11/04 12:09
そもそもこの定義だけだと、
たとえばMain関数でAをインスタンス化してもBのインスタンスは
どこにもできない。別途作る必要がある。
だから>>176の意図をもっと聞かないと、どうしたいのか良く分からない。

186 名前:エディタを作ってます :01/11/04 12:56
あの、C++じゃなくてCの方だと思うんですが、教えて下さい。
c=getch()のループでキー入力を取得しているのですが、
altとctrlとescが入ってきません。
こういった特殊なキーを入力するにはどういった関数を使えばいいのでしょうか?
コンソールなので、メッセージ処理以外の方法で教えて下さい。

187 名前:デフォルトの名無しさん :01/11/04 13:10
>>186
こっちでやりましょう。
http://pc.2ch.net/test/read.cgi/tech/1003418249/

188 名前:shige :01/11/04 13:20
面倒くさいなら、cursesでkeypad()

189 名前:login:Penguin :01/11/04 13:57
>>147
> JISのC++の規格ってないの?

あるよ。http://www.jsa.or.jpで買いな。一度見たければ赤坂へ行け。

>>145
> そのPDFとhttp://www.kuzbass.ru/docs/isocpp/
> の内容は異なるのでしょうか?

違う。そのURLのはfinal draftだから、最後の修正が反映されてない。
ISOの著作権が発生する直前の版。この版はPDF, PS, HTML, TEXTが揃っている。

190 名前:189 :01/11/04 13:59
あ、違うっていっても、ほんの少しね。字句の修正レベルがほとんど。

191 名前:名無しサソ :01/11/04 14:03
>182
>185

 スマソ。書き忘れです。

class A{
 int a

 class B{
  void b();
 }
 B *b;
}

 と言う感じで、Bのポインタを持たせて、Aのコンストラクタが
呼ばれた時点でnewしようとしています。クラスBは継承された
描画関数で、Aは物体です。で、Aを描画するために、Bで継承
してオーバーロードした関数内に、Aのメンバ変数が欲しいな、と・・・。
AはBと大きく違うし、複数のBみたいなクラスを持っているので、
描画クラスから継承したくはないと思っています。

 初期化したときにクラスAのポインタをコンストラクタでクラスB
に突っ込む事で動作するようにはなりましたが、こんな汚い方法
以外で出来ない物かと。

192 名前:デフォルトの名無しさん :01/11/04 14:25
やっぱり、Class BをAの中でネストト定義する理由がわからない。
外で定義したほうが、変な制約つかなくていいと思うのだが。

193 名前:192 :01/11/04 14:33
こんな感じじゃだめなのかな・・・

class Picture
{
public:
int data[256];
};

class Canvas : class Graphics
{
public:
void Draw(Picture& p){/*pをCanvasに描画*/}

};

int main()
{
Canvas canvas1;
Canvas canvas2;
Picture pic;

canvas1.Draw(pic);
canvas2.Draw(pic);
return 0;
}

194 名前:デフォルトの名無しさん :01/11/04 14:34
>>191
 描画対象のオブジェクト
 描画方法

それぞれ独立したクラス階層で管理して、最終的にまとめたい、と。それだとコンポジション使う
場面だと思うなぁ。

class AObject { /* */ };
class DrawImpl1 { /* */ };
class DrawImpl2 { /* */ };
struct ObjectInterface {
  virtual void doSomeThing1() = 0;
  virtual void doSomeThing2() = 0;
  /* */
};

class A
  : public ObjectInterface
{
  AObject aobj_;
  DrawImpl1 draw1_;
  DrawImpl2 draw2_;

  void doSomeThing1() {
    draw1_.doSomeThing(aobj_);
  }
  void doSomeThing2() {
    draw2_.doSomeThing(aobj_);
  }
};

195 名前:192 :01/11/04 14:35
誤 class Canvas : class Graphics
正 class Canvas : public Graphics

196 名前:192 :01/11/04 14:38
>>194
う、かぶった。
>>194のほうがよりOOを意識してるけど、言いたいことはたぶん同じ。

197 名前:名無しサソ :01/11/04 14:47
 みなさん、どうもです。C++は触って結構経つのに、未だに
仕様を使い切れてない物で・・・。

>192
>193
 言われていることを見ると、外のクラスのメンバにアクセスできる
訳じゃないので、ネストは確かに間違いっぽいですね。
要は、そのmainで定義・処理されている部分を隠蔽したい(canvas
をpic内部に持ちたい)、と言う話なんですよ。となると、>194
書かれている方法に切り替えた方が良さそうですね。

198 名前:  :01/11/04 23:23
delete 0;
って無害だったっけ?
即答で頼む。

199 名前:sage :01/11/04 23:26
無害。

200 名前:  :01/11/04 23:28
>>199 thx;

201 名前:   :01/11/05 11:54
どこかにcursesでダイアログボックスみたいのを出せたり、
メニューをつけたりできるようなクラスないですか?

202 名前:  :01/11/05 11:57
早く教えて!!
昼休みが終わっちゃう!!

203 名前:名無しさん :01/11/05 12:25
>>1 v(^・^)v
なんすか、コレ

204 名前:デフォルトの名無しさん :01/11/05 12:55
きっと、複雑怪奇なマクロが前スレで#defineされてるんだよ。

205 名前:デフォルトの名無しさん :01/11/06 00:55
int i = 0;
cout << i++ << i++ << i++ << endl;
の動作の合理的な説明してください。

206 名前:デフォルトの名無しさん :01/11/06 00:56
>>201
newt

207 名前:デフォルトの名無しさん :01/11/06 01:02
>>205
お?てっきり012って出力されるかと思ったんだけど
210って出力された。なんで?

208 名前:無名λ式 :01/11/06 01:16
>>205
(((cout.operator<<(i++)).operator<<(i++)).operator<<(i++)).operator<<(endl);
http://www.gotw.ca/gotw/055.htm

Objectをpost-incrementしたい、かつ、post-increment演算子を一つの定義で済ませたい。

209 名前:デフォルトの名無しさん :01/11/06 01:28
>>208
それで207のようになるのは不思議。
これは不定ってことだよね?

210 名前:デフォルトの名無しさん :01/11/06 02:05
207です。
>>209
コンパイラによって結果が違うの?
ちなみに私はLinuxのGCCでコンパイルして試しました。

211 名前:デフォルトの名無しさん :01/11/06 02:11
>>210
結合順序の問題だから、不定ってことは無いと思われ。

212 名前:デフォルトの名無しさん :01/11/06 02:18
う〜ん、なんだかこんがらがってきた・・・
職業プログラマさん達には常識的な知識なのかな?
私はただいまC++勉強中なんで208を理解するには
時間がかかりそう。

213 名前:デフォルトの名無しさん :01/11/06 02:19
>>209
そういうことですね。
式中の副作用(side effect)が実行される順序は、いくつかの場合を除いてほとんど不定と思ったほうがよい。
VC++だと、副作用が確定するシーケンスポイントはこんなふうに規定されてます。
http://www.microsoft.com/JAPAN/developer/library/vclang/_pluslang_c.2b2b_.sequence_points.htm
gccの場合の規定はどこに書いてあるかわかんなかった。

214 名前:  :01/11/06 08:19
複数行に分けて記述すれば済むだろう。

215 名前:デフォルトの名無しさん :01/11/06 13:20
ガーン。
今度のプロジェクトでSTLの使用禁止令が出てしまった。
用意されてるのはイテレータも無い、出来の悪いlistとmapだけ。
vectorを使いたいと言ったら、代替クラスを作れだと。
STLportでいいじゃん・・・。
愚痴スマソ。

216 名前:デフォルトの名無しさん :01/11/06 13:28
>>215
理由はなんなんだい?

217 名前:デフォルトの名無しさん :01/11/06 14:00
>>221
不定というか、処理系依存というか。
いずれにしろ、そういうコードは書かない方が。

218 名前:デフォルトの名無しさん :01/11/06 14:03
ちょっと問題がわからないので質問です。

bbbbatttooのような文字列をb5a1t3o2のように文字種と連続回数で書き表すことによって
文字列の長さを圧縮する方法を連長圧縮という。
aからyまでの文字を1文字づつ入力として受け付け、zが入力されるまでこれを繰り返す。
連長圧縮を行って結果を出力せよ。

例:入力 a
a
u
 
  出力 a2u1

やり方がぜんぜんわからないので、教えてください。

219 名前:デフォルトの名無しさん :01/11/06 14:03
>>215
STLのvectorのコードそのまま持ってきて「代替クラスです」って言い張るとか。

220 名前:デフォルトの名無しさん :01/11/06 14:10
>>218
まず連長圧縮の内容を理解する
 ↓
(プログラムでやる代わりに)自分の頭でその処理をやるとき、どういう風にやるか考えて、紙に箇条書きする
 ↓
そのままプログラム化
 ↓
(゚д゚)ウマー

221 名前:デフォルトの名無しさん :01/11/06 14:23
う〜ん、文字を使うやり方はなれていないので・・・
charを使うんですよね?

222 名前:215 :01/11/06 14:52
理由は「信頼性が無いから」だって。
既存のSTLのvectorを使いたいなら、
・信頼性を証明して
・性能を検証して
・是非使いたい理由を提示しろ
ということらしい。

auto_ptrならともかく、vectorだったら問題ないと思うんだけど・・・。
ちなみに会社はF系列です。ここはこんなんばっか。
驚くことに、stringの代替クラスまでありました。
素直にstring使えよ・・・。

223 名前:デフォルトの名無しさん :01/11/06 15:00
>>222
既存のvectorの代わりに自分で作った代替クラスなら
信頼性があるんだ・・・・・・ふーん。へーぇ。

ぜひ使いたい理由:
「既にあるものを使わず同じ物を新しく作ると、無駄な時間がかかる。
無駄な時間がかかるということは、無駄な金(人件費)がかかる。
我々には無駄に浪費できるほど金が余っているのでしょうか?」

金が余ってるなら、それでいいです。別に異議はありません。

224 名前:デフォルトの名無しさん :01/11/06 15:10
>218
ランレングス圧縮は簡単よ。

この前までちゃんとソースも提供したり、書き上げたりもしたけど、
これじゃ学生クンのためにはならないと気づき、ヒントのみにするヨ

ランレングス圧縮は、連続した文字列を記号と数で表現するものナノヨ。
例えば、aaaabbcだと、a4b2c1となるわけネ。
アルゴリズムは

1:n = 1
  ↓
2:文字を受け取る
  ↓
3:文字列(ファイル)の終端?
YES→goto 9 NO→goto 4

4:次のに取得される予定の文字は同じ文字か?
YES→goto 5 NO→goto 7

5:nをインクリメント
  ↓
6:goto 2

7:"入力された文字"'n'を出力
  ↓
8:goto 1

9:"入力された文字"'n'を出力
  ↓
10:end

ソラで書いたから間違ってるかもネ

225 名前:224 :01/11/06 15:17
漏れも工房時代に自作AVGの画像圧縮をしたいが為に
ランレングスヤッターヨ。あの頃はPC98でした・・・
鮪真似たりいろいろやったよ。
今じゃ一端のアウトローなゲームプログラマですわ(;´Д`)

ガンバレ学生タン!

226 名前:名無しさん :01/11/06 15:24
C/C++で、Excelファイルを扱う際に、
列(A,B、C,・・・)を選択するには
どうしたらいいでしょうか?
普通にやるとA列のみに格納されます。

227 名前:デフォルトの名無しさん :01/11/06 15:56
>>222
プラットフォームが書いてないけど、
特殊な環境向けならコンパイラちゃんとしてなくてもおかしくないし。

それでSTL使って問題が起きた時に、
「STLのバグなのでどうしようもありません」とか言われると困る。

228 名前:215 :01/11/06 16:09
>>227
>プラットフォームが書いてないけど、

Solaris8のForte6とかいう奴らしいです。
SolarisのC++は初めてだけど、そんなにダメダメなんでしょうか?

229 名前:デフォルトの名無しさん :01/11/06 16:13
>>228
標準じゃなくて、STLPort使用するようにすれば?
こっちは実績もあるから。

230 名前:215 :01/11/06 17:08
>>229
そうか、そうですね。
駄目もとでSTLportの使用を主張してみます。

231 名前:デフォルトの名無しさん :01/11/06 18:13
218です。
やっぱりランレングスのプログラムだけはうまくかけません。

大体わかったのですが、一度にすべての文字を出力する方法がわかりません。
たとえば、a3d2f1のようにできないのです。
この問題だけは終わらせないとマズイのでマジでヘルプです〜。

232 名前:デフォルトの名無しさん :01/11/06 20:03
>>231
答えが知りたい?

233 名前:デフォルトの名無しさん :01/11/06 20:28
>>231
224の方針でプログラムが書けたんだね?じゃああとは、
結果を逐一coutに出力せずに、適当なstrstreamに出力するように変更。
最後にその内容を一気にcoutに出す。てなかんじでオーケー。

234 名前:ゲイ2 :01/11/06 20:29
WindowsAPIの

CreateFontIndirect(&lf)
LOGFONT lf;

の使い方教えてください。

235 名前:デフォルトの名無しさん :01/11/06 20:36
>>234
MSDN読めばわかる。で、もし続けたいならこっちのスレで。
「Win32AP質問箱」
http://pc.2ch.net/test/read.cgi/tech/991576947/l50

236 名前:デフォルトの名無しさん :01/11/06 22:10
delete [] obj_array
を使って疑問に思ったのですが
何でこれでクラス配列に割り当てたメモリが全て解放されるのでしょうか?

それと、delete base
で、baseが派生型へのポインタの場合(実体は違うクラス)
問題が生じますか?

237 名前:デフォルトの名無しさん :01/11/06 22:33
>>236
割り当てたアドレスの始端 & 割り当てたサイズ
が把握できていれば型は関係ないと思うが。C/C++では配列 = ポインタ
として扱うことができることから類推できないか? 配列といっても
JavaやC#なんかとは違う。

238 名前:デフォルトの名無しさん :01/11/06 22:38
>>236
実装によると思うけど、メモリブロックのサイズを調べて、
その先頭から最後まで順にデストラクタを適用するだけじゃない?
VC++でアセンブリコード吐かせてみたらそうなってた。

baseのデストラクタがvirtualなら問題なし……だと思ったが。

239 名前:デフォルトの名無しさん :01/11/06 22:51
>メモリブロックのサイズを調べて、
まだ、私はメモリがどう扱われているかわかっていないようです
メモリブロックのサイズを調べるのは,コンパイラですよね

>割り当てたアドレスの始端 & 割り当てたサイズ
a[10]
だと、aがベースアドレスで
配列の添え字と型で、アクセスするアドレスを決定するのですよね?

だから、
delete a[10]
ならわかるのですが
delete [] a
というところが,納得いかないのです
例えば
del(A a){
delete [] a;
}
なんてのもありなわけです

240 名前:デフォルトの名無しさん :01/11/06 22:54
>>239
コンパイラは変数の型を知ってます。

241 名前:デフォルトの名無しさん :01/11/06 22:54
>>239
言語仕様です。

242 名前:デフォルトの名無しさん :01/11/06 23:10
>>239
| メモリブロックのサイズを調べるのは,コンパイラですよね

よくある実装ではメモリブロック自身にサイズ情報が含まれており
delete[]が実行時にメモリサイズを調べている。

243 名前:デフォルトの名無しさん :01/11/06 23:14
WindowsXPで他のユーザーがログオンしているかどうかってどうやって調べるの?

244 名前:デフォルトの名無しさん :01/11/06 23:16
>>243
システムコール使う以外ないでしょ

245 名前:デフォルトの名無しさん :01/11/06 23:22
STLスレが死んでいるのでこちらで質問です。

std::listとstd::map を例外安全かつ中立な実装にできないかな?

型引数として渡されるクラスが例外安全・かつ中立であると
仮定しての話でよいです。

すでに、例外安全だったら素マン。出直してくる。

246 名前:デフォルトの名無しさん :01/11/06 23:23
>>244
ありがとう〜。
ネタでなくドキュソを承知で聞きます。システムコールってなあに?

247 名前:デフォルトの名無しさん :01/11/06 23:24
http://www.google.co.jp
へどうぞ

248 名前:デフォルトの名無しさん :01/11/06 23:46
>>245
話についてけない厨房ですんません。
例外安全でない実装ってどのあたりか教えてー。

249 名前:245 :01/11/07 00:09
うっ
複数要素の挿入を除いては安全かつ中立であると、書いてあった。

というわけで、出直してきます

250 名前:デフォルトの名無しさん :01/11/07 00:26
ExceptionalC++をオススメしておく。>>248


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