2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【初心者歓迎】C/C++室 Ver.68【環境依存OK】

1 :デフォルトの名無しさん:2009/09/17(木) 22:22:59
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※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でのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か   に置換しておくことをお勧めします。

2 :デフォルトの名無しさん:2009/09/17(木) 23:01:03
 ○  >>1 乙 もうお前に用はない
 く|)へ
  〉   ヽ○ノ
 ̄ ̄7  ヘ/
  /   ノ
  |
 /
 |


3 :デフォルトの名無しさん:2009/09/18(金) 00:41:55
          ◤◥◣
  ▂  ◢◤▀〓▲▂▐         ▂ ▪ ▂▄▅▆▇■▀▀〓◣▬ ▪ ■….
 ▍ ▼     ◥◣▼        .▂▅■▀ ▪ ■ ▂¨ ∵▃ ▪ ・
  ▀▍ ◢◤     ▅ ▐◣   ◢◤ ◢▇█▀ ¨▂▄▅▆▇██■■〓◥◣▄▂
    ▍  ▅ ◢■     ▍ ■ ▂▅██▅▆▇██■〓▀▀ ◥◣ ∴ ▪ .
  ▐   ▂   ▐◣ ▐▅▇███████▀ ▪ ∴ ….▅ ■  ◥◣
   ▀◣▂  ▀◥▅▆▇████████▆▃▂  ▪ ■▂▄▃▄▂
     ◥◣▄▂▄▅▀   ■  ¨ ▀▀▀■▀▀▀ ▪ ■ ∴‥

↑はUnicode対応のブラウザで見るとコーヒーを吹くプーさんが表示されますが、これを
1.正しく画面に表示する
2.テキストファイルに出力し、再入力してから画面に表示してもやはり正しく表示される
3.出力されたテキストファイルをUnicode対応のテキストエディタやブラウザで表示しても正しく表示される
ようにするC++のコードを書いてください。

多くの人にはとても難しいです。

4 :デフォルトの名無しさん:2009/09/18(金) 01:13:38
MFC使えば簡単だけど
C++標準でやろうとすると死ぬな。

5 :デフォルトの名無しさん:2009/09/18(金) 01:21:12
またあやふやなコトを…

6 :デフォルトの名無しさん:2009/09/18(金) 04:23:11
たとえAAであってもディズニーキャラはモザイク掛けといた方がよくね?

7 :デフォルトの名無しさん:2009/09/18(金) 12:10:11
wchar_t s[] = L"ハート♡髑髏☠DANGER☣";
wcout << s << endl;
wcout.clear();
wcout.imbue( locale( "Japanese" ) );
wcout << s << endl;

んー。動かん。
http://codepad.org/60naQUV5


8 :デフォルトの名無しさん:2009/09/18(金) 13:32:14
バイナリモードでやったら

9 :デフォルトの名無しさん:2009/09/18(金) 16:00:44
long double を使う必要が出たため、
Turbo C++(2005?)で long double を double へ変換するDLLを作成し、
VC2008EEで呼び出そうとしていたところ、関数コール部分で以下のエラーが出ました。

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

dumpbin でチェックしたところ、関数名はあっているようでしたし、
defファイルを作成し、lib /machine:i386 /def: で lib を作ってリンクもしています。
何が問題なのでしょうか?

10 :デフォルトの名無しさん:2009/09/18(金) 16:34:37
http://download.microsoft.com/download/e/3/c/e3c1a451-1882-49fe-86a8-e25680f6c46c/JIS_Unicode_guide.pdf

↑を読んでみたけど、マイクロソフトでさえUnicodeを正しく表示できないのにワロタ。

11 :9:2009/09/18(金) 18:00:13
追記です。
libを使用せず、LoadLibrary()を使用しても同じ結果でした。

12 :デフォルトの名無しさん:2009/09/18(金) 18:12:55
とりあえず呼び出し規約は一致させてるのか

13 :デフォルトの名無しさん:2009/09/18(金) 18:32:41
指定したURLのHPのソースコードを取ってくることは可能でしょうか?

14 :デフォルトの名無しさん:2009/09/18(金) 18:36:59
>>13
HTMLソースって意味なら環境依存の方法で可能なことが多い。


15 :9:2009/09/18(金) 18:38:19
>>12
libリンクの方だと__stdcallではVCの方でリンクエラーが出ていました。
そのため、libリンク方式の方は指定していません。
LoadLibrary()の方は__stdcallを指定しています。

16 :デフォルトの名無しさん:2009/09/18(金) 18:38:32
>>14
C++標準関数でありませんか?
調べると、.NETやMFCなら沢山出てくるのですが・・・

17 :デフォルトの名無しさん:2009/09/18(金) 18:39:39
>>13
ブラウザがやってることと同じことをやるだけだな。
HTTPプロトコルに従った手順(テキストベースの送受信)でやりとりして得るだけの話だし

18 :デフォルトの名無しさん:2009/09/18(金) 18:41:43
>>16
言語レベルでそこまでの範囲を想定してないから、標準では無い。

非標準で、その手の面倒をみてくれるライブラリは あるかもね

19 :デフォルトの名無しさん:2009/09/18(金) 18:46:01
>>15
呼び出し側の 宣言が狂っているんじゃないの?

lib式)
 プロトタイプ宣言の呼び出し規約定義はちゃんとあわせてるのか? (マンゲリング抑制も含めて

LoadLib式)
 GetProcAddress() の戻りをどうキャストして使ってるんだ?

20 :デフォルトの名無しさん:2009/09/18(金) 18:52:50
>>17,18
ありがとうございます。
もう少し調べてみます

21 :デフォルトの名無しさん:2009/09/18(金) 18:53:58
>>16
C/C++標準は、socket(ネットワーク)を扱えるものは何一つ無い。
どこぞでも書いたが、(Win環境ならwgetを入手して)
system("wget")が一番楽かもしれない。

22 :9:2009/09/18(金) 19:28:43
>>19
双方同じヘッダをインクルードして使用しています。

ヘッダ
#ifdef _USRDLL
# define __PORT __declspec(dllexport) /* DLLを作る場合 */
#else
# define __PORT __declspec(dllimport) /* DLLを使う場合 */
#endif
#ifdef __cplusplus
extern "C"
{
#endif
__PORT double __stdcall LONGDOUBLE( void* p );
#ifdef __cplusplus
}
#endif

LoadLib式は以下の通りです。

HMODULE h;
FARPROC p;
double (*func)( void* );
h = LoadLibrary( "longdouble.dll" );
p = GetProcAddress( h, "LONGDOUBLE" );
func = (double (*)(void*))p;
変数 = (int)func( long doubleが入っているメモリへのアドレス );
FreeLibrary( h );

23 :デフォルトの名無しさん:2009/09/18(金) 19:31:53
VC++2008と32bitXPを使っているのですが、
64bitのOSにするとint等のビット幅以外になにか変わるところはあるんでしょうか

24 :9:2009/09/18(金) 19:35:40
>>19
>マンゲリング抑制
とは何のことですか?
ググってみましたがよくわかりませんでした。

25 :9:2009/09/18(金) 19:41:18
>>19
double (__stdcall *func)( void* ); 
に変更したところ、問題なく動作しました。
ありがとうございました。

26 :デフォルトの名無しさん:2009/09/18(金) 21:26:23
>>23
むしろ、intの大きさは変わらない。
変わるのはポインタ・ハンドル・L/WPARAM・LRESULT・size_tなどの大きさ。
これにより、アドレス空間1プロセス4GB(うちユーザが使えるのは2-3GB)という制限が大幅に緩和される。
あと、x86→x86-64だとレジスタの増加で高速化が期待できる。

>>24
extern "C"のこと。

27 :デフォルトの名無しさん:2009/09/18(金) 21:34:55
>>26
あれ、そうなんですか。もう少しよく調べてみます
ありがとうございました

28 :デフォルトの名無しさん:2009/09/18(金) 21:56:11
多数派はLP64なのにVC++だけは、なぜかLLP64


29 :デフォルトの名無しさん:2009/09/18(金) 21:59:00
Windowsプログラミングだと、LRESULT,WPRAM,LPARAMが64bitになっていてはまる場合もある。
LPARAMをlongに代入できないとか。

30 :デフォルトの名無しさん:2009/09/18(金) 22:13:44
GetWindowLongPtr使うと警告出されたりとか

31 :デフォルトの名無しさん:2009/09/18(金) 22:19:51
>>30
それは/Wp64をオフにすればいいだけ。
もう64ビット対象にばんばんビルドして確かめてくれってことで、
VC++ 2008では/Wp64オフが初期設定となっているから、それにならえばいい。

32 :デフォルトの名無しさん:2009/09/19(土) 06:41:02
入出力マニュピレータ endlとか
なんで引数どころか()まで省略できるの?

33 :デフォルトの名無しさん:2009/09/19(土) 07:21:21
>>32
それらを書くか書かないかで意味が違う。省略できているわけじゃない。

34 :デフォルトの名無しさん:2009/09/19(土) 09:48:11
詳しく

35 :デフォルトの名無しさん:2009/09/19(土) 10:46:35
int a,b,c,d,e;の中にランダムに整数が入ってるものとします。
この5つの中でいちばん数が小さい変数を見つけるにはどうやるのが良いでしょうか?

36 :デフォルトの名無しさん:2009/09/19(土) 11:00:13
>>35
4回比較する

37 :デフォルトの名無しさん:2009/09/19(土) 13:16:18
暗黙のアップキャストを抑制して、明示的にキャストした場合のみ
アップキャスト可能にすることって可能でしょうか?

38 :デフォルトの名無しさん:2009/09/19(土) 13:23:29
暗黙のアップキャストを抑制する必要性自体がほとんどないし、できなかったと思う。
具体的に必要な場面を示せばなんか方法はあるかもしれない。


39 :デフォルトの名無しさん:2009/09/19(土) 13:32:40
>>37
private 継承して BaseType& Base() を用意するとか?

40 :デフォルトの名無しさん:2009/09/19(土) 14:17:48
class A;
class B : A;

func(A);
func(B);

templateの絡みで、こんな感じに親クラスと派生クラスを
オーバーロードした同名関数で処理したいのですが。

41 :デフォルトの名無しさん:2009/09/19(土) 14:27:49
>>40
ん?それなら普通にオーバーロードで済まないか?

A, B の例でいいから、今できてるところまでひととおりのコードを貼ってみるといいかもね。

42 :デフォルトの名無しさん:2009/09/19(土) 14:36:15
class Hoge {・・・};

int main(void)
{
Hoge h;

h; // ※

return 0;
}

※をエラーに(できればコンパイル時)することはできますか?

43 :デフォルトの名無しさん:2009/09/19(土) 14:50:46
0除算でもしてみては

44 :デフォルトの名無しさん:2009/09/19(土) 14:53:30
>>42 無理

45 :デフォルトの名無しさん:2009/09/19(土) 15:15:22
C/C++は評価した値を捨てる事ができる言語だからな
Pascalとは違う

46 :デフォルトの名無しさん:2009/09/19(土) 15:22:16
>>41
オーバーロードが用意されていればキャストされないのですね。
すみませんでした。

47 :ぅゅ ◆e6.oHu1j.o :2009/09/19(土) 23:39:19
>>42
Cだとそういうの警告でるよ
エラーだすの実行時でいいならboolオペレーターっていうのがある
operator bool(){
printf("era-");
return 0;
}

48 :ぅゅ ◆e6.oHu1j.o :2009/09/19(土) 23:40:47
あ、すまん勘違い
それじゃboolオペレーターの実行されねーや

49 :デフォルトの名無しさん:2009/09/19(土) 23:42:18
>>47
その警告に C と C++ は関係ない。
その operator bool を Hoge に宣言しても h; では呼び出されない。

50 :デフォルトの名無しさん:2009/09/20(日) 02:04:05
>>42
のコードって規格ではどういう動作するように決められてるの?無視するだけ?

51 :ぅゅ ◆e6.oHu1j.o :2009/09/20(日) 08:03:51
>>47borlandでは.cのとき警告

52 :デフォルトの名無しさん:2009/09/20(日) 10:15:49
Carクラスがあるとします
Car car1;
とオブジェクトを作成するのと
Car* pCar;
pCar=new Car;
とメモリを確保するのと、どういう短所長所があるのでしょうか?

53 :デフォルトの名無しさん:2009/09/20(日) 10:27:03
前者はスコープを抜けるときにオブジェクトが自動的に削除される。そして生成廃棄が速い
後者は不要なオブジェクトを手動でdeleteする必要がある。そして生成廃棄が遅い。
なのに、なぜ後者が有るかというと、生成と廃棄のタイミングを自由に操作できるから。



54 :デフォルトの名無しさん:2009/09/20(日) 10:31:24
>>53
なるほど、ありがとうございます
グローバル変数ほど長く使いたくない場合に使うんですね

55 :デフォルトの名無しさん:2009/09/20(日) 13:05:14
templateの>>を離して書くのがだるいんですがこれはもうどうしようもないんですか?

56 :デフォルトの名無しさん:2009/09/20(日) 13:37:34
そんなやならdifineでも使ってみては


57 :デフォルトの名無しさん:2009/09/20(日) 13:42:31
>>55 c++0xで正式に実装される。
VC8でもできるから、できるコンパイラを使えばいい。



58 :デフォルトの名無しさん:2009/09/22(火) 11:53:26
struct base
{
virtual void hoge(){・・・};
};

struct sub : public base
{
virtual void hoge(){・・・};
};

int main(void)
{
sub s;
s.hoge();
return 0;
}

↑見たいな感じに書いても仮想関数の検索コストって掛かるもの?
静的に決定できるからコストかからないと思うんだけどどうなんでそか?

59 :デフォルトの名無しさん:2009/09/22(火) 12:00:13
>>58
コンパイラによるとしか

60 :デフォルトの名無しさん:2009/09/22(火) 13:49:23
>>58
VCで確認したら、sub::hogeを直接コールしてた。

61 :デフォルトの名無しさん:2009/09/22(火) 15:38:50
>>58
BCC(ECC6.2.0)もsub::hogeを直接コールしてた
最適化が糞なコンパイラですらこれだから大抵のコンパイラは
出来るだけ静的に解決出来る所はするのではないか

62 :デフォルトの名無しさん:2009/09/22(火) 15:45:10
細かな部分で挙動がクソなだけでBCCの最適化は普通に良いよ

63 :デフォルトの名無しさん:2009/09/22(火) 15:48:48
gccも直接sub::hogeしてた

64 :デフォルトの名無しさん:2009/09/22(火) 17:07:54
みんなテストさんくすこ

65 :デフォルトの名無しさん:2009/09/22(火) 17:26:08
というか直接呼ばないようにコンパイルする意味が分からないってレベルだしな
まぁでも、確実な根拠があると一応ちょっと安心かな

66 :デフォルトの名無しさん:2009/09/22(火) 17:35:53
>>58
VCでこうだと、テーブルジャンプになってた。

sub* s = new sub();
s->hoge();



67 :デフォルトの名無しさん:2009/09/22(火) 17:38:31
そりゃそうだろw

68 :デフォルトの名無しさん:2009/09/22(火) 17:41:20
>>67
これ、最適化したらまずいの?

69 :デフォルトの名無しさん:2009/09/22(火) 17:58:52
それの場合、最適化するコンパイラは無さそうだけどなぁ
sが実際に保持している型をコンパイルタイムで追尾しなきゃならないから、処理が
重くなる割には性能向上が全く期待できない(レアケースすぎるから)
規格上、確実にs->hoge()の時点でsのポイントするインスタンスがsub型と確定可能
かどうか、というのもちょっと確信は持てない(newの辺りが特に)
まぁ実験するのは面白いかも

70 :デフォルトの名無しさん:2009/09/22(火) 18:13:46
ちょっと見た目では、sub::hoge()以外が呼ばれる余地がないと思うけど、
なんか落とし穴でもあるのかね。
最適化されないってのは。

71 :デフォルトの名無しさん:2009/09/22(火) 18:28:56
>>70

new が例外起こす場合を考慮すると、s == NULLもあるから
sub::hoge()は呼べないのでは。

つーか new がオーバーライドされてたらもはや何でもあり。


72 :デフォルトの名無しさん:2009/09/22(火) 18:29:17
ポインタが実際に指している型を静的に追尾するメリットは、>>66のようなコードが
ごく僅かに最適化されるくらいだと思う。
実用的にはメリット皆無に限りなく近い予感。コンパイルも遅くなるだろうし。

73 :デフォルトの名無しさん:2009/09/22(火) 18:30:09
>>71
new で例外が発生すれば s への代入も、それに続く s->hoge() の呼び出しも行われない
から、それは関係ない。

74 :デフォルトの名無しさん:2009/09/22(火) 18:34:06
需要が無いor真面目に書けば最適化不要、って場合は最適化を期待しない方がいい

75 :デフォルトの名無しさん:2009/09/22(火) 19:29:57
s->hoge();の時点でアップキャストもダウンキャストもなく、
正しくsubのインスタンスを指してることをどうやって保障するかじゃない?
人間には簡単に分かる事もコンパイラだと100万行のコードでも同じ動作しなきゃならんと思うとかなり面倒な気がする

76 :デフォルトの名無しさん:2009/09/22(火) 19:48:59
vc8だとs.hogeはインライン展開、s->hogeは仮想呼び出し

intel c++だとs.hogeもs->hogeもインライン展開された。


77 :デフォルトの名無しさん:2009/09/22(火) 20:19:27
流れと無関係にsubという識別子が気になるPerl経験者であった

78 :デフォルトの名無しさん:2009/09/22(火) 23:23:40
Intelコンパイラさんマジパネー

79 :デフォルトの名無しさん:2009/09/24(木) 23:58:38
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9957.txt

ロープレのイベントなんかで、使う分だけ
メモリを確保したいのですが、こんな感じでいいでしょうか。

メモリは正しく確保できているか、
通常の配列より容量を削減できているかあたりです。

80 :デフォルトの名無しさん:2009/09/25(金) 00:14:25
>>79
これならほとんどの場合において配列だけの方がメモリ効率はいいよ
開発効率をあげたいなら STL を使うといいよ

目的が、作ることより勉強優先っていうなら苦しむといいよ

81 :デフォルトの名無しさん:2009/09/25(金) 00:40:41
void hogehoge(double x0, double x1, double dx, const fugafuga& fuga)
{
for(double x = x0; x < x1; x += dx) fuga(x);
}

これを

template <class Iterator>
void hogehoge(Iterator begin, Iterator end, const fugafuga& fuga)
{
for( ; begin != end; ++begin) fuga(*begin);
}

という形にしたいんですけど新しいIterator作る以外になにか手はありますか?

82 :デフォルトの名無しさん:2009/09/25(金) 01:09:43
>>80
ありがとうございます。

メモリは、3つのイベントを作るとすると、
配列だと作った数に関係なく 8 * 32 バイト、
ポインタだと 4 * 32 + 8 * 3 で少なくできると思ったのですが。
(4はポインタのサイズ、8は構造体のサイズ、
32はイベントを作れる最高の数)
また、構造体のサイズは、実際のゲームではもう少し大きいです。

その効率の悪さについてググってみたのですが、
連続な領域でない事が関係しているんですかね。

stlはc++の機能みたいですね。
ヒントになる事もありそうなので勉強してみます。

83 :デフォルトの名無しさん:2009/09/25(金) 02:42:11
>>81
配列や標準コンテナに入れて呼び出すとかでいいの?

84 :デフォルトの名無しさん:2009/09/25(金) 15:00:42
ttp://msdn.microsoft.com/ja-jp/library/cc411004.aspx
にあるSendInput関数という関数を使いたい場合は、
SDKというものをインストールしないとダメなのでしょうか?

85 :デフォルトの名無しさん:2009/09/25(金) 16:08:07
環境による

86 :デフォルトの名無しさん:2009/09/25(金) 16:47:39
staticメンバ関数から
同じクラスの中にある他のメンバ変数(静的か非静的かは問わず)を
操作することはできないのですが
どうしても操作したい場合には
どういった方法をとることができるのでしょうか?

87 :デフォルトの名無しさん:2009/09/25(金) 16:53:15
引数で渡せばおk

88 :デフォルトの名無しさん:2009/09/25(金) 17:17:10
staticメンバ関数じゃなくすればOK

staticメンバ関数は特定のインスタンスに対する操作ではないので、
インスタンスごとに存在するメンバ変数にアクセスできないのは当然です。
どのインスタンスのメンバ変数にアクセスしたいのかを指定するには、
(1) 通常のメンバ関数にする → this で指定されるインスタンスにアクセスする
(2) 引数でインスタンスを渡す → 引数で指定されたインスタンスにアクセスする
(3) 別の変数(グローバル変数やstaticメンバ変数)でインスタンスを指定する
のどれかの方法で行います。

89 :デフォルトの名無しさん:2009/09/25(金) 17:54:25
aaa型のabcという構造体を1.txtに書き出しました。
1.txtの内容をabcに代入するにはどうやればいいんでしょうか?

#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp ;
fp = fopen("1.txt", "w");

struct aaa{int a;int c;};
aaa abc;
abc.a=500;
abc.c=555555;
fwrite( &abc, sizeof(aaa), 1, fp ) ;
return 0; }


90 :デフォルトの名無しさん:2009/09/25(金) 17:56:05
fread()

91 :デフォルトの名無しさん:2009/09/25(金) 17:58:04
>>81
その例なら、イテレーターとしてint*が渡せるね

92 :デフォルトの名無しさん:2009/09/25(金) 18:03:07
>>89
出来ればfwrite()、fread()を使う時は"wb"や"rb"で開いた方がいいよ
ランダムアクセスする時にcooked modeだとズレが邪魔をするOSがある

93 :デフォルトの名無しさん:2009/09/25(金) 19:37:49
>>90>>92
ありがとうございました。がんばってみます

94 :79:2009/09/25(金) 21:44:42
すいません、別スレで質問したいと思います。
ありがとうございました。

95 :デフォルトの名無しさん:2009/09/25(金) 21:56:16
>>89
じゃないんだけどバイナリエディタで読むと
23 7A 08 00
で、
00 08 7A 23
の順で読み込めばいいんでしょうかー?

96 :デフォルトの名無しさん:2009/09/25(金) 22:10:12
リトルエンディアンだとそう。
abc.cの部分についてだよね

97 :デフォルトの名無しさん:2009/09/25(金) 22:11:14
今のLvだとそこは深く考えなくていいと思うよ。
単純にfreadとfwrite使えばいい。

98 :デフォルトの名無しさん:2009/09/25(金) 22:14:06
>>96>>97
そうです、ありがd

99 :デフォルトの名無しさん:2009/09/25(金) 22:55:41
fprintf(fp,"%lf %lf %lf %lf %lf %lf %lf %lf",a,b,c,d,e,f,g);

cout << a <<" "<< b << setw(1) << c <<" "<< d <<setw(1)
<< e <<" "<< f << " " g << endl;
な感じのタイプ数が多いのを
cout << a << b << c << d << e << f << g << endl;
こんな具合に書きたいんですが、何かいい方法ありませんか。


100 :デフォルトの名無しさん:2009/09/25(金) 22:58:31
>>99
オペレータをオーバーライド

101 :デフォルトの名無しさん:2009/09/25(金) 23:00:49
ほとんどオブジェクト指向理解してないので、書いてくれるとうれしいでつ

102 :デフォルトの名無しさん:2009/09/25(金) 23:01:45
>>100 それはオーバーロード。
>>101 オブジェクト指向とか関係ないから。

103 :デフォルトの名無しさん:2009/09/25(金) 23:08:34
んじゃ、オーバーロード理解してないんで、書いてくれるとうれしいなぁ...

104 :デフォルトの名無しさん:2009/09/25(金) 23:12:02
>>103 ググレカス

105 :デフォルトの名無しさん:2009/09/25(金) 23:41:43
>>3
血をはいてるぷーさんにしか見えん

106 :デフォルトの名無しさん:2009/09/26(土) 00:33:22
>>92

どこかで聞いたような単語を、意味も知らずに偉そうに使って
恥ずかしくないですか?

107 :デフォルトの名無しさん:2009/09/26(土) 00:54:51
Class* a; と Class *a; の違いがわかりません。
両者は使い分けないといけないものなのですか?
それとも一方にそろえるべきものなのですか?

108 :デフォルトの名無しさん:2009/09/26(土) 01:23:04
どこにホワイトスペースを挟もうと違いはない。

109 :デフォルトの名無しさん:2009/09/26(土) 02:14:06
>>107
Class* a, b; と書いたら

Class *a, *b; という意味にはならず
Class *a, b; という意味になるので注意
それだけ気をつけていればどちらで書いてもOK

110 :デフォルトの名無しさん:2009/09/26(土) 02:38:08
>>92
cooked modeという言葉を初めて知ることができてよかった。
けどバイナリに対する言葉はアスキーもしくはテキストと言ったりしない?

111 :デフォルトの名無しさん:2009/09/26(土) 02:59:23
>>110
まあどっちでもいいんだけどな
バイナリモードに対応するのはraw mode
MS/DOS、Windowsのみに存在する区別らしい

Linux、UNIXには区別は存在しない

112 :デフォルトの名無しさん:2009/09/26(土) 03:07:29
fopen()のtとbは、raw とかcookedとか言わないだろ。

113 :デフォルトの名無しさん:2009/09/26(土) 03:11:40
頭の中でわかっていればいいんだよ
他人に伝える時はテキストとバイナリと言うべきだけどな

114 :デフォルトの名無しさん:2009/09/26(土) 03:18:45
まぁMS-DOSが懐かしくはあった

115 :デフォルトの名無しさん:2009/09/26(土) 03:22:25
素人がインストロールとか言ってたら、ネタにして笑ってるくせに。

116 :デフォルトの名無しさん:2009/09/26(土) 03:37:26
cooked mode という用語は、
一般的には端末入出力、特に入力時に
編集した結果を受け取るのではなく
Enterやカーソルキーなどの、生の情報を受け取るために使う。

ファイルの\r\n変換に使うことなど、まず無い。
なぜならば、そもそもファイルのベタなデータを
「行」という単位で扱おうとしていること自体
「生のままで扱っていない」から。

\r\n変換のことを cooked mode なんて呼ぶと
陰で笑われるから、気をつけたほうが良いよ。

117 :デフォルトの名無しさん:2009/09/26(土) 03:48:29
望むところだ

118 :デフォルトの名無しさん:2009/09/26(土) 03:53:36
>>115
その例が同質のものだと思ってるなら、お前の頭もネタにして笑われるレベルだな。

119 :デフォルトの名無しさん:2009/09/26(土) 03:57:31
知ったかして恥ずかしい用語の使い方してるってだけのくせして、なにとりつくろってんだ。

120 :デフォルトの名無しさん:2009/09/26(土) 11:00:53
Linux環境でP2Pボイスチャットを作りたいのですが、C++のオーディオに関する知識がまったくないので、
どのライブラリを使えばいいのかわかりません
オーディオストリーミングに適したライブラリがあれば教えてください

121 :デフォルトの名無しさん:2009/09/26(土) 11:55:57
>>120
背伸びするのはいいんだけど、背伸びしすぎじゃねーの
オーディオだけじゃなくて、ストリーミングもP2Pの知識もないんだろ?

122 :デフォルトの名無しさん:2009/09/26(土) 15:14:35
関数についてですが、void aaa();と宣言したあと、
main関数の中でもう一度void aaa();sと書くのは、もう一度プロトタイプ宣言をしていると言うことでしょうか?

またこのように、サイトなどからコピーする時に、よく型をつけたままコピーしてしまい不具合が起きてしまいます。
これを防ぐ方法はないでしょうか?

void aaa();
int main() {
void aaa();///←ココ
return 0; }
void aaa(){return;}

123 :デフォルトの名無しさん:2009/09/26(土) 15:19:00
>>122
関数内の void aaa() は外にある宣言を繰り返していることになる。
ちなみに引数リストが空の宣言は「プロトタイプ宣言」とは言わない。

2つ目の質問は、「型をつけたままコピー」と「不具合」が何のことかわからん。

124 :デフォルトの名無しさん:2009/09/26(土) 15:20:16
>>122
型の不一致が無ければ問題ないよ

125 :デフォルトの名無しさん:2009/09/26(土) 15:49:31
>>123>>124
ありがとうございましたす
後半はあんまりキニシナイでください

126 :デフォルトの名無しさん:2009/09/26(土) 18:51:56
>>108, 109 ありなとう
ひところから急に Class* な表記が流行りだしたような気がしてたから
ちょっと気になってたんですが、自分の好きなClass *表記で気にしない
ようにします。

127 :デフォルトの名無しさん:2009/09/26(土) 21:12:03
C/C++の形態論的にはClass *a;という書き方のほうが整合性が取れているように
思う。意味論的にはClass* a;のほうが相応しいと思う。文法的にはClass*a;
でも構わないけどw まあ、好みで。自分はClass *a;。

128 :デフォルトの名無しさん:2009/09/26(土) 21:29:02
template <class T> struct add_pointer{ typedef T* type; };
add_pointer<some_class>::type psc;
これが正解だからこれからはこれを使うように

129 :デフォルトの名無しさん:2009/09/26(土) 21:31:51
俺はClass* a;だな
「Classのポインタ」という変数aって感じがいい
>>109みたいな問題があるけど、1行で複数の変数を宣言しなければいいんだし

130 :デフォルトの名無しさん:2009/09/26(土) 21:38:42
Class *p;とClass* p;はどっちでもいいけど、
Class &r;はなんかいやだなあ。

131 :デフォルトの名無しさん:2009/09/26(土) 21:40:06
>>129
どっちかっていうと、Classへのポインタ

132 :デフォルトの名無しさん:2009/09/26(土) 21:41:51
Class * ptr;派が一人もいないことに絶望した

133 :デフォルトの名無しさん:2009/09/26(土) 22:10:29
それってなんか掛け算っぽくね?
完全に独断と偏見だけどさ。

134 :デフォルトの名無しさん:2009/09/26(土) 22:18:45
依存名だと掛け算優先だね

135 :デフォルトの名無しさん:2009/09/26(土) 22:56:30
>>123
> ちなみに引数リストが空の宣言は「プロトタイプ宣言」とは言わない。
そなの?

136 :デフォルトの名無しさん:2009/09/26(土) 23:16:40
>>135
C の場合、引数リスト無しの関数宣言 f() は f(...) と同じで、呼び出し時に引数の型は
チェックされない。一方プロトタイプ宣言といえば以下のもの。
ISO C 6.2.1 p2
> (A function prototype is a declaration of a function that declares the types of its parameters)
(関数プロトタイプとは関数の宣言で、その引数の型を宣言するもの)

C++ の場合、引数リスト無しの関数宣言 f() は f(void) と同じで引数を取らないことを
宣言するが、 C++ には引数の型を宣言しない関数宣言というものが無いので、そもそも
関数プロトタイプというように呼び分ける必要が無く、すべて単に関数の宣言と呼べばいい。

137 :デフォルトの名無しさん:2009/09/26(土) 23:21:50
34へぇ

138 :デフォルトの名無しさん:2009/09/26(土) 23:23:51
65へぇ

139 :デフォルトの名無しさん:2009/09/27(日) 01:50:04
unicodeを扱おうとワイド文字列型(wchar_t)に入れようとしましたが、うまくいきません
どこが間違っているのでしょうか・・?
int main() {
wchar_t aaa[]="テスト";
return 0;
}

140 :デフォルトの名無しさん:2009/09/27(日) 01:52:44
>>139
× "テスト"
○ L"テスト"

141 :デフォルトの名無しさん:2009/09/27(日) 02:00:34
int main() {
wchar_t aaa[] = L"テスト♥";
wcout << aaa << " : " << aaa << endl;
return 0;
}

142 :デフォルトの名無しさん:2009/09/27(日) 04:32:31
ありがとうございます

143 :デフォルトの名無しさん:2009/09/27(日) 08:26:21
>>121
ストリーミングもP2Pも理論的には解っていますが、作った事はありません
P2Pボイスチャットを作るのは大変だとわかっていますが、大学の課題なので
何とか完成させたいのです
よろしくおねがいします

144 :デフォルトの名無しさん:2009/09/27(日) 10:26:25
よしくです
int Row = 10;
int Col = 20;
std::vector<std::vector<int> > Array(Row, std::vector<int>(Col));
このように書くことで、2次元int 型のvector コンテナが定義できますが
他の型、(list やmap、独自クラス)でも2次元のコンテナを作りたいのですが
templae を用いて、汎用的にしたいのですが、どのように書いたらいいでしょうか。
よろしくお願いします。

145 :デフォルトの名無しさん:2009/09/27(日) 11:08:42
>>144
template template パラメータを使うことが考えられる。
現行の C++ では template template パラメータの引数の数を固定しないといけないから、
使う側で専用の template メタ関数を用意しないといけないかもしれない。

146 :デフォルトの名無しさん:2009/09/27(日) 11:10:41
#include <vector>
#include <list>

template <
template <class, class> class Cont,
class T,
template <class> class A = std::allocator
>
struct Table
{
typedef Cont<Cont<T, A<T> >, A<Cont<T, A<T> > > > Type;
};

int main(void)
{
Table<std::vector, int>::Type vec2d;
Table<std::list, int>::Type lst2d;

/* ・・・ */

return 0;
}

templateはよくわからんがこんな感じ?

147 :デフォルトの名無しさん:2009/09/27(日) 12:07:05
>>144です
>>146Thxです
使い方としてはこんな感じでしょうか?
vec2d[10][10];
vec2d[0][0] = 100;
int i = vec2d[0][0];
std::cout << i << std::endl;
でもこれだと、Out of range で落ちてしまいますが?
セマンティクス的に間違ってるんだろうか?

148 :デフォルトの名無しさん:2009/09/27(日) 12:09:05
>>147
デフォルトコンストラクタが走っただけじゃ空なんだから、当然だろ。

149 :デフォルトの名無しさん:2009/09/27(日) 14:19:41
>>144だが
More Effective C++ に載ってたので終了。

150 :デフォルトの名無しさん:2009/09/27(日) 16:23:47
kwsk

151 :デフォルトの名無しさん:2009/09/27(日) 16:55:30
Proxy Classだろjk
でもlistで二次元配列作ると疎行列以外の用途では
やたらと速度が遅くなっていかんな

152 :デフォルトの名無しさん:2009/09/27(日) 17:08:14
二次元配列なんて配列かvectorぐらいでしか使わんような気がするんだが本当に凡化する必要はあるのか

153 :デフォルトの名無しさん:2009/09/27(日) 17:34:46
数値ならvalarray使ったほうがいいし
キーとレコードならmap使ったほうがいいし
生の二次元配列を使うことは少ないな。

154 :デフォルトの名無しさん:2009/09/27(日) 18:13:04
>>144です
最近template 中毒に冒されいて、どうして汎用化できるだろうかと、気になってしょうがないw

155 :デフォルトの名無しさん:2009/09/27(日) 18:16:23
MESTLにもコンテナの汎化は基本的に悪手と書いてあったな
どうしてもやるならアダプタかませてインターフェースを調整しないといかん

156 :デフォルトの名無しさん:2009/09/27(日) 18:22:54
VS2008C++使っています
別のアプリケーション(メモ帳)にsendkeyで入力したいのですが、どうすればいいでしょう?
何とか↓まで調べたのですがこの先が良く分かりません。知ってる方いましたらお願いします。
#include<iostream>
#include <conio.h>
#include <windows.h>

using namespace std;
int main() {
wcout.imbue(std::locale(""));

HWND qqq = FindWindow(
L"[Edit]", // クラス名//1つ目不明点
L"1.txt - メモ帳" // ウィンドウ名
);
SendInput(
1, // 入力イベントの数
LPINPUT pInputs, // 挿入する入力イベントの配列//2つ目不明点
int cbSize // 構造体のサイズ//3つ目不明点
);
return 0;
}

157 :デフォルトの名無しさん:2009/09/27(日) 18:28:10
win環境で、exe側からdll側に関数インターフェースを提供する場合、
exe側で関数をexportして、dll側でGetModuleHandleするのが唯一の方法でしょうか?

158 :デフォルトの名無しさん:2009/09/27(日) 18:32:31
>>156
VC++ なら普通SendMessageやPostMessage が無難だと思うぞ、ぐぐれば事例が沢山あるし

159 :デフォルトの名無しさん:2009/09/27(日) 18:33:38
>>157
試してないけど
Dll側にSetFunc()を作ってExe側から関数ポインタあげたら?

160 :デフォルトの名無しさん:2009/09/27(日) 18:37:36
>>158
ありがとうございます。やってみます

161 :デフォルトの名無しさん:2009/09/28(月) 17:03:06
インクルードするとエラーが出ます。これはどういうことでしょうか・・?
#include <iostream>
#include <string>
#include <fstream>
#include <windef.h>
#include <windows.h>
using namespace std;

int main(){return 0;}

1>------ ビルド開始: プロジェクト: no, 構成: Debug Win32 ------
1>コンパイルしています...
1>a.cpp
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(5545) : error C2146: 構文エラー : ';' が、識別子 'ContextRecord' の前に必要です。
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(5545) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(5545)

162 :デフォルトの名無しさん:2009/09/28(月) 17:03:48
: error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11263) : error C2065: 'PCONTEXT' : 定義されていない識別子です。
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : error C2146: 構文エラー : ')' が、識別子 'ContextRecord' の前に必要です。
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : warning C4229: 旧形式が使用されています : データの修飾子は無視されます。
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : error C2182: 'RtlCaptureContext' : 'void' 型が不適切に使用されています。
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : error C2491: 'RtlCaptureContext' : dllimport データ の定義は許されません。
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(11264) : error C2059: 構文エラー : ')'
1>c:\program files\microsoft sdks\windows\v6.0a\include\winnt.h(12935) : error C3861: '__readfsdword': 識別子が見つかりませんでした
1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(1020) : error C2146: 構文エラー : ';' が、識別子 'LPCONTEXT' の前に必要です。


163 :デフォルトの名無しさん:2009/09/28(月) 17:06:20
1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(1020) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(1020) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(4015) : error C2061: 構文エラー : 識別子 'LPCONTEXT'
1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(4023) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\program files\microsoft sdks\windows\v6.0a\include\winbase.h(4023) : error C2143: 構文エラー : ',' が '*' の前にありません。
1>ビルドログは "file://c:\Documents and Settings\user1\デスクトップ\sdk\Debug\BuildLog.htm" に保存されました。
1>no - エラー 15、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

以上です。分かる方、お願いします。

164 :デフォルトの名無しさん:2009/09/28(月) 17:15:02
環境を書き忘れました
VS2008 C++です。よろしくおねがいします

165 :デフォルトの名無しさん:2009/09/28(月) 17:41:37
ふと思ったのですが
*++p = 'a'; *++p = 'a'; *++p = 'a'; ...

*p++ = 'a'; *p++ = 'a'; *p++ = 'a'; ...
はスピードに違いがありますか。
つまりインクリメントとデクリメントで速度が変わったりしますか。
どちらも1を足すというのはかわりませんが、こっちのほうが効率のよいバイナリが生成されるとか
そういうのがあれば教えてください。

166 :デフォルトの名無しさん:2009/09/28(月) 17:48:52
>>165
環境の提示がないので一般論として考えると、2行目と4行目はインクリメントするタイミングが違うだけ。
6行目はインクリメントとデクリメントの違いだけ。
いずれにしても、有意差が出るほど阿呆なコンパイラも環境もないと思うがね。

167 :デフォルトの名無しさん:2009/09/28(月) 17:50:22
>>165
その例では機能が同等では無くね?

168 :デフォルトの名無しさん:2009/09/28(月) 19:26:44
まあ、一般的な(前置|後置)(インクリメント|デクリメント)の速度の違いだけに
着目してるんじゃないかな。

どうも、前置|後置とインクリメント|デクリメントを混同している節が
見受けられるが……。

169 :デフォルトの名無しさん:2009/09/28(月) 19:48:00
>>161
#include "stdafx.h"
あと氏ね

170 :デフォルトの名無しさん:2009/09/28(月) 20:57:31
まるちスレッドの割り込みって最短でどこまで割り込まれるんですかね?

void func()
{
line1;
line2;
line3;
}

int main(void)
{
line4;
func();
line5;
return 0;
}

上の例で言ったらline4とfunc()の間、func()とline5の間まで割り込まれる?
それともline1、line2、line3の間でも割り込まれる?
1行が終わる間に割り込まれることはある?
a = b = c = d;としたらどこかで割り込まれる可能性はある?

171 :デフォルトの名無しさん:2009/09/28(月) 20:58:35
>>170
いつでもありえます

172 :デフォルトの名無しさん:2009/09/28(月) 21:09:18
> a = b = c = d;としたらどこかで割り込まれる可能性はある?

a = 100; みたいに代入一個でも、アセンブラだと2命令以上になることがあるんで、代入中に割り込まれることもある。


173 :spirit:2009/09/28(月) 21:18:32
>>170 行とか演算子とか無関係に割り込まれる。
すなわちb=a+3;の実行中にaを読んでbに書き込む間でも割り込まれる。
さらにa++;の実行中にも割り込まれる。


174 :デフォルトの名無しさん:2009/09/28(月) 21:20:43
さらにマルチプロセッサだと1命令の実行中でも割り込まれる。


175 :デフォルトの名無しさん:2009/09/28(月) 21:29:10
>>169
ありがとうございました。すいませんでした。

176 :デフォルトの名無しさん:2009/09/28(月) 21:31:02
割り込まれまくりなんですね・・・

そうなるとmutexを取得する関数の途中で割り込まれると
バグの元になりそうな気がするんですけど大丈夫なんでしょうかね?

177 :デフォルトの名無しさん:2009/09/28(月) 21:33:11
>mutexを取得する関数

システムコールなので不具合は起きない

178 :デフォルトの名無しさん:2009/09/28(月) 22:16:05
mutexを含むマルチスレッド同期ライブラリは、「このように呼び出すとここから
ここまでは割り込まれないよ」とかそういう細かい仕様がいちいち決まってるので、
それを調べて使うもの。

179 :デフォルトの名無しさん:2009/09/28(月) 22:56:13
画像の任意回転、画像を表示したあとその上に場所指定して画像を合成etc・・・
をCで作る課題が出てるのですが、助けになるような参考書・サイト等ありませんでしょうか
お願いします

180 :デフォルトの名無しさん:2009/09/28(月) 22:59:41
ググレカス^^

181 :デフォルトの名無しさん:2009/09/28(月) 23:47:07
>>180
このスレの意味がなくなる

182 :デフォルトの名無しさん:2009/09/29(火) 00:33:11
DXライブラリでおk

183 :デフォルトの名無しさん:2009/09/29(火) 01:49:49
DXライブラリが手っ取り早いな

184 :デフォルトの名無しさん:2009/09/29(火) 01:56:22
DXライブラリ使えばいいと思う

185 :デフォルトの名無しさん:2009/09/29(火) 02:01:26
DXライブラリがいいね

186 :デフォルトの名無しさん:2009/09/29(火) 05:44:20
>>166
ありがとうございます。違いはないとのことで安心しました。

>>168
>どうも、前置|後置とインクリメント|デクリメントを混同している節が
>見受けられるが……。
その通りでしたorz 無知をさらして申し訳ない


187 :デフォルトの名無しさん:2009/09/29(火) 10:25:22
>>186
プリミティブ型ならいいけど、クラスに対する前置後置はだいぶ効率に差ができるから注意しよう

188 :デフォルトの名無しさん:2009/09/29(火) 10:54:27
×だいぶ効率に差ができるから
○効率に差ができる場合もあるから


189 :デフォルトの名無しさん:2009/09/29(火) 11:59:47
別人だがkwsk

190 :デフォルトの名無しさん:2009/09/29(火) 12:18:04
詳しくも何も、後置は原理的に重くなりやすいのが一目瞭然じゃないか?
クラスじゃないなら、見た目の好みとかで後置にしても最適化で前置に置換されることが
期待できるけど、統一感を求めるなら、必要が無い限りは前置で統一した方がいいだろうね。
クラスの時は勝手に最適化で前置に変えたりできないから。

191 :デフォルトの名無しさん:2009/09/29(火) 12:19:41
別にクラスじゃなくて構造体でも演算子オーバーロードしていれば同じことだけどね。

192 :デフォルトの名無しさん:2009/09/29(火) 12:28:00
クラスと構造体は本質的には同じものだよ

193 :デフォルトの名無しさん:2009/09/29(火) 12:29:03
クラスと構造体はほぼ同じだからいちいち説明する必要も無いと思うが

194 :デフォルトの名無しさん:2009/09/29(火) 12:29:48
かぶったし

195 :デフォルトの名無しさん:2009/09/29(火) 12:31:03
共用体とか持ち出してくればまだ芸があったかも。
でも余計うざいだけか。

196 :デフォルトの名無しさん:2009/09/29(火) 12:36:34
>>189
むかしむかし、後置だとインクリメントする前の状態をどこかに保存しておかないといけないのであったとさ

197 :デフォルトの名無しさん:2009/09/29(火) 15:34:40
で?

198 :デフォルトの名無しさん:2009/09/29(火) 16:41:01
>>196
えっ? 今は違うの?

199 :デフォルトの名無しさん:2009/09/29(火) 17:34:08
今は技術が発展しているのでそんな事はありません
科学万能の時代が到来したのです

200 :デフォルトの名無しさん:2009/09/29(火) 17:46:33
>>198
可哀想な人…

201 :デフォルトの名無しさん:2009/09/29(火) 18:11:48
it_a = it_b++
とかやったらちょっと面倒なことになる。

202 :デフォルトの名無しさん:2009/09/29(火) 18:50:59
>>199
今はどうなってんのさ。

>>201
どう面倒なことになるのさ。

203 :デフォルトの名無しさん:2009/09/29(火) 19:27:56
自分で調べろw

204 :デフォルトの名無しさん:2009/09/29(火) 19:34:50
ググったけど、出てこない。

205 :デフォルトの名無しさん:2009/09/29(火) 20:44:44
ググレカス。
http://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

206 :デフォルトの名無しさん:2009/09/29(火) 21:29:15
>>196の言いたいことが分かったかも。
後置演算子のオーバーロード方法が無いとcallerが保存しなきゃならなかった、ってことが
言いたいんじゃないのかな。
ところが、普通に考えたらcallerが保存しなくてもcalleeでは保存するコードを書くことに
なるから、端から見ると>>196が何言ってんだか分からない人状態に。
一方>>196は、intを引数にすれば後置になるの知ってるの俺だけかよプゲラッチョ、とか
一人でいい気分になっていた、とか。

207 :デフォルトの名無しさん:2009/09/29(火) 21:32:38
単にreturnの後に処理を入れられないという
言語制約上の問題でしかないね

208 :デフォルトの名無しさん:2009/09/29(火) 23:03:02
>>206
何が言いたいのか分からん。
最適化されない限り、前置の方がコストかかるのは当然で。

>>196のだめなところはツッコミがあるように、むかしむかし、というのを付けてしまったとこ

209 :208:2009/09/29(火) 23:03:59
あああ。前置じゃなくて後置ね。

210 :198 202:2009/09/30(水) 00:31:56
なんだ、やはり、「むかしむかし」が余計か。豪快に釣られたぜw

前置/後置のオーバーロード時の注意点は知っていたが、規格が変わったのかと焦ったぜ。

211 :デフォルトの名無しさん:2009/09/30(水) 02:13:24
誰か円形のHPゲージの描画の方法を教えてくれないか・・・?
細い棒の画像を何回かループさせて徐々に角度をつけて
描画しようと思ってるんだがいまいちうまくいかん。

212 :デフォルトの名無しさん:2009/09/30(水) 02:33:40
pie関数でいけるんでないの。

213 :デフォルトの名無しさん:2009/09/30(水) 02:40:12
pie関数って何ですか?

214 :デフォルトの名無しさん:2009/09/30(水) 03:47:24
塗りつぶし円弧を描画する関数

215 :デフォルトの名無しさん:2009/09/30(水) 03:59:02
それがわからないから聞いているのですが

216 :デフォルトの名無しさん:2009/09/30(水) 04:06:59
え?塗りつぶし円弧が分からないのか?おうぎ形のことだよ。
それで円形のHPゲージの描画ができるとは思えないといってる?
もうちょっと具体的に書いてくれないか

217 :デフォルトの名無しさん:2009/09/30(水) 04:08:44
いまいちうまくいかん程度ならもうちょっとがんばればできるよ
その方向でがんばれ

218 :デフォルトの名無しさん:2009/09/30(水) 04:28:25
その塗りつぶしの円弧の描画のソースを
C++暦半年の俺がわかるように教えるんだ!

219 :デフォルトの名無しさん:2009/09/30(水) 04:46:25
Intelコンパイラでコンパイルする際に、#pragma ivdepを使っているのですが、
他のコンパイラでコンパイルした際に、不明なプラグマと警告が出てしまいます。
OpenMPだと、
#ifdef _OPENMP
#pragma omp parallel for
#endif
の様に書いてやれば、対応していないコンパイラで警告を出さないようにできますが、
上記のような場合どのようにしたらよいのでしょうか?


220 :デフォルトの名無しさん:2009/09/30(水) 04:56:52
警告抑制


221 :デフォルトの名無しさん:2009/09/30(水) 05:42:50
http://www.google.co.jp/search?q=intel+%83R%83%93%83p%83C%83%89+%92%E8%8B%60%8D%CF%82%DD+define

222 :デフォルトの名無しさん:2009/09/30(水) 05:44:14


223 :デフォルトの名無しさん:2009/09/30(水) 06:11:21
>>218
環境

>>219
intelコンパイラであるかどうかをifdefで判断すればよいということ。

224 :(マルチポスト):2009/09/30(水) 06:15:36
的外れは質問かもしれませんが
C++で作られたローカルのプログラムのWinsockからPHPのサーバのプログラムと通信することはできますか?

225 :デフォルトの名無しさん:2009/09/30(水) 06:43:29
>>224
PHPのサーバと言うのは何のこと?

226 :デフォルトの名無しさん:2009/09/30(水) 06:45:40
PHPで書こうと思ってるサーバープログラムです

227 :デフォルトの名無しさん:2009/09/30(水) 07:17:46
なんで出来ないと思ったん?

228 :デフォルトの名無しさん:2009/09/30(水) 08:05:52
>>215
WindowsAPIとかGDIとかでググレ

229 :デフォルトの名無しさん:2009/09/30(水) 08:31:26
>>215
ぶっちゃけるとアニメーションモデル読み込んで再生して終り
中身はHP0〜100%(t=0〜1)までのアニメーションでデザイナに作っておいてもらって
プログラマはHPに応じてアニメーションを進めるだけ

230 :デフォルトの名無しさん:2009/09/30(水) 08:37:55
>>226
PHPでサーバープログラム?
Webサーバに置くスクリプトじゃなくて?

231 :デフォルトの名無しさん: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を提示していただけるだけでも構いません
より適切なスレがあれば誘導して頂けるのもありがたいです
なにか情報をお持ちの方、お教え願えないでしょうか

232 :デフォルトの名無しさん:2009/09/30(水) 14:25:41
質問です。

boost::spirit です。


rule<> expr = uint_p | real_p;
parse_info<> pi = parse("10.0", expr);

これで、pi.full == true とならないのですが、どうしてでしょうか。


Win7x64 VC++9 boost1.40.0

233 :デフォルトの名無しさん:2009/09/30(水) 15:10:18
>>231
改造とかクラックとかそういうスレないの?

234 :デフォルトの名無しさん:2009/09/30(水) 18:09:05
>>232
real_pとint_pを入れ換えて味噌

235 :232:2009/09/30(水) 18:42:37
>>234
ありがとうございます。
もともと uint を先に持ってきたのは、大きな整数を入力すると、double の精度を
超えた値が丸められてしまうのを防ぎたかったんです。

コードを書き直しました。

bool is_real_value;
double real_value;
unsigned __int64 uint_value;

void IntAction(unsigned __int64 v) { is_real_value = false; uint_value = v; }
void RealAction(double v) { is_real_value = true; real_value = v; }

int main()
{
rule<> expr = (uint_parser<unsigned __int64>()[&IntAction] | real_p[&RealAction]);

parse_info<> pi;

pi = parse("1.0", expr);
ASSERT(pi.full); ASSERT(is_real_value); ASSERT(real_value == 1.0);

pi = parse("12345678901234567890", expr);
ASSERT(pi.full); ASSERT(!is_real_value); ASSERT(uint_value == 12345678901234567890);

pi = parse("123", expr);
ASSERT(pi.full); ASSERT(!is_real_value); ASSERT(uint_value == 123);
}

このコードのままだと、"1.0" の解釈で失敗し、uint_p と real_p を逆にすると、すべて
real として処理されてしまい、ASSERTで止まりまくります。何がおかしいんでしょうか。

236 :デフォルトの名無しさん:2009/09/30(水) 19:29:42
http://draconux.free.fr/download/os-dev/linux0.01/linux-0.01-rm-3.x/linux-0.01-rm-3.3.tgz
このソースコードをmakeしたのですが、
ld -s -x -M -Ttext 0 -e startup_32 boot/head.o init/main.o \
kernel/kernel.o mm/mm.o fs/fs.o \
lib/lib.a \
-o tools/system > System.map
kernel/kernel.o: In function `scrup':
console.c:(.text+0x1ed6): undefined reference to `columns'
console.c:(.text+0x1fad): undefined reference to `columns'
kernel/kernel.o: In function `scrdown':
console.c:(.text+0x2023): undefined reference to `columns'
make: *** [tools/system] Error 1
というエラーが出てコンパイル出来ません。
このエラーを解決したいのですが、どのようにすればいいでしょうか?

237 :234:2009/09/30(水) 19:39:19
>>235
最後まで到達できないのは、rule<> exper=uint_p|real_p;のuint_pでパースが10で成功し、exprが成立するため。そこでパースが終わってしまう。
防ぐには以下の方法がある。
strict_real_pを使うと小数点が無い実数にはマッチしなくなる。
longset_d[P]...を使うと最大長マッチが採用される。
eps_p(P)を使って区切りまでパースしたかを確認できる。


238 :232:2009/09/30(水) 19:51:54
>>237
strict_real_p | uint_p で出来ました。
大変助かりました。

239 :デフォルトの名無しさん:2009/09/30(水) 20:00:38
>>236ですが、
開発環境は、Ubuntu,gcc4.1です。


240 :デフォルトの名無しさん:2009/09/30(水) 20:19:42
>>239
いや、だから columns について調べるべきでしょう。

241 :デフォルトの名無しさん:2009/09/30(水) 20:26:26
>>240
調べたのですが、解らなかったのでこちらに来ました。前のスレのほうで環境依存スレに行ったほうがいいと言われたというのも一つです。

console.c内にて
#define COLUMNS 80
static unsigned long lines=LINES,columns=COLUMNS;

として定義及び宣言があり、どうしてcolumns変数が出てくるのかが全くわからないのです。


242 :デフォルトの名無しさん:2009/09/30(水) 21:17:02
TCHARからwchar_t *に変換(キャスト)するにはどうしたらよいですか?

243 :デフォルトの名無しさん:2009/09/30(水) 21:25:31
なぜそういうことする必要があるか知らんが…

TCHAR ch;
// ...
wchar_t *p = (wchar_t *)ch;

244 :デフォルトの名無しさん:2009/09/30(水) 21:28:31
>>243
あ、そのままでよかったんですね^^;
センキュー

245 :デフォルトの名無しさん:2009/09/30(水) 21:36:05
>>244
だめだよ。

TCHAR* ch;
// ...
wchar_t *p = (wchar_t *)ch;

なら、いい。

あと、最近のVCは_UNICODEがデフォになってるけど、
古いやつだったら、_MBCSがデフォだから、もしそうだったら、
単純にはキャストできない。

246 :デフォルトの名無しさん:2009/09/30(水) 22:31:17
static unsigned long lines=LINES;
static unsigned long columns=COLUMNS;

247 :デフォルトの名無しさん:2009/09/30(水) 23:37:31
デスクトップの画像はどういう風に取得すればいいんでしょうか?
事務仕事をほぼ全自動でできるようなソフトを作ってみたいと思っているのですが、
とっかかりがつかめません
bitmap形式などは何となくわかったのですが、肝心の画像自体の取得方法が分かりません
APIを使うような感じはするのですが、見つかりませんでした
分かる方、教えてください。お願いします

248 :デフォルトの名無しさん:2009/09/30(水) 23:40:13
>>247
uwsc ってソフトがあるよ

249 :デフォルトの名無しさん:2009/09/30(水) 23:41:52
>>247
GetDC(HWND hWnd);
で、0を渡せば、画面のデバイスコンテキストが取れたような記憶が。

250 :デフォルトの名無しさん:2009/09/30(水) 23:45:09
>>248>>249
ありがとうございます
既にあったのですね、トホホ

なんだか悔しいので、とりあえず作るだけ作ってみることにします

251 :デフォルトの名無しさん:2009/10/01(木) 09:37:37
別に止めはしないが、とても「事務仕事をほぼ全自動でできるようなソフト」を作ろうとする人間の台詞じゃないな。

252 :デフォルトの名無しさん:2009/10/01(木) 09:41:07
そもそも、「デスクトップの画像」と言う当初の質問が自動化とどう関係しているのだろうか

253 :デフォルトの名無しさん:2009/10/01(木) 10:05:49
スクリーンショットを使う事務作業なんていくらでもあると思うけど

254 :232:2009/10/01(木) 12:57:19
boost::spirit でまた躓いてしまいました。


parse_info<> pi;

pi = parse("12.", real_p); // 12. ドットに注意
ASSERT(pi.full);
ASSERT(pi.length == 3); // 止まる。実際は 2 が入っている。

pi = parse("12.", longest_d[real_p | int_p]);
ASSERT(pi.full); // 止まる


デバッガで追うと、確かにドットの後に数値が無ければ、length はインクリメントされてないんですが、
scanner の first (scan.first) はドット文字の次を指したまま return しています。

length と 実際に進めた幅とが一致しない状態というのは許されるんでしょうか?また、上の二つの
parse で、下は失敗するのはおかしいと思うのですが、勘違いでしょうか?

Win7x64 VC++9 boost1.40.0

255 :デフォルトの名無しさん:2009/10/01(木) 14:53:49
>>246
申訳ないですが、その書き方ではエラーを解決出来なかったので
グローバル変数として宣言しましたところ、一応はコンパイルが出来ました。

256 :デフォルトの名無しさん:2009/10/01(木) 19:44:19
環境はMac OS X 10.5 & Xcode 3.1 (gcc 4.0)です

PreProcessor Macros でマクロを設定してコンパイルはできたのですが
実行すると#ifdef〜#endifでかこった部分が実行されていません
どうすればよいのでしょうか?

257 :デフォルトの名無しさん:2009/10/01(木) 19:51:09
>>256
#ifdefの行をくわしく

258 :デフォルトの名無しさん:2009/10/01(木) 23:39:04
>>256
ifdefで指定してるものがdefされていなかったんでしょう

259 :デフォルトの名無しさん:2009/10/02(金) 00:21:58
unary_functionやbinary_functionってなんのためにどうやって使うんでしょうか?

260 :デフォルトの名無しさん:2009/10/02(金) 00:36:59
VS2008SP1なのですが、取りあえずboostを試してみようと思い、
#include <boost/asio.hpp>
をソースに書いてみただけでコンパイル時間が1秒→15秒になってしまったのですが、
こういうものなのでしょうか?

261 :デフォルトの名無しさん:2009/10/02(金) 02:23:05
>>260
ありえん話ではないです。
というかメモリ少ないとかじゃないの?

262 :デフォルトの名無しさん:2009/10/02(金) 02:26:31
または、ソースごとに毎回includeされててpchも使ってないとか。
もちろん、メモリ不足がまず疑われるが。

VS使うならpchは覚えた方がいいな。使ってないなら、だけど。
でかいプロジェクトでBoostバリバリ使ってたりすると、コンパイル時間が普通に
1/20以下くらいになっても不思議は無い。

263 :スレ違い、でしょうか……:2009/10/02(金) 03:53:56
巧く言えないんですが、昔、VC6.0とDirectX7を齧って終わっただけのプログラミングを、今更始めようと思いました。
今の状況は

・持ってるのは、Visual Studio 2005 Standard Edition
・作りたいのは、Windowsのゲーム
・使いたい言語は、C/C++
・使いたいライブラリは、DirectX 8.x、もしくは、DirectX 9.x

こんな具合で

・Visual Studio 2005 に関する初心者向けの情報
・DirectX 8.x or 9.x に関する初心者向けの情報

この二つに関する情報が欲しいと考えています。
本であれば本で、webであればwebで、どんなものがいいのか、教えて頂ければ幸いです。
どうか、よろしくお願いします。

264 :デフォルトの名無しさん:2009/10/02(金) 04:35:08
>>259 ググレカス

265 :デフォルトの名無しさん:2009/10/02(金) 04:41:20
>>263
MSDN

266 :デフォルトの名無しさん:2009/10/02(金) 07:05:42
>>263
VS2008ExpressEditionに移行しちゃってもいいんじゃね、タダだし

267 :デフォルトの名無しさん:2009/10/02(金) 08:53:42
>>254 .で終わると確かにパースの終了位置が変になるね。
是非boostスレを賑わしに来てください。
http://pc12.2ch.net/test/read.cgi/tech/1251446016


268 :デフォルトの名無しさん:2009/10/02(金) 16:37:32
>>261-262
メモリの空きはまだまだあるのですが、
includeしてるソースを少し弄ってコンパイルすると、また10秒とかマタされます。
pchを使うと確かに早くなりますが、pchを使えない環境だと毎回こんなに待たされているんですかね?
これはヘッダーへ実装も書いてしまうことの、弊害?と考えても間違いないでしょうか?

269 :デフォルトの名無しさん:2009/10/02(金) 17:01:42
そのままではコンパイルが遅いからpchが発明されたとは考えられないかね?

270 :デフォルトの名無しさん:2009/10/02(金) 17:28:59
メタプログラムのライブラリだからそうなるのは仕方ないな

271 :デフォルトの名無しさん:2009/10/02(金) 19:08:17
VC++で簡単なwebクライアントを書いたんだけど、うまく動かない。
誰か教えて

http://kissho.xii.jp/1/src/1jyou92844.cpp

これを
MyUtil->GetHttpContent( &content_data, &content_size, "yutori7.2ch.net", "/news4vip/dat/1254469638.dat", 1024, 5 );
で呼ぶと、116行目の
select_result = select( 0, &tmp_fd_set, NULL, NULL, &timeout_tv ); // タイムアウト付き待機
でタイムアウトする。

試しに
MyUtil->GetHttpContent( &content_data, &content_size, "jane.s28.xrea.com", "/bbs/dat/1249509078.dat", 1024, 5 );
で呼ぶと、即座にコンテントが返る。


272 :271:2009/10/02(金) 19:09:08
vipのスレをリクエストした時の送出ヘッダをtelnetで

# telnet yutori7.2ch.net 80
GET /news4vip/dat/1254469638.dat HTTP/1.0
Host: yutori7.2ch.net
User-Agent: Monazilla/1.00
Connection: close

として送出しても、当然即座にコンテントが返る。
なんとなくvipのケースではリクエストが完了してない気がするけど、どこがまずいのかよく分からない・・・('A`)


273 :デフォルトの名無しさん:2009/10/02(金) 19:10:13
普通にコンパイルに1時間以上かかる状況では何秒増減しようと大して変わらん

274 :デフォルトの名無しさん:2009/10/02(金) 19:25:09
>>268 boostのヘッダーをインクルードしただけではそんなにまたされない。
ヘッダーに実装を書くとテンプレートのインスタンス化がされる場合がある、そのヘッダーをインクルード
しただけでコンパイル時間がのびる。無用なインスタンス化がされないようにヘッダーに実装は書かないほうが良いよ。
テンプレートをtypedefしただけでもコンパイル時間は延びる。


275 :デフォルトの名無しさん:2009/10/02(金) 19:42:30
自分でWeb鯖たてて実験するのが楽なんでない?

276 :232:2009/10/02(金) 20:14:08
>>267
やっぱ変ですよね?
ありがとうございました。

277 :デフォルトの名無しさん:2009/10/02(金) 20:53:23
>254のは初出だと思うけど、これ以外にもSpiritは結構バグあるみたいよ。Treeとか。
V2に期待ってことかね。

278 :デフォルトの名無しさん:2009/10/02(金) 21:03:28
>>269-270
やはりこういうものなのですね
>>274
asioの場合は空のcppへinclude書いただけで10秒近くになってしまいました。
っと今また計ってみたら8秒だた・・・

それでも私のような、書き直してはビルドの初心者にはきついですね。
大人しくpchを使っていこうと思います。
ありがとうございました。

279 :デフォルトの名無しさん:2009/10/02(金) 23:20:55
うわ、asio重たいな。こんなのもあるんだな。
boostは無条件にpchに放り込んでたから気づかなかった。

280 :デフォルトの名無しさん:2009/10/03(土) 00:09:21
C/C++に直接は関係ないですが質問させてください。

1の補数、2の補数という言葉がありますが、
なぜこのような名前になっているのか教えてください。
(意味は知っています)

1、2 という数字に意味があるのでしょうか?


281 :デフォルトの名無しさん:2009/10/03(土) 00:34:29
>>280
補数の意味が分かってないじゃん

282 :デフォルトの名無しさん:2009/10/03(土) 03:12:32
まったくだ。
2の補数と単に言った場合、それが2種類あることも分かっていないんだろう

283 :デフォルトの名無しさん:2009/10/03(土) 08:17:37
3進数における2の補数のことは考えなくてもいいと思うけどな。

284 :デフォルトの名無しさん:2009/10/03(土) 09:46:35
>>280
自己解決しました。

1の補数
各桁ごとに1の補数をとる

2の補数
2^nの補数をとる

1と2の意味が全く異なる上、
2じゃなくて2^nのことだし。
酷い用語が万延したものだ。


285 :デフォルトの名無しさん:2009/10/03(土) 09:51:39
文字列についてなんですが
文字列の最後の文字を削除する場合ってどうすればいいんですか?
それっぽい関数が見当たらなかったんですが、皆さんどうやって処理するんでしょうか

286 :デフォルトの名無しさん:2009/10/03(土) 09:56:04
void cut(char *str){
 str[strlen(str)-1] = '\0';
}


287 :デフォルトの名無しさん:2009/10/03(土) 09:56:48
あら、縮まってなかった。


288 :デフォルトの名無しさん:2009/10/03(土) 09:58:49
>>286
ありがとうございます。
文字列の方は、最初から[10]と決めているんですが、この場合動的に管理しないと無理ですか?

289 :デフォルトの名無しさん:2009/10/03(土) 11:50:42
>>288
ポインタそのものは変化しないので静的配列でもOK


290 :271:2009/10/03(土) 12:18:05
自己解決しました・・・(´・ω・`)

291 :デフォルトの名無しさん:2009/10/03(土) 12:52:09
自家発電しました(´・ω・`)

292 :デフォルトの名無しさん:2009/10/03(土) 13:11:49
自殺しました(´・ω・`)

293 :デフォルトの名無しさん:2009/10/03(土) 14:29:41
自乗しました

294 :デフォルトの名無しさん:2009/10/03(土) 15:10:29
自損しました(´・ω・`)

295 :デフォルトの名無しさん:2009/10/03(土) 16:31:37
struct hoge {
inline int operator [] (int i) {
return a[i];
}
int a[10];
}

↑のinlineって生の配列アクセスまで最適化されますか?

296 :デフォルトの名無しさん:2009/10/03(土) 17:02:32
コンパイラ次第だが期待していい。

297 :デフォルトの名無しさん:2009/10/03(土) 17:28:55
環境VC++ 2008 Expressです。

配列 
*points1 = メモリ確保した。
*points2 = メモリ確保した。
for ( i = 0; i < numPairPoints ; i ++) {
points1 から始まる配列にxとyを代入する。
points2 から始まる配列にxとyを代入する。
}

コード自体はとても簡単な処理なのですが、
デバッグしていると、i がある程度(デバック実行の度常に同じiの値)増えた後に、
何故かpoints2(のみ)の内容が書き換えられ、メモリアクセスエラーが起こしています。
こういうことが起こる場合にはどこでなんとかすべきなんでしょう?
points1の処理は通ってpoints2が途中でだめなのでコード外の要因だと思うのですが・・・

よろしくお願いします。

298 :デフォルトの名無しさん:2009/10/03(土) 17:34:10
>>297
points1 の型は何?

299 :デフォルトの名無しさん:2009/10/03(土) 17:37:46
opencvなので簡略化しました。
書いてるコードはこんなんです。

CvMat* points1;
CvMat* points2;
points1 = cvCreateMat(1, numPairPoints, CV_32FC2);
points2 = cvCreateMat(1, numPairPoints, CV_32FC2);
for ( i = 0; i < numPairPoints ; i ++) {
CvSURFPoint* r1 = (CvSURFPoint*)cvGetSeqElem( objectKeypoints, ptpairs[i*2] );
CvSURFPoint* r2 = (CvSURFPoint*)cvGetSeqElem( imageKeypoints, ptpairs[i*2+1] );
//略
points1->data.db[i*2] = r1x;
points1->data.db[i*2+1] = r1y;
points2->data.db[i*2+1] = r2y;
points2->data.db[i*2] = r2x;
}

300 :デフォルトの名無しさん:2009/10/03(土) 18:03:49
>>284
おー昔のコンピュータの数値は整数ではなく
[0..1) の固定小数点数を表していた
と言えば後は分かるだろ


301 :デフォルトの名無しさん:2009/10/03(土) 19:26:00
>>300
[0, 1) のことだったら
2の補数は1の補数と呼ばれなくてはおかしい。

[0, 2) の固定小数点数だとしても、
1の補数の方は各桁の1の補数であることは変わらない。

いずれにしろおかしい。


302 :デフォルトの名無しさん:2009/10/03(土) 20:15:38
C言語勉強し始めたド素人ですが質問です
エディタにVisual c++2008使ってるんですが
ファイルを作成する場合、まずはプロジェクトの作成→ソースファイルの作成らしいですが
1つのプロジェクトフォルダに別々のソースファイルを保存することはできないんですか?

303 :デフォルトの名無しさん:2009/10/03(土) 20:21:36
>>299
opencvと言うのは知らんが、
単純に確保している領域をオーバーしてるんじゃないの?

304 :デフォルトの名無しさん:2009/10/03(土) 20:30:35
>>302
メニューのプロジェクトから、新規項目の追加とか既存項目の追加とか。

305 :デフォルトの名無しさん:2009/10/03(土) 20:37:47
>>304
新規項目で別のソースファイルを作れるんですが
ただ、コンパイルするときビルドエラーとかになるんですよね

306 :デフォルトの名無しさん:2009/10/03(土) 20:43:21
>>302 >別々のソースファイルを
main()を2つ書いてるとか?
もしそうだったら、プロジェクトの追加をするんだ。

307 :デフォルトの名無しさん:2009/10/03(土) 20:44:49
>>305
エラーを貼ってみて。

308 :デフォルトの名無しさん:2009/10/03(土) 20:55:40
プロジェクト上から見えてるmain文が一つだったらいくつソースファイルがあってもおk

309 :デフォルトの名無しさん:2009/10/03(土) 21:35:36
>>299
何の関数か知らんけど、cvCreateMatの第1引数と第2引数を入れ替えてみそ


310 :デフォルトの名無しさん:2009/10/03(土) 22:17:49
>>299
OpenCV の使い方に関する話になりそうなんで
 【Intel】OpenCV総合スレ【画像処理】2
 http://pc12.2ch.net/test/read.cgi/tech/1230511656/
こっちで聞いてみたら?

ぱっとみ cvCreateMat の 第3引数はそれでよいっぽい
第1引数 第2引数 の関係と その後の操作の次元があっているのかわからん
(NxM なのか MxN なのか

311 :デフォルトの名無しさん:2009/10/03(土) 22:42:45
構造体というものは、配列の範疇に入るんでしょうか?
メモリだけ見れば似たような感じなのですが

312 :デフォルトの名無しさん:2009/10/03(土) 22:45:10
"構造体"の"配列"もあるからどうかな...

313 :デフォルトの名無しさん:2009/10/03(土) 22:48:54
普通は範疇には入れないよな。
文脈によるけど。

314 :デフォルトの名無しさん:2009/10/03(土) 22:50:42
どうせ全部ビット列だと割り切れば同じ扱いをしても違和感ないか。
面白い視点だな。

315 :デフォルトの名無しさん:2009/10/03(土) 22:50:53
構造体はメンバ間でパディングかかるけど
配列は隙間無で詰めないか?

316 :311:2009/10/03(土) 22:55:02
どこで見たのかは忘れたのですが、構造体を配列と書いてるところがあったので気になって質問させていただきました
もしかしたらサイト管理者の間違いかもしれないので、あまり気にしない様にします。ありがとうございました。


317 :デフォルトの名無しさん:2009/10/03(土) 22:57:44
パディングパディング言うけどさ
その空いた領域にほかのデータが書き込まれる可能性ってあるの?


318 :デフォルトの名無しさん:2009/10/03(土) 23:00:33
ない


319 :デフォルトの名無しさん:2009/10/03(土) 23:23:04
ないあるよ

320 :デフォルトの名無しさん:2009/10/03(土) 23:44:19
パディングって何だと思ってるの? >317
気にしなければならないのは1構造体のサイズ=メンバの合計のサイズにしたければパディング無しにしなければならないって話なんだよ

321 :デフォルトの名無しさん:2009/10/03(土) 23:44:37
「ほかのデータ」の意味がわからんない

322 :デフォルトの名無しさん:2009/10/04(日) 00:05:02
うろ覚えだけど構造体は4byteの倍数に合わせるようにうめてるとか聞いたような聞いてないような




323 :デフォルトの名無しさん:2009/10/04(日) 00:15:43
アラインメントね
あと4バイトとは限らない


324 :デフォルトの名無しさん:2009/10/04(日) 00:21:25
別のスレで質問したんですが人いなさそうなのでこっちで質問させてください。
visual studio 2008で
それぞれ別のディレクトリに保存した同一ファイル名のファイルを
プロジェクトに追加してビルドすると
未解決の外部シンボルというエラーがでます。
どうしたら同一ファイル名のファイルをビルドできますか?

325 :デフォルトの名無しさん:2009/10/04(日) 00:24:18
ファイル名を変える

326 :デフォルトの名無しさん:2009/10/04(日) 00:26:08
>>325
買った参考書に入っていたプロジェクトでは
同じファイル名でビルドできたので
出来ればその設定方法を知りたいんですが

327 :デフォルトの名無しさん:2009/10/04(日) 00:28:53
プロジェクトをわけ、1ソリューションにまとめてみては?

328 :デフォルトの名無しさん:2009/10/04(日) 00:29:16
>>326
こっちいくといいよ

Visual Studio 2008 Part 18
http://pc12.2ch.net/test/read.cgi/tech/1251622158/

329 :デフォルトの名無しさん:2009/10/04(日) 00:32:49
他の原因でもそのエラーは出るからよくわからんけど
ファイル名が同じだからコンパイル後の出力ファイルが上書きされたって事?
だったらファイルのプロパティで->出力ファイル->オブジェクトファイル名を設定すればどうにかなりそうだけど

330 :デフォルトの名無しさん:2009/10/04(日) 00:33:53
そもそもクラス名がかぶってるんじゃねの?

331 :デフォルトの名無しさん:2009/10/04(日) 00:36:45
>>324
そのファイルへのパスちゃんと通ってるかィ?

332 :デフォルトの名無しさん:2009/10/04(日) 00:38:33
>>329
ファイル名を指定したら出来ましたありがとうございます。

>>330
クラス名は被ってますがnamespaceで区別してます

>>331
通ってます


333 :デフォルトの名無しさん:2009/10/04(日) 06:25:57
VC2008でoggライブラリ使ってて遭遇したんですが、
CのライブラリをC++で使ってるときに

if(true返す処理) {
throw
}
Cライブラリの関数呼び出し

というような状態で、例外が投げられませんでした。
C関数とthrowをそれぞれ別な関数に分割したら
思ったとおりに動いたのですが、もしかしてC関数と
例外って一緒に使っちゃダメなんでしょうか?

334 :デフォルトの名無しさん:2009/10/04(日) 09:57:20
例外が投げられないってどういう状態?
C言語部分を通過するthrowは駄目だった気がする。
例えばC言語の関数に渡したコールバックで例外投げた場合とか。

void c_func(void (*callback)()) { callback(); }

void cpp_callback() { throw ○; }
void cpp_func() { c_func(cpp_callback); }

335 :デフォルトの名無しさん:2009/10/04(日) 10:15:01
>>333
ライブラリ呼び出しで、そのような制限は聴いたこと無いな。sinとか普通に使ってるし。
その問題が起きる最小のコードを提示したほうが回答が得られやすいよ


336 :デフォルトの名無しさん:2009/10/04(日) 10:26:21
>>334
もうちょっと具体的に書くと、

if(!dir.CheckPath(fileName_)) { //ファイルパスが有効ならtrueを返す関数
 throw "無効なパス";
}
//oggライブライリのファイル開く関数
if( ov_fopen(const_cast<char*>(fileName_), Dst_) ) return false;
return true;

ファルパスが無効なら例外投げるはずですが、投げられずに
ov_fopenに行ってしまい、関数内でアクセス違反起こしてエラーになります。
パスチェックとov_fopenを別々な関数に分けて書くと、思ったとおりの動作をする
ので、処理自体には問題は無いと思います。

337 :デフォルトの名無しさん:2009/10/04(日) 10:37:35
>>336
ov_fopenをelse側に書くとどうなるの?

338 :デフォルトの名無しさん:2009/10/04(日) 10:59:02
例外仕様を避けるほうがいいのは何で?

・例外仕様を使わないとクライアントがメソッドの投げうる例外を調べるときにドキュメントを読むかソースを追跡するぐらいしかできない
・例外仕様で縛らないと実装の変更の際に投げる例外が増減する可能性もあるのでクライアントが実装まで気にしなければならない
と考えると例外使用を使わないのはよくないような気がするんですが・・・
templateと相性が悪いのは分かりますが、非テンプレート限定なら問題ないはずです

339 :336:2009/10/04(日) 11:18:50
>>337
試す前にリコンパイルしてたら症状が出なくなりました。
すっきりしないですが・・・

340 :デフォルトの名無しさん:2009/10/04(日) 12:44:44
>>338
少なくとも、例外仕様を批判する立場からすると後者は逆。

実装の変更の際に投げる例外が増減する
→例外仕様も変更する→それを呼び出す元も修正しないといけない
or →例外仕様を変更しない→例外仕様が実態と乖離したものになる

あと、C++の例外仕様は実行時にコストが増えるだけでコンパイル時には何もしてくれないのもマイナス。
(さらに、実行時違反していることが分かっても、基本は即座に落とされるだけで何もできない)

341 :デフォルトの名無しさん:2009/10/04(日) 13:05:52
例外仕様は後付けの仕様なので、いろいろと仕方ない。と言うより、元々必要ない気も。

342 :デフォルトの名無しさん:2009/10/04(日) 13:10:30
強制終了の為だけに例外を使う分には問題ない?

343 :デフォルトの名無しさん:2009/10/04(日) 13:23:39
Java以外にチェック例外を採用した言語はない気がする。

344 :デフォルトの名無しさん:2009/10/04(日) 13:34:42
C++の例外仕様って、コンパイル時じゃなくて、実行時にエラーになるんだろ?
あんまりうれしくないよな。

345 :デフォルトの名無しさん:2009/10/04(日) 14:45:38
>>338 例外仕様は手間をかけてもメリットがなかった。
ただ、throw()はメリットがあると思う。


346 :デフォルトの名無しさん: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...

347 :デフォルトの名無しさん:2009/10/04(日) 17:12:21
何です、これ?

348 :デフォルトの名無しさん:2009/10/04(日) 17:41:00
C++BuilderとVisualC++は
プロパティ使えるんだよな

349 :デフォルトの名無しさん:2009/10/04(日) 18:24:00
テンプレート関数の引数にポインタを渡して、
テンプレート関数の内部ではポインタの内容が書き換わっているのですが、
関数から戻ってくるとポインタの内容が元に戻ってしまいます。
何故でしょうか?

350 :デフォルトの名無しさん:2009/10/04(日) 18:39:31
>>348
C++の仕様には含まれてなくて、各処理系の言語拡張だよね?
だから使わないほうがいいのかな?

351 :デフォルトの名無しさん:2009/10/04(日) 18:49:34
>>349
テンプレ関数の宣言と、呼び出してる部分と、引数に渡している値の宣言部分と、
テンプレ関数内のその引数を操作している部分を書いてください。

352 :デフォルトの名無しさん:2009/10/04(日) 18:49:37
>349
一番可能性が高いのはおまいの勘違い。
最小限のコードでも載せないとまともな回答は望めないかと。

353 :デフォルトの名無しさん:2009/10/04(日) 18:50:54
>>349
ポインタを参照で渡せば?

354 :デフォルトの名無しさん:2009/10/04(日) 19:30:06
>>352の言うとおりだろう。
どこかでコピコンが働いてんだよ。


355 :デフォルトの名無しさん:2009/10/04(日) 19:35:46
コピコン可愛いお

356 :349:2009/10/04(日) 19:50:39
>>353の仰るとおり、ポインタを参照で渡したらポインタの内容が
保持されました。
コード部分なんですが、リスト構造のポインタだったので、
操作している部分が長く、見にくいかもしれませんが
書いたほうがよろしいでしょうか?
皆さんレスありがとうございます。

357 :デフォルトの名無しさん:2009/10/04(日) 20:20:28
教えてください

VS2008で作ったCのプログラム(ただのハローワールド)を
別のマシンで実行させるにはどういうモジュールが必要なんでしょうか

.exeファイルをもっていって実行させてもエラーで動作しませんでした


358 :デフォルトの名無しさん:2009/10/04(日) 20:27:52
>>357
wine

359 :デフォルトの名無しさん:2009/10/04(日) 20:29:20
>>357
CRTをStaticにLinkするんだ

360 :デフォルトの名無しさん:2009/10/04(日) 20:34:15
>>357
.NET Frameworkがいるんじゃね?

361 :デフォルトの名無しさん:2009/10/04(日) 21:14:07
別のマシンが何なのかも書いてないのに、お前ら適当なw

362 :デフォルトの名無しさん:2009/10/04(日) 21:14:58
>>349はこのレベルの解説から読んだ方がいい気がする
ttp://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/C++2/06/06-02.html

363 :デフォルトの名無しさん:2009/10/04(日) 21:18:55
>>362
だったらまずお前が読めよ

364 :デフォルトの名無しさん:2009/10/04(日) 21:20:37
お前は何を言ってるんだ

365 :デフォルトの名無しさん:2009/10/04(日) 21:21:29
自分でも何を言ってるのかわからん

366 :デフォルトの名無しさん:2009/10/04(日) 21:32:50
>>358-361

すいません。別のマシンってwindowsXPのデフォルトインストール状態のマシンです
なんかライブラリがいるって聞いて、何かをインストールしなきゃいけないのかな?と思い質問しました。

.net frameworkかなと思ったのですがCなのに?という疑問がありました。
ちょっと試してみます

367 :デフォルトの名無しさん:2009/10/04(日) 21:36:50
>>366
.net frameworkじゃなくてCランタイム

368 :デフォルトの名無しさん:2009/10/04(日) 21:44:54
364 :デフォルトの名無しさん:2009/10/04(日) 21:20:37
お前は何を言ってるんだ

wwwwwwwwwwwwwwwwwwwwwwwwwwwww

369 :デフォルトの名無しさん:2009/10/04(日) 21:48:08
>>366
32bit/64bit 問題だったりしてw

370 :デフォルトの名無しさん:2009/10/04(日) 21:55:35
デバグビルドしてるんだろ

371 :デフォルトの名無しさん:2009/10/04(日) 22:08:09
>>367
なるほど。。正確にはCランタイムが必要で
.net framework入れるとCランタイムが入ってくるということですね

入れる対象マシンは私のじゃないのでモジュールだけ入れたいのですが
>>359さんの方法が可能なのですかね?ちょっと調べてみます

>>369
その問題がよくわかっていませんがどちらも32bit環境です


372 :デフォルトの名無しさん:2009/10/04(日) 22:10:44
>>371
これは独り言だけど、コンパイルしたときの条件とか設定とかをちゃんと書くといいかもよ。

373 :デフォルトの名無しさん:2009/10/04(日) 22:38:18
Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)
http://www.microsoft.com/DOWNLOADS/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=ja

...

374 :デフォルトの名無しさん:2009/10/04(日) 22:42:59
こっちのほうが新しい。
Microsoft Visual C++ 2008 Service Pack 1 再頒布可能パッケージ ATL のセキュリティ更新プログラム
http://www.microsoft.com/downloads/details.aspx?FamilyID=2051a0c1-c9b5-4b0a-a8f5-770a549fd78c&DisplayLang=ja

375 :デフォルトの名無しさん:2009/10/04(日) 23:18:31
質問です。VC9EEで開発しています。
以下のような関数を書いたんです。動機は自作コンテナのオブジェクトプール用のイニシャライザです。
以前の環境をリセットして再利用できるように初期化します。
で、てきとーなテストではうまくいきました。つまり、クラスや構造体のメンバ変数を0にできました。
さて、このコードはセーフなのかアウトなのか知りたいです。メモリリークなどはしてないみたいです。
そのほかにも、もっと簡単な代替手段があればご教授ください。お願いします。

template<class T>
bool ZeroInitializer(T& in){
    void* Mem = calloc(1,sizeof(T));
    if(Mem == NULL) return false;
    T* Temp = new(Mem) T;//<new>をインクルードしないと使えない。
    in = *Temp;
    delete Temp;
//  free(Mem);
    return true;
    
}

376 :デフォルトの名無しさん:2009/10/04(日) 23:38:25
>>375 です。
今日はもう寝るので明日また見に来ますです。
よろしくお願いします。

377 :デフォルトの名無しさん:2009/10/04(日) 23:43:37
>>375
何か無用に難しいことやってるね。

memsetで万事解決。

378 :デフォルトの名無しさん:2009/10/04(日) 23:48:23
>>375
in = T() で十分だろ。

それは別としても、そのコードはアウト。
calloc() で確保したメモリは free() で解放しないとだめ。
あと、 new(Mem) T で例外が発生するとリークする。
そもそも calloc() 使って 0 初期化とか言ってる時点で T に
だいぶきつい制約があるんだろうけどな。

379 :デフォルトの名無しさん:2009/10/04(日) 23:49:09
>>377 C++ で memset() はねーよ。

380 :デフォルトの名無しさん:2009/10/04(日) 23:50:25
>>375
メモリリークしてるかどうかはどうやって判断したの?

381 :デフォルトの名無しさん:2009/10/04(日) 23:51:08
>>379
ゼロクリアする必要があるみたいじゃん。

382 :デフォルトの名無しさん:2009/10/04(日) 23:57:15
>>377,381
http://www.kijineko.co.jp/tech/superstitions/initialization-by-memset.html
http://www.kijineko.co.jp/node/163

383 :デフォルトの名無しさん:2009/10/04(日) 23:58:19
fill_nとかでいいじゃん。

384 :デフォルトの名無しさん:2009/10/05(月) 00:00:25
>>382
いや、それは分かるけど、375はゼロクリアが必要だって言ってるんで。
関数名がZeroInitializerだし。

クラスのオブジェクトを初期化したいだけなのなら、話は変わってくるけど。

385 :デフォルトの名無しさん:2009/10/05(月) 00:02:40
つまり calloc() の後にコンストラクタを走らせてるのが意味不明ってことで。
あとは 375 本人に語らせるしかない。

386 :375:2009/10/05(月) 00:07:26
>>377
コンストラクタを呼ぶ前ならいいけど、VTableまで0にしちゃったらもんだいないかな?

387 :デフォルトの名無しさん:2009/10/05(月) 00:09:21
>>386
寝たんじゃないのか。

とりあえず、なぜゼロクリアしたいのか、話を訊こうか。

388 :375:2009/10/05(月) 00:11:09
途中で投稿してしまった。

>>380
VCの<crtdbg.h>の関数でやりました。

>>381 & >>384
ごめんなさい。とりあえず、現在の状態をリセットできればZEROじゃなくてもいいです。



布団入る前に見にきてよかった。

389 :デフォルトの名無しさん:2009/10/05(月) 00:12:26
じゃ、378で終了だな。


390 :デフォルトの名無しさん:2009/10/05(月) 00:14:53
>>388
メモリプールみたいなものを作るならEfficient C++でもみて勉強すれば?

391 :375:2009/10/05(月) 00:23:10
時間があるので、細々と。
何で、こんなことしようかと思ったかというと、N分木のツリーコンテナを作ったのが始まりです。
このコンテナはテンプレートになっていて、いかなるTをも食います。
無難な初期化法を模索している時に、VCのstd::vectorの中身がかならず0で初期かされていることを思い出しました。
で、これをうまく取り込もうと思ったのでそういうコードを書きました。

>>389
>>378では問題がでないなら、それで終了です。
ちょっと大丈夫か不安だったんですが、まぁ、責任はユーザクラスに投げてしまうのもいいかなぁ。。。

>>390
まず本を買わないと!ですね。


とりあえず方向性が見えたのでそれで何とかしようと思います。
変な質問でしたが誠実に答えていただいてありがとうございました。
ぐっすり寝れますよ。;)

392 :デフォルトの名無しさん:2009/10/05(月) 00:51:58
std::vectorの場合は、T()、つまり値初期化されるので、intやPODな構造体だと結果的に0初期化になる。
だから、とりあえずは>>375のコードのnewのところをnew(Mem) T();とすればいい。Tの後の括弧が重要。
(コピーコンストラクタなど)コンストラクタに引数を渡す場合もここで渡すこと。
そして、この要素を削除するときにはTemp->~T();でデストラクタを呼んでからfree(Temp);する。
こうすれば、コンストラクタ・デストラクタを持つクラスでもきちんと動くはず。

本格的にやるなら、std::vectorみたいにテンプレート引数でアロケータを取るようにする。
malloc→allocate
new(void*)→construct
~T→destroy
free→deallocate
アロケータのメンバはこう対応する。

393 :デフォルトの名無しさん:2009/10/05(月) 01:02:20
きめぇコードだなw
テンプレートで書いたら保守なんてできたもんじゃないな

394 :デフォルトの名無しさん:2009/10/05(月) 01:21:45
>>392
T に制約を設けないならコンストラクタからの例外にも気をつけないと。

395 :デフォルトの名無しさん:2009/10/05(月) 14:01:33
>>392
詳細ありがとうです。T()でも問題なさそうなのでそれで行きます。
元々は自分の認識の甘さが原因ですね。もっと精進したいと思います。

ありがとうございました。

396 :デフォルトの名無しさん:2009/10/05(月) 14:15:44
> Tの後の括弧が重要。

括弧はなくてもいいと思うが。あってもいいけど。

397 :デフォルトの名無しさん:2009/10/05(月) 18:24:36
vectorのイテレータiから要素へのポインタpを得る方法がわからず、
詳しい知人に聞いたら、
p = &*i;
いうやり方を教えてくれました。なるほど確かに動いているのですが、
一見無意味な変換をしているようで気持ち悪いです。
こういうやり方って一般的なんですかね。

398 :デフォルトの名無しさん:2009/10/05(月) 18:41:42
>>397
一般的だと思う。
「自分の環境のvectorのイテレータはポインタで実装されているから」といって、
イテレータをそのままポインタとして使う方が気持ち悪い。

399 :デフォルトの名無しさん:2009/10/05(月) 18:43:02
>>397
vectorのイテレータはランダムアクセスイテレータなので、機能的にはほとんどポインタと変わらない。
(*it)ってやれば、要素を返してくるので、それのアドレスを返せばポインタへの変換はできる。
でも、俺もキモイと思う。一般的かは別として。。。

400 :デフォルトの名無しさん:2009/10/05(月) 19:33:23
>>397
一般的というか、普通にそれが正解だし、中身を理解してくれば不自然さも感じなく
なってくるかもしれないし、なってこないかもしれない

401 :デフォルトの名無しさん:2009/10/05(月) 19:55:32
VC++2008では、こういうマクロが機能します。
C++の標準としては、引数付きマクロに型引数を指定してもいいんでしょうか。

#define foreach_vector(T, v, i) \
  for (std::vector<T>::iterator i = v.begin(); i != v.end(); ++i)

std::vector<int> vec;
...

foreach_vector(int, vec, i)
{
  ...
}

402 :デフォルトの名無しさん:2009/10/05(月) 20:00:52
型引数といってもプリプロセッサにとっては単なる文字列に過ぎんから
何を指定してもようござんす。

403 :デフォルトの名無しさん:2009/10/05(月) 20:17:26
>>401
最終的なC++の文章として整合性の取れた置換がされれば、コンパイラさんは疑ったりしない。

404 :デフォルトの名無しさん:2009/10/05(月) 22:12:13
>>396
コンストラクタを持つクラスなら確かにどっちでも同じだけど、そうでない組込型やPODだと違うの。
new intだと、int i;のiのように初期化されなけど、new int()は0初期化される。

まあ、たしかにstd::vectorはT()をコピーコンストラクトして0にするので、
これは使っていないはずだけど。

405 :デフォルトの名無しさん:2009/10/05(月) 22:27:53
mpg又はmp4、wmv, aviといった動画のファイルフォーマットを詳しく書いたHPありませんか?
1024バイトはヘッダーとか、ここからデータが入ってるとか、そういったことが知りたいです。
動画再生ソフトをC、C++でガリガリプログラムしてみたいと思ってます。よろしくお願いします。

406 :デフォルトの名無しさん:2009/10/05(月) 22:32:19
>>404
へぇ

407 :デフォルトの名無しさん:2009/10/05(月) 22:35:01
コンテナの最終要素からの後置インクリメントの対処って、やっぱ最終要素の場合インクリメントしないしかないのかな?

408 :デフォルトの名無しさん:2009/10/05(月) 22:37:48
境界線系のエラーは結構凶悪だから、何もしないか、レンジエラーの例外投げるかするといいと思う。

409 :デフォルトの名無しさん:2009/10/05(月) 23:38:40
>>405
フォーマットがわかったくらいじゃ再生できなくて
結局規格書が必要になるから最初から規格書手に入れたほうがよい

つーか何人もの熟練のプログラマが関わってても
バグが出るのが動画の世界なのに
そんなことも自分で解決できないレベルじゃ間違いなく挫折する
いや、むしろ俺が挫折した

悪いことは言わないからDirectShowにでも頼ったほうが早い

410 :デフォルトの名無しさん:2009/10/06(火) 00:03:01
>>405
高い山を目指すのも悪くはないけど山の高さを知るためにもまずは
JPGあたりからはじめたらどうかな?
挫折すること請け合い

411 :デフォルトの名無しさん:2009/10/06(火) 00:29:26
jpgですら難しいのに動画とか無理だろそもそもソフトウェアエンコードでまともな速度でるのか初心者はBMPから始めろ

412 :デフォルトの名無しさん:2009/10/06(火) 01:36:50
そういえば

漫画とかイラストとか、基本は白黒で線とベタとトーン、それに活字で出来ている絵、
これって、一般的にはBMPからJPGに圧縮してるけど
線や字(フォントの種類)等を判別する方法をうまく考え出せば
JPGとかに比べて、ずっと圧縮率を高くすることも出来ると思うんだ。

もう既に作られているのかもしれないけど。

413 :デフォルトの名無しさん:2009/10/06(火) 01:45:16
自動ベジェ曲線化とか? 難しそうだ。OCRは何とかなるか。

414 :デフォルトの名無しさん:2009/10/06(火) 01:49:07
グレイスケールで十分じゃね?

415 :デフォルトの名無しさん:2009/10/06(火) 01:52:58
イラストレータとかのベクターフォーマットがそんな感じじゃね?
でも、線の強弱やかすれ、ベタフラッシュやホワイト、トーン削りなんかを考えたら、
jpgとかで十分だと思うよ。

416 :デフォルトの名無しさん:2009/10/06(火) 01:56:21
potraceでぐぐれ

417 :デフォルトの名無しさん:2009/10/06(火) 02:07:11
強弱・かすれ・トーン削りみたいなのをきれいに残したいなら
むしろ8bitグレースケールにしてPNGだろうな
サイズは増えるだろうけど「無劣化」はでかい

ちなみにJPEGにもグレースケール専用の色空間定義がある
読み書きできないソフトも多いだろうけど

418 :デフォルトの名無しさん:2009/10/06(火) 06:47:55
最小化された(子)ウィンドウのサイズをMoveWindowで変更し、
そのウィンドウを標準化すると、指定サイズに変わっている
というのをやりたいのですが、サイズが変わってくれません。
いい方法がありましたら教えてください。

419 :デフォルトの名無しさん:2009/10/06(火) 15:21:59
>>418
SetWindowPlacement

420 :デフォルトの名無しさん:2009/10/06(火) 21:23:35
http://www.geocities.jp/ky_webid/win32c/025.html
のページの
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
について質問ですが、これはLRESULTという型のCALLBACK WndProcという関数でしょうか?
それともLRESULT CALLBACKという型のWndProcという関数でしょうか?それともまた別でしょうか?
前者のような気がするんですが、いじってみてもうまくコンパイルできません。
たぶん自分のレベルでは追いつかないような記述だと思うのですが、分からないままだと悲しいので答えだけ教えてください

421 :デフォルトの名無しさん:2009/10/06(火) 21:26:26
LRESULT => 返り値
CALLBACK => 呼び出し規約
WndProc => 関数の名前

422 :デフォルトの名無しさん:2009/10/06(火) 21:28:49
>>421
呼び出し規約というのは初耳です。調べてみます。
ありがとうございました〜

423 :デフォルトの名無しさん:2009/10/06(火) 22:39:17
>>419
ありがとうございます。

424 :デフォルトの名無しさん:2009/10/06(火) 23:18:53
呼び出し規約って何者なの?

425 :デフォルトの名無しさん:2009/10/06(火) 23:24:38
wikipediaのページの左上にある画像に「ワィ」ってあるけど、本当は「ウィキペディア」の「ウィ」のつもりの誤字なんだってね。

426 :デフォルトの名無しさん:2009/10/06(火) 23:45:55
>>424
関数呼び出すための約束事。
アセンブリになったときのお約束で、他言語との協調とかそういうときに役に立つ。

427 :デフォルトの名無しさん:2009/10/06(火) 23:56:12
質問です。
kern protection failureってどういうエラーなのでしょうか?

たとえば
char *str = "aiueo\0";
で初期化した文字列に対して
*str = 'o';
を実行したときにこのエラーが出てしまいます。
使用OSはMAC OS Xでgccを用いてコンパイルしています。

428 :デフォルトの名無しさん:2009/10/06(火) 23:59:00
多分、書き込み禁止領域に書き込んだから怒られてる。
それは配列として確保してないから改変不可だ。

429 :427:2009/10/07(水) 00:13:26
>>428
説明ありがとうございました!
宣言だけ行って、mallocで領域を確保したらうまくいきました
追加で質問させていただきたいのですが、
宣言直後のポインタは基本的に書き込み禁止領域のアドレスを指しているのですか?

430 :デフォルトの名無しさん:2009/10/07(水) 00:17:21
そりゃヌルポといってだな
どこさしてるかわからん超危険ポインタ
下手したらOSの挙動に割り込んでHDDをぶっ壊すかもしれない

ってたまに聞くけど本当かどうかはしらない。使ってみてはどうでしょうか

431 :デフォルトの名無しさん:2009/10/07(水) 00:24:22
int a[1];
a = malloc(x);

これって別に問題はおこらなそうだけどやったらだめなの?

432 :デフォルトの名無しさん:2009/10/07(水) 00:29:49
やってもいいけどコンパイラに怒られる


433 :デフォルトの名無しさん:2009/10/07(水) 00:37:49
>>429
初期化されてない自動変数のポインタは、大体の処理系ではスタックのメモリに
残っていた値が入っていて、元がint型の値だったりしたとき、全く関係のない
アドレスが入っていたりする。たまに書き込み可の領域を指してることもあることは
あるが、大体は書き込んだらSegmentation faultで落ちる。

434 :デフォルトの名無しさん:2009/10/07(水) 00:38:36
むかーし、俺も初心者だった頃、同じようなことをしようとして出来なくて悩んだな。
今にして思えば、単に配列とポインタを理解してなかっただけだが。

435 :デフォルトの名無しさん:2009/10/07(水) 00:50:33
>>430
モダンなOSなら、ちゃんと例外を投げてくれるけどね。

436 :デフォルトの名無しさん:2009/10/07(水) 01:19:28
ちなみにヌルポをfreeしたりdeleteしたりするのは合法

437 :デフォルトの名無しさん:2009/10/07(水) 01:21:30
切り替え機のPS2ポートにキーボードをつながないで
もう一台のlinuxPCのRS232Cのポートから変換コネクタを
かませて切り替え機につなぐことは出来ますか?

切り替え機に大して送るキーボード信号をソフト的に
エミュレーションしたいので可能かどうか悩んでます。

linuxスレで聞こうかと思いましたが、閑散としていたので
こちらで聞きました。
アドバイスがあればよろしくお願いいたします。

438 :デフォルトの名無しさん:2009/10/07(水) 01:24:44
■実現したい事柄
TabControlで、タブの入れ替えをドラッグアンドドロップで行いたい。

■備考
下記URLはC#でのソースです。
ttp://watcher.moe-nifty.com/memo/2009/02/ctabcontrol-b32.html

備考欄のURLの内容をC++で実現してあるソースはありませんか?

439 :デフォルトの名無しさん:2009/10/07(水) 01:29:40
>>430
それヌルポじゃないよ
ヌルポはヌルポであって、未定義とは全く違うよ

440 :デフォルトの名無しさん:2009/10/07(水) 01:38:05
Cのポインタは未初期化でも何かしら指しているものな。

441 :デフォルトの名無しさん:2009/10/07(水) 01:41:28
>>430

実アドレス上で動かないからOSには多分被害ないと思うが。。。


442 :デフォルトの名無しさん:2009/10/07(水) 01:49:05
>>424
関数の呼び出し方をアセンブリ言語レベルで規定したもの。
引数はスタックに積むのかレジスタに格納するのか、スタックに積むなら順番はどうか、
レジスタを使うならどのレジスタにするのか、とか諸々のルールがある。
呼び出し規約の指定を間違えると、関数を正しく呼び出せず、クラッシュする。
アセンブリ言語で関数を書くのでなければ、中身は知らなくても名称さえ知っていれば大丈夫。

443 :デフォルトの名無しさん:2009/10/07(水) 02:34:07
C++勉強中のものです。

数メガサイズのファイルを読み込み、そのデータをメモリ内にアプリケーションが
終了するまで持ち続けるようなプログラムを作成したいのですが、読み込んだデータを持つ方法で悩んでいます。

複数のクラスからアクセスするようなデータ場合、usingを使いグローバル変数に格納するのが一般的なのでしょうか?
なんとなく、C++ではグローバル変数を使用するのがタブーになっているような思いがあるので質問させていただきました。

444 :デフォルトの名無しさん:2009/10/07(水) 03:15:20
グローバルにするのは一般的じゃないので普通に持ち回ればいいと思う。
持ち回り方はC++だからといって何か特殊な方法でもないよ

445 :デフォルトの名無しさん:2009/10/07(水) 03:28:48
>>443
そこでMediatorパターンですよ。

446 :デフォルトの名無しさん:2009/10/07(水) 04:20:08
>>440 初心者スレで嘘つくなよ。

447 :デフォルトの名無しさん:2009/10/07(水) 04:29:49
どこか分からないが、どこかを指しているというのを言ってるんじゃ

448 :デフォルトの名無しさん:2009/10/07(水) 04:38:06
linuxのjfbterm上で動くコンソールアプリをC(gcc)で作ってるんだが
ncursesのboxのボーダーが文字化け(?)してる。 なんか技がある?
スレ違いだったら誘導してくれ。

449 :デフォルトの名無しさん:2009/10/07(水) 04:46:06
>>447
指していない可能性だってあるんだぜ。ぬるぽとか。

450 :デフォルトの名無しさん:2009/10/07(水) 04:51:11
へぇ。じゃあ、0番地を指すポインタは作れないのか

451 :デフォルトの名無しさん:2009/10/07(水) 04:52:39
>>448
どう化けてんだ?
\が¥になるのはフォントのせいだけど。

452 :デフォルトの名無しさん:2009/10/07(水) 05:00:01
>>451
多分、フォントのマッピングが違ってて、それで文字化けしてるんだろうけど
box (subwin_1, ACS_VLINE, ACS_HLINE) でサブウィンドウを囲ってやろうと
すると、縦の線が上付きの「3」になって、横の線はなにも表示されない。
なんかいいアイデアない?

453 :デフォルトの名無しさん:2009/10/07(水) 05:08:12
ヌルポと同じビットパターンの番地を指すポインタは当然作れないよ(作らなくても
いいようになってるし)
どんなビットパターンかは処理系依存で、0に等しいとは限らないけど、コンパイル
タイムでポインタにキャストされた0はヌルポ扱いをすることになってる
まぁこの辺はいまいち分かりにくい仕様だと思うし、C++0xではnullptr_t型のnullptr
というものがとうとう導入されることになった訳だけど

454 :デフォルトの名無しさん:2009/10/07(水) 05:11:28
http://www.kouno.jp/home/c_faq/c5.html
ぬるぽの知識が曖昧な奴はこれ嫁

455 :デフォルトの名無しさん:2009/10/07(水) 05:30:55
>>452
localeを見直してみるとか?

456 :デフォルトの名無しさん:2009/10/07(水) 05:33:43
つまり自動変数として生成したポインタの初期化を行わなかった場合に、
それがたまたまヌルポになる可能性があるから、未初期化でも
常にどこかを指すというのは間違いであると

457 :デフォルトの名無しさん:2009/10/07(水) 06:24:43
Win32だと0x7fff以下がぬるぽってことになるんだな。

458 :デフォルトの名無しさん:2009/10/07(水) 09:17:26
>>443
シングルトンでも使えばいいじゃない

459 :デフォルトの名無しさん:2009/10/07(水) 10:39:06
Listなどに代表されるコレクション?について教えてください。
自分で書いたクラスをインスタンス化し、それをListとして格納して扱うにはどうすれば良いのでしょうか?
まぬけな質問に見えますが、非常に困ってます。

C#で書いた場合、こんな感じになります。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9969.txt

C++で書くにはどうすれば良いのでしょうか?

460 :デフォルトの名無しさん:2009/10/07(水) 10:49:59
>>458
グローバル変数はダメなのに「シングルトン」ならダメじゃなくなるとでも思ってるのか?

461 :デフォルトの名無しさん:2009/10/07(水) 10:50:41
>>459 std::list<...>

462 :デフォルトの名無しさん:2009/10/07(水) 13:05:20
>>460
まったく別なんじゃないか?

463 :デフォルトの名無しさん:2009/10/07(水) 13:22:52
>>460
なんでグローバル変数がだめだとシングルトンもだめになるって思ったの?

464 :デフォルトの名無しさん:2009/10/07(水) 13:33:49
>>462-463
まだこんなこと言う人がいるんだな。初心者スレだからしょうがないか。

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

465 :デフォルトの名無しさん:2009/10/07(水) 14:14:14
>>461
コレクションがどうこうより、クラスの扱い方のところで既に間違ってました。
スレよごしすみません。

vector<Item> vItem;
//newが不要
//vItem.push_back(new Item(2 "pc"));
vItem.push_back(Item(2, "pc"));
vItem.push_back(Item(3, "box"));
for(int i=0; i<vItem.size(); i++){
  cout << "no:" << vItem[i].no << " name:" << vItem[i].name << endl;
}

466 :デフォルトの名無しさん:2009/10/07(水) 14:47:26
>>464
初期化順の制御とかしたくなることない?

467 :デフォルトの名無しさん:2009/10/07(水) 15:52:01
シングルトンとかグローバル変数を使うと、周りを癒着しちゃってモジュール化するとき弊害になるんだよな。
グローバル変数とか使うなら、一個のクラスのメンバ変数にしてモジュールにしてしまうほうが再利用性を確保できる。

468 :デフォルトの名無しさん:2009/10/07(水) 16:33:49
コマンドラインで引数を受け取ってローカルアプリのAPIをコールするexeを
作成したいんですがどこか参考になるサイトご教授願いませんか?
オブジェクト指向は理解してますがwindowsのプログラムは超初心者です。

469 :デフォルトの名無しさん:2009/10/07(水) 16:43:18
Windowsのプログラムが超初心者なら、どのOSのプログラムなら初心者じゃないんでしょうか。

470 :デフォルトの名無しさん:2009/10/07(水) 16:48:48
>>468
私はあなたではないので質問の意味が分かりません
他の人にわかるように書いてください

471 :デフォルトの名無しさん:2009/10/07(水) 16:50:45
>>468
ローカルアプリというのは何を指していますか?
APIは何万個もあるわけですが、どのAPIをコールしたいのですか?
コマンドラインで受け取った引数は何に使うのですか?

472 :デフォルトの名無しさん:2009/10/07(水) 17:05:31
>>471
Skypeで特定ユーザーにメッセージを送信、ムードメッセージを送信、オンライン、オフラインの切り替えなどです。
Firefoxのadd-onを作成しているのですがActiveXのSkype4COM.dllが使用できないため
exeでなんとか操作できないかと。

473 :デフォルトの名無しさん:2009/10/07(水) 17:11:02
>>472
exeじゃなくてwscriptで十分。
Skype4Com WScript でググレ。

474 :デフォルトの名無しさん:2009/10/07(水) 17:12:56
>>472
https://developer.skype.com/Docs/Skype4COM
ここの referenceguide とか examples ちらっと見る限り exe での操作はできるよ

475 :デフォルトの名無しさん:2009/10/07(水) 17:21:43
>>464
wikipediaってwww

476 :デフォルトの名無しさん:2009/10/07(水) 17:33:14
>>468
その書き方だと、既成のEXE内の関数をコールしたいとか、あらゆる可能性を引きずってる。
もうちょっと限定してくれ。

477 :デフォルトの名無しさん:2009/10/07(水) 17:41:39
プログラム全体から呼び出される可能性のあるものはシングルトンにしてもいいだろうよ。

478 :デフォルトの名無しさん:2009/10/07(水) 17:42:26
>>476
>>468 = >>472 みたいだ

479 :デフォルトの名無しさん:2009/10/07(水) 17:56:05
グローバルかシングルトン使わないと延々とポインタを引数にリレーとかしないといけないからめんどくさいじゃん

480 :デフォルトの名無しさん:2009/10/07(水) 17:57:59
ぶっちゃけシングルトンにしていいようなものはグローバル変数にしていいと思う
gotoと同じく完全排除が常に善ではないし、gotoよりは使ってもいい
ただ無闇に使うなってだけ

481 :デフォルトの名無しさん:2009/10/07(水) 18:02:08
>>478
おっとすまない。俺が読めてなかったみたいだ。

482 :デフォルトの名無しさん:2009/10/07(水) 18:04:37
グローバルとシングルトンは全然違うだろ。
シングルトンはグローバルとファイル内にスコープの閉じたstaticグローバル変数の中間くらいの性質をもったものでグローバルより安全で使いたい場所でだけゲットできる

483 :デフォルトの名無しさん:2009/10/07(水) 18:05:13
唯一のインスタンスにアクセスするメソッドだけを持ったクラスを継承させたほうがいいとおもう

484 :デフォルトの名無しさん:2009/10/07(水) 19:04:33
>>475
内容がおかしければ直せばよい。それだけだ。

485 :デフォルトの名無しさん:2009/10/07(水) 20:00:06
シングルトンなんか最近はアンチパターン扱いだろ

486 :デフォルトの名無しさん:2009/10/07(水) 20:06:29
>>484
便所の落書きを一生懸命書き直すバカなんかいないだろ

487 :デフォルトの名無しさん:2009/10/07(水) 20:09:50
できない言い訳はいいよ

488 :デフォルトの名無しさん:2009/10/07(水) 20:20:45
ランタイムコストが掛かるし、細かい罠がぼろぼろ落ちてるし、マルチスレッドには
致命的に向いてないし、下手な使い方をすればグローバルインスタンスと全く同様の
問題も抱える。
今時シングルトンなんか推奨する人はちゃんと理解してるんだろうかと。

489 :デフォルトの名無しさん:2009/10/07(水) 20:27:54
論拠にwikipediaをもってくるやつってなんなんだ。
書き直せよって言うけど、俺がぜんぜん違う内容に書き換えたら、それを信じるってことか?

490 :デフォルトの名無しさん:2009/10/07(水) 20:28:02
シングルトンは「俺のコードカコイイ」な人かJava脳の人が使うもんだろ
で、MTのコードを書き始めると、ダブルロッキングとか馬鹿で無意味なこと始めるか、
目が覚めて窓から放り投げる

491 :デフォルトの名無しさん:2009/10/07(水) 20:29:41
うぃきぺを補強に持ってくるのはバカだけど、とりあえずうぃきぺ出典かどうか
なんか無視して、中身の正しさを巡って議論すればいいと思うよ

492 :デフォルトの名無しさん:2009/10/07(水) 20:31:50
海外のフォーラムなんかも「シングルトンだって? 素直にグローバル使えよプゲラ」って感じだな

493 :デフォルトの名無しさん:2009/10/07(水) 20:32:57
値域の制限には使えると思う

494 :デフォルトの名無しさん:2009/10/07(水) 20:46:55
wikipediaだからという理由で中身を見ない人って何なの?

495 :デフォルトの名無しさん:2009/10/07(水) 20:59:59
>>489
だからグダグダと言い訳ならべなくていいって。
君の最大の力をもって素晴らしいページに書き換えてくれ。

496 :デフォルトの名無しさん:2009/10/07(水) 21:12:45
意味がわからない。
wikip好きすぎだろ。



497 :デフォルトの名無しさん:2009/10/07(水) 23:02:01
お前の2行目の決め付けのほうが意味がわからない。
発狂するタイミングじゃないと思うんだけど。

498 :デフォルトの名無しさん:2009/10/08(木) 01:33:41
>>466
>>482
「初期化順の制御」したいときにも「使いたい場所でだけゲット」したいときにも、
クラスに対してシングルトンパターンのような加工を施す必要は無いんじゃない?

ふつうのクラス定義と、そいつの参照を返す関数がひとつあるだけじゃダメなの?

499 :デフォルトの名無しさん:2009/10/08(木) 02:24:17
>>498
初期化順で俺が言いたかったのは複数のグローバルなオブジェクトがあるときね
1個だけならお好きに


500 :デフォルトの名無しさん:2009/10/08(木) 02:54:52
>>499
オブジェクトが何個でも一緒じゃない?

ふつうの関数(と静的変数)ではできなくて、「シングルトン」ならできる、っていう
初期化順の制御ってどんなのがあるの?

501 :デフォルトの名無しさん:2009/10/08(木) 02:59:45
>>498
>ふつうのクラス定義と、そいつの参照を返す関数がひとつあるだけじゃダメなの?
クラスを公開するなら、そのクラスのインスタンスがあちこちにできちゃうかもしれない。
メンバ関数じゃなくて、参照を引数に取る関数を定義すればいいかもだけど、
それならいっそ参照を外に出さないで、関数だけ公開すればいいと思う。

個人的には静的メンバ関数のみを持つクラスをよく使うなあ。
こういうのってパターン名とかないのかな。

502 :デフォルトの名無しさん:2009/10/08(木) 03:09:59
>>501
> クラスを公開するなら、そのクラスのインスタンスがあちこちにできちゃうかもしれない。
それが嫌なら、公開するクラスは純粋仮想関数の宣言を並べただけの
インターフェースクラスにしとくという手がある。

class C {
public:
 virtual void f() = 0;
 virtual void g() = 0;
};

C& DefaultC();

「参照返す関数」をなるべく使わないように、できるだけ引数で受け渡すように
しとけば、テスト用にダミー実装に差し替えるとかいうようなこともできる。

> それならいっそ参照を外に出さないで、関数だけ公開すればいいと思う。
あぁそういうパターンもあるよね。 C だと超ふつうだな。


やっぱりシングルトンパターンのメリットは見えてこないな。

503 :デフォルトの名無しさん:2009/10/08(木) 09:31:26
staticなメンバ変数しか持たないのはmonostateパターンだね
見た目がシングルトンより綺麗だから俺もこっち使うけどメリットデメリットはよくわからん・・・


504 :デフォルトの名無しさん:2009/10/08(木) 10:18:34
継承できるできないとかコンストラクタが呼ばれない呼ばれるの差じゃね

505 :デフォルトの名無しさん:2009/10/08(木) 10:56:21
質問です。

32ビットのXPで、出来るだけ最適化をかけられてフレームポインタが無い .exe は、
原則として関数(インライン化されたものを除く)のコール順というのは分からないんですよね?

それなのに、VisualStudioとかで見ると、呼び出し履歴が見えるのはどうしてでしょうか。

506 :デフォルトの名無しさん:2009/10/08(木) 11:11:59
>>505
最低限、関数からリターンするためには呼び出された元の位置を知っていないといけない
わけで、どんなに最適化してもプログラムが実行可能である限りその情報は存在している。

CPU が関数からリターンするときにそういった情報を使うのと同じように VisualStudio などの
ソフトで情報を読み取れば、最低限の呼び出し履歴の表示は可能。

さらにバイナリに残っているシンボル情報やコンパイル時に生成できるデバッグ情報などを
加えれば、関数名や引数の表示までだいたい可能になる。

507 :505:2009/10/08(木) 11:28:37
>>506

ありがとうございます。

StackWalk (StackWalk64) 関数でスタックトレースしようとしても、
フレーム有りだと上手くいくのですが、無しだと上手くいきません。

http://msdn.microsoft.com/ja-jp/library/cc428994.aspx

の引数 FunctionTableAccessRoutine のところに、x86 だと fpo にアクセスすると
明記されてるので、上手くいかなくて当然なのかもしれないんですが、
なんとかアクセスできるようにする方法は無いでしょうか?

508 :デフォルトの名無しさん:2009/10/08(木) 11:38:15
>>507
「上手くいきません」って言われてもな。

問題を再現するためのコードと期待した結果と実際の結果を用意して Windows API スレへどうぞ。
Win32API質問箱 Build82
http://pc12.2ch.net/test/read.cgi/tech/1253699773/

509 :505:2009/10/08(木) 11:53:55
>>508
ありがとうございます、こっちで聞いてみます。

510 :472:2009/10/08(木) 18:13:02
>>474を参考にexeを作成して一通りSkypeの操作は可能になりましたが
コマンドラインオプションで文字列送信で文字化けして躓きまました。

メッセージ送信は_bstr_t型なので
  /*内部処理*/
  char *orig = "こんにちわ!";
  _bstr_t bstrt(orig);
  pSkype->SendChatMessage("echo123", orig);

  /*オプション文字列*/
  //int _tmain(int argc, char* argv[])
  char *opt = argv[1];//こんにちわ!"
  _bstr_t bstrt2(opt);
  pSkype->SendChatMessage("echo123", opt);

  /*出力結果*/
  orig -> こんにちわ!
  opt -> S0・k0a0・

何が問題なのかご教授よろしくお願いいたします。

511 :デフォルトの名無しさん:2009/10/08(木) 18:17:42
Mac OS XとLinuxとFreeBSDでは
OpenGLのヘッダやライブラリのファイルのある場所が違うので
これらのどこになってもmakeが一発で通るように
Makefileを書きたいのですが
どういう風に書けばよいのでしょうか?

512 :デフォルトの名無しさん:2009/10/08(木) 18:19:33
>>511
makefile を分ける
ライブラリパスを追加しまくる
configure を書く

513 :デフォルトの名無しさん: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

これらはすべて同じシステムのようなのですが、配布元を教えていただけないでしょうか。
よろしくお願いします。

514 :デフォルトの名無しさん:2009/10/08(木) 18:39:07
>>513
鼬害。

515 :デフォルトの名無しさん:2009/10/08(木) 18:41:18
>>511
automakeあたりを使えば良いんじゃね?

516 :デフォルトの名無しさん:2009/10/08(木) 20:05:50
Linuxのgcc4.3.3では
#include <limits>
でコンパイルエラー起こした
#include <climits>
を代わりにインクルードさせた通したんだけど
いいんでしょうかね、これで

517 :デフォルトの名無しさん:2009/10/08(木) 20:09:39
>>516
C++ ならおk
C言語ならNG

518 :510:2009/10/08(木) 20:46:10
自己解決。
UnicodeにShift-jis渡してりゃ化けるわw
あほだ俺w

519 :デフォルトの名無しさん:2009/10/08(木) 21:10:11
どのUnicode

520 :デフォルトの名無しさん:2009/10/08(木) 21:17:51
>>516
Cではふつう #include <limits.h> と書く。


521 :デフォルトの名無しさん:2009/10/08(木) 23:06:54
環境変数はグローバル変数だから使用禁止

522 :デフォルトの名無しさん: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\"の\"がエスケープされ、文字の"となってしまい、
閉じる"がなくなってしまったためだと思います。

このような場合、プログラム上で回避できる策はあるのでしょうか?
無理そうなら、マニュアルに記載しようと思います。

523 :デフォルトの名無しさん:2009/10/08(木) 23:20:31
\という文字がほしいなら\をエスケープして\\と書く。

524 :デフォルトの名無しさん:2009/10/08(木) 23:35:59
すみません、それはつまり
プログラムを実行する人に向けて、\は\\と書いてください、と
マニュアルに書くしかないということでしょうか?


525 :デフォルトの名無しさん:2009/10/08(木) 23:41:17
質問の趣旨とは異なる回答だけど、
プログラム内部でディレクトリパスの末尾に¥が付いてる必要があるなら
入力時には¥の有り無しどちらでも受け付けるようにしておいて
プログラム側で末尾を判定して¥を付加してやればいいね

\"が"になってしまうのは使う側の責任。だけどそもそも末尾に¥を要求しなければ
そういうミスの発生件数も少なくなる

526 :デフォルトの名無しさん:2009/10/08(木) 23:43:45
>>524
それはコマンドプロンプトのせいだからどうしようもないね
対策はダブルクォートが出てきたら \" だと解釈して自分でパースするくらいかな

527 :デフォルトの名無しさん:2009/10/09(金) 00:29:29
昇順にソート済みの vector<int> v があり、その中から
int min 以上、int max 以下の値を列挙したいとします。
これがmin以上max未満ということなら、次のようにすればよいと思いますが、

vector<int>::iterator imin = upper_bound(v.begin(), v.end(), min);
vector<int>::iterator imax = lower_bound(v.begin(), v.end(), max);
for (vector<int>::iterator i = b; i != e; ++i)

「max 以下」となると、どうするのがスマートでしょうか?
for の前に if (imax != v.end()) { ++imax; }
とか書くのはちょっとベタすぎる気がするんですけど、そんなものですかね。

528 :527:2009/10/09(金) 00:31:59
すみません、自己解決しました。
vector<int>::iterator imax = lower_bound(v.begin(), v.end(), max + 1);
でいいですね。

529 :デフォルトの名無しさん:2009/10/09(金) 00:42:20
>>525
プログラム内部では、末尾に¥を付ける必要特にないのですが
やはりユーザー側から「¥”」のような指定をされてしまうと
プログラム側では防ぐことはできなさそうです。

>>526
文字列に「”」があったら、パースするというのも考えたのですが
パース後に残った文字列のどこからどこまでが第二引数、第三引数かの判定が難しいです。
(実は第三引数まであり、それぞれ半角スペースが入る可能性有り。)

もう少しやってみますが、
おそらくマニュアルに記載するのが良さそうに思います。

ご回答ありがとうございました。


530 :デフォルトの名無しさん:2009/10/09(金) 00:43:21
>>527-528
> vector<int>::iterator imin = upper_bound(v.begin(), v.end(), min);
これをループの始点に使うんだよね?
それなら lower_bound() じゃね?

> vector<int>::iterator imax = lower_bound(v.begin(), v.end(), max + 1);
こっちは upper_bound(v.begin(), v.end(), max) じゃね?。


...|1|2|3|4|5|... と並んでるとき、 lower_bound(3) は 3 の前の境目で、
upper_bound(3) は 3 の後ろの境目、だと覚えてるんだけど、違ったかな?

531 :デフォルトの名無しさん:2009/10/09(金) 06:54:56
>>527
max+1するなら、両方lower_bound()だな。
iminをupper_bound()で得ると、重複した値を取りこぼす。

532 :デフォルトの名無しさん:2009/10/09(金) 09:38:15
>>526
つ[ディレクトリ記号は/でおながいします]

533 :デフォルトの名無しさん:2009/10/09(金) 10:16:01
>>490
Javaはシングルトンの使い道があるん?


534 :デフォルトの名無しさん:2009/10/09(金) 17:31:26
void test(int x[]){cout << sizeof x << endl;return;}

int main(array<System::String ^> ^args)
{
  int x[] = {1,2,3,4,5};
  test(x);
  cout << sizeof x << endl;
}

■出力結果
4
20

なんで両方とも20にならないんでしょうか?

535 :デフォルトの名無しさん:2009/10/09(金) 17:34:33
>>534
ここ行って聞け

C++/CLI part3
http://pc12.2ch.net/test/read.cgi/tech/1206447234/

536 :デフォルトの名無しさん:2009/10/09(金) 17:37:16
>>535
ありがとうございます。

537 :デフォルトの名無しさん:2009/10/09(金) 17:40:20
>>534
エラーもしくは警告にならないのそれ

まぁそれは実質的に
void test(int *x)
というプロトタイプと解釈されるから

538 :デフォルトの名無しさん:2009/10/09(金) 17:59:43
>>537
エラーも警告もでません。
これは普通はやらない書き方なんですね。

だいたい理解できました。
test関数内ではポインタx単体の大きさをsizeofで見ていて、main関数内では配列全体をsizeof見ていると。

ということはこの場合、test関数内で20という値を得る処理を書く事はできないのでしょうか?

539 :デフォルトの名無しさん:2009/10/09(金) 18:06:48
C本来の配列は要素数の情報を持っていない。なので、Cで配列を引数に取る関数は
たいてい別の引数で要素数を受け取るようになっている。
悪いことは言わないから、array<T>なりList<T>を使っとけ。

540 :デフォルトの名無しさん:2009/10/09(金) 18:10:48
もう誘導先に行ってて遅いかもしれないが、
C++かC#のどちらか明確にして勉強したほうがよいと思うよ。


541 :デフォルトの名無しさん:2009/10/09(金) 18:12:46
>>539
そうゆうものなんですね。
すっきりしました、ありがとうございます。

素直にコンテナ?を使っておきます。

542 :デフォルトの名無しさん:2009/10/09(金) 18:18:39
>>540
もともとJavaを主に使っていて、C#は多少勉強した程度です。
Javaとは配列の性質が違っていたのでとまどいました。
ご忠告ありがとうございました。

543 :デフォルトの名無しさん:2009/10/09(金) 18:28:39
gccのバージョンを数字だけ出力する方法はあるでしょうか?
4.3.5なら「4.3.5」だけとか

544 :デフォルトの名無しさん:2009/10/09(金) 18:51:35
___GNUC___ ___GNUC_MINOR___ だけでは末尾の1桁が
取れないのか

どうやればいいんだろう

545 :デフォルトの名無しさん:2009/10/09(金) 19:12:00
__GNUC_PATCHLEVEL__

546 :デフォルトの名無しさん:2009/10/09(金) 21:04:03
>>545
おおサンクス

そしたらこうすればいいのか

printf("%d.%d.%d", ___GNUC___, ___GNUC_MINOR___, __GNUC_PATCHLEVEL__);

547 :デフォルトの名無しさん:2009/10/09(金) 21:48:40
質問です。

環境はVisual Studio.net 2003 C++

条件は列(9)の最後尾が○の場合、
後ろから●が見つかるまでの部分を
削除して表示する

***実行前***
○●●○○●●○○
○●●○○●●

↓↓↓↓↓↓↓

***実行結果***
○●●○○●●
○●●


●○○●○○○○○
●○○○○○●○
○●●○

↓↓↓↓↓↓↓

●○○●
●○○○○○●
○●●




548 :デフォルトの名無しさん:2009/10/09(金) 21:49:38
最大横9×縦11項目
●○○●○○○○○
●○○○○○●○○
●○○●○○○○○
●○○○○○●○○
●○○●○○○○○  
●○○○○○●○○
●○○●○○○○○
●○○○○○●○○
●○○●○○○○○
●○○○○○●○○
●○○○○○●○○

↓↓↓↓↓↓↓

●○○●
●○○○○○●
●○○●
●○○○○○●
●○○●
●○○○○○●
●○○●
●○○○○○●
●○○●
●○○○○○●
●○○○○○●

このような感じで出力したい場合、どういった風に
実装すればいいでしょうか?

以上、よろしくお願いします。

549 :デフォルトの名無しさん:2009/10/09(金) 21:59:53
>>547
#include <stdio.h>
#include <string.h>

int main(void)
{
char buf[1024], *p, *q;

while(fgets(buf, sizeof(buf), stdin))
{
for(p=buf;(q=strstr(p, "●"));p=q)
{
q+=2;
printf("%.*s", q-p, p);
}
printf("\n");
}
return 0;
}

550 :デフォルトの名無しさん:2009/10/09(金) 22:03:14
MFC使っていいなら、

CStringW s = L"○○●●○○";
s.TrimRight(L'○');


551 :デフォルトの名無しさん:2009/10/09(金) 22:28:16
***実行前***
○●●○○●●

↓↓↓↓↓↓↓

***実行結果***
○●●

ここがわからん。開始時に末尾が●ならそれは削除?

552 :デフォルトの名無しさん:2009/10/09(金) 22:37:51
2パスにするのが楽かな??
まず、左から右に一回配列を舐めて、最後に出てきた黒の場所思えておいて、2パス目で表示。
もちろん処理を多めに食うけど、確実じゃないかなぁ。

553 :デフォルトの名無しさん:2009/10/09(金) 22:43:40
>>549
サンクス!!

>>550
サンクス!!

>>551
すまん、記述ミス

***実行前***
○●●○○●●○○
○●●○○●●

↓↓↓↓↓↓↓

***実行結果***
○●●○○●●
○●●○○●●





554 :デフォルトの名無しさん:2009/10/09(金) 22:44:15
>>553
ん、そっか。ミスか。
じゃあ回答でおk

555 :デフォルトの名無しさん:2009/10/09(金) 22:51:09
>>552
例えば、
for(int i=0; i<99;i++)
{
bool iMap[99] = getFunc( i );
}
これで○=1,●=0

ってなっていた場合どうする?

つまり、○ならオブジェクトが取得できていて、
●なら何も無い状態。





556 :デフォルトの名無しさん:2009/10/09(金) 22:54:20
>>555
それぐらいは自分で考えてくれ。

557 :デフォルトの名無しさん:2009/10/09(金) 23:04:57
>>555
即興だから間違ってたら申し訳ないが。
static const LineLen=99;
int LastBlack=LineLen;
bool Map[LineLen];
for(int i=0;i<LineLen;i++){//舐める1パス目
   Map[i] = GetFunc(i);
   if(Map[i]==false) LastBalck=i;
}
for(int i=0;i<LastBlack;i++){//表示。2パス目
   printf("%d",Map[i]);
}

っていう感じ。

558 :デフォルトの名無しさん:2009/10/09(金) 23:09:14
多分9*11で99要素なんだよ。
だから2重ループにするか、lastblackを11要素の配列にしないとだめだ

559 :デフォルトの名無しさん:2009/10/09(金) 23:28:56
>>557書いた後気づいた。読めてなかったなぁ。。。
>>558の案もあわせて採用するといいと思う。

size_t LastBlack(object* Array,size_t N){
    int Last=N;  
    for(size_t i=0;i<N;i++){
       if(Array[i]==false) Last=i; 
    }
    return Last;    
}
--呼び出し--
object obj[99];//どこかで中身設定。
size_t L;
for(size_t i=0;i<11;i++){
    L=LastBlack(obj+9*i,9);
    Show(obj+i*9,L);
}

って感じか??
2重ループになっちゃったな。。。
確実だが、頻繁に呼ぶにはちょっと重いかもね。。。
黒発見した時点でそれまでを描画すれば1パスでいけないこともないかも??

560 :デフォルトの名無しさん:2009/10/09(金) 23:40:27
だれも素直なstrrchrとかは勧めないのか
Unicodeだとしてもwcsrchrとかあったはずだし
最悪strrchrwがshlapi.hとかにあった気がするが

561 :デフォルトの名無しさん: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;
}

562 :デフォルトの名無しさん: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であるから警告になってもよさそうなものですけど…)

この(くだらない)ミスを再発しないためには、何か良い方法はあるでしょうか?

というつかわれ方をしていたせいで、警告がでませんでした

563 :デフォルトの名無しさん:2009/10/10(土) 00:27:48
>>562
Hoge c; って書いた時点でパラメータなしのコンストラクタで初期化さ
れてるんでは。



564 :デフォルトの名無しさん:2009/10/10(土) 00:30:36
>>562 おそらく無理
前者のcはコンストラクタが呼ばれるから初期化されているので警告は出ない。
後者のオブジェクトを作るだけという使い方も十分あるし文法上何の問題もない。

どうしてもというなら、フラグを作って何のメンバ関数も呼ばれずにデストラクタが呼ばれた場合はassertするくらいか。


565 :デフォルトの名無しさん:2009/10/10(土) 00:37:36
>>563-564
あー、なるほど
Hogeにはコンストラクタを書いていませんが、暗黙のコンストラクタが用意されるんでしたね…

Hogeはコンストラクタのいらない型なのですが、そこでなんとかできないでしょうか?
例えるならVectorデータ型みたいなもので
struct Hoge
{
float x, y, z;
};
相当の品なのです。
こういう構造体を「コンストラクタを無くし」て、「初期化されなかったときの利用で、警告が出るようにする」ためのオプションや修飾子はないでしょうか?


566 :デフォルトの名無しさん:2009/10/10(土) 00:56:10
>>565
Hoge C=式 ?Hoge(0):Hoge(1);


567 :デフォルトの名無しさん:2009/10/10(土) 01:01:18
デフォルトコンストラクタをprivateにして必ず565みたいにさせるとか。

568 :デフォルトの名無しさん:2009/10/10(土) 01:31:28
>>565

Hoge* c;
if (略) c = new Hoge(0);
else c = new Hoge(1);
scoped_ptr<Hoge> cptr(c);
Honya(cptr.get());

こんな感じにするかなあ。


569 :デフォルトの名無しさん:2009/10/10(土) 02:24:28
変数宣言と初期化を別にする限り防げないように思う

つまり
>>567のいうとおりデフォルトコンストラクタをprivateにして
>>566のいうような宣言と同時に初期化を必須にするしかないと思う

ただ>>566はコンパイラが馬鹿だとコピーコンストラクタが使用されそうだし
俺なら
Hoge C(式 ? 0 : 1);
って書きそう

570 :デフォルトの名無しさん:2009/10/10(土) 02:29:22
>>568
Vectorみたいな使い方と考えると
比較的プリミティブに近くて多く使われそうだし
毎回ヒープにアクセスさせるのは大仰な上に遅くなりそうじゃね?
マルチスレッドだったりしたら毎回排他制御が…

571 :デフォルトの名無しさん:2009/10/10(土) 09:30:22
汎用的に配列の要素数を返却するtemplate をこのように書いてみたのですが
期待している動作になりません、間違いを指摘してもらえませんか。

#include <iostream>

using namespace std;

template<class X>
int ArraySize(X* object)
{
 return (sizeof(object) / sizeof(X));
}

int main()
{
 int array[] = {1, 2, 9, 3, 4, 5 };
 cout << ArraySize(array) << endl; //配列array の要素数を取得したいのですが・・・
}


572 :デフォルトの名無しさん:2009/10/10(土) 09:36:35
>>566-570
真剣な検討ありがとうございます。

ポインタにするのは、ちょっと速度的にきつそうかなと思います。
570さんのおっしゃるとおり、プリミティブに近いものを想定していますので。

デフォルトコンストラクタをprivateにすると、
Hoge c;
とはできませんね。

(その方法で初期化を強要しつつ)初期化で条件式を使うのは確かによさそうですが、条件分岐が3つ以上の場合に無理がありそうですね。
書けなくはないですが・・・。

else Hoge(1);
のところで、「生成したクラスが使われていないようですが?」という警告があれば一番良いのですけどね…。
それを避けるためには、使ってないローカル変数への警告を抑える
(void)a;
と同じように、
(void)Hoge(1);
と書く。とか…。

573 :デフォルトの名無しさん:2009/10/10(土) 09:38:34
>>571
int ArraySize(X* object)
ここで、単なるポインタにしてしまった以上 sizeof(object)では大きさがとれませんよ。
sizeof(配列)で大きさが正しくとれるのは、それが配列宣言されており、コンパイラがサイズを知っているからです。
ポインタと配列は似て非なるもの

574 :デフォルトの名無しさん:2009/10/10(土) 09:43:32
template <class T, size_t N>
size_t GetArraySize(T (&)[N])
{
return N;
}

int array[] = {・・・};
cout << GetArraySize(array);

575 :デフォルトの名無しさん:2009/10/10(土) 10:06:36
>>571 です
>>573
>>574
ありがとうございます。
>ポインタと配列は似て非なるもの
そうですね、短絡的でした。
>>574
T (&)[N]
この書き方ですが、配列の宣言が、foo[N]このような書き方がしてある配列を参照しているという、ことなのでしょうか?
それから、
return N;
どうしてこれで要素数が取得できてしまうのでしょうか、不思議です?

576 :デフォルトの名無しさん:2009/10/10(土) 10:09:41
>>575 です
質問がまわりくどいですね
T (&)[N] と T &[N]
この違いを教えて頂けないでしょうか。

577 :デフォルトの名無しさん:2009/10/10(土) 10:10:13
foo[N]のNこそ、要素数でしょ?w

578 :デフォルトの名無しさん:2009/10/10(土) 10:13:42
>>577
あ、そうか!
わかりましたw
T (&)[N] と T &[N]
しかし、この違いがまだ理解できません・・・・orz

579 :デフォルトの名無しさん:2009/10/10(土) 10:49:02
構文解析のルールの詳しいことはよく理解してないけど

T [N] => Tの配列
T &[N] => Tへの参照の配列
T (&)[N] => T[N]への参照

となってる模様。ちなみに参照の配列はコンパイルできない
このへんは仮引数名の省略とか括弧の意味とかいろいろあって直感的には理解しにくいわ

580 :デフォルトの名無しさん:2009/10/10(土) 11:35:26
配列へのポインタと一緒だけど、演算子の優先順位が & より [ ] の方が高いから
T &a[N] は先に [ ] と結びついて a[N] つまり a は要素 N 個の配列
その個々の要素の型が T&
T (&a)[N] の場合は括弧で明示してあるために先に & と結びついて &a つまり a は参照
その参照先が要素 N 個の配列
関数の引数名は省略できるので、その場合 T a[N] は T [N] に、T (&a)[N] は T (&)[N] になる
というように俺は理解してる

581 :デフォルトの名無しさん:2009/10/10(土) 11:41:45
>>579
>>580
ありがとうございます、大変よく分かりました。

582 :デフォルトの名無しさん:2009/10/10(土) 20:42:52
stringstreamってどんな感じで実装されてるんでしょうかね?
stringみたいに内部で独自のメモリ管理方法を取ってるのか、vectorのようにベタな連続メモリなのか、それともまったく違うのか・・・

583 :デフォルトの名無しさん:2009/10/10(土) 21:21:55
宜しくお願いします。このコードをコンパイルしますと
error C2664: 'Point<T>::set' : 1 番目の引数を 'int' から 'int &' に変換できません。
参照を外すと、静的でないメンバ関数の呼び出しが正しくありません。となります。
どのように対処したらいいのでしょうか?
#include <iostream>
using namespace std;
template<class T>
class Point {
 template<class> friend class Point;
private:
 T x_; // x座標
 T y_; // y座標
public:
 Point();
 template <class U>
 Point(const Point<U>& r) : x_(r.x_), y_(r.y_){}
 Point(T x = T(), T y =T()) : x_(x), y_(y) {}
 void set(T& x, T& y);
};
template<class T>
void set(T& x, T& y)
{
 x_ = x;
 y_ = y;
}
int main()
{
 Point<int> ip(12, 34);
 Point<long> lp(ip);
 Point<int>::set(12, 34); // ここで当該エラー
 return 0;
}

584 :デフォルトの名無しさん:2009/10/10(土) 21:26:49
>>583です
補足というか、行数の関係で書けませんでした、環境はVS2005 です。

585 :デフォルトの名無しさん:2009/10/10(土) 21:31:47
ごめんなさい、スレを汚してしまいました
解決しましたというか・・・・tohoho情けない
× Point<int>::set(12, 34);
○ Point<int> set(12, 34);

586 :デフォルトの名無しさん:2009/10/10(土) 22:04:28
いいんだよ^^

587 :デフォルトの名無しさん:2009/10/10(土) 22:14:26
>583
void set(const T& x, const T& y) にする。

588 :デフォルトの名無しさん:2009/10/11(日) 06:51:57
>>585
set という変数を用意したいのか?
メンバ関数のsetを呼び出したいのかはっきりしろ。

589 :デフォルトの名無しさん:2009/10/11(日) 13:34:28
>>583
もしsetという名前のメンバ関数を呼び出したくて、しかもインスタンス
無しで呼び出したいのなら、そのメンバ関数はstaticでなければならない

590 :デフォルトの名無しさん:2009/10/11(日) 13:37:55
でもインスタンスがないと当然 this が無いから、x_とy_に代入しようと
するとエラーになるな

質問者はその当たりをはっきり質問するように

591 :デフォルトの名無しさん:2009/10/11(日) 19:02:19
>>583です
皆さん、フォローありがとうございます。今回のset は変数としての振る舞いを期待していました。



592 :デフォルトの名無しさん:2009/10/12(月) 01:01:09
strstrのように、あるメモリ領域から特定のバイト列を検索する標準関数は
あるでしょうか。VC++2008独自関数でもかまいません。
strchrに対するmemchrのようにmemmem?なんてのがあればいいんですけど。

593 :デフォルトの名無しさん:2009/10/12(月) 02:26:50
標準関数は無いと思うけど
もし何度もその探索を実行するなら
(\0終端の文字列と違い、長さがわかっているのだから)
BM法かなんかでの探索を自前で実装するのが良いんじゃないかね。

まあ1度しか使わないのなら、そんなことせずに
先頭文字を探してそこから比較する、いわゆる力任せ法でも充分だろうけどね。

594 :デフォルトの名無しさん:2009/10/12(月) 02:34:09
std::search() とか?

595 :デフォルトの名無しさん:2009/10/12(月) 10:05:53
traitsって何者なんですか?

596 :デフォルトの名無しさん:2009/10/12(月) 10:11:55
曲者

597 :デフォルトの名無しさん:2009/10/12(月) 11:42:45
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string s("表示");
int i = s.find('\\');
cout << i << endl;
return 0;
}
これを実行すると、「1」と表示されますが、-1にするには
どうすればよいでしょうか?

598 :デフォルトの名無しさん:2009/10/12(月) 11:56:51
shift_jisを使わない

599 :デフォルトの名無しさん:2009/10/12(月) 11:58:24
>>597
string s("ひょうじ");

600 :597:2009/10/12(月) 11:59:06
自己解決しました。できないようです。
http://ml.tietew.jp/cppll/cppll_novice/thread_articles/78

601 :デフォルトの名無しさん:2009/10/12(月) 12:45:42
ソースをSJIS以外にしてコンパイル

602 :デフォルトの名無しさん:2009/10/12(月) 13:30:11
すみません。

趣味で、VC++のMFCで、いろいろ作っているんですが、もう5年くらいやっていて
だいぶというかかなり本格的なものも作れるようになりました。
自分は文系なんでよく知らないのですが、プログラマに就職しようと思えばできるんでしょうか?

今の職場は単調作業なので、ちょっと刺激がほしいです。よかったら、転職しようとおもうんですが・・・どうでしょうか?

603 :デフォルトの名無しさん:2009/10/12(月) 13:35:23
プログラマ板で聞いてください

604 :デフォルトの名無しさん:2009/10/12(月) 14:32:08
>>602
貴方の人生こんな初心者スレで聞いて棒に振ってもいいんですか??

605 :デフォルトの名無しさん:2009/10/12(月) 16:44:51
関数ポインタの配列を使った関数呼び出しはc++ではどうやって実現させたらいいですか

606 :デフォルトの名無しさん:2009/10/12(月) 16:47:56
>>605
Cと何かちがったっけ??

607 :デフォルトの名無しさん:2009/10/12(月) 16:48:10
普通の関数はCと同じ。
クラスのメンバ関数の関数ポインタは手を出さないほうが身のため。

608 :デフォルトの名無しさん:2009/10/12(月) 17:14:10
初心者なので詳しく答えられる方だけ回答お願いします

609 :デフォルトの名無しさん:2009/10/12(月) 17:15:19
初心者なのできちんと説明できない人は口を出さないでください
イライラします

610 :デフォルトの名無しさん:2009/10/12(月) 17:19:24
初心者ならどんな回答も学ぶべきことがあるはずなのでありがたく思うべきです

611 :デフォルトの名無しさん:2009/10/12(月) 17:20:50
初心者なのぐぐれません。

612 :デフォルトの名無しさん:2009/10/12(月) 17:21:32
初心者なのでよみとれません。

613 :デフォルトの名無しさん:2009/10/12(月) 17:23:43
初心者なので日本語わかりません。

614 :デフォルトの名無しさん:2009/10/12(月) 17:53:40
それではboost.functionの説明を始めようか

615 :デフォルトの名無しさん:2009/10/12(月) 19:10:08
がんばってコード書いたのによくよく調べるとSTLとかBoostに同じしかも完全に上位のコードとかがあると泣けるんだがしかし

616 :デフォルトの名無しさん:2009/10/12(月) 19:17:11
頑張る前に調べような。そういうのが使える環境ならなおさらだ。

617 :デフォルトの名無しさん:2009/10/12(月) 19:45:28
そりゃ一回は調べるんだけど見逃してたりするんでさ

618 :デフォルトの名無しさん:2009/10/12(月) 19:49:27
コードを書いたことが明日への礎になる。

619 :デフォルトの名無しさん:2009/10/12(月) 19:57:45
中で何やってるのか全く理解できないようなコードを使ってトラブルと
どうにもならなくなるしな。

620 :デフォルトの名無しさん:2009/10/12(月) 20:13:41
>>615 それはいい勉強をしたと思え。
ただライブラリを使ってるだけよりいい経験を積んだんだ。


621 :デフォルトの名無しさん:2009/10/12(月) 20:27:56
・boostを眺める
・欲しい機能を見つける
・使ってみる
・boostを参照せずに同じ様な機能の縮小版を作ってみる
・挫折する
・boostはどうやってるんだろうと思いながらソースや解説をみて学ぶ

俺は大体こんなかんじで勉強になった functionとか

622 :デフォルトの名無しさん:2009/10/12(月) 22:23:13
連結リストを実装するのはCでよくある勉強だし、ポインタ完全制覇とか読むと実装したくなるしな。
それをSTLで既にあるじゃんとか言って馬鹿にする奴はいないだろ。

623 :デフォルトの名無しさん:2009/10/12(月) 22:25:27
そりゃまぁ勉強目的でやるんならね

624 :デフォルトの名無しさん:2009/10/12(月) 22:32:21
時には馬鹿にならないとやる気にならないこともある。
Boostにあるからいいかではなかなか重い腰が上がらない。

625 :デフォルトの名無しさん:2009/10/12(月) 23:37:36
namespaceでもprivateとかpublic使えればいいのに

626 :デフォルトの名無しさん:2009/10/12(月) 23:50:49
anonymous namespaceが近いんじゃない?

627 :デフォルトの名無しさん:2009/10/12(月) 23:57:13
>>625
staticメンバ関数で、それ専用のクラスを作るのはどうだろう。
気分的にちょっとアレだけど

628 :デフォルトの名無しさん:2009/10/13(火) 00:05:07
無名名前空間とはちょっとちがうかなぁ

namespace hoge {
private:
template <int n> struct is_even { static const bool value = n % 2 == 0; }; // インクルードしても外から使えないようにしたい

public:
template <int n> class fuga { static const int value = is_even<n>::value ? n : 0; 〜〜; };
}

みたいな感じで使いたい
仕方ないからnamespaceをclassかstructで置き換えてそれっぽいことはできてるんだけど
今度はusing namespaceが使えない・・・

629 :デフォルトの名無しさん:2009/10/13(火) 00:30:43
・規約でBoostを禁止しているプロジェクトにげんなりする。

630 :デフォルトの名無しさん:2009/10/13(火) 01:46:06
>>628
namespaceだと名前空間を汚す気があれば突破されてしまうが。

631 :デフォルトの名無しさん:2009/10/13(火) 04:51:45
静的関数のテンプレート関数版みたいなもんか。

クラステンプレートfugaの静的メンバ関数にはしたくなさそうだな。

632 :デフォルトの名無しさん:2009/10/13(火) 16:34:48
与えられたUnicode文字列がサロゲートペアを含むかどうかを確かめる方法を
教えてください。

633 :デフォルトの名無しさん:2009/10/13(火) 16:41:14
if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)

634 :デフォルトの名無しさん:2009/10/13(火) 16:52:39
>>633
ありがd

635 :デフォルトの名無しさん:2009/10/13(火) 16:59:43
WindowsXPでVC2008でC++プログラム書いてますけど
OSが落ちる(ブルースクリーンや電源断)の直前に
実行中のプログラム内のある情報を
ディスクに書き込むことができますか?
シャットダウンイベントで処理をするのはできるみたいですが
落ちるというイベント?を検出できないでしょうか?



636 :デフォルトの名無しさん:2009/10/13(火) 18:05:37
( ゚д゚)

プログラミング以前の問題を感じる

637 :デフォルトの名無しさん:2009/10/13(火) 18:05:49
>>635
何も知らないで適当レスするけど
カーネルに何らかのフックができたとしたらブルースクリーンは可能だろうけど
電源ぶちぬきを検出してどうこうはバックアップ電源でもない限り厳しいんじゃないだろうか

638 :デフォルトの名無しさん:2009/10/13(火) 18:13:30
無停電電源に監視機能つきのがあるからそれでも買えばよろしかろ。

639 :デフォルトの名無しさん:2009/10/13(火) 18:18:44
電源は「脳みそ撃ち抜かれた瞬間にそれに気づいて反撃できますか」
って聞いてるようなもんだ

ブルースクリーンもそれができたとして
書き込まれたデータが正しいなんて全く保証できない

640 :デフォルトの名無しさん: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),・・・はどうゆう意味なのでしょうか?

641 :デフォルトの名無しさん:2009/10/13(火) 18:40:01
コンストラクタ初期化子でぐぐれ

642 :デフォルトの名無しさん:2009/10/13(火) 18:41:42
>>640
メンバ変数の初期化です〜。

643 :デフォルトの名無しさん:2009/10/13(火) 19:05:43
>>641-642
だいたい理解できました。

メンバ変数に「参照」を定義した場合、
コンストラクタ初期子によって初期化を行わないと
コンパイルエラーになるんですね。

コンパイルエラーの理由は、「参照」は定義と同時に初期化を行わなければならないから
ってとこでしょうか?

644 :デフォルトの名無しさん:2009/10/13(火) 19:23:54
そうだね。
あとconst修飾したメンバもここで初期化できる。

645 :デフォルトの名無しさん:2009/10/13(火) 19:29:11
あとコンストラクタで初期化子で初期化しないと生成と代入のコストがかかるから無駄

646 :デフォルトの名無しさん:2009/10/13(火) 19:43:29
>>644-645
勉強になります。

const修飾したメンバの初期化も試してみました。
コストの件は目に見えないのでまだあやふやですが
感覚的にわかりました。

ありがとうございました。

647 :デフォルトの名無しさん:2009/10/13(火) 19:59:15
じゃあもうひとつだけ教えてやる。
参照とconst変数のほかに、
デフォルトコンストラクタを持たない基底クラスにも
初期化指定子による初期化が必須。

648 :デフォルトの名無しさん:2009/10/13(火) 20:08:30
>>647
そういえば数日前にそれでひっかかったことがありました。

どこかのページで、「とりあえずデフォルトコンストラクタは書いといた方がいい」と書いてあったので
その時はデフォルトコンストラクタを書いてごまかしました。

コンパイルが通らなかった時、まるで意味がわからなかったのですが
おそらくあの時も初期化指定子を書いておけば通ったっぽいです。

いろいろと問題が解決できました、ありがとうございます。

649 :デフォルトの名無しさん:2009/10/13(火) 20:18:32
std::tr1::array<int, 5> a = {1, 2, 3, 4, 5};

これがコンパイル通るのはなんで?

int ca[] = {1, 2, 3, 4, 5};
std::tr1::array<int, 5> a(ca);

とやるとエラーが出るから配列を受け取るコンストラクタがあるわけではないようだし・・・

650 :デフォルトの名無しさん:2009/10/13(火) 20:44:02
C言語だと
struct Array { int member[5]; };
struct Array a = {1, 2, 3, 4, 5};
でコンパイルが通る

コンストラクタ、privateメンバ関数、privateメンバ変数、継承無しでクラスか構造体作ればそれと同じように動く



651 :デフォルトの名無しさん:2009/10/13(火) 20:46:33
>>650
あぁ〜その構文すっかり忘れてましたdです

652 :デフォルトの名無しさん: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を使えるようにするにはどのようにすればいいでしょうか?

653 :デフォルトの名無しさん:2009/10/13(火) 21:01:54
インクルードガードでぐぐる

654 :デフォルトの名無しさん:2009/10/13(火) 21:41:59
インクルードガードって万が一define名が被っても気が付きにくくね?

655 :デフォルトの名無しさん:2009/10/13(火) 22:07:29
かぶったら途端にコンパイルできなくなるからすぐ気づく

656 :デフォルトの名無しさん:2009/10/13(火) 22:33:57
VCなら#pragma onceで一発解決

657 :デフォルトの名無しさん:2009/10/13(火) 22:36:24
プロジェクト名_プロジェクトルートからの相対ディレクトリ_ファイル名

これでかぶることはまず無い
これでかぶったらだれかが悪意を持って定義したと考える

658 :デフォルトの名無しさん:2009/10/13(火) 22:37:02
>>655
さらに、インクルードが循環参照になってもコンパイルできなくなるので便利。

659 :デフォルトの名無しさん:2009/10/13(火) 22:53:33
>>656
GCCでも使える。

660 :デフォルトの名無しさん:2009/10/13(火) 23:01:18
プロジェクト名_GUIDにすれば?MFCみたいに。

661 :デフォルトの名無しさん:2009/10/13(火) 23:01:29
>>656
循環参照してもわからないのがどうもな

662 :デフォルトの名無しさん:2009/10/13(火) 23:31:10
>>653-661
ありがとうございます
この場合はクラスc定義をインクルードガードかpragmaで囲めばよいのでしょうか?
明日試してみます

663 :デフォルトの名無しさん:2009/10/13(火) 23:34:11
分かってないようだがまぁ調べれば分かるだろ頑張れ

664 :デフォルトの名無しさん:2009/10/13(火) 23:45:31
>649
std::tr1::array が aggregate だから。
struct や通常の配列でその形式の初期化が通るのと同じ。

665 :664:2009/10/13(火) 23:46:42
って >650 で回答済みだったのね、ごめん。

666 :デフォルトの名無しさん:2009/10/14(水) 01:34:16
struct Hoge{
  char s[5];
};

struct Mage{
  char s[2];
  char c;
};

↑みたいな構造体だとパディングが付かない
その理由は
1.最適化されて、配列と同等の扱い(つまりコンパイラ依存)
2.C言語の仕様として、まとめられる

どっち?

667 :デフォルトの名無しさん:2009/10/14(水) 01:38:17
>>666
コンパイラ依存

668 :デフォルトの名無しさん:2009/10/14(水) 01:59:50
>>666
コンパイラ依存だが、1の「配列と同等の扱い」という理解はおかしい。

そいつらにパディングが付かないのは、 char しか入ってない構造体に
パディングを付ける必要がないから。

構造体のパディングが何のために必要なのか、ググってみるといい。

669 :デフォルトの名無しさん:2009/10/14(水) 02:03:02
親のクラスのメンバ変数をpublicにして子クラスで利用するのはやらないほうがよい作法ですか

670 :デフォルトの名無しさん:2009/10/14(水) 02:07:10
>>667-668
ども

>>668
バイト領域云々はわかってる
そりゃshortやらdoubleやらいろいろ持ってたらパディングが入るだろうけど、
逆にそいつらを配列として括ることもできないし
「おかしい」という根拠がわからないなぁ
まぁ正しいというつもりもないけど

要はコンパイラ設計者のさじ加減、程度の話じゃないの?

671 :デフォルトの名無しさん:2009/10/14(水) 02:08:08
メンバ変数の値を見るだけなら問題ない

もし更新したいのならせったーを(作法的に)

672 :デフォルトの名無しさん:2009/10/14(水) 02:12:38
>>655
いや、インクルードガード側が後ならそうだけど、インクルードガードの
defineのせいで他で条件コンパイルしてる部分で被った場合に気が付き
にくいことにならないだろうか?
インクルードガード用の名前付け規約みたいなのがないとさ。

673 :デフォルトの名無しさん:2009/10/14(水) 02:17:06
>>670
別にshortだけいっぱい持っててもパディングされることはないと思うが。

で、最適化されて配列と同等というからにはsizeof(Mage.s)が3にならないと
困るわけだが、何がどう転んでもそうはなって欲しくないよな?
なので、さじ加減ひとつで配列と同等になることはない。
C言語の仕様としてまとめられるという点についてはもはや何がなにやら。
まず連続領域に取られる保証がされていないよ

674 :デフォルトの名無しさん:2009/10/14(水) 02:18:26
>>672
インクルードガード用のdefineと他のdefineがかぶることを言ってるのかな
それは確かに面倒かもねぇ。

675 :デフォルトの名無しさん:2009/10/14(水) 02:21:35
public指定はよくないみたいなんでprivateにした上で子クラスを親クラスでfriend指定にしたらいい感じになったんでこれでいきますわ

676 :デフォルトの名無しさん:2009/10/14(水) 02:27:36
何だその不気味なやり方は

つーか場合によりすぎて、どうするのが常に正しいとかほとんど無いから、ちゃんと
どういうクラス設計なのかを明らかにしないとまともな回答は来ないと思われ

677 :デフォルトの名無しさん:2009/10/14(水) 02:31:41
なんのためにprotectedがあるんだろうな。。。

678 :デフォルトの名無しさん:2009/10/14(水) 02:40:35
ゲームの敵を作ってるんですがメンバ変数は同じで動きの処理だけが異なるクラスを複数作ってるんです。
class Teki
{
  private:
    int hp;
    int mp;
  public:
    void init(void);
    void action(void);
}
できるだけ無駄を省きたいとの思いから、上記のクラスを親クラスにして子クラスでaction関数だけオーバーライドすることにして、
子クラスで同じメンバ変数の記述をなくすためにメンバ変数は子クラスからアクセスできるようfriend指定にしてみたんですが
もっといい方法あったらおしえて下さい。

679 :デフォルトの名無しさん:2009/10/14(水) 02:44:39
おお、protectedの方がスマートですね。勉強になりました。

680 :デフォルトの名無しさん:2009/10/14(水) 03:17:59
はい。
けれど、privateにしておくべきものまでprotectedにするようなことはやめてください。
また、参照しかしないつもりでpublicにするのは、それ自体がバグだといっても過言ではないです。

681 :デフォルトの名無しさん:2009/10/14(水) 03:19:49
protected は中途半端。
方針としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。

682 :デフォルトの名無しさん:2009/10/14(水) 03:24:36
>>670
何がわかってるって?
http://www.google.co.jp/search?q=%22%E3%83%90%E3%82%A4%E3%83%88%E9%A0%98%E5%9F%9F%22
「配列として括る」も意味がわからんな。

構造体のパディングが何のために必要なのか、ググってみるといい。

必要でないところでパディングなんか入れたら領域が無駄になるんだから、
そんなのをさじ加減で決めるようなコンパイラ設計者は生き残れない。

683 :デフォルトの名無しさん:2009/10/14(水) 05:30:04
>>668
> そいつらにパディングが付かないのは、 char しか入ってない構造体に
> パディングを付ける必要がないから。

この意味が分からんのだが。

684 :デフォルトの名無しさん:2009/10/14(水) 06:27:55
あれだろ
4バイトごと扱うとかそーゆーのだった希ガス
char
char
int
とかきたとき1,1,4だからcharとintの間に2バイトの詰め物が入るとかそんなだよね?
だからcharだけだと詰め物いれる箇所がねーとかそういう理由?
あーでも付かないっけ?
例えば4バイト毎でchar3つのときに最期に1バイト詰め物入るような気もするけどな

http://www.g-ishihara.com/c_st_01.htm

ググッたら余計わからなくなったw
sample4_tのパディング3ってなんで1なの?

685 :デフォルトの名無しさん:2009/10/14(水) 06:54:20
またわかりにくいページ見てるな。
「バイト境界をまたがないように配置」というのは良いんだが
そもそも、単独で「バイト境界」という言葉はあまり使わない。
「○バイト境界」として、数字を入れて使うのが普通。

しかも、それはシステム全体で一つに決まっているわけではなくて
配置されるデータの型によってそれぞれ決まる。
例えば、「doubleは8バイト境界に配置」「longは4バイト境界に配置」「shortは2バイト境界に配置」
というように。

構造体の場合は、配列にした時に正しくアクセスできるよう
中に含まれるメンバの中でもっとも境界条件の厳しいメンバに合わせられる。

ちなみに、sizeof(short)が2の場合は、大抵は2バイト境界に配置されるため
sample4_tのパディング3は、大抵1になる。

686 :デフォルトの名無しさん:2009/10/14(水) 06:59:34
あと、コンパイラによっては
メンバの型(特に大きさ)だけではなく
プロセッサのキャッシュラインのサイズも考慮して
そのサイズにアラインメントをあわせようとするものもある。

で、そのへんは、構造体だけでなく
ローカル変数の配置や関数呼び出し時に渡す引数の間隔にもかかわってくる場合がある。

687 :デフォルトの名無しさん:2009/10/14(水) 11:29:03
どーしても自分自身をdeleteしたいのですか、止めておいた方がいいですか?

void Hoge:: func ()
{
  // 何か処理
  delete this;
}



688 :デフォルトの名無しさん:2009/10/14(水) 11:32:49
>>687 http://lmgtfy.com/?q=delete+this

689 :687:2009/10/14(水) 11:57:37
気をつければ全然OKみたいですね。
僕はバグを作らないので問題ないです。
気にせず使いまくることにします。




690 :デフォルトの名無しさん:2009/10/14(水) 12:16:51
>僕はバグを作らないので問題ないです。

そんな人はいません

691 :デフォルトの名無しさん:2009/10/14(水) 15:00:29
そんなオカルトありえません!

692 :デフォルトの名無しさん:2009/10/14(水) 15:30:17
まぁそれはともかくdelete thisは別に問題ないよ

693 :デフォルトの名無しさん:2009/10/14(水) 17:21:18
>>687
自殺予告かとおもた

694 :デフォルトの名無しさん:2009/10/14(水) 17:57:24
ところでこのコードを見てくれ。こいつをどう思う?
static const int Hoge = rand();

(本当はrandじゃないんですが、呼び出しごとに戻り値の変わりうる関数です)
ということなんですが、constつき大域変数が初期化されるタイミングは
どのように決まるんでしょうか。
翻訳単位内のいずれかの大域変数が参照されたとき、いっせいに初期化されるのではないか、
と推測しているのですが。

695 :デフォルトの名無しさん:2009/10/14(水) 18:14:23
>>694
なぜ試さない。

アプリケーションプログラムの初期化時。

696 :デフォルトの名無しさん:2009/10/14(水) 19:46:30
コンパイル時に乱数を取得したい場合はどうするの?

697 :デフォルトの名無しさん:2009/10/14(水) 19:47:40
>>696
テンプレートメタプログラミングしかないと思うけど。

698 :デフォルトの名無しさん:2009/10/14(水) 19:52:26
>>697
具体的な方法は?

699 :デフォルトの名無しさん:2009/10/14(水) 19:53:28
echo "#define RAND_HOGE ${RANDOM}" >> header.h
みたいな感じでビルドスクリプトの中で適当なスクリプト使ってコードを生成すりゃいいんじゃね?

700 :デフォルトの名無しさん:2009/10/14(水) 20:12:10
-Dオプションでマクロに乱数の結果を放り込むとか。

もっと言ったら、TMPでメルセンヌツイスターを実装するか。やりすぎかw

701 :デフォルトの名無しさん:2009/10/14(水) 20:17:28
一方ロシアはPerlでメタプログラミングした

702 :デフォルトの名無しさん:2009/10/14(水) 20:18:48
Perlもいいよな。C++の定数を使いたいときはC++でC++のソースを出力するプログラムを
書いたりもしてるが。

703 :デフォルトの名無しさん:2009/10/14(水) 20:20:34
ああ、不正コピー防止とかに使うのかなw<乱数

704 :デフォルトの名無しさん:2009/10/14(水) 20:25:11
一方中国はメタプログラミング現場も見せろと言った

705 :デフォルトの名無しさん:2009/10/14(水) 21:32:32
結局はビルドスクリプトでPerlを使えってことだな。


706 :デフォルトの名無しさん:2009/10/14(水) 21:38:59
中国人とペアプログラミングか

707 :デフォルトの名無しさん:2009/10/14(水) 22:50:46
std::iterator_traits に関して、ポインタがT * の型しか分からない状況ときに
T を(型を)得る関数と理解してますが、あってますか?

708 :デフォルトの名無しさん:2009/10/14(水) 22:55:56
あってません

709 :デフォルトの名無しさん:2009/10/14(水) 22:56:12
>707 です、質問の修正です
std::iterator_traits に関して、ポインタとしてT * の型が分かっている状況ときに
T を(型を)得る関数と理解してますが、あってますか?

710 :デフォルトの名無しさん:2009/10/14(水) 22:57:52
>>708>>709です、20秒差でかぶりました、そうですか、残念です。

711 :デフォルトの名無しさん:2009/10/14(水) 23:10:10
>>702
俺は Ruby 使ってるけど、この手のスクリプト言語は便利。
C++とかと相補的に使える。

712 :デフォルトの名無しさん:2009/10/14(水) 23:17:01
ぐるーげんご

713 :デフォルトの名無しさん:2009/10/14(水) 23:24:58
PerlとかRubyを使ってるって言う人はどういうふうにつかってるの?
コンパイル時にコード生成に使うだけ?
Luaみたいに実行中に呼び出すの?

714 :デフォルトの名無しさん:2009/10/14(水) 23:35:26
>>713
その人に依るんじゃないかな。俺は複雑な事はしない。

コード生成を含めテキスト処理、特定のルールでファイルの名称を一括して変
えたいとき、ファイル形式を変えたいとき、テスト、簡単なデータ抽出等々。

715 :デフォルトの名無しさん:2009/10/14(水) 23:47:37
他、ファイルをまたがる名前を置換したいときなど便利。エディタにそういう機能が
あるのもあるけどね。

716 :デフォルトの名無しさん:2009/10/15(木) 00:09:52
VCだとALT+E+F+I

717 :デフォルトの名無しさん:2009/10/15(木) 00:15:28
新たなソースファイルを作成するとき、Perlでファイルテンプレート生成用のスクリプトを書いてる。

718 :デフォルトの名無しさん:2009/10/15(木) 00:19:48
ソースファイルに著作権表示一括挿入とか、一括変更とか。
コメントの出現率を計算して、少ないファイルは見直しするとか。

719 :デフォルトの名無しさん:2009/10/15(木) 00:23:39
どれもC++でできないことでは無いが、この手のことはスクリプトの方が試行錯誤も早いし楽。

720 :デフォルトの名無しさん:2009/10/15(木) 03:18:39
やっつけで適当な仕事をさせる時はPerlだな俺は
こういう処理をさせたい、と思ってから数十秒で仕事が終わってる感覚は捨てがたい

721 :デフォルトの名無しさん:2009/10/15(木) 03:20:11
あ、別にPerlじゃなくてもいいよ多分
他のスクリプト言語を覚える必要を感じる機会が無かったから覚えてないだけで、
多分同じような利点はみんな持ってると思うし

722 :デフォルトの名無しさん:2009/10/15(木) 05:48:27
Visual C++ 2008 で

tr1::shared_ptr< Ty > p = new Ty; // NG. explicit なので

vector< tr1::shared_ptr< Ty > > v:
v.push_back( p ); // NG. 同上

なんだけど、他のコンパイラでもいっしょ?

723 :デフォルトの名無しさん:2009/10/15(木) 07:10:15
>>722
少なくとも、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

724 :デフォルトの名無しさん:2009/10/15(木) 12:09:38
ディスプレイにメモを書くようなアプリケーションを作ろうと思っています。
GetDC関数とLineTo関数をあわせてウィンドウに線をひいたりはできるようになったのですが
文字を書くことが出来ません。どうすればよいでしょうか?

725 :デフォルトの名無しさん:2009/10/15(木) 12:14:22
>>724
TextOut関数とか、DrawText関数とか

726 :デフォルトの名無しさん:2009/10/15(木) 12:54:45
>>725
ありがとうございます!

727 :724:2009/10/15(木) 14:49:49
すいません、ダメでした。どこが間違ってるんでしょうか?
X・Y座標を正の値にしたりしましたがどこにも描画された様子がありません

#include <windows.h>
int main(){
TextOut(
0, // デバイスコンテキストのハンドル
50, // 開始位置(基準点)の x 座標
-100, // 開始位置(基準点)の y 座標
L"testabc", // 文字列
7 // 文字数
);
return 0;}

728 :デフォルトの名無しさん:2009/10/15(木) 14:52:50
>>727
L"testabc"はUnicodeだろ。こう書け:

#include <windows.h>
int main(void) {
HWND hWnd = GetDesktopWindow();
HDC hdc = GetWindowDC(hWnd);
TextOut(hdc, 100, 100, "testabc", 7);
ReleaseDC(hWnd, hdc);
}

729 :デフォルトの名無しさん:2009/10/15(木) 14:57:29
なんで LineTo でやった時と同じように
デバイスコンテキストのハンドルにGetDC の戻りを使わないんだ?

730 :デフォルトの名無しさん:2009/10/15(木) 15:14:24
Unicode云々いうならこうだろ・・・

TextOut(hdc, 100, 100, TEXT("testabc"), 7);
TextOutA(hdc, 100, 100, "testabc", 7);
TextOutW(hdc, 100, 100, L"testabc", 7);

731 :724:2009/10/15(木) 15:21:09
>>728
先言っておけばよかったです、エラーがでるんです

1>c:\documents and settings\user1\デスクトップ\tooloot\a.cpp(5) : error C2664: 'TextOutW' : 4 番目の引数を 'const char [8]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>ビルドログは "file://c:\Documents and Settings\user1\デスクトップ\tooloot\Debug\BuildLog.htm" に保存されました。
1>no - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

このためにユニコードにする必要があったのです
と思ったら>>730さんの方法でできました!ありがとうございました!


732 :724:2009/10/15(木) 15:26:23
>>729
なんでと言われましても、デバイスをディスプレイにするとコードも簡潔にかけて
とりあえずのテストにはいいかな、と思っただけです

733 :デフォルトの名無しさん:2009/10/15(木) 15:29:39
>>732
デバイスコンテキストのハンドル値が 0 (NULL) は
決してディスプレイを指しているわけではないんだが?

734 :デフォルトの名無しさん:2009/10/15(木) 15:29:56
>>732
デバイスコンテキストの0が必ずデスクトップにバインドされてる保障なんてないぞ。

ウインドウズで文字列定数を使いたかったらTRXT("")のマクロを使うんだ。
って>>730がいってたよ。

735 :734:2009/10/15(木) 15:30:39
おっと。被った。

736 :デフォルトの名無しさん:2009/10/15(木) 17:16:46
>>733>>734
すいませんめっちゃ勘違いしてました。
ご指摘ありがとうございました

737 :722:2009/10/15(木) 17:57:31
>>723
サンクスです。あの後調べてみたらboostもexplicitついてました。
自前で暗黙の変換書いちゃおうかとも思いましたが、危険みたいですね…。

738 :デフォルトの名無しさん:2009/10/15(木) 20:26:18
危険というか、せっかく世界中の人たちがよってたかって検証しているライブラリを
ちょっとした思いつきで改造しちゃう奴の気が知れない。

739 :デフォルトの名無しさん:2009/10/15(木) 20:27:37
>>723
しかしまあ、shared_ptrはよく練られてると思うよ。

740 :722:2009/10/15(木) 22:12:23
>>738
いや、まったくおっしゃるとおりで^^;

741 :デフォルトの名無しさん:2009/10/15(木) 22:16:39
しかし、実際にやって失敗してみることも重要だ。
なぜ失敗するのか理由がわかるからね。

742 :デフォルトの名無しさん:2009/10/15(木) 22:19:30
int型の整数を文字列としてstd:string型に格納する方法を教えてください

743 :デフォルトの名無しさん:2009/10/15(木) 22:29:19
std::string a=boost::lexical_cast<std::string>(n)


744 :デフォルトの名無しさん:2009/10/15(木) 22:30:01
itoa を使う(非標準)
snprintf を使う( c標準 )
stringstream を使う( C++標準 )
lexical_cast を使う( boost )


745 :デフォルトの名無しさん:2009/10/15(木) 23:06:38
to_string を使う(C++0x標準)

746 :デフォルトの名無しさん:2009/10/16(金) 01:56:36
あれ? 今日は、lexical_castはlocaleがやっかいといったレスが付かないね。

ttp://www.freeml.com/cppll_novice/1550/latest

747 :デフォルトの名無しさん:2009/10/16(金) 02:23:45
lexical_castは例外を投げてくるのもめんどい

748 :デフォルトの名無しさん:2009/10/16(金) 06:51:36
例外は例外で便利なときもある。

749 :デフォルトの名無しさん:2009/10/16(金) 07:00:46
例外なんか使わずにoptionalで返してくれる方がいい

750 :デフォルトの名無しさん:2009/10/16(金) 08:40:18
lexical_castの場合はキャストの意味論に則っているから、optionalは難しいかもね。

751 :デフォルトの名無しさん:2009/10/16(金) 10:22:13
gdiplus絡みで一つ質問。
Bitmapのコンストラクタに異常なパラメータを渡したんだが例外を吐かないようだ。
メンバにlastResultなんてのがあってそこにInvalidParameterなんてのが入っているようだが、
そいつを見ればいいと言うことでいいのかな。
それとも、何か検証用のメソッドでもあるのかな。

752 :デフォルトの名無しさん:2009/10/16(金) 11:05:36
int型のプライベートメンバ変数nを持つ自作クラスcがあります。
cを格納したvectorをnの値によって検索することが多いので、lower_boundなどで
使えるように、int型との比較演算子をオーバーロードすることにしました。
左辺c<右辺intの場合は、cのメンバ関数として定義できましたが、
左辺int<右辺cの場合はメンバ関数としては定義できないのでしょうか?

753 :デフォルトの名無しさん:2009/10/16(金) 11:15:25
>>752
何故それが必要かは判らんが、必要ならfriend関数として実装すればいいと思う。

754 :デフォルトの名無しさん:2009/10/16(金) 17:46:24
#include <ctime>

int main (int argc, char *argv[]) {
time_t start,finish;
double dtime;

time(&start);

/* 何か処理をする */

time(&finish);
dtime = difftime(finish,start);
cout << " Start - " << ctime(&start) << "Finish - " << ctime(&finish)
<< " Time - " << dtime << " sec" << endl;

return 0;
}

dtimeはちゃんとでているけど
ctime(&start)とctime(&finish)を出力させたら同じになってしまうので直したいのですが
どうすりゃいいですか?

755 :デフォルトの名無しさん:2009/10/16(金) 17:57:18
そりゃctime(&start)とctime(&finish)の間に重い処理を挟まないと
同じになっちまうだろう

756 :デフォルトの名無しさん:2009/10/16(金) 18:15:45
>>754
二回に分ければおk

cout << " Start - " << ctime(&start);
cout << "Finish - " << ctime(&finish)
<< " Time - " << dtime << " sec" << endl;

757 :デフォルトの名無しさん:2009/10/16(金) 18:27:16
>>754
ctime()は(実装によっては)同じバッファを使い回すので、そのような結果になる。
>756の通り一回ずつ出力するか、別のバッファなどにコピーしておかないといけない。
また、同じ理由からスレッドセーフではないのでマルチスレッドアプリでは要注意。

758 :デフォルトの名無しさん:2009/10/16(金) 18:32:17
コンパイラの設定によっては、副作用のない処理をバッサリ削っちゃうから、そのせいかもね。

759 :デフォルトの名無しさん:2009/10/16(金) 18:34:05
>>758
なんの話? まさかとは思うけど>755の恥の上塗り?

760 :751:2009/10/16(金) 18:41:00
セルフフォローするのをすっかり忘れていた。
GetLastError()なるメソッドがあるようで、そいつで件のメンバをチェックしてくれるようだ。
これでBitmapのコンストラクタに存在しないファイル名を渡しても極端に大きな幅を渡しても安心w
それにしても、gdiplusってインターフェースがよくないなぁ、内部でnewしたポインタ寄越すとか。

761 :デフォルトの名無しさん:2009/10/16(金) 18:45:03
>>754
#include<stdio.h>

const char *hoge(const char *foo)
{
static char bar[100];

sprintf(bar, "%.99s", foo);
return bar;
}

int main(void)
{
printf("%s\n", hoge("1st"));
printf("%s\n%s\n", hoge("2nd"), hoge("3rd"));

return 0;
}

あれあれ?どうしてって感じ

762 :デフォルトの名無しさん:2009/10/16(金) 18:53:12
>>760
gdiplusは全然しらないけど、GetLastErrorメソッドはよく見るのでほっとした

763 :751:2009/10/16(金) 18:58:11
うわぁ、すげー間違い。GetLastStatus()だってば。
WinAPIのGetLastError()に引き摺られて途中から無意識に書き間違えていたらしい。

764 :デフォルトの名無しさん:2009/10/16(金) 20:22:06
OpenGLをつかって簡単な描画プログラムをつくっているのですが
main関数でnewをつかって描画処理のクラスのインスタンスを生成して
プログラムを終了するときに
インスタンスをdeleteで解放するして
そのときにデストラクタを呼び出したいのですが
exit関数をつかったらデストラクタを呼び出せずにプログラムが終了してしまうので
どうすりゃいいのかわかりません

どのようにすればよいのでしょうか?

765 :デフォルトの名無しさん:2009/10/16(金) 20:26:18
>>764
exit関数を使わない。

766 :デフォルトの名無しさん:2009/10/16(金) 20:26:27
atexit()?

767 :デフォルトの名無しさん:2009/10/16(金) 20:48:48
>>764
横着せずに順々にreturnして関数を抜けてmainからreturnすればいい。


768 :デフォルトの名無しさん:2009/10/16(金) 21:39:07
staticな弱参照ポインタと共有参照つかえばmainできっちり開放されるシングルトンが作れるじゃないか

769 :デフォルトの名無しさん:2009/10/16(金) 22:03:59
それら以外は開放されないけどな。

770 :デフォルトの名無しさん:2009/10/17(土) 00:34:05
下記の構文の意味がわかりません。

bool BeginScene() { return SUCCEEDED(Device->BeginScene()); }

bool型の変数を宣言しているとは思うのですが、変数名が見当たらない
というかreturnがへんなところにあるし・・・

おねがいします。

771 :デフォルトの名無しさん:2009/10/17(土) 00:45:53
bool BeginScene()
{
return SUCCEEDED(Device->BeginScene());
}

772 :デフォルトの名無しさん:2009/10/17(土) 01:10:04
>>770
それは関数定義だよ^^
良くわからないときはひとつひとつ、丁寧に構文解析をしてみよう★

773 :デフォルトの名無しさん:2009/10/17(土) 02:25:59
bool BeginScene()
{
bool bRet = SUCCEEDED(Device->BeginScene());
return bRet;
}

774 :デフォルトの名無しさん:2009/10/17(土) 07:07:53
>>764
自分はいちいち階層ごとにreturnするのが面倒なので、自作の終了例外クラスを
作成して例外でやってる。mainでその例外を補足し、必要な処理をやった後は
returnするだけ。

775 :デフォルトの名無しさん:2009/10/17(土) 16:13:46
真似しちゃだめだよ。

776 :デフォルトの名無しさん:2009/10/17(土) 17:07:04
うちのヨウムは夜静かにPCしてると「モウネル?モウネルノ?」って聞いてくるので
「そうだね、寝ようか」っていうと「マダネチャダメダヨ」と返事をするのがかわいいです

777 :デフォルトの名無しさん:2009/10/17(土) 17:07:44
あわわ、すみません誤爆しちゃいました!
スルーしてください><

778 :デフォルトの名無しさん:2009/10/17(土) 17:42:35
>>775
なぜ? 例外はそういうときに使用するべきでないという意見以外なら聞きたい。

main以外でプログラムを終了させるのなら、それは例外として扱っても構わないのではと
思ってる。

基本的に、例外は異常系の処理を正常系の処理から分離するのがその一番の目的だと思ってるが、
深い階層からいちいちreturnで戻るのは例外の思想から外れてると思うんだが。

779 :デフォルトの名無しさん:2009/10/17(土) 17:43:12
template<int hoge> class Fuga{

}


こういったテンプレートの使い方をしているコードがあるんですが意味がよくわかりません。
template <class type> class class-name {

といった使い方をするとおもったんですが・・・・

780 :デフォルトの名無しさん:2009/10/17(土) 17:43:22
↓これか

玖符「東方シリーズ総合スレッド 6083/6083」 [ゲームサロン]
衣符「東方シリーズ総合スレッド 6082/6082」 [ゲームサロン]

781 :デフォルトの名無しさん:2009/10/17(土) 17:45:11
>>779
テンプレートの引数には型だけでなく値も入れてもよい。

template<size_t Size> class Array { ...

みたいな、サイズ固定の配列をテンプレートで作るときなどに使う。

782 :デフォルトの名無しさん:2009/10/17(土) 17:47:10
>>779

template <int N>
struct hoge
{
int a[N];
};

とか色々つかえる

783 :デフォルトの名無しさん:2009/10/17(土) 18:04:49
なるほど!


template<int hoge> class Fuga{

public:
Fuga(const float ak[]) : am(ak)
{

}


これはどういうことですか?コンストラクタだと思うんですが:の意味が・・・

}

784 :デフォルトの名無しさん:2009/10/17(土) 18:06:26
>>778
775 じゃないけど、プログラムを終了させることが異常系だとは限らないわけで、
正常な処理として終了させるときに例外を使うのは例外の本来の用途から外れる
からでしょ。

例えば例外発生時にだけ必要なコードは実際に例外が発生するまでメモリ上に
ロードしないような最適化も考えられるわけで、そんな環境では変に終了がもたつく
ような結果を招くことになる。

785 :デフォルトの名無しさん:2009/10/17(土) 18:09:02
>>783 http://www.google.co.jp/search?q=%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF+%E5%88%9D%E6%9C%9F%E5%8C%96%E3%83%AA%E3%82%B9%E3%83%88

786 :デフォルトの名無しさん:2009/10/17(土) 18:12:15
とうほうちゅうきめぇ

787 :デフォルトの名無しさん:2009/10/17(土) 18:16:15
PCで使うなら何度も通るようなパス(ループの内部等)でtry {}しない限りもたつくなんてありえないな

788 :デフォルトの名無しさん:2009/10/17(土) 18:17:21
array_2[] のデータがarray_1[] の配列の何番目に位置するかを取得する、プログラムです。結果をOutputIterator out コンテナに格納しようとし、下記コードからコメントアウトしてコンパイルすると、
error C2664:3 番目の引数を 'std::vector<_Ty>' から 'std::vector<_Ty>' に変換できません。となってしまいます、何処が間違っているのでしょうか?
#include <iterator>
#include <iostream>
#include <vector>
#include <algorithm>
template<class Iterator_First, class Iterator_Second>
void find_first_element(std::pair<Iterator_First, Iterator_First> itpair_first,
      std::pair<Iterator_Second, Iterator_Second> itpair_second)
      //std::pair<Iterator_Second, Iterator_Second> itpair_second, OutputIterator out)
{
 Iterator_First it; Iterator_Second p; unsigned int far = 0;
 for( p = itpair_second .first; p != itpair_second .second; ++p) {
  it = std::find( itpair_first.first, itpair_first.second, *p );
  far = std::distance(itpair_first.first, it);
  // *out = *far;
  // ++out;
  std::cout << *p << " は " << far << " 番目です \n";
 }
}
int main()
{
 using namespace std;
 int array_1[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; int array_2[] = {50, 40, 90, 100, 30, 80, 60, 20, 10, 70};
 std::vector<int> lhs;
 find_first_element<int*, int*>( make_pair(array_1, array_1+10), make_pair(array_2, array_2+10));
 
 //find_first_element<int*, int*, std::vector<unsigned int> >( make_pair(array_1, array_1+10), make_pair(array_2, array_2+10), lhs);
 return 0;
}

789 :デフォルトの名無しさん:2009/10/17(土) 18:20:54
>>774 のレスは説明が不足してるな

790 :デフォルトの名無しさん:2009/10/17(土) 18:26:20
>>784
779で

>なぜ? 例外はそういうときに使用するべきでないという意見以外なら聞きたい。

と書いてるが、まあ、いい。

例外の実装は基本的にlongjmp的なものでされていると認識しているが、それで
パフォーマンスが大きく落ちるとは思えないんだが。

791 :デフォルトの名無しさん:2009/10/17(土) 18:27:10
>>789
足りないか? 足りないとすればどのあたり?

792 :デフォルトの名無しさん:2009/10/17(土) 18:30:24
>>788 です
× //*out = *far;
○ //*out = far;
ここですが修正します。

793 :デフォルトの名無しさん:2009/10/17(土) 18:30:25
>>785
イマイチよくわかりません。コロン:ひとつでいいんですか

794 :デフォルトの名無しさん:2009/10/17(土) 18:31:45
>>788
VC8だと警告一個(distanceの戻りが)で通ったな。

コンパイルに邪魔だから全角スペースに変えてまでインデントを気にする必要ないよ。



795 :デフォルトの名無しさん:2009/10/17(土) 18:32:28
出力イテレータをfind_first_elementに渡すときにstd::back_inserter(lhs)にしたらどうかな?

796 :デフォルトの名無しさん: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::::::::::::::::::::::::::::::::::::`'ー' ・゜
          ` ̄


797 :デフォルトの名無しさん:2009/10/17(土) 18:34:08
なんすかこれ

798 :デフォルトの名無しさん:2009/10/17(土) 18:44:47
>>790
別にあんたを説得しようとしてるわけじゃないし、する気もない。
初心者が考えなしに真似しちゃダメ、おすすめできない、ってことが言いたいだけだよ。


例外処理のパフォーマンスについては↓を見ておいたほうがいい。
http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf
(例外処理については "5.4 Exception Handling" )

最近は longjmp を使うような実装(上記文書中の 5.4.1.1 The "Code" Approach )よりも、
例外が発生しない場合の実行効率を最適化できるデータテーブル式の実装(同じく
5.4.1.2 The "Table" Approach )のほうが多い。っていうか、 Windows 以外ではほぼすべて
テーブル式の実装だと思う。その場合は例外発生時に必要なコードとデータのサイズが
膨らむことにになるので、 >784 で挙げたような話が出てくる。

799 :デフォルトの名無しさん:2009/10/17(土) 18:48:26
>>790
longjumpではデストラクタが呼ばれないでしょう。
デストラクタを呼ぶからくりを考えただけでも、例外の構造の複雑さを暗示している。


800 :デフォルトの名無しさん:2009/10/17(土) 18:49:42
>>799
それでいて、例外を投げないときのオーバーヘッドはほぼ無いんだから想像を絶する。

801 :デフォルトの名無しさん:2009/10/17(土) 18:51:44
>>798
わざわざ資料リンク感謝。あなたの意図は掴めた。

最近の情報に通じてなくて、お恥ずかしいばかりだ。

802 :デフォルトの名無しさん:2009/10/17(土) 18:52:07
例外が何で例外って名前なのかって言う問題もあるよねぇ〜。
基本的に大域ジャンプする目的で使うのは用途違いだと思うよ。
個人的な解釈だと、これ以上実行すると何らかの不利益がでるからやめよう。っていう実装だと思うのよね。
例外なしでもプログラムは組めるし、そんな大域ジャンプするような変なフローだと追跡大変じゃないかい?

803 :デフォルトの名無しさん:2009/10/17(土) 18:52:49
>>799
例外の実装の話をしているのであって、longjmpを使うという話をしているのではないんだが……。

804 :デフォルトの名無しさん:2009/10/17(土) 18:55:46
>>802
まあ、そうなんだが、main以外で終了したいときもあるし、パフォーマンスに
重大な影響を及ぼすわけではないのなら、さっさと楽な書き方をしたいときもある。
でなければ、exitが存在する理由がなくなる。

exitを使いたいとき、exitでは呼ばれるべきデストラクタが呼ばれないため、
例外を使うと便利という話。

805 :デフォルトの名無しさん:2009/10/17(土) 18:57:23
exit使うぐらいなら例外ってぐらい?

806 :デフォルトの名無しさん:2009/10/17(土) 18:58:50
>>804
否定はしないが、人には勧められない方法ではある。

807 :デフォルトの名無しさん:2009/10/17(土) 18:59:01
>>805
ニュアンスはちょっと違うけどね。exitではデストラクタが呼ばれないのが痛い。
exit使いたくても使えない、でも、exit的なことをしたい、だから、例外。みたいな。

808 :デフォルトの名無しさん:2009/10/17(土) 19:00:37
「この例外を投げればプログラムが終了する」とか使ってたら思ってたら、実は途中に
catch(...) があって不可解な結果に悩まされたりするとか。

809 :デフォルトの名無しさん:2009/10/17(土) 19:01:29
>>806
exitの代わりに例外使用している側だが、逆に否定しない理由が知りたい。

こうやってわざわざ書いてるのは、真っ当な批判を受けたいからというのもある。


810 :デフォルトの名無しさん:2009/10/17(土) 19:02:31
>>808
exitの代わりに例外使用している側だが、それはあるかもね。

811 :デフォルトの名無しさん:2009/10/17(土) 19:03:45
>>794>>795
ありがとうございます。
>>794
>VC8だと警告一個(distanceの戻りが)で通ったな。
ごめんなさい、環境を書いていませんでした、VS2005です。
>コンパイルに邪魔だから全角スペースに変えてまでインデントを気にする必要ないよ。
ありがとうございます^^
>>795
ありがとうございます
find_first_element<int*, int*, std::vector<unsigned int> >( make_pair(array_1, array_1+10), make_pair(array_2, array_2+10), std::back_inserter(lhs));
ですよね、これも同じ結果なんですよ、というかこれを貼ったつもりだったのですが
混乱してました。

812 :デフォルトの名無しさん:2009/10/17(土) 19:04:00
>>796←こういうの貼ってるやつ恥かしくないの?
お前の生きてきた成果がコレw?
もうやめちゃえよ
プログラムなんてこの先組めるようになんてならないからw

多分、生まれとか育ちとか悪かったんだろw

813 :デフォルトの名無しさん:2009/10/17(土) 19:04:53
>>809
exitはデストラクタが呼ばれないことを知っていて、リスクを承知して使うなら止めないけど。

他人に勧める手法ではないなと思うよ。


814 :802:2009/10/17(土) 19:05:02
>>804
俺exit関数はほとんど使ったことないな。特にC++に移行してからはまったく。
Cにしたって、結局さかのぼってメモリを開放しないと後遺症のこすから、はじめからexit関数は無いもんだとおもってる。
ネストの深いプログラム書くとほしくなるのは理解できるけどね。

815 :デフォルトの名無しさん:2009/10/17(土) 19:07:24
>>813
すまん、読み返したらぜんぜん違うこと言ってた。

816 :デフォルトの名無しさん:2009/10/17(土) 19:09:35
>>813
了解。

>>814
まあ、おっしゃるとおり。自分もコンソールアプリケーションを書いていて、
--helpオプションを指定されたとき、ヘルプ画面を表示して終了とか、
そんなちゃちなときにしか使ってないんだけどね。

817 :デフォルトの名無しさん:2009/10/17(土) 19:10:34
極論するとtry-catchって返り値でのエラーチェックよりコードがシンプルに書ける(結果としてバグが減る)ってだけじゃないの?

818 :デフォルトの名無しさん:2009/10/17(土) 19:10:53
>>815
と言うと?

819 :デフォルトの名無しさん:2009/10/17(土) 19:12:54
>>817
そだね。そうは言っても、戻り値チェックで異常系の処理をやっていたら、
コードの大半が異常系になっちゃうし、リソースリークさせないための処理も
書くとえらいことになる。

820 :デフォルトの名無しさん:2009/10/17(土) 19:16:40
俺もexit代わりに例外使ってるよ。
というか、それにしか例外使ってない。

821 :デフォルトの名無しさん:2009/10/17(土) 19:19:24
>>808
それはエラー値returnしてるのにチェックしてない箇所が途中にあっても一緒では

822 :802:2009/10/17(土) 19:20:44
むぅ。ちょっと強く言い過ぎたか。
俺基本的にメモリ確保するの大嫌いだから、スタックですむならそうしてるんだよな。
機能別にクラス設計して、その機能を集約するクラスを設計して、画面表示が必要なら、その集約クラス用の表示クラス書いて。
ってだんどりだなぁ。
機能には初期化、主要処理、破棄。を明確にして、無限ループは基本的に作らない。for文大好き!
そんな感じで停止性を確保していけば、なかなか途中で終わらせようとは思わなくなった。どこかで止まるからね。

823 :デフォルトの名無しさん:2009/10/17(土) 19:20:59
>>821
だれも例外とエラー値の違いなんて話してないよ。

824 :デフォルトの名無しさん:2009/10/17(土) 19:23:29
イベントループからの脱出は例外でやるんですね
try {
engine.run();
} catch(/* ry */) { ... }

ループの内部でisQuit();とか馬鹿らしいですからね

825 :デフォルトの名無しさん:2009/10/17(土) 19:24:02
>>823
例外はお奨めできない。
となるとじゃあ変わりに何を使えばいいか?となったら、エラー値じゃないの?

826 :デフォルトの名無しさん:2009/10/17(土) 19:25:43
>>825 お前は >>764 から読み直せ。

827 :デフォルトの名無しさん:2009/10/17(土) 19:28:44
実験用の書き捨てコードを書くときに手を抜けて便利
APIが失敗したときはときはどうしよう→とりあえず例外に旨を添えて投げときゃいいじゃん
みたいな具合で

828 :デフォルトの名無しさん:2009/10/17(土) 19:32:26
>>826
その後の774とか778でreturnと比べてないかね

829 :デフォルトの名無しさん:2009/10/17(土) 19:34:52
>>822
システムコールやライブラリコールでの戻り値を全部チェックしてる?
自分はprintfレベルでも全部チェックしてるんだけど、そんな状況で例外を
使わないとまじ死ねるんだが、どう?

830 :デフォルトの名無しさん:2009/10/17(土) 19:37:29
783をお願いします

831 :デフォルトの名無しさん:2009/10/17(土) 19:41:37
>>830
http://lmgtfy.com/?q=member+initialization+list+C%2B%2B

832 :デフォルトの名無しさん:2009/10/17(土) 19:41:41
>>828 ああそうだ。エラー値とか関係ない。

833 :デフォルトの名無しさん:2009/10/17(土) 19:44:03
788 これもお願いします。


834 :デフォルトの名無しさん:2009/10/17(土) 19:45:10
>>830 お前は >>785 のリンク先以上の説明をこのスレに書けというのか?

835 :デフォルトの名無しさん:2009/10/17(土) 19:46:01
>>831
なんかすげーなそれ

836 :デフォルトの名無しさん:2009/10/17(土) 19:47:14
>>829
関数でラップして、ブーリアンにできるやつはなるべくそうする。これだけで半分はなくなると思う。
エラーチェックはできるだけ関数の頭でifの羅列で切って抜けてきた処理をこなすって感じだな。
もちろん抜けがあればそこで引っかからないこともあるけど、デバッグと簡易ユニットテストで取るようにはしてる。

837 :デフォルトの名無しさん:2009/10/17(土) 19:53:43
>>836
なるほど。

自分はソースの読みやすさや整合性、一貫性を重視してて、失敗しない関数
(つまりエラーの戻り値を返さない)を書いて、値を求める関数以外はvoid型にして、
例外を多用してるわ。まあ、ここらへんは設計思想の違いかなと。

838 :デフォルトの名無しさん:2009/10/17(土) 19:56:46
つーかね、大概のシステムコール、ライブラリコールって、バグがないときに普通に
使ってたらエラー値が返ってくることないと思うのよ。だから、そんなののために
毎回異常系の処理を書くのはちょっと無駄かなと思うのよね。

839 :デフォルトの名無しさん:2009/10/17(土) 19:59:46
>>811
テンプレート引数の明示要らない。

840 :デフォルトの名無しさん:2009/10/17(土) 20:12:01
>>839
ありがとうございます。
結果は得られましたが、疑問が残ります。
なぜ、template 引数を明示したらエラーになるのでしょうか?


841 :デフォルトの名無しさん:2009/10/17(土) 20:12:10
>>838
エラー回復が必要な処理はチェックは条件がそろったら速攻でしてなるべく必要ないように使うかな??

842 :デフォルトの名無しさん:2009/10/17(土) 20:19:25
>>841
概ね理解できるけど、C++には例外があって、例外が実際よく使われているのに、
そこまでこだわるのは、ちょっと損してるかもね。そりゃ、例外使うと
パフォーマンスが仕様に満たないとかなら分かるけど。

843 :デフォルトの名無しさん:2009/10/17(土) 20:29:31
>>788をboost様の力を借りて頑張った

#include <boost/concept_check.hpp>
#include <boost/range.hpp>
#include <boost/concept/requires.hpp>
#include <boost/range/concepts.hpp>
#include <boost/foreach.hpp>
#include <boost/call_traits.hpp>
namespace foo {
using namespace boost;
template <typename I0, typename I1, typename O>
BOOST_CONCEPT_REQUIRES (
((SinglePassRangeConcept<I0>))
((SinglePassRangeConcept<I1>))
((OutputIterator<O,typename boost::range_difference<I1>::type>)),
(void))
find_first_element(I0 const& i0, I1 const& i1, O o) {
typedef
typename boost::call_traits< typename
boost::range_value<I0>::type >::param_type
value_t;
typedef
typename boost::range_const_iterator<I1>::type searchee_iter;
searchee_iter not_found = boost::end(i1);
BOOST_FOREACH(value_t v, i0) {
searchee_iter s = std::find(boost::begin(i1), boost::end(i1), v);
if (s != not_found) {
*o = boost::distance(std::make_pair(boost::begin(i1), s));
++o;
}}}}


844 :デフォルトの名無しさん:2009/10/17(土) 20:30:40
>>840
テンプレート引数に指定された型が間違ってるから
std::back_inserter(lhs)の戻り値の型がstd::vector<unsigned int>じゃない

845 :デフォルトの名無しさん:2009/10/17(土) 20:35:00
>>842
それもそうだねぇ。検討してみるよ。
それじゃ、引っ込む。

846 :843:2009/10/17(土) 20:35:30
!= not_foundってなんかおかしいな…
やっぱfindはoptionalで返してくれるべきだ

847 :デフォルトの名無しさん:2009/10/17(土) 20:41:37
インターフェースと実装の分離をして作業を独立化したい時に例外の扱いをどうするべきか悩む
たとえばfactoryパターンを使うとして、そこでcreateされる実装はしばしば隠蔽されていることがある
でも、どんな例外が来るのか、仕様変更に伴う例外の増減っていうのは実装に依存する
結局のところ、クライアントは実装のソースかドキュメントを読んでそれにあわせてコーディングするしかない
これじゃあインターフェースと実装の分離をした意味がうすれてしまう(コンパイル時間短縮の効果はあるが)
すべてをあきらめてcatch(...)にすることもできるけど回復可能なエラーを見落としてしまうかもしれない

848 :デフォルトの名無しさん:2009/10/17(土) 20:41:47
>>845
まあ、こっちも言い過ぎたかも。ではね。

849 :デフォルトの名無しさん:2009/10/17(土) 20:42:48
>>836
数えるのも嫌になるほどあるAPIも使用してる分は全部ラップするのか?
それこそ時間の無駄だろ。

850 :デフォルトの名無しさん:2009/10/17(土) 20:44:14
>>847
それはよく分かる。だが、C++の例外仕様は糞なので、ドキュメントを精査するしか
ないかもね。(つか、例外がなくても、ドキュメントはしっかり読んで当然ではあるが)

逆に、投げうる例外をドキュメントに書いてないライブラリはちょっと使いづらいね。

851 :デフォルトの名無しさん:2009/10/17(土) 20:56:16
>>847
その問題を例外以外なら解決できるのか?

問題なのはインターフェースの向こう側にある無数のエラーをどう扱うか、
ということであって、エラーの報告方法として例外を使うかそれ以外を使うか
という点は別の話じゃないのか?

852 :デフォルトの名無しさん:2009/10/17(土) 22:25:03
で、結局スマートな解決方法って何なの?

853 :デフォルトの名無しさん:2009/10/18(日) 01:03:42
例外にしろエラーコードにしろ、関数が返しうるあらゆる結果を想定してコーディング
しなきゃならないのは一緒だよね。
個人的にはエラーコードのほうが好きだけど、例外の大域ジャンプ能力は確かに
便利だし、わかってて使うぶんにはどっちでも構わないと思うけどなあ。

854 :デフォルトの名無しさん:2009/10/18(日) 01:42:07
例外のコストが法外に高いような書き方をしてる人がいるけど、そこまでは高くないぞ
例外を使ってmainまで脱出するせいでアプリの終了がもっさり、なんてアホなことは
さすがに無い
まぁ、やたらとデストラクタが重いクラスとかあったら別だが

855 :デフォルトの名無しさん:2009/10/18(日) 06:17:59
ビットをフラグとして扱う処理があるとして
そのビットのフラグをランダムに発生させる処理がわかりません。
例えば8ビット中に、3本から6本のフラグをランダムに発生させるにはどうしたらよいでしょうか。

856 :デフォルトの名無しさん:2009/10/18(日) 07:03:41
3〜6のいずれかを乱数で発生させて
その回数だけ0〜7の乱数を発生させてそこのビットを立てる

857 :デフォルトの名無しさん:2009/10/18(日) 07:10:00
>>856
ありがとうございます。
でも、それだと偏っちゃいませんか?
処理としてすっきりするんで作ってはみたのですが

858 :デフォルトの名無しさん:2009/10/18(日) 07:28:30
>>857
256通りも無いんでテーブル作っておいてそのindexを乱数で得てマップするようにしてはどうか

// 例:
static const BYTE table [210] =
{7,11,13,14,15,19,21,22,23,25,26,27,28,29,30,31,35,37,38,39,41,42,43,44,45,46,47,
49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,67,69,70,71,73,74,75,76,77,78,79,81,
82,83,84,85,86,87,88,89,90,91,92,93,94,95,97,98,99,100,101,102,103,104,105,106,
107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,
126,131,133,134,135,137,138,139,140,141,142,143,145,146,147,148,149,150,151,
152,153,154,155,156,157,158,159,161,162,163,164,165,166,167,168,169,170,171,
172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,
193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,
212,213,214,215,216,217,218,219,220,221,222,224,225,226,227,228,229,230,231,
232,233,234,235,236,237,238,240,241,242,243,244,245,246,248,249,250,252};

table[get_random_with_range(1,210)];

859 :デフォルトの名無しさん:2009/10/18(日) 08:10:49
>>858
ありがとうございます。
時間掛かったでしょうに…
一先ず、858さんの方法でやってみます。
汎用性がないのが問題ですね。

860 :デフォルトの名無しさん:2009/10/18(日) 10:16:23
>>854
以前シミュレーションのコード書いたとき例外入れると入れない(if で脱出)
で実行速度測ったら結構違った覚えがあるけど、今のコンパイラは違うのかな。
また機会があったら測ってみるか。

861 :デフォルトの名無しさん:2009/10/18(日) 10:43:32
>>859
わざわざこんな単純なテーブルを手書きはしない

はず

862 :デフォルトの名無しさん:2009/10/18(日) 10:46:45
>>859
汎用性を求めるなら、固定のテーブルを持たず、テーブルを作る処理を関数化すればいい。

863 :デフォルトの名無しさん:2009/10/18(日) 10:50:58
初心者です。
class を使った Circular doubly Link List というものを作っているのですが、最初と最後のノードの接続がうまくできません。
どこか完成品置いてあるサイト知ってる方いませんか?

864 :デフォルトの名無しさん:2009/10/18(日) 10:51:03
>>855
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
int i, j;
int bits, value;

for(i=0;i<100;i++)
{
bits=rand()%4+3; // 3~6
for(j=0,value=0;j<8;j++)
{
value<<=1;
if(rand()%(8-j)<bits) value|=1, bits--;
}
printf("%d\n", value);
}
return 0;
}

865 :デフォルトの名無しさん:2009/10/18(日) 10:53:09
エンドユーザーからすれば「リトライ/アプリ終了/無視していいエラーなら無視」が選択できてエラーメッセージが見られれば悪くないと思う
ということで文字列でのメッセージング機能を備えたretryable/fatalの二つの例外基本クラスとその派生クラスを作る
キャッチするほうでは仕様がわかってるなら細かく派生をチェック、仕様がわからなかったりめんどくさかったらリトライするか終了するかだけチェック
これで十分だと思うんだがどうか?

866 :デフォルトの名無しさん:2009/10/18(日) 10:53:26
>>861
手書きだったらすげーよ

867 :デフォルトの名無しさん:2009/10/18(日) 11:03:34
>>864 は rand() を一様乱数であるとして
3bit が 1 なのと 6bit が 1 なのが同じ確率で出る

実際の組み合わせ数はコレ
8C3 56
8C4 70
8C5 56
8C6 28

868 :デフォルトの名無しさん:2009/10/18(日) 11:03:59
8ビットに3〜6本だからまだいいけど
増えたらどうするんだろうね


869 :デフォルトの名無しさん:2009/10/18(日) 11:10:33
>>863
まだテンプレにそって既存コード晒した方が返答されやすいと思うよ。

870 :デフォルトの名無しさん:2009/10/18(日) 11:46:07
メンバ変数名の命名規約が色々あってどれが一番良いのかよく分からん。
どれがデファクトスタンダーとなんでしょ?
m_hogeName
mHogeName
hogeName_
hogeName

871 :デフォルトの名無しさん:2009/10/18(日) 11:49:02
個人だったらどれでもいいよ
集団だったらその集団で決めればいい

872 :デフォルトの名無しさん:2009/10/18(日) 12:34:13
>>860
mainへの抜けだしなんて一回すぽんと走るだけのコードだろ
何万回と回せばそりゃ速度は変わるっつーか、80:20の法則とかもしかして知らない人?

873 :デフォルトの名無しさん:2009/10/18(日) 12:34:58
>>870
僕は一番下ちゃん!

874 :デフォルトの名無しさん:2009/10/18(日) 12:42:51
863です。
ノードの接続は問題ないと思うのですが、わからないエラーがでます。
ろだ > 雑多なファイルをアップする場所 > 9985.zip
にファイル上げましたので時間がありましたら見てみてください。

875 :デフォルトの名無しさん:2009/10/18(日) 12:49:16
>>870
データメンバ名やgetterなど、どんどん名前が被ってくるから、切りないよね。
被ったら、語尾に_を付けていくというやりかたにしてるな。被らないかぎりシンプルに。

class hoge {
...
};

class fuga {
public:
fuga(hoge hoge__) : hoge_(hoge__) { ... }
hoge get_hoge() const { ... }
...
private:
hoge hoge_;
};

みたいな。

876 :デフォルトの名無しさん:2009/10/18(日) 12:52:13
>>872
例外処理が重くないとは一般論としては言えないということでは。


877 :デフォルトの名無しさん:2009/10/18(日) 12:52:25
被って最後に_付けるだけとか地獄絵図にならねーか?

878 :デフォルトの名無しさん:2009/10/18(日) 12:56:03
>>877
意外と回ってるわ。

879 :デフォルトの名無しさん:2009/10/18(日) 12:59:50
アンスコの数にはっきりした意味づけがあれば、それもありかなあ。
仕事で強制されるのは勘弁してほしいけどw

880 :デフォルトの名無しさん:2009/10/18(日) 13:04:08
>>879
意味付けはない。出た順。

俺も最初はメンバはm_とか引数はthe_とか(本に書いてあった)やってたけど、
切りないんで、シンプルに_追加だけにしたんだわ。それ以来楽になった。

コンパイラが区別できればいいし、どうも自分もコンパイラみたいなところが
あるのか、_の数だけで普通に区別が付いてる。そうでない人が多いのなら、
それはおすすめできないんだろうな、たぶん。

881 :デフォルトの名無しさん:2009/10/18(日) 13:07:31
ああ、メンバを参照するときは毎回this->hoge_とかやってるからかもな。
メンバはよく使うくせにローカル変数に埋もれがちなんで。

コンパイルの段でどうせthis->hoge_的処理をやってるので、
パフォーマンスも問題ない。

the_other.hoge_とかthat->hoge_など、文芸的にもなるんで、ソースが
読みやすくなる。(the_other.m_hogeやthat->m_hogeなどよりも)

882 :デフォルトの名無しさん:2009/10/18(日) 13:08:26
2つの場合は処理系で使うんじゃなかったっけ?

883 :デフォルトの名無しさん:2009/10/18(日) 13:17:10
>>882
それは前だね。

884 :デフォルトの名無しさん:2009/10/18(日) 13:19:31
>>874
コピーの時の最後の要素のポインタ繋ぎを忘れてる。

885 :デフォルトの名無しさん:2009/10/18(日) 13:46:40
>>884
ありがとうございます。

コピー時の修正しました + そこを文章化して読ませなくしました。

Unhandled exception at 0x63ef31ea (msvcr90d.dll) in NewLinkList.exe: 0xC0000005: Access violation reading location 0xfeeefee2.
こんな感じのメッセージがでます。

ろだ > 雑多なファイルをアップする場所 > 9987.zip

よろしくおねがいします。

886 :デフォルトの名無しさん:2009/10/18(日) 14:00:20
>>875
メンバー変数は _ 最後につけてるな。あまり美しくないけど、
被った場合のみには、みたいな条件付けるとわけわからん。
たまに先頭に _ 付ける人いるけど、それは危険に感じる。

一旦ルール決めたらプロジェクトではそれにしたがう感じだけど、
いまいちしっくりくるルールが無い。


887 :デフォルトの名無しさん:2009/10/18(日) 14:29:38
>>885
List::insertInOrder()の中でwhileループが1度も回らないとどうなる?

888 :デフォルトの名無しさん:2009/10/18(日) 14:59:29
>>876
mainへの抜け出しに例外を使う、って話に「アプリが重くなるかも」なんてトンチキ
なこと言う奴がいるから「そこまで重い訳がない」って話だろ
そこに、何万回も回してベンチ取ったような話を持ってくるのも明らかにトンチキ

889 :デフォルトの名無しさん:2009/10/18(日) 15:40:11
>>886
大抵のルールはそれぞれが正しさを持っているから、参加してるメンバーの
大半が納得していればOKだし、納得していなければ、改善すればいいと思う。

_の件だけど、コントラクトのためにローカルクラスを作ったりしてると、
メンバ名でも被るのが当然になるんで、警告メッセージがえらいことになる。
そのため、_を追加していくことにした。

890 :デフォルトの名無しさん:2009/10/18(日) 15:53:19
>>889
ローカルクラスって使ってるコード見たこと無いんだけど具体的にどうやってつかってるの?

891 :デフォルトの名無しさん:2009/10/18(日) 16:10:49
>>890
コントラクトプログラミングで、コンストラクタとデストラクタの機構を利用する。
ストロウストロップのプログラミング言語C++でも言及されてる。

ttp://codepad.org/s2MOqJOF

892 :デフォルトの名無しさん:2009/10/18(日) 16:23:16
>>887
ありがとうございます。
直してたら何してるのかわからなくなったのでそれ注意しながらやってみます。







893 :デフォルトの名無しさん:2009/10/18(日) 16:40:07
>>891
うーむ
これって関数の最初と最後に普通にis_valid関数を呼び出すだけじゃダメなのかな?
いまいちローカルクラスにする利点が見えないんだけど・・・

894 :デフォルトの名無しさん:2009/10/18(日) 17:28:26
>>893
これはgetter、setterだから一方向だけだけど、引数も戻り値もある関数だと、
関数の処理が始まる前に必ず事前条件が、関数の処理が終わった後に必ず
事後条件が評価されなければならないわけだけど、それを実現するには
コンストラクタ、デストラクタを用いるのが一番手っ取り早い。

コンストラクタを使うのは、引数または戻り値があるとき、関数の頭は
必ずローカルクラスと体で覚えるので、見落としが減る。

returnする箇所が複数あるときは事後条件を集約できて、コードが
見やすくなるし、心配も減る。

C++に事前条件、事後条件を付け加えるべきだみたいな意見が出たとき、
ローカルクラスで代用できるから、今んとこ必要ないということになった、
という経緯もあるんで、それを使ってる。

まあ、そこまで気にしなくてもいい程度の話だけど、あればデバッグは
格段に楽になることはうけあい。

895 :デフォルトの名無しさん:2009/10/18(日) 17:49:44
892です。
何度もすいません。
List::deleteList()が元凶だったみたいです。
みなさまありがとうございました。

896 :デフォルトの名無しさん:2009/10/18(日) 17:51:32
>>883
アンダースコアふたつ連続は、どこに現れても予約識別子になっちゃうよ。

897 :デフォルトの名無しさん:2009/10/18(日) 18:07:25
>>888
>>794>>798 のリンク先にある文書は読んで言ってるの?
「極端な場合、頻度の低い例外に最適化したシステムでは最初の例外スローが
 ディスクアクセスを起こすかもしれない」と書いてある。

それを否定できるほどの根拠があるの?

実際に "cold" セクションと呼ばれる領域を正常系のコードから分離してまとめる
ようなコンパイラ〜リンカも存在するんで、そんなに非現実的な話じゃないと思うし、
実際に例外を使っててそういう動作をされても、まぁ文句は言えないかと思う。

898 :デフォルトの名無しさん:2009/10/18(日) 18:30:41
>>896
みたいね。やれやれ。別の方法で命名しないといけなくなったk

というわけで、皆さん、ごめんなさい。名前の後に_を追加していくという
命名法は使えませんので、ご注意を。

899 :デフォルトの名無しさん:2009/10/18(日) 20:13:15
メンバ変数の後にアンダーバーつけてるな
ほとんどの場合、privateだから使うとしてもメンバ関数くらいだし

900 :デフォルトの名無しさん:2009/10/18(日) 20:23:44
俺は逆に引数の後ろに_付けてる

901 :デフォルトの名無しさん:2009/10/18(日) 20:24:51
メンバにm_とか付けてると○されますか?

902 :デフォルトの名無しさん:2009/10/18(日) 20:26:02
クラス・タイプはhoge_hoge
typedef名はfuga_typeあるいはfuga_t
引数・ローカルはhoge_hoge
面罵はhoge_hoge_あるいはhoge_hogeですべてthisを使う
メソッドはhoge_hoge
いまのところこれで困ったことはない
タイプ命と変数名が同じになることもあるけどタイプの場合大抵は名前空間があるし、無くても文脈でわかる、最終手段でclass hoge hと明示化もできる

903 :デフォルトの名無しさん:2009/10/18(日) 20:31:51
>>902
メンバ変数が多いと一面thisの荒しになりそうだな。

904 :デフォルトの名無しさん:2009/10/18(日) 20:39:56
>>901
友愛されます

905 :デフォルトの名無しさん:2009/10/18(日) 20:50:19
>>864
完璧ですね。
数学をちゃんと理解してないことを実感しましたよまったく
ありがとうございました。

906 :デフォルトの名無しさん:2009/10/18(日) 21:04:20
>>901
vc++とか使ってると、参照先のメンバ一覧がでてくるよね
そのときにm_で統一してると、少し面倒が増える
だから最後にアンダーバー

関数はcheckHit
メンバ変数はNumber_
ローカル変数はNumber
定数はFIXED_NUMBER
みたくやってるけど、クラス名とローカル変数がかぶるときがあるから難点

907 :デフォルトの名無しさん:2009/10/18(日) 21:22:04
クラス名はなるべくきっちり書いて、変数名は適度に省略とかすればかぶらなくね?
省略スンナボケとか周りに言われると困るけど

908 :デフォルトの名無しさん:2009/10/18(日) 21:31:10
面倒だからハンガリアンでいこう。

メンバー変数 mNumber
ローカル変数 rNumber
グローバル変数 sNumber
const定数 cNumber
関数 checkHit
クラス Hoge


909 :デフォルトの名無しさん:2009/10/18(日) 21:45:57
自動変数名は、関数全体にスコープを持つものはフルスペル、
2〜10行程度の短いスコープを持つものはバッサリ省略、と使い分けてるな。

でもさあ、変数名はフルスペルで!って言っても、
まさかminimumとかmaximumとかいちいち書かないよな。
Cの標準関数名にある省略形なら使ってもOK、って規約を見たことがあるけど。

910 :デフォルトの名無しさん:2009/10/18(日) 21:56:01
さらに考えを進めて、minimumとかmaximumとか具体的でないものを書くならm,n;と書く方がマシだわ
長ったらしい名前で画面が見辛くなるだけな気がする

911 :デフォルトの名無しさん:2009/10/18(日) 22:02:04
英語圏の人は直感でかけるんだからいいよな

912 :デフォルトの名無しさん:2009/10/18(日) 22:06:31
VC2008なら日本語で変数定義できるから(ry

913 :デフォルトの名無しさん:2009/10/18(日) 22:08:06
このレベルの英語なら関係なくね

914 :デフォルトの名無しさん:2009/10/18(日) 22:12:02
>>906
俺はクラス名は大文字で始めて、メンバ変数、関数は小文字で始めるな。
だからクラス名と変数が被る事は無い。定数は全て大文字は同じ。

915 :デフォルトの名無しさん:2009/10/18(日) 22:48:39
数値計算系のプログラムだと変数名にこだわると死ねる
もともとの数学からしてt,x,y,z,s,t,u,v,h,i,j,kとか名前なんて無かった状態だし

916 :909:2009/10/18(日) 22:54:15
>>915
使う変数も多いだろうしねえ。
でも数学屋なりの共通認識はあるんだろ?

917 :デフォルトの名無しさん:2009/10/19(月) 01:16:10
数値計算やるけど、特に他の場合に比べてそんなにひどいと思わんけどな。
コーディングする前に式があるわけで、その式にできるだけ近づける。
v でも式だと v1, vx, とか v_1, v_x, とかあるわけだし。
名前に悩むことはあるが、数値計算系でなくても悩むからね。

918 :デフォルトの名無しさん:2009/10/19(月) 01:50:38
ここで聞くべきかわからないのですが、boost::lambdaで引数のメンバにアクセスする
方法を知りたいです。例えば、vの中からa==10のものを検索したいとします。

struct HOGE { int a; int b; };
std::vector<HOGE> v;

std::find_if(v.begin(), v.end(), (boost::lambda::_1.a == 10));

と書いても、プレースホルダにaなんてメンバはないので、コンパイルできません。
何かうまい方法はないものでしょうか。

919 :デフォルトの名無しさん:2009/10/19(月) 01:55:08
>>918
std::find_if(v.begin(), v.end(), ((&boost::lambda::_1)->*(&HOGE::a) == 10));

これじゃ「うまい」とは言えないかもね。

920 :デフォルトの名無しさん:2009/10/19(月) 10:15:08
"or"というメンバー変数の行で
error: expected unqualified-id before ‘||’ token
というコンパイルエラーが出ます。
多分どこかの誰かが"or"を'||'に定義していると思うのですが、
誰がいつdefineしているかを調べるにはどうすればいいのでしょうか?

921 :デフォルトの名無しさん:2009/10/19(月) 10:29:05
orを別の内容で再度#defineすれば、たぶんエラーメッセージで分かる

922 :デフォルトの名無しさん:2009/10/19(月) 10:45:33
IDE使えば宣言に飛べるんじゃね

923 :デフォルトの名無しさん:2009/10/19(月) 10:47:39
VC++でCからC++に書き換えたコードがあるんですが

class Object {...};
class MyObject: public Object {...};
みたいな宣言があるときに

void print(Object *o) { printf("%p", o); }
void myfunc() {
 MyObject *mo = new MyObject();
 print(mo);
}
とやったときにプリントされるアドレスと mo が一致しません。
printで引数を受け取った時点で、moよりも4バイト後ろに下がっています。
なにか心当たりはありませんか??


924 :デフォルトの名無しさん:2009/10/19(月) 10:55:29
>>923
Objectに仮想関数がなく、MyObjectに仮想関数がある
仮想関数のディスパッチを処理するために、俗に vtbl とか vtable とか言われるものが先頭に追加される

925 :デフォルトの名無しさん:2009/10/19(月) 11:02:00
つまり、変数の内容(アドレス)をプリントしようとして汎用関数
void print_addr(void *p) { printf("%p", p); }
を作ったとしても、渡すインスタンスによっては
期待した動作にならないということですか?


926 :デフォルトの名無しさん:2009/10/19(月) 11:10:22
期待が間違っていればね。

927 :デフォルトの名無しさん:2009/10/19(月) 11:10:47
MyObject* → Object* の過程で vtable 付き/vtable 無し のアドレスを渡す
引数を Object* で受けてるから、その変換が進むわけ
MyObject型のものを Object型として動作させなきゃいけないんだもの

引数を void* で受けるなら 変換なんか知ったこっちゃナシでしょ

928 :デフォルトの名無しさん:2009/10/19(月) 11:15:09
void print_addr(void *p) { printf("%p", p); }
void print(Object *o) { print_addr(o); }
に対して

MyObject *mo = new MyObject();
print(mo);
print_addr(mo);
で、別のものが表示される場合がありえます。


929 :デフォルトの名無しさん:2009/10/19(月) 11:22:04
なるほど!
アドレスずれの原因がわかったついでに、
メンバ変数の内容が、なぜか1つ次のメンバ変数の内容になってしまう
バグの原因もわかった気がします。4バイトずれが原因ぽいです。
とりあえず基底クラスにvirtualなデストラクタを追加してみたら
すべてのバグが直りました
どうもありがとう。

930 :デフォルトの名無しさん:2009/10/19(月) 11:27:38
まさか
 void * で受けといて (Object *) でキャストして Object型の操作利用?
 Object * で受けといて (MyObject *) でキャストして MyObject型の操作利用?
かなり危なっかしい使い方のように思えるけど…

931 :デフォルトの名無しさん:2009/10/19(月) 11:31:58
キャストしたら負け。

932 :デフォルトの名無しさん:2009/10/19(月) 11:35:31
"or"ってそもそもC/C++の予約語だね。
使う方が悪い。困った。

933 :デフォルトの名無しさん:2009/10/19(月) 11:41:56
予約語・・・?
iso646.h で #define されるだけじゃないっけ
と思ったけど C++ では予約語なのか

934 :デフォルトの名無しさん:2009/10/19(月) 11:53:29
困ったなら orz にしたら

935 :デフォルトの名無しさん:2009/10/19(月) 13:11:31
DXUT(MSのDirectXを扱うライブラリ)を使用しています。
STLのリストを使おうと思って、その使おうとしているクラスのヘッダファイルに
#include <list>を書くと、その時点のコンパイルでで
\microsoft visual studio 9.0\vc\include\cstdio(49) : warning C4995: 'gets': 名前が避けられた #pragma として記述されています。
というエラーが発生します。冒頭に#pragma onceは記述してもしなくても出ます。
どのような問題が考えられるでしょうか?

936 :デフォルトの名無しさん:2009/10/19(月) 13:38:09
<list>で避けられたgetsを<cstdio>で宣言していると言うだけのことです。

937 :デフォルトの名無しさん:2009/10/19(月) 14:08:31
>>936
して、その心は?

938 :デフォルトの名無しさん:2009/10/19(月) 14:15:11
MSに心なんてあると思っているの?

939 :935:2009/10/19(月) 15:53:49
すいません。エラーではなく警告でした。
恐らくこのままでもstd::Listは使えると思います。

しかしこのような警告が39個も出てコンパイル時に面倒です。

というかこのまま警告を出していて不都合はないのか?
そしてなぜ、このような警告が出るようにSTL・あるいはcstdioの
設計が出来ているのか、などお詳しい方いらしたらご指導お願いします。

940 :デフォルトの名無しさん:2009/10/19(月) 16:22:55
どうして.演算子をオーバーロードできないんですか?

941 :デフォルトの名無しさん:2009/10/19(月) 17:01:24
>しかしこのような警告が39個も出てコンパイル時に面倒です。
抑制したら? 抑制の仕方はコンパイラのスレで。

>というかこのまま警告を出していて不都合はないのか?
全然。単に警告だから。

>そしてなぜ、このような警告が出るようにSTL・あるいはcstdioの設計が出来ているのか、
MSだから。つーか、インクルードの順番変えてみた?

>お詳しい方いらしたら
環境も判らんのに何に詳しいと?

>ご指導お願いします。
イヤだ。

942 :デフォルトの名無しさん:2009/10/19(月) 17:03:27
>>940
どうして演算子をオーバーロードできないと思い込んでいるんですか?

943 :デフォルトの名無しさん:2009/10/19(月) 17:04:41
単なる誤爆じゃないか?

944 :デフォルトの名無しさん:2009/10/19(月) 17:16:26
>>941
すいません。環境はVC++2008ExpressEditionです。
動作原理みたいなものが分かって、かつ抑制するしかない時は
抑制してみようと思います。
インクルードの順番は変えても無駄でした。
>MSだから
これは全然分からないので、出来れば
もう少し掘り下げてお願いします。


945 :デフォルトの名無しさん:2009/10/19(月) 17:17:01
>>942
え?できるんですか?.演算子のオーバーロード

946 :デフォルトの名無しさん:2009/10/19(月) 17:19:04
>>945
できることもあれば、できないこともあります
試してみましたか

947 :944:2009/10/19(月) 17:20:45
まず、警告のいわんとする事が分かっていないです
警告の全般的な意図が分からないです。

・・でもちょっと予想で言って見ます。
MSは、予約語みたいな感じで、将来的に
この名前を使うかも知れないので、他のライブラリで
バッティングする名前をつけるなよ・・と
こういいたいのですか?

948 :デフォルトの名無しさん:2009/10/19(月) 17:23:30
getsは常に悪となったので、その名残かと。
かといって4995を常に抑制するのはよくないので、そっとしておいてください

949 :デフォルトの名無しさん:2009/10/19(月) 17:23:47
>>946
試しましたができませんでした
#include <iostream>

struct hoge
{
void operator . (int val) const
{
std::cout << val << std::endl;
}
};

int main(void)
{
hoge h;

h.100;

return 0;
}

950 :948:2009/10/19(月) 17:27:25
>>947
http://tinyurl.com/yf9mvkm

951 :デフォルトの名無しさん:2009/10/19(月) 17:30:33
_CRT_SECURE_NO_WARNINGSでいいかもしれんね

952 :944:2009/10/19(月) 17:39:38
>>948
グーグルウザスw。助かりました。ありがとうございます。
これから使う関数んじゃなくて、廃棄する可能性がある関数の使用に
警告がいっているということみたいですね。
という事は>>936はあべこべで、実際には<list>が将来廃棄される
可能性のある関数を使っているという認識で良いでしょうか?

953 :デフォルトの名無しさん:2009/10/19(月) 17:47:25
ググルウザスわかります

>>936はあべこべでもないと思う
getsは廃棄予定ではなく、強く非推奨なだけだったように思うよ

954 :デフォルトの名無しさん:2009/10/19(月) 18:00:52
いや、確認していないがlistがgetsを使うなんて馬鹿なことはないはず。
従って、listで何らかのプラグマで抑制しているんじゃないのか?
cstdioはgetsを宣言せざるを得ないからな。

955 :944:2009/10/19(月) 18:01:18
>>953
確かに読み方によっては正しいですね・・・。
ともかく、std::Listで行なわれている往年のC言語の書き方を
MSのcstdioが嫌っている、という事ですね。

もう一つ質問させてください。
cstdioに
using ::printf; using ::puts; using ::remove;
using ::rename; using ::rewind; using ::scanf;
using ::setbuf; using ::setvbuf; using ::sprintf;
using ::sscanf; using ::tmpfile; using ::tmpnam;
using ::ungetc; using ::vfprintf; using ::vprintf;
だとかその他色々書いてあって、文脈的にこれらを使うなという
大意になっているのは、これまでの経緯で分かりましたが
この「using::○○」という書き方は何を意味するのでしょうか?
ネームスペースの使用宣言とも違う書き方ですよね・・・。

956 :デフォルトの名無しさん:2009/10/19(月) 18:03:06
942と946はドットが見えなかっただけだろうから気にするな

957 :デフォルトの名無しさん:2009/10/19(月) 18:05:40
>>955
だから逆だって。cstdioはgetsを宣言しなくちゃならないの。

958 :944:2009/10/19(月) 18:11:06
>>954,>>957

という事は意味合いとしては
「C++時代のライブラリであるSTLは旧時代の関数の臭いをかぐと警告を放つ」
と言った所でしょうか?

959 :デフォルトの名無しさん:2009/10/19(月) 18:30:54
安全性に問題のある関数を参照すると警告を出すようになっているのだが、
<cstdio>がusingでgetsの名前を参照していることになるので、その警告が発動してしまうというわけか。

>>958
違う。警告を出すのはMSのコンパイラ。
<list>をインクルードすると、VC++ではたまたまついでに<cstdio>もインクルードされるようになっておりその余波を受けてしまっているだけ。

960 :デフォルトの名無しさん:2009/10/19(月) 18:38:17
>>959
なるほど〜〜
古い関数を使わないためにSTLを使ってるのに警告を出されるみたいな矛盾w

ともかく、完全に無視してよい警告だと分かり安心しました。
ありがとうございました。





961 :デフォルトの名無しさん:2009/10/19(月) 19:28:46
>>955で挙げたような一連のusing::○○は
nemespace std{ }の中に入っていたので
これらをSTLで使うよという意味だという事が
分かったのですが、相変わらず using ::○○
という書き方の意味が分かりません。
usingの後にネームスペースが来ないで「::」とか
いったいこれは文法的にどういう働きがあるのですか?

962 :デフォルトの名無しさん:2009/10/19(月) 19:44:43
>>918
boost::lambda::bindを使い、次のように書く。
std::find_if(v.begin(), v.end(), (boost::lambda::bind(&HOGE::a, boost::lambda::_1) == 10));

963 :デフォルトの名無しさん: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;
}

964 :デフォルトの名無しさん:2009/10/20(火) 00:46:49
>>963
template<class Iterator>
Iterator::value_type average(Iterator first, Iterator last)


965 :デフォルトの名無しさん:2009/10/20(火) 00:51:36
template<typename ResultType, class Iterator>
ResultType average(Iterator first, Iterator last)
{
ResultType result = 0;
...
}
int result = average<int>(array, array+10);

もしくは…
template<class Iterator>
class average_helper
{
public:
average_helper(Iterator first, Iterator last) : first_(first), last_(last) {}
template<typename T> operator T ()
{
T result = 0;
...
}
private:
Iterator first_, last_;
};
template<class Iterator>
average_helper<Iterator> average(Iterator first, Iterator last)
{
return average_helper<Iterator>(first, last);
}
int result = average(array, array+10);

966 :デフォルトの名無しさん:2009/10/20(火) 00:53:08
ttp://codepad.org/FLqex6fJ
エラーになってしまいます


967 :デフォルトの名無しさん:2009/10/20(火) 00:55:37
>>966
どっと演算子はオーバーライドできません。

968 :デフォルトの名無しさん:2009/10/20(火) 01:32:04
>>964
>>965
ありがとうございます

969 :デフォルトの名無しさん:2009/10/20(火) 02:37:24
>>964は惜しいけどエラー。

#include <Iterator>
template < typename Iterator > typename iterator_traits< Iterator >::value_type average( Iterator first, Iterator last );

970 :デフォルトの名無しさん:2009/10/20(火) 02:38:14
typename キーワードを付けないと ::iterator が型名じゃないよエラーが出てしまう。

971 :デフォルトの名無しさん:2009/10/20(火) 09:27:27
>>940
「 :: 」 「 ・ 」 「 ・* 」は第二引数として値ではなく名前を取り、メンバの参照手段を提供する。
これらの多重定義を認めると、微妙な問題が起きる・・・とC++開発者の一人Stroustrupがプログラミング言語
C++(第3版)で言ってる。

ところで誰か 「using ::」の意味をしらないものだろうか・・・
::は大域を指定する演算子であってネームスペースではないのだが・・・

972 :デフォルトの名無しさん:2009/10/20(火) 09:47:07
>>971 http://lmgtfy.com/?q=C%2B%2B+using

973 :デフォルトの名無しさん:2009/10/20(火) 09:50:30
>>971
> ところで誰か 「using ::」の意味をしらないものだろうか・・・
> ::は大域を指定する演算子であってネームスペースではないのだが・・・

もしかして>>955の話をしているのか?
それなら using の二つの用法、「using宣言」と「usingディレクティブ」の違いについて
ISOなりJISなりC++ランゲージクイックリファレンス(オライリージャパン)なりを読むといいだろう。

974 :デフォルトの名無しさん:2009/10/20(火) 10:01:35
要は、グローバルな名前空間のgetsをusingしているってことでしょ。

975 :デフォルトの名無しさん:2009/10/20(火) 10:10:21
cursesを使いたいんですが、どうすればいいんでしょうか
コンパイラはBorland 5.5です。

976 :デフォルトの名無しさん:2009/10/20(火) 10:11:24
>>973
>>955に関わらず、「using ::○○」という使い方を知りたいのですが・・
そんなに難しい話なのですか?

私の認識としては
usingの後にネームスペースが来る → usingディレクティブ
usingの後に個々の名前が来る → using宣言
:: → グローバル変数へのアクセス
であり、

だとすれば 「using ::○○」は、グローバル変数を使えるようにするという意味になり
グローバル変数はどこでも使えるのでそもそも宣言自体が無意味であると思うのですが、
私が何を勘違いしている見当がつく方いらしたら教えてください・・・。


977 :デフォルトの名無しさん:2009/10/20(火) 10:14:12
>:: → グローバル変数へのアクセス
間違い。
>グローバル変数はどこでも使える
間違い。

978 :デフォルトの名無しさん:2009/10/20(火) 10:14:50
すいません、>>975ですがwindowsです

979 :デフォルトの名無しさん:2009/10/20(火) 10:18:44
>>976
int foo();
namespace N { int foo(); }
namespace N { int bar() { return foo(); } }
namespace N { int baz() { using ::foo; return foo(); } }

これでいいか?

980 :デフォルトの名無しさん:2009/10/20(火) 10:20:04
>>975 http://lmgtfy.com/?q=curses+windows

981 :デフォルトの名無しさん:2009/10/20(火) 10:26:33
>>977 あ・・そうか。
局所の宣言が大域変数を使えなくするから確かに間違いです・・
「using::○○」の意味は
局所で宣下された○○ではなく大域で宣言された○○を使えっていう感じですか?

>>979
おお!すごく分かりやすいです!理解が深まりました。
丁寧にありがとうございました。

982 :デフォルトの名無しさん:2009/10/20(火) 10:28:22
>>961
>> usingの後にネームスペースが来ないで「::」とか

:: もネームスペースだよ。グローバルネームスペースっていうやつ。

983 :デフォルトの名無しさん:2009/10/20(火) 10:54:59
using namespace ::;

コンパイルエラーになるから名前空間じゃないよ

984 :デフォルトの名無しさん:2009/10/20(火) 11:41:30
あー、ごめん。

using 直後の :: はグローバルネームスペースを指すプリフィックス。
・・・あんまりわかりやすくならんな。まぁいいか。

985 :デフォルトの名無しさん:2009/10/20(火) 12:15:20
>>979
int foo();
namespace M { using ::foo; }
namespace N { int bar(){ return M::foo(); } }

こうだな

986 :デフォルトの名無しさん:2009/10/20(火) 13:54:07
>>985
usingを用いた空間内で使用しなくてもOKって事ですか・・・
他空間の名前を、あたかも自分の名前のようにしたって感じですね。
ところで、>>979のような使い方も正しいんですよね?
>>985はcstdioの場合、こっちだろうっていう話ですかね?

987 :デフォルトの名無しさん:2009/10/20(火) 14:37:49
C言語で三角関数のテーブルを作りたいのですがわからないので教えて下さい
ちなみにcosの値が知りたいです。

988 :デフォルトの名無しさん:2009/10/20(火) 14:43:00
>>987
#include <stdio.h>
#include <math.h>
int main(void) {
double d;
for(d = 0.0; d < 10; d += 0.5) printf("%lf %lf\n", d, cos(d));
return 0;
}

989 :デフォルトの名無しさん:2009/10/20(火) 14:44:53
>>988
ありがとうございます。

990 :デフォルトの名無しさん:2009/10/20(火) 14:56:30
ループ制御変数にdoubleを使う馬鹿だけあって、"%lf"なんて本来間違いなものを平気で使うんだな。

991 :デフォルトの名無しさん:2009/10/20(火) 15:49:51
>>990
なら全て教えてください。
後、三角関数の値は入れなくても答えはでるのですか?

992 :デフォルトの名無しさん:2009/10/20(火) 15:56:53
>>991
お前は何の質問をしているんだ?

993 :デフォルトの名無しさん:2009/10/20(火) 16:00:09
>990の主張ははっきりしているじゃないか。
・ループ制御変数にdoubleを使うのはバカだ。
・"%lf"は本来間違いだ。
つまり、for (int d = 0; d < 10 * 100; ++d) printf("%g, %g\n", d / 100., cos(d / 100.));でいいだろ。

994 :デフォルトの名無しさん:2009/10/20(火) 16:05:17
>>993
お前バグっている。%gに整数を渡していい訳ないだろ!
しかもfor(int d... はC++。

995 :デフォルトの名無しさん:2009/10/20(火) 16:05:56
つーか0.5刻みのテーブル作りたいなら別にループ変数をdoubleにしてもいいと思うが

996 :デフォルトの名無しさん:2009/10/20(火) 16:06:22
100じゃなくて100.か。。。ごめん、逝ってくる

997 :デフォルトの名無しさん:2009/10/20(火) 16:07:19
まぁ100.とか書く奴も間違いなくヘタクソだから気にしなくていいんじゃね

998 :デフォルトの名無しさん:2009/10/20(火) 16:11:53
>>994
Remember C99!!

【初心者歓迎】C/C++室 Ver.69【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1256022655/

999 :デフォルトの名無しさん:2009/10/20(火) 16:17:12
もうすぐ終わり

1000 :デフォルトの名無しさん:2009/10/20(火) 16:18:54
hello

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

263 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)