【初心者歓迎】C/C++室 Ver.61【環境依存OK】
1 :
猫でもわかる :
2008/11/11(火) 05:02:51
2 :
猫でもわかる :2008/11/11(火) 05:04:58
. / ヘ ! ヽ, ヽ . ,′ .: } .: :}:.. i . ' ′ .:; ,;: j .:} .:}.:;ハ::. ! ', ', . , ,′ .; 〃 .::. ′ .::ハ .:j厶 L:.__ 八| '. :. ′ .: i . i .:ii.:..:{:..,′ .:::/ }「/ jノ_|:.:. / │ . : ! | i ' .: .:: i : i .::jム从:゙ ..:j/ l/ . r=≠ミ 、| .: .: ! | i i.:/ .:. ! .: |/ |」.ニ { ..:八 丿 〈/i:::j/:ハヾV .:: .:.:リ: l i i:ハ .:..:{:..', ::.:.. {/|ハルf'i⌒ト、从 ヽ ' {::.:゚。:.:::} l/ .:: .::/:.:. ! ii , ..::l.:. '. ::..:.. ', 〃{し'。(_V{ ヾ::::::::リ/ / .::八.:..:. ', | お会いできて嬉しいね ii. '. .::l::{::. 、::.:.. '.:{{ V:::゚:.:::} ¨´/, イ .::イ.:i:.:.:..:.. '.| . i! :、:l八::...\:. ヾ` ヾ::::::ノ ///´ j/..:l:.:i::.:..:.. :、 ヽ、 \. \::...` ー-- ¨´// ′ j .::ii:.:.:.:..:..ヽ ` .._ i ヽ∧ :i'. -‐..'′ イ .:ii:.:.:..:.. :.. :、 `丶、 i .:,' ..:. ,ハ、 / .| ..::i:!:.:.:.:..:.. :.. :、:.. . \ j.:/ .::} '.::i:::> ..,_ . '゙ | .:.:,'!:.:.:.:.:..:..:.. ', :.:..:..、 ヽ / .::丿.:.:j/ `7ァ' __,ノ| :,:' .::ト . :.:.:..:..:..:..' :.:.:.. \:.. } . / ..::/ .:.:/! __\》 _ノ / . ゙ ..::} ` ー- ,」_:..:..:..:.. ヽ ,′ . 〃 .: .:/ ..:.:/ ii ト--=ミr(_ -‐/ ,.:゙ ..:.:,′ 〃 `丶、:.: }:./ . {{ .::≠/ ..:.:/ !! {__彡イ」 ̄¨¨/ / ..::// /,′ ヽ:.:(
3 :
猫でもわかる :2008/11/11(火) 05:07:03
_人人人人人人人人人人人人人人人_ > ゆっくりしていってね!!! <  ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄ /~', /~', / '"゛' ;, ミ ´ ∀ ` ';. ミ, ,; ミ ,,.,) (,,., ;,ハ,_,ハ. 'ミ ;,´∀` ':, ツ ,;', u u ,: "'U'""゛'U' ' 、,_,,_,., '
前スレ1000って誰?
5 :
デフォルトの名無しさん :2008/11/11(火) 06:59:28
ザンギエフ
なぜ乃木坂春香
ドジっ娘アキちゃん
>全角空白か に置換 半角スペースじゃ複数入れても1つ分になるから、 のことかと思ったが ソース見ても半角スペースのままだな。
exitとかabortだと終了コードしか情報が無くて、 その場その場にエラーメッセージ出力コードを書かないと駄目で エラー処理コードで本筋がgdgdになっちゃう、しかし 例外ならとりあえずその場では投げるだけで済むために出力コードをまとめられる といった理由で、エラーで落ちるようなところではけっこう気前良く例外を使っちゃってるけど そういう理由でも濫用になるんでしょうか? 一応、エラーといっても初期化の失敗とか結構fatalなエラーに対して使ってるんだけど、 こういうのでも戻り値とかでなんとかするべき?
とても普通の使い方にしか思えないぞ。
11 :
9 :2008/11/11(火) 18:50:09
普通っすか なら安心しますた
すまぽ
int wPara[1] = {1}; NMHDR lParam; lParam.code = 4; lParam.hwndFrom = (HWND)GetAncestor(GA_PARENT); lParam.idFrom = 1; NMHDR* lPara = &lParam; GetAncestor(GA_PARENT)->SendMessage(WM_NOTIFY, (WPARAM)wPara, (LPARAM)lPara); これの使い方はどこかおかしいですか?
言い忘れましたが、聞きたいのはポインタの使い方です。なんか無駄があるようなきがして
最後の行でエラーがでます。どう書けばいいんでしょうか? CString* buf; CString a; buf = &a; CString str = str + *buf;
それstrがまだ宣言されてないのに使おうとしてるだけ CString str; str = str + *buf; なら通るかと
そうか、まだこの行だとstrつかえないのか ありがとう
>>15 一旦中間変数 lPara に置く意味がないなら、第3引数は (LPARAM)&lParam でいーんじゃね?
くらいかな。
むしろ NMHDR nmhdr;にして (LPARAM)&nmhdrとか
HeapAllocとmemcpyはメモリの解放は必要なんですか?freeでエラーがでるんです
そこでmemcpyが出てくるのがわからんが、、、HeapFree じゃないのか
class Hoge{ protected: Hoge(int); public: Hoge(const Hoge& hoge); Hoge& operator =(const Hoge& hoge); }; こういうコピーはできるけど、普通に作ろうとすると派生クラスしかできないクラスがあるとき Hoge Moja::get(){ struct Piyo:public Hoge{ Piyo( int i ) : Hoge(i){} } piyo( this->id ); return Hoge(piyo); } というふうにして、コンストラクタしかない派生クラスの参照を、既定クラスのコピーコンストラクタに 渡して実体を返す関数を使ってるんだが、こういうのってあり?
スマポ ×派生クラスしかできない ○派生クラスからしか作れない
>>24 スライシングと言って、Moja::getが返すのはPiyoではなくHogeになるが、
どうしてもそれが適切だというのなら。
ステレオファイルをモノラルにするプログラムを作っています。 Waveという構造体があります。(チャンネル数、サンプリングレート、波形データなどを格納) Free_wave()で領域開放できます。 void func(Wave *wavep){ Wave *wavepbuff //モノラルにしたファイルを置く領域へのポインタ 作った領域にモノラル化したデータを入れる *wavep = *wavepbuff } int main(){ Wave *wavep ステレオファイルをwavepの指す領域に格納 func(wavep); //wavepが指す場所にモノラルファイルを入れてくる } こんな感じで書いたんですが、 funcのwavepbuffで作った領域は開放したらだめですよね?元のステレオファイルを格納していた 場所は開放していいんでしょうか?
void func(Wave *wavep){ Wave *wavepbuff //モノラルにしたファイルを置く領域へのポインタ 領域を作り、wavepbuffに指させる。wavepbuffが指す領域にモノラル化したデータを入れる という処理をする //wavepにwavebuffを代入 *wavep = *wavepbuff } ここわかりにくいので書き加えました。
つまりやりたい事は、wavepが指していた領域にあるステレオファイルを、 モノラル化し一時的に、wavepbuffが指す場所に置く。 その場所を指すようにポインタ(wavep)を指しなおす。 それまでwavepが指していた領域(ステレオファイルがあった)を解放する。 という作業です
やめた方がいい設計だと思うが、やるとしたらこんな感じだろうか・・・ void Swap_wave(Wave *a, Wave *b) { Wave tmp = *a; *a = *b; *b = tmp; } void func(Wave *wavep){ Wave *wavepbuff = Alloc_wave(); 〜〜 Swap_wave(wavepbuff, wavep); Free_wave(wavepbuff); } int main() { Wave *wavep = Alloc_wave(); 〜〜 func(wavep); 〜〜 Free_wave(wavep); }
Wave構造体の中身が完全に判ってない限り、Swap_waveの実装に危険の香りがする
一応動作しました。 Swap_waveはポインタを差し替えてるだけですよね? だったらwaveの構造体自体は書き換えずに、freeでステレオファイルの領域だけ消せばOKかな?と考えました。 甘いですかね?・・・・
ポインタは値渡しされてるから指し変えられない ポインタだけ指し替えたいなら void func(Wave **wavep){ 〜 } int main() { Wave *wavep; 〜 func(&wavep); 〜 } こうしなきゃ
>>26 ありがとうございます。スライシングですか。返り値がHogeなのは正解なんですが、
このPiyoクラスはスライシングが起きてもC++の規約上何の問題も無いでしょうか?
デストラクタもメンバ変数もないし、virtualな関数もオーバーライドしてないんですが
30の場合は tmpにwavepbuffの実体をコピー。 *a = *b; wavepbuffを元のwavepを指すようにして *b = tmp; wavepが指す領域に実体をコピー ってやってるんですか?
VC++でExcelのファイル(.xls)を扱いたいんだが、バイナリを読むしか方法がないのか?
COMれ
>>34 関数の引数はWave *wavepのままに
ポインタだけ指し替えることはできますか?
40 :
39 :2008/11/12(水) 22:28:03
ちなみにC++です
>>34 じゃないが、
Wave *wavepは構造体のアドレスを指す”変数”だ。
その変数をコピーして呼ばれてるのに
呼び出し元の変数に入ってるアドレス値を変えることは出来ないよ
void func(Wave *wavep){ Wave *pp //wave構造体へのポインタが入ってる変数へのポインタ pp = wavep; } こうですか?
>>36 違う
Wave tmp = *a; ... tmpにwavepbuffの実体をコピー
*a = *b; ... wavepbuffが指す領域にwavepの実体をコピー
*b = tmp; ... wavepが指す領域にtmpの実体をコピー
常に実体 (Wave構造体の中身) をコピーしている
ポインタだけを交換することはできない状況だから、中身を交換するしかない
>>39 できない
>>43 なるほど。
ポインタへのポインタをしたい場合は、void func(Wave **wavep)とやるしかないんですね・・・
引数そのままで、関数内でWave **p =&wavepとしたら、pには何がはいるんですか?
>>44 func の wavep を指すポインタが入る
main の wavep を指すポインタではない
func の wavep と main の wavep は (たまたま名前が同じだけの) 異なる変数で、
アドレスも当然異なるから、func の wavep をどういじっても main の wavep には影響しない
わかりました。引数として**pをもってこないとmain側には影響させられないということですね
void func(Wave **wavep){ Wave *tmp; //構造体へのポインタ変数 アドレスが入る tmp=あろけーしょん *wavep = tmp; アドレスの実体をコピー } main(){ Wave *p; func(&p); } こうですか?
Wave *&でもいい。
スライシングがいくら起きてもそれ自体は言語的には何の問題もない デストラクタがあってもメンバ変数があってもvirtual関数があっても構いはしない 問題はその動作が自分の意図と一致しているかどうかだ
>>51 わかりました。ポインタが全然わかってないので、勉強しないと・・・
func内で
Wave **p;
p =wavep;
としたらどういう事してますか?
わかったかもしれません Wave *tmp; //構造体へのポインタ変数 アドレスが入る tmp = あろけーしょん //モノラルファイル作る Wave *tmp_p; tmp_p = *wavep; //ポインタのポインタの実体すなわち main関数で宣言したWaveへのアドレスを代入 (最初あったファイルの領域) *wavep = tmp; //mainで宣言したWaveへのアドレス を モノラルファイルのwaveへのアドレスに書き換え Free_Sound(tmp_p); //一番最初にあった領域を解放 どこか間違ってますかね?
:=ってなんですか?演算子で調べられません
Cじゃねぇ。
>>23 memcpyは解放しなくていいんですか?
そもそも変数を作ればメモリ容量があればメモリに格納されますよね?
なんでHeapAllocとかが存在するんですか?普通に配列変数を確保すればFreeもスコープはずれを活用すれば必要ないですよね?
スコープを超えてデータを保持したい場合に困るじゃん
>>57 何を勘違いしているのか知らんが、memcpy()はコピーだからメモリアロケートするわけじゃないぞ。
メモリ確保周りの再履修をお勧めする。
気になってねれないので54にどなたか答えていただけませんか? 本当に勝手ですいませんが
>>60 寝ろ。
分かるまでだと今日明日くらいは徹夜になるぞwww
>>62 そんなに間違ってますか?
ますます練れません・・・
メモリリークの対応面白いですね。やっとこの壁までこれた感じですが、これだけ教えてください。 解放しないで再度HeapAllocした場合なぜポインタとハンドル名が同じなのにメモリリークしていくんですか? もしかして、変数もスコープはずれてないと、確保した変数が番地行方不明なだけで再利用不可能ゴミ領域として残って あ!それがnewしたらdeleteなのかわかっちゃったthx
( ゚д゚ ) _(__つ/ ̄ ̄ ̄/_ \/ /
面白いと言ってるうちは幸せだ そのうち辛く苦しいものになることうけあい
>>64 借りた1万円なくして返さないまま追加で借りた1万円を同じ財布に入れたのに
なんで借金が増えてるんですか?みたいだなあ。
>ポインタとハンドル名が同じなのに
ポインタは別のものが与えられる。ハンドル名に至っては意味不明。
もうデフォですまぽ使っちゃうぐらいにしchinaよ
C勉強中の初心者ですがVS2005以降プロジェクトのプロパティで 「SSE/SSE2最適化」オプションが付いたとのことで、早速オンにして コンパイルしましたが、さっぱり早くなりません。 printf ("%d回LOOP実行中\n",loop); for (int i = 0; i < loop; i++){ for (int j=0; j<4; j++){ s1[j] = double(rand()) / 32767; /* 0〜1までの乱数*/ s2[j] = double(rand()) / 32767; } for (int k=0; k<4; k++){ result[k] = s1[k] * s2[k]; } } 上のように、変数LOOPを1億として4個の配列に浮動小数点乗算を格納する処理を 行いましたが、SSE有り無しにかかわらず36秒かかりました。 SSEの効果が実感できるようなコードはどう書けばいいんでしょうか?
>>69 rand呼んでる時点でSIMD化できないよ。
インテルにCPUの命令が載ったリファレンスあるからそれで仕様確認して素直に書けばSIMD化してくれる。
IA32最適化リファレンスちらっと読みましたが インラインアセンブリとかによるSSE活用ですね。 for (int k=0; k<4; k++){ result[k] = s1[k] * s2[k]; } この箇所はSIMDの得意分野のような気がするのですが、 なんでダメなんでしょう。doubleをfloatに変えてもみましたが同じでした
SSE最適化のオプションってベクタ演算は使ってくれないよ。
http://msdn.microsoft.com/ja-jp/library/7t5yh4fd (VS.80).aspx
> SSE と SSE2 は、SSE/SSE2 命令およびレジスタを使用する方が
> x87 浮動小数点レジスタ スタックを使用するよりも高速であると判断された場合に、
> 一部のスカラ浮動小数点演算に使用されます。
128ビットフルに使いたければ、自分で組み込み関数を呼ぶかインラインアセンブラ。
そうでしたか〜。残念。 浮動小数点演算をFPUからSSEに切り替えるだけみたいですね。 インラインアセンブラ調べてきます・・
iccなら、黙っててもベクタ化してくれるよ。
他のクラスの関数を操作する方法がわからなくて、メッセージ処理でやってたら数が半端ないことになってきた メッセージ処理を多様するのはやばい?なにか問題が出て来りする?
iccコンパイラって8万もするんだね。買ってる人はマルチコア最適化のためだけに 8万も払うのかな
世の中にはRunAsDateというものがあってだな
8万で窓版買うより8万出して新しいPC買って それにlinuxとlinux版icc入れた方がよさそうだなw
>>76 8万もするのにVSに寄生しなければいけないって信じられないよな。
VC++コンパイラの最適化でもICCに遜色ないと思うけどなぁ どんなコード書けば差が出るの?
iccなら、SSSEにもSSE4にも対応しています。 オブジェクト間最適化も負けていません。
85 :
デフォルトの名無しさん :2008/11/15(土) 14:10:28
本を読んでると出てきたのですが struct A { int x; A() { x = 0; } }; struct B : public A { int y; }; こんな感じのコードが出てきて、実際サンプルコードのコンパイルも通ったのですが ・構造体にコンストラクタを入れる ・構造体を継承した構造体を作る こんなんアリでしたっけ? それと、classにするのに比べてどんなメリットがあるんでしょうか
icc11は対応しているって御大が言っていた。どこまで積極的に使うかは知らんけど。
>>85 classとsutructの違いは、ディフォルトがpublicかprivateかだけ。
でも、そういう使い方をするならclassにして欲しいと思うけどね。
個人的なclassとstructの使い分け。
・データメンバを公開するならstruct
・只のアクセッサやコンストラクタではない能動的なメンバ関数を持つならclass
・継承されるならclass
ついでに言えば、コンストラクタで代入するならくらいなら初期化リストでやれよと思う。
C#だと値型と参照型っていう違いがあるのにC++はそれだけの違いなんだね
90 :
デフォルトの名無しさん :2008/11/15(土) 17:03:04
void MsgBox( int a ) { char s[256]; sprintf( s ,"%d" , a); MessageBoxA( NULL, s,NULL,NULL); } void MsgBox( float a ) { char s[256]; sprintf( s ,"%f" , a); MessageBoxA( NULL, s, NULL,NULL); } void MsgBox( double a ) { char s[256]; sprintf( s ,"%f" , a); MessageBoxA( NULL, s, NULL,NULL); } void MsgBox( char *s ) { MessageBoxA( NULL, s, NULL,NULL); } void MsgBox( wchar_t *s ) { MessageBoxW( NULL, s, NULL,NULL); } まとめる方法を求む
void MsgBox( tchar *s ) { MessageBox( NULL, s,NULL,NULL); } int a; tchar s[256]; stprintf( s ,_T("%d") , a); MsgBox(s);
>>91 その動作ならわざわざ作らないよ
数値を受け取れるようにね
template <typname T> void MsgBox( T s ) { std::ostringstream os; os << s; MessageBoxW( NULL, os.str().c_str(), NULL,NULL); }
>>92 わざわざ作ってるのが間抜けだって思われたんじゃないかな
>>94 俺もそう思った
何でこんなの作るんだと思た
デバッグ用? てなことないよな
何に使うのか知いな
>>95
>90 void MsgPrintf(char *format, ...) { va_list ap; char buf[1024]; va_start(ap, format); wvsprintf(buf, format, ap); MessageBox(NULL, buf, NULL, MB_OK); va_end(ap); } MsgPrintf("%d %f", 1, 1.5); デバッグ用に OutputDebugString に渡すやつなら使ってるが。
ごめん。wvsprintf は %f に対応してなかったわ。
100個のデータ配列を最初から1データ抜いて、最後に1データ入れてを繰り返して いつデータ配列を参照しても最初のデータが配列番号0から始まる仕組みはSTLにありますか?どれを使えばいいんですか?
thx!!
VisualStudio2005pro使ってます。 バイナリをリソースに追加したいんですが、どうやってやりますか? リソースビュー開いて 追加→リソース→ウィンドウが開く(リソースの追加)。 項目がAccelerator、Bitmap、Cursor、Dialog、HTML、Menu、StringTable、Toolbar、Version しかないんですが、どうすればいいでしょうか?
104 :
デフォルトの名無しさん :2008/11/16(日) 19:09:17
C++のライブラリとかで、年月を扱ってくれるのってないですか? 日のインスタンスを++したら翌日になったり、国名を与えれば、与えられた日が休日かどうかを 簡単に判定できたり。
boost::date_time
インクリデクリはともかく祝祭日は無理だろ
107 :
デフォルトの名無しさん :2008/11/16(日) 20:42:47
>>103 C/C++でそれをやるんですよね。
VSの操作をC/C++で書いたソフトでやりたいんですね。
108 :
デフォルトの名無しさん :2008/11/16(日) 23:02:46
先行宣言で、 class X; typedef boost::shared_ptr<X> X::HandleType; ってのが通るかどうかはやっぱ環境依存? DS用のCodeWarriorは通してくれるんだけどVC++2008Expressだと error C2027: 認識できない型 'X' が使われています。 って言われるんだよ。
すまん、あげてしまった。
class Xのポインタしか使わないならコンパイル通るんじゃね? Xの具体的な情報が必要ならムリ
112 :
108 :2008/11/17(月) 00:11:49
>>110-111 レスありがとう。
typedef typename boost::shared_ptr<X> X::HandleType;
にしてみたら、
error C2899: 型名はテンプレート宣言の外側で使用できません。
が増えた。
X::HandleType を X_HandleType とかにすりゃあ行けるんだがなあ。
やはり、クラス内typedefを先行宣言できるCodeWarriorが変態的なだけなんだろうか…。
113 :
デフォルトの名無しさん :2008/11/17(月) 00:12:13
char str[][5]={"OUT","CD","RING"}; この配列を関数の実引数として使うにはどのような形にすればよいでしょうか?
void nanika(char (*x)[5])
>>113 実引数?
hoge(str);
でいいんじゃ。
>>113 つ
f( {"OUT","CD","RING"} );
>>114 char (*x)[5] って仮引数じゃね
私は
>>113 ではありません。でも、Qがあります。
char str[][5]={"OUT","CD","RING"}; を
参照渡しで、関数に渡す場合の
仮引数と実引数てどう書くんですか?
>>116 じゃ
f( char str[][5]={"OUT","CD","RING"} );
hoge(char str[][5]) { } hoge(str);
参照渡しだからC++の話だと思うよ
124 :
103 :2008/11/17(月) 06:05:54
>>103 です。
すみませんできました。
良く調べないでカキコミしてすみません。
○○.rcファイルを右クリック→コードの表示
以下を○○.rc以下を最後に記述。
DATANAME DATATYPE DISCARDABLE "DATA_Path"
○○.cppで
HGLOBAL hResource = LoadResource( NULL, FindResource( NULL, TEXT("DATANAME"), TEXT("DATATYPE") ) );
LPBYTE lpResrouce = (LPBYTE)LockResource(hResource);
チラ裏&スレ汚しスマソ。
スレッドを生成して、メイン、サブ各々のスレッドでメモリをマッピングする。 その共有メモリで各スレッド間のデータがやり取りされているのを 確認したんだけど教授が言うには共有メモリの確認にはならん!だそうです。 共有メモリを用いてのプロセス間通信の確認…どのようにすればいいですか? なぜスレッドだと共有メモリの確認にならないかも良くわかってない状態ですが…
プロセス間共有メモリ≠スレッド間共有メモリ ってことを言いたいんじゃないの? スレッド間共有できたからといって、プロセス間共有できてないかもしんない手法使ってないか?という危惧やな
>>125 プロセス間通信(Inter Process Communication)のための共有メモリを
同一のプロセス内で確認してどうするwww
山田家と佐藤家とのネット間通信(Inter Net Communication)が通じるかを
確認するのに、山田兄弟が家庭内LANだけで確認するようなものだぞ。
129 :
デフォルトの名無しさん :2008/11/17(月) 13:43:34
C++でchar*の文字列をstringに変換するときはどうすればよいですか? 単純に代入すると、deprecatedという警告がでます。
131 :
デフォルトの名無しさん :2008/11/17(月) 13:50:09
// test.cpp 1: #include <iostream> 2: int main() { 3: char *a = "aaggff"; 4: std::string s = a; 5: return 0; 6: } $ g++ test.cpp test.cpp: In function ‘int main()’: test.cpp:3: warning: deprecated conversion from string constant to ‘char*’
const char * a = "aaggff";
つまり、>129は頓珍漢なところで悩んでいたのね。
>test.cpp:3: warning ↑ 3行目だっつってんだ。
>>131 文字列定数を 'char*' に変換するのは推奨されません
たとえ日本語でこの警告が出ても同じ質問したんじゃないかと思う
>>126-127 そゆことかー
どうもありがとう
じゃあ別プログラムをもう一本用意してやり取りが出来ているかを
確かめてみます。
c言語で√の計算させたいんですが <math.h>を利用 float a,b,c,A,B A=pow(b,2)ー4*a*c B=sqrt(A) これだとAの平方根を計算してくれないみたいなんですがなぜでしょう? 途中や色々省いていますがよろしくおねがいします
>>138 >138を見る限り、計算される筈だ。
自分の馬鹿さを棚に上げないで、ちゃんと省かずに貼れ。
ついでに言えば、二乗程度にpow()は使うな。
>>138 #include <math.h>
int main() {
float a,b,c,A,B;
a = 2; b = 6; c = 3;
A=pow(b,2)-4*a*c;
B=sqrt(A);
printf("%f\n", B);
}
実行結果
3.464102
問題なさそうに見えるが
もう一つ忘れていた。 必要がない限り、floatは使うな。doubleを使え。
142 :
デフォルトの名無しさん :2008/11/17(月) 15:07:07
速度向上と省メモリにはなる。float しかし、計算が誤差などにより間違った結果が出やすい 慎重に使うべきだな float
全部見ないとなにがおかしいのかわからないな
float で演算速度が速くなるかどうかは環境依存じゃね?
わざわざ問題なさそうな部分を選んでるからな、しかも手打ち
146 :
デフォルトの名無しさん :2008/11/17(月) 15:15:41
うちの環境ではfloatが速い あとこの人も。
intelコンパイラの場合
long double > double > float と計算時間が短くなる.(おそらくメモリの消費量が減るため)
80bit > 64bit > 32bit と計算時間が短くなる.(おそらくCPUの計算量が減るため)
という傾向が観測できた.
gcc の場合上記と同様の実験を gcc-4.1.1 (20060619) でも行った.
いずれにせよ,iccと同じようにgccでも,
精度を落とすと処理速度が向上する
型を落とすと処理速度が向上する ことはたしかな様だ.
http://d.hatena.ne.jp/pyopyopyo/20060918/p1
148 :
デフォルトの名無しさん :2008/11/17(月) 15:18:11
149 :
デフォルトの名無しさん :2008/11/17(月) 15:21:01
まあCPUの仕組みに依存するんだろうがな。
>>148 いくらなんでもPentiumProとかJDK1.1.4は古すぎる
>>146 まぁ、ソースも提示しないんだったら何とでも結果を誘導できるからね。
仮に、c99でもC++でもない只のCで超越関数を使う場合、
double版の超越関数が用意されていないからdoubleの方が確実に速くなる。
また、floatだけで計算させるように(doubleへの暗黙の変換が起きないように)
コーディングするのはコツがいるからその点でも、一般向きじゃない。
>>138 です。レスありがとうございます。
今は携帯から書き込んだので後でPCから全部書いてみます。
>146のこの辺もなんだかなぁ。 >long double > double > float と型を切り替えると,速度は1割程度づつ向上し, 2.232(double)が2.188(float)になるのは高々2%の短縮でしかないと思うのだけど。 それに、iccでベクタ化するような処理が対象だというところにも注意。 つまり、連続的に配列要素を演算するような処理だということなのだろう。 このような、頻繁にメモリをアクセスするような応用では確かにfloatは有利だろう。 しかし、そうでない応用ならdoubleとの差はますます縮むことになりそうだ。
154 :
デフォルトの名無しさん :2008/11/17(月) 15:35:57
floatとdoubleの比較といったら、標準関数の速度は考えないもんだ。 速度は、キャスト <<< 標準関数の呼び出しと実行だ。 関数に費やされる時間がほとんど。 キャストが加わる分だけ少しだけ遅くなる。 実行せずに分かる
fpuで演算できる超越関数については、キャストの方が時間が掛かる。 実行せずに判る。
156 :
デフォルトの名無しさん :2008/11/17(月) 15:52:52
計算速度を知りたいのに、関数実行やキャストの時間は関係が無い。
>>156 注意深くfloat同士の演算のみを行い、標準関数も使わずにメモリアクセスもしないという条件でよろし?
158 :
デフォルトの名無しさん :2008/11/17(月) 15:59:15
そういうことだな
いろいろ前提条件を整理しないと無駄な議論になりそうな予感
161 :
デフォルトの名無しさん :2008/11/17(月) 16:07:28
大昔のCPUでは、double型の演算子しか入って無くて、間違いなくfloatの方が遅かった。 しかし現在は、32bitとそれ以上の小数点演算がハードウェアとして計算できるようになっている。 単純考えて1ビットを扱えより2ビットの方が難しく、同様に32bitよりかは64bitのほうが難しい。
>160の記事はアセンブリ出力にまで立ち入っているので判り易いね。 これでSSEにまで触れられていればほぼ完璧なのに。 まぁ、所要時間は大抵の応用では大差ないのだから、 わざわざ使い難いfloatを使うまでもないと思うのだけど。 # 実数リテラルを書くときに、一々1.0fなんて書きたい? 私は1.0で済ませたいね。
>>162 SSEでのdoubleとfloatの差ならインテルのリファレンスに載ってるぞ。
double除算がfloatの倍かかる以外は同じ。
お前ら、仕事つまらんからと会社でネットカフェ...するなよな。 今のx86系ならdoubleだろ、floatはCPUの演算部が貧弱だった時代に 小数点演算したかで作った型なんだろ
>>164 いやもう、時代に取り残されているから。
# いろんな意味で。
>>164 >>160 も見れないのか。そんな言い方ができるなら、見れなかったとしても
doubleがx86のFPUレジスタとは大きさが合わないのは知っているだろう。
実際にfloat使っている? おれ、全然使ってない、doubleだけだな。
169 :
デフォルトの名無しさん :2008/11/17(月) 22:46:03
誘導先から誘導されて着ました VC++6でwindows2000を使っています。 beep音を非同期で指定時間鳴らしたいです。 できれば、WAVじゃなくてマザーボードからなる様にしたくてスレッドは使わないで済ませたいです。 メインでbeepを開始してタイマー割り込みでbeepを指定時間後に止めるような仕組みがいいのですが・・・。 何か方法はありますでしょうか?
全く自分では考えてないのか?
171 :
169 :2008/11/17(月) 23:03:00
>>170 正直、自分では全く考えてないです。
スレッド使って別スレッドでbeep鳴らすくらいしか思いつきません。
WAVファイルなら非同期でできるけど、beep音は自分で作らないといけないし、
サウンドカード載ってないといけないし。
APIスレで聞いたら?
Beep ON / OFF というペアのAPIじゃないからな Beep 時間 というインターフェイスである以上 鳴っている間メッセージポンプしたけりゃスレッド起こす以外の方法は無いだろう ※ Beep ON / OFF というインターフェイスの API があれば別
174 :
169 :2008/11/17(月) 23:23:17
>>172 Win32APIスレから誘導されてきました。
>>173 まぁ〜、そうなりますよね。
そういうAPIがないか調べたかったわけです。
そして、ググっても見つからないので、多分ないんでしょうね・・・
>>174 Beep API場合鳴らす周波数、鳴らす時間幅しか設定できない。
自分でBeepOnでなりっぱなし、BeepOffしたければ、I/Oポートドライバを作成し
それ経由でbeepを制御
176 :
169 :2008/11/17(月) 23:54:08
>>175 I/Oポートドライバはさすがに・・・。
platformSDKとかなんとかが必要そうですし。
とりあえず、CreateProccessでbeepをするプログラムを叩くようにしてみます。
178 :
デフォルトの名無しさん :2008/11/18(火) 00:07:40
visual studio2008のコンパイル方法がどっかに載ってたと思うんですけど どこか分かる方教えて下さいませ。
>>178 visual studio2008のソースって流出してたっけ
180 :
169 :2008/11/18(火) 00:11:45
>>177 さすがにドライバを用意するまでしたい事でもないので、我慢します。
sprintf(buf, "%s", buf);のように領域が重なっていると誤作動するようですが、 char *test(char *buf){ static char tmp[100]; snprintf(tmp, 100, "%s", buf); return tmp; } という関数があったとき、main関数でbuf = test(buf);と記述すると、同様の問題は起こるのでしょうか?
>>181 main()のbufが配列でなければ大丈夫かもしれません。
少なくとも、引き数のbufが戻り値のbufに影響を及ぼすことはありません。
むしろ、mainでのbufはどこ行っちゃうんだ。
配列でなければ?
185 :
184 :2008/11/18(火) 00:39:40
ああ、配列だったら代入できないか。
>>183 仮にbufがmalloc()の戻り値を格納してたりした場合、test()呼び出しによって失われてしまうので解放できなくなりますね。
これだったら2行目は同様にまずいな。 buf = test("hoge"); buf = test(buf);
188 :
181 :2008/11/18(火) 01:00:05
double time; timeに秒数が入るらしいんですが、timeの中を見ると6.35235・・・・・e、みたいな数値になってるんですが、 これどうやって秒にするんですか?たぶん180秒ぐらいだと思うんですが、変換方法を教えてください。
static_cast<int>(time);
>>189 そんな変なこと教えた奴に聞け。標準にはそんなもの存在しない。
その6.3523みたいな数字が180秒なのか?w
>>190 いや、馬鹿を晒さなくてもいいから。
>>189 difftime()なら、戻り値がそのまま秒数だ。
何をどう使ってtimeに秒数を入れたつもりになっているんだ?
# インクルード忘れで型化けしたかな?
static_cast<int>(time * 0.03529083);
膨大な時間量で指数部に100とか200とかついてましたーだったらどうすんだ。
>>194 すごいできました。ありがとうです。
その0.35はいったいどこから出てくるんですか?
>>196 所要時間に関わらず、常に一定の値がでないか?
>>198 なります。電卓で計算したらあってたので。intじゃなくてdoubleですね?
C言語の分かる小学生ですか?すごいですね。
やばいですtimeが175.785875って数字がでてきました これに0.03529083を掛けると全然違う秒数になってしまいます。 助けてください
分かったからtimeにはいる値が導出される過程を教えてくれ。
あ、これ秒数がもうすでに出てきました。 さっきはなんで6.35235・・・・・eが出てきたんだろう・・・ やばいです、なんかこれC関係ないような気がしてきました。電卓が桁溢れエラーのときどう表示するかの問題な気がしてきましたすいません
DirectShowのIMediaPosition::get_Durationの引数値です。
>>203 初期化されていない自動変数に何かを期待してはいけない
206 :
デフォルトの名無しさん :2008/11/18(火) 16:13:41
C++で参照の参照はゆるされないのですか? void hoge(vector<string> & arg) { boge(arg); } void boge(vector<string> & arg) { } int main() { vector<string> & list; hoge(list); } 参照の参照はだめだと先生がいうのですが、なんでだめなのかわからないです。
vector<string> & list←初期化されてない
名前空間で区切って変数をすべてグローバルにする規則はありですか?
>>208 無名ネームスペースのこと?とりあえずわかるように頼む。
いえ名前付きで、アクセスしやすいようにクラスの外に置いて統一したいということです
>>206 だめ
参照の参照問題でぐぐってみ
これが原因でSTLでエラーが出る事がよく起きたため
boost::bindが作られた
>>210 グローバルに置きたい変数を纏めたクラスを作るのが無難じゃね?
214 :
デフォルトの名無しさん :2008/11/18(火) 17:02:14
/////////////////funcAAA.h////////////////// #pragma once #include "funcBBB.h" class funcAAA; /////////////////funcBBB.h////////////////// #pragma once #include "funcAAA.h" class funcBBB : public funcAAA err:定義されていない基本クラスが宣言されています。; 無理ぽ?
>>208 だがしかし待って欲しい
もっと構造を考えれば色々なクラスに分配できるんじゃないだろうかと
>>214 Bが読み込まれたときにinclude A.hでinclude B.hされているので
class funcAAより先にclass funcBBB : public funcAAAがでてきてエラーになっている
個人的には何故A.hでBをincludeしているのかが理解しがたい
グローバルじゃなくてネームスペーススコープに移すとかなんじゃねーの? ヘッダに含めないんだったらグローバル(ファイル)スコープっていうのも十分ありだと思うけど
218 :
デフォルトの名無しさん :2008/11/18(火) 20:40:03
フレンドクラスについて教えてください。 2通り見かけるのですが、宣言の仕方は、下のどちらでもいいのでしょうか? friend class ClassA; friend ClassA; また、クラス内でfriend指定する場所ですが先頭に書くのが普通でしょうか? public節に置くのとprivate節に置くのでは違いがありますか? インデントせず書いてある例も見かけるのですが皆さんどうしておられますか?
>friend class ClassA; >friend ClassA; 外側がテンプレートなら上じゃなきゃダメ(下はClassAがクラス名かどうかわからない) そうでなけりゃ一緒 >また、クラス内でfriend指定する場所ですが先頭に書くのが普通でしょうか? どこに書いても意味は変わらん好きにしろ >public節に置くのとprivate節に置くのでは違いがありますか? 全くない >インデントせず書いてある例も見かけるのですが皆さんどうしておられますか? メンバじゃないから区別したいんだろうな 個人の好みだ 俺は嫌い
221 :
デフォルトの名無しさん :2008/11/18(火) 22:27:58
VC2008 Express Edition ver 9.0.30729.1 SP Windows Vista BusinessSP1 上記環境で、下記コードをデバッグモードで動かしています。 (コードは某書籍より、ちょっと加工) string filename = "c:\\test.txt"; const int N = 5; vector<int> v(N); fill(v.begin(), v.end(), 55); ofstream ofs(filename.c_str()); if (ofs) { copy(v.begin(), v.end(), ostream_iterator<int>(ofs)); ofs.close(); } else cout << "output file open error." << endl; 管理者に昇格のダイアログも何も出ずにエラーとなるのですが、 何か設定はないのでしょうか? もちろんEXEを管理者設定して動作させると大丈夫なのですが。 そもそも、VistaではCドライブ直下にファイルを作成しにいくこと自体が間違い?
>>221 某書籍の名前を言わないと、誰も教えてくれませんよ
知らないならレスしないで下さい。ウザイだけです。
224 :
デフォルトの名無しさん :2008/11/18(火) 22:41:40
>>222 ええ?それが重要なの?
「標準C++:STLの基礎知識」ですが、問題は
> string filename = "c:\\test.txt";
ここだと思うのですが
>>224 じゃ"A:\\test.txt" にしたら
227 :
デフォルトの名無しさん :2008/11/18(火) 22:52:07
WriteFile()での書き込み先にSOCKETを使うにはどーすればいいんでしょうか。 具体的にはTCP/IP接続のプリンタにジョブを投げたいんですが。
WinAPIスレで聞くといいと思います。
>>226 ユーザー権限で実行で書き込み権限ないところにカキコしようとしていると妄想
230 :
デフォルトの名無しさん :2008/11/18(火) 23:08:02
231 :
デフォルトの名無しさん :2008/11/18(火) 23:09:14
あ、すみません、言葉足らずで。 230の方法で、デバッグモードでも管理者に昇格ダイアログが出るようになりました。
>>227 ソケットをHANDLEにキャストして1番目の引数に渡す。
Class::Function(); を実行したら静的でなからだめだと言われたので、 static void Function(); と書き直したんですが、エラーが出ます。 これは他のクラスでインスタンスを既に作っている場合問題があるんでしょうか?
>>234 文章からは何を言ってるか推測できないから、もう少し前後のコードも書いてみて
class ClassA { ClassB m_classBincet; } class ClassB { public: static void FunctionB(); } include "ClassB.h" class ClassC { } ClassC::FunctionC() { ClassB::FunctionB(); //これがエラーになるんです。 }
未だによく理解できないんだよな、 なんでエラーメッセージの概念がまるっきり頭から飛んでる奴が多いのか。 この世の事象を「自分の願い」と「それ以外」より細かく分類する気がハナっから無いっつーか。
だからお前は人を使うのが下手糞なんだよ
あらやだ朝からチャカついてる子が来ちゃったわw
>>238 大丈夫だよ、こんなのが下に付くレベルの職場には居ないから。
てか、君が就ける職場のレベルと一緒にされても・・・(^_^;
つまり、自身が最底辺なんですね、判ります。
自宅警備員なんですね
ありがとうございます。 つまりこのコードの部分ではエラーがわからない(無い)ことがわかりました。 static文法がおかしいのかと思いました。どうもです
誰もそんなこと言ってない。
でもわかるんです。
class ClassB { public: static void FunctionB(){ } }; class ClassA { ClassB m_classBincet; }; class ClassC { void FunctionC(); }; void ClassC::FunctionC() { ClassB::FunctionB();//エラーになりませんよ? } int main() { }
なぜインデントしないでソース書き込む人が多いんだろう 全角空白に置換するのはそんなに面倒だろうか
初心者スレだから
JaneDoeStyleならCtrl + レス番でインデントされたものも見える。
navi2chだとスペースでも正確に表示される
datを直で端末に流し込むという方法もあるぞ
>>247 読むのは回答者なのに、なぜ質問者がそんな気を遣わなくてはいけないんですか?
質問はこの書き方でも成立するわけですから、いちいちインデントのことなんか考える理由が
質問者には一切ありません。
自分が楽をするために、他人が苦労して当然と思うのは人間のクズのすることだと思いますが?
> 自分が楽をするために、他人が苦労して当然と思うのは人間のクズのすることだと思いますが? 自分=質問者、他人=回答者?
>>252 同意
聞いてる側が楽しようとするとかアホかと
釣りだよね?これってでっかい釣り針だよね? 頼むから釣りだと言ってくれ・・・
逆にコピペでエディタに持ってきて検証するときに全角空白は邪魔 でもいいが、これはこれでポップアップ時に全部出ちゃって見づらい。 普通にTABか半角スペースのが再利用時に面倒がなくていい。
VC++に貼り付けてCtrl+AしてAlt+F8するので全角は邪魔
あと、回答者はスペルミスするなってか?wwww
質問者は低脳でプログラム作れないのが99.9999%だが、回答者はプログラム 作れるんだろ。なら、全角スペースをTABや半角複数スペースに変換、 逆にTAB、半角複数スペースを全角スペースに変換するプログラムぐらい1-2秒で出来るだろ。 グダグダ言っているなら、低脳質問者のために素敵な変換プログラムぐらい作ってやれよ
わざわざ作らんでもすでにあるテキストエディタの機能で変換すればいいじゃん
>>260 VSのえぢた、notepadにある?
で、そのテキストエディタてなによ?
初心者様がそんな物使えるわけがないじゃん あれだろイーマックスとかいう奴だろ 矢印キー使えないアホなエディタ
置き換えすればよし
gdgd文句言ってる奴らは質問に答えなければいいだけだろ
CTRL+H を押して、変換元の文字と変換後の文字を入力して、すべて置換ボタンを押せば十分だろ
俺は常連の質問者だけどメモリ解放されてなかろうがスペルミスがあろうが 気になんない。みなさんいつもありがとね。
emacsでも矢印キーぐらい使えますが
268 :
デフォルトの名無しさん :2008/11/19(水) 21:12:19
明らかに回答者でない人が釣り針垂らしてるよね
269 :
デフォルトの名無しさん :2008/11/19(水) 21:13:13
間違えた。質問者でない人が釣り針垂らしてるよねだ gdgd
これと
int func() {
printf("hello.\n");
}
これ
int func() {
printf("hello.\n");
}
初心者に優しいのは前者だよ。
>>270
そうですかwwwwwwwww
上はインデントを保ったままコピーできるが、 下はコピペ後、全角スペースを半角スペースに変換するという 超絶難解な作業が待っているからですよね、わかります。
見た目より実用性だよね。 ITドカタは実力ないから見た目で勝負で、実用性、なにそれ?だからね
荒れてるとこ質問。 1つだけnewしたものをdelete [] したら動作は未定義? それとも無事1つ解放してくれます?
>>275 では
int *i = new int[1];
delete [] i;
これは?だめっぽい雰囲気ですが
>>278 ありがとう
int *i = new int;
int *i = new int[1];
上2つはdeleteでの解放以外はまったく同じ扱いでいい?
>>279 同じようにも見えるし、違うかもしんない
※ 組み込み型だから結果的に同じの可能性は高いが
コンストラクタとデストラクタに printf 入れて
class を new [] 〜 delete と
new [] 〜 delete[] とを比較してみ。
delete[] では 暗に確保した要素数を知ってるから、
要素数を記憶する器のぶんの余計なヒ-プを確保している可能性は高い
後者はint * j = i + 1してもいいけれど、前者はダメ。
new int[1]の方がちょっとメモリ余分に取るかもしれない(配列の個数を保存するため) それくらいかな
>>280 なるほど
new intだとサイズ情報を確保しない→delete[]じゃまずい(サイズ情報を読み込むから)
new int[n]だとたとえn==1でもサイズ分を余分に確保→delete[]でも無問題
ということか(可能性が高い)
char *txt; int a = 1; txt = "printf("a=%d",a");" この状況で、txtの中身を命令として実行して a=1 と出力するにはどうすればいいかねぇ
>>284 何をしたいのか具体的に。
ソースコードをランタイムにコンパイルしたいと言うことなら、かなり無茶。
>>284 一度txt の中身をファイル出力して、
gccのプロセスを起こしてコンパイルさせて
出来上がった実行ファイルを起動させて
そのまま表示させるなりそのプロセスとプロセス間通信して受け取るなりする
どなたか教えてください。 int main(){ int** x; int row(0),col(0); func(x,row,col); //xを使った処理がいろいろ for(int i=0;i<row;i++) delete [] x[i]; delete [] x; return 0; } void func(int**& x, int& row, int& col){ //ここでrowとcolは適当に決まる x = new int* [row]; for(int i=0;i<row;i++) x[i] = new int [col]; //適当な処理 return; } 以上のようなコードを実行すると、main関数内の最初のdeleteで、 「Windows によって sample.exe でブレークポイントが発生しました。 ヒープが壊れていることが原因として考えられます。sample.exe または読み込まれた DLL にバグがあります。 あるいは、sample.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。 可能であれば、出力ウィンドウに詳細な診断情報が表示されます。 プログラム '[5532] sample.exe: ネイティブ' はコード 0 (0x0) で終了しました。」 というエラーが発生して終了してしまいます。 確保されていない領域をdeleteしたときに発生するエラーのようですが、main関数で xの中身を参照したときには値が入っていますし、確保されていない訳ではないと 思っているのでしょうが、何が原因として考えられますか?
>>287 x[0]はなにですか?
x[1]はなにですか?
もういいかげんに C++ の動的配列は new[] より先に std::vector を教えてあげて欲しい。
292 :
287 :2008/11/20(木) 00:50:56
>>288 すみません、おっしゃっていることの意味がよくわからないです。
x[0]やx[1]はint型の配列が割り当てられているのと思っていたのですが・・・
>>291 std::vectorを使いたいのは山々なのですが、vectorだとメモリ不足になったため
急遽new[]を使った形に書き直している最中です。
>>290 5.7 加減演算子 p4
> これらの演算子においては,配列でないオブジェクトへのポインタは,配列要素の型として
> そのオブジェクトの型をもつ長さ 1 の配列の先頭要素へのポインタと同じ振る舞いをする。
>>292 vector でメモリ不足になるんなら new[] 使っても解決しないでしょ。
そもそも何を見てメモリ不足になったと言ってるの?
もう、malloc & free でいいんじゃね?
297 :
287 :2008/11/20(木) 01:01:15
>>294 TSVファイルをint型の二次元配列に読み込もうとしているのですが、
vector<vector<int> >にvector<int>をpushしていったら、途中で
VC++のエラーが出てきて、メモリが足りないと怒られました。
ついでにリソースモニターを見ていたら、物理メモリを食いつぶされていました。
困って、ほかの部分を変えずにvectorで処理していた部分をnew[]に変えたら
メモリの方でエラーは吐かれなくなったけれど、今度は・・・という状態です。
これでいいじゃん。 void func(int**& x, int& row, int& col){ //ここでrowとcolは適当に決まる x = new int*[row]; int *buf = new int[row * col]; for(int i=0;i < row;i++) x[i] = &buf[i * row]; //適当な処理 return; } int main(){ int** x; int row(0),col(0); func(x,row,col); //xを使った処理がいろいろ delete x[0]; delete[] x; return 0; }
訂正 × for(int i=0;i < row;i++) x[i] = &buf[i * row]; ○ for(int i=0;i < row;i++) x[i] = &buf[i * col];
300 :
デフォルトの名無しさん :2008/11/20(木) 01:13:31
普通に以下のような処理をさしたけど問題なかったぞ #include <iostream> void func(int**& x, int& row, int& col); int main(){ int** x;int k,j;int row = 10,col = 10; func(x,row,col); for(int i = 0; i < row;i++){ for(j = 0,k=1; j< col; j++,k++){ std::cout << x[i][j] << ' '; if(!(k%10)) std::cout << '\n'; } } for(int i=0;i<row;i++) delete [] x[i]; delete [] x; return 0; } void func(int**& x, int& row, int& col){ int num = 1; x = new int* [row]; for(int i=0;i<row;i++) x[i] = new int [col]; for(int i = 0; i < row;i++){ for(int j = 0; j< col; j++){ x[i][j] = num++; } } return; }
>>285 バグがないかチェックするのに、いちいちfprint・・fprint・・と打っていくのは面倒くさかったから、処理を関数の中にcharで入れたら、自動でfprintf文を書いてくれるプログラムを作りたかった。
>>286 ありがとう。プロセス間通信調べてみた。
しかしLinux(c++)での共有メモリの作り方、使い方がいくらググっても出てこない。
サンプルどっかにあるかなぁ。
>>285 tcc あたりをリンクすればんなとか出来るかも。
っと思ったけど、
>>301 では「面倒くさい」という動機が語られているので、
どちらがより面倒かと考えると…
>>301 それなら普通に#define 等のプリプロセッサでいいんじゃね?
変数名の表示含めてできるよ
f(a); を fprinttf(stderr, "a = %d", a); にするみたいなのね
304 :
デフォルトの名無しさん :2008/11/20(木) 02:54:14
VC++でプログラム内にグラフを描画したいんですが、 おすすめのライブラリってありますか? gnuplotのように凡例やます目がついた二次元グラフが書けて、グラフの拡大縮小が簡単にできるものを探しています。 普段はパイプでgnuplotに描画しているんですが、 ウィンドウ内にグラフを埋め込む必要が出てきたので、それが可能なライブラリを探しています。
>>297 要素数はどれだけあるの? reserve() できないの?
enum TEST { A; }; // Visual C++ 2008の場合 TEST test = TEST::A // gccとかの場合 TEST = A これ、仕様では後者が正しいんだよね? VCがまた勝手なことしてるって認識でおk? まぁ個人的には列挙型もスコープ持ってほしいけど。
307 :
306 :2008/11/20(木) 03:01:39
↑なんか色々ミスってるけど、気にしないでくだちぃ。m(__)m
まあVC++で後者の書き方ができないなら大問題だが、 そうではないのだから大目に見てやれ。
VCスタイルでコード書いたら、他でコンパイルできない。私許さないよ!><
もう許してやれよ・・・・・・
>>306 VCも警告レベル上げれば
「非標準の機能使ってんじゃねぇよ」
ってコンパイラが教えてくれるぞ
なんで、こんな遅くまで起きてるの? ははー、自分と同じで低脳で宿題できてないから寝れないんでしょ 駄目ですよ、低脳は背伸びして大学に進学しちゃ
>>298 ついて
x = new int*[row];
int *buf = new int[row * col];
for(int i=0;i < row;i++) x[i] = &buf[i * row];
で2次元配列を作り
delete x[0];
delete[] x;
のデリートでbufのメモリ領域は開放されるんですか?
なんて言うか、凄い高等テク使ってる感じなんですけど
delete[] x[0]; だな、buf も配列だ。
x[i] = new int[col]; みたいに行ごとにメモリ確保せずに、 int *buf = new int[row * col]; で必要なだけメモリを一気に確保して、 行サイズ間隔のポインタを x[] に入れている。 結局 xと buf 用に 2回しか new していないから、delete も2回ですむ。 buf の先頭アドレスは、x[0] に入っているから、 delete[] x[0]; でいい。
>>314 別に高等でも何でもない
C言語でもmalloc()でよく多用されてるテクニック
>>302 ありがとう。tccを調べてみた。すごくおもしろいし使えそうだったんだけど、CPU:x86_64はサポートされていなかったようで、インストールしてもコンパイルがされない・・・残念。
>>303 配列の配列なども渡して自動的に表示形式まで計算してデバッグしたかったので、プリプロセッサだけではものたりないー
Cなら、x と buf をまとめて一回で確保できるな。C++でも出来るけど型制約が若干邪魔になる。 テンプレート引数をうまく使えば new 一回でいけるかな? template<int row, int col> class Matrix{ public: int data[row * col]; int *pdata[row]; Matrix(){ for(int i=0; i<row; i++) pdata[i] = &data[i * row]; } }; int main(){ int row = 10, col=5; Matrix<10, 5> *m = new Matrix<10, 5>(); int **x = m->pdata; // x使って 処理 delete m; return 0; } 場合によってコピーコンストラクタが必要になる。
う、俺も間違えた。 for(int i=0; i<row; i++) pdata[i] = &data[i * row]; じゃ、なくて for(int i=0; i<row; i++) pdata[i] = &data[i * col]; だ。 あと main の最初のrow, col 使ってないなので不要。 Matrix のメンバにrow, col 持たせたほうが扱いやすいだろうな。
>>318 んじゃテンプレートとも併用すればいいんじゃね?
>>309 gccスタイルでコード書いたら、他でコンパイルできない。俺は許すよ!><
独自拡張なんてそんなもんだ。
>>298 はnewしたのがintですが、たとえば、
newしたのがクラスのオブジェクトでそのオブジェクトが動的メモリを
持ってた場合でも、delete[] x[0];、delete[] x で各々の
オブジェクト、動的メモリは開放されるんですか?
324 :
319 :2008/11/20(木) 04:48:38
よく考えたら、これじゃ実行時に配列サイズ指定できないや。
>>323 オブジェクトであろうと無かろうと、 newした回数delete するだけのこと。
コンストラクタの引数にrowとcol指定すればいいじゃん
だいたいこんな感じ。もちろんコピーコンストラクタも代入演算子も 書かなくてはいけないが面倒なので省略。 class Matrix { public: int* data; int** pdata; Matrix(int row, int col) : data(new int[row * col]), pdata(new int*[row]) { for (int i = 0; i < row; i++) pdata[i] = &data[i * col]; } ~Matrix() { delete[] data; delete[] pdata; } }; int main() { int row = 10, col = 5, num = 0; Matrix* m = new Matrix(10, 5); int** x = m->pdata; for (int i = 0; i < row; i++) for (int j = 0; j < col; j++) x[i][j] = num++; for (int i = 0; i < row; i++) for (int j = 0, k = 1; j < col; j++, k++) { std::cout << x[i][j] << ' '; if (!(k % col)) std::cout << '\n'; } delete m; }
しっかしvectorの入れ子じゃいやなんだろうか質問者は
単に2Gほどメモリを食うプログラムを動かしてメモリオーバーフローが 起きたんじゃないだろうか?
バグってるのをvectorのせいにしてるだけじゃね
まあどうせそんな所だろ 自分のバグを棚に上げて「コンパイラのバグだ!」と言う奴は 腐るほどいる
333 :
323 :2008/11/20(木) 05:53:49
宿題より、こっちの方が気になってしょうがない,orz delete[] x[0];の場合のx[0]には x[0] = &buf[0]; が入っていて、配列全体を示すbufは入ってないと思うんですけど &buf[0] == 配列全体を示すbufになるんですか? 第一要素のアドレスコピーで配列全体の情報(要素数など)もコピーされているんですか?
実装依存だけど、通常はmalloc()やnewで得たアドレスの手前にサイズ情報が格納されている。 だからfree()やdeleteはポインタを与えるだけでメモリを開放することが出来るわけだ。
new だろうが new[] だろうが 戻りはポインタ new で確保したものは delete で開放 new[] で確保したものは delete[] で開放 という指針さえ守ってりゃ良いことになる ポインタの指し示している中に管理情報が埋まっていることが予測される(実装依存) new の場合には次の空きヒープへのリストか、確保した容量? new[] の場合には上記+型情報(どのデストラクタを駆動するか)+要素数 or 1要素あたりの実サイズ? ポインタ複写しだすと、 どっちで確保したものか一見で区別がつかない 複写元 及び 複写先 のそれぞれを開放操作しちゃった なんて話がでてくるからやっかいではある (スマートポインタ等の概念が欲しい)
名前空間は同じ名前ならブロックをいくつに分けても一つと同じですか?
上の方でenumのスコープの話題あったけど、 自分もgccでスコープ修飾子つけて列挙子アクセスしたくて、 こんな感じで書いたんだけど、スコープ付きenumと等価にはならなかった。 なんとかならんもんかな? struct HOGE { enum { A; B; }; }; void f(HOGE hoge) { ... } int main() { HOGE hoge = HOGE::A; // OK f(HOGE::A); // エラー! f(HOGE::A::<anonymous>)がない }
つnamespace
・・・ってgccってこたCだったか
namespaceでもどうにもならんだろ。 俺はあきらめて疑似Enumクラステンプレートみたいなの作って EnumとEndEnumをマクロで定義して Enum MyEnum { value1, value2, value3 }EndEnum; みたいにやってる。使い勝手はC#とかのenumと同じ
どういうマクロ定義だろう・・・?
346 :
344 :2008/11/20(木) 17:07:55
Enum( MyEnum )ってやらないとダメでした
実装はこんな感じ
#define Enum(T) \
struct T \
{ \
enum Enumeration; \
private: \
Enumeration value; \
public: \
T(){} \
T(const T& e){value=e.value;} \
const T &operator=(const T& e){value=e.value;return *this;} \
const bool operator==(const T &e) const{return value==e.value;} \
const bool operator!=(const T &e) const{return value!=e.value;} \
T(const Enumeration e){value=e;} \
const T &operator=(const Enumeration e){value=e;return *this;} \
const bool operator==(const Enumeration &e) const{return value==e;} \
const bool operator!=(const Enumeration &e) const{return value!=e;} \
friend const bool operator==(const Enumeration &e,const T &e2){return e==e2.value;} \
friend const bool operator!=(const Enumeration &e,const T &e2){return e!=e2.value;} \
operator int () const{return value;} \
friend T; \
enum Enumeration
#define EndEnum ;}
>>346 Jane用
おかしいところあったら指摘してくれ
347 :
344 :2008/11/20(木) 17:09:25
Janeでリンク見ても全然だめだこれwww
>>346 これは面白いマクロ。
ぜひ使わせてもらいます。サンクス!
でも
>>339 みたいな場合だと
f(HOGE::A); // エラー! f(HOGE::A::Enumration)がない
ってなりそうな気も。。いや、まだ試してないんだけどね。
>>333 bufと&buf[0]は同じポインタになる
350 :
333 :2008/11/20(木) 22:17:57
>>349 delete [] buf は delete [] &buf[0] と同じだから、
当然、delete buf は delete &buf[0]は同じ結果となり
配列の第一要素のみが開放されるんですよね
でも、delete [] &buf[1]では配列は開放されないんですよな(コンパイルエラーかな)
ポインタといった場合、それに含まれている管理情報はどんなものになるんですか?
少なくとも、オブジェクトのアドレスは有してるとは想像できるのですが。
&buf[0](== buf)、&buf[1]、のもつ管理情報の種類に違いはあるのですか?
int* a = &buf[0]; とした場合と、int* a = &buf[1]; とした場合の
aの管理情報の種類は違うんですか? =の後の情報しだいでaの持つ管理情報の種類が異なるとか
?多すぎわろた
もうこいつは駄目だな せめて脳をリセットする機能があればねえ
少しは自分で考えようね
ポインタってのはメモリ上のただ一点を指す数値でしかない。 int* a = new int; int* a = new int[2]; new intがメモリの500〜503番地に確保された場合aの中身は500 new int[2]がメモリの500〜507番地に確保された場合aの中身は500 つまりポインタは配列のサイズを持っていない。 じゃあどこに new int[]の配列サイズがあるかといえば一つ手前の496番地に配列のサイズがある。 つまり new int[2]はあらかじめ496〜507番地まで確保し、496〜499番地に配列のサイズ2を書き込み 500〜503と504〜507までの2オブジェクトのコンストラクタを呼び出す。 そして500番地を返す。 delete [] は aの中身500番地の一つ前の496番地にアクセスし配列のサイズ2を知る。 サイズが2要素だと分かったので500〜503番地と504〜507番地のオブジェクトに対しデストラクタを呼ぶ。 あとはメモリを解放する。
>>350 いろいろめんどうだが、
> int* a = &buf[0]; とした場合と、int* a = &buf[1]; とした場合の
> aの管理情報の種類は違うんですか? =の後の情報しだいでaの持つ管理情報の種類が異なるとか
そう。
>>354 断定してるが実装依存だろ
そんな仕様はどこにもない
>>354 ISO/IEC 14882:2003のどこにそんな事が書いてあんだよ?え?
358 :
354 :2008/11/21(金) 00:31:15
すいません確かに必ずそうなってるかのように断定したのはよくないですねすいません
int *buf = new int[100]; int *a[10]; a[0] = buf; int *b = a[0]; delete[] b;
dequeに17万くらいのstringを放り込んだらデストラクタで10秒以上時間がかかるんですが、 これは普通なんでしょうか。それとも、プログラムに問題ありと考えた方がいいんでしょうか?
>>354-355 ありがとうございました。
つまり、&buf[0]; は配列要素数も管理情報に持ち
&buf[1]にはそれがない。ポインタがコピーされる時はそれもコピー
(たとえばそれが関数の実引数へのコピーでも)される考えると。
そして、delete []の場合は配列要素数情報あるからそれを参照して開放、
deleteの場合は要素数1(配列要素数情報ないから)で開放すると。 こんな理解で良いですか?
>>360 そんなこと言われてもわからんが
7万個にしたら5秒で34万個にしたら20秒になるなら多分普通
34万個でも10秒のままだったり何分もかかるようになったりするなら多分何かがおかしい
あくまで全部たぶんの話
1、配列は[]でアクセス可能なオブジェクト。 2、配列 a について、C/C++ では、a も &a[0] 配列先頭ポインタをあらわす。 3、delete[] は配列オブジェクトのポインタをとって、開放処理を行う。
17万回delete呼ぶんだから10秒くらいかかってもおかしくはない。
>>360 試したら30秒くらいかかった。
Core2
[email protected] / Vista SP1 / VC++2008EE / Debugビルドでデバッグ実行
デバッグ無し、またはReleaseビルドにしたら一瞬で終わったので、
恐らくメモリ解放時のオーバーランチェックとかが遅いんだろう。
366 :
360 :2008/11/21(金) 01:09:51
>>362 そういえばその通りですよね。試してみたら倍くらい時間がかかったので
そういうものだと思うことにします。
>>364 確かに、それだけdelete呼ばれたら時間もかかりそうです。
>>365 Q6700/Vista(not SP1)/VC++2008EEなのですが、Debugビルドで20秒くらいでした。
確かにデバッグなし実行なら一瞬です。メモリ解放のオーバーランチェックというのは初耳でした。
10万オーダーの処理はマシンスペックによっては「重さ」が気になりだす分量。
んーBCB2009に付属のBCC32でdequueに20万個のstringを 突っ込んで解放してみたがCodeGuardをONにしても一瞬だな
debugビルドのdeleteって、該当メモリを全部チェックしてないか? malloc()に対してcalloc()が遅いのと同様、メモリを全部舐めてりゃ遅くて当然。
>>361 >ポインタがコピーされる時はそれもコピー
全然分かってねーな。コピーされるのはポインタ(ただの数値)だけだ。
int* a = new int[2]; // a == 500 だとすると
int* b = &a[0]; // b == 500
int* c = &a[1]; // c == 504
int* d = c; // d == 504
図入りの具体例を解説したサイトでも探すのが手っ取り早い。
shallow copyとdeep copy
>>372 mallocとfreeのことしかやってねー
それ見てもdeleteとdelete[]の違いは理解できねー
内容は面白かったが回答としては不正解だな
>>361 >>328 にコピーコンストラクタと代入演算子を実装して実験してみろ
見事うまく動作したら何をやっているか理解できた証拠だ
「まろっく」って読んでるのに違和感。自分が「えむあろっく」だったんで。
俺はいちいち「めもりーあろけーと」と読んでいる
「まろっく」と読む人って、callocは「かろっく」なんだろうか。
脳内ではまろっく、こーろっく、りあろっく
まろっくかろっくりあろっく
「ぞでぃあっく」という単語が見えた気がしたが、気のせいだった。
mallocはえむあろっくだけどallocaはあろっか
>>370 ,
>>372 俺、delete,delete[]をそんな風に使うんだで使っているが、
deleteとdelete[]がある理由、なにかあるんだろ。
(deleteはなぜnew xx[]を開放出来ないのか)
分かりやすく、その理由の解説頼むよ
new/deleteは常に1個という前提でオブジェクトの個数を保持していない new[]/delete[]はオブジェクトの個数を保持するために余分なメモリ領域を使用している 管理用のメモリレイアウトが異なれば相互運用は不可能
どんだけ同じ話題でループするんだよ
>>280 で結論でてるだろうが
new int[10]が返すポインタはヒープに確保した配列の先頭アドレスだが、 配列の先頭要素のアドレスでもある deleteが貰うのはアドレスの値だけだから区別が出来ないので プログラマが区別してやらないといけない D&Eの10章にその辺の苦労話が書いてある
387 :
383 :2008/11/21(金) 21:04:00
delete[]の場合は要素数が(処理系には)「分かる」から 必要なぶんだけデストラクタが呼べるわけだろう 配列ではないnewを、要素数1の配列と同じように確保するのなら deleteとdelete[]を区別する必要は無いのだろうけど、 ゼロオーバーヘッドルールがそれを妨げているんでないの 要素数を入れる32bitかそこらの領域を余分に必要とするのだろうからな
389 :
388 :2008/11/21(金) 21:33:39
DLLからDLLを操作するのって最短でどうやれば可能?
fopen
thx!!
>>287 がエラーになるわけないだろ常考
と、たかをくくってたらおなじエラーが出て俺死亡
焦ってデバッグしてみたら追い討ちをかけるように
rowに値を入れる前にnewしてことが判明
strstr()をつかってxxx\\aaa.txtみたいな文字列の\\以前を削除してbuff2に入れています。 p = strstr(buff, "\\"); //buffから\\をサーチ buff2 = p+1 こんな感じでです。 これをstringやSTLのアルゴリズムを使ってもっと簡単にかけますか?
↑自己解決しました その代わりこれを・・・ sscanf(s, "%[^_]_%s", s2, s3);を istringstreamで書き直す方法を教えてください
どうしても istringstream じゃないとダメ? string でもいいなら、 string s("hoge_fuga"); string::size_type pos = s.find("_"); string s2(s.substr(0, pos)), s3(s.substr(pos+1)); とできるけど
できました。ありがとございまs
c++にはsplit()みたいのってないんだっけ?
boost::algorithm::split
func2(const double data[]){ cout <<data[0]; ] func1(const double data[]){ func2(data); } main(){ double data[100]: func1(data); } これってfunc2内でちゃんと元のデータ参照できますか?
コンパイルできないから参照できないよ
struct Hoge{ double data; char name[20]; } Hoge hoge[100]; という配列の0番目から40番目の中で、nameの出現回数順にソートする方法ってどういうのがありますか?
よくわかんないけど例えばABBACBだったらBBBAACに並べ直せばいいの?
nameは配列のどの要素にも1個ずつあると思うけど
並びなおすというより、出現回数の順に別の場所に入れる感じですかね・・・ hoge[0].name →ABC hoge[1].name →ABC hoge[2].name →CDE hoge[3].name →FGH hoge[4].name →ABC だったら (ABC 3) (CDE 1) (FGH 1) ってかんじに
まずname毎の配列作って振り分ければいいんじゃないの
hogeを先頭からみてnameをキーにmapの値(int)をインクリメント 全部なめたら、 mapの頭からキーと値を別の構造体に入れる。 その構造体をintをキーにソートって考えましたが・・・ どうでしょう?
decolate-sort-undecorateパターン(イディオム)やね まず集合から要素→頻度のマップを作ってそれを頻度順にソート でソート後のマップから要素を取り出して集合を作り直す 妥当だと思うヨ
C++で #include <fstream> のファイル入出力ストリームと #include <cstdlib> のfopenを同じソースないで一貫性なく両方つかっていますが、動作的に問題が起きますでしょうか?
>>411 それだけの条件じゃなんともいえないな。
なんで問題が起こるかもしれないと思うの?
>>411 標準入力でのprintfとcoutの併用みたいなこと気にしてるんなら大丈夫だよ
コンパイラのバージョンによってはロケール周りがバグるよ。
>>411 古いコンパイラ(例えば古いgccとか)では
ios::sync_with_stdio(true); しないとダメだったりする。
規格的にはこんなことしなくても使えないといけないんだけどね。
(デフォルトは true だと規格に書いてある。)
まあ今は気にする必要は無いと思う。多分。
SJIS で嫁
419 :
417 :2008/11/23(日) 19:47:11
>>418 文字化けして読めないって意味じゃなくて、内容が難しすぎるって意味。
__entry_list はまんまエントリーリストだろうし、 どの辺が分からんのだ。
_ を何か特殊な記号と思ってるとか
時間取得する部分は seed = time(NULL); の方がいいな。 time_t と long のサイズが同じとは限らないんだし、ポインタをキャストするのは危険。
static char *__entry_list[] がわからんというのは、 まあなんか参考書読みなね、とかそういうレベルだわな。 まさか文字列リテラルは const char * にしないとダメよねー、 とかそういうツッコミを迂遠に言ってるのかもしれない。 あるいは、2重アンダースコアで始まる名前は コンパイラの予約語とぶつかる可能性あってダメじゃん、 とかそういうツッコミをしてるのかもしれない。
C++勉強してるんだけど 戻り値がいまいち理解できないな。 一体どういった活用すればいいのだろう?
>>417 結果を見やすくするために・・・と最後を半角空白で埋めてるが、
printfで幅指定すればいいだけ。
条件式内でstrlenを使ったり空白の追加にstrcatを使ったりするなど実装に無駄が多く、
完全に無駄な処理。(こんなのsprintfで一発でできる。)
ランダムシャッフルも定番の高速なアルゴリズムがあるのに、それを使っていない。
突っ込みどころが多過ぎる。
426 :
417 :2008/11/23(日) 19:58:50
>>420-423 うお。
お前らすげーな。
まずヘッダファイルからして、俺にはチンプンカンプン過ぎる。何がなんだが・・・・
それに加え、「*__entry_list」や「__entry_list[]」なら何となく分かるが、「*__entry_list[]」ってなんぞ・・・ってそうゆうレベル。
まだまだ勉強しないといけない事が山ほどあるなorz
単なる文字列へのポインタの配列じゃん。
> __entry_list まぁ、ヤな変数名ではあるw
>まだまだ勉強しないといけない事が山ほどあるなorz orzじゃないだろ、シャキーンだろ
>>424 数学で言う所の関数を思い浮かべればいい。
数学で戻り値の無い関数なんて思い浮かばないし、存在意義も見いだせないだろう。
関数には戻り値があるのが自然の姿。
戻り値の無い関数の方が特殊な姿で、
中には戻り値が無いものを関数とは呼ばない言語もある。(FORTRANとか)
戻り値のない関数にはなぜ戻り値が必要ないのか、
ということをむしろ考えた方がいい。
>>417 で1ファイルソースなのにstatic配列,static関数にする意味あるんですか?
アクセスが高速になる
公開するつもりのない関数・変数は static にしておく癖をつけた方が良い。
>>431 全体的にしろうとくさい書き方のコードだから、あんまり細かいことは気にスンナ。
435 :
デフォルトの名無しさん :2008/11/23(日) 20:24:45
こんばんは。 BCCで猫でもわかるwindowsプログラミングを勉強しているのですが、 6章のメニューを作るところができません。リソースをコンパイル するときにwindows.hが開けませんというエラーがでます。 どうすればいいか教えてください。
>>435 BCCよくしらないけど、環境変数のINCLUDEに設定するとか、引数で/Iとかに設定するとか、
windows.hのパスを教える方法がなんかあるんじゃね?
リソースはwindows.hをインクルードしたりしませんが
439 :
435 :2008/11/23(日) 22:02:23
441 :
435 :2008/11/23(日) 22:39:47
>>440 windows.h消したらうまく行きました!これで先に進めますありがとうございます。
僕もコンパイラのincludeフォルダからwindows.hを消したら うまく動きました!
粗悪の権化だからな
こういうの見ると 本気で間違えて覚えていたらかわいそうだから教えてあげた方がいいのかな? と思いながら放置する
BCCではリソーススクリプトでwindows.hのインクルードが不要なのは仕様。
>>426 int main(int argc, char *argv[])
という書き方を見たことがないか、見たことあるけど__に惑わされたかのどちらかだなあ
まあ、__で始まる名前は規格違反だから使う方も悪いけどな
>430 数学の関数でいうのなら、「処理が成功したら0、失敗したらエラーコードを返す」 ってのはオカシな考えだなあ。
>>448 ん?ディリクレの関数というものがありまして‥‥‥。
関数型言語と副作用
>>433 そんな事したらメンバ変数が使えないじゃないか!!
∩___∩ | , '´l, | ノ\ ヽ | , -─-'- 、i / ●゛ ● | | _, '´ / ヽ、 | ∪ ( _●_) ミ j iニニ, "● ∪ ヽ、 彡、 |∪| | iニニ、_ ', / ∩ノ ⊃ ヽ 〈`'ー;==ヽ、〈ー- 、 ! ( \ / _ノ | | `ー´ ヽi`ヽ iノ .\ “ /__| | ! / \ /___ / r'´、ヽ `´ヽノ
Cはstaticに色々な意味があるのでガンバ!
456 :
デフォルトの名無しさん :2008/11/24(月) 16:53:23
if( (a>10) && (b>10) )って式は右と左ってどちらが先に評価されますか? 機種依存だったりします?
左 あと左を評価して偽だったら右は評価しない
459 :
デフォルトの名無しさん :2008/11/24(月) 17:41:44
std::vector::findで要素が見つからなかった場合って何が返るんですか?
end()
461 :
459 :2008/11/24(月) 17:50:10
c++で<math.h>を使わずに自然対数の底の値(e=2.718282…..小数点以下15桁まで)を求めるプログラムを 作成しようとしているのですが、さっぱりわかりませんので誰か詳しい人いたら教えて頂けたらありがたいです。
463 :
デフォルトの名無しさん :2008/11/24(月) 18:02:34
e^x = 1 + ( x / 1! ) + ( x^2 / 2! ) + ( x^3 / 3! ) + ... + ( x^n / n! ) 後はわかるな?
464 :
デフォルトの名無しさん :2008/11/24(月) 18:07:52
真値との誤差評価と多売長演算入らないか
>>463 数学関数使えないので^と!は使えないのではないのでしょうか
>>465 地道に計算すればいいだろ
ただし、単純に計算しただけだと小数点以下15桁も有効数字は無い。せいぜい8桁程度
それ以上欲しいなら、さらに工夫が必要
三角関数とかって自分で実装するとしたら級数展開するしかないの?
468 :
デフォルトの名無しさん :2008/11/24(月) 18:24:37
そのためのテイラー展開です
表引きと補間の組み合わせという手もある
471 :
デフォルトの名無しさん :2008/11/24(月) 18:33:10
>>465 eを求めたいのならx=1だから後は簡単
サブプロセスでPython使って計算する
おかげでできましたありがとうございました。
BCCでWindowsXPの環境です。 特定のディレクトリ内のファイルを全てを読み込むにはどうすればよいのでしょうか。 よろしくお願いします。
まちがってさげてしまった。
危ないこのするんでしょ
direct.hをインクルードしていろいろやる
>>476 ? いや、普通にディレクトリ内のデータを基に処理して、結果をアクセスで使えるようにCVSにしたいだけです。
480 :
デフォルトの名無しさん :2008/11/25(火) 05:36:10
rand()の生成アルゴリズムって規格で決まっていないのですか? つまりその、コンパイルした環境によって、実行結果が変わってしまいますか?
>>465 関数を使わないで自分で計算すればいいだろ
ちなみに
>>463 のようにあらわすのをテイラー展開という
>>480 そのとおりです。大概の rand() は線形合同法だと思います。
>>478 ConcurrentVersionSystem?
もしかして: CSV
CVSというと一般的にはコンビニだな。
485 :
デフォルトの名無しさん :2008/11/25(火) 15:44:10
Linux で巨大なファイル (1GB) の読み込みをしようとしています。 ひとまず、HDD のシーケンシャルリード性能を hdparm -t で計測したら、 60MB/s でした。 次に fgets() で一行ずつ読み込むプログラムを書いて計測したところ、 140MB/s という hdparm より大幅に良い値が出ました。なぜこうなるのか理由 がわからないのですが、どうしてでしょうか? fgets() で読み込むプログラムはこんな感じです。 while( fgets( linke, LINE_MAX, fp ) ) { if ( ferror( fp ) ) { exit( -1 ); } }
マシン構成は?
C/C++でDBからデータを取ってきてグラフを描きたいのですが 私にヒントをください
#include <stdio.h> #include <stdlib.h> char *GetNumStr1(char *get, int num) { sprintf(get, "%d", num); return get; } char *GetNumStr2(int num) { static char keep[32]; sprintf(keep, "%d", num); return keep; } int main(void) { char str[32]; GetNumStr1(str, 1); printf("%s\n", GetNumStr2(10)); printf("%s\n", GetNumStr2(100), GetNumStr2(1000)); return 0; } 関数でなんらかの処理をし、 その結果を文字列を返す関数で 上の2つの関数だと、どちらがいいでしょうか。 2は呼び出し元で文字列を用意しなくてすみますが、 static分の容量が常に必要なのと、 1行で複数使うとよくないみたいです。
上の GetStr1() > 1行で複数使うとよくないみたいです。 とか 戻りをポインタで保持し、その後再び関数呼び出しすると… char* p1 = GetNumStr2(10); char* p2 = GetNumStr2(100); printf("%s,%s\n", p1, p2); 出力結果は 100,100 になっちまうし
>>489 ありがとうございます。
1にしたいと思います。
2で変数を用意しないで使える便利さも、
関数の中に関数を書くことで、
見づらくなるデメリットもありますし。
文字列を検索するのはわかったんですが CString str.Find(_T("abc"), 0); 文字列群を検索するにはどうすればいいんでしょうか? CString str1 = _T("abc"); CString str2 = _T("def"); CString str3 = _T("ghi");
>>485 計測ルーチンにバグが無いと確信できるならば、
ページキャッシュについて調べてみるとよい。
495 :
デフォルトの名無しさん :2008/11/26(水) 17:07:21
あるクラスのオブジェクトを生成するときに、必ず外から与えて欲しいメンバ変数の値があります。 例えば class hoge{ private: int m; public: ... } とかなっているときに、必ずmの値を指定して生成したい場合などです。 このとき、コンストラクタでmの値を指定することが考えられますが、 その場合、引数を持つコンストラクタのみを使って欲しくて、デフォルト コンストラクタは使ってほしくないという状況になります。 こういう場合、コピーコンストラクタをprivateメンバに宣言して使用禁止に するように、デフォルトコンストラクタを使用禁止にするというのは妥当な手段でしょうか。 普通自動生成禁止にするという話になると、大抵コピーコンストラクタの話が出てきて、 デフォルトコンストラクタについて触れられることはほとんど無いので、良い方法なのか 確信が持てません。
引数のないコンストラクタとデフォルトコンストラクタの区別をつければ解決する
>>495 何らかのコンストラクタを自分で定義すれば、デフォルトコンストラクタは自動生成されない
引数を持つコンストラクタを作るだけでおk
>>496 それは同じだ
498 :
495 :2008/11/26(水) 18:18:14
>>497 >何らかのコンストラクタを自分で定義すれば、デフォルトコンストラクタは自動生成されない
本当だ…orz
基本でした。すみません。
どうもありがとうございます。
499 :
デフォルトの名無しさん :2008/11/26(水) 19:07:38
Cのプログラムから時計を設定したいんですが、どんな関数を使えばいいでしょうか? windows&VC++とLinux&gccのそれぞれを知りたいのですが、教えていただけますでしょうか?
>>499 time.hの関数一通り眺めてみればいいんじゃないかな
>時計を設定 win32なら SetLocalTime ことを言っているのかな
>>500 阿呆は無理に書き込みしなくてもいいんですよ。
>>499 WinAPIスレ、Unixプログラミングスレへどうぞ。
どっちみち、権限がないと設定できないと思うのだけど。
503 :
499 :2008/11/26(水) 20:25:05
>>500 なるほど!その考えはなかったわ。と思って
C:\Program Files\Microsoft Visual Studio\VC98\Include 以下と
C:\cygwin\usr\include 以下を見てみたんだけど、
windowsなら_setsystime()であってますか?調べてみたけど使い方がわからない。
Linuxの方はcygwinで調べてみたけど、それらしいのがない・・・orz
504 :
499 :2008/11/26(水) 21:12:33
質問です BALL ball[1000]; memset(&ball,0,sizeof(ball)); このソースでball1000個分ちゃんと0クリア されるのでしょうか?
BALLがPOD型なら
>>505 BALLが doubleだったり、ポインタ型だったり、それらをメンバにもってたり、コントラクタもってたりしなければ
POD型というだけではダメだろう
いやdoubleはほぼ間違いなく大丈夫だし、ポインタも大概大丈夫ではあるけどさ
509 :
デフォルトの名無しさん :2008/11/26(水) 21:37:27
ttp://xy.yu.to/ (ここは本来のサイトではないが)
この荒れまくりカオス絵チャのminiっていう部屋の
秘密スペース(枠外)への書き込みってどうやれば
できるようになるのか解析して教えろ。
あと、1人の防衛プログラマーのクリアツールが強すぎて、
荒しプログラマーがことごとく全員返り討ちになってるから
オマエラが面白くしてみろ。
ゲハハハごめんね
>>506-509 ありがとうございます
なんかsizeofってよくわからないんす
げ、&いらないっすかそういえばそうですね
あるとまずかったりします?w
ヘッダーで変数を宣言したらnewしなくても既に作られているんですか?
>>512 Javaじゃないんだからそもそもnewなんて使わなくていい。
>>511 そもそもmemset()を使うよりも自分でループを回してきちんとクリアする習慣をつけるべき。
memset()を使うのは大人になってからw
相談させてください。 Cでメモリマップドファイルと、Win32APIイベントオブジェクトを使って、1対nのプロセス間通信を 考えているんですが、「対n」の部分がうまくいきません。 複数のプロセスが発生したイベントを1度ずつ参照して、その後にイベントをオフにする、そんな サンプル、もしくは案があったら教えていただけませんか?
取り敢えずマルチスレッドプログラミングスレに移動してみてはいかがでしょう。
>>516 マルチスレッドかAPIのスレに行ってみようと思います
ありがとうございます
>>510 普通に枠外に書いたら普通に書けて困った
placement newで組み込み数値型やポインタ変数を作ったときって、デストラクタ呼ぶべきなんでしょうか。
いらない
組み込み型のデストラクタって呼べるんだっけ
522 :
519 :2008/11/28(金) 21:12:06
回答ありがとうございます。
改めて考えてみると一番の疑問のありどころが
>>521 で
デストラクタ呼べるのならどうせ最適化で消えるだろうし、呼ぶのが未定義の動作を招くのなら違うコードを作ろうと思っていました。
VC++2008では
template<typename T>
void call_destructor(T &obj)
{
obj.~T();
}
というコードで問題なく動いているように見えます。
うーむ 5.2.4 擬似デストラクタの呼び出し 1 ドット演算子.又は矢印演算子->の後ろに≪疑似デストラクタ名≫を付けた表現は、型名の表す非クラス型に対するデストラクタを表す。 その結果は、関数呼び出し演算子()の演算対象にしか使ってはならず、その呼び出し結果の型は、void型とする。 その効果は、ドット又は矢印の前にある≪後置式≫を評価することだけとする。 これ読む限り、こんな風に書けて、効果は「i;」と同じ、っていう風に読めるけどなぁ VC++2008は文法エラーではねつける…(522のcall_destructor<int>は通るのに) int i; i.~int(); 規格に詳しい人頼む
>>523 文法要素としての擬似デストラクタ名 pseudo-destructor-name の中で、 ~ の後ろに
現れるのは type-name なんだけど、文法要素としては識別子とは別格のキーワードである
int, long, ... などはこの type-name に含まれないので文法エラーになる。
ちなみに、一般に「型名」と呼ばれる箇所は、文法要素としては simple-type-specifier が
対応し、これには type-name 単体に加えて、それに名前空間指定などを追加したものも
含まれるほか、 int, long, ... などの組み込み型をあらわすキーワードも含まれる。
完全に文法上の問題でキーワードを受け付けないだけなので、↓なら通ったりする。
typedef int Int;
Int i;
i.~Int();
いくつかソフトを作ってきましたが、多態性と動的結合というものにまったく縁がありませんでした。 これはどういうときに使うんですか?使い方さえわかればよく使う便利なものになるんですか?
>>524 なるほど、よくわかりました
キーワードは≪型名≫じゃないのか、盲点だった
>>525 規模が大きくなるとありがたみが出てくる
あとは仕様変更が多い時とか
>>525 C#の例で申し訳ないけど、
class Hoge {
:
:
public void Write(Stream stream)
{
foreach (byte ch in tbl)
stream.WriteByte(ch);
}
}
↑こういうメソッドがあったとして、それを使う側は、
streamから派生してるクラスならなんでも渡せる。
Hoge hoge = ……;
FileStream file = ……; // ファイルにデータを出力
hoge.Write(file);
MemoryStream mem = ……; // メモリにデータを出力
hoge.Write(mem);
>>525 多様な処理を、実行時に動的に切り換えたり組み合わせたりするソフトを作る時に便利
>>527 俺は逆にベタで書けばよかったと後悔するほうが多かったけどね
そこは設計ミスを後悔しろよ
>>531 仕様変更があったらどんな先読み名人でも無理だろ
結局、プログラムなんて汎用性なんてつけずに
いま必要なものだけをシンプルに組んだほうがいいと悟った
画面に図形を表示してそれをマウスで操作するっていう、オブジェクト指向の教科書の 例題に出てきそうなシステムをやったことあるけど、C++なのに、ぜんぜん オブジェクト指向っぽい書き方してなくて、コード中がswitchの嵐で、あーあって 思ったことがあったな。
>>532 たしかに。お仕事ソフトはいらない機能が多すぎる。
>>533 それってWMがらみ?ならばいたしかたないかと。
for ((初期化); (条件),(条件); インクリメントとか ) { 内部処理 } この場合の(条件)にはさまれた,はどういう意味ですか? ||とか&&の類でしょうか?
>>536 for の継続条件には一番右の評価結果が採用されます
そう 「A,B」はAを評価してからBを評価するっていう演算子 Aの結果は捨てられるから、Bが本当の条件でAはその前処理だな 初期化とインクリメントの所ではよく使うけど、条件で使うのは良くないなぁ
使いどころによって良かったり良くなかったりするもんか? 別にどこで使ってもいいと変わらんと思うが。
寧ろカンマは可読性を落とすからどこであろうとも使わない方がいいな。 そもそも関数呼び出しのカンマと区別がつきにくい段階で要らない子だ。 # forの初期化みたいにその子が役立つときもあることはあるが。
if (c=getchar(), c == 'a') のような記述か? どきっとするコードではあるな。
>>539 初期化、インクリメントは副作用の方が必要だけど
条件節は式の評価の値が大事
そこに式全体の評価に寄与しないカンマ左辺みたいなのがあると混乱するから良くない
struct Task { //略 }; Task* InitTaskList() { Task* task = new Task[NUM_TASK]; //中略 return task; } int main() { Task* taskArray = InitTaskList(); delete[] taskArray; return 0; } この処理でInitTaskList()で動的に確保したメモリはちゃんと開放されますか? あと、deleteでもコンパイル通るんですが delete taskArray ←配列の先頭だけ開放 delete[] taskArray ←配列全体を開放 といった解釈でよろしいでしょうか?
>>544 省略された箇所で例外が発生すると開放されない。
あと、 delete taskArray は未定義動作。
気にしなくてもあんまり問題になることはないんで、そのままでも
いいかもしれないが、完璧を求めるなら std::vector<Task> などの
標準コンテナを使うのがおすすめ。
>>546 char *inbuf = (char *)malloc(21701); を
char inbuf[21701]; にしてみたら?
ポインタに、sizeof(inbuf)すると、21701じゃなくて4になるよ。
>どこか、悪い点を指摘していただけないでしょうか? あんたの頭。
>>548 初心者スレであんまり調子コキ過ぎなレスつけんな
以降、みんな相手にしないように
iconvの使い方、間違ってる。
いつからここが初心者スレになったんだか。 マジで書くと、iconv云々以前にCの基本も理解できてないしストリーム系I/Oと低レベルI/Oを混ぜる馬鹿も晒しているし、 なのにread()の処理だけは変更できないなんて妙な拘束条件は提示してもその原因は伏せたまま。 どう考えても悪いのは頭だろ。
うまく真似できなかっただけみたいだから、そう怒らんでもいいのでは?
愛昆布
554 :
デフォルトの名無しさん :2008/12/01(月) 00:33:14
>>547 すいません。有り難うございます。
>>548 すいません。
>>550 どういう風に違うのでしょうか?
ファイルをメモリに読み込んで->即変換->変換した物を書き出し
とういう処理を行いたいのですが...
>>551 すいません。
>マジで書くと、iconv云々以前にCの基本も理解できてないしストリーム系I/>Oと低レベルI/Oを混ぜる馬鹿も晒しているし、
>なのにread()の処理だけは変更できないなんて
>妙な拘束条件は提示してもその原因は伏せたまま。
>どう考えても悪いのは頭だろ。
一応filenoを使ったのですが、駄目だったでしょうか?
read()の処理を変えられないのは、
実際の処理はソケットディスクリプタからreadするからで、
それ以外の方法がサンプルコードに乗ってなかったし、
試してもソケットからうまく読み込む事が出来なかったからです。
>実際の処理はソケットディスクリプタからreadするからで、 そういうのは先に書こう。 まぁ、iconv以前にソケットから読み込むだけのプログラムでも作って充分納得してからiconvに挑戦することだね。
556 :
デフォルトの名無しさん :2008/12/01(月) 00:53:39
>>555 >まぁ、iconv以前にソケットから読み込むだけのプログラムでも作って充分納得してからiconvに挑戦することだね。
いや、そこはもう出来て、満足してるんで別に良いんです。
iconvが動作しないから困ってるんです。
> byteread = read(fileno(src), inbuf, sizeof(inbuf)); これでホントに動かしているの? どうしようもねぇな。
558 :
デフォルトの名無しさん :2008/12/01(月) 01:10:14
すいません。 なんかGDBで変数を見ながら、 うさん臭いところなおしたら、なんか動きました。 有り難うございます。 ポインタをsizrofすると、このばあいchar *のサイズがかえってくる事を うっかりしていました。 有り難うございます。
>>551 スレタイも読めないのかお前は、2chド初心者丸出し
お前、頭悪いぞ!
560 :
551 :2008/12/01(月) 01:36:00
すいませんC++相談室と間違えてました
561 :
551 :2008/12/01(月) 02:14:41
馬鹿は騙るな。下らん。 それとも何か? 「初心者歓迎」だから「初心者スレ」だとでも? 他に文字通り初心者向けのスレがあることも認識できないのか?
と馬鹿が申しております
何ができるようになれば上級者ですか?
どの程度のレベルまで行けば初心者を脱出できるんですか?
>>565 誰かをうざがったり馬鹿にしたりという独りよがりをし始めたら
>>565 その質問をする側じゃなくて答える側になったら
実力に関わらず初心を忘れていれば
クラスの練習をと思い、稚拙ながらプログラムを組んでみたところ
どう対処してよいか分からないエラーが出たので、質問させていただきます
ソースコードはこちらです
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8168.txt エラーの内容は以下の通りです
-----------------------------------------------------------------------
class.cpp(19) : error C2059: 構文エラー : 'switch'
class.cpp(19) : error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます
どうもswitchの様子がおかしいようですが、どう対処したらいいものか・・・
お願いします
>>569 switchの前に}があるのがおかしい
>>570 そんな仕様があったんですか
このswitch文をクラスの外に出しても、switchはmainで機能しますかね?
>>571 「そんな仕様」が何を指しているのか判らんが、
関数の外には実行文は置けない。
クラス云々以前に、先ずは普通にプログラミングしてみてはどうか。
>>571 setegara() の中で switch したいのなら
setegara() の中に記述しろ ってことだ
ロダにあがってるソースは setegara() { } switch() { }
ってなってるじゃん と
>どう対処してよいか分からないエラーが出たので、質問させていただきます PCを窓から投げ捨てろ。 さもなくば、入門書なりサイトなりのサンプルをそのまま動かしてみろ。
>>572 すいません、関数とか実行文なんかの概念もキッチリ定着していないので
基本的なタブーなんかを理解出来ていないようです
>>573 その方法でやったら出来ました、有難うございます
そして一つ気付いたのですが、どうも}の数が一つ足りなかったようです
こんなケアレスミスで質問してしまい、すいませんでした
>>574 PC投げ捨てだけは勘弁してください
ご解答していただいた方々、有難うございました
解答じゃなくて回答な。 あと「ご回答いただいた」か、「回答していただいた」かどっちかでいいぞ。
ご開帳いただきありがとうございました。
#include <iostream> #include <stdio.h> using namespace std; int main() { int num; int* Array = new int[40960]; scanf("%d",&num); delete[] Array; return 0; } このプログラムなんですが、配列を動的に確保しているんですが タスクマネージャーなどで見てもメモリ使用率が増えていないんですが メモリの使用状況を調べる方法はありますか?
確保した配列をゼロクリアしてみたら?
580 :
578 :2008/12/01(月) 19:38:15
memsetしてみましたが結果は変わりませんでした…
>>578 40960って1MBないだろ?w
160kぐらいだろ?
微妙に変わってるけど気づいてないか
あらかじめ一定量取られちゃってて変化無しか
ってとこじゃね?
582 :
578 :2008/12/01(月) 20:10:22
int* Array = new int[40960000]; でやってみましたが変化ありませんでした…
>>582 それ今度はnew失敗してるでしょ?
たしか限界あった希ガス
メモリ使用量ではなく、仮想メモリサイズを見るべき (デフォルトでは非表示)
ああ、newだから失敗しないのか 配列だとたしかすぐ駄目なんだよねスマンコ
587 :
578 :2008/12/01(月) 20:41:58
タスクマネージャのコミットチャージの欄で生成と解放で上下しているのを確認できました。 色々助言ありがとうございました!
>>576 お前さん 敬語をもっと勉強しないとやばいぜ?
VisualStudio2005 SP1(Pro)で開発しています。 開発OSはXPでターゲットはVistaです。 開発したソフトがXPでは問題なく動作するのですが、Vistaでは動作しません。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\\Services\自分のKey 以下へアクセスしたいのですが、レジストリのキーの値を読むことはできるのですが、 値を変更(削除してから書き込み)ができません。 具体的にはStartレベルを変更できません。 試したこととしては、管理者権限で実行を行い実行>レジストリ値変更できず。 管理者権限で実行&XP(SP2)互換で実行>レジストリ変更できず。 プログラム的な問題なのか?もっと別の問題なのかがわかりません。 どなたか、上記について詳しいサイト、書籍などご存知でしたらご教授願えないでしょうか?
他のクラスのインスタンスを使うとき、長いコードを書いているのを小さくしたいです。 ((CMainFrame*)AfxGetMainWnd())->m_wndFile.m_Edit.InitEdit(); これはポインタで CEdit *m_newEdit = ((CMainFrame*)AfxGetMainWnd())->m_wndFile.m_Edit; m_newEdit->InitEdit(); それか、参照で CEdit &m_newEdit = ((CMainFrame*)AfxGetMainWnd())->m_wndFile.m_Edit; m_newEdit.InitEdit(); どっちがいいんですか?どっちも同じなんですか?参照を使ったことがないので教えてください。
>>591 対象が変わらないなら参照の方がいいね。ポインタだと、使い回しを疑って見ないといけなくなる。
なるほど、参照わかりました。 これから使っていけそうなきがしてきました どうもです!
class A { static const int ARRAY_N = 10; int array[ARRAY_N]; }; class B { int array[ARRAY_N]; }; って感じで、BでもAのprivate使いたいときがたまにあるんだけど、 friendしちゃってもイイのかな?(・∀・)
あ、俺freiendでコード実行できたことないんだけど どういう関係のとき使えるの? 静的じゃないとどうしようもなくない?
それだけのためにfriendは普通しない つうか設計がおかしいだろww
ゲッターとセッターとは別に高速化の為に配列への直アクセスを許したいときなんかにfriendつけた
>>590 UACだろ。マニフェストで管理者権限への移行できるようにする。
>>598 A, B,の関係やARRAY_Nの意味が分からないとなんとも言えない
>>594 static const は public にしてもいいんじゃね?どうせ書き換えられないんだし。
あ、その値に外部から見て意味があるんならね。
>>594 の例だと、public でいいんじゃね?
friend 使ってまで「あるクラスの持つ定数を
他のクラスに見せたくない」理由が解らん。
603 :
594 :2008/12/03(水) 11:51:10
みんなどうもあんがと。 AとB以外には意味のない、ただのマジックナンバーを全体に公開するのも気がひけるなぁ と思ったんだけど、やっぱfriendはダメかな? 2つ以上のクラスで使う定数はグローバルに出すって人もいるけど、僕はああいうの嫌い
class C { protected: static const int ARRAY_N = 10; }; class A : C { int array[ARRAY_N]; }; class B : C { int array[ARRAY_N]; }; こんな感じ?
>>600 やっぱそんなもんか
よくそんなんで否定できるな
609 :
602 :2008/12/03(水) 13:09:10
それよりマジックナンバーを全体に公開の意味がわからない 定数のことか?
namespaceあるんだからそこまで神経質にならんでもいいと思うけどな
名前のある定数はマジックナンバーとは言わないような
名前付きマジックナンバー
マジックネーム?
無名定数
数値の直書きがマジックナンバーじゃないのか マクロや変数で他人にも意味のわかる名前付けたらマジックナンバーじゃない
ファイル関連で質問です 任意のディレクトリ以下のcsvファイルのフルパス(サブディレクトリのファイル含む)を取得したいです。 FindFirstFileとかででいけそうと思ったのですが、ファイル名しか取得できなくて困っています。 どうすればディレクトリも取得でlきますか?
619 :
590 :2008/12/03(水) 17:08:39
そこのアクセス権限はどうなっている? 普通はAdministratorsにフルアクセスがあるはずだと思うんだけど。
とりあえずGetLastError()を。
書き込み権限ありでオープン時に失敗するのか、書き込み時なのかは?
623 :
590 :2008/12/03(水) 17:57:11
レスサンクスです。
>>620 レジストリのアクセス権限の調べ方について、今から調べてきます、、、orz。
>>621 今から実装して調べます。
>>622 書き込み権限はありますが、レジストリキーの値(Start)を
削除するときに失敗します。(レジストリが上書きできないので、削除⇒書き込みとしています)
>>621 の言うように何で引っかかっているのかをGetLastError調べてみます。
625 :
590 :2008/12/03(水) 20:16:43
うまく動作するようになりました。 お騒がせしてすみません。 レジストリキーの値を削除できなかった理由ですが、 ドライバが稼動中のため、できなかったためだとわかりました。 最小構成単位のプログラムで実験してわかりました。 みなさまのおかげで解決へといたりました。 (XPでも同様の理由でうまくいかないはずなのですが、 実験環境がたまたま動作してしまったのかもしれません) スレ汚し申し訳ありません。
>>624 ありがとうございます。
例えばC:\temp以下&サブディレクトリ(数、名前は不定)のcsvファイルのフルパスを取得もできるってことですすか?
未だサブディレクトリの取得方法がわかりません。
リンク先みましたがどれが該当するかわかりませんでした。。
>>626 FindFirstFile("c:\\tmp\\?*", lp)とでもして
いったん全部列挙すればディレクトリを取りこぼさない
*.csvならおk
ディレクトリなら再帰探索
それ以外は捨てる
そしてfoo.csvなんて名前のディレクトリで嵌まるんですね?
629 :
デフォルトの名無しさん :2008/12/04(木) 00:33:28
頭の悪い質問ですいません。 入力した文字をひっくり返したい(例.abc→cba)ので↓のようにしてみたのですがひっくり返された文字+謎の文字の羅列が出てきてしまいます どこを直せば良いでしょうか? #include <stdio.h> int main() { int i,j=0,k=0; char aa[100],bb[100]; printf("99文字以下の文字列を入力してください"); scanf("%s",aa); for(i=0;i<100;i++) { if(aa[i]==0) break; } for(j=0;j<i;j++) { bb[j]=aa[i-j-1]; } printf("入力された文字は%sで、これをひっくり返すと%sです。\n",aa,bb); }
>>629 フォーループを脱出したら、bbの該当箇所にナル文字入れてやらんと。
それはさておき、99文字以下なら%sじゃなくて%99sにしておくのが無難。
631 :
デフォルトの名無しさん :2008/12/04(木) 00:58:28
>>630 すいませんが変更部分だけでいいのでプログラミングを書いてくれませんでしょうか。
for(j=0;j<i;j++) { bb[j]=aa[i-j-1]; } bb[j]=0; //これを追加? printf("入力された文字は%sで、これをひっくり返すと%sです。\n",aa,bb);
633 :
デフォルトの名無しさん :2008/12/04(木) 01:07:47
>>632 おぉ、出来ましたー。
ホントにありがとうございました。
bb[j]='\0'; の方が良い、と誰かが言うと思う
どっちでも一緒だろ、と誰かが言うと思う
どうせだからforの条件も'\0'にした方が、と誰かが言うと思う
char型の配列やポインタで文字列を入れるときは '\0' を使うな 整数として使うときはのときはもちろん0だが 文字定数ってint型なんだよな
>>637 ここはCとC++のスレdだぞCスレじゃない
COMとDLLの違いってなんですか?
COMの形態の一つにDLLがある
DLLがプログラムを小さくできる、だと COMはなにができるんですか? COMにしなきゃいけない場面がわからないです
他の言語(特にVBやスクリプト言語)から使えるようにもできる。
引数 const _variant_t& varValue にCStringを渡したい場合はどう書けばいいんでしょうか
CString型の変数sに対して_bstr_t(s)のようにする。
thx!
関数は基本的に小文字で宣言してるんだが、 マクロ関数は大文字の方がいいだろうか?
基本的には大文字だろうな 関数のように見せかけたいとか、関数に置き換える可能性があるとかなら関数の命名に従うのもあり
どっちでもないから大文字か…ありがとう。
int a[10000]; for(i;i<10000;++;){ 配列aを使用 } for(i;i<10000;++;){ int a[10000]; 配列aを使用 } 上のように、ループ内などで一時的に利用したい変数を、ブロック外で予め宣言しておく書き方と、 下のようにその都度ループ内で確保する書き方では、(実感できるかはともかく)上の方が実行速度の面で良好ですか? 一応実測では、(膨大な回数のループを繰り返して)前記の方法の方がわずかに速かったのですが…
>>650 ホントに差が出た? 初期化がないなら同じでいいはずなんだけどね。
最適化してないなんて落ちはないだろね。
>651 すみません、その落ちでした… つまり、きちんと最適化が施されているならどちらの記法でも変わらない (一時作業領域なんだからむしろ後者が好ましい)ということですね
99文字までの文字列を入力し,アルファベットの小文字は大文字に,アルファベットの大文字は小文字に,またアルファベット以外の文字はアスタリスク’*’に変換した文字列を出力するプログラムを作成せよ. このプログラムの実行例は次の通り. 99文字以下の文字列を入力してください. abcABC123sDFgh#"x32YY= 変換された文字列はABCabc***SdfGH**X**yy*です. 注意:このような課題に適したライブラリ関数もあるが,ここではそれらを使用せずにプログラムを作成せよ 誰かこれお願いします。明日までにやらなきゃいけないんですけど全く分かりませんorz
宿題スレへどうぞ
>>653 こんなの文章通りにプログラム組んで終わりじゃねーか?w
これが全くわからないレベルってもう組んでもらって
ソースを貼るしか解決策ねーだろマジでw
そもそも四則演算以外の知識マジでいらなくね?
小学生が喜んでとく問題・・・みたいな・・・
関数型言語だったら楽なのにね☆ ある文字を一行目の法則で変換する関数fを作って、 map f 入力文字列 で終了 あ、C++は関数型言語パラダイムも含んでいるんだっけ
この宿題はべつに関数型言語で楽になる内容ではない。
boostライブラリって何ができるんですか?STLはすぐ実用的で使えたんですが boostはなにが出来るのかすらよくわかりません。
>>659 ググればいくらでも出てくると思うんだが。
STLを一言でいうと動的配列とその操作 だとするとBoostは一言でなんですか?解説が難しすぎてまったく理解できません。
>>661 一言でいえるなんて考えてる限り理解できるわけ無いな。
あえて質問にだけ答えると、 boost.org のトップにあるとおり。
"Boost provides free peer-reviewed portable C++ source libraries"
>STLを一言でいうと動的配列とその操作 赤点。一週間後に再テストな。
プログラミングに限らず、ディテールが頭に入っていない状態で 「まとめられた一言」を聞いても、全然効果が無いと思うよ。解説なんかよりずっと難しい。
でもやっぱり必要だとか便利だから使おうかってなるじゃないですか? その部分が一言でむりなライブラリってことですか?
一言で言うと 「便利なライブラリの集合」 個々のライブラリについては概要についてそれなりに言えるけど そんなもん個々のライブラリのドキュメントのintroductionとかmotivationを読めばいいし
668 :
デフォルトの名無しさん :2008/12/05(金) 14:13:10
operator[]に2つ以上の引数を渡すにはどう記述すればいいでしょうか。 ググっても引数1つの例しか見つけられず…よい方法があれば何卒お力添えを
>>668 a[std::make_pair(0,1)]
>>669 2つ引数渡せました、ありがとうございます。
a[0,1] みたいにブラケットだけで渡すのは無理そうですかね
>>670 無理だがoperator()ならオーバーロードすればいける。
>>670 元々 [] が単項の演算子なのでどうしようもない
>>671 のような演算子をオーバーロードする
>>671-672 うーむ、やっぱり無理かぁ…残念。
ベクトルの要素へoperator[]でアクセスできればいいなあと思ってました。
operator()でやってみますね。どうもありがとうございました。
いや、vectorの要素ならそもそも引き数は一つだろ。
676 :
デフォルトの名無しさん :2008/12/05(金) 16:21:12
開発環境は、VisualStudio net2005 OSはXPです。 スライダーコントロールで下記の様に使いたいのですが 良い方法がありましたら教えて戴けませんでしょうか? 0------------100 -------------- 通常時は、0-50までしか動かせない。 チェックボックスに、チェック入れば0-100まで動かせるようになる。
>>676 50から先に動かしたときに、イベントハンドラで強制的に50に戻してしまえば委員で内甲斐。
679 :
676 :2008/12/05(金) 16:45:27
676さん、678さん、ありがとうございます。 OnNMCustomdrawSlider内で、無理やりやってみました。 出来ました。ただチップ表示させると50以降に持っていった時に 50じゃなくて、47とか49とか描画がついてこない?時があります。 もうちょっと、あがいてみます。 サブクラス化については、ググってみます。。
なにサブクラスって
681 :
デフォルトの名無しさん :2008/12/05(金) 18:37:24
>>680 win32用語
メッセージをがめる的使い方をする
質問させてください。 例外処理で言う例外というのは「エラー」に限定して捉えた方が いいのでしょうか?それとも呼び出し側の関数からみて想定していない 動作が起こる場合も例外として捉えていいのでしょうか? 言葉でうまく説明できないのですが下のような設計(麻雀)は例外処理の使い方として あるべき姿かどうか教えてください。 ゲーム管理=順番や牌の受け渡しを管理する プレイヤ=ゲーム管理から渡された牌に基づき手を作る ゲーム管理がプレイヤへツモ牌を渡して、戻り値として捨て牌を要求 ゲーム管理側にすれば捨て牌が戻ってくるのが想定している動作 一方、プレイヤ側からすれば、捨て牌がない場合もある(渡されたツモ牌で和了する場合、カンをしたい場合など) これを解決する方法として、和了例外、カン例外を用意してプレイヤ側がゲーム管理側に自分の判断を通知 例外を使わない場合よりもすっきり書けそう、という理由でこのようなやり方にしようと思ったのですが エラー処理以外に例外を使用してもいいのだろうか?という疑問がありましてこれを採用してもいいのか迷っています。
別にそういう例外仕様で実装するのは構わないと思うのだけど、 本来のエラー処理の例外も実装する必要があるだろうし、 例外の仕様が膨らむと見通しの悪い非効率なプログラムになってしまう危険は孕んでいるね。
684 :
682 :2008/12/05(金) 19:22:51
>>683 ありがとうございます。このやり方でいこうとすると
エラー処理も含めてどの位の例外処理が必要になるか考えていませんでした
例外についてはまだまだ不勉強なところがあるので、特にデメリットに
ついて勉強して採用するかしないか決めたいと思います。
>>682 俺なら戻り値はプレイヤの操作を受け取りたいかなぁ。
捨て牌は引数にポインタかなんかあげといて、捨て牌アリの操作のときだけ拾う。
エラー以外で例外処理使うとごちゃ混ぜになりそうで嫌だねぇ。
一般的には例外をフロー制御に用いるのは良くないことだとされていると思う。 この場合、ユーザーの操作としては和了、カンなんかはごく普通に発生するわけだから 例外として扱うのは相応しくないと思う。 >685 の通り、捨て牌ではなくて(牌を捨てることも含めて)ユーザー操作が返ってくるべきなんじゃない?
以下、キーワード「戻り値」だけに反応した超脳筋レス 大抵の関数の戻り値はBOOLとかboolにして値は引数で受け取るべき try、catchは俺は嫌い 動作がわけわかんねー throwとか投げられてもどう対処していいのかさっぱりわからん っていうか一番対処方法をわかってるのなんて出したその箇所に決まってるのに なんで上に投げてくるのかわからん 詳細なんてテメーで処理しろっての こっちが必要なのはあくまでbool値、成功か失敗かだけだろが 言語開発者マジ殴りてぇ っていうか多くの現場で当然のごとく使われて無い 当たり前だ こんな暇なもん実装してられるか そうそうそれと本題だけどシステム的にこれ以上続けようがないってのがエラーで 続けて対処する仕様まであるならそれは仕様であってエラーではないと思うよ あー、すっきりした
688 :
682 :2008/12/05(金) 20:56:26
>>685 ありがとうございます。操作と捨て牌を戻してもらって必要な時だけ
捨て牌を読むというのは考えてませんでした。このやり方なら
例外を使った場合と結果的に変わらない処理の流れが実現できますね。
(僕は例外を使わない場合として捨て牌を表さない値が返ってきたら、管理側から
改めて和了するのかをboolで、カンするのかをboolで、と逐一確認する方法を
考えていました・・・未熟ですorz)
標準ライブラリの例外の継承構造を見ても非エラーを表すような
クラスはなかったのでやはり、エラー時に使うのが前提。とまではいかなくても
わりやすいということになりますね。
try { 安倍政権(); throw "空気読めない"; } catch(char *str) { cout << "Exception raised: " << str << '\n'; try { 福田政権(); throw "あなたとは違うんです!"; } catch(char *str) { cout << "Exception raised: " << str << '\n'; try { 麻生政権(); throw "漢字読めない。"; } catch(char *str) { cout << "Exception raised: " << str << '\n'; while(!政権交代); // ← 今ココ! } } }
690 :
682 :2008/12/05(金) 21:52:38
>>686 ありがとうございます。確かに和了やカンを例外と扱うのは違和感がありますよね。
スタックを巻き戻ることができる機能として例外を捉えていた部分があるので、皆さんの
意見を参考にもう一度検討してみます
>>687 ありがとうございます。エラーの定義が自分の中であいまいな部分があったので
システム的にこれ以上続けようがないと言うのを参考にさせていただきます
string hoge; これをLPCTSTRに変換したいんですが・・・ どういった方法がありますか?
>>687 一般的に、プログラムを部品化していくと、エラーを検知した場面では最適な対処方法を
知る術は無い状況はすぐに発生する。
そう思わないのなら、たぶん部品化をあまり行っていないか、部品化するまでも無い
プログラムしか書いたことがないんだろう。まぁ別にそれ自体は悪いことじゃないが、
自分がよくわからない物事を嫌ったり不要だと決め付けたりする姿勢は、技術者としては
かなりのマイナスだね。
>>691 stringって、STLの文字列か?
ATLの文字列変換マクロとか使うのが簡単かな。
#include <atlbase.h>
#include <atlconv.h>
CString ConvSTLstringToCString(string &str)
{
USES_CONVERSION;
return CString(A2T(str.c_str()));
}
これでCStringに変換されるはず。 キャストなしでLPCTSTRとしても
使える。
>>691 たとえば、void func(LPCTSTR); みたいな関数に渡すだけなら、
func(CString(hoge.c_str())); で。
バッファにコピーしたいなら、
std::vector<TCHAR> buf(hoge.size() + 1);
lstrcpy(&buf[0], hoge.c_str());
みたいな感じで。
>>693 >>694 CstringってSTLにはないですよね?ATLってやつですか?
VSexpressでも使えるんでしょうか
>>695 MFCだから、たしか、expressじゃ使えなかったと思う。
>>696 じゃあ使えないんですね・・・・
どうしよう・・・
APIのみだったら、 #if _UNICODE #endif みたいので、文字コードをMultiByteToWideChar()で変換するコードを入れるしかないのかな?
プロジェクトのプロパティにはATLの使用とかMFCの使用の設定があるのにな expressではつかえない
>>698 なんか難しそうですね・・・
わかりません
>>693 現在のCStringTはXCHAR*、YCHAR*両方のコンストラクタを
持っているから、CStringを作る気なら直接char*文字列を食わせればよい
さらに言うと、現在は
USES_CONVERSIONを定義する必要がないCA2T(マクロとテンプレートの
あわせ技)が使えるので、
マクロを使うのなら、そっちを使ったほうがいい
あのーさっぱりわからんですw
汎用テキストは面倒なだけだから、WCHARに決めうちがいいよ。 TCHAR系は使わない方向で。 TCHAR使ったって、MBCSとUNICODEの両方に対応したコードを書くのはムリ。
>>697 LPCTSTRは、Unicodeビルド時は「const WCHAR *」、非Unicode時は
「const CHAR *」に変換されるので、Unicodeビルドでなければ
(MBCS=シフトJIS)、STLのstringの中身は、LPCTSTRでキャストして
やれば問題ないはず。
(LPCTSTR)str.c_str()
Unicodeビルドで、ATLマクロ等ふが使えないなら、Win32 APIの
MultiByteToWideChar()とか使って自分でワイド文字列に変換する
関数を作るしかないな。
もしくは、STLの方で、stringではなくwstringを使うかだ。
文字列クラスは、stringじゃなくて、wstringを使うようにする。 文字列のリテラルはLをつける。 L"abc" みたいな感じ。 APIはMessageBoxだったらMessageBoxWみたいに後ろにWをつける。 とすれば、変換は考えなくていいかな?
>>703 Unicodeを使う(デフォルトの設定のまま)にして
MessageBox( NULL, _T("aaa") , _T(""), MB_OK );
こういうのをWにかえればいいんですか?
>>706 そう。
MessageBoxW(NULL, L"aaa", L"", MB_OK); みたいな感じ。
(LPCTSTR)str.c_str() これはexpressでも使えるのでしょうか? STLのほうを変えたらどうかという提案ですが、そちらは都合で変えることができません
string test ="テスト"; MessageBoxW( NULL, (LPCTSTR)(test.c_str()) , (L"test"), MB_OK ); これでやったら、ものすごい文字化けがおこりましたw
>>708 それは、_MBSCでビルドしたときにだけ使える。
_UNICODEでビルドすると使えない。
片方でしか使えないコードを書くと時はLPCTSTRとか使う意味がない。
こんなところで質問せずに 汎用テキストマッピング TCHAR あたりのキーワードでぐぐって一度しっかり理解しろ Windows特有だが、大して難しい話じゃないから
>>709 リテラルはLをつけるだけでいいけど、それ以外はLPCTSTRでキャストしてもだめ。
MultiByteToWideChar()とかで変換する必要がある。
>>710 _MBSCでビルドすることに変えたらなにか注意することありますか?
_MBSCでビルドしたらコンパイルできない箇所が生じました・・・ MultiByteToWideChar()を使うしかなさそうですね
>>713 一部のUnicode文字は、MBCS(シフトJIS)では扱えない。ただし、Unicode
でも、シフトJISの機種依存文字は扱えない。
>>716 expressだから、ライブラリの類はつかえないらしいよ。
使えるのかな?
Unicodeなんてないの前提だよ(俺の関わったところは全部)
MultiByteToWideChar()の使い方がわかりません int MultiByteToWideChar( UINT CodePage, // コードページ DWORD dwFlags, // 文字の種類を指定するフラグ これはなんですか? LPCSTR lpMultiByteStr, // マップ元文字列のアドレス int cchMultiByte, // マップ元文字列のバイト数 LPWSTR lpWideCharStr, // マップ先ワイド文字列を入れるバッファのアドレス int cchWideChar // バッファのサイズ ); :MultiByteToWideChar(CP_ACP, ?, 元, バイト数1, 先, バッファ)
>>718 _MBCSで作られてて、中途半端に汎用テキストつかってるシステムを
UNICODE対応にさせられてて、ちょうどむかついてる最中。
UNICODEを意識しないって、いまだにVC6を使ってるとか?
速攻で プロパティ→構成プロパティ→文字セット→マルチバイト文字セットを使用する 設定
俺も汎用テキストは意味ないって思ってるけど、OSの中がunicodeだから、 LやらWやらつけるほうが素直で、あとあとトラブルもなさそうと思うけど、 そういうのも分からんって言われちゃう現場だと_MBCSになっちゃうかもね。
>>721 そもそも、Expressって商用には使えないんじゃなかったっけ?
Visual Studio Expressじゃなくて、Twilight Expressかもしれんが。
デスマ経由地獄行き列車か?
>>722 2003も、2005も、2008も持ってるけど、VC6を一番使ってるぞ。
いや実際_ismbblead()だのmbs系関数いちいち使うぐらいなら wchar_tのがナンボか楽だろ 今時_MBCSとか本気で意味わからん
>>726 VC1.5とか使ってるところとかあるしな。
>>724 それの日本語みてるんですが、わかrません
> そういうのも分からんって言われちゃう現場だと_MBCSになっちゃうかもね。 そんな奴にC++なんて奇怪語を触らせるなよ…… と俺はいいたいが まあ関係ないからどうでもいいや
MS-C/C++ ver.7 使っているところ未だに多いしな
#include <cstdio> #include <clocale> using namespace std; int main(){ ::setlocale(LC_ALL, "Japanese"); ::setlocale(LC_NUMERIC, "C"); printf("%s\n","あいうえお"); wprintf(L"%s\n",L"あいうえお"); return 0; } これで下の出力がありません。何が足りないんでしょうか?
wprintf(L"%hs\n",L"あいうえお");
すまん間違えた wprintf(L"%s\n",L"あいうえお"); でマルチワイド変換させたいんだろ? wprintf(L"%hs\n","あいうえお");
_tsetlocale(LC_ALL,TEXT("")); てやつでした。これってただのsetlocaleと何が違うんですか?
だいたいUnicodeなんて対応して誰に触ってもらいたいのかわからん ていうかそれ関連の関数ってわけわからん仕様の関数が多すぎ
で、パスに♥とか入ってるだけで開けない糞プラグラムができるわけだな。
>>738 そういう文字を使ったファイルは、エクスプローラ使っても、Linux+Sumba
で動くNASとかにコピーすっとコピーに失敗する。
そんな製品でも、Windowsで動作確認などと平気で謳ってる。(w
赤信号皆で渡れば怖くない理論かw せめてSambdaと書いてやれよ LinuxもUTF-8+CIFSでちゃんとセットアップされた環境なら 問題なくUTF-16なファイル名を扱えるんだがね
お仲間がいようが糞は糞
>>735 まあ別にsetlocale使うのと同じ。
VC++などにはsetlocaleにもワイド文字版の_setlocaleがあって、
さらに、Windows API同様のワイド・マルチバイト切替版が_tsetlocale。
引数の型が違うだけで、効果に違いはない。
>>738 仮にそういうのをデータベースに突っ込んだりするとどうなるの?
っていうのとかどうせ俺とか考えてないしはじめから未対応のが気が楽っちゃ楽
正直、そんなくだらない対応するぐらいなら期間削って安く仕上げてくれって客としか
仕事したことないわ
それは技師としてどうなの
×技師 ○作業員
会社ぐるみで全部CP932でやらせてるんだろうから 全員作業員ってこったな 工事現場以下だ
やさしいな、おまいら。 Win32API スレではぐだぐだになってたぞ。
w_charに読み込んだ文字列が数字であるかないかを判定したいんですが、どうすればいいでしょうか? atoiみたいな関数つかって変換して・・・っていうのは思いつきましたがその後がわかりません
先頭にwがついた似たような関数があるよきっと
(CDから)ターボデバッガをインストールした後 BCC Developerをインストールしたが BCC Developerの<デバッグ>ボタンを押しても、ターボデバッガが起動しない。 ターボデバッガのインストール後のパスの設定はどうするのでしょうか。 本には「Bcc Developerの環境設定を参照」とあるが、さっぱり分かりません。
>>749 _wtoiを使うのはわかるんですが
例えば12a3aみたいな文字列だったときは12に変換されますよね?
これをエラーとみなしたいんですが
>>752 atoiだってその仕様じゃないか
wstrtolとかは?
>>753 wstrtolって何インクルードすればいいんですか?
>>755 stdlibですよね?識別子がないといわれるんですが・・・
環境は?
Visual C++ 2008 express editionです
wstrtol がある環境もあるよ。 wstring.h に入ってる。
763 :
デフォルトの名無しさん :2008/12/06(土) 17:23:48
下のような階層構造の構造体を作って、コンパイルしたときに、配列数が多い場合に、コンパイルできませんでした。 そこで、C++のクラスを使って、各層の配列をnewで配列数を無駄なく設定したら良いのではないと思い、トライしているのですが、方法がわかりません。 環境は、Linux(Fedora8)、コンパイラは、C++4.1.2です。 お願いします。 /////////////////////////////////////////////////// typedef struct { int num; //!< ある層のノード数 UNIT unit[NUM_UNIT]; // <- ここを各層ごとに宣言したい。 } LAYER; typedef struct{ int num; //!< 層の段数 LAYER layer[NUM_LAYER]; } CLASS; ///////////////////////////////////////////////////
764 :
デフォルトの名無しさん :2008/12/06(土) 17:29:01
763です。 NUM_UNITとNUM_LAYERは、defineで宣言しています。 ちなみに、 #define NUM_UNIT ノードの最大値(10000とか) #define NUM_LAYER 5とか
>>763 どこまで試して、どういう状態になったのか書いて。
ちなみに配列 new 使うぐらいなら std::vector 使うのがおすすめ。
766 :
デフォルトの名無しさん :2008/12/06(土) 17:51:23
763です。 以下のようなサンプルで試しています。 もちろん、/**/の行でコンパイル時に以下のようなエラーがでます。 test.cpp:25: error: expected `;' before ‘new’ /////////////////////////////// class LAYER{ public: int *bb; }; class CLASS{ public: LAYER *aa; // クラスBBのポインタを宣言(のちに配列を動的に確保) CLASS( int nn,... ){ printf("層数=%d\n",nn); LAYER *aa = new LAYER[nn]; // クラスLAYERをnum個生成 int *nnum = new int[nn]; // 第2引数以降を格納するための一時配列 va_list args; va_start(args, nn); for( int ii=0; ii<nn; ii++ ){ nnum[ii] = va_arg(args, int); printf("nnum=%d[%d]\n",nnum[ii],ii); } for( int ii=1; ii<nn; ii++ ){//層// int Num = nnum[ii]; // 各層のノード数 /* ここの表現がわからない */ aa[ii].bb new int[Num]; //各層のノード数分確保したい。 printf("[%d]",ii); }printf("\n"); } }; int main() { CLASS a(3,4,3,2); // ( 層数,各層のノード数 ) return 0; }
>>766 そのコードは "=" が抜けてるだけじゃないか。
まぁ案の定 delete が抜けてたりするんで、 std::vector で置き換えるのが
おすすめだけどね。
768 :
デフォルトの名無しさん :2008/12/06(土) 18:15:44
763です。 ということは やろうとしているクラスで、階層構造の無駄のない領域の確保は可能ということなんですね? そして、デストラクタを除けば、サンプルプログラムで表現できていると判断してよいのでしょうか? "vector"については、知らないので、これから知らべて、書き換えていきます。
770 :
デフォルトの名無しさん :2008/12/06(土) 18:21:26
>768 そうですね。ありがとうございます。 精進します。
CString bufstr; m_EDIT.GetWindowTextW((LPTSTR)(LPCTSTR)bufstr,160); LPTSTR pszText; pszText=const_cast<LPTSTR>(static_cast<LPCTSTR>(bufstr)); CString bufName = *((CString*)pszText); bufstrが取り出せません助けて!
>>771 つ[CString::GetBuffer()]
すいません解決しました。
>>772 ありがとう!
wchar_t bufstr[160];
m_EDIT.GetWindowTextW(bufstr,160);
CString bufName = bufstr;
CString bufstr; m_Edit.GetWindowTextW((LPTSTR)(LPCTSTR)bufstr,160); wchar_t* bufName = bufstr.GetBufer(); ってことかありがとう!
配列とvectorって、サイズ固定の場合だと効率は同じと考えてよかですか? それだと配列の立場なくなる気もするけど。。
やばい771が馬鹿に見えてきた これで行けてしまった・・・ CString bufstr; m_EDIT.GetWindowTextW(bufstr);
m_edit(笑)
>>777 > やばい771が馬鹿に見えてきた
みんな判ってて言わないだけだから安心しる。
> GetWindowTextW
なんでわざわざワイド文字に限定にするんだろ?
780 :
デフォルトの名無しさん :2008/12/07(日) 11:42:17
下の様なクラスで、クラスAを複数宣言して、クラスAの要素ごとにクラスBのvector bbの要素数を変えたい。 つまり、 const int num[3] = { 100, 50, 200 }; // クラスBのbbの要素数格納 A aa[3]; //クラスAを複数宣言 aa[0]のクラスBのbb要素数をnum[0](100)。 aa[1]のクラスBのbb要素数をnum[1](50)。 aa[2]のクラスBのbb要素数をnum[2](200)。 としたい。 これってできますか? ////////////////////////////// class B{ public: vector<int> bb; }; class A{ public: B *b; };
vectorなら要素数を格納する必要なんてないと思うのだが。 なんでわざわざそんな突拍子もないことをする必要があるのか、そこから検討しなおした方がいい。
for (int i=0; i<3; ++i) aa[i].b->resize(num[i]);
>>780 いろいろやり方あると思う。要素数を constructor の引数で決めるとか、
要素数を指定するメンバ関数用意するとか。
784 :
デフォルトの名無しさん :2008/12/07(日) 12:22:13
780です /*クラスA内で、*/ B *b; A( void ){ B *b = new b[3]; for( int ii=0; ii<3; ii++ ){ b[ii].num = Num[ii]; printf("num=%d\n",Num[ii]); } } /*main()で*/ printf("%d\n", a.b[0].numsize() ); printf("%d\n", a..b[1].num.size() ); printf("%d\n", a.b[2].num.size() ); とすると 意図した値がでません。 アドレスも違うようです。なぜなのでしょうか?お願いします。
せめてコンパイルの通るものを書いてくれ。
typedef std::vector<int> B;じゃ、いかんのだろうか。
787 :
デフォルトの名無しさん :2008/12/07(日) 13:23:00
>785 すいません。きをつけます。 >786 実際つかうときには、もう一段クラスを介するつもりなのです。
788 :
デフォルトの名無しさん :2008/12/07(日) 13:38:00
class hoge {}; hoge obj1; としたときに、 sizeof(obj1); の結果が1バイトになります。これってどうしてですか? Linuxの g++ 4.2.4 です。
サイズが0だったらmallocできんだろう hoge a[10]; のように配列として扱うときも &a[0] と &a[10] が同じアドレスになってしまうではないか
790 :
デフォルトの名無しさん :2008/12/07(日) 13:58:02
でも、C言語で同じような構造体を定義してsizeof()すると0バイトになります。 #include <stdio.h> struct hoge{}; int main(){ struct hoge a; printf("%d\n", sizeof(a)); return 0; }
なぜなのかという問いの答えにはならないが 標準規格では中身のない構造体は認めていない
#include <stdafx.h> #include <string.h> int main(void) { int i,n; double unew,unow,uold,dt,m,f,k; n=10; dt=10; m=10; f=100; k=10; unow=0; uold=0; for(i=1;i<=n;i++){ unew=dt*dt/m*(f-(k*unow))+(2*unow)-uold; uold=unow; unow=unew; } printf("u(n+1)=%lf\n",unew); return 0; } 上記のプログラムで(error C3861: 'printf': 識別子が見つかりませんでした)というエラーが出てしまいます。 visual C++2008です。 全角とかも使ってないし、どうすれば解決するのかわかりません。 どうか教えて下さい。
ねぇ釣りでしょ?これ釣りでしょ?
794 :
デフォルトの名無しさん :2008/12/07(日) 15:22:19
>786 これってもしかして、クラスBを配列にするって意味合いになるのでしょうか?
795 :
デフォルトの名無しさん :2008/12/07(日) 15:23:41
#include <stdio.h>
std::vector<int>にBという別名を付ける、という意味合い。
>>795 stdafx.hのなかでincludeされてないんだっけ?
PDCursesをVC++に導入するにはどうすればいいんでしょうか? nmake vcwin32.mak でビルドするとこまではできたのですが、 次はどうしたらいいのかわかりません。
stdafx.hってプリコンパイルヘッダを作るためのものだろ
どーせ標準ヘッダなんだから2重インクルード防止されてるんだから 無いっていわれたならないんだろうから四の五の言わずインクルードしろよ。
どーせ
>>792 はstdio.hをインクルードしないとprintfは使えないって知らないんだろうよ
下手するとインクルードの意味も分かってないかもしれない
gcc なら printf などがビルトイン関数としても提供されているから #include しなくても使えるけどな
805 :
デフォルトの名無しさん :2008/12/07(日) 19:14:58
分割コンパイル+演算子オーバーロード で困っています。 対処法を教えて下さい。 ファイルは以下の3つです。 HOGE.h(本体)、ho.cpp(HOGEクラスの関数定義)、 XY.h(HOGEクラス内で使うデータ型を定義) これをコンパイルすると、 g++ ./ho.o ./main.o -o exe ./main.o: In function `operator+(XY const&, XY const&)': ././XY.h:12: multiple definition of `operator+(XY const&, XY const&)' ./ho.o:././XY.h:12: first defined here collect2: ld returned 1 exit status make: *** [exe] エラー 1 とエラーが出ます。 環境は、 gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) です。 以下ソースコード
806 :
805 :2008/12/07(日) 19:17:42
続
>>805 // HOGE.h
#include<iostream>
using namespace std;
class HOGE{
private:
public:
void ho();
};
#endif
----------------------------
// ho.cpp
#ifndef __HOGE_ho__
#define __HOGE_ho__
#include"./HOGE.h"
void HOGE::ho(){
XY h0={10,10};
XY h1={20,20};
XY h2=h0+h1;
};
#endif
807 :
806 :2008/12/07(日) 19:18:28
続
>>806 // XY.h
#ifndef __XY__
#define __XY__
#include<iostream>
using namespace std;
struct XY{
int X; int Y;
};
XY operator+(const XY& t0, const XY& t1){
XY ret = {(t0.X+t1.X), (t0.Y+t1.Y)};
return ret;
}
#endif
>>805 ヘッダで非 inline 関数定義するな。宣言だけにするか inline にしろ。
あと、エラーとは関係ないけど
インクルードガードに予約識別子使うな。
ヘッダで using namespace するな。
俺もC++はあまり詳しくないが、演算子のオーバーロードもメソッドみたいに構造体定義(宣言か?)にプロトタイプ宣言必要じゃないか? あと、昔のソースみたら2項加算のときにfriendにしてた。 なんでそうしてるのかはもう忘れた。 あやふやなんで流してもいいよ。
いままでコンソールのアプリしかつくったことないんですが、GUIのwindowsアプリを作りたくなりました。 なにでやるのがらくですか?
812 :
799 :2008/12/07(日) 19:57:14
私に質問はスレチでしたか?
>>802 Cなら、インクルードしなくてもコンパイルできるだろ。
814 :
805 :2008/12/07(日) 20:03:27
>>808 コンパイル通りました。
ありがとうございます。
>インクルードガードに予約識別子使うな。
知りませんでした。
ありがとうございます。
>ヘッダで using namespace するな。
ごもっともです。。。
>>815 楽がしたいのか勉強がしたいのかどっちなんだ?
後者ならどれでも自分で選んでみればいいだろ。
>>815 C++を捨ててC#を勉強し始めるというのはどうだろうか
>>813 まだこんなバカが学校の情報処理で増産されているのか?
>>818 それは、インクルードしたほうがいいって話?
コンパイルできるかどうかって話とは別ですね。
むしろ、プロトタイプがなくてもコンパイルが通るってことを知らないほうが、
危険です。
>>822 どう考えてもできないと思うんですけど
ひょっとしてこれでコンパイルが通るようなコンパイラがあるのか?
あと、Cのコードの大概はC++でもコンパイルできるだろ
>>823 C++のコンパイラでコンパイルできるから、
>>792 がC++のコードだということになって、
「stdio.hをインクルードしないとコンパイルできるってことも知らないバカ」
って勘違いした煽りが正当化されるってことにはならないよ。
>>823 空の stdafx.h を用意してやれば gcc 3.4 でコンパイルできたよ。
>>823 #include <stdafx.h> を抜かせば、少なくとも gcc-4.0.1、gcc-4.3.2 でコンパイル通って動いたけど
>>819 >>818 ではないが、printf が入ってて stdio.h include しないで
C compiler で compile 通るってことは一般には無いはずだよ。
compiler によってはあるかもしれんが。
>>827 デマながすな。
プロトタイプ必須ってC++だけだろ。
VC++でもコンパイルできるし。
>>827 Cコンパイラならコンパイルできるべきなのに
どうしてそう思うんだ?
Cコンパイラだとプロトタイプ不明関数は戻り値intとしてコンパイルされたな。 引数はどうなるんだっけ?
>>830 可変長引数関数と同じでしょ
K&R時代と同じといってもいいけど
要は暗黙の型変換の類は一切行われず、積んだものがそのまま渡る
833 :
831 :2008/12/07(日) 21:26:56
ちょっと不正確だったな charだのshortだのはintに拡張されるはずだ そこまで含めて可変長引数関数と同じ
ややこしいことに C99 で宣言無しの関数呼び出しができるとは保証されなくなってるんだぜ。
警告つきで C89 以前の動作を保つコンパイラがほとんどだろうけどな。
http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf > A new feature of C99:
> The rule for implicit declaration of functions has been removed in C99.
> The effect is to guarantee the production of a diagnostic that will
> catch an additional category of 25 programming errors. After issuing the
> diagnostic, an implementation may choose to assume an implicit
> declaration and continue translation in order to support existing
> programs that exploited this feature.
>>825-826 そ、そうなのか・・・知らなかったぜ
理由が知りたい・・・
>>824 いや、別に煽ったつもりも正当化するつもりもないんだけど
CならというからにはC++じゃコンパイルできないのか?ってことが言いたかったんだ
>>828-829 int main(){
printf("hello\n");
}
% g++ test.c
test.c: In function ‘int main()’:
test.c:2: error: ‘printf’ was not declared in this scope
% gcc testC.c
test.c: In function ‘int main()’:
test.c:2: error: ‘printf’ was not declared in this scope
コンパイラ通ること保証されてるの?
おれが三行でまとめてやるぜ。 C89 (C90?) 準拠のコンパイラなら >830-833 が正解。 C99 準拠のコンパイラなら未定義動作。ただし C89 の動作を保つことがほとんど。 C++ なら規格のバージョンにかかわらずコンパイルエラー。
>>836 $ gcc a.c
a.c: In function ‘main’:
a.c:2: 警告: incompatible implicit declaration of built-in function ‘printf’
警告が出るだけでコンパイルは通るし実行もできる @ gcc 4.3.0
>>839 と同じ結果
-std=c99指定しても一緒
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
>>835 まあ、
>>821 あたりは完全にあおりですね。
「Cなら」という仮定をもちだしたのは、このスレのタイトルが「C/C++」で
>>792 がCでもC++でもコンパイルできるから。
煽ったり正当化ってのは、
>>802 がC++と決め付けて(もしくはCならコンパイル
できると知らない)で、あおりぎみにレスしてるのにツッコミ入れたら、バカとか、コンパ
イルできないとか見当違いの反論してきたやつがいて、それらに向けた言葉。
取り敢えずうちではこうなった。 -- $ g++ foo.c foo.c: In function `int main()': foo.c:1: error: `printf' undeclared (first use this function) foo.c:1: error: (Each undeclared identifier is reported only once for each function it appears in.) $ gcc foo.c $ gcc foo.c -std=c99 foo.c: In function `main': foo.c:1: warning: implicit declaration of function `printf' $ gcc --version gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) Copyright (C) 2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. --
正確には C89 では ・ 戻り値の型は int ・ 引数の型は不明(型チェックはないが、可変個引数と同じ形の暗黙の型変換が行われる) と扱われる。 つまり、int foo(); のような形でプロトタイプ宣言した場合と同じ。 int foo(...); ではない、というか、(...) という宣言は C の仕様的に不可能。 (... の前には必ず別の引数が必要だから) ここでの暗黙の型変換には ・ char, short → int ・ float → double の2種類がある。 正確には、char や short と int が同じサイズの場合のみ、 unsigned char や unsigned short は unsigned int に変換される。 そうで無い場合は signed int に変換される。 K&R C まで遡ると unsigned char や unsigned short は 常に unsigned int に変換されるが、C89 でこの点は仕様変更された。
>>837 gcc version 4.1.1 20061011 (Red Hat 4.1.1-30)
gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
ともに同じ結果。
>>839-840 あたりを見るとなぜかわからん。
俺はいつも include してるから気づかんかったが。
C コンパイラ仕様が今更変わったとするとちょっと気になるが。
C89でコンパイルしてみたら?
>>842 -pedantic-errors -Wall くらいは指定しとけ。
>>844 alias で gcc='gcc -x c++' になってるとかw
このスレでこれだけのgcc使いを見ることになろうとはな 環境依存OKとはいえ大抵VC++だし
>>846 ,848
それは付けたけどまったくおなじエラーメッセージなんで省いたんだよ。
>>847 gcc に alias かけたりはしてないから。
ちなみに icc だと 8.0, 9.1 ともに
% icc -Wall testC.cc
test.c(2): error: identifier "printf" is undefined
printf("hello\n");
^
>>850 俺、インクルード無しでCコンパイラならコンパイルできると知らなかった。
もし、これが正しいなら、C++コンパイルモードで動作してるんじゃない
強制的に純粋Cコンパイラモードに出来ないの?
852 :
799 :2008/12/08(月) 00:22:57
私の質問はスレチなんでしょうか? 質問の仕方が悪いのでしょうか?
もう一度チェックしたところCでやると確かに警告は出るけど、 compile できました。ついファイル名を .cc にしてたため、 gcc でもicc でも c++ モードで compile しようとしていたみたいです。 アホな事言ってすみませんでした。
>>799 「導入」の意味がよく分からないけど、
プリプロセス時にcurses.hをインクルードして、
リンク時にpdcurses.libをリンクして、
実行時にpdcurses.dllをロードすればいいだけでは。
>>852 ググってみたけどかなりレアな感じだしみんな知らないってとこじゃね?
856 :
デフォルトの名無しさん :2008/12/08(月) 00:43:29
テーブルをやるにはデータグリッドビューを使うのが良い?
たぶんノコギリかハンマーのほうが良い。
それだと金属製のテーブルはヤるのはむずかしそうです。
859 :
799 :2008/12/08(月) 00:55:15
>>854 リンカにいろいろ怒られちゃいました
なにか足りないようですが、初心者の私にはさっぱりです・・・
>>855 そうなんです。ググってもわからないんです。
860 :
799 :2008/12/08(月) 00:56:18
エラーの状況 c:\test>cl test.c /link pdcurses.lib (中略) /out:test.exe pdcurses.lib test.obj pdcurses.lib(pdckbd.obj) : error LNK2019: 未解決の外部シンボル __imp__GetKeyStat e@4 が関数 __get_key_count で参照されました。 pdcurses.lib(pdckbd.obj) : error LNK2019: 未解決の外部シンボル __imp__MapVirtual KeyA@8 が関数 __get_key_count で参照されました。 pdcurses.lib(pdcutil.obj) : error LNK2019: 未解決の外部シンボル __imp__MessageBe ep@4 が関数 _PDC_beep で参照されました。 pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__FindWindo wA@8 が関数 __find_console_handle で参照されました。 pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__wsprintfA が関数 __find_console_handle で参照されました。 pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__SendMessa geA@16 が関数 __set_console_info で参照されました。 pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__GetWindow ThreadProcessId@8 が関数 __set_console_info で参照されました。 pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__RegCloseK ey@4 が関数 __init_console_info で参照されました。 pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__RegQueryV alueExW@24 が関数 __init_console_info で参照されました。 pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__RegQueryV alueExA@24 が関数 __init_console_info で参照されました。 pdcurses.lib(pdcscrn.obj) : error LNK2019: 未解決の外部シンボル __imp__RegOpenKe yExA@20 が関数 __init_console_info で参照されました。 test.exe : fatal error LNK1120: 外部参照 11 が未解決です。
>>860 pdcurses内から参照されてるWin32 APIが未解決。
コマンドラインの最後に
user32.lib advapi32.lib
を追加。
862 :
799 :2008/12/08(月) 01:18:33
>>861 有り難うございます!!
無事にビルドできました。
Win32 APIの知識不足だったようですね。どうもお騒がせしました。
>>799 ncursesじゃなきゃやだやだってだだこねてた人?
864 :
デフォルトの名無しさん :2008/12/08(月) 01:34:09
データテーブルはwin32で用意されてないの?
何を言いたいのかさっぱり分かるんだけど win32のデータテーブルは用意されてるよ
866 :
デフォルトの名無しさん :2008/12/08(月) 01:53:34
ちなみに教えて下ちい データグリッドビューのwin32版
データグリッドビューの何版なら知ってるの?
868 :
デフォルトの名無しさん :2008/12/08(月) 01:57:16
clr版
それはWin32で動作しないの?
870 :
デフォルトの名無しさん :2008/12/08(月) 01:59:11
しないよ.netだから
おちょくるのもほどほどにしてやれよw こういう向きには何でも「ない」といっておけばいい。
872 :
デフォルトの名無しさん :2008/12/08(月) 02:03:37
本当に無いだけだろ?
873 :
デフォルトの名無しさん :2008/12/08(月) 02:20:11
どうしたの?答えられないの?
xを探しに来た人が、xがもしあったら自分の負けみたいな種類の喧嘩腰を
披露し始めるのが意味不明だが、
とりあえず俺も
>>871 にならって「ない」と言っておこうw
875 :
デフォルトの名無しさん :2008/12/08(月) 02:46:32
無いのか
はい、無いです
これから悪魔の証明が始まります お楽しみに
Win32の範囲内において無いことを示せばいいんだから悪魔でも何でもないだろ。
あー、Win32で実装されてるかどうか?でいいの? Win32ベースで作成されたものを誰も用意していないということを証明するんじゃないの?
証明とかはどうでもいいよ。 もう「ない」って決まったのw
A fast and lightweight cell control の事か
882 :
デフォルトの名無しさん :2008/12/08(月) 03:27:12
何故用意されて無いのかね? win○yは表示してたが、あれはdelphiからの贈り物に過ぎないのかね? 他のGUIライブラリとかMFCにも無いのかね?
WinnyってDataGridViewつかってんの?
884 :
デフォルトの名無しさん :2008/12/08(月) 03:38:18
多分、c++ビルダーにある奴を使ってるんだろうけど それの実態はdelphiの奴
質問です。 int i = 10*20; のような計算の計算速度と、if(i > j) {} のような比較の速度、 AND演算やOR演算ではどれが1番速くてどれが1番遅いのですか? また、関数呼び出しと比べるとどのくらい差が出るのですか?
>>885 実測するほかない。
「のような計算」と一口に言っても数値の型や演算子ごとに事情は違ってくるし、
それも含めて大概の要素が処理系にもよるし、CPUにもよるから。
>int i = 10*20; 10を20回足してメモリに書き込むため遅い >if(i > j) {} メモリからi,jをレジスタに読み出し比較したのち条件分岐するため パイプラインのフラッシュが発生して遅い >AND,OR演算 メモリからレジスタに読み出しAND,ORをかけてからメモリに書き込むため遅い 結論。どれも遅いよ
質問は「どれが1番速くてどれが1番遅いのですか?」だから それは結論でも何でもないよね。
>int i = 10*20; コンパイラが10*20を200に定数畳み込みしてレジスタに入れるため速い >if(i > j) {} コンパイラがそれぞれの確率を予測して 確率の高い方が分岐の少ないコードになるよう配慮してくれるため速い が予測が外れると遅い >AND,OR演算 最適化の余地が少ないためどう足掻いても遅い 結論。 掛け算はもっとも速い 次に条件分岐が速いがたまに遅い AND,OR演算は遅い
質問文と質問意図に差があるな、と判断するなり、俄然張り切り出して 「いかに意図のほうをちっとも満たさないまま文にだけきっちり答えるか」 を追求するモチベーション、伝統的にマには多いが、そろそろ何か名前が欲しいところだな。
891 :
デフォルトの名無しさん :2008/12/08(月) 07:59:49
信じられるのは実測値のみって答えでてるだろ
一般論は無い、で終わりにしとけ
893 :
885 :2008/12/08(月) 13:18:44
>886-892 返信ありがとうございます。 実測したほうがいいようなので計ってみることにします。
演算対象や組み合わせによっても全然違う結果になる可能性があるから、 個々の要素を比べる意味はあんまり無いよ。 実際に組みあがったプログラムについて計測しないと意味無い。
ヘッダのクラス宣言のところでクラス内の非inline関数の中身を記述するのはマナー違反なの?
>>895 クラス宣言内で関数を記述したら、非inline関数にはならないと思うのだが。
class B{ public: void Draw() { printf("BのDraw\n"); } }; class A{ public: void Draw(const B *b) { b->Draw(); } }; こういう方法でA::DrawではBの中身を変更しないことを明示的にしたいのですが、 B::Draw' : 'const B' から 'B &' へ 'this' ポインタを変換できません。 というエラーがでます。どうすれば良いのでしょうか?
> void Draw() const { printf("BのDraw\n"); }
>>898 ありがとうございます。
コンパイル通りました。
constにそんな使い方があったんですね。
>>896 勝手にinline関数扱いになるんですよね?
>>808 の言葉が気になったもんで・・・
Hoge.h
class Hoge{
public:
void hoge(){処理} <-これを呼び出したら、インライン展開される
};
ということでよろしいですか?
インライン展開されるかどうかはコンパイラ次第。 少なくとも、インライン展開されたかの如く振舞うことは期待できる。
>>901 レスありがとうございます。速度優先とか、サイズ優先とかのオプションによって展開されるかどうかが
決まるという訳ですね?(そもそも展開不可な関数もありますが)
これからもビシバシヘッダに処理を書かせていただきます。
inline とつけたときと同じだというだけだからね
はい
質問です。
VS9.0を使い、floatを用いた計算が必要なアプリケーションを作っています。
このアプリケーション、分岐などは特にないのですが、
私の家のPC(WindowsXP、Pen4)での計算結果と、
友人の家のPC(WindowsXP、CPUは不明。必要がありそうなら今度聞いてきます)での計算結果が微妙に異なるのです。
こんなことってありえるのでしょうか?
気になってぐぐってみたところ
floatはCPUでの計算中は精度が高く、メモリーに書き出すを精度が落ちる。
なのでメモリーアクセスのタイミングしだいで結果が異なることもありえる?
というようなページを見つけました
ttp://hw001.gate01.com/eggplant/tcf/cpp/floatprecision.html この「同じ計算をしているのに、PCによって結果が(微妙に)違う」というのを避ける方法はありますでしょうか?
float変数は、メンバ変数やグローバル変数でも使う必要があるため、ローカルで全部やれ!というのはできません…。
>>905 同一のexeじゃないよね?コンパイルオプション一緒にしてみてはどう?
>>905 doubleを使え。floatで計算するよりももしかしたら速いかも知れないし。
それでも結果が違うなら、FPUの精度を外部で指定しているのだろう。
908 :
デフォルトの名無しさん :2008/12/09(火) 01:12:18
>>905 ほんとうにどんな環境でも同じ値が欲しければ、
浮動小数点数演算を自前でエミュレートするしかない。
最近DirectX初心者質問スレで見たな。 CPUによってFPUの精度は違うから、適度に補正をかけて細かいところで結果がズレても表面化しないようにすべきって話じゃなかったかな。
>>909 CPUがIEEE 754に厳密に従っていればそこまでする必要もあるまい。
ただ、x86のFPUがそうであるかどうかは果たして……。
>>908 なんか昨日も違うスレで約分のプログラム作った気がするが、まあいいや
fraction normalize(fraction x){ /*約分*/
int a, b, c;
a = x.n;
b = x.d;
if(a<0) a = -a;
if(b<0) b = -b;
if(a<b) { c=a; a=b; b=c; /*aとbを交換*/ }
while(b>0){
c = a%b;
a = b;
b = c;
}
x.n /= a;
x.d /= a;
return x;
}
int main(){
fraction x = {6, 9};
x = normalize(x);
printf("x = %d/%d\n", x.n, x.d);
return 0;
}
>>905 最近のIntelのCPUは80bit精度で浮動小数点演算をして
メモリに書き戻すときに切り捨てするから、
コンパイラの最適化の加減によって結果が変わってくるという現象が起こる。
floatでもdoubleでも起こる。
浮動小数点誤差は回避できないので、誤差が発生することは受け入れて、
プログラムの側をロバストにしてやる方がよい。
たとえば、0.0 から 10.0 まで101回のループを回したければ
比較時に微小な値のずれを加味して以下のようにする
(この場合は整数を使った方がいいけど)。
const double EPS = 1e-9;
for (double x = 0.0; x += 0.1; x <= 10.0 + EPS) { ... }
>>908 narmalize()はそのままでもちゃんと結果が出る。
マイナスの扱いはそれでいいのかという疑問はあるが。
出力がおかしいのはprintfの%dに対応するところに
intじゃないものを渡しているからなので、
>>912 みたいにするといい。
>>905 そのページを参考にvolatileつけたら?
ついでにdoubleにした方がいいと思うけど。
>>905 自分のがデバッグビルドで友人のがリリースビルドなんてことは無いよな?
917 :
905 :2008/12/09(火) 09:29:58
たくさんのご回答ありがとうございます。 DirectXスレで、自分の生き写しのような質問を見つけました。 あちらでも先月話題になっていたようです。 _control87 を使う floatの細かい部分。たとえが小数点以下4位未満を切り捨てる などが対処法のようです。 _control87 については初見ですので、これから調べます。 今夜か明日にでもまた友人とテストできると思いますので、結果を報告したいと思います。 ありがとうございました
/fp:strictもな〜
>>918 そうでした。
ところで早速実験してみたのですが、どうやらDirectXが、初期化を行うと浮動小数点の精度を24bitに変更してしまうようです。
(Direct3Dを使ってはいるのですが、まさかfloatの精度に絡んでるとは思わなかったため、こちらのスレに相談にきたのです。)
これをうけて考えてみると、私の環境でも友人の環境でも、精度は24bitに変更されていることになります。
なので _control87 の呼び出し相当のことをすでにやっていると考えられます。
ちなみにDirectXスレによると、D3Dの初期化の際に D3DCREATE_FPU_PRESERVE を指定すれば精度の変更が行われないそうです。
となると、/fp:strict でズレが回避できるかが今回の課題かなと思います。
920 :
908 :2008/12/09(火) 16:17:20
template<class T> inline void checked_array_delete(T * x) { typedef char type_must_be_complete[ sizeof(T)? 1: -1 ]; (void) sizeof(type_must_be_complete); delete [] x; } というのは何を意図してこの様な書き方をしているのでしょうか sizeof(T)の結果が0だったらエラーにさせるためということで合ってますか? あと、もしそうだったら0になる場合ってどんなときでしょうか
たしか不完全型をdeleteするとデストラクタが呼ばれないというフザケた仕様があった気がする それをチェックして弾くためにやってるんだと思う
923 :
922 :2008/12/09(火) 20:08:43
すまん、記憶違いだった 不完全型のdeleteは未定義らしい でもまぁ目的は一緒だ
924 :
デフォルトの名無しさん :2008/12/10(水) 01:03:27
クラスをDLLにエクスポートして、そのメンバ関数を使ったアプリケーションが場合に、 クラスのメンバを追加したDLLに差し替えてもアプリケーションは安全に動作するのでしょうか? 例えば、 class Test { public: void Hoge(); } というクラスの入ったDLLを、 int main() { HMODULE module; Test* test; module = ::LoadLibrary("test2.dll"); test = reinterpret_cast<Test*>(::GetProcAddress(module, "Testクラス")); if(test != NULL) { test->Hoge(); } ::FreeLibrary(module); } というアプリケーションからロードします。 その後、メンバを追加したDLLと差し替えた場合の動作です。
926 :
デフォルトの名無しさん :2008/12/10(水) 01:20:22
ヘッダファイルにグローバルな変数定義をするときの注意点ってありますか。 そのグローバル変数はプロジェクト全体で参照したいのです。 例えばDLLを作るとき不都合があるとか。
927 :
デフォルトの名無しさん :2008/12/10(水) 01:30:40
自動キー入力をしたい場合はどのように記述すればいいですか? たとえばifをつかってある条件を満たした際にキーボードの右(→)を自動で押されるようにしたいのですが・・・ あとOpenCVに詳しい方いましたら質問したいです。
>>927 押されたと認識させたいウィンドウにキーダウンメッセージをとばす
931 :
924 :2008/12/10(水) 05:14:51
>925 なるほど、複雑な構造のクラスをDLLに入れないほうがいいのですね。 リンクもありがとうございます。 COMは今一よく分かってなかったので、非常に勉強になりました。
Doubleって何て読むの?
ごめんわかったbって小文字のBだ
おいおい、小学生じゃないんだからさぁ……
表示用はC++ + DirectXで 制御用のGUIをpython + wxPythonあたりで作りたいんだけど、 こういう場合って、ソケット通信で制御すればいいんかな? 共有メモリやパイプってのもあるっぽいけど、どうすればいいか良くわかんない。 表示用のウィンドウを子プロセスで起動できたら嬉しい。
>>935 てか、別プロセスにする積極的な理由がないなら
表示部分を DLL にして、python から呼ぶ方が簡単だと思うんだが。
937 :
919 :2008/12/10(水) 16:14:42
floatの環境依存についての報告です。 _control87、_controlfpなどでは問題は解決しませんでした。 念のため毎フレーム呼び出すなどもしましたが…。 同様に、/fp:strictでも問題は解決しませんでした。 現在は、ずれてほしくないfloatに対して x = (float)((int)(x * 1000.0f)) / 1000.0f; とすることで、ある程度回避できるようになりました。 が、やはり稀にずれます。 おそらく、2.000000f と 1.999999f は以前ですとほぼ同一のものですが、今回の補正をかけると0.001fずれることになります。 このずれが原因かと。 最終的には、ずれて欲しくないデータにfloatを使わないという解決方法が必要そうです。
キャストよりfloor使った方がすっきりしそうだな
それはないわ。
だからdoubleで計算しろよ、と。
>>940 頼むからログ読んでから口はさんでくれよっと
Test *ptr; ptr = new Test; ptr->~Test(); ptr = new (ptr) Test(); delete ptr; これは偶然うまく動いているだけですか?
俺には答えられないが、 Exceptional C++ に似たような話がある。
944 :
デフォルトの名無しさん :2008/12/10(水) 22:52:45
struct P { int x; }; とあって P() として一時変数を作ると0で初期化されたものになるんですよね?
>>945 xが0になるかって質問であれば、ならない。
以下のようにすればなるはず。
struct P {
int x;
P():x(){}
}
なる.保証されてる.
>>942 deleteはデストラクタを呼ぶのとメモリの解放までやってるんじゃね?だから
struct hoge{
int* i;
hoge():i(new int(0)){
}
~hoge(){
delete i;
}
};
みたいなやつになって初めて副作用が出るかも
コンストラクタとデストラクタの呼び出し回数記録して出力するのを用意したら解放し忘れはきちんとチェックしきれるかな?
そんな的の外れた努力をするくらいならスマートポインタを使いなさい。
C++/CLI使えばいいお
reference countっていうidiomがあります で、それを実装に利用したのがスマートポインタなんですねーこれが
>>955 未初期化の結果生まれる不定値は危険なバグの元だから。
初期化処理を省きたければ C と同じように書けばいいわけで、
逆に初期化しない理由が無い。
switchの中で配列を作ると↓と言われて動かないです。 どうすればいいですかー? error C2361: 'items' の初期化が 'default' ラベルによって行われませんでした。
caseの中身を{}でブロック化し、その中で変数を宣言する。
case 0: { int a[100]; } みたいに{}でくくるとうまくいかないか?
ブロック
わぁお被った
できたです。どーもです。
自分はこれがイヤだから、switchではなくifで分けるほうが多いな。
>>956 C++/CLIはどうか知らんが、int型にデフォルトコンストラクタなんて
ないし、クラスのコンストラクタで初期化していないのだから、C++
の言語仕様では0にはならんだろ。
それに初期値として0が妥当かどうかはケースバイケース。
見かけ上であればあるよな int x(10);とか int y; y = int(10; とか
y = int(10); とか y = int();
だってクラスだもん
>>956 その説明では納得できないな。
P p; と P() は両方変数を作成する構文なのに
後者の場合だけメンバ変数まで初期化するのに妥当な理由が見出せない。
仕様のどこに規定されている?
>>968 前者は変数を作成する構文で、後者は値を生成する構文。
>>969 組み込み型の話をしてないか?
964や967の言うとおりクラスの話なんだが。
両方ともオブジェクトをインスタンス化する構文だろ。
>>971 ん、ごめん。よく分からないな。
P()は一時「変数を作成」する構文だと思ってるのだけど、
「値の生成」なの?
そこがよく分からなかったので、970で、「それは組み込み型の話じゃないの?」って
聞いたんだけど。
デフォルトコンストラクタとコピーコンストラクタといってくれ
>>972 一時変数ではなくて一時オブジェクトなのだが
どう違うの?
976 :
デフォルトの名無しさん :2008/12/11(木) 22:57:18
ウィンドウズのGUIアプリを作りたいんですが、今の主流はなんですか?WIN32API?
wpf
>>976 フリーソフトやパッケージソフトの類なら、その通りかな
#include<iostream> using namespace std; struct A{int i;}; A ga; int main(){ static A sa; A la; cout << "ga.i = " << ga.i << endl; cout << "sa.i = " << sa.i << endl; cout << "la.i = " << la.i << endl; cout << "ra.i = " << A().i << endl; } 結果(VC2008) ga.i = 0 sa.i = 0 la.i = 2406644 ra.i = 0 普通の変数と一緒だな
>>968 5.2.3の2段落目や8.5の7段落目でT()は値初期化するとなっているが、
8.5の9段落目では、デフォルトコンストラクタを持たない型で
初期化子のないオブジェクトは初期化されないと決められている。
newだと両方の書き方ができるので、分かりやすいかもしれない。
new intは初期化子がないので、初期化されない。
new int()は空の初期化子を持つので値初期化(組込型ではゼロ初期化)される。
イテレータのポインタへの変換ってやっても大丈夫なの? とりあえず動いてはいるみたいなんだけど・・・
>>981 キャストしての変換だったら駄目ぜったい。
&*itなら、vectorならおk、basic_stringも今度から認められる。
配列へのポインタのごとく足したり引いたりしていい。
それ以外のコンテナでの&*itは、単純にその要素へのポインタとしてしか使えない。
cをちょこちょこっとかじってからc++に移行し始め、今まで毎回バグって全然動かなかったDxのプログラムが初めてマトモに動いた イィィヤッッッッホオォォォー * + 巛 ヽ 〒 ! + + 。 | | * + / / + ∧_∧ / / (´∀` / / + ,- f / ュヘ | * 〈_} ) | / ! + ./ ,ヘ | ガタン ||| j / | | ||| ――――――――――――― 誰かに届け、この喜び
>>964 int にデフォルトコンストラクタがあるとか初期値として 0 が常に妥当だとか、
誰もそんなこと言ってないのになんで偉そうに間抜けを晒すかね。
>>982 ありがとう、気をつけるよ
そしてうまくいかないのは別の原因だった罠・・・orz
CString str = _T(test 1 test 2 test 3); CString in = str.SpanIncluding(_T("1234567890")); in に 123 がはいりません_T("")になってます。どうしてですか?
文字列の最初の文字から始まり、pszCharSet. にない文字が出現するところで終了する だった解決した
>>980 ありがとう。規格を読んで全部ではないが理解できた。
PODでは0初期化されるんだな。
そしてnon-POD class typeではデフォルトコンストラクタが呼ばれるから0初期化されないと。
979でstruct A{int i; virtual void Func(){}}; とすると A().i != 0 となったよ。
俺はPODでもこうなると勘違いしてたよ。勉強になった。
しかし、 古いコンパイラだと実際には初期化してくれないことも・・・
void func() { int i; cout << i << endl; } 現実問題、市販フリー問わず現在市場に出回ってるコンパイラで、iの 値が0に初期化されることが保証されるコンパイラってあるのか? 警告レベル上げれば初期化されていない変数を参照しているって警告を 出すけど、ほとんどのコンパイラでiの値は不定だと思うが?
セグメント次第
つぎすれ だれか たのむ
>>995 初期化されると思う方がどうかしている。話題になっているのは、その書き方の話ではない。
千と千尋の金閣寺
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。