1 :
アフォルトの名無しさん :
02/10/19 14:38 文法が汚くてもいいから、懐の広い言語を望むあなた。そんな
あなたにぴったりの言語、C++。
・・・いいやエレガントなソースを目指せゴルァ!!
(・∀・).。o(関連URLは
>>2-3 辺り) アヒャ
2 :
アフォルトの名無しさん :02/10/19 14:38
3 :
アフォルトの名無しさん :02/10/19 14:38
v(^・^)v
5 :
デフォルトの名無しさん :02/10/19 14:55
#if abc #error (・∀・) #endif abcと同名のシンボルは無いはずだけど全ての処理系で通る(falseで)! 大ハケーン?
14 :
デフォルトの名無しさん :02/10/19 19:58
Vidual C++6.0がインストールされているPCでWordを使っていたら突然エラーダイアログが出て閉じるorデバックを要求されました。 そこでデバックを選択したら、Vidual C++6.0が起動し保存ダイアログが出たので保存を選択しました。(この時、保存先を指定することは出来ませんでした。) この場合、データは何処に保存されているのでしょうか? 宜しくお願いします。
>>13 なるほど、ここは隔離用インターネットだったのですね
>>16 禿げしくスレ違いな上に、おそらくは板違い。カエレ!
>>15 まあ、はっきり言えば隔離かもね (インターネットという言いまわしはグー)。
STL は使う使わないでソースコードの性格が変わるし、質問も然り。
STL バリバリのところに C++ 初心者は入っていけないだろうし、STL スレも
初歩レベルの情報を交えるべきでないと思う (5、14 みたいのも来るし)。
19 :
デフォルトの名無しさん :02/10/20 15:24
>1 乙
20 :
デフォルトの名無しさん :02/10/20 17:43
STLなんかリファレンス一つあれば使えるだろ? Perlより簡単だけど。
とりあえず、ヘッダファイルが一番のマニュアル
24 :
デフォルトの名無しさん :02/10/20 18:06
25 :
デフォルトの名無しさん :02/10/20 18:16
>>24 vector<T>やらmap<T,U>を使うだけなら猿でもできる(もちろん使ったほうが
良いのだが)。vector<T>::iteratorやらなにやらでコンテナの内容にアクセスする
のも、当然サルでもできる。
その先が、ややハードル高い。20や24は<algorithm>で定義される各種
アルゴリズムを正確につかいこなしたり、bind1st,2ndと組み込みの述語関数
を組み合わせてプログラム書いたりを苦もなくできますか?
俺は目が慣れるまでに結構時間が必要だったけどね。関数型言語の経験があれば
"perlより簡単"なのかもしれんが・・・
>>20 mem_fun1_tの使いどころを教えてください
とか言ってみるテスト
物覚え悪いんだね。
>>27 ここでそう煽ることに何の意味が?
僕は馬鹿です と言っているのかな。
必死でぐぐり中の20
今後の20のレスが楽しみですw
今日デザインパタ〜ンってもんを初めてしったYO なんか(・∀・)イイね。
>>25 perlのスパゲティコード読むよりはるかに簡単じゃい。
んま、主観的比較論争はこれくらいにしとけば? 20がSTL知らないということだけが客観的事実ってことで。
(´,_ゝ`)プッ
(´,_ゝ`)ペッ
>>32 C++ のスパゲティコードだって似たようなもんじゃ。
>>33 同意。
37 :
デフォルトの名無しさん :02/10/21 10:53
C++マンセー。
38 :
デフォルトの名無しさん :02/10/21 10:55
C++で作られた有名ソフトって何がありますか?
40 :
デフォルトの名無しさん :02/10/21 11:07
41 :
デフォルトの名無しさん :02/10/21 15:34
char 型 は有名ですが、u_charってなんですか?
unsigned charのtypedefでしょ?
いつからクソスレに・・
44 :
デフォルトの名無しさん :02/10/21 16:45
とてもくだらない質問なのですが、 void main(int argc,char *argv[]) というのがあるじゃないですか。それで、 argcが1を返すとはどういう意味でしょうか?
ほんとにくだらん
46 :
デフォルトの名無しさん :02/10/21 16:52
申し訳ありません。でも分らないので教えてください。
argc = argument count
48 :
デフォルトの名無しさん :02/10/21 16:56
はぃ。それで、1を返すのはどういう意味なんでしょう?
argvになんかあるやろ。
50 :
デフォルトの名無しさん :02/10/21 17:01
え? なんかってなんでしょう・・・。
51 :
デフォルトの名無しさん :02/10/21 17:01
引数の数ですか。 では、 if(argc<=1){ exit(-1); } って書くじゃないですか。 とうこということは、argvに自分のパスが入っているので、 必ず終了することになるんですか?
>>44 とりあえず main() を void で書くのはやめろ。
>>51 その通り。
実際に引数が指定された場合は、argc は 2 以上になる。
53 :
デフォルトの名無しさん :02/10/21 17:09
はい。voidで書くのはやめました。int main(){return 0;}って感じでいいんですよね。 でも、なんでですか?変わった気はしない…。 if(argc<=1){ exit(-1); } なんですけど、 よくサンプルコードに書いてあるじゃないですか? 無意味なんじゃないですか?
そのプログラムはコマンドラインオプションが必要だからだろう。
55 :
デフォルトの名無しさん :02/10/21 17:12
DOSで実行せよ ということですか? mfc.exe command ってかんじに。
56 :
デフォルトの名無しさん :02/10/21 17:13
初心者です UUこの半角記号が打てないので プログラムを書くのに困っています。 キーボードの右下のUのキーを押しても¥が出てくるだけです どうすれば、英数半角でこの記号が打てるようになるのか 教えてください
ネタ質問は逝って良し
アホ質問は続くわ、void main()ツッコミ厨が出るわ・・・
おもしろいメールが盛りだくさんですね。
あー、C++でないんですけど
if文の分岐予測ペナが大きいと聞いたんでビット演算で回避できないかやってみたんです。
int A,B,C;(B,Cには適当な値)
A=(B-C);
if(A>=0) A=0;
を、
A=((A
>>31 )&A);
にしてみたんですけど、素直にif文使った方が僅差で早かったです…。
これって他のCPUでも同じ結果になるんですかね?(ウチはDuron1.2G)
可読性も考えると、素直にif文…かな?
>>53 main() が int を返さないなら、そのソースがどんなに酷似していても
C/C++ ではない。
>>56 それれ半角で書くとカタカナの "ヲ" だ (英字フォントでは "U" になる)。
この文字をプログラムで使えなくて困ることは無いはずだが?
"|" (Shift + "\") ではないのか?
>>58 printf() 使うのに <stdio.h> インクルードしない人ですか?
C++なら<cstdio>やろ
特別な理由が無い限りC++ではiostreamを使うけどね。 boost::formatも出来たし、printfはバイバイキーン。
C++に関係ない、っていうかネタ質問はさらりと流してほしいところ。
>>60 分岐予測はCPUによって実装が異なるだろうから
結果は微妙に変わってくるかもしれないけど、
よほど意地悪なor運の悪い状況でない限り、
ペナルティ多発ってことはないんじゃないでしょうか。
>A=((A
>>31 )&A);
同一レジスタに対する読み書きが連続することによる
ペナルティもあります。
素直にif文に一票。
66 :
デフォルトの名無しさん :02/10/21 18:11
ネタじゃないのですが UUこの半角記号が打てないので プログラムを書くのに困っています。 キーボードの右下のUのキーを押しても¥が出てくるだけです どうすれば、英数半角でこの記号が打てるようになるのか 教えてください
だからネタ質問は逝っってよし。
shift押せ、そして死ね
>>60 単純にアセンブリに直すと、
; if(A >= 0) A = 0;
cmp DWORD PTR _A$[ebp], 0
jl SHORT $L42319
mov DWORD PTR _A$[ebp], 0
$L42319:
; A = (A >> 31) & A;
mov eax, DWORD PTR _A$[ebp]
sar eax, 31
and eax, DWORD PTR _A$[ebp]
mov DWORD PTR _A$[ebp], eax
前者は (A >= 0) ならば 2 インストラクション、そうでなくても 3 インストラクション
で済んでいるのに対し、後者は一律 4 インストラクションになっている。
さらに、変数 A へのメモリアクセスも 1 つ多い。
というわけで後者の方が実はペナルティが多い。
分岐命令がパイプラインストールになる可能性は、コンパイラを使っている限り考えなくて
良い。
>>66 61 が見えんのか? やっぱりネタか?
70 :
デフォルトの名無しさん :02/10/21 18:17
>>68 shiftを押しても出ないので質問してるのですが
右のShiftを押しっぱなしにすると出るよ
69 追記。
> 分岐命令がパイプラインストールになる可能性は、コンパイラを使っている限り
> 考えなくて良い。
これは、コンパイラさえ使っていれば最良のパフォーマンスが得られると言う意味
ではないので念の為。
真に洗練されたアセンブリ使いの最適化には、どんなコンパイラも敵わない。
(漏れはコンパイラに敵わないが・・・)
そうではなくて、
>>60 のように一見意味の読み取れないようなコードを書くと、
コンパイラがすでに想定している最適化を適用できずベタなマシン語を吐き出し
てしまうので止めた方がいいと言う事。
>>77 それってC++挫折組の捏造記事。
って何年前のネタだよ。
>>77 ああ、これ探してたんだ。ありがとう。
でも今読むと古臭いね。テンプレートについて
何か言わなければだめだよね(藁
三角形の三辺の長さをa,b,cに呼び込んで、ヘロンの公式で面積Sを求めて出力する プログラムをC++で作ってください。ちなみにヘロンの公式、z=(a+b+c)/2 S=(z*(z-a)*(z-b)*(z-c))の平方根です。どなたかよろしくお願いします。
82 :
デフォルトの名無しさん :02/10/21 21:20
84 :
デフォルトの名無しさん :02/10/21 21:49
class A{ public: A(){::_beginthread(func,0,(void*)this);} void func(void){} }; これは何故エラーになるのですか? また、メンバ関数をマルチスレッドには出来ないのですか?
>>84 A::func() -> func(A this)
func(A this) != func()
すみません、相談ではなく質問でしたね。場違いですみませんでした。
>>84 class A {
HANDLE hThread;
unsigned idThread;
static unsigned _stdcall func();
public:
A()
{ hThread = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, &func, reinterpret_cast<void*>(this), 0, &idThread)); }
~A()
{ WaitForSingleObject(hThread,INFINITE); CloseHandle(hThread); }
}
unsigned A::func() { return 0; }
最後間違えた unsigned _stdcall A::func(void* a) { return 0; } で、この関数からメンバにアクセスしたい場合は A* Instance = reinterpret_cast<A*>(a); Instance->メンバ
class A { public: volatile bool m_bContinue; public: A() : m_bContinue(true){ _beginthread(func_, 0, (void*)this); } void func(void* data){ //... _endthread(); } static void func_(void* data){ ((A*)data)->func(data); } }; 俺ならこんな感じで。
>>90 メンバ変数m_bContinueは何のために・・・?
static関数をインライン宣言しているのは何のために・・・?
しかも再帰構造になっているのは何のために・・・?
しかもCスタイルのキャストだし。ってこれは別に良いか・・
93 :
デフォルトの名無しさん :02/10/22 13:50
Intel C++ Compiler ってどうですか? ANSI C++ や ISO C++ に準拠しているようですが、 Loki とか Boost とか何の手も入れることなくコンパイルできますか? 使っている方がいたら教えてください。
Effective C++くらいは読め。
95 :
デフォルトの名無しさん :02/10/22 18:04
デストラクタで仮想関数を呼び出した時の振る舞いって不定でしょうか? コンストラクタは「未構築」なので不定(たいていはベースクラスのものですよね) なのは理解しています。 ちなみにデストラクタは virtual にしています。 デストラクトチェーン中にわざわざ vptr を書き換えているのでしょうか? ちなみに CodeWarrior for Windows 7.0 で確認した状態では ベースクラスの関数が呼び出されてしまいます。
みんなBoost使ってるんだ。いいなぁ。 保守が難しくなるってんでうちは標準ライブラリしか使わせてもらえないよ。
みんな標準ライブラリ使ってるんだ。いいなぁ。 保守が難しくなるってんでうちは独自ライブラリしか使わせてもらえないよ。
みんなC++使ってるんだ。いいなぁ。 (以下略
みんな仕事してるんだ。いいなぁ。 (-_-
みんなPC使ってるんだ。いいなぁ。 保守が難しくなるってんでうちは紙と鉛筆しか使わせてもらえないよ。
みんな文字つかえてるんだ。いいなぁ。 何万年後の保守が難しくなるってんで、うちは象形文字一筋。
>>95 >デストラクトチェーン中にわざわざ vptr を書き換えているのでしょうか?
そういうこと。
コンストラクト時は基底クラスのコンストラクト直後に派生クラスの vptr に
書き換える。デストラクト時は逆に基底クラスのデストラクト直前に vptr を
基底クラスのものに書き換える。だから、「不定」ということはない。
>>104 なるほど…。まだまだ詰めが甘かったです。ありがとうございました。
class A { const char* m_fname; public: A(const char* fname); ~A(); }; というクラスがあったとき、 A::A(const char* fname) : m_fname(fname) {} とやるのと A::A(const char* fname) : m_fname(strdup(fname)) {} A::~A() { free(m_fname); } とやるのでは、後者の方がより安全性が高いと言えますか?
108 :
デフォルトの名無しさん :02/10/23 08:35
用途によるだろ。 Aを構築した後、fname の参照元に対する変更に追随する必要があるなら前者だし、 影響を受けてはいけないなら後者だな。 #VCでは _strdup だな。
コピーコンストラクタを用意していない以上、後者は激しく危険。
>>109 コピーコンストラクタむっちゃ忘れてました・・・
代入演算子もですよね
private:
A(const A& a){}
A& operator=(const A& a){}
って事でひとつ・・・
で、何が言いたかったかというと
>>108 氏が言及しているような事で、
前者だと参照元がなんかの拍子で書き替わってしまったら〜
という危険性は無いのかなという疑問でした
>>107 が正解ですかね・・・
>>110 const char*だからなんとなく変な気がするけど、
通常のクラスで考えてみるといいよ
前者、後者どちらもあり得るけど
値型に近いもの(文字列とか)なら後者にすることが多いねえ
Loki-lib みたら、Intel C++ Compiler は、素の Loki 呼ぶようになってたよ。
Intel C++ Compiler 検討してみようかな…
>>96 ありがとう。参考になりました
>>110 そう、文字列クラスを使うのが正解。
遅延評価してくれる文字列クラスなら
あなたの出した2つの例のいいとこどり(↓)ができる。
文字列のコピー元の内容が変わらなければ、ディープコピーが行われることはない。
文字列のコピー元の内容が変われば、その時点で複製が作成される。
114 :
デフォルトの名無しさん :02/10/24 00:38
class A{ public:virtual ~A(){} }; というクラスがあって、 const A a; A *pa; pa = (A *)&a; 上のキャストはExceptional C++によると、新しいキャストに置き換えられない と書かれているんですが(const_castすると未定義になるらしい)。 つまり & で取ったconstポインタはconst_cast出来ないと言うことですか?
>>114 単に、引数でconst受けしたわけではなく、「本当にconst」なオブジェクトを
const_castすると結果が未定義というだけではなくて?
#そういう話であれば、糞C言語だってそういう規格だよ。
116 :
デフォルトの名無しさん :02/10/24 00:48
スレ立てるまでも〜スレで聴いてみたんですが、無反応だったのでこちらで 質問させてください。 C++で、 template < (略), class F> class X { friend F; 以下略 っていうのは文法的にどうなんですか? VC6なら通ったんですが、 g++の3.2だと template parameters cannot be friends で はねられました。 BCC32の5.5.1でも通りました。
>>115 レスthanks.
constで宣言&初期化したオブジェクトはconst_castできないんですね。
いままでconst_castすれば何でもconstをはずせると思ってました。
。
Windowsで使えるDBMライブラリってないですか?
>>118 レスありがとう。
>friend class F;
と書くと、VC6やBCC5.5.1ではfriendが利かないんです。
やっぱりtemplate parameters cannot be friends が正しいんですかね?
121 :
デフォルトの名無しさん :02/10/24 10:56
delete演算ではポインタの値はNULLにセットされるのでしょうか? 質問までの経緯としては, 1.あるソースを読んでいたら delete pA; pA = NULL; という2行があった. 2.今までてっきりNULLがセットされるものだと思ってた自分がいて, 焦る.セットされることを前提でif(pA)とかしてたし. 3.MSDNやWebでそのことを明言してるフレーズを見つけられず. といった流れです. 言語仕様ではどのようになっていたかご存知の方がいたら教えてください.
>>121 されない。
というか、
deleteはpAの型に応じたデストラクタを、引数pAをのせて呼び出すだけ。
無用なバグの回避のために、deleteの直後にNULLを代入するのはよい習慣。
>>122 レスありがとうございます!
以前書いたコードもチェックした方が良さそうですね.
もやもやが解消されてすっきりしました.
>>無用なバグの回避のために、deleteの直後にNULLを代入するのはよい習慣。
はい,心掛けるようにします.
>>122 > deleteの直後にNULLを代入するのはよい習慣。
俺はそうは思わない。無駄なコードは読み手に誤解を与える場合がある。
それに以下のような場合、NULLを代入するためだけにconstを外す必要が
あるが、constですむものをconstにしないのは悪い習慣である。
A *const pA = new A;
delete pA;
pA = NULL;
JavaやC#でも要らなくなった参照にはnullを入れるのがよい習慣 とされてるね。こっちは事情が違うけど、無駄な参照を減らすのは よいことだと思う。
>>121 自分でdeleteなんて書かなくていいようにするのがもっとよい習慣。
>>124 つーか、const なポインタを delete するような状況って
それをメンバとして持つオブジェクトのデストラクト時
くらいしか思いつかんが。
>>128 ポインタ自体の const と delete には何の関係もないと思いますが
何か勘違いしてません?
素人はnull/NULL/0を代入したほうがいいな。 余計なことを考えずにすむし。
厨房な質問ですみません。 NULLを代入するとどうしてバグ回避になるんですか?
まあ厨房はおとなしくNULL入れてろってこった。 あ、玄人の皆さんはしなくていいですよ。
>>132 ありがとうございます。見落としていました。
メンバ変数とかをdeleteをしたときに、NULLを入れておくようにするのですね。
デフォルト値プログラミングが流行るに3ペリカ
template <typename T> void safe_delete(T*& ptr) { delete ptr; ptr = static_cast<T*>(0); }
>>136 キャストしなくても 0 は明らかにヌルポインタなのだが。
C++必読書のご案内です。 基本 ブ厚いけど持っておくと(・∀・)イイ! ◎ プログラミング言語 C++ 第三版 普通 ◎ Effective C++ ◎ More Effective C++ ◎ Effective STL ◎ Exceptional C++ Hな方 ◎ Modern C++ Design
貧弱なマシンをお使いの方 ◎Optimizing C++
Efficient C++は激しくイマイチだった。memory pool くらいかなぁ。フ-ンと思ったのは。他はたとえば138の本を読んだことがあるなら常識。
C++ やっていたら人生に疲れました。 どうしたらいいですか?
>>141 ん?C++が人生に影響与えるほど疲れたか?
取り敢えず精神神経科にいって薬出してもらいなさい。
>>143 レスありがとう!
とても助かりました。聴いてみてよかったです。
テンプレートまわりは、どの処理系も多少怪しそうですね。
リンク先を参考にさせていただきます。
呼び出し元で構造体配列のポインタを保持して、そのポインタのアドレスを渡して 呼び出し先で新たに領域確保したいのですが、単純型だと出来るのですけど 構造体になった途端同じコード使い回しているのに出来なくなってしまいます どなたかアドバイスを宜しくお願いします
147 :
デフォルトの名無しさん :02/10/25 12:59
ダブルポインタで渡さなければならないとこでポインタ渡ししているとか。
>>147 void hoge(WORD **p,DWORD s,DWORD a);
main()
{
WORD *p=NULL;
hoge(&p,i*j,j);
}
void hage(VERTEX **vertexdat,DWORD *dwNumVertices,DWORD div,
FLOAT fTheta0,FLOAT fTheta1,POINT Center,FLOAT r);
main()
{
VERTEX *vertdat=NULL;
hage(&vertdat,&dwnum,4,
D3DXToRadian(30.f)*i,D3DXToRadian(30.f)*(i+1),cntr,20.f);
}
上は出来ても下は失敗するのですが、?
149 :
デフォルトの名無しさん :02/10/25 13:34
コンパイルエラー?それとも論理エラーっぽいの?
150 :
デフォルトの名無しさん :02/10/25 13:37
それとDirect3D使っているみたいだから、hage内で想定しない HRESULTが返ってきているためのエラーかもね。
コンパイルエラーというか、newやらdelete[]が失敗して落ちます VC6のメモリウィンドウで*vertexdatが違うところを指していて *vertexdat+0が実際の場所を指しています これはメモリウィンドウのせいかもしれませんが、気になります
>newやらdelete[] new と delete []をペアでつかっているの?new[]じゃなくて。
>>153 あれゲストでは入れませんか?ちょっと待っててください
読みにくいと思った。終わり。
158 :
デフォルトの名無しさん :02/10/25 15:36
すいません、どなたか教えてください。 もう行き詰って… 例えば手元に100個のデータファイルがあるとします。 その100個のデータファイルひとつひとつに 同じフィルタをかけたいのです。 そこで ifstream in(****, ios::in | ios::binary); ofstream out(####, ios::out ); filter(); こんな感じのプログラムをつくっているのですが、 この****と####をファイルごとに変えたいのです。 どのようにすればよいでしょうか? argvで100個ファイル名を打ち込むとか無しで。 自動的に行いたいのです。 1000個になってもファイル数だけ指定するだけで 簡単に処理できるようにしたいです。 よろしくお願いします。
ブラウザのアドレスのとこに貼り付ければいけるはずですが、
>>158 ファイル検索するか、ファイル名に規則性持たせたりすればいいのでは?
>>160 レスありがとうございます。
ファイル名に規則性をもたせることはできます。
自分の勉強不足かもしれませんが、
ifsteramの****部分には例えば"test1.dat"というような
きちんとしたファイル名を指定をしないと読み込めないみたいなのです。
そうするとtest2.dat、test3.dat、test4.dat…test100.datと続くとき、
どうループをまわせばよいのかと。
strcpy(str,"test"); sprintf(s,"%d.dat",i); strcat(str,s); じゃ駄目ですか
>>162 ありがとうございます。
ちょっとやってみます。
for (int n = 0; n < max_num; ++n) { std::string s("file"); s += boost::lexical_cast<std::string>(n); s += ".???"; ifstream ifs(s.c_str()); ...
>>164 ありがとうございます!
これもまたやってみます。
C++初心者なのでちょっと理解するのが大変そうですが。
>>163 sprintf、これは思いつかなかったです。
>>159 クリックで行けたよ。
このコードを見る限りでは new は不要に思える。
WORD w[8][8];
for (int x = 0; x < 8; ++x)
for (int y = 0; y < 8; ++y)
w[x][y] = x * 8 + y;
でいいんじゃない。
どのような結果を期待していたのかが解らないので、これ以上はなんとも言えない。
うわかっちょいいあちきは元々c屋なもんでへっぽこですな
>>157 hageの方が実際の実装予定関数でそっちは可変長で実装するので
newで確保->newでサイズ増やして再確保->・・・
が必要なのです
で多分hageはメモリエラーしてそうな気がしてきました
(グローバルにしても落ちたので)
がんばってバグ取りします
レスありがとうございました
>>168 そんな貴方に std::vector。
typedef vector<VERTEX> Vertices;
Vertices v(n) n = 要素数
v.resieze(newsize) 拡大(縮小にも使える)
v[index].x 要素アクセス
>>163 ,164
できました〜
ありがとうございました。
std::valarray<double> va;
174 :
147=149=150 ◆o615kFadeE :02/10/25 18:41
>>153 VERTEX *p=new VERTEX[*dwNumVertices+div*4];//VERTEX[*dwNumVertices+div];
又は、
*vertexdat=p;
for(i=0;i<= *dwNumVertices;i++)//for(i=0;i<div;i++)
{
という訳で書きこみオーバーによるdelete []
の例外発生。
C++では、eof()の発生時期がCと違うようなのですが。 ifstream stream("filename", ios::binary); while (!stream.eof()) { 処理1 stream.read(reinterpret_cast<char*>(&rec), SIZ); } とやると、一番最後のレコードを2回読んでしまいます。 どうすれば一番最後のレコードを1回しか読まないようにできますか?
whie (1) { // ... if (!stream.read(...)) break; }
>>176 ありがとうございます。ということは、レコードがない所でreadを
実行しないとEOFが検出されないようですね。助かりました。
>175 おいおい。 EOF の発生条件は C の fread() や fgets() 等でも同じでないかい? ファイルの終端を超えて読もうとしない限り EOF にならない。
EOFの発生条件は ×ファイルポインタがファイルの終端に到達した ○ファイルの終端を越えてreadしようとした でOKですか?
>>178 うむそうですね。fread()などはファイルの終端に達していても
読み込んだバイト数を返しますからね。
>>179 そのようです。
既存のcppソースに、ダイアログからのテキスト入力を追加したいと思っています。 〜なんとか.rc というファイルができて、レイアウトなどはできたようなのですが、 これを既存のソースからどう呼び出せばいいのか、わかりません。 サンプルが載っているページ等でもいいので、どなたかヒント戴けませんでしょうか。 (ダイアログの使い方は、VBで言うところのInputBoxみたいな感じです。text入力欄とok、cansel)
∧_∧ ∧_∧
_( ´∀`) (´∀` )
三(⌒), ノ⊃ (
>>1 .) 糞スレは
 ̄/ /) ) | | |
. 〈_)\_) (__(___)
∧_∧ .∧_∧
( ´∀) (´∀` )
≡≡三 三ニ⌒)
>>1 .) 立てるなって
/ /) )  ̄.| | |
〈__)__) (__(___)
∧_∧ ,__ ∧_∧
( ´)ノ ):;:;)∀`)
/  ̄,ノ''
>>1 . ) 言ってるだろうが
C /~ / / /
/ / 〉 (__(__./
\__)\)
ヽ l //
∧_∧(⌒) ―― ☆ ―――
( ) /|l // | ヽ ヴォケがーー!
(/ ノl|ll / / | ヽ
(O ノ 彡'' / .|
/ ./ 〉
\__)_)
やい 184、漏れの白星パンチを無闇に振りまくな。
186 :
デフォルトの名無しさん :02/10/26 09:32
この業界入って、何の資格も取らずに40歳までいっちゃうとリストラ対象になるってホントですか?
マネジメント能力があれば飛ばされはしないだろう。 いつまでも古いコードを吐いてもらっちゃ困るしな。
189 :
デフォルトの名無しさん :02/10/26 16:05
ぬるぽのチェックは、 if (nanikano_pointer) { // not null } else { // nurupo } でいいの? あと、NULLは、<iostream>に定義されてるの?
>>189 NULLを0と断定するのは危険。
とでも言っておこう。
>>189 null pointerチェックはそれでいい。
規格でnull pointerは「偽」とみなされることになってる。
char* null_po() { return 0; } // ok.
サブクラスのコンストラクタでスーパークラスの関数を 必ず呼ぶようにするのは、どうするのです? <pre> class A { A() { いろいろ処理 } void Init( int i ) { いろいろ処理 } } class B : public A { B() { いろいろ処理 Init( 100 ); <----これを必ず書いてはしい } } </pre> ドキュメントに書いとく事しかできないのですかな。
class A { A(int n); };
コンストラクタで済ますのが理想だねえ ダメなら、デバッグビルドのときはフラグでInitを呼んだかチェックするように するとか・・・
197 :
デフォルトの名無しさん :02/10/26 18:26
NULLは<cstddef>だろ。ていうか使うな。
198 :
デフォルトの名無しさん :02/10/26 18:28
C++って文法が汚いんですか? オーバーロード機能のせいですか?
>>198 オーバーロードは汚いとは思わないけど、
lambdaやinterfaceが無いから汚くせざるを得ない、って事はあるかもね。
200 :
デフォルトの名無しさん :02/10/26 18:46
コンストラクタで そのクラスのメンバ関数を呼び出しても 基本的にはOKと思ってるんですが、 問題になる場合はどんな時なんでしょうか?
201 :
デフォルトの名無しさん :02/10/26 18:55
メンバ関数が別のクラスのメンバ関数を呼んでいて、 そこでそのクラスのコンストラクタが呼び出されると、、
202 :
デフォルトの名無しさん :02/10/26 19:03
女子生徒「先生、私、ここの公式、どうしても暗記できないんです。」 先生 「頑張れば、だんだん、覚えられるようになるよ。」 女子生徒「で、でも・・・。先生は全部暗記してるんですか?」 先生 「もちろん。受験生のときに、なんとか暗記したよ。」 女子生徒「いいなぁ。先生の脳みそ、わたしにも分けてほしいな。」 先生 「ははは。脳みそは無理だけど僕の遺伝子だったらあげてもいいよ。 僕の遺伝子には、今まで勉強してきたことがすべて記憶されてるんだよ」 これがあれば、簡単に合格できるかもよ。」 女子生徒「え〜。それ、欲しい、欲しい。どうすれば、先生の遺伝子もらえるの?」 先生 「そうか・・・。じゃあ、スカートとルーズソックスはそのままでいいから パンティをぬいでごらん。」 女子生徒「はい、脱ぎました。早く、先生の優秀な遺伝子をください。」 先生 「そんなにせかさなくても、たっぷり分けてあげるから。 それじゃあ、始めるよ。ハァハァ・・・。」 女子生徒「あっ・・・。先生・・・。も、もっと・・・。」
203 :
デフォルトの名無しさん :02/10/26 19:48
C++で、Javaの (Cast)Class.forName("className").newInstance(); ってどうやるの?
204 :
デフォルトの名無しさん :02/10/26 19:57
>>203 それをやるとどうなるのかをまずかけ。
C++を知っている奴がみんなJAVAを知っているわけじゃないだろ。
>>200 そのクラスではまだ実装されてない純粋仮想関数を呼び出すとヌルポで落ちる
207 :
デフォルトの名無しさん :02/10/26 20:38
210 :
デフォルトの名無しさん :02/10/27 00:01
コンパイラによってデフォルトのコピーコンストラクタと代入演算子が 生成される条件(あるいはされない条件)について判りやすく説明しているサイトってないですか?
コンパイラに依存するんだっけ?
sinaidesu
>>210 される条件。
・(コピーコンストラクタ|代入演算子)が宣言されていない
・全てのメンバ変数がそのクラスのスコープで(コピーコンストラクト可能|代入可能)
・派生元が、そのクラスのスコープで(コピーコンストラクト可能|代入可能)
以上。
214 :
デフォルトの名無しさん :02/10/27 00:24
char aho[10000000]に一括してある数でXORかける関数ありませんか? なかったらforでチマチマやってくしかないでしょうか。
標準ライブラリにはないですね。 チマチマやる関数を作りましょう。
216 :
デフォルトの名無しさん :02/10/27 00:35
わかりました。
>>214 namespace {
char Xor( char c, char m ) { return c ^ m; }
}
int main(void) {
static const char aru_kazu = 10;
char* aho = new char[10000000];
std::transform( aho, &(aho[10000000]), aho, std::bind2nd( std::ptr_fun(Xor), aru_kazu ) );
}
・・・嘘です。
218 :
デフォルトの名無しさん :02/10/27 00:59
struct Xor : public std::unary_function<char,char> { explicit Xor(int m) : m_m(m) {} result_type operator()(argument_type c) { return c ^ m_m; } private: char m_m; }; ... Xor f(aru_kazu); std::transform(aho, &(aho[10000000]), aho, f); のほうがだいぶ速いのではなかろうか。 >・・・嘘です。 同じく。
オナニーショウは終わりですか?
多分あと2つくらい。
221 :
デフォルトの名無しさん :02/10/27 01:04
真のC++プログラマーなら、C のキャスト 使わずに static_cast dynamic_cast const_cast とか、使うべきですか? これを、使うことによって、メリットってあるのかな? 人のソースとか、読んでると、ほとんどの人が、Cキャスト。
>>221 仕事ならば、そこのコーディング規約に従う。
趣味あるいはコーディング規約を作る立場ならば、
C++キャストが適した場所には必ず使う。
>>221 漏れはCキャストは使わないが、コーディング標準を決めるときは
・dynamic_castは代用できないから使わざるを得ない
・(constをどうしてもはずさなければならないならそのようにしてもいいが、Cキャストではなく)const_castを使え
・あとは好きにしたら?
くらいにしている。逆に、数値計算っぽい箇所でのstatic_cast強要は少し
可愛そうかな(タイプ数的に)、とも思う。
なお、生粋のCプログラマさんには、 ・type safetyのありがたさ ・const objectのありがたさ をわかってもらった上で、223の規約を適用します。 放っておくと無意味なキャスト、無意味なconstはずしで積み上げてきた各種の保証がぼろぼろになるから...
225 :
デフォルトの名無しさん :02/10/27 01:17
221はどーしてんのYO
>174 亀レススマソ デバグしていただいてありがとうございました
228 :
デフォルトの名無しさん :02/10/27 01:32
189が正しい、という突っ込みが入ったからそれでいいんじゃないの?
229 :
デフォルトの名無しさん :02/10/27 02:03
キャストoperatorで暗黙の変換が 予想通りに働かないのですが、なぜなんでしょうか? struct to { const char* ptr; to(const char* c){ptr = c;} operator const char* (){return ptr;} const char* get(){return ptr;} }; void print(to a) { std::cout << a;//const void*が呼ばれてる!!//address std::cout << (const char*) a;//正しい//aa std::cout << a.get();//正しい//aa std::string s = a; std::cout << s;//これは正しい//aa } int main() { print("aa"); }
g++の3.2ではprint関数の最初の出力は問題ありませんが? あと、std::string s = a;は s(a) ; とせんとコンパイルでけん。
>>230 サンクス。
やっぱ、VC++.NETのバグの気がしてきた。
std::string::string(const char*)があって to::operator const char*() があるからって 暗黙に std::string s = a.operator const char*(); してくれるんだっけ?
規格の裏づけがないようなコードは書かずに、素直に明示キャストした方が いいような。 229 に関しては、ostream への operator<< を実装すべきだ。
struct to に複数のcast operatorがあって coutが複数のoperator overloadがあると どれが選ばれるか分からんような...
>>234 BCCだと型を明示しろっつーコンパイルエラーが出る
確か「cout << static_cast<目的の型>(to)」で問題ないはず
>>234 一体何で混乱する?
何も考えずに operator<< が呼ばれる。
その前に明示的に型キャストを指定していれば別だ。
# 漏れ的には、229 の std::cout << a; で、何で to::operator const char* () と、
# それに続けて ostream::operator<<(const void *) が呼ばれるのか分からん。
# まあ VC のバグなんだろうな・・・。
あと、ややどうでもいいか゜ 229 が何で std::endl をつけないのか不思議だ。
すまそ、234 の意味を取り違えてた。 逝ってきます・・・
>>236 > 一体何で混乱する?
> 何も考えずに operator<< が呼ばれる。
どの operator<< が呼ばれるの?
具体的な宣言まで一緒に書いてみてよ。
>>238 いやすまん、223 から続けて 234 を読んで混乱したみたいだ・・・
忘れてくれ。
アイヨ
>>239 ついでだから
struct to a;
printf("%d", a);
とやるとどうなるんだっけ、とか混乱してみる。
>>240 やってみた。
単に、a のアドレスが 10 進で出るみたいだ。
a.ptr と同じアドレスだからやや紛らわしそう。
つまり、printf(const char *, ...) だから型キャストなんて発生しない という事かな。
243 :
デフォルトの名無しさん :02/10/27 14:40
>>221 C風キャストに使う理由が見出せない。
C++のキャストの方が意図・区別がし易い。
C++では()を使ったキャストは基本的にご法度?
yes
なるほど。さんくす個
ていうかconst外しなんてするべきではないよな。
221の話題だな
const外しが発生するのはそもそもインターフェイス設計が 間違っていると思います。
>>249 厨房と爺はメソッドをconstにしないし、引数をconstにしないんだからしょうがない。
古いCライブラリを実装してたら外さなければならない状況がありました。
>>241 dobleとintの間の変換をしょっちゅうやるような場所だったら、
Cキャストの方が楽だし、そういう場面では危険も少ないとは
思う。それ以外なら問答無用でC++キャストにするけど。
>>252 明後日の方向にレスなさってますか?
つーか、「C キャストの方が楽」 って・・・タイプ数が少ないって事?
タイプ量云々以外にC風キャストを使う意味ってあるんですか?
255 :
デフォルトの名無しさん :02/10/27 16:43
不定… 未定義… (・∀・)イクナイ!
どうでもいいけど、クラスのメンバ変数の名前ってどうしてる? 1, 接頭辞m_をつける 2, 接尾辞_をつける 3, んなもんつけない(で、メンバ関数の引数とかぶるときはthis->をつかう) 俺は2か3で迷ってるんだけど…。(最近は2) 1は使ったことない。
>>256 漏れは、自分だけで書くなら常に 3。
共同の場合は相談に応じて。
仕事の場合はしょうがないから規約に従う。
自分だけで書くコードは最近は3。 人に見せるときは1か3、だなぁ。接尾辞 _ って 目立たないので、あんまり付ける意味が感じられなくて。
仕事のときにはそこの規約にしたがう。 そうでない場合は気分によるな・・・どれでも別に構わないし
そろぞろ「接頭辞をつける奴はアフォ」発言が来るぞ
Say Prefix
最近2の「接尾辞_をつける」パターンをよく見る。 いつごろから使われだしたんだろ。
>>262 漏れの場合は Exceptional C++ を読んでから。
「クラス名::メンバ名」って人はさすがにいないのかな。
「接[頭]辞 _ は使ってはいけない」 理由が書いあるけど、
接尾辞_については特に。「個人的なおすすめ」とだけ。
あの本好きなので習ってみただけっす。
>>265 それはstatic変数用にとっておく。
クラスのメンバに接頭・接尾語付けないヤツはアホ クラスメンバint aがあったとして Class::GetA() { return a; } Class::SetA(const int& a) { this->a = a; } とかやってたら更にアホ Class::a() { return m_a; } Class::a(const int& a) { m_a = a; } にしろ
とりあえず理由を述べないヤツはアホ
クラスメンバにaなんて短い名称をつけるやつがアホ。 クラスにするくらいなんだから、意味づけしろよ。
ただの例文に対してそんなところにしか突っ込めない奴が一番アホ。 終了。
268 を無視して 269 だけ煽り返す奴は宇宙一 DQN しかも 269 は 「一番アホ」 と表現する程でもない
失礼。 269 は 「一番アホ」 と表現する程でもないどころか、言っている内容は 至極まともだ。 ただの揚げ足取で、269 の本論は全く覆せていない。 つーか例示にしても a じゃなくて Something とかにしとけ。
2 6 7 必 死 だ な
「関数の型を書かないやつはアホ」とかくだらないことどんどん書いててくださいよ
ってか、267 の示した前者と後者も、大した違いは無い。 と言うより、本当のプロパティのように扱えない以上、Get/Set は つけるべきとまでは言わんが、そうしても良いと思うがどうよ?
アホキター!!!
>>275 正直、コーディング規約が統一されてればどっちでも良い。それより int を
渡すのに、わざわざ参照使ってる方が気になる(w
(まー、今時のコンパイラなら最適化かければ結果的には変わらんだろうが)
>>278 Class::GetA() const、になっていないのも気になって夜も眠れない。
そろそろ「prefixをつける奴はKIMOI」発言が来るぞ
281 :
デフォルトの名無しさん :02/10/28 00:40
JavaHouse方面で、"m_ "を "余計なもの"と呼称する祭りが以前は定期的に開催されていたと 記憶していますが、その際の叩く理由は何でしたっけ?C++には関係なし?
要約すると、267 が一番アホという事か。
prefixをつける奴はKIMOI
284 :
デフォルトの名無しさん :02/10/28 00:47
suffixをつける奴はKIMORIN
なんで
>>260 で完璧に予言されてるのに、普通にルーティンワークしてるんだよ(藁
ニチャソダカラ
Cマガジンが毎年C言語入門講座をやるのと同じでは?
自己言及的テンプレートのようで(・A・)イイ!
>290 カオガイクナイ
なんか凄いことになってるな…。。。 接尾辞_はタイプ数が減るから好き。 this->はちょっと長い。 m_はそもそもなんか格好悪い。mってマゾですか(藁
「アフォ」「キモイ」「格好悪い」 キター!!!!
class A { int a; public: int GetA() { return a; } void SetA(int a) { this->a = a; } }; とかやってるヤツは低脳 class A { public: int a; }; にしろ
>>295 内部で保存していたいデータと外から見えるようにしたいデータが著しく違う場合は?
たとえば、日付は内部では整数型で管理した方が都合が良いが外には文字列型で見せたいとか。
297 :
デフォルトの名無しさん :02/10/28 09:30
お互いがお互いをメンバに持ち合うクラスって作れますか? class A{ B b; }; class B{ A a; }; みたいな
>>295 それなら構造体にするのが普通だと思うんだが
299 :
デフォルトの名無しさん :02/10/28 09:56
>>297 ポインタだったら可能。
class A {
B *b;
}
class B {
A *a;
}
A *a = new A(); a->b->a->b->a->b->a = a; わけわかんねえ…
>>301 リンクリストとかツリーとかだとそういう構造になるけど…
メンバ変数がset/get関数でしか参照されない場合、 その設計は100%誤りである。
>>302 ツリーなら2つクラス用意せんでもいいんでないかい?
>>303 定義を述べるだけなら誰でもできる。
根拠もついでに示してくれ。
>>301 途中のでNULLポインタが混ざっててエラーを起こす罠
>>304 > ツリーなら2つクラス用意せんでもいいんでないかい?
「そういう構造になる」というのは、データが再帰的に
連なるって程度のことで、深い意味は無いです…
(ツリーだとノードとリーフで複数のクラスを使うことがよくあるとは思うけど)
308 :
デフォルトの名無しさん :02/10/28 14:28
C++規格書の日本語版はJISから手に入りますか?
309 :
デフォルトの名無しさん :02/10/28 16:18
C++をやりたいのですが、Cの知識もないときついでしょうか?
いいえ。
あるクラスを定義して、 それが参照されたときに必ず、 ある関数が先に呼ばれる、って事を実装したいです。 class CLASS_BASE { public: void f_0(){ /* こっちを呼んだ時でも、 */ } }; class CLASS : public CLASS_BASE { public: void f_1(){ /* こっちを呼んだ時でも、 */ } public: void f_2(){ /* これが、いつも先に必ず呼ばれる */ } }; f_1 は内部で f_2 を呼べばいいのですが、 f_0 は既存の物なので、書き換えるわけにはいきません。 関数が1つ2つならオーバーライドですみますが、 関数はたくさんあるので巧く書けません。 どなたか、エレガントな方法をお教え下さい。
>>309 ┌──────────┐
│ Cの知識 ┌────┼───────┐
| .|. . . |. . .C++.の知識.|
└─────┼────┘ . |
. └────────────┘
かぶる領域はある。
被るというか抱合してやってるというか。
#DEFINE DECLARE_INHERITE_HOOK(base, func, hook)\ void (func)(){\ (hook)(); \ (base)::func();\ } とでもしとけ。
CLASSでvirtual void f_0(){ f_2(); p_q(); }は… だめだな当然(-_-)
fps = 1000.0f / (timeGetTime() - prev_time); だとちゃんと動くのに fps = 1000 / (timeGetTime() - prev_time); がゼロ除算エラーになるのは何故ですか・・・?
319 :
デフォルトの名無しさん :02/10/28 20:28
class CA{ public: int ma; CA():ma(NULL){} void thread(void){::_beginthread(func,0,(void*)this);} static void func(void* p){ ((CA*)p)->fff(); ::_endthread();} void fff(void){cout<<ma<<endl;} }; void main(void) { CA ca; ca.thread(); } を実行すると24と表示される。ナゼ・・・???
320 :
デフォルトの名無しさん :02/10/28 20:59
画面に0〜99の数字を1秒間隔で表示。1〜9で改行、するプログラムを教えてください 図にするとこんな感じです 1 2 3 4 5 6 7 8 9 10 11 12〜〜〜〜〜〜〜〜〜19 20〜〜〜〜〜〜省略〜〜〜〜〜〜 〜〜〜〜〜〜〜〜〜〜〜〜〜〜99 解らねえ・・・
counter % 10 == 0 の時、'\n' 挿入したら。 コンソールだったらの話だけど。
for(i=1;i<=100;++i) { if(i%10==0) putchar('\n'); printf("%d ", i); sleep(1); }
>>320 boost::timer t1
for(i = 0; i < 10; i++) {
for(j = 1; j < 10; j++) {
cout << i*10+j;
while(t1.elapsed() >= 1.0f) Sleep(1);
}
cout << endl;
}
>>324 for(i = 0; i < 10; i++) {
for(j = 1; j < 10; j++) {
cout << i*10+j;
boost::timer t1;
while(t1.elapsed() >= 1.0f) Sleep(1);
}
cout << endl;
}
めちゃくちゃだな(藁
>>322 要求全然満たしてないぞ
>>320 は1〜99と言っている
しかもsleepの分解能は秒か?
>>325 whileの不等号式が逆だろ
328 :
デフォルトの名無しさん :02/10/28 21:46
>>326 > しかもsleepの分解能は秒か?
unix系は秒単位じゃなかったっけ?
>>320 を見ると、最初の行は全角で、後の行は半角だ。
なかなかの引っ掛け問題だな
正解者ゼロか。しょせん2ちゃんねらーはこの程度だな。
>>320 を見ると文章には0〜99と書いているが、
表示例には、
最初の行が1〜9で、その次の行からは10〜19、20〜29・・・
になっている。
これも引っ掛けか?
332 :
デフォルトの名無しさん :02/10/28 22:13
ソースファイル中にちりばめられた 「FileHandle << "なんたらかんたら" << endl;」(FileHandleはofstreamです) を、プリプロセッサマクロによって使う使わないの切り替えをする事は可能ですか? 例えば普通は #if defined(OUTPUT_LOG) FileHandle << "なんたらかんたら" << endl; #endif みたいにすると思うんですが、その量が膨大なので #define FileHandleで乗っ取って(?)処理しちゃうような 何か上手い方法はないかと思案中なんですが・・・
FileHandleのクラスを切り替えるようにすればいいのでは。
FileHandle を \dev\nul とか /dev/null とか…
335 :
デフォルトの名無しさん :02/10/28 22:56
operator << の定義を直接、書き換えてしまう。
336 :
デフォルトの名無しさん :02/10/28 23:22
ウムム・・・
FileHandle(厳密にはofstreamのラッパークラス)はユーザーにも公開していて
ユーザーが明示的に呼び出した場合は通常通りの操作をしたいのです
というのも、あるサブシステムを作っていて
そのエラーログを吐き出すのにFileHandleを使っているのですが
ユーザーから「標準のエラーログは邪魔くさいから有り無し変えられるようにして」と
仕様変更が入りまして・・・今更言うなよ・・・といったようなワケでして・・・
そのために1個グローバルなフラグを増やすのもアレですし
>>333 氏の発想でもうちょっと考えてみます
>>319 このままだとコンパイルすら通らないのでは。
fff() は CA::fff()
の間違いだとして…。分からん!
>>337 ヨクヨメ
まぁ良く読んでもわからんがw
339 :
デフォルトの名無しさん :02/10/28 23:35
すいません、どなたか
>>318 わかりませんか・・・?
>>339 timeGetTime() - prev_time
がゼロになってるからじゃないの?
>>339 本気でわからんか?
>>339 > fps = 1000.0f / (timeGetTime() - prev_time);
> だとちゃんと動くのに
本当にちゃんと動いてるとお思いか?
> fps = 1000 / (timeGetTime() - prev_time);
> がゼロ除算エラーになるのは何故ですか・・・?
timeGetTime() と prev_time はどっちも多分 DWORD 型なんだろう?
timeGetTime() == prev_time の時、どうなるか考えてみろ。
まんまゼロ除算だろうが。
ちなみに、1000.0f の時に落ちないのは、浮動小数点演算の場合にゼロ除算を行った場合、
整数助産の場合と違って一般保護例外にならず、#INF 値を返すからだ。
#INF 値は整数に代入すると、0 になる。
だから、見かけ上動いてるように見える。
fps の型を double にして、std::cout に投げてみろ。
整数助産だって・・・カコワルイ 追記。 浮動小数点演算のゼロ除算が一般保護例外にならないのは、浮動小数点数は #INF 値つまり無限大を表現できるからだ。 だから整数の場合と違ってわざわざ一般保護例外にする必要が無い。
余計なツッコミだけんども win32環境ではゼロ除算と一般保護例外は別だよ。 他もそうだと思うけど。
344 :
デフォルトの名無しさん :02/10/29 00:04
>>341 1000.0fだとちゃんと動きます
デバッガでwatchしてみると
1000.0fの場合→正しいFPS値
1000の場合→unsigned int 0(0x0)
になります
もちろん初回計算時はprev_time = timeGetTime() - 10;
などとしてゼロ除算にならないように注意しています
更に、FPSを計った後Sleep(1)しているので
OSが仕様を踏襲している限り
(timeGetTime() - prev_time)がゼロになることはありえません
345 :
デフォルトの名無しさん :02/10/29 00:05
ちなみに環境はWin98SE/BCC5.5.1です
>>344 なら
DWORD tmp;
tmp = timeGetTime() - prev_time;
fps = 1000 / tmp;
とでもしとけ。
>>344 それって・・・
それって・・・
エラーが発生してるんじゃなくて、単に整数演算の丸めで 0 になってるだけじゃ・・・
timeGetTime() - prev_time > 1000 の時どうなるか考えてみろ。
Sleepの精度は結構悪かったような記憶があるが。
349 :
ちなみにソースの一部 :02/10/29 00:14
メインループで、while { 内部処理; Render(); }としていて、Render()の実装が void cEngine::Render() { const static DWORD fps_limit = 60; static DWORD prev_time = (timeGetTime() - 10); fps = 1000.0f / (timeGetTime() - prev_time); // 内部処理が間に合っていなければコマ落ちさせる if (fps < fps_limit) { prev_time = timeGetTime(); return; } else { // Sleepの誤差が5msとして、余った時間を計算する DWORD over_time = (1000.0f / fps_limit) - (timeGetTime() - prev_time) - 5; if (over_time > 0) Sleep(over_time); while (fps >= fps_limit) fps = 1000.0f / (timeGetTime() - prev_time); } prev_time = timeGetTime(); lpD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 0 ), 1.0f, 0); lpD3DDevice->BeginScene(); /*いろいろ*/ lpD3DDevice->EndScene(); lpD3DDevice->Present (NULL, NULL, NULL, NULL); Sleep(1); } です
350 :
デフォルトの名無しさん :02/10/29 00:16
>>344 >更に、FPSを計った後Sleep(1)しているので
>OSが仕様を踏襲している限り
>(timeGetTime() - prev_time)がゼロになることはありえません
ありえません?
これだから・・・
つーか、根本的に間違ってないか? FPS って普通 frames per second つまり 1 秒に何フレーム描画したかという ベーンチマークのことで、実際に 1 秒きっかりを測って実際に何回レンダリング できたかを測るものだろ。 決して、1 秒を 1 回のレンダリング時間で割った数値ではない。
>>351 あーはい・・・内部処理に49日とちょっとかかるとゼロになりますけど
>>352 それはわかっていますが、内部処理でfpsを見たりしているので
現時点での疑似FPSが必要なんです
/*いろいろ*/の部分で1秒毎に描画済みフレーム数調べる処理はしています
>>349 センスのかけらも感じないな。
timeGetTimeは一回だけ呼び出せ。
こんな関数でstatic使うな。
そんな判定で除算を使うな。
C++じゃなくなってきたけどまあいいか
>>356 除算とかの話なら、C++ でも範疇だろう。
それとも、C++ でも C と重なる機能は C スレへ逝けって?
>>354 >timeGetTimeは一回だけ呼び出せ。
定義することは誰でもできます
明確な理由を教えて下さい
>こんな関数でstatic使うな。
こんな関数でメンバ変数増やしたくありません
>そんな判定で除算を使うな。
どうやっても60FPSと指定したい場合は
どっかで1/60なり除算しないと無理だと思うんですが
プリプロセッサにやらせろって事ですか?
ユーザーが動的にFPSを指定したい場合は?
>>357 ゼロ除算になるのは何故?という質問が
FPSの計り方にズレてきている事を指しているんじゃないでしょうか
>>355 丸め誤差で変数fpsがゼロになったところで、
どこを見ても「任意/fps」の式はありませんが・・・?
>358 問題はここ if (fps < fps_limit) { prev_time = timeGetTime(); return; } ここからreturnした場合、最後のSleep(1)が呼ばれないので 内部処理が1ms以内で終わった場合ゼロ除算になる
>>358 漏れは 354 じゃないけど 「timeGetTime() は一回だけ呼び出せ」 には賛成。
他の場合ならいざしらず、FPS 値が重要になるような局面では。
「こんな関数で static 使うな」 の意味だけど、static にする必要も無い
(当然メンバ変数にする必要も無い) ものが static になってるという事じゃ
ないの?
static DWORD prev_time = (timeGetTime() - 10); の初期化は 1 回しか
行われないけどいいの?
(もしかしてこれが今回の騒ぎの原因じゃあ・・・)
ヒープに確保しなければならないようなでかい領域を使わない限り、auto 変数の
速度上のコストって全くのゼロなんだけどな。
あと、355 にある 「347 の件」 は 349 のソースには全く関係無いんだけど、
「どこを見ても「任意/fps」の式はありませんが・・・?」 ってどう言う意味?
359 見て、 > 「こんな関数で static 使うな」 の意味だけど、static にする必要も無い > (当然メンバ変数にする必要も無い) ものが static になってるという事じゃ > ないの? は取り消し・・・
>>359 解決しました
ありがとう
>>360 最後のヤツですが、ゼロ除算エラーが起きる事が問題だったので
fpsがゼロになることは一向にかまわないのですが、という意味です
>>362 解決すんなよ。そんな腐れコードさっさと捨てろ。
・timeGetTimeは一回だけ呼び出せ。
2回呼び出したときの値が同じだと期待できる根拠はどこにもない。
にもかかわらず、貴様のソースはすべての呼び出しで
同じ値が帰ってこないと意味を成さない。
・こんな関数でstatic使うな。
メンバ変数は要らなくなったらプログラムの都合でメモリ領域を開放できる。
static変数はプログラムの都合では開放できない。
static変数は初期化のタイミングも、プログラムの都合には合わせられない。
cEngineのインスタンスが一度破棄されて、再び生成されたときどうなる?
・そんな判定で除算を使うな。
↓のソース参照のこと。(prev_timeはメンバ変数)
void cEngine::Render()
{
const unsigned fps_limit = 60;
const unsigned time_limit = 1000 / 60;
const DWORD now_time = timeGetTime();
const DWORD time = now_time - prev_time;
prev_time = now_time;
if (1000 < time * fps_limit) {
return;
}
else {
以下略
あとは、やろうとしてること自体も根本的に間違ってるっぽ。
>はすべての呼び出しで 同じ値が帰ってこないと意味を成さない。 逆ですよ over_timeの計算はほとんど無意味でしたけど while (fps >= fps_limit) fps = 1000.0f / (timeGetTime() - prev_time); これは固定値だと意味をなさないどころか危険なコードになります >cEngineのインスタンスが一度破棄されて、再び生成されたときどうなる? されません(させません)し、当然nocopyableです cEngineはさらに上位のラッパークラスに生成を管理されています そのラッパークラスを1プロセス内で2度生成した場合の動作は保証しませんが 除算は大幅にはぶけました が、いまどき除算がボトルネックになるようなCPUでゲームはしないでしょう >やろうとしてること自体も根本的に間違ってるっぽ。 prev_time = now_time; これこそ間違ってるっぽいんですが・・・ 私のやろうとしている事は 余った時間の算出→その分だけSleep→実際にかかった時間を取得→もろもろの処理 という至極単純なモノです 疑似FPSの算出でちょっとややこしくなってますが
やれやれだぜ、。 > while (fps >= fps_limit) fps = 1000.0f / (timeGetTime() - prev_time); > これは固定値だと意味をなさないどころか危険なコードになります もともと無意味で危険な糞コードなんだよ。 そんなループいらねぇだろ。 > されません(させません)し、当然nocopyableです > cEngineはさらに上位のラッパークラスに生成を管理されています > そのラッパークラスを1プロセス内で2度生成した場合の動作は保証しませんが 貼り付けられたあのソースを見ただけでそこまで察しろってか。 > 除算は大幅にはぶけました > が、いまどき除算がボトルネックになるようなCPUでゲームはしないでしょう 「除算しないと無理」とか言ってた奴のセリフかね。 つまらん負け惜しみしてねぇで、 除算をはぶく方法を頭に刻み込め。 > prev_time = now_time; > これこそ間違ってるっぽいんですが・・・ んー?どこが? まぁ貴様のやりたいことはいまいちつかめんから、そうかもしれんな。 > という至極単純なモノです > 疑似FPSの算出でちょっとややこしくなってますが 負け惜しみはいらねぇから、 単純なことがややこしくなったらなんかおかしいと肝に銘じておけ。
> 余った時間の算出→その分だけSleep→実際にかかった時間を取得 この処理がレンダリング処理のどんな場面で必要なのか想像がつかないよ・・・ 364 は天才かも知れぬ
> 除算は大幅にはぶけました > が、いまどき除算がボトルネックになるようなCPUでゲームはしないでしょう ゴメン、突っ込ませて。 除算なんか多様してたらまともに動くゲームなんて無い。 こちとら、必死こいて最適化してんだ、ふざけんな。
> が、いまどき除算がボトルネックになるようなCPUでゲームはしないでしょう アフォじゃねーのこいつ
ゲ作板でヤレ
370 :
デフォルトの名無しさん :02/10/29 11:36
AAと煽りだらけのネタ掲示板で何をやれと?
371 :
デフォルトの名無しさん :02/10/29 13:26
(メンバ関数ではない)関数テンプレートは、完全な特殊化も禁止ですか?
>>371 template<typename T> void hoge(T& foo) {}
template<> void hoge<char>(char& foo) {}
>>372 template< typename T > void hoge(T& foo, int bar = 0) {}
template<> void hoge<char>(char& foo, int bar = 0) {}
だと駄目でした
デフォルト引数があると駄目なのですね。すみません。
explicit substancialization!
後半出鱈目
378 :
デフォルトの名無しさん :02/10/29 14:38
C++コンパイラ一人で作った人います?
4人で作った人ならEDGにいます
>>373 template<> void hoge<char>(char& foo, int bar) {}
にするとコンパイルできてしかも汎用テンプレートで与えられた
デフォルト引数を引き継ぐんだね。知らんかった。g++ 3.2
381 :
デフォルトの名無しさん :02/10/29 16:02
383 :
デフォルトの名無しさん :02/10/29 17:52
すいません、T*& ってどういう動きをするのか教えてもらえますか? 例) *どこかに typedef Class* LPCLASS; と設定されているものとする。 void func func( LPCLASS& cls ) // <- cls はナニ?
間違えました。 void func func => void func
reference of pointer
some_t *&p = some_map[some_key]; /* pをいじる */ って私はよくやるけど。
std::map<key_t, some_t*> some_map; です
typedef struct foo_ { A* a; } foo; typedef struct bar_ { A*& a; } bar; A* a = new A(); foo f = { a }; bar b = { a }; delete a; a = NULL; f.a // 未定義 b.a // NULL
LPCLASS *p = new LPCLASS(); func(p); //pの中身が変更される可能性がある! cout<<p->msg()<<endl; //pがぬるぽだったらいやんなエラー とか
pDC->TextOut(0,0,"( ゚∀゚ )ぬるぽぬるぽるぬぽ〜〜"); AfxMessageBox("さいたまさいたまさいたま〜〜( ゚ ∀゚ )");
どこらへん?
>>392 LPCLASSはただのぽいんただから(*p)->msg()かな、と。別にいいけど。
ああ。よく見てなかったスマソ LPCLASS p = new Class();
(´-`).。oO(なんでだろう…)
>>343 一般保護例外はメモリ関係でプロテクションに引っかかった場合だよな。
NULL ポインタを参照したとか。
>>342 大抵の環境では、例外を発生するように設定できる。
x87 は両対応で、Win32 ではランタイムライブラリの方で「デフォルトでは
例外を発生せず計算続行」に設定されてる。(今は違うけど) 昔の FreeBSD
では例外が発生するモードに初期化されていて、すぐにシグナルが飛んで
きた。
>>367 わり算も敵だが (VCL のお陰でちょっと楽になったけど)、俺には DMA も
敵のような気がしてる今日この頃。非同期処理なんか嫌いだ…。
398 :
デフォルトの名無しさん :02/10/30 04:11
ブルートフォースアタック?をやろうと思って、 辞書順の次の文字列を返す(またはすりかえる) ジェネリック?アルゴリズムを作ろうと思ったのですが、 既にありそうなのでどこかにあるのを知っていたら教えていただけないでしょうか... それを利用すれば実現可能なクラスとかでもいいです。 例えば char buf[] = { 'a', 'z', 'z' }; func( buf ); cout << buf; // 出力> baa みたいな感じです。 実際には[a-zA-Z] とか [あ-お](←これは無しとしても)みたいに範囲指定か const char dic[] = {'a', 'g', 'e'};//この辞書順 みたいな辞書指定できるようになっていると思うので、 もう少し複雑な使い方になると思いますが...
力技で何を解くの? UNIX のcrypt?
>>385-389 ありがとうございます。
ポインタの安全性が若干ながら向上するわけですね。
勉強になりました。
using namespace についての質問です。 ヘッダーファイルでusing namespace std ; などを宣言して最後にこれを 撤回したいのですがどうすればよいでしょうか? 例えば #include <string> using namespace std ; class myclass { string str1 ; } ; みたいなのをヘッダーファイルに書いてcppファイルでこれをインクルードしたときに using namespace std ;の宣言を無効にしておきたいのです。 コンパイラはVC++6です。お願いします。
>>401 そのヘッダファイル内の定義を新たに namespace ns で包んで、その中で
using namespace std すれば見かけ上は OK。
でも、後で using namespace ns とした時点で std も丸見えになるので
あんまし有効でない。
結局、ヘッダ内では面倒臭がらずに std:: 付けよう、というのが一般的
みたい。
いい方法があったら漏れも知りたい。
>>402 どうもです。あまり良い方法はないということですね。
404 :
デフォルトの名無しさん :02/10/30 19:13
STLスレから移動してきました。 >>Comeauって$50で全部(コンパイラ、標準ライブラリ、リンカ、デバッガ)ついてくるんですか? >>そうなら買ってみてもイイ!かも >ついてこない。 >フロントエンドだけ。 デバッガはともかく、標準ライブラリとリンカも別売りなんでしょうか? 英文ちゃんと嫁って言われそうですが(汗 使用しているかたオシエテ
405 :
デフォルトの名無しさん :02/10/30 23:22
シュリンクトゥーフィット? キレイキレイしましょ?
406 :
デフォルトの名無しさん :02/10/31 23:23
以下のようにすると、pが指している文字が"あいうえお"にならないのです。 どうしたらちゃんと指すようにできますか? ostringstream os; os << "あいうえお"; const char* p = os.str().c_str();
string s = os.str(); const char* p = s.c_str(); or ostrstream os; os << "あいうえお"; const char* p = os.str();
>>406 c_str()の寿命は一時的だから、ポインタに代入して参照したら、
何を指しているか保証されないよ。
410 :
デフォルトの名無しさん :02/10/31 23:36
フロッピーディスクをコピープロテクトをかけて、特殊フォーマット かけるソフトをVC++で作ろうと思っているのですが、FATやらなんらや で良くわかりません。大まかで良いのでアドバイスをいただきたいです。 環境はWin2000のVC++6.0です。 よろしくお願いします
デバイスドライバ作らないと無理じゃないかなあ
412 :
デフォルトの名無しさん :02/10/31 23:39
デバイスドライバってどうやって作るのでしょうか?
>>412 WIN32APIスレで聞いたほうがいいカモ。
でもあそこでもデバイスドライバの話は見たことないな・・・
今 時 フ ロ ッ ピ ー プ ロ テ ク ト か よ
FDはCD-ROMとちがって規格上プロテクトがかけれるようになってるけど書き込むには 専用の機械が必要。
>>412 VC++とDDKを使う。DDKはMicrosoftのサイトのどっかにある。
>>415 プロテクトノッチを上げる専用の機械か?(藁
互換機ってFDCは何使ってたっけなぁ〜?
>>416 VS.NETじゃつくれないのかな>DDRV
420 :
デフォルトの名無しさん :02/11/01 09:21
低レベルの質問ですいません。 namespaceについてですが、 自作ライブラリが、他のライブラリと重複しないようにnamespaceを使ってみたんですが STLの名前空間でのcoutは、 std::cout でも、cout どっちでも使用できるようになっているのですが 自分で宣言した名前空間(例:namespace onigri)の中にある 関数(例: void wassyoi(); )は、 onigiri::wassyoi(); しか受け付けないみたいです(wassyoi();だけでは無理)。 他のライブラリと重複してない場合、wassyoi();だけで、 呼び出すことはできないのでしょうか? 自分なりに考えた方法は、 namespace onigiri { void wassyoi(); } using namespace onigiri; という風に、 ヘッダ内に、usingを無理やり入れてます。 これだと、あまり よくないような気がして。
>>420 それでいいんだよ。>using
g++の2.xを使ってるのか? std:: なしでエラーにならんのは
単にg++の不具合。
何か、他に方法があったらご教授ください。
はぁ?
ごめんなさい。 #include <iostream> だと std空間で #include <iostream.h> だと グローバル空間みたいでした。 俺がアフォでした。 ごめんちゃい。
421の即レスにびっくり 422は、気にしないでください。 どうも。
>>420 using onigiri::wassyoi;
って感じに、個別にやったほうがいいと思われ。
427 :
デフォルトの名無しさん :02/11/01 12:56
namespaceってのは、衝突するかもしれないシンボルを回避 するという目的もあるんだから、その名前空間を定義するヘッダ内で using namespaceするなんて意味ないじゃん。
using namespace std; はC++の初期の学習段階から使わないように する癖を付けよう。
using namespace std; はデフォだろ。
>>428 main() のあるファイルでも使っちゃ逝けないのか?
432 :
デフォルトの名無しさん :02/11/01 14:14
Don't forget namespace!
債務不履行宣言
>431 怠け者がすること、って意味じゃないかな?
mutable 使ってますか?
436 :
デフォルトの名無しさん :02/11/01 19:15
こんばんわ。 C++のとても簡単な事を全然思いつかないので、 どなたか教えてください。 int x[n]; int y[n]; があったとすると sum = (x[0]-y[0])+(x[1]-y[1])+(x[2]-y[2])+…(x[n]-y[n]) ←ここです。 for(int i=0; i<n; i++){ sum ○ x[i]-y[i] } ○の部分が。。。
>>436 > C++のとても簡単な事
そう思うなら自分で回答してみては。
438 :
デフォルトの名無しさん :02/11/01 19:20
>>437 簡単だと思うのですけど、
自分で回答できなくて助けを求めています。
どうがんばってもネタにしか見えないが, ○ = +=
あと, for(int i=0; i<n; i++){ は, for(int i=0; i<=n; i++){ な。
>>436 std::accumulate(x,x+n,0)-std::accumulate(y,y+n,0)
stringのlistをソートしたいんですが、コンパイラに怒られます。 string s1 = "A"; string s2 = "B"; if(s1 < s2) としただけでだめです。stringのoperator <はちゃんと定義されていると 思うのですが、なぜだめなのでしょうか?
エラーメッセージを書かないのはネタだと何回も何回も・・・
446 :
デフォルトの名無しさん :02/11/01 21:28
CLine* CDay10Doc::AddLine(CPoint ptFrom, CPoint ptTo) { CLine *pLine = new CLine(ptFrom, ptTo); try { m_oalines.Add(pLine); SetModifiledFlag(); } //メモリが許容範囲を超えたときの例外処理 catch (CMemoryException* perr) { AfxMessageBox("Out of memory",MB_ICONSTOP | MB_OK); if(pLine) { delete pLine; pLine = NULL; } perr->Delete(); } return pLine; } 何が間違っているのか分からないので教えてください error C2143ですがセミコロンはちゃんとあります
>>446 「セミコロンはちゃんとあります」 って言われてもわからん。
そのエラーメッセージは何行目を指してたのよ?
エラーメッセージはプログラムのどこがどうおかしいかを教えてくれるもので、
あなたを困らせるものじゃないんだから、ちゃんと理解しなさい。
448 :
デフォルトの名無しさん :02/11/01 21:35
ええと try { コレの{の部分でエラーが出るのです
sageミス すいません
>>448 はっきり言ってわからん。
この文脈で考えられる事と言ったら try が変なものに #define されてるくらい
だが、そんな事無いだろうし。
つーか、エラーメッセージはエラーを示す唯一のメッセージなのに、何で全部
書いてくれないの?
エラーメッセージを、そんなにどうでもいい情報だと思ってる?
ぼくに理解できないので あなたにも理解できるとは思えません
ヽ(´ー`)ノ
typedef std::vector<std::string> T; のような型Tを つくるとして、Tの名前どんなふうに命名しますか?
StringArrayとか
StringArray
Stringsもいいな
ビット演算子って覚えた方がいいんですか?なんかよく理解できないんで…
ビット演算をする羽目になったときに覚えればよい
>>454-456 〜Buf とか 〜s も考えたんですが、前者は感覚的に違う気がしたのと
後者はぱっと見て判断しにくいかなと。。Array がいいです。
ありがとうございます。
>>457 組込用MPUくらいでしか使わないんじゃないのか。ビット演算(操作)
>>460 圧縮とか、固定小数点演算とかいろいろありますがな。
ビットストリームの読み書きには必須ですな
使うかどうかは別としても、ビット演算程度がよく理解できない人間が まともにプログラム組めるようになるとは思えないね。
intのサイズを理解してないと厳しいんじゃなかろうか。
ビット演算の真理表を見つめてたら 1010 & 1100 = 1000 ってことはわかりました。けど、 1010 0000 0010 1000 = a028 ってなるのが全然わかりません。これは覚えなくてもよいですか?
そりゃ2進数と16進数の変換では?
469 :
デフォルトの名無しさん :02/11/02 12:47
vector<int> v; int i = v.size(); みたいなことをVC++でやると 「size()の戻り値はint型じゃない」みたいな ワーニングが出るがこういう場合、どう対処するのが普通なの? 1. intじゃなくてvector::size_typeを使う 2. size()の戻り値をintにキャスト 3. ワーニングを無視
>>469 1. が王道。
2. はどうしても符号付の数値が必要な場合のみ。
3. は絶対にするべきではない。
別解 4. 大抵は size_t で通じる。
size_typeがunsignedだったりするといやだから2.かなあ 3.は重要なwarningを見落としたりすると困るからちょっとイヤかも
>>471 signed な数値を返す size() ってあるの?
473 :
デフォルトの名無しさん :02/11/02 13:12
数値型はすべてintで扱うべき、1ビットの節約のために わざわざunsignedを使うのはばかげている という意見と 正の値しかとらない変数はunsignedを使うべき、間違って負の値が 入ることを防ぐことができる という意見 あなたならDOUCH !?
全部intでもいいけど、前者に書いてある理由付けはDQNだろう
475 :
デフォルトの名無しさん :02/11/02 13:19
>>470 「vectorのサイズ分ループをまわす」とかの場合、
1や4だとループのカウンタ用の変数もsize_tを使うことになるんですか?
ループのカウンタ用の変数がintだと結局終了条件でintとsize_tを比較
することになってしまいますよね。
>>475 > 「vectorのサイズ分ループをまわす」とかの場合、
vector<T>::iterator を使うことになります。
indexで回すなら当然size_tだな。
負の値になることがありうる変数を 後からsize_tにしてハマったことならあるよ...
intを使う奴はDQN
479 :
デフォルトの名無しさん :02/11/02 13:29
>>474 どういう理由付けなら全部intでもいいの?
480 :
デフォルトの名無しさん :02/11/02 13:37
>>470 size_tを使うとわざわざvectorやlistでsize_typeをtypedef
している意味がないような。
かといってわざわざvector::size_typeと書くのは面倒だし、
コンテナを変更した時修正しないといけないし。
かといってそのためにテンプレート化するのもなんだし。
個数をあらわすインターフェースがsize_tと決まっているのだから すべてsize_tで統一すべき intは不要。使う奴はDQN。
>数値型はすべてintで扱うべき、1ビットの節約のために >わざわざunsignedを使うのはばかげている ってどういう意味?教えてちょ。
483 :
デフォルトの名無しさん :02/11/02 15:12
俺、最近符号なしの整数使うときsize_t使ってるんだけどヤバイかな?
>>475 コンテナでループする時は、476 の通り iterator を使うべき。
index の場合は、インデックス値が 0 から始まるとは言い切れないので一概には
言えないが、index は本来ランダムアクセスに使うべき。
その場合は多分コンテナの範囲を超えた値を指定しても大丈夫だから size() は
関係無い。
>>480 サイズを表す数値の型は size_t と決まっている。
だから 「大抵は size_t で通じる」。
size() が size_t 以外を返すのはよっぽどの事情がある場合で、その場合は
素直に Class::size_type を使うべき。
そういう時にコーディングが面倒だと言うのは DQN。
で、あんたは size_t も Class::size_type も否定してるけど、じゃあ
どうしたいの?
>>483 size_t はサイズを表す数値の型と決まっている。
size_t は unsigned int で無い場合がある (もっと大きかったりする事もある)
が、それで問題が出ないなら構わない。
ただし単にタイプ数を減らしたいな uint を typedef で用意すべきで、それを
サボるのは DQN。
485 :
デフォルトの名無しさん :02/11/02 16:04
size_tで全く問題がないなら Class::size_typeの存在意義はない ですよね。 size_tでは問題になる可能性があるのなら size_tを使ったらいけない ってことになるんじゃ??
size_tもsize_typeも符号無し整数型と決まっているから その処理系で最大の符号なし整数型で受ければ何の問題もない
>>485 どうしてそう両極端に考えるんだ?
>>484 > サイズを表す数値の型は size_t と決まっている。
> だから 「大抵は size_t で通じる」。
> size() が size_t 以外を返すのはよっぽどの事情がある場合で、その場合は
> 素直に Class::size_type を使うべき。
結局、その class がどういうものかわからないと何とも言えないと言う事だ。
ただし、普通の Class::size_type が size_t であることはまず無いから、
size_t とみなして良いという事。
(ダメなときはそもそもコンパイラが怒る)
そしてそもそも、
>>469 > 1. intじゃなくてvector::size_typeを使う
> 2. size()の戻り値をintにキャスト
> 3. ワーニングを無視
>>470 > 1. が王道。
どう結論出していいか迷うなら、まず Class::size_type を使え。
訂正。 ×: 通の Class::size_type が size_t であることはまず無いから ○: 通の Class::size_type が size_t 以外であることはまず無いから
X3J16/96-0225 WG21/N1043 より 20.1.5 Allocator requirements expression: X::size_type return type: unsigned integral type assertion/note pre/postcondition: a type that can represent the size of the largest object in the allocation The typedef members pointer, const_pointer, size_type, and difference_type are required to be T*, T const*, size_t, and ptrdiff_t, respectively. 他の標準クラスは Allocator::size_type をそのまま引き継いでいるようです。 だから標準で済ませる限り size_t と見なしていいみたいですね。 うがった見方をすれば、独自の Allocator で、size_type を整数表現する class に すり替える事も可能と言えば可能。
Perlで変な掲示板などを作っております。 しかしとてつもなく重いです。 CかC++あたりを勉強してWindowsのGUIプログラムでも作りたい物もあるし、 さらに変なものを作りたいのですが、とりあえず必要なものはなんでしょう? エデッタ、コンパイラ(BCC32とかでいいのでしょうか?)、入門書みたいな本、自分 以外に必要な物はありますか? なんとか C++ とか、高い物もいきなり必要なのでしょうか? 天才とかはありません…。 C/C++の違いは、、なんか++が付いていてお得そうなので、こちらに質問します、、 (これでいいのかな自分( ゚_゚ )?)
>>490 perlやってるんなら正規表現が欲しいだろうから、boostのregexとか
触ってみれば。
>>490 何か困った事が発生してから質問してください。
そうでないなら、まずは始めてください。
一番必要なのは、コードを書く事です。
ちなみに、C/C++ から GUI を扱うにはいろいろ覚える事があり、一朝一夕には
できません。
とにかく GUI をやりたいと言うなら、C/C++ は一旦置いといて HSP (無料)
あたりにでも手を出してください。
Perlはある程度できますがC++などは全く素人ですので 正規表現使う必要が出てくるまでにかな時間がかかりそうです。。 Perlですら最初の一応役に立つプログラムまで2ヶ月かかってますし 役に立たないプログラムならもっとすぐに書いていましたが…
>>493 掲示板だけならコンソールアプリケーションで十分だから、GUIはとりあえず
必要ないと思います。
C++のstd::stringを使えばバッファオーバーランの問題も避けられるはずです。
>>492 どちらかというと、GUIは後から、重い言語以外にもう1つ覚えたいといったところでしょうか
とにかく解説書なりページなり見て、
プログラム書いて書いて書きまくれということですね。
ではそうしたいと思います。
Perlの時はソースを改造→分からないから解説書→0から書けるように
なっているので、こういうやり方は初めてですが。
やってみたいと思います。
回答ありがとうございました。
496 :
デフォルトの名無しさん :02/11/02 20:32
dynamic_cast の計算量について、なにか予測できることってありますか? クラスの数に比例する?とか、 多重継承すると???とか。
>>496 処理系依存?
単継承と重継承でパフォーマンステストしてみたら?
498 :
デフォルトの名無しさん :02/11/02 21:20
class Single { public: static Single* getInstance() { /* 省略 */} void func() { /* なにかの処理 */ } private Single() {} static Single* _instance; } Single* Single::_instance = 0; とかいうしんぐるとんクラスがあって、このインスタンスを使う場合は、 class UseSingle { public: UseSingle() { sin = Single::getinstance(); } void use() { sin->func(); } private: static Single* sin; } のような感じでいいの?
499 :
デフォルトの名無しさん :02/11/02 21:40
使う側は単に Single::getInstance()->func() でいいのでは?。 わざわざ呼ぶためのクラスを作る必要はないし、どこからでもアクセス できるのがSingletonのメリット。
g++-3.1.1 でテストしてみました。 class B { public: virtual ~B(){}; }; class D1 : public B {}; class D2 : public D1 {}; class D3 : public D2 {}; で、dynamic_cast<D1*>をそれぞれの実インスタンスへのポインタでテスト。 B < D1 < D2 < D3 となって、継承の回数に比例してる感じでした。 継承ツリーを順にたどる処理が想定できますが、そのまんまの実装ぽいですねぇ。
おお。 しかしまんまの結果やね。 多重継承のときは先頭から辿るんだろうか・・・
こういう感じのクラス間で相互に定義が入れ子になるコードを書いているのですが コンパイル時に先に読み込まれたほうであとから読み込まれるクラスが定義されて なくてうまくコンパイルできません。何らかの形でクラス識別子を定義してやれば いいんだとは思っているんですがVCのヘルプとか見渡してもどうしたらいいのか よくわからないので質問させてもらいます。 【CMona.h】 #ifndef CMona_H #define CMona_H #include "CGiko.h" class CMona{ public: CGiko* Giko; } #endif --------- 【CGiko.h】 #ifndef CGiko_H #define CGiko_H #include "CMona.h" class CGiko{ public: void Copipe(CMona* Mona); } #endif
それぞれに class CMona; class CGiko; をつけくわえてみよう。
Thanx! うまくいったよ(*^o^*)
Berkeley DB みたいな感じのファイルDBで、商用でもフリーでかつオープンソースに しなくてもいいラインセンスのライブラリってありませんか?
>>506 Berkeley DB はソース公開しない場合は有料だったと思ったが。
んじゃcdb。 っていうかスレ違いだし。
510 :
デフォルトの名無しさん :02/11/03 14:57
具象クラス10個を多重継承していいですか? それとも、クラス設計から考え直すべきですか?
>>510 コンポジションならそういう例もあるんじゃない?
512 :
デフォルトの名無しさん :02/11/03 18:46
>510
is-a法則は成り立つ?
委譲じゃ解決できない?
>>511 理解できないので詳しい説明お願いします
>>510 そんな風にたずねられたら、普通はヤメトケって言われるよ・・・
514 :
デフォルトの名無しさん :02/11/03 20:22
template<class T,class S>struct STA{ typedef T(STA::*FUNC)(S); FUNC func; std::string name; STA(){ name=typeid(T).name(); if("void"==name){cout<<"debug"<<endl;func=fff;} (this->*func)(); } void fff(void){cout<<"fff"<<endl;} }; /**************************************************************/ void main(void) { STA<void,void> sta; } エラーじゃないんですが、何故かメモリリークします。どうやらstringが 原因らしいんですが・・・
きもっ
516 :
デフォルトの名無しさん :02/11/03 20:46
2次元配列を動的に作成するときに現在は float** array; array new float*[x]; for (int i = 0; i < num; ++i){ array[i] = new float[y]; } のようにしているんですが、一気に領域を確保することはできませんか?
517 :
デフォルトの名無しさん :02/11/03 21:16
標準例外に関する質問です。 「引数の範囲が不正」な場合には invalid_argument を投げるべきでしょうか?それとも out_of_range を投げるべきでしょうか? range_error という可能性も? あと、ここらへんについて簡素かつ正確に書いてある書籍等はないでしょうか?
518 :
デフォルトの名無しさん :02/11/03 21:18
glibcって何ですか?
>>517 引数の範囲が数直線上の区間で表すようなものならば、out_of_rangeが
適切でしょう。そうでなくて、たとえばenumにないものを指定されたとか
NULLはダメなのにNULL突っ込んだとかはinvalid_argumentでしょう。
> あと、ここらへんについて簡素かつ正確に書いてある書籍等はないでしょうか?
それぞれの例外の説明を読むしかないのでは・・・
>>516 float* array;
array = new float[x * y];
利用時は
array[x + (y * rangeX)];
>>519 レスありがとうございます。
out_of_range が(runtime_errorではなく) logic_error を継承しているのが
ちょっと解せなかったのですが、
そこらへんはあんまり気にしないほうが良いのでしょうか?
区間を表す場合に、「最小値」が「最大値」より大きい なんて場合には
どうすればいいのでしょうか?
522 :
デフォルトの名無しさん :02/11/03 21:34
雑談レスだけど、例外の適切な使い分けがなかなかわからねーなー。
適当にXXXExceptionクラスを作ってそれ投げてりゃ良いのよ。
524 :
デフォルトの名無しさん :02/11/03 21:40
>>520 やはりそれしかないんですか。
それでは、それを使おうと思います。
>>522 ですよねー。Java や C# などの後発の言語に比べて中途半端というか、
所詮後付け感は否めないですよねー。
>>523 やってると混乱してきちゃうので…。
中途半端に標準ライブラリに含めないで欲しかったですね。
そうすれば思い切って独自仕様で固められたのに。
>>524 (実は
>>520 は私だったのですが)
あと、インデックスに使う値を管理するクラスを作ると楽かも?
でもそれをするとテンプレートとか使って「配列クラス」を作りたくなってしまうという罠!みたいな。
例外はクラスライブラリによって使い方が違ってくるから複数のクラスライブラリ使ってると 設計がかなり難しくなってくる。 Javaはライブラリもそろってるしメモリ食わなきゃそこそこいいんだが。
527 :
デフォルトの名無しさん :02/11/04 17:15
Hoge* HogeCreater::creat() { return new Hoge(); } Hogeクラスのインスタンスを返す↑って使い方あってる? メソッドを抜けるとオブジェクトが勝手に破棄されるとか?
>>527 されない。どこかでちゃんと解放してやれよ。
>>527 あってる
恐れている間違いはこういう感じだろう。
return &Hoge(); // 関数を抜けたら不正になるオブジェクトへのポインタを返している!!
>>528 質問の意図を読み間違えていると思われ。
Hoge& HogeCreater::creat() { return Hoge(); } 何も考えずこうした方が良いと思うが
533 :
デフォルトの名無しさん :02/11/04 19:47
勉強をかねて、Visual C++ でMFCではなくAPI主体のアプリを作ってます。 可変長の文字列というのはどのように扱うのが一般的なのでしょうか? 1.GlobalAllocなどのAPIを使う 2.C++標準ライブラリのcstringを使う 3.(便利そうだから?)MFCのCStringを使う 4.その他 今のところは数十から多くて数百文字なのであらかじめ多めに見積もって おいてもだいじょうぶだとは思ってますが、なんとなく気分的にいやなんです。
>>514 bcc5.51, vc++6.0, gcc2.95.3-5どれもエラー
>>531 自動変数のリファレンス反しちゃダメじゃん。
Effective C++の23項参照。
>>533 >2.C++標準ライブラリのcstringを使う
stringでは?
(2)がベターだと思われ。勉強がてら(1)してみるのもおもしろいかも。
(´-`).。oO(C++標準にcstringなんてあったっけ?)
(´-`).。oO(string.hのC++版…可変長じゃねぇな)
レスありがとうございます
>>536 ありがとうございます 使ってみますです
>>537 stringでしたね 寝ぼけたこと言ってごめんなさいです
>>539 そうなんですか!? 少しパニくってきたけど
そのへんはがんばれば自己解決でけそうです
可変長文字列はstrdup()で確保してfree()で解放するのが常識だろ strdup()の返り値はチェックしなくてすむしな
∧__∧ (ミTдTミ) しくしくしくしくしくしくしくしくしくしくしくしく
543 :
デフォルトの名無しさん :02/11/04 22:13
C言語で書かれたWindowsのスケルトンプログラムをC++で書き直しているところなのですが、 コールバック関数をクラスの中に入れると、どうしてもエラーが出てしまいます。 DirectXのサンプルプログラムを見てみると 基底のクラスで class CD3DApplication { protected: : static INT_PTR CALLBACK SelectDeviceProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam ); となっていました。そこで「SelectDeviceProc」をmsdnの検索キーワードにかけたのですが該当する 関数は見つかりませんでした。 誰か教えてください。
544 :
デフォルトの名無しさん :02/11/04 22:19
ちなみにエラーの内容は、 error C2440; '='; 'LRESULT(_thiscall test_app::*)(HWND, UINT, WPARAM, LPARAM)'から'WADPROC'に変換できません。 wc.hIconSm=NULL; wc.cbClsExtra=0; wc.cbWndExtra=0; wc.lpfnWndProc=WndProc;<-----ここ if( !RegisterClassEx(&wc) )
>>543 C++のメソッドは
A::hoge() -> hoge(A *this)
な感じになっています。
546 :
デフォルトの名無しさん :02/11/04 22:21
547 :
デフォルトの名無しさん :02/11/04 22:22
ちゃんとstaticつけたか?
549 :
デフォルトの名無しさん :02/11/05 00:25
int *p(0); がこけるんだけど、C++の仕様?それともVC6の制限? ポインタはexplicitな宣言できないのかな? でも、 int (*pf)(void)(0); は通るんだなあ・・・
こけるって?
>>549 >int *p(0);
コンパイル通りませんけど。
typedef int* INTP; INTP p(0) は?
CとC++のどちらからでも勉強できるのですか?
>>549 それ、コンパイラには int *(p(0)); と解釈されてると思うんだがどうよ?
演算子の優先順位的に。
>>555 まったくの初心者なんですが、プログラミング言語を勉強する前に何か本などを読んで方がいいのでしょうか?
まったくの初心者なら、スクリプト言語辺りを軽く触っておいてから 挑むのが良いかもれ知れませんね。
レスさんくす。
規格読んでたんだけど、それらしき記述は見つけられず。残念。
>>552 確かに、typedefしたら通りました。
>>554 なるほど。エラーメッセージが一緒だな。どうもそれみたい。
まあ、素直にふつうに宣言するのが無難だな。
typedefしても通らんぞ(gcc3.2)。 VC++がおかしいんじゃないの?
>>559 VC6では確かに通ったよ。
それはそうと、宣言じゃなく初期化だな。恥ずかしい・・・
>>560 ああ了解。拡張子を.cにしていました。スマソ。
そうか、int (*p)(0); は、int *p = 0; と同じなのね。
>>543 プロシージャにしたいメンバ関数を
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
としてwc.lpfnWndProc = WindowProc;で何も問題無い
ちなみにstaticな関数なので、プロシージャの中からメンバにアクセスしたい場合は
プロシージャの最初のほうでWM_CREATEのlParamからlpCreateParamを拾って保持しておく必要がある
static 自作ウィンドウクラス* Instance = NULL;
if (Instance == NULL) {
if(msg == WM_CREATE) {
Instance = static_cast<自作ウィンドウクラス*>(reinterpret_cast<LPCREATESTRUCT>(lParam)->lpCreateParams);
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
アクセスする場合はInsctance->メンバ
仮想関数デストラクタについて質問。 C++ FAQ等を見ていると class CA{ public: CA(); virtual ~CA(); }; のように、 デストラクタが、仮想関数になってるのですが、 virtual にしても、しなくても変化が無いように見えますが 仮想関数にする意味があるんでしょうか?
継承しないなら、関係ない。
>>564 それについて、
コンストラクタとちがって
virtualキーワードをつけて宣言できる。
としか書いてないのです。
つけても、つけなくても、
継承元デストラクタ→継承先デストラクタ
が呼ばれるのです。
オーバーライドしようと、継承先で~CA()と書いてもエラー出るし。
よくわからないので、おしえてください。
>>566 例えばclass CAから派生したclass CBがあったとして、そのポインタを
親のCAで表現しているとき
CA* cap = new CB;
delete cap;
とした時、~CA()も~CB()も仮想デストラクタにしておかないと、~CB()が
呼び出される保証はない。
>>567 うおお。
わかりました。
わかりすぎて、少し感動しました。
ありがとうございますー。
これが意図した動作かどうか確かめてみそ。 class CA { public: ~CA() { std::cout << "~CA()\n"; } }; class CB : public CA { ~CB() { std::cout << "~CB()\n"; } }; int main() { CA* cap = new CB; delete cap; }
class CA { public: vittual ~CA() { std::cout << "~CA()\n"; } }; class CB : public CA { ~CB() { std::cout << "~CB()\n"; } }; int main() { CA* cap = new CB; delete cap; return 0; } は OK? NG?
>>570 OKですよ。基底クラスのデストラクタが仮想デストラクタになると、
それ以降継承されたクラスのデストラクタはデフォルトで(というか
強制的に)仮想デストラクタになるから。
お、vittualはvirtualですよね。念のため。
Effective-C++のP78〜84には、基底クラスのデストラクタを仮想デスト ラクタにするべき時とそうでない時についての考察が書かれている。 大まかに言えば、継承するつもりのないクラスのデストラクタは仮想に すべきでなく、継承するつもりならば仮想デストラクタにしておけば安心 であるというような内容。
#define vittual virtual 逝ってくる・・・ 571 アリガ`
クラスに少なくとも1個の仮想関数が含まれていれば、仮想デストラクタ を宣言すること、となっている。
なんでコンパイルできないの? class CA { public: virtual ~CA() = 0; }; class CB : public CA { public: ~CB() { std::cout << "~CB()\n"; } }; class CC : public CB { public: ~CC() { std::cout << "~CC()\n"; } }; int main() { CA* cap = new CC; delete cap; }
>>576 純粋仮想関数であってもデストラクタの場合は実体が必要。
だから
CA::~CA() {}
などの定義を行えばよい。
>>577 即レスありがとうございますぅ。でもどうしてデストラクタの場合だけ
実体がないとエラーになるのでしょうか?C++3rdのどの当たりにその
ような事が書いてあるかわかりますか?
腐ってんね。
>>578 Effective-C++のP83にそのような事が書いてある。
デストラクタは純粋仮想関数の中でも特別な扱いで、基底クラスのデストラクタ
の呼び出しをコンパイルしてしまうため、リンク時にエラーになるとある。
他の純粋仮想関数ではこうはならない。
>>580 どうもありがとうございます。もう少しデストラクタについて勉強
してみます。
class hoge { public: virtual void huga() = 0; }; void hoge::huga() { cout << "huga" << endl; }
>>582 その場合huga()はどうやって呼び出すの?
class hage: public hoge { public: void huga() {} void age() { hoge::huga(); } }; int main() { hage sage; sage.age(); return 0; }
>>584 なるほど・・・・こうなると、純粋仮想関数も糞もあったもんじゃないですね。
直接呼び出せなくなっているだけで間接的には呼び出せるのか。
586 :
デフォルトの名無しさん :02/11/06 00:06
>>561 g++3.0でこんな実験をやってみた。
typedef int *intp;
const int *x(0);
としておくと、
int *y(0), int (*y)(0), int *(y(0)), int (*y(0)), intp y(0)
は全部同じエラー(const外し)になって、
intp y = intp(x);
は通った。intp(x)はCスタイルの(intp)xと同じになるみたい。
参考までに。
int main() { int i(); //default constructor? i = 0; //oh error! return 0; }
>>586 > const int *x(0);
え?
> const int *x(0); これ何でコンパイル通るの? * 演算子より () 演算子の方が優先順位高いはずだけど・・・。
>>562 さん
詳しい説明ありがとうございました。
そのおかげで何とかできました。
今は、自作関数をC++に書き直してているのですがまた分からない事があったらよろしくお願いします。
const int * x = 0;
>>591 いや、const int (*x)(0); ならそうなるのもわかるんだけど。
const int *x(0); なのにそうなるのなら理由がわからない。
>>589 xは0で初期化され、その型はconst int *である、と読めると思うが?
それよりint (*x)(0);が通るのが不思議。*xが0で初期化される、と
読まれて、エラーになりそうなものだが、int *x = 0;と同じように
解釈されている。まあint *x = 0;だって、普通の優先順位で考えたら
*xが0になりそうなものだが。・・・今試してみたら、
int (*x) = 0;
が通ったよ。
>>589 変数宣言の所の * とか [] とか () とかは演算子ではないと思うが。
コンストラクタ呼び出しの()はともかく。
>>593 int (*func)(int arg); って例があるもんだから。
・・・あれ? 余計混乱してきたような・・・。
>>594 うーん、「そういうものだ」 と思い込むしかないのか・・・。
vc6.0のデバッグで関数に飛ぶと シンボル this 値 error変数にスタックフレームが必要です という のが表示されてしまっています。 これはどのような時に表示されるのでしょうか? 特に実行がおかしいわけではないのですが気になってしょうが ありません。
>>596 標準スタックフレームの生成を外しているとか。
大抵の関数には、突入時に、自動変数領域の確保や 引数の取り出し用に、ebp,espを操作します。 スタック操作が完了していない場合、 「変数にはスタックフレームが必要」が出てくると思われます。 class A{ public:int Val; void setA(int v) {Val = v; } void setB(int v) { Val = v; }}; int main() {A a; a.setA(2); a.setB(55); } ウオッチウインドウにthisを追加して、上のコードをステップ実行すれば、 大体わかるとおもいます。混合モードをステップ実行するのも良いでしょう。
599 :
デフォルトの名無しさん :02/11/06 14:39
Visual Fortranで作成したプログラムをVC++上で走らせるにはどうしたらいいですか? 一応C++に移植したのですが変な動作するので、あきらめてフォートランの方のを 使おうと考えているのですが。
603 :
デフォルトの名無しさん :02/11/06 15:22
こんにちは。質問させてください。 C言語で struct main_data{ double z }data; (struct main_data*)malloc(sizeof(struct main_data)*810000) というふうに構造体を作りメモリを確保し、 for(int i=0; i<900; i++){ for(int j=0; j<900; j++){ (data+j+i*900)->z = nodata; }} としたものがあります。 それをC++で struct main_data{ double z[810000]; }data; とし、newでメモリを確保したなら、 ↑のfor文を書くならどうすればよいでしょうか? どなたかよろしくお願いします。
てゆーかさ、メモリブロックをまとめて「配列として」確保したんだから、Cでも for(int i=0; i<900; i++){ for(int j=0; j<900; j++){ data[j+i*900].z = nodata; }} とするのが普通だと思うんだが。
fill(&z[0], &z[810000], nodata);
>>604 、605
レスありがとうございます。
すいません、書き漏れ。
C++で、
struct main_data *data0;
data0 = &data
としています。
自分は
data0->z[j+i*900] = nodata;
だと思うのですが、いかかでしょうか?
aha?
609 :
デフォルトの名無しさん :02/11/06 15:42
クラステンプレート内で仮想関数を宣言することに意味は見出せますか?
あは♪
612 :
デフォルトの名無しさん :02/11/06 15:46
> struct main_data{ > double z[810000]; > }data; 普通に struct main_data{ double z[900][900]; }data; じゃいかんのか?
614 :
デフォルトの名無しさん :02/11/06 15:58
/■ヽ (´Д`) (( ─━OO━─ )) ∪∪
>613 多分いいと思いますが、いまさら書き直す気力がありません。。。
>>612 ATL の CWindowImplBaseT とか。
>>602 C から FORTRAN 側の関数を呼べるんじゃないかなぁ。VC++ は知らんが、
その昔 UNIX でやった覚えがある。
618 :
デフォルトの名無しさん :02/11/06 22:09
class explicit_class { public: virtual explicit_class(){};//error virtual ~explicit_class(){}; virtual explicit_class(const explicit_class&){};//error virtual explicit_class& operator=(const explicit_class&) = 0; virtual explicit_class* operator&() = 0; virtual const explicit_class* operator&() const = 0; }; コンパイルできないんだけど、やっぱり無理なんでしょうか?
コンストラクタにvirtual宣言?
620 :
デフォルトの名無しさん :02/11/06 23:05
>>619 サンクス
コンストラクタにはvirtual宣言できないのね。
コンストラクタの記述の強制はできないのか...。
//修正
class explicit_class
{
public:
explicit_class(){};
explicit_class(const explicit_class&){};
...後は同じ
};
class A :public explicit_class
{
public:
A(){}
A(const A& i){*this = i;}
~A(){}
A& operator=(const explicit_class& i){return *this;}//両方必要
A& operator=(const A& i){return *this;}//両方必要
A* operator&(){return this;}
const A* operator&() const{return this;}
};
int main()
{
A a,b;
a=b;
}
>>599 Fortranしらないんで、適当だけど
#define IF if(
#define THEN ){
#define ENDIF }
とかする。
623 :
デフォルトの名無しさん :02/11/07 07:54
timeGetTime() ってどのくらいはかれるんでしょうか?一時間とかいけます?
625 :
デフォルトの名無しさん :02/11/07 11:37
vector について(?)です class CTEST { LPSTR m_var ; public: CTEST::CTEST() { m_var = new CHAR[10]; } ; CTEST::~CTEST() { delete [] m_var; } ; void operator = ( LPSTR lps ) { strcpy(m_var, lps); } ; }; // 処理 ... vector<CTEST> vecTest ; CTEST cTmp ; for ( long i=0; i < 10; i++ ) { cTmp = "(・∀・)" ; vecTest.push_back( cTmp ) ; } とすると、3回目の push_back で例外がボーン・・・ (→ HEAP[FORDEBUG.exe]: Invalid Address specified to RtlValidateHeap( 00370000, 00370FE0 ) ただし、メンバを LONG にしたり CHAR m_var[10] とかの場合は問題なしです。 動的に確保したものはダメなんでしょーか?
626 :
デフォルトの名無しさん :02/11/07 11:45
>>625 void operator = ( const CTEST& ) { ... } ;
こっちの代入演算子を定義してないからじゃないかな?
なぜ代入演算子の戻り値が void なんだ? コピーコンストラクタもないし突っ込みどころ満載だな。 例外の原因は new CHAR[11] かな。
>>626 >>627 ありがd。
解決しますた。
1. コピーコンストラクタが無いからデフォルトコピーコンストラクタが呼ばれる
2. メンバをそのままコピー
3. デストラクタであぼーん
ということですか。。。
下を追加したら動きました。
CTEST::CTEST( const CTEST& cc)
{
m_var = new char[10];
strcpy(m_var, cc.m_var) ;
} ;
CTEST &operator = ( const CTEST& cc)
{
if (this != &cc)
{
m_var = new char[10];
strcpy(m_var, cc.m_var);
}
return *this;
} ;
"(・∀・)" は char[10] に収まるの?
>>629 Shift-JIS で 8 バイトですが何か?
>>629 ぎりぎり入るけど
strcpy なのでアウトでしたね。
ていうか 初期化もしてなかったし・・・
回線切って首つってきます。
632 :
デフォルトの名無しさん :02/11/07 18:11
STL使っているなら素直にstring使えば。
633 :
デフォルトの名無しさん :02/11/08 07:47
class T { class N{}; }; ↑で定義される T::N を、 class T; みたいに名前の宣言だけってできますか? class T::N; だとエラーになります。
>>633 >できますか?
試しなさいよ。
構造体と事情は一緒ではなかったかい?
> 試しなさいよ。 > 構造体と事情は一緒ではなかったかい? 事情が同じなら class T::N; で試した段階で 宣言できて欲しいところですが。 エラーになるデスヨ。
>>635 T クラスが事前に定義されていないと T::N のように限定することはできなかったと思う。
class Class_Test079{ public: class Class_Test080; class Class_Test081; class Class_Test080{ public: Class_Test081* m_pointer; Class_Test081* Func(){cout<<"\nClass_Test080::Func"<<endl;return m_pointer;} }hoge; class Class_Test081{ public: Class_Test080* m_pointer; Class_Test080* Func(){cout<<"\nClass_Test081::Func"<<endl;return m_pointer;} }hage; };
int main(){//確認用 class Class_Test079 a; a.hoge.m_pointer = &a.hage; a.hage.m_pointer = &a.hoge; a.hoge.m_pointer->Func()->Func()->Func()->Func()->Func()->Func()->Func()->Func()->Func()->Func() return 0; }
おっとmainのFunc()にセミコロンが抜けた。 こういうことがやりたかったのか?
私の悩み、聞いてくれます? C覚えて、その後Java覚えて、再びCのプログラム書こうと してるけどJavaの悪い癖(参照)がついてしまって、なかなか ポインタが使えません・・・ リスト構造関連の優秀なWebページを教えていただけませんか? あ、「猫でも分かる・・・」は勘弁してください。デムパ嫌いですから。
>>640 > 私の悩み、聞いてくれます?
> デムパ嫌いですから。
そうですか。それは大変ですね。
>>639 うーん、class T が定義されてるヘッダをインクルードせずに、
T::N の名前を使いたい・・・。
こうして書いてみると、できなくてあたりまえのような気がしてきたり。
メンバに含めるって事はサイズがわからなきゃダメだから 宣言だけでは無理だよ
というかnamespaceの問題だと思う。 T::ときたらTの名前空間はコンパイラが知っていなければ ならない。
647 :
名無しさん@Emacs :02/11/09 04:39
継承とポインタをからめたんだけど: class Base { int a; }; class Derived : public Base { int b; }; void aho(Derived *p) { Base *p1 = p; Base b; *p1 = b; } で、 *p に Base の instanceが入っちゃうじゃん!! っていうのは問題じゃないの? 型安全性が... とか考えちゃうんだけど。
>>647 class Base
{
public:
Base() { a = 1; }
virtual void print() { cout << "Base: " << a << endl; }
protected:
int a;
};
class Derived: public Base
{
public:
Derived() { a = 3; b = 5; }
void print() { cout << "Derived: " << a << ", " << b << endl; }
private:
int b;
};
void aho(Derived *p)
{
Base *p1 = p; cout << "p1->print(): "; p1->print();
Base b; cout << "b.print(): "; b.print();
*p1 = b; cout << "p1->print(): "; p1->print();
}
Base 分のメンバだけはコピーされる。
Derived 分のメンバはそのまま。
それが問題というなら問題だけど、そうでないならどうでもいいと思う。
Baseの代入演算子をprivateあるいはprotectedにしとけば 一応回避はできるね。 その手の本を読むと、「コピーコンストラクタと代入演算子は 定義するか、あるいはprivateにせよ」と書いてある。
650 :
デフォルトの名無しさん :02/11/09 06:36
typedef使えばいいんじゃん。 #include<iostream> struct a{ struct b{ b(){ std::cout << "test"; } }; }; typedef a::b b; void f(){ class c{};//関数内のクラスはfinalです } int main() { a A; b B; //c C;//これはコンパイルできない }
>633 T::Nを必要とする部分をテンプレートにしてまえば、 前方宣言要らへんのとちゃう?
>>647 もちろん問題だが、もしそれを解決しようと思ったら常に
そのポインタが指してるデータの型は、本当は何?
っつーのをチェックする必要がある。これはコストが大きいから、C++ では
敢えて危険な方をデフォルトにしてる。
C++ だと継承を使っているオブジェクトに関しては、値のコピーはふつー
認めないように operator=() を private にしておく。ポインタのコピー、ある
いは参照を常に使い、操作はメンバ関数 (往々にして virtual) で。
> そのポインタが指してるデータの型は、本当は何? これを言語レベルでやるなら、VB の Variant 型を実装する事になるな。 void* ポインタに対して任意のメソッドが使えたりして。
>>648 それは確認したんで、主張としては弱いかと思ったんだけど。
>>649 ,652 やぱーり知られた問題で解決法があったんだねえ。
たしかに copyを制限して、フツーの OOPLみたいにするのがいいんだろうね。
あと、 int (*)(const T&) と int (*)(T&) の間のキャストとか
vector<const T> と vector<T> の関係とか気になったのだけど、
ここらもおしてしるべしかしらん。
void* を int* に変換できなかったり、多重継承したクラスのポインタを
親クラスのポインタにすると値が変わっちゃうぐらい気を使ってるんだから
そこらへんもなんとかなってほしかった C & Haskell使いでした。
>>654 関数ポインタは、いずれもキャスト可能。しかも C 時代の遺物だから
実行時型情報は使えないので危ないことこの上ない。C++ 的には、
関数オブジェクトを使うのがお奨めかと。
> そこらへんもなんとかなってほしかった
まぁ、過去との互換性の問題とか何とか、いろいろしがらみ多い言語
だから。
コピー禁止に関しては boost を入れて boost::noncopyable を継承する
のが楽。#inculde と合わせても 2 行で済むし。
メンバー変数を配列にすることはできないんでしょうか?
class Hoge { int hogehoge[100000]; }; ならできるけど、そういう話じゃなくて?
>>657 すいません、説明不足でした。
hairetu[10000]={ m_member1 , m_member2 , ................. }
みたいなことをやりたいんです。
メンバ変数を連番にしているのでfor文とかで使いたいと
思ったのですが。。
>>658 657 にすればいい話じゃなくて?
どうしても名前付き変数名とインデックスを使い分けたいなら、union にでもすれば。
「名前付き変数名」 って何かおかしいけどナー。
661 :
デフォルトの名無しさん :02/11/10 00:11
>メンバ変数を連番にしているのでfor文とかで使いたい 配列の立場は・・・?
663 :
デフォルトの名無しさん :02/11/10 00:22
>>658 なにしたいんだかよくわからん
struct hoge {
int arr[100] ;
} ;
ならば
hoge h={1,2,3,4} ;
または
hoge i={{1,2,3,4}} ;
それとも
struct hoge {
int a1 ;
int a2 ;
int a3 ;
} ;
で
int hoge::*p[3]={&hoge::a1,&hoge::a2,&hoge::a3} ;
とか
>>658 enumで定数を定義して定数と要素数に対応した
処理で決着というオチが見えるのだが。
class Hoge { int m_member1; int m_member2; ... int m_member10000; } という 「定義済みの」 class があって、そのメンバを 「外部から」 配列で 使いたいという話か? なら、 設 計 か ら や り 直 し て く れ 。 どうしてもと言うなら int *hairetu[10000] = { &m_member1, &m_member2, ... &m_member10000 }; for(int i = 0; i < 10000; i++) DoSomething(*hairetu[i]); でも繰り返すが、 設 計 か ら や り 直 し て く れ 。 そもそも連番のメンバ名なんか使うな。 くれぐれも、設計からやり直してくれ。 COBOLer のにほいがぷんぷんと・・・
>>657-665 大人なんだから望みをかなえてやれヨ!
#include "boost/preprocessor/repetition/repeat.hpp"
#include "boost/preprocessor/punctuation/comma_if.hpp"
#define MEMBER_MAX 10000
#define MACRO(z,n,d) BOOST_PP_COMMA_IF(n) d##n
class A {
public:
int BOOST_PP_REPEAT(MEMBER_MAX, MACRO, m_member);
};
int main() {
A a;
int hairetu[MEMBER_MAX] = {BOOST_PP_REPEAT(MEMBER_MAX, MACRO, a.m_member)};
return 0;
}
>>666 658 の望みは叶えられない方が周りが幸せなんだが。
つーか、class 定義いじれるなら union でいいだろ。
668 :
デフォルトの名無しさん :02/11/10 02:57
JDK1.4を入れてたんだけど さっきインターネットしてたら、1.2がインストールされて、デフォルトが1.2になっちまったよ。。 どうすれば1.4に戻るの?コントロールパネルのJava-Plug Inをどうにかするの?
ID「C++」でますた…
672 :
デフォルトの名無しさん :02/11/10 09:43
クラスを作成してその中で配列を使うとき、 class A{ public; char a[70][2]; ................ } として コンストラクタで初期化するときに a[70][2]={"aa","bb",......} というように一度に初期化はできないんでしょうか?
>>672 言ってる意味分からん。
どうでもいいが、文字2つを文字列として扱うなら、 a[70][3] じゃねーの?
674 :
デフォルトの名無しさん :02/11/10 10:54
>>672 普通,
const char default_a_table[70][3?] = {
"aa",
"bb",
};
コンストラクタ
memcpy(a, default_a_table, sizeof(a));
675 :
デフォルトの名無しさん :02/11/10 12:31
コンストラクタでクラス内で使用したい変数を new した際に、 new できずに返り値として NULL が返った場合どういった処理をすればよいのでしょうか? クラスの使用者に安全に使ってもらうためにはどうしたらよいのでしょうか。 例外を投げたりして教えるのでしょうか?
newは新規作成できない場合std::bad_allocを投げますが… NULLで判断するのは一昔前の話では
677 :
デフォルトの名無しさん :02/11/10 15:14
VCを使っているのですが、出力結果を標準出力から テキストファイルに変更するにはどうしたらいいでしょうか
678 :
デフォルトの名無しさん :02/11/10 15:59
freopen(stdout, "ファイル.txt", "wt");
"wt"というのは何ですか。 すいませんが教えてください。
>>679 VC使ってるならコードをコピってF1押せ。
特定の関数のフラグなんか、2chで聞くよりヘルプ見たほうが早いだろ
681 :
デフォルトの名無しさん :02/11/10 19:33
(・∀゚) <っ…コメントネェヨ
682 :
デフォルトの名無しさん :02/11/10 21:13
2つ構造体同士のコピーについて質問です。 typedef struct { // 1 char * tekitou; // 2 }DATA; // 3 DATA * original; // コピー元 4 DATA * copy; // コピー 5 original = new DATA; // 6 /* 本来データはあらかじめ存在する値 ここでは適当に作っただけ */ char input[]="sage"; // 元の構造体を適当につくる 7 original->tekitou=(char *)malloc((strlen(input)+1)); // 8 strcpy(original->tekitou,"sage"); // 9 // original を copy にコピーする copy = new DATA; // 10 copy->tekitou=(char *)malloc( ?????? ); // 11 11行目でも領域確保はどのようにしたらよいのでしょう? strlen(original->tekitou) でも sizeof(original->tekitou) でもだめですよね。sage という文字数を判別するにはどーしたらよいのでしょうか?
683 :
デフォルトの名無しさん :02/11/10 21:15
↑省略されて見るの面倒ですが、マジで困ってるのでどなたかおねがいします
C++と全然関係ないない。sage
>>676 ありがとうございました。
new(nothrow) すると例外投げずにできるんですね。
686 :
デフォルトの名無しさん :02/11/11 16:54
失礼します。相談したいです。 構造体のメモリ確保に関しての質問です。 プログラム開始後、 自分の指定した数だけ構造体を作りたい時はどうすればよいですか? 例えば cout<<"データ数は?\n"; cin >> num; などとした後 struct data{ double a[10000]; double b[10000]; double c[10000]; }data,*datap; datap = &data; このような構造体をnumの数だけ確保したいとき、 どうしたらよいでしょうか? datap = new data ???????; ↑??????らへんの書き方がよくわかりません。 どなたかよろしければアドバイスお願いします。
687 :
デフォルトの名無しさん :02/11/11 17:27
クラス名とインスタンス名が同じ名前になってるぞ。 struct Data{... }data,*datap; datap = new Data [num]; delete [] datap;
688 :
デフォルトの名無しさん :02/11/11 17:51
>>687 書き間違えていましたね。
アドバイスありがとうございましたー
686の者です。 すいません、書き方間違えていました。 numの分だけ構造体メンバーの配列を増やしたいでした。 つまり struct Data{ double a[10000*num]; double b[10000*num]; double c[10000*num]; }data,*datap という感じで。 ただ、この形じゃあコンパイルがとおらないので、 どなたかよい方法教えていただけませんか?
素直にvector使っと毛
>>689 struct Data{
Data(int num){
a=new double[10000*num];
b=new double[10000*num];
c=new double[10000*num];
}
double* a;
double* b;
double* c;
...
>>690 さきほどvectorについて調べました。
まだ初心者なのでなかなか難しそうです。
その方法しかなければ勉強するしかないのでがんばります。
>>691 おー!ありがとうございます。
早速試してみます。
694 :
デフォルトの名無しさん :02/11/11 23:04
文字列と整数をキーにしたオブジェクトを溜め込むのにmapを使って、 struct key { string name; int num; }; typedef map<key, ClassName> ClassTable; このような宣言ってありですか? とくにstruct keyのここでの使いっぷりってどうなんでしょ?
keyには適切な比較演算子、代入演算子、コピーコンストラクタが 定義されていればなんでもいいんじゃなかろうか。
>>694 > とくにstruct keyのここでの使いっぷりってどうなんでしょ?
1. Assignable, すなわち Key 型の変数 t, u に対して t = u を実行すると、
t と u が等しくなり、その式の戻り値は Key& 型である。
2. map テンプレートクラスの第三引数 Compare (デフォルトでは std::less<key_type>) に
よって、厳密な弱い順序づけ (strict weak ordering) がなされる。すなわち
Key 型の変数 t, u は
t と u が等しい <=> !Compare(t, u) && !Compare(u, t) が真
である。
これが条件。
ダメな例を挙げると const int みたいに代入不可能であるとか、auto_ptr
のように代入後の値が異なってしまうもの。それから Compare を
t <= u
みたいな定義にするのもダメ。これだと
!Compare(t, t) && !Compare(t, t) = !(t <= t) && !(t <= t) =
!ture && !true = false && false = false
となってしまい、2 の条件に反するから。
>>691 ちょっとうまくできません。
これはメモリを確保するために、
構造体のポインタをこう定義しているのですか?
構造体メンバの動的配列のやり方って無理なんですかね。。。
その num の値はどうやって供給するつもりなんよ?
num が const なら
>>689 のままでいけるし、変数なんだったら
>>691 のようにするしかあるめぇ。
686 何 が や り た い ん で す か ?
本日はここまでです。 お疲れさまでした!
:-)
template <std::size_t Size> struct data{ double a[Size]; double b[Size]; double c[Size]; }; data<num> data_instance; …ってnumは変数か。std::vector<>使えばいいんでないの?
704 :
デフォルトの名無しさん :02/11/12 17:42
クラスを継承するときの関数のオーバーロードについて質問させて下さい。 下のようなクラスAとその継承クラスBを作りました。 Bのインスタンスを作成したとき、 BのコンストラクタではB::func(theta)を用いて処理を行って欲しいのですが なぜかA::func(theta)が呼び出されてしまうようです。 どのように書けば意図した動作をしてくれるのでしょうか…? class A{ protected: virtual void func(double theta)=0; public: A(double theta){func(theta)を使った処理} }; class B:public A{ protected: virtual void func(double theta){オーバーライドさせたい処理} public: B(double theta):A(theta){;} };
コンストラクタ内では仮想関数は呼べないはずだよ。 A*を返す擬似コンストラクタを使えばいい。 // こんな感じで。 A* A::create(){ A* self = new A; func(...); return self; }
706 :
デフォルトの名無しさん :02/11/12 18:05
mapの値に抽象クラスを入れるのは無理?
普通に無理でしょ…値が作れたら抽象クラスじゃなくなっちゃうよ。 抽象クラスのポインタなら行けるだろうけど。
708 :
デフォルトの名無しさん :02/11/12 20:03
vector<int> *vect; ってなんなの?
>>708 vectはstd::vector<int>を指すポインタ。
>>880 qsort()ならsearch.hをインクルードしてるから大丈夫だよ。
>>708 vector<int>objectを将来指すであろうpointerのdeclaration。
713 :
デフォルトの名無しさん :02/11/12 21:34
>>708 の宣言のあと、
vect = new vector<int>;
vect->push_back(1);
とかでいいんですか?
使い方は。
>>713 STLスレッドにおいで。議論がされてるよ。
715 :
デフォルトの名無しさん :02/11/12 21:45
>>714 stlスレ見ました。
誘導ありがとうございますた。
716 :
デフォルトの名無しさん :02/11/13 09:45
下みたいに、参照に null pointer を代入するのって、規格上許されてる? g++ だとコンパイルできて期待通り動くんだけど、実装依存なんてことも あるんでしょうか。 #include <iostream> int main() { int& ri = *((int*)0); if (&ri == 0) { std::cout << "null reference" << std::endl; } }
717 :
デフォルトの名無しさん :02/11/13 09:58
*((int *)0); これってポインタなのか? ポインタを間接参照しているようにみえるが。
>ポインタを間接参照しているようにみえるが。 そう。まさしくそう見えるので不安なわけです(w
規格はどうだか知らないけど、VC のリスティング見ると内部的にポインタに なってるみたいだね。 int *p = (int*)0; if (p == 0) { ... と同じ処理になってる。 *p や ri を使おうとすると、たちどころにアクセス違反になる。
C++3rdの5.5には初期化子は左辺値であればいいみたいなことが 書いてあるけども
*((int*)0)はnull pointerを参照している事にはならないんだろうか。
720> 初期化子は左辺値であればいいみたいな つまりは、&(*((int*)0)) が有効な式になるかどうかってことかな。
ということだと思うんですけども。 単項の * って左辺値つくり出んじゃなかったっけ、、
参照への代入に限って違うとか。
int main() { int &r = *((int*)0); //平気 int c = *((int*)0); //だめぽ int &rr = r; //こっからダミー int cc = c; return 0; }
castは新しいのをね。
727 :
デフォルトの名無しさん :02/11/13 22:47
exceptional C++ を読みましょう
>>727
729 :
デフォルトの名無しさん :02/11/13 22:52
exceptional C++ は買ったが読めないす。誰かフォローして。(今日はもう終電なので帰ります)
>>727 そのページに
> 例外をスローすべき十分な理由があるなら、進んでその例外を
> スローして、それを文書化すればよいのです。例外をスロー
> するのが当然の場面で、例外のスローを回避する方法を
> 発明する必要はありません。複雑にすることで、制限された
> バージョンのクラスを誰かが誤用する危険よりもかえってひどい
> 保守の悪夢が生まれてしまいます。
と書いてあるではないか。
というか、あなたが何故『「絶対に」投げてはいけない』と思うのかが謎なのだが。
731 :
デフォルトの名無しさん :02/11/14 00:29
main() { const unsigned N = 1; try{ for(;;) new int[N]; } catch( ... ){} } ↑のプログラムが、Aborted(core dumped) になってしまいます。 なにが起こっているんでしょうか? N = 1024 にしたら無言で終了しました。(これが期待の動作) 環境は、 cygwin g++-3.1.1 です。
後始末の処理にもヒープメモリを必要とするからじゃないの?
ちょっと調べてみたんだけど、 漏れの結論は 「std::bad_allocを投げるのに動的メモリを必要とするようなg++の実装がクソ」 になりました。 ・・・いいのかなぁ?
>>727 例外安全にしたければ Pimpl パターンを使えってこった。
>>734 いつも思うんだが・・
pimplってどう発音してる? ぴーいんぷる? ぴんぷる?
736 :
デフォルトの名無しさん :02/11/14 10:00
C++ FAQでは、コンストラクタでスローしろと書いてあったような記憶がある…
デストラクタでthrowする香具師はドキュソ。とりあえずそれだけでいい んじゃないすか。>727
>>727 例外は、戻り値がない コンストラクタ で一番威力を発揮するもんだろうが。
>>735 ぴーいんぷる
741 :
デフォルトの名無しさん :02/11/14 14:38
>>738 前から思ってたんけど 香具師 をきちんと辞書で調べたか?
>741 既出の読みはガイシュツではない。とか言い出す予感
2ちゃん用語でウンチク語りだすのか(w 恥ずかしいなぁ。まあ2ちゃん用語自体恥ずかしいが。
744 :
困っています :02/11/14 18:34
マウスでドラッグ選択した部分の描画を拡大縮小する良い方法ありませんか?!参考になるものでも結構です。 お願いします。
StretchBlt()
むしろ 「(w」 りの方が恥ずかしい
り?
749 :
デフォルトの名無しさん :02/11/14 21:58
自分の為のライブラリ、作ってますか?
漏れも恥ずかしい
752 :
デフォルトの名無しさん :02/11/14 22:18
ちょっとMFC系の質問なのですが、(あえてC++) CString s; に1文字格納されているとして、 それを char 型の変数に代入するにはどうすればよいのでしょうか?
なにが「あえて」だ!ドシロウトめ!s[0]だ!読んだらすぐ氏ね!
>752 char buf _tcscpy(&buf, s); こうすれば、代入できます。 >753 しぬのはてめえだよ。ドシロウト。 char に CStringが直接代入できるわけねーだろ! 試してみろ! 素人もいます。公開掲示板では以後、言葉を慎むように。
>>754 お前が氏ねよ!!
s[0]をcharに代入すると書いてあるだろう!お前の目はふしあなか?(プ
s は CString で宣言されていますよ。上では。
>754 有難うございます。 黙ってみていてすいません。 本当に初心者ですが、これからもよろしくお願いします。
アカン。ネタなのかマジなのか判らなくなってきた。
とりあえず
>>752 はCStringの[]演算子が何を返すかマニュアル見て来た方がいいぞ。
君はネタではないと信じているぞ。
>>754 じつはMFC使ったことなくって今試してみたんだけど(って言うか試すまでもなく)
_tcscpyだとメモリ破壊してんじゃねえか!?
760 :
デフォルトの名無しさん :02/11/15 00:33
754 晒し age
おいおい、charに入れるんだぞ。TCAHRじゃねーぞ。 754は_tcscpyを使ってるくせになんでcharなんだ(致命的ミスは別にして)。 CString::operator[]もTCHARを返すだけだぞ。 char c; CString s("a"); USES_CONVERSION; c = T2A(s.GetBuffer(1))[0]; ・・・たぶん、752が求めてるのはこんなんじゃないだろうな。 つーか、すれ違いだバカ野郎!
761だが、GetBufferのパラメータは3以上にしろ。バカ野郎。
おまえら、面白すぎだバカ野郎
newで作ったポインタを破棄する関数を作ろうと、 CMyWnd* pWnd = new CMyWnd; DelObject(pWnd); DelObject(CMyWnd* pWnd){ delete pWnd; } としたんですが、これで正しく破棄されてるんでしょうか?
>>764 そのコードの通りに実行されるなら (途中で DelObject() の実行の阻害に
なるような事をしていなければ) 破棄される。
CMyWnd ではなく、自作の簡単なクラスを使って確認してみればいい。
766 :
デフォルトの名無しさん :02/11/15 15:44
767 :
C++なんだけど :02/11/15 16:26
どうして4度目のprintf()の行をコメントアウトすると エラーが発生しなくなるんですか? #include <iostream.h> void f(char str){str++;} main(){ char *str, **pp; str = new char[5]; strcpy(str, "abc"); *pp = str; f(*str); printf("%#x %s\n", *pp, *pp); f(*str); printf("%#x %s\n", *pp, *pp); f(*str); printf("%#x %s\n", *pp, *pp); f(*str); printf("%#x %s\n", *pp, *pp); delete [] str; }
ベクターファンクションのプログラムでOperation+とOperation-のファンクションはどうやって作ったらいいか、分かる方返信お願いしますううう。
>ベクターファンクションのプログラム 意味不明 >Operation+とOperation-のファンクション 意味不明
>767 ppはどこを指してるのかな? # ただポインタがわかってないだけで、全然C++じゃないけどな
772 :
C++なんだけど :02/11/15 17:46
*pp = str; によって、ppは、char*型のstrのアドレスを指しているんでしょ?
やっぱポインタの基本からやり直しなさい
char *str; *str = 'A'; ↑こうした時の動作については、どんな本にも書かれていると思うが。
775 :
デフォルトの名無しさん :02/11/15 17:52
ゆんゆん。
(´-`).。oO(漏れがあっちのスレで教えた事をもー忘れたのか。。。)
777 :
C++なんだけど :02/11/15 18:11
ppの容量が確保されてないから *ppも使えないってことかな?
778 :
デフォルトの名無しさん :02/11/15 18:15
>>778 なんかえらく懐かしい記がする。よく知らんけど
DOSエクステンダ時代に有名だったねえ
>>778 これのおかげで 98 時代に UNIX のゲームで遊べた。
商用のコンパイラは高かったし、98 用のバイナリは殆ど無かったし。
range_error と out_of_range の使い分けの仕方を教えてください。
俺も全然知らないんだけどstroustrupのwebサイト見てたら見つけたんで気になった。
785 :
デフォルトの名無しさん :02/11/16 21:21
質問です。VC++ 6 で コンストラクタの初期化リスト中で this を使うと (this が) ベースメンバ初期化リストで使用されました。 という警告が出るんですが、これって何故いけないのでしょうか? 検索して調べたあるページには 非静的メンバ関数の中でのみ有効な this ポインタが基本クラスの初期化リストで使用された という意味だと書いてあったのですが、コンストラクタですから 非静的ですし、問題ないと思うのですが…。 何がいけないのか、どういう事に注意するべきなのか教えてください。 よろしくお願いします。
>>785 初期化リストは、コンストラクタの内側じゃないんだと思います。
動作に問題がないならとりあえず、#pragma warning(disable:4355) で 黙らせていいんじゃないですか?
>>785 まだ初期化が完了していないオブジェクトへのポインタを使ってることになるからだろ。
初期化済みのオブジェクトを期待している関数の引数に
コンストラクタの中から this を渡してもコンパイルは通ってしまう。
>>785 致命的なのは、渡した this 経由で派生クラスの仮想関数を呼ぶ場合やね。
class CallFoo;
class Base {
CallFoo call_foo_;
public:
Base() : call_foo_(*this) {}
virtual void foo() = 0;
};
class Deriv {
public:
virtual void foo() {}
};
class CallFoo {
public:
CallFoo(Base& obj) { obj.foo(); }
};
Deriv deriv; // Base::foo() を呼んで実行時エラーで止まる。
コンストラクタの実行が終わるまでは this が指すのは Deriv クラスの
インスタンスとは限らない。Base クラスの初期化リストを実行する場合
は、まだ this は Base クラスのインスタンスになってる。
蛇足。
>>789 の場合だと、Base::Base()の中で this->foo(); しても落ちるね。
Javaと違うから両方やってる人は要注意
落ちるかどうかは環境によるだろ 何事もなくベースのfooが呼ばれるコンパイラもある。
>791 Base::foo() が純粋仮想関数でも? もし Base::foo() が単なる仮想関数なら、何事もなく Base::foo() が呼ばれるのは 確かだが。ただし、プログラマの意図と異なる可能性が高い。
皆さんレスありがとうございます。
>>786 確かにコンストラクタの内側ではないですね。
VC++ 用のプラグマの指定は教えてもらえて助かりました。
後少しで警告を我慢し続けなければいけないところでした。
>>788 そういえばそうですね。(今回は)参照に設定する為に渡すんだったので、
対象側のコンストラクタで渡す側のメンバを触る事まで気が回りませんでした。
>>789 これは気をつけないといけませんね。
>>791 報告:参照に代入して、構築完了後に使う限りでは
VC++6.0, Borland C++, g++ のいずれでも問題ありませんでした。
みなさんありがとう。
age てしまいました。スミマセン。
>>792 その場合はどう考えても落ちますよね。
お世話になってます。
>>785 です。またも質問です。
テンプレート引数にメンバ関数を渡したくて下記のようにしました。
#include <iostream>
template<typename T, void (T::*Use)()>
class Hoge
{
public: void Bomber(T arg) { (arg.*Use)(); }
};
class CFoo
{
public: void Use() { std::cout << "使われますた。"; }
};
int main()
{
CFoo honya;
honya.Use();
Hoge<CFoo, CFoo::Use> chome;
chome.Bomber(honya);
return 0;
}
Borland C++ だとちゃんとコンパイルできるのですが
vc++ 6.0 だと 'Hoge' : テンプレートの仮引数 'Use' が無効です。
g++ 2.95.3-5 だと テンプレート引数を `CFoo::Use' から `void (CFoo::*)()' に変換できない。
になってしまいます。テンプレートの宣言はコンパイル通るみたい(文法違反ではない)のですが
使う部分で実際の関数を指定すると駄目になってしまうみたいです。
この場合、解決方法はありますでしょうか?よろしくお願いいたします。
796 :
デフォルトの名無しさん :02/11/17 11:18
d3d8.hくれ
>795 &CFoo::Use
>>795 VC++6でtemplateを使いまくろうというのがそもそも間違いだと思う。
解決法1 : VC++.NET を使う。
解決法2 : rebind風
template<typename T>
struct HogeTmpl {
template<void (T::*Use)()>
class Hoge
{
public: void Bomber(T arg) { (arg.*Use)(); }
};
};
HogeTmpl<CFoo>::Hoge<CFoo::Use> chome;
みなさんレスありがとうございます。
>>797 おぉ!g++ で動きました!やっぱり関数ポインタはテンプレートに渡すときも
アドレスを取る書き方じゃないと駄目なんですね。
>>798 ぬぉ!rebind 風なら VC++6.0 でも動きました!
しかし頻繁に使いたい物なので利用者側がネストしたインスタンスを書かなければならないのは微妙ですね…。
時代遅れの VC++6 はそろそろ切り捨てるべきなんでしょうか…。
ともあれ、みなさんありがとうございました。
800 :
デフォルトの名無しさん :02/11/17 13:39
ダイナミックリンクライブラリ の作り方を説明してるページってないですかね? 猫でもわかるC++をみてもわからないのですよ。
質問します。newで領域を確保するプログラムを作成しているんですが こういう系統のものってnewを行う順番によっては例外がでるものなんでしょうか? 今作っているプログラムは、newをする場所を少し手前に持っていくと 正常に動いたりするんですが・・・
VC++ 逝ってよし!!かもの
>>785 です。
助言に従って VC++7 Standard も実験環境に加えたのですが、
本当にやりたかった事をしようとすると VC++7 でも駄目でした。
template<typename T>
struct HogeTmpl{
template<void (T::*Use)()>
class Hoge{
public: void Bomber(T arg){
(arg.*Use)();
}
};
};
class CFoo{
public: void Use() { std::cout << "使われますた。"; }
public: HogeTmpl<CFoo>::Hoge<&CFoo::Use> chome;
};
void main(){
CFoo foo;
foo.chome.Bomber(foo);
}
BCC, g++ のいずれでも通るのに VC++ は 6pro 7std では
VC7 'CFoo::Use' : 外側のクラスのメンバは型名、スタティック、または列挙子ではありません。
VC6 認識できない型 'CFoo' が使われています。
となってしまいます。何か解決方法はありますでしょうか?
頼ってばかりで申し訳ないのですが、どうかよろしくお願いいたします。
>>801 それは99.999999999%キミのプログラムミスだから心配しなくていいよ。
たまには人の質問にも答えてみたり
>>801 例外って bad_alloc とかでしょうか?
それともシステムの例外?
ちょっと状況を判断するには情報が少なすぎる気がします。
シンプルにしたソースとか提示すると答える人もわかり易くて、
レスがつきやすいと思いますよ。
805 :
デフォルトの名無しさん :02/11/17 15:29
#if false //だめぽ #endif bccとgccはOKなのですがvc++だけ通りません #if 定数式 改行 こういう仕様だと思ってたのですが 標準としてはbcc, gccとvc++のどちらが正しいのでしょうか?
>800 それは、処理系毎のスレに行って聞いた方が良いと思われ。VC あたりだと ウィザードでプロジェクト作るのが一般的だし。
>>805 通るが?
>Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
>Microsoft(R) 32-bit C/C++ Standard Compiler Version 13.00.9466 for 80x86
お、C++モードだと通らんのか。スマソ
>>807 ウチでは通らない模様。
VC++6 #if ディレクティブ内には、式が存在しないか、定数の評価をしませんでした。
VC++7 整数定数式が無効です。
g++ はプリプロセスの順番が コメントの除去→マクロ展開、ディレクティブ処理
なのに VC++ は
マクロ展開、ディレクティブ処理→コメントの除去
らしいのは以前ぜんぜん関係ない事でハマって確認済み。
# 私の質問の方は進展なし…。誰かヘルプミーです。
>>802 これじゃだめか?
class CFooBase {
public: void Use() { std::cout << "使われますた。"; }
};
class CFoo : public CFooBase {
public: HogeTmpl<CFooBase>::Hoge<&CFooBase::Use> chome;
};
これならVC7でも通るね。 #include <iostream> #include <functional> class CFoo { public: void Use() { std::cout << "使われますた。"; } public: std::mem_fun_t<void, CFoo> chome; public: CFoo() : chome( std::mem_fun(&CFoo::Use) ) {} }; int main(){ CFoo foo; foo.chome(&foo); return 0; }
812 :
デフォルトの名無しさん :02/11/18 01:24
class base { public: virtual base& operator=(const base&) = 0; }; class derived : public base { public: derived& operator=(const derived& d) {} }; これが駄目なのを今知って驚いたんですがどういう風に理解すればいいでしょうか。
継承前提のクラスを代入可能にするというのはあんまり見ないなあ。 代入とかするってことは値のように使う、という意図だろうし・・・
>>812 純粋仮想関数が正しくオーバーライドされてないからエラーが出る。
戻り値も仮引数も全く同じ型の関数が必要。
ども。
>>813 "baseから派生するクラスは代入演算を持つのだ"という点をはっきりさせる
ところ意図があります。そんだけです・・・。
>>814 とりあえず戻り値は違っていても↓は通りますね。(gcc-3.2)
class base {
public:
virtual base& operator=(const base*) = 0;
};
class derived : public base {
public:
derived& operator=(const base* b_ptr) {}
};
>>815 但し、代入演算子関数は、継承されないという性質を持つため純粋仮想関数と
宣言しない方がよい。コンストラクタとデストラクタも純粋仮想関数からは除外
すべき。
下に示すように、抽象クラスのメンバは自動的に代入してくれないので、 手動で代入しなければならず、なかなか厄介だよ。 class base { public: virtual const base& operator=(const base&) = 0; int j; }; class derived : public base { public: const base& operator=(const base& d) { j = d.j; return d; } int i; }; int main() { derived d, e; e.i = 111; e.j = 222; d = e; std::cout << e.i << " " << e.j << std::endl; std::cout << d.i << " " << d.j << std::endl; }
>>816 りょかい。"すべき"と言ってもらえると安心できます。
おやすみなさい。
>>818 「すべき」と書くといかにも語弊がありそう。実は、コンストラクタとデストラクタと
代入演算子関数を純粋仮想関数と宣言すると、リンカエラーになる処理系が
あるらしい。
820 :
デフォルトの名無しさん :02/11/18 07:26
C++の入門書をやっていて、 「floatを返しcharを受け取る関数へのポインタを返し、intを引数とする関数へのポインタを宣言せよ」 という問題があって、 float *(char) Func1(int i){ /* 処理1 */ } // <--☆ float Func2(char c){ /* 処理2 */ } int main() { float *(char) (*fp1)(int); // 'fp1'が問題に対する答え fp1 = Func1; float (*fp2)(char); fp2 = fp1(109); float f; f = fp2('H'); } としたのですが☆の部分で「宣言が正しく終了していない」というエラーが出ます。 何が間違っているのでしょうか。
>>820 float XXXX(char); // 「floatを返しcharを受け取る関数
float (*XXXX)(char) // へのポインタ
float (*XXX(YYY))(char) // を返し
float (*XXX(int i))(char) // intを引数とする
float (*Func1(int i))(char) { /*処理1*/ } // 関数 = Func1
// へのポインタ」 にするにはFunc1の部分をさらに分解しよう。
つーかね、typedefを使えと。
俺ならこうする。 typedef float (*c2f)(char); c2f Func1(int i) { ... }
ついでに言うと float *(char) Func1(int i) は、 float * でfloatのポインタになってしまうので、 (char) は何のことだかわからないので、 絶対間違っていると判んなきゃダメだと思うぞ。
そんな事言わずに教えてくれよ。 気になって気になっておがで不眠症なんだ。
誤爆
826 :
デフォルトの名無しさん :02/11/18 14:18
>>824 なんだかこっちが気になるな…(*´Д`)
おがってのも…
>>826 824じゃないけど「おかげ」のtypo
かな打ちマンセー
829 :
デフォルトの名無しさん :02/11/19 02:15
"カナ"当の半角カナの文字列を'kana'のようなローマ字に直すプログラムを作っています。 char buf[256]; memset(buf,'\0',256); char roma[8]; while (*str != '\0'){ ConvertOne(*str,roma);//これは一文字づつ'カ'→'ka'等に変換する関数 strcpy(roma,"test"); sprintf(buf,"%s%s",buf,roma); str++; } このようにしてみたのですが、 これだと'パ'や'ガ'など一文字だけでは 判別できない文字を直すことができません。 なにかよい方法はないでしょうか?
>>829 そのような入力を想定しながら作り直せ。
>>829 オートマトンを使って、濁音や半濁音になる可能性のあるカナを
別処理。
とある教授は,彼の授業用ノートに「オートマント」と書かれている為,毎年「オートマント」と板書する。 1つ上1つ下2つ↓のやつらに聞いて確かめた。 それが教授のネタかどうかは定かではない。
>>821 とてもわかりやすい答え、ありがとうございます。
おかげさまでコンパイルできました。
>>822 アドバイスありがとうございます。
なるほど、こんなtypedefの使い方があるとは知りませんでした。
勉強になりました。
>>832 アドバイスありがとうございます。
なるほど、こんなオートマントの使い方があるとは知りませんでした。
勉強になりました。
それ本当に教授かよ
836 :
デフォルトの名無しさん :02/11/19 10:35
CppUnit 1.8 で、「きちんと例外が投げられるかどうか調べる」というのはマクロかなにかでかけますか?
>>836 クエスチョンありがとうございます。
なるほど、こんな人任せの質問の仕方があるとは知りませんでした。
勉強になりました。
838 :
デフォルトの名無しさん :02/11/19 11:32
839 :
デフォルトの名無しさん :02/11/19 12:28
>>836 どこで調べたいんだ?
投げた側か受け取り側か。
840 :
bloom :02/11/19 12:28
841 :
デフォルトの名無しさん :02/11/19 12:47
842 :
デフォルトの名無しさん :02/11/19 15:12
こんにちは。よろしければ教えてください。 現在、VC++のサンプルプログラムのチャット プログラムをサーバ側とクライアント側のプログラム を同一マシンで動かそうとしているのですが、 クライアントが接続するときに接続拒否をされているようです。 私のOSはWIN98ですが、やっぱりこれが原因でしょうか? サーバー機能がないOSだからでしょうか? よろしくお願いします。
843 :
デフォルトの名無しさん :02/11/19 18:25
>>841 それってハンドラ内に普通にチェック用マクロ書けばいいだけちゃうん?
>>842 Norton Internet Seculity とか
その手のファイアウォールツール入れてたり
しませんかーーーー?
つーか間に改行入れるのやめい。
844 :
デフォルトの名無しさん :02/11/19 20:51
επιστημ氏が2ちゃんねらな予感な感じを受けるのは私だけでしょうか…
えぴすてーめーは、毎回ちょっとづつ名前を変えているという噂がある。 この前は、επιστη µ だった(嘘
s/イ//;
エピさん見てるなら返事してー
みなさんこんにちわ。 エピステーキーです。 読み方知らないけど「きー」を変換してね。
>>851 ∧ ∧ ∧
/ ヽ / ヽ_ / .∧
/ `、 _/ `、⌒ヾ⌒ヽ/ ∧
/  ̄ ̄/ u (.....ノ(....ノ / ヽ
l::::::::: | u .:(....ノノ
|:::::::::: -=・=- / ̄ ̄ヽ ::::::::::::::/`ヽ
.|::::::::::::::::: \_(___..ノ u ::::::::::::::::::::(....ノノ
ヽ::::::::::::::::::: \/ヽ u ::::::::::::::::::::::::::::ノ
∧ ∧ ∧ / ヽ / ヽ_ / .∧ / `、 _/ `、⌒ヾ⌒ヽ/ ∧ /  ̄ ̄/ u (.....ノ(....ノ / ヽ l::::::::: | u .:(....ノノ |:::::::::: -=・=- / ̄ ̄ヽ ::::::::::::::/`ヽ .|::::::::::::::::: \_(___..ノ u ::::::::::::::::::::(....ノノ ヽ::::::::::::::::::: \/ヽ u ::::::↑::::::::::::::::::ノ | επιστηχ◆IGEMrmvKLI
エピステーメーさんがブラインドタッチできないとは知らなかったなぁ…。
855 :
デフォルトの名無しさん :02/11/19 22:45
VC++で int a=30; printf("%d",a); を TextOutなどで実現するにはどうすればいいですか?
TextPrintf("%d",a);
sprintf
858 :
デフォルトの名無しさん :02/11/19 23:04
>>844-854 悪意を感じるぞ。匿名をいいことに挑発するのは卑怯!
(俺は本人じゃないし、cppllにも加入してない)
859 :
デフォルトの名無しさん :02/11/19 23:07
無理でした それとも書き方が悪かったのかなぁ? もうすこしちゃんとした書き方教えてください。
秘密!
>>858 エピステーメーがタッチタイプできないってのはてーめーがCマガの連載で
語ってた事だし、むしろ漏れは彼の熱心な読者だしー。
上のヤツはしらんが。
ヱビスビールですが何か?
つまらん。
>>855 std::ostringstreamなどはいかがだろうか。
だめぽ?(ρ_;)
BOOL TextOutFormat(HDC hDC, int nXStart, int nYStart, const char *fmt, ...) { va_list vargs; va_start(vargs, fmt); const size_t BufSize = 8192; char *buf = new char[BufSize + 1]; buf[BufSize] = '\0'; BOOL ret = TextOut(hDC, nXStart, nYStart, buf, _vsnprintf(buf, BufSize, fmt, vargs)); va_end(vargs); delete[] buf; return ret; } TextOutFormat(NULL, 7, 8, "%d", 1234);
すみません、SGIのMIPSpro C++ 7.3ユーザーなのですが、 C標準ヘッダの取り込みが #include <cctype> などのように指定しても上手くいきません(file unavailable) もちろん-LANG:std付けてます。 つうか/usr/include/CC以下にそんなの無いし。 かといってctype.hを取り込むと、namespaceが::で(゚д゚)マズーなんですが...。 プラットフォームdependな質問で申し訳ありませんが、詳しい方お願いします。
ファイル名 cctype.h namespace std { #include <ctype.h> } スクリプトで生成すれ。もちろん標準 C ヘッダとその他の標準 C++ ヘッダは分けて。
ファイル名は cctype だった須磨祖
ぜんぜん関係ないんだけどさ、dynamic_cast と VISITOR は 一般的にどちらが速度早い? あまりにも頻繁にベースからサブを探り出す必要があるので VISITOR のトリックで どうにかしようと思ってるんだけど、速度的には不利なのかなぁ?
>>867 マジですか!?
いや確かにその方法は一瞬脳裏をよぎったんですが、
まさかそんなことはあるまい(((((((;゚д゚)))))))
と自己否定してました。
最新のコンパイラなのにぃぃぃ
871 :
デフォルトの名無しさん :02/11/20 23:02
gccでSDLを使っています。初心者用の初期化サンプルを試したのですが オブジェクトファイルが出てエラーになります。 #include <stdlib.h> #include "SDL.h" int main(int argc, char *argv[]) { if ( SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0 ) { fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); exit(1); } atexit(SDL_Quit); return(0); }
>>871 そうですか。
つか、エラーメッセージくらい貼れってばさ。
すいません。続きです。 エラーは make -k gcc test.cpp -o test -Wall -I/usr/include/SDL /tmp/ccqiKxRn.o: In function `main': /tmp/ccqiKxRn.o(.text+0xc): undefined reference to `SDL_Init' /tmp/ccqiKxRn.o(.text+0x20): undefined reference to `SDL_GetError' /tmp/ccqiKxRn.o(.text+0x4c): undefined reference to `SDL_Quit' collect2: ld returned 1 exit status make: *** [test] エラー 1
あれ?全部書いてるのに転送されてない…? 連続ですいません。makefileは test : test.cpp gcc test.cpp -o test -Wall -I/usr/include/SDL
>>873 そのエラーは関数のプロトタイプだけで本体が定義されてない時に
出るエラー。
???文が途切れてますすいません…。 gccの前にはちゃんとタブ入ってます。 ライブラリもちゃんとインストールされてます。 GTK等の他のライブラリは正常に動作します。 どうなってるんでしょうか?
>>877 ライブラリはリンクしなきゃ。
`sdl-config --libs` もいれて。sdl-config が正しく
設定されていればそれでとおるとおもうけど。
>>875 ありがとうございます。
テストコードはコンパイルできたのでmakeの仕方がおかしいみたいでした。
本体の定義を読み込みかたを探して来ます。
CMyClass** pMyClass; pMyClass[0] = new CMyClass; pMyClass[1] = (以下続く) という配列の要素をnewで確保したのですが、 終了処理のところで delete [] *pMyClass; とやると実行時エラーが出ます。 一度にdeleteする方法があったら教えてください。
>>880 ・pMyClass[0]ってちゃんと確保されてるの?
・delete[] *pMyClassに対応するnewってどこにある?
ポインタを勉強しませう。
CMyClass** pMyClass; pMyClass[0] = .. あれ?pMyClassの実体は?
883 :
デフォルトの名無しさん :02/11/20 23:54
new [] でないと delete [] はできないんじゃなかった?
素人はboost::shared_ptrでも使っとけ
>>880 書き忘れでした...(汗)
正しくは、CMyClass** pMyClass[4]; です。
pMyClass[0],pMyClass[1]...には一応インスタンスがあり
メンバ関数も呼び出せているのですが、delete時にエラーが出ます。
>>883 基本クラスのポインタで派生クラスを管理している状態なので、
new [] は使っていませんでした。
ただdelete pMyClass[0];...と一つづつdeleteしてもエラーが出ます。
何か根本的な理解不足でしょうか?
それともdeleteするタイミングが悪いのか...
ほとんどの処理系が new=malloc、delete=free だとすると、880 がやろうと してる事は大間違いだな。
>>885 CMyClass* pMyClass[4];
じゃなくて、CMyClass**なのか?
>>885 >正しくは、CMyClass** pMyClass[4]; です。
ほんとに?
CMyClass* pMyClass[4];
じゃなくて?
質問シロート君。 エラーって何の事だい?
>>885 これならわかるが。
class CMyClass {};
int main()
{
CMyClass** pMyClass;
pMyClass = new CMyClass*[4];
for (int i = 0; i < 4; i++)
pMyClass[i] = new CMyClass;
//
for (int i = 0; i < 4; i++)
delete pMyClass[i];
delete[] pMyClass;
}
>>887 すいません、さらに書き間違いをしていました。
CMyClass* pMyClass[4]; でした。
>>889 deleteを呼ぶときになると、アプリケーションエラーのダイアログが出て
「・・・メモリが"read"になることはできませんでした。」
という例外エラー?(←間違ってたらすみません)が出ます。
>>890 ソースを示していただいて、ありがとうございます。
頭の中が混乱していて、いろいろご迷惑をおかけしました。
まだnewとdeleteや配列について全然理解不足だということを痛感しました。
レス下さった方々、本当に感謝です。勉強になりました。
>>892 > メモリが"read"になることはできませんでした。
どっかでメモリを壊している。
>>892 その場合の正解は、たぶんこうだ。
std::auto_ptr<CMyClass> pMyClass[4];
for (int i = 0; i < 4; ++i)
  pMyClass[i].reset( new CMyClass );
delete を自分で書かないように心がけるのがコツだ。
class hoge{...}; class hage:public hoge{...public:void poge();...}; int procA(){ ... hoge *p=new hage; ((hage *)p)->poge(); ... } は安全ですか?(poge()はhogeの仮想関数ではありません) あとC++キャストの載ってるいい本を教えてください
896 :
デフォルトの名無しさん :02/11/21 12:16
age忘れました
確実にhageのインスタンスであることが分かっている場合はstatic_cast 他のクラスのインスタンスである可能性がある場合はdynamic_cast
λ...... ここ変だよ・・ λ...... λ...... λ...... λ...... 失敗だったネ… λ...... λ...... λ...... λ...... 逃げていく… λ...... λ...... λ...... λ...... λ...... λ...... みんな逃げていく… λ...... ここ変だよ・・ λ...... λ...... λ...... λ...... 失敗だったネ… λ...... λ...... λ...... λ...... 逃げていく… λ...... λ...... λ...... λ...... λ...... λ...... みんな逃げていく…
クラス名(例:Onigiriクラス)が COnigiriの場合は、普通のクラス IOnigiriの場合は、インターフェースクラス みたいなプリフィックスありますが、 オリジナル(?)で TOnigiri ・・・ テンプレートクラス。内部の型を設定して使う。 BOnigiri ・・・ 継承して使う用(Base)。ウインドウ(コールバック部分)やスレッドクラスみたいなやつ みたいな感じで 勝手にやっていいのでしょうか? もし、開発チーム内でこんなことされたら勘弁と思う人とか居ます? あと、 構造体名の場合は、SOnigiriでいいのでしょうか? 何かプリフィックすあったら教えてください。
I くらいは許すがあとは全部却下。
>あとC++キャストの載ってるいい本を教えてください Effective C++ or More effective C++ or its both!
エピさんとこに載ってるよ < C++スタイルキャスト
>>900 テンプレートかつインターフェイスだった場合にはどうするね?
TIXxx や ITXxx という手もあるが
旅行者を表すインターフェイス
ITraveler とかがあったり
Java Virtual Machine を表すクラス
CJVM とかがあったら大混乱だよね?
ってわけで俺はテンプレートはサフィックスにしてる(CXxxxTemplateとか)
あと、チーム内なら勝手にやるのはご法度だろ。
周りの了解を得てからだな。
俺的には C と I 以外は却下だけど。
ヤヴァすぎ
>>900 TはなんかVCLっぽいしBはなんかBeOSのAPIっぽいので却下。
…というのは半分冗談にしても、
テンプレートは最初から template やら <> がくっついてるので
名前で区別する必要は無い気がする。継承の方は、
Ixxx にするとか AbstraceXxxx にするとか。
×Abstrace ○Abstract
911 :
デフォルトの名無しさん :02/11/22 12:58
☆ チン ハラヘッタ〜 ハラヘッタ〜 ☆ チン 〃 Λ_Λ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ヽ ___\(\・∀・)< concrete keywordまだー?? \_/⊂ ⊂_)_ \____________ / ̄ ̄ ̄ ̄ ̄ ̄ ̄/| |  ̄  ̄ ̄ ̄  ̄ ̄:| :| | |
912 :
デフォルトの名無しさん :02/11/22 13:05
そういうのを 「西部労働レストラン」 っていうんです!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
>>910 あんた 「すれ立てるまでもない」 スレにも居なかったか?
ああ、いかにも俺はその805だが…(*ノノ)
915 :
デフォルトの名無しさん :02/11/22 19:10
始めまして。質問です。 X *a;などと宣言したあと、(Xはクラス) aの配列のメモリを一つずつ確保するにはどうしたら良いでしょうか? 本来、a = new X[個数];と宣言すれば済むのですが、 aの個数がファイルを読み終わるまでわからないため、 forのループ内で一つ一つ確保したいのです。 a[i] = new ???;みたいな感じで。 ご教授宜しくお願いします。
new(ptr) X
918 :
デフォルトの名無しさん :02/11/22 19:37
嘘吐きsage
920 :
デフォルトの名無しさん :02/11/22 19:48
921 :
デフォルトの名無しさん :02/11/22 19:49
vector<X>ね
X *a; new(a)X; //replacement構文キタ?
>>923 だから、その a がいくつ必要かわからないって話だろ。
vector でいいじゃん。
これってSTL使わないと出来ないようなことなんですか?
>aの個数がファイルを読み終わるまでわからないため、 ファイルを読んで個数を得てからX *a = new X[n];ではだめなのかね?
単純に遅いだろ
928 :
デフォルトの名無しさん :02/11/22 20:25
vectorとか言うc++では初めて聞くものをやろうとしてみてるんですが
何かコンパイルが遅くなるのが気になります。。。大丈夫なのでしょうか?
>>926 一応可能ですが、
個数得るだけじゃなく、そのファイルの途中で配列に(ファイルの)内容を代入させるため
ファイルを2度読むはめになっちゃうのです(TT)
それしかないですかね?
>928 > vectorとか言うc++では初めて聞くものをやろうとしてみてるんですが コードを書き始める前に、プログラミング言語 C++ ぐらいは読んどけ。
930 :
デフォルトの名無しさん :02/11/22 20:32
基礎本には STL が載っていない事が多いと思う。
>>928 ヘッダー覗いてみればわかるけど、膨大な template を処理してる。
多少はガマンすること。
C++のコンパイルは遅い。これ常識。
g++なんかは特に遅い
遅いのが嫌ならC++なんか使うな。
実際そのほうがいいのかもしれない。
>>933 「STL(標準テンプレートライブラリ)に関する情報を新たに加筆。」 とか書いてあるな。
STL が嫌なら手動でリストにでもすればいいのでは? 独自リスト → std::list となって結局最後に std::vector 使う事になるような気もするが。
いや、自分で作るにしても、別にリストなんかにはしないけどなあ。 アクセスが不便じゃん。
ライブラリがインターフェースとしてstl使うのはどうかと思った。
942 :
デフォルトの名無しさん :02/11/23 14:04
誰が次スレ行きますよ?
943 :
デフォルトの名無しさん :02/11/23 14:05
どこに次スレが立つよ?
1000
_人人人人人人人人人人人人人人_ > な なんだってー!! <  ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄ _,,.-‐-..,,_ _,,..--v--..,_ / `''.v'ν Σ´ `、_,.-'""`´""ヽ i' / ̄""''--i 7 | ,.イi,i,i,、 、,、 Σ ヽ . !ヘ /‐- 、u. |' |ノ-、 ' ` `,_` | /i'i^iヘ、 ,、、 | |'' !゙ i.oニ'ー'〈ュニ! iiヽ~oj.`'<_o.7 !'.__ ' ' ``_,,....、 .| . ,`| u ..ゝ! ‖ .j (} 'o〉 `''o'ヽ |',`i _,,..-<:::::\ (二> / ! _`-っ / | 7  ̄ u |i'/ . |、 \:::::\ '' / \ '' /〃.ヽ `''⊃ , 'v>、 !、\ \. , ̄ γ/| ̄ 〃 \二-‐' //`
えへへ
< `ヽ , '´ ̄ > ,. ´ ̄ ` </ー- 、 //, ヽ\ ヽ '´ / .' / /, ゙\ヽ. ゙ ( !/ i/(( リ |l〈 | ヽヽ. |ヽ) ) i ヽY/!,ィ'il 'Tヽ, l i l く(ヽ ! / l lr1, ヒ1l | | ,.' )' ) ノ , ' /ヽ´ ー `" ,| l´ ( l ! i(( {. ` ーァ く,| |、 ヽト、 ヽ. ヽ. '77´/ l'´/,! l' ヽ ノ ) ゙/ ,'/ /.† ! ! リ ノ 〃ヽ ( (( 〈ヽ. i !/、/|_!.l'(. !i \ `ー-ヽ , / ヽ.∧ ヽ./ `,ー ' ヽ. ヽ /} lヽヽ._/ / ! /l_ ヽ. / .し '´ ヽ` ,. ' ,' ー- /≪フノ ヽ 二 ー-' / '´ \`く_,. へ ` ー 、 ヽ / \ ヽ  ̄ ヽ〉 / / i \ \ノリ_ノ /, ' l ` `ー- 1 , ' / / ! ヽ ノ く/ / l ヽ ,.'´
951 :
デフォルトの名無しさん :02/11/25 21:04
ageるよ〜
>952 >945
保守
埋め。
梅
埋め。
一日、一埋め。
強力
ume
松
丈
とく
ふね
今日もまた埋める。
あまぐり
むいて
| ___|_ | | _ー|ー-ー | _ ヽ \ | | __|_」  ̄~| ̄ / レ | / |ノ ^ヽ _.、| < ノ (_ノ| ノ ∠_ノ\ \ / . _」__  ̄── _| \ | ヽ / (ノ^|. | | | (_._」 レ / \ ● ヽ(;´Д`)ノ
| ___|_ | | _ー|ー-ー | _ ヽ \ | | __|_」  ̄~| ̄ / レ | / |ノ ^ヽ _.、| < ノ (_ノ| ノ ∠_ノ\ \ / . _」__  ̄── _| \ | ヽ / (ノ^|. | | | (_._」 レ / \ ● ヽ(´Д`;)ノ
ほい。 ○ ミ∴ ∴∴
ホントウニ ムカレテ シマッタ Σ(゚д゚lll)ガーン
これは、終わりそう
>>975 おいおい、俺はこのスレと同じ部分だけを抜粋したんだよ。
>>975 976 を含め忘れたくせに何を偉そうに。
すまん、宛先間違い。 976 宛て。
やっぱり埋め。
>>979 ああ分かった。
俺=
>>972 =
>>974 なんで,
自分のレスを含めて「ワラタ」と言うと自作自演になってしまうので恥ずかしかったから省いたんです。
許してちょ。
あと少し。 埋め。
俺も手伝うぜ。 一日人埋め
me too
memory too few
umeume
umauma
mamatonton
nullpo
mou = dame + po
993 :
デフォルトの名無しさん :02/12/10 01:30
eclipse-CDTのわかりやすい使い方のホームページ 誰か作って
onogiri washowy
今日で最後かな。 埋め。
うめ
ちんぴょろすぽーん
チンポコビンビン
まんこくさい
1000 :
デフォルトの名無しさん :02/12/10 13:26
ageて終わり
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。