【初心者歓迎】C/C++室 Ver.68【環境依存OK】
1 :
デフォルトの名無しさん :
2009/09/17(木) 22:22:59
○
>>1 乙 もうお前に用はない
く|)へ
〉 ヽ○ノ
 ̄ ̄7 ヘ/
/ ノ
|
/
|
/
◤◥◣ ▂ ◢◤▀〓▲▂▐ ▂ ▪ ▂▄▅▆▇■▀▀〓◣▬ ▪ ■…. ▍ ▼ ◥◣▼ .▂▅■▀ ▪ ■ ▂¨ ∵▃ ▪ ・ ▀▍ ◢◤ ▅ ▐◣ ◢◤ ◢▇█▀ ¨▂▄▅▆▇██■■〓◥◣▄▂ ▍ ▅ ◢■ ▍ ■ ▂▅██▅▆▇██■〓▀▀ ◥◣ ∴ ▪ . ▐ ▂ ▐◣ ▐▅▇███████▀ ▪ ∴ ….▅ ■ ◥◣ ▀◣▂ ▀◥▅▆▇████████▆▃▂ ▪ ■▂▄▃▄▂ ◥◣▄▂▄▅▀ ■ ¨ ▀▀▀■▀▀▀ ▪ ■ ∴‥ ↑はUnicode対応のブラウザで見るとコーヒーを吹くプーさんが表示されますが、これを 1.正しく画面に表示する 2.テキストファイルに出力し、再入力してから画面に表示してもやはり正しく表示される 3.出力されたテキストファイルをUnicode対応のテキストエディタやブラウザで表示しても正しく表示される ようにするC++のコードを書いてください。 多くの人にはとても難しいです。
MFC使えば簡単だけど C++標準でやろうとすると死ぬな。
またあやふやなコトを…
たとえAAであってもディズニーキャラはモザイク掛けといた方がよくね?
wchar_t s[] = L"ハート♡髑髏☠DANGER☣";
wcout << s << endl;
wcout.clear();
wcout.imbue( locale( "Japanese" ) );
wcout << s << endl;
んー。動かん。
http://codepad.org/60naQUV5
バイナリモードでやったら
long double を使う必要が出たため、 Turbo C++(2005?)で long double を double へ変換するDLLを作成し、 VC2008EEで呼び出そうとしていたところ、関数コール部分で以下のエラーが出ました。 Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention. dumpbin でチェックしたところ、関数名はあっているようでしたし、 defファイルを作成し、lib /machine:i386 /def: で lib を作ってリンクもしています。 何が問題なのでしょうか?
11 :
9 :2009/09/18(金) 18:00:13
追記です。 libを使用せず、LoadLibrary()を使用しても同じ結果でした。
とりあえず呼び出し規約は一致させてるのか
指定したURLのHPのソースコードを取ってくることは可能でしょうか?
>>13 HTMLソースって意味なら環境依存の方法で可能なことが多い。
15 :
9 :2009/09/18(金) 18:38:19
>>12 libリンクの方だと__stdcallではVCの方でリンクエラーが出ていました。
そのため、libリンク方式の方は指定していません。
LoadLibrary()の方は__stdcallを指定しています。
>>14 C++標準関数でありませんか?
調べると、.NETやMFCなら沢山出てくるのですが・・・
>>13 ブラウザがやってることと同じことをやるだけだな。
HTTPプロトコルに従った手順(テキストベースの送受信)でやりとりして得るだけの話だし
>>16 言語レベルでそこまでの範囲を想定してないから、標準では無い。
非標準で、その手の面倒をみてくれるライブラリは あるかもね
>>15 呼び出し側の 宣言が狂っているんじゃないの?
lib式)
プロトタイプ宣言の呼び出し規約定義はちゃんとあわせてるのか? (マンゲリング抑制も含めて
LoadLib式)
GetProcAddress() の戻りをどうキャストして使ってるんだ?
>>17 ,18
ありがとうございます。
もう少し調べてみます
>>16 C/C++標準は、socket(ネットワーク)を扱えるものは何一つ無い。
どこぞでも書いたが、(Win環境ならwgetを入手して)
system("wget")が一番楽かもしれない。
22 :
9 :2009/09/18(金) 19:28:43
>>19 双方同じヘッダをインクルードして使用しています。
ヘッダ
#ifdef _USRDLL
# define __PORT __declspec(dllexport) /* DLLを作る場合 */
#else
# define __PORT __declspec(dllimport) /* DLLを使う場合 */
#endif
#ifdef __cplusplus
extern "C"
{
#endif
__PORT double __stdcall LONGDOUBLE( void* p );
#ifdef __cplusplus
}
#endif
LoadLib式は以下の通りです。
HMODULE h;
FARPROC p;
double (*func)( void* );
h = LoadLibrary( "longdouble.dll" );
p = GetProcAddress( h, "LONGDOUBLE" );
func = (double (*)(void*))p;
変数 = (int)func( long doubleが入っているメモリへのアドレス );
FreeLibrary( h );
VC++2008と32bitXPを使っているのですが、 64bitのOSにするとint等のビット幅以外になにか変わるところはあるんでしょうか
24 :
9 :2009/09/18(金) 19:35:40
>>19 >マンゲリング抑制
とは何のことですか?
ググってみましたがよくわかりませんでした。
25 :
9 :2009/09/18(金) 19:41:18
>>19 double (__stdcall *func)( void* );
に変更したところ、問題なく動作しました。
ありがとうございました。
>>23 むしろ、intの大きさは変わらない。
変わるのはポインタ・ハンドル・L/WPARAM・LRESULT・size_tなどの大きさ。
これにより、アドレス空間1プロセス4GB(うちユーザが使えるのは2-3GB)という制限が大幅に緩和される。
あと、x86→x86-64だとレジスタの増加で高速化が期待できる。
>>24 extern "C"のこと。
>>26 あれ、そうなんですか。もう少しよく調べてみます
ありがとうございました
多数派はLP64なのにVC++だけは、なぜかLLP64
Windowsプログラミングだと、LRESULT,WPRAM,LPARAMが64bitになっていてはまる場合もある。 LPARAMをlongに代入できないとか。
GetWindowLongPtr使うと警告出されたりとか
>>30 それは/Wp64をオフにすればいいだけ。
もう64ビット対象にばんばんビルドして確かめてくれってことで、
VC++ 2008では/Wp64オフが初期設定となっているから、それにならえばいい。
入出力マニュピレータ endlとか なんで引数どころか()まで省略できるの?
>>32 それらを書くか書かないかで意味が違う。省略できているわけじゃない。
詳しく
35 :
デフォルトの名無しさん :2009/09/19(土) 10:46:35
int a,b,c,d,e;の中にランダムに整数が入ってるものとします。 この5つの中でいちばん数が小さい変数を見つけるにはどうやるのが良いでしょうか?
暗黙のアップキャストを抑制して、明示的にキャストした場合のみ アップキャスト可能にすることって可能でしょうか?
暗黙のアップキャストを抑制する必要性自体がほとんどないし、できなかったと思う。 具体的に必要な場面を示せばなんか方法はあるかもしれない。
>>37 private 継承して BaseType& Base() を用意するとか?
class A; class B : A; func(A); func(B); templateの絡みで、こんな感じに親クラスと派生クラスを オーバーロードした同名関数で処理したいのですが。
>>40 ん?それなら普通にオーバーロードで済まないか?
A, B の例でいいから、今できてるところまでひととおりのコードを貼ってみるといいかもね。
class Hoge {・・・}; int main(void) { Hoge h; h; // ※ return 0; } ※をエラーに(できればコンパイル時)することはできますか?
0除算でもしてみては
C/C++は評価した値を捨てる事ができる言語だからな Pascalとは違う
>>41 オーバーロードが用意されていればキャストされないのですね。
すみませんでした。
>>42 Cだとそういうの警告でるよ
エラーだすの実行時でいいならboolオペレーターっていうのがある
operator bool(){
printf("era-");
return 0;
}
あ、すまん勘違い それじゃboolオペレーターの実行されねーや
>>47 その警告に C と C++ は関係ない。
その operator bool を Hoge に宣言しても h; では呼び出されない。
>>42 のコードって規格ではどういう動作するように決められてるの?無視するだけ?
Carクラスがあるとします Car car1; とオブジェクトを作成するのと Car* pCar; pCar=new Car; とメモリを確保するのと、どういう短所長所があるのでしょうか?
前者はスコープを抜けるときにオブジェクトが自動的に削除される。そして生成廃棄が速い 後者は不要なオブジェクトを手動でdeleteする必要がある。そして生成廃棄が遅い。 なのに、なぜ後者が有るかというと、生成と廃棄のタイミングを自由に操作できるから。
>>53 なるほど、ありがとうございます
グローバル変数ほど長く使いたくない場合に使うんですね
templateの>>を離して書くのがだるいんですがこれはもうどうしようもないんですか?
そんなやならdifineでも使ってみては
>>55 c++0xで正式に実装される。
VC8でもできるから、できるコンパイラを使えばいい。
struct base { virtual void hoge(){・・・}; }; struct sub : public base { virtual void hoge(){・・・}; }; int main(void) { sub s; s.hoge(); return 0; } ↑見たいな感じに書いても仮想関数の検索コストって掛かるもの? 静的に決定できるからコストかからないと思うんだけどどうなんでそか?
>>58 VCで確認したら、sub::hogeを直接コールしてた。
>>58 BCC(ECC6.2.0)もsub::hogeを直接コールしてた
最適化が糞なコンパイラですらこれだから大抵のコンパイラは
出来るだけ静的に解決出来る所はするのではないか
細かな部分で挙動がクソなだけでBCCの最適化は普通に良いよ
gccも直接sub::hogeしてた
みんなテストさんくすこ
というか直接呼ばないようにコンパイルする意味が分からないってレベルだしな まぁでも、確実な根拠があると一応ちょっと安心かな
>>58 VCでこうだと、テーブルジャンプになってた。
sub* s = new sub();
s->hoge();
そりゃそうだろw
それの場合、最適化するコンパイラは無さそうだけどなぁ sが実際に保持している型をコンパイルタイムで追尾しなきゃならないから、処理が 重くなる割には性能向上が全く期待できない(レアケースすぎるから) 規格上、確実にs->hoge()の時点でsのポイントするインスタンスがsub型と確定可能 かどうか、というのもちょっと確信は持てない(newの辺りが特に) まぁ実験するのは面白いかも
ちょっと見た目では、sub::hoge()以外が呼ばれる余地がないと思うけど、 なんか落とし穴でもあるのかね。 最適化されないってのは。
>>70 new が例外起こす場合を考慮すると、s == NULLもあるから
sub::hoge()は呼べないのでは。
つーか new がオーバーライドされてたらもはや何でもあり。
ポインタが実際に指している型を静的に追尾するメリットは、
>>66 のようなコードが
ごく僅かに最適化されるくらいだと思う。
実用的にはメリット皆無に限りなく近い予感。コンパイルも遅くなるだろうし。
>>71 new で例外が発生すれば s への代入も、それに続く s->hoge() の呼び出しも行われない
から、それは関係ない。
需要が無いor真面目に書けば最適化不要、って場合は最適化を期待しない方がいい
s->hoge();の時点でアップキャストもダウンキャストもなく、 正しくsubのインスタンスを指してることをどうやって保障するかじゃない? 人間には簡単に分かる事もコンパイラだと100万行のコードでも同じ動作しなきゃならんと思うとかなり面倒な気がする
vc8だとs.hogeはインライン展開、s->hogeは仮想呼び出し intel c++だとs.hogeもs->hogeもインライン展開された。
流れと無関係にsubという識別子が気になるPerl経験者であった
Intelコンパイラさんマジパネー
>>79 これならほとんどの場合において配列だけの方がメモリ効率はいいよ
開発効率をあげたいなら STL を使うといいよ
目的が、作ることより勉強優先っていうなら苦しむといいよ
void hogehoge(double x0, double x1, double dx, const fugafuga& fuga) { for(double x = x0; x < x1; x += dx) fuga(x); } これを template <class Iterator> void hogehoge(Iterator begin, Iterator end, const fugafuga& fuga) { for( ; begin != end; ++begin) fuga(*begin); } という形にしたいんですけど新しいIterator作る以外になにか手はありますか?
>>80 ありがとうございます。
メモリは、3つのイベントを作るとすると、
配列だと作った数に関係なく 8 * 32 バイト、
ポインタだと 4 * 32 + 8 * 3 で少なくできると思ったのですが。
(4はポインタのサイズ、8は構造体のサイズ、
32はイベントを作れる最高の数)
また、構造体のサイズは、実際のゲームではもう少し大きいです。
その効率の悪さについてググってみたのですが、
連続な領域でない事が関係しているんですかね。
stlはc++の機能みたいですね。
ヒントになる事もありそうなので勉強してみます。
>>81 配列や標準コンテナに入れて呼び出すとかでいいの?
84 :
デフォルトの名無しさん :2009/09/25(金) 15:00:42
環境による
86 :
デフォルトの名無しさん :2009/09/25(金) 16:47:39
staticメンバ関数から 同じクラスの中にある他のメンバ変数(静的か非静的かは問わず)を 操作することはできないのですが どうしても操作したい場合には どういった方法をとることができるのでしょうか?
引数で渡せばおk
staticメンバ関数じゃなくすればOK staticメンバ関数は特定のインスタンスに対する操作ではないので、 インスタンスごとに存在するメンバ変数にアクセスできないのは当然です。 どのインスタンスのメンバ変数にアクセスしたいのかを指定するには、 (1) 通常のメンバ関数にする → this で指定されるインスタンスにアクセスする (2) 引数でインスタンスを渡す → 引数で指定されたインスタンスにアクセスする (3) 別の変数(グローバル変数やstaticメンバ変数)でインスタンスを指定する のどれかの方法で行います。
89 :
デフォルトの名無しさん :2009/09/25(金) 17:54:25
aaa型のabcという構造体を1.txtに書き出しました。 1.txtの内容をabcに代入するにはどうやればいいんでしょうか? #include <stdio.h> #include <stdlib.h> int main() { FILE *fp ; fp = fopen("1.txt", "w"); struct aaa{int a;int c;}; aaa abc; abc.a=500; abc.c=555555; fwrite( &abc, sizeof(aaa), 1, fp ) ; return 0; }
fread()
>>81 その例なら、イテレーターとしてint*が渡せるね
>>89 出来ればfwrite()、fread()を使う時は"wb"や"rb"で開いた方がいいよ
ランダムアクセスする時にcooked modeだとズレが邪魔をするOSがある
94 :
79 :2009/09/25(金) 21:44:42
すいません、別スレで質問したいと思います。 ありがとうございました。
>>89 じゃないんだけどバイナリエディタで読むと
23 7A 08 00
で、
00 08 7A 23
の順で読み込めばいいんでしょうかー?
リトルエンディアンだとそう。 abc.cの部分についてだよね
今のLvだとそこは深く考えなくていいと思うよ。 単純にfreadとfwrite使えばいい。
fprintf(fp,"%lf %lf %lf %lf %lf %lf %lf %lf",a,b,c,d,e,f,g); や cout << a <<" "<< b << setw(1) << c <<" "<< d <<setw(1) << e <<" "<< f << " " g << endl; な感じのタイプ数が多いのを cout << a << b << c << d << e << f << g << endl; こんな具合に書きたいんですが、何かいい方法ありませんか。
ほとんどオブジェクト指向理解してないので、書いてくれるとうれしいでつ
んじゃ、オーバーロード理解してないんで、書いてくれるとうれしいなぁ...
106 :
デフォルトの名無しさん :2009/09/26(土) 00:33:22
>>92 どこかで聞いたような単語を、意味も知らずに偉そうに使って
恥ずかしくないですか?
Class* a; と Class *a; の違いがわかりません。 両者は使い分けないといけないものなのですか? それとも一方にそろえるべきものなのですか?
どこにホワイトスペースを挟もうと違いはない。
>>107 Class* a, b; と書いたら
Class *a, *b; という意味にはならず
Class *a, b; という意味になるので注意
それだけ気をつけていればどちらで書いてもOK
>>92 cooked modeという言葉を初めて知ることができてよかった。
けどバイナリに対する言葉はアスキーもしくはテキストと言ったりしない?
>>110 まあどっちでもいいんだけどな
バイナリモードに対応するのはraw mode
MS/DOS、Windowsのみに存在する区別らしい
Linux、UNIXには区別は存在しない
fopen()のtとbは、raw とかcookedとか言わないだろ。
頭の中でわかっていればいいんだよ 他人に伝える時はテキストとバイナリと言うべきだけどな
まぁMS-DOSが懐かしくはあった
素人がインストロールとか言ってたら、ネタにして笑ってるくせに。
cooked mode という用語は、 一般的には端末入出力、特に入力時に 編集した結果を受け取るのではなく Enterやカーソルキーなどの、生の情報を受け取るために使う。 ファイルの\r\n変換に使うことなど、まず無い。 なぜならば、そもそもファイルのベタなデータを 「行」という単位で扱おうとしていること自体 「生のままで扱っていない」から。 \r\n変換のことを cooked mode なんて呼ぶと 陰で笑われるから、気をつけたほうが良いよ。
望むところだ
>>115 その例が同質のものだと思ってるなら、お前の頭もネタにして笑われるレベルだな。
知ったかして恥ずかしい用語の使い方してるってだけのくせして、なにとりつくろってんだ。
120 :
デフォルトの名無しさん :2009/09/26(土) 11:00:53
Linux環境でP2Pボイスチャットを作りたいのですが、C++のオーディオに関する知識がまったくないので、 どのライブラリを使えばいいのかわかりません オーディオストリーミングに適したライブラリがあれば教えてください
>>120 背伸びするのはいいんだけど、背伸びしすぎじゃねーの
オーディオだけじゃなくて、ストリーミングもP2Pの知識もないんだろ?
関数についてですが、void aaa();と宣言したあと、 main関数の中でもう一度void aaa();sと書くのは、もう一度プロトタイプ宣言をしていると言うことでしょうか? またこのように、サイトなどからコピーする時に、よく型をつけたままコピーしてしまい不具合が起きてしまいます。 これを防ぐ方法はないでしょうか? void aaa(); int main() { void aaa();///←ココ return 0; } void aaa(){return;}
>>122 関数内の void aaa() は外にある宣言を繰り返していることになる。
ちなみに引数リストが空の宣言は「プロトタイプ宣言」とは言わない。
2つ目の質問は、「型をつけたままコピー」と「不具合」が何のことかわからん。
>>108 , 109 ありなとう
ひところから急に Class* な表記が流行りだしたような気がしてたから
ちょっと気になってたんですが、自分の好きなClass *表記で気にしない
ようにします。
C/C++の形態論的にはClass *a;という書き方のほうが整合性が取れているように 思う。意味論的にはClass* a;のほうが相応しいと思う。文法的にはClass*a; でも構わないけどw まあ、好みで。自分はClass *a;。
template <class T> struct add_pointer{ typedef T* type; }; add_pointer<some_class>::type psc; これが正解だからこれからはこれを使うように
俺はClass* a;だな
「Classのポインタ」という変数aって感じがいい
>>109 みたいな問題があるけど、1行で複数の変数を宣言しなければいいんだし
Class *p;とClass* p;はどっちでもいいけど、 Class &r;はなんかいやだなあ。
>>129 どっちかっていうと、Classへのポインタ
Class * ptr;派が一人もいないことに絶望した
それってなんか掛け算っぽくね? 完全に独断と偏見だけどさ。
依存名だと掛け算優先だね
>>123 > ちなみに引数リストが空の宣言は「プロトタイプ宣言」とは言わない。
そなの?
>>135 C の場合、引数リスト無しの関数宣言 f() は f(...) と同じで、呼び出し時に引数の型は
チェックされない。一方プロトタイプ宣言といえば以下のもの。
ISO C 6.2.1 p2
> (A function prototype is a declaration of a function that declares the types of its parameters)
(関数プロトタイプとは関数の宣言で、その引数の型を宣言するもの)
C++ の場合、引数リスト無しの関数宣言 f() は f(void) と同じで引数を取らないことを
宣言するが、 C++ には引数の型を宣言しない関数宣言というものが無いので、そもそも
関数プロトタイプというように呼び分ける必要が無く、すべて単に関数の宣言と呼べばいい。
34へぇ
65へぇ
unicodeを扱おうとワイド文字列型(wchar_t)に入れようとしましたが、うまくいきません どこが間違っているのでしょうか・・? int main() { wchar_t aaa[]="テスト"; return 0; }
int main() { wchar_t aaa[] = L"テスト♥"; wcout << aaa << " : " << aaa << endl; return 0; }
142 :
デフォルトの名無しさん :2009/09/27(日) 04:32:31
ありがとうございます
143 :
デフォルトの名無しさん :2009/09/27(日) 08:26:21
>>121 ストリーミングもP2Pも理論的には解っていますが、作った事はありません
P2Pボイスチャットを作るのは大変だとわかっていますが、大学の課題なので
何とか完成させたいのです
よろしくおねがいします
よしくです int Row = 10; int Col = 20; std::vector<std::vector<int> > Array(Row, std::vector<int>(Col)); このように書くことで、2次元int 型のvector コンテナが定義できますが 他の型、(list やmap、独自クラス)でも2次元のコンテナを作りたいのですが templae を用いて、汎用的にしたいのですが、どのように書いたらいいでしょうか。 よろしくお願いします。
>>144 template template パラメータを使うことが考えられる。
現行の C++ では template template パラメータの引数の数を固定しないといけないから、
使う側で専用の template メタ関数を用意しないといけないかもしれない。
#include <vector> #include <list> template < template <class, class> class Cont, class T, template <class> class A = std::allocator > struct Table { typedef Cont<Cont<T, A<T> >, A<Cont<T, A<T> > > > Type; }; int main(void) { Table<std::vector, int>::Type vec2d; Table<std::list, int>::Type lst2d; /* ・・・ */ return 0; } templateはよくわからんがこんな感じ?
>>144 です
>>146 Thxです
使い方としてはこんな感じでしょうか?
vec2d[10][10];
vec2d[0][0] = 100;
int i = vec2d[0][0];
std::cout << i << std::endl;
でもこれだと、Out of range で落ちてしまいますが?
セマンティクス的に間違ってるんだろうか?
>>147 デフォルトコンストラクタが走っただけじゃ空なんだから、当然だろ。
>>144 だが
More Effective C++ に載ってたので終了。
kwsk
Proxy Classだろjk でもlistで二次元配列作ると疎行列以外の用途では やたらと速度が遅くなっていかんな
二次元配列なんて配列かvectorぐらいでしか使わんような気がするんだが本当に凡化する必要はあるのか
数値ならvalarray使ったほうがいいし キーとレコードならmap使ったほうがいいし 生の二次元配列を使うことは少ないな。
>>144 です
最近template 中毒に冒されいて、どうして汎用化できるだろうかと、気になってしょうがないw
MESTLにもコンテナの汎化は基本的に悪手と書いてあったな どうしてもやるならアダプタかませてインターフェースを調整しないといかん
VS2008C++使っています 別のアプリケーション(メモ帳)にsendkeyで入力したいのですが、どうすればいいでしょう? 何とか↓まで調べたのですがこの先が良く分かりません。知ってる方いましたらお願いします。 #include<iostream> #include <conio.h> #include <windows.h> using namespace std; int main() { wcout.imbue(std::locale("")); HWND qqq = FindWindow( L"[Edit]", // クラス名//1つ目不明点 L"1.txt - メモ帳" // ウィンドウ名 ); SendInput( 1, // 入力イベントの数 LPINPUT pInputs, // 挿入する入力イベントの配列//2つ目不明点 int cbSize // 構造体のサイズ//3つ目不明点 ); return 0; }
win環境で、exe側からdll側に関数インターフェースを提供する場合、 exe側で関数をexportして、dll側でGetModuleHandleするのが唯一の方法でしょうか?
>>156 VC++ なら普通SendMessageやPostMessage が無難だと思うぞ、ぐぐれば事例が沢山あるし
>>157 試してないけど
Dll側にSetFunc()を作ってExe側から関数ポインタあげたら?
161 :
デフォルトの名無しさん :2009/09/28(月) 17:03:06
インクルードするとエラーが出ます。これはどういうことでしょうか・・? #include <iostream> #include <string> #include <fstream> #include <windef.h> #include <windows.h> using namespace std; int main(){return 0;} 1>------ ビルド開始: プロジェクト: no, 構成: Debug Win32 ------ 1>コンパイルしています... 1>a.cpp 1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(5545) : error C2146: 構文エラー : ';' が、識別子 'ContextRecord' の前に必要です。 1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(5545) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(5545)
162 :
デフォルトの名無しさん :2009/09/28(月) 17:03:48
: error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11263) : error C2065: 'PCONTEXT' : 定義されていない識別子です。 1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : error C2146: 構文エラー : ')' が、識別子 'ContextRecord' の前に必要です。 1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : warning C4229: 旧形式が使用されています : データの修飾子は無視されます。 1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : error C2182: 'RtlCaptureContext' : 'void' 型が不適切に使用されています。 1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : error C2491: 'RtlCaptureContext' : dllimport データ の定義は許されません。 1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : error C2059: 構文エラー : ')' 1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(12935) : error C3861: '__readfsdword': 識別子が見つかりませんでした 1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(1020) : error C2146: 構文エラー : ';' が、識別子 'LPCONTEXT' の前に必要です。
163 :
デフォルトの名無しさん :2009/09/28(月) 17:06:20
1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(1020) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(1020) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(4015) : error C2061: 構文エラー : 識別子 'LPCONTEXT' 1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(4023) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(4023) : error C2143: 構文エラー : ',' が '*' の前にありません。 1>ビルドログは "file://c:\Documents and Settings\user1\デスクトップ\sdk\Debug\BuildLog.htm" に保存されました。 1>no - エラー 15、警告 1 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== 以上です。分かる方、お願いします。
164 :
デフォルトの名無しさん :2009/09/28(月) 17:15:02
環境を書き忘れました VS2008 C++です。よろしくおねがいします
ふと思ったのですが *++p = 'a'; *++p = 'a'; *++p = 'a'; ... と *p++ = 'a'; *p++ = 'a'; *p++ = 'a'; ... はスピードに違いがありますか。 つまりインクリメントとデクリメントで速度が変わったりしますか。 どちらも1を足すというのはかわりませんが、こっちのほうが効率のよいバイナリが生成されるとか そういうのがあれば教えてください。
>>165 環境の提示がないので一般論として考えると、2行目と4行目はインクリメントするタイミングが違うだけ。
6行目はインクリメントとデクリメントの違いだけ。
いずれにしても、有意差が出るほど阿呆なコンパイラも環境もないと思うがね。
まあ、一般的な(前置|後置)(インクリメント|デクリメント)の速度の違いだけに 着目してるんじゃないかな。 どうも、前置|後置とインクリメント|デクリメントを混同している節が 見受けられるが……。
>>161 #include "stdafx.h"
あと氏ね
まるちスレッドの割り込みって最短でどこまで割り込まれるんですかね? void func() { line1; line2; line3; } int main(void) { line4; func(); line5; return 0; } 上の例で言ったらline4とfunc()の間、func()とline5の間まで割り込まれる? それともline1、line2、line3の間でも割り込まれる? 1行が終わる間に割り込まれることはある? a = b = c = d;としたらどこかで割り込まれる可能性はある?
> a = b = c = d;としたらどこかで割り込まれる可能性はある? a = 100; みたいに代入一個でも、アセンブラだと2命令以上になることがあるんで、代入中に割り込まれることもある。
>>170 行とか演算子とか無関係に割り込まれる。
すなわちb=a+3;の実行中にaを読んでbに書き込む間でも割り込まれる。
さらにa++;の実行中にも割り込まれる。
さらにマルチプロセッサだと1命令の実行中でも割り込まれる。
>>169 ありがとうございました。すいませんでした。
割り込まれまくりなんですね・・・ そうなるとmutexを取得する関数の途中で割り込まれると バグの元になりそうな気がするんですけど大丈夫なんでしょうかね?
>mutexを取得する関数 システムコールなので不具合は起きない
mutexを含むマルチスレッド同期ライブラリは、「このように呼び出すとここから ここまでは割り込まれないよ」とかそういう細かい仕様がいちいち決まってるので、 それを調べて使うもの。
画像の任意回転、画像を表示したあとその上に場所指定して画像を合成etc・・・ をCで作る課題が出てるのですが、助けになるような参考書・サイト等ありませんでしょうか お願いします
ググレカス^^
DXライブラリでおk
183 :
デフォルトの名無しさん :2009/09/29(火) 01:49:49
DXライブラリが手っ取り早いな
DXライブラリ使えばいいと思う
DXライブラリがいいね
>>166 ありがとうございます。違いはないとのことで安心しました。
>>168 >どうも、前置|後置とインクリメント|デクリメントを混同している節が
>見受けられるが……。
その通りでしたorz 無知をさらして申し訳ない
>>186 プリミティブ型ならいいけど、クラスに対する前置後置はだいぶ効率に差ができるから注意しよう
×だいぶ効率に差ができるから ○効率に差ができる場合もあるから
別人だがkwsk
詳しくも何も、後置は原理的に重くなりやすいのが一目瞭然じゃないか? クラスじゃないなら、見た目の好みとかで後置にしても最適化で前置に置換されることが 期待できるけど、統一感を求めるなら、必要が無い限りは前置で統一した方がいいだろうね。 クラスの時は勝手に最適化で前置に変えたりできないから。
別にクラスじゃなくて構造体でも演算子オーバーロードしていれば同じことだけどね。
クラスと構造体は本質的には同じものだよ
クラスと構造体はほぼ同じだからいちいち説明する必要も無いと思うが
かぶったし
共用体とか持ち出してくればまだ芸があったかも。 でも余計うざいだけか。
>>189 むかしむかし、後置だとインクリメントする前の状態をどこかに保存しておかないといけないのであったとさ
197 :
デフォルトの名無しさん :2009/09/29(火) 15:34:40
で?
今は技術が発展しているのでそんな事はありません 科学万能の時代が到来したのです
it_a = it_b++ とかやったらちょっと面倒なことになる。
自分で調べろw
ググったけど、出てこない。
>>196 の言いたいことが分かったかも。
後置演算子のオーバーロード方法が無いとcallerが保存しなきゃならなかった、ってことが
言いたいんじゃないのかな。
ところが、普通に考えたらcallerが保存しなくてもcalleeでは保存するコードを書くことに
なるから、端から見ると
>>196 が何言ってんだか分からない人状態に。
一方
>>196 は、intを引数にすれば後置になるの知ってるの俺だけかよプゲラッチョ、とか
一人でいい気分になっていた、とか。
単にreturnの後に処理を入れられないという 言語制約上の問題でしかないね
>>206 何が言いたいのか分からん。
最適化されない限り、前置の方がコストかかるのは当然で。
>>196 のだめなところはツッコミがあるように、むかしむかし、というのを付けてしまったとこ
209 :
208 :2009/09/29(火) 23:03:59
あああ。前置じゃなくて後置ね。
なんだ、やはり、「むかしむかし」が余計か。豪快に釣られたぜw 前置/後置のオーバーロード時の注意点は知っていたが、規格が変わったのかと焦ったぜ。
誰か円形のHPゲージの描画の方法を教えてくれないか・・・? 細い棒の画像を何回かループさせて徐々に角度をつけて 描画しようと思ってるんだがいまいちうまくいかん。
pie関数でいけるんでないの。
pie関数って何ですか?
塗りつぶし円弧を描画する関数
それがわからないから聞いているのですが
え?塗りつぶし円弧が分からないのか?おうぎ形のことだよ。 それで円形のHPゲージの描画ができるとは思えないといってる? もうちょっと具体的に書いてくれないか
いまいちうまくいかん程度ならもうちょっとがんばればできるよ その方向でがんばれ
その塗りつぶしの円弧の描画のソースを C++暦半年の俺がわかるように教えるんだ!
219 :
デフォルトの名無しさん :2009/09/30(水) 04:46:25
Intelコンパイラでコンパイルする際に、#pragma ivdepを使っているのですが、 他のコンパイラでコンパイルした際に、不明なプラグマと警告が出てしまいます。 OpenMPだと、 #ifdef _OPENMP #pragma omp parallel for #endif の様に書いてやれば、対応していないコンパイラで警告を出さないようにできますが、 上記のような場合どのようにしたらよいのでしょうか?
警告抑制
?
>>218 環境
>>219 intelコンパイラであるかどうかをifdefで判断すればよいということ。
224 :
(マルチポスト) :2009/09/30(水) 06:15:36
的外れは質問かもしれませんが C++で作られたローカルのプログラムのWinsockからPHPのサーバのプログラムと通信することはできますか?
PHPで書こうと思ってるサーバープログラムです
なんで出来ないと思ったん?
>>215 WindowsAPIとかGDIとかでググレ
>>215 ぶっちゃけるとアニメーションモデル読み込んで再生して終り
中身はHP0〜100%(t=0〜1)までのアニメーションでデザイナに作っておいてもらって
プログラマはHPに応じてアニメーションを進めるだけ
>>226 PHPでサーバープログラム?
Webサーバに置くスクリプトじゃなくて?
ここでいいか分からないんですが質問させてください
ちょっと特殊なWindowsプログラミングについてです
いわゆるKERNEL32→LERNEL32の方法で
msvcrt.dllの関数をフックしたいのですが
作成したDLL(仮にXXVCRT.DLLとします)を対象のアプリケーションで
使用するとクラッシュしてしまいます
簡易なテストアプリを作成してXXVCRT.DLLをLoadLibraryして
GetProcAddressでsprintfやmalloc/freeを使う限りは問題ありません
落ちている場所はおそらくRtlEnterCriticalSectionの内部のようで
対象のアプリはマルチスレッド使用なのでそのあたりかとは思うのですが…
XXVCRT.DLLは基本的に
http://ruffnex.oc.to/kenji/text/listexport/ の方法で作成しています
開発環境はもちろんVC++6.0で標準ライブラリは無視にしてます
なお、対象のアプリはおそらくMinGWでビルドされています
http://www.codeproject.com/KB/system/api_spying_hack.aspx ではmsvcrtは特殊であるようなことが書いてありますが
msvcrtのフックはできないものでしょうか?
ヒントやURLを提示していただけるだけでも構いません
より適切なスレがあれば誘導して頂けるのもありがたいです
なにか情報をお持ちの方、お教え願えないでしょうか
質問です。 boost::spirit です。 rule<> expr = uint_p | real_p; parse_info<> pi = parse("10.0", expr); これで、pi.full == true とならないのですが、どうしてでしょうか。 Win7x64 VC++9 boost1.40.0
>>231 改造とかクラックとかそういうスレないの?
>>232 real_pとint_pを入れ換えて味噌
235 :
232 :2009/09/30(水) 18:42:37
>>234 ありがとうございます。
もともと uint を先に持ってきたのは、大きな整数を入力すると、double の精度を
超えた値が丸められてしまうのを防ぎたかったんです。
コードを書き直しました。
bool is_real_value;
double real_value;
unsigned __int64 uint_value;
void IntAction(unsigned __int64 v) { is_real_value = false; uint_value = v; }
void RealAction(double v) { is_real_value = true; real_value = v; }
int main()
{
rule<> expr = (uint_parser<unsigned __int64>()[&IntAction] | real_p[&RealAction]);
parse_info<> pi;
pi = parse("1.0", expr);
ASSERT(pi.full); ASSERT(is_real_value); ASSERT(real_value == 1.0);
pi = parse("12345678901234567890", expr);
ASSERT(pi.full); ASSERT(!is_real_value); ASSERT(uint_value == 12345678901234567890);
pi = parse("123", expr);
ASSERT(pi.full); ASSERT(!is_real_value); ASSERT(uint_value == 123);
}
このコードのままだと、"1.0" の解釈で失敗し、uint_p と real_p を逆にすると、すべて
real として処理されてしまい、ASSERTで止まりまくります。何がおかしいんでしょうか。
236 :
デフォルトの名無しさん :2009/09/30(水) 19:29:42
http://draconux.free.fr/download/os-dev/linux0.01/linux-0.01-rm-3.x/linux-0.01-rm-3.3.tgz このソースコードをmakeしたのですが、
ld -s -x -M -Ttext 0 -e startup_32 boot/head.o init/main.o \
kernel/kernel.o mm/mm.o fs/fs.o \
lib/lib.a \
-o tools/system > System.map
kernel/kernel.o: In function `scrup':
console.c:(.text+0x1ed6): undefined reference to `columns'
console.c:(.text+0x1fad): undefined reference to `columns'
kernel/kernel.o: In function `scrdown':
console.c:(.text+0x2023): undefined reference to `columns'
make: *** [tools/system] Error 1
というエラーが出てコンパイル出来ません。
このエラーを解決したいのですが、どのようにすればいいでしょうか?
237 :
234 :2009/09/30(水) 19:39:19
>>235 最後まで到達できないのは、rule<> exper=uint_p|real_p;のuint_pでパースが10で成功し、exprが成立するため。そこでパースが終わってしまう。
防ぐには以下の方法がある。
strict_real_pを使うと小数点が無い実数にはマッチしなくなる。
longset_d[P]...を使うと最大長マッチが採用される。
eps_p(P)を使って区切りまでパースしたかを確認できる。
238 :
232 :2009/09/30(水) 19:51:54
>>237 strict_real_p | uint_p で出来ました。
大変助かりました。
239 :
デフォルトの名無しさん :2009/09/30(水) 20:00:38
>>236 ですが、
開発環境は、Ubuntu,gcc4.1です。
>>239 いや、だから columns について調べるべきでしょう。
241 :
デフォルトの名無しさん :2009/09/30(水) 20:26:26
>>240 調べたのですが、解らなかったのでこちらに来ました。前のスレのほうで環境依存スレに行ったほうがいいと言われたというのも一つです。
console.c内にて
#define COLUMNS 80
static unsigned long lines=LINES,columns=COLUMNS;
として定義及び宣言があり、どうしてcolumns変数が出てくるのかが全くわからないのです。
TCHARからwchar_t *に変換(キャスト)するにはどうしたらよいですか?
なぜそういうことする必要があるか知らんが… TCHAR ch; // ... wchar_t *p = (wchar_t *)ch;
>>243 あ、そのままでよかったんですね^^;
センキュー
>>244 だめだよ。
TCHAR* ch;
// ...
wchar_t *p = (wchar_t *)ch;
なら、いい。
あと、最近のVCは_UNICODEがデフォになってるけど、
古いやつだったら、_MBCSがデフォだから、もしそうだったら、
単純にはキャストできない。
static unsigned long lines=LINES; static unsigned long columns=COLUMNS;
デスクトップの画像はどういう風に取得すればいいんでしょうか? 事務仕事をほぼ全自動でできるようなソフトを作ってみたいと思っているのですが、 とっかかりがつかめません bitmap形式などは何となくわかったのですが、肝心の画像自体の取得方法が分かりません APIを使うような感じはするのですが、見つかりませんでした 分かる方、教えてください。お願いします
>>247 GetDC(HWND hWnd);
で、0を渡せば、画面のデバイスコンテキストが取れたような記憶が。
>>248 >>249 ありがとうございます
既にあったのですね、トホホ
なんだか悔しいので、とりあえず作るだけ作ってみることにします
別に止めはしないが、とても「事務仕事をほぼ全自動でできるようなソフト」を作ろうとする人間の台詞じゃないな。
そもそも、「デスクトップの画像」と言う当初の質問が自動化とどう関係しているのだろうか
スクリーンショットを使う事務作業なんていくらでもあると思うけど
254 :
232 :2009/10/01(木) 12:57:19
boost::spirit でまた躓いてしまいました。 parse_info<> pi; pi = parse("12.", real_p); // 12. ドットに注意 ASSERT(pi.full); ASSERT(pi.length == 3); // 止まる。実際は 2 が入っている。 pi = parse("12.", longest_d[real_p | int_p]); ASSERT(pi.full); // 止まる デバッガで追うと、確かにドットの後に数値が無ければ、length はインクリメントされてないんですが、 scanner の first (scan.first) はドット文字の次を指したまま return しています。 length と 実際に進めた幅とが一致しない状態というのは許されるんでしょうか?また、上の二つの parse で、下は失敗するのはおかしいと思うのですが、勘違いでしょうか? Win7x64 VC++9 boost1.40.0
255 :
デフォルトの名無しさん :2009/10/01(木) 14:53:49
>>246 申訳ないですが、その書き方ではエラーを解決出来なかったので
グローバル変数として宣言しましたところ、一応はコンパイルが出来ました。
256 :
デフォルトの名無しさん :2009/10/01(木) 19:44:19
環境はMac OS X 10.5 & Xcode 3.1 (gcc 4.0)です PreProcessor Macros でマクロを設定してコンパイルはできたのですが 実行すると#ifdef〜#endifでかこった部分が実行されていません どうすればよいのでしょうか?
>>256 ifdefで指定してるものがdefされていなかったんでしょう
unary_functionやbinary_functionってなんのためにどうやって使うんでしょうか?
260 :
デフォルトの名無しさん :2009/10/02(金) 00:36:59
VS2008SP1なのですが、取りあえずboostを試してみようと思い、 #include <boost/asio.hpp> をソースに書いてみただけでコンパイル時間が1秒→15秒になってしまったのですが、 こういうものなのでしょうか?
>>260 ありえん話ではないです。
というかメモリ少ないとかじゃないの?
または、ソースごとに毎回includeされててpchも使ってないとか。 もちろん、メモリ不足がまず疑われるが。 VS使うならpchは覚えた方がいいな。使ってないなら、だけど。 でかいプロジェクトでBoostバリバリ使ってたりすると、コンパイル時間が普通に 1/20以下くらいになっても不思議は無い。
巧く言えないんですが、昔、VC6.0とDirectX7を齧って終わっただけのプログラミングを、今更始めようと思いました。 今の状況は ・持ってるのは、Visual Studio 2005 Standard Edition ・作りたいのは、Windowsのゲーム ・使いたい言語は、C/C++ ・使いたいライブラリは、DirectX 8.x、もしくは、DirectX 9.x こんな具合で ・Visual Studio 2005 に関する初心者向けの情報 ・DirectX 8.x or 9.x に関する初心者向けの情報 この二つに関する情報が欲しいと考えています。 本であれば本で、webであればwebで、どんなものがいいのか、教えて頂ければ幸いです。 どうか、よろしくお願いします。
>>263 VS2008ExpressEditionに移行しちゃってもいいんじゃね、タダだし
>>261-262 メモリの空きはまだまだあるのですが、
includeしてるソースを少し弄ってコンパイルすると、また10秒とかマタされます。
pchを使うと確かに早くなりますが、pchを使えない環境だと毎回こんなに待たされているんですかね?
これはヘッダーへ実装も書いてしまうことの、弊害?と考えても間違いないでしょうか?
そのままではコンパイルが遅いからpchが発明されたとは考えられないかね?
メタプログラムのライブラリだからそうなるのは仕方ないな
VC++で簡単なwebクライアントを書いたんだけど、うまく動かない。
誰か教えて
http://kissho.xii.jp/1/src/1jyou92844.cpp これを
MyUtil->GetHttpContent( &content_data, &content_size, "yutori7.2ch.net", "/news4vip/dat/1254469638.dat", 1024, 5 );
で呼ぶと、116行目の
select_result = select( 0, &tmp_fd_set, NULL, NULL, &timeout_tv ); // タイムアウト付き待機
でタイムアウトする。
試しに
MyUtil->GetHttpContent( &content_data, &content_size, "jane.s28.xrea.com", "/bbs/dat/1249509078.dat", 1024, 5 );
で呼ぶと、即座にコンテントが返る。
272 :
271 :2009/10/02(金) 19:09:08
vipのスレをリクエストした時の送出ヘッダをtelnetで # telnet yutori7.2ch.net 80 GET /news4vip/dat/1254469638.dat HTTP/1.0 Host: yutori7.2ch.net User-Agent: Monazilla/1.00 Connection: close として送出しても、当然即座にコンテントが返る。 なんとなくvipのケースではリクエストが完了してない気がするけど、どこがまずいのかよく分からない・・・('A`)
普通にコンパイルに1時間以上かかる状況では何秒増減しようと大して変わらん
>>268 boostのヘッダーをインクルードしただけではそんなにまたされない。
ヘッダーに実装を書くとテンプレートのインスタンス化がされる場合がある、そのヘッダーをインクルード
しただけでコンパイル時間がのびる。無用なインスタンス化がされないようにヘッダーに実装は書かないほうが良いよ。
テンプレートをtypedefしただけでもコンパイル時間は延びる。
自分でWeb鯖たてて実験するのが楽なんでない?
276 :
232 :2009/10/02(金) 20:14:08
>>267 やっぱ変ですよね?
ありがとうございました。
>254のは初出だと思うけど、これ以外にもSpiritは結構バグあるみたいよ。Treeとか。 V2に期待ってことかね。
>>269-270 やはりこういうものなのですね
>>274 asioの場合は空のcppへinclude書いただけで10秒近くになってしまいました。
っと今また計ってみたら8秒だた・・・
それでも私のような、書き直してはビルドの初心者にはきついですね。
大人しくpchを使っていこうと思います。
ありがとうございました。
うわ、asio重たいな。こんなのもあるんだな。 boostは無条件にpchに放り込んでたから気づかなかった。
280 :
デフォルトの名無しさん :2009/10/03(土) 00:09:21
C/C++に直接は関係ないですが質問させてください。 1の補数、2の補数という言葉がありますが、 なぜこのような名前になっているのか教えてください。 (意味は知っています) 1、2 という数字に意味があるのでしょうか?
まったくだ。 2の補数と単に言った場合、それが2種類あることも分かっていないんだろう
3進数における2の補数のことは考えなくてもいいと思うけどな。
>>280 自己解決しました。
1の補数
各桁ごとに1の補数をとる
2の補数
2^nの補数をとる
1と2の意味が全く異なる上、
2じゃなくて2^nのことだし。
酷い用語が万延したものだ。
文字列についてなんですが 文字列の最後の文字を削除する場合ってどうすればいいんですか? それっぽい関数が見当たらなかったんですが、皆さんどうやって処理するんでしょうか
void cut(char *str){ str[strlen(str)-1] = '\0'; }
あら、縮まってなかった。
>>286 ありがとうございます。
文字列の方は、最初から[10]と決めているんですが、この場合動的に管理しないと無理ですか?
>>288 ポインタそのものは変化しないので静的配列でもOK
290 :
271 :2009/10/03(土) 12:18:05
自己解決しました・・・(´・ω・`)
自家発電しました(´・ω・`)
自殺しました(´・ω・`)
自乗しました
自損しました(´・ω・`)
struct hoge { inline int operator [] (int i) { return a[i]; } int a[10]; } ↑のinlineって生の配列アクセスまで最適化されますか?
コンパイラ次第だが期待していい。
環境VC++ 2008 Expressです。 配列 *points1 = メモリ確保した。 *points2 = メモリ確保した。 for ( i = 0; i < numPairPoints ; i ++) { points1 から始まる配列にxとyを代入する。 points2 から始まる配列にxとyを代入する。 } コード自体はとても簡単な処理なのですが、 デバッグしていると、i がある程度(デバック実行の度常に同じiの値)増えた後に、 何故かpoints2(のみ)の内容が書き換えられ、メモリアクセスエラーが起こしています。 こういうことが起こる場合にはどこでなんとかすべきなんでしょう? points1の処理は通ってpoints2が途中でだめなのでコード外の要因だと思うのですが・・・ よろしくお願いします。
opencvなので簡略化しました。 書いてるコードはこんなんです。 CvMat* points1; CvMat* points2; points1 = cvCreateMat(1, numPairPoints, CV_32FC2); points2 = cvCreateMat(1, numPairPoints, CV_32FC2); for ( i = 0; i < numPairPoints ; i ++) { CvSURFPoint* r1 = (CvSURFPoint*)cvGetSeqElem( objectKeypoints, ptpairs[i*2] ); CvSURFPoint* r2 = (CvSURFPoint*)cvGetSeqElem( imageKeypoints, ptpairs[i*2+1] ); //略 points1->data.db[i*2] = r1x; points1->data.db[i*2+1] = r1y; points2->data.db[i*2+1] = r2y; points2->data.db[i*2] = r2x; }
>>284 おー昔のコンピュータの数値は整数ではなく
[0..1) の固定小数点数を表していた
と言えば後は分かるだろ
>>300 [0, 1) のことだったら
2の補数は1の補数と呼ばれなくてはおかしい。
[0, 2) の固定小数点数だとしても、
1の補数の方は各桁の1の補数であることは変わらない。
いずれにしろおかしい。
302 :
デフォルトの名無しさん :2009/10/03(土) 20:15:38
C言語勉強し始めたド素人ですが質問です エディタにVisual c++2008使ってるんですが ファイルを作成する場合、まずはプロジェクトの作成→ソースファイルの作成らしいですが 1つのプロジェクトフォルダに別々のソースファイルを保存することはできないんですか?
>>299 opencvと言うのは知らんが、
単純に確保している領域をオーバーしてるんじゃないの?
>>302 メニューのプロジェクトから、新規項目の追加とか既存項目の追加とか。
>>304 新規項目で別のソースファイルを作れるんですが
ただ、コンパイルするときビルドエラーとかになるんですよね
>>302 >別々のソースファイルを
main()を2つ書いてるとか?
もしそうだったら、プロジェクトの追加をするんだ。
プロジェクト上から見えてるmain文が一つだったらいくつソースファイルがあってもおk
>>299 何の関数か知らんけど、cvCreateMatの第1引数と第2引数を入れ替えてみそ
構造体というものは、配列の範疇に入るんでしょうか? メモリだけ見れば似たような感じなのですが
"構造体"の"配列"もあるからどうかな...
普通は範疇には入れないよな。 文脈によるけど。
どうせ全部ビット列だと割り切れば同じ扱いをしても違和感ないか。 面白い視点だな。
構造体はメンバ間でパディングかかるけど 配列は隙間無で詰めないか?
316 :
311 :2009/10/03(土) 22:55:02
どこで見たのかは忘れたのですが、構造体を配列と書いてるところがあったので気になって質問させていただきました もしかしたらサイト管理者の間違いかもしれないので、あまり気にしない様にします。ありがとうございました。
パディングパディング言うけどさ その空いた領域にほかのデータが書き込まれる可能性ってあるの?
ない
ないあるよ
パディングって何だと思ってるの? >317 気にしなければならないのは1構造体のサイズ=メンバの合計のサイズにしたければパディング無しにしなければならないって話なんだよ
「ほかのデータ」の意味がわからんない
うろ覚えだけど構造体は4byteの倍数に合わせるようにうめてるとか聞いたような聞いてないような
アラインメントね あと4バイトとは限らない
別のスレで質問したんですが人いなさそうなのでこっちで質問させてください。 visual studio 2008で それぞれ別のディレクトリに保存した同一ファイル名のファイルを プロジェクトに追加してビルドすると 未解決の外部シンボルというエラーがでます。 どうしたら同一ファイル名のファイルをビルドできますか?
ファイル名を変える
>>325 買った参考書に入っていたプロジェクトでは
同じファイル名でビルドできたので
出来ればその設定方法を知りたいんですが
プロジェクトをわけ、1ソリューションにまとめてみては?
他の原因でもそのエラーは出るからよくわからんけど ファイル名が同じだからコンパイル後の出力ファイルが上書きされたって事? だったらファイルのプロパティで->出力ファイル->オブジェクトファイル名を設定すればどうにかなりそうだけど
そもそもクラス名がかぶってるんじゃねの?
>>324 そのファイルへのパスちゃんと通ってるかィ?
>>329 ファイル名を指定したら出来ましたありがとうございます。
>>330 クラス名は被ってますがnamespaceで区別してます
>>331 通ってます
VC2008でoggライブラリ使ってて遭遇したんですが、 CのライブラリをC++で使ってるときに if(true返す処理) { throw } Cライブラリの関数呼び出し というような状態で、例外が投げられませんでした。 C関数とthrowをそれぞれ別な関数に分割したら 思ったとおりに動いたのですが、もしかしてC関数と 例外って一緒に使っちゃダメなんでしょうか?
例外が投げられないってどういう状態? C言語部分を通過するthrowは駄目だった気がする。 例えばC言語の関数に渡したコールバックで例外投げた場合とか。 void c_func(void (*callback)()) { callback(); } void cpp_callback() { throw ○; } void cpp_func() { c_func(cpp_callback); }
>>333 ライブラリ呼び出しで、そのような制限は聴いたこと無いな。sinとか普通に使ってるし。
その問題が起きる最小のコードを提示したほうが回答が得られやすいよ
>>334 もうちょっと具体的に書くと、
if(!dir.CheckPath(fileName_)) { //ファイルパスが有効ならtrueを返す関数
throw "無効なパス";
}
//oggライブライリのファイル開く関数
if( ov_fopen(const_cast<char*>(fileName_), Dst_) ) return false;
return true;
ファルパスが無効なら例外投げるはずですが、投げられずに
ov_fopenに行ってしまい、関数内でアクセス違反起こしてエラーになります。
パスチェックとov_fopenを別々な関数に分けて書くと、思ったとおりの動作をする
ので、処理自体には問題は無いと思います。
>>336 ov_fopenをelse側に書くとどうなるの?
例外仕様を避けるほうがいいのは何で? ・例外仕様を使わないとクライアントがメソッドの投げうる例外を調べるときにドキュメントを読むかソースを追跡するぐらいしかできない ・例外仕様で縛らないと実装の変更の際に投げる例外が増減する可能性もあるのでクライアントが実装まで気にしなければならない と考えると例外使用を使わないのはよくないような気がするんですが・・・ templateと相性が悪いのは分かりますが、非テンプレート限定なら問題ないはずです
339 :
336 :2009/10/04(日) 11:18:50
>>337 試す前にリコンパイルしてたら症状が出なくなりました。
すっきりしないですが・・・
>>338 少なくとも、例外仕様を批判する立場からすると後者は逆。
実装の変更の際に投げる例外が増減する
→例外仕様も変更する→それを呼び出す元も修正しないといけない
or →例外仕様を変更しない→例外仕様が実態と乖離したものになる
あと、C++の例外仕様は実行時にコストが増えるだけでコンパイル時には何もしてくれないのもマイナス。
(さらに、実行時違反していることが分かっても、基本は即座に落とされるだけで何もできない)
例外仕様は後付けの仕様なので、いろいろと仕方ない。と言うより、元々必要ない気も。
強制終了の為だけに例外を使う分には問題ない?
Java以外にチェック例外を採用した言語はない気がする。
C++の例外仕様って、コンパイル時じゃなくて、実行時にエラーになるんだろ? あんまりうれしくないよな。
>>338 例外仕様は手間をかけてもメリットがなかった。
ただ、throw()はメリットがあると思う。
επιστημηです。 --- "[cppll:1531] Re: property (言語拡張について)" / Shin'ya MORINO / 2002/02/21 14:12:27 +0900 --- >> DDJ 1997.02/03 オブジェクト指向的日常 # '日常本'のオマケにPDFアリ >今、手元に無いんですが、もしかして、やってました? やってましたー # 長年C++と付き合ってると、大抵のことはやってるなーって我ながら感心します。 # 僕ってすごい? ^^; (どっかのWeb-pageで'神のような人'と書かれていた...) -----:-----:-----:-----:-----:-----:-----:-----:-----:----- FUKUDA (episteme) Fumiki -- magical, but never a magic...
何です、これ?
C++BuilderとVisualC++は プロパティ使えるんだよな
テンプレート関数の引数にポインタを渡して、 テンプレート関数の内部ではポインタの内容が書き換わっているのですが、 関数から戻ってくるとポインタの内容が元に戻ってしまいます。 何故でしょうか?
>>348 C++の仕様には含まれてなくて、各処理系の言語拡張だよね?
だから使わないほうがいいのかな?
>>349 テンプレ関数の宣言と、呼び出してる部分と、引数に渡している値の宣言部分と、
テンプレ関数内のその引数を操作している部分を書いてください。
>349 一番可能性が高いのはおまいの勘違い。 最小限のコードでも載せないとまともな回答は望めないかと。
>>352 の言うとおりだろう。
どこかでコピコンが働いてんだよ。
コピコン可愛いお
356 :
349 :2009/10/04(日) 19:50:39
>>353 の仰るとおり、ポインタを参照で渡したらポインタの内容が
保持されました。
コード部分なんですが、リスト構造のポインタだったので、
操作している部分が長く、見にくいかもしれませんが
書いたほうがよろしいでしょうか?
皆さんレスありがとうございます。
教えてください VS2008で作ったCのプログラム(ただのハローワールド)を 別のマシンで実行させるにはどういうモジュールが必要なんでしょうか .exeファイルをもっていって実行させてもエラーで動作しませんでした
>>357 CRTをStaticにLinkするんだ
>>357 .NET Frameworkがいるんじゃね?
別のマシンが何なのかも書いてないのに、お前ら適当なw
お前は何を言ってるんだ
自分でも何を言ってるのかわからん
>>358-361 すいません。別のマシンってwindowsXPのデフォルトインストール状態のマシンです
なんかライブラリがいるって聞いて、何かをインストールしなきゃいけないのかな?と思い質問しました。
.net frameworkかなと思ったのですがCなのに?という疑問がありました。
ちょっと試してみます
>>366 .net frameworkじゃなくてCランタイム
364 :デフォルトの名無しさん:2009/10/04(日) 21:20:37 お前は何を言ってるんだ wwwwwwwwwwwwwwwwwwwwwwwwwwwww
>>366 32bit/64bit 問題だったりしてw
デバグビルドしてるんだろ
>>367 なるほど。。正確にはCランタイムが必要で
.net framework入れるとCランタイムが入ってくるということですね
入れる対象マシンは私のじゃないのでモジュールだけ入れたいのですが
>>359 さんの方法が可能なのですかね?ちょっと調べてみます
>>369 その問題がよくわかっていませんがどちらも32bit環境です
>>371 これは独り言だけど、コンパイルしたときの条件とか設定とかをちゃんと書くといいかもよ。
質問です。VC9EEで開発しています。 以下のような関数を書いたんです。動機は自作コンテナのオブジェクトプール用のイニシャライザです。 以前の環境をリセットして再利用できるように初期化します。 で、てきとーなテストではうまくいきました。つまり、クラスや構造体のメンバ変数を0にできました。 さて、このコードはセーフなのかアウトなのか知りたいです。メモリリークなどはしてないみたいです。 そのほかにも、もっと簡単な代替手段があればご教授ください。お願いします。 template<class T> bool ZeroInitializer(T& in){ void* Mem = calloc(1,sizeof(T)); if(Mem == NULL) return false; T* Temp = new(Mem) T;//<new>をインクルードしないと使えない。 in = *Temp; delete Temp; // free(Mem); return true; }
>>375 です。
今日はもう寝るので明日また見に来ますです。
よろしくお願いします。
>>375 何か無用に難しいことやってるね。
memsetで万事解決。
>>375 in = T() で十分だろ。
それは別としても、そのコードはアウト。
calloc() で確保したメモリは free() で解放しないとだめ。
あと、 new(Mem) T で例外が発生するとリークする。
そもそも calloc() 使って 0 初期化とか言ってる時点で T に
だいぶきつい制約があるんだろうけどな。
>>377 C++ で memset() はねーよ。
>>375 メモリリークしてるかどうかはどうやって判断したの?
>>379 ゼロクリアする必要があるみたいじゃん。
fill_nとかでいいじゃん。
>>382 いや、それは分かるけど、375はゼロクリアが必要だって言ってるんで。
関数名がZeroInitializerだし。
クラスのオブジェクトを初期化したいだけなのなら、話は変わってくるけど。
つまり calloc() の後にコンストラクタを走らせてるのが意味不明ってことで。 あとは 375 本人に語らせるしかない。
386 :
375 :2009/10/05(月) 00:07:26
>>377 コンストラクタを呼ぶ前ならいいけど、VTableまで0にしちゃったらもんだいないかな?
>>386 寝たんじゃないのか。
とりあえず、なぜゼロクリアしたいのか、話を訊こうか。
388 :
375 :2009/10/05(月) 00:11:09
途中で投稿してしまった。
>>380 VCの<crtdbg.h>の関数でやりました。
>>381 &
>>384 ごめんなさい。とりあえず、現在の状態をリセットできればZEROじゃなくてもいいです。
布団入る前に見にきてよかった。
じゃ、378で終了だな。
>>388 メモリプールみたいなものを作るならEfficient C++でもみて勉強すれば?
391 :
375 :2009/10/05(月) 00:23:10
時間があるので、細々と。
何で、こんなことしようかと思ったかというと、N分木のツリーコンテナを作ったのが始まりです。
このコンテナはテンプレートになっていて、いかなるTをも食います。
無難な初期化法を模索している時に、VCのstd::vectorの中身がかならず0で初期かされていることを思い出しました。
で、これをうまく取り込もうと思ったのでそういうコードを書きました。
>>389 >>378 では問題がでないなら、それで終了です。
ちょっと大丈夫か不安だったんですが、まぁ、責任はユーザクラスに投げてしまうのもいいかなぁ。。。
>>390 まず本を買わないと!ですね。
とりあえず方向性が見えたのでそれで何とかしようと思います。
変な質問でしたが誠実に答えていただいてありがとうございました。
ぐっすり寝れますよ。;)
std::vectorの場合は、T()、つまり値初期化されるので、intやPODな構造体だと結果的に0初期化になる。
だから、とりあえずは
>>375 のコードのnewのところをnew(Mem) T();とすればいい。Tの後の括弧が重要。
(コピーコンストラクタなど)コンストラクタに引数を渡す場合もここで渡すこと。
そして、この要素を削除するときにはTemp->~T();でデストラクタを呼んでからfree(Temp);する。
こうすれば、コンストラクタ・デストラクタを持つクラスでもきちんと動くはず。
本格的にやるなら、std::vectorみたいにテンプレート引数でアロケータを取るようにする。
malloc→allocate
new(void*)→construct
~T→destroy
free→deallocate
アロケータのメンバはこう対応する。
きめぇコードだなw テンプレートで書いたら保守なんてできたもんじゃないな
>>392 T に制約を設けないならコンストラクタからの例外にも気をつけないと。
>>392 詳細ありがとうです。T()でも問題なさそうなのでそれで行きます。
元々は自分の認識の甘さが原因ですね。もっと精進したいと思います。
ありがとうございました。
> Tの後の括弧が重要。 括弧はなくてもいいと思うが。あってもいいけど。
vectorのイテレータiから要素へのポインタpを得る方法がわからず、 詳しい知人に聞いたら、 p = &*i; いうやり方を教えてくれました。なるほど確かに動いているのですが、 一見無意味な変換をしているようで気持ち悪いです。 こういうやり方って一般的なんですかね。
>>397 一般的だと思う。
「自分の環境のvectorのイテレータはポインタで実装されているから」といって、
イテレータをそのままポインタとして使う方が気持ち悪い。
>>397 vectorのイテレータはランダムアクセスイテレータなので、機能的にはほとんどポインタと変わらない。
(*it)ってやれば、要素を返してくるので、それのアドレスを返せばポインタへの変換はできる。
でも、俺もキモイと思う。一般的かは別として。。。
>>397 一般的というか、普通にそれが正解だし、中身を理解してくれば不自然さも感じなく
なってくるかもしれないし、なってこないかもしれない
VC++2008では、こういうマクロが機能します。 C++の標準としては、引数付きマクロに型引数を指定してもいいんでしょうか。 #define foreach_vector(T, v, i) \ for (std::vector<T>::iterator i = v.begin(); i != v.end(); ++i) std::vector<int> vec; ... foreach_vector(int, vec, i) { ... }
型引数といってもプリプロセッサにとっては単なる文字列に過ぎんから 何を指定してもようござんす。
>>401 最終的なC++の文章として整合性の取れた置換がされれば、コンパイラさんは疑ったりしない。
>>396 コンストラクタを持つクラスなら確かにどっちでも同じだけど、そうでない組込型やPODだと違うの。
new intだと、int i;のiのように初期化されなけど、new int()は0初期化される。
まあ、たしかにstd::vectorはT()をコピーコンストラクトして0にするので、
これは使っていないはずだけど。
405 :
デフォルトの名無しさん :2009/10/05(月) 22:27:53
mpg又はmp4、wmv, aviといった動画のファイルフォーマットを詳しく書いたHPありませんか? 1024バイトはヘッダーとか、ここからデータが入ってるとか、そういったことが知りたいです。 動画再生ソフトをC、C++でガリガリプログラムしてみたいと思ってます。よろしくお願いします。
407 :
デフォルトの名無しさん :2009/10/05(月) 22:35:01
コンテナの最終要素からの後置インクリメントの対処って、やっぱ最終要素の場合インクリメントしないしかないのかな?
境界線系のエラーは結構凶悪だから、何もしないか、レンジエラーの例外投げるかするといいと思う。
>>405 フォーマットがわかったくらいじゃ再生できなくて
結局規格書が必要になるから最初から規格書手に入れたほうがよい
つーか何人もの熟練のプログラマが関わってても
バグが出るのが動画の世界なのに
そんなことも自分で解決できないレベルじゃ間違いなく挫折する
いや、むしろ俺が挫折した
悪いことは言わないからDirectShowにでも頼ったほうが早い
>>405 高い山を目指すのも悪くはないけど山の高さを知るためにもまずは
JPGあたりからはじめたらどうかな?
挫折すること請け合い
jpgですら難しいのに動画とか無理だろそもそもソフトウェアエンコードでまともな速度でるのか初心者はBMPから始めろ
そういえば 漫画とかイラストとか、基本は白黒で線とベタとトーン、それに活字で出来ている絵、 これって、一般的にはBMPからJPGに圧縮してるけど 線や字(フォントの種類)等を判別する方法をうまく考え出せば JPGとかに比べて、ずっと圧縮率を高くすることも出来ると思うんだ。 もう既に作られているのかもしれないけど。
自動ベジェ曲線化とか? 難しそうだ。OCRは何とかなるか。
グレイスケールで十分じゃね?
イラストレータとかのベクターフォーマットがそんな感じじゃね? でも、線の強弱やかすれ、ベタフラッシュやホワイト、トーン削りなんかを考えたら、 jpgとかで十分だと思うよ。
potraceでぐぐれ
強弱・かすれ・トーン削りみたいなのをきれいに残したいなら むしろ8bitグレースケールにしてPNGだろうな サイズは増えるだろうけど「無劣化」はでかい ちなみにJPEGにもグレースケール専用の色空間定義がある 読み書きできないソフトも多いだろうけど
最小化された(子)ウィンドウのサイズをMoveWindowで変更し、 そのウィンドウを標準化すると、指定サイズに変わっている というのをやりたいのですが、サイズが変わってくれません。 いい方法がありましたら教えてください。
419 :
デフォルトの名無しさん :2009/10/06(火) 15:21:59
http://www.geocities.jp/ky_webid/win32c/025.html のページの
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
について質問ですが、これはLRESULTという型のCALLBACK WndProcという関数でしょうか?
それともLRESULT CALLBACKという型のWndProcという関数でしょうか?それともまた別でしょうか?
前者のような気がするんですが、いじってみてもうまくコンパイルできません。
たぶん自分のレベルでは追いつかないような記述だと思うのですが、分からないままだと悲しいので答えだけ教えてください
LRESULT => 返り値 CALLBACK => 呼び出し規約 WndProc => 関数の名前
>>421 呼び出し規約というのは初耳です。調べてみます。
ありがとうございました〜
呼び出し規約って何者なの?
wikipediaのページの左上にある画像に「ワィ」ってあるけど、本当は「ウィキペディア」の「ウィ」のつもりの誤字なんだってね。
>>424 関数呼び出すための約束事。
アセンブリになったときのお約束で、他言語との協調とかそういうときに役に立つ。
427 :
デフォルトの名無しさん :2009/10/06(火) 23:56:12
質問です。 kern protection failureってどういうエラーなのでしょうか? たとえば char *str = "aiueo\0"; で初期化した文字列に対して *str = 'o'; を実行したときにこのエラーが出てしまいます。 使用OSはMAC OS Xでgccを用いてコンパイルしています。
多分、書き込み禁止領域に書き込んだから怒られてる。 それは配列として確保してないから改変不可だ。
429 :
427 :2009/10/07(水) 00:13:26
>>428 説明ありがとうございました!
宣言だけ行って、mallocで領域を確保したらうまくいきました
追加で質問させていただきたいのですが、
宣言直後のポインタは基本的に書き込み禁止領域のアドレスを指しているのですか?
そりゃヌルポといってだな どこさしてるかわからん超危険ポインタ 下手したらOSの挙動に割り込んでHDDをぶっ壊すかもしれない ってたまに聞くけど本当かどうかはしらない。使ってみてはどうでしょうか
int a[1]; a = malloc(x); これって別に問題はおこらなそうだけどやったらだめなの?
やってもいいけどコンパイラに怒られる
>>429 初期化されてない自動変数のポインタは、大体の処理系ではスタックのメモリに
残っていた値が入っていて、元がint型の値だったりしたとき、全く関係のない
アドレスが入っていたりする。たまに書き込み可の領域を指してることもあることは
あるが、大体は書き込んだらSegmentation faultで落ちる。
むかーし、俺も初心者だった頃、同じようなことをしようとして出来なくて悩んだな。 今にして思えば、単に配列とポインタを理解してなかっただけだが。
>>430 モダンなOSなら、ちゃんと例外を投げてくれるけどね。
ちなみにヌルポをfreeしたりdeleteしたりするのは合法
切り替え機のPS2ポートにキーボードをつながないで もう一台のlinuxPCのRS232Cのポートから変換コネクタを かませて切り替え機につなぐことは出来ますか? 切り替え機に大して送るキーボード信号をソフト的に エミュレーションしたいので可能かどうか悩んでます。 linuxスレで聞こうかと思いましたが、閑散としていたので こちらで聞きました。 アドバイスがあればよろしくお願いいたします。
>>430 それヌルポじゃないよ
ヌルポはヌルポであって、未定義とは全く違うよ
Cのポインタは未初期化でも何かしら指しているものな。
>>430 実アドレス上で動かないからOSには多分被害ないと思うが。。。
>>424 関数の呼び出し方をアセンブリ言語レベルで規定したもの。
引数はスタックに積むのかレジスタに格納するのか、スタックに積むなら順番はどうか、
レジスタを使うならどのレジスタにするのか、とか諸々のルールがある。
呼び出し規約の指定を間違えると、関数を正しく呼び出せず、クラッシュする。
アセンブリ言語で関数を書くのでなければ、中身は知らなくても名称さえ知っていれば大丈夫。
C++勉強中のものです。 数メガサイズのファイルを読み込み、そのデータをメモリ内にアプリケーションが 終了するまで持ち続けるようなプログラムを作成したいのですが、読み込んだデータを持つ方法で悩んでいます。 複数のクラスからアクセスするようなデータ場合、usingを使いグローバル変数に格納するのが一般的なのでしょうか? なんとなく、C++ではグローバル変数を使用するのがタブーになっているような思いがあるので質問させていただきました。
グローバルにするのは一般的じゃないので普通に持ち回ればいいと思う。 持ち回り方はC++だからといって何か特殊な方法でもないよ
>>443 そこでMediatorパターンですよ。
どこか分からないが、どこかを指しているというのを言ってるんじゃ
linuxのjfbterm上で動くコンソールアプリをC(gcc)で作ってるんだが ncursesのboxのボーダーが文字化け(?)してる。 なんか技がある? スレ違いだったら誘導してくれ。
>>447 指していない可能性だってあるんだぜ。ぬるぽとか。
へぇ。じゃあ、0番地を指すポインタは作れないのか
>>448 どう化けてんだ?
\が¥になるのはフォントのせいだけど。
>>451 多分、フォントのマッピングが違ってて、それで文字化けしてるんだろうけど
box (subwin_1, ACS_VLINE, ACS_HLINE) でサブウィンドウを囲ってやろうと
すると、縦の線が上付きの「3」になって、横の線はなにも表示されない。
なんかいいアイデアない?
ヌルポと同じビットパターンの番地を指すポインタは当然作れないよ(作らなくても いいようになってるし) どんなビットパターンかは処理系依存で、0に等しいとは限らないけど、コンパイル タイムでポインタにキャストされた0はヌルポ扱いをすることになってる まぁこの辺はいまいち分かりにくい仕様だと思うし、C++0xではnullptr_t型のnullptr というものがとうとう導入されることになった訳だけど
つまり自動変数として生成したポインタの初期化を行わなかった場合に、 それがたまたまヌルポになる可能性があるから、未初期化でも 常にどこかを指すというのは間違いであると
Win32だと0x7fff以下がぬるぽってことになるんだな。
>>458 グローバル変数はダメなのに「シングルトン」ならダメじゃなくなるとでも思ってるのか?
>>460 なんでグローバル変数がだめだとシングルトンもだめになるって思ったの?
>>461 コレクションがどうこうより、クラスの扱い方のところで既に間違ってました。
スレよごしすみません。
vector<Item> vItem;
//newが不要
//vItem.push_back(new Item(2 "pc"));
vItem.push_back(Item(2, "pc"));
vItem.push_back(Item(3, "box"));
for(int i=0; i<vItem.size(); i++){
cout << "no:" << vItem[i].no << " name:" << vItem[i].name << endl;
}
>>464 初期化順の制御とかしたくなることない?
シングルトンとかグローバル変数を使うと、周りを癒着しちゃってモジュール化するとき弊害になるんだよな。 グローバル変数とか使うなら、一個のクラスのメンバ変数にしてモジュールにしてしまうほうが再利用性を確保できる。
コマンドラインで引数を受け取ってローカルアプリのAPIをコールするexeを 作成したいんですがどこか参考になるサイトご教授願いませんか? オブジェクト指向は理解してますがwindowsのプログラムは超初心者です。
Windowsのプログラムが超初心者なら、どのOSのプログラムなら初心者じゃないんでしょうか。
>>468 私はあなたではないので質問の意味が分かりません
他の人にわかるように書いてください
>>468 ローカルアプリというのは何を指していますか?
APIは何万個もあるわけですが、どのAPIをコールしたいのですか?
コマンドラインで受け取った引数は何に使うのですか?
>>471 Skypeで特定ユーザーにメッセージを送信、ムードメッセージを送信、オンライン、オフラインの切り替えなどです。
Firefoxのadd-onを作成しているのですがActiveXのSkype4COM.dllが使用できないため
exeでなんとか操作できないかと。
>>472 exeじゃなくてwscriptで十分。
Skype4Com WScript でググレ。
>>468 その書き方だと、既成のEXE内の関数をコールしたいとか、あらゆる可能性を引きずってる。
もうちょっと限定してくれ。
プログラム全体から呼び出される可能性のあるものはシングルトンにしてもいいだろうよ。
グローバルかシングルトン使わないと延々とポインタを引数にリレーとかしないといけないからめんどくさいじゃん
ぶっちゃけシングルトンにしていいようなものはグローバル変数にしていいと思う gotoと同じく完全排除が常に善ではないし、gotoよりは使ってもいい ただ無闇に使うなってだけ
>>478 おっとすまない。俺が読めてなかったみたいだ。
グローバルとシングルトンは全然違うだろ。 シングルトンはグローバルとファイル内にスコープの閉じたstaticグローバル変数の中間くらいの性質をもったものでグローバルより安全で使いたい場所でだけゲットできる
唯一のインスタンスにアクセスするメソッドだけを持ったクラスを継承させたほうがいいとおもう
>>475 内容がおかしければ直せばよい。それだけだ。
シングルトンなんか最近はアンチパターン扱いだろ
>>484 便所の落書きを一生懸命書き直すバカなんかいないだろ
できない言い訳はいいよ
ランタイムコストが掛かるし、細かい罠がぼろぼろ落ちてるし、マルチスレッドには 致命的に向いてないし、下手な使い方をすればグローバルインスタンスと全く同様の 問題も抱える。 今時シングルトンなんか推奨する人はちゃんと理解してるんだろうかと。
論拠にwikipediaをもってくるやつってなんなんだ。 書き直せよって言うけど、俺がぜんぜん違う内容に書き換えたら、それを信じるってことか?
シングルトンは「俺のコードカコイイ」な人かJava脳の人が使うもんだろ で、MTのコードを書き始めると、ダブルロッキングとか馬鹿で無意味なこと始めるか、 目が覚めて窓から放り投げる
うぃきぺを補強に持ってくるのはバカだけど、とりあえずうぃきぺ出典かどうか なんか無視して、中身の正しさを巡って議論すればいいと思うよ
海外のフォーラムなんかも「シングルトンだって? 素直にグローバル使えよプゲラ」って感じだな
値域の制限には使えると思う
wikipediaだからという理由で中身を見ない人って何なの?
>>489 だからグダグダと言い訳ならべなくていいって。
君の最大の力をもって素晴らしいページに書き換えてくれ。
意味がわからない。 wikip好きすぎだろ。
お前の2行目の決め付けのほうが意味がわからない。 発狂するタイミングじゃないと思うんだけど。
>>466 >>482 「初期化順の制御」したいときにも「使いたい場所でだけゲット」したいときにも、
クラスに対してシングルトンパターンのような加工を施す必要は無いんじゃない?
ふつうのクラス定義と、そいつの参照を返す関数がひとつあるだけじゃダメなの?
>>498 初期化順で俺が言いたかったのは複数のグローバルなオブジェクトがあるときね
1個だけならお好きに
>>499 オブジェクトが何個でも一緒じゃない?
ふつうの関数(と静的変数)ではできなくて、「シングルトン」ならできる、っていう
初期化順の制御ってどんなのがあるの?
>>498 >ふつうのクラス定義と、そいつの参照を返す関数がひとつあるだけじゃダメなの?
クラスを公開するなら、そのクラスのインスタンスがあちこちにできちゃうかもしれない。
メンバ関数じゃなくて、参照を引数に取る関数を定義すればいいかもだけど、
それならいっそ参照を外に出さないで、関数だけ公開すればいいと思う。
個人的には静的メンバ関数のみを持つクラスをよく使うなあ。
こういうのってパターン名とかないのかな。
>>501 > クラスを公開するなら、そのクラスのインスタンスがあちこちにできちゃうかもしれない。
それが嫌なら、公開するクラスは純粋仮想関数の宣言を並べただけの
インターフェースクラスにしとくという手がある。
class C {
public:
virtual void f() = 0;
virtual void g() = 0;
};
C& DefaultC();
「参照返す関数」をなるべく使わないように、できるだけ引数で受け渡すように
しとけば、テスト用にダミー実装に差し替えるとかいうようなこともできる。
> それならいっそ参照を外に出さないで、関数だけ公開すればいいと思う。
あぁそういうパターンもあるよね。 C だと超ふつうだな。
やっぱりシングルトンパターンのメリットは見えてこないな。
staticなメンバ変数しか持たないのはmonostateパターンだね 見た目がシングルトンより綺麗だから俺もこっち使うけどメリットデメリットはよくわからん・・・
継承できるできないとかコンストラクタが呼ばれない呼ばれるの差じゃね
質問です。 32ビットのXPで、出来るだけ最適化をかけられてフレームポインタが無い .exe は、 原則として関数(インライン化されたものを除く)のコール順というのは分からないんですよね? それなのに、VisualStudioとかで見ると、呼び出し履歴が見えるのはどうしてでしょうか。
>>505 最低限、関数からリターンするためには呼び出された元の位置を知っていないといけない
わけで、どんなに最適化してもプログラムが実行可能である限りその情報は存在している。
CPU が関数からリターンするときにそういった情報を使うのと同じように VisualStudio などの
ソフトで情報を読み取れば、最低限の呼び出し履歴の表示は可能。
さらにバイナリに残っているシンボル情報やコンパイル時に生成できるデバッグ情報などを
加えれば、関数名や引数の表示までだいたい可能になる。
507 :
505 :2009/10/08(木) 11:28:37
509 :
505 :2009/10/08(木) 11:53:55
>>508 ありがとうございます、こっちで聞いてみます。
510 :
472 :2009/10/08(木) 18:13:02
>>474 を参考にexeを作成して一通りSkypeの操作は可能になりましたが
コマンドラインオプションで文字列送信で文字化けして躓きまました。
メッセージ送信は_bstr_t型なので
/*内部処理*/
char *orig = "こんにちわ!";
_bstr_t bstrt(orig);
pSkype->SendChatMessage("echo123", orig);
/*オプション文字列*/
//int _tmain(int argc, char* argv[])
char *opt = argv[1];//こんにちわ!"
_bstr_t bstrt2(opt);
pSkype->SendChatMessage("echo123", opt);
/*出力結果*/
orig -> こんにちわ!
opt -> S0・k0a0・�
何が問題なのかご教授よろしくお願いいたします。
511 :
デフォルトの名無しさん :2009/10/08(木) 18:17:42
Mac OS XとLinuxとFreeBSDでは OpenGLのヘッダやライブラリのファイルのある場所が違うので これらのどこになってもmakeが一発で通るように Makefileを書きたいのですが どういう風に書けばよいのでしょうか?
>>511 makefile を分ける
ライブラリパスを追加しまくる
configure を書く
>>511 automakeあたりを使えば良いんじゃね?
516 :
デフォルトの名無しさん :2009/10/08(木) 20:05:50
Linuxのgcc4.3.3では #include <limits> でコンパイルエラー起こした #include <climits> を代わりにインクルードさせた通したんだけど いいんでしょうかね、これで
518 :
510 :2009/10/08(木) 20:46:10
自己解決。 UnicodeにShift-jis渡してりゃ化けるわw あほだ俺w
どのUnicode
>>516 Cではふつう #include <limits.h> と書く。
環境変数はグローバル変数だから使用禁止
エスケープについての質問です。 下のようなソースで、 main(int argc, char *argv[ ]) 実行イメージが下のように、 入力ディレクトリ、出力ディレクトリの場合に > xxx.exe inDirPath outDirPath main関数ですぐにDEBUGすると、通常なら argv[1] : inDirPath argv[2] : outDirPath のようになると思います。 しかし、下の場合だと > xxx.exe "inDirPath\" outDirPath argv[1] : inDirPath" outDirPath argv[2] : 不定値 のようになってしまいます。 おそらく、 "inDirPath\"の\"がエスケープされ、文字の"となってしまい、 閉じる"がなくなってしまったためだと思います。 このような場合、プログラム上で回避できる策はあるのでしょうか? 無理そうなら、マニュアルに記載しようと思います。
\という文字がほしいなら\をエスケープして\\と書く。
すみません、それはつまり プログラムを実行する人に向けて、\は\\と書いてください、と マニュアルに書くしかないということでしょうか?
525 :
デフォルトの名無しさん :2009/10/08(木) 23:41:17
質問の趣旨とは異なる回答だけど、 プログラム内部でディレクトリパスの末尾に¥が付いてる必要があるなら 入力時には¥の有り無しどちらでも受け付けるようにしておいて プログラム側で末尾を判定して¥を付加してやればいいね \"が"になってしまうのは使う側の責任。だけどそもそも末尾に¥を要求しなければ そういうミスの発生件数も少なくなる
>>524 それはコマンドプロンプトのせいだからどうしようもないね
対策はダブルクォートが出てきたら \" だと解釈して自分でパースするくらいかな
昇順にソート済みの vector<int> v があり、その中から int min 以上、int max 以下の値を列挙したいとします。 これがmin以上max未満ということなら、次のようにすればよいと思いますが、 vector<int>::iterator imin = upper_bound(v.begin(), v.end(), min); vector<int>::iterator imax = lower_bound(v.begin(), v.end(), max); for (vector<int>::iterator i = b; i != e; ++i) 「max 以下」となると、どうするのがスマートでしょうか? for の前に if (imax != v.end()) { ++imax; } とか書くのはちょっとベタすぎる気がするんですけど、そんなものですかね。
528 :
527 :2009/10/09(金) 00:31:59
すみません、自己解決しました。 vector<int>::iterator imax = lower_bound(v.begin(), v.end(), max + 1); でいいですね。
>>525 プログラム内部では、末尾に¥を付ける必要特にないのですが
やはりユーザー側から「¥”」のような指定をされてしまうと
プログラム側では防ぐことはできなさそうです。
>>526 文字列に「”」があったら、パースするというのも考えたのですが
パース後に残った文字列のどこからどこまでが第二引数、第三引数かの判定が難しいです。
(実は第三引数まであり、それぞれ半角スペースが入る可能性有り。)
もう少しやってみますが、
おそらくマニュアルに記載するのが良さそうに思います。
ご回答ありがとうございました。
>>527-528 > vector<int>::iterator imin = upper_bound(v.begin(), v.end(), min);
これをループの始点に使うんだよね?
それなら lower_bound() じゃね?
> vector<int>::iterator imax = lower_bound(v.begin(), v.end(), max + 1);
こっちは upper_bound(v.begin(), v.end(), max) じゃね?。
...|1|2|3|4|5|... と並んでるとき、 lower_bound(3) は 3 の前の境目で、
upper_bound(3) は 3 の後ろの境目、だと覚えてるんだけど、違ったかな?
>>527 max+1するなら、両方lower_bound()だな。
iminをupper_bound()で得ると、重複した値を取りこぼす。
>>526 つ[ディレクトリ記号は/でおながいします]
>>490 Javaはシングルトンの使い道があるん?
void test(int x[]){cout << sizeof x << endl;return;} int main(array<System::String ^> ^args) { int x[] = {1,2,3,4,5}; test(x); cout << sizeof x << endl; } ■出力結果 4 20 なんで両方とも20にならないんでしょうか?
>>534 エラーもしくは警告にならないのそれ
まぁそれは実質的に
void test(int *x)
というプロトタイプと解釈されるから
>>537 エラーも警告もでません。
これは普通はやらない書き方なんですね。
だいたい理解できました。
test関数内ではポインタx単体の大きさをsizeofで見ていて、main関数内では配列全体をsizeof見ていると。
ということはこの場合、test関数内で20という値を得る処理を書く事はできないのでしょうか?
C本来の配列は要素数の情報を持っていない。なので、Cで配列を引数に取る関数は たいてい別の引数で要素数を受け取るようになっている。 悪いことは言わないから、array<T>なりList<T>を使っとけ。
もう誘導先に行ってて遅いかもしれないが、 C++かC#のどちらか明確にして勉強したほうがよいと思うよ。
>>539 そうゆうものなんですね。
すっきりしました、ありがとうございます。
素直にコンテナ?を使っておきます。
>>540 もともとJavaを主に使っていて、C#は多少勉強した程度です。
Javaとは配列の性質が違っていたのでとまどいました。
ご忠告ありがとうございました。
543 :
デフォルトの名無しさん :2009/10/09(金) 18:28:39
gccのバージョンを数字だけ出力する方法はあるでしょうか? 4.3.5なら「4.3.5」だけとか
___GNUC___ ___GNUC_MINOR___ だけでは末尾の1桁が 取れないのか どうやればいいんだろう
__GNUC_PATCHLEVEL__
>>545 おおサンクス
そしたらこうすればいいのか
printf("%d.%d.%d", ___GNUC___, ___GNUC_MINOR___, __GNUC_PATCHLEVEL__);
547 :
デフォルトの名無しさん :2009/10/09(金) 21:48:40
質問です。 環境はVisual Studio.net 2003 C++ 条件は列(9)の最後尾が○の場合、 後ろから●が見つかるまでの部分を 削除して表示する ***実行前*** ○●●○○●●○○ ○●●○○●● ↓↓↓↓↓↓↓ ***実行結果*** ○●●○○●● ○●● ●○○●○○○○○ ●○○○○○●○ ○●●○ ↓↓↓↓↓↓↓ ●○○● ●○○○○○● ○●●
548 :
デフォルトの名無しさん :2009/10/09(金) 21:49:38
最大横9×縦11項目 ●○○●○○○○○ ●○○○○○●○○ ●○○●○○○○○ ●○○○○○●○○ ●○○●○○○○○ ●○○○○○●○○ ●○○●○○○○○ ●○○○○○●○○ ●○○●○○○○○ ●○○○○○●○○ ●○○○○○●○○ ↓↓↓↓↓↓↓ ●○○● ●○○○○○● ●○○● ●○○○○○● ●○○● ●○○○○○● ●○○● ●○○○○○● ●○○● ●○○○○○● ●○○○○○● このような感じで出力したい場合、どういった風に 実装すればいいでしょうか? 以上、よろしくお願いします。
>>547 #include <stdio.h>
#include <string.h>
int main(void)
{
char buf[1024], *p, *q;
while(fgets(buf, sizeof(buf), stdin))
{
for(p=buf;(q=strstr(p, "●"));p=q)
{
q+=2;
printf("%.*s", q-p, p);
}
printf("\n");
}
return 0;
}
MFC使っていいなら、 CStringW s = L"○○●●○○"; s.TrimRight(L'○');
***実行前*** ○●●○○●● ↓↓↓↓↓↓↓ ***実行結果*** ○●● ここがわからん。開始時に末尾が●ならそれは削除?
2パスにするのが楽かな?? まず、左から右に一回配列を舐めて、最後に出てきた黒の場所思えておいて、2パス目で表示。 もちろん処理を多めに食うけど、確実じゃないかなぁ。
553 :
デフォルトの名無しさん :2009/10/09(金) 22:43:40
>>549 サンクス!!
>>550 サンクス!!
>>551 すまん、記述ミス
***実行前***
○●●○○●●○○
○●●○○●●
↓↓↓↓↓↓↓
***実行結果***
○●●○○●●
○●●○○●●
>>553 ん、そっか。ミスか。
じゃあ回答でおk
555 :
デフォルトの名無しさん :2009/10/09(金) 22:51:09
>>552 例えば、
for(int i=0; i<99;i++)
{
bool iMap[99] = getFunc( i );
}
これで○=1,●=0
ってなっていた場合どうする?
つまり、○ならオブジェクトが取得できていて、
●なら何も無い状態。
>>555 即興だから間違ってたら申し訳ないが。
static const LineLen=99;
int LastBlack=LineLen;
bool Map[LineLen];
for(int i=0;i<LineLen;i++){//舐める1パス目
Map[i] = GetFunc(i);
if(Map[i]==false) LastBalck=i;
}
for(int i=0;i<LastBlack;i++){//表示。2パス目
printf("%d",Map[i]);
}
っていう感じ。
多分9*11で99要素なんだよ。 だから2重ループにするか、lastblackを11要素の配列にしないとだめだ
>>557 書いた後気づいた。読めてなかったなぁ。。。
>>558 の案もあわせて採用するといいと思う。
size_t LastBlack(object* Array,size_t N){
int Last=N;
for(size_t i=0;i<N;i++){
if(Array[i]==false) Last=i;
}
return Last;
}
--呼び出し--
object obj[99];//どこかで中身設定。
size_t L;
for(size_t i=0;i<11;i++){
L=LastBlack(obj+9*i,9);
Show(obj+i*9,L);
}
って感じか??
2重ループになっちゃったな。。。
確実だが、頻繁に呼ぶにはちょっと重いかもね。。。
黒発見した時点でそれまでを描画すれば1パスでいけないこともないかも??
だれも素直なstrrchrとかは勧めないのか Unicodeだとしてもwcsrchrとかあったはずだし 最悪strrchrwがshlapi.hとかにあった気がするが
自分の発言でグダグダになったので、フルソース書いてみた。 思っていたのとは別物になってしまった。変なこと書いて申し訳ないね。 #include <stdio.h> #include <vector> #include <algorithm> int main(){ std::vector<int> Array; size_t W=9,H=11,LD=0; Array.resize(W*H); srand(253); std::fill(Array.begin(),Array.end(),0); for(size_t i=0;i<Array.size()/4;i++){ Array[i] = 1; } std::random_shuffle(Array.begin(),Array.end()); for(size_t i=0;i<H;i++){ LD = W; for(size_t j=0;j<W;j++){ if(Array[j+W*i]==1) LD=j; } for(size_t j=0;j<=LD;j++){ printf("%s",(Array[j+W*i] == 0) ? "○":"●"); } printf("\n"); } return 0; }
コンパイラの警告について質問です。 環境はVS2008Expressです。 先ほど2時間悩んだ末に発見した間違いがありまして、これを警告で表示してほしいなぁと思いました。 内容は Hoge c;//Hogeはクラス if (略) c = Hoge(0); else Hoge(1); というもので、elseの後ろは本来c = Hoge(1)とすべきところを、c=を忘れてしまいました。 気づいて直した後に、警告LV3なのが悪かった、4にしようと最高である4にしました。 期待としては cが「初期化されていない可能性のあるローカル変数」として警告される。 Hoge(1)は無意味だ〜という警告(ただ、コンストラクタ内でグローバルな変数にアクセスする設計もありえるあるから、これは警告にはできないか・・・?) のどちらかを期待したいたのですが、駄目でした。 前者は特に不思議なのですが、つかわれ方が Honya(&c); というポインタ引き渡しの場合には警告にならないようなのです。 (Honya(const Hoge *p)なので、constであるから警告になってもよさそうなものですけど…) この(くだらない)ミスを再発しないためには、何か良い方法はあるでしょうか? というつかわれ方をしていたせいで、警告がでませんでした
>>562 Hoge c; って書いた時点でパラメータなしのコンストラクタで初期化さ
れてるんでは。
>>562 おそらく無理
前者のcはコンストラクタが呼ばれるから初期化されているので警告は出ない。
後者のオブジェクトを作るだけという使い方も十分あるし文法上何の問題もない。
どうしてもというなら、フラグを作って何のメンバ関数も呼ばれずにデストラクタが呼ばれた場合はassertするくらいか。
>>563-564 あー、なるほど
Hogeにはコンストラクタを書いていませんが、暗黙のコンストラクタが用意されるんでしたね…
Hogeはコンストラクタのいらない型なのですが、そこでなんとかできないでしょうか?
例えるならVectorデータ型みたいなもので
struct Hoge
{
float x, y, z;
};
相当の品なのです。
こういう構造体を「コンストラクタを無くし」て、「初期化されなかったときの利用で、警告が出るようにする」ためのオプションや修飾子はないでしょうか?
>>565 Hoge C=式 ?Hoge(0):Hoge(1);
デフォルトコンストラクタをprivateにして必ず565みたいにさせるとか。
>>565 Hoge* c;
if (略) c = new Hoge(0);
else c = new Hoge(1);
scoped_ptr<Hoge> cptr(c);
Honya(cptr.get());
こんな感じにするかなあ。
変数宣言と初期化を別にする限り防げないように思う
つまり
>>567 のいうとおりデフォルトコンストラクタをprivateにして
>>566 のいうような宣言と同時に初期化を必須にするしかないと思う
ただ
>>566 はコンパイラが馬鹿だとコピーコンストラクタが使用されそうだし
俺なら
Hoge C(式 ? 0 : 1);
って書きそう
>>568 Vectorみたいな使い方と考えると
比較的プリミティブに近くて多く使われそうだし
毎回ヒープにアクセスさせるのは大仰な上に遅くなりそうじゃね?
マルチスレッドだったりしたら毎回排他制御が…
汎用的に配列の要素数を返却するtemplate をこのように書いてみたのですが 期待している動作になりません、間違いを指摘してもらえませんか。 #include <iostream> using namespace std; template<class X> int ArraySize(X* object) { return (sizeof(object) / sizeof(X)); } int main() { int array[] = {1, 2, 9, 3, 4, 5 }; cout << ArraySize(array) << endl; //配列array の要素数を取得したいのですが・・・ }
>>566-570 真剣な検討ありがとうございます。
ポインタにするのは、ちょっと速度的にきつそうかなと思います。
570さんのおっしゃるとおり、プリミティブに近いものを想定していますので。
デフォルトコンストラクタをprivateにすると、
Hoge c;
とはできませんね。
(その方法で初期化を強要しつつ)初期化で条件式を使うのは確かによさそうですが、条件分岐が3つ以上の場合に無理がありそうですね。
書けなくはないですが・・・。
else Hoge(1);
のところで、「生成したクラスが使われていないようですが?」という警告があれば一番良いのですけどね…。
それを避けるためには、使ってないローカル変数への警告を抑える
(void)a;
と同じように、
(void)Hoge(1);
と書く。とか…。
>>571 int ArraySize(X* object)
ここで、単なるポインタにしてしまった以上 sizeof(object)では大きさがとれませんよ。
sizeof(配列)で大きさが正しくとれるのは、それが配列宣言されており、コンパイラがサイズを知っているからです。
ポインタと配列は似て非なるもの
template <class T, size_t N> size_t GetArraySize(T (&)[N]) { return N; } int array[] = {・・・}; cout << GetArraySize(array);
>>571 です
>>573 >>574 ありがとうございます。
>ポインタと配列は似て非なるもの
そうですね、短絡的でした。
>>574 の
T (&)[N]
この書き方ですが、配列の宣言が、foo[N]このような書き方がしてある配列を参照しているという、ことなのでしょうか?
それから、
return N;
どうしてこれで要素数が取得できてしまうのでしょうか、不思議です?
>>575 です
質問がまわりくどいですね
T (&)[N] と T &[N]
この違いを教えて頂けないでしょうか。
foo[N]のNこそ、要素数でしょ?w
>>577 あ、そうか!
わかりましたw
T (&)[N] と T &[N]
しかし、この違いがまだ理解できません・・・・orz
構文解析のルールの詳しいことはよく理解してないけど T [N] => Tの配列 T &[N] => Tへの参照の配列 T (&)[N] => T[N]への参照 となってる模様。ちなみに参照の配列はコンパイルできない このへんは仮引数名の省略とか括弧の意味とかいろいろあって直感的には理解しにくいわ
配列へのポインタと一緒だけど、演算子の優先順位が & より [ ] の方が高いから T &a[N] は先に [ ] と結びついて a[N] つまり a は要素 N 個の配列 その個々の要素の型が T& T (&a)[N] の場合は括弧で明示してあるために先に & と結びついて &a つまり a は参照 その参照先が要素 N 個の配列 関数の引数名は省略できるので、その場合 T a[N] は T [N] に、T (&a)[N] は T (&)[N] になる というように俺は理解してる
stringstreamってどんな感じで実装されてるんでしょうかね? stringみたいに内部で独自のメモリ管理方法を取ってるのか、vectorのようにベタな連続メモリなのか、それともまったく違うのか・・・
宜しくお願いします。このコードをコンパイルしますと error C2664: 'Point<T>::set' : 1 番目の引数を 'int' から 'int &' に変換できません。 参照を外すと、静的でないメンバ関数の呼び出しが正しくありません。となります。 どのように対処したらいいのでしょうか? #include <iostream> using namespace std; template<class T> class Point { template<class> friend class Point; private: T x_; // x座標 T y_; // y座標 public: Point(); template <class U> Point(const Point<U>& r) : x_(r.x_), y_(r.y_){} Point(T x = T(), T y =T()) : x_(x), y_(y) {} void set(T& x, T& y); }; template<class T> void set(T& x, T& y) { x_ = x; y_ = y; } int main() { Point<int> ip(12, 34); Point<long> lp(ip); Point<int>::set(12, 34); // ここで当該エラー return 0; }
>>583 です
補足というか、行数の関係で書けませんでした、環境はVS2005 です。
ごめんなさい、スレを汚してしまいました 解決しましたというか・・・・tohoho情けない × Point<int>::set(12, 34); ○ Point<int> set(12, 34);
いいんだよ^^
>583 void set(const T& x, const T& y) にする。
>>585 set という変数を用意したいのか?
メンバ関数のsetを呼び出したいのかはっきりしろ。
>>583 もしsetという名前のメンバ関数を呼び出したくて、しかもインスタンス
無しで呼び出したいのなら、そのメンバ関数はstaticでなければならない
でもインスタンスがないと当然 this が無いから、x_とy_に代入しようと するとエラーになるな 質問者はその当たりをはっきり質問するように
>>583 です
皆さん、フォローありがとうございます。今回のset は変数としての振る舞いを期待していました。
strstrのように、あるメモリ領域から特定のバイト列を検索する標準関数は あるでしょうか。VC++2008独自関数でもかまいません。 strchrに対するmemchrのようにmemmem?なんてのがあればいいんですけど。
標準関数は無いと思うけど もし何度もその探索を実行するなら (\0終端の文字列と違い、長さがわかっているのだから) BM法かなんかでの探索を自前で実装するのが良いんじゃないかね。 まあ1度しか使わないのなら、そんなことせずに 先頭文字を探してそこから比較する、いわゆる力任せ法でも充分だろうけどね。
std::search() とか?
traitsって何者なんですか?
曲者
597 :
デフォルトの名無しさん :2009/10/12(月) 11:42:45
#include <iostream> #include <string> using namespace std; int main(void) { string s("表示"); int i = s.find('\\'); cout << i << endl; return 0; } これを実行すると、「1」と表示されますが、-1にするには どうすればよいでしょうか?
shift_jisを使わない
600 :
597 :2009/10/12(月) 11:59:06
ソースをSJIS以外にしてコンパイル
602 :
デフォルトの名無しさん :2009/10/12(月) 13:30:11
すみません。 趣味で、VC++のMFCで、いろいろ作っているんですが、もう5年くらいやっていて だいぶというかかなり本格的なものも作れるようになりました。 自分は文系なんでよく知らないのですが、プログラマに就職しようと思えばできるんでしょうか? 今の職場は単調作業なので、ちょっと刺激がほしいです。よかったら、転職しようとおもうんですが・・・どうでしょうか?
プログラマ板で聞いてください
>>602 貴方の人生こんな初心者スレで聞いて棒に振ってもいいんですか??
関数ポインタの配列を使った関数呼び出しはc++ではどうやって実現させたらいいですか
普通の関数はCと同じ。 クラスのメンバ関数の関数ポインタは手を出さないほうが身のため。
初心者なので詳しく答えられる方だけ回答お願いします
初心者なのできちんと説明できない人は口を出さないでください イライラします
初心者ならどんな回答も学ぶべきことがあるはずなのでありがたく思うべきです
初心者なのぐぐれません。
初心者なのでよみとれません。
初心者なので日本語わかりません。
それではboost.functionの説明を始めようか
がんばってコード書いたのによくよく調べるとSTLとかBoostに同じしかも完全に上位のコードとかがあると泣けるんだがしかし
頑張る前に調べような。そういうのが使える環境ならなおさらだ。
そりゃ一回は調べるんだけど見逃してたりするんでさ
コードを書いたことが明日への礎になる。
中で何やってるのか全く理解できないようなコードを使ってトラブルと どうにもならなくなるしな。
>>615 それはいい勉強をしたと思え。
ただライブラリを使ってるだけよりいい経験を積んだんだ。
・boostを眺める ・欲しい機能を見つける ・使ってみる ・boostを参照せずに同じ様な機能の縮小版を作ってみる ・挫折する ・boostはどうやってるんだろうと思いながらソースや解説をみて学ぶ 俺は大体こんなかんじで勉強になった functionとか
連結リストを実装するのはCでよくある勉強だし、ポインタ完全制覇とか読むと実装したくなるしな。 それをSTLで既にあるじゃんとか言って馬鹿にする奴はいないだろ。
そりゃまぁ勉強目的でやるんならね
時には馬鹿にならないとやる気にならないこともある。 Boostにあるからいいかではなかなか重い腰が上がらない。
namespaceでもprivateとかpublic使えればいいのに
anonymous namespaceが近いんじゃない?
>>625 staticメンバ関数で、それ専用のクラスを作るのはどうだろう。
気分的にちょっとアレだけど
無名名前空間とはちょっとちがうかなぁ namespace hoge { private: template <int n> struct is_even { static const bool value = n % 2 == 0; }; // インクルードしても外から使えないようにしたい public: template <int n> class fuga { static const int value = is_even<n>::value ? n : 0; 〜〜; }; } みたいな感じで使いたい 仕方ないからnamespaceをclassかstructで置き換えてそれっぽいことはできてるんだけど 今度はusing namespaceが使えない・・・
・規約でBoostを禁止しているプロジェクトにげんなりする。
>>628 namespaceだと名前空間を汚す気があれば突破されてしまうが。
静的関数のテンプレート関数版みたいなもんか。 クラステンプレートfugaの静的メンバ関数にはしたくなさそうだな。
632 :
デフォルトの名無しさん :2009/10/13(火) 16:34:48
与えられたUnicode文字列がサロゲートペアを含むかどうかを確かめる方法を 教えてください。
if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
634 :
デフォルトの名無しさん :2009/10/13(火) 16:52:39
635 :
デフォルトの名無しさん :2009/10/13(火) 16:59:43
WindowsXPでVC2008でC++プログラム書いてますけど OSが落ちる(ブルースクリーンや電源断)の直前に 実行中のプログラム内のある情報を ディスクに書き込むことができますか? シャットダウンイベントで処理をするのはできるみたいですが 落ちるというイベント?を検出できないでしょうか?
( ゚д゚) プログラミング以前の問題を感じる
>>635 何も知らないで適当レスするけど
カーネルに何らかのフックができたとしたらブルースクリーンは可能だろうけど
電源ぶちぬきを検出してどうこうはバックアップ電源でもない限り厳しいんじゃないだろうか
無停電電源に監視機能つきのがあるからそれでも買えばよろしかろ。
電源は「脳みそ撃ち抜かれた瞬間にそれに気づいて反撃できますか」 って聞いてるようなもんだ ブルースクリーンもそれができたとして 書き込まれたデータが正しいなんて全く保証できない
下記ソースの構文がよくわかりません。 ※CGraphicsはGraphics.hのクラスです。 01: // Graphics.cpp 02: 03: #include "Graphics.h" 04: 05: // コンストラクタ 06: CGraphics::CGraphics(HWND hwnd) 07: : HWnd(hwnd), FullScreen(false), RefreshRate(60), 08: Device(NULL), IsGDISurface(true), 09: DepthStencilFormat(D3DFMT_D16) 10: { 11: //処理省略 12: } 7行目〜9行目の意味がよくわかりません。 7行目の「:」はどうゆう意味でしょうか? このコンストラクタの引数は、6行目で定義されているHWNDのみだと思うのですが 7行目〜9行目に書かれているHWnd(hwnd), FullScreen(false),・・・はどうゆう意味なのでしょうか?
コンストラクタ初期化子でぐぐれ
>>641-642 だいたい理解できました。
メンバ変数に「参照」を定義した場合、
コンストラクタ初期子によって初期化を行わないと
コンパイルエラーになるんですね。
コンパイルエラーの理由は、「参照」は定義と同時に初期化を行わなければならないから
ってとこでしょうか?
そうだね。 あとconst修飾したメンバもここで初期化できる。
あとコンストラクタで初期化子で初期化しないと生成と代入のコストがかかるから無駄
>>644-645 勉強になります。
const修飾したメンバの初期化も試してみました。
コストの件は目に見えないのでまだあやふやですが
感覚的にわかりました。
ありがとうございました。
じゃあもうひとつだけ教えてやる。 参照とconst変数のほかに、 デフォルトコンストラクタを持たない基底クラスにも 初期化指定子による初期化が必須。
>>647 そういえば数日前にそれでひっかかったことがありました。
どこかのページで、「とりあえずデフォルトコンストラクタは書いといた方がいい」と書いてあったので
その時はデフォルトコンストラクタを書いてごまかしました。
コンパイルが通らなかった時、まるで意味がわからなかったのですが
おそらくあの時も初期化指定子を書いておけば通ったっぽいです。
いろいろと問題が解決できました、ありがとうございます。
std::tr1::array<int, 5> a = {1, 2, 3, 4, 5}; これがコンパイル通るのはなんで? int ca[] = {1, 2, 3, 4, 5}; std::tr1::array<int, 5> a(ca); とやるとエラーが出るから配列を受け取るコンストラクタがあるわけではないようだし・・・
C言語だと struct Array { int member[5]; }; struct Array a = {1, 2, 3, 4, 5}; でコンパイルが通る コンストラクタ、privateメンバ関数、privateメンバ変数、継承無しでクラスか構造体作ればそれと同じように動く
>>650 あぁ〜その構文すっかり忘れてましたdです
質問です あるヘッダMain.h A.h B.h C.hがあって それぞれで別のクラスの定義(クラスmain クラスa クラスb クラスc)をしています ここでクラスmainではクラスa,b,c全てを使うのでmain.hでは全ての定義ヘッダファイルA.hB.h C.h)をインクルードしているのですが クラスaやクラスbの内部でもクラスcを使います この場合A.hとB.hでC.hをインクルードすると再定義(二重定義?)のエラーがでます Main.hでだけでC.hをインクルードするとクラスaやクラスbではクラスcが見つからないとなります A,hとB.hだけでC.hをインクルードしようとするとクラスmainではクラスcが見つからないとなります こういう場合にクラスmain,a,bの全てでクラスcを使えるようにするにはどのようにすればいいでしょうか?
インクルードガードでぐぐる
インクルードガードって万が一define名が被っても気が付きにくくね?
かぶったら途端にコンパイルできなくなるからすぐ気づく
VCなら#pragma onceで一発解決
プロジェクト名_プロジェクトルートからの相対ディレクトリ_ファイル名 これでかぶることはまず無い これでかぶったらだれかが悪意を持って定義したと考える
>>655 さらに、インクルードが循環参照になってもコンパイルできなくなるので便利。
プロジェクト名_GUIDにすれば?MFCみたいに。
>>653-661 ありがとうございます
この場合はクラスc定義をインクルードガードかpragmaで囲めばよいのでしょうか?
明日試してみます
分かってないようだがまぁ調べれば分かるだろ頑張れ
>649 std::tr1::array が aggregate だから。 struct や通常の配列でその形式の初期化が通るのと同じ。
665 :
664 :2009/10/13(火) 23:46:42
って >650 で回答済みだったのね、ごめん。
struct Hoge{ char s[5]; }; struct Mage{ char s[2]; char c; }; ↑みたいな構造体だとパディングが付かない その理由は 1.最適化されて、配列と同等の扱い(つまりコンパイラ依存) 2.C言語の仕様として、まとめられる どっち?
>>666 コンパイラ依存だが、1の「配列と同等の扱い」という理解はおかしい。
そいつらにパディングが付かないのは、 char しか入ってない構造体に
パディングを付ける必要がないから。
構造体のパディングが何のために必要なのか、ググってみるといい。
親のクラスのメンバ変数をpublicにして子クラスで利用するのはやらないほうがよい作法ですか
>>667-668 ども
>>668 バイト領域云々はわかってる
そりゃshortやらdoubleやらいろいろ持ってたらパディングが入るだろうけど、
逆にそいつらを配列として括ることもできないし
「おかしい」という根拠がわからないなぁ
まぁ正しいというつもりもないけど
要はコンパイラ設計者のさじ加減、程度の話じゃないの?
メンバ変数の値を見るだけなら問題ない もし更新したいのならせったーを(作法的に)
>>655 いや、インクルードガード側が後ならそうだけど、インクルードガードの
defineのせいで他で条件コンパイルしてる部分で被った場合に気が付き
にくいことにならないだろうか?
インクルードガード用の名前付け規約みたいなのがないとさ。
>>670 別にshortだけいっぱい持っててもパディングされることはないと思うが。
で、最適化されて配列と同等というからにはsizeof(Mage.s)が3にならないと
困るわけだが、何がどう転んでもそうはなって欲しくないよな?
なので、さじ加減ひとつで配列と同等になることはない。
C言語の仕様としてまとめられるという点についてはもはや何がなにやら。
まず連続領域に取られる保証がされていないよ
>>672 インクルードガード用のdefineと他のdefineがかぶることを言ってるのかな
それは確かに面倒かもねぇ。
public指定はよくないみたいなんでprivateにした上で子クラスを親クラスでfriend指定にしたらいい感じになったんでこれでいきますわ
何だその不気味なやり方は つーか場合によりすぎて、どうするのが常に正しいとかほとんど無いから、ちゃんと どういうクラス設計なのかを明らかにしないとまともな回答は来ないと思われ
なんのためにprotectedがあるんだろうな。。。
ゲームの敵を作ってるんですがメンバ変数は同じで動きの処理だけが異なるクラスを複数作ってるんです。 class Teki { private: int hp; int mp; public: void init(void); void action(void); } できるだけ無駄を省きたいとの思いから、上記のクラスを親クラスにして子クラスでaction関数だけオーバーライドすることにして、 子クラスで同じメンバ変数の記述をなくすためにメンバ変数は子クラスからアクセスできるようfriend指定にしてみたんですが もっといい方法あったらおしえて下さい。
おお、protectedの方がスマートですね。勉強になりました。
はい。 けれど、privateにしておくべきものまでprotectedにするようなことはやめてください。 また、参照しかしないつもりでpublicにするのは、それ自体がバグだといっても過言ではないです。
protected は中途半端。 方針としては中途半端。 「見えちゃ嫌だけどちょっとは見えたほうが」 そんなの微妙すぎ。
>>668 > そいつらにパディングが付かないのは、 char しか入ってない構造体に
> パディングを付ける必要がないから。
この意味が分からんのだが。
あれだろ
4バイトごと扱うとかそーゆーのだった希ガス
char
char
int
とかきたとき1,1,4だからcharとintの間に2バイトの詰め物が入るとかそんなだよね?
だからcharだけだと詰め物いれる箇所がねーとかそういう理由?
あーでも付かないっけ?
例えば4バイト毎でchar3つのときに最期に1バイト詰め物入るような気もするけどな
http://www.g-ishihara.com/c_st_01.htm ググッたら余計わからなくなったw
sample4_tのパディング3ってなんで1なの?
またわかりにくいページ見てるな。 「バイト境界をまたがないように配置」というのは良いんだが そもそも、単独で「バイト境界」という言葉はあまり使わない。 「○バイト境界」として、数字を入れて使うのが普通。 しかも、それはシステム全体で一つに決まっているわけではなくて 配置されるデータの型によってそれぞれ決まる。 例えば、「doubleは8バイト境界に配置」「longは4バイト境界に配置」「shortは2バイト境界に配置」 というように。 構造体の場合は、配列にした時に正しくアクセスできるよう 中に含まれるメンバの中でもっとも境界条件の厳しいメンバに合わせられる。 ちなみに、sizeof(short)が2の場合は、大抵は2バイト境界に配置されるため sample4_tのパディング3は、大抵1になる。
あと、コンパイラによっては メンバの型(特に大きさ)だけではなく プロセッサのキャッシュラインのサイズも考慮して そのサイズにアラインメントをあわせようとするものもある。 で、そのへんは、構造体だけでなく ローカル変数の配置や関数呼び出し時に渡す引数の間隔にもかかわってくる場合がある。
どーしても自分自身をdeleteしたいのですか、止めておいた方がいいですか? void Hoge:: func () { // 何か処理 delete this; }
689 :
687 :2009/10/14(水) 11:57:37
気をつければ全然OKみたいですね。 僕はバグを作らないので問題ないです。 気にせず使いまくることにします。
>僕はバグを作らないので問題ないです。 そんな人はいません
そんなオカルトありえません!
まぁそれはともかくdelete thisは別に問題ないよ
ところでこのコードを見てくれ。こいつをどう思う? static const int Hoge = rand(); (本当はrandじゃないんですが、呼び出しごとに戻り値の変わりうる関数です) ということなんですが、constつき大域変数が初期化されるタイミングは どのように決まるんでしょうか。 翻訳単位内のいずれかの大域変数が参照されたとき、いっせいに初期化されるのではないか、 と推測しているのですが。
>>694 なぜ試さない。
アプリケーションプログラムの初期化時。
コンパイル時に乱数を取得したい場合はどうするの?
>>696 テンプレートメタプログラミングしかないと思うけど。
echo "#define RAND_HOGE ${RANDOM}" >> header.h みたいな感じでビルドスクリプトの中で適当なスクリプト使ってコードを生成すりゃいいんじゃね?
-Dオプションでマクロに乱数の結果を放り込むとか。 もっと言ったら、TMPでメルセンヌツイスターを実装するか。やりすぎかw
一方ロシアはPerlでメタプログラミングした
Perlもいいよな。C++の定数を使いたいときはC++でC++のソースを出力するプログラムを 書いたりもしてるが。
ああ、不正コピー防止とかに使うのかなw<乱数
一方中国はメタプログラミング現場も見せろと言った
結局はビルドスクリプトでPerlを使えってことだな。
中国人とペアプログラミングか
std::iterator_traits に関して、ポインタがT * の型しか分からない状況ときに T を(型を)得る関数と理解してますが、あってますか?
あってません
>707 です、質問の修正です std::iterator_traits に関して、ポインタとしてT * の型が分かっている状況ときに T を(型を)得る関数と理解してますが、あってますか?
>>702 俺は Ruby 使ってるけど、この手のスクリプト言語は便利。
C++とかと相補的に使える。
ぐるーげんご
PerlとかRubyを使ってるって言う人はどういうふうにつかってるの? コンパイル時にコード生成に使うだけ? Luaみたいに実行中に呼び出すの?
>>713 その人に依るんじゃないかな。俺は複雑な事はしない。
コード生成を含めテキスト処理、特定のルールでファイルの名称を一括して変
えたいとき、ファイル形式を変えたいとき、テスト、簡単なデータ抽出等々。
他、ファイルをまたがる名前を置換したいときなど便利。エディタにそういう機能が あるのもあるけどね。
VCだとALT+E+F+I
新たなソースファイルを作成するとき、Perlでファイルテンプレート生成用のスクリプトを書いてる。
ソースファイルに著作権表示一括挿入とか、一括変更とか。 コメントの出現率を計算して、少ないファイルは見直しするとか。
どれもC++でできないことでは無いが、この手のことはスクリプトの方が試行錯誤も早いし楽。
やっつけで適当な仕事をさせる時はPerlだな俺は こういう処理をさせたい、と思ってから数十秒で仕事が終わってる感覚は捨てがたい
あ、別にPerlじゃなくてもいいよ多分 他のスクリプト言語を覚える必要を感じる機会が無かったから覚えてないだけで、 多分同じような利点はみんな持ってると思うし
Visual C++ 2008 で tr1::shared_ptr< Ty > p = new Ty; // NG. explicit なので vector< tr1::shared_ptr< Ty > > v: v.push_back( p ); // NG. 同上 なんだけど、他のコンパイラでもいっしょ?
724 :
デフォルトの名無しさん :2009/10/15(木) 12:09:38
ディスプレイにメモを書くようなアプリケーションを作ろうと思っています。 GetDC関数とLineTo関数をあわせてウィンドウに線をひいたりはできるようになったのですが 文字を書くことが出来ません。どうすればよいでしょうか?
725 :
デフォルトの名無しさん :2009/10/15(木) 12:14:22
>>724 TextOut関数とか、DrawText関数とか
726 :
デフォルトの名無しさん :2009/10/15(木) 12:54:45
727 :
724 :2009/10/15(木) 14:49:49
すいません、ダメでした。どこが間違ってるんでしょうか? X・Y座標を正の値にしたりしましたがどこにも描画された様子がありません #include <windows.h> int main(){ TextOut( 0, // デバイスコンテキストのハンドル 50, // 開始位置(基準点)の x 座標 -100, // 開始位置(基準点)の y 座標 L"testabc", // 文字列 7 // 文字数 ); return 0;}
728 :
デフォルトの名無しさん :2009/10/15(木) 14:52:50
>>727 L"testabc"はUnicodeだろ。こう書け:
#include <windows.h>
int main(void) {
HWND hWnd = GetDesktopWindow();
HDC hdc = GetWindowDC(hWnd);
TextOut(hdc, 100, 100, "testabc", 7);
ReleaseDC(hWnd, hdc);
}
なんで LineTo でやった時と同じように デバイスコンテキストのハンドルにGetDC の戻りを使わないんだ?
Unicode云々いうならこうだろ・・・ TextOut(hdc, 100, 100, TEXT("testabc"), 7); TextOutA(hdc, 100, 100, "testabc", 7); TextOutW(hdc, 100, 100, L"testabc", 7);
731 :
724 :2009/10/15(木) 15:21:09
>>728 先言っておけばよかったです、エラーがでるんです
1>c:\documents and settings\user1\デスクトップ\tooloot\a.cpp(5) : error C2664: 'TextOutW' : 4 番目の引数を 'const char [8]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>ビルドログは "file://c:\Documents and Settings\user1\デスクトップ\tooloot\Debug\BuildLog.htm" に保存されました。
1>no - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
このためにユニコードにする必要があったのです
と思ったら
>>730 さんの方法でできました!ありがとうございました!
732 :
724 :2009/10/15(木) 15:26:23
>>729 なんでと言われましても、デバイスをディスプレイにするとコードも簡潔にかけて
とりあえずのテストにはいいかな、と思っただけです
>>732 デバイスコンテキストのハンドル値が 0 (NULL) は
決してディスプレイを指しているわけではないんだが?
>>732 デバイスコンテキストの0が必ずデスクトップにバインドされてる保障なんてないぞ。
ウインドウズで文字列定数を使いたかったらTRXT("")のマクロを使うんだ。
って
>>730 がいってたよ。
735 :
734 :2009/10/15(木) 15:30:39
おっと。被った。
737 :
722 :2009/10/15(木) 17:57:31
>>723 サンクスです。あの後調べてみたらboostもexplicitついてました。
自前で暗黙の変換書いちゃおうかとも思いましたが、危険みたいですね…。
危険というか、せっかく世界中の人たちがよってたかって検証しているライブラリを ちょっとした思いつきで改造しちゃう奴の気が知れない。
>>723 しかしまあ、shared_ptrはよく練られてると思うよ。
740 :
722 :2009/10/15(木) 22:12:23
>>738 いや、まったくおっしゃるとおりで^^;
しかし、実際にやって失敗してみることも重要だ。 なぜ失敗するのか理由がわかるからね。
742 :
デフォルトの名無しさん :2009/10/15(木) 22:19:30
int型の整数を文字列としてstd:string型に格納する方法を教えてください
std::string a=boost::lexical_cast<std::string>(n)
itoa を使う(非標準) snprintf を使う( c標準 ) stringstream を使う( C++標準 ) lexical_cast を使う( boost )
to_string を使う(C++0x標準)
lexical_castは例外を投げてくるのもめんどい
例外は例外で便利なときもある。
例外なんか使わずにoptionalで返してくれる方がいい
lexical_castの場合はキャストの意味論に則っているから、optionalは難しいかもね。
gdiplus絡みで一つ質問。 Bitmapのコンストラクタに異常なパラメータを渡したんだが例外を吐かないようだ。 メンバにlastResultなんてのがあってそこにInvalidParameterなんてのが入っているようだが、 そいつを見ればいいと言うことでいいのかな。 それとも、何か検証用のメソッドでもあるのかな。
int型のプライベートメンバ変数nを持つ自作クラスcがあります。 cを格納したvectorをnの値によって検索することが多いので、lower_boundなどで 使えるように、int型との比較演算子をオーバーロードすることにしました。 左辺c<右辺intの場合は、cのメンバ関数として定義できましたが、 左辺int<右辺cの場合はメンバ関数としては定義できないのでしょうか?
>>752 何故それが必要かは判らんが、必要ならfriend関数として実装すればいいと思う。
754 :
デフォルトの名無しさん :2009/10/16(金) 17:46:24
#include <ctime> int main (int argc, char *argv[]) { time_t start,finish; double dtime; time(&start); /* 何か処理をする */ time(&finish); dtime = difftime(finish,start); cout << " Start - " << ctime(&start) << "Finish - " << ctime(&finish) << " Time - " << dtime << " sec" << endl; return 0; } dtimeはちゃんとでているけど ctime(&start)とctime(&finish)を出力させたら同じになってしまうので直したいのですが どうすりゃいいですか?
そりゃctime(&start)とctime(&finish)の間に重い処理を挟まないと 同じになっちまうだろう
>>754 二回に分ければおk
cout << " Start - " << ctime(&start);
cout << "Finish - " << ctime(&finish)
<< " Time - " << dtime << " sec" << endl;
>>754 ctime()は(実装によっては)同じバッファを使い回すので、そのような結果になる。
>756の通り一回ずつ出力するか、別のバッファなどにコピーしておかないといけない。
また、同じ理由からスレッドセーフではないのでマルチスレッドアプリでは要注意。
コンパイラの設定によっては、副作用のない処理をバッサリ削っちゃうから、そのせいかもね。
>>758 なんの話? まさかとは思うけど>755の恥の上塗り?
760 :
751 :2009/10/16(金) 18:41:00
セルフフォローするのをすっかり忘れていた。 GetLastError()なるメソッドがあるようで、そいつで件のメンバをチェックしてくれるようだ。 これでBitmapのコンストラクタに存在しないファイル名を渡しても極端に大きな幅を渡しても安心w それにしても、gdiplusってインターフェースがよくないなぁ、内部でnewしたポインタ寄越すとか。
>>754 #include<stdio.h>
const char *hoge(const char *foo)
{
static char bar[100];
sprintf(bar, "%.99s", foo);
return bar;
}
int main(void)
{
printf("%s\n", hoge("1st"));
printf("%s\n%s\n", hoge("2nd"), hoge("3rd"));
return 0;
}
あれあれ?どうしてって感じ
>>760 gdiplusは全然しらないけど、GetLastErrorメソッドはよく見るのでほっとした
763 :
751 :2009/10/16(金) 18:58:11
うわぁ、すげー間違い。GetLastStatus()だってば。 WinAPIのGetLastError()に引き摺られて途中から無意識に書き間違えていたらしい。
764 :
デフォルトの名無しさん :2009/10/16(金) 20:22:06
OpenGLをつかって簡単な描画プログラムをつくっているのですが main関数でnewをつかって描画処理のクラスのインスタンスを生成して プログラムを終了するときに インスタンスをdeleteで解放するして そのときにデストラクタを呼び出したいのですが exit関数をつかったらデストラクタを呼び出せずにプログラムが終了してしまうので どうすりゃいいのかわかりません どのようにすればよいのでしょうか?
atexit()?
>>764 横着せずに順々にreturnして関数を抜けてmainからreturnすればいい。
staticな弱参照ポインタと共有参照つかえばmainできっちり開放されるシングルトンが作れるじゃないか
それら以外は開放されないけどな。
下記の構文の意味がわかりません。 bool BeginScene() { return SUCCEEDED(Device->BeginScene()); } bool型の変数を宣言しているとは思うのですが、変数名が見当たらない というかreturnがへんなところにあるし・・・ おねがいします。
bool BeginScene() { return SUCCEEDED(Device->BeginScene()); }
>>770 それは関数定義だよ^^
良くわからないときはひとつひとつ、丁寧に構文解析をしてみよう★
bool BeginScene() { bool bRet = SUCCEEDED(Device->BeginScene()); return bRet; }
>>764 自分はいちいち階層ごとにreturnするのが面倒なので、自作の終了例外クラスを
作成して例外でやってる。mainでその例外を補足し、必要な処理をやった後は
returnするだけ。
真似しちゃだめだよ。
うちのヨウムは夜静かにPCしてると「モウネル?モウネルノ?」って聞いてくるので 「そうだね、寝ようか」っていうと「マダネチャダメダヨ」と返事をするのがかわいいです
あわわ、すみません誤爆しちゃいました! スルーしてください><
>>775 なぜ? 例外はそういうときに使用するべきでないという意見以外なら聞きたい。
main以外でプログラムを終了させるのなら、それは例外として扱っても構わないのではと
思ってる。
基本的に、例外は異常系の処理を正常系の処理から分離するのがその一番の目的だと思ってるが、
深い階層からいちいちreturnで戻るのは例外の思想から外れてると思うんだが。
template<int hoge> class Fuga{ } こういったテンプレートの使い方をしているコードがあるんですが意味がよくわかりません。 template <class type> class class-name { といった使い方をするとおもったんですが・・・・
↓これか 玖符「東方シリーズ総合スレッド 6083/6083」 [ゲームサロン] 衣符「東方シリーズ総合スレッド 6082/6082」 [ゲームサロン]
>>779 テンプレートの引数には型だけでなく値も入れてもよい。
template<size_t Size> class Array { ...
みたいな、サイズ固定の配列をテンプレートで作るときなどに使う。
>>779 template <int N>
struct hoge
{
int a[N];
};
とか色々つかえる
783 :
デフォルトの名無しさん :2009/10/17(土) 18:04:49
なるほど! template<int hoge> class Fuga{ public: Fuga(const float ak[]) : am(ak) { } これはどういうことですか?コンストラクタだと思うんですが:の意味が・・・ }
>>778 775 じゃないけど、プログラムを終了させることが異常系だとは限らないわけで、
正常な処理として終了させるときに例外を使うのは例外の本来の用途から外れる
からでしょ。
例えば例外発生時にだけ必要なコードは実際に例外が発生するまでメモリ上に
ロードしないような最適化も考えられるわけで、そんな環境では変に終了がもたつく
ような結果を招くことになる。
とうほうちゅうきめぇ
PCで使うなら何度も通るようなパス(ループの内部等)でtry {}しない限りもたつくなんてありえないな
array_2[] のデータがarray_1[] の配列の何番目に位置するかを取得する、プログラムです。結果をOutputIterator out コンテナに格納しようとし、下記コードからコメントアウトしてコンパイルすると、 error C2664:3 番目の引数を 'std::vector<_Ty>' から 'std::vector<_Ty>' に変換できません。となってしまいます、何処が間違っているのでしょうか? #include <iterator> #include <iostream> #include <vector> #include <algorithm> template<class Iterator_First, class Iterator_Second> void find_first_element(std::pair<Iterator_First, Iterator_First> itpair_first, std::pair<Iterator_Second, Iterator_Second> itpair_second) //std::pair<Iterator_Second, Iterator_Second> itpair_second, OutputIterator out) { Iterator_First it; Iterator_Second p; unsigned int far = 0; for( p = itpair_second .first; p != itpair_second .second; ++p) { it = std::find( itpair_first.first, itpair_first.second, *p ); far = std::distance(itpair_first.first, it); // *out = *far; // ++out; std::cout << *p << " は " << far << " 番目です \n"; } } int main() { using namespace std; int array_1[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; int array_2[] = {50, 40, 90, 100, 30, 80, 60, 20, 10, 70}; std::vector<int> lhs; find_first_element<int*, int*>( make_pair(array_1, array_1+10), make_pair(array_2, array_2+10)); //find_first_element<int*, int*, std::vector<unsigned int> >( make_pair(array_1, array_1+10), make_pair(array_2, array_2+10), lhs); return 0; }
>>784 779で
>なぜ? 例外はそういうときに使用するべきでないという意見以外なら聞きたい。
と書いてるが、まあ、いい。
例外の実装は基本的にlongjmp的なものでされていると認識しているが、それで
パフォーマンスが大きく落ちるとは思えないんだが。
>>789 足りないか? 足りないとすればどのあたり?
>>788 です
× //*out = *far;
○ //*out = far;
ここですが修正します。
>>785 イマイチよくわかりません。コロン:ひとつでいいんですか
>>788 VC8だと警告一個(distanceの戻りが)で通ったな。
コンパイルに邪魔だから全角スペースに変えてまでインデントを気にする必要ないよ。
出力イテレータをfind_first_elementに渡すときにstd::back_inserter(lhs)にしたらどうかな?
,.へ___,.-ァ ヽ_ く____ゝ'、 / ヽヽ、 r| ̄ヽ、____/ ̄L_ く_/ヽY__ ̄7 〈/^ヽ、'''" ̄ ̄ ̄`""''ヽ!/ /ヽ、__」 `>'´ ( /ヽ、| / `'ー'ヽ. i⌒ヽ,/ / / i ハ ハヽヽ ヽ ' , ハ /)、 ,ゝ レ、 ハ_ハ_,!V レ'、!,__!/i | .__/^)、 ,i '‐‐、//`7i -‐- -─- ヽ__」 l、ヽ、 _/ ./〉 8ヽ、| /.7 "" """ / // > )'´ヽ |_/ 8 / 人 「 ̄`i ,/ / / "8 ヽ、,_______,.r'ァ>∞<] 8 レ〈ヽ、>.、ヽ__ノ ,イ / / 8 、,_______,./| ̄ ◆ (ン\ 7ヽ7、/| / 7 ,イ 8 ,/ (イ ヽ!、〈ム〉レ' 「>,.ハ 、 ● / ,イ、__ハ______,ゝ、>_ヽ、,_______>-‐''"´ ノノ . く_、__ハ__、__rン ノ--r、 7ー、___,.、___,.-‐::::`'ー| トイ | ヽヽ __ .| ヽヽ __ .| ヽヽ __ /::::/::::::::::::::::::::::::::::r'" _/」. |\ / |\ / |\ / r'く/ヽ、人__ノ\__,ノ r'ソ-、 | / \ | / \ | / \ ゝy‐-、〉二ヽ二rニ=‐'^'〉〉 | =3 ,'⌒`''く{_7〉::::::::::::::::::::::::`'ー'r' ノ ., : ヽ ̄`ヽ_Y::::::::::::::::::::::::::::::::::::`'ー' ・゜ ` ̄
なんすかこれ
>>790 別にあんたを説得しようとしてるわけじゃないし、する気もない。
初心者が考えなしに真似しちゃダメ、おすすめできない、ってことが言いたいだけだよ。
例外処理のパフォーマンスについては↓を見ておいたほうがいい。
http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf (例外処理については "5.4 Exception Handling" )
最近は longjmp を使うような実装(上記文書中の 5.4.1.1 The "Code" Approach )よりも、
例外が発生しない場合の実行効率を最適化できるデータテーブル式の実装(同じく
5.4.1.2 The "Table" Approach )のほうが多い。っていうか、 Windows 以外ではほぼすべて
テーブル式の実装だと思う。その場合は例外発生時に必要なコードとデータのサイズが
膨らむことにになるので、 >784 で挙げたような話が出てくる。
>>790 longjumpではデストラクタが呼ばれないでしょう。
デストラクタを呼ぶからくりを考えただけでも、例外の構造の複雑さを暗示している。
>>799 それでいて、例外を投げないときのオーバーヘッドはほぼ無いんだから想像を絶する。
>>798 わざわざ資料リンク感謝。あなたの意図は掴めた。
最近の情報に通じてなくて、お恥ずかしいばかりだ。
例外が何で例外って名前なのかって言う問題もあるよねぇ〜。 基本的に大域ジャンプする目的で使うのは用途違いだと思うよ。 個人的な解釈だと、これ以上実行すると何らかの不利益がでるからやめよう。っていう実装だと思うのよね。 例外なしでもプログラムは組めるし、そんな大域ジャンプするような変なフローだと追跡大変じゃないかい?
>>799 例外の実装の話をしているのであって、longjmpを使うという話をしているのではないんだが……。
>>802 まあ、そうなんだが、main以外で終了したいときもあるし、パフォーマンスに
重大な影響を及ぼすわけではないのなら、さっさと楽な書き方をしたいときもある。
でなければ、exitが存在する理由がなくなる。
exitを使いたいとき、exitでは呼ばれるべきデストラクタが呼ばれないため、
例外を使うと便利という話。
exit使うぐらいなら例外ってぐらい?
>>804 否定はしないが、人には勧められない方法ではある。
>>805 ニュアンスはちょっと違うけどね。exitではデストラクタが呼ばれないのが痛い。
exit使いたくても使えない、でも、exit的なことをしたい、だから、例外。みたいな。
「この例外を投げればプログラムが終了する」とか使ってたら思ってたら、実は途中に catch(...) があって不可解な結果に悩まされたりするとか。
>>806 exitの代わりに例外使用している側だが、逆に否定しない理由が知りたい。
こうやってわざわざ書いてるのは、真っ当な批判を受けたいからというのもある。
>>808 exitの代わりに例外使用している側だが、それはあるかもね。
>>794 >>795 ありがとうございます。
>>794 >VC8だと警告一個(distanceの戻りが)で通ったな。
ごめんなさい、環境を書いていませんでした、VS2005です。
>コンパイルに邪魔だから全角スペースに変えてまでインデントを気にする必要ないよ。
ありがとうございます^^
>>795 ありがとうございます
find_first_element<int*, int*, std::vector<unsigned int> >( make_pair(array_1, array_1+10), make_pair(array_2, array_2+10), std::back_inserter(lhs));
ですよね、これも同じ結果なんですよ、というかこれを貼ったつもりだったのですが
混乱してました。
>>796 ←こういうの貼ってるやつ恥かしくないの?
お前の生きてきた成果がコレw?
もうやめちゃえよ
プログラムなんてこの先組めるようになんてならないからw
多分、生まれとか育ちとか悪かったんだろw
>>809 exitはデストラクタが呼ばれないことを知っていて、リスクを承知して使うなら止めないけど。
他人に勧める手法ではないなと思うよ。
814 :
802 :2009/10/17(土) 19:05:02
>>804 俺exit関数はほとんど使ったことないな。特にC++に移行してからはまったく。
Cにしたって、結局さかのぼってメモリを開放しないと後遺症のこすから、はじめからexit関数は無いもんだとおもってる。
ネストの深いプログラム書くとほしくなるのは理解できるけどね。
>>813 すまん、読み返したらぜんぜん違うこと言ってた。
>>813 了解。
>>814 まあ、おっしゃるとおり。自分もコンソールアプリケーションを書いていて、
--helpオプションを指定されたとき、ヘルプ画面を表示して終了とか、
そんなちゃちなときにしか使ってないんだけどね。
極論するとtry-catchって返り値でのエラーチェックよりコードがシンプルに書ける(結果としてバグが減る)ってだけじゃないの?
>>817 そだね。そうは言っても、戻り値チェックで異常系の処理をやっていたら、
コードの大半が異常系になっちゃうし、リソースリークさせないための処理も
書くとえらいことになる。
俺もexit代わりに例外使ってるよ。 というか、それにしか例外使ってない。
>>808 それはエラー値returnしてるのにチェックしてない箇所が途中にあっても一緒では
822 :
802 :2009/10/17(土) 19:20:44
むぅ。ちょっと強く言い過ぎたか。 俺基本的にメモリ確保するの大嫌いだから、スタックですむならそうしてるんだよな。 機能別にクラス設計して、その機能を集約するクラスを設計して、画面表示が必要なら、その集約クラス用の表示クラス書いて。 ってだんどりだなぁ。 機能には初期化、主要処理、破棄。を明確にして、無限ループは基本的に作らない。for文大好き! そんな感じで停止性を確保していけば、なかなか途中で終わらせようとは思わなくなった。どこかで止まるからね。
>>821 だれも例外とエラー値の違いなんて話してないよ。
イベントループからの脱出は例外でやるんですね try { engine.run(); } catch(/* ry */) { ... } ループの内部でisQuit();とか馬鹿らしいですからね
>>823 例外はお奨めできない。
となるとじゃあ変わりに何を使えばいいか?となったら、エラー値じゃないの?
実験用の書き捨てコードを書くときに手を抜けて便利 APIが失敗したときはときはどうしよう→とりあえず例外に旨を添えて投げときゃいいじゃん みたいな具合で
>>826 その後の774とか778でreturnと比べてないかね
>>822 システムコールやライブラリコールでの戻り値を全部チェックしてる?
自分はprintfレベルでも全部チェックしてるんだけど、そんな状況で例外を
使わないとまじ死ねるんだが、どう?
830 :
デフォルトの名無しさん :2009/10/17(土) 19:37:29
783をお願いします
788 これもお願いします。
>>829 関数でラップして、ブーリアンにできるやつはなるべくそうする。これだけで半分はなくなると思う。
エラーチェックはできるだけ関数の頭でifの羅列で切って抜けてきた処理をこなすって感じだな。
もちろん抜けがあればそこで引っかからないこともあるけど、デバッグと簡易ユニットテストで取るようにはしてる。
>>836 なるほど。
自分はソースの読みやすさや整合性、一貫性を重視してて、失敗しない関数
(つまりエラーの戻り値を返さない)を書いて、値を求める関数以外はvoid型にして、
例外を多用してるわ。まあ、ここらへんは設計思想の違いかなと。
つーかね、大概のシステムコール、ライブラリコールって、バグがないときに普通に 使ってたらエラー値が返ってくることないと思うのよ。だから、そんなののために 毎回異常系の処理を書くのはちょっと無駄かなと思うのよね。
>>839 ありがとうございます。
結果は得られましたが、疑問が残ります。
なぜ、template 引数を明示したらエラーになるのでしょうか?
>>838 エラー回復が必要な処理はチェックは条件がそろったら速攻でしてなるべく必要ないように使うかな??
>>841 概ね理解できるけど、C++には例外があって、例外が実際よく使われているのに、
そこまでこだわるのは、ちょっと損してるかもね。そりゃ、例外使うと
パフォーマンスが仕様に満たないとかなら分かるけど。
>>788 をboost様の力を借りて頑張った
#include <boost/concept_check.hpp>
#include <boost/range.hpp>
#include <boost/concept/requires.hpp>
#include <boost/range/concepts.hpp>
#include <boost/foreach.hpp>
#include <boost/call_traits.hpp>
namespace foo {
using namespace boost;
template <typename I0, typename I1, typename O>
BOOST_CONCEPT_REQUIRES (
((SinglePassRangeConcept<I0>))
((SinglePassRangeConcept<I1>))
((OutputIterator<O,typename boost::range_difference<I1>::type>)),
(void))
find_first_element(I0 const& i0, I1 const& i1, O o) {
typedef
typename boost::call_traits< typename
boost::range_value<I0>::type >::param_type
value_t;
typedef
typename boost::range_const_iterator<I1>::type searchee_iter;
searchee_iter not_found = boost::end(i1);
BOOST_FOREACH(value_t v, i0) {
searchee_iter s = std::find(boost::begin(i1), boost::end(i1), v);
if (s != not_found) {
*o = boost::distance(std::make_pair(boost::begin(i1), s));
++o;
}}}}
>>840 テンプレート引数に指定された型が間違ってるから
std::back_inserter(lhs)の戻り値の型がstd::vector<unsigned int>じゃない
>>842 それもそうだねぇ。検討してみるよ。
それじゃ、引っ込む。
846 :
843 :2009/10/17(土) 20:35:30
!= not_foundってなんかおかしいな… やっぱfindはoptionalで返してくれるべきだ
インターフェースと実装の分離をして作業を独立化したい時に例外の扱いをどうするべきか悩む たとえばfactoryパターンを使うとして、そこでcreateされる実装はしばしば隠蔽されていることがある でも、どんな例外が来るのか、仕様変更に伴う例外の増減っていうのは実装に依存する 結局のところ、クライアントは実装のソースかドキュメントを読んでそれにあわせてコーディングするしかない これじゃあインターフェースと実装の分離をした意味がうすれてしまう(コンパイル時間短縮の効果はあるが) すべてをあきらめてcatch(...)にすることもできるけど回復可能なエラーを見落としてしまうかもしれない
>>845 まあ、こっちも言い過ぎたかも。ではね。
>>836 数えるのも嫌になるほどあるAPIも使用してる分は全部ラップするのか?
それこそ時間の無駄だろ。
>>847 それはよく分かる。だが、C++の例外仕様は糞なので、ドキュメントを精査するしか
ないかもね。(つか、例外がなくても、ドキュメントはしっかり読んで当然ではあるが)
逆に、投げうる例外をドキュメントに書いてないライブラリはちょっと使いづらいね。
>>847 その問題を例外以外なら解決できるのか?
問題なのはインターフェースの向こう側にある無数のエラーをどう扱うか、
ということであって、エラーの報告方法として例外を使うかそれ以外を使うか
という点は別の話じゃないのか?
で、結局スマートな解決方法って何なの?
例外にしろエラーコードにしろ、関数が返しうるあらゆる結果を想定してコーディング しなきゃならないのは一緒だよね。 個人的にはエラーコードのほうが好きだけど、例外の大域ジャンプ能力は確かに 便利だし、わかってて使うぶんにはどっちでも構わないと思うけどなあ。
例外のコストが法外に高いような書き方をしてる人がいるけど、そこまでは高くないぞ 例外を使ってmainまで脱出するせいでアプリの終了がもっさり、なんてアホなことは さすがに無い まぁ、やたらとデストラクタが重いクラスとかあったら別だが
ビットをフラグとして扱う処理があるとして そのビットのフラグをランダムに発生させる処理がわかりません。 例えば8ビット中に、3本から6本のフラグをランダムに発生させるにはどうしたらよいでしょうか。
3〜6のいずれかを乱数で発生させて その回数だけ0〜7の乱数を発生させてそこのビットを立てる
>>856 ありがとうございます。
でも、それだと偏っちゃいませんか?
処理としてすっきりするんで作ってはみたのですが
>>857 256通りも無いんでテーブル作っておいてそのindexを乱数で得てマップするようにしてはどうか
// 例:
static const BYTE table [210] =
{7,11,13,14,15,19,21,22,23,25,26,27,28,29,30,31,35,37,38,39,41,42,43,44,45,46,47,
49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,67,69,70,71,73,74,75,76,77,78,79,81,
82,83,84,85,86,87,88,89,90,91,92,93,94,95,97,98,99,100,101,102,103,104,105,106,
107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,
126,131,133,134,135,137,138,139,140,141,142,143,145,146,147,148,149,150,151,
152,153,154,155,156,157,158,159,161,162,163,164,165,166,167,168,169,170,171,
172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,
193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,
212,213,214,215,216,217,218,219,220,221,222,224,225,226,227,228,229,230,231,
232,233,234,235,236,237,238,240,241,242,243,244,245,246,248,249,250,252};
table[get_random_with_range(1,210)];
>>858 ありがとうございます。
時間掛かったでしょうに…
一先ず、858さんの方法でやってみます。
汎用性がないのが問題ですね。
>>854 以前シミュレーションのコード書いたとき例外入れると入れない(if で脱出)
で実行速度測ったら結構違った覚えがあるけど、今のコンパイラは違うのかな。
また機会があったら測ってみるか。
>>859 わざわざこんな単純なテーブルを手書きはしない
はず
>>859 汎用性を求めるなら、固定のテーブルを持たず、テーブルを作る処理を関数化すればいい。
初心者です。 class を使った Circular doubly Link List というものを作っているのですが、最初と最後のノードの接続がうまくできません。 どこか完成品置いてあるサイト知ってる方いませんか?
>>855 #include<stdio.h>
#include<stdlib.h>
int main(void)
{
int i, j;
int bits, value;
for(i=0;i<100;i++)
{
bits=rand()%4+3; // 3~6
for(j=0,value=0;j<8;j++)
{
value<<=1;
if(rand()%(8-j)<bits) value|=1, bits--;
}
printf("%d\n", value);
}
return 0;
}
エンドユーザーからすれば「リトライ/アプリ終了/無視していいエラーなら無視」が選択できてエラーメッセージが見られれば悪くないと思う ということで文字列でのメッセージング機能を備えたretryable/fatalの二つの例外基本クラスとその派生クラスを作る キャッチするほうでは仕様がわかってるなら細かく派生をチェック、仕様がわからなかったりめんどくさかったらリトライするか終了するかだけチェック これで十分だと思うんだがどうか?
>>864 は rand() を一様乱数であるとして
3bit が 1 なのと 6bit が 1 なのが同じ確率で出る
実際の組み合わせ数はコレ
8C3 56
8C4 70
8C5 56
8C6 28
8ビットに3〜6本だからまだいいけど 増えたらどうするんだろうね
>>863 まだテンプレにそって既存コード晒した方が返答されやすいと思うよ。
メンバ変数名の命名規約が色々あってどれが一番良いのかよく分からん。 どれがデファクトスタンダーとなんでしょ? m_hogeName mHogeName hogeName_ hogeName
個人だったらどれでもいいよ 集団だったらその集団で決めればいい
>>860 mainへの抜けだしなんて一回すぽんと走るだけのコードだろ
何万回と回せばそりゃ速度は変わるっつーか、80:20の法則とかもしかして知らない人?
863です。 ノードの接続は問題ないと思うのですが、わからないエラーがでます。 ろだ > 雑多なファイルをアップする場所 > 9985.zip にファイル上げましたので時間がありましたら見てみてください。
>>870 データメンバ名やgetterなど、どんどん名前が被ってくるから、切りないよね。
被ったら、語尾に_を付けていくというやりかたにしてるな。被らないかぎりシンプルに。
class hoge {
...
};
class fuga {
public:
fuga(hoge hoge__) : hoge_(hoge__) { ... }
hoge get_hoge() const { ... }
...
private:
hoge hoge_;
};
みたいな。
>>872 例外処理が重くないとは一般論としては言えないということでは。
被って最後に_付けるだけとか地獄絵図にならねーか?
アンスコの数にはっきりした意味づけがあれば、それもありかなあ。 仕事で強制されるのは勘弁してほしいけどw
>>879 意味付けはない。出た順。
俺も最初はメンバはm_とか引数はthe_とか(本に書いてあった)やってたけど、
切りないんで、シンプルに_追加だけにしたんだわ。それ以来楽になった。
コンパイラが区別できればいいし、どうも自分もコンパイラみたいなところが
あるのか、_の数だけで普通に区別が付いてる。そうでない人が多いのなら、
それはおすすめできないんだろうな、たぶん。
ああ、メンバを参照するときは毎回this->hoge_とかやってるからかもな。 メンバはよく使うくせにローカル変数に埋もれがちなんで。 コンパイルの段でどうせthis->hoge_的処理をやってるので、 パフォーマンスも問題ない。 the_other.hoge_とかthat->hoge_など、文芸的にもなるんで、ソースが 読みやすくなる。(the_other.m_hogeやthat->m_hogeなどよりも)
2つの場合は処理系で使うんじゃなかったっけ?
>>874 コピーの時の最後の要素のポインタ繋ぎを忘れてる。
>>884 ありがとうございます。
コピー時の修正しました + そこを文章化して読ませなくしました。
Unhandled exception at 0x63ef31ea (msvcr90d.dll) in NewLinkList.exe: 0xC0000005: Access violation reading location 0xfeeefee2.
こんな感じのメッセージがでます。
ろだ > 雑多なファイルをアップする場所 > 9987.zip
よろしくおねがいします。
>>875 メンバー変数は _ 最後につけてるな。あまり美しくないけど、
被った場合のみには、みたいな条件付けるとわけわからん。
たまに先頭に _ 付ける人いるけど、それは危険に感じる。
一旦ルール決めたらプロジェクトではそれにしたがう感じだけど、
いまいちしっくりくるルールが無い。
>>885 List::insertInOrder()の中でwhileループが1度も回らないとどうなる?
>>876 mainへの抜け出しに例外を使う、って話に「アプリが重くなるかも」なんてトンチキ
なこと言う奴がいるから「そこまで重い訳がない」って話だろ
そこに、何万回も回してベンチ取ったような話を持ってくるのも明らかにトンチキ
>>886 大抵のルールはそれぞれが正しさを持っているから、参加してるメンバーの
大半が納得していればOKだし、納得していなければ、改善すればいいと思う。
_の件だけど、コントラクトのためにローカルクラスを作ったりしてると、
メンバ名でも被るのが当然になるんで、警告メッセージがえらいことになる。
そのため、_を追加していくことにした。
>>889 ローカルクラスって使ってるコード見たこと無いんだけど具体的にどうやってつかってるの?
>>887 ありがとうございます。
直してたら何してるのかわからなくなったのでそれ注意しながらやってみます。
>>891 うーむ
これって関数の最初と最後に普通にis_valid関数を呼び出すだけじゃダメなのかな?
いまいちローカルクラスにする利点が見えないんだけど・・・
>>893 これはgetter、setterだから一方向だけだけど、引数も戻り値もある関数だと、
関数の処理が始まる前に必ず事前条件が、関数の処理が終わった後に必ず
事後条件が評価されなければならないわけだけど、それを実現するには
コンストラクタ、デストラクタを用いるのが一番手っ取り早い。
コンストラクタを使うのは、引数または戻り値があるとき、関数の頭は
必ずローカルクラスと体で覚えるので、見落としが減る。
returnする箇所が複数あるときは事後条件を集約できて、コードが
見やすくなるし、心配も減る。
C++に事前条件、事後条件を付け加えるべきだみたいな意見が出たとき、
ローカルクラスで代用できるから、今んとこ必要ないということになった、
という経緯もあるんで、それを使ってる。
まあ、そこまで気にしなくてもいい程度の話だけど、あればデバッグは
格段に楽になることはうけあい。
892です。 何度もすいません。 List::deleteList()が元凶だったみたいです。 みなさまありがとうございました。
>>883 アンダースコアふたつ連続は、どこに現れても予約識別子になっちゃうよ。
>>888 >>794 や
>>798 のリンク先にある文書は読んで言ってるの?
「極端な場合、頻度の低い例外に最適化したシステムでは最初の例外スローが
ディスクアクセスを起こすかもしれない」と書いてある。
それを否定できるほどの根拠があるの?
実際に "cold" セクションと呼ばれる領域を正常系のコードから分離してまとめる
ようなコンパイラ〜リンカも存在するんで、そんなに非現実的な話じゃないと思うし、
実際に例外を使っててそういう動作をされても、まぁ文句は言えないかと思う。
>>896 みたいね。やれやれ。別の方法で命名しないといけなくなったk
というわけで、皆さん、ごめんなさい。名前の後に_を追加していくという
命名法は使えませんので、ご注意を。
メンバ変数の後にアンダーバーつけてるな ほとんどの場合、privateだから使うとしてもメンバ関数くらいだし
俺は逆に引数の後ろに_付けてる
メンバにm_とか付けてると○されますか?
クラス・タイプはhoge_hoge typedef名はfuga_typeあるいはfuga_t 引数・ローカルはhoge_hoge 面罵はhoge_hoge_あるいはhoge_hogeですべてthisを使う メソッドはhoge_hoge いまのところこれで困ったことはない タイプ命と変数名が同じになることもあるけどタイプの場合大抵は名前空間があるし、無くても文脈でわかる、最終手段でclass hoge hと明示化もできる
>>902 メンバ変数が多いと一面thisの荒しになりそうだな。
>>864 完璧ですね。
数学をちゃんと理解してないことを実感しましたよまったく
ありがとうございました。
>>901 vc++とか使ってると、参照先のメンバ一覧がでてくるよね
そのときにm_で統一してると、少し面倒が増える
だから最後にアンダーバー
関数はcheckHit
メンバ変数はNumber_
ローカル変数はNumber
定数はFIXED_NUMBER
みたくやってるけど、クラス名とローカル変数がかぶるときがあるから難点
クラス名はなるべくきっちり書いて、変数名は適度に省略とかすればかぶらなくね? 省略スンナボケとか周りに言われると困るけど
面倒だからハンガリアンでいこう。 メンバー変数 mNumber ローカル変数 rNumber グローバル変数 sNumber const定数 cNumber 関数 checkHit クラス Hoge
自動変数名は、関数全体にスコープを持つものはフルスペル、 2〜10行程度の短いスコープを持つものはバッサリ省略、と使い分けてるな。 でもさあ、変数名はフルスペルで!って言っても、 まさかminimumとかmaximumとかいちいち書かないよな。 Cの標準関数名にある省略形なら使ってもOK、って規約を見たことがあるけど。
さらに考えを進めて、minimumとかmaximumとか具体的でないものを書くならm,n;と書く方がマシだわ 長ったらしい名前で画面が見辛くなるだけな気がする
英語圏の人は直感でかけるんだからいいよな
VC2008なら日本語で変数定義できるから(ry
913 :
デフォルトの名無しさん :2009/10/18(日) 22:08:06
このレベルの英語なら関係なくね
>>906 俺はクラス名は大文字で始めて、メンバ変数、関数は小文字で始めるな。
だからクラス名と変数が被る事は無い。定数は全て大文字は同じ。
数値計算系のプログラムだと変数名にこだわると死ねる もともとの数学からしてt,x,y,z,s,t,u,v,h,i,j,kとか名前なんて無かった状態だし
916 :
909 :2009/10/18(日) 22:54:15
>>915 使う変数も多いだろうしねえ。
でも数学屋なりの共通認識はあるんだろ?
数値計算やるけど、特に他の場合に比べてそんなにひどいと思わんけどな。 コーディングする前に式があるわけで、その式にできるだけ近づける。 v でも式だと v1, vx, とか v_1, v_x, とかあるわけだし。 名前に悩むことはあるが、数値計算系でなくても悩むからね。
ここで聞くべきかわからないのですが、boost::lambdaで引数のメンバにアクセスする 方法を知りたいです。例えば、vの中からa==10のものを検索したいとします。 struct HOGE { int a; int b; }; std::vector<HOGE> v; std::find_if(v.begin(), v.end(), (boost::lambda::_1.a == 10)); と書いても、プレースホルダにaなんてメンバはないので、コンパイルできません。 何かうまい方法はないものでしょうか。
>>918 std::find_if(v.begin(), v.end(), ((&boost::lambda::_1)->*(&HOGE::a) == 10));
これじゃ「うまい」とは言えないかもね。
920 :
デフォルトの名無しさん :2009/10/19(月) 10:15:08
"or"というメンバー変数の行で error: expected unqualified-id before ‘||’ token というコンパイルエラーが出ます。 多分どこかの誰かが"or"を'||'に定義していると思うのですが、 誰がいつdefineしているかを調べるにはどうすればいいのでしょうか?
orを別の内容で再度#defineすれば、たぶんエラーメッセージで分かる
IDE使えば宣言に飛べるんじゃね
VC++でCからC++に書き換えたコードがあるんですが class Object {...}; class MyObject: public Object {...}; みたいな宣言があるときに void print(Object *o) { printf("%p", o); } void myfunc() { MyObject *mo = new MyObject(); print(mo); } とやったときにプリントされるアドレスと mo が一致しません。 printで引数を受け取った時点で、moよりも4バイト後ろに下がっています。 なにか心当たりはありませんか??
>>923 Objectに仮想関数がなく、MyObjectに仮想関数がある
仮想関数のディスパッチを処理するために、俗に vtbl とか vtable とか言われるものが先頭に追加される
つまり、変数の内容(アドレス)をプリントしようとして汎用関数 void print_addr(void *p) { printf("%p", p); } を作ったとしても、渡すインスタンスによっては 期待した動作にならないということですか?
期待が間違っていればね。
MyObject* → Object* の過程で vtable 付き/vtable 無し のアドレスを渡す 引数を Object* で受けてるから、その変換が進むわけ MyObject型のものを Object型として動作させなきゃいけないんだもの 引数を void* で受けるなら 変換なんか知ったこっちゃナシでしょ
void print_addr(void *p) { printf("%p", p); } void print(Object *o) { print_addr(o); } に対して MyObject *mo = new MyObject(); print(mo); print_addr(mo); で、別のものが表示される場合がありえます。
なるほど! アドレスずれの原因がわかったついでに、 メンバ変数の内容が、なぜか1つ次のメンバ変数の内容になってしまう バグの原因もわかった気がします。4バイトずれが原因ぽいです。 とりあえず基底クラスにvirtualなデストラクタを追加してみたら すべてのバグが直りました どうもありがとう。
まさか void * で受けといて (Object *) でキャストして Object型の操作利用? Object * で受けといて (MyObject *) でキャストして MyObject型の操作利用? かなり危なっかしい使い方のように思えるけど…
キャストしたら負け。
932 :
デフォルトの名無しさん :2009/10/19(月) 11:35:31
"or"ってそもそもC/C++の予約語だね。 使う方が悪い。困った。
予約語・・・? iso646.h で #define されるだけじゃないっけ と思ったけど C++ では予約語なのか
困ったなら orz にしたら
935 :
デフォルトの名無しさん :2009/10/19(月) 13:11:31
DXUT(MSのDirectXを扱うライブラリ)を使用しています。 STLのリストを使おうと思って、その使おうとしているクラスのヘッダファイルに #include <list>を書くと、その時点のコンパイルでで \microsoft visual studio 9.0\vc\include\cstdio(49) : warning C4995: 'gets': 名前が避けられた #pragma として記述されています。 というエラーが発生します。冒頭に#pragma onceは記述してもしなくても出ます。 どのような問題が考えられるでしょうか?
<list>で避けられたgetsを<cstdio>で宣言していると言うだけのことです。
937 :
デフォルトの名無しさん :2009/10/19(月) 14:08:31
MSに心なんてあると思っているの?
939 :
935 :2009/10/19(月) 15:53:49
すいません。エラーではなく警告でした。 恐らくこのままでもstd::Listは使えると思います。 しかしこのような警告が39個も出てコンパイル時に面倒です。 というかこのまま警告を出していて不都合はないのか? そしてなぜ、このような警告が出るようにSTL・あるいはcstdioの 設計が出来ているのか、などお詳しい方いらしたらご指導お願いします。
どうして.演算子をオーバーロードできないんですか?
>しかしこのような警告が39個も出てコンパイル時に面倒です。 抑制したら? 抑制の仕方はコンパイラのスレで。 >というかこのまま警告を出していて不都合はないのか? 全然。単に警告だから。 >そしてなぜ、このような警告が出るようにSTL・あるいはcstdioの設計が出来ているのか、 MSだから。つーか、インクルードの順番変えてみた? >お詳しい方いらしたら 環境も判らんのに何に詳しいと? >ご指導お願いします。 イヤだ。
>>940 どうして演算子をオーバーロードできないと思い込んでいるんですか?
単なる誤爆じゃないか?
944 :
デフォルトの名無しさん :2009/10/19(月) 17:16:26
>>941 すいません。環境はVC++2008ExpressEditionです。
動作原理みたいなものが分かって、かつ抑制するしかない時は
抑制してみようと思います。
インクルードの順番は変えても無駄でした。
>MSだから
これは全然分からないので、出来れば
もう少し掘り下げてお願いします。
>>942 え?できるんですか?.演算子のオーバーロード
>>945 できることもあれば、できないこともあります
試してみましたか
947 :
944 :2009/10/19(月) 17:20:45
まず、警告のいわんとする事が分かっていないです 警告の全般的な意図が分からないです。 ・・でもちょっと予想で言って見ます。 MSは、予約語みたいな感じで、将来的に この名前を使うかも知れないので、他のライブラリで バッティングする名前をつけるなよ・・と こういいたいのですか?
getsは常に悪となったので、その名残かと。 かといって4995を常に抑制するのはよくないので、そっとしておいてください
>>946 試しましたができませんでした
#include <iostream>
struct hoge
{
void operator . (int val) const
{
std::cout << val << std::endl;
}
};
int main(void)
{
hoge h;
h.100;
return 0;
}
950 :
948 :2009/10/19(月) 17:27:25
_CRT_SECURE_NO_WARNINGSでいいかもしれんね
952 :
944 :2009/10/19(月) 17:39:38
>>948 グーグルウザスw。助かりました。ありがとうございます。
これから使う関数んじゃなくて、廃棄する可能性がある関数の使用に
警告がいっているということみたいですね。
という事は
>>936 はあべこべで、実際には<list>が将来廃棄される
可能性のある関数を使っているという認識で良いでしょうか?
ググルウザスわかります
>>936 はあべこべでもないと思う
getsは廃棄予定ではなく、強く非推奨なだけだったように思うよ
いや、確認していないがlistがgetsを使うなんて馬鹿なことはないはず。 従って、listで何らかのプラグマで抑制しているんじゃないのか? cstdioはgetsを宣言せざるを得ないからな。
955 :
944 :2009/10/19(月) 18:01:18
>>953 確かに読み方によっては正しいですね・・・。
ともかく、std::Listで行なわれている往年のC言語の書き方を
MSのcstdioが嫌っている、という事ですね。
もう一つ質問させてください。
cstdioに
using ::printf; using ::puts; using ::remove;
using ::rename; using ::rewind; using ::scanf;
using ::setbuf; using ::setvbuf; using ::sprintf;
using ::sscanf; using ::tmpfile; using ::tmpnam;
using ::ungetc; using ::vfprintf; using ::vprintf;
だとかその他色々書いてあって、文脈的にこれらを使うなという
大意になっているのは、これまでの経緯で分かりましたが
この「using::○○」という書き方は何を意味するのでしょうか?
ネームスペースの使用宣言とも違う書き方ですよね・・・。
956 :
デフォルトの名無しさん :2009/10/19(月) 18:03:06
942と946はドットが見えなかっただけだろうから気にするな
>>955 だから逆だって。cstdioはgetsを宣言しなくちゃならないの。
958 :
944 :2009/10/19(月) 18:11:06
>>954 ,
>>957 という事は意味合いとしては
「C++時代のライブラリであるSTLは旧時代の関数の臭いをかぐと警告を放つ」
と言った所でしょうか?
安全性に問題のある関数を参照すると警告を出すようになっているのだが、
<cstdio>がusingでgetsの名前を参照していることになるので、その警告が発動してしまうというわけか。
>>958 違う。警告を出すのはMSのコンパイラ。
<list>をインクルードすると、VC++ではたまたまついでに<cstdio>もインクルードされるようになっておりその余波を受けてしまっているだけ。
960 :
デフォルトの名無しさん :2009/10/19(月) 18:38:17
>>959 なるほど〜〜
古い関数を使わないためにSTLを使ってるのに警告を出されるみたいな矛盾w
ともかく、完全に無視してよい警告だと分かり安心しました。
ありがとうございました。
961 :
デフォルトの名無しさん :2009/10/19(月) 19:28:46
>>955 で挙げたような一連のusing::○○は
nemespace std{ }の中に入っていたので
これらをSTLで使うよという意味だという事が
分かったのですが、相変わらず using ::○○
という書き方の意味が分かりません。
usingの後にネームスペースが来ないで「::」とか
いったいこれは文法的にどういう働きがあるのですか?
>>918 boost::lambda::bindを使い、次のように書く。
std::find_if(v.begin(), v.end(), (boost::lambda::bind(&HOGE::a, boost::lambda::_1) == 10));
平均を求めるプログラムなのですが 戻り値はdouble 型です、この戻り値の型をint 型など、任意の型を指定する場合どのように書いたらいいでしょうか。 #include <iostream> template<class Iterator> double average(Iterator first, Iterator last) { int cou = 0; double result = 0.0; for(Iterator p = first; p != last; ++p) { result += *p; ++cou; } return result / cou; } int main() { using namespace std; int array[] = {1, 2, 3, 4, 5, 6, 7,8, 9, 10}; double result = average(array, array+10); cout << result << "\n"; return 0; }
>>963 template<class Iterator>
Iterator::value_type average(Iterator first, Iterator last)
template<typename ResultType, class Iterator> ResultType average(Iterator first, Iterator last) { ResultType result = 0; ... } int result = average<int>(array, array+10); もしくは… template<class Iterator> class average_helper { public: average_helper(Iterator first, Iterator last) : first_(first), last_(last) {} template<typename T> operator T () { T result = 0; ... } private: Iterator first_, last_; }; template<class Iterator> average_helper<Iterator> average(Iterator first, Iterator last) { return average_helper<Iterator>(first, last); } int result = average(array, array+10);
>>966 どっと演算子はオーバーライドできません。
>>964 は惜しいけどエラー。
#include <Iterator>
template < typename Iterator > typename iterator_traits< Iterator >::value_type average( Iterator first, Iterator last );
typename キーワードを付けないと ::iterator が型名じゃないよエラーが出てしまう。
971 :
デフォルトの名無しさん :2009/10/20(火) 09:27:27
>>940 「 :: 」 「 ・ 」 「 ・* 」は第二引数として値ではなく名前を取り、メンバの参照手段を提供する。
これらの多重定義を認めると、微妙な問題が起きる・・・とC++開発者の一人Stroustrupがプログラミング言語
C++(第3版)で言ってる。
ところで誰か 「using ::」の意味をしらないものだろうか・・・
::は大域を指定する演算子であってネームスペースではないのだが・・・
>>971 > ところで誰か 「using ::」の意味をしらないものだろうか・・・
> ::は大域を指定する演算子であってネームスペースではないのだが・・・
もしかして
>>955 の話をしているのか?
それなら using の二つの用法、「using宣言」と「usingディレクティブ」の違いについて
ISOなりJISなりC++ランゲージクイックリファレンス(オライリージャパン)なりを読むといいだろう。
要は、グローバルな名前空間のgetsをusingしているってことでしょ。
975 :
デフォルトの名無しさん :2009/10/20(火) 10:10:21
cursesを使いたいんですが、どうすればいいんでしょうか コンパイラはBorland 5.5です。
976 :
デフォルトの名無しさん :2009/10/20(火) 10:11:24
>>973 >>955 に関わらず、「using ::○○」という使い方を知りたいのですが・・
そんなに難しい話なのですか?
私の認識としては
usingの後にネームスペースが来る → usingディレクティブ
usingの後に個々の名前が来る → using宣言
:: → グローバル変数へのアクセス
であり、
だとすれば 「using ::○○」は、グローバル変数を使えるようにするという意味になり
グローバル変数はどこでも使えるのでそもそも宣言自体が無意味であると思うのですが、
私が何を勘違いしている見当がつく方いらしたら教えてください・・・。
>:: → グローバル変数へのアクセス 間違い。 >グローバル変数はどこでも使える 間違い。
978 :
デフォルトの名無しさん :2009/10/20(火) 10:14:50
>>976 int foo();
namespace N { int foo(); }
namespace N { int bar() { return foo(); } }
namespace N { int baz() { using ::foo; return foo(); } }
これでいいか?
981 :
デフォルトの名無しさん :2009/10/20(火) 10:26:33
>>977 あ・・そうか。
局所の宣言が大域変数を使えなくするから確かに間違いです・・
「using::○○」の意味は
局所で宣下された○○ではなく大域で宣言された○○を使えっていう感じですか?
>>979 おお!すごく分かりやすいです!理解が深まりました。
丁寧にありがとうございました。
>>961 >> usingの後にネームスペースが来ないで「::」とか
:: もネームスペースだよ。グローバルネームスペースっていうやつ。
using namespace ::; コンパイルエラーになるから名前空間じゃないよ
あー、ごめん。 using 直後の :: はグローバルネームスペースを指すプリフィックス。 ・・・あんまりわかりやすくならんな。まぁいいか。
>>979 int foo();
namespace M { using ::foo; }
namespace N { int bar(){ return M::foo(); } }
こうだな
986 :
デフォルトの名無しさん :2009/10/20(火) 13:54:07
>>985 usingを用いた空間内で使用しなくてもOKって事ですか・・・
他空間の名前を、あたかも自分の名前のようにしたって感じですね。
ところで、
>>979 のような使い方も正しいんですよね?
>>985 はcstdioの場合、こっちだろうっていう話ですかね?
987 :
デフォルトの名無しさん :2009/10/20(火) 14:37:49
C言語で三角関数のテーブルを作りたいのですがわからないので教えて下さい ちなみにcosの値が知りたいです。
>>987 #include <stdio.h>
#include <math.h>
int main(void) {
double d;
for(d = 0.0; d < 10; d += 0.5) printf("%lf %lf\n", d, cos(d));
return 0;
}
989 :
デフォルトの名無しさん :2009/10/20(火) 14:44:53
ループ制御変数にdoubleを使う馬鹿だけあって、"%lf"なんて本来間違いなものを平気で使うんだな。
991 :
デフォルトの名無しさん :2009/10/20(火) 15:49:51
>>990 なら全て教えてください。
後、三角関数の値は入れなくても答えはでるのですか?
>990の主張ははっきりしているじゃないか。 ・ループ制御変数にdoubleを使うのはバカだ。 ・"%lf"は本来間違いだ。 つまり、for (int d = 0; d < 10 * 100; ++d) printf("%g, %g\n", d / 100., cos(d / 100.));でいいだろ。
>>993 お前バグっている。%gに整数を渡していい訳ないだろ!
しかもfor(int d... はC++。
つーか0.5刻みのテーブル作りたいなら別にループ変数をdoubleにしてもいいと思うが
100じゃなくて100.か。。。ごめん、逝ってくる
まぁ100.とか書く奴も間違いなくヘタクソだから気にしなくていいんじゃね
もうすぐ終わり
hello
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。