【初心者歓迎】C/C++室 Ver.68【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/09/17(木) 22:22:59ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.67【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1247937958/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0002デフォルトの名無しさん
2009/09/17(木) 23:01:03く|)へ
〉 ヽ○ノ
 ̄ ̄7 ヘ/
/ ノ
|
/
|
/
0003デフォルトの名無しさん
2009/09/18(金) 00:41:55▂ ◢◤▀〓▲▂▐ ▂ ▪ ▂▄▅▆▇■▀▀〓◣▬ ▪ ■….
▍ ▼ ◥◣▼ .▂▅■▀ ▪ ■ ▂¨ ∵▃ ▪ ・
▀▍ ◢◤ ▅ ▐◣ ◢◤ ◢▇█▀ ¨▂▄▅▆▇██■■〓◥◣▄▂
▍ ▅ ◢■ ▍ ■ ▂▅██▅▆▇██■〓▀▀ ◥◣ ∴ ▪ .
▐ ▂ ▐◣ ▐▅▇███████▀ ▪ ∴ ….▅ ■ ◥◣
▀◣▂ ▀◥▅▆▇████████▆▃▂ ▪ ■▂▄▃▄▂
◥◣▄▂▄▅▀ ■ ¨ ▀▀▀■▀▀▀ ▪ ■ ∴‥
↑はUnicode対応のブラウザで見るとコーヒーを吹くプーさんが表示されますが、これを
1.正しく画面に表示する
2.テキストファイルに出力し、再入力してから画面に表示してもやはり正しく表示される
3.出力されたテキストファイルをUnicode対応のテキストエディタやブラウザで表示しても正しく表示される
ようにするC++のコードを書いてください。
多くの人にはとても難しいです。
0004デフォルトの名無しさん
2009/09/18(金) 01:13:38C++標準でやろうとすると死ぬな。
0005デフォルトの名無しさん
2009/09/18(金) 01:21:120006デフォルトの名無しさん
2009/09/18(金) 04:23:110007デフォルトの名無しさん
2009/09/18(金) 12:10:11wcout << s << endl;
wcout.clear();
wcout.imbue( locale( "Japanese" ) );
wcout << s << endl;
んー。動かん。
http://codepad.org/60naQUV5
0008デフォルトの名無しさん
2009/09/18(金) 13:32:140009デフォルトの名無しさん
2009/09/18(金) 16:00:44Turbo 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 を作ってリンクもしています。
何が問題なのでしょうか?
0010デフォルトの名無しさん
2009/09/18(金) 16:34:37↑を読んでみたけど、マイクロソフトでさえUnicodeを正しく表示できないのにワロタ。
00119
2009/09/18(金) 18:00:13libを使用せず、LoadLibrary()を使用しても同じ結果でした。
0012デフォルトの名無しさん
2009/09/18(金) 18:12:550013デフォルトの名無しさん
2009/09/18(金) 18:32:410014デフォルトの名無しさん
2009/09/18(金) 18:36:59HTMLソースって意味なら環境依存の方法で可能なことが多い。
00159
2009/09/18(金) 18:38:19libリンクの方だと__stdcallではVCの方でリンクエラーが出ていました。
そのため、libリンク方式の方は指定していません。
LoadLibrary()の方は__stdcallを指定しています。
0016デフォルトの名無しさん
2009/09/18(金) 18:38:32C++標準関数でありませんか?
調べると、.NETやMFCなら沢山出てくるのですが・・・
0017デフォルトの名無しさん
2009/09/18(金) 18:39:39ブラウザがやってることと同じことをやるだけだな。
HTTPプロトコルに従った手順(テキストベースの送受信)でやりとりして得るだけの話だし
0018デフォルトの名無しさん
2009/09/18(金) 18:41:43言語レベルでそこまでの範囲を想定してないから、標準では無い。
非標準で、その手の面倒をみてくれるライブラリは あるかもね
0019デフォルトの名無しさん
2009/09/18(金) 18:46:01呼び出し側の 宣言が狂っているんじゃないの?
lib式)
プロトタイプ宣言の呼び出し規約定義はちゃんとあわせてるのか? (マンゲリング抑制も含めて
LoadLib式)
GetProcAddress() の戻りをどうキャストして使ってるんだ?
0020デフォルトの名無しさん
2009/09/18(金) 18:52:50ありがとうございます。
もう少し調べてみます
0021デフォルトの名無しさん
2009/09/18(金) 18:53:58C/C++標準は、socket(ネットワーク)を扱えるものは何一つ無い。
どこぞでも書いたが、(Win環境ならwgetを入手して)
system("wget")が一番楽かもしれない。
00229
2009/09/18(金) 19:28:43双方同じヘッダをインクルードして使用しています。
ヘッダ
#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 );
0023デフォルトの名無しさん
2009/09/18(金) 19:31:5364bitのOSにするとint等のビット幅以外になにか変わるところはあるんでしょうか
00259
2009/09/18(金) 19:41:18double (__stdcall *func)( void* );
に変更したところ、問題なく動作しました。
ありがとうございました。
0026デフォルトの名無しさん
2009/09/18(金) 21:26:23むしろ、intの大きさは変わらない。
変わるのはポインタ・ハンドル・L/WPARAM・LRESULT・size_tなどの大きさ。
これにより、アドレス空間1プロセス4GB(うちユーザが使えるのは2-3GB)という制限が大幅に緩和される。
あと、x86→x86-64だとレジスタの増加で高速化が期待できる。
>>24
extern "C"のこと。
0027デフォルトの名無しさん
2009/09/18(金) 21:34:55あれ、そうなんですか。もう少しよく調べてみます
ありがとうございました
0028デフォルトの名無しさん
2009/09/18(金) 21:56:110029デフォルトの名無しさん
2009/09/18(金) 21:59:00LPARAMをlongに代入できないとか。
0030デフォルトの名無しさん
2009/09/18(金) 22:13:440031デフォルトの名無しさん
2009/09/18(金) 22:19:51それは/Wp64をオフにすればいいだけ。
もう64ビット対象にばんばんビルドして確かめてくれってことで、
VC++ 2008では/Wp64オフが初期設定となっているから、それにならえばいい。
0032デフォルトの名無しさん
2009/09/19(土) 06:41:02なんで引数どころか()まで省略できるの?
0033デフォルトの名無しさん
2009/09/19(土) 07:21:21それらを書くか書かないかで意味が違う。省略できているわけじゃない。
0034デフォルトの名無しさん
2009/09/19(土) 09:48:110035デフォルトの名無しさん
2009/09/19(土) 10:46:35この5つの中でいちばん数が小さい変数を見つけるにはどうやるのが良いでしょうか?
0036デフォルトの名無しさん
2009/09/19(土) 11:00:134回比較する
0037デフォルトの名無しさん
2009/09/19(土) 13:16:18アップキャスト可能にすることって可能でしょうか?
0038デフォルトの名無しさん
2009/09/19(土) 13:23:29具体的に必要な場面を示せばなんか方法はあるかもしれない。
0039デフォルトの名無しさん
2009/09/19(土) 13:32:40private 継承して BaseType& Base() を用意するとか?
0040デフォルトの名無しさん
2009/09/19(土) 14:17:48class B : A;
func(A);
func(B);
templateの絡みで、こんな感じに親クラスと派生クラスを
オーバーロードした同名関数で処理したいのですが。
0041デフォルトの名無しさん
2009/09/19(土) 14:27:49ん?それなら普通にオーバーロードで済まないか?
A, B の例でいいから、今できてるところまでひととおりのコードを貼ってみるといいかもね。
0042デフォルトの名無しさん
2009/09/19(土) 14:36:15int main(void)
{
Hoge h;
h; // ※
return 0;
}
※をエラーに(できればコンパイル時)することはできますか?
0043デフォルトの名無しさん
2009/09/19(土) 14:50:460044デフォルトの名無しさん
2009/09/19(土) 14:53:300045デフォルトの名無しさん
2009/09/19(土) 15:15:22Pascalとは違う
0046デフォルトの名無しさん
2009/09/19(土) 15:22:16オーバーロードが用意されていればキャストされないのですね。
すみませんでした。
0047ぅゅ ◆e6.oHu1j.o
2009/09/19(土) 23:39:19Cだとそういうの警告でるよ
エラーだすの実行時でいいならboolオペレーターっていうのがある
operator bool(){
printf("era-");
return 0;
}
0048ぅゅ ◆e6.oHu1j.o
2009/09/19(土) 23:40:47それじゃboolオペレーターの実行されねーや
0049デフォルトの名無しさん
2009/09/19(土) 23:42:18その警告に C と C++ は関係ない。
その operator bool を Hoge に宣言しても h; では呼び出されない。
0050デフォルトの名無しさん
2009/09/20(日) 02:04:05のコードって規格ではどういう動作するように決められてるの?無視するだけ?
0051ぅゅ ◆e6.oHu1j.o
2009/09/20(日) 08:03:510052デフォルトの名無しさん
2009/09/20(日) 10:15:49Car car1;
とオブジェクトを作成するのと
Car* pCar;
pCar=new Car;
とメモリを確保するのと、どういう短所長所があるのでしょうか?
0053デフォルトの名無しさん
2009/09/20(日) 10:27:03後者は不要なオブジェクトを手動でdeleteする必要がある。そして生成廃棄が遅い。
なのに、なぜ後者が有るかというと、生成と廃棄のタイミングを自由に操作できるから。
0054デフォルトの名無しさん
2009/09/20(日) 10:31:24なるほど、ありがとうございます
グローバル変数ほど長く使いたくない場合に使うんですね
0055デフォルトの名無しさん
2009/09/20(日) 13:05:140056デフォルトの名無しさん
2009/09/20(日) 13:37:340057デフォルトの名無しさん
2009/09/20(日) 13:42:31VC8でもできるから、できるコンパイラを使えばいい。
0058デフォルトの名無しさん
2009/09/22(火) 11:53:26{
virtual void hoge(){・・・};
};
struct sub : public base
{
virtual void hoge(){・・・};
};
int main(void)
{
sub s;
s.hoge();
return 0;
}
↑見たいな感じに書いても仮想関数の検索コストって掛かるもの?
静的に決定できるからコストかからないと思うんだけどどうなんでそか?
0059デフォルトの名無しさん
2009/09/22(火) 12:00:13コンパイラによるとしか
0060デフォルトの名無しさん
2009/09/22(火) 13:49:23VCで確認したら、sub::hogeを直接コールしてた。
0061デフォルトの名無しさん
2009/09/22(火) 15:38:50BCC(ECC6.2.0)もsub::hogeを直接コールしてた
最適化が糞なコンパイラですらこれだから大抵のコンパイラは
出来るだけ静的に解決出来る所はするのではないか
0062デフォルトの名無しさん
2009/09/22(火) 15:45:100063デフォルトの名無しさん
2009/09/22(火) 15:48:480064デフォルトの名無しさん
2009/09/22(火) 17:07:540065デフォルトの名無しさん
2009/09/22(火) 17:26:08まぁでも、確実な根拠があると一応ちょっと安心かな
0066デフォルトの名無しさん
2009/09/22(火) 17:35:53VCでこうだと、テーブルジャンプになってた。
sub* s = new sub();
s->hoge();
0067デフォルトの名無しさん
2009/09/22(火) 17:38:310068デフォルトの名無しさん
2009/09/22(火) 17:41:20これ、最適化したらまずいの?
0069デフォルトの名無しさん
2009/09/22(火) 17:58:52sが実際に保持している型をコンパイルタイムで追尾しなきゃならないから、処理が
重くなる割には性能向上が全く期待できない(レアケースすぎるから)
規格上、確実にs->hoge()の時点でsのポイントするインスタンスがsub型と確定可能
かどうか、というのもちょっと確信は持てない(newの辺りが特に)
まぁ実験するのは面白いかも
0070デフォルトの名無しさん
2009/09/22(火) 18:13:46なんか落とし穴でもあるのかね。
最適化されないってのは。
0071デフォルトの名無しさん
2009/09/22(火) 18:28:56new が例外起こす場合を考慮すると、s == NULLもあるから
sub::hoge()は呼べないのでは。
つーか new がオーバーライドされてたらもはや何でもあり。
0072デフォルトの名無しさん
2009/09/22(火) 18:29:17ごく僅かに最適化されるくらいだと思う。
実用的にはメリット皆無に限りなく近い予感。コンパイルも遅くなるだろうし。
0073デフォルトの名無しさん
2009/09/22(火) 18:30:09new で例外が発生すれば s への代入も、それに続く s->hoge() の呼び出しも行われない
から、それは関係ない。
0074デフォルトの名無しさん
2009/09/22(火) 18:34:060075デフォルトの名無しさん
2009/09/22(火) 19:29:57正しくsubのインスタンスを指してることをどうやって保障するかじゃない?
人間には簡単に分かる事もコンパイラだと100万行のコードでも同じ動作しなきゃならんと思うとかなり面倒な気がする
0076デフォルトの名無しさん
2009/09/22(火) 19:48:59intel c++だとs.hogeもs->hogeもインライン展開された。
0077デフォルトの名無しさん
2009/09/22(火) 20:19:270078デフォルトの名無しさん
2009/09/22(火) 23:23:400079デフォルトの名無しさん
2009/09/24(木) 23:58:38ロープレのイベントなんかで、使う分だけ
メモリを確保したいのですが、こんな感じでいいでしょうか。
メモリは正しく確保できているか、
通常の配列より容量を削減できているかあたりです。
0080デフォルトの名無しさん
2009/09/25(金) 00:14:25これならほとんどの場合において配列だけの方がメモリ効率はいいよ
開発効率をあげたいなら STL を使うといいよ
目的が、作ることより勉強優先っていうなら苦しむといいよ
0081デフォルトの名無しさん
2009/09/25(金) 00:40:41{
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作る以外になにか手はありますか?
0082デフォルトの名無しさん
2009/09/25(金) 01:09:43ありがとうございます。
メモリは、3つのイベントを作るとすると、
配列だと作った数に関係なく 8 * 32 バイト、
ポインタだと 4 * 32 + 8 * 3 で少なくできると思ったのですが。
(4はポインタのサイズ、8は構造体のサイズ、
32はイベントを作れる最高の数)
また、構造体のサイズは、実際のゲームではもう少し大きいです。
その効率の悪さについてググってみたのですが、
連続な領域でない事が関係しているんですかね。
stlはc++の機能みたいですね。
ヒントになる事もありそうなので勉強してみます。
0083デフォルトの名無しさん
2009/09/25(金) 02:42:11配列や標準コンテナに入れて呼び出すとかでいいの?
0084デフォルトの名無しさん
2009/09/25(金) 15:00:42にあるSendInput関数という関数を使いたい場合は、
SDKというものをインストールしないとダメなのでしょうか?
0085デフォルトの名無しさん
2009/09/25(金) 16:08:070086デフォルトの名無しさん
2009/09/25(金) 16:47:39同じクラスの中にある他のメンバ変数(静的か非静的かは問わず)を
操作することはできないのですが
どうしても操作したい場合には
どういった方法をとることができるのでしょうか?
0087デフォルトの名無しさん
2009/09/25(金) 16:53:150088デフォルトの名無しさん
2009/09/25(金) 17:17:10staticメンバ関数は特定のインスタンスに対する操作ではないので、
インスタンスごとに存在するメンバ変数にアクセスできないのは当然です。
どのインスタンスのメンバ変数にアクセスしたいのかを指定するには、
(1) 通常のメンバ関数にする → this で指定されるインスタンスにアクセスする
(2) 引数でインスタンスを渡す → 引数で指定されたインスタンスにアクセスする
(3) 別の変数(グローバル変数やstaticメンバ変数)でインスタンスを指定する
のどれかの方法で行います。
0089デフォルトの名無しさん
2009/09/25(金) 17:54:251.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; }
0090デフォルトの名無しさん
2009/09/25(金) 17:56:050091デフォルトの名無しさん
2009/09/25(金) 17:58:04その例なら、イテレーターとしてint*が渡せるね
0092デフォルトの名無しさん
2009/09/25(金) 18:03:07出来ればfwrite()、fread()を使う時は"wb"や"rb"で開いた方がいいよ
ランダムアクセスする時にcooked modeだとズレが邪魔をするOSがある
0093デフォルトの名無しさん
2009/09/25(金) 19:37:49ありがとうございました。がんばってみます
009479
2009/09/25(金) 21:44:42ありがとうございました。
0095デフォルトの名無しさん
2009/09/25(金) 21:56:16じゃないんだけどバイナリエディタで読むと
23 7A 08 00
で、
00 08 7A 23
の順で読み込めばいいんでしょうかー?
0096デフォルトの名無しさん
2009/09/25(金) 22:10:12abc.cの部分についてだよね
0097デフォルトの名無しさん
2009/09/25(金) 22:11:14単純にfreadとfwrite使えばいい。
0098デフォルトの名無しさん
2009/09/25(金) 22:14:06そうです、ありが�d
0099デフォルトの名無しさん
2009/09/25(金) 22:55:41や
cout << a <<" "<< b << setw(1) << c <<" "<< d <<setw(1)
<< e <<" "<< f << " " g << endl;
な感じのタイプ数が多いのを
cout << a << b << c << d << e << f << g << endl;
こんな具合に書きたいんですが、何かいい方法ありませんか。
0100デフォルトの名無しさん
2009/09/25(金) 22:58:31オペレータをオーバーライド
0101デフォルトの名無しさん
2009/09/25(金) 23:00:490102デフォルトの名無しさん
2009/09/25(金) 23:01:45>>101 オブジェクト指向とか関係ないから。
0103デフォルトの名無しさん
2009/09/25(金) 23:08:340104デフォルトの名無しさん
2009/09/25(金) 23:12:020105デフォルトの名無しさん
2009/09/25(金) 23:41:43血をはいてるぷーさんにしか見えん
0106デフォルトの名無しさん
2009/09/26(土) 00:33:22どこかで聞いたような単語を、意味も知らずに偉そうに使って
恥ずかしくないですか?
0107デフォルトの名無しさん
2009/09/26(土) 00:54:51両者は使い分けないといけないものなのですか?
それとも一方にそろえるべきものなのですか?
0108デフォルトの名無しさん
2009/09/26(土) 01:23:040109デフォルトの名無しさん
2009/09/26(土) 02:14:06Class* a, b; と書いたら
Class *a, *b; という意味にはならず
Class *a, b; という意味になるので注意
それだけ気をつけていればどちらで書いてもOK
0110デフォルトの名無しさん
2009/09/26(土) 02:38:08cooked modeという言葉を初めて知ることができてよかった。
けどバイナリに対する言葉はアスキーもしくはテキストと言ったりしない?
0111デフォルトの名無しさん
2009/09/26(土) 02:59:23まあどっちでもいいんだけどな
バイナリモードに対応するのはraw mode
MS/DOS、Windowsのみに存在する区別らしい
Linux、UNIXには区別は存在しない
0112デフォルトの名無しさん
2009/09/26(土) 03:07:290113デフォルトの名無しさん
2009/09/26(土) 03:11:40他人に伝える時はテキストとバイナリと言うべきだけどな
0114デフォルトの名無しさん
2009/09/26(土) 03:18:450115デフォルトの名無しさん
2009/09/26(土) 03:22:250116デフォルトの名無しさん
2009/09/26(土) 03:37:26一般的には端末入出力、特に入力時に
編集した結果を受け取るのではなく
Enterやカーソルキーなどの、生の情報を受け取るために使う。
ファイルの\r\n変換に使うことなど、まず無い。
なぜならば、そもそもファイルのベタなデータを
「行」という単位で扱おうとしていること自体
「生のままで扱っていない」から。
\r\n変換のことを cooked mode なんて呼ぶと
陰で笑われるから、気をつけたほうが良いよ。
0117デフォルトの名無しさん
2009/09/26(土) 03:48:290118デフォルトの名無しさん
2009/09/26(土) 03:53:36その例が同質のものだと思ってるなら、お前の頭もネタにして笑われるレベルだな。
0119デフォルトの名無しさん
2009/09/26(土) 03:57:310120デフォルトの名無しさん
2009/09/26(土) 11:00:53どのライブラリを使えばいいのかわかりません
オーディオストリーミングに適したライブラリがあれば教えてください
0121デフォルトの名無しさん
2009/09/26(土) 11:55:57背伸びするのはいいんだけど、背伸びしすぎじゃねーの
オーディオだけじゃなくて、ストリーミングもP2Pの知識もないんだろ?
0122デフォルトの名無しさん
2009/09/26(土) 15:14:35main関数の中でもう一度void aaa();sと書くのは、もう一度プロトタイプ宣言をしていると言うことでしょうか?
またこのように、サイトなどからコピーする時に、よく型をつけたままコピーしてしまい不具合が起きてしまいます。
これを防ぐ方法はないでしょうか?
void aaa();
int main() {
void aaa();///←ココ
return 0; }
void aaa(){return;}
0123デフォルトの名無しさん
2009/09/26(土) 15:19:00関数内の void aaa() は外にある宣言を繰り返していることになる。
ちなみに引数リストが空の宣言は「プロトタイプ宣言」とは言わない。
2つ目の質問は、「型をつけたままコピー」と「不具合」が何のことかわからん。
0124デフォルトの名無しさん
2009/09/26(土) 15:20:16型の不一致が無ければ問題ないよ
0125デフォルトの名無しさん
2009/09/26(土) 15:49:31ありがとうございましたす
後半はあんまりキニシナイでください
0126デフォルトの名無しさん
2009/09/26(土) 18:51:56ひところから急に Class* な表記が流行りだしたような気がしてたから
ちょっと気になってたんですが、自分の好きなClass *表記で気にしない
ようにします。
0127デフォルトの名無しさん
2009/09/26(土) 21:12:03思う。意味論的にはClass* a;のほうが相応しいと思う。文法的にはClass*a;
でも構わないけどw まあ、好みで。自分はClass *a;。
0128デフォルトの名無しさん
2009/09/26(土) 21:29:02add_pointer<some_class>::type psc;
これが正解だからこれからはこれを使うように
0129デフォルトの名無しさん
2009/09/26(土) 21:31:51「Classのポインタ」という変数aって感じがいい
>>109みたいな問題があるけど、1行で複数の変数を宣言しなければいいんだし
0130デフォルトの名無しさん
2009/09/26(土) 21:38:42Class &r;はなんかいやだなあ。
0131デフォルトの名無しさん
2009/09/26(土) 21:40:06どっちかっていうと、Classへのポインタ
0132デフォルトの名無しさん
2009/09/26(土) 21:41:510133デフォルトの名無しさん
2009/09/26(土) 22:10:29完全に独断と偏見だけどさ。
0134デフォルトの名無しさん
2009/09/26(土) 22:18:450135デフォルトの名無しさん
2009/09/26(土) 22:56:30> ちなみに引数リストが空の宣言は「プロトタイプ宣言」とは言わない。
そなの?
0136デフォルトの名無しさん
2009/09/26(土) 23:16:40C の場合、引数リスト無しの関数宣言 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++ には引数の型を宣言しない関数宣言というものが無いので、そもそも
関数プロトタイプというように呼び分ける必要が無く、すべて単に関数の宣言と呼べばいい。
0137デフォルトの名無しさん
2009/09/26(土) 23:21:500138デフォルトの名無しさん
2009/09/26(土) 23:23:510139デフォルトの名無しさん
2009/09/27(日) 01:50:04どこが間違っているのでしょうか・・?
int main() {
wchar_t aaa[]="テスト";
return 0;
}
0140デフォルトの名無しさん
2009/09/27(日) 01:52:44× "テスト"
○ L"テスト"
0141デフォルトの名無しさん
2009/09/27(日) 02:00:34wchar_t aaa[] = L"テスト♥";
wcout << aaa << " : " << aaa << endl;
return 0;
}
0142デフォルトの名無しさん
2009/09/27(日) 04:32:310143デフォルトの名無しさん
2009/09/27(日) 08:26:21ストリーミングもP2Pも理論的には解っていますが、作った事はありません
P2Pボイスチャットを作るのは大変だとわかっていますが、大学の課題なので
何とか完成させたいのです
よろしくおねがいします
0144デフォルトの名無しさん
2009/09/27(日) 10:26:25int Row = 10;
int Col = 20;
std::vector<std::vector<int> > Array(Row, std::vector<int>(Col));
このように書くことで、2次元int 型のvector コンテナが定義できますが
他の型、(list やmap、独自クラス)でも2次元のコンテナを作りたいのですが
templae を用いて、汎用的にしたいのですが、どのように書いたらいいでしょうか。
よろしくお願いします。
0145デフォルトの名無しさん
2009/09/27(日) 11:08:42template template パラメータを使うことが考えられる。
現行の C++ では template template パラメータの引数の数を固定しないといけないから、
使う側で専用の template メタ関数を用意しないといけないかもしれない。
0146デフォルトの名無しさん
2009/09/27(日) 11:10:41#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はよくわからんがこんな感じ?
0147デフォルトの名無しさん
2009/09/27(日) 12:07:05>>146Thxです
使い方としてはこんな感じでしょうか?
vec2d[10][10];
vec2d[0][0] = 100;
int i = vec2d[0][0];
std::cout << i << std::endl;
でもこれだと、Out of range で落ちてしまいますが?
セマンティクス的に間違ってるんだろうか?
0148デフォルトの名無しさん
2009/09/27(日) 12:09:05デフォルトコンストラクタが走っただけじゃ空なんだから、当然だろ。
0149デフォルトの名無しさん
2009/09/27(日) 14:19:41More Effective C++ に載ってたので終了。
0150デフォルトの名無しさん
2009/09/27(日) 16:23:470151デフォルトの名無しさん
2009/09/27(日) 16:55:30でもlistで二次元配列作ると疎行列以外の用途では
やたらと速度が遅くなっていかんな
0152デフォルトの名無しさん
2009/09/27(日) 17:08:140153デフォルトの名無しさん
2009/09/27(日) 17:34:46キーとレコードならmap使ったほうがいいし
生の二次元配列を使うことは少ないな。
0154デフォルトの名無しさん
2009/09/27(日) 18:13:04最近template 中毒に冒されいて、どうして汎用化できるだろうかと、気になってしょうがないw
0155デフォルトの名無しさん
2009/09/27(日) 18:16:23どうしてもやるならアダプタかませてインターフェースを調整しないといかん
0156デフォルトの名無しさん
2009/09/27(日) 18:22:54別のアプリケーション(メモ帳)に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;
}
0157デフォルトの名無しさん
2009/09/27(日) 18:28:10exe側で関数をexportして、dll側でGetModuleHandleするのが唯一の方法でしょうか?
0158デフォルトの名無しさん
2009/09/27(日) 18:32:31VC++ なら普通SendMessageやPostMessage が無難だと思うぞ、ぐぐれば事例が沢山あるし
0159デフォルトの名無しさん
2009/09/27(日) 18:33:38試してないけど
Dll側にSetFunc()を作ってExe側から関数ポインタあげたら?
0160デフォルトの名無しさん
2009/09/27(日) 18:37:36ありがとうございます。やってみます
0161デフォルトの名無しさん
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)
0162デフォルトの名無しさん
2009/09/28(月) 17:03:481>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' の前に必要です。
0163デフォルトの名無しさん
2009/09/28(月) 17:06:201>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 スキップ ==========
以上です。分かる方、お願いします。
0164デフォルトの名無しさん
2009/09/28(月) 17:15:02VS2008 C++です。よろしくおねがいします
0165デフォルトの名無しさん
2009/09/28(月) 17:41:37*++p = 'a'; *++p = 'a'; *++p = 'a'; ...
と
*p++ = 'a'; *p++ = 'a'; *p++ = 'a'; ...
はスピードに違いがありますか。
つまりインクリメントとデクリメントで速度が変わったりしますか。
どちらも1を足すというのはかわりませんが、こっちのほうが効率のよいバイナリが生成されるとか
そういうのがあれば教えてください。
0166デフォルトの名無しさん
2009/09/28(月) 17:48:52環境の提示がないので一般論として考えると、2行目と4行目はインクリメントするタイミングが違うだけ。
6行目はインクリメントとデクリメントの違いだけ。
いずれにしても、有意差が出るほど阿呆なコンパイラも環境もないと思うがね。
0167デフォルトの名無しさん
2009/09/28(月) 17:50:22その例では機能が同等では無くね?
0168デフォルトの名無しさん
2009/09/28(月) 19:26:44着目してるんじゃないかな。
どうも、前置|後置とインクリメント|デクリメントを混同している節が
見受けられるが……。
0169デフォルトの名無しさん
2009/09/28(月) 19:48:00#include "stdafx.h"
あと氏ね
0170デフォルトの名無しさん
2009/09/28(月) 20:57:31void func()
{
line1;
line2;
line3;
}
int main(void)
{
line4;
func();
line5;
return 0;
}
上の例で言ったらline4とfunc()の間、func()とline5の間まで割り込まれる?
それともline1、line2、line3の間でも割り込まれる?
1行が終わる間に割り込まれることはある?
a = b = c = d;としたらどこかで割り込まれる可能性はある?
0171デフォルトの名無しさん
2009/09/28(月) 20:58:35いつでもありえます
0172デフォルトの名無しさん
2009/09/28(月) 21:09:18a = 100; みたいに代入一個でも、アセンブラだと2命令以上になることがあるんで、代入中に割り込まれることもある。
0173spirit
2009/09/28(月) 21:18:32すなわちb=a+3;の実行中にaを読んでbに書き込む間でも割り込まれる。
さらにa++;の実行中にも割り込まれる。
0174デフォルトの名無しさん
2009/09/28(月) 21:20:430175デフォルトの名無しさん
2009/09/28(月) 21:29:10ありがとうございました。すいませんでした。
0176デフォルトの名無しさん
2009/09/28(月) 21:31:02そうなるとmutexを取得する関数の途中で割り込まれると
バグの元になりそうな気がするんですけど大丈夫なんでしょうかね?
0177デフォルトの名無しさん
2009/09/28(月) 21:33:11システムコールなので不具合は起きない
0178デフォルトの名無しさん
2009/09/28(月) 22:16:05ここまでは割り込まれないよ」とかそういう細かい仕様がいちいち決まってるので、
それを調べて使うもの。
0179デフォルトの名無しさん
2009/09/28(月) 22:56:13をCで作る課題が出てるのですが、助けになるような参考書・サイト等ありませんでしょうか
お願いします
0180デフォルトの名無しさん
2009/09/28(月) 22:59:410181デフォルトの名無しさん
2009/09/28(月) 23:47:07このスレの意味がなくなる
0182デフォルトの名無しさん
2009/09/29(火) 00:33:110183デフォルトの名無しさん
2009/09/29(火) 01:49:490184デフォルトの名無しさん
2009/09/29(火) 01:56:220185デフォルトの名無しさん
2009/09/29(火) 02:01:260186デフォルトの名無しさん
2009/09/29(火) 05:44:20ありがとうございます。違いはないとのことで安心しました。
>>168
>どうも、前置|後置とインクリメント|デクリメントを混同している節が
>見受けられるが……。
その通りでしたorz 無知をさらして申し訳ない
0187デフォルトの名無しさん
2009/09/29(火) 10:25:22プリミティブ型ならいいけど、クラスに対する前置後置はだいぶ効率に差ができるから注意しよう
0188デフォルトの名無しさん
2009/09/29(火) 10:54:27○効率に差ができる場合もあるから
0189デフォルトの名無しさん
2009/09/29(火) 11:59:470190デフォルトの名無しさん
2009/09/29(火) 12:18:04クラスじゃないなら、見た目の好みとかで後置にしても最適化で前置に置換されることが
期待できるけど、統一感を求めるなら、必要が無い限りは前置で統一した方がいいだろうね。
クラスの時は勝手に最適化で前置に変えたりできないから。
0191デフォルトの名無しさん
2009/09/29(火) 12:19:410192デフォルトの名無しさん
2009/09/29(火) 12:28:000193デフォルトの名無しさん
2009/09/29(火) 12:29:030194デフォルトの名無しさん
2009/09/29(火) 12:29:480195デフォルトの名無しさん
2009/09/29(火) 12:31:03でも余計うざいだけか。
0196デフォルトの名無しさん
2009/09/29(火) 12:36:34むかしむかし、後置だとインクリメントする前の状態をどこかに保存しておかないといけないのであったとさ
0197デフォルトの名無しさん
2009/09/29(火) 15:34:400198デフォルトの名無しさん
2009/09/29(火) 16:41:01えっ? 今は違うの?
0199デフォルトの名無しさん
2009/09/29(火) 17:34:08科学万能の時代が到来したのです
0200デフォルトの名無しさん
2009/09/29(火) 17:46:33可哀想な人…
0201デフォルトの名無しさん
2009/09/29(火) 18:11:48とかやったらちょっと面倒なことになる。
0202デフォルトの名無しさん
2009/09/29(火) 18:50:59今はどうなってんのさ。
>>201
どう面倒なことになるのさ。
0203デフォルトの名無しさん
2009/09/29(火) 19:27:560204デフォルトの名無しさん
2009/09/29(火) 19:34:500205デフォルトの名無しさん
2009/09/29(火) 20:44:44http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%A1%E3%83%B3%E3%83%88
0206デフォルトの名無しさん
2009/09/29(火) 21:29:15後置演算子のオーバーロード方法が無いとcallerが保存しなきゃならなかった、ってことが
言いたいんじゃないのかな。
ところが、普通に考えたらcallerが保存しなくてもcalleeでは保存するコードを書くことに
なるから、端から見ると>>196が何言ってんだか分からない人状態に。
一方>>196は、intを引数にすれば後置になるの知ってるの俺だけかよプゲラッチョ、とか
一人でいい気分になっていた、とか。
0207デフォルトの名無しさん
2009/09/29(火) 21:32:38言語制約上の問題でしかないね
0208デフォルトの名無しさん
2009/09/29(火) 23:03:02何が言いたいのか分からん。
最適化されない限り、前置の方がコストかかるのは当然で。
>>196のだめなところはツッコミがあるように、むかしむかし、というのを付けてしまったとこ
0209208
2009/09/29(火) 23:03:590210198 202
2009/09/30(水) 00:31:56前置/後置のオーバーロード時の注意点は知っていたが、規格が変わったのかと焦ったぜ。
0211デフォルトの名無しさん
2009/09/30(水) 02:13:24細い棒の画像を何回かループさせて徐々に角度をつけて
描画しようと思ってるんだがいまいちうまくいかん。
0212デフォルトの名無しさん
2009/09/30(水) 02:33:400213デフォルトの名無しさん
2009/09/30(水) 02:40:120214デフォルトの名無しさん
2009/09/30(水) 03:47:240215デフォルトの名無しさん
2009/09/30(水) 03:59:020216デフォルトの名無しさん
2009/09/30(水) 04:06:59それで円形のHPゲージの描画ができるとは思えないといってる?
もうちょっと具体的に書いてくれないか
0217デフォルトの名無しさん
2009/09/30(水) 04:08:44その方向でがんばれ
0218デフォルトの名無しさん
2009/09/30(水) 04:28:25C++暦半年の俺がわかるように教えるんだ!
0219デフォルトの名無しさん
2009/09/30(水) 04:46:25他のコンパイラでコンパイルした際に、不明なプラグマと警告が出てしまいます。
OpenMPだと、
#ifdef _OPENMP
#pragma omp parallel for
#endif
の様に書いてやれば、対応していないコンパイラで警告を出さないようにできますが、
上記のような場合どのようにしたらよいのでしょうか?
0220デフォルトの名無しさん
2009/09/30(水) 04:56:520221デフォルトの名無しさん
2009/09/30(水) 05:42:500222デフォルトの名無しさん
2009/09/30(水) 05:44:140223デフォルトの名無しさん
2009/09/30(水) 06:11:21環境
>>219
intelコンパイラであるかどうかをifdefで判断すればよいということ。
0224(マルチポスト)
2009/09/30(水) 06:15:36C++で作られたローカルのプログラムのWinsockからPHPのサーバのプログラムと通信することはできますか?
0225デフォルトの名無しさん
2009/09/30(水) 06:43:29PHPのサーバと言うのは何のこと?
0226デフォルトの名無しさん
2009/09/30(水) 06:45:400227デフォルトの名無しさん
2009/09/30(水) 07:17:460228デフォルトの名無しさん
2009/09/30(水) 08:05:52WindowsAPIとかGDIとかでググレ
0229デフォルトの名無しさん
2009/09/30(水) 08:31:26ぶっちゃけるとアニメーションモデル読み込んで再生して終り
中身はHP0〜100%(t=0〜1)までのアニメーションでデザイナに作っておいてもらって
プログラマはHPに応じてアニメーションを進めるだけ
0230デフォルトの名無しさん
2009/09/30(水) 08:37:55PHPでサーバープログラム?
Webサーバに置くスクリプトじゃなくて?
0231デフォルトの名無しさん
2009/09/30(水) 10:07:18ちょっと特殊な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を提示していただけるだけでも構いません
より適切なスレがあれば誘導して頂けるのもありがたいです
なにか情報をお持ちの方、お教え願えないでしょうか
0232デフォルトの名無しさん
2009/09/30(水) 14:25:41boost::spirit です。
rule<> expr = uint_p | real_p;
parse_info<> pi = parse("10.0", expr);
これで、pi.full == true とならないのですが、どうしてでしょうか。
Win7x64 VC++9 boost1.40.0
0233デフォルトの名無しさん
2009/09/30(水) 15:10:18改造とかクラックとかそういうスレないの?
0234デフォルトの名無しさん
2009/09/30(水) 18:09:05real_pとint_pを入れ換えて味噌
0235232
2009/09/30(水) 18:42:37ありがとうございます。
もともと 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で止まりまくります。何がおかしいんでしょうか。
0236デフォルトの名無しさん
2009/09/30(水) 19:29:42このソースコードを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
というエラーが出てコンパイル出来ません。
このエラーを解決したいのですが、どのようにすればいいでしょうか?
0237234
2009/09/30(水) 19:39:19最後まで到達できないのは、rule<> exper=uint_p|real_p;のuint_pでパースが10で成功し、exprが成立するため。そこでパースが終わってしまう。
防ぐには以下の方法がある。
strict_real_pを使うと小数点が無い実数にはマッチしなくなる。
longset_d[P]...を使うと最大長マッチが採用される。
eps_p(P)を使って区切りまでパースしたかを確認できる。
0239デフォルトの名無しさん
2009/09/30(水) 20:00:38開発環境は、Ubuntu,gcc4.1です。
0240デフォルトの名無しさん
2009/09/30(水) 20:19:42いや、だから columns について調べるべきでしょう。
0241デフォルトの名無しさん
2009/09/30(水) 20:26:26調べたのですが、解らなかったのでこちらに来ました。前のスレのほうで環境依存スレに行ったほうがいいと言われたというのも一つです。
console.c内にて
#define COLUMNS 80
static unsigned long lines=LINES,columns=COLUMNS;
として定義及び宣言があり、どうしてcolumns変数が出てくるのかが全くわからないのです。
0242デフォルトの名無しさん
2009/09/30(水) 21:17:020243デフォルトの名無しさん
2009/09/30(水) 21:25:31TCHAR ch;
// ...
wchar_t *p = (wchar_t *)ch;
0244デフォルトの名無しさん
2009/09/30(水) 21:28:31あ、そのままでよかったんですね^^;
センキュー
0245デフォルトの名無しさん
2009/09/30(水) 21:36:05だめだよ。
TCHAR* ch;
// ...
wchar_t *p = (wchar_t *)ch;
なら、いい。
あと、最近のVCは_UNICODEがデフォになってるけど、
古いやつだったら、_MBCSがデフォだから、もしそうだったら、
単純にはキャストできない。
0246デフォルトの名無しさん
2009/09/30(水) 22:31:17static unsigned long columns=COLUMNS;
0247デフォルトの名無しさん
2009/09/30(水) 23:37:31事務仕事をほぼ全自動でできるようなソフトを作ってみたいと思っているのですが、
とっかかりがつかめません
bitmap形式などは何となくわかったのですが、肝心の画像自体の取得方法が分かりません
APIを使うような感じはするのですが、見つかりませんでした
分かる方、教えてください。お願いします
0248デフォルトの名無しさん
2009/09/30(水) 23:40:13uwsc ってソフトがあるよ
0249デフォルトの名無しさん
2009/09/30(水) 23:41:52GetDC(HWND hWnd);
で、0を渡せば、画面のデバイスコンテキストが取れたような記憶が。
0250デフォルトの名無しさん
2009/09/30(水) 23:45:09ありがとうございます
既にあったのですね、トホホ
なんだか悔しいので、とりあえず作るだけ作ってみることにします
0251デフォルトの名無しさん
2009/10/01(木) 09:37:370252デフォルトの名無しさん
2009/10/01(木) 09:41:070253デフォルトの名無しさん
2009/10/01(木) 10:05:490254232
2009/10/01(木) 12:57:19parse_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
0255デフォルトの名無しさん
2009/10/01(木) 14:53:49申訳ないですが、その書き方ではエラーを解決出来なかったので
グローバル変数として宣言しましたところ、一応はコンパイルが出来ました。
0256デフォルトの名無しさん
2009/10/01(木) 19:44:19PreProcessor Macros でマクロを設定してコンパイルはできたのですが
実行すると#ifdef〜#endifでかこった部分が実行されていません
どうすればよいのでしょうか?
0257デフォルトの名無しさん
2009/10/01(木) 19:51:09#ifdefの行をくわしく
0258デフォルトの名無しさん
2009/10/01(木) 23:39:04ifdefで指定してるものがdefされていなかったんでしょう
0259デフォルトの名無しさん
2009/10/02(金) 00:21:580260デフォルトの名無しさん
2009/10/02(金) 00:36:59#include <boost/asio.hpp>
をソースに書いてみただけでコンパイル時間が1秒→15秒になってしまったのですが、
こういうものなのでしょうか?
0261デフォルトの名無しさん
2009/10/02(金) 02:23:05ありえん話ではないです。
というかメモリ少ないとかじゃないの?
0262デフォルトの名無しさん
2009/10/02(金) 02:26:31もちろん、メモリ不足がまず疑われるが。
VS使うならpchは覚えた方がいいな。使ってないなら、だけど。
でかいプロジェクトでBoostバリバリ使ってたりすると、コンパイル時間が普通に
1/20以下くらいになっても不思議は無い。
0263スレ違い、でしょうか……
2009/10/02(金) 03:53:56今の状況は
・持ってるのは、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で、どんなものがいいのか、教えて頂ければ幸いです。
どうか、よろしくお願いします。
0264デフォルトの名無しさん
2009/10/02(金) 04:35:080265デフォルトの名無しさん
2009/10/02(金) 04:41:20MSDN
0266デフォルトの名無しさん
2009/10/02(金) 07:05:42VS2008ExpressEditionに移行しちゃってもいいんじゃね、タダだし
0267デフォルトの名無しさん
2009/10/02(金) 08:53:42是非boostスレを賑わしに来てください。
http://pc12.2ch.net/test/read.cgi/tech/1251446016
0268デフォルトの名無しさん
2009/10/02(金) 16:37:32メモリの空きはまだまだあるのですが、
includeしてるソースを少し弄ってコンパイルすると、また10秒とかマタされます。
pchを使うと確かに早くなりますが、pchを使えない環境だと毎回こんなに待たされているんですかね?
これはヘッダーへ実装も書いてしまうことの、弊害?と考えても間違いないでしょうか?
0269デフォルトの名無しさん
2009/10/02(金) 17:01:420270デフォルトの名無しさん
2009/10/02(金) 17:28:590271デフォルトの名無しさん
2009/10/02(金) 19:08:17誰か教えて
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 );
で呼ぶと、即座にコンテントが返る。
0272271
2009/10/02(金) 19:09:08# 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`)
0273デフォルトの名無しさん
2009/10/02(金) 19:10:130274デフォルトの名無しさん
2009/10/02(金) 19:25:09ヘッダーに実装を書くとテンプレートのインスタンス化がされる場合がある、そのヘッダーをインクルード
しただけでコンパイル時間がのびる。無用なインスタンス化がされないようにヘッダーに実装は書かないほうが良いよ。
テンプレートをtypedefしただけでもコンパイル時間は延びる。
0275デフォルトの名無しさん
2009/10/02(金) 19:42:300277デフォルトの名無しさん
2009/10/02(金) 20:53:23V2に期待ってことかね。
0278デフォルトの名無しさん
2009/10/02(金) 21:03:28やはりこういうものなのですね
>>274
asioの場合は空のcppへinclude書いただけで10秒近くになってしまいました。
っと今また計ってみたら8秒だた・・・
それでも私のような、書き直してはビルドの初心者にはきついですね。
大人しくpchを使っていこうと思います。
ありがとうございました。
0279デフォルトの名無しさん
2009/10/02(金) 23:20:55boostは無条件にpchに放り込んでたから気づかなかった。
0280デフォルトの名無しさん
2009/10/03(土) 00:09:211の補数、2の補数という言葉がありますが、
なぜこのような名前になっているのか教えてください。
(意味は知っています)
1、2 という数字に意味があるのでしょうか?
0281デフォルトの名無しさん
2009/10/03(土) 00:34:29補数の意味が分かってないじゃん
0282デフォルトの名無しさん
2009/10/03(土) 03:12:322の補数と単に言った場合、それが2種類あることも分かっていないんだろう
0283デフォルトの名無しさん
2009/10/03(土) 08:17:370284デフォルトの名無しさん
2009/10/03(土) 09:46:35自己解決しました。
1の補数
各桁ごとに1の補数をとる
2の補数
2^nの補数をとる
1と2の意味が全く異なる上、
2じゃなくて2^nのことだし。
酷い用語が万延したものだ。
0285デフォルトの名無しさん
2009/10/03(土) 09:51:39文字列の最後の文字を削除する場合ってどうすればいいんですか?
それっぽい関数が見当たらなかったんですが、皆さんどうやって処理するんでしょうか
0286デフォルトの名無しさん
2009/10/03(土) 09:56:04str[strlen(str)-1] = '\0';
}
0287デフォルトの名無しさん
2009/10/03(土) 09:56:480288デフォルトの名無しさん
2009/10/03(土) 09:58:49ありがとうございます。
文字列の方は、最初から[10]と決めているんですが、この場合動的に管理しないと無理ですか?
0289デフォルトの名無しさん
2009/10/03(土) 11:50:42ポインタそのものは変化しないので静的配列でもOK
0290271
2009/10/03(土) 12:18:050291デフォルトの名無しさん
2009/10/03(土) 12:52:090292デフォルトの名無しさん
2009/10/03(土) 13:11:490293デフォルトの名無しさん
2009/10/03(土) 14:29:410294デフォルトの名無しさん
2009/10/03(土) 15:10:290295デフォルトの名無しさん
2009/10/03(土) 16:31:37inline int operator [] (int i) {
return a[i];
}
int a[10];
}
↑のinlineって生の配列アクセスまで最適化されますか?
0296デフォルトの名無しさん
2009/10/03(土) 17:02:320297デフォルトの名無しさん
2009/10/03(土) 17:28:55配列
*points1 = メモリ確保した。
*points2 = メモリ確保した。
for ( i = 0; i < numPairPoints ; i ++) {
points1 から始まる配列にxとyを代入する。
points2 から始まる配列にxとyを代入する。
}
コード自体はとても簡単な処理なのですが、
デバッグしていると、i がある程度(デバック実行の度常に同じiの値)増えた後に、
何故かpoints2(のみ)の内容が書き換えられ、メモリアクセスエラーが起こしています。
こういうことが起こる場合にはどこでなんとかすべきなんでしょう?
points1の処理は通ってpoints2が途中でだめなのでコード外の要因だと思うのですが・・・
よろしくお願いします。
0298デフォルトの名無しさん
2009/10/03(土) 17:34:10points1 の型は何?
0299デフォルトの名無しさん
2009/10/03(土) 17:37:46書いてるコードはこんなんです。
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;
}
0300デフォルトの名無しさん
2009/10/03(土) 18:03:49おー昔のコンピュータの数値は整数ではなく
[0..1) の固定小数点数を表していた
と言えば後は分かるだろ
0301デフォルトの名無しさん
2009/10/03(土) 19:26:00[0, 1) のことだったら
2の補数は1の補数と呼ばれなくてはおかしい。
[0, 2) の固定小数点数だとしても、
1の補数の方は各桁の1の補数であることは変わらない。
いずれにしろおかしい。
0302デフォルトの名無しさん
2009/10/03(土) 20:15:38エディタにVisual c++2008使ってるんですが
ファイルを作成する場合、まずはプロジェクトの作成→ソースファイルの作成らしいですが
1つのプロジェクトフォルダに別々のソースファイルを保存することはできないんですか?
0303デフォルトの名無しさん
2009/10/03(土) 20:21:36opencvと言うのは知らんが、
単純に確保している領域をオーバーしてるんじゃないの?
0304デフォルトの名無しさん
2009/10/03(土) 20:30:35メニューのプロジェクトから、新規項目の追加とか既存項目の追加とか。
0305デフォルトの名無しさん
2009/10/03(土) 20:37:47新規項目で別のソースファイルを作れるんですが
ただ、コンパイルするときビルドエラーとかになるんですよね
0306デフォルトの名無しさん
2009/10/03(土) 20:43:21main()を2つ書いてるとか?
もしそうだったら、プロジェクトの追加をするんだ。
0307デフォルトの名無しさん
2009/10/03(土) 20:44:49エラーを貼ってみて。
0308デフォルトの名無しさん
2009/10/03(土) 20:55:400309デフォルトの名無しさん
2009/10/03(土) 21:35:36何の関数か知らんけど、cvCreateMatの第1引数と第2引数を入れ替えてみそ
0310デフォルトの名無しさん
2009/10/03(土) 22:17:49OpenCV の使い方に関する話になりそうなんで
【Intel】OpenCV総合スレ【画像処理】2
http://pc12.2ch.net/test/read.cgi/tech/1230511656/
こっちで聞いてみたら?
ぱっとみ cvCreateMat の 第3引数はそれでよいっぽい
第1引数 第2引数 の関係と その後の操作の次元があっているのかわからん
(NxM なのか MxN なのか
0311デフォルトの名無しさん
2009/10/03(土) 22:42:45メモリだけ見れば似たような感じなのですが
0312デフォルトの名無しさん
2009/10/03(土) 22:45:100313デフォルトの名無しさん
2009/10/03(土) 22:48:54文脈によるけど。
0314デフォルトの名無しさん
2009/10/03(土) 22:50:42面白い視点だな。
0315デフォルトの名無しさん
2009/10/03(土) 22:50:53配列は隙間無で詰めないか?
0316311
2009/10/03(土) 22:55:02もしかしたらサイト管理者の間違いかもしれないので、あまり気にしない様にします。ありがとうございました。
0317デフォルトの名無しさん
2009/10/03(土) 22:57:44その空いた領域にほかのデータが書き込まれる可能性ってあるの?
0318デフォルトの名無しさん
2009/10/03(土) 23:00:330319デフォルトの名無しさん
2009/10/03(土) 23:23:040320デフォルトの名無しさん
2009/10/03(土) 23:44:19気にしなければならないのは1構造体のサイズ=メンバの合計のサイズにしたければパディング無しにしなければならないって話なんだよ
0321デフォルトの名無しさん
2009/10/03(土) 23:44:370322デフォルトの名無しさん
2009/10/04(日) 00:05:020323デフォルトの名無しさん
2009/10/04(日) 00:15:43あと4バイトとは限らない
0324デフォルトの名無しさん
2009/10/04(日) 00:21:25visual studio 2008で
それぞれ別のディレクトリに保存した同一ファイル名のファイルを
プロジェクトに追加してビルドすると
未解決の外部シンボルというエラーがでます。
どうしたら同一ファイル名のファイルをビルドできますか?
0325デフォルトの名無しさん
2009/10/04(日) 00:24:180326デフォルトの名無しさん
2009/10/04(日) 00:26:08買った参考書に入っていたプロジェクトでは
同じファイル名でビルドできたので
出来ればその設定方法を知りたいんですが
0327デフォルトの名無しさん
2009/10/04(日) 00:28:530328デフォルトの名無しさん
2009/10/04(日) 00:29:16こっちいくといいよ
Visual Studio 2008 Part 18
http://pc12.2ch.net/test/read.cgi/tech/1251622158/
0329デフォルトの名無しさん
2009/10/04(日) 00:32:49ファイル名が同じだからコンパイル後の出力ファイルが上書きされたって事?
だったらファイルのプロパティで->出力ファイル->オブジェクトファイル名を設定すればどうにかなりそうだけど
0330デフォルトの名無しさん
2009/10/04(日) 00:33:530331デフォルトの名無しさん
2009/10/04(日) 00:36:45そのファイルへのパスちゃんと通ってるかィ?
0332デフォルトの名無しさん
2009/10/04(日) 00:38:33ファイル名を指定したら出来ましたありがとうございます。
>>330
クラス名は被ってますがnamespaceで区別してます
>>331
通ってます
0333デフォルトの名無しさん
2009/10/04(日) 06:25:57CのライブラリをC++で使ってるときに
if(true返す処理) {
throw
}
Cライブラリの関数呼び出し
というような状態で、例外が投げられませんでした。
C関数とthrowをそれぞれ別な関数に分割したら
思ったとおりに動いたのですが、もしかしてC関数と
例外って一緒に使っちゃダメなんでしょうか?
0334デフォルトの名無しさん
2009/10/04(日) 09:57:20C言語部分を通過するthrowは駄目だった気がする。
例えばC言語の関数に渡したコールバックで例外投げた場合とか。
void c_func(void (*callback)()) { callback(); }
void cpp_callback() { throw ○; }
void cpp_func() { c_func(cpp_callback); }
0335デフォルトの名無しさん
2009/10/04(日) 10:15:01ライブラリ呼び出しで、そのような制限は聴いたこと無いな。sinとか普通に使ってるし。
その問題が起きる最小のコードを提示したほうが回答が得られやすいよ
0336デフォルトの名無しさん
2009/10/04(日) 10:26:21もうちょっと具体的に書くと、
if(!dir.CheckPath(fileName_)) { //ファイルパスが有効ならtrueを返す関数
throw "無効なパス";
}
//oggライブライリのファイル開く関数
if( ov_fopen(const_cast<char*>(fileName_), Dst_) ) return false;
return true;
ファルパスが無効なら例外投げるはずですが、投げられずに
ov_fopenに行ってしまい、関数内でアクセス違反起こしてエラーになります。
パスチェックとov_fopenを別々な関数に分けて書くと、思ったとおりの動作をする
ので、処理自体には問題は無いと思います。
0337デフォルトの名無しさん
2009/10/04(日) 10:37:35ov_fopenをelse側に書くとどうなるの?
0338デフォルトの名無しさん
2009/10/04(日) 10:59:02・例外仕様を使わないとクライアントがメソッドの投げうる例外を調べるときにドキュメントを読むかソースを追跡するぐらいしかできない
・例外仕様で縛らないと実装の変更の際に投げる例外が増減する可能性もあるのでクライアントが実装まで気にしなければならない
と考えると例外使用を使わないのはよくないような気がするんですが・・・
templateと相性が悪いのは分かりますが、非テンプレート限定なら問題ないはずです
0340デフォルトの名無しさん
2009/10/04(日) 12:44:44少なくとも、例外仕様を批判する立場からすると後者は逆。
実装の変更の際に投げる例外が増減する
→例外仕様も変更する→それを呼び出す元も修正しないといけない
or →例外仕様を変更しない→例外仕様が実態と乖離したものになる
あと、C++の例外仕様は実行時にコストが増えるだけでコンパイル時には何もしてくれないのもマイナス。
(さらに、実行時違反していることが分かっても、基本は即座に落とされるだけで何もできない)
0341デフォルトの名無しさん
2009/10/04(日) 13:05:520342デフォルトの名無しさん
2009/10/04(日) 13:10:300343デフォルトの名無しさん
2009/10/04(日) 13:23:390344デフォルトの名無しさん
2009/10/04(日) 13:34:42あんまりうれしくないよな。
0345デフォルトの名無しさん
2009/10/04(日) 14:45:38ただ、throw()はメリットがあると思う。
0346デフォルトの名無しさん
2009/10/04(日) 15:00:35--- "[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...
0347デフォルトの名無しさん
2009/10/04(日) 17:12:210348デフォルトの名無しさん
2009/10/04(日) 17:41:00プロパティ使えるんだよな
0349デフォルトの名無しさん
2009/10/04(日) 18:24:00テンプレート関数の内部ではポインタの内容が書き換わっているのですが、
関数から戻ってくるとポインタの内容が元に戻ってしまいます。
何故でしょうか?
0350デフォルトの名無しさん
2009/10/04(日) 18:39:31C++の仕様には含まれてなくて、各処理系の言語拡張だよね?
だから使わないほうがいいのかな?
0351デフォルトの名無しさん
2009/10/04(日) 18:49:34テンプレ関数の宣言と、呼び出してる部分と、引数に渡している値の宣言部分と、
テンプレ関数内のその引数を操作している部分を書いてください。
0352デフォルトの名無しさん
2009/10/04(日) 18:49:37一番可能性が高いのはおまいの勘違い。
最小限のコードでも載せないとまともな回答は望めないかと。
0353デフォルトの名無しさん
2009/10/04(日) 18:50:54ポインタを参照で渡せば?
0354デフォルトの名無しさん
2009/10/04(日) 19:30:06どこかでコピコンが働いてんだよ。
0355デフォルトの名無しさん
2009/10/04(日) 19:35:460356349
2009/10/04(日) 19:50:39保持されました。
コード部分なんですが、リスト構造のポインタだったので、
操作している部分が長く、見にくいかもしれませんが
書いたほうがよろしいでしょうか?
皆さんレスありがとうございます。
0357デフォルトの名無しさん
2009/10/04(日) 20:20:28VS2008で作ったCのプログラム(ただのハローワールド)を
別のマシンで実行させるにはどういうモジュールが必要なんでしょうか
.exeファイルをもっていって実行させてもエラーで動作しませんでした
0358デフォルトの名無しさん
2009/10/04(日) 20:27:52wine
0359デフォルトの名無しさん
2009/10/04(日) 20:29:20CRTをStaticにLinkするんだ
0360デフォルトの名無しさん
2009/10/04(日) 20:34:15.NET Frameworkがいるんじゃね?
0361デフォルトの名無しさん
2009/10/04(日) 21:14:070362デフォルトの名無しさん
2009/10/04(日) 21:14:58ttp://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/C++2/06/06-02.html
0363デフォルトの名無しさん
2009/10/04(日) 21:18:55だったらまずお前が読めよ
0364デフォルトの名無しさん
2009/10/04(日) 21:20:370365デフォルトの名無しさん
2009/10/04(日) 21:21:290366デフォルトの名無しさん
2009/10/04(日) 21:32:50すいません。別のマシンってwindowsXPのデフォルトインストール状態のマシンです
なんかライブラリがいるって聞いて、何かをインストールしなきゃいけないのかな?と思い質問しました。
.net frameworkかなと思ったのですがCなのに?という疑問がありました。
ちょっと試してみます
0367デフォルトの名無しさん
2009/10/04(日) 21:36:50.net frameworkじゃなくてCランタイム
0368デフォルトの名無しさん
2009/10/04(日) 21:44:54お前は何を言ってるんだ
wwwwwwwwwwwwwwwwwwwwwwwwwwwww
0369デフォルトの名無しさん
2009/10/04(日) 21:48:0832bit/64bit 問題だったりしてw
0370デフォルトの名無しさん
2009/10/04(日) 21:55:350371デフォルトの名無しさん
2009/10/04(日) 22:08:09なるほど。。正確にはCランタイムが必要で
.net framework入れるとCランタイムが入ってくるということですね
入れる対象マシンは私のじゃないのでモジュールだけ入れたいのですが
>>359さんの方法が可能なのですかね?ちょっと調べてみます
>>369
その問題がよくわかっていませんがどちらも32bit環境です
0372デフォルトの名無しさん
2009/10/04(日) 22:10:44これは独り言だけど、コンパイルしたときの条件とか設定とかをちゃんと書くといいかもよ。
0373デフォルトの名無しさん
2009/10/04(日) 22:38:18http://www.microsoft.com/DOWNLOADS/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=ja
...
0374デフォルトの名無しさん
2009/10/04(日) 22:42:59Microsoft Visual C++ 2008 Service Pack 1 再頒布可能パッケージ ATL のセキュリティ更新プログラム
http://www.microsoft.com/downloads/details.aspx?FamilyID=2051a0c1-c9b5-4b0a-a8f5-770a549fd78c&DisplayLang=ja
0375デフォルトの名無しさん
2009/10/04(日) 23:18:31以下のような関数を書いたんです。動機は自作コンテナのオブジェクトプール用のイニシャライザです。
以前の環境をリセットして再利用できるように初期化します。
で、てきとーなテストではうまくいきました。つまり、クラスや構造体のメンバ変数を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;
}
0376デフォルトの名無しさん
2009/10/04(日) 23:38:25今日はもう寝るので明日また見に来ますです。
よろしくお願いします。
0377デフォルトの名無しさん
2009/10/04(日) 23:43:37何か無用に難しいことやってるね。
memsetで万事解決。
0378デフォルトの名無しさん
2009/10/04(日) 23:48:23in = T() で十分だろ。
それは別としても、そのコードはアウト。
calloc() で確保したメモリは free() で解放しないとだめ。
あと、 new(Mem) T で例外が発生するとリークする。
そもそも calloc() 使って 0 初期化とか言ってる時点で T に
だいぶきつい制約があるんだろうけどな。
0379デフォルトの名無しさん
2009/10/04(日) 23:49:090380デフォルトの名無しさん
2009/10/04(日) 23:50:25メモリリークしてるかどうかはどうやって判断したの?
0381デフォルトの名無しさん
2009/10/04(日) 23:51:08ゼロクリアする必要があるみたいじゃん。
0382デフォルトの名無しさん
2009/10/04(日) 23:57:15http://www.kijineko.co.jp/tech/superstitions/initialization-by-memset.html
http://www.kijineko.co.jp/node/163
0383デフォルトの名無しさん
2009/10/04(日) 23:58:190384デフォルトの名無しさん
2009/10/05(月) 00:00:25いや、それは分かるけど、375はゼロクリアが必要だって言ってるんで。
関数名がZeroInitializerだし。
クラスのオブジェクトを初期化したいだけなのなら、話は変わってくるけど。
0385デフォルトの名無しさん
2009/10/05(月) 00:02:40あとは 375 本人に語らせるしかない。
0387デフォルトの名無しさん
2009/10/05(月) 00:09:21寝たんじゃないのか。
とりあえず、なぜゼロクリアしたいのか、話を訊こうか。
0388375
2009/10/05(月) 00:11:09>>380
VCの<crtdbg.h>の関数でやりました。
>>381 & >>384
ごめんなさい。とりあえず、現在の状態をリセットできればZEROじゃなくてもいいです。
布団入る前に見にきてよかった。
0389デフォルトの名無しさん
2009/10/05(月) 00:12:260390デフォルトの名無しさん
2009/10/05(月) 00:14:53メモリプールみたいなものを作るならEfficient C++でもみて勉強すれば?
0391375
2009/10/05(月) 00:23:10何で、こんなことしようかと思ったかというと、N分木のツリーコンテナを作ったのが始まりです。
このコンテナはテンプレートになっていて、いかなるTをも食います。
無難な初期化法を模索している時に、VCのstd::vectorの中身がかならず0で初期かされていることを思い出しました。
で、これをうまく取り込もうと思ったのでそういうコードを書きました。
>>389
>>378では問題がでないなら、それで終了です。
ちょっと大丈夫か不安だったんですが、まぁ、責任はユーザクラスに投げてしまうのもいいかなぁ。。。
>>390
まず本を買わないと!ですね。
とりあえず方向性が見えたのでそれで何とかしようと思います。
変な質問でしたが誠実に答えていただいてありがとうございました。
ぐっすり寝れますよ。;)
0392デフォルトの名無しさん
2009/10/05(月) 00:51:58だから、とりあえずは>>375のコードのnewのところをnew(Mem) T();とすればいい。Tの後の括弧が重要。
(コピーコンストラクタなど)コンストラクタに引数を渡す場合もここで渡すこと。
そして、この要素を削除するときにはTemp->~T();でデストラクタを呼んでからfree(Temp);する。
こうすれば、コンストラクタ・デストラクタを持つクラスでもきちんと動くはず。
本格的にやるなら、std::vectorみたいにテンプレート引数でアロケータを取るようにする。
malloc→allocate
new(void*)→construct
~T→destroy
free→deallocate
アロケータのメンバはこう対応する。
0393デフォルトの名無しさん
2009/10/05(月) 01:02:20テンプレートで書いたら保守なんてできたもんじゃないな
0394デフォルトの名無しさん
2009/10/05(月) 01:21:45T に制約を設けないならコンストラクタからの例外にも気をつけないと。
0395デフォルトの名無しさん
2009/10/05(月) 14:01:33詳細ありがとうです。T()でも問題なさそうなのでそれで行きます。
元々は自分の認識の甘さが原因ですね。もっと精進したいと思います。
ありがとうございました。
0396デフォルトの名無しさん
2009/10/05(月) 14:15:44括弧はなくてもいいと思うが。あってもいいけど。
0397デフォルトの名無しさん
2009/10/05(月) 18:24:36詳しい知人に聞いたら、
p = &*i;
いうやり方を教えてくれました。なるほど確かに動いているのですが、
一見無意味な変換をしているようで気持ち悪いです。
こういうやり方って一般的なんですかね。
0398デフォルトの名無しさん
2009/10/05(月) 18:41:42一般的だと思う。
「自分の環境のvectorのイテレータはポインタで実装されているから」といって、
イテレータをそのままポインタとして使う方が気持ち悪い。
0399デフォルトの名無しさん
2009/10/05(月) 18:43:02vectorのイテレータはランダムアクセスイテレータなので、機能的にはほとんどポインタと変わらない。
(*it)ってやれば、要素を返してくるので、それのアドレスを返せばポインタへの変換はできる。
でも、俺もキモイと思う。一般的かは別として。。。
0400デフォルトの名無しさん
2009/10/05(月) 19:33:23一般的というか、普通にそれが正解だし、中身を理解してくれば不自然さも感じなく
なってくるかもしれないし、なってこないかもしれない
0401デフォルトの名無しさん
2009/10/05(月) 19:55:32C++の標準としては、引数付きマクロに型引数を指定してもいいんでしょうか。
#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)
{
...
}
0402デフォルトの名無しさん
2009/10/05(月) 20:00:52何を指定してもようござんす。
0403デフォルトの名無しさん
2009/10/05(月) 20:17:26最終的なC++の文章として整合性の取れた置換がされれば、コンパイラさんは疑ったりしない。
0404デフォルトの名無しさん
2009/10/05(月) 22:12:13コンストラクタを持つクラスなら確かにどっちでも同じだけど、そうでない組込型やPODだと違うの。
new intだと、int i;のiのように初期化されなけど、new int()は0初期化される。
まあ、たしかにstd::vectorはT()をコピーコンストラクトして0にするので、
これは使っていないはずだけど。
0405デフォルトの名無しさん
2009/10/05(月) 22:27:531024バイトはヘッダーとか、ここからデータが入ってるとか、そういったことが知りたいです。
動画再生ソフトをC、C++でガリガリプログラムしてみたいと思ってます。よろしくお願いします。
0406デフォルトの名無しさん
2009/10/05(月) 22:32:19へぇ
0407デフォルトの名無しさん
2009/10/05(月) 22:35:010408デフォルトの名無しさん
2009/10/05(月) 22:37:480409デフォルトの名無しさん
2009/10/05(月) 23:38:40フォーマットがわかったくらいじゃ再生できなくて
結局規格書が必要になるから最初から規格書手に入れたほうがよい
つーか何人もの熟練のプログラマが関わってても
バグが出るのが動画の世界なのに
そんなことも自分で解決できないレベルじゃ間違いなく挫折する
いや、むしろ俺が挫折した
悪いことは言わないからDirectShowにでも頼ったほうが早い
0410デフォルトの名無しさん
2009/10/06(火) 00:03:01高い山を目指すのも悪くはないけど山の高さを知るためにもまずは
JPGあたりからはじめたらどうかな?
挫折すること請け合い
0411デフォルトの名無しさん
2009/10/06(火) 00:29:260412デフォルトの名無しさん
2009/10/06(火) 01:36:50漫画とかイラストとか、基本は白黒で線とベタとトーン、それに活字で出来ている絵、
これって、一般的にはBMPからJPGに圧縮してるけど
線や字(フォントの種類)等を判別する方法をうまく考え出せば
JPGとかに比べて、ずっと圧縮率を高くすることも出来ると思うんだ。
もう既に作られているのかもしれないけど。
0413デフォルトの名無しさん
2009/10/06(火) 01:45:160414デフォルトの名無しさん
2009/10/06(火) 01:49:070415デフォルトの名無しさん
2009/10/06(火) 01:52:58でも、線の強弱やかすれ、ベタフラッシュやホワイト、トーン削りなんかを考えたら、
jpgとかで十分だと思うよ。
0416デフォルトの名無しさん
2009/10/06(火) 01:56:210417デフォルトの名無しさん
2009/10/06(火) 02:07:11むしろ8bitグレースケールにしてPNGだろうな
サイズは増えるだろうけど「無劣化」はでかい
ちなみにJPEGにもグレースケール専用の色空間定義がある
読み書きできないソフトも多いだろうけど
0418デフォルトの名無しさん
2009/10/06(火) 06:47:55そのウィンドウを標準化すると、指定サイズに変わっている
というのをやりたいのですが、サイズが変わってくれません。
いい方法がありましたら教えてください。
0419デフォルトの名無しさん
2009/10/06(火) 15:21:59SetWindowPlacement
0420デフォルトの名無しさん
2009/10/06(火) 21:23:35のページの
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
について質問ですが、これはLRESULTという型のCALLBACK WndProcという関数でしょうか?
それともLRESULT CALLBACKという型のWndProcという関数でしょうか?それともまた別でしょうか?
前者のような気がするんですが、いじってみてもうまくコンパイルできません。
たぶん自分のレベルでは追いつかないような記述だと思うのですが、分からないままだと悲しいので答えだけ教えてください
0421デフォルトの名無しさん
2009/10/06(火) 21:26:26CALLBACK => 呼び出し規約
WndProc => 関数の名前
0422デフォルトの名無しさん
2009/10/06(火) 21:28:49呼び出し規約というのは初耳です。調べてみます。
ありがとうございました〜
0423デフォルトの名無しさん
2009/10/06(火) 22:39:17ありがとうございます。
0424デフォルトの名無しさん
2009/10/06(火) 23:18:530425デフォルトの名無しさん
2009/10/06(火) 23:24:380426デフォルトの名無しさん
2009/10/06(火) 23:45:55関数呼び出すための約束事。
アセンブリになったときのお約束で、他言語との協調とかそういうときに役に立つ。
0427デフォルトの名無しさん
2009/10/06(火) 23:56:12kern protection failureってどういうエラーなのでしょうか?
たとえば
char *str = "aiueo\0";
で初期化した文字列に対して
*str = 'o';
を実行したときにこのエラーが出てしまいます。
使用OSはMAC OS Xでgccを用いてコンパイルしています。
0428デフォルトの名無しさん
2009/10/06(火) 23:59:00それは配列として確保してないから改変不可だ。
0429427
2009/10/07(水) 00:13:26説明ありがとうございました!
宣言だけ行って、mallocで領域を確保したらうまくいきました
追加で質問させていただきたいのですが、
宣言直後のポインタは基本的に書き込み禁止領域のアドレスを指しているのですか?
0430デフォルトの名無しさん
2009/10/07(水) 00:17:21どこさしてるかわからん超危険ポインタ
下手したらOSの挙動に割り込んでHDDをぶっ壊すかもしれない
ってたまに聞くけど本当かどうかはしらない。使ってみてはどうでしょうか
0431デフォルトの名無しさん
2009/10/07(水) 00:24:22a = malloc(x);
これって別に問題はおこらなそうだけどやったらだめなの?
0432デフォルトの名無しさん
2009/10/07(水) 00:29:490433デフォルトの名無しさん
2009/10/07(水) 00:37:49初期化されてない自動変数のポインタは、大体の処理系ではスタックのメモリに
残っていた値が入っていて、元がint型の値だったりしたとき、全く関係のない
アドレスが入っていたりする。たまに書き込み可の領域を指してることもあることは
あるが、大体は書き込んだらSegmentation faultで落ちる。
0434デフォルトの名無しさん
2009/10/07(水) 00:38:36今にして思えば、単に配列とポインタを理解してなかっただけだが。
0435デフォルトの名無しさん
2009/10/07(水) 00:50:33モダンなOSなら、ちゃんと例外を投げてくれるけどね。
0436デフォルトの名無しさん
2009/10/07(水) 01:19:280437デフォルトの名無しさん
2009/10/07(水) 01:21:30もう一台のlinuxPCのRS232Cのポートから変換コネクタを
かませて切り替え機につなぐことは出来ますか?
切り替え機に大して送るキーボード信号をソフト的に
エミュレーションしたいので可能かどうか悩んでます。
linuxスレで聞こうかと思いましたが、閑散としていたので
こちらで聞きました。
アドバイスがあればよろしくお願いいたします。
0438デフォルトの名無しさん
2009/10/07(水) 01:24:44TabControlで、タブの入れ替えをドラッグアンドドロップで行いたい。
■備考
下記URLはC#でのソースです。
ttp://watcher.moe-nifty.com/memo/2009/02/ctabcontrol-b32.html
備考欄のURLの内容をC++で実現してあるソースはありませんか?
0439デフォルトの名無しさん
2009/10/07(水) 01:29:40それヌルポじゃないよ
ヌルポはヌルポであって、未定義とは全く違うよ
0440デフォルトの名無しさん
2009/10/07(水) 01:38:050441デフォルトの名無しさん
2009/10/07(水) 01:41:28実アドレス上で動かないからOSには多分被害ないと思うが。。。
0442デフォルトの名無しさん
2009/10/07(水) 01:49:05関数の呼び出し方をアセンブリ言語レベルで規定したもの。
引数はスタックに積むのかレジスタに格納するのか、スタックに積むなら順番はどうか、
レジスタを使うならどのレジスタにするのか、とか諸々のルールがある。
呼び出し規約の指定を間違えると、関数を正しく呼び出せず、クラッシュする。
アセンブリ言語で関数を書くのでなければ、中身は知らなくても名称さえ知っていれば大丈夫。
0443デフォルトの名無しさん
2009/10/07(水) 02:34:07数メガサイズのファイルを読み込み、そのデータをメモリ内にアプリケーションが
終了するまで持ち続けるようなプログラムを作成したいのですが、読み込んだデータを持つ方法で悩んでいます。
複数のクラスからアクセスするようなデータ場合、usingを使いグローバル変数に格納するのが一般的なのでしょうか?
なんとなく、C++ではグローバル変数を使用するのがタブーになっているような思いがあるので質問させていただきました。
0444デフォルトの名無しさん
2009/10/07(水) 03:15:20持ち回り方はC++だからといって何か特殊な方法でもないよ
0445デフォルトの名無しさん
2009/10/07(水) 03:28:48そこでMediatorパターンですよ。
0446デフォルトの名無しさん
2009/10/07(水) 04:20:080447デフォルトの名無しさん
2009/10/07(水) 04:29:490448デフォルトの名無しさん
2009/10/07(水) 04:38:06ncursesのboxのボーダーが文字化け(?)してる。 なんか技がある?
スレ違いだったら誘導してくれ。
0449デフォルトの名無しさん
2009/10/07(水) 04:46:06指していない可能性だってあるんだぜ。ぬるぽとか。
0450デフォルトの名無しさん
2009/10/07(水) 04:51:110451デフォルトの名無しさん
2009/10/07(水) 04:52:39どう化けてんだ?
\が¥になるのはフォントのせいだけど。
0452デフォルトの名無しさん
2009/10/07(水) 05:00:01多分、フォントのマッピングが違ってて、それで文字化けしてるんだろうけど
box (subwin_1, ACS_VLINE, ACS_HLINE) でサブウィンドウを囲ってやろうと
すると、縦の線が上付きの「3」になって、横の線はなにも表示されない。
なんかいいアイデアない?
0453デフォルトの名無しさん
2009/10/07(水) 05:08:12いいようになってるし)
どんなビットパターンかは処理系依存で、0に等しいとは限らないけど、コンパイル
タイムでポインタにキャストされた0はヌルポ扱いをすることになってる
まぁこの辺はいまいち分かりにくい仕様だと思うし、C++0xではnullptr_t型のnullptr
というものがとうとう導入されることになった訳だけど
0454デフォルトの名無しさん
2009/10/07(水) 05:11:28ぬるぽの知識が曖昧な奴はこれ嫁
0455デフォルトの名無しさん
2009/10/07(水) 05:30:55localeを見直してみるとか?
0456デフォルトの名無しさん
2009/10/07(水) 05:33:43それがたまたまヌルポになる可能性があるから、未初期化でも
常にどこかを指すというのは間違いであると
0457デフォルトの名無しさん
2009/10/07(水) 06:24:430458デフォルトの名無しさん
2009/10/07(水) 09:17:26シングルトンでも使えばいいじゃない
0459デフォルトの名無しさん
2009/10/07(水) 10:39:06自分で書いたクラスをインスタンス化し、それをListとして格納して扱うにはどうすれば良いのでしょうか?
まぬけな質問に見えますが、非常に困ってます。
C#で書いた場合、こんな感じになります。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9969.txt
C++で書くにはどうすれば良いのでしょうか?
0460デフォルトの名無しさん
2009/10/07(水) 10:49:59グローバル変数はダメなのに「シングルトン」ならダメじゃなくなるとでも思ってるのか?
0461デフォルトの名無しさん
2009/10/07(水) 10:50:410462デフォルトの名無しさん
2009/10/07(水) 13:05:20まったく別なんじゃないか?
0463デフォルトの名無しさん
2009/10/07(水) 13:22:52なんでグローバル変数がだめだとシングルトンもだめになるって思ったの?
0464デフォルトの名無しさん
2009/10/07(水) 13:33:49まだこんなこと言う人がいるんだな。初心者スレだからしょうがないか。
http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0
> グローバル変数は、通常その非局在性によりはっきりと悪しき慣習と考えられている。
ここで挙げられているような非局所性とそれによる問題点はグローバル変数でも
シングルトンでも同じこと。
また、それを許容するとしても、ふつうにグローバル変数やフリー関数が使える
(クラスが不要な) C/C++ ではわざわざシングルトンパターンと呼ばれるような
まわりくどい構造を持ち出す意味が無い。
http://www.google.co.jp/search?q=%22%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%88%E3%83%B3%22+%22%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0%22
0465デフォルトの名無しさん
2009/10/07(水) 14:14:14コレクションがどうこうより、クラスの扱い方のところで既に間違ってました。
スレよごしすみません。
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;
}
0466デフォルトの名無しさん
2009/10/07(水) 14:47:26初期化順の制御とかしたくなることない?
0467デフォルトの名無しさん
2009/10/07(水) 15:52:01グローバル変数とか使うなら、一個のクラスのメンバ変数にしてモジュールにしてしまうほうが再利用性を確保できる。
0468デフォルトの名無しさん
2009/10/07(水) 16:33:49作成したいんですがどこか参考になるサイトご教授願いませんか?
オブジェクト指向は理解してますがwindowsのプログラムは超初心者です。
0469デフォルトの名無しさん
2009/10/07(水) 16:43:180470デフォルトの名無しさん
2009/10/07(水) 16:48:48私はあなたではないので質問の意味が分かりません
他の人にわかるように書いてください
0471デフォルトの名無しさん
2009/10/07(水) 16:50:45ローカルアプリというのは何を指していますか?
APIは何万個もあるわけですが、どのAPIをコールしたいのですか?
コマンドラインで受け取った引数は何に使うのですか?
0472デフォルトの名無しさん
2009/10/07(水) 17:05:31Skypeで特定ユーザーにメッセージを送信、ムードメッセージを送信、オンライン、オフラインの切り替えなどです。
Firefoxのadd-onを作成しているのですがActiveXのSkype4COM.dllが使用できないため
exeでなんとか操作できないかと。
0473デフォルトの名無しさん
2009/10/07(水) 17:11:02exeじゃなくてwscriptで十分。
Skype4Com WScript でググレ。
0474デフォルトの名無しさん
2009/10/07(水) 17:12:56https://developer.skype.com/Docs/Skype4COM
ここの referenceguide とか examples ちらっと見る限り exe での操作はできるよ
0475デフォルトの名無しさん
2009/10/07(水) 17:21:43wikipediaってwww
0476デフォルトの名無しさん
2009/10/07(水) 17:33:14その書き方だと、既成のEXE内の関数をコールしたいとか、あらゆる可能性を引きずってる。
もうちょっと限定してくれ。
0477デフォルトの名無しさん
2009/10/07(水) 17:41:390478デフォルトの名無しさん
2009/10/07(水) 17:42:26>>468 = >>472 みたいだ
0479デフォルトの名無しさん
2009/10/07(水) 17:56:050480デフォルトの名無しさん
2009/10/07(水) 17:57:59gotoと同じく完全排除が常に善ではないし、gotoよりは使ってもいい
ただ無闇に使うなってだけ
0481デフォルトの名無しさん
2009/10/07(水) 18:02:08おっとすまない。俺が読めてなかったみたいだ。
0482デフォルトの名無しさん
2009/10/07(水) 18:04:37シングルトンはグローバルとファイル内にスコープの閉じたstaticグローバル変数の中間くらいの性質をもったものでグローバルより安全で使いたい場所でだけゲットできる
0483デフォルトの名無しさん
2009/10/07(水) 18:05:130484デフォルトの名無しさん
2009/10/07(水) 19:04:33内容がおかしければ直せばよい。それだけだ。
0485デフォルトの名無しさん
2009/10/07(水) 20:00:060486デフォルトの名無しさん
2009/10/07(水) 20:06:29便所の落書きを一生懸命書き直すバカなんかいないだろ
0487デフォルトの名無しさん
2009/10/07(水) 20:09:500488デフォルトの名無しさん
2009/10/07(水) 20:20:45致命的に向いてないし、下手な使い方をすればグローバルインスタンスと全く同様の
問題も抱える。
今時シングルトンなんか推奨する人はちゃんと理解してるんだろうかと。
0489デフォルトの名無しさん
2009/10/07(水) 20:27:54書き直せよって言うけど、俺がぜんぜん違う内容に書き換えたら、それを信じるってことか?
0490デフォルトの名無しさん
2009/10/07(水) 20:28:02で、MTのコードを書き始めると、ダブルロッキングとか馬鹿で無意味なこと始めるか、
目が覚めて窓から放り投げる
0491デフォルトの名無しさん
2009/10/07(水) 20:29:41なんか無視して、中身の正しさを巡って議論すればいいと思うよ
0492デフォルトの名無しさん
2009/10/07(水) 20:31:500493デフォルトの名無しさん
2009/10/07(水) 20:32:570494デフォルトの名無しさん
2009/10/07(水) 20:46:550495デフォルトの名無しさん
2009/10/07(水) 20:59:59だからグダグダと言い訳ならべなくていいって。
君の最大の力をもって素晴らしいページに書き換えてくれ。
0496デフォルトの名無しさん
2009/10/07(水) 21:12:45wikip好きすぎだろ。
0497デフォルトの名無しさん
2009/10/07(水) 23:02:01発狂するタイミングじゃないと思うんだけど。
0498デフォルトの名無しさん
2009/10/08(木) 01:33:41>>482
「初期化順の制御」したいときにも「使いたい場所でだけゲット」したいときにも、
クラスに対してシングルトンパターンのような加工を施す必要は無いんじゃない?
ふつうのクラス定義と、そいつの参照を返す関数がひとつあるだけじゃダメなの?
0499デフォルトの名無しさん
2009/10/08(木) 02:24:17初期化順で俺が言いたかったのは複数のグローバルなオブジェクトがあるときね
1個だけならお好きに
0500デフォルトの名無しさん
2009/10/08(木) 02:54:52オブジェクトが何個でも一緒じゃない?
ふつうの関数(と静的変数)ではできなくて、「シングルトン」ならできる、っていう
初期化順の制御ってどんなのがあるの?
0501デフォルトの名無しさん
2009/10/08(木) 02:59:45>ふつうのクラス定義と、そいつの参照を返す関数がひとつあるだけじゃダメなの?
クラスを公開するなら、そのクラスのインスタンスがあちこちにできちゃうかもしれない。
メンバ関数じゃなくて、参照を引数に取る関数を定義すればいいかもだけど、
それならいっそ参照を外に出さないで、関数だけ公開すればいいと思う。
個人的には静的メンバ関数のみを持つクラスをよく使うなあ。
こういうのってパターン名とかないのかな。
0502デフォルトの名無しさん
2009/10/08(木) 03:09:59> クラスを公開するなら、そのクラスのインスタンスがあちこちにできちゃうかもしれない。
それが嫌なら、公開するクラスは純粋仮想関数の宣言を並べただけの
インターフェースクラスにしとくという手がある。
class C {
public:
virtual void f() = 0;
virtual void g() = 0;
};
C& DefaultC();
「参照返す関数」をなるべく使わないように、できるだけ引数で受け渡すように
しとけば、テスト用にダミー実装に差し替えるとかいうようなこともできる。
> それならいっそ参照を外に出さないで、関数だけ公開すればいいと思う。
あぁそういうパターンもあるよね。 C だと超ふつうだな。
やっぱりシングルトンパターンのメリットは見えてこないな。
0503デフォルトの名無しさん
2009/10/08(木) 09:31:26見た目がシングルトンより綺麗だから俺もこっち使うけどメリットデメリットはよくわからん・・・
0504デフォルトの名無しさん
2009/10/08(木) 10:18:340505デフォルトの名無しさん
2009/10/08(木) 10:56:2132ビットのXPで、出来るだけ最適化をかけられてフレームポインタが無い .exe は、
原則として関数(インライン化されたものを除く)のコール順というのは分からないんですよね?
それなのに、VisualStudioとかで見ると、呼び出し履歴が見えるのはどうしてでしょうか。
0506デフォルトの名無しさん
2009/10/08(木) 11:11:59最低限、関数からリターンするためには呼び出された元の位置を知っていないといけない
わけで、どんなに最適化してもプログラムが実行可能である限りその情報は存在している。
CPU が関数からリターンするときにそういった情報を使うのと同じように VisualStudio などの
ソフトで情報を読み取れば、最低限の呼び出し履歴の表示は可能。
さらにバイナリに残っているシンボル情報やコンパイル時に生成できるデバッグ情報などを
加えれば、関数名や引数の表示までだいたい可能になる。
0507505
2009/10/08(木) 11:28:37ありがとうございます。
StackWalk (StackWalk64) 関数でスタックトレースしようとしても、
フレーム有りだと上手くいくのですが、無しだと上手くいきません。
http://msdn.microsoft.com/ja-jp/library/cc428994.aspx
の引数 FunctionTableAccessRoutine のところに、x86 だと fpo にアクセスすると
明記されてるので、上手くいかなくて当然なのかもしれないんですが、
なんとかアクセスできるようにする方法は無いでしょうか?
0508デフォルトの名無しさん
2009/10/08(木) 11:38:15「上手くいきません」って言われてもな。
問題を再現するためのコードと期待した結果と実際の結果を用意して Windows API スレへどうぞ。
Win32API質問箱 Build82
http://pc12.2ch.net/test/read.cgi/tech/1253699773/
0510472
2009/10/08(木) 18:13:02コマンドラインオプションで文字列送信で文字化けして躓きまました。
メッセージ送信は_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・
何が問題なのかご教授よろしくお願いいたします。
0511デフォルトの名無しさん
2009/10/08(木) 18:17:42OpenGLのヘッダやライブラリのファイルのある場所が違うので
これらのどこになってもmakeが一発で通るように
Makefileを書きたいのですが
どういう風に書けばよいのでしょうか?
0512デフォルトの名無しさん
2009/10/08(木) 18:19:33makefile を分ける
ライブラリパスを追加しまくる
configure を書く
0513デフォルトの名無しさん
2009/10/08(木) 18:33:47いきなりですが質問をさせてください。
携帯向けの会員サイトを構築したいので、いくつかの携帯サイトを参考にしてよさそうなのを見つけたのですが、
どこで配布されているものなのかわkりません。
またはシェアウェアや、どこかの会社に委託して構築されてるものなのでしょうか。
http://www.google.co.jp/search?hl=ja&q=userLoginOpen.php&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja
これらはすべて同じシステムのようなのですが、配布元を教えていただけないでしょうか。
よろしくお願いします。
0514デフォルトの名無しさん
2009/10/08(木) 18:39:07鼬害。
0515デフォルトの名無しさん
2009/10/08(木) 18:41:18automakeあたりを使えば良いんじゃね?
0516デフォルトの名無しさん
2009/10/08(木) 20:05:50#include <limits>
でコンパイルエラー起こした
#include <climits>
を代わりにインクルードさせた通したんだけど
いいんでしょうかね、これで
0517デフォルトの名無しさん
2009/10/08(木) 20:09:39C++ ならおk
C言語ならNG
0518510
2009/10/08(木) 20:46:10UnicodeにShift-jis渡してりゃ化けるわw
あほだ俺w
0519デフォルトの名無しさん
2009/10/08(木) 21:10:110520デフォルトの名無しさん
2009/10/08(木) 21:17:51Cではふつう #include <limits.h> と書く。
0521デフォルトの名無しさん
2009/10/08(木) 23:06:540522デフォルトの名無しさん
2009/10/08(木) 23:09:00下のようなソースで、
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\"の\"がエスケープされ、文字の"となってしまい、
閉じる"がなくなってしまったためだと思います。
このような場合、プログラム上で回避できる策はあるのでしょうか?
無理そうなら、マニュアルに記載しようと思います。
0523デフォルトの名無しさん
2009/10/08(木) 23:20:310524デフォルトの名無しさん
2009/10/08(木) 23:35:59プログラムを実行する人に向けて、\は\\と書いてください、と
マニュアルに書くしかないということでしょうか?
0525デフォルトの名無しさん
2009/10/08(木) 23:41:17プログラム内部でディレクトリパスの末尾に¥が付いてる必要があるなら
入力時には¥の有り無しどちらでも受け付けるようにしておいて
プログラム側で末尾を判定して¥を付加してやればいいね
\"が"になってしまうのは使う側の責任。だけどそもそも末尾に¥を要求しなければ
そういうミスの発生件数も少なくなる
0526デフォルトの名無しさん
2009/10/08(木) 23:43:45それはコマンドプロンプトのせいだからどうしようもないね
対策はダブルクォートが出てきたら \" だと解釈して自分でパースするくらいかな
0527デフォルトの名無しさん
2009/10/09(金) 00:29:29int 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; }
とか書くのはちょっとベタすぎる気がするんですけど、そんなものですかね。
0528527
2009/10/09(金) 00:31:59vector<int>::iterator imax = lower_bound(v.begin(), v.end(), max + 1);
でいいですね。
0529デフォルトの名無しさん
2009/10/09(金) 00:42:20プログラム内部では、末尾に¥を付ける必要特にないのですが
やはりユーザー側から「¥”」のような指定をされてしまうと
プログラム側では防ぐことはできなさそうです。
>>526
文字列に「”」があったら、パースするというのも考えたのですが
パース後に残った文字列のどこからどこまでが第二引数、第三引数かの判定が難しいです。
(実は第三引数まであり、それぞれ半角スペースが入る可能性有り。)
もう少しやってみますが、
おそらくマニュアルに記載するのが良さそうに思います。
ご回答ありがとうございました。
0530デフォルトの名無しさん
2009/10/09(金) 00:43:21> 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 の後ろの境目、だと覚えてるんだけど、違ったかな?
0531デフォルトの名無しさん
2009/10/09(金) 06:54:56max+1するなら、両方lower_bound()だな。
iminをupper_bound()で得ると、重複した値を取りこぼす。
0532デフォルトの名無しさん
2009/10/09(金) 09:38:15つ[ディレクトリ記号は/でおながいします]
0533デフォルトの名無しさん
2009/10/09(金) 10:16:01Javaはシングルトンの使い道があるん?
0534デフォルトの名無しさん
2009/10/09(金) 17:31:26int main(array<System::String ^> ^args)
{
int x[] = {1,2,3,4,5};
test(x);
cout << sizeof x << endl;
}
■出力結果
4
20
なんで両方とも20にならないんでしょうか?
0535デフォルトの名無しさん
2009/10/09(金) 17:34:33ここ行って聞け
C++/CLI part3
http://pc12.2ch.net/test/read.cgi/tech/1206447234/
0536デフォルトの名無しさん
2009/10/09(金) 17:37:16ありがとうございます。
0537デフォルトの名無しさん
2009/10/09(金) 17:40:20エラーもしくは警告にならないのそれ
まぁそれは実質的に
void test(int *x)
というプロトタイプと解釈されるから
0538デフォルトの名無しさん
2009/10/09(金) 17:59:43エラーも警告もでません。
これは普通はやらない書き方なんですね。
だいたい理解できました。
test関数内ではポインタx単体の大きさをsizeofで見ていて、main関数内では配列全体をsizeof見ていると。
ということはこの場合、test関数内で20という値を得る処理を書く事はできないのでしょうか?
0539デフォルトの名無しさん
2009/10/09(金) 18:06:48たいてい別の引数で要素数を受け取るようになっている。
悪いことは言わないから、array<T>なりList<T>を使っとけ。
0540デフォルトの名無しさん
2009/10/09(金) 18:10:48C++かC#のどちらか明確にして勉強したほうがよいと思うよ。
0541デフォルトの名無しさん
2009/10/09(金) 18:12:46そうゆうものなんですね。
すっきりしました、ありがとうございます。
素直にコンテナ?を使っておきます。
0542デフォルトの名無しさん
2009/10/09(金) 18:18:39もともとJavaを主に使っていて、C#は多少勉強した程度です。
Javaとは配列の性質が違っていたのでとまどいました。
ご忠告ありがとうございました。
0543デフォルトの名無しさん
2009/10/09(金) 18:28:394.3.5なら「4.3.5」だけとか
0544デフォルトの名無しさん
2009/10/09(金) 18:51:35取れないのか
どうやればいいんだろう
0545デフォルトの名無しさん
2009/10/09(金) 19:12:000546デフォルトの名無しさん
2009/10/09(金) 21:04:03おおサンクス
そしたらこうすればいいのか
printf("%d.%d.%d", ___GNUC___, ___GNUC_MINOR___, __GNUC_PATCHLEVEL__);
0547デフォルトの名無しさん
2009/10/09(金) 21:48:40環境はVisual Studio.net 2003 C++
条件は列(9)の最後尾が○の場合、
後ろから●が見つかるまでの部分を
削除して表示する
***実行前***
○●●○○●●○○
○●●○○●●
↓↓↓↓↓↓↓
***実行結果***
○●●○○●●
○●●
●○○●○○○○○
●○○○○○●○
○●●○
↓↓↓↓↓↓↓
●○○●
●○○○○○●
○●●
0548デフォルトの名無しさん
2009/10/09(金) 21:49:38●○○●○○○○○
●○○○○○●○○
●○○●○○○○○
●○○○○○●○○
●○○●○○○○○
●○○○○○●○○
●○○●○○○○○
●○○○○○●○○
●○○●○○○○○
●○○○○○●○○
●○○○○○●○○
↓↓↓↓↓↓↓
●○○●
●○○○○○●
●○○●
●○○○○○●
●○○●
●○○○○○●
●○○●
●○○○○○●
●○○●
●○○○○○●
●○○○○○●
このような感じで出力したい場合、どういった風に
実装すればいいでしょうか?
以上、よろしくお願いします。
0549デフォルトの名無しさん
2009/10/09(金) 21:59:53#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;
}
0550デフォルトの名無しさん
2009/10/09(金) 22:03:14CStringW s = L"○○●●○○";
s.TrimRight(L'○');
0551デフォルトの名無しさん
2009/10/09(金) 22:28:16○●●○○●●
↓↓↓↓↓↓↓
***実行結果***
○●●
ここがわからん。開始時に末尾が●ならそれは削除?
0552デフォルトの名無しさん
2009/10/09(金) 22:37:51まず、左から右に一回配列を舐めて、最後に出てきた黒の場所思えておいて、2パス目で表示。
もちろん処理を多めに食うけど、確実じゃないかなぁ。
0553デフォルトの名無しさん
2009/10/09(金) 22:43:40サンクス!!
>>550
サンクス!!
>>551
すまん、記述ミス
***実行前***
○●●○○●●○○
○●●○○●●
↓↓↓↓↓↓↓
***実行結果***
○●●○○●●
○●●○○●●
0554デフォルトの名無しさん
2009/10/09(金) 22:44:15ん、そっか。ミスか。
じゃあ回答でおk
0555デフォルトの名無しさん
2009/10/09(金) 22:51:09例えば、
for(int i=0; i<99;i++)
{
bool iMap[99] = getFunc( i );
}
これで○=1,●=0
ってなっていた場合どうする?
つまり、○ならオブジェクトが取得できていて、
●なら何も無い状態。
0556デフォルトの名無しさん
2009/10/09(金) 22:54:20それぐらいは自分で考えてくれ。
0557デフォルトの名無しさん
2009/10/09(金) 23:04:57即興だから間違ってたら申し訳ないが。
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]);
}
っていう感じ。
0558デフォルトの名無しさん
2009/10/09(金) 23:09:14だから2重ループにするか、lastblackを11要素の配列にしないとだめだ
0559デフォルトの名無しさん
2009/10/09(金) 23:28:56>>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パスでいけないこともないかも??
0560デフォルトの名無しさん
2009/10/09(金) 23:40:27Unicodeだとしてもwcsrchrとかあったはずだし
最悪strrchrwがshlapi.hとかにあった気がするが
0561デフォルトの名無しさん
2009/10/09(金) 23:59:46思っていたのとは別物になってしまった。変なこと書いて申し訳ないね。
#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;
}
0562デフォルトの名無しさん
2009/10/10(土) 00:21:05環境は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であるから警告になってもよさそうなものですけど…)
この(くだらない)ミスを再発しないためには、何か良い方法はあるでしょうか?
というつかわれ方をしていたせいで、警告がでませんでした
0563デフォルトの名無しさん
2009/10/10(土) 00:27:48Hoge c; って書いた時点でパラメータなしのコンストラクタで初期化さ
れてるんでは。
0564デフォルトの名無しさん
2009/10/10(土) 00:30:36前者のcはコンストラクタが呼ばれるから初期化されているので警告は出ない。
後者のオブジェクトを作るだけという使い方も十分あるし文法上何の問題もない。
どうしてもというなら、フラグを作って何のメンバ関数も呼ばれずにデストラクタが呼ばれた場合はassertするくらいか。
0565デフォルトの名無しさん
2009/10/10(土) 00:37:36あー、なるほど
Hogeにはコンストラクタを書いていませんが、暗黙のコンストラクタが用意されるんでしたね…
Hogeはコンストラクタのいらない型なのですが、そこでなんとかできないでしょうか?
例えるならVectorデータ型みたいなもので
struct Hoge
{
float x, y, z;
};
相当の品なのです。
こういう構造体を「コンストラクタを無くし」て、「初期化されなかったときの利用で、警告が出るようにする」ためのオプションや修飾子はないでしょうか?
0566デフォルトの名無しさん
2009/10/10(土) 00:56:10Hoge C=式 ?Hoge(0):Hoge(1);
0567デフォルトの名無しさん
2009/10/10(土) 01:01:180568デフォルトの名無しさん
2009/10/10(土) 01:31:28Hoge* c;
if (略) c = new Hoge(0);
else c = new Hoge(1);
scoped_ptr<Hoge> cptr(c);
Honya(cptr.get());
こんな感じにするかなあ。
0569デフォルトの名無しさん
2009/10/10(土) 02:24:28つまり
>>567のいうとおりデフォルトコンストラクタをprivateにして
>>566のいうような宣言と同時に初期化を必須にするしかないと思う
ただ>>566はコンパイラが馬鹿だとコピーコンストラクタが使用されそうだし
俺なら
Hoge C(式 ? 0 : 1);
って書きそう
0570デフォルトの名無しさん
2009/10/10(土) 02:29:22Vectorみたいな使い方と考えると
比較的プリミティブに近くて多く使われそうだし
毎回ヒープにアクセスさせるのは大仰な上に遅くなりそうじゃね?
マルチスレッドだったりしたら毎回排他制御が…
0571デフォルトの名無しさん
2009/10/10(土) 09:30:22期待している動作になりません、間違いを指摘してもらえませんか。
#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 の要素数を取得したいのですが・・・
}
0572デフォルトの名無しさん
2009/10/10(土) 09:36:35真剣な検討ありがとうございます。
ポインタにするのは、ちょっと速度的にきつそうかなと思います。
570さんのおっしゃるとおり、プリミティブに近いものを想定していますので。
デフォルトコンストラクタをprivateにすると、
Hoge c;
とはできませんね。
(その方法で初期化を強要しつつ)初期化で条件式を使うのは確かによさそうですが、条件分岐が3つ以上の場合に無理がありそうですね。
書けなくはないですが・・・。
else Hoge(1);
のところで、「生成したクラスが使われていないようですが?」という警告があれば一番良いのですけどね…。
それを避けるためには、使ってないローカル変数への警告を抑える
(void)a;
と同じように、
(void)Hoge(1);
と書く。とか…。
0573デフォルトの名無しさん
2009/10/10(土) 09:38:34int ArraySize(X* object)
ここで、単なるポインタにしてしまった以上 sizeof(object)では大きさがとれませんよ。
sizeof(配列)で大きさが正しくとれるのは、それが配列宣言されており、コンパイラがサイズを知っているからです。
ポインタと配列は似て非なるもの
0574デフォルトの名無しさん
2009/10/10(土) 09:43:32size_t GetArraySize(T (&)[N])
{
return N;
}
int array[] = {・・・};
cout << GetArraySize(array);
0575デフォルトの名無しさん
2009/10/10(土) 10:06:36>>573
>>574
ありがとうございます。
>ポインタと配列は似て非なるもの
そうですね、短絡的でした。
>>574の
T (&)[N]
この書き方ですが、配列の宣言が、foo[N]このような書き方がしてある配列を参照しているという、ことなのでしょうか?
それから、
return N;
どうしてこれで要素数が取得できてしまうのでしょうか、不思議です?
0576デフォルトの名無しさん
2009/10/10(土) 10:09:41質問がまわりくどいですね
T (&)[N] と T &[N]
この違いを教えて頂けないでしょうか。
0577デフォルトの名無しさん
2009/10/10(土) 10:10:130578デフォルトの名無しさん
2009/10/10(土) 10:13:42あ、そうか!
わかりましたw
T (&)[N] と T &[N]
しかし、この違いがまだ理解できません・・・・orz
0579デフォルトの名無しさん
2009/10/10(土) 10:49:02T [N] => Tの配列
T &[N] => Tへの参照の配列
T (&)[N] => T[N]への参照
となってる模様。ちなみに参照の配列はコンパイルできない
このへんは仮引数名の省略とか括弧の意味とかいろいろあって直感的には理解しにくいわ
0580デフォルトの名無しさん
2009/10/10(土) 11:35:26T &a[N] は先に [ ] と結びついて a[N] つまり a は要素 N 個の配列
その個々の要素の型が T&
T (&a)[N] の場合は括弧で明示してあるために先に & と結びついて &a つまり a は参照
その参照先が要素 N 個の配列
関数の引数名は省略できるので、その場合 T a[N] は T [N] に、T (&a)[N] は T (&)[N] になる
というように俺は理解してる
0581デフォルトの名無しさん
2009/10/10(土) 11:41:45>>580
ありがとうございます、大変よく分かりました。
0582デフォルトの名無しさん
2009/10/10(土) 20:42:52stringみたいに内部で独自のメモリ管理方法を取ってるのか、vectorのようにベタな連続メモリなのか、それともまったく違うのか・・・
0583デフォルトの名無しさん
2009/10/10(土) 21:21:55error 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;
}
0584デフォルトの名無しさん
2009/10/10(土) 21:26:49補足というか、行数の関係で書けませんでした、環境はVS2005 です。
0585デフォルトの名無しさん
2009/10/10(土) 21:31:47解決しましたというか・・・・tohoho情けない
× Point<int>::set(12, 34);
○ Point<int> set(12, 34);
0586デフォルトの名無しさん
2009/10/10(土) 22:04:280587デフォルトの名無しさん
2009/10/10(土) 22:14:26void set(const T& x, const T& y) にする。
0588デフォルトの名無しさん
2009/10/11(日) 06:51:57set という変数を用意したいのか?
メンバ関数のsetを呼び出したいのかはっきりしろ。
0589デフォルトの名無しさん
2009/10/11(日) 13:34:28もしsetという名前のメンバ関数を呼び出したくて、しかもインスタンス
無しで呼び出したいのなら、そのメンバ関数はstaticでなければならない
0590デフォルトの名無しさん
2009/10/11(日) 13:37:55するとエラーになるな
質問者はその当たりをはっきり質問するように
0591デフォルトの名無しさん
2009/10/11(日) 19:02:19皆さん、フォローありがとうございます。今回のset は変数としての振る舞いを期待していました。
0592デフォルトの名無しさん
2009/10/12(月) 01:01:09あるでしょうか。VC++2008独自関数でもかまいません。
strchrに対するmemchrのようにmemmem?なんてのがあればいいんですけど。
0593デフォルトの名無しさん
2009/10/12(月) 02:26:50もし何度もその探索を実行するなら
(\0終端の文字列と違い、長さがわかっているのだから)
BM法かなんかでの探索を自前で実装するのが良いんじゃないかね。
まあ1度しか使わないのなら、そんなことせずに
先頭文字を探してそこから比較する、いわゆる力任せ法でも充分だろうけどね。
0594デフォルトの名無しさん
2009/10/12(月) 02:34:090595デフォルトの名無しさん
2009/10/12(月) 10:05:530596デフォルトの名無しさん
2009/10/12(月) 10:11:550597デフォルトの名無しさん
2009/10/12(月) 11:42:45#include <string>
using namespace std;
int main(void)
{
string s("表示");
int i = s.find('\\');
cout << i << endl;
return 0;
}
これを実行すると、「1」と表示されますが、-1にするには
どうすればよいでしょうか?
0598デフォルトの名無しさん
2009/10/12(月) 11:56:510599デフォルトの名無しさん
2009/10/12(月) 11:58:24string s("ひょうじ");
0600597
2009/10/12(月) 11:59:06http://ml.tietew.jp/cppll/cppll_novice/thread_articles/78
0601デフォルトの名無しさん
2009/10/12(月) 12:45:420602デフォルトの名無しさん
2009/10/12(月) 13:30:11趣味で、VC++のMFCで、いろいろ作っているんですが、もう5年くらいやっていて
だいぶというかかなり本格的なものも作れるようになりました。
自分は文系なんでよく知らないのですが、プログラマに就職しようと思えばできるんでしょうか?
今の職場は単調作業なので、ちょっと刺激がほしいです。よかったら、転職しようとおもうんですが・・・どうでしょうか?
0603デフォルトの名無しさん
2009/10/12(月) 13:35:230604デフォルトの名無しさん
2009/10/12(月) 14:32:08貴方の人生こんな初心者スレで聞いて棒に振ってもいいんですか??
0605デフォルトの名無しさん
2009/10/12(月) 16:44:510606デフォルトの名無しさん
2009/10/12(月) 16:47:56Cと何かちがったっけ??
0607デフォルトの名無しさん
2009/10/12(月) 16:48:10クラスのメンバ関数の関数ポインタは手を出さないほうが身のため。
0608デフォルトの名無しさん
2009/10/12(月) 17:14:100609デフォルトの名無しさん
2009/10/12(月) 17:15:19イライラします
0610デフォルトの名無しさん
2009/10/12(月) 17:19:240611デフォルトの名無しさん
2009/10/12(月) 17:20:500612デフォルトの名無しさん
2009/10/12(月) 17:21:320613デフォルトの名無しさん
2009/10/12(月) 17:23:430614デフォルトの名無しさん
2009/10/12(月) 17:53:400615デフォルトの名無しさん
2009/10/12(月) 19:10:080616デフォルトの名無しさん
2009/10/12(月) 19:17:110617デフォルトの名無しさん
2009/10/12(月) 19:45:280618デフォルトの名無しさん
2009/10/12(月) 19:49:270619デフォルトの名無しさん
2009/10/12(月) 19:57:45どうにもならなくなるしな。
0620デフォルトの名無しさん
2009/10/12(月) 20:13:41ただライブラリを使ってるだけよりいい経験を積んだんだ。
0621デフォルトの名無しさん
2009/10/12(月) 20:27:56・欲しい機能を見つける
・使ってみる
・boostを参照せずに同じ様な機能の縮小版を作ってみる
・挫折する
・boostはどうやってるんだろうと思いながらソースや解説をみて学ぶ
俺は大体こんなかんじで勉強になった functionとか
0622デフォルトの名無しさん
2009/10/12(月) 22:23:13それをSTLで既にあるじゃんとか言って馬鹿にする奴はいないだろ。
0623デフォルトの名無しさん
2009/10/12(月) 22:25:270624デフォルトの名無しさん
2009/10/12(月) 22:32:21Boostにあるからいいかではなかなか重い腰が上がらない。
0625デフォルトの名無しさん
2009/10/12(月) 23:37:360626デフォルトの名無しさん
2009/10/12(月) 23:50:490627デフォルトの名無しさん
2009/10/12(月) 23:57:13staticメンバ関数で、それ専用のクラスを作るのはどうだろう。
気分的にちょっとアレだけど
0628デフォルトの名無しさん
2009/10/13(火) 00:05:07namespace 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が使えない・・・
0629デフォルトの名無しさん
2009/10/13(火) 00:30:430630デフォルトの名無しさん
2009/10/13(火) 01:46:06namespaceだと名前空間を汚す気があれば突破されてしまうが。
0631デフォルトの名無しさん
2009/10/13(火) 04:51:45クラステンプレートfugaの静的メンバ関数にはしたくなさそうだな。
0632デフォルトの名無しさん
2009/10/13(火) 16:34:48教えてください。
0633デフォルトの名無しさん
2009/10/13(火) 16:41:140634デフォルトの名無しさん
2009/10/13(火) 16:52:39ありが�d
0635デフォルトの名無しさん
2009/10/13(火) 16:59:43OSが落ちる(ブルースクリーンや電源断)の直前に
実行中のプログラム内のある情報を
ディスクに書き込むことができますか?
シャットダウンイベントで処理をするのはできるみたいですが
落ちるというイベント?を検出できないでしょうか?
0636デフォルトの名無しさん
2009/10/13(火) 18:05:37プログラミング以前の問題を感じる
0637デフォルトの名無しさん
2009/10/13(火) 18:05:49何も知らないで適当レスするけど
カーネルに何らかのフックができたとしたらブルースクリーンは可能だろうけど
電源ぶちぬきを検出してどうこうはバックアップ電源でもない限り厳しいんじゃないだろうか
0638デフォルトの名無しさん
2009/10/13(火) 18:13:300639デフォルトの名無しさん
2009/10/13(火) 18:18:44って聞いてるようなもんだ
ブルースクリーンもそれができたとして
書き込まれたデータが正しいなんて全く保証できない
0640デフォルトの名無しさん
2009/10/13(火) 18:34:33※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),・・・はどうゆう意味なのでしょうか?
0641デフォルトの名無しさん
2009/10/13(火) 18:40:010642デフォルトの名無しさん
2009/10/13(火) 18:41:42メンバ変数の初期化です〜。
0643デフォルトの名無しさん
2009/10/13(火) 19:05:43だいたい理解できました。
メンバ変数に「参照」を定義した場合、
コンストラクタ初期子によって初期化を行わないと
コンパイルエラーになるんですね。
コンパイルエラーの理由は、「参照」は定義と同時に初期化を行わなければならないから
ってとこでしょうか?
0644デフォルトの名無しさん
2009/10/13(火) 19:23:54あとconst修飾したメンバもここで初期化できる。
0645デフォルトの名無しさん
2009/10/13(火) 19:29:110646デフォルトの名無しさん
2009/10/13(火) 19:43:29勉強になります。
const修飾したメンバの初期化も試してみました。
コストの件は目に見えないのでまだあやふやですが
感覚的にわかりました。
ありがとうございました。
0647デフォルトの名無しさん
2009/10/13(火) 19:59:15参照とconst変数のほかに、
デフォルトコンストラクタを持たない基底クラスにも
初期化指定子による初期化が必須。
0648デフォルトの名無しさん
2009/10/13(火) 20:08:30そういえば数日前にそれでひっかかったことがありました。
どこかのページで、「とりあえずデフォルトコンストラクタは書いといた方がいい」と書いてあったので
その時はデフォルトコンストラクタを書いてごまかしました。
コンパイルが通らなかった時、まるで意味がわからなかったのですが
おそらくあの時も初期化指定子を書いておけば通ったっぽいです。
いろいろと問題が解決できました、ありがとうございます。
0649デフォルトの名無しさん
2009/10/13(火) 20:18:32これがコンパイル通るのはなんで?
int ca[] = {1, 2, 3, 4, 5};
std::tr1::array<int, 5> a(ca);
とやるとエラーが出るから配列を受け取るコンストラクタがあるわけではないようだし・・・
0650デフォルトの名無しさん
2009/10/13(火) 20:44:02struct Array { int member[5]; };
struct Array a = {1, 2, 3, 4, 5};
でコンパイルが通る
コンストラクタ、privateメンバ関数、privateメンバ変数、継承無しでクラスか構造体作ればそれと同じように動く
0651デフォルトの名無しさん
2009/10/13(火) 20:46:33あぁ〜その構文すっかり忘れてました�dです
0652デフォルトの名無しさん
2009/10/13(火) 20:50:50あるヘッダ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を使えるようにするにはどのようにすればいいでしょうか?
0653デフォルトの名無しさん
2009/10/13(火) 21:01:540654デフォルトの名無しさん
2009/10/13(火) 21:41:590655デフォルトの名無しさん
2009/10/13(火) 22:07:290656デフォルトの名無しさん
2009/10/13(火) 22:33:570657デフォルトの名無しさん
2009/10/13(火) 22:36:24これでかぶることはまず無い
これでかぶったらだれかが悪意を持って定義したと考える
0658デフォルトの名無しさん
2009/10/13(火) 22:37:02さらに、インクルードが循環参照になってもコンパイルできなくなるので便利。
0659デフォルトの名無しさん
2009/10/13(火) 22:53:33GCCでも使える。
0660デフォルトの名無しさん
2009/10/13(火) 23:01:180661デフォルトの名無しさん
2009/10/13(火) 23:01:29循環参照してもわからないのがどうもな
0662デフォルトの名無しさん
2009/10/13(火) 23:31:10ありがとうございます
この場合はクラスc定義をインクルードガードかpragmaで囲めばよいのでしょうか?
明日試してみます
0663デフォルトの名無しさん
2009/10/13(火) 23:34:110664デフォルトの名無しさん
2009/10/13(火) 23:45:31std::tr1::array が aggregate だから。
struct や通常の配列でその形式の初期化が通るのと同じ。
0665664
2009/10/13(火) 23:46:420666デフォルトの名無しさん
2009/10/14(水) 01:34:16char s[5];
};
struct Mage{
char s[2];
char c;
};
↑みたいな構造体だとパディングが付かない
その理由は
1.最適化されて、配列と同等の扱い(つまりコンパイラ依存)
2.C言語の仕様として、まとめられる
どっち?
0667デフォルトの名無しさん
2009/10/14(水) 01:38:17コンパイラ依存
0668デフォルトの名無しさん
2009/10/14(水) 01:59:50コンパイラ依存だが、1の「配列と同等の扱い」という理解はおかしい。
そいつらにパディングが付かないのは、 char しか入ってない構造体に
パディングを付ける必要がないから。
構造体のパディングが何のために必要なのか、ググってみるといい。
0669デフォルトの名無しさん
2009/10/14(水) 02:03:020670デフォルトの名無しさん
2009/10/14(水) 02:07:10ども
>>668
バイト領域云々はわかってる
そりゃshortやらdoubleやらいろいろ持ってたらパディングが入るだろうけど、
逆にそいつらを配列として括ることもできないし
「おかしい」という根拠がわからないなぁ
まぁ正しいというつもりもないけど
要はコンパイラ設計者のさじ加減、程度の話じゃないの?
0671デフォルトの名無しさん
2009/10/14(水) 02:08:08もし更新したいのならせったーを(作法的に)
0672デフォルトの名無しさん
2009/10/14(水) 02:12:38いや、インクルードガード側が後ならそうだけど、インクルードガードの
defineのせいで他で条件コンパイルしてる部分で被った場合に気が付き
にくいことにならないだろうか?
インクルードガード用の名前付け規約みたいなのがないとさ。
0673デフォルトの名無しさん
2009/10/14(水) 02:17:06別にshortだけいっぱい持っててもパディングされることはないと思うが。
で、最適化されて配列と同等というからにはsizeof(Mage.s)が3にならないと
困るわけだが、何がどう転んでもそうはなって欲しくないよな?
なので、さじ加減ひとつで配列と同等になることはない。
C言語の仕様としてまとめられるという点についてはもはや何がなにやら。
まず連続領域に取られる保証がされていないよ
0674デフォルトの名無しさん
2009/10/14(水) 02:18:26インクルードガード用のdefineと他のdefineがかぶることを言ってるのかな
それは確かに面倒かもねぇ。
0675デフォルトの名無しさん
2009/10/14(水) 02:21:350676デフォルトの名無しさん
2009/10/14(水) 02:27:36つーか場合によりすぎて、どうするのが常に正しいとかほとんど無いから、ちゃんと
どういうクラス設計なのかを明らかにしないとまともな回答は来ないと思われ
0677デフォルトの名無しさん
2009/10/14(水) 02:31:410678デフォルトの名無しさん
2009/10/14(水) 02:40:35class Teki
{
private:
int hp;
int mp;
public:
void init(void);
void action(void);
}
できるだけ無駄を省きたいとの思いから、上記のクラスを親クラスにして子クラスでaction関数だけオーバーライドすることにして、
子クラスで同じメンバ変数の記述をなくすためにメンバ変数は子クラスからアクセスできるようfriend指定にしてみたんですが
もっといい方法あったらおしえて下さい。
0679デフォルトの名無しさん
2009/10/14(水) 02:44:390680デフォルトの名無しさん
2009/10/14(水) 03:17:59けれど、privateにしておくべきものまでprotectedにするようなことはやめてください。
また、参照しかしないつもりでpublicにするのは、それ自体がバグだといっても過言ではないです。
0681デフォルトの名無しさん
2009/10/14(水) 03:19:49方針としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。
0682デフォルトの名無しさん
2009/10/14(水) 03:24:36何がわかってるって?
http://www.google.co.jp/search?q=%22%E3%83%90%E3%82%A4%E3%83%88%E9%A0%98%E5%9F%9F%22
「配列として括る」も意味がわからんな。
構造体のパディングが何のために必要なのか、ググってみるといい。
必要でないところでパディングなんか入れたら領域が無駄になるんだから、
そんなのをさじ加減で決めるようなコンパイラ設計者は生き残れない。
0683デフォルトの名無しさん
2009/10/14(水) 05:30:04> そいつらにパディングが付かないのは、 char しか入ってない構造体に
> パディングを付ける必要がないから。
この意味が分からんのだが。
0684デフォルトの名無しさん
2009/10/14(水) 06:27:554バイトごと扱うとかそーゆーのだった希ガス
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なの?
0685デフォルトの名無しさん
2009/10/14(水) 06:54:20「バイト境界をまたがないように配置」というのは良いんだが
そもそも、単独で「バイト境界」という言葉はあまり使わない。
「○バイト境界」として、数字を入れて使うのが普通。
しかも、それはシステム全体で一つに決まっているわけではなくて
配置されるデータの型によってそれぞれ決まる。
例えば、「doubleは8バイト境界に配置」「longは4バイト境界に配置」「shortは2バイト境界に配置」
というように。
構造体の場合は、配列にした時に正しくアクセスできるよう
中に含まれるメンバの中でもっとも境界条件の厳しいメンバに合わせられる。
ちなみに、sizeof(short)が2の場合は、大抵は2バイト境界に配置されるため
sample4_tのパディング3は、大抵1になる。
0686デフォルトの名無しさん
2009/10/14(水) 06:59:34メンバの型(特に大きさ)だけではなく
プロセッサのキャッシュラインのサイズも考慮して
そのサイズにアラインメントをあわせようとするものもある。
で、そのへんは、構造体だけでなく
ローカル変数の配置や関数呼び出し時に渡す引数の間隔にもかかわってくる場合がある。
0687デフォルトの名無しさん
2009/10/14(水) 11:29:03void Hoge:: func ()
{
// 何か処理
delete this;
}
0688デフォルトの名無しさん
2009/10/14(水) 11:32:490689687
2009/10/14(水) 11:57:37僕はバグを作らないので問題ないです。
気にせず使いまくることにします。
0690デフォルトの名無しさん
2009/10/14(水) 12:16:51そんな人はいません
0691デフォルトの名無しさん
2009/10/14(水) 15:00:290692デフォルトの名無しさん
2009/10/14(水) 15:30:170693デフォルトの名無しさん
2009/10/14(水) 17:21:18自殺予告かとおもた
0694デフォルトの名無しさん
2009/10/14(水) 17:57:24static const int Hoge = rand();
(本当はrandじゃないんですが、呼び出しごとに戻り値の変わりうる関数です)
ということなんですが、constつき大域変数が初期化されるタイミングは
どのように決まるんでしょうか。
翻訳単位内のいずれかの大域変数が参照されたとき、いっせいに初期化されるのではないか、
と推測しているのですが。
0695デフォルトの名無しさん
2009/10/14(水) 18:14:23なぜ試さない。
アプリケーションプログラムの初期化時。
0696デフォルトの名無しさん
2009/10/14(水) 19:46:300697デフォルトの名無しさん
2009/10/14(水) 19:47:40テンプレートメタプログラミングしかないと思うけど。
0698デフォルトの名無しさん
2009/10/14(水) 19:52:26具体的な方法は?
0699デフォルトの名無しさん
2009/10/14(水) 19:53:28みたいな感じでビルドスクリプトの中で適当なスクリプト使ってコードを生成すりゃいいんじゃね?
0700デフォルトの名無しさん
2009/10/14(水) 20:12:10もっと言ったら、TMPでメルセンヌツイスターを実装するか。やりすぎかw
0701デフォルトの名無しさん
2009/10/14(水) 20:17:280702デフォルトの名無しさん
2009/10/14(水) 20:18:48書いたりもしてるが。
0703デフォルトの名無しさん
2009/10/14(水) 20:20:340704デフォルトの名無しさん
2009/10/14(水) 20:25:110705デフォルトの名無しさん
2009/10/14(水) 21:32:320706デフォルトの名無しさん
2009/10/14(水) 21:38:590707デフォルトの名無しさん
2009/10/14(水) 22:50:46T を(型を)得る関数と理解してますが、あってますか?
0708デフォルトの名無しさん
2009/10/14(水) 22:55:560709デフォルトの名無しさん
2009/10/14(水) 22:56:12std::iterator_traits に関して、ポインタとしてT * の型が分かっている状況ときに
T を(型を)得る関数と理解してますが、あってますか?
0710デフォルトの名無しさん
2009/10/14(水) 22:57:520711デフォルトの名無しさん
2009/10/14(水) 23:10:10俺は Ruby 使ってるけど、この手のスクリプト言語は便利。
C++とかと相補的に使える。
0712デフォルトの名無しさん
2009/10/14(水) 23:17:010713デフォルトの名無しさん
2009/10/14(水) 23:24:58コンパイル時にコード生成に使うだけ?
Luaみたいに実行中に呼び出すの?
0714デフォルトの名無しさん
2009/10/14(水) 23:35:26その人に依るんじゃないかな。俺は複雑な事はしない。
コード生成を含めテキスト処理、特定のルールでファイルの名称を一括して変
えたいとき、ファイル形式を変えたいとき、テスト、簡単なデータ抽出等々。
0715デフォルトの名無しさん
2009/10/14(水) 23:47:37あるのもあるけどね。
0716デフォルトの名無しさん
2009/10/15(木) 00:09:520717デフォルトの名無しさん
2009/10/15(木) 00:15:280718デフォルトの名無しさん
2009/10/15(木) 00:19:48コメントの出現率を計算して、少ないファイルは見直しするとか。
0719デフォルトの名無しさん
2009/10/15(木) 00:23:390720デフォルトの名無しさん
2009/10/15(木) 03:18:39こういう処理をさせたい、と思ってから数十秒で仕事が終わってる感覚は捨てがたい
0721デフォルトの名無しさん
2009/10/15(木) 03:20:11他のスクリプト言語を覚える必要を感じる機会が無かったから覚えてないだけで、
多分同じような利点はみんな持ってると思うし
0722デフォルトの名無しさん
2009/10/15(木) 05:48:27tr1::shared_ptr< Ty > p = new Ty; // NG. explicit なので
vector< tr1::shared_ptr< Ty > > v:
v.push_back( p ); // NG. 同上
なんだけど、他のコンパイラでもいっしょ?
0723デフォルトの名無しさん
2009/10/15(木) 07:10:15少なくとも、tr1の仕様ではexplicitがついてるよ。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf
この辺の問題と関係あるのかもね。
ttp://www.fides.dti.ne.jp/~oka-t/shared_ptr_j.htm
0724デフォルトの名無しさん
2009/10/15(木) 12:09:38GetDC関数とLineTo関数をあわせてウィンドウに線をひいたりはできるようになったのですが
文字を書くことが出来ません。どうすればよいでしょうか?
0725デフォルトの名無しさん
2009/10/15(木) 12:14:22TextOut関数とか、DrawText関数とか
0726デフォルトの名無しさん
2009/10/15(木) 12:54:45ありがとうございます!
0727724
2009/10/15(木) 14:49:49X・Y座標を正の値にしたりしましたがどこにも描画された様子がありません
#include <windows.h>
int main(){
TextOut(
0, // デバイスコンテキストのハンドル
50, // 開始位置(基準点)の x 座標
-100, // 開始位置(基準点)の y 座標
L"testabc", // 文字列
7 // 文字数
);
return 0;}
0728デフォルトの名無しさん
2009/10/15(木) 14:52:50L"testabc"はUnicodeだろ。こう書け:
#include <windows.h>
int main(void) {
HWND hWnd = GetDesktopWindow();
HDC hdc = GetWindowDC(hWnd);
TextOut(hdc, 100, 100, "testabc", 7);
ReleaseDC(hWnd, hdc);
}
0729デフォルトの名無しさん
2009/10/15(木) 14:57:29デバイスコンテキストのハンドルにGetDC の戻りを使わないんだ?
0730デフォルトの名無しさん
2009/10/15(木) 15:14:24TextOut(hdc, 100, 100, TEXT("testabc"), 7);
TextOutA(hdc, 100, 100, "testabc", 7);
TextOutW(hdc, 100, 100, L"testabc", 7);
0731724
2009/10/15(木) 15:21:09先言っておけばよかったです、エラーがでるんです
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さんの方法でできました!ありがとうございました!
0732724
2009/10/15(木) 15:26:23なんでと言われましても、デバイスをディスプレイにするとコードも簡潔にかけて
とりあえずのテストにはいいかな、と思っただけです
0733デフォルトの名無しさん
2009/10/15(木) 15:29:39デバイスコンテキストのハンドル値が 0 (NULL) は
決してディスプレイを指しているわけではないんだが?
0734デフォルトの名無しさん
2009/10/15(木) 15:29:56デバイスコンテキストの0が必ずデスクトップにバインドされてる保障なんてないぞ。
ウインドウズで文字列定数を使いたかったらTRXT("")のマクロを使うんだ。
って>>730がいってたよ。
0735734
2009/10/15(木) 15:30:390736デフォルトの名無しさん
2009/10/15(木) 17:16:46すいませんめっちゃ勘違いしてました。
ご指摘ありがとうございました
0737722
2009/10/15(木) 17:57:31サンクスです。あの後調べてみたらboostもexplicitついてました。
自前で暗黙の変換書いちゃおうかとも思いましたが、危険みたいですね…。
0738デフォルトの名無しさん
2009/10/15(木) 20:26:18ちょっとした思いつきで改造しちゃう奴の気が知れない。
0739デフォルトの名無しさん
2009/10/15(木) 20:27:37しかしまあ、shared_ptrはよく練られてると思うよ。
0741デフォルトの名無しさん
2009/10/15(木) 22:16:39なぜ失敗するのか理由がわかるからね。
0742デフォルトの名無しさん
2009/10/15(木) 22:19:300743デフォルトの名無しさん
2009/10/15(木) 22:29:190744デフォルトの名無しさん
2009/10/15(木) 22:30:01snprintf を使う( c標準 )
stringstream を使う( C++標準 )
lexical_cast を使う( boost )
0745デフォルトの名無しさん
2009/10/15(木) 23:06:380746デフォルトの名無しさん
2009/10/16(金) 01:56:36ttp://www.freeml.com/cppll_novice/1550/latest
0747デフォルトの名無しさん
2009/10/16(金) 02:23:450748デフォルトの名無しさん
2009/10/16(金) 06:51:360749デフォルトの名無しさん
2009/10/16(金) 07:00:460750デフォルトの名無しさん
2009/10/16(金) 08:40:180751デフォルトの名無しさん
2009/10/16(金) 10:22:13Bitmapのコンストラクタに異常なパラメータを渡したんだが例外を吐かないようだ。
メンバにlastResultなんてのがあってそこにInvalidParameterなんてのが入っているようだが、
そいつを見ればいいと言うことでいいのかな。
それとも、何か検証用のメソッドでもあるのかな。
0752デフォルトの名無しさん
2009/10/16(金) 11:05:36cを格納したvectorをnの値によって検索することが多いので、lower_boundなどで
使えるように、int型との比較演算子をオーバーロードすることにしました。
左辺c<右辺intの場合は、cのメンバ関数として定義できましたが、
左辺int<右辺cの場合はメンバ関数としては定義できないのでしょうか?
0753デフォルトの名無しさん
2009/10/16(金) 11:15:25何故それが必要かは判らんが、必要ならfriend関数として実装すればいいと思う。
0754デフォルトの名無しさん
2009/10/16(金) 17:46:24int 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)を出力させたら同じになってしまうので直したいのですが
どうすりゃいいですか?
0755デフォルトの名無しさん
2009/10/16(金) 17:57:18同じになっちまうだろう
0756デフォルトの名無しさん
2009/10/16(金) 18:15:45二回に分ければおk
cout << " Start - " << ctime(&start);
cout << "Finish - " << ctime(&finish)
<< " Time - " << dtime << " sec" << endl;
0757デフォルトの名無しさん
2009/10/16(金) 18:27:16ctime()は(実装によっては)同じバッファを使い回すので、そのような結果になる。
>756の通り一回ずつ出力するか、別のバッファなどにコピーしておかないといけない。
また、同じ理由からスレッドセーフではないのでマルチスレッドアプリでは要注意。
0758デフォルトの名無しさん
2009/10/16(金) 18:32:170759デフォルトの名無しさん
2009/10/16(金) 18:34:05なんの話? まさかとは思うけど>755の恥の上塗り?
0760751
2009/10/16(金) 18:41:00GetLastError()なるメソッドがあるようで、そいつで件のメンバをチェックしてくれるようだ。
これでBitmapのコンストラクタに存在しないファイル名を渡しても極端に大きな幅を渡しても安心w
それにしても、gdiplusってインターフェースがよくないなぁ、内部でnewしたポインタ寄越すとか。
0761デフォルトの名無しさん
2009/10/16(金) 18:45:03#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;
}
あれあれ?どうしてって感じ
0762デフォルトの名無しさん
2009/10/16(金) 18:53:12gdiplusは全然しらないけど、GetLastErrorメソッドはよく見るのでほっとした
0763751
2009/10/16(金) 18:58:11WinAPIのGetLastError()に引き摺られて途中から無意識に書き間違えていたらしい。
0764デフォルトの名無しさん
2009/10/16(金) 20:22:06main関数でnewをつかって描画処理のクラスのインスタンスを生成して
プログラムを終了するときに
インスタンスをdeleteで解放するして
そのときにデストラクタを呼び出したいのですが
exit関数をつかったらデストラクタを呼び出せずにプログラムが終了してしまうので
どうすりゃいいのかわかりません
どのようにすればよいのでしょうか?
0765デフォルトの名無しさん
2009/10/16(金) 20:26:18exit関数を使わない。
0766デフォルトの名無しさん
2009/10/16(金) 20:26:270767デフォルトの名無しさん
2009/10/16(金) 20:48:48横着せずに順々にreturnして関数を抜けてmainからreturnすればいい。
0768デフォルトの名無しさん
2009/10/16(金) 21:39:070769デフォルトの名無しさん
2009/10/16(金) 22:03:590770デフォルトの名無しさん
2009/10/17(土) 00:34:05bool BeginScene() { return SUCCEEDED(Device->BeginScene()); }
bool型の変数を宣言しているとは思うのですが、変数名が見当たらない
というかreturnがへんなところにあるし・・・
おねがいします。
0771デフォルトの名無しさん
2009/10/17(土) 00:45:53{
return SUCCEEDED(Device->BeginScene());
}
0772デフォルトの名無しさん
2009/10/17(土) 01:10:04それは関数定義だよ^^
良くわからないときはひとつひとつ、丁寧に構文解析をしてみよう★
0773デフォルトの名無しさん
2009/10/17(土) 02:25:59{
bool bRet = SUCCEEDED(Device->BeginScene());
return bRet;
}
0774デフォルトの名無しさん
2009/10/17(土) 07:07:53自分はいちいち階層ごとにreturnするのが面倒なので、自作の終了例外クラスを
作成して例外でやってる。mainでその例外を補足し、必要な処理をやった後は
returnするだけ。
0775デフォルトの名無しさん
2009/10/17(土) 16:13:460776デフォルトの名無しさん
2009/10/17(土) 17:07:04「そうだね、寝ようか」っていうと「マダネチャダメダヨ」と返事をするのがかわいいです
0777デフォルトの名無しさん
2009/10/17(土) 17:07:44スルーしてください><
0778デフォルトの名無しさん
2009/10/17(土) 17:42:35なぜ? 例外はそういうときに使用するべきでないという意見以外なら聞きたい。
main以外でプログラムを終了させるのなら、それは例外として扱っても構わないのではと
思ってる。
基本的に、例外は異常系の処理を正常系の処理から分離するのがその一番の目的だと思ってるが、
深い階層からいちいちreturnで戻るのは例外の思想から外れてると思うんだが。
0779デフォルトの名無しさん
2009/10/17(土) 17:43:12}
こういったテンプレートの使い方をしているコードがあるんですが意味がよくわかりません。
template <class type> class class-name {
といった使い方をするとおもったんですが・・・・
0780デフォルトの名無しさん
2009/10/17(土) 17:43:22玖符「東方シリーズ総合スレッド 6083/6083」 [ゲームサロン]
衣符「東方シリーズ総合スレッド 6082/6082」 [ゲームサロン]
0781デフォルトの名無しさん
2009/10/17(土) 17:45:11テンプレートの引数には型だけでなく値も入れてもよい。
template<size_t Size> class Array { ...
みたいな、サイズ固定の配列をテンプレートで作るときなどに使う。
0782デフォルトの名無しさん
2009/10/17(土) 17:47:10template <int N>
struct hoge
{
int a[N];
};
とか色々つかえる
0783デフォルトの名無しさん
2009/10/17(土) 18:04:49template<int hoge> class Fuga{
public:
Fuga(const float ak[]) : am(ak)
{
}
これはどういうことですか?コンストラクタだと思うんですが:の意味が・・・
}
0784デフォルトの名無しさん
2009/10/17(土) 18:06:26775 じゃないけど、プログラムを終了させることが異常系だとは限らないわけで、
正常な処理として終了させるときに例外を使うのは例外の本来の用途から外れる
からでしょ。
例えば例外発生時にだけ必要なコードは実際に例外が発生するまでメモリ上に
ロードしないような最適化も考えられるわけで、そんな環境では変に終了がもたつく
ような結果を招くことになる。
0785デフォルトの名無しさん
2009/10/17(土) 18:09:020786デフォルトの名無しさん
2009/10/17(土) 18:12:150787デフォルトの名無しさん
2009/10/17(土) 18:16:150788デフォルトの名無しさん
2009/10/17(土) 18:17:21error 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;
}
0789デフォルトの名無しさん
2009/10/17(土) 18:20:540790デフォルトの名無しさん
2009/10/17(土) 18:26:20779で
>なぜ? 例外はそういうときに使用するべきでないという意見以外なら聞きたい。
と書いてるが、まあ、いい。
例外の実装は基本的にlongjmp的なものでされていると認識しているが、それで
パフォーマンスが大きく落ちるとは思えないんだが。
0791デフォルトの名無しさん
2009/10/17(土) 18:27:10足りないか? 足りないとすればどのあたり?
0792デフォルトの名無しさん
2009/10/17(土) 18:30:24× //*out = *far;
○ //*out = far;
ここですが修正します。
0793デフォルトの名無しさん
2009/10/17(土) 18:30:25イマイチよくわかりません。コロン:ひとつでいいんですか
0794デフォルトの名無しさん
2009/10/17(土) 18:31:45VC8だと警告一個(distanceの戻りが)で通ったな。
コンパイルに邪魔だから全角スペースに変えてまでインデントを気にする必要ないよ。
0795デフォルトの名無しさん
2009/10/17(土) 18:32:280796デフォルトの名無しさん
2009/10/17(土) 18:33:33ヽ_ く____ゝ'、 /
ヽヽ、 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::::::::::::::::::::::::::::::::::::`'ー' ・゜
` ̄
0797デフォルトの名無しさん
2009/10/17(土) 18:34:080798デフォルトの名無しさん
2009/10/17(土) 18:44:47別にあんたを説得しようとしてるわけじゃないし、する気もない。
初心者が考えなしに真似しちゃダメ、おすすめできない、ってことが言いたいだけだよ。
例外処理のパフォーマンスについては↓を見ておいたほうがいい。
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 で挙げたような話が出てくる。
0799デフォルトの名無しさん
2009/10/17(土) 18:48:26longjumpではデストラクタが呼ばれないでしょう。
デストラクタを呼ぶからくりを考えただけでも、例外の構造の複雑さを暗示している。
0800デフォルトの名無しさん
2009/10/17(土) 18:49:42それでいて、例外を投げないときのオーバーヘッドはほぼ無いんだから想像を絶する。
0801デフォルトの名無しさん
2009/10/17(土) 18:51:44わざわざ資料リンク感謝。あなたの意図は掴めた。
最近の情報に通じてなくて、お恥ずかしいばかりだ。
0802デフォルトの名無しさん
2009/10/17(土) 18:52:07基本的に大域ジャンプする目的で使うのは用途違いだと思うよ。
個人的な解釈だと、これ以上実行すると何らかの不利益がでるからやめよう。っていう実装だと思うのよね。
例外なしでもプログラムは組めるし、そんな大域ジャンプするような変なフローだと追跡大変じゃないかい?
0803デフォルトの名無しさん
2009/10/17(土) 18:52:49例外の実装の話をしているのであって、longjmpを使うという話をしているのではないんだが……。
0804デフォルトの名無しさん
2009/10/17(土) 18:55:46まあ、そうなんだが、main以外で終了したいときもあるし、パフォーマンスに
重大な影響を及ぼすわけではないのなら、さっさと楽な書き方をしたいときもある。
でなければ、exitが存在する理由がなくなる。
exitを使いたいとき、exitでは呼ばれるべきデストラクタが呼ばれないため、
例外を使うと便利という話。
0805デフォルトの名無しさん
2009/10/17(土) 18:57:230806デフォルトの名無しさん
2009/10/17(土) 18:58:50否定はしないが、人には勧められない方法ではある。
0807デフォルトの名無しさん
2009/10/17(土) 18:59:01ニュアンスはちょっと違うけどね。exitではデストラクタが呼ばれないのが痛い。
exit使いたくても使えない、でも、exit的なことをしたい、だから、例外。みたいな。
0808デフォルトの名無しさん
2009/10/17(土) 19:00:37catch(...) があって不可解な結果に悩まされたりするとか。
0809デフォルトの名無しさん
2009/10/17(土) 19:01:29exitの代わりに例外使用している側だが、逆に否定しない理由が知りたい。
こうやってわざわざ書いてるのは、真っ当な批判を受けたいからというのもある。
0810デフォルトの名無しさん
2009/10/17(土) 19:02:31exitの代わりに例外使用している側だが、それはあるかもね。
0811デフォルトの名無しさん
2009/10/17(土) 19:03:45ありがとうございます。
>>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));
ですよね、これも同じ結果なんですよ、というかこれを貼ったつもりだったのですが
混乱してました。
0812デフォルトの名無しさん
2009/10/17(土) 19:04:00お前の生きてきた成果がコレw?
もうやめちゃえよ
プログラムなんてこの先組めるようになんてならないからw
多分、生まれとか育ちとか悪かったんだろw
0813デフォルトの名無しさん
2009/10/17(土) 19:04:53exitはデストラクタが呼ばれないことを知っていて、リスクを承知して使うなら止めないけど。
他人に勧める手法ではないなと思うよ。
0814802
2009/10/17(土) 19:05:02俺exit関数はほとんど使ったことないな。特にC++に移行してからはまったく。
Cにしたって、結局さかのぼってメモリを開放しないと後遺症のこすから、はじめからexit関数は無いもんだとおもってる。
ネストの深いプログラム書くとほしくなるのは理解できるけどね。
0815デフォルトの名無しさん
2009/10/17(土) 19:07:24すまん、読み返したらぜんぜん違うこと言ってた。
0816デフォルトの名無しさん
2009/10/17(土) 19:09:35了解。
>>814
まあ、おっしゃるとおり。自分もコンソールアプリケーションを書いていて、
--helpオプションを指定されたとき、ヘルプ画面を表示して終了とか、
そんなちゃちなときにしか使ってないんだけどね。
0817デフォルトの名無しさん
2009/10/17(土) 19:10:340818デフォルトの名無しさん
2009/10/17(土) 19:10:53と言うと?
0819デフォルトの名無しさん
2009/10/17(土) 19:12:54そだね。そうは言っても、戻り値チェックで異常系の処理をやっていたら、
コードの大半が異常系になっちゃうし、リソースリークさせないための処理も
書くとえらいことになる。
0820デフォルトの名無しさん
2009/10/17(土) 19:16:40というか、それにしか例外使ってない。
0821デフォルトの名無しさん
2009/10/17(土) 19:19:24それはエラー値returnしてるのにチェックしてない箇所が途中にあっても一緒では
0822802
2009/10/17(土) 19:20:44俺基本的にメモリ確保するの大嫌いだから、スタックですむならそうしてるんだよな。
機能別にクラス設計して、その機能を集約するクラスを設計して、画面表示が必要なら、その集約クラス用の表示クラス書いて。
ってだんどりだなぁ。
機能には初期化、主要処理、破棄。を明確にして、無限ループは基本的に作らない。for文大好き!
そんな感じで停止性を確保していけば、なかなか途中で終わらせようとは思わなくなった。どこかで止まるからね。
0823デフォルトの名無しさん
2009/10/17(土) 19:20:59だれも例外とエラー値の違いなんて話してないよ。
0824デフォルトの名無しさん
2009/10/17(土) 19:23:29try {
engine.run();
} catch(/* ry */) { ... }
ループの内部でisQuit();とか馬鹿らしいですからね
0825デフォルトの名無しさん
2009/10/17(土) 19:24:02例外はお奨めできない。
となるとじゃあ変わりに何を使えばいいか?となったら、エラー値じゃないの?
0826デフォルトの名無しさん
2009/10/17(土) 19:25:430827デフォルトの名無しさん
2009/10/17(土) 19:28:44APIが失敗したときはときはどうしよう→とりあえず例外に旨を添えて投げときゃいいじゃん
みたいな具合で
0828デフォルトの名無しさん
2009/10/17(土) 19:32:26その後の774とか778でreturnと比べてないかね
0829デフォルトの名無しさん
2009/10/17(土) 19:34:52システムコールやライブラリコールでの戻り値を全部チェックしてる?
自分はprintfレベルでも全部チェックしてるんだけど、そんな状況で例外を
使わないとまじ死ねるんだが、どう?
0830デフォルトの名無しさん
2009/10/17(土) 19:37:290831デフォルトの名無しさん
2009/10/17(土) 19:41:37http://lmgtfy.com/?q=member+initialization+list+C%2B%2B
0832デフォルトの名無しさん
2009/10/17(土) 19:41:410833デフォルトの名無しさん
2009/10/17(土) 19:44:030834デフォルトの名無しさん
2009/10/17(土) 19:45:100835デフォルトの名無しさん
2009/10/17(土) 19:46:01なんかすげーなそれ
0836デフォルトの名無しさん
2009/10/17(土) 19:47:14関数でラップして、ブーリアンにできるやつはなるべくそうする。これだけで半分はなくなると思う。
エラーチェックはできるだけ関数の頭でifの羅列で切って抜けてきた処理をこなすって感じだな。
もちろん抜けがあればそこで引っかからないこともあるけど、デバッグと簡易ユニットテストで取るようにはしてる。
0837デフォルトの名無しさん
2009/10/17(土) 19:53:43なるほど。
自分はソースの読みやすさや整合性、一貫性を重視してて、失敗しない関数
(つまりエラーの戻り値を返さない)を書いて、値を求める関数以外はvoid型にして、
例外を多用してるわ。まあ、ここらへんは設計思想の違いかなと。
0838デフォルトの名無しさん
2009/10/17(土) 19:56:46使ってたらエラー値が返ってくることないと思うのよ。だから、そんなののために
毎回異常系の処理を書くのはちょっと無駄かなと思うのよね。
0839デフォルトの名無しさん
2009/10/17(土) 19:59:46テンプレート引数の明示要らない。
0840デフォルトの名無しさん
2009/10/17(土) 20:12:01ありがとうございます。
結果は得られましたが、疑問が残ります。
なぜ、template 引数を明示したらエラーになるのでしょうか?
0841デフォルトの名無しさん
2009/10/17(土) 20:12:10エラー回復が必要な処理はチェックは条件がそろったら速攻でしてなるべく必要ないように使うかな??
0842デフォルトの名無しさん
2009/10/17(土) 20:19:25概ね理解できるけど、C++には例外があって、例外が実際よく使われているのに、
そこまでこだわるのは、ちょっと損してるかもね。そりゃ、例外使うと
パフォーマンスが仕様に満たないとかなら分かるけど。
0843デフォルトの名無しさん
2009/10/17(土) 20:29:31#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;
}}}}
0844デフォルトの名無しさん
2009/10/17(土) 20:30:40テンプレート引数に指定された型が間違ってるから
std::back_inserter(lhs)の戻り値の型がstd::vector<unsigned int>じゃない
0845デフォルトの名無しさん
2009/10/17(土) 20:35:00それもそうだねぇ。検討してみるよ。
それじゃ、引っ込む。
0846843
2009/10/17(土) 20:35:30やっぱfindはoptionalで返してくれるべきだ
0847デフォルトの名無しさん
2009/10/17(土) 20:41:37たとえばfactoryパターンを使うとして、そこでcreateされる実装はしばしば隠蔽されていることがある
でも、どんな例外が来るのか、仕様変更に伴う例外の増減っていうのは実装に依存する
結局のところ、クライアントは実装のソースかドキュメントを読んでそれにあわせてコーディングするしかない
これじゃあインターフェースと実装の分離をした意味がうすれてしまう(コンパイル時間短縮の効果はあるが)
すべてをあきらめてcatch(...)にすることもできるけど回復可能なエラーを見落としてしまうかもしれない
0848デフォルトの名無しさん
2009/10/17(土) 20:41:47まあ、こっちも言い過ぎたかも。ではね。
0849デフォルトの名無しさん
2009/10/17(土) 20:42:48数えるのも嫌になるほどあるAPIも使用してる分は全部ラップするのか?
それこそ時間の無駄だろ。
0850デフォルトの名無しさん
2009/10/17(土) 20:44:14それはよく分かる。だが、C++の例外仕様は糞なので、ドキュメントを精査するしか
ないかもね。(つか、例外がなくても、ドキュメントはしっかり読んで当然ではあるが)
逆に、投げうる例外をドキュメントに書いてないライブラリはちょっと使いづらいね。
0851デフォルトの名無しさん
2009/10/17(土) 20:56:16その問題を例外以外なら解決できるのか?
問題なのはインターフェースの向こう側にある無数のエラーをどう扱うか、
ということであって、エラーの報告方法として例外を使うかそれ以外を使うか
という点は別の話じゃないのか?
0852デフォルトの名無しさん
2009/10/17(土) 22:25:030853デフォルトの名無しさん
2009/10/18(日) 01:03:42しなきゃならないのは一緒だよね。
個人的にはエラーコードのほうが好きだけど、例外の大域ジャンプ能力は確かに
便利だし、わかってて使うぶんにはどっちでも構わないと思うけどなあ。
0854デフォルトの名無しさん
2009/10/18(日) 01:42:07例外を使ってmainまで脱出するせいでアプリの終了がもっさり、なんてアホなことは
さすがに無い
まぁ、やたらとデストラクタが重いクラスとかあったら別だが
0855デフォルトの名無しさん
2009/10/18(日) 06:17:59そのビットのフラグをランダムに発生させる処理がわかりません。
例えば8ビット中に、3本から6本のフラグをランダムに発生させるにはどうしたらよいでしょうか。
0856デフォルトの名無しさん
2009/10/18(日) 07:03:41その回数だけ0〜7の乱数を発生させてそこのビットを立てる
0857デフォルトの名無しさん
2009/10/18(日) 07:10:00ありがとうございます。
でも、それだと偏っちゃいませんか?
処理としてすっきりするんで作ってはみたのですが
0858デフォルトの名無しさん
2009/10/18(日) 07:28:30256通りも無いんでテーブル作っておいてその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)];
0859デフォルトの名無しさん
2009/10/18(日) 08:10:49ありがとうございます。
時間掛かったでしょうに…
一先ず、858さんの方法でやってみます。
汎用性がないのが問題ですね。
0860デフォルトの名無しさん
2009/10/18(日) 10:16:23以前シミュレーションのコード書いたとき例外入れると入れない(if で脱出)
で実行速度測ったら結構違った覚えがあるけど、今のコンパイラは違うのかな。
また機会があったら測ってみるか。
0861デフォルトの名無しさん
2009/10/18(日) 10:43:32わざわざこんな単純なテーブルを手書きはしない
はず
0862デフォルトの名無しさん
2009/10/18(日) 10:46:45汎用性を求めるなら、固定のテーブルを持たず、テーブルを作る処理を関数化すればいい。
0863デフォルトの名無しさん
2009/10/18(日) 10:50:58class を使った Circular doubly Link List というものを作っているのですが、最初と最後のノードの接続がうまくできません。
どこか完成品置いてあるサイト知ってる方いませんか?
0864デフォルトの名無しさん
2009/10/18(日) 10:51:03#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;
}
0865デフォルトの名無しさん
2009/10/18(日) 10:53:09ということで文字列でのメッセージング機能を備えたretryable/fatalの二つの例外基本クラスとその派生クラスを作る
キャッチするほうでは仕様がわかってるなら細かく派生をチェック、仕様がわからなかったりめんどくさかったらリトライするか終了するかだけチェック
これで十分だと思うんだがどうか?
0866デフォルトの名無しさん
2009/10/18(日) 10:53:26手書きだったらすげーよ
0867デフォルトの名無しさん
2009/10/18(日) 11:03:343bit が 1 なのと 6bit が 1 なのが同じ確率で出る
実際の組み合わせ数はコレ
8C3 56
8C4 70
8C5 56
8C6 28
0868デフォルトの名無しさん
2009/10/18(日) 11:03:59増えたらどうするんだろうね
0869デフォルトの名無しさん
2009/10/18(日) 11:10:33まだテンプレにそって既存コード晒した方が返答されやすいと思うよ。
0870デフォルトの名無しさん
2009/10/18(日) 11:46:07どれがデファクトスタンダーとなんでしょ?
m_hogeName
mHogeName
hogeName_
hogeName
0871デフォルトの名無しさん
2009/10/18(日) 11:49:02集団だったらその集団で決めればいい
0872デフォルトの名無しさん
2009/10/18(日) 12:34:13mainへの抜けだしなんて一回すぽんと走るだけのコードだろ
何万回と回せばそりゃ速度は変わるっつーか、80:20の法則とかもしかして知らない人?
0873デフォルトの名無しさん
2009/10/18(日) 12:34:58僕は一番下ちゃん!
0874デフォルトの名無しさん
2009/10/18(日) 12:42:51ノードの接続は問題ないと思うのですが、わからないエラーがでます。
ろだ > 雑多なファイルをアップする場所 > 9985.zip
にファイル上げましたので時間がありましたら見てみてください。
0875デフォルトの名無しさん
2009/10/18(日) 12:49:16データメンバ名やgetterなど、どんどん名前が被ってくるから、切りないよね。
被ったら、語尾に_を付けていくというやりかたにしてるな。被らないかぎりシンプルに。
class hoge {
...
};
class fuga {
public:
fuga(hoge hoge__) : hoge_(hoge__) { ... }
hoge get_hoge() const { ... }
...
private:
hoge hoge_;
};
みたいな。
0876デフォルトの名無しさん
2009/10/18(日) 12:52:13例外処理が重くないとは一般論としては言えないということでは。
0877デフォルトの名無しさん
2009/10/18(日) 12:52:250878デフォルトの名無しさん
2009/10/18(日) 12:56:03意外と回ってるわ。
0879デフォルトの名無しさん
2009/10/18(日) 12:59:50仕事で強制されるのは勘弁してほしいけどw
0880デフォルトの名無しさん
2009/10/18(日) 13:04:08意味付けはない。出た順。
俺も最初はメンバはm_とか引数はthe_とか(本に書いてあった)やってたけど、
切りないんで、シンプルに_追加だけにしたんだわ。それ以来楽になった。
コンパイラが区別できればいいし、どうも自分もコンパイラみたいなところが
あるのか、_の数だけで普通に区別が付いてる。そうでない人が多いのなら、
それはおすすめできないんだろうな、たぶん。
0881デフォルトの名無しさん
2009/10/18(日) 13:07:31メンバはよく使うくせにローカル変数に埋もれがちなんで。
コンパイルの段でどうせthis->hoge_的処理をやってるので、
パフォーマンスも問題ない。
the_other.hoge_とかthat->hoge_など、文芸的にもなるんで、ソースが
読みやすくなる。(the_other.m_hogeやthat->m_hogeなどよりも)
0882デフォルトの名無しさん
2009/10/18(日) 13:08:260883デフォルトの名無しさん
2009/10/18(日) 13:17:10それは前だね。
0884デフォルトの名無しさん
2009/10/18(日) 13:19:31コピーの時の最後の要素のポインタ繋ぎを忘れてる。
0885デフォルトの名無しさん
2009/10/18(日) 13:46:40ありがとうございます。
コピー時の修正しました + そこを文章化して読ませなくしました。
Unhandled exception at 0x63ef31ea (msvcr90d.dll) in NewLinkList.exe: 0xC0000005: Access violation reading location 0xfeeefee2.
こんな感じのメッセージがでます。
ろだ > 雑多なファイルをアップする場所 > 9987.zip
よろしくおねがいします。
0886デフォルトの名無しさん
2009/10/18(日) 14:00:20メンバー変数は _ 最後につけてるな。あまり美しくないけど、
被った場合のみには、みたいな条件付けるとわけわからん。
たまに先頭に _ 付ける人いるけど、それは危険に感じる。
一旦ルール決めたらプロジェクトではそれにしたがう感じだけど、
いまいちしっくりくるルールが無い。
0887デフォルトの名無しさん
2009/10/18(日) 14:29:38List::insertInOrder()の中でwhileループが1度も回らないとどうなる?
0888デフォルトの名無しさん
2009/10/18(日) 14:59:29mainへの抜け出しに例外を使う、って話に「アプリが重くなるかも」なんてトンチキ
なこと言う奴がいるから「そこまで重い訳がない」って話だろ
そこに、何万回も回してベンチ取ったような話を持ってくるのも明らかにトンチキ
0889デフォルトの名無しさん
2009/10/18(日) 15:40:11大抵のルールはそれぞれが正しさを持っているから、参加してるメンバーの
大半が納得していればOKだし、納得していなければ、改善すればいいと思う。
_の件だけど、コントラクトのためにローカルクラスを作ったりしてると、
メンバ名でも被るのが当然になるんで、警告メッセージがえらいことになる。
そのため、_を追加していくことにした。
0890デフォルトの名無しさん
2009/10/18(日) 15:53:19ローカルクラスって使ってるコード見たこと無いんだけど具体的にどうやってつかってるの?
0891デフォルトの名無しさん
2009/10/18(日) 16:10:49コントラクトプログラミングで、コンストラクタとデストラクタの機構を利用する。
ストロウストロップのプログラミング言語C++でも言及されてる。
ttp://codepad.org/s2MOqJOF
0892デフォルトの名無しさん
2009/10/18(日) 16:23:16ありがとうございます。
直してたら何してるのかわからなくなったのでそれ注意しながらやってみます。
0893デフォルトの名無しさん
2009/10/18(日) 16:40:07うーむ
これって関数の最初と最後に普通にis_valid関数を呼び出すだけじゃダメなのかな?
いまいちローカルクラスにする利点が見えないんだけど・・・
0894デフォルトの名無しさん
2009/10/18(日) 17:28:26これはgetter、setterだから一方向だけだけど、引数も戻り値もある関数だと、
関数の処理が始まる前に必ず事前条件が、関数の処理が終わった後に必ず
事後条件が評価されなければならないわけだけど、それを実現するには
コンストラクタ、デストラクタを用いるのが一番手っ取り早い。
コンストラクタを使うのは、引数または戻り値があるとき、関数の頭は
必ずローカルクラスと体で覚えるので、見落としが減る。
returnする箇所が複数あるときは事後条件を集約できて、コードが
見やすくなるし、心配も減る。
C++に事前条件、事後条件を付け加えるべきだみたいな意見が出たとき、
ローカルクラスで代用できるから、今んとこ必要ないということになった、
という経緯もあるんで、それを使ってる。
まあ、そこまで気にしなくてもいい程度の話だけど、あればデバッグは
格段に楽になることはうけあい。
0895デフォルトの名無しさん
2009/10/18(日) 17:49:44何度もすいません。
List::deleteList()が元凶だったみたいです。
みなさまありがとうございました。
0896デフォルトの名無しさん
2009/10/18(日) 17:51:32アンダースコアふたつ連続は、どこに現れても予約識別子になっちゃうよ。
0897デフォルトの名無しさん
2009/10/18(日) 18:07:25>>794 や >>798 のリンク先にある文書は読んで言ってるの?
「極端な場合、頻度の低い例外に最適化したシステムでは最初の例外スローが
ディスクアクセスを起こすかもしれない」と書いてある。
それを否定できるほどの根拠があるの?
実際に "cold" セクションと呼ばれる領域を正常系のコードから分離してまとめる
ようなコンパイラ〜リンカも存在するんで、そんなに非現実的な話じゃないと思うし、
実際に例外を使っててそういう動作をされても、まぁ文句は言えないかと思う。
0898デフォルトの名無しさん
2009/10/18(日) 18:30:41みたいね。やれやれ。別の方法で命名しないといけなくなったk
というわけで、皆さん、ごめんなさい。名前の後に_を追加していくという
命名法は使えませんので、ご注意を。
0899デフォルトの名無しさん
2009/10/18(日) 20:13:15ほとんどの場合、privateだから使うとしてもメンバ関数くらいだし
0900デフォルトの名無しさん
2009/10/18(日) 20:23:440901デフォルトの名無しさん
2009/10/18(日) 20:24:510902デフォルトの名無しさん
2009/10/18(日) 20:26:02typedef名はfuga_typeあるいはfuga_t
引数・ローカルはhoge_hoge
面罵はhoge_hoge_あるいはhoge_hogeですべてthisを使う
メソッドはhoge_hoge
いまのところこれで困ったことはない
タイプ命と変数名が同じになることもあるけどタイプの場合大抵は名前空間があるし、無くても文脈でわかる、最終手段でclass hoge hと明示化もできる
0903デフォルトの名無しさん
2009/10/18(日) 20:31:51メンバ変数が多いと一面thisの荒しになりそうだな。
0904デフォルトの名無しさん
2009/10/18(日) 20:39:56友愛されます
0905デフォルトの名無しさん
2009/10/18(日) 20:50:19完璧ですね。
数学をちゃんと理解してないことを実感しましたよまったく
ありがとうございました。
0906デフォルトの名無しさん
2009/10/18(日) 21:04:20vc++とか使ってると、参照先のメンバ一覧がでてくるよね
そのときにm_で統一してると、少し面倒が増える
だから最後にアンダーバー
関数はcheckHit
メンバ変数はNumber_
ローカル変数はNumber
定数はFIXED_NUMBER
みたくやってるけど、クラス名とローカル変数がかぶるときがあるから難点
0907デフォルトの名無しさん
2009/10/18(日) 21:22:04省略スンナボケとか周りに言われると困るけど
0908デフォルトの名無しさん
2009/10/18(日) 21:31:10メンバー変数 mNumber
ローカル変数 rNumber
グローバル変数 sNumber
const定数 cNumber
関数 checkHit
クラス Hoge
0909デフォルトの名無しさん
2009/10/18(日) 21:45:572〜10行程度の短いスコープを持つものはバッサリ省略、と使い分けてるな。
でもさあ、変数名はフルスペルで!って言っても、
まさかminimumとかmaximumとかいちいち書かないよな。
Cの標準関数名にある省略形なら使ってもOK、って規約を見たことがあるけど。
0910デフォルトの名無しさん
2009/10/18(日) 21:56:01長ったらしい名前で画面が見辛くなるだけな気がする
0911デフォルトの名無しさん
2009/10/18(日) 22:02:040912デフォルトの名無しさん
2009/10/18(日) 22:06:310913デフォルトの名無しさん
2009/10/18(日) 22:08:060914デフォルトの名無しさん
2009/10/18(日) 22:12:02俺はクラス名は大文字で始めて、メンバ変数、関数は小文字で始めるな。
だからクラス名と変数が被る事は無い。定数は全て大文字は同じ。
0915デフォルトの名無しさん
2009/10/18(日) 22:48:39もともとの数学からしてt,x,y,z,s,t,u,v,h,i,j,kとか名前なんて無かった状態だし
0917デフォルトの名無しさん
2009/10/19(月) 01:16:10コーディングする前に式があるわけで、その式にできるだけ近づける。
v でも式だと v1, vx, とか v_1, v_x, とかあるわけだし。
名前に悩むことはあるが、数値計算系でなくても悩むからね。
0918デフォルトの名無しさん
2009/10/19(月) 01:50:38方法を知りたいです。例えば、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なんてメンバはないので、コンパイルできません。
何かうまい方法はないものでしょうか。
0919デフォルトの名無しさん
2009/10/19(月) 01:55:08std::find_if(v.begin(), v.end(), ((&boost::lambda::_1)->*(&HOGE::a) == 10));
これじゃ「うまい」とは言えないかもね。
0920デフォルトの名無しさん
2009/10/19(月) 10:15:08error: expected unqualified-id before ‘||’ token
というコンパイルエラーが出ます。
多分どこかの誰かが"or"を'||'に定義していると思うのですが、
誰がいつdefineしているかを調べるにはどうすればいいのでしょうか?
0921デフォルトの名無しさん
2009/10/19(月) 10:29:050922デフォルトの名無しさん
2009/10/19(月) 10:45:330923デフォルトの名無しさん
2009/10/19(月) 10:47:39class Object {...};
class MyObject: public Object {...};
みたいな宣言があるときに
void print(Object *o) { printf("%p", o); }
void myfunc() {
MyObject *mo = new MyObject();
print(mo);
}
とやったときにプリントされるアドレスと mo が一致しません。
printで引数を受け取った時点で、moよりも4バイト後ろに下がっています。
なにか心当たりはありませんか??
0924デフォルトの名無しさん
2009/10/19(月) 10:55:29Objectに仮想関数がなく、MyObjectに仮想関数がある
仮想関数のディスパッチを処理するために、俗に vtbl とか vtable とか言われるものが先頭に追加される
0925デフォルトの名無しさん
2009/10/19(月) 11:02:00void print_addr(void *p) { printf("%p", p); }
を作ったとしても、渡すインスタンスによっては
期待した動作にならないということですか?
0926デフォルトの名無しさん
2009/10/19(月) 11:10:220927デフォルトの名無しさん
2009/10/19(月) 11:10:47引数を Object* で受けてるから、その変換が進むわけ
MyObject型のものを Object型として動作させなきゃいけないんだもの
引数を void* で受けるなら 変換なんか知ったこっちゃナシでしょ
0928デフォルトの名無しさん
2009/10/19(月) 11:15:09void print(Object *o) { print_addr(o); }
に対して
MyObject *mo = new MyObject();
print(mo);
print_addr(mo);
で、別のものが表示される場合がありえます。
0929デフォルトの名無しさん
2009/10/19(月) 11:22:04アドレスずれの原因がわかったついでに、
メンバ変数の内容が、なぜか1つ次のメンバ変数の内容になってしまう
バグの原因もわかった気がします。4バイトずれが原因ぽいです。
とりあえず基底クラスにvirtualなデストラクタを追加してみたら
すべてのバグが直りました
どうもありがとう。
0930デフォルトの名無しさん
2009/10/19(月) 11:27:38void * で受けといて (Object *) でキャストして Object型の操作利用?
Object * で受けといて (MyObject *) でキャストして MyObject型の操作利用?
かなり危なっかしい使い方のように思えるけど…
0931デフォルトの名無しさん
2009/10/19(月) 11:31:580932デフォルトの名無しさん
2009/10/19(月) 11:35:31使う方が悪い。困った。
0933デフォルトの名無しさん
2009/10/19(月) 11:41:56iso646.h で #define されるだけじゃないっけ
と思ったけど C++ では予約語なのか
0934デフォルトの名無しさん
2009/10/19(月) 11:53:290935デフォルトの名無しさん
2009/10/19(月) 13:11:31STLのリストを使おうと思って、その使おうとしているクラスのヘッダファイルに
#include <list>を書くと、その時点のコンパイルでで
\microsoft visual studio 9.0\vc\include\cstdio(49) : warning C4995: 'gets': 名前が避けられた #pragma として記述されています。
というエラーが発生します。冒頭に#pragma onceは記述してもしなくても出ます。
どのような問題が考えられるでしょうか?
0936デフォルトの名無しさん
2009/10/19(月) 13:38:090937デフォルトの名無しさん
2009/10/19(月) 14:08:31して、その心は?
0938デフォルトの名無しさん
2009/10/19(月) 14:15:110939935
2009/10/19(月) 15:53:49恐らくこのままでもstd::Listは使えると思います。
しかしこのような警告が39個も出てコンパイル時に面倒です。
というかこのまま警告を出していて不都合はないのか?
そしてなぜ、このような警告が出るようにSTL・あるいはcstdioの
設計が出来ているのか、などお詳しい方いらしたらご指導お願いします。
0940デフォルトの名無しさん
2009/10/19(月) 16:22:550941デフォルトの名無しさん
2009/10/19(月) 17:01:24抑制したら? 抑制の仕方はコンパイラのスレで。
>というかこのまま警告を出していて不都合はないのか?
全然。単に警告だから。
>そしてなぜ、このような警告が出るようにSTL・あるいはcstdioの設計が出来ているのか、
MSだから。つーか、インクルードの順番変えてみた?
>お詳しい方いらしたら
環境も判らんのに何に詳しいと?
>ご指導お願いします。
イヤだ。
0942デフォルトの名無しさん
2009/10/19(月) 17:03:27どうして演算子をオーバーロードできないと思い込んでいるんですか?
0943デフォルトの名無しさん
2009/10/19(月) 17:04:410944デフォルトの名無しさん
2009/10/19(月) 17:16:26すいません。環境はVC++2008ExpressEditionです。
動作原理みたいなものが分かって、かつ抑制するしかない時は
抑制してみようと思います。
インクルードの順番は変えても無駄でした。
>MSだから
これは全然分からないので、出来れば
もう少し掘り下げてお願いします。
0945デフォルトの名無しさん
2009/10/19(月) 17:17:01え?できるんですか?.演算子のオーバーロード
0946デフォルトの名無しさん
2009/10/19(月) 17:19:04できることもあれば、できないこともあります
試してみましたか
0947944
2009/10/19(月) 17:20:45警告の全般的な意図が分からないです。
・・でもちょっと予想で言って見ます。
MSは、予約語みたいな感じで、将来的に
この名前を使うかも知れないので、他のライブラリで
バッティングする名前をつけるなよ・・と
こういいたいのですか?
0948デフォルトの名無しさん
2009/10/19(月) 17:23:30かといって4995を常に抑制するのはよくないので、そっとしておいてください
0949デフォルトの名無しさん
2009/10/19(月) 17:23:47試しましたができませんでした
#include <iostream>
struct hoge
{
void operator . (int val) const
{
std::cout << val << std::endl;
}
};
int main(void)
{
hoge h;
h.100;
return 0;
}
0950948
2009/10/19(月) 17:27:25http://tinyurl.com/yf9mvkm
0951デフォルトの名無しさん
2009/10/19(月) 17:30:330952944
2009/10/19(月) 17:39:38グーグルウザスw。助かりました。ありがとうございます。
これから使う関数んじゃなくて、廃棄する可能性がある関数の使用に
警告がいっているということみたいですね。
という事は>>936はあべこべで、実際には<list>が将来廃棄される
可能性のある関数を使っているという認識で良いでしょうか?
0953デフォルトの名無しさん
2009/10/19(月) 17:47:25>>936はあべこべでもないと思う
getsは廃棄予定ではなく、強く非推奨なだけだったように思うよ
0954デフォルトの名無しさん
2009/10/19(月) 18:00:52従って、listで何らかのプラグマで抑制しているんじゃないのか?
cstdioはgetsを宣言せざるを得ないからな。
0955944
2009/10/19(月) 18:01:18確かに読み方によっては正しいですね・・・。
ともかく、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::○○」という書き方は何を意味するのでしょうか?
ネームスペースの使用宣言とも違う書き方ですよね・・・。
0956デフォルトの名無しさん
2009/10/19(月) 18:03:060957デフォルトの名無しさん
2009/10/19(月) 18:05:40だから逆だって。cstdioはgetsを宣言しなくちゃならないの。
0958944
2009/10/19(月) 18:11:06という事は意味合いとしては
「C++時代のライブラリであるSTLは旧時代の関数の臭いをかぐと警告を放つ」
と言った所でしょうか?
0959デフォルトの名無しさん
2009/10/19(月) 18:30:54<cstdio>がusingでgetsの名前を参照していることになるので、その警告が発動してしまうというわけか。
>>958
違う。警告を出すのはMSのコンパイラ。
<list>をインクルードすると、VC++ではたまたまついでに<cstdio>もインクルードされるようになっておりその余波を受けてしまっているだけ。
0960デフォルトの名無しさん
2009/10/19(月) 18:38:17なるほど〜〜
古い関数を使わないためにSTLを使ってるのに警告を出されるみたいな矛盾w
ともかく、完全に無視してよい警告だと分かり安心しました。
ありがとうございました。
0961デフォルトの名無しさん
2009/10/19(月) 19:28:46nemespace std{ }の中に入っていたので
これらをSTLで使うよという意味だという事が
分かったのですが、相変わらず using ::○○
という書き方の意味が分かりません。
usingの後にネームスペースが来ないで「::」とか
いったいこれは文法的にどういう働きがあるのですか?
0962デフォルトの名無しさん
2009/10/19(月) 19:44:43boost::lambda::bindを使い、次のように書く。
std::find_if(v.begin(), v.end(), (boost::lambda::bind(&HOGE::a, boost::lambda::_1) == 10));
0963デフォルトの名無しさん
2009/10/19(月) 23:47:55戻り値は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;
}
0964デフォルトの名無しさん
2009/10/20(火) 00:46:49template<class Iterator>
Iterator::value_type average(Iterator first, Iterator last)
0965デフォルトの名無しさん
2009/10/20(火) 00:51:36ResultType 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);
0966デフォルトの名無しさん
2009/10/20(火) 00:53:08エラーになってしまいます
0967デフォルトの名無しさん
2009/10/20(火) 00:55:37どっと演算子はオーバーライドできません。
0968デフォルトの名無しさん
2009/10/20(火) 01:32:04>>965
ありがとうございます
0969デフォルトの名無しさん
2009/10/20(火) 02:37:24#include <Iterator>
template < typename Iterator > typename iterator_traits< Iterator >::value_type average( Iterator first, Iterator last );
0970デフォルトの名無しさん
2009/10/20(火) 02:38:140971デフォルトの名無しさん
2009/10/20(火) 09:27:27「 :: 」 「 ・ 」 「 ・* 」は第二引数として値ではなく名前を取り、メンバの参照手段を提供する。
これらの多重定義を認めると、微妙な問題が起きる・・・とC++開発者の一人Stroustrupがプログラミング言語
C++(第3版)で言ってる。
ところで誰か 「using ::」の意味をしらないものだろうか・・・
::は大域を指定する演算子であってネームスペースではないのだが・・・
0972デフォルトの名無しさん
2009/10/20(火) 09:47:070973デフォルトの名無しさん
2009/10/20(火) 09:50:30> ところで誰か 「using ::」の意味をしらないものだろうか・・・
> ::は大域を指定する演算子であってネームスペースではないのだが・・・
もしかして>>955の話をしているのか?
それなら using の二つの用法、「using宣言」と「usingディレクティブ」の違いについて
ISOなりJISなりC++ランゲージクイックリファレンス(オライリージャパン)なりを読むといいだろう。
0974デフォルトの名無しさん
2009/10/20(火) 10:01:350975デフォルトの名無しさん
2009/10/20(火) 10:10:21コンパイラはBorland 5.5です。
0976デフォルトの名無しさん
2009/10/20(火) 10:11:24>>955に関わらず、「using ::○○」という使い方を知りたいのですが・・
そんなに難しい話なのですか?
私の認識としては
usingの後にネームスペースが来る → usingディレクティブ
usingの後に個々の名前が来る → using宣言
:: → グローバル変数へのアクセス
であり、
だとすれば 「using ::○○」は、グローバル変数を使えるようにするという意味になり
グローバル変数はどこでも使えるのでそもそも宣言自体が無意味であると思うのですが、
私が何を勘違いしている見当がつく方いらしたら教えてください・・・。
0977デフォルトの名無しさん
2009/10/20(火) 10:14:12間違い。
>グローバル変数はどこでも使える
間違い。
0978デフォルトの名無しさん
2009/10/20(火) 10:14:500979デフォルトの名無しさん
2009/10/20(火) 10:18:44int foo();
namespace N { int foo(); }
namespace N { int bar() { return foo(); } }
namespace N { int baz() { using ::foo; return foo(); } }
これでいいか?
0980デフォルトの名無しさん
2009/10/20(火) 10:20:040981デフォルトの名無しさん
2009/10/20(火) 10:26:33局所の宣言が大域変数を使えなくするから確かに間違いです・・
「using::○○」の意味は
局所で宣下された○○ではなく大域で宣言された○○を使えっていう感じですか?
>>979
おお!すごく分かりやすいです!理解が深まりました。
丁寧にありがとうございました。
0982デフォルトの名無しさん
2009/10/20(火) 10:28:22>> usingの後にネームスペースが来ないで「::」とか
:: もネームスペースだよ。グローバルネームスペースっていうやつ。
0983デフォルトの名無しさん
2009/10/20(火) 10:54:59コンパイルエラーになるから名前空間じゃないよ
0984デフォルトの名無しさん
2009/10/20(火) 11:41:30using 直後の :: はグローバルネームスペースを指すプリフィックス。
・・・あんまりわかりやすくならんな。まぁいいか。
0985デフォルトの名無しさん
2009/10/20(火) 12:15:20int foo();
namespace M { using ::foo; }
namespace N { int bar(){ return M::foo(); } }
こうだな
0986デフォルトの名無しさん
2009/10/20(火) 13:54:07usingを用いた空間内で使用しなくてもOKって事ですか・・・
他空間の名前を、あたかも自分の名前のようにしたって感じですね。
ところで、>>979のような使い方も正しいんですよね?
>>985はcstdioの場合、こっちだろうっていう話ですかね?
0987デフォルトの名無しさん
2009/10/20(火) 14:37:49ちなみにcosの値が知りたいです。
0988デフォルトの名無しさん
2009/10/20(火) 14:43:00#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;
}
0989デフォルトの名無しさん
2009/10/20(火) 14:44:53ありがとうございます。
0990デフォルトの名無しさん
2009/10/20(火) 14:56:300991デフォルトの名無しさん
2009/10/20(火) 15:49:51なら全て教えてください。
後、三角関数の値は入れなくても答えはでるのですか?
0992デフォルトの名無しさん
2009/10/20(火) 15:56:53お前は何の質問をしているんだ?
0993デフォルトの名無しさん
2009/10/20(火) 16:00:09・ループ制御変数にdoubleを使うのはバカだ。
・"%lf"は本来間違いだ。
つまり、for (int d = 0; d < 10 * 100; ++d) printf("%g, %g\n", d / 100., cos(d / 100.));でいいだろ。
0994デフォルトの名無しさん
2009/10/20(火) 16:05:17お前バグっている。%gに整数を渡していい訳ないだろ!
しかもfor(int d... はC++。
0995デフォルトの名無しさん
2009/10/20(火) 16:05:560996デフォルトの名無しさん
2009/10/20(火) 16:06:220997デフォルトの名無しさん
2009/10/20(火) 16:07:190998デフォルトの名無しさん
2009/10/20(火) 16:11:53Remember C99!!
【初心者歓迎】C/C++室 Ver.69【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1256022655/
0999デフォルトの名無しさん
2009/10/20(火) 16:17:121000デフォルトの名無しさん
2009/10/20(火) 16:18:5410011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。