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


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

C++相談室 part6
1 名前:デフォルトの名無しさん :02/04/11 01:05
(´-`).。o(関連URLは>>2-5の辺り)

2 名前:デフォルトの名無しさん :02/04/11 01:05
Boost
http://www.boost.org/
STLport
http://www.stlport.org/

過去ログ
Part1
http://piza.2ch.net/tech/kako/980/980175292.html
Part3
http://pc.2ch.net/test/read.cgi/tech/1003832761/
Part4
http://pc.2ch.net/test/read.cgi/tech/1009071535/
Part5
http://pc.2ch.net/test/read.cgi/tech/1014217496/

Windowsの話はこちらで

Win32API 質問箱 Build3
http://pc.2ch.net/test/read.cgi/tech/1017072275/
Windows Programing for C/C++(Not MFC)
http://pc.2ch.net/test/read.cgi/tech/1018239290/

3 名前:デフォルトの名無しさん :02/04/11 01:09
乙カレー

4 名前:デフォルトの名無しさん :02/04/11 01:09
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/

5 名前:デフォルトの名無しさん :02/04/11 01:33
      ,, ,=、  ,, , =、
     ff | }!、,、〃 / ″オツカレー!!
      ,リ/ .ノ*´jコ`)'〃
    {{ { ′   v' 《
     ヾ.\.   \ヾ
     _,,二、》   ;  \. 三,_
  (( ゙ー=、`″〃 \. \-‐' ,))
        ゙ー=″     ゙' 一' 

6 名前:デフォルトの名無しさん :02/04/11 02:23
v(^・^)v

7 名前:デフォルトの名無しさん :02/04/11 02:27
v(^・^)v
Loki
http://www.moderncppdesign.com/

8 名前:デフォルトの名無しさん :02/04/11 06:35
int operator--(){}
で、
--aが出来るけど、a--ってどうやるの?

9 名前:デフォルトの名無しさん :02/04/11 06:45
>8 int operator--(int){}

10 名前:デフォルトの名無しさん :02/04/11 06:54
>8
サンキュ〜〜♪

11 名前:デフォルトの名無しさん :02/04/11 07:08
なんでoperator--(int)なの?
なんかダサい

12 名前:デフォルトの名無しさん :02/04/11 07:14
全ての演算子をオーバライドしてあるclassを作ってるから必要なの。

13 名前:デフォルトの名無しさん :02/04/11 07:14
間違えた。オーバロードね。

14 名前:デフォルトの名無しさん :02/04/11 07:22
(゚Д゚) あぁ?

15 名前:デフォルトの名無しさん :02/04/11 07:24
>>11
ダサいから自然と使われなくなるという罠?
treeをbeginからendまでスキャンするのに後置インクリメントとかされてるのみると、
はじめっから未定義にしときゃぁいいのに、と思う。
これで「高速化のためtreeにしてみたけど余計遅くなった」とか言われたりして、、、
もうね、ア(以下略)

16 名前:デフォルトの名無しさん :02/04/11 07:32
v(^・^)v
v(^・^)v


17 名前:デフォルトの名無しさん :02/04/11 07:47
>>1
int otsukare--(int){}


18 名前:デフォルトの名無しさん :02/04/11 07:53
>>15
いや、構文がダサいって事。
operator--(int)
intって何よってかんじで。

19 名前:デフォルトの名無しさん :02/04/11 07:56
前置と区別せねばよ

20 名前:デフォルトの名無しさん :02/04/11 08:02
>>19
それはわかるが、(int)ってやっぱりセンスのかけらも感じられん

21 名前:デフォルトの名無しさん :02/04/11 08:08
じゃあ
なんかいい方法考え出してくれ

22 名前:StroustrAp :02/04/11 08:11
後置インクリメント(デクリメント)演算子の引数 int は、
同前置演算子と比べた場合に存在する0ではないパフォーマンスの劣化を表している。

23 名前:デフォルトの名無しさん :02/04/11 08:30
引数に渡される値は常に0だが?

24 名前:デフォルトの名無しさん :02/04/11 08:59
>>23
引っ込んでていいよ。

25 名前:デフォルトの名無しさん :02/04/11 10:39
v(^.^)v マァマァ

26 名前:デフォルトの名無しさん :02/04/11 14:37
C++は心の病気になるとか言ってる人がいるがそれは違う!
悪いのは

27 名前:デフォルトの名無しさん :02/04/11 14:39
operator--(int) が呼ばれるときって、実際に何か引数が渡されてるの?
>>23 は 0 とか言ってるけど。そうだとしたら本当にダサいね。

28 名前:ストラウ :02/04/11 14:44
文句のあるやつは使うなよ!!ウワーン

29 名前:デフォルトの名無しさん :02/04/11 14:49
じゃあ何かいい方法を考えるべ。

30 名前:デフォルトの名無しさん :02/04/11 14:56
初歩的なことで申し訳ないのですが、非staticなメンバ関数のアドレ
スを取得する方法ないのでしょうか? CreateThread()にメンバ関数
食わせるクラス作ろうとしてハマッてます。おたすけ。

31 名前:デフォルトの名無しさん :02/04/11 15:05
>>30
メンバ関数にはthisがあるから、CreateThread()には食わせられないでしょう。
(素直は方法では)

32 名前:デフォルトの名無しさん :02/04/11 15:10
>>31
なるほどそうですね。
CreateThreadにthis渡してランチャ関数を1hopおくことにします。
どうもありがとうございました。

33 名前:デフォルトの名無しさん :02/04/11 15:24
LPTHREAD_START_ROUTINE pFunc;
DWORD (WINAPI CMyClass::*p)() = ThreadFunc;
pFunc = *(LPTHREAD_START_ROUTINE*)&p;

ThreadFuncは引数無しのDWORD型のメンバ関数。
動作はまるきり保障できないが。

34 名前:デフォルトの名無しさん :02/04/11 15:25
>>27
通常の関数は定義する時には f(int i) のように必ず仮引数を書かないとエラー
になるが、operator--(int)の場合、operator--(int i)のように書かなくても
エラーにならない。それだけでも良しとしてくれ。

35 名前:30 :02/04/11 15:28
>>33
ありがたき幸せ。両方頭に入れておきます。
#実はその方法で解決しようとしてスパゲッティになっておりました(w

36 名前:デフォルトの名無しさん :02/04/11 15:51
>33
ThreadFuncは、非virtualかつ
WINAPIであれば、まぁ大丈夫、なのかな‥‥

37 名前:デフォルトの名無しさん :02/04/11 16:54
>>34
いや、通常の関数でも仮引数を指定しなくてもエラーになりませんよ。
私は開発の途中で、インタフェースでは決まっているが、まだ実装では
使っていない仮引数は、
void foo( int /* x */ ) { }
のようにしていることがあります。

38 名前:v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v :02/04/11 20:22
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v


39 名前:デフォルトの名無しさん :02/04/11 20:28
>37
関数を/* 〜 */でコメントアウトするときにドツボにハマる罠

40 名前:デフォルトの名無しさん :02/04/11 20:32
#if 0
こうすりゃおけ
#endif

41 名前:デフォルトの名無しさん :02/04/11 20:59
#if 0〜は大抵のエディタで色が変わらないから、
生きているのかで混乱する罠

42 名前:デフォルトの名無しさん :02/04/11 21:12
>>39
Cはコメントの階層化ができるようにならないんだろうか・・・
/-COMMENT_NAME1-
/-COMMENT_NAME2-

-COMMENT_NAME2-/
-COMMENT_NAME1-/

こんな風にできたらいいなぁ。

43 名前:デフォルトの名無しさん :02/04/11 21:20
borlandのコンパイラは、コメントのネストをサポートしてたよね。

44 名前:37 :02/04/11 23:26
>>39
し、失札な! C/C++ 歴 15年、そんなマヌケなことでハマったことは、
2回しかない!!

45 名前:999 :02/04/11 23:34
>>前スレの1000
ゲラ


46 名前:デフォルトの名無しさん :02/04/11 23:37
いまさらながら、「IEコンポーネントを使い倒すスレ」に触発され
ちょっと試してみたい気になりました。

タイプライブラリの取り込み(でしたよね?)で
何を指定したらよいのでしょうか?
#今BCBが手元に無いので言葉が不正確かもしれません。。。
会社でしばらく眺めていたんですが、それらしき物が
見つけられなかったんですけど。


47 名前:デフォルトの名無しさん :02/04/11 23:46
>>46
確か、Microsoft Internet Controls です。

48 名前:デフォルトの名無しさん :02/04/11 23:46
>関数を/* 〜 */でコメントアウトするときにドツボにハマる罠

こんなのハマるやつはどうかしてると思われ
いるとすれば>>39あたり・・・(w

49 名前:1000 :02/04/12 00:05
スマソ >>前スレ999

50 名前:デフォルトの名無しさん :02/04/12 01:36
>>47
thanks!!

っていうか、スマソ。
C++Builderのスレで聞いたつもりになっていた。
激しく、誤爆しちまったぞと。


51 名前:デフォルトの名無しさん :02/04/12 11:43
行の途中をコメントアウトするときは確かに /* */で囲むこともあるが
複数行のコード全体を無効にするときは #if 0 にするなあ。ネストできるしね。

また、#if 0 ならそれは「無効化されたコードである」ということを表明していることにもなるし。
逆に
#if 0
コードではなくコメントをずらずら
#endif
なんての見るとげっそり。

(さらに#if 0 だとなぜ無効にしたのかが分かりにくいので、#if HOGEHOGE とでもして
上に // #define HOGEHOGE 1 // なんたらかんたら...
と無効にした理由、有効にもどせる判断条件などを書いたりしてるな)

52 名前:デフォルトの名無しさん :02/04/12 13:21
試しにちょっとコメントなり #if 0 なりでくくってみるのはともかく、
昔のコードが無効になった状態で残ってるのは萎えるなあ。
リビジョン管理しろよーって感じで。

てゆーか、リビジョン管理してても残してあったり・・・

53 名前:デフォルトの名無しさん :02/04/12 13:47
なんでC++なんだよ、どう考えても++Cだろうがゴルァ!
C==C++だぞわかってんのかゴルァ!

54 名前:デフォルトの名無しさん :02/04/12 14:01
>>53
評価した後で違いに気付くっていうふかーい意味があるのさ(w

55 名前:デフォルトの名無しさん :02/04/12 15:15
きっと
C++;
なんだろう。

56 名前:デフォルトの名無しさん :02/04/12 15:56
>>53
迂闊に使うと効率が悪くなるっていうふかーい意味があるのさ(w

57 名前:デフォルトの名無しさん :02/04/12 16:11
暗黙の型変換の禁止したいんだけど、
class CA{,,,,,};

CA a,b;
a=b;//これを禁止するにはどうすれば?

58 名前:デフォルトの名無しさん :02/04/12 16:14
>>57
それ暗黙の型変換なの?
単なる代入に見えるが。
代入ならば代入演算子をprivateにでもoverrideすれば防げるっしょ。
あと宣言時の代入記述は代入演算子ではなくコピーコンストラクタなので
場合によってはそっちも…

つーか、Effective/More Effective/Exceptional C++嫁

59 名前:デフォルトの名無しさん :02/04/12 16:16
>>57
CA::operator=() と コピーコンストラクタを private にする

60 名前:デフォルトの名無しさん :02/04/12 16:36
>>58>>59
サンクス♪解決しました。

61 名前:デフォルトの名無しさん :02/04/12 17:13
>>56
上手いな……。


62 名前:デフォルトの名無しさん :02/04/13 10:49
template<class T1,class T2=ST<T1> >class TST;
template<class T>class ST{
friend class TST<T>;
public:
T t;
ST(T val=0):t(val){}
};
template<class T1,class T2=ST<T1> >class TST{
private: T2* pt;
public:TST(T1 val=0):pt(new T2(val)){}
~TST(){delete pt;}

TST operator=(const TST& rhs){return pt->t=rhs.pt->t;}
template<typename VAL>
TST<VAL>operator=(const TST<VAL>& rhs)const{return pt->t=rhs.pt->t;}

T1 Ref()const{return pt->t;}

};
/*****************************************/
void main(void)
{
const TST<int> a;
TST<double> b;
a=b;
cout<<a.Ref()<<endl;
}
とやるとfriendの型がずれてしまう。これを回避するfriendの書き方はないだろうか?

63 名前:デフォルトの名無しさん :02/04/13 11:45
friend の問題じゃなくて、TST<int> と TST<double> は別の型なので、
TST<int>::operator= から TST<double>::pt (private) へのアクセスが
できないってだけじゃないの?

64 名前:デフォルトの名無しさん :02/04/13 12:49
>>63
サンクス♪
friend関係無かったよ。
でも、ポインタを公開したくないなぁ。どうしようかね。
Ref()を公開して、その中でポインタを使用するとかしかないのか。

65 名前:デフォルトの名無しさん :02/04/13 13:52
Visual C++でもう入力の必要がなくでEOFで強制終了したいときどうすればいいんですか。
プログラムではなく操作上の問題です

66 名前:デフォルトの名無しさん :02/04/13 14:05
http://joda.cis.temple.edu/~ingargio/refman.pdf
いいものみっけた

67 名前:デフォルトの名無しさん :02/04/13 14:54
↑標準C++の仕様書ね。
ISOの最新pdfだと思う

68 名前:デフォルトの名無しさん :02/04/13 14:55
>>65
Ctl+Z

69 名前:デフォルトの名無しさん :02/04/13 17:56
たしか前に (a += 1) += 1; って出来ないとかいうのを見た気がするんだけど、
だったら operator+= の戻り値は const にしなきゃいけない?

70 名前:953 :02/04/13 19:48
C++ Builderにおいて、ディスクの空き容量を調べようと以下のようなコードを書いたところ、
「[C++ エラー] frmMain.cpp(51): E2015 '__stdcall GetDiskFreeSpaceEx(const char *,_ULARGE_INTEGER *,_ULARGE_INTEGER *,_ULARGE_INTEGER *)' と 'Sysutils::GetDiskFreeSpaceEx' の区別が曖昧」
といわれました、 このばあい、Sysutils::GetDiskFreeSpaceExを呼び出す方法はわかるのですが、
__stdcall GetDiskFreeSpaceEx(const char *,_ULARGE_INTEGER *,_ULARGE_INTEGER *,_ULARGE_INTEGER *)
を呼び出すにはどのようにすればよいのでしょうか?

よろしくお願いします。


void __fastcall TForm1::Button1Click(TObject *Sender)

{
// Show disk capacity and freespace
bool result;


ULARGE_INTEGER freespaceforcaller;
ULARGE_INTEGER capacity;
ULARGE_INTEGER freespace;




result=GetDiskFreeSpaceEx("C:\\",(ULARGE_INTEGER)&freespaceforcaller,
(ULARGE_INTEGER)&capacity,
(ULARGE_INTEGER)&freespace);
}

71 名前:デフォルトの名無しさん :02/04/13 19:51
::GetDiskFreeSpaceEx( ...
かな?

72 名前:デフォルトの名無しさん :02/04/14 01:18
スレ違いかと

73 名前:デフォルトの名無しさん :02/04/14 22:25
>72
現段階ではネームスペースについての話ってことで

74 名前:デフォルトの名無しさん :02/04/14 23:58
age

75 名前:デフォルトの名無しさん :02/04/15 00:39
int (A::*)()がvoid *にキャストできないのはC++の仕様?
手持ちのコードがコンパイルできなくなっている。

76 名前:デフォルトの名無しさん :02/04/15 00:50
できたらできたで困ると思うが。

77 名前:デフォルトの名無しさん :02/04/15 00:55
>>75
どこかで書いたが、アドレスとってvoid**にキャストしてから戻せばいける。

78 名前:デフォルトの名無しさん :02/04/15 00:56
あの方法を使えば印字できるさ

79 名前:デフォルトの名無しさん :02/04/15 00:58
>>75
reinterpret_castでも使え。

80 名前:デフォルトの名無しさん :02/04/15 01:24
仮想関数は、それでとると、戻せなくて死ぬかも。

81 名前:デフォルトの名無しさん :02/04/15 02:20
>>69
一般的にはconstにはしていないようだね。

82 名前:デフォルトの名無しさん :02/04/15 14:37
>>53
亀レスだが、C++はかつてCのプリプロセッサだったからだよ。
つまり、はじめはC++でもプリプロセッサのアウトプットはCってこった。




ん?こじつけだぞ。真に受けるなよ。

83 名前:三瓶です :02/04/15 21:13
http://www.njk.co.jp/otg/Study/CPP/cpp1_01.htmlの左上に水色で
for(int n=0;n<MAX;n++){n○=2;〜〜〜〜〜〜
ってありますが、○の部分の小さな×はキーボードのドコを打てばいいんですか?


84 名前:デフォルトの名無しさん :02/04/15 21:28
>>83
"
↑これか?

85 名前:デフォルトの名無しさん :02/04/15 21:34
>>83
お箸を持つ方が右で、お茶碗を持つ方が左です(右利きの場合)。お間違い無きよう。
んで、その * はアスタリスク(スターとも言う)で、テンキーにあるかと。

86 名前:三瓶です :02/04/15 21:38
違います。もういちどよく見てください。   >>84

87 名前:デフォルトの名無しさん :02/04/15 21:39
>>83
*だわそりゃ。

88 名前:三瓶です :02/04/15 21:40
そうでした右でした。
了解しました。有難うございます。    >>85

89 名前:デフォルトの名無しさん :02/04/16 02:02
#include <iostrem>
int main()
{
std::cout<<"Hello,world"<<std::endl;;
return 0;
}
ASCII C++第3版で上のような状態でmainには一切手を付けないで

strustrup
hello,world!
C++

のように出力せよ、とのお言葉(問題)があったのですがどうすればよいのですか?
引っ掛けなのでしょうか?

90 名前:デフォルトの名無しさん :02/04/16 02:22
>>89
#include <iostream>を消して(略

91 名前:デフォルトの名無しさん :02/04/16 02:27
>>89
mainの外にグローバルなクラス変数を置いて、
そのコンストラクタとデストラクタで cout に出力する

92 名前:デフォルトの名無しさん :02/04/16 02:28
struct A {
A() {
std::cout << "strodsjof" << std::endl;
}
~A() {
std::cout << "C++" << std::endl;
}
};

A a;

これだとVCで"C++"が出力されない。
んなアホな!

93 名前:デフォルトの名無しさん :02/04/16 02:30
>>90-91

レスどうもです!
やっぱりコンストラクタとデストラクタでしたか〜
参考になりましたありがとう!

94 名前:デフォルトの名無しさん :02/04/16 03:19
こうすれば簡単だよYO!
#include <iostream>

int main()
{
std::cout<<"strustrup\nHello,world\nC++"<<std::endl;
return 0;
}
#define main Main
int main()
{
std::cout<<"Hello,world"<<std::endl;;
return 0;
}

95 名前:デフォルトの名無しさん :02/04/16 04:21
coutやcinにはput(),get()のようなメンバ関数在りますけど
そのメンバ関数名&&機能一覧表とかはどこに載ってますぁ?

96 名前:デフォルトの名無しさん :02/04/16 04:24
最後の「ぁ?」は喧嘩を売ってるわけですね。
いいでしょう。かかってきなさい。

97 名前:デフォルトの名無しさん :02/04/16 04:29
( ´D`)つ)´Д`)グリグリ
        ↑
        96


98 名前:デフォルトの名無しさん :02/04/16 04:29
class AAA
{
private:
class BBB;
BBB b;
public:
class BBB{ };
};

これをコンパイルしようとすると、「bの定義がないYO」と言われます。
publicとprivateの位置関係を換えると通るのですが、
位置入れ替えなしでうまくできないのでしょうか?

99 名前:デフォルトの名無しさん :02/04/16 04:33
・゚・(ノД`)・゚・。 グリグリ サレタ・・・

100 名前:デフォルトの名無しさん :02/04/16 04:39
・゚・(ノД`)・゚・。 >>98 こうしたくない理由があるの?

class AAA
{
private:
class BBB{ }
BBB b;
public:
};


101 名前:デフォルトの名無しさん :02/04/16 04:50
・゚・(ノД`)・゚・。 あ、BBBクラスはAAA以外でも使いたいのかな?
まぁいいや寝よう。

102 名前:95 :02/04/16 04:54
ごめんなさい、ぁはかの間違いでーす

103 名前:デフォルトの名無しさん :02/04/16 05:03
>100-101
>理由
それ以外の方法で出来るのかなと
気になって眠れないので、、、



… ( ´Д`)ネムイ

104 名前:デフォルトの名無しさん :02/04/16 07:26
>>98
できません。

105 名前:98 :02/04/16 15:49
>104
C++の仕様ってことですか。。。
ありがとう(・∀・)

106 名前:勉強中なの :02/04/16 19:11
あまりにもはずかしげな初心者質問でスマソ。

#include<stdio.h>
main()
{
float c;
c=100/7;
printf("%f",c);
return 0;
}

ってやると14ってでてくるんだけど、
なんで14.285...ってでてこないの?
100/7.0 とか 100.0/7 とかやるとちゃんとでてくるのに・・・

107 名前:デフォルトの名無しさん :02/04/16 19:20
>>106
C言語では、整数型同士の除算では結果も整数型になると、
C言語の規格で決められている。


108 名前:デフォルトの名無しさん :02/04/16 19:23
c=(float)(int)(100 / 7);

109 名前:106 :02/04/16 19:44
>>107
THX。
そういう規格になってるとは知りませんでした。
>>108
THX。
そういうふうに書けばいいってことなのかな?
あとでやってみます。

110 名前:デフォルトの名無しさん :02/04/16 19:48
>>109
いや、>>108のようになっているから、
切り捨てられた後にfloatにキャストされるので、
14.0で正しいってこと。


111 名前:デフォルトの名無しさん :02/04/16 19:55
>>106
やるなら c = (float)100 / 7; とすればいいだけの話。
もしくは、c = 100. / 7; のようにどちらかに小数点を付ける。

112 名前:デフォルトの名無しさん :02/04/16 19:59
C++の参考書って、
ISOの企画書
Effective C++(日/英どっちでも)
More〜 (原書)
Exceptional C++ (原書)
Modern C++ Design (訳書)

こんだけそろえればとりあえずは大丈夫か?

113 名前:デフォルトの名無しさん :02/04/16 20:10
Exceptionalは勉強になるな。
EffectiveよりAcceleratedの方が良いとどっかにあった。
templateだったらmodernより「Generic Programming−STLによる汎用プログラミング」
の方が基礎的で良いのでは?

114 名前:デフォルトの名無しさん :02/04/16 20:36
>>113
あくまでスタイルとか、落とし穴を回避するための参考書。
STLなんかのライブラリの使い方とかはどうでもいい

115 名前:デフォルトの名無しさん :02/04/16 21:30
#include <sstream>
int main() {
std::stringstream s, ss;
ss.str("a");
s << ss.rdbuf();
}
これをコンパイルして実行すると止まらない(traceしてみるとSTL内部のどこかで
無限ループっぽい)んですけど、STLのバグか俺がアフォなのか教えて下さい。
g++, libstdc++ の 2.96 です。Kondara2.1です。


116 名前:115 :02/04/16 21:32
>>115
g++の3.xだと動きますね…


117 名前:デフォルトの名無しさん :02/04/16 21:59
CからC++に移行するのに最初に読んだ
AcceleratedC++の二つめのサンプルコードで、
#include <iostream.h>と書いて(VC++)どつぼにはまった経験があるのは
おれだけか??
(低レベルなカキコすまん

118 名前:教えて :02/04/16 23:13
ファイルサイズ取得したいのですがstat以外の方法ってあるんですか。

119 名前:デフォルトの名無しさん :02/04/16 23:14
>>118
OSも書けや。

120 名前:デフォルトの名無しさん :02/04/16 23:14
ないとおもう


121 名前:親切な人 :02/04/16 23:14

ヤフーオークションで、凄い人気商品、発見!!!

「高性能ビデオスタビライザー」↓
http://user.auctions.yahoo.co.jp/jp/user/NEO_UURONNTYA

ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。

122 名前:デフォルトの名無しさん :02/04/16 23:17
プログラム板で、凄い人気レス、発見!!!

「親切な人」↓
http://pc.2ch.net/test/read.cgi/tech/1018454705/121n

プログラム板内では、現在、このレス
の話題で、持ちきりです。

123 名前:118 :02/04/17 00:00
>>119
WinXPです

124 名前:デフォルトの名無しさん :02/04/17 00:05
GetFileAttributesExとか
GetFileSizeとか
SetFilePointerExとか


125 名前:118 :02/04/17 00:21
>>124
ありがとう

126 名前:Rubyist :02/04/17 00:27
動物って好き? いいよな どこが? 皮がなぁぁぁぁ

127 名前:デフォルトの名無しさん :02/04/17 00:29
>>118
http://www.catnet.ne.jp/kouno/c_faq/c19.html#12


128 名前:113 :02/04/17 00:57
>>114
親切に教えてやったのに、本の題名だけで判断するかね。
小人養い難しだな。

129 名前:デフォルトの名無しさん :02/04/17 01:01
>>128
俺も持ってるよ「STLによる汎用プログラミング」。C++Builder6からSTLPort
になったので、SGIしか使えなかったバインダとかも全部使えてホクホク
してる。

130 名前:デフォルトの名無しさん :02/04/17 10:52
例外指定(例外仕様)って、使い勝手が悪いような気がするんだけど、どう?
たとえば、
void func() throw(int)
{
throw double();
}
なんて書いても、コンパイラはチェックしてくれないし。(実行時に
unexpected は発生するけど)
また、上の関数の例外指定を後で throw(int,double) に直したとしても、
func を呼び出している全クライアントを書き換えるのも大変。
みなさんは、どういう感じで使ってますか?

131 名前:デフォルトの名無しさん :02/04/17 11:23
受け取り側のcatchが例外の型を指定して受け取るのはやな感じ。
例外の種類と同じ数だけの例外クラスがあるJavaとかC#とか見てると、なんかもっとどうにかならないのかと思う。

132 名前:デフォルトの名無しさん :02/04/17 17:28
今日帰りにExceptional C++買っていこう。

133 名前:デフォルトの名無しさん :02/04/17 18:05
>>131
詳細←→全体がネスト構造になっているのを
ちゃんと現せればべつにクラスでなくてもいいんだろうけどね。

せっかくクラスのis a 継承のしくみがあるんだし
ゴスリングもスト羅臼トラップも
新しい例外専用の構造を導入するのが面倒だったんだろ。

専用のエラーの構造とか用意してある言語とかあるのかな。

134 名前:デフォルトの名無しさん :02/04/17 19:37
>>130
使ってません(きっぱり)。
だって標準関数にほとんど例外指定がないんだもの。
どっから何が飛んでくるかわからんです。
bad_alloc とか。bad_allocを例外指定してない関数で、ちゃんとbad_allocをcatchするようなコード書いてますか?やってられません。

135 名前:デフォルトの名無しさん :02/04/17 22:59
例外仕様って、なんかメリットあるのかな?本気でわからん。
ってことで、僕も使ってません。

136 名前:デフォルトの名無しさん :02/04/17 23:08
少なくとも throw() 指定には意義がある。

constなくてもCでこまらんのと同じ。


137 名前:デフォルトの名無しさん :02/04/17 23:43
でも const と違って throw() は実行時のコストがかかりますよね。
それに見合う意義があるかなぁ…

138 名前:デフォルトの名無しさん :02/04/18 08:06
例外無し指定はコストかからんのでは?

139 名前:デフォルトの名無しさん :02/04/18 10:05
いや、なんか例外が発生したら unexpected() を呼び出す、という処理が
必要になるはず。

140 名前:デフォルトの名無しさん :02/04/18 13:05
C++超初心者でーす。
DOS窓のBASICでゲームは作ったことあるので、
だいたいのフローチャートというかアルゴリズムは理解しています。
CIN COUT IF くらいでの簡単なプログラムは組めます。

目標はVC++でウィンドウズ用アプリで
シューティングとかパズルゲームを作りたいのですが、
まずどこから手をつけたらいいのかわかりません。
VCの解説書とかサイトってのは基本手にまず、C++のソースを
理解しているものとして書いてありますよね。

まずはC++の黒画面で表計算くらいできるようになってからVCでしょうか。
なにか良いサイトはありますか?


141 名前:デフォルトの名無しさん :02/04/18 14:08
まず、イベントドリブンを知れ。

142 名前:デフォルトの名無しさん :02/04/18 15:16
そして、Delphiやれ。

143 名前:デフォルトの名無しさん :02/04/18 16:58
struct AA{
     template<class T>void func(T t){cout<<t<<endl;}

     typedef template<class T>void(AA::*FUNC)(T);
     FUNC fff;
};
typedefのところがエラーになるんですが、templateをtypedefする方法
はないでしょうか。

144 名前:デフォルトの名無しさん :02/04/18 17:41
>143
よくいとがわからんが。
 (↓だったら激しく勉強しる。)

template< typename T > struct AA{
void func(T t){cout<<t<<endl;}
typedef void(AA::*FUNC)(T);
FUNC fff;
};
・・・
AA<int> aa;
AA<int>::FUNC fp = aa.func;


145 名前:デフォルトの名無しさん :02/04/18 17:51
struct AA{
     template<class T>void func(T t){cout<<t<<endl;}
     typedef template<class T>void(AA::*FUNC)(T);
     FUNC fff;
AA():fff(func){this->*fff();}
};
>>144いいえ、こうやりたいのです。

146 名前:デフォルトの名無しさん :02/04/18 18:20
>>145
出来ない。当然だが、もうちこっと頭使え。

147 名前:デフォルトの名無しさん :02/04/18 18:57
コンストラクタでオブジェクトをnewするのはいいんでしょうか。

148 名前:144 :02/04/18 18:59
>145
struct AA{ //冗長に書くと
 template<typename T1>void func(T1 t){cout<<t<<endl;}
 template<typename T2>typedef void(AA::*FUNC)(T2);
 FUNC fff;
 template< , >AA() . . .
}

template< typename T1, typename T2 > struct AA{ . . .}

template< typename T > struct AA{ . . .}
かのどれかかだろ?
(多分最後のやつしか動かんと思うが)

149 名前:デフォルトの名無しさん :02/04/18 19:26
>>148
出来ました。ありがとうございます。まさかそんなtypedefの書き方があったとは・・・。
修行し直してまいります。

150 名前:デフォルトの名無しさん :02/04/18 20:40
>>147
もちろんかまわないけど、リークに気をつけてね。

151 名前:デフォルトの名無しさん :02/04/19 01:16
C++でファイル分割ソフト作りたいんですが何か参考になりそうな
ソースとか資料とかありませんか?

152 名前:デフォルトの名無しさん :02/04/19 01:21
>>151
簡単すぎて(以下略

153 名前:151 :02/04/19 01:25
>>152
いやー初心者でして

154 名前:デフォルトの名無しさん :02/04/19 08:01
>>151
初心者向けの本なら、どれ買ってきても「ファイルの読み込み方」と
「ファイルの書き出し方」は書いてあると思うからそれ嫁。
単純に分割するだけならそれ以上の知識はとりあえず要らん。

155 名前:1日目 :02/04/19 13:26
世間ではC++難しいとかよく言われてるが、こんなのカンタンじゃねーか。
カンの悪いやつが泣き言いってるんだろーな。


156 名前:デフォルトの名無しさん :02/04/19 13:41
Modern C++ Design を読んでなお、こいつ程度のことは洩れにもできる!
ってんだったら一生ついてきます>>155さん。


157 名前:デフォルトの名無しさん :02/04/19 15:28
それなら俺もついて逝く

158 名前:デフォルトの名無しさん :02/04/19 20:25
>>155 そういう軽はずみな発言はC++コンパイラが書けるようになってから言え

159 名前:デフォルトの名無しさん :02/04/19 20:52
難しいってのはどういう部分を指していってるんだろう? 実は俺もちょっと
闇雲に難しい、といってる人には少し疑問がある。
言語自体は分かりやすいし、オブジェクト指向に関しても、でかいプログラム
書いたことある人なら無意識のうちに以前からやっていたことのような気がし
ない?

160 名前:デフォルトの名無しさん :02/04/19 21:10
ライブラリでは?STLとかiostreamとか

161 名前:デフォルトの名無しさん :02/04/19 21:24
ATL、WTL、COM、MFCとかじゃないですか?
確かに難しいし。

162 名前:159 :02/04/19 21:37
COM,MFCは確かに勘弁。

163 名前:デフォルトの名無しさん :02/04/19 21:44
でもC++というより、マイクロソフトの腐った技術が安定していないともいえる。

164 名前:デフォルトの名無しさん :02/04/19 21:45
MFCは何をするにもソース見にゃならんので、
ブラックボックスで開発できないから勘弁だが、
COMは素性のいいものさえ使ってればいっさい問題なし。

165 名前:デフォルトの名無しさん :02/04/20 00:43
ひろーく使われてるのは叩かれてるね。
めちゃくちゃな使われ方もされてるからだろうけど。

あんまり使われてない・アマチュアしか使ってないのはそんなに叩かれない。
なぜなら一部のマニアがオナーニしてるだけだから。

166 名前:デフォルトの名無しさん :02/04/20 02:12
>165 FUDですか?

167 名前:C++初心者 :02/04/20 08:08
class List { public: List *next; };
class B : public List { ... };

ってかんじでリストクラスを作って, リストを継承させて繋がるようにした
クラス B を作ってみたのですがクラスにリストが 2 個必要になったので

class B : public List1, public List2 { } ;

としてリストをつけようとすると 曖昧 だとエラーがでました。
やっぱりこんな実装は間違っているのでしょうか。

168 名前:デフォルトの名無しさん :02/04/20 08:13
>>167
継承すると、クラスメンバは1つしか持てないので包含を使うとよい。
class List { friend class B; public: List *next; };
class B { List list1; List list2; ... };
ってな感じで。

169 名前:デフォルトの名無しさん :02/04/20 09:13
>>167
というより、C++ならそもそもlistを自作する必要はない。
STLにあるので、それを利用しませう。

170 名前:デフォルトの名無しさん :02/04/20 10:49
>>169
いや・・・・つーか学習用だろ。C++の入門書には必ずと言っていいほど
この手のクラス定義が出てくるからなあ。。。

171 名前:167 :02/04/20 23:50
>>168-170
ありがとうございます。勉強になりました。
クラス設計もできないど素人なのでSTLはまだ何が何だかわからなくて…。
いつか皆さんのようなC++のエキスパートになりたいです…。

class B の中で Listクラスを包含すると list1.next が指すオブジェクトが
Listクラスってわかるんですが, class B かどうかまでは不明になりますよね。
class List に抽象ポインタを追加してダウンキャストしてみないと分からない
とか…。うーん…C++って難しいですね…。

class List { public: List *next; void *object; };
class B { public: List list1; List list2; };
B b; B * pb = dynamic_cast<B *>(b.list1.next->object); う…

172 名前:デフォルトの名無しさん :02/04/21 00:01
>>171
そんなJavaっぽいリストにしなくて済むようにC++にはSTL…というか
テンプレートがあるので、やっぱり一刻も早く STL を学ぶべきかと思われ。

173 名前:デフォルトの名無しさん :02/04/21 00:17
>>171
包含は継承とちゃうから、dynamic_castは失敗するよ。
そうじゃなくて、

class List {
friend class B;
List *next;
void *object;
List() : next(0), object(0) {}
};

class B {
List list1, list2;
public:
B() : list1(), list2() {}
List* Head();
List* Tail();
bool isEmpty();
void Insert(List*);
void Delete(List*);
};

って感じで、あくまでもインターフェイスをBに持たせて、内部は隠蔽してしまう
のがいいと思う。STLも大事だけど、クラスの勉強もしてね。

174 名前:デフォルトの名無しさん :02/04/21 06:38
>>167
Listクラスの中の List *next が未知のクラスT型だと解決しそうだな。
うーん…C++って便利ですね…。

175 名前:デフォルトの名無しさん :02/04/21 08:28
newで3次元配列を確保する時のやり方がいまいち解りません。
abc[][][4]
最後が4というのは決まってるのですが、
その前の2つが決まってない時ってどうやるんですか。
アホな質問ですいません

176 名前:デフォルトの名無しさん :02/04/21 09:44
>>176
超FAQだから調べりゃわかると思うけど、
int ***abc;
とかやって、1次元ずつnewしてください。


177 名前:デフォルトの名無しさん :02/04/21 09:59
>176
あっそ

178 名前:デフォルトの名無しさん :02/04/21 10:17
>>176
もしくは、全体分を1次元配列とみなして一気に new して、自分で添え字
計算してアクセスする。間接参照がない分こちらの方が (マシンによっては
だけど) 速いかも。

179 名前:デフォルトの名無しさん :02/04/21 10:23
>>178
本当に早くなるのか?


180 名前:デフォルトの名無しさん :02/04/21 11:52
>>176
(**abc)[4]とやれば、1次元分確保の手間が減るぞ。

>>178
FORTRANじゃないんだから。

181 名前:デフォルトの名無しさん :02/04/21 11:58
あほみたいに大きいと違うだろうなぁ。

182 名前:デフォルトの名無しさん :02/04/21 12:05
アクセスについてはほぼ変わらんと思うけど、
一括で確保できる分、全体的な処理速度は上がるかも

配列の三次元要素とか二次元要素が
OSのページングの単位内で収まるような場合は
小分けして確保した方がよい結果がでるかも。

クラス二つ用意してどっちが速いか実データで検証してみりゃ
いいのでは?



183 名前:178 :02/04/21 14:18
>>179
ごめん遅いわ。とりあえず簡単化のために二次元でやってみたよ。
1000 × 1000 の配列を取って、a[i][j] = 0; を 1000 回やってみた。
>>176 版 28.922sec, >>178 版 30.344sec
だった。要は、メモリアクセス対乗算命令ってことだけど、乗算の方が
ちょっと遅いみたい。

ちなみに、アクセスしているところのコードはこんな感じ
(a[ecx][edx] = 0; のコード)...

>>176 版 (う〜〜〜ん、素直だ...)
 mov eax, DWORD PTR _a1
 mov ecx, DWORD PTR [eax+ecx*4]
 mov DWORD PTR [ecx+edx*4], 0

>>178
 mov eax, DWORD PTR _nCols
 imul eax, ecx
 mov ecx, DWORD PTR _a2
 add eax, edx
 mov DWORD PTR [ecx+eax*4], 0

>>180
> FORTRANじゃないんだから。
なんのこっちゃ ?

184 名前:178 :02/04/21 14:23
>>183 の続き...

[ソース]
#include <stdio.h>
#include <conio.h>
#include <windows.h>

static int nRows;
static int nCols;
static const Loops = 1000;

static int **a1;
static int *a2;

static void _fastcall Func1(int Row, int Col)
{
 a1[Row][Col] = 0;
}

static void _fastcall Func2(int Row, int Col)
{
 a2[nCols * Row + Col] = 0;
}

185 名前:178 :02/04/21 14:24
>>183 の続きの続き

int main(int argc, char* argv[])
{
 nRows = 1000;
 nCols = 1000;
 a1 = (int **)malloc(nRows * sizeof(int *));
 for(int i = 0; i < nRows; i++){
  a1[i] = (int *)malloc(nCols * sizeof(int));
 }
 a2 = (int *)malloc(nRows * nCols * sizeof(int *));

 DWORD Start = GetTickCount();
 for(int Loop = 0; Loop < Loops; Loop++){
  for(int Row = 0; Row < nRows; Row++){
   for(int Col = 0; Col < nCols; Col++){
    Func1(Row, Col);
   }
  }
 }
 printf("%d", GetTickCount() - Start);

 Start = GetTickCount();
 for(Loop = 0; Loop < Loops; Loop++){
  for(int Row = 0; Row < nRows; Row++){
   for(int Col = 0; Col < nCols; Col++){
    Func2(Row, Col);
   }
  }
 }
 printf(", %d\n", GetTickCount() - Start);

 for(i = 0; i < nRows; i++){
  free(a1[i]);
 }
 free(a2);
 getch();
 return 0;
}
/* ちなみに、配列にアクセスしているところを関数にしているのは、
  直接書くと最適化されるため。*/



[実行環境]
Mother Board: Acer M19A (440BX)
Processor: Pentium-II 400MHz × 2
Memory: 256MB × 2, PC100 SD-RAM
Operating System: Windows2000 SP2
Development System: VC++ 6.0
Compile Options:
/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE"
/D "_MBCS" /FAs /Fa"Release/" /Fp"Release/test.pch" /YX
/Fo"Release/" /Fd"Release/"

186 名前:デフォルトの名無しさん :02/04/21 16:04
nColsが定数で、2のべき乗の場合はどうよ?
無理に調べなくてもいいけどさ。

187 名前:デフォルトの名無しさん :02/04/21 18:06
漁スレなんでageとくわ

188 名前:デフォルトの名無しさん :02/04/21 19:44
class Str{
public:char* pdata;~Str(){delete[] pdata;cout<<"end"<<endl;}
    Str(char* pval){
       pdata=new char[strlen(pval)];
       strcpy(pdata,pval);
      }
};
というクラスを作ったんですが、
Str str="ABCDF";
とやると、strcpyの部分でこけるんです。何故なんでしょうか??

189 名前:デフォルトの名無しさん :02/04/21 19:54
こけませんでしたが?

190 名前:デフォルトの名無しさん :02/04/21 19:56
>>188
strlen(pval)+1。


191 名前:デフォルトの名無しさん :02/04/21 19:57
コケるってのがコンパイルはできるが実行時にクラッシュするという意味なら、
strlen(pval)+1
だろ。


192 名前:デフォルトの名無しさん :02/04/21 19:58
>>188
車輪の再発明、もう見てらんない。


193 名前:デフォルトの名無しさん :02/04/21 20:02
>>190
ありがとうございます♪そうです、'\0'の分の領域確保を忘れて
おりました。ああ、漏れもまだまだ厨房・・・。

194 名前:デフォルトの名無しさん :02/04/21 20:03
>>186
その場合は、>>178 版の方が速い。(nCols = 1024 で測定。) でも、
僅差 (1% 程度) だったよ。(ちなみに、nCols が定数で 1000 の場合だ
と、逆に >>176 版の方がわずかに速い。)

> 無理に調べなくてもいいけどさ。

初めそれでやってて、「やっぱ、俺って正しいわ。」と鼻高モードだった
んよ。で、よく考えてみたら...。俺ってバカじゃん、ショボーンてわけ。

195 名前:デフォルトの名無しさん :02/04/21 20:45
>>192
まあ、そう言うな。クラスの勉強には、いい題材だよ。>>188 が必要に
駆られてやってるなら、別の勉強が必要だけどな。

196 名前:デフォルトの名無しさん :02/04/21 21:05
string で書式指定するには?

197 名前:デフォルトの名無しさん :02/04/21 21:09
例えばどんな指定をしたいの?

198 名前:かなりのスレ違いだが :02/04/21 21:35
C,C++、C#、java、perl等などを
難易度順に並べるとしたらどうよ。


199 名前:デフォルトの名無しさん :02/04/21 21:37
std::stringstream ss;
ss << std::fixed << std::setw(2) << 1.0f;
std::string(ss.str());

こんなん?


200 名前:デフォルトの名無しさん :02/04/21 21:37
>>196
普通はstringstreamから変換じゃないか?

201 名前:デフォルトの名無しさん :02/04/21 22:12
でもstringstreamは遅いしいまいち不便だから
std::vector<char>とかにs(n)printfで書き込んじゃう方が多いね。

operator <<定義したオブジェクトにしかつか遠視。


202 名前:デフォルトの名無しさん :02/04/21 22:23
>>201
遅いのは確かだか...

不便なのは慣れていないから(気持ちは分かるがsprintfだって結構不便)だし、
operator<<を定義しているものならなんでも使えるのはメリットだと思う。
(sprintfは組込型にしか使えない。)

203 名前:デフォルトの名無しさん :02/04/21 22:37
誰かstd::stringにsprintf実装して下さいよ。

204 名前:デフォルトの名無しさん :02/04/21 22:39
std::string s;
s.sprintf("%dゲットズザー!",1000);
みたいに。

205 名前:デフォルトの名無しさん :02/04/21 22:58
>>204
正直、俺もそれ楽で良いと思う・・・。

206 名前:デフォルトの名無しさん :02/04/21 23:02
オレは、g++ 用に wprintf が欲しいよ。誰か作ってくれぇ。

207 名前:デフォルトの名無しさん :02/04/22 01:13
template<int N>
class Factorial {
public:
enum { value = N * Factorial<N-1>::value };
};
コレなんですか?何をしているかすら分からない・・・・・・・・・

208 名前:デフォルトの名無しさん :02/04/22 01:17
階乗の計算でしょ。でもその下でN=1の場合の特殊化が必要だよ。

209 名前:デフォルトの名無しさん :02/04/22 01:18
>>207
templateと書いてあるけど、intの特定バージョン。
また、クラスFactorialは実体化時に展開される。inlineだと展開されないから
templateを使ったのでしょう。

210 名前:デフォルトの名無しさん :02/04/22 01:20
>>208
そうですね。コンパイル時にエラーが出るでしょう。

211 名前:デフォルトの名無しさん :02/04/22 01:20
すげー。207じゃないけど、漏れもわからなかった。
enumは何か意味あるの?

212 名前:デフォルトの名無しさん :02/04/22 01:26
enumは計算結果のみ意味を持っていて、計算課程をコードとして残さない。


213 名前:デフォルトの名無しさん :02/04/22 01:28
http://www.microsoft.com/japan/developer/library/dsmsdn/msdn_090798.htm

214 名前:デフォルトの名無しさん :02/04/22 01:30
むずかひ・・・

215 名前:デフォルトの名無しさん :02/04/22 02:18
overflow_errorとunderflow_errorはどんなとき投げられるのですか?
実際のコードで教えて

216 名前:デフォルトの名無しさん :02/04/22 09:32
>>203
string用にoperator+でも定義したら?

217 名前:デフォルトの名無しさん :02/04/22 11:08
MFCのCString参考にしたら、
std::string ssprintf( const char *, ... );
くらいは簡単につくれるはず。

218 名前:デフォルトの名無しさん :02/04/22 11:38
引数有りのコンストラクタを
newで複数(配列)確保することってできますか?

↓こんな感じ
class ctest{
public:
ctest(int a)
~ctest()
};
void main()
{
ctest *ct;
ct = new ctest(0)[32]:// これだとエラー

//delete ct;
}

とりあえず、現在
ctest *ct[32];
for(i=0;i<32;i++)ct = new ctest(0);
のように、ポインタを複数宣言して、ループで一個ずつnewやってます。



219 名前:デフォルトの名無しさん :02/04/22 11:50
>>192
それは勉強する時には関係ないだろ

220 名前:デフォルトの名無しさん :02/04/22 12:14
>>218
できません。
もしできるとしたら、次のように書きたい所。
ct = new ctest[32](0);
これで出てくるコンパイルエラーを見れば意味がわかりますよ。

221 名前:デフォルトの名無しさん :02/04/22 12:40
>>218
配置構文newを覚えなさい。



222 名前:デフォルトの名無しさん :02/04/22 12:47
確保
ctest *ct;
ct = new ctest[32];
for (size_t i = 0; i < 32; ++i)
new (ctest[i]) ctest(0);
解放
for (size_t i = 0; i < 32; ++i)
delete (&ctest[i])->~ctest();
かもしくは
for (size_t i = 0; i < 32; ++i)
std::destroy(&ctest[i]);


引数が一個だったらstd;;vectorを覚えた方が早い。



223 名前:デフォルトの名無しさん :02/04/22 12:53
ctest *ct = operator new (sizeof(ctest) * 32);
for (size_t i = 0; i < 32; ++i)
new (&ct[i]) ctest(0);

for (size_t i = 0; i < 32; ++i)
delete (&ct[i])->~ctest();
delete[] ct;
の間違いだった。写し



224 名前:デフォルトの名無しさん :02/04/22 14:05
>>221
配置 new で何かできる?

225 名前:デフォルトの名無しさん :02/04/22 14:59
>>224
この場合は特に配置newのアドバンテージはないですね。
ただ使用法のサンプルとしては面白い。

226 名前:デフォルトの名無しさん :02/04/22 15:58
我ながら何度も書くのは情けなく思うけど
delete [] ct;
はやっちゃいけない予感。

識者よ、我らに正解を与えたまえちくしょう。

どっちにしろ、引数が一個なら配置構文のnewを使う意味はないね。




227 名前:デフォルトの名無しさん :02/04/22 16:11
質問、超初心者です。
プログラミングはじめたばかりなのですが、
C++を使ってとりあずDOS窓で動く簡単なインベーダーゲーム
みたいなのをやってみようと思うのですが、
これベーシックでやったことあるのでノウハウはわかっています。

ただ、CとC++の区別がいまいちつきません。プログラマーサイトみると
たとえば表示命令でplintf<<"とcout<<"がありますよね。
とりあえず最初に<stdio.h>と宣言したならば前者で、
<iostream.h>と宣言したならば後者ということで
よろしいのでしょうか?そのような解説をしてあるページとかってありますか?

228 名前:デフォルトの名無しさん :02/04/22 16:13
あと、座標指定のlocateって
stdio.hとiostream.hで共通?

229 名前:デフォルトの名無しさん :02/04/22 16:15
>>225
operator newが確実に sizeof(class) を確保するとは限らない
(管理領域を余分にメモリ確保する可能性もある)から、
>>223の書き方は間違いじゃないか?

230 名前:デフォルトの名無しさん :02/04/22 16:36
>>227
>ただ、CとC++の区別がいまいちつきません。プログラマーサイトみると

初心者のうちは、むやみにそういうサイトを参照するな。
9割はヘボだから。
世間で評価の高い本でも買ってよめ。

とりあえず<iostream.h>とか書いてあるサイトは無条件に捨て。

231 名前:  :02/04/22 17:14
>>230
VC++6.0
なんだけど別にC++じゃなくてCも使えるんだよねplintf

とそんでむしろcout(iostream.h)よりもplintf(stdio.h)を使ってる
人の方が多そうだけど。plintfの方がよく使うの?

232 名前:デフォルトの名無しさん :02/04/22 17:17
>>231
plintfはリンカエラー出るっしょ。

233 名前:  :02/04/22 17:20
リンカエラー??
じゃあとにかcoutでいいってことね。

234 名前:(;´Д`) :02/04/22 17:24
>>233
plintf → printf

235 名前:  :02/04/22 17:29
ブーー!

236 名前:デフォルトの名無しさん :02/04/22 17:29
>>231
<iostream.h>は古い書き方ってこと。
今は<iostream>。
最近書かれたドキュメントで<iostream.h>と書いてあったら
筆者が勉強不足。

237 名前:  :02/04/22 17:37
あーhって書かなくてもいいんだ。

238 名前:デフォルトの名無しさん :02/04/22 17:42
>>237
でもVC++だと-GXをつけないとえらいことになるね。

239 名前:  :02/04/22 18:11
GXってなに?

240 名前:デフォルトの名無しさん :02/04/22 18:13
ヘルプ嫁

241 名前:デフォルトの名無しさん :02/04/22 18:46
http://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.htmlを参考に
EUCの文字列をSJISに変換して出力する関数を書いてみたのですが、
うまく動きません。どこがおかしいのでしょうか?
void OutSJIS(string str)
{
  for(unsigned int i=0; i<str.size(); i++)
  {
    unsigned char chr[2];
    chr[0] = (unsigned char)str[i];
    chr[1] = (unsigned char)str[i+1];
  
    if(chr[0] < 0x80) continue;
    if(i >= str.size()) break;
    if( chr[0] & 0x01 )
    {
      chr[0] >>= 1;
      if( chr[0] < 0x6F ) chr[0] += 0x31; else chr[0] += 0x71;
      if( chr[1] > 0xDF ) chr[1] -= 0x60; else chr[1] -= 0x61;
    }
    else
    {
      chr[0] >>= 1;
      if( chr[0] < 0x6F ) chr[0] += 0x30; else chr[0] += 0x70;
      chr[1] -= 0x02;
    }
    str[i] = (char)chr[0];
    str[i+1] = (char)chr[1];
  }
  cout << str << endl;
}

242 名前:デフォルトの名無しさん :02/04/22 19:19
とりあえずliが1増える場合と2増える場合が有ると思うんだが。

243 名前:デフォルトの名無しさん :02/04/22 19:22
>>241
半角文字の場合continueしてしまい、表示されない。

244 名前:241 :02/04/22 19:41
>>242
ありがとうございます。
str[i+1] = (char)chr[1]の次の行にi++を追加したら
とりあえず全角文字列の部分は表示できるようになりました。

>>243
確かに半角文字が表示されません。
今色々やってみているところです。

245 名前:デフォルトの名無しさん :02/04/22 20:27
>>223
デストラクタのほうは、ループをダウンカウントにしないと
まずいっしょ。
…ていうか、よく見たら間違いだらけのような。

ctest* ct = operator new[](sizeof(ctest)*32);
for (int i=0;i<32;++i)
  new (&ct[i]) ctest(0);

for (int i=31;i>=0;--i)
  ct[i].~ctest();
operator delete[](ct);

More Effective C++の項目4を参考にした。これが正しいコードらしい。
ダウンカウントはともかくとして、>>223のコードって正しく動くの?


246 名前:デフォルトの名無しさん :02/04/22 21:33
構造体をnewで確保するとデフォールトでメンバー変数の値はNULLに
なりますか?それとも不定ですか?

247 名前:デフォルトの名無しさん :02/04/22 21:52
>>246
structの中にコンストラクタが宣言されてなければ、デフォルトコンストラクタが
呼ばれ、「ゼロ」で初期化される。

248 名前:デフォルトの名無しさん :02/04/22 22:12
>>247
コンストラクタがあるメンバに対しては初期化されるが
コンストラクタの無い基本型は不定じゃない?

249 名前:デフォルトの名無しさん :02/04/22 22:19
>>248
プログラミング言語C++第3版P172§6.2.8を嫁。

250 名前:デフォルトの名無しさん :02/04/22 22:23
>>249
読んだけど、「組み込みデータ型に対してコンストラクタを明示的に使ったときの値は」
のことなら、この場合明示的ではないので該当しないと思うが。


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