1 :ぴころ ◆lHG3Yzo0a6 2011/08/06(土) 18:08:48.70
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.75【環境依存OK】
http://hibari.2ch.net/test/read.cgi/tech/1299218426/

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)
2 :デフォルトの名無しさん2011/08/06(土) 18:25:17.92
前スレで次スレと称して前スレを貼るなしw
リスト構造からやり直しだなw
6 :デフォルトの名無しさん2011/08/07(日) 18:59:32.96
protected
派生先からはpublic
外からはprivate
7 :デフォルトの名無しさん2011/08/07(日) 19:13:47.22
>>6
あーそれだけなのか
なんで皆難しく説明するのかねぇ?
9 :デフォルトの名無しさん2011/08/07(日) 20:50:04.07
>>7
みんな俺頭いいだお?すごいだろぉ?をしたいものさ
8 :デフォルトの名無しさん2011/08/07(日) 20:45:21.26
publicはpublic
privateはprivate

でも 子供に秘密を教えた時があるよね。
そん時が protected
家族限定みたいな。
12 :デフォルトの名無しさん2011/08/08(月) 18:15:23.62
クラスを参照渡しで引数として渡しているのですが特にコンストラクタなどがない場合関数内でクラス宣言した方が速いですかね?
13 :デフォルトの名無しさん2011/08/08(月) 21:44:26.61
>>12
void func(const hoge& arg)
{
}
よりも
void func()
{
hoge h;
}
ってこと?
14 :デフォルトの名無しさん2011/08/08(月) 21:57:21.02
そういうことです。どっちが速いのかなって
15 :デフォルトの名無しさん2011/08/08(月) 22:39:39.74
>>14
速度どうとかより何かを受け取るために必要な引数じゃないの?
16 :デフォルトの名無しさん2011/08/08(月) 22:39:48.01
void func1(const hoge&){...}
{ hoge h; func1(h); }
なら
void func2(){hoge h;...}
{func2();}
のほうが速いよ
17 :デフォルトの名無しさん2011/08/09(火) 02:34:16.83
>>15
クラスの関数しか使わないので中で宣言してもやることが変わらないんですよ

>>16
中で宣言した方が速いのですか。これは書きなおしだなー
ありがとうございます
19 :デフォルトの名無しさん2011/08/09(火) 06:20:59.42
ドラッグドロップしたファイルの置いてあるディレクトリに
text.txt が出力されているとか
20 :デフォルトの名無しさん2011/08/09(火) 06:33:51.81
>>19
ほんとだ・・・気づきませんでしたありがとうございます
21 :デフォルトの名無しさん2011/08/09(火) 16:04:01.03
放り込むファイルの場所がカレントになるのか。
へー…前からそうだっけ?
22 :デフォルトの名無しさん2011/08/14(日) 00:39:37.76
>>21
俺も実行ファイルと同じ場所になるような気がしていたが、今確認したら
 Win 7 sp1: ドロップしたファイルの場所
 Win XP sp3: ユーザープロファイルの場所
23 :デフォルトの名無しさん2011/08/15(月) 02:00:08.82
スレッドの同期って、共有する変数に対して
1つのスレッドだけが書き込みを行って
他のスレッドは読み込みだけの場合でも必要なのですか?
24 : ◆QZaw55cn4c 2011/08/15(月) 02:06:57.17
>>23
書き込み同士は排他が必要だが、読み込み同士は排他は不要。
問題は書き込み中に読み込み、あるいは読み込み中に書き込み、だが、これは書き込み/読み込み対象のオブジェクトが小さければ不要なこともあるかもしれない。
25 :デフォルトの名無しさん2011/08/15(月) 02:08:30.46
変数の書き換え操作にもともとアトミシティがあるなら不要。
書き換え途中の変数にアクセスしても泣かないなら不要。
それ以外は必要。
30 :デフォルトの名無しさん2011/08/16(火) 02:34:30.88
>>29
>>25の書いてる通り、アトミシティーがあるならそう。
無ければ何が起こっても文句は言えない。
26 :デフォルトの名無しさん2011/08/15(月) 02:37:59.52
メモリバリアしてやらないと、あるCPUが書き込んだ情報は他のCPUが読めないだろ。
x86-64限定ならたぶんOK。
27 :デフォルトの名無しさん2011/08/16(火) 00:18:57.57
main.cppがごちゃごちゃしてきたので、ヘッダファイルとそれに対応したソースファイルに分割中なのですが、
インクルードが上手くいかず、
〜〜〜 定義されていない識別子です。
というエラーが沢山出て頭が爆発しそうです。
ヘッダファイルで宣言、定義した変数、定数、関数、クラスをそのまま対応したソースファイルや
main.cppで使用する方法はありませんか?
28 :デフォルトの名無しさん2011/08/16(火) 01:02:16.82
>>27
リンクしてるか?
33 :デフォルトの名無しさん2011/08/17(水) 19:56:49.90
>>27
VisualC++なら項目の追加で分割したcppやhを全てプロジェクトの中へいれる。
あと、C++はコンパイルすると関数名を勝手に変えてしまうので、ソースを分割するとそれまでリンク出来ていたものが出来なくなるから、hファイルにおまじないを書かないといけない。
29 :232011/08/16(火) 01:55:03.81
返答ありがとうございます、常に排他が必要ではないのですか。
書き込み中に読み込みが行われた場合の問題というのは、
書き込み前の値を読み取られる可能性がある、というだけなのでしょうか?
31 :デフォルトの名無しさん2011/08/16(火) 11:21:11.46
>>29
環境によっては、例えば0xffffから0x10000に書き換える瞬間に読み出した結果が
0x1ffffになるかもしれないし、0になるかもしれない。もしかしたら、0x100ffになるかもしれない。
32 :232011/08/17(水) 03:09:05.42
>>30
>>31
ありがとうございます、環境によっては危険なことになるようですので、
同期はとるようにします。

大変勉強になりました、返答を下さった方々、もう一度ありがとうございます。
34 :デフォルトの名無しさん2011/08/17(水) 22:07:46.93
int
main(int ac, char **av)
{
const int N = 1000000;
int *alloc = new int[N];
memset(allc, 0, sizeof(alloc) * N);
return 0;
}
これを実行すると、セグメンテーションエラーになります。なにか間違ってますか?
$ ./a.out
Segmentation fault
$
環境は64ビットのUbuntuです。
35 :デフォルトの名無しさん2011/08/17(水) 22:10:05.80
sizeof(*alloc)かsizeof(int)にしないとダメなんじゃないの?
36 :デフォルトの名無しさん2011/08/17(水) 22:16:38.94
>>35
ありがとうございます。そうでした。
37 :デフォルトの名無しさん2011/08/18(木) 00:29:23.16
>>35にすれば直らなくもないけど、バイナリでゼロ初期化するセンスがおかしい。
intの配列を全要素0で初期化したいんだから、
std::fill_n(&alloc[0], N, 0);
が素直。
38 :デフォルトの名無しさん2011/08/18(木) 00:54:34.53
ゼロ初期化なら、
int *alloc = new int[N]();
とかで出来なかったっけ
39 : ◆QZaw55cn4c 2011/08/18(木) 04:57:31.26
>>38
配列を初期化できたっけ。
40 :デフォルトの名無しさん2011/08/18(木) 08:28:09.97
>>39
() の場合は可能
41 :デフォルトの名無しさん2011/08/18(木) 12:05:04.81
>>39
ぉぃぉぃ
42 :デフォルトの名無しさん2011/08/18(木) 21:18:39.03
auto& shortname = very.longlong.name;
みたいにして長い変数名を短縮する目的で参照を使うのは
行儀が良くないですか?
少なくともプロは使わない、とか、コーディング規約で普通禁止される、
とか、そういう意見があれば教えてください。

43 :デフォルトの名無しさん2011/08/18(木) 23:20:29.01
>>42
まず長い名前になること自体どっかおかしくね?という視点は必要な気がする。
適切にクラス、関数が切り分けられていないかもしれない。
後は生存期間の問題がなければ個人的には有り。
44 :422011/08/19(金) 00:53:45.00
>>43
回答ありがとう。
長い名前は自分が作ったわけではないライブラリのAPI名でして。
安易に参照作って生存期間でハマるのは前にやって懲りたので、
引き続き気をつけます。
45 :デフォルトの名無しさん2011/08/19(金) 10:51:09.93
>>44
--
{
// 長い処理
auto & shortname = very.longlong.name; // shortnameも充分長ぇよ
// ある程度長い処理
// veryの寿命が尽きた後
}
--
よりは
--
{
// 長い処理
{
auto & shortname = very.longlong.name; // shortnameも充分長ぇよ
// ある程度長い処理
}
// veryの寿命が尽きた後
}
--
のようにブロックにしてスコープを狭くすれば少しだけ安心感が増すかと。
46 :デフォルトの名無しさん2011/08/20(土) 15:22:04.70
wstring *p;
wstring s;
 *p = s;
sの方が*pより長いときに、領域外アクセスで落ちることはありますか?
47 :デフォルトの名無しさん2011/08/20(土) 15:28:09.36
>>46
pは何も指していないが大丈夫か?
単に代入のことを言っているなら、
小さければ内部配列は拡張されるから安心汁
48 :デフォルトの名無しさん2011/08/20(土) 15:31:01.91
>>47 ありがとう
49 :デフォルトの名無しさん2011/08/20(土) 15:54:51.35
>>46
pは実体が確保されていないので、*p=sは常に問題のあるコードです。
不正メモリアクセスで落ちたらラッキー
50 :デフォルトの名無しさん2011/08/21(日) 23:43:29.47
クラスの中で、構造体テンプレートをメンバーに持つってありですか?
設計的におかしいと思うのですが?
51 :デフォルトの名無しさん2011/08/22(月) 00:21:46.17
rebindのことだな!
52 :デフォルトの名無しさん2011/08/22(月) 00:42:12.50
>>50です
>>51 rebind もそうですね
そもそも、クラステンプレートなり、構造体テンプレートを別のクラスで縛ることで得られるメリットってあるのかな?
普通に、そのクラスや構造体のインスタンスを生成して使うのが普通だし、譲歩して他のクラスから
そのテンプレートクラスなりが使いたかったとしても対等な関係で使えるはず
クラスが他のクラステンプレートや構造体テンプレートを所有するメリットについて、誰か説明してもらえませんか。
53 :デフォルトの名無しさん2011/08/22(月) 12:00:26.18
>>52
イメージが湧かないから例を挙げて。
54 :デフォルトの名無しさん2011/08/22(月) 18:10:59.93
関数の引数がstd::stringとstd::wstringの違いで関数をオーバーロードさせる方法がわかりません。
std::wstring strmid (std::wstring, int, int) ;
std::string strmid (std::string, int, int) ;
を両用したいのです

ご教示お願いします
55 :デフォルトの名無しさん2011/08/22(月) 18:23:08.85
>>54
それでいけるでしょ
他の部分に問題があるのでは?
56 :デフォルトの名無しさん2011/08/22(月) 18:48:23.79
>>55
ヘッダーをincludeしてなかったので前方参照できなくて、再帰呼び出しで変換できないエラーになっていました。
ありがとうございます。
57 :デフォルトの名無しさん2011/08/25(木) 18:56:55.18
ファイルシステムにフックしてPC内データ全てのアクセスログを残そうと思うのですが、そういったことは可能でしょうか?
59 :デフォルトの名無しさん2011/08/25(木) 21:45:21.62
>>57
むり
61 :片山博文MZ2011/08/26(金) 13:29:28.16
>>57 OSを仮想化する
62 :デフォルトの名無しさん2011/08/26(金) 13:43:06.65
>>57です。すいません、知識が浅く言葉足らずで。

Windows7/XP等でファイルシステムのシステムコールにフックして
「いつ誰がどのファイルを操作した」といったログを残したいのです。

これって無理なんですかね?
63 :デフォルトの名無しさん2011/08/26(金) 14:09:49.85
64 :デフォルトの名無しさん2011/08/26(金) 15:52:27.37
>>63
これはSetWindowsHookEx()を使ってフックする方法とはまた違うやり方なんですね
このクラスを使ったほうがいいんですかね・・・
66 :デフォルトの名無しさん2011/08/26(金) 23:35:53.52
WindowsNTのスレッドを強制終了するときに自動変数のデストラクタを呼ばせることはできない?
67 :デフォルトの名無しさん2011/08/27(土) 01:03:58.25
>>66
無理。
・NT関係ないだろ
・今時NTかよ
・C++やめてPerlにすればできるよ
69 : 忍法帖【Lv=22,xxxPT】 2011/08/28(日) 00:24:07.31
わからないことが二つあります
using namespaceはヘッダファイルに書くのでしょうか?それともcppファイルに書くのでしょうか?
72 :デフォルトの名無しさん2011/08/31(水) 19:49:09.53
複数のcppファイルでプログラムを構成するとき、
あるcppファイルのグローバル変数は、そのcppのオブジェクト?の、クラスのプライベート変数のようなもの、
externでアクセスできるようになる
という理解はあってるんでしょうか?
73 :デフォルトの名無しさん2011/08/31(水) 20:38:49.97
>>72
あまり正確ではない
キーワードは「リンケージ」
cppで普通に変数や関数を定義すると、それは外部結合になる
外部結合ならば、extern int a;などと宣言することでそれにアクセスできる。

逆に
cppでstatic int a = 1;などと定義してある変数は内部結合になって、
それは宣言しようが、他のcppからはアクセスできない。
勿論ポインタが手に入ればアクセスできるが

関数の場合は宣言にexternつけなくても宣言になるけどな
74 :デフォルトの名無しさん2011/08/31(水) 21:21:55.36
>>73
半分くらい理解しました
精進します

むしろstaticの意味が理解できた気がします
75 :デフォルトの名無しさん2011/08/31(水) 21:46:17.82
クラスAの中でクラスBを生成してもOKですか?
これが包含ってやつですか?
76 :デフォルトの名無しさん2011/09/01(木) 21:05:57.34
>>75
C++は「クラス」を動的に生成することは出来ません
84 :デフォルトの名無しさん2011/09/02(金) 19:21:09.48
>>76
すいません、オブジェクトAの中で、オブジェクトBを生成するのは可能ですか?
85 :762011/09/02(金) 20:17:31.37
>>84
不可能なわけない。
struct A {
 C c;
 B *pb;
 A() : c(100) { this->pb = new B(); }
};
BやCをAが所有するという考えの設計なら、包含とかコンポジションと呼んでよい
80 :デフォルトの名無しさん2011/09/02(金) 14:39:59.01
UTF-8の文字列を保存するデータ型はchar*型(std::string)でいいのでしょうか
それだけでもいいので教えてください
82 :デフォルトの名無しさん2011/09/02(金) 16:54:04.40
>>80
charであってる
83 :デフォルトの名無しさん2011/09/02(金) 17:10:02.82
$ echo $LANG
ja_JP.UTF-8


#include <stdio.h>
#include <string.h>
int main(void){
char *str="ほげほげ";
printf("%d\n",strlen(str));
return 0;
}

最初 ちょとびびるかもねw
86 :デフォルトの名無しさん2011/09/02(金) 21:44:13.80
グローバル変数やグローバル関数は使うなっていう参考書は多いのですがグローバルなクラスを宣言することも推奨されないのでしょうか?
94 :デフォルトの名無しさん2011/09/02(金) 22:21:34.15
>>86,89
用語は正しく使おうな。そこをあいまいにしてる人は物事を正しく理解できてないと思われてもしかたない。
で、君の言いたいことはクラスのインスタンス生成のことのようだが
グローバルなインスタンスは本質的にグローバル変数と同じものなので無闇に使うものじゃない
96 :デフォルトの名無しさん2011/09/02(金) 22:38:38.74
>>94
使わないほうがいいですか。
ありがとうございます

まだまだ勉強が足りませんでしたね。精進します
100 :デフォルトの名無しさん2011/09/03(土) 15:19:46.75
>>86
変数が組み込み型だろうとクラス型だろうと関係ない。
どうしても静的変数が必要な時のみ使用する。
89 :デフォルトの名無しさん2011/09/02(金) 21:57:14.20
宣言?じゃなかったですかね

int hoge()

   hoge hogege();
   hogege.hogehoge();

だいたいこんな感じで関数の中で宣言して使ってるじゃないですか。

hoge hogege();
int hoge()

   
   hogege.hogehoge();

こういうのはどうなのかなって。
90 :デフォルトの名無しさん2011/09/02(金) 21:58:40.94
hogeって何なんだろう、>>89を見てると頭がおかしくなりそうだ
91 :デフォルトの名無しさん2011/09/02(金) 21:59:23.32
>>89
それってどっちでもコンパイルエラーでない?
101 :デフォルトの名無しさん2011/09/03(土) 23:37:04.48
>>89
ぜ、前方参照なんじゃ、ないかな
103 :デフォルトの名無しさん2011/09/04(日) 21:29:36.84
>"グローバル"って、クラス内でスコープが有効って意味?
グローバル変数はグローバル変数だよ。
関数外で外部リンケージの変数が定義されてるだろ。
>>89見てもわからないなら引っ込んでろ
92 :デフォルトの名無しさん2011/09/02(金) 22:01:52.15
あぁ、クラスの宣言には()いらなかったですね
・・・関数名と同じ名前にしたのはまずかったですね
105 :デフォルトの名無しさん2011/09/04(日) 23:33:11.48
>>86と>>89と>>92を読んで、ファイルスコープの変数でなく
クラスのメンバーを想像するなんて、Javaで頭がおかしくなったんじゃないのか
95 :デフォルトの名無しさん2011/09/02(金) 22:23:44.59
クラスをよく理解していない人のコードは、クラスを使用しない人のコードより汚いもんな
102 :デフォルトの名無しさん2011/09/04(日) 19:36:53.06
>89
"グローバル"って、クラス内でスコープが有効って意味?
だったらそれは違う。
複数クラス間で共通に使用するインスタンスなら"グローバル"って呼ぶ。それは原則使用しない。

C言語とかだと、
・変数宣言が関数の中にある場合、スコープがブロック内で有効
・変数宣言が関数の外にある場合、スコープがソースファイル内で有効
って事で、
さらに複数ソース間でもスコープ有効をグローバルって言ってた
104 :デフォルトの名無しさん2011/09/04(日) 22:16:48.32
> 関数外で外部リンケージの変数が定義されてるだろ。

いや、だから >89 に
class クラス名 {
public:
hoge hogege;
int hoge();
}
とかって書いて無いぢゃんw
publicでなくてクラス内で閉じてるなら、いわゆるグローバルと違うから問題無いって事だお。
106 :デフォルトの名無しさん2011/09/10(土) 02:21:28.82
CreateFileW,CreateFileAにフックしてログを残すプログラムを作ったのですが、
エクスプローラ上でtxtを新規作成してもログに残りません。
テキストエディタでファイルを作成した場合はログに残ります。
エクスプローラはCreateFileを使用していないのでしょうか?
テストしたOSはWindows7です。
125 :デフォルトの名無しさん2011/09/12(月) 19:50:30.82
>>106はどこで聞くのが妥当ですかね?
126 :デフォルトの名無しさん2011/09/12(月) 19:54:33.14
>>125
つWin32API質問箱 Build96
http://hibari.2ch.net/test/read.cgi/tech/1315282582/
127 :デフォルトの名無しさん2011/09/12(月) 21:03:30.91
>>126
どうもありがとう
108 :デフォルトの名無しさん2011/09/10(土) 18:23:36.34
C言語を最近はじめまして分からない所があったので質問させて頂きます。
http://mail2.nara-edu.ac.jp/~asait/c_program/part3.htm#section33
上記のサイトにある、switch文についてです。
例コードのcode3.cの4行目にある

#define ESC_Key 0x1b

とは何なのですか?
ご回答よろしくお願いします。
109 :デフォルトの名無しさん2011/09/10(土) 18:26:15.21
コンパイル時定数を定義してる
110 :デフォルトの名無しさん2011/09/10(土) 18:34:39.32
>>109
すみません、難しくてわかりません。
出来ればもっと分かりやすく説明して頂けるとありがたいです。
111 :デフォルトの名無しさん2011/09/10(土) 18:37:31.24
112 :デフォルトの名無しさん2011/09/10(土) 18:39:16.72
>>111
ありがとうございます。
難しいですが大体わかりました。
113 :デフォルトの名無しさん2011/09/10(土) 23:14:02.64
char型のバッファをクリアするのにmemsetを使っています
memset(buf,0,sizeof(buf));
memset(buf,NULL,sizeof(buf));
どっちが一般的なのでしょうか?
ソースを他人に見せます。恥ずかしくないコーディングをしたいので教えてください
114 :デフォルトの名無しさん2011/09/10(土) 23:17:10.55
0がいいよNULLは基本的に無効なポインタを意味しててゼロの代わりではない
117 :デフォルトの名無しさん2011/09/11(日) 21:33:53.76
とあるクラス CHogeがあったとして、
CHogeのメンバ関数内での this というのは、
意味合いとしては、 CHoge*(CHoge型のポインタ) のような認識で合っていますか?
それと、 &this のような表記が意味するのは、
CHogeの実態へのアドレスを記憶する変数の領域が、thisという形で、他のメンバ変数のように存在しているということでしょうか?

クラスを利用していながら疑問に思っていた事なのですが、ご存じでしたらご回答お願いします。
118 :デフォルトの名無しさん2011/09/12(月) 00:12:30.18
>>117
その通り CHoge* だが、変数ではない。
119 :デフォルトの名無しさん2011/09/12(月) 07:15:20.32
*thisならよく見るけど&thisって初めて見た
121 :1172011/09/12(月) 13:26:44.22
>>118
納得しました。
>>119-120
&this 単体では利用できないのですね
というより、120さんのご指摘通りでした。

疑問が晴れました。どうもありがとうございました。
120 :デフォルトの名無しさん2011/09/12(月) 09:24:20.81
&this->a

(&this)->a
だと思ってんだろね
124 :デフォルトの名無しさん2011/09/12(月) 19:33:13.39
そんな昔のことをいつまでもずるずると引きずってさー
前を向いて生きていこうよ。人間は忘れることで生きていけるんだよ
129 :デフォルトの名無しさん2011/09/14(水) 22:59:43.49
テンプレートの「typename T」のTがポインタであるか、
それ以外(intとか)ってどうやって判断したらいいのですか?
130 :デフォルトの名無しさん2011/09/14(水) 23:05:14.55
template < class T > struct is_ptr
{
static bool const value = false ;
} ;

template < class T > struct is_ptr< T * >
{
static bool const value = true ;
} ;


131 :デフォルトの名無しさん2011/09/14(水) 23:18:26.06
>>130
ありがとう。
ポインタのとき、charのポインタとか、intのポインタってのは判定できないのですかね?
133 :デフォルトの名無しさん2011/09/14(水) 23:25:47.80
template < class T , class U > struct is_same
{
static bool const value = false ;
} ;

template < class T > struct is_same< T , T >
{
static bool const value = true ;
} ;


template < class T > struct is_int_ptr
{
static bool const value = is_ptr< T >::value && ( is_same< T , int >::value || is_same< T , int const >::value ) ;
} ;

135 :デフォルトの名無しさん2011/09/15(木) 01:12:11.46
>>133
やりたいことと違うけど参考になったよ。
ありがとう。
入門書よんでからテンプレートの本かったんですが、テンプレートって難しい…
137 :デフォルトの名無しさん2011/09/15(木) 21:39:30.26
それ
template<typename T>class my{〜;
template<typename T>class my<T*>{〜;
でいいんじゃね?
138 :デフォルトの名無しさん2011/09/16(金) 09:07:15.27
C++のstringを学習中ですが、stringでは不可で、charなら出来る事ってあるんでしょうか?
140 :デフォルトの名無しさん2011/09/16(金) 09:53:34.94
>>138
Cで書かれたライブラリで扱いやすい
141 :デフォルトの名無しさん2011/09/16(金) 09:55:45.83
>>139
std::stringはスタックに置けないんですか?

>>138
C標準関数や多くのAPIはstd::stringを直接渡すようにできていない。
特に文字列を詰め込んでくれる関数の場合、一旦charのバッファを必要とする。
143 :デフォルトの名無しさん2011/09/16(金) 10:17:58.76
>>141-142
> 特に文字列を詰め込んでくれる関数の場合、一旦charのバッファを必要とする。

標準としては C++11 からになるけど、あらかじめ十分なサイズを持った std::string s なら
&s[0] で char のバッファと同等に使えるよ。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530
148 :デフォルトの名無しさん2011/09/17(土) 03:06:40.20
>>143
バッファの連続性が保証されても、依然として&std::string[0]を
文字列の受け皿として使用するのは駄目だろう。
std::stringのオブジェクトとしての整合性が失われる。
149 :デフォルトの名無しさん2011/09/17(土) 03:15:45.84
>>148
サイズの範囲内なら文字列の中身が変化するだけなんだから問題ないだろう。
s[0] = 1, s[1] = 2, ... として書き込むのと変わらない。

整合性って、具体的に何のこと言ってるの?
157 :デフォルトの名無しさん2011/09/17(土) 04:17:03.32
>>156
それが嫌だってところから話が始まってんだよ。 >>141-142 読み直せ。

「整合」させたきゃ詰めた後に resize() すればいいだけだろ。
何の問題も無く std::string を使えるじゃないか。
139 :デフォルトの名無しさん2011/09/16(金) 09:17:43.71
スタックにおける
142 :デフォルトの名無しさん2011/09/16(金) 10:14:13.86
Cで書かれた文字列操作って引数stringでラップする時はどう書いてる?
毎回char配列でバッファ確保してコピーしてC関数通して逆コピーしてるけど
すごいもったいない気がしてstringを使う気が起きないんだけど
144 :デフォルトの名無しさん2011/09/16(金) 10:59:04.86
classについて教えてください
コンストラクタを使わないでクラスを使うことができますが
コンストラクタ使う・使わないのデメリット・メリットはあるのですか?

コンストラクタを使わないと静的領域に作られる?初期化を手動?
コンストラクタを使うとヒープ領域に作られる?
146 :デフォルトの名無しさん2011/09/16(金) 11:08:00.71
>>144
「初期化」と言うような処理がある状況でコンストラクタを使わなければ、
初期化を忘れたり2重に初期化してしまうなどの問題が起こる可能性が
高くなる。

領域の割り当ては関係ない。
147 :デフォルトの名無しさん2011/09/16(金) 11:18:59.90
領域割り当ては関係ないんですね了解
2重防ぐことでも使うようにします
ありがとう
150 :デフォルトの名無しさん2011/09/17(土) 03:17:37.74
例えばstrlen(&s[0])とs.size()が違う結果になる、とか。
Cの文字列APIは勝手にNUL止めしたりするでしょ。
151 :デフォルトの名無しさん2011/09/17(土) 03:20:24.69
>>150
strlen(&s[0]) と s.size() が常に同じになると思ってるなら、それはただの勘違いだ。
153 :デフォルトの名無しさん2011/09/17(土) 03:27:44.30
>>150
そんな「整合性」は提供されない。
s[0] = '\0' した瞬間に size() が 0 になったりはしない。
154 :デフォルトの名無しさん2011/09/17(土) 03:33:29.30
>>153
それは理解していて、故にそういう使い方をするのは駄目だと言っているの。
155 :デフォルトの名無しさん2011/09/17(土) 03:50:13.55
>>154
意味が分からないよ。
std::string が提供しない整合性が欲しいなら、その利用者がそのように使えばいいじゃないか。
それの何が駄目なの?
156 :デフォルトの名無しさん2011/09/17(土) 04:09:07.01
>>155
>std::string が提供しない整合性が欲しい
この時点で、std::stringを使うのは手段を間違ってるよね。

最初からcharバッファとして使うなら、オブジェクトとして文字列長を持っているstd::stringである必然性がなくて、vector<char>でいい。
std::stringを使うと混乱を招くと思わない?
152 :デフォルトの名無しさん2011/09/17(土) 03:27:09.12
もちろん常に同じになるとは思っていなくて、同じにならなくなった状態が
不整合だと言ったんだよ。

まあ確かに今までも[]演算子でもC文字列としての長さは変えられるから、
変わらないと言えば変わらないが。
158 :デフォルトの名無しさん2011/09/17(土) 12:44:43.44
結局のところ03の方でアロケータ−をいじる以外でこれ以上の効率化は無理ってことでFAですか?

void CFunc(char * zs);

void Func03(std::string & s)
{
std::vector<char> v;
v.reserve(s.size() + 1);
v.assign(s.begin(), s.end());
v.push_back('\0');
CFunc(&v[0]);
s.assign(&v[0]);
}

void Func0x(std::string & s)
{
CFunc(&s[0]);
s.resize(strlen(&s[0])); // 短くなった時のため
}

163 :デフォルトの名無しさん2011/09/18(日) 03:46:59.63
>>158
サイズの受け渡しが無かったり入力と出力が別にできなかったり、
その CFunc() とかいう関数のインターフェースをどうにかしたいところ。
164 :デフォルトの名無しさん2011/09/18(日) 13:45:03.31
>>158
Func0xはs[s.size()]への書き込みが発生するからだめじゃないの
165 :デフォルトの名無しさん2011/09/18(日) 13:49:54.76
>>164
0xでは内部的にゼロ終端文字列で扱うことになったんじゃなかったっけ?
それともただ単に連続してることだけが保証されてるのかな?
159 :デフォルトの名無しさん2011/09/17(土) 14:26:47.30
std::vector<char> v(s.c_str(), s.c_str() + s.size() + 1);
でいい
160 :デフォルトの名無しさん2011/09/17(土) 23:20:59.79
>>159
それだとstringが内部的に連続バッファじゃない場合に無駄が多くね?
c_strでゼロ終端作って、vectorにコピーだからコピー二回もしてる
161 :デフォルトの名無しさん2011/09/17(土) 23:36:53.90
流れはしらないがどうでも良いところに拘るなよ。
159を見る限りたいした事ではないんだろ。
162 :デフォルトの名無しさん2011/09/17(土) 23:37:46.32
>>161
おめでとう
166 :デフォルトの名無しさん2011/09/18(日) 14:26:30.99
s[s.size()]が0であることも連続していることも保証されるけど
shall not be modified だってさ
167 :デフォルトの名無しさん2011/09/18(日) 14:59:20.56
じゃあ非const操作は結局バッファ取らないとダメなのか…残念
168 :デフォルトの名無しさん2011/09/18(日) 15:58:17.59
>>167
いやいや、 shall not be modified なのは s[s.size()] で参照される値( '\0' への参照)だけだよ。
&s[0] から s.size() ぶんはただの char 配列と同じように使える。
170 :デフォルトの名無しさん2011/09/18(日) 20:33:13.89
void func(int &f); ←func(i);のようなときに呼び出される。
void func(int f); ←func(123);のようなときに呼び出される。
このようにしたいのですが、コンパイルが通りません。
どうすればよいですか?

(func(int &f);をfunc(int *f);にすればとおりますが…)
173 :デフォルトの名無しさん2011/09/18(日) 21:18:37.20
>>170
void func(int &f); ←func(i);のようなときに呼び出される。
void func(const int& f); ←func(123);のようなときに呼び出される。
174 :デフォルトの名無しさん2011/09/18(日) 22:24:15.96
>>173
ありがとうございます。
勉強になりました。
175 :デフォルトの名無しさん2011/09/18(日) 22:34:51.46
>>173
>171
171 :デフォルトの名無しさん2011/09/18(日) 20:59:54.67
希望の、「即値(リテラル)の場合は別動作」を実現するのは、たぶん不可能。

リテラルはconstであることを利用して、const&で振り分けることは可能だが
即値ではないconstな値を同様に処理してしまうという問題は出る。
176 :デフォルトの名無しさん2011/09/18(日) 22:37:35.45
>>171
ありがとうございます。
奥が深いですね。
最近C++を始めたばかりで、いろいろ難しいです。
177 :デフォルトの名無しさん2011/09/19(月) 12:28:30.30
すみません。C++の関数定義の時の「:」について教えてください。

関数定義の際に
クラス名::関数名:親クラス(親クラスのメンバ変数),メンバ変数(0),メンバ変数(new でオブジェクト化){関数定義};
という↑一文があります。実際のソースコードは↓です。
WebView::WebView(QWidget* parent) : QWebView(parent) , m_progress(0) , m_page(new WebPage(this)) { // 関数定義 };

m_progress(0) と m_page(new WebPage(this)) の部分はWebViewクラスのメンバ変数なのですが、
この部分で初期化(インスタンス作成)してるみたいなんですが、そういうことはC++の文法上OKなんでしょうか?

どうも、この関数定義の際の「:」は意味が本を見てもあまり載っていないので、困っています。
180 :デフォルトの名無しさん2011/09/19(月) 13:35:13.09
>>177
文法上OK
というかこれを使わないとデフォルトコンストラクタした直後に代入するという二度手間になって無駄なので積極的に使ったほうがいい
ただしここでthisを使うことはオススメしない
オブジェクトを構築するより先にthisを利用されるとバグを生む可能性がある
181 :1772011/09/19(月) 14:31:53.01
>>179
どうもありがとう。初期化子リストというのですね。名前を教えてもらえたので
グーグルで検索することができます。なにしろ、検索しようにも、コロン(:)では
中々ヒットしないので・・ ただ単純にコンストラクタを使ってるだけなんですね。
どうもありがとうございました。グーグルで更に検索して調べてみたいと思います。

>>180
どうもありがとう。
私はおっしゃるとおり、コンストラクタ内で代入するということをずっとしてきました。
こういうことの手間をはぶくために、この機能があるんですね。ひとつ教えてもらったので
これからはこの機能を使いたいとおもいます。thisは使わないようにすることをよく覚えておきたいと思います。
どうもありがとうございました。

ずっとこれはなんだろうとうやむやのままだったので、ようやくわかってすっきりしました。

どうもありがとうございました。
178 :1772011/09/19(月) 12:30:05.82
ちょっと意味が分かりにくいです。
クラス名::関数名:親クラス(親クラスのメンバ変数),自分のメンバ変数(0),自分のメンバ変数(new でオブジェクト化){関数定義};

↑こうです。
179 :デフォルトの名無しさん2011/09/19(月) 12:35:05.35
初期化子リストでぐぐれ
ただコンストラクタ呼んでるだけだ
int* p(new int);
が合法なのと同じ
182 :デフォルトの名無しさん2011/09/19(月) 14:33:39.21
降っている雪をビルボードで1つ1つ表示する場合、雪1個につき1クラス用意して使い回したほうが良いですか?
それとも全部の雪をまとめて管理するクラスを1つ作ったほうが良いですか?
雪1個1個はキャラの動きや風、爆風などの影響を受けます。
画面上の雪は数百程度を予定しています。

描画回りは別問題として、負荷や速度の観点から、管理するスタイルはどちらが良いでしょうか?
184 :デフォルトの名無しさん2011/09/21(水) 21:43:36.25
>>182
雪クラスと雪管理クラスを作って機能を分担
しかしそういうのは汎用のパーティクルクラスを作ったほうがよくないか
185 :デフォルトの名無しさん2011/09/22(木) 01:15:12.08
>>182
テクスチャとかの描画ステートが共通になるだろうから、そこをまとめた何かがあったほうが
安く上がると思うよ。
186 :1822011/09/22(木) 05:58:16.50
>>184-185
ありがとうございます。
ちょっとそれで作ってみます!
187 :デフォルトの名無しさん2011/09/22(木) 14:31:09.44
同じスレッドを2つ存在させても大丈夫なんでしょうか?

void thread_manp(void*){
 int a;
 while(1){
  a++;
  a--;
 }
}

int main(){
 pthread_t t1,t2;

 pthread_create(&t1,null,thread_manp,null);
 pthread_create(&t2,null,thread_manp,null);

 while(1){
  //関係ない処理
 }

 return 0;
}

こうした場合、2つのスレッドのメモリ領域などは別々に確保されたりして安全なのでしょうか?
OS:Linux(CentOS)
コンパイラ:gcc
190 :デフォルトの名無しさん2011/09/22(木) 18:41:15.19
>>187
ローカル変数(スタック)は別に確保されるから全く問題ない。
グローバル変数の更新は対策が必要。参照する場合もタイミングに注意。
188 :デフォルトの名無しさん2011/09/22(木) 14:38:00.91
問題ない
189 :1872011/09/22(木) 16:22:42.61
>>188
ありがとうございます!
191 :デフォルトの名無しさん2011/09/23(金) 10:23:49.89
質問です。上図のポインタaが指し示しているクラスAの実体ってどこにあるのでしょうか?
クラスBはあくまでも(どこかしらに作成された?)クラスAの実体を指し示すポインタしか持ちませんよね?
くだらない質問で申し訳ありません
// A.h
#include <stdio.h>
#pragma once
class A
{
public:
A();
int getI();
private:
int i;
};

//B.h
#pragma once
#include "A.h"
class B
{
public:
B();
private:
A* a;
};
193 :デフォルトの名無しさん2011/09/23(金) 10:29:31.85
>>191
どこにあるか?そもそも実体を指しているのか?は、そのコードだけでは不明

ポインタがゴミかもしれない
Bのコンストラクタや他のメソッドで
 new A してる
 シングルトンかなんかで管理されているものを引き受けてる
かもしれない
202 :191(1/4)2011/09/23(金) 12:57:30.61
確かにstaticパブリックメソッドにすれば、実体もポインタ/参照もなしで呼び出すことができますね
んーむむ、サンプルコードでの話の抽象化に失敗した気がするので、実際にやりたいことを白状しますと、DirectXの描画関数をクラスで整理したいのです。
描画の制御を別関数化、別クラス化しただけなので、引数、返り値のやりとりはないのですが、1つしかないデバイスの制御なので、実質グローバル関数的な立ち位置になってしまう、static関数はあまり使いたくなかったのです。
ならば、クラスGameMainでもfreindを使えばいい話なんですが、あまりfreindを多用する設計もいかがなものかと思い、呼び出し側のメンバに描画制御クラスを持たせました。(下記ソースコードの状態)
ここまではよかったのですが、ここで、「includeをなるべく使わず、ポインタメンバをもたせることによってincludeの数を減らせ」という文献にあたり、それにしたがってクラスの実体メンバからポインタメンバにしたところメソッドが呼び出せなくなってしまいました。
結局これは、「メンバ関数を使いたい場合にはポインタでもincludeが必要」という記述を見つけ、解決したのですが、
ならば、ポインタメンバを使ってもincludeを節約できないが、ポインタメンバと実体メンバどちらを使ったほうがよいのだろう?と思って質問したのが>>191であり、>197でした。
長文になってしまい申し訳ないです
206 :デフォルトの名無しさん2011/09/23(金) 13:45:25.69
>>202
内容とは関係ないけど、こういうの使ったほうが見やすいよ
http://codepad.org/fJndQ7g2
192 :デフォルトの名無しさん2011/09/23(金) 10:27:55.64
例を見る限りAをnewしている所がどこにもないので
Bのaは何も指してないかと
194 :デフォルトの名無しさん2011/09/23(金) 10:29:53.90
//A.cpp
#include "A.h"
A::A()
{
i = 100;
}

int A::getI()
{
return i;
}

//B.cpp
#include "B.h"
B::B()
{
int i = a->getI();
}
207 :デフォルトの名無しさん2011/09/23(金) 14:09:06.48
>>202
> ここまではよかったのですが、ここで、「includeをなるべく使わず、ポインタメンバをもたせることによってincludeの数を減らせ」という文献にあたり、それにしたがってクラスの実体メンバからポインタメンバにしたところメソッドが呼び出せなくなってしまいました。
> 結局これは、「メンバ関数を使いたい場合にはポインタでもincludeが必要」という記述を見つけ、解決したのですが、
> ならば、ポインタメンバを使ってもincludeを節約できないが、ポインタメンバと実体メンバどちらを使ったほうがよいのだろう?と思って質問したのが>>191であり、>197でした。

そういう点で言うなら、「前方宣言」を使えばいいよ。
具体的には、>>191と>>194のコードだと
>>191のコード
//B.h
#pragma once
// #include "A.h" 不要なのでコメントアウト
class A; // 前方宣言
class B
{
(以下略)

>>194のコード
#include "B.h"
#include "A.h" // 追加
(以下略)
195 :デフォルトの名無しさん2011/09/23(金) 10:32:23.06
いやいや、この場合は、何処を指してるか分からないが何処かを指している。
プロセスが持つメモリー範囲外−>エラー発生
プロセスが持つメモリー範囲内−>何かがおこるw、それはプログラムによるw
200 :デフォルトの名無しさん2011/09/23(金) 12:39:39.03
2ch書き込みも ? になってしまった・・・
? にはハングル文字が入ってると思ってください
203 :191(2/4)2011/09/23(金) 12:59:30.55
// DXBase.h
#pragma once
#pragma comment(lib, "d3d9")
#include <d3d9.h>
#include <d3dx9.h>
#include "winMain.h"
class DXBase
{
// 変数宣言
protected:
// DirectXオブジェクト
static LPDIRECT3D9 pD3D;
static LPDIRECT3DDEVICE9 pDevice;
private:
static D3DPRESENT_PARAMETERS d3dpp;
// 関数宣言
private:
// 初期化、終了処理 (winMain上で実行)
friend int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int);
static bool Initialize(HWND _hWnd, bool isWindowed);
static void UnInitialize();
public:
// リセット
static void Reset();
};
212 :デフォルトの名無しさん2011/09/23(金) 15:30:25.84
>>209
デバイスの周辺の話は、正直正確に把握できているか自信がないのですが、私が今回作ろうとしているのは「1つしかないデバイス」というよりは、正しくは「アプリケーション上ではひとつしか作りたくないデバイス」といったほうが良いのかもしれません。
サンプルソースでは本題でなかったので省略されていますが、>>203のInitialize関数でデバイスの作成処理をしています。
204 :191(3/4)2011/09/23(金) 13:01:32.51
// DXGraphics.h
#pragma once
#include "DXBase.h"
class DXGraphics :public DXBase
{
public:
DXGraphics(void);
virtual ~DXGraphics(void);

void Clear();
HRESULT BeginScene();
void EndScene();
void Present();
};

// GameMain.h
#pragma once
#include "DXGraphics.h"
class GameMain
{
// 変数宣言
private:
DXGraphics graphics;
// 関数宣言
public:
GameMain();
void MainLoop();
void Game();
};
211 :デフォルトの名無しさん2011/09/23(金) 15:28:23.87
>>206
ありがとうございます。ブックマークいれときます!

>>207
…なるほど!クラスの前方宣言とメンバの呼び出しの両立はできないと思っていましたが、実際にメンバを呼び出すcppファイル側でだけインクルードすれば実現できますね!目からうろこでした。ありがとうございます。

>>208
それは、少し考えました...が、今回はシングルトンなオブジェクトを継承させたいのです。
…おかしなことをいっていますが、うまくまとめられないので具体的な話をしますと、>>203の
static LPDIRECT3D9 pD3D;
static LPDIRECT3DDEVICE9 pDevice;
上記2つ、これがアプリケーション上で「1つしかないデバイス」としたいものです。
そして、この2つをprotectedメンバにもつクラスDXBaseを、
>>204のようにDXGraphics, DXInput, DXCamera, DXLight....といった形で継承させ、
さらにDXGraphicsを継承させDX3DObject, DXText...といったクラスを作り、
それらのクラスでpD3D,pDeviceをライブラリ関数の引数として持たせたり、pD3D,pDeviceのメソッドを使ったりしたいのです。
シングルトンパターンに継承させるという概念?拡張?はないような気がしますし(不勉強なら申し訳ありません)、DXBase、DXGraphicsオブジェクトはアプリケーションに1つしか存在してほしくありませんが、
DX3DObject,DXTextなどは複数作成したかったりして、そこらへんがまだうまく消化しきれず、シングルトンパターンを適用するにいたっていません。
前述で継承させたい、と申しましたが、DXxxx系でのみpD3D,pDeviceにアクセスができ、
DXBase, DXGraphicsなどはシングルトンなオブジェクトに、DX3DObject,DXTextなどは複数オブジェクトを作成できる状態にできれば、継承にはこだわっていません。
また、DXGraphicsの子クラスにしたクラス郡も、意味的にそうしただけで、この形にはこだわってません。
当初の話とだいぶ離れてしまいました。申し訳ないです。
208 :デフォルトの名無しさん2011/09/23(金) 14:23:58.43
> 1つしかないデバイスの制御なので
ならシングルトンクラスにすれば?
209 :デフォルトの名無しさん2011/09/23(金) 14:58:54.09
デバイスがひとつしか無いというのはハードの問題でそれをアプリケーションにもちこむべきではない
後でデバイスが増えたらどうするんだ
210 :デフォルトの名無しさん2011/09/23(金) 15:06:08.76
普通は増えたりしないし、万が一増えた場合は
最初から作り直した方が早いだろ
シングルトンで楽になるかどうかは知らんけど
213 :デフォルトの名無しさん2011/09/23(金) 15:31:28.43
それはシングルトンというよりモノステートパターンな気がする
214 :デフォルトの名無しさん2011/09/23(金) 15:43:00.74
>>213
モノステートパターン!いいキーワードを教えていただいた気がします。
グーグル先生のお世話になってきます。


お答えいただいた皆さん、ありがとうございました!
215 :デフォルトの名無しさん2011/09/24(土) 04:19:01.39
/*--- PCIOR0設定 PC8のLEDをを出力に設定 ---*/
PORT.PCIOR0.WORD |= 0x0100u;

質問です
上の文なんですけど
これって、PORT.PCIOR0.WORD と 0x0100u; を OR とって
その結果を PORT.PCIOR0.WORD に代入で良いのですよね?

0x0100u; の uって何ですか?
217 :デフォルトの名無しさん2011/09/24(土) 04:37:38.26
>0x0100u; の uって何ですか?
unsignedのu
218 :デフォルトの名無しさん2011/09/24(土) 04:43:38.92
>>217
ありがとう
219 :デフォルトの名無しさん2011/09/24(土) 18:27:59.22
浮動小数点の計算が環境によらずに同じ結果を返すようにしたい場合はどうすればいいんでしょうか?
例えばゲームをつくろうとしたときにプラットフォームごとに計算結果が違ったらシビアなゲームだと困りますよね
223 :デフォルトの名無しさん2011/09/24(土) 21:42:22.06
>>219
そのために厳密な有効桁数を設定してそこへの正規化を都度行なったり、
固定小数点実数を整備したり、パフォーマンスに影響しない範囲で工夫するしか。
220 :デフォルトの名無しさん2011/09/24(土) 18:39:42.19
仮数部の中に余裕が出るように適用する式を考慮し変数も二進表現でなるべく小さくなる様に都度都度規則的な切り上げ捨てをする
221 :デフォルトの名無しさん2011/09/24(土) 18:59:29.13
floatだとあんまり機種依存しないような
222 :デフォルトの名無しさん2011/09/24(土) 19:55:10.72
>>221
俺の知る限りではハードウェアにもコンパイラにも依存する

IEEEではビット表現や四則演算の丸め方まで規定されてるはずだけど
たとえばx86では浮動小数点数を80bitのレジスタに格納して演算するので
メモリとの間のロードストアや使用する命令、順序だけで値が変わってくることに
なるし、MMXやSSEが使われればさらに変わってくる

よって、一言で言えば浮動小数点演算は非決定的であるということになる
(同じ入力から常に同じ結果が得られるとは限らない)

たとば離散コサイン変換は圧縮系のソフトウェア(JPEGやMP3)で常用されてるが、
それを浮動小数点演算で行っている場合、生成される結果はコンパイラや環境によって
実際に微妙に変わってくる
224 :デフォルトの名無しさん2011/09/25(日) 02:52:09.50
質問です。Singletonパターンを以下のようなコードで実装しました。
これを拡張して、コンストラクタに引数を投げて初期化したいのですが、どのような形で実現するのが一般的でしょうか。
Instance関数に毎回初期化用の引数を持たせるのは現実的じゃありませんし...
それともSingletonパターンで引数ありのコンストラクタを使用しようとするのが無謀なのでしょうか。
http://codepad.org/Dbpg8Xp0
232 :デフォルトの名無しさん2011/09/25(日) 17:04:38.53
>>224
Singleton はやめとけ。無理がでてきたんなら、ちょうどやめどきだ。
225 :デフォルトの名無しさん2011/09/25(日) 03:43:44.50
代入でダメなら初期化を義務付けたら?
A* A::Instance()
{
if (!_instance) { throw; }
return _instance;
}
A* A::Initialize(...)
{
if(_initialized) { throw; }
Locker lock(m);
if(_initialized){
_instance = new A(...);
_initialized = true;
}
}
Singletonなんだし決めうちでいいとは思うけど。
226 :デフォルトの名無しさん2011/09/25(日) 13:41:38.63
>>225
ありがとうございます。
>Locker lock(m);
この行みなれないんですが、軽く検索して出てきた、マルチスレッドプログラミングで排他処理をしている何か、という理解で大丈夫だったでしょうか?
229 :デフォルトの名無しさん2011/09/25(日) 16:04:24.80
>>225
C++だとdouble-checked lockingの問題は起きないの?
なんとなく”大丈夫そうに見える”コードではあるけど

それにシングルスレッドならそのロックは無駄だし
複数スレッドからInitializeされない保障があればそのロックは無駄じゃね?
249 :デフォルトの名無しさん2011/09/25(日) 22:36:36.97
>>229
Javaにおける、その問題点は
A *p = new A(); が、

Javaにおいては
A *p = ::operator new(sizeof(A)); //メモリだけを確保
new (p) A(); //配置newによるコンストラクタの呼び出し
という形で行われることを許容していることが原因だったはず。

C/C++においては、通常は=の右辺の演算が行われてから代入されるが
規格において、=の前後にシーケンスポイントは無かったと思うので(詳しい規格は知らない)
コンパイラがそのようなコードを出力することも、絶対無いとは言い切れない、と思う。
が、普通は、最適化OFFであっても、そのような無駄なコードはまずあり得ないはず。

でも、俺がそういうコードを吐くコンパイラを見たことがない、というだけで
厳密なことは知らない。
ただ、C++においてはローカルなstatic変数の初期化の方を問題視する場合も多いので
重視されていないだけかもしれない。
227 :デフォルトの名無しさん2011/09/25(日) 14:08:39.04
初心者姦ゲイ 姦狂依存OK
228 :2262011/09/25(日) 14:16:27.18
>>227
僕はゲイではありません。
230 :デフォルトの名無しさん2011/09/25(日) 16:43:33.46
このコードじゃ内側のifの中は実行されることがないからある意味大丈夫だな
235 :デフォルトの名無しさん2011/09/25(日) 17:28:47.32
ファンネルミサイル搭載なのでアンチビームを搭載しているMSに強い
236 :デフォルトの名無しさん2011/09/25(日) 18:32:32.95
> コンストラクタに引数を投げて初期化したい
まぁシングルトンでなければならない理由が分からんのだが

"シングルトンクラス内部で保持するインスタンス生成"メソッドを外部から実行出来る用意して、そいつで初期化すればいいんじゃねの?
もちろん"インスタンス生成"メソッドを誰もが何度も実行しちゃうのどうよ?とかいろいろ考慮必要だけどね
238 :デフォルトの名無しさん2011/09/25(日) 18:46:46.18
iterator_traits
240 :デフォルトの名無しさん2011/09/25(日) 19:02:23.14
>>238
thx
239 :デフォルトの名無しさん2011/09/25(日) 18:48:05.38
たとえばレジストリから読んだ情報をもとにインスタンス作りたいとかかな
この例だと、シングルトンが自分で情報を取りに行くようにしたほうが楽だとは思う
241 :デフォルトの名無しさん2011/09/25(日) 19:26:59.03
8、16、32Bitの符号なし整数の型を得るメタ関数ってどうやって書きますか?
242 :デフォルトの名無しさん2011/09/25(日) 19:33:55.84
>>241 こんな感じ?
template<int N> struct uint {};
template<> struct uint<8> { typedef uint8_t type; };
243 :デフォルトの名無しさん2011/09/25(日) 19:41:15.76
>>242
すいません言い忘れました
stdintを使わない場合のはなしです
244 :デフォルトの名無しさん2011/09/25(日) 20:03:31.64
>>242
すいません言い忘れました
パソコンを使わない場合のはなしです
246 :デフォルトの名無しさん2011/09/25(日) 20:54:49.71
>>243 まず stdint と同等の typedef を用意して(以下略
248 :デフォルトの名無しさん2011/09/25(日) 22:30:30.77
>>243
無理じゃね。
uintN_t型以外で確実にNビットであるunsigned型なんかないだろ。Nビット以上であることは保証されてる型はあるけど。
245 :デフォルトの名無しさん2011/09/25(日) 20:27:44.56
DirectShowの使い方について詳しく解説してる本、サイトってないでしょうか?
メディアデバイスへのアクセスをしたく思っているのですが、
調べ方が悪いこともあり、みつからずにいるのですが、、、
250 :デフォルトの名無しさん2011/09/25(日) 22:48:22.37
確実な方法は無いよね。CHAR_BITが8以外もありえるし。
#include <iostream>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/pop_front.hpp>
#include <boost/mpl/front.hpp>
#include <boost/mpl/eval_if.hpp>

using namespace boost::mpl;

template <typename Vec, int NBits>
struct uint_impl {
static const bool Hit = (sizeof(typename front<Vec>::type) >= (NBits+7)/8);
typedef typename eval_if_c<Hit, front<Vec>, uint_impl<typename pop_front<Vec>::type, NBits> >::type type;
};

template <int NBits>
struct UInt {
typedef vector<unsigned char, unsigned short, unsigned, unsigned long, unsigned long long> Vec;
typedef typename uint_impl<Vec, NBits>::type type;
};

int main() {
UInt<8>::type a = 0;
std::cout << sizeof(UInt<8>::type) << std::endl;
std::cout << sizeof(UInt<16>::type) << std::endl;
std::cout << sizeof(UInt<32>::type) << std::endl;
std::cout << sizeof(UInt<64>::type) << std::endl;
}
253 :デフォルトの名無しさん2011/09/25(日) 23:51:47.63
>>252
ほぼドンピシャのがあるね。あとは>>250みたいなのと組み合わせればいける。
もちろんboost使わずに泥臭く書くのもありだし、C++11ならvariadic templatesを使えば簡単に書けそう。
252 :デフォルトの名無しさん2011/09/25(日) 23:32:01.58
numeric_limits<T>::digits を使えば何とかなるかもね。
255 :デフォルトの名無しさん2011/09/26(月) 16:26:57.53
VC++2010でプログラムを書いているのですが・・・
class hoge
{
private:
deque<int> DEQ
}
void hoge::Push_num(int a)
{
DEQ.push_back(a);
}

これだけで何故か実行するとエラーが出て、次のような場所に飛ばされます
inline void _Container_base12::_Orphan_all()
{ // orphan all iterators
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Myproxy != 0)
{ // proxy allocated, drain it
_Lockit _Lock(_LOCK_DEBUG);

for (_Iterator_base12 **_Pnext = &_Myproxy->_Myfirstiter;
*_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter)
(*_Pnext)->_Myproxy = 0;
_Myproxy->_Myfirstiter = 0;
}
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
}

何が悪いのか全く検討もつかないのですが・・・
257 :デフォルトの名無しさん2011/09/26(月) 18:15:02.37
>>255
class hoge
{
private:
deque<int> DEQ
public:
void Push_num(int a)
{
DEQ.push_back(a);
}
};
または
class hoge
{
private:
deque<int> DEQ
public:
void Push_num(int a);
};
void hoge::Push_num(int a)
{
DEQ.push_back(a);
}
256 :デフォルトの名無しさん2011/09/26(月) 16:34:33.71
セミコロンが無かったり関数の定義が無かったりするけど
中途半端に書き写したりしないで全部コピペしたら?
259 :2552011/09/26(月) 18:56:17.47
すいませんちょっと急用ではずしてました
コードは257さんの書いてくれた上の方です(最も両方試して同じだったのですが・・・)

それでやっていることは
class Main
{
private:
hoge h;
public:
void mainloop();
}

void Main::mainloop()
{
int a=3;
h.Push_num(a);
}

これだけなのです。単に呼び出して入れるだけで上記のエラーが出ます
実際には他にも関数などがありますがエラーが出る関数でやっていることはこれだけです
DEQに入っている個数は関係ないようで空でもなります
260 :デフォルトの名無しさん2011/09/26(月) 19:09:05.26
>>259
classの最後にセミコロンが無いんだけど
書き写しせずにコピペしろって
261 :デフォルトの名無しさん2011/09/26(月) 19:29:11.54
>>260
関係ないものが多量にあるのですが・・・
262 :デフォルトの名無しさん2011/09/26(月) 19:32:57.99
>>261
関係あるかどうかはこっちが判断するんだよ
264 :デフォルトの名無しさん2011/09/26(月) 19:38:32.04
>>261
元の環境を壊さないためにもまず最初にプロジェクト全体をコピーしてそっちで作業するようにして、
不要と思う場所を全部コメントアウトする。
それでも同じエラーが出る場合、コメントアウトした場所を削除してここに貼り付ける。
263 :デフォルトの名無しさん2011/09/26(月) 19:33:28.20
エラーはその行番号で起きているんじゃない。
その行番号以外の箇所で起きたエラーがその行番号で顕在化するだけだ。
だから、再現する最低限のソースを全て貼れ。
265 :デフォルトの名無しさん2011/09/26(月) 19:42:55.84
じゃあ500行ぐらいありますが・・・
と思ったら解決してしまいました・・・お騒がせしてすいません

class hoge
{
private:
int error[5];
deque<int> DEQ
public:
};

error[5]=num;

これが原因でメモリを突き抜けてたみたいです・・・
クラスでエラーが出たときは別の変数も見ないとダメですね。
自分が不要だと思っていた所が全然不要じゃなかったことが見にしみました
266 :デフォルトの名無しさん2011/09/26(月) 19:55:44.75
「身に染みる」な
変換ソフト変えたほうがいいんじゃね?w
269 :デフォルトの名無しさん2011/09/26(月) 20:47:27.24
初心者丸出しで申し訳ないですが、以下のように、
可変長引数に対して動的にメモリを割り当てたいのですが、
左辺にはva_argマクロをおけず、エラーとなります。
void func(int dummy,...)
{
 va_list args;

 va_start(args,dummy);
 va_arg(args,double*)=malloc(sizeof(double)*N);
 va_end(args);
}
このような場合に、何かうまい解決策はないものでしょうか。
なお、OSはUbuntuで、コンパイラはインテル C++ コンパイラの非商用版です。
よろしくお願いいたします。
270 :デフォルトの名無しさん2011/09/26(月) 21:09:03.08
>>269
一度va_argの値を変数に代入すればいいでしょ

void func(int N, ...)
{
va_list args;
double **p;

va_start(args, N);
p = va_arg(args, double **);
*p = (double *)malloc(sizeof(double) * N);
va_end(args);
}

int main(void)
{
double *p;

func(10, &p);
p[0] = 1.0;
printf("%f\n", p[0]);
free(p);
return 0;
}
271 :デフォルトの名無しさん2011/09/26(月) 21:17:50.75
>>270
早速の返信ありがとうございます。
一回変数をかませるということに考えが至らなかった・・・orz
勉強になりました。ありがとうございました。
295 :2692011/09/28(水) 04:50:42.36
>>293は>>269が書いたレスです。
272 :デフォルトの名無しさん2011/09/26(月) 21:54:39.06
可変長引数を使った汎用性のある関数を作ってしまうのは誰しも通る道
274 :2692011/09/27(火) 21:37:11.05
再度失礼いたします。
先日いただいた指摘を元にコードを組んでみたのですが、
どうにもsegmentation faultが取り除けず、困っております。
もしよろしければ、再度見ていただけないでしょうか。
以下がコードです。
http://codepad.org/O5ITfhND
http://codepad.org/BhDlvQRc
上が問題ないコード、下が問題のあるコードです。
new_memory、およびdelete_memoryは単独では
問題なく動きます。setArrayおよびfreeArrayも、
可変引数がひとつの場合はちゃんと動くのですが、
下のように二つ以上になるとsegmentation faultと
なってしまいます。どうやら可変長引数を解析する段階で、
一つ目の変数しかメモリを確保していないようです。
277 :デフォルトの名無しさん2011/09/27(火) 22:15:57.95
>>274
そもそも、setArrayは、何故に可変引数を受け取る形にしてるわけ?
まあCなら、&でアドレス渡しにすると型とかがどうなるのかよくわからない、
というのも理解できなくはないけど
C++なのだから、参照渡しにすれば(見た目)同じdouble**型を扱うだけで済むでしょ。
可変引数のおべんきょ、ってわけでも無さそうだし。
278 :デフォルトの名無しさん2011/09/27(火) 22:35:28.90
>>274
ttp://codepad.org/Vtzpx5lA

なにがやりたいのか分からんが、こういう感じか?
279 :デフォルトの名無しさん2011/09/27(火) 22:45:52.73
>>274
可変引数は使わない方がいいぞ。
293 :デフォルトの名無しさん2011/09/28(水) 04:12:41.01
遅くなりましたが、皆様ご指摘ありがとうございます.
そもそもsetArrayのような関数を定義したのは、
同じサイズの2次元配列を異なる名前で大量に
(50個以上)確保する必要があり、それを
コード上にベタ打ちしたく無かったからです.
すなわち、可変長引数の部分にはdouble**型の引数が
(そしてそれのみ)大量に存在し、そのそれぞれについて
2次元配列を確保したい、と言うことです.
>>275
va_startからva_endまでが勝手にループになっていると
勘違いしていました.ありがとうございます.
C++ではこのような書き方は推奨されないのでしょうか.
>>276
参照渡しというものがあるのですか.勉強します.
>>277
まさにそのようなかんじです。第一引数に可変引数の
個数を書いておけばよかったのですね.このコードは、
それぞれの配列のサイズを変える場合に拡張してある、
という理解でよいでしょうか.
>>279
可変引数には何か問題があるのでしょうか.
275 :デフォルトの名無しさん2011/09/27(火) 21:56:36.72
初心者姦ゲイ 姦狂依存OK
276 :デフォルトの名無しさん2011/09/27(火) 22:10:04.68
va_argを再度呼ばないと次の引数にアクセスできないぞ
というかC++でそういうのやめろよ
281 :デフォルトの名無しさん2011/09/27(火) 22:59:58.08
std::tr1::bind(&VStruct::push_back, &lvs, _1, str));
284 :2802011/09/27(火) 23:11:13.17
>>281

回答ありがとうございます。
VStructのインスタンスは実際のコードだとfor_eachを呼び出す前に
LVStructにpush_backでコピーしています。

283 :2812011/09/27(火) 23:05:27.16
ちょっと間違えた
というかVStructのインスタンスはどこにあるの?
285 :デフォルトの名無しさん2011/09/27(火) 23:20:17.55
もしかして
std::for_each(lvs.begin(), lvs.end(), [str](VStruct& vec) {
vec.push_back(str[0]);
vec.push_back(str[1]);
vec.push_back(str[2]);
});
こういうことがやりたかったのかな?
286 :2802011/09/27(火) 23:32:52.14
>>285

str[1]1、str[2]は不要ですが、概ねそのようなものです。
※というか、この場合str[1]、str[2]って何を指すのでしょうか?

意図としては
lvsに複数のvectorが登録済みで、外部から与えられた値strを
全てのvectorにコピーするための処理です。

うまく表示されるかわかりませんが

lvs---+--vec[0] <= str
    +--vec[1] <= str
    +--vec[2] <= str

上記のようなイメージです。
287 :デフォルトの名無しさん2011/09/27(火) 23:42:41.53
>>286
> const STRUCT str = {0, 0, 0};
これが配列に見えただけ
bindでメンバ関数呼び出すには第二引数がインスタンスへのポインタじゃないとダメ
288 :2802011/09/28(水) 00:16:12.93
>>287

回答ありがとうございます。
第二引数が _1の方かstrの方かわからなかったので

typedef std::vector<STRUCT*> VStruct;
typedef std::list<VStruct*> LVStruct;

上記両方試してみましたがどちらにしろVC2010、g++どちらもエラー内容は変わりませんでした。

289 :デフォルトの名無しさん2011/09/28(水) 00:20:22.52
>>288
_1の方
インスタンスへのポインタっていうのはそういう意味じゃない
VStruct v;
std::tr1::bind(&VStruct::push_back, &v, str)(); // これはOK
std::tr1::bind(&VStruct::push_back, v, str)(); // これはダメ
290 :デフォルトの名無しさん2011/09/28(水) 00:25:59.18
まあlambda使えばいいじゃん、というのは置いといて

std::bind<void (VStruct::*)(const STRUCT &)>(&VStruct::push_back, std::placeholders::_1, str)

push_backにmove用のpush_backが追加でオーバーロードされて一意に決定できなくなったから
呼び出すべき関数の型を明示する必要がある。
291 :2802011/09/28(水) 00:53:34.75
>>290

moveセマンティクス対応でしたっけ。
記載していただいた対応をしてみたらエラーメッセージが変わりました。
このあたりに原因がありそうですね。

1>     include\xxcallobj(13): error C2064: 2 引数を取り込む関数には評価されません。
1>     include\xxbind1(292) : コンパイルされたクラスの テンプレート のインスタンス化
      '_Ret std::tr1::_Callable_obj<_Ty,_Indirect>::_ApplyX<_Ret,std::vector<STRUCT>&,_Arg&>(_Arg0,_Arg1)' の参照を確認してください
1>     with
1>     [
1>       _Ret=_Rx,
1>       _Ty=void (__thiscall std::vector<STRUCT>::* )(const STRUCT &),
1>       _Indirect=false,
1>       _Arg=STRUCT,
1>       _Arg0=std::vector<STRUCT> &,
1>       _Arg1=STRUCT &
1>     ]

292 :デフォルトの名無しさん2011/09/28(水) 01:39:22.46
それじゃ返却値型も明示は?
std::bind<void, void (VStruct::*)(const STRUCT &)>(&VStruct::push_back, std::placeholders::_1, str)
294 :デフォルトの名無しさん2011/09/28(水) 04:20:55.39
std::bind(std::mem_fn((void (VStruct::*)(const STRUCT &))&VStruct::push_back), _1, str)
ラムダか自分でファンクタ書いたほうがいいって
296 :2802011/09/28(水) 07:55:41.17
>>292
>>294

ありがとうございます。どちらのコードもVC2010でコンパイルが通る事が確認できました。
ラムダかファンクタ書いた方が良いのはその通りですね。
実際にVC++2010に移植する際にはラムダ式に書き換えようと思います。
(今回は移植可能かの調査だったので、元コードをあまり変えないで解決しようと考えていました)

※一応試してみたg++ 4.3.4 -std=c++0xでは、やはりエラーは治りませんでした。
 >>292はエラー変化なし、>>294は「address of overloaded function with no contextual type information」といった体です。
 g++はVC++より型解決が厳しいのでしょうね。(後に出たエラーはよくわかりませんでしたが)
299 :デフォルトの名無しさん2011/09/28(水) 20:06:32.00
VC++2010のフリーのやつでWin32APIプログラムを勉強しはじめたんだが、
クラスファイルとソースファイルのわけかたがよくわからないでつ。
300 :デフォルトの名無しさん2011/09/28(水) 20:08:17.87
一つのソースファイルにクラスを複数書くと相互参照とかができなくて不便なんですが
共通のヘッダファイルみたいなのを作ってその中にクラスを入れたりすればいいの?

#include "共通ヘッダ.h"

int WINAPI WinMain(HINSTANCE hi, HINSTANCE hi2, LPSTR pstr, int wwwwwww)
{
クラスA* ca = new クラスA();
クラスB* cb = new クラスB();

ca->数値 = 0;
cb->数値 = 8;

ca->数値 = cb->数値;

ca->メッセージテスト();
cb->メッセージテスト();

delete(cb);
delete(ca);

return 0;
}
318 :デフォルトの名無しさん2011/09/28(水) 21:20:22.66
>>300で
> 相互参照とかができなくて不便
とか書いてたから、既にしてる/これからする可能性がある、のかと思って書いた。

してるなら設計まずいし、してないならそれに越したことないね。
301 :デフォルトの名無しさん2011/09/28(水) 20:11:08.69
関数はヘッダファイルなしでもexternを描けば他のCPPファイルの関数やら変数やらを扱えるけど
クラスの場合はクラス名だけexternしてもだめっぽくてクラスの宣言と実体を分けて記述しなきゃいかんの?
↓こんなかんじでいいのかな?

クラスA.h

#ifndef _インクルードガード_クラスA_
#define _インクルードガード_クラスA_

#include "共通ヘッダ.h"

class クラスA
{
public: int 数値;

public: クラスA();
public: ~クラスA();

public: void メッセージテスト();
};

#endif//_インクルードガード_クラスA_

303 :デフォルトの名無しさん2011/09/28(水) 20:13:21.66
で、こんな感じで共通の?ヘッダファイルを作ればとりあえず期待通りに動くんだけど
作法的にっていうかデザイン的にっていうかこんな感じでいいんでしょうか?

#ifndef _インクルードガード_共通ヘッダ_
#define _インクルードガード_共通ヘッダ_

#include <windows.h>
#include "クラスA.h"
#include "クラスB.h"

#endif//_インクルードガード_共通ヘッダ_
308 :デフォルトの名無しさん2011/09/28(水) 20:28:12.73
>>303
そのやり方は無駄なインクルードが多くなるしいつか相互インクルードにぶち当たるからやめたほうがいいな

クラスはexternじゃなくて前方宣言する
311 :デフォルトの名無しさん2011/09/28(水) 20:42:03.35
>>308
前方宣言というのはプロトタイプ宣言みたいなやつ?
こんな感じでいいのでせうか?


#include <windows.h>

class クラスA;
class クラスB;

#include "クラスA.h"
#include "クラスB.h"

int WINAPI WinMain(HINSTANCE hi, HINSTANCE hi2, LPSTR pstr, int wwwwwww)
{
クラスA* ca = new クラスA();
クラスB* cb = new クラスB();

ca->メッセージテスト();

delete(cb);
delete(ca);

return 0;
}

しかしこれだとクラスのヘッダファイルごとに#include <windows.h>しないとだめでせうよね?
313 :デフォルトの名無しさん2011/09/28(水) 21:01:45.21
>>311
あー前方宣言の話をしたのがまずかったかな。
とりあえず共通ヘッダーは相互インクルードっていうのが起きる可能性があるからそれに注意する
前方宣言は相互インクルードを防ぐ手段の1つ

前方宣言は#include "クラスA.h"をインクルードしたらエラーが起きるけどクラスAを使用したい時に使う
だからそのWinMainのやつでは普通に#include "クラスA.h"できるからいらない
314 :デフォルトの名無しさん2011/09/28(水) 21:06:40.49
>>311
クラスAとクラスBが相互参照しているなら、
class クラスA;
はクラスB..hに、

class クラスB;
はクラスA.hに記述されてるはずでは?


ヘッダファイルは「それをインクルードする時にXX.hも一緒にしなければならない」
というような前提条件を作らないのが基本。

もし、まっさらのcppに
#include "クラスA.h" 
だけ書いてコンパイルしてwindows.hが必要だってエラーが出るならそれはクラスA.hに含めるべき。

その上で、ヘッダファイルがヘッダファイルをインクルードする回数を極力減らすようにする。
316 :デフォルトの名無しさん2011/09/28(水) 21:16:17.79
>>314
相互参照の話は共通ヘッダーを使うと相互参照が起きる可能性があるよって話だけで
別にAとBが相互参照してるわけじゃない・・・と思う
304 :デフォルトの名無しさん2011/09/28(水) 20:16:08.41
インクルードとかインクルードガードとか
みんなよく理解できるよね。慣れれば楽勝なの?
JAVA使ってたのでプロトタイプ宣言とかヘッダファイルとか
わけわからんです。
おまえらよくわかるね。すごすぎ。
306 :デフォルトの名無しさん2011/09/28(水) 20:22:40.57
コンパイラが(条件付きで)コピペしてるだけ include

2回以上同じクラスの宣言しちゃまずいから コピペ抑制の為にガードしてるん
307 :デフォルトの名無しさん2011/09/28(水) 20:27:17.60
テンプレートを使わないとして
共通ヘッダ.hを全てのファイルでインクルードしまくるってのは
コンパイルが遅くなる以外でなにかまずかったりするの?
特に問題ないの?

テンプレートを使うともっと複雑になるのでつね。
309 :デフォルトの名無しさん2011/09/28(水) 20:28:27.92
複雑とかそういう問題よりほとんどのコンパイラはexport templateをサポートしてないから
310 :デフォルトの名無しさん2011/09/28(水) 20:28:53.49
標準のnewやmallocはスレッドセーフですか?
319 :デフォルトの名無しさん2011/09/28(水) 21:26:57.96
>>310
解決しました
312 :デフォルトの名無しさん2011/09/28(水) 20:43:44.11
プリコンパイルヘッダが大抵のコンパイラでサポートされてるから問題ないだろ
315 :デフォルトの名無しさん2011/09/28(水) 21:15:57.18
相互インクルードさえ気をつければ とりあえずこれでいいってことでOKでつか?
317 :デフォルトの名無しさん2011/09/28(水) 21:19:18.24
>>315
とりあえず、な。でも使わないほうがいいとは言っておく
320 :デフォルトの名無しさん2011/09/28(水) 22:38:33.42
ありがとうございまつた。
実際相互参照できたら便利じゃん と思っていたけど
できるかどうか検証してみたらやらないほうがいいのがよくわかりまつた
今回は長々と質問に答えていただきましてありがとうございまつた
322 :デフォルトの名無しさん2011/10/02(日) 10:31:15.74
fstreamであるファイルをオープンしたときに、別のスレッドやプロセスによる後続のファイルオープンを制御することってできますか?

最初のファイルオープンが読 → 後続は読のみ許可
最初のファイルオープンが書 → 後続はオープン禁止

という感じで
324 : 忍法帖【Lv=40,xxxPT】 2011/10/03(月) 08:49:40.89
>>322
前者: chmod -w
後者: chmod -rw
323 :デフォルトの名無しさん2011/10/02(日) 11:14:52.96
fstreamだとできるか知らないけど、
Windowsなら、CreateFileで共有モードを適切に設定すればできそう
325 :デフォルトの名無しさん2011/10/07(金) 17:52:48.12
固定小数点(整数の組みで)ならテンプレートつかってコンパイル時計算できるように思えるんだけど
そういうライブラリってすでにどこかにないっすか?
326 :デフォルトの名無しさん2011/10/08(土) 15:36:01.14
inline void Func( double const & d )
{
// dは使われない
}

int main( void )
{
double x , y , z;
Func( x * y * z ) ;
return 0 ;
}

こういうコードはメジャーなコンパイラでは最適化されてx*y*zの計算はスキップされたりする?
330 :デフォルトの名無しさん2011/10/08(土) 20:39:16.25
最適化オプション付ければ省略されるんじゃね
bcc32(5.82 オプション -G)、gcc(4.6.1 オプション -O2)で省略された
331 :デフォルトの名無しさん2011/10/08(土) 22:08:56.24
まずFuncが最適化で実際にインライン展開されるかどうかが鍵だな
332 :デフォルトの名無しさん2011/10/10(月) 21:34:58.73
場合によっては使われないか
何があっても使われないかにも寄るな → だったら(double const&)にしとけよと
336 :デフォルトの名無しさん2011/10/11(火) 00:26:40.60
vector<shared_ptr<T>>じゃダメなの?
337 :デフォルトの名無しさん2011/10/11(火) 00:34:06.98
>>の間にスペースないからダメ
と思ってたら最近のコンパイラはエラーにならないのね
340 :デフォルトの名無しさん2011/10/11(火) 00:58:51.21
shared_arrayの可変長版みたいな意味ね。ptr_vectorは用途が違う
341 :デフォルトの名無しさん2011/10/11(火) 02:11:33.13
>>340 shared_ptr<vector<T> >
342 :デフォルトの名無しさん2011/10/11(火) 19:57:43.49
格納要素とポインタ要素等で持つ一次参照先への変更一切を遮断するアンチオンラインvector欲しいかも
343 :デフォルトの名無しさん2011/10/11(火) 20:51:59.74
ファイル関連をラップしてるのですが
返す整数値が0以上ならファイルハンドルで負ならエラーという仕様です。
現状intをキーとしたファイル情報のmapを使って要素が空なら0を、
空でないなら最終要素のキーに1を足した値をキーに使ってファイルハンドルとして返しています。
あまりよい方法に思えないのですが、なにかよい方法はないでしょうか?
347 :デフォルトの名無しさん2011/10/11(火) 21:26:28.15
>>343
なぜFILE*を敢えてそういう形でラップしたいのかは分からんけど
少なくとも実装がスレッドセーフにはなっていないな

それと、map<>でもいいけど、やや富豪的というか……
intがキーで0から採番していくんなら、配列かvector<>でよくね
別途フリーリスト管理をしないなら、空きスロットを探すときに
下から舐めないといけないから、open相当の処理は多少遅くなるが
物凄く大量のファイルを開くわけでもないだろうから(どうせ制限がある)
リニアに舐めたところで全然大した話じゃないし、それ以降のアクセスはO(1)で済む
メモリの無駄も少ないだろう
350 :デフォルトの名無しさん2011/10/11(火) 21:54:16.59
いや、>346で聞いたつもりなんだけど
こういうのはどういう使われ方をされるかから考えて決めるもんだよね。
>>343は内部の処理から決めようとしてるからうまくいかない。

後は気になってるのがg_IoList
グローバル変数のつもりなら改めて否定させてもらうよ。
345 :3432011/10/11(火) 21:07:06.74
かなりはしょりましたがソースです。
http://ideone.com/CStaJ
348 :デフォルトの名無しさん2011/10/11(火) 21:29:35.71
>>345
そんなラップならしない方がマシだと思う
349 :デフォルトの名無しさん2011/10/11(火) 21:43:18.86
>>347
eraseしたら乙るね

>>348
何がしたいのかも聞かずに
頭ごなしに否定するのはどーかと思う
351 :デフォルトの名無しさん2011/10/11(火) 22:06:00.57
>>349
配列やvector<>を使うなら、close()したら、この場合は単にdeleteして
ヌルポインタをかわりに入れるような実装を想定していたよ
開きスロットとかフリーリスト管理とかいうのは、そういう意味
352 :3432011/10/11(火) 22:15:34.63
システムが開けるファイル数に制限があり、最大でも10個までしか開けません。
それを擬似的に可能にしようとしてあのようなコードになりました。

mapかvectorかはどちらがよいのかわからずmapを使ったのと、
スレッドセーフ云々は見づらくなるので省きました。
356 :デフォルトの名無しさん2011/10/11(火) 22:35:02.51
>>350
346=348なんてのは書いた本人にしか分からん

>>351
後半読んでなかったわ、なるほどね

>>352
うん
人にはいろいろ悩みがあるよね
で、何がしたくて悩んでるの?
353 :デフォルトの名無しさん2011/10/11(火) 22:27:27.78
>システムが開けるファイル数に制限があり、最大でも10個までしか開けません。
>それを擬似的に可能にしようとしてあのようなコードになりました。

ちょっと言っている意味が分からない
システムってのはOSや処理系のことじゃなくて、自分が作ろうとしている
シロモノのことか?
その自分が作ろうとしているものに、ファイルを最大10個しか開けないように
しなければならない、という謎の要求仕様があるので、ああいうものを作った
ということで合ってる?


355 :デフォルトの名無しさん2011/10/11(火) 22:28:37.27
システム的に制限があるのはわかったけど、
そういうのは事前に書いておく方がいいよ。
他にもメモリが超少ないとかあったら早めに書いてね。
(組み込み系の人かな?)

> 擬似的に可能にしようとしてあのようなコードになりました。
話を聞いた後でコードを見直してもそんな事情なんてさっぱりわからんw
どういう方針で可能にするつもり?
例えば、10個既に開いてる時に更に要求が来たらどう対処するの?
357 :デフォルトの名無しさん2011/10/11(火) 22:47:50.50
おっと、IDが出てなかったんだっけ。こりゃ失敬。
>346=>348=>350=>355です。

なんとなく>343の事情が見えてきたな。
状況を説明すると仕事だってバレるから必要な情報ですら小出しにしてたんでしょ。
358 :3432011/10/11(火) 22:58:51.08
システムはOSのことで、メモリも超少ないです。(某ゲーム機です)
小出しですみません。

説明大変なので全部上げます。
mutex関連は説明長くなるので省きました。
http://ideone.com/idaD5

あと仕事じゃなくてただの学生の趣味です。
360 :デフォルトの名無しさん2011/10/11(火) 23:14:35.35
>>358
IoCtx*をかえせばいいんじゃないの?
361 :デフォルトの名無しさん2011/10/11(火) 23:15:53.31
>>358
C>C++がすんなりいかない人は
間にJavaやC#を挟むといいよ
363 :3572011/10/11(火) 23:38:37.76
>>358
better Cで全部行くつもりなのね。
この使いかたならグローバルも仕方ないか…

mapやlist使うの止めて自前のリングバッファにすればずっと簡潔・高速になると思うよ。
正直無駄なことばっかやってるようにみえる。
367 :3572011/10/12(水) 00:00:03.78
そういや数年前、似たような制限付きの仕事やったな。
書いたコードも>>358よりは上手いつもりだが、大筋似たようなコードになった。
359 :デフォルトの名無しさん2011/10/11(火) 23:10:14.36
11個以上開くときは実際にはオープンしないで読み書きするときに開きなおしたりするんじゃないか?
364 :デフォルトの名無しさん2011/10/11(火) 23:39:58.20
なんだ、システム側の制限で開けないって話だったのか?
なら、なんで自分でわざわざ管理するのかやっぱり分からんな……
自分で管理してもシステムの制限は越えられないのんと違う?
だから、システムの制限よりなんらかの理由で減らしたいから管理してるのかと
思ってた

それとも、ファイルうっかり開きすぎてもEMFILE(Too many open files)が
帰ってこないようなシステムなんか?
365 :3432011/10/11(火) 23:50:06.26
>>360
openを置き換えれるようにint型で管理したいんです。

>>363
無理にSTL使う必要はないんですね。
C++は多機能すぎて選ぶのが難しいです。
おとなしく自前にします。

>>364
読み書きのたびに開いたり閉じたりしています。
そのままだとさすがに遅いので若干工夫したつもりですが…。
368 :デフォルトの名無しさん2011/10/12(水) 00:23:00.15
>>365
返すときにintにキャストすればいい
負ならエラーっていう仕様も満たしたければ-1引いとけばいい
371 :デフォルトの名無しさん2011/10/12(水) 02:52:56.68
>>368
ヌルポインタを int にキャストすれば 0 になると思ってるんなら CFAQ からやりなおせ。
http://www.kouno.jp/home/c_faq/c5.html
372 :デフォルトの名無しさん2011/10/12(水) 03:01:38.91
>>371
実例よろしくw
373 :デフォルトの名無しさん2011/10/12(水) 03:11:00.54
374 :デフォルトの名無しさん2011/10/12(水) 03:15:19.53
>>371
アホ。内部表現が0じゃなくてもintにキャストすれば0になることは保証されてんだあよ。
375 :デフォルトの名無しさん2011/10/12(水) 03:24:06.60
>>373
現役でお願いw
376 :デフォルトの名無しさん2011/10/12(水) 04:43:54.99
>>374
C or C++ 規格のどこで?それとも特定のコンパイラの話?
366 :デフォルトの名無しさん2011/10/11(火) 23:57:55.14
>読み書きのたびに開いたり閉じたりしています。

なるほど、そこまで聞いてやっと意図がわかった
369 :デフォルトの名無しさん2011/10/12(水) 00:24:27.44
厳しい環境で上限が一桁ってわかってるなら配列のほうがええんやないの
377 :デフォルトの名無しさん2011/10/12(水) 09:29:00.96
ゼロをポインタに入れるとヌルポは保証されてるのに逆はだめなの?
378 :デフォルトの名無しさん2011/10/12(水) 09:49:00.35
逆が駄目なのは、無茶なキャストを入れないとコンパイル通らないあたりで察しろ。
379 :デフォルトの名無しさん2011/10/12(水) 10:01:44.86
int* p = nullptr;
if(p){
 なにか
}
これはもしかして未定義になりますか?
381 :デフォルトの名無しさん2011/10/12(水) 10:03:36.60
380 :デフォルトの名無しさん2011/10/12(水) 10:02:55.45
なるわけがない
383 :デフォルトの名無しさん2011/10/12(水) 18:03:36.85
>>380-381
ありがとう
384 :デフォルトの名無しさん2011/10/13(木) 15:33:05.74
while(1){
a++;
}

WindowsだとSleep(1);挟まないとCPUが100%に張り付きますが、
Linuxだと挟まなくても張り付きません。
そんなもんなんですかね?
Linuxではそこのところ特に気にしなくでもOKということでしょうか?
385 :デフォルトの名無しさん2011/10/14(金) 00:28:41.58
・最適化で消えている
・マルチコアのCPU使用率の見方を間違えている
392 :3842011/10/15(土) 09:01:13.81
>>385-386
ありがとうございます。
Windowsではタスクマネージャーで確認すると、1つのCPUコアが100%に張り付きます。
Linuxではtopコマンドで当該プロセスのCPU使用率が0.1%とか0.2%です。
趣味プログラムなので当面WindowsのみSleep挟む方向でやってます。
386 :デフォルトの名無しさん2011/10/14(金) 01:04:15.03
Windowsでもプロセスの優先度とか同時に動いてる他のプロセスとの関係で状況が変わるだろ
387 :デフォルトの名無しさん2011/10/14(金) 22:01:27.56
Windowsアプリでどうしてもそこでプログラムを強制終了させないとダメ
っていう場合はexit、abort、terminate、その他、どれが一番マシですか?
389 :デフォルトの名無しさん2011/10/15(土) 00:39:29.37
デニス・リッチーを復活させるにはどのようなコードを書けばよろしいでしょうか。
390 :デフォルトの名無しさん2011/10/15(土) 00:43:05.68
未定義コード実行して運が良ければ復活してもおかしくないよ
391 :デフォルトの名無しさん2011/10/15(土) 01:24:58.52
i = i++; とかか
393 :デフォルトの名無しさん2011/10/15(土) 19:58:14.01
>>391
その式をHevensコンパイラ1.7に書けても
ストイコリッチーしか復活しないぞ。
しかも、左手左足がついてなかった。
394 :デフォルトの名無しさん2011/10/15(土) 21:51:55.89
>>393
死者を甦らせる方法は今の所誰一人成功していないぜ
396 :デフォルトの名無しさん2011/10/15(土) 22:19:11.61
心停止した直後なら除細動器で生き返る事もあるな
脳死したらまず無理だ
400 :デフォルトの名無しさん2011/10/15(土) 23:06:07.03
ゲームプログラマになる前に…の5章(シーケンス遷移)で困ってます。

サンプルのプログラムではSequenceファイルの中にGameファイルがあり、
SequenceとGameファイルの中にはいくつかcppがあるのですが、

これを自分で一から作ろうと思ったらどうしたらいいのでしょうか?
例えば、
新規プロジェクトを作成→その中にSequenceファイルを作成→Sequenceフォルダの中に
cppを作成→Sequenceフォルダの中にGameフォルダを作成→その中にcppを作成。

といった手順で作成するのですが、コンパイル出来ません。
本にはプロジェクト内部にディレクトリが構成されているので、
プロジェクトのディレクトリをインクルードパスに指定してやらないといけないと書いてありますが、
あまり意味が分かりません。

ちなみにインクルード出来ない部分は
#include "Sequence/Game/〜.h"です。
401 :デフォルトの名無しさん2011/10/15(土) 23:12:23.64
ソリューションフォルダ
 プロジェクトフォルダ
  Sequenceフォルダ
   *.cpp

?エクスプローラーから上のようにファイルを作成
?VC++を開く
?画面左のソリューションエクスプローラーの該当プロジェクト名で右クリック
?追加→既存の項目→さっき作ったファイルを指定
402 :デフォルトの名無しさん2011/10/15(土) 23:16:02.40
$(ProjectDir)を追加のインクルードディレクトリに追加
404 :デフォルトの名無しさん2011/10/15(土) 23:22:33.31
>>402
それって
プロジェクト → プロパティ → C/C++ → 全般 → 追加のインクルードディレクトリ
に書けばいいんですよね?本に載ってあったんでそのまま書いたんですけどダメ
でした。
エラーはこんな感じで出てます。
未解決の外部シンボル "public: __thiscall Sequence::Game::Parent::~Parent(void)" (??1Parent@Game@Sequence@@QAE@XZ) が関数
405 :デフォルトの名無しさん2011/10/15(土) 23:26:26.90
>>404
cppの方の名前空間指定を間違えていないか?
406 :デフォルトの名無しさん2011/10/16(日) 00:01:59.21
>>405
丸々コピーして試したので間違ってないと思います。
403 :デフォルトの名無しさん2011/10/15(土) 23:19:54.52
もしかしてVC++2008からではフォルダは追加出来ないのかな?
VC++上でフォルダを作るんじゃなくて、新規プロジェクトのフォルダ内に
Sequenceフォルダを作ればいいんですよね?
407 :4002011/10/16(日) 11:17:28.92
昨日、質問させていただいたものです。
あれから調べてみたのですが、VC++上でフォルダを作成しても
Windowsの上では作成されないので、Windows上でも同じように
フォルダを作成し、VC++上と同じようにフォルダを配置すればいいんですよね?
それから、$(GAME_LIB_DIR)\Sequence1\include、だけを追加のインクルードディレクトリに
追加したときには、
fatal error C1083: include ファイルを開けません。'Sequence/Parent.h': No such file or directory
fatal error C1083: include ファイルを開けません。'Sequence/StageSelect.h': No such file or directory
といった感じのエラーが出たので、追加のインクルードディレクトリに$(ProjectDir)を追加しました。
すると先ほどのエラーは消えたのですが、今度は
未解決の外部シンボル "public: __thiscall Sequence::Game::Parent::~Parent(void)"(??1Parent@Game@Sequence@@QAE@XZ) が関数
"public: void * __thiscall Sequence::Game::Parent::`scalar deleting destructor'(unsigned int)" (??_GParent@Game@Sequence@@QAEPAXI@Z) で参照されました。
未解決の外部シンボル "public: __thiscall Sequence::Game::Parent::Parent(int)"(??0Parent@Game@Sequence@@QAE@H@Z) が関数
"public: void __thiscall Sequence::Parent::update(void)" (?update@Parent@Sequence@@QAEXXZ) で参照されました。

と出ました…こんな事も分からない自分に涙が出そうです…
409 :デフォルトの名無しさん2011/10/16(日) 11:52:44.27
>>407
Parent.cpp,Parent.cxx,Parent.ccなどがあるだろうから
それをプロジェクトに追加
410 :3842011/10/16(日) 15:58:23.91
今日お昼ご飯を食べながらなんとなくtopコマンドで見ていたら
Linuxでも100%に張り付いていました。
お騒がせしました。
411 :デフォルトの名無しさん2011/10/18(火) 18:38:37.58
スレッド内部のループ終了条件のためにフラグ変数is_not_endを共有して

while(AtomicChack(is_not_end)) // 他のスレッドがAtomicSet(is_not_end, false)を実行するのを待つ
{
// 何かする。空ではない
} ;

って書いていてるんだけど

while(is_not_end)
{
// 何かする。空ではない
} ;

こういうふうに書き換えたらまずいですか?
413 :デフォルトの名無しさん2011/10/18(火) 21:28:06.74
>>411
短くいえば、ダメ

もう少し長く言うと、アトミック性、コンパイラの最適化、メモリの可視性の問題を
全部は解決できないからダメ
C++11ではその目的のためにstd::atomicというのが導入されますた

他の(もっと高級な)言語では、単にその変数をvolatileと宣言しておけばいい
場合もあるけど、C/C++では違います(volatileはあるけどメモリの可視性は
保障されない)
414 :デフォルトの名無しさん2011/10/19(水) 17:56:53.59
もういいよそういう規格策定者だけの自己満足で誰も得しない機能拡張
415 : 忍法帖【Lv=40,xxxPT】 2011/10/19(水) 18:34:44.86
>>414
どれのこと?
417 :デフォルトの名無しさん2011/10/19(水) 21:28:17.97
template <class D> class A : noncopyable<A<D> >
{
public:
A(void)
{
static_cast<D *>(this)->Func() ; // Bの構築が完全に終わってから呼びたい
}
} ;

class B : public A<B>
{
public:
void Func(void)
{
// これはBが完全に構築されてからでないと呼び出してはいけない
}
} ;

なんとかしてコンストラクト時に自動で呼ばせたいんですがいい方法はないでしょうか
B Make(void) { B b; b.Func(); return b; }
のようにファクトリを使うのはコピー不可なので無理です

419 :デフォルトの名無しさん2011/10/19(水) 21:38:31.82
>>417
ファクトリでコピーじゃなくてshared_ptrででも返すのは?
420 :デフォルトの名無しさん2011/10/20(木) 16:06:51.96
void君て丸っきりおバカでは無いにしろ
ADHDとかADDを指摘された事無い?
421 :デフォルトの名無しさん2011/10/20(木) 17:10:25.24
>>420
こちらへどうぞ。

日下部陽一著 作ってわかるCプログラミング(第6版)
http://hibari.2ch.net/test/read.cgi/tech/1179389033/
422 : ◆QZaw55cn4c 2011/10/22(土) 04:38:17.03
>>420
むしろADHD くらいの奴の方が化ける可能性がある。化けそこなうことも多いが。
とにかくみんないっしょじゃつまらん
423 :デフォルトの名無しさん2011/10/26(水) 10:26:13.23
namespace hoge { // 既存のライブラリ関数。変更できない
template <class A1> void func(A1 const & a1) ;
template <class A1, class A2> void func(A1 const & a1, A2 const & a2) ;
template <class A1, class A2, class A3> void func(A1 const & a1, A2 const & a2, A3 const & a3) ;
}

namespace Fuga { // アプリケーションで使うラップされた関数
template <class A1> inline void Func(A1 const & a1) { hoge::func(a1) ; }
template <class A1, class A2> inline void Func(A1 const & a1, A2 const & a2) { hoge::func(a1, a2) ; }
template <class A1, class A2, class A3> inline void Func(A1 const & a1, A2 const & a2, A3 const & a3) { hoge::func(a1, a2, a3) ; }
}

名前規則に合わせるためと後々の差し替えの可能性を考慮して
上のように既存の関数の薄いラッパーを書いたんだけどオーバーロードがたくさんあるとめんどくさい
これをtypedefのように一発で置換する方法はないだろうか?
428 :デフォルトの名無しさん2011/10/28(金) 10:41:32.72
>>423
C++11 の variadic templates でなんとか。
424 :デフォルトの名無しさん2011/10/27(木) 22:18:50.14
c++/clrのwindowsアプリケーションで作成している時に
デバッグにコンソールを開いてやりたいのですが
コンソールを開くにはどうすればいいのでしょうか?
425 :デフォルトの名無しさん2011/10/27(木) 22:50:58.33
>>424
リンカの設定でサブシステムをコンソールにするか
http://comsci.liu.edu/~murali/win32gui/Win32Apps.htm
429 :デフォルトの名無しさん2011/10/30(日) 15:15:36.49
すみません。計算符号の差し替えを実現するにはどうすれば良いのでしょうか?
以下のようにしたのですが、#undefと#defineは条件式内で使っても無意味なのか、変数aが1でも2番のマイナスになります。
計算式の種類分、コードを書き出すしか手は無いものなのでしょうか?

#define HUGOU
//上だけグローバルスコープ、以下は関数の中
switch (a) {
case 1: //加算
#undef HUGOU
#define HUGOU +
break;
case 2: //減産
#undef HUGOU
#define HUGOU -
break;
}
int result = 7 HUGOU 5; // プラスのはずがマイナスに。
430 :4292011/10/30(日) 15:22:14.77
>>429

#define HUGOU
//上だけグローバルスコープ、以下は関数の中


#define HUGOU +
//上だけグローバルスコープ、以下は関数の中
432 :デフォルトの名無しさん2011/10/30(日) 15:55:00.29
>>429
#defineとかはコンパイル前に処理される
加算、減算の関数を作って呼び分けるのが楽なんじゃね
433 : ◆QZaw55cn4c 2011/10/30(日) 15:56:33.03
>>429
つ>>431

#define はプリプロセッサにより、コンパイラに渡る前に消える。
>>429 をプリプロセッサを通ると次のようなコードになる(はずである)。

switch (a) {
case 1: //加算
break;
case 2: //減産
break;
}
int result = 7 - 5;
434 :デフォルトの名無しさん2011/10/30(日) 16:09:45.10
>>433
今のほとんどのコンパイラはプリプロセッサ内蔵だから正確には
コンパイラに渡る前に消えるじゃなくてコンパイラ内部で消すだろ
436 : ◆QZaw55cn4c 2011/10/30(日) 17:55:21.47
>>434
bcc32/cpp32: Borland C/C++ Preprocessor
gcc/cpp-3or4.exe
この二つは別プロセスで起動されるようですね。

>>435
#define とか #include とか #if/#ifdef/#elif とかはプリプロセッサが処理する。
ソースコードは、
(1)プリプロセッサ
(2)...(n) コンパイラ (何段階かあると思う)
(n+1) リンカ
と形を変えながら渡って最後に実行可能ファイルに変容する。

>>429 のコードで#define で定義された HUGOU はコンパイラに渡る前に - に置き換えられている。
コンパイル前には、switch 文の中の各 case には、break; 文しか記述されていない。#define そのものはコンパイラには渡っていない。
438 :デフォルトの名無しさん2011/10/30(日) 19:02:11.09
>>436
お前本当に何も知らないんだな
cpp32.exeはトライグラフを内部で処理するとコンパイルが遅くなるから
その部分をくっつけて外に出しただけだ

つまりお前はEmbarcaderoの正規ユーザーではなく割れ厨って事がバレバレ
439 : ◆QZaw55cn4c 2011/10/30(日) 19:15:39.65
>>438
いつぞや、私のソースを毎回 bcc32 -v -vG でチェックされていた方ですか?お久しぶりです。

>お前本当に何も知らないんだな
いろいろと解説ありがとうございます。

>つまりお前はEmbarcaderoの正規ユーザーではなく割れ厨って事がバレバレ
毎度のことながら、論理が飛躍していませんか?
431 :デフォルトの名無しさん2011/10/30(日) 15:37:37.06
コンパイル時と実行時がごっちゃになっている
435 :4292011/10/30(日) 16:51:44.23
>>431-434
定数がちゃんと文字に置き換わるんですから、定数の宣言は当然それより前に処理されますよね。。
編集時にミスが起こり難い様に工夫しながら別々に関数にする事にします。
ご助言、ありがとうございました〜
437 :デフォルトの名無しさん2011/10/30(日) 17:58:43.57
コンパイラにプリプロセス結果を出力する機能があるはずだから
実際やってみるとよくわかる
441 :デフォルトの名無しさん2011/10/30(日) 22:36:31.91
Visual C++ 2010 のコンパイラ CL.exe はプリプロセッサ内臓だね
/E オプションとかでプリプロセス結果を見られる
442 :デフォルトの名無しさん2011/10/31(月) 16:13:07.86
struct tagHandle ;
typedef tagHandle * Handle ;
shared_ptr<remove_pointer<Handle>::type> p ;

tpedef int Handle ;
shared_ptr<???> p;

↑どないしましょう?
447 :デフォルトの名無しさん2011/10/31(月) 20:24:39.70
>>442
pointerという名のtypedefメンバを定義したデリータを指定すればT*型でないものを保持・処理するようになる

#include <iostream>
#include <memory>

typedef int Handle;

Handle get(int v) { return v; }
void release(Handle & h) { std::cout << "release:" << h << std::endl; }

struct handle_deleter
{
typedef Handle pointer;
void operator() (Handle & h) const { release(h); }
};

int main()
{
std::unique_ptr<Handle, handle_deleter> p1(get(100));
return 0;
}
443 :デフォルトの名無しさん2011/10/31(月) 16:48:07.43
shared_ptr<Handle> p(new Handle(GetHogeHandle()));
とか
448 :デフォルトの名無しさん2011/11/01(火) 13:26:29.61
>>443の方向で

std::shared_ptr<Handle> handle_factory()
{
return std::shared_ptr<Handle>(new Handle(getHandle()), [](Handle * p) { releaseHandle(*p); delete p; });
}
std::shared_ptr<Handle> p = handle_factory();

とか
452 :デフォルトの名無しさん2011/11/10(木) 00:09:22.79
class CHoge {
int *p ;
public:

} ;

のポインタpの中身ってCHoge.(*p)とかじゃなくて *CHoge.pなんだな
何かしっくりこないんだが
454 :デフォルトの名無しさん2011/11/10(木) 10:24:49.55
Visual C++〈1〉はじめてのWindowsプログラミング (プログラミング学習シリーズ) 山本 信雄
を読んでVS2010でWin32を使ってみたのですが、いきなり躓きました。
以下の通りに書いてみたのですが、メッセージボックスに何も表示されません。(コメント行は原文です)
http://codepad.org/Ca89uaSG
この場合、何がいけないのでしょうか?
すいませんが、よろしくお願いします。
458 :4542011/11/10(木) 11:56:26.59
>>457
これだと動きますね。
LPWSTR s = L"テスト";
にして>>454を動かすと、「テスト」が表示されますし。
コピーの方法に問題があるのでしょうか?

原文に戻してstrcpyにすれば、とりあえずsには文字列が入りますが、メッセージボックスが使えないですし。
文字列を変換すれば良いのでしょうが、lstrcpyが使えない理由がわからないままなのが気になります。
461 :デフォルトの名無しさん2011/11/10(木) 12:57:28.97
>>454
自分もその本読んだけど、悪いことは言わん、今すぐ捨てろ。めちゃくちゃだから、その本。

1巻のWin32APIを学びたいならプログラミングWindows(上下)しかない。
値段は高いけど、これ読むかMSDN読む以外にWin32APIを「正しく」理解する方法はない。
2巻の「オブジェクト指向」は「名詞と動詞」みたいな有害なだけの化石概念が出てくる。捨ててよし。
3巻のMFCはクソの極み。読むだけで死ぬ。開く前に捨てよう。
462 :デフォルトの名無しさん2011/11/10(木) 13:04:35.72
>>461
でももう売ってないだろ?
463 :4542011/11/10(木) 13:06:06.50
>>459
一度そこを見ましたが・・・よく考えたらUnicodeになってました。
マルチバイトにしたら動きました、ありがとうございます。

>>460
似て異なる物だとは思うのですが、正確に把握出来て無いですね。
ググってみます。

>>461
流石にVC6はもう古いですかね?
評価が高いから、この本で勉強してみようと思ったのですが・・・。
MFCを覚える前にWin32APIを理解する必要があるかと思って、触ってみました。
464 :デフォルトの名無しさん2011/11/10(木) 13:18:12.73
>>463
LPWSTR は long pointer wide string の意味。
つまり、wchar_t *。

wchar_t *s = NULL;
wcscpy( s, L"おぱんぽん" );

なんてやったらメモリぶっこわして終わりなのはわかるでしょ?

wchar_t s[ 100000 ];
wcscpy( s, L"おぱんぽん" );

のように書かないと。
そしてもう一つ。残念なことにいまのところ、
まだWindowsアプリケーションはUnicodeで万事OKとは言いがたい。
従って、TCHARとTEXTを用いるべき。例えば…

TCHAR s[ 100000 ];
_tcscpy( s, TEXT( "おはようございます" ) );
iRet = MessageBox( NULL, s, TEXT( "MsgBox" ), MB_OK );

>流石にVC6はもう古いですかね?
さすがに標準から逸脱しすぎて、現代的なテクニックの大部分が使えなくなってる。
>評価が高いから
2ちゃんの某スレでそうだったので自分も買ったのだが、単なる提灯書き込みであったことが後に発覚。
465 :デフォルトの名無しさん2011/11/10(木) 13:25:32.56
>>464
>まだWindowsアプリケーションはUnicodeで万事OKとは言いがたい。
UnicodeでNGになるのってどんなこと?
466 :デフォルトの名無しさん2011/11/10(木) 13:26:04.24
>>464
プリプロセッサでワイド文字とマルチバイト文字を切り替えなきゃいけないのって、
たとえばどういう状況?どういうときにそれを気にすればいいの?
468 :デフォルトの名無しさん2011/11/10(木) 13:47:48.52
>>464
倣うなら、WCHAR s[100000];
469 :4542011/11/10(木) 14:05:35.86
>>464
wchar_t *s = NULL;
wcscpy( s, L"おぱんぽん" );

これだとポインタをNULLにしているので初期化になっておらず、
確かに場所が無いから入れようが無いのはわかるのですが

wchar_t *s = "ぬるぽ";
wcscpy( s, L"おぱんぽん" );

なら、ポインタの場所があるから上書きされる・・・と思ったのですが違うのですね?
配列にして領域を確保しないといけないと言ったところでしょうか?
またこの場合、"おぱんぽん"はどこにコピーされているのでしょうか?
470 :デフォルトの名無しさん2011/11/10(木) 14:29:29.21
>>465-466
んー。いろいろ自分なりに理屈を考えたけど、わからんなぁ。
個人的にはUnicode決め打ちでもいいような気はするんだが…↓

MSDNは国際化対応のためにTCHAR系使えっていってるし
http://msdn.microsoft.com/ja-jp/library/xxh1wfhz.aspx

オプションでwchar_tそのものの定義も変わってしまうので
http://msdn.microsoft.com/ja-jp/library/dh8che7s.aspx

おとなしくMicrosoft様のいうとおりTCHAR系をお勧めしておきたい。

>>469
Win32APIの前にK&R第二版でも読んでCの基礎を固めておいたほうが良い感じ…
473 :デフォルトの名無しさん2011/11/10(木) 16:43:13.35
>>469
「メモリの確保=初期化」では無いよ。

場所があっても書き込みして良いとは限らないよ。
以下のスレを参考に。
http://hibari.2ch.net/test/read.cgi/tech/1319581056/46-
474 :4542011/11/10(木) 17:28:06.77
>>473
なるほど、constやdefineのように固定値になっているのですね。
書き換えるなら最初から書き換え用の領域を確保が必要と。
ありがとうざいました。
456 :4542011/11/10(木) 10:41:37.50
確かに不正なポインタと表示されますが、どのように初期化すれば良いのでしょう?
LPWSTR s = L"";
と、宣言すればポインタは取得しているのですが、やはりメッセージボックスには何も表示されませんでした。
457 :デフォルトの名無しさん2011/11/10(木) 10:47:47.90
一つずつ行こうか。
http://codepad.org/O5w3nJge
459 :デフォルトの名無しさん2011/11/10(木) 12:30:51.95
460 :デフォルトの名無しさん2011/11/10(木) 12:42:56.06
ポインタ変数と配列の違いを勉強した方が良いと思う。
471 :デフォルトの名無しさん2011/11/10(木) 16:36:02.85
ffmpegのフォーマットを調べようと思って、
ttp://jasonjano.wordpress.com/2010/02/09/a-simple-c-wrapper-for-ffmpeg/ (Running the ffMpeg Processの部分)
ここのコードを使ってみたんですが、Parameterに"-formats"を入れるとproc.WaitForExit();でとまってしまいます。
どうすれば止まらずに、出力を取得できるでしょうか。
ちなみに、 ("-i {0}", videoPath) はできます。
475 :デフォルトの名無しさん2011/11/11(金) 03:51:26.94
GCC、VC++でマクロと標準のincludeを展開せずに、ソースコードを一枚にまとめるにはどうしたら良いですか?
プリプロセッサの機能と思うのですが出来ないです。
476 :デフォルトの名無しさん2011/11/11(金) 04:37:11.42
>>475
何をどうしたいの?
目的が分からない
477 :デフォルトの名無しさん2011/11/11(金) 06:42:30.72
標準のincludeの行を消してプリプロセスする
マクロはわからん
478 :デフォルトの名無しさん2011/11/11(金) 23:37:49.09
仮引数を持つコンストラクタで初期化する場合,

CHoge obj ( ) ;

と書くのではなく,

CHoge obj ;

と書くのはデフォルトコンストラクタが関係したりしています?
480 :デフォルトの名無しさん2011/11/11(金) 23:45:49.20
それが関数宣言とみなされるのがたまらなく嫌だった
僕はそのことに耐えられなかったのだ
括弧を省略したのにはそんな訳があった
481 :デフォルトの名無しさん2011/11/11(金) 23:57:16.27
>>480
言われてみれば確かにCHogeを返す引数なしのobjという関数に見える

ということは,デフォルト引数ありで引数省略のコンストラクタと,引数なしのコンストラクタとは共存できないのね

スッキリしたthx
482 :デフォルトの名無しさん2011/11/12(土) 09:15:40.63
コンパイラgcc 2.95.3です。
void
fetch_info(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fputc('\n', stderr);
}
という関数をコンパイルすると、
va_start(ap, fmt);で
discards qualifiers from pointer target type
というワーニングが出ます。
エラー部のマクロを展開すると、
( ap = (va_list)((long *)&( fmt ) + __extension__ ( __builtin_classify_type(*( __typeof( fmt ) *)0) == __real_type_class ? sizeof (*( __typeof( fmt ) *)0) > sizeof (double) ? 4 : 2 :
__builtin_classify_type(*( __typeof( fmt ) *)0) == __record_type_class || __builtin_classify_type(*( __typeof( fmt ) *)0) ==
__union_type_class ? (sizeof (*( __typeof( fmt ) *)0) +
sizeof (int) - 1) / sizeof (int) :
__builtin_classify_type(*( __typeof( fmt ) *)0) ==
__integer_type_class && sizeof (*( __typeof( fmt ) *)0) >
sizeof (int) ? 2 : 1 ) )) ;
あまりにも難しくて理解できないのですが、
どこが悪いのでしょうか?
485 :デフォルトの名無しさん2011/11/12(土) 13:50:48.16
> (long *)&( fmt )
const char * * を long * にキャストするとconstが無くなるけどそれでいいのかいって警告
この場合問題ないから無視するかGCCのバージョンをあげな
490 :デフォルトの名無しさん2011/11/13(日) 22:17:21.49
超初心者ですみません
vc++とかでプロジェクトの設定をする時に
includeのパスを通すのは分かるんですが
libにパスを通す意味ってなん何でしょうか
ライブラリのディレクトリパスを指定する、というのは分かるのですが
ライブラリのファイルを読んでくることの必要性というのは何なのでしょうか
includeは、
#include <stdio.h>
などでよく使うので馴染みがあるのですが
初心者ゆえライブラリというものをどういう時に使うのかが分からないのです。
491 :デフォルトの名無しさん2011/11/13(日) 22:37:34.29
>>490
#include で宣言を libで処理の実体を頂いてくると考えておくといい
ヘッダーで完結するライブラリもあるから、
必ずしもこのパターンになるとは限らない。
例えば、
void hoge(); /*宣言 ヘッダ*/
void hoge() /*実体 lib*/
{
}
493 :デフォルトの名無しさん2011/11/13(日) 22:59:48.72
>>490
ライブラリってのはコンパイル済みのソースみたいなもんです
printfの中身とかが入ってます
で、exeを作るときにはprintfの中身が必要になることもあるのでそれのおいてある場所を指定するわけです
printfの入ってるようなlibならvcの場合は勝手に取ってきますが
そういう標準なやつでないものを使いたいときにその中身が入っているファイルのあるパス、およびそのファイル名を指定します
495 :デフォルトの名無しさん2011/11/13(日) 23:13:10.16
>>490
stdio.h だけじゃなくて、
本当は stdio.c (に相当する物)も必要だから。

C/C++プログラムが作られる工程
(3つのソースからhello.exeをつくる場合)

 コンパイル:
  test.c --> test.obj
  test2.c --> test2.obj
  main.c --> main.obj

 リンク:
  test.obj test2.obj main.obj --> hello.exe

 * リンク: 複数の.objを、1つにまとめる。

.objはVCプロジェクトのフォルダ内にあると思う。
ライブラリもプログラムも.obj形式の一種。

(ライブラリはwindowsだと.libファイル。)

ヘッダーファイルは一覧しか書いてない!
だから、stdio.obj に相当するものが必要。

それがライブラリ!
504 :デフォルトの名無しさん2011/11/14(月) 00:32:49.82
>>495
じゃあ
stdio.hをインクルードして
#include <stdio.h>
int main() {
printf "helloWorld";
}
というファイルをhello.cとして保存した後、
コンパイルした場合は、studio.cとhello.cをリンクするような動作をしているということでしょうか
505 :デフォルトの名無しさん2011/11/14(月) 01:33:03.07
>>504
そのとおり。
よく使うもの(標準ライブラリなど)は、
必要な分だけVCが勝手にやってくれてるだけ。

本当はリンクの指定も自分で行わないといけない。
逆にそれらをリンクしない設定もできる。

もちろん必要なのにリンクされない場合、
リンカが「足りないよ」ってエラーを出す。
506 :デフォルトの名無しさん2011/11/14(月) 01:39:49.74
>>504
考え方はあってるがリンクするのはソースファイルじゃなくてhello.cをコンパイルしたhello.objと
stdio.libの中のprintf.obj(ライブラリの作成者が事前にprintf.cをコンパイルしておいたもの)とかだけどな
508 :デフォルトの名無しさん2011/11/14(月) 01:58:41.47
>>506
なるほど、わかりやすいです。
コンパイルするとobjという形式になるんですね
494 :デフォルトの名無しさん2011/11/13(日) 23:06:04.47
objとlibはナニが違うんですか?
499 :デフォルトの名無しさん2011/11/13(日) 23:17:30.46
>>494
libはobjのコレクションだ。
objの状態でも使えるけど、libにまとめておいたほうが管理しやすい。
obj専用のアーカイブファイルみたいなものだね。
501 :デフォルトの名無しさん2011/11/13(日) 23:48:10.14
>>494
objもソースの中身だけど 各コンパイラが勝手に作った形式で
libは他のコンパイラでも使えるように共通化されたものかもしれない
objは自分用でlibは公開用とでも思っておけば。
502 :デフォルトの名無しさん2011/11/13(日) 23:50:35.79
>>501
憶測で大間違いを書くなw
503 :デフォルトの名無しさん2011/11/14(月) 00:19:35.67
>>502
.exeと.lib、.selfと.aにしか興味ないんで認識あまかったかw うふふ。
507 :デフォルトの名無しさん2011/11/14(月) 01:51:01.58
>>503
.selfってどの環境なんだろ
.out と .a ならわかるんだけれど
509 :デフォルトの名無しさん2011/11/14(月) 01:59:26.49
>>507
もうすぐ出るゲーム機の開発かんきょー
510 :デフォルトの名無しさん2011/11/14(月) 04:04:27.88
>>509
なんでそんなマイナーな環境持ち出したの?
518 :デフォルトの名無しさん2011/11/14(月) 17:21:01.12
>>509
青い背景にすると焼き付きが目立つって噂のあのゲーム機?
521 :デフォルトの名無しさん2011/11/15(火) 01:18:38.08
>>518
え、マジ?そんな噂あるの?
今品薄で俺のところまで最新の実機来てないから本物の焼き付きとかわかんねです
529 :デフォルトの名無しさん2011/11/16(水) 00:24:09.00
>>521
開発機で白文字放置したら簡単に…って噂
ゼビウスとかきっとヤバイ
496 :デフォルトの名無しさん2011/11/13(日) 23:15:19.12
なんでわざわざobjとlibを別の名前にしたんですか?同じなのに?
498 :デフォルトの名無しさん2011/11/13(日) 23:16:40.65
>>496
厳密には異なる形式だから
500 :デフォルトの名無しさん2011/11/13(日) 23:33:38.31
>>496
.lib は後処理して綺麗にしたもの。
exeもobjを綺麗にしたもの。
512 :デフォルトの名無しさん2011/11/14(月) 05:45:38.74
クラスAがhoge()をもってて、
クラスBはクラスCを継承してhoge()をオーバライドしていて、
クラスCはクラスBを継承してhoge()をオーバライドしていて、
クラスDがクラスCを継承しているとき、
クラスDでhoge()を記述しようとしたら、クラスAのhoge()と全く同じことに気がつきました。

この際に、クラスAのhoge()を再利用して、コード量を減らすことってできます?

よろしくお願いします。
513 :デフォルトの名無しさん2011/11/14(月) 05:47:08.17
>>512 C++でおk
514 :5122011/11/14(月) 06:13:04.72
>>513
申し訳ない
×クラスBはクラスCを継承してhoge()をオーバライドしていて、
○クラスBはクラスAを継承してhoge()をオーバライドしていて、

そういうことではなくて、コードを書いた方がいいということです?
517 :デフォルトの名無しさん2011/11/14(月) 06:50:54.32
>>512
D::hoge() の中で A::hoge() と明示的に A:: を付けて呼び出せば改めて
書く必要は無いけど、 A::hoge() の実装をいじったときに D::hoge() まで
影響を受けるようだと困るかもしれない。
519 :デフォルトの名無しさん2011/11/14(月) 21:21:25.73
C++の「ハンドル」って何ですか?
ポインタのことを理解していないと分からないものですか?
522 :デフォルトの名無しさん2011/11/15(火) 01:28:56.82
>>519
うちの会社では管理してる物にアクセスするIDとかをハンドルって呼んでるなぁ
たとえばシステムが管理してるものの入った配列があってその3番目のにアクセスしたいときのハンドルは2、もしくは3になってたりする
(実際は安全のためもうちょっと工夫したのを使ってるんだけど)
めんどいときはnewしたポインタをそれっぽいのにキャストして返して、それにアクセスする関数でもとのにキャストしなおして使うとか

C++の「ハンドル」ってのはなにかはシラネ
もしかしてHWNDとかそっちの話?
523 :4822011/11/15(火) 01:53:08.69
お世話になっております。
(va_list)((long *)&( fmt )
の場所を
(va_list)((const long *)&( fmt )

(va_list)((long * const)&( fmt )

(va_list)((const char *)&( fmt )

(va_list)((char * const)&( fmt )
とやってみましたが、無理でした。
__builtin_classify_type(...
は引数の始まりを計算しているから触らないでよいんですよね?
>>const char * * を long * にキャストするとconstが無くなるけどそれでいいのかいって警告
gccのバージョンをあげるのは無理な状態です。
(ソースからコンパイルできる自信が無い)
ワーニングを無視するのも、少し心配です。
constを保ったままキャストする方法は無いのでしょうか?
524 :デフォルトの名無しさん2011/11/15(火) 03:14:45.73
fetch_info(const char *fmt, ...)
からconstを取る。
Cのリテラルはconst char *じゃなく、char *だったはず

これが正しいかどうかは識者が後ほど突っ込んでくれるはず。
526 :デフォルトの名無しさん2011/11/15(火) 21:26:49.08
ttp://d.hatena.ne.jp/S_Amemiya/20091121/1258791196
このページの中ほどにある、
「planet() : equatorial_axis() {}」
というのはどういう意味ですか?

planet()というのはコンストラクタですか?「:」以降はどういった意味で?
よろしくおねがいします。
528 :デフォルトの名無しさん2011/11/15(火) 22:08:53.50
>>526
コンストラクタと初期化子の並び
構造体 planet の変数 equatorial_axis は int 型でC由来の組み込み型。
std::string と std::vector はデフォルトで空初期化されるけど
int 型は明示的に指定しないと初期化されない。(中身が不定)
それで : equatorial_axis() と初期化子を書いてゼロ初期化している。
530 :5262011/11/16(水) 12:40:44.77
>>527, >>528
>それで : equatorial_axis() と初期化子を書いてゼロ初期化している。
とてもわかりやすかったです。ありがとうございます。
どうして、「equatorial_axis() 」という空っぽの関数を書いているのかと悩みましたが、初期化する場合の書き方でしたか。

追加でもうひとつお願いします。
try{}catch{}で例外を捕まえたときに、
その例外がどんなものなのかコンソールに表示したいのですが、
javaのSystem.out.printlnのように簡単に表示することは出来るのでしょうか?

とりあえず、cout <<としてみたところ、Javaのような変換はされませんでした。
531 :デフォルトの名無しさん2011/11/16(水) 12:48:40.58
533 :5302011/11/16(水) 13:14:38.71
>>531
即レスありがとうございます。
今回catchした例外は、「boost::property_tree::ptree_error」配下の何かなのですが、同じ方法ではダメなようでした。
せめてなんという例外なのか表示したく、近所のソースを追うと、文字列を詰めているコードがあったので、coutでいけるんじゃね?と思いましたが、ダメでした。
後からの情報追加で申し訳ないです。あと隠れている情報はないと思います。
再度お願いします。
535 :デフォルトの名無しさん2011/11/16(水) 13:29:23.13
>>533
what()でなんかでるだろ

catch(boost::property_tree::ptree_error & e)
{
cout << e.what();
}
527 :デフォルトの名無しさん2011/11/15(火) 21:54:26.74
コンストラクタ
初期化
532 :デフォルトの名無しさん2011/11/16(水) 13:11:15.21
Javaだと暗黙のtostringみたいなのが呼ばれるんかな。
stringへのキャスト演算子をオーバーロードすればどうにかなるだろうか。
534 :デフォルトの名無しさん2011/11/16(水) 13:21:10.02
xmlのフォーマットで書かれたテキストファイルを読み込みたいのですが、
そもそも、ファイルの内容がXMLとしておかしくないかチェックしてくれる便利なライブラリを紹介いただけないでしょうか?

<root>
 <aa>えー</cc>
 <bb>びー</bb>
</root>
rapid_xml(もしくは、boost::property_tree)でxmlのパースができることを見つけました。
が、<aa>の閉じタグが何故か</cc>になっているのでパースエラーになってほしいのですが、問題なしにされてしまいました。
ここまでのチェックは、他のライブラリも含めて、してくれないものなのでしょうか?

欲を出すと、boostライセンスのように取扱が簡単なものがよいのですが…。
MSXMLも試してみます。引数の意味を理解できなかったので後回しにしていました。

(530ですが、別件なので別名で書き込みます。)
541 :デフォルトの名無しさん2011/11/16(水) 20:44:06.55
>>534
parse<parse_validate_closing_tags>(...)
他のフラグも幾つかあるので、一度マニュアルを読んだほうがいいよ
538 :デフォルトの名無しさん2011/11/16(水) 19:04:16.91
メンバの引数と返り値がすべてwindows.hに有る型orポインタ
のインターフェースをDLLで実装して生成(破棄もDLL側で)
ってコンパイラ間の移植性ありますか?
たとえば上のようにVC++でコンパイルしたDLLをロードして使う方のEXEはMinGWでコンパイル的な感じで
539 :デフォルトの名無しさん2011/11/16(水) 19:59:33.01
boostのようにクロスプラットフォームで壁紙の変更を行えるライブラリはないでしょうか
なければ作りたいと思うのでコンパイル時にwindowsとlinuxで別のコードを使うようにする方法をおしえてください
540 :デフォルトの名無しさん2011/11/16(水) 20:07:48.44
542 :デフォルトの名無しさん2011/11/16(水) 23:35:58.05
コンストラクタって何なんですか?
数値を初期化するためのものなんですか?
初期化以外には使われないのですか?
コンストラクタがあると、どういう時に便利なのですか?
僕みたいなバカにも分かるようにセーラームーンの登場人物で例えて教えて下さい
546 :デフォルトの名無しさん2011/11/17(木) 00:25:15.54
>>542
結局のところ薔薇を投げることで、タキシード仮面が現れたことに気づいてもらえるわけだが、
たとえば、なるちゃんがタキシード仮面を視認した後、薔薇を投げるというルールにすると、
なるちゃんがたまたま近くにいないと美奈子が困るじゃん。

なので、タキシード仮面はなるちゃんがいなくてもいいように毎回自分で投げることにしてる。
これで美奈子の安全が守られる。
543 :デフォルトの名無しさん2011/11/16(水) 23:43:45.84
コンストラクタはムーン・プリズムパワー・メイクアップみたいなもん
544 :デフォルトの名無しさん2011/11/17(木) 00:03:29.13
>>543
ちょっとわかりにくいです
545 :デフォルトの名無しさん2011/11/17(木) 00:12:33.76
ムーン・プリズムパワー・メイクアップが無いとセーラー服美少女戦士を構築するために
毎回セーラー服や装飾品の数々をひとつずつ装備していかなければならず、どうしても
たまには髪のセットを間違えたりティアラを忘れるなど重大な問題を起こす可能性がある。

一連の手順をまとめて自動化したムーン・プリズムパワー・メイクアップは非常に大切
なのであるかもしれない。
547 :デフォルトの名無しさん2011/11/17(木) 01:14:17.87
>>545
美少女戦士クラス
...コンストラクタ(ムーンプリズムパワーメイクアップ)
.......髪
.......ティアラ
.......セーラー服

月野うさぎ.ムーンプリズムパワーメイクアップ
 =美少女戦士セーラームーン(セーラー服、ティアラ、髪)??
ってこと?
ムーンプリズムパワーメイクアップをしても、キャラごとに服や髪の色は違うけれど
それはどう対処するのでしょうか
548 :デフォルトの名無しさん2011/11/17(木) 01:40:16.81
質問です。
struct data{
char name[20];
}mydata = { "nanasi"};
struct data *p;
p=&mydata;
printf("hello! %s \n",p->name);
とやると、hello ! nanasi
と表示されると思うんですが、
これを
char *moji = "hello! %s \n";
printf(moji,p->name);
とやった場合、
hello ! nanasi
と表示させることは可能でしょうか?
もし不可能な場合、
printfに文字列へのポインタしか渡せない場合、
"hello! %s \n",p->name
をどのように展開して文字列へのポインタに代入してやれば
良いのでしょうか?
549 :デフォルトの名無しさん2011/11/17(木) 02:06:56.83
文字列へのポインタを渡してるけど、何と勘違いしたの?
550 :デフォルトの名無しさん2011/11/17(木) 08:54:32.24
>>549
ん、出来ます?
ちょっと今コンピュターを触れる
環境になくて、自信なかったのですが
551 :デフォルトの名無しさん2011/11/17(木) 09:21:10.83
552 :5482011/11/17(木) 12:15:51.26
あらー、便利なサイトをありがとう
ございます。
もうひとつ質問なんですが、
char *moji = "hello! %s \n,p->name";
printf(moji);
とやった場合は無理ですよね。
何とかして%sにp->nameを展開?
した状態で文字列へのポインタとして
printfに渡したいんですが、
その場合はstrcpyを駆使しないと
難しいでしょうか?

554 :デフォルトの名無しさん2011/11/17(木) 13:06:54.99
553 :デフォルトの名無しさん2011/11/17(木) 12:53:52.76
もしかしてsprintf?
555 :デフォルトの名無しさん2011/11/17(木) 22:16:18.22
>>553,554
ありがとうございました
556 :デフォルトの名無しさん2011/11/18(金) 00:10:50.80
なぜ代入演算子はフレンド関数でオーバーロードできないんでしょうか?
friend ob operator=(ob ob1, int i) {
ob tmp ;
tmp.x = ob1.x + i ;
return tmp ;
}
と定義できて,ob2 = 10 ;と書けそうなものですが.
557 :デフォルトの名無しさん2011/11/18(金) 00:16:58.51
>>556
そういう書き方が出来ると勝手にクラスからむしり取る悪いfriendになってしまうから
あくまでもクラス側でfriendにならないとだめ
559 :デフォルトの名無しさん2011/11/18(金) 00:28:58.35
>>557
確かにVC++2010のコンパイラに,operator=はメンバでなければならないと怒られました.
operator+やoperator-がfriendで定義できることと何が違うんです?
560 :デフォルトの名無しさん2011/11/18(金) 00:30:26.52
>>559
クラス内で定義もしくは宣言すると引数一つ、相手は自分自身

friendにすると引数二つ、自分と同じクラス
561 :デフォルトの名無しさん2011/11/18(金) 00:40:35.12
>>560
それは理解しているつもりです.
ob ob::operator+(ob ob1) ;
friend ob operator+(ob ob1, ob ob2) ;
と書けるならば
ob ob::operator=(ob ob1) ;
friend ob operator=(ob ob1, ob ob2) ;
も書けてもいいのではないかと思ったのでした
563 :デフォルトの名無しさん2011/11/18(金) 01:01:40.55
>>561
曖昧になってしまわないか?
565 :デフォルトの名無しさん2011/11/18(金) 06:04:43.97
>>561
§12.8.9
A user-declared copy assignment operator X::operator= is a non-static non-template member function
of class X with exactly one parameter of type X, X&, const X&, volatile X& or const volatile
X&.109)
[Note: an overloaded assignment operator must be declared to have only one parameter; see 13.5.3.]
[Note: more than one form of copy assignment operator may be declared for a class. ]
[Note: if a class X only has a copy assignment operator with a parameter of type X&,
an expression of type const X cannot be assigned to an object of type X].

§13.5.3.1
An assignment operator shall be implemented by a non-static member function with exactly
one parameter.
Because a copy assignment operator operator= is implicitly declared for a class if not declared by
the user (12.8), a base class assignment operator is always hidden by the copy assignment
operator of the derived class.

規格で決まっちゃってんのよ
friendは代入演算子=のオーバーロードには使えない
562 :デフォルトの名無しさん2011/11/18(金) 00:44:54.65
暗黙に生成される=があるから勝手に外でoperator=を定義されては困る
567 :デフォルトの名無しさん2011/11/18(金) 08:06:51.04
曖昧でも書けないものかと思ったわけでしたが、規格でそう決まっているなら仕方がありませんね
お付き合い頂きありがとう

568 :デフォルトの名無しさん2011/11/18(金) 13:24:11.15
friendもiostreamなんかで利点はある。

…と思ったけど、オーバーヘッドとバイナリ肥大を気にしなければ、
templateで対応できるな。
569 :デフォルトの名無しさん2011/11/18(金) 14:22:01.10
typeid(hoge).name()を使わないで、標準の範囲でクラスの型名を得ることってできますか?
570 :デフォルトの名無しさん2011/11/18(金) 14:44:44.34
>>569
クラス名を格納する変数を事前定義するか、
ソース解析、バイナリ解析すれば可能だけど、まず無理。
あきらめろ。
571 :デフォルトの名無しさん2011/11/18(金) 15:25:09.50
C++には規格にリフレクション機能は備わってないからなあ
コンパイラ言語だから不要と判断されたんだろう

gcc拡張なら__FUNCTION__, __PRETTY_FUNCTION__はあるけど
さすがにクラス名はない

というかもしあったらリンクした時たまたま同一のクラス名でファイル内だけに
通用したい場合もぶつかっちゃうっしょ
572 :デフォルトの名無しさん2011/11/18(金) 15:34:28.82
>>571
RTTIはまさにC++のリフレクションの実装だろ。

それを使わないで実行時情報を取得するには?って質問だから、
代わりに静的解析使えば?って言っただけに過ぎないんだが。
573 :デフォルトの名無しさん2011/11/18(金) 15:39:11.85
RTTIは仮想関数を使わないで実現したいデザパタを書けるように
用意されたもんだけどな

サイズならsizeofで得られるしメンバポインタもあるしtypeid().name()で
返される文字列は環境依存だし結構使えない
574 :デフォルトの名無しさん2011/11/18(金) 15:40:30.71
>>573
だからそれをリフレクションと言うんだよ。
575 :デフォルトの名無しさん2011/11/18(金) 15:43:36.33
コンパイラが違うともう返される文字列が同じとは保証されないリフレクションなぞ
使い道が限定されると言ってるだけなんだが
576 :デフォルトの名無しさん2011/11/18(金) 15:53:01.33
>>575
俺も最初の2行について言及しただけだが。
577 :デフォルトの名無しさん2011/11/18(金) 15:58:41.67
==と!=しか使えないRTTIは使い道が限られる
JavaやC#と一緒に考えんなよ
578 :デフォルトの名無しさん2011/11/18(金) 19:11:33.70
よろしくおねがいします

手持ちの入門書を見ると、関数のオーバーライドのときは親クラスの関数宣言にvirtualをつけるようにと説明されています。
ところが、このvirtualの指定をしなくても親クラス子クラスで同名同シグネチャの関数を作ることができます。

ここで質問ですが、
?このようなvirtual指定しない使い方は、文法的に正しいのでしょうか?(それとも暗黙のルールが適用されてしまっている?)

?これもオーバーライドと読んでいいのでしょうか?それとも別の呼び名があるのでしょうか?

?なぜこの使い方(?)は入門書では割愛されているのでしょうか?(プログラム自体はふつうにコンパイルできて動くのに)
579 :デフォルトの名無しさん2011/11/18(金) 20:03:59.55
>>578
ttp://codepad.org/BBF3Ssjn
virtualつけないとCBase側のtest2が呼ばれてしまう
580 :デフォルトの名無しさん2011/11/18(金) 20:04:01.68
581 :デフォルトの名無しさん2011/11/18(金) 20:22:47.11
>>579
>>580
ありがとうございます

しかし、どのような挙動をするかは実験して既知なんです
582 :デフォルトの名無しさん2011/11/18(金) 20:35:53.20
>>578
1 正しい
2 隠蔽。オーバーライドとは挙動が違う。
3 説明が面倒だから
583 :デフォルトの名無しさん2011/11/18(金) 20:51:27.50
>>582
ありがとうございます


>>580のサイトからさらに飛んだ先のサイトで、オーバーライドと区別して「上書き」という言葉を使っているのを発見しました。
すなおに英語に戻すと、overwriteですが、オーバーライド(override)の日本語訳としても「上書き」は使われています。

やや、用語に混乱があるように思うのですが、実際の現場ではどうなんでしょう?
(「誰も気にしていない」、が一番可能性高そうですが・・・・)
587 :デフォルトの名無しさん2011/11/18(金) 21:08:20.50
>>583
新しい関数を作ることで元の関数が使えなくなったりするわけじゃないので
「上書き」と呼ぶのは非推奨
588 :デフォルトの名無しさん2011/11/18(金) 21:14:08.86
スマン>>587は忘れて
よく考えたらオーバーライドも元の関数が使えなくなるわけじゃないわw
590 :デフォルトの名無しさん2011/11/18(金) 22:05:18.37
>>578
1 文法的に正しい
2 オーバーライドと読んでいい
3 すごく雑に言うと、非仮想関数はオーバーライドを禁止するセマンティクスを持つため
600 :デフォルトの名無しさん2011/11/19(土) 04:05:30.17
>>579
CSub sub; sub.test1(); // CSub::test1
CBase* pBase = new CSub; pBase->test1(); // CBase::test1
CSub* pSub = new CSub; pSub->test1();  // CSub::test1
//CSub* pSub2 = new CBase; pSub2->test1(); // エラー

僕にはわけがわかりません!
601 :デフォルトの名無しさん2011/11/19(土) 05:25:41.03
>>600
どこらへんが?
584 :デフォルトの名無しさん2011/11/18(金) 20:56:13.41
クラス変数はpublicでないとならないのですか?
クラス内のインスタンスメソッドからのみアクセスできるようにしたいのですが。

privateの中に、staticで変数を宣言すると、定義する際に、そんな変数は見付からないといわれます。
@Visual C++ 2010 Express。

よろしくお願いします。
586 :デフォルトの名無しさん2011/11/18(金) 21:06:30.50
class Hoge に対し
Hoge obj; obj.a = 10 等のように使いたいならpublicにしないとダメ。
派生したクラスから基底クラスのメンバを参照したいならprotectedにする。
589 :デフォルトの名無しさん2011/11/18(金) 21:17:05.38
上書きというより再定義の方がイメージとしては近い気がする
592 :デフォルトの名無しさん2011/11/18(金) 22:52:16.79
JISは最新のAcrobat Readerを使えと書いてある割には一つ前のバージョンの
Acrobat Readerでないと閲覧出来ない

Acrobat Reader X は NG
594 :デフォルトの名無しさん2011/11/18(金) 23:05:23.37
日本工業規格のものならね。
ansiの方は金払わないと見られなかったと思う。
595 :デフォルトの名無しさん2011/11/18(金) 23:35:10.81
logicoolのマウスでチルトホイール水平ボタン拾うとき
WndProcからWM_MOUSEHWHEELを拾っえたのですが

setpoint(6.32)起動すると拾えなくなり
setpoint停止すると拾えるようになる
(setpointの設定はデフォルト(左スクロールと右スクロール))

setpoint起動時でも拾えるようにするにはどうすればいいんでしょうか?
599 :デフォルトの名無しさん2011/11/19(土) 03:27:05.56
>>595

M500, Windows7 64bit, Setpoint6.32.7 デフォルト設定(左スクロールと右スクロール) だけど
チルト WM_MOUSEHWHEEL(0x020E) は setpoint を終了しなくても来てたよ?

ただ, X-Mouse Button Control V2.2 では setpoint 起動しているとチルトが反応しないので setpoint が
チルトの何かいじっている可能性は高いと思うけど.

これはとりあえず user.xml の Button Number="6" と "7" の内容(HorzScrollLeftSet,HorzScrollRightSet) を編集して
GenericMouseButton と同じ内容に書き換えれば反応するようになったよ.

SetpointPlus を入れて「汎用ボタン」に設定してもたぶん同じことだと思うけど.
596 :デフォルトの名無しさん2011/11/18(金) 23:59:13.99
とりあえず、Spy+でホイール回転時にどんなWM飛ばしてるか確認してみたら?
WindowsのバージョンによってもWM違うし。
602 :デフォルトの名無しさん2011/11/19(土) 11:05:35.78
サンプルコード触ってるとクラスのヘッダで

typedef class ClassA {
  (中略)
} CLASSA, *LPCLASSA;

と、typedefしてるクラスを見かける時があるんだが
これは何故このようなtypedefをしてるんだろうか。

Windowsプログラムに混ぜて書くときに、見やすくする為か?
それとも慣例か何かか?

それにLPCLASSAのようにポインタを隠匿するメリットって何だろうか。
これは可読性云々って話なんだろうか。
603 :デフォルトの名無しさん2011/11/19(土) 11:09:16.41
>>602
マイクロソフトに魂を売ったんだろ
608 :602 2011/11/19(土) 19:09:16.90
>>603-605
ありがとう。
こう、モヤモヤしてたのが楽になったよ。
604 :デフォルトの名無しさん2011/11/19(土) 11:12:08.60
A* obj1,obj2;
obj1->func(); // OK
obj2->func() // NG
ということじゃないか?obj2はAであってA*ではない。
このような誤りを防ぐためにtypedefしているのでは?
605 :デフォルトの名無しさん2011/11/19(土) 11:47:05.56
typedef HOGE * LPHOGE;
LPHOGE pH = Hoge_Create();
Hoge_DoSomething(pH);
Hoge_Delete(pH);
のように書いておけば
typedef uint_ptr LPHOGE;
と書き換えてもおkで便利だから
606 :デフォルトの名無しさん2011/11/19(土) 12:39:40.09
spy++は6.0のしかもってないわー
EEにもついていればいいのに

書き換えないとうごかないか・・・
何かいい方法はないかな
607 :デフォルトの名無しさん2011/11/19(土) 12:48:03.55
>>606
使ったことがないから詳しくは知らないが、UISpyなるツールがあるらしい。
609 :デフォルトの名無しさん2011/11/19(土) 19:33:54.06
二次元配列を動的に生成する方法について教えてください。
int a[X][Y]; のような二次元配列をnewして動的に生成したいのですが
ぐぐると、配列へのポインタをnewして、二次元目は二次元の要素数分だけ、
forループでnewする例ばかりいっぱい出てきました。
int** a=new int[X][Y];   <--エラーになる
みたいに簡単に出来ないものかと思い試行錯誤してみたら
void* a=new int[X][Y]; がコンパイルを通りました。
配列へのアクセスは
((int(*)[X])((int*)a))[x][y]=100;
上記のような記述でOKでした。
とりあえずは動作しているみたいなのですが、
これで問題はないのでしょうか。
それともこの方法は間違いであり、ぐぐるといっぱい出てくる二次元目は要素数分だけnewが正解なのでしょうか?
Webで公開しているような方々が、こんな簡単に動的配列を生成する方法を
知らない訳はないのではと思い、きっとどこか間違っていそうな気がしています。
よろしくお願いします。
610 :デフォルトの名無しさん2011/11/19(土) 19:49:54.33
>>609
そんな混み合った記述よりも内部で一次元配列使って、
アクセスだけ2次元にすればわかりやすい
width * heightの要素をもつ1次元配列(vectorだと横着できる)
int index = width * y + x;
で添え字にアクセスして終わり
template <class T>
class Array2D{...}
とかつくっといてもいいかも
611 :デフォルトの名無しさん2011/11/19(土) 19:50:39.89
>>609
int (*a)[Y] = new int[X][Y];
612 :6092011/11/19(土) 20:10:35.89
>>611
なるほど〜、勉強になります。ありがとうございます。
int (*a)[Y] = new int[X][Y];
と宣言すると
a[x][y]=100;
となりますね。
多次元配列をforループでnewしまくっているばかり出てくるwebの例は
この記述を知らないってことなんでしょうかね。
614 :デフォルトの名無しさん2011/11/19(土) 20:19:21.54
>>612
多段階配列を使いたい場合はやはり個別にnewする必要があるけどな
613 :デフォルトの名無しさん2011/11/19(土) 20:14:13.22
これは一部のスーパーハッカーしかしらない技術だからな仕方が無いよ
618 :デフォルトの名無しさん2011/11/19(土) 21:17:03.00
class DebugStream{
public:
DebugStream();
int precision( int );
DebugStream& operator<<( char );
DebugStream& operator<<( unsigned char );
DebugStream& operator<<( int );
DebugStream& operator<<( unsigned );
DebugStream& operator<<( short );
DebugStream& operator<<( unsigned short );
DebugStream& operator<<( float );
DebugStream& operator<<( double );
DebugStream& operator<<( const string& );
DebugStream& operator<<( const char* );
DebugStream& operator<<( char* );
DebugStream& operator<<( const RefString& );
DebugStream& operator<<( const OStringStream& );
DebugStream& operator<<( DebugStream& ( *f )( DebugStream& ) );
DebugStream& endl();
DebugStream& hex();
DebugStream& dec();

void begin();
void end();
private:
class Impl; //ここ
Impl* mImpl;
};

クラス宣言中のクラス宣言?
これはどういう理由があるのですか
620 :デフォルトの名無しさん2011/11/19(土) 21:23:04.86
pImpleパターンです
621 :デフォルトの名無しさん2011/11/19(土) 21:34:17.71
>>620
ニキビ?
622 :デフォルトの名無しさん2011/11/19(土) 21:56:03.96
>>621
たしかに、方言でニキビパターンとも言いますね
625 :デフォルトの名無しさん2011/11/19(土) 22:36:04.36
悪いが良本しか読まないたちなのでな
630 :デフォルトの名無しさん2011/11/20(日) 00:25:57.10
>>625
無知は恥ですよ^^
627 :デフォルトの名無しさん2011/11/19(土) 23:03:58.27
お前らって例外に持たせる文字列ってコード内に決め打ちする派?しない派?
629 :デフォルトの名無しさん2011/11/19(土) 23:12:22.50
例外用文字列動的に構築してる時にさらに例外起きたら嫌じゃん

起きた事ないけど
632 :デフォルトの名無しさん2011/11/20(日) 00:28:01.48
>>629
固定サイズのバッファならだいじょうぶじゃね?
631 :デフォルトの名無しさん2011/11/20(日) 00:27:00.67
フロイトの無知の知ですね
633 :デフォルトの名無しさん2011/11/20(日) 01:00:00.96
>>631
ますますもって恥ですなあ
634 : ◆QZaw55cn4c 2011/11/20(日) 01:40:17.14
>>631
ソクラテス。「弁明」21B〜をみてね。
でも一種の開き直りにしかみえないのですけれども‥‥‥。
635 :デフォルトの名無しさん2011/11/20(日) 01:42:31.84
釣りだろ。
良書云々は、良書であることは知っているが、読んでいないんだろ
636 :デフォルトの名無しさん2011/11/20(日) 01:48:07.88
ぴんぴんぷるぷる。
まぁ、ちょっと大きめのプログラムを組んでいると
すぐPimpleイディオムに行き着く。
637 :デフォルトの名無しさん2011/11/20(日) 03:28:35.16
初心者ですみません

基底クラスのコンストラクタが 基底クラスからのコンストラクトか
派生クラスから巡ってきたコンストラクトかを

基底クラスのコンストラクタ内で判定することはできますか?
よろしくお願いいたします
639 :デフォルトの名無しさん2011/11/20(日) 04:16:33.63
>>637
基底クラスにフラグ変数を用意して派生クラス毎に初期化リストで代入する値を変えるとか
でもコンストラクタが終了しないとメンバ変数は使用不能なんだよなあ
641 :デフォルトの名無しさん2011/11/20(日) 04:33:08.07
だな
コンストラクタの引数にデフォルト引数として書いて置けばいける
642 :デフォルトの名無しさん2011/11/20(日) 04:37:23.71
でもなんでそれが必要なんだろう。
ほかの解決方法があるような気がする
645 :デフォルトの名無しさん2011/11/20(日) 06:38:34.49
typoだったとして、後者は一時オブジェクトだから
前者はconstはがしなのかなぁ
646 :デフォルトの名無しさん2011/11/20(日) 06:50:01.01
>後者は一時オブジェクトだから
それだ!
そうか…、確かに…。

言葉足らずで申し訳ない。
先に後者のコードで書いて動かしてみたところ、ハンドルされてない例外で停止して、分割していった結果が前者でした。
647 :6462011/11/20(日) 06:50:33.47
申し訳ない。
感謝の言葉を忘れてました。

ありがとうございます。
648 :デフォルトの名無しさん2011/11/20(日) 07:03:57.86
別にtypoじゃなかったねごめん。
>>647わざわざどうもです。

できれば脱Cスタイルキャストを。
649 :646=6472011/11/20(日) 07:25:54.46
>できれば脱Cスタイルキャストを。
指摘を受けてぐぐるして、
c++スタイルのキャストというのを初めて見ました。
ありがとうございます。
650 :デフォルトの名無しさん2011/11/20(日) 13:07:27.34
VS2010でフォームアプリケーションを作ったのですが他のバージョンのVS環境でも動くのでしょうか?
よろしくお願いします。
652 :デフォルトの名無しさん2011/11/20(日) 17:02:46.26
>>650
対応するランタイムライブラリ(msvcrt.dll系)が入ってない環境では動かないときもある
651 :デフォルトの名無しさん2011/11/20(日) 13:49:12.85
マンキツでテストしたら起動しなかったことがある
655 :デフォルトの名無しさん2011/11/20(日) 18:00:02.29
>>651-654
想定ではVS2005を考えていたのですがどうやら怪しそうですね。。
とりあえず一度駄目もとで実行さしてみようと思います。
回答頂きありがとうございました!
656 :6532011/11/20(日) 18:29:10.76
>>655
ちなみに実行ファイルをほかのマシンで動かすことについての話なら
世の中の一般ユーザはVSなんて入れてないけど、VSで作られたアプリが動作していることを考えれば答えは出る
唯一つ注意するのは、リリースビルドにすること。
653 :デフォルトの名無しさん2011/11/20(日) 17:19:01.07
ソリューションファイルの形式が違うって怒られると思うよ
将来、新しいバージョンが出たときのことを考えているのなら、それは大丈夫
658 :デフォルトの名無しさん2011/11/20(日) 21:57:05.56
コピコン
659 :6572011/11/20(日) 22:00:47.11
いま、ふと思いついた方法は、全ての派生クラスを継承しているクラスを作成して、そこへダウンキャストな複製をした後に、そのポインタを、
…、
とか考えましたが、スマートではないですね。
そのクラスを作るという行為も異常ですね。
660 :デフォルトの名無しさん2011/11/20(日) 22:03:07.26
struct base {
virtual base * clone(void) const = 0;
};

struct derived : base {
derived * clone(void) const { return new derived(*this); }
};


661 :6572011/11/20(日) 22:15:31.04
>>658,>>660
おぉ…、ありがとうございます。
662 :デフォルトの名無しさん2011/11/21(月) 00:29:13.13
回答がついてるから重箱の隅つつきしかできないんだけど
×Derrived
○Derived
663 :6572011/11/21(月) 08:33:43.17
>>662
おぉ!?、ありがとうございます。
どっかのサイトで見て、過去過去分詞はrふたつなのかぁ、ふーん、って思ってた。情けない。
664 :6572011/11/21(月) 08:46:22.71
>virtual base * clone(void) const = 0;
↑は、どういう意味です?
virtual base * clone(void) const { return new base(*this); };
のようにはしないのですか?
666 :デフォルトの名無しさん2011/11/21(月) 09:56:04.74
int i1;
int* pi1;
int* pi2;
pi2 = &(*(pi1));
これって、pi1とpi2とで、指しているインスタンス違います?同じです?
Int()というのについて、リファレンス読むと答えわかります?
667 :デフォルトの名無しさん2011/11/21(月) 10:17:43.09
>>666
そもそもpi1が何も指していない状態でデリファレンスしているので鼻から悪魔。
669 :デフォルトの名無しさん2011/11/21(月) 11:36:36.38
#include <iostream>
#include <map>
#include <string>

int main() {
 class StringLap
 {
 public:
  std::string hoge;
 };
 std::map<int, StringLap*> foo1;
}
上記をeclipseで行うと、コンパイルが通りません。どうしてでしょうか?
Visual C++だと通ります。
よろしくお願いします。

error: `main()::StringLap*' uses local type `main()::StringLap'
error: trying to instantiate `template<class _T1, class _T2> struct std::pair'
error: template argument 4 is invalid
error: invalid type in declaration before ';' token
670 :デフォルトの名無しさん2011/11/21(月) 12:14:54.52
>>669
eclipseでなくgcc(mingw-gcc?)のバージョンかコンパイルオプションのせい。
C++98/03ではローカルクラス(及びその合成型)はテンプレートの実引数にできない。
671 :デフォルトの名無しさん2011/11/21(月) 12:32:06.45
669です。
>>670
ありがとうございます。理解できました。
672 :デフォルトの名無しさん2011/11/21(月) 15:04:36.57
寿命の順番を保つのに
struct deleter { shared_ptr<x> p; void operator () (y * q) { delete q; } };
shared_ptr<x> p(new x);
shared_ptr<y> q(new y, deleter(p));
こういうこと普通にやりますかね?
もっと直接的に明確に寿命の順番を決めれるイディオムとかってありますか?
675 :デフォルトの名無しさん2011/11/21(月) 16:07:44.80
>>672
書いた順とは逆順にデストラクタが呼ばれるから、そんな無意味なことはする必要がない
673 :デフォルトの名無しさん2011/11/21(月) 15:12:31.98
c++の内部クラスって、Javaと違って外側のクラスのフィールドに直接アクセスできないみたいなんですけど、
何か一言書くと出来るようになるおまじないとか無いのですか?

欲しかったら、内部クラスのインスタンスを生成する際に、外側のクラスのポインタを渡して参照させないとダメですか?
676 :デフォルトの名無しさん2011/11/21(月) 16:29:50.18
ttp://fenrir.naruoka.org/archives/000421.html
↑のページに書いてある、
SubClass(const SubClass &sub) : BaseClass(sub){}
という一文ですが、
これは、継承元のクラスのコピーコンストラクタを利用して(: BaseClass(sub))、その後、このクラスで追加したコピー作業は特に無い({})
という意味ですか?
とすると、この一文がなかった場合、コピーコンストラクタは継承されないということですか?
コンストラクタは強制的に継承されるのに、コピーコンストラクタは継承されない?
↑強制的に継承されるコンストラクタは、デフォルトコンストラクタしか無い場合?(ttp://www.geocities.jp/ky_webid/cpp/language/008.html)

まとめられなくなってきた。
677 :デフォルトの名無しさん2011/11/21(月) 16:44:16.45
その一文がないと暗黙のコピーコンストラクタが生成される
678 :デフォルトの名無しさん2011/11/21(月) 16:48:38.62
それから、コピーコンストラクタを定義する場合は代入演算子も併せて定義すること。
詳しくはEffectiveC++を読むといいです。持ってないなら今すぐ買う。
参考 http://www002.upp.so-net.ne.jp/ys_oota/effec/chapter3.htm

しばらくはわからないことだろうけど、目次の各条項だけでも覚えておくとそのうち理解できるようになる。
679 :デフォルトの名無しさん2011/11/21(月) 16:49:30.57
その一文があると(継承元以外)何もしないコピーコンストラクタが生成される。
680 :デフォルトの名無しさん2011/11/21(月) 17:23:01.16
>>677,>>678,>>679
みなさん、ありがとうございます。

EffectiveC++は第二版と第三版とどっちがよいですか?
第三版は、意味が逆に取られそうな箇所があると○mazonのレビューに書いてありました。
最新の第三版を買えば、改修されているのでしょうか?
第三版は10年以上前なのであまり良くないのでしょうか?

ところで、コンストラクタについて、もうひとつ教えてください。
いま手元で継承先のインスタンスを作った際にどのようにコンストラクタが呼ばれるか実行して動作を確認してみているのですが、
継承先のコンストラクタを記述する際に、
継承元に引数なしのコンストラクタがある場合は、デフォルトでこのコンストラクタが呼ばれ、
継承元に引数なしのコンストラクタがない場合は、明示的にどのコンストラクタを利用するか指定しないとコンパイルエラーになる、
のですが、これは仕様ですか?特に前者。
いいとか、いやとかではなくて、そのように覚えてしまってよいのかな?と。
681 :デフォルトの名無しさん2011/11/21(月) 17:23:44.78
×第三版は10年以上前なのであまり良くないのでしょうか?
○第二版は10年以上前なのであまり良くないのでしょうか?
682 :デフォルトの名無しさん2011/11/21(月) 17:58:41.72
翻訳第三版と、原書か翻訳第二版を買えば対照できるので問題なかろう。
683 :6802011/11/21(月) 18:09:23.06
>翻訳第三版と、原書か翻訳第二版を買えば対照できるので問題なかろう。
了解した。

派生クラスで、コピーコンストラクタのオーバーライドを強要することは出来ます?
デストラクタのようにvirtualかなと思ったら、別の意味でした。
685 :デフォルトの名無しさん2011/11/21(月) 19:27:09.15
C++初心者です。
struct Hoge {int foo,bar,baz}; という構造体があるとして、
これをstd::mapの値として使うには、どのように書けば良いでしょうか。 キーはとりあえずintとします。

std::map<int,Hoge> m;
……まではコンパイルが通るのですが、どうやって要素を追加すればいいのかが分かりません。

Hogeを配列にして、そのインデックスをmapに突っ込むという方法も考えましたが、
すごく無駄なことしているような気がします(´・ω・`)
687 :デフォルトの名無しさん2011/11/21(月) 19:51:07.17
688 :デフォルトの名無しさん2011/11/21(月) 19:52:07.47
>>685
map<int, Hoge> m;
for(int i=0; i<10; i++) {
Hoge h = { 100+i, 200+i, 300+i };
//m[i] = h;
//m.insert(make_pair(i, h));
//m.insert(pair<int, Hoge>(i, h));
//m.insert(map<int, Hoge>::value_type(i, h));
}
689 :デフォルトの名無しさん2011/11/21(月) 19:55:51.06
>>685
struct Hoge {
int foo, bar, baz;
};

int main()
{
std::map<int, Hoge> mih;
const int N = 10;

for (int i(0); i < N; i++) {
Hoge h;
h.foo = std::rand();
h.bar = std::rand();
h.baz = std::rand();
mih[i] = h;
}

for (std::map<int, Hoge>::const_iterator pos = mih.begin(); pos != mih.end(); ++pos)
std::cout << "mih[" << pos->first << "] = (" << pos->second.foo << ", " << pos->second.bar << ", " << pos->second.baz << ')' << std::endl;
}
690 :6852011/11/21(月) 20:37:52.73
ありがとうございます!

>>686
初期値を指定しないなら、それが一番簡単そうですね。
コンストラクタを用意すれば初期化も出来そうですが、そうなると初期化子が使えなくなるという。

>>687
そこは読んでいたのですが、構造体を突っ込む方法が分かりませんでした(´・ω・`)

>688-689
初期化子や、構造体に代入する別の関数(SetHoge()的なもの)を流用しようと考えると、
素直にforで回すのが良さそうですね。
691 :デフォルトの名無しさん2011/11/21(月) 21:44:42.36
>>690
次はconstなmapをどうやって初期化するかで悩むね
686 :デフォルトの名無しさん2011/11/21(月) 19:46:55.52
m.insert(std::pair<int, Hoge>(123, Hoge()));
695 :デフォルトの名無しさん2011/11/22(火) 19:36:10.26
C0000005 は多分ぬるぽ系のアクセス違反
Titleが持ってるShaderがデストラクタで全部解放する作りになってる

void Parent::Update() {
 Child* next = m_child->Update(this);
 if (next != m_child){
  SAFE_DELETE(m_child); <-- シーンが変わって delete m_child

class Title : public Child {
 ::myDirectX::Shader shader; <-- Title をdeleteしたらデストラクタが呼ばれる

Shader::~Shader(void) {
 RELEASE(m_pd3dDevice);
 m_dxDevice->Destruct(); <-- 関数呼んでる

void DXDevice::Destruct() {
 if (--m_ref_count <= 0) {
  SAFE_DELETE(m_instance); <-- m_instance は delete される

DXDevice* DXDevice::getInstance() {
 if (m_instance) {
 } else {
  MessageBox( 0, _T("DXDeviceクラスの初期化をされる前に呼び出しがありました"), NULL, MB_OK);
  PostQuitMessage(EXIT_FAILURE);
  return 0; <--- NULL 返してる、これを使ってアクセスしてぬるぽ?
696 :デフォルトの名無しさん2011/11/22(火) 19:41:25.93
>>695
読むの早いなあ
697 :デフォルトの名無しさん2011/11/22(火) 20:29:37.33
>>695
SUGEEEE!
270行目をコメントアウトすることで、無事通りました!
Shader::~Shader(void)
{
  //RELEASE(m_pd3dDevice);
  m_dxDevice->Destruct();
}

この行をShaderクラスが行ってしまうことによって、
まだ使うはずのDXDeviceクラスのm_pd3dDeviceが解放されてしまい(NULLポインタになってしまい)、
277行目から飛んだ562行目でNULLポインタ参照、
または、281行目でNULLポインタ参照がおきてしまっていたのが原因でした。

2,3日ここでつまっていたので、本当に助かりました!ありがとうございました!
698 :6972011/11/22(火) 20:32:28.78
>C0000005 は多分ぬるぽ系のアクセス違反
あ、あと、これは知りませんでした。
勉強になりました!ありがとうございました!
700 :デフォルトの名無しさん2011/11/22(火) 22:01:17.77
Base* pBase;
pBase = new Derrived(); // Baseは、Derrivedの継承元
delete pBase;
ってやったらまずいんですか?
(ttp://d.hatena.ne.jp/tt_clown/20091105/1257399660)
そしたら、多様化つかった場合にメモリリークを回避することができなくないですか?
よろしくお願いします。

マイクロソフト ワイヤレス ブルートラック マウス Arc Touch Mouse RVF-00006
マイクロソフト ワイヤレス ブルートラック マウス Arc Touch Mouse RVF-00006