[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 06/03 14:41 / Filesize : 156 KB / Number-of Response : 646
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 02:25:58 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.66【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1243440528/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か   に置換しておくことをお勧めします。

2 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 02:37:28 ]
janeの隠し機能

1.書き込みウィンドウを出し半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック


3 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 09:24:23 ]
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

4 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 09:30:12 ]
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

5 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 09:31:19 ]
ERROR!
ERROR:長すぎる行があります!

6 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 09:32:45 ]
ERROR!
ERROR:>>1-5>>7-1000はゴミです!!

7 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 11:01:08 ]
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

8 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 11:15:12 ]
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

9 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 17:56:12 ]
前スレの933ですがプログラムの問題ではなくscimの問題だったみたいで解決しました

10 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 21:51:16 ]
std::mapとtr1::unordered_mapって
速さ:std < tr1
メモリ節約:tr1 < std
でおk?



11 名前:デフォルトの名無しさん [2009/07/19(日) 22:08:40 ]
>>10
あー、一般論としてはそんな感じになると思う

12 名前:デフォルトの名無しさん [2009/07/20(月) 23:31:44 ]
class CardSet {
public:
CardSet() {make();};
//CardSet() {};
void make() {};
};
class Player {
public:
Player(){};
~Player();
};
class SubPlayer : public Player {
public:
CardSet a;
SubPlayer() {};
};
main(){
Player * a = new SubPlayer();
}
このプログラムをg++ 3.4.3 32bit Linuxでコンパイルすると、
In function `SubPlayer::SubPlayer()':
undefined reference to `Player::~Player()'
というエラーになります。しかし、CardSetのコンストラクタを
コメントアウトしている方に切り替えると、エラーなくコンパイルできます。
~Player()を定義すれば済む話ですが、なぜこのような違いが起こるのでしょうか?

13 名前:デフォルトの名無しさん [2009/07/20(月) 23:45:15 ]
固定小数点同士の乗算がしたいのですが
掛けたらオーバーフローになってしまうのでどうしたらいいのかわかりません

今は片方を普通の小数にしてやっちゃってますが意味がない気がするし
整数と小数をわけて乗算するしかないのでしょうか
それだとあまり意味がないのでしょうか

14 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 00:18:46 ]
>>13
32bit×32bitは64bitになる。これあたりまえの話ね。
だからアセンブリ言語では大抵、整数乗算命令は上半分と下半分を別々に取得することが出来るようになっている。

C言語の枠内では(__asmとかintrinisic関数とか使わない限り)効率的な方法は存在しない。
シフトしながら足し算していこうかな、とか
32bitを16bit+16bitに分割して4回掛け算をやろうかな、程度。

15 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 00:39:21 ]
>>14
もう1つある。最適化を期待するんだ。
int32_t x, y;
int64_t z;
という状況で、VCは最適化ありにすればz = (int64_t)x * y;をimul(32 bit * 32 bitの結果を64 bitで返す)1つにしてくれる。
よそのコンパイラもこれくらいやってくれるだろう。

ところで、>>13は固定小数点数同士を掛けた後、右シフトしていないだけのような気がする。
小数部Nビットの固定小数点数同士を掛けると、小数部が2Nビットの固定小数点数になるから、
小数部Nビットで結果が欲しいなら、Nビット右シフトが必要だぞ。

16 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 01:04:17 ]
>>14-15
そういえばアセンブラとかだと二つのレジスタに入ったりしましたね

シフトは忘れていなかったんですが
掛けた時点で内部では32bitのままなのかなって思ったりしました

vc使ってるんですが64bit整数の型名知らないですが
((int64)a * b)>>16 こんな感じに出来るのでしょうか

17 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 01:13:54 ]
__int64かな。
long longも使えた気がする。

18 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 01:25:52 ]
あ、型名入れてやったら出来ました
ありがとうございました!

19 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 02:42:29 ]
>>12
SubPlayer の生成中に、まず基底クラスである Player の構築が完了する、その後
メンバ変数である CardSet の構築が行われるが、この中の make() から例外が発生した場合、
すでに構築が完了した基底クラスを解体するため Player のデストラクタが呼ばれる。

CardSet のコンストラクタが空であれば、この途中で例外が発生しないことがコンパイラに
わかるので、 SubPlayer のコンストラクタで Player のデストラクタが必要になるフローがなくなる。

20 名前:デフォルトの名無しさん [2009/07/21(火) 20:03:05 ]
>>19
ありがとうございます。
そのような理由があったのですね。すっきりしました。



21 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 21:12:24 ]
質問があります
完全に今から始める初心者なんですが、USB機器の例えばゲームパッド等からの入力を
例えば1のボタンを押したらキーボードのAに対応させるみたいに外部機器をキーボードの代わりにする
みたいなことをしたいんですけどこういったのがこう言うのを作るのは難しいですか?
それとこう言う物を作れるようになるための勉強の方法って猫でも分かる〜や、ゲームの作り方関係の本でも大丈夫でしょうか

22 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 21:45:10 ]
>>21
OS上の動作全般に渡ってキーボード代わりとして使いたいのなら、
デバイスドライバを作成する必要がある。
Windowsの場合は、WDKでググれ。ただしほぼ断言していいが、初心者には無理。

自分のアプリだけでそうしたいのなら、ゲームパッドの入力ができればあとは簡単でしょ。

23 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 21:54:44 ]
>>22
自分のアプリだけでって言うのは例えば自分の作ったゲーム内でのみ対応できる 見たいな感じでしょうか?
普通のキーボードじゃなくて別のものをキーボードにしたいんですよ
となるとデバイスドライバ云々って言う難しいほうになるのかな
そう言うのを作るにはどういった勉強したらいいか何か教本的な物ってありますか?

24 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 22:03:05 ]
DirectInputとか

25 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 22:36:52 ]
>>23
> 自分のアプリだけでって言うのは例えば自分の作ったゲーム内でのみ対応できる 見たいな感じでしょうか?
そのとおり。それでいいのなら別に難しいことではない。
キーボードだろうがキーボードじゃないものだろうが、そこはあまり関係ない。

26 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 22:37:31 ]
SendKeysとか

27 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 01:39:03 ]
>>23
それはつまり
>九九が分からないんですけど大学入試数学のいい参考書はありますか?
みたいなことを言ってるってことをとりあえず理解してね。
その上で九九から始める覚悟があるなら、
とりあえず「C言語の入門書」でも探してみればいいんじゃないかな

28 名前:デフォルトの名無しさん [2009/07/22(水) 14:20:26 ]
catchされない例外が投げられるときはデストラクタが呼ばれない
なんてことありますか?

29 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 14:21:33 ]
>>28 はい。

30 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 14:23:25 ]
例外の細かい動作がいまだにわからない俺クリムゾンヴァイパー



31 名前:デフォルトの名無しさん [2009/07/22(水) 14:23:43 ]
そうか・・・
確実に呼ばせるにはmainでcatch(...)するしかない?


32 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 14:26:08 ]
>>31 はい。

33 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 14:26:42 ]
exitとかabortとかすると呼ばれないと思うから確実には無理じゃないか

34 名前:デフォルトの名無しさん [2009/07/22(水) 14:34:36 ]
>>33
さすがにそれは保証外で
>>29
なんかソースあったら教えて下さい
デストラクタは例外投げられたときも呼ばれるという話ばかり見てきた気がする

35 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 14:36:45 ]
new Object;
throw -1;

36 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 14:41:45 ]
ml.tietew.jp/cppll/cppll/thread_articles/12819

37 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 14:46:42 ]
処理系依存かー

38 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 16:37:58 ]
ある初期化されたリファレンスがあったとして、ほかのインスタンスの参照を代入することはできないんでしょうか?

int a(0), b(1);
int& r(a);

r=b; // aにbを代入ではなく、rにbの参照を渡したい

39 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 16:57:03 ]
>>38
無理

40 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 17:00:14 ]
次スレからはメール禁止をテンプレに入れとけよ



41 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 17:02:49 ]
それこそ金払ってやってもらえよ
専属の教師じゃねーんだぞ

42 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 21:01:15 ]
factory methodってtemplateクラスに使う意味ってある?

43 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 22:14:37 ]
Factoryの利点の一つはインプリメントとインタフェースを分離することだから
templateでもその利点はあると思う。

44 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 15:47:36 ]
cに限った話じゃないんだけどLinkedListってなんで線形リストって言うの?
連結リストでしょ?

45 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 15:54:57 ]
Wikipediaによれば、線形リストは連結リストの分類のひとつらしいよ
両端を連結した循環リストは、線形リストでないっぽい

46 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 15:58:59 ]
リストを管理してる先頭からしかたどれないのが線形リスト
これに一方向だけでなく戻りもOKにしたのが双方向リスト
ループするのが循環リスト

これらの総称が連結リストでいいんでないの?

47 名前:デフォルトの名無しさん [2009/07/23(木) 18:44:55 ]
visual studio を使っているのですが、
一定間隔で処理する方法で困っています。
無限ループを作ってtimeGetTime()を使って時間待ちをして行っていますが、
GUIからのボタン操作を受け付けることができなくなってしまいました。

GUIのボタンを押して無限ループから抜けるためにはどうすればよいでしょうか?
よろしくお願いします。

もしくは、もっとよい方法がありますか?




48 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 18:47:16 ]
無限ループを作らず、タイマを使え

49 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 18:50:17 ]
>>47
PeekMessage+GetMessage

50 名前:47 [2009/07/23(木) 19:24:04 ]
アドバイスありがとうございます。
>>48
タイマを使ってみたのですけど、
たとえば50ms周期で処理しようとすると60ms近辺が周期になって
しかも、40msとか70msとかばらつきも大きくてこれは使えないなぁと。
タイマの精度は1msだとwebで見たことありますが実際どうなんでしょう?

>>49
GetMessageを使えないかと思って、WINAPI関数の中の
GetMessageのところでブレークポイント設定したのですけど
ブレークできなくて、なぜなのかよく分かりませんでした。
ブレークできないなんてことあるんでしょうか?

while (GetMessage(&msg, NULL, 0, 0)) {
→ TranslateMessage(&msg);
DispatchMessage(&msg);
}
上の→のところでブレークしようとしたのですが・・・。
47の内容とは直接関係ないですけど、なぜなのだろうと思いまして。











51 名前:デフォルトの名無しさん [2009/07/23(木) 19:29:08 ]
二分木プログラムの問題で、二分木の高さと大きさを求める以外で、出そうな問題ってありますか?

52 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 19:36:14 ]
>>51
ソート、検索、削除方法

53 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 20:31:38 ]
>>51
作成方法、木同士のマージ

54 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 20:35:50 ]
>>51
平衡化

55 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 00:36:23 ]
別スレッド作ればいいなじゃないの

56 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 00:43:55 ]
>>51
平衡木なら回転は普通に出るだろ

57 名前:47 [2009/07/24(金) 11:50:59 ]
無限ループの中でPeekMessageを使って
GUIのボタン処理を受け取ろうと思ってやってみましたが、
GUIが固まってしまってボタンを押すことができませんでした。
どうすればよいでしょうか?

58 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 11:52:28 ]
具体的なコードを

59 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 11:56:12 ]
というか具体的な目的を

60 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 12:00:07 ]
・処理スレッドを作成して、そこでループをぶん回す
・メッセージループでPeekMessageを使って、メッセージがない時に処理を実行して、適度に眠らせる

のどちらか




61 名前:47 [2009/07/24(金) 12:05:37 ]
>>58 ソースを載せてみます。
BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
switch( msg ){
case WM_COMMAND: // ダイアログボックス内の何かが選択されたとき
switch( LOWORD( wp ) ){
case IDOK: // 「OK」ボタンが選択された
g_hDlg2 = CreateDialog( g_hInst2, _T("IDD_DIALOG2"), hDlg, DlgProc2 );
ShowWindow( g_hDlg2, SW_SHOW );
loop_flg = 1;
while(loop_flg){
if (PeekMessage (&msg_roop,g_hDlg2,0,0,PM_NOREMOVE)) {
  ret =GetMessage (&msg_roop,g_hDlg2,0,0);
  if(msg_roop.message == WM_COMMAND ){
if(msg_roop.wParam ==IDCANCEL) {
TranslateMessage(&msg_roop);
DispatchMessage(&msg_roop);
}}}
counter++;
}
case IDCANCEL: // 「キャンセル」ボタンが選択された
EndDialog( hDlg, 0 );
break;
}}}


62 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 12:06:51 ]
ボタン宛のメッセージも回してやらないとボタン自身がマウスクリックを処理できない

63 名前:47 [2009/07/24(金) 12:16:15 ]
続き
BOOL CALLBACK DlgProc2(HWND hDlg2, UINT msg, WPARAM wp, LPARAM lp)
{
switch( msg ){
case WM_COMMAND: // ダイアログボックス内の何かが選択されたとき
switch( LOWORD( wp ) ){
case IDCANCEL: // 「キャンセル」ボタンが選択された
// ダイアログボックスを消す
loop_flg = 0;
EndDialog( hDlg2, 0 );
fclose(fp);
break;
}}}

64 名前:47 [2009/07/24(金) 12:23:55 ]
>>62
ありがとうございます。
具体的にはどうすればよいのでしょう?

65 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 12:26:59 ]
>>60
・メッセージループでPeekMessageを使って、メッセージがない時に処理を実行して、適度に眠らせる
の亜種

MegWaitForMultipleObjectsEx で シグナルにならないダミーのハンドルを引数に渡す
# array が NULL で 個数0 の場合意図した動き(timeout付き GetMessage もどき)になるんだっけ?

66 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 12:27:55 ]
PeekMessageやGetMessageで取得するウィンドウをg_hDlg2だけにしたり、
TranslateMessageやDispatchMessageするメッセージをWM_COMMAND/IDCANCELだけにするのをやめればよい

67 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 12:28:03 ]
× MegWaitForMultipleObjectsEx
○ MsgWaitForMultipleObjectsEx

68 名前:47 [2009/07/24(金) 18:23:51 ]
>>66さんの言うようにやったら
きちんと動作するようになりました。ありがとうございます。
どうして条件を指定すると動かなくなるのでしょう?

69 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 18:33:36 ]
>>62

70 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 18:59:22 ]
>>68
ウィンドウズのメッセージキューはスレッドに結びついてるんだ。
ある1つのスレッドが作ったウィンドウのメッセージは皆同じメッセージキューに入るんだ。
だからそのスレッドがほんの一部だけのメッセージしか処理しない状態だと、
その処理するメッセージ以外のGUI動作をしなくなる。

てのはC/C++でのウィンドウズプログラミングの基本なんだ。
猫でも〜辺りを一通りやった方がいい。



71 名前:hey mailto:yo [2009/07/24(金) 19:03:31 ]
nigga!

72 名前:47 [2009/07/24(金) 21:17:11 ]
>>70
キューの中にあるなら取り出さないとたまるばかりだということですか。
猫でものプログラムをvisual studio 2008 expressでコンパイルしようとしたら
よく分からないエラーが出て、挫折しました。
今は下のをやってますが、GUIを作るのに他のソフトを使いながらなので面倒です。
ttp://www.geocities.jp/ky_webid/win32c/index.html

73 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 22:51:35 ]
猫でもは内容がかなり古いしな

74 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 23:00:02 ]
質問があります、C/C++ と C++/CLIって全く別物なんでしょうか?

75 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 23:41:06 ]
>>74
CLI やマネージドメモリ周りは独特だけど、それ以外は普通の C++。
この記事を見ると感触が掴みやすいかも。

C++/CLIによるCライブラリの.NET化
codezine.jp/article/detail/1382?p=1

C/C++ の学習用途としては、あまりお勧めできない。

76 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 23:44:34 ]
>>75
学習用途としては向かないんですね
ありがとうございました

77 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 11:23:14 ]
>>72 expressでGUIをするなら、GUIフレームワークのライブラリを使うのもひとつの方法かな。
この版に単独スレのあるGUIフレームワークは、Qt、wxWidgets、WideStudioかな。


78 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 11:33:55 ]
RADじゃないGUIフレームワークってデザインしにくくない?

79 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 11:42:20 ]
>>78 >>77のフレームワークにはRADツールは存在している。
フレームワークにはレイアウトを管理するクラスがあるからRADツール使わなくても慣れると簡単。
逆に画面デザイナを使うのが面倒になる。


80 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 12:24:03 ]
初期化子つきの関数ポインタの定義の構文がわかりにくい
なんでこんな構文にしたんだろう。



81 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 12:25:21 ]
>>80
たとえば?

82 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 12:44:09 ]
foo(*(*bar)(baz, hoge))(fuga)(piyo);

とかぱっと見ようわからん
typedefなしでもきれいに書ける仕様にすればよかったのに

83 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:30:29 ]
括弧の数からしておかしいじゃねーか

84 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:32:17 ]
どゆこと

85 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:44:58 ]
うろ覚えで適当に書いたんだと思われ
でもそんなに複雑かね

int foo(int x, int y, int z) {
return x + y + z;
}
int (*p)(int, int, int) = foo;

こんだけだが

86 名前:デフォルトの名無しさん [2009/07/25(土) 14:48:21 ]
もっと初心者にもわかりやすくしてください

87 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:49:22 ]
int(*)(int, int, int) p = foo;

これなら型が前に全部来てるからわかりやすいな

この間もこっちで同じような感じのがあった

C言語なら俺に聞け(入門篇) Part 50
pc12.2ch.net/test/read.cgi/tech/1246342847/

最初の疑問はこれで
pc12.2ch.net/test/read.cgi/tech/1246342847/895

いろいろあったけど結論というかこうだとよかったねというので
pc12.2ch.net/test/read.cgi/tech/1246342847/903

88 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:52:14 ]
結局のところ宣言のところでカンマで区切ればint型だろうがint型のポインタだろうが書いて行ける仕様ゆえ
型の一部が分離しちゃうんだよね


89 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:57:25 ]
中側から解読していくのが定石だな

90 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:08:24 ]
>>86
foo(*(*bar)(baz, hoge))(fuga)(piyo);
baz型、hoge型の2引数をとり、(fuga型を引数をとり、foo型を返す関数ポインタ型)を返す関数ポインタ型の変数barを定義して同じ型のpiyoで初期化する
わかりにくいな

foo(fuga)(baz, hoge) bar = piyo;
とか書ければ楽なんだけど・・・なんでこんな複雑な構文にしたのかわからん



91 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:27:45 ]
個人的にいらない仕様というかなんでわざわざアセンブラとかからステップアップした
はずの言語でこんななの?と思ったのが? :の式

92 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:33:06 ]
const double a = (b < 0) ? 0: b;
?:を使わずに書いてください。

93 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:37:21 ]
>>90
boost::function を使うと簡単になるよ。
#include <boost/function.hpp>

using boost::function;

class foo{};
class baz{};
class hoge{};
class fuga{};

foo piyopiyo(fuga a)
{
return foo();
}

function<foo(fuga)> piyo(baz a,hoge b)
{
return &piyopiyo;
}


int _tmain(int argc, _TCHAR* argv[])
{
function<function<foo(fuga)>(baz,hoge)> bar=&piyo;

function<foo(fuga)> k=bar(baz(),hoge());
k(fuga());

return 0;
}


94 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:38:15 ]
const double a = std::max(0,b);

95 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:39:23 ]
うむw
C/C++が混在してるなw

96 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:42:07 ]
C/C++は1だし。

97 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 19:17:37 ]
NaNかもしれないぞ

98 名前:デフォルトの名無しさん [2009/07/25(土) 19:41:55 ]
名前空間に定義されているクラスを他のクラスで使用するときに
どうすればいいか教えてください。

(ヘッダファイル内)
class String;

class A {
  //...
private:
    String* m_Name;
}

Aというクラスがあり、メンバーとしてString*を持たせるときは、上記のように
class String;と書けばコンパイルが通ります。
もし、Stringが名前空間MyLibの中で定義されているときは、どのようにすればいいのでしょうか。
#include "String.h"
とヘッダをインクルードするしかないのでしょうか。

99 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 19:45:52 ]
namespace MyLib {
class String;
}

100 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 19:47:12 ]
class A {
  //...
private:
    MyLib::String* m_Name;
}



101 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 19:51:40 ]
実装のほうでtypedef

102 名前:98 [2009/07/25(土) 20:51:57 ]
>>99,100,101
ありがとうございます。
コンパイルが通りました。

103 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 21:57:53 ]
【科学】道路に軍手が落ちているワケ、名城大研究チームが突き止める[09/07/24]

namidame.2ch.net/test/read.cgi/hidari/1225537555/


104 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 02:48:52 ]
C++でpptを読み込みを行いたいです
スライドを画像にして読み込むにはVBAと連携させるしかないんでしょうか?

105 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 03:01:31 ]
このへんから探せ
www.google.co.jp/search?q=ppt+c%2B%2B+com

106 名前:104 mailto:sage [2009/07/26(日) 17:00:08 ]
ありがとうございます
今検索結果と同じようにVBAと連携させています。
pptのスライド画像はpowerpoint起動時に組み立てているようなので
やはりVBAと連携が必須でしょうか?

後office2003,2007どちかが入っていれば動作するという動きにできるのでしょうか?

107 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 17:10:31 ]
pptって仕様公開されてなかったっけ

108 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 17:48:42 ]
#include <stdio.h>
#include <windows.h>

int main(void)
{
 FILE *fp;
 char str[128];

 fp = fopen("data.txt","r");
 if (fp == NULL)
 {
  printf("data.txtが読み込めませんでした");
  exit(1);
 }
 fclose(fp);

 fscanf(fp, "%s", str);
 printf("%s\n", str);

 return 0;
}

このように記述したのですがdata.txtの中身を正常に読み取れず、文字化けして出力されます。
data.txtの中身に何が書かれていようが、どうやら同じ意味不明な文字列が表示されるようです。
原因が掴めないのですが、どなたかご教示ください。

109 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 17:55:06 ]
>>108
そのままだとファイルを正常にオープンできたとしてもすぐに閉じちゃってるよ


110 名前:109 mailto:sage [2009/07/26(日) 17:55:48 ]

#include <stdio.h>
#include <windows.h>

int main(void)
{
 FILE *fp;
 char str[128];

 fp = fopen("data.txt","r");
 if (fp == NULL)
 {
  printf("data.txtが読み込めませんでした");
  exit(1);
 }

 fscanf(fp, "%s", str);
 fclose(fp);

 printf("%s\n", str);

 return 0;
}




111 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 18:13:58 ]
なるほど…
fopenした直後にfclose書いた方が忘れずに済むと思ったのですが、それではまずかったようですね…
正常に動作させることができました。
どうもありがとうございました。

112 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 20:36:13 ]
ちゃんとマニュアルを読めよ・・・

113 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 20:50:58 ]
>fopenした直後にfclose書いた方が忘れずに済む

おもしろい。
最初から開かなければ、絶対に忘れずに済むんだけど
そこまでは行かなかったのね。

で、一応まともなアドバイスだけど
fscanf(に限らずscanf系全て)は、必ず戻り値を確認するようにすべきだぞ。
そうしないと、入力が正常じゃなかった時にゴミが入っている。>>108のように。

114 名前:104 mailto:sage [2009/07/26(日) 22:21:29 ]
>>107
公開はされているようですがスライドを画像にすることはできないかと・・・


officeどちらかがインストールされていれば動くようにはできないのでしょうか?

115 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 22:28:22 ]
公開されてるのなら、その仕様に沿って自分でスライドをビットマップ上に描画すればいいのでは・・・
まぁ手間だろうからあんまりやりたくないんだろうけど。

116 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 22:41:35 ]
だから、VBAで出来ることは全てC++からのOLEオートメーションで出来るっての。
あなたに出来るかどうかは別として。

117 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 22:44:52 ]
VBAでは画像としての取得ができているんだよな。
だったらそれをC++に書き換えるだけ。
#importなりなんなりすれば、VBAで使われるオブジェクトモデル
(メソッド・プロパティ・型名・定数など)はほぼそのままC++でも使用可能。

g++とかのタイプライブラリ読み込みの#importが使えない処理系なら話はもう少し面倒だけど。

118 名前:104 mailto:sage [2009/07/26(日) 22:58:30 ]
ビットマップ描写はちょっと自分では難しそうです
C++から呼び出して出力できるようにはなっています

officeのバージョンが違っても同じように動作してほしかったんです
OLEオートメーションでもう少し調べてみます
ありがとうございました

119 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 23:09:11 ]
ビットマップは簡単だよ
ヘッダ+2次元配列だから



120 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 23:16:58 ]
>>118
画像にするのは簡単だよ。名前を付けて保存をすればいい。
PowerPointではBMPやEMF、あるいはJPEG、PNGなんかで保存できる。
それをVBAやC++で呼び出すだけ。

バージョンを問わず動くようにするには、オブジェクト作成時にバージョン指定せず、
その後も遅延バインドにする。
VBAではObject型、C++ではIDispatchPtr (IDispatch)を使う。2つは同じ。
IDispatchを直接叩くのはやや面倒だろうが、
これくらいなら適当にラップすればなんとかなるだろう。



121 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 05:20:22 ]
&& と || はあるのに、 ^^ がないのはなんで?

122 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 05:31:16 ]
何に使うの?

123 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 06:26:52 ]
XOR条件にしたいのか
そいつは無理だ

知っての通り条件式は短絡評価をしているが
XOR条件を実現するには短絡評価を捨てなければならない

124 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 06:32:19 ]
あ、ちなみにXOR条件は次のようにしてエミュレートできる

i = cond1;
j = cond2;

i ^ j;

この例を見てもわかるようにXOR条件は短絡評価ではなく
両者のブール値を必ず評価しなければならない

125 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 07:44:49 ]
i != j;

126 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 09:47:52 ]
(cond1 && !cond2) || (!cond1 && cond2)

127 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 13:44:55 ]
>>126
それだとcond1が二回評価されてしまうから>124とは違ってしまう。

128 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 14:47:08 ]
!i != !j


129 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 21:56:16 ]
>>120
レスありがとうございます。
わからない単語だらけですがぐぐってがんばります

130 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:13:00 ]
クラスでメンバ変数を定義した場合、どうやってアドレスを取るのでしょうか



131 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:20:28 ]
&de

132 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:34:40 ]
www.vvvvv.net/audio/d_text.html

ここのサンプリングのところに書いてあることは本当ですか?


シャノンの定理では20kHzを再現するのには倍の40kHzのサンプリングで
足りることになっています。 しかし、これが可能なのはごく限られた場合であって、
「20kHzを再現できる」場合もあると理解したほうが自然です。


という記述です

133 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:40:04 ]
そうですね

134 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:48:45 ]
>>132
最大で1/(40000*2)秒ずれうるから、元の音が再現できてるとは言えないって言ってるのかなぁ

135 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:50:41 ]
>>134
単純に倍だとタイミングがあってればいいけど合わない場合は元の音にはならないね
倍より大目のサンプリングが無いと


136 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:51:52 ]
>>132
振幅が一定の永遠に続く20KHzのサイン波なら40kHzのサンプリングで再現できる。
20KHzの信号でも、ひずんでいたり振幅が変わったり変動する場合は20KHz以上の
成分が含まれているから、40KHzのサンプリングでは再現できない。
例えば大まかにでも波形を再現するには3倍以上の周波数成分が欲しいかな。
すると120KHz以上でサンプリングする必要がある。
もっと正確に再現するにはもっと高いサンプリング周波数が必要になる。



137 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 00:49:33 ]
シャノンは「20kHzを再現するには少なくとも40KHzのサンプル数が必要」
と言っているのであって、サンプリングできるなんて一言も言ってない。

138 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 00:53:56 ]
必要条件だが、必要十分条件ではないということ?

139 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 00:58:11 ]
その辺の話はダウンサンプリングとかでも解説されてるよ


140 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 01:00:30 ]
questionbox.jp.msn.com/qa896590.html
この辺とか



141 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 02:06:04 ]
サイン波の最大値と最小値のところでサンプリングできればいいが
0のところでサンプリングしたら無音になっちゃったりするの?

142 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 02:12:10 ]
無音というか変な音が出る可能性もある
だからサンプリングする場合はオーバーサンプリング気味にして丁度いいくらい

143 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 02:13:01 ]
どうあがいてもデジタル化した時点で劣化するってことか

144 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 02:16:37 ]
>>143
そりゃ量子化の段階でカクカクになってるしねw
しかもサンプリングレート次第ではさらに飛び飛びだし

145 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 02:19:09 ]
自分で方眼紙に適当な波形を書いてマスを数えてみればいい

146 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 02:20:21 ]
かくかくもそうだけど一定の周波数の音でさえも、画像で言うところのモアレみたいなのが発生するってことだよね
大変すなぁ

147 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 04:51:47 ]
>>146
大丈夫、大抵の人はそのモアレを聞き取れない。

148 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 10:05:53 ]
>>147
聞き取れないはずの高調波がサンプリングによって
可聴範囲のノイズとして現れることはあるんじゃね?

非常に高い周波数だけど、サンプリング点を繋げるとゆ
るやかなサインカーブ、という嘘データは作れそうだし。

149 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 12:17:52 ]
>>136
まてや。
20kHzの振幅が変動する波は20kHzより高い周波数成分を含んどるやんけ。
サンプリング定理は、その含んでいる最高の周波数成分の2倍でサンプリングしろということじゃ

150 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 13:47:18 ]
>>147
それいっちゃったらカクカクについても聞き取れないから大丈夫ってことになっちゃうし



151 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 14:32:55 ]
class hoge {
public
typedef bool Bool;

public:
Bool fuga();
};

Bool hoge::fuga() {return true;}

これって普通コンパイルできないと思うんですが
なんかできてしまうことがある・・・これはvc++が変だからでしょうかね?
バグなのかな・・・?

152 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 14:40:34 ]
>>151
それでコンパイル通るんだったら根本的に壊れてるんだと思うが?

153 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 14:46:43 ]
上のコードでは通らないんですが下のコードならvc++ee2008で通りました

#include <iostream>

namespace hoge {
    class hoge {
    public:
        typedef bool Bool;

    public:
        Bool foo();
        Bool bar();
    };
}

namespace hoge {
    hoge::Bool hoge::foo() try {return true;} catch(...) {}
    Bool hoge::bar() {return true;} // <- !
}

int main() {
    hoge::hoge h;

    if(h.foo()) std::cout << "foo" << std::endl;
    if(h.bar()) std::cout << "bar" << std::endl;

    return 0;
}

154 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 17:41:30 ]
>>153
そりゃ通るんじゃね。

>>151がなぜ通らないか理解できてますか。


155 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 17:46:26 ]
::hoge::Boolがなぜ見えるのかってこと?
::hoge::hoge::Boolではなくて

156 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 22:02:36 ]
hoge::Bool hoge::foo() try {return true;} catch(...) {}
ちなみにこれをコメントアウトするとコンパイルできなくなります

>>154
Boolはhogeの中限定なのでhoge::Boolにしないと外からは見えないからですよね?

>>155
そうです
hoge::Boolは外からは見ると存在しないはずなのに・・・

157 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 22:41:22 ]
WindowsのGUI関連の質問なんですが、コントロールの描画に手を加えたいときは、オーナドローとサブクラス化の
手段が考えられますが、どちらの方が一般的なのでしょうか。
あるいはどちらの方が負担の軽い処理となるのでしょうか。

158 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 22:45:02 ]
>>157
サブクラス化してオーナードローすればいいんじゃね?

159 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 22:48:57 ]
オーナードローが開かれた〜♪

160 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 23:13:43 ]
>>151
hoge内の他にグローバルでtypedef bool Bool;されてたり



161 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 23:33:10 ]
>>153
こちらでもVC++EE2008で試して、通ることを確認した。
function-try-blockの直後は、まだclass hogeのスコープが残ってしまっている雰囲気だね。
他にも、コンストラクタのfunction-try-blockのcatch内でreturnしてもコンパイルエラーにならないし…。
この辺、VCは何かおかしい。

>>160
それは無かった。

162 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 01:08:44 ]
>>159
きらめく光俺〜を〜うつ♪
か。 ちょっと一瞬判らなかったよ。

163 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 02:21:49 ]
パパラッパパラッパーラー

164 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 15:00:20 ]
ワラタ
ダンバインか

165 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 20:55:09 ]
変数の参照関係(?)で質問です。
waitを呼び出したとき、for文で無限ループになります。
現状自分で確認できたのは次の通りです。
 1.timer_procは1秒毎に呼び出されている(LEDの点灯/消灯コードをいれて確認)
 2.wait内のfor文の前でLED点灯のコードを入れ、LEDが点灯できた
 3.wait内のfor文の後でLED点灯のコードを入れ、LEDが点灯されない
変数の宣言と定義などで何か勘違いしていてtimer値がおかしい結果になってると
思うのですが、どう修正すればいいか教えてください。
ソースはこんな感じです。
----- a.c -----
#include "a.h"

int timer;

/* 1秒に1回割り込みで呼び出される */
void timer_proc(void)
{
 if (timer > 0) timer--;
}

----- a.h -----
extern int timer;

----- b.c -----
#include "a.h"

void wait(void)
{
 for (timer = 10; timer; ) ;
}

166 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 21:01:27 ]
timerにvolatileを付けたらどうだろう。

167 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 21:01:32 ]
>>165
処理系がわからんからエスパーするけど
forのなかのtimerが最適化されて定数に置き換えられてるんじゃないの?
volatileつけてみるとかいうのはどうだろう

168 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 21:59:20 ]
君たちは結婚すればいい

169 名前:165 mailto:sage [2009/07/30(木) 22:27:56 ]
>>166-167
ありがとう、volatileで解決しました。

170 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 14:46:34 ]
継承ってのは大抵public継承にするのが一般的なんですかね



171 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 14:47:21 ]
場合による

172 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 14:51:55 ]
public→ベースにできることは派生で全部できる時に使う
private→実装がほしいだけの時に使う。でも実装がほしい場合は普通メンバ変数として持たせる

173 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 17:09:35 ]
stateパターンの利点がいまいち分からないんですが。

switch(state){
  case STATE_1: state_1(); break;
  case STATE_2: state_2(); break;
}
これが、

switch(state){
  case STATE_1: obj = state_1; break;
  case STATE_2: obj = state_2; break;
}
obj.func();
になるだけでstateパターンを適用することでif~else()かswitchを使った
状態遷移処理は消えなくないですか

174 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 17:21:09 ]
初期化が
obj = state_1;
とかで、後は
obj->func();
を回すだけ
遷移はstate_1の中で
obj = state_2;
とかやる
switchなど不要

175 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 17:24:18 ]
obj->func() の戻りが obj になってりゃ良いんでないの?

obj = state_1; // 初期ステート
obj = obj.func(); // ステート変遷

176 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 17:30:42 ]
各状態が全ての状態のオブジェクトへのポインタを持つってこと?deleteはいつやるの?わかんなくなってきたぞ。。

177 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 17:34:29 ]
遷移するときに
obj = new state_2;
delete this;
とかでもいいし
何も考えず全部グローバルでもいいし
お好きにどうぞ

178 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 18:21:44 ]
各状態を全てシングルトンにして、
初期化で
IState* state = STATE_1::getObj();
ループで
state = state->func();
にしてfunc()内で、
return thisとか
return STATE_2::getObj();
とかしてスッキリになりました状態遷移処理だけでなく状態管理変数も不要になるんですねありがとうございました。


179 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 18:24:47 ]
>>178
あまりその辺を突っ込むとタスクシステム大好きおじさんが来るから気をつけてねw

180 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 15:19:16 ]
明快入門 Visual C++ 2008 ビギナー編って本が分かりやすいけど
知識0の全く最初からVC++の機能をフルに使って勉強してると環境が変わったら何もできなくなりそうで怖い
分かりやすいけど・・・



181 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 15:39:36 ]
windows以外でやらないなら問題ないw >180

182 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 15:44:16 ]
オレ様基準で皆がコンパイルエラー出すようなコード書く前提で威張ってもらっちゃ心外だな

183 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 18:53:36 ]
>>180
VSの機能をフルにつかえてるなら、makeやらをちょろっと書けるレベルよりはるかに上。

184 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 22:00:14 ]
>>181
そりゃそうだけどw
趣味でやるならwindows環境だけでやれるけど、もしも仕事にするなら多分win以外の環境も多いんだろうなあと思ってさ
>>183
本当にフルに使えてるなら結構凄いのか

185 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 22:05:32 ]
Cでアドイン書いて自分で拡張できるわけだから
そりゃ凄いことができると思うよ
やりにくい処理は他の処理系に投げることもできるしね

186 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 22:17:48 ]
知識0の全く最初からフルに使える人なんているとは思わなかった

187 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 13:37:57 ]
Cをすっ飛ばして最初からC++が学べる本ってありますか?

188 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 13:38:41 ]
accelerated C++

189 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 18:07:37 ]
>>188
私に対するレスです・・・よね?
その本はC++から学ぶ事を目的とした本なんですか?

190 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 18:25:22 ]
本関係ないけどC++の成分の7割くらいはCだと思うんだ。
C++"だけ"を学ぶってのは無理じゃないの?
C++とCから一部省いたものを同時に学ぶだけで。



191 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 18:30:33 ]
C++があればまず使わないようなやり方を学ぶ手間は省ける
でCの入門書の場合、その類の事に対する説明の割合が大きい
そういうのをすっとばしてC++流のやり方がてっとり早く学べる本の定番が>>188

192 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 19:03:59 ]
入門書でスマートポインタまで教えてくれる本はなかなかないからね。
Accelerated C++は名著。超高密度。

193 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 19:28:21 ]
メンバ変数の多次元配列をコンストラクタで初期化する場合はfor文で回すしかないですか

194 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 21:29:22 ]
下記質問をboostすれで聞いたら、
---------------
boostのpoolを使いたいのですが。class内のメンバ変数に指定する方法がわかりません。
boost::pool<> p(sizeof(int));
この行を、グローバルやローカル変数にすると問題がないのですが。
class AA
{
boost::pool<> p(sizeof(int));
}
クラス内に入れるとコンパイルエラーになってしまいます。対処方法がないでしょうか
---------------
「C++の基礎からやり直せ 」の回答が来ました。どうも初心者の質問のようでした。
なので、初心者スレでお聞きいたします。よろしければ何かアドバイスをください。
注)代理で書き込みをお願いしているので、返事が遅くなる可能性があります。



195 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 21:35:28 ]
boostの前に、C++のクラスを一つでも作成したことあるの?
クラス定義で初期化はできないよ

196 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 21:53:14 ]
ただし、const staticな整数型は例外。

197 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 22:55:44 ]
>>194
コンストラクタ初期化子でググれ。

198 名前:デフォルトの名無しさん mailto:sage [2009/08/03(月) 00:06:52 ]
>>196 最近それに気付いたんだけど、昔からそうだった?


199 名前:デフォルトの名無しさん mailto:sage [2009/08/03(月) 00:22:30 ]
>>198
VC6ではできなかった。

200 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 20:00:04 ]
unicodeの文字列から漢字かどうかって判別できますか?



201 名前:rational mailto:sage [2009/08/05(水) 22:14:55 ]
>>200 漢字の領域が定義されているからそれで判断すれば

202 名前:デフォルトの名無しさん mailto:sage [2009/08/05(水) 23:56:22 ]
あ、 rational さん。

203 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 00:19:43 ]
>>200
半角文字に変換する関数で変換できなければ漢字として扱えばいいだけ。
この程度を瞬時に思いつかないようなら仕事はない。

204 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 00:29:50 ]
と、派遣を首になった無職がわめいております。GetStringTypeEX。

205 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 00:46:20 ]
オレのマシンでは GetStringTypeEX なんて使えないぞ

206 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 00:58:20 ]
>>203
半角に変換できない文字⊂漢字だが、
半角に変換できない文字=漢字ではない。

207 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 01:00:37 ]
>>205
site.icu-project.org/

>>203みたいなのが地雷を埋め込んでくれるんだなー、と溜息が出た。

208 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 01:10:32 ]
漢字⊂半角に変換できない文字だった

209 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 02:27:23 ]
>>203
そっか。。だからうちの会社仕事減ってきてるんだな。。。
はやいやすいまずいは中国の専売特許だからやりたくないけど不況を乗り切るためには仕方ないのかなぁ

210 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 02:30:35 ]
今のご時世、どこも一緒(´〜`)



211 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 02:38:41 ]
プログラム作るよりパソコン教室とか開いて教えたほうが楽だよ

212 名前:デフォルトの名無しさん mailto:sage [2009/08/06(木) 11:46:49 ]
>>203
半角ハングルというのがあってだな・・・

213 名前:212 mailto:sage [2009/08/06(木) 11:47:47 ]
ごめん、なんか勘違いしてた。
無視してくれ。

214 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 01:29:07 ]
チョンコは(・∀・)カエレ!!

215 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 04:40:11 ]
下のソースで
class CVec
{
std::vector<int> vInt ;
public:
void Get(int *pInt)
{
vInt.push_back(5) ;
pInt = &vInt[0] ;
}
}vec;

int _tmain(int argc, _TCHAR* argv[])
{
int* pInt = NULL ;
vec.Get( pInt ) ;
return 0;
}
mainのとこでpIntにアドレスを戻す事が出来ません
こういうことは出来ないんでしょうか?

216 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 04:42:24 ]
void Get(int *pInt) → void Get(int *&pInt)

217 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 05:02:15 ]
出来ました有難うございました

218 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 09:50:44 ]
>>215
その戻したポインタはクラス内部でvectorに対して変更を掛けたら無効になるから要注意。
つーか、const_iteratorを返す方がよかないか?

219 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:21:54 ]
flvのプレイヤー作るにはなに勉強すればいいですか??

220 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 23:26:36 ]
FLEXだと手軽にできるかな
体験版でプレイヤー作ったけど期限切れでそのまま放置してるの思い出した



221 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 01:12:12 ]
>>219
FFmpeg というツールがある。
C 言語からの使用方法については、この記事が参考になる。
codezine.jp/article/detail/2444

222 名前:219 mailto:sage [2009/08/08(土) 02:19:02 ]
>>220
C++からでもflex使えるんですか 調べてみます
>>221
ありがとうございます!参考にしてみます

223 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 15:49:51 ]
型の等しい二つの関数、例えば
int foo( int ); と int bar( int ) への共通のポインタは
int (*)( int ) で得られますが、
関数としての型は等しいが異なるクラスのメンバである関数、例えば
int Widget::foo( int ) と int gadget::bar( int ) への共通のポインタは
得られないものなんでしょうか。

普通に考えると前者は int ( Widget::* )( int )型、
後者は int ( gadget::* )( int ) 型で型が違うので無理なような気もしますが
普通でなくなりたいのです。

例えば class Gadget : public Widget; のようにして
ポリモーフィズムを利用してなんとかできないかなとか思ったんですが
Visual C++は許してくれませんでした。

224 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 17:32:18 ]
>>223
いや、継承関係にあれば問題ないはず。
エラーメッセージと、できれば実際のコードを貼ってみることだね。

225 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 22:55:44 ]
うそ言うな

226 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 00:43:25 ]
それが出来ないというのが
BCBで__closureという独自拡張がなされた理由の一つ。
継承関係があっても、別クラスのメンバ関数のポインタは、異なる型。

227 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 01:17:16 ]
224は間違っていないぞ。
GadgetがWidgetの派生クラスなら、Widget::*なメンバへのポインタはGadget::*なメンバへのポインタに変換できる。
なぜなら、Gadgetのインスタンスは当然Widgetのメンバを持っているため。
#include <iostream>
struct Widget
{
int foo(int) {return 1;}
};
struct Gadget : Widget
{
int bar(int) {return 2;}
};
int main()
{
int (Gadget::*p)(int) = &Widget::foo;
Gadget g;
std::cout << (g.*p)(0) << std::endl; // 1
}
もちろん、上のpはint (Gadget::*)(int)型なので、Widget w;があったとして、(w.*p)(0)のような使用はエラーになる。

228 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 01:20:58 ]
BCBの__closureみたいなことがやりたければ、一般にはfunctionとbindで実現できる。
Gadget g;
boost::function<int (int)> f(boost::bind(&Widget::foo, g, _1));
std::cout << f(0) << std::endl;
こっちの方法では、もう継承関係とか不要。

229 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:37:28 ]
今、C言語の勉強をしていて、Visual Studio 2008で書いてるんですが、
xに代入した乱数を配列aに一文字ずつコピーしたくて、

int x,y,z;
int a[5];

srand(time(NULL));

x = 1000 + rand() % 9999;
y = x;
z = 5;

do{
   --z;
  a[z] = y % 10;
  y = y / 10;
}while(z >= 0);

printf("乱数の数:%d\n",x)
printf("配列の数:%d\n",a)

などと書いたんですが、配列の方の数がどうしても合いません。
というか乱数を代入してるのに同じ数字しか表示されません。何がいけないんでしょうか?

230 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:44:07 ]
>  a[z] = y % 10; 
ここで添え字を使えているのに、なぜprintfのほうではできてないのだ



231 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:47:01 ]
msdn.microsoft.com/ja-jp/library/ms397016(VS.71).aspx
これをみてtime関数の使い方を勉強してください

232 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:48:31 ]
使い方は間違えてなくね
一秒以内に複数回実行した場合は同じ乱数が生成されるだけ

233 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:50:53 ]
srand(time(NULL));
パッと見、これにはそんなに違和感は感じない。
printf("配列の数:%d\n",a)
ここは明らかにおかしいが。

234 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 22:10:12 ]
printf("配列の数:");
 int i = 0;
   do{
    printf("d%",a[i]);
    i++;
   }while(a[i] > 0);

としてみたら、正常に表示されました。ありがとうございました。

235 名前:229 mailto:sage [2009/08/10(月) 22:10:55 ]
あ、>>324>>229です。

236 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 22:12:16 ]
for文を使わないのは何か理由があるのか?

237 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 16:50:36 ]
>>234
> }while(a[i] > 0);
これ配列の最後を超えてa[5]にアクセスしてるだろ

238 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 17:52:31 ]
つーか、a[i]ってどこかで初期化しているの?

239 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 17:54:43 ]
i が 0から4 を舐める間で さらに a[i] が 0以下だったら中断
こういう意図だと思うが… やはり何故 for を使わないのか疑問だ

240 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 01:47:33 ]
まだ習ってないとかじゃね?>forを使わない



241 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 13:45:36 ]
C++で、
%演算子の結果は

正の数%正の数
以外は処理系定義でしょうか?


242 名前:241 mailto:sage [2009/08/12(水) 14:17:52 ]
BohYoh.com−C/C++ FAQ 負数に対する除算の結果がおかしいのはどうしてですか。
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00134.html
こんなところを見つけました。
ということは、
int hoge = 何とか;

... -6, -4, -2, 0, 2, 4, 6, ...
といった偶数であるかどうかは
<方法A>
std::abs(hoge)%2 == 0
<方法B>
hoge%2 == 0
のどちらでも大丈夫と言うことでしょうか?
それとも<方法B>は余りが2になって返る可能性がありますか?


243 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 14:20:51 ]
>>242
剰余の符号は処理系定義だけれど、剰余であることが保障されるので2になることはない。

244 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 14:23:55 ]
方法Bで十分です
余りが2になることはないです
その余りを考えた場合(2 % 2 == 0)になるからです

245 名前:242 mailto:sage [2009/08/12(水) 14:25:03 ]
では<方法B>にさせていただきます。
ありがとうございました。

246 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 14:26:07 ]
ちなみに有効なint型であることが保証されている変数hogeが
偶数であることの判定は一番速い方法は何があるだろう?
bit演算かな?

247 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 14:53:09 ]
>>246
処理系、実行系依存。条件を限定しない限り、速度比較は無意味。

248 名前:246 mailto:sage [2009/08/12(水) 18:01:25 ]
>>247
やっぱそうだよね。
得意不得意あるだろうしなぁ。

ありがと。

249 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 00:54:30 ]
一般的に除算、剰余は高コスト
%2はコンパイラが何か最適化するかもしれんけど。

250 名前:ちょっと予測を裏切られたw mailto:sage [2009/08/13(木) 09:49:03 ]
int main(int argc, char ** argv)
{ // mod 2 チェック w/ gcc -S -O3 foo.c @gcc 3.4.4
#if 1
printf("%d\n", argc % 2);
// movl 8(%ebp), %ebx

// movl %ebx, %edx
// shrl $31, %edx
// leal (%ebx,%edx), %eax
// andl $-2, %eax
// subl %eax, %ebx
// movl %ebx, 4(%esp)
#elif 0
printf("%d\n", argc & 1);
// movl 8(%ebp), %ebx

// andl $1, %ebx

// movl %ebx, 4(%esp)
#elif 0
printf("%d\n", argc - (argc / 2) * 2);
// argc % 2と同じなので割愛
#else
printf("%d\n", (argc % 2) != 0);
// xorl %eax, %eax
// testb $1, 8(%ebp)
// setne %al
// movl %eax, 4(%esp)
#endif
return 0;
}



251 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 09:51:35 ]
// andl $-2, %eax
// subl %eax, %ebx
これか
久々のアセンブラなんで外れかも
eaxってことはx86 32bitかね?

252 名前:250 mailto:sage [2009/08/13(木) 09:58:03 ]
// こちらはunsigned版。
int main(unsigned argc, char ** argv)
{ // mod 2 チェック w/ gcc -S -O3 foo.c @gcc 3.4.4
#if 0
printf("%d\n", argc % 2);
// movl 8(%ebp), %ebx

// andl $1, %ebx

// movl %ebx, 4(%esp)
#elif 0
printf("%d\n", argc & 1);
// argc % 2と同じなので割愛
#elif 0
printf("%d\n", argc - (argc / 2) * 2);
// argc % 2と同じなので割愛
#else
printf("%d\n", (argc % 2) != 0);
// xorl %eax, %eax
// testb $1, 8(%ebp)
// setne %al
// movl %eax, 4(%esp)
#endif
return 0;
}
#if 0
結論。
・符号付整数型の場合、2で割った余りが0, 1, -1の3値になりうるので% 2では最適化しにくい。
・必要なのは0かそれ以外なので% 2した結果を0と比較することで、& 1にまで最適化される。
・符号なし整数型の場合は、% 2でも& 1にまで最適化される。
#endif

253 名前:250 mailto:sage [2009/08/13(木) 10:02:23 ]
おっと、リロードしなかった。

>>251
x86ですよ。それもcygwin。
整数型として評価させているのでこういう結果ですが、条件分岐に使うと又違うかもしれませんね。

まぁ私は% 2派ですが。

254 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 20:38:46 ]
eMbedded Visual C++ 4.0について質問です。
DLLを作成し、exeでビルドするとLNK2019でリンクエラーになります。
対処方法を教えてください。
以下、詳細です。

プロジェクト作成ウィザードで「WCE MFC AppWizard(dll)」をデフォルトのまま作成し、そのままビルド。
次に「WCE MFC AppWizard (exe)」もデフォルトで作成し、
DLLの.hをexeの.cppにincludeし、プロジェクト設定でdllの.libをリンクしました。
これだけの状態ですが、exeでLNK2019が発生します。
exe側の処理はDLLのクラスを宣言しているだけで、コンストラクタだけの状態です。
MFCなしのDLLでは問題なくexeがリンクできます。

作りたいのはMFCが利用可能なクラスDLLです。
設定の問題か、WCE MFC AppWizard (dll)で別の記述が必要なのかが判断つきません。
以上です。

255 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 11:22:21 ]
質問です。
テキスト文字列で
(5 + 8) * 3
のようなものの答えを計算するライブラリというもので、何かスタンダードなものはあるでしょうか?

自作もいいのですが、正規表現ライブラリのBoost Regexのように何かしら既存のものがあればと思いまして。

256 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 11:29:03 ]
system("awk 'BEGIN {print (5+8)*3}'")
結果を回収したいならpopen("awk 'BEGIN {print (5+8)*3}'", "r")してfgets()で。

257 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 11:33:07 ]
えーと、なるべくなら内部に組み込みたいのですがどうでしょうか?
使い方としては、
ゲームのパラメータを外部のtxtに持たせてまして、今はそこに数値のみかけるのですが、
これを計算式までかけるといいなと思いまして。

level = 10
sytem = 20
power = level * 5

とかできるといいなと思っています。
プログラム中からは、文字列の"level"などをキーにして、設定されている数値を取得しています。
(余談ですが、map<string, int>を使っています)

258 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 12:10:36 ]
>>255
Boost.Regex のようにって言うなら、 Boost.Spirit の出番じゃないか?

259 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 12:32:19 ]
>>255
それならSpiritがいいだろうな。



260 名前:まぁ、boost.spiritだろうね mailto:sage [2009/08/14(金) 12:41:18 ]
>>257
えー、外部の方が楽できるよw
awk 'BEGIN {level = 10; system = 20; power = level * 5; printf("level:%d\nsystem:%d\npower:%d\n", level, system, power);}'
とかw



261 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 12:42:36 ]
awk教徒は質問者を混乱させるだけだから帰れよ

262 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 12:42:46 ]
早速Spiritを調べてみました。
面白いですね。
ちょっと解説ページみながらこねくり回してみたいと思います。

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

263 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 12:59:11 ]
>>260
wじゃねーよ。
スレ違い。


264 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 13:00:42 ]
>>262
Spiritで数式を解釈させるなら
boost::spiritっちゃえ!
ttp://tamachan.club.kyutech.ac.jp/%7Egridbug/spirit/
C++ Labyrinth
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-boost-spirit.html
Spirit v1.6
ttp://boost.cppll.jp/BDTJ_1_30/libs/spirit/
これらが有名で質も高いと評判です。

265 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 13:10:20 ]
数式 解析 C++
でぐぐれよ


266 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 15:03:58 ]
複数のDLLをロードするときに、
ロードが成功したものをvector<HANDLE>にpush_backで入れると、
HANDLEのアドレスが被ってうまくいかないようです。

for(・・・){
HANDLE hd = LoadLibrary(・・・);
v.push_back(hd);
}

v[0]とv[3]が同じ値になったりします。どうしたら良いですか


267 名前:266 mailto:sage [2009/08/14(金) 15:07:07 ]
hdが消滅するのが駄目と思いますが、newで確保してそのポインタをvectorに入れたらいいですか?
newは一貫して使いたくないのですが、回避する方法ありますか?

268 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 15:32:11 ]
これだと重複しませんでした。 HANDLEと関数を束ねたクラスを用意し
クラスの中でクラスを使ったりするのが失敗の基の気はします。
HANDLEのコピーをしていくうちに、メモリリークと同じような事が起こっている気はします。
確定ではないですが。


vector<HANDLE> hd;

for(・・・) {
n=hd.size();
hd.resize(n+1);
hd[n] = LoadLibrary( ・・・);
}

269 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 15:45:54 ]
これだとHANDLEが重複します。
DLLdataは HANDLEと関数のクラスです。
原因わかりますか? 268とほとんど変わらないと思いますが


vector<DLLdata> x;
for(・・・) {
n=x.size();
x.resize(n+1);
x[n].hd = LoadLibrary( ・・・);
}



270 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 15:46:29 ]
push_back()を使わないのは何か高邁な思想でもあるのだろうか。



271 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 15:50:27 ]
>>270
push_backと ・・・ = LoadLibrary( ・・・)では値の入れられ方に違いがあるのでは?
と思いました。 でも原因は別にあるようです。 特定できていません。

272 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 15:56:18 ]
原因わからないので、vector<クラス>を止めて回避する事にします。

273 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 15:56:22 ]
>>269
vectorのresize時にデストラクタが呼ばれるのは知ってる?
DLLdataのデストラクタで何かやってないかい?

274 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:07:01 ]
デストラクタでは、FreeLibraryをやってます。これが駄目な原因ですか。 
使い終わったら解放するのが普通ですが。

275 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:09:41 ]
vectorはリサイズ時にメモリを確保し直してオブジェクトを移動することがある
その場合vectorはコピーコンストラクタを呼んで新しい位置にオブジェクトをコピーし
古いオブジェクトをデストラクタで消す

276 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:14:45 ]
原因はわかりました。 
DLLdataのデストラクタを外すのは、他所への影響もあるので
そこだけ、 vector<HANDLE> vector<関数1> vector<関数2>・・・と分けて定義する事にしました。

277 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:15:33 ]
HANDLEはHMODULE(long int)か?
だとすればただの値のコピーであるものが>>266で重複するというのは
同じパスのDLLを二回以上ロードしてるだけって気がするんだけど
HANDLEもユーザ定義の型だったりするのだろうか

278 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:15:52 ]
そういやpush_backもだな
push_backに渡した引数は、vectorのメモリ領域にコピーコンストラクタでコピーされて、
渡した引数自体はデストラクタで破棄される
要するに、適切なコピーコンストラクタを書かなきゃだめということ

279 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:17:48 ]
コンテナに値セマンティクスのないオブジェクトを入れちゃダメって
メイヤーズ先生もサッター先生もマッサー先生も
あれほど口をすっぱくしていってたじゃないか。
忘れちゃったのかい?^^

280 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:19:26 ]
すみません
>>266は確かめて無くて。
たとえのような物でした・
重複してないかもしれません



281 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:29:03 ]
>>265
お前こそぐぐれよ
それでぐぐってもspritはでてこねーよ
何ページもめくれば別かもしれんが

282 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:33:59 ]
>>280
たとえのような物ってどういう意味だよ。
>>266は明らかに質問の前提となる現象として書いてるじゃないか。

283 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:37:14 ]
Win32APIのLoadLibrary関数の話なら戻り値はvoid*型だから
>>266のコードでまったく問題なく動くよ。
重複も起こらない。今試したから間違いない。

だからエラーは>>266のコードが原因じゃない。

284 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 16:47:26 ]
目標は達成しましたよ。 トンクス 
Susieライブラリで多種画像を読み込めるようにしたかったんです。

285 名前:デフォルトの名無しさん [2009/08/15(土) 20:30:33 ]
c++のクラス変数に初期値を与えるにはコンストラクタで代入しないと駄目ですか?

286 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 20:35:05 ]
ダメだね。

287 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 20:41:42 ]
いっぱいあると面倒ですねありがとー

288 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 20:48:29 ]
>>285
代入じゃない。初期化リストで初期化するんだ。

289 名前:デフォルトの名無しさん [2009/08/15(土) 22:53:54 ]
ttp://www.med.osaka-u.ac.jp/pub/cl-comp/saito/cppintro/cppintro9.html
上記URLの練習5でモンスターの攻撃する関数について教えてください

290 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 23:00:50 ]
何をだって?



291 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 23:51:24 ]
自分で好き勝手に組めばよろし

292 名前:デフォルトの名無しさん [2009/08/16(日) 01:50:54 ]
for文とwhile文はどっちのほうが速いんですか?
VC++使ってます。

293 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 02:05:41 ]
do-while と goto が一番速いからそれ使え。

294 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 06:24:01 ]
>>292
速度は実測が基本。
比べてみればいい。

295 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 06:31:41 ]
比較するコードの骨子をこのスレに晒して見ればいい
ループ云々以前の問題で小突き回されるだろうからイイ勉強になるぜ

296 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 08:06:13 ]
do-whileを使う状況ってほとんどなくね?
俺はほとんど使ったこと無いんだけど。


297 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 10:32:43 ]
if (cond) {
  prepare();
  do {
    work();
  } while (cond);
}

298 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 11:07:13 ]
>>296
ミスって無限ループされたら嫌なんで基本的に使ってない。
メッセージループとかは別だけど。無限ループって怖くね?

299 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 12:01:38 ]
一度実行しないと反復条件が確定しない状況とかたまにあるだろ

300 名前:296 mailto:sage [2009/08/16(日) 12:20:44 ]
>>299
俺もたまにはある。
だから「たまに」使う。

でもforやwhileと比べて出番の頻度は相当低いな。



301 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 12:26:51 ]
Primitive Loop Structures Must Go

302 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 15:22:35 ]
括弧のくくり忘れとか(間違って余計に}を削除しちゃったとか)の時に、
doとwhileの個数数えると問題箇所がすぐ分かるからよく使ってる俺は異端ですか?

303 名前:300 mailto:sage [2009/08/16(日) 16:42:26 ]
>>302
そんな工夫初めて知ったわ。
ちゃんとインデントしていればだいたい分かるじゃん。
あるいはIDE/エディタの機能でも対応するカッコくらいわかるじゃん。

まあいいけど。

304 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 16:45:23 ]
最近はforを直接使う頻度が減ってきた

305 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 16:48:30 ]
ふぉー書くのってめんどいよねぇ。
なるべくforeachで済ませたい

306 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 16:49:41 ]
>>305
foreachなくね?
boostの実装を使うって事?

307 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 16:53:09 ]
boostとかCLIとか自前マクロとか

308 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 16:54:21 ]
STLのfor_eachのことだったりして^^

309 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 17:44:30 ]
あれは却って記述量が増えて悲しくなるケースが多い

310 名前:デフォルトの名無しさん [2009/08/16(日) 17:57:36 ]
他人のソースに、

void* Hoge::operator new(size_t size){
return reinterpret_cast<Hoge*>(new char[sizeof(Hoge)]);
}

みたいなnewの仕方があったのですが、
普通のnewと比べても速度があまり変わりません。
こういう書き方は何のためにやってるのでしょうか?



311 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 18:08:22 ]
独自のアロケータを使う場合とか

312 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 18:13:23 ]
ち、違うんだからね!
charの配列を作りたいんじゃないんだからね!
あくまでHogeのために領域確保したんだから

そんなココロ

313 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 20:01:20 ]
>>303
いや、インデントしてんだけど、mainの}、ifの}とかで挟まれて階層が複雑化していくと、
while文やfor文だと全部同じ } だから分かりにくく・・・。

対応する { } は、その間の背景色を変更してくれる色分け機能とかあったらいいなぁ。
Visual Studio 2008 Professional Edition使ってるんだけど、まだ始めたばかりだから機能なんて全然分からないぜ・・・。

314 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 20:21:09 ]
>>310
そのコードじゃ意味ないんで、たぶんその人は何か勘違いしてる。
最近知った C++ の機能をちょっと使ってみたかっただけとか、あると思います。

315 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 20:45:49 ]
コンストラクタを呼ばないという意味がある

316 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 21:07:02 ]
new演算子とoperator newは別なので
オーバーロードしてあっても、
newを使って確保すれば、やっぱりコンストラクタは呼ばれます。
newを使わずスタックに確保しても、当然呼ばれます。

別途確保した領域にplacement newを使えば呼ばずに済みますが
operator newをオーバーロードしたこととは全く無関係です。

317 名前:303 mailto:sage [2009/08/16(日) 21:14:35 ]
>>313
まあインデントはしてるだろうとは思ってたが。
インデントしない方が無理だしw

318 名前:303 mailto:sage [2009/08/16(日) 21:16:42 ]
>>313
むしろ

const unsigned int MAX = ...//0かもしれない
for(i=0; i<MAX; ++i)
{MyArray[i]=...}

こんなソースをdo-whileでどうやって書いているのだい?
書き換えられる物なの?

319 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 21:31:27 ]
do {
if(i>=MAX) break;
} while(1);

320 名前:318 mailto:sage [2009/08/16(日) 21:37:06 ]
>>319
そうきたか。

do {
if(i>=MAX) break;

MyArray[i]=...

} while(1);

ってことね。




321 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 23:02:37 ]
>>313
見た目の問題で do-while 使用するぐらいなら、複雑性を取り除く
努力をした方が建設的だと思うのだが。

多重ループの内周を関数化するとか、適度な意味や長さで関数を分
割していけば、そうそう複雑な階層を持つ事はないだろう。

また、do-while の「一度は実行される」という特性は、想定外の問
題に繋がりやすいので、登場したら危険視している。

322 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 23:22:44 ]
とりあえずinline付けときゃOKなの?

323 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 23:24:17 ]
>>322
誰に対するレスですか?

324 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 23:29:47 ]
とりあえず、インラン娘は2,3人でいい。

325 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 23:34:38 ]
>>323
C++に詳しい人に対してです。
なんかinlineはコンパイルされるときに短くしてくれる時があるんらしいんですよ。(本を読む限り)
だからとりあえず付けるのかなぁと。 それとも付けたらマズイ事が起きるときあるの?

326 名前:322 mailto:sage [2009/08/16(日) 23:37:15 ]
>>325
> なんかinlineはコンパイルされるときに短くしてくれる
> 時があるんらしいんですよ。(本を読む限り)
その本は窓から投げ捨てるために生まれてきた物です。

> とりあえずinline付けときゃOKなの?
> だからとりあえず付けるのかなぁと。
もしそうだったら言語仕様として無指定の時は全部
inlineになっているはずでしょ?

> それとも付けたらマズイ事が起きるときあるの?
バイナリが肥大化する可能性がある。
後はまあリンク時にどうするとか関数のアドレスがとれなくなるから
どうするとか説明がめんどくさいので、
詳細は次の人どうぞ!↓↓↓

327 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 23:37:43 ]
EXEが異常に巨大化するという、弊害が発生します

328 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 23:39:28 ]
>>226
関数アドレスを取ったら、inlineが無視されるんじゃないかなと。
適当なことをいってみる。

329 名前:325 mailto:sage [2009/08/16(日) 23:42:59 ]
>>328
カンスウあどれす? スマンまだ勉強始めたばっかでわからんw 出直します。

330 名前:326 mailto:sage [2009/08/16(日) 23:44:59 ]
>>328
無視されるかもね。
あるいは関数アドレスが必要じゃないところは
一部だけinline展開されるかもしれない。
その辺はコンパイラの自由だからなぁ。



331 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 23:47:42 ]
初心者は速さやコード量を気にすると決まって糞コードを書き始める。
だからそんな下らない事気にするのは止めとけ。

332 名前:326 mailto:sage [2009/08/16(日) 23:54:19 ]
つーかもうコンパイラの最適化に任せるのが良いかと。

inlineは俺は関数定義をヘッダーに書きたいときに
リンカエラーがでなくて便利だから使わせてもらっているぐらいかな。

333 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 23:55:22 ]
Premature optimization is the root of all evil.


334 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 01:30:37 ]
inlineキーワードはコンパイラへの単なるヒントであって、
実際に行われるかどうかはわからない。

335 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 04:17:52 ]
>>321
if(i == x)
{
do{
/*.........*/
}while(i == x);
}

とかなら・・・いや、複雑だな。

336 名前:デフォルトの名無しさん [2009/08/17(月) 09:35:04 ]
>>334
いまさら過ぎる

337 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 09:46:54 ]
C++で継承を禁止するクラスの制作をしたいのですが、何かいいアルゴリズムはないでしょうか?

338 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:14:56 ]
最適化に神経質なコンパイラならinline指定は無視した上でインライン展開し捲くり、
関数ポインタが必要だったり外部リンクが必要な場合に備えて関数の実体も作る。
関数内の静的変数については、どっちみち関数の実体に関係なく作られる。

339 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 11:20:27 ]
INTは1,2,3のどれかの値を取ることが確実に分かっているとき、
switch(INT)
 {
 case 1 :
  return 1;
 case 2 :
  return 2;
 case 3 :
  return 3;
 }
これと
switch(INT)
 {
 case 1 :
  return 1;
 case 2 :
  return 2;
 default :
  return 3;
 }
これと

switch(INT)
 {
 case 1 :
  return 1;
 case 2 :
  return 2;
 }
return 3;
これはどれが最速でしょうか?

340 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 11:23:15 ]
>>339
return INT;
じゃね?



341 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 11:23:34 ]
>>337
codepad.org/axUzOb82
仕組みはよくわからんがこれで継承を制限できるらしい
だれか解説してくれ

342 名前:339 mailto:sage [2009/08/17(月) 11:25:10 ]
>>340
そうですよね。
では
switch(INT)
 {
 case 1 :
  return val_1;
 case 2 :
  return val_2;
 case 3 :
  return val_3;
 }
これと
switch(INT)
 {
 case 1 :
  return val_1;
 case 2 :
  return val_2;
 default :
  return val_3;
 }
これと
switch(INT)
 {
 case 1 :
  return val_1;
 case 2 :
  return val_2;
 }
return val_3;
これはどれが最速でしょうか?

343 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 11:27:26 ]
さぁ実測しようか…

344 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 11:31:20 ]
コンパイラの最適化能力の度合いにもよりけりだろうが…
全て同じ asm コードになる可能性もあるな

345 名前:342 mailto:sage [2009/08/17(月) 11:38:48 ]
コンパイラはgccです。
gccの最適化はこういったものは期待していいですかね?

346 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 12:00:10 ]
こういう極めて小規模な部分だと、ターゲット環境のアーキテクチャによってもかわるだろうから…
実測するのが一番だと思うよ?

最速云々って そのコード部が一番遅い(or 速度に支配的) って断定できてるの?
目先にとらわれすぎているような気がしないでもない

347 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 12:02:07 ]
>>346
目先にとらわれています。
ですがこの様な状況が過去にも将来にも多発するので、
どちらが速いかとかがあれば是非教えていただけますでしょうか

348 名前:337 mailto:sage [2009/08/17(月) 12:23:02 ]
(最適化なしでの話)
switchも結局asmでは==の比較とアドレスジャンプで出力されるはず
よって命令数で言えば下<上=中

が、いくら時間のかかる比較命令でも、1命令差を評価するのは難しい/あまり意味がないかと
OSの割り込みにもシビアに影響受けるし

>>341
virtualでhogeを継承して、コンストラクタを定義せずそれを継承するから
hogeコンストラクタにアクセスできないとか、そんな仕組みなのかな?調査してみる。thx

349 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 12:24:07 ]
>>347
INTが例えば引き数なのか演算結果なのかでも事情が異なるので、そのswitchだけでは判断できない。
val_1, val_2, val_3が定数か変数かでも結果は変わるだろうし、定数の場合は法則性の有無でも変わるだろう。
あー、コンパイラにINTが1〜3以外の値を取らないと言うヒントを与えることができていないので、
一番上とそれ以外とでは質的な違いが生じている。

案外、
if (INT == 1) return val_1;
if (INT == 2) return val_2;
return val_3;
の方が速いかもしれない。

350 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 12:26:20 ]
>>348
最適化なしでの議論は全く無意味だと思うし、中と下は結局のところ同じロジックだと思うぞ。
少なくとも、上と中で同じ出力になるとは思えない。
# その理由は>349の4行目



351 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 12:54:53 ]
値が連続したswitchは最適化が効くとジャンプテーブルに
変換されて、cmpが消えるという話は聞いたことがある。

しかしVC2008expressで自分でやってみてデバッガでASM表示しても
消えてなかったんだよなぁ。
実測しても自前で関数アドレステーブル使った方が速かった。

352 名前:337 mailto:sage [2009/08/17(月) 13:16:13 ]
>349
ああ本当だ、上のほうが判定命令+1だった。スマソ

353 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:34:08 ]
>>351
仮にジャンプテーブルに変換したとすると、より遅くなるから敢えて避けているんだろ。
関数テーブルを使う方が速いと言う話も、今回のケースには当て嵌まらない。

354 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:50:49 ]
mmioで読み込んだWaveファイルに対し加算合成を行うプログラムを作成してみようと思い挑戦していますが
読み込んだ波形データをどの様に操作すればいいのかが分かりませんorz
内容としては正にこんなことをしてみたいのです
ttp://www.spacesoft.co.jp/Products/Freeware/Sound/04alphaBlend/readme.html
スレ違いでしたら申し訳ありませんが、よろしくお願いします。

355 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:58:20 ]
>>354
生波形の形に変換して、好きなように加工すればいいと思います。
例えばWindows特有の所謂wavファイルをそのまま扱っているのなら、
それのフォーマットについて知る必要がありますが。

356 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 14:03:29 ]
WAVEフォーマット解説
ttp://www.kk.iij4u.or.jp/~kondo/wave/

357 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 14:04:40 ]
>>355
テスト用にWindowsXPの起動音を読み込んで、再生出来ることを確認した後
データチャンク以降に格納されたデータをBYTE型の配列に格納するまでは進めたのですが
その配列に格納したデータを直接操作(演算?)する、といった感じで良いのでしょうか?

いまいち説明が上手くできないです、申し訳ないorz

358 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 14:08:48 ]
>>357
実際にやってみればいいじゃん。

359 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 14:14:19 ]
ヘッダのbit数と符号の有無を確認して、bit長ごとに
オーバーフローしないように足してけば良いと思うよ。

360 名前:デフォルトの名無しさん [2009/08/17(月) 14:15:17 ]
>>354
アルファブレンドってなってるからやろうとしてることは画像のピクセルの色合成と理屈は一緒だよね

画像の方はVRAM上の2次元配列のピクセルなんかとテクスチャのピクセルの色合成

音の方は時間軸方向の1次元配列(ステレオならx2)の波形の合成だろうし



361 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 14:41:11 ]
>>358-360
ありがとうございます。
少しずつ確認しながら実装してみようと思います。

362 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 14:51:15 ]
参照について質問です。
「参照は初期設定した後は変えられない」と禿本やEffective C++
には記載されているのですが、以下のコードはコンパイルできてしまいます。
なぜでしょうか?VC++2008、Comeauでも成功します。

int main()
{
int i = 1;
int& r = i;
int j = 2;
int& s = j;
r = s;     //なぜerrorにならない? 参照 r は i を参照し続けるのではないのか?
}

363 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 14:56:18 ]
代入と初期化の違い。
int& r = i; は r を i で初期化しますが、
r = s; では、rの参照していうオブジェクト、すなわち i に s の値(= 2) を代入します。

364 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 15:07:21 ]
>>363
レスどうも。
そこは理解できました。
ただEffetive C++の第5項では以下のようなコードは
代入演算子をコンパイラは自動生成しないとあり、実際
コンパイルできません。>>362 がOKなら、こちらも
w1 = w2 はコンパイルできてもよさそうなんですが、
そうはなりません。なぜでしょうか?

int gi = 123;

class Widget {
int& r;
public:
Widget():r(gi){}
};

int main()
{
Widget w1, w2;
w1 = w2; //エラー

int x;
cin >> x;
}

365 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 20:23:01 ]
>Effetive C++の第5項では以下のようなコードは
>代入演算子をコンパイラは自動生成しない

自分で答え書いてるじゃない。w
自力でoperator = を記述すればちゃんと機能するよ。

366 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 01:44:22 ]
>>364
現状の言語仕様については >365 の言うとおりなんだが、
確かに w1.r = w2.r としてコンパイルできてもよさそうな気もしてきた。

なんか危険なケースがあるのかな?

367 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 02:52:34 ]
危険とかじゃなく、参照はポインタのように再割り当てができないから。
int&をint*に置き換えた場合を考えてみるといい。

368 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 03:05:22 ]
再割り当て、じゃなくて
「中身を代入する仕様になぜしなかったのか?」という話だよ。

int &r = x;
r = a;
では、再割り当てなんかされずに「aの持つ値が代入される」のだから。

お前の大好きなポインタの形で書き直すならば
*p = a; という形での代入が、
通常の式においては行われるのに
構造体の代入においては何故行われないないのか、ということだ。

369 名前:デフォルトの名無しさん [2009/08/18(火) 03:12:19 ]
アセンブラのコード想像したら参照は初期化したら変更できないというかできる必要は無いと思ったw

370 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 03:26:34 ]
>>368
値セマンティクスにならないからだろ



371 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 03:35:48 ]
何それ。

int a, b;
int& x = a;
int& y = b;
x = y;
これが値の代入になるのは当然だよな。
でも、構造体のメンバ同士の代入になると違うって?

C++において、「構造体の代入」とは「全メンバを個々に代入すること」と定められている。
(代入演算子をオーバーロードしない限りは、ね)
ならば、参照メンバであっても代入は代入とされてもおかしくは無かったんじゃないかね。


まあ個人的には、「デフォルトコンストラクタが作られない」のに「代入演算子はデフォルトで定義される」という仕様になるのが
受け入れにくかったんじゃないか、とは思ってるんだけどね。

372 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 08:21:55 ]
>>365->>371
みなさんレスありがとうございます。
疑問だったのが>>366さん、>>368>>371
さんの書かれてるとおりです。
言語仕様ということで理解しました。

373 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 09:37:07 ]
>>371
おいおい。値の代入してどうするんだよw

x=yは、つまりa=bのことだろ。
相変わらずxはaを指し、yはbを指している。

だが、本当に参照の代入を作ってしまった場合、意味的には
xはbを指すように変更されないといかん。

参照の意味わかってんのか?

374 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 10:09:36 ]
>>373
>>371さんが言ってる代入とは、a = b のことだと思いますよ。
要は、何故そのセマンティクスがクラス内の参照データメンバにも
適用されないのか?ということです。

375 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 10:23:59 ]
だから、勝手に値の代入なんかされたら「意味」変わってしまうだろ。
とある変数Xを参照しているメンバーint&を持っているクラス同士をコピーしたら、なぜかXの値が書き変わるとか拷問かよw

376 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 10:27:57 ]
今 見てみたら訳が分からない事になっているんだが
結局みんな何が言いたいのだい?

377 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 10:52:41 ]
>>375
参照先が変わらなくても、ユーザー定義型も>>362のように参照先の値
が代入されてもいいんではないかと思ったわけです。


378 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 11:11:09 ]
>>377

class A
{
public:
int &a_;

A(int &a):a_(a){}
};

void main()
{
int x = 0;
int y = 1;

A m(x);
A n(y);

m = n;
//↑何故かm=nで、xの中身が1に書き変わる
}

こんなのが通ったら、どんだけバグの温床になると思ってんだ。

379 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 11:16:22 ]
>>378
↓が OK なのにメンバだけ禁止するのはなんで?って話だよ。

int x = 0;
int y = 1;

int& m = x;
int& n = y;

m = n;
//↑何故かm=nで、xの中身が1に書き変わる


まぁ、クラス内に参照型が潜んでるのに気づきにくいだろうとは思う。
そういう代入を認めるように operator = () を定義するのは簡単だけど、
逆にそういう代入をデフォルトで認めた場合に禁止するための直接的な
記法( C++0x の = delete )も無かったわけだし。

380 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 11:18:18 ]
>>378
なるほど、そうですね。
いっそ>>362もエラーにしてくれたら一貫性
があって悩むことはなかったのですが。



381 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 11:18:33 ]
>>379
お前なぁ・・・
ほんとに「参照」「初期化」「代入」の意味が分かってねーんじゃねーのか?

どのプログラムの何が「何故か」なんだよ
もろにそうなるようにプログラムを自分で書いてるじゃねーか
だが、クラスの代入まわりは「自分で書かない」からバグの温床になるような仕様を避けてるんだよ!

382 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 11:19:15 ]
>>380
>>362がエラーになったら、参照の存在自体全否定じゃねーか
アホか!

383 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 11:21:39 ]
みなさん本当にありがとうございました。
C++の奥深さを感じました。

384 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 11:23:39 ]
>>362については最適化をまったくしないベタなアセンブラで考えるとよろし



385 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 11:24:20 ]
>>383
C++つーかアセンブラ的に考えると別に不思議でもなんでもない話

386 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 11:25:56 ]
>>381
結論に異論はないんだけど、この内容に「参照」「初期化」「代入」の意味は
関係ないでしょ。現行の規格を前提としない話なんで、どちらの動作でも
「そういう意味」として定義可能だし。

387 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 11:30:28 ]
>クラスの代入まわりは「自分で書かない」からバグの温床
>になるような仕様を避けてるんだよ!

デフォルトでこんな代入演算子を書かれたら困りますね。
P30を読み返したところ納得できました。

388 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 11:38:26 ]
>>384
>>385
アセンブラは未勉強なので、これから調べてみます。
>>386
自分も結論に異論はないです。危険を避けるための
仕様だとして納得しました。

389 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 12:02:03 ]
アセンブラ関係ないよ。 C++ でクラスの代入を memcpy() みたいに考えるほうが危険。

390 名前:デフォルトの名無しさん [2009/08/18(火) 12:30:42 ]
>>381
どうみても、わかってなくて頭悪いのはおまえだろ
一人だけ話を理解できてないのだから



391 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 12:34:57 ]
初期化の話なんかしてなくて、代入時の動作についてだけ話しているのに
一人だけ初期化と代入の区別がどうのと言っているしね。

392 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 12:42:55 ]
結論が間違って無くても、無駄に偉そうな口調で書くと損をするという良い例。

393 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 13:06:49 ]
>//↑何故かm=nで、xの中身が1に書き変わる

>こんなのが通ったら、どんだけバグの温床になると思ってんだ。

参照ってのを理解しているとは到底思えない。

394 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 13:09:09 ]
www.s-cradle.com/developer/sophiaframework/tutorial/Cpp/reference.html
別名になる
つまりcだとtypedefしたような感じなんだよね
なので代入すればそうなる

395 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 13:52:20 ]
>>392
低学歴は、いったん言い方に対してファビョると、
肝心の言ってること自体をまったく見なくなるからね。
そういうのが大勢いる場所では、損をするというか、中身のある会話が終わる。

396 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:37:38 ]
質問者が、初期化と代入の違いがわかってなかったのが原因としか思えないんだが。
int &a = b;
a = b;
上2つが全然違うものだと知らなかったからもめたんだろ

397 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:42:03 ]
C++の演算子の使い回しが元凶

398 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:46:47 ]
参照自体が元凶
実質、実装方式がポインタなのだから、ポインタだけで良かったのに

399 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:52:20 ]
>>396
Effective C++を読んでいて、ユーザー定義型と基本型での動作が異なる
ということが疑問だったのです。

400 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:58:48 ]
>>399
異なってねーよ



401 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 16:01:53 ]
質問の意図が通じてない方もいるようなので、この辺で止めにしましょう。
みなさんありがとうございました。

402 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 16:06:53 ]
参照をメンバに持ってるんだったら、参照先をコピーするべきだよね。
参照に限っては参照先の内容をコピーするような実装を要求するのはおかしくね?
そうしたければ自分で書きなよ、というのは素直な流れじゃないかなあ

403 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 16:08:25 ]
とりあえず、最初の>>362の時点で、参照が何なのかさっぱり微塵もわかってないのに、
なんでそんなに上から目線なんだ?

そして、>>363のレスで「理解できた」と言っているのに、なぜ今度は「初期化」だの「代入」だのは関係ないとか騒いでるんだ?

404 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 16:14:10 ]
参照をポインタに置き換えて考えれば、わかりそうなもんだけどなー
>378の説明が全てだろ
参照先がコピーされるのならともかく、参照先の内容がコピーされるとか勘弁してくれ

405 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 16:17:37 ]
ところで、クラスのメンバーにクラス外のオブジェクトの参照を持たせる場合ってどんな場合?
オブジェクトの寿命管理がすごく面倒そうだけど。

406 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 16:20:49 ]
いや、だから元質問者も含めて、ここにいる全員が参照の意味わかってるって。
元の質問はつまり、下の例でなんでFooは代入演算子が自動生成されるのにBarは違うんだ?ってことだろ

struct Foo {
int n;
Foo(int i) : n(i) {}
};

struct Bar {
int& n;
Bar(int& i) : n(i) {}
};

int main()
{
int i = 123, j = 456;
Foo foo1(i), foo2(j);
Bar bar1(i), bar2(j);
foo1 = foo2; /* operator=が自動生成されるので代入できる */
bar1 = bar2; /* operator=が自動生成されないので代入できない */
}

それで>>387でなっとくしてんだろが。

407 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 16:23:22 ]
なぜプログラム系の板にはIDがないんだw
だれが質問者でだれが回答者なのかわからねえよw

408 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 16:26:37 ]
>>406
それに対する答えが、何度も書かれてるじゃないか
そして

foo1.n = foo1.n;
bar1.n = bar2.n;
この二つの意味する内容がまったく違うのに、何度も同一視しようとするから「参照を理解してないだろお前」と言われるんだ

「参照先がコピーされればいいのに」ならまだ分かるが、なんで「参照先の内容がコピーされる」なんて馬鹿な考え持つんだ。
インスタンスの「代入」の意味がわかってないと疑われる理由がそれだ。

409 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 16:32:02 ]
うちのEffectiveC++の5項にはWigetクラスなんて出てこないし
P30みても何の解決にもならないんだけどどうしましょう

410 名前:406 mailto:sage [2009/08/18(火) 16:32:06 ]
>>408
俺は元質問者じゃねえよw
たしかにそういう馬鹿もたくさん見てきたがこいつはどうみても違うだろ



411 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 16:41:09 ]
>>409
俺もおんなじこと考えてたw
45項の間違いじゃねーかなw

412 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 16:48:35 ]
このスレに質問するまでもなく、45項に懇切丁寧に「なぜ代入演算子を自動生成しないのか」が説明されている件。
物わかりが異常に悪いのも含めて、釣りだったのかと。

413 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 17:01:57 ]
>>411
すっきりしたwww
ありがとう〜〜

414 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 17:09:13 ]
>>411
第2版と第3版で書いてある場所が違うのだ。
第3版はテンプレートの話がかなり増えたので
全体の構成がかなり変わっている。

で、2版の45項は3版の5項に移行した。

415 名前:別人です mailto:sage [2009/08/18(火) 17:13:11 ]
俺はEffective C++の第三版を買って持ってるよ。

でもまあ要らないか。

416 名前:415 mailto:sage [2009/08/18(火) 17:14:22 ]
×でもまあ要らないか。
○でもまあもう解決したようなので開く必要はないか。


Scott Meyers大先生に恐れ多いことを言ってしまった。

417 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 22:03:53 ]
FugaがHogeをメンバ変数に持ち
HogeがFugaへの参照を持っています
Hogeの持つ参照にメンバの所有者の参照を渡して初期化したいのですが
コンストラクタ初期化子にthisを渡すと警句が出てきます
これを安全に初期化する方法はありますか?

418 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 22:43:17 ]
Hogeのコンストラクタで、Fugaのメンバにアクセスしたり、メンバ関数を呼び出したりしなければ問題ない。
これを守った上で、警告を明示的に抑制し、その旨をコメントに残しておく。
警告の抑制が気に食わない場合は、あきらめてポインタを使う。

419 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 23:12:18 ]
超間抜けな質問ですが、VC++(cl.exe, link.exe) で C++ クラスを
含んだ DLL って、どうすればコマンドラインから作れますか?

 X:\> cl -c -EHsc hoge.cpp
 X:\> cl /LD /DLL -o hoge.dll hoge.obj

として作ってみたのですが、dumpbin /exports hoge.dll では
まったくシンボルがエクスポートされておらず、現在クラス内の
メソッドに一つ一つ __declspec(dllexport) を付けて回ってようやく
エクスポートされている状態です。

しかし可視性はC++なのでpublic/privateで制御できてる訳で、
せめてクラスに対して1つだけ指定すればクラス内シンボルは
public/privateの指定に従って制御できないかと思うんですが、
何か方法があるでしょうか?

420 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 23:21:35 ]
>>419
class __declspec(dllexport) MyClass {...

でできへん?




421 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 23:42:59 ]
>>420
うぉ、でけた!

 __declspec(dllexport) void hogefunc(...) { ...

と付けていた流れで

 __declspec(dllexport) class MyClass { ...

とやって怒られてorzしてた所だった。豚々トンクス。

422 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:14:30 ]
>>444
今更だけど……。
msdn.microsoft.com/en-us/library/ms693342(VS.85).aspx

423 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:15:24 ]
うお、誤爆スマン

424 名前:デフォルトの名無しさん [2009/08/19(水) 00:19:11 ]
アロケータを自作してみたのですがどれぐらい速くなったのかわかりません。

速度を計測してみると、
1000回実施
アロケータ : 0.453sec
newとdelete : 0.484sec

1000回で31ミリ秒って速いのでしょうか?
比べるものがないのでよくわかりません。

425 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:21:32 ]
比べるのは君の動機/目標だよ。

426 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:22:23 ]
メンバ変数の順序を変えると処理速度が変わる、って有り得ないですよね。

427 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:23:17 ]
>>426
ありうるよ

428 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:27:01 ]
積極的に再配置する言語も有るくらいだし

429 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 02:56:51 ]
ソースの特定部分の逆アセンブルを見るのってどうやってる?
コンパイラやIDEによっても違ってくると思うけど、それぞれに一般的な方法ってある?

430 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 03:03:00 ]
>>429
わざわざ逆アセンブルしたのを見なくても、普通はコンパイラからアセンブリの段階の
リストを出力できるようになっている。



431 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 03:47:14 ]
>>430
言われてコンパイルオプションを探してみたら確かにあった。
VCの一覧だとリスティングファイルとしか書かれてないから気付かなかったよ…
ともあれサンクス。

432 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 14:48:30 ]
とあるクラスAのインスタンスが5個あってある処理を排他的にするため
staticなCRITICAL_SECTIONをメンバに持たせているわけですが

こんどクラスAとは全く関係ないクラスBも同時に排他する可能性が出てきたため
これまでの方法だと不都合になってきました。

こういう場合はどうCRITICAL_SECTIONを利用するのが良いでしょうか・・・

433 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 14:58:20 ]
・グローバルにする
・A、Bとは別にCSのみのクラスを作り、ABインスタンス生成時に渡す
・AかB片方にCSを持たせ、持たないほうの生成時に持つほうを引数で渡す

434 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 16:01:58 ]
クラスA・Bそれぞれに static CRITICAL_SECTION* をメンバに持たせて最初の生成時に渡す

ただこの方法だとAとBでCRITICAL_SECTIONが同一とは保証されないからバグのもとになるかも?

435 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 16:12:17 ]
安易にやっちゃうとデッドロックしそうな気が…

Aのみ利用の排他群
Bのみ利用の排他群
A,B 両方とも利用の排他群

436 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 16:35:56 ]
使われる側じゃなくて使う側で排他したほうがいいんじゃね?

437 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 17:01:46 ]
適当なfacadeを作って、そいつに依頼すると
A,Bのインスタンスのコピーを返してくれて
それをclientで操作した後にfacadeに渡すとそのデータを用いて更新してくれる
丁度RCSのclone, commit操作みたいなやつがいいと思う
こういうのって何パターンって言うんだっけ…

438 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 18:41:58 ]
>>313
for(i=0;i<10;i++){
{//block 1
}//end of block1
}//end of for (i)
とかしてるけど。

439 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 19:13:20 ]
>>438
…なぁ、begin〜end とか if〜endif とかいう文化があ
る中で、何故 C は {} を採用したか考えたことある?

440 名前:438とは別人だけど mailto:sage [2009/08/19(水) 19:26:50 ]
>>439
何で?


字下げスタイル - Wikipedia
ttp://ja.wikipedia.org/wiki/%E5%AD%97%E4%B8%8B%E3%81%92%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB




441 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 19:31:59 ]
そんなの書かなくてもキーボード操作一発でブロックの終了位置に飛んだり
別画面で確認したり光らせたりするエディタマクロ書けばいい話

442 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 19:54:11 ]
そんなマクロをわざわざかかなきゃいけないような
エディタを使わない方がもっと良い。


443 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 20:28:52 ]
いや、道具が気に要らなければ使い易いように改造するだろ…

444 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 20:34:16 ]
改造はするけど大抵はできあいのマクロなりなんなりで十分じゃね?
そんな自分でマクロを書かなきゃいけないような…(ry


445 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 20:38:19 ]
>>440
何でって、そのwikiのページにも書いてるじゃない。

>しかし、この方法では同じコードをソース内の2ヶ所に記述しているため、修正を行う際に問題となる。

446 名前:440 mailto:sage [2009/08/19(水) 20:50:04 ]
>>445
ああそうなのかー。

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

447 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 17:10:59 ]
質問です。

class Hoge : public Base
{
virtual void test()
{
Base::test();
}
};

と書くことで、親のtest()を呼び出すことが可能なのは良いのですが、
「自分の1つ親」を表すキーワードなどはないでしょうか?
時々継承元を、派生形のものに変えた際、

class Hoge : public BaseEx
{
virtual void test()
{
Base::test();
}
};

と変え忘れてしまい、バグの元になってしまっているのです。

448 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 17:18:19 ]
>>447
C++規格策定の段階ではderivedというキーワードが実は存在したらしい。
が、「typedef Base derivedでいーじゃん」の一言により撤廃されたらしい。

449 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 17:30:32 ]
そのTypedefを忘れるから困るというのに、困ったものですねw

仕方ないのでマクロでも使うことにします

#define ParentClass Base
class Hoge : public ParentClass{
virtual void test()
{
ParentClass::test();
}
}

美しくないですねー。
undefしてやらないと、他に影響を与えてしまいますし。

450 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 17:31:04 ]
ヘッダーファイルに関数の実体を書くとインライン展開される
ことが多いようですが、そう考えると予約語のinlineはどんな時
に書くのが有効なんでしょうか。



451 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 17:42:49 ]
インラインで展開されてほしい気持ちを
それを読んだ人間に伝えたいとき

452 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 17:42:56 ]
>>450
その理解レベルなら、全く書く必要はありません。

453 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 17:43:24 ]
>ヘッダーファイルに関数の実体を書くとインライン展開される
>ことが多いようですが、
「ヘッダファイルに実体を書いた」からインライン展開されるのではなくて、
クラス定義の内側に関数の実体を書くと暗黙にinlineがついているかのようにコンパイルされる。
したがって、クラス定義の外側に書いた関数については、必要ならば明示的にinlineを書く必要がある。


454 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 17:45:27 ]
コンパイラオプションのインライン展開なんちゃらを活用したいとき

455 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 17:46:34 ]
>>449
その気持ちの悪いマクロって、typedefと何が違うの?

456 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 17:55:40 ]
>>450
inlineを書かないとリンクエラーになるとき。

457 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 18:04:33 ]
>>455
俺もそう思った。
むしろtypedefの方が良くないか?


458 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 18:06:47 ]
いちいち undef するまでもなく、typedef だとスコープきかせられるよね

class Base {
public:
virtual void test() { printf("Base"); }
};

class Hoge : public Base {
typedef Base derived;
public:
virtual void test() { printf("Hoge"); derived::test(); }
};

class Huga : public Hoge {
typedef Hoge derived;
public:
virtual void test() { printf("Huga"); derived::test(); }
};

main() { Huga huga; huga.test(); }

459 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 18:09:48 ]
__super っていう拡張があったな。どのコンパイラか忘れたけど。

460 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 18:14:10 ]
MSのやつかな。
多重継承の時はどうなるんだろうね



461 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 18:36:18 ]
>>455
気持ち悪さに加え、悪影響を増やしたものだよな

462 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 19:00:36 ]
Java の super キーワードって有難いんだな

463 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 19:15:24 ]
>>460
ttp://msdn.microsoft.com/ja-jp/library/94dw1w7x.aspx
同じ文意で区別がつかないときはエラーっぽいけど

464 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 21:08:05 ]
勝手に推測されても困るし妥当じゃね

465 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 21:42:51 ]
>>447 >>448
コンストラクタにderivedを明記しておくと、派生元を変えてtypedefを直さなかったらエラーになるから便利だよ
class Hoge : public fuga
{
typedef fuga derived;
public:
Hoge()
:derived()
{
}

virtual void test()
{
derived::test();
}
}


466 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 02:32:36 ]
>>455,457,458
クラス内の typedef だと、基底クラス変えたいときに2箇所いじることになるじゃないか。

467 名前:デフォルトの名無しさん [2009/08/21(金) 08:52:31 ]
Cで簡単なシェルを作っているのですが、フォアグラウンドプロセスグループの切り替えのあたりで詰まってしまいました。

main(){
while(1){
printf("my-shell $ ");
if (fgets(input, sizeof(input), stdin) == NULL) { //コマンドの読み込み。
exit(0);
}
(コマンドの解析。長いので略)
(fork実行)
if ( pid == 0){
(子プロセス、コマンドのexec。)
}
else{
(親プロセス)
sigaction(SIGTTOU, &all_act, NULL); //シグナルハンドラは何もしない。実質無視。
sigaction(SIGTTIN, &all_act, NULL); //これも。
setpgid(pid, pid);          //子プロセスのpgidを変えて、
tcsetpgrp(STDOUT_FILENO, pid); //それをフォアグラウンドに。
waitpid(-1, &status, 0);
}
}
}

おおよそ上のようなコードを書いたのですが、一回目のコマンド実行はうまくいくのですが、
ループの先頭に戻って2回目にfgetsが呼ばれると、なぜか何も入力していないのにEOFを読み込み、exit(0)でシェルが終了してしまいます。なぜこのような動作をするのでしょうか?
シェル自身がバックグラウンドプロセスになっているせいなのでしょうか?

468 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 09:19:26 ]
#define のマクロを「そのファイル内だけで有効」にする方法はあるでしょうか?
#undefを末尾に書くのも良いのですが、漏れなどが怖いので

469 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 09:21:47 ]
外してたらスマン

パイプ通すのに stdin を dup した場合って
dup元の stdin は、それ以降無効になったような気が…

470 名前:デフォルトの名無しさん [2009/08/21(金) 09:22:14 ]
>>468
1) そのソースの先頭に書く
2) #ifdefで制御する



471 名前:467 [2009/08/21(金) 09:37:01 ]
>>469
返信ありがとうございます。でもパイプを使わない簡単なコマンドでもダメなんですよね・・・


472 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 10:27:41 ]
#pragma(winmm等)は、その効果を
複数のソースファイルで得たい場合でも、
どれかひとつのソースのみに
記述すればいいのでしょうか。

473 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:07:01 ]
>>470
ソースに書いたとしても、そのソースでヘッダをincludeしていた場合、そっちのヘッダにも適用されてしまいますよね。
ifdefで制御というのはよくわかりませんでした。どんな感じでしょうか。

また、ヘッダで使いたいと考えています

474 名前:デフォルトの名無しさん [2009/08/21(金) 11:11:48 ]
>>473

ヘッダー名はhoge.hと仮定

有効にしたいマクロを下記の感じで囲う
#ifdef MAC_ON
#define hogehoge 10000000
#endif

で有効にしたいソースで下記のように記述
#define MAC_ON
#include "hoge.h"

有効にしたくないソースだと
//#define MAC_ON これを入れない
#include "hoge.h"


475 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:15:01 ]
>>474
すいません。こちらが利用意図を正しく伝えられていないみたいです。
改めて説明させていただきます

hoge.h---------

#define POWER 1

class Hoge
{

};

--------------

こんな感じでやる時、このヘッダファイルの中でのみPOWERマクロを有効にしたいのです。
他ヘッダや、hoge.hをincludeするCPPなどには影響を与えたくないのです。
全て末尾でundefする方法もあるのですが、数が多い時に困りそうです。

476 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:18:20 ]
>>475
#undef 忘れを警戒するぐらいなら、そもそもマクロを使わないで済まないか
よく考えたほうがいいんじゃないかなぁ。

477 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 12:27:55 ]
>>472
VC++とかの#pragma comment(lib, ...)のこと?
これに関しては、リンク時に働くものなので、
1つのソースにしか書かなくても一緒にリンクするものすべてに影響が及ぶよ。

478 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 12:34:21 ]
>>475
class 内で static const int とか

479 名前:472 mailto:sage [2009/08/21(金) 12:42:15 ]
>>477
なるほど、分かりました。
ありがとうございます。

480 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 12:51:38 ]
undef忘れを警戒するだけなら
#define enable_macro (
#define POWER enable_macro 1)


#undef enable_macro
#undef POWER



481 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 13:20:09 ]
>>447の解決方法が俺も知りたいのだけど
継承元が変わった場合
やっぱり最低限2か所書き変えるしかないんですかね?

482 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 16:02:40 ]
これでいいんじゃあないの
class Base {
protected:
typedef Base base_type;
void f() { cout << "Base" << endl; }
};
class BaseEx: public Base {
protected:
typedef Base base_type;
void f() { cout << "BaseEx" << endl; }
};
class Derived: public BaseEx {
public:
void f() { base_type::f(); }
};

483 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 16:17:07 ]
>>482
BaseExの中のtypedef、さっそくタイプミスしてません?

484 名前:デフォルトの名無しさん [2009/08/21(金) 17:51:30 ]
うわ、こっちのスレで聞いた方が良かったかもしれないのかな

485 名前:467 [2009/08/21(金) 22:01:54 ]
すみません、どなたか>>467分かりませんでしょうか?


486 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 22:16:22 ]
関数テンプレートの関数型宣言ってどう書くの? 書けないんだが。

487 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 22:18:40 ]
>>485
_exit()にしてるか?

488 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 22:20:32 ]
これな
www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_2.html#SEC6

つーか、俺、Windows以外はほとんど知らないからあてずっぽだけどな。

489 名前:467 [2009/08/21(金) 22:36:31 ]
>>487
_exit()にしてみましたが状況は変わらないみたいです・・・
fgetsの前にstdinをfflushしてみたりしてもダメでした。

490 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 00:58:59 ]
.dllってなんですか?
クラスみたいに使い回しができるんですか?



491 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 02:03:23 ]
>>490
そうです。いろんなプログラムから使い回しができます。

492 名前:デフォルトの名無しさん [2009/08/22(土) 02:24:50 ]
質問です。
文字列同士のマッチング処理を行う必要があるとします。
その際、検索に引っ掛かりやすいよう、両方の文字列を正規化したいと考えています。

また、条件として
 ・マッチングする文字列は両者ともShift_JIS。半角英数から記号、漢字まで様々な種類の文字が入力される。
 ・ここでいう正規化とは、一部記号の消去や、全角/半角、ひらがな/カタカナ、大文字/小文字の統一などを指す。
 ・言語はC++。自分の習熟度は低め。(ちょうどEffectiveC++が面白いくらい)
 ・環境はWindows2000以降を想定。最終的にはDLLファイルとして出力する。
とします。

Unicode(のどれか)に変換しつつ、Boostの正規表現で置換できるかなー、と
初心者ながらに考えてみたのですが、いざ実装しようとすると思ったよりもコード量が多くて驚きました。
(Perlの文字列処理能力ってすげぇんだなあと改めて実感)

もし「こうやるのが定番」とか「遠回りしすぎ!」というのがありましたら、よろしくお願いします。

493 名前:デフォルトの名無しさん [2009/08/22(土) 15:12:07 ]
bool bHoge:1;
これってどういう意味ですか?
コロンとC++でググっても見つからなくて・・・

494 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:15:08 ]
ビットフィールド

495 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:41:56 ]
>>494
ありがとうございます
なんというど忘れ…

496 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 15:52:52 ]
記号系は検索しにくいからなあ。

497 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 16:34:44 ]
>>495
ど忘れ・・・?
プライド高いな

498 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 16:56:31 ]
ど忘れだと語弊があるんですかね。
昔見た事あるはずなのに、完全に忘れていた自分への失望も込めて書いたつもりでしたが。
何かお気に障ったのなら申し訳ないです。

499 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 17:05:24 ]
>>498
別に気にするな。
そんなの気にしてたら2chなんてやってらんない。

500 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 17:20:07 ]
>>1-500
( ^ω^)え?なになに?あーそれ知ってたお

>>501-1000
( ^ω^)あー、アレねアレ。確かアレだよね



501 名前:デフォルトの名無しさん [2009/08/22(土) 20:04:55 ]
Windowsにおいてメインスレッドかどうか、を判定するようなAPIはないんでしょうか?
あるオブジェクトAがあって、Aのオブジェクトの内部ではメインスレッドかどうかで処理をわけたいのですが、メインスレッドかどうかを判定する方法がなく困っています。

フレームワークのようなものを作っていて、WinMain到達後にGetCurrentThreadIdをしてメインスレッドのIDをキャッシュしておく、という方法は取れるのですが
このオブジェクトが、グローバル変数などのWinMainより先にコンストラクトされて走ったコンストラクタのコード上でCreateThreadされ、そのスレッド中で使われてしまうと、もはや判定しようがありません。
なにか、ダイレクトにメインスレッドかどうかを判定する方法はないのでしょうか?

たすけて・・・

502 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 21:54:20 ]
ttp://ziddy.japan.zdnet.com/qa3593503.html
ここらへん?

503 名前:492 mailto:sage [2009/08/22(土) 22:28:33 ]
>492ですが、自己解決しました。
移植性などを考えるとあまり良い方法では無いのかもしれませんが、LCMapString で何とかなりました。


504 名前:デフォルトの名無しさん [2009/08/22(土) 23:51:20 ]
>>502
ありがとうございます。
そこにも書いてあるのですが、Thread32Firstを用いたときに、最初に取得できるスレッドがメインスレッドなのかどうかということがMSDNのドキュメントで確約されているものを見つけることができませんでした。
たぶん、平気だろう、ではできそうなものですが、安全性を考えると正直、つらいかなと思っています。
また、システム中すべてのスレッドを列挙するとなると、コスト的にも少々見過ごせないという思いもあり、だったらしょうがないですが、ユーザになんらかの制約を求めるほうがいいかなと思いました。
ということで、うまい解決方法がさっきからいくら探してもでてこないので、あきらめようかと思っています。

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



505 名前:デフォルトの名無しさん [2009/08/23(日) 00:04:13 ]
クラスを参照渡しするときに、mainで渡すと問題なく実行できるのですが
クラスの中で渡すと下記のエラーが発生してしまいます。

"演算子 '%' は、値型または ref クラスのインスタンスにのみ適用できます"

このエラーを回避するためにはどのようにすればいいでしょうか?


おk:
main(){
A^ a;
B^ b;
b->(%a);
}

マズー:
ref class Z{
A^ a;
B^ b;
b->(%a);
}

506 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 00:10:38 ]
ここ逝け

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

507 名前:デフォルトの名無しさん [2009/08/23(日) 00:13:33 ]
>>506
thank you for your kind advice :-)


508 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 02:22:41 ]
>>501
自分なら、ユーザにこのスレッドをメインスレッドとするとフレームワークに登録させる仕組みにするかな。

そもそもWindowsにはメインスレッドという概念は存在しない。
GetMessageするスレッド?ウィンドウを作るスレッド?
どっちもただ1つのスレッドでやるなんて決まりはないよ。
必要とあれば、複数のスレッドで行って全然問題ないし、実際そうすることもある。

509 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 02:39:49 ]
最初にmainが実行されるスレッドのことを言ってるんだろ。

510 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 07:40:20 ]
プログラミングエキスパートの皆さんの力が必要です。
どうかどうかツールを作っていただけないでしょうか。
もはや風前の灯状態のスレを救ってやってください。


yahooきっずで先生1位にして教育委員泣かそうぜwww
yutori7.2ch.net/test/read.cgi/news4vip/1250954051/



511 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 13:55:59 ]
More Effective C++の次はなにがお勧め?
Coding Standards
Effective STL
Modern C++ Design
あたりで迷ってるんだけど

512 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 13:59:49 ]
Exceptional C++

513 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 17:04:15 ]
PS3購入で知っておいた方が良いこと

旧型PS3:
Linuxインストール機能内蔵でPS3をPCとして使うことができる。
また、Cellの開発ツールも無料で入手できるので自分でCellのプログラムを作ってみることができる。
ビットストリーム出力はドルビーデジタルPlus、dts-HDのみ対応。
HDD80G

薄型PS3:
Linuxインストール機能は提供されない。
ブラビアリンク機能でブラビアと連動した電源のON OFFができる。
ドルビーTrueHDのビットストリーム出力対応。
HDD120G
比較して低騒音低発熱

514 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 17:39:54 ]
>>513
何?
誤爆?


515 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 20:05:35 ]
全単写mapってどうやって実装すればいいかな

516 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 20:07:39 ]
全単写mapって?

517 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 20:21:43 ]
>>515
Boost.Bimapみたいなの?

518 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 20:22:57 ]
ああマップチップというかタイルパターン化されてない一枚絵のマップのことかね?

519 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 21:08:01 ]
keyとvalueが全単写にの関係になってるマップのことです
簡単にいうとkeyに重複無し、valueにも重複無しなマップです



520 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 23:11:40 ]
他人に通じにくい単語をあえて使うのは
無闇に英単語を織り交ぜて、俺ってかっこいー精神とかわらんな



521 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 23:14:00 ]
>>515
std::map を二つ使えばいいよ

522 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 23:24:26 ]
全単射?

523 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 23:27:58 ]
>>520
普通に大学で勉強していれば全単射くらい知ってるだろう
全単写はしらんが

524 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 00:00:10 ]
理数系じゃないと厳しくないか

525 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 00:17:36 ]
自分の世界=普通
これ常識

526 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 00:26:25 ]
だからといって、自分の無知を正当化できるわけではない。
あぁ。

527 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 00:34:01 ]
っていうかググレカス

528 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 01:33:32 ]
全単射くらい中学生でも理解できるんだからもったいぶらずに教えてやれand分からないなら調べろ

529 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 01:51:58 ]
と本人が申しております

530 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 02:16:59 ]
std::map2つ使ってどうやって全単射を実現するのかわからない
まさかkeyとvalueを交換したのを2つ作って2回代入するのか?



531 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 02:33:15 ]
>>520
全単射という言葉くらいは常識かと。知らない方がはずかしい、とは感じないのですか?

532 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 04:06:49 ]
他人に合わせて言葉を変えられないヤツの方が恥ずかしいわ。
結局、自分はその言葉しか知らない無知ですって言ってる様なもんだろ。

533 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 04:12:04 ]
× 他人に合わせて
× 俺様に合わせて

534 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 04:21:32 ]
全単射mapの作り方くらい中学生でも分かるかと。
そんな常識的な事も分からないなんて恥ずかしいと思わないんですか?

はい、解決。

535 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 05:12:23 ]
ついうっかりごりごり実装してしまいそうな感じなんだけど、楽な方法があるんだろうなぁ

536 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 07:02:36 ]
その前に全単射と全単写は全然違うだろ

537 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 07:26:13 ]
全単写なんてものもあるのか…
これは知らなかった

538 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 07:33:39 ]
>>537
ないない
グーグル先生ですら全単写をしらないからw

全単写と書いちゃうってことはまともに聞いてなかったんだろ

539 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 09:11:21 ]
>>530
逆写像が必要なら、それが一番楽な方法だと思うが。

540 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 09:28:09 ]
map2つだとちょっと無駄なので、
mapとset使えば良いのじゃないか。

map<key,val> m;
set<val> s;

//値の重複チェック
if( (s.insert( v )).second ) {
 //無ければmapに追加
 m.insert( piar<key,val>(k, v) );
}

値のサイズがでかくて2重に持つのが勿体無いなら、
値は別なコンテナに入れて、set<val*>とか
set<値コンテナのインデックス>とかで
それら用のコンパレータ使うとか。



541 名前:デフォルトの名無しさん mailto:sage [2009/08/24(月) 10:08:28 ]
Boost.Bimapか、それがだめならBoost.MultiIndexでできない?

542 名前:デフォルトの名無しさん [2009/08/25(火) 05:49:11 ]
質問!
コンソールアプリケーション勉強してどんなことまで出来ますか?
ブロック崩しとかシューティングとか2Dのゲーム作れますか?
エロい人教えて><


543 名前:デフォルトの名無しさん [2009/08/25(火) 05:58:54 ]
できると思うよ
でもグラフィック使うならdirectxなんか使うべきだろうね。複雑さやグラフィック性能考えればね。
コンソールアプリの修行をしたいって言うんならそれでもいいと思うけど

544 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 06:46:38 ]
C言語を知っている事が前提で書かれたC++の書籍で、おすすめってありますか?

柴田望洋って人の明解C言語シリーズを読んだ後に明解C++を読んでるんですが、
重複する内容が多くて挫折しそうです。それとも重複を覚悟で最後まで読んだ方がいいんですかね?

545 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 09:32:05 ]
>>544
この手の本はただ読めばいいもんじゃないんだから、重複する分は復習になるだろう。
まぁ、読んだだけで理解した気になりたいってのなら挫折するのも判らんではないが。


546 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 09:43:28 ]
柴田の本読むぐらいならEssential C++やC++ Primerの方がいいだろうな
あとAccelerated C++はCの知識のあるなしに関わらず使えるだろう

547 名前:名無し学生 [2009/08/25(火) 10:48:54 ]
Visual Basic の課題で困っております。
誰かお答えください。本当に助けてください。

1.Visual Basicの関数で数値を文字に直すCStr()とStr()の違いについて

2.戻り値の違いが確認できる方法を考え、戻り値の違いについて実際に確認し、
  その確認方法と違いを具体的に述べよ。
注意:実際にやったことと、確認した違いを簡潔かつ具体的に書くこと。

3.下記の計算結果などから、Visual Basicで計算できる数値の桁数について考察をまとめ、
  何故そのような制限があるかについて理由を答えよ
  1) 48 x 100 - 81
  2) 12 ÷ 9.3 x 247
  3) 0.2 - 12 ÷ 69
  4) -12 ÷ 100 + 100

548 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 10:51:27 ]
>>547
スレチ

549 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:37:18 ]
C/C++の質問とはちょっと違うかもしれませんが
linuxのファイル操作について質問です。

例えばlinuxコマンドのCPであるファイルを別のディレクトリ
にコピーしたとして、fopenでコピー最中のファイルを開け
てしまいますよね?ここでコピーが終わるまでfopenが失敗
するようなロックをかける事は可能でしょうか。

ご教授お願いします。


550 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 11:56:00 ]
flockじゃだめなの?



551 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 12:06:05 ]
flockってlinuxコマンドでcp中の場合もかかっているのですか?

552 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 12:30:42 ]
flock()はロックしたいプロセス同士が使わないとダメ。
cpはflock()なんて感知していないから無理。
そもそも、コピー中のコピー元ファイルを開いて何の問題があるのだろうか。

553 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 12:39:15 ]
コピー中のコピー元ファイルを開いて

w

554 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 19:06:59 ]
VC++でwchar_tの内部表現はUTF-16ですが、
以下のようにUTF-16の4バイト文字を描画しようとすると文字化けしてしまいます。
TextOutW(hdc,x,y,_T("𡚴"),2);
DrawTextW(hdc,_T("𡚴"), 2, &rect, 0);
なにかいい解決方法はないでしょうか。
よろしくお願いします。

555 名前:554 mailto:sage [2009/08/25(火) 19:09:13 ]
書き忘れました。環境はWindowsVista(64bit)とVS2008アカデミックです。
すみません。

556 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 20:42:12 ]
2とはこれいかに

557 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 21:03:26 ]
>>554
試してみた
Vista32bitなので若干環境違うけど、TextOutW で表示はできてるっぽい

APIの問題じゃなくて、フォントが対応してないってことはないかな?
Vistaならメイリオのフォントを明に指定して描画してみたらどうなる?


558 名前:554 mailto:sage [2009/08/25(火) 23:00:39 ]
フォントをMS明朝に設定したらうまく行きました。ありがとうございます。
文字コードのせいだと思い込んで、フォントのことを忘れていましたorz


559 名前:デフォルトの名無しさん [2009/08/26(水) 05:55:12 ]
初心者すぎて恥ずかしいのですが…
Visual C++と普通のC++って別物ですか?

Visual Studioで作ったものをNetBeansにコピペしても動くものなのですか?

560 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 06:10:48 ]
VCだけの拡張機能みたいなのはあるが、
それらを使わなければコピペで動く。



561 名前:デフォルトの名無しさん [2009/08/26(水) 07:59:01 ]
ありがとうございました!!
ググっても入門レベルじゃわかんなかったので助かります。



VC++だとWindows上でしか動かないんじゃないかと心配してました。
(万能求めるならJavaとかかもしれませんが…^^;)

562 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 09:09:25 ]
>VC++だとWindows上でしか動かない

yes

563 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 09:14:05 ]
VC++のVの部分はwindows依存だからねえ

VC++のVに依存するコードを書かなければ、他の開発環境のツールとしても使える

ハックできるゲーム機の非公式開発のツールとしても使われてるね

564 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 09:19:21 ]
>>562
半端な回答乙。

>>561
基本的に、GUIはWindows依存。
問題は、それ以前にNetBeansはC++開発環境*ではない*と思うのだが。
NetBeansで開発するとすると、大抵はJavaで最近ではRubyやPython辺りってとこじゃないかと。

565 名前:デフォルトの名無しさん [2009/08/26(水) 09:22:58 ]
長い文章書くとボロが出る典型的な例

566 名前:デフォルトの名無しさん [2009/08/26(水) 10:32:45 ]
たくさんのレスありがとうございます。
最初はNetBeansでJavaやってみようと思ったのですが、
エラーがゲリベンのごとく出てくるので断念しました。
とりあえずVisual Studio C++やってる感じッス。

今の自分にはLinuxやらMacやらに対応させるなんてのは無縁だと思うんで、
しばらくVC++やっておきます。

567 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 10:34:02 ]
>>564
> 基本的に、GUIはWindows依存。
ここがもう分からない

568 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 10:39:14 ]
VCのGUI=MFCみたいな意味じゃないだろうか

569 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 10:39:44 ]
>>567
エスパーじゃないので、何が分からないのかを書け

570 名前:デフォルトの名無しさん [2009/08/26(水) 10:53:02 ]
>>559は付いていけないようです



571 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 10:56:20 ]
>>566
鬱陶しいからNetBeansでJavaやっとけ。二度とくんな。

572 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 11:26:49 ]
>>567
(・з・)キニスルナ!
VC++ に含まれるコンパイラは GUI がどうとか以前に
 ・プロセッサは IA-32/64。
 ・CランタイムおよびCスタートアップは Windows 用。
 ・そもそも .exe 形式。
なので、作った実行形式ファイルは 非 Windows 環境では動かない。

573 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:05:24 ]
>>572
脇道:
MSDOS で起動すると this program cannot be run in DOS mode. って出るんじゃなかったっけ?
(ま、アプリケーションがメモリにロードしきれるかどうか微妙だけど)

574 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:12:02 ]
コンソールアプリってのもあるけど今時16bitモードを使うMS-DOSで動くアプリを
出力できるようになってるのかね?

575 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:19:44 ]
>>574
EXEファイルの仕様でWindows実行ファイルの先頭部分はDOS実行ファイルになっている。
そして、その中身は標準だと>>573の言うようなプログラムというわけ。
もちろん、予めバイナリを用意しているだけなので、今のVCが16ビットコンパイラなどを持っているわけではない。

576 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:22:38 ]
今更だけど、言語であるC++とコンパイラであるVC++とは比較できる対象ではないだろとマジレス

577 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:24:55 ]
ある程度は考慮しないとだめでしょw
intだってレジスタの拡大で昔とは違うんだし

578 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:36:29 ]
templateの引き数の数を可変にしたいのですが、templateプログラミングで実現できますか?


579 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:40:12 ]
はじめまして
質問させてください

Visual C++ 2008 Express EditionでC言語の勉強をしているのですが、
strcmpという関数がうまく動きません。
原因を調べると、確保した配列が確保した以上のアドレスを参照しているようです。

char ary[5]で確保した配列2つを比較したいのですが、
例えば両方にappleという文字を代入してやってブレークで止めると、
1個目が"appleフフフフフフapple"
2個目が"appleフフフフフフフフフフ"
みたいな感じになってます

原因知ってるからがおられましたらよろしくお願いします

580 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:42:29 ]
>>579
ary[6]
でないと文字列終端の '\0' が入らないから



581 名前:デフォルトの名無しさん [2009/08/26(水) 13:42:56 ]
>>579
ゼロ終端になっていない。
char ary[6];
ary[5] = 0;
にしないといけない。

582 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:43:11 ]
strcmpは文字数の長さを指定しないのでCなど特有のお作法である文字列の終端に\0が入るスペースが必要だし入ってないと\0がでてくるまでひたすらうごくよ

583 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:47:45 ]
>>580-582
あぁ!
すっかり忘れてました。
ありがとうございます!


584 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:49:23 ]
VC++のデバッグモードは未初期化メモリに0xCCを入れるので
そのままShiftJIISとして文字列表示すると"フフフフフ..."と笑われるのです

585 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:52:49 ]
あの嘲笑は偶然じゃなかったのか

586 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 13:54:38 ]
>>584
てっきり元総理が入ってるのかと思った

587 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 14:03:55 ]
CCはINT 3 つまりデバッグ時のブレークポイントなので
未初期化のメモリに実行が飛び込んでも止まるという安全弁

588 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 14:37:16 ]
>>578
デフォルト引数を上手く使えばなんとかなるかもしれない。
根本的な解決は次期C++かな。

589 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 14:41:26 ]
そこでLokiのTypelistですよ

590 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 16:19:23 ]
>>587
あの0xCCはそんな意味があったのか・・・
適当に選んだ値だと思ってた
そうするとx86以外のCPUじゃ意味ないんだな
ARMとか何がいいんだろう



591 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 16:22:33 ]
>>590
そんな危なっかしいソース書かなければいいだけだろw
x86じゃないCPUは1バイトコードじゃないのはガチだろうな

592 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 17:11:20 ]
68000だと"NO"辺りになるのかな?w

593 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 20:37:32 ]
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

594 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 21:29:12 ]
>>590
バグで未初期化の領域を見てると、ゴミが入ってると
毎回挙動が違ったりしてデバグがしにくいんで、決まった値で
埋めておくって説も聞いたことがあるんで、もしそうなら、
ブレークポイントにならない適当な値でも意味はあるな。

595 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 23:22:41 ]
1000
1,000とかカンマを入れてくれる関数とかって存在しますか?

596 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 23:32:32 ]
>>595
intないし文字列で表された整数に,を入れて
文字列として返してくれる関数ってこと?

よく知らんが、まあ作っちゃえよ。

597 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 23:35:07 ]
文字列なんですがつくります(`・ω・´)ゞ

598 名前:596 mailto:sage [2009/08/26(水) 23:37:38 ]
>>597
C++で金額を3桁ずつコンマで区切る方法 - Yahoo!知恵袋
detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1017537890
こんなところにコード片が。
中身は見てないから実装についてはしらんけどな。

599 名前:デフォルトの名無しさん mailto:sage [2009/08/26(水) 23:58:01 ]
これではだめなん?
www.freeml.com/cppll_novice/1550/latest

600 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 07:37:36 ]
今らかC++でゲーム作りますね



601 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 12:01:46 ]
ゲームでキャラクターの向きを作っています。
0、1、2、3がそれぞれ上右下左に対応しています。斜めはありません。
これを時計回りに回転させた時に、0、1、2、3、0、1、2・・とすることはできますか?
bit演算をうまく使うとできそうなのですが、よくわかりません

それとも深く考えずに素直にifで3の時に右を向くと0、
0の時に左を向くと3、それ以外は時計回りで1加算、逆は減算・・としたほうが良いでしょうか

602 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 12:13:54 ]
x = 1;
angle = ( angle + x ) % 4;
多分こんな感じ

603 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 12:14:18 ]
右回りなら1を足して、4で割ったあまり
左回りなら4を足した後、1を引いて、それを4で割ったあまり

604 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 12:22:48 ]
bit演算でやるなら3で&すればOK

byte dir, hoge;
dir = 0;
hoge = dir & 3; //hoge = 0
++dir;
hoge = dir & 3;//hoge = 1
dir += 3;
hoge = dir & 3;//hoge = 0 dir = 4


605 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 12:37:23 ]
順回転を +1 逆回転を +3 (= 4-1) にすれば正の値しかとらないしな

606 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 12:43:47 ]
>>602-605
あまりを使うのでしたか、ありがとうございます。
bit演算も勉強になりました。ありがとうございました。

607 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 12:45:23 ]
ペロッ、これはrotation group!!

608 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 13:16:51 ]
むずけええええええええええええええええええええええ
なんだこの数字の塊わあああああああああああああああ

609 名前:606 mailto:sage [2009/08/27(木) 18:23:59 ]
ありがとうございます。おかげさまで移動ルーチンは完成しました。
しかし別の問題が浮上してきました。

現在MAPを二次配列で用意しています。
int map[3][4]={{2,12,0,4},
{0,5,4,13},
{0,3,11,9},
};
自分を表す位置は自分.xと自分.yで管理しています。

このようにある時、map[3]は縦、[4]は横幅になります
ですが一般的には縦はy、横はxが多いです。どちらにあわせるべきでしょうか?
とりあえずは自分が移動するときに、横に行きたいなら自分のy座標をずらし、
縦に動きたいならx座標をずらしています
>>601だと0の時にx--、1でy++・・となります

もしくはそうせずに、map情報を取得するときに
map[自分.y][自分.x]としたほうがよいでしょうか?

開発は趣味で一人でやっているので、他人が読むことはまずないと思います
できればミスが発生しにくいほうにあわせたいと思っています。よろしくお願いします。

610 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 18:33:42 ]
class map {
private: int data[3][4] = { ... };
public: int DataAt(int x, int y) { return data[x][y]; }// or return data[y][x];
};
と書いておいて、外からは常に同じように見えるようにする



611 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 19:52:16 ]
>>610
そんな方法があるのですね
ありがとうございます、やってみます

612 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 22:40:02 ]
>>610
範囲外アクセスでabortするようにして
参照にしたほうがよくね?

613 名前:609 mailto:sage [2009/08/27(木) 22:45:04 ]
ダメでした、分かりませんでした・・
mapクラスを作り、map型のF1を作り、メンバ関数DataAtの戻り値をcout・・と思ったのですが上手く動いてくれません
エラーは
1>d:\program files\vc\project\no\a.cpp(8) : error C2059: 構文エラー : '{'
1>d:\program files\vc\project\no\a.cpp(8) : error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます
1>d:\program files\vc\project\no\a.cpp(15) : error C2065: 'data' : 定義されていない識別子です。
で、コードは↓です。どこが違うのか本気で分かりません、助けてください!

#include <iostream>
using namespace std;
int main()
{
class map {
private:
int data[3][4]=
{
{2,12,0,4},
{0,5,4,13},
{0,3,11,9},
};
public:
int DataAt(int x, int y) {
return data[x][y];
}// or return data[y][x];
};
map F1;
cout <<F1.DataAt(2,3);
return 0;
}

614 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 22:48:42 ]
インデントのないソースコードは見ないことになってる

615 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 22:49:32 ]
※classはC++の新機能です

616 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 22:50:49 ]
つかiostreamとか使ってるならC++の知識あるんじゃないのか?
とりあえずクラスについて書いてあるところもう一回読んでみろ

617 名前:609 mailto:sage [2009/08/27(木) 23:01:26 ]
>>614
タブでインデントつけたら投稿するときに消えてしまいました
ttp://www1.axfc.net/uploader/Img/so/57296.jpg
>>615
環境はVC2008のC++です。
>>616
もう二時間ぐらい悩んでるんです・・何かヒントだけでもいただけると有難いです
もう一回読んできます・・

618 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:02:28 ]
>>617
そこで初期化をすることはできないとだけ…

619 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:10:30 ]
素直にループで回せや

#include <iostream>
class map {
private:
enum { COLUMN = 3, ROW = 4 };
int data[COLUMN][ROW];
public:
map() {
int z[] = {
2,12,0,4,
0,5,4,13,
0,3,11,9 };
int* src = &z[0];
for (int i = 0; i < COLUMN; ++i) {
for (int j = 0; j < ROW; ++j) {
data[i][j] = *src++;
} } }
int DataAt(int x, int y) {
return data[x][y]; } };
int main() {
using namespace std;
map F1;
cout <<F1.DataAt(2,3);
return 0; }


620 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:11:36 ]
>>618
ありがとうございます!
やっぱり出来なかったので諦めます!
>>619
ありがとうございます!それいただきます!



621 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:12:47 ]
>>614
へぇ

622 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:15:05 ]
>>614
>>613専ブラでポップアップすりゃインデントが付くんだぜ

623 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:24:39 ]
スペースを&amp;で置換して書き込むと、インデントされる。

624 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:26:19 ]
間違えた。
&nbsp; だな。

625 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:27:17 ]
知っててもそんなアホらしい事はしないよ

626 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:32:39 ]
すごいいい方法だよ。
見た目もインデントされるし、コピペしてもふつーの使えるコードになるし。
サイズの制限がきついけど。

よそにうpして、アドレス貼り付けとか情報が消えるし。
まあ、ログなんて誰もみないからそれは考えなくていいかな。

627 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:34:57 ]
>>626
切れんなよw


628 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:44:26 ]
>>627
相手が切れて見えるのは、自分の心理の投影だろう。
意味不明なことで切れる人っているな。

629 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:47:06 ]
相手が切れて見えるのは、自分の心理の投影だろう(キリッ

630 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:56:16 ]
codepad.org/oNy4WiOh

なぜHogeならよくてPiyoだと駄目なんでしょうか
メンバー関数ポインタのアクセスレベルの問題だと思うのですが
具体的にどういうルールがあるのか教えてください



631 名前:デフォルトの名無しさん mailto:sage [2009/08/27(木) 23:57:32 ]
codepad.org/oNy4Wi0h

すいませんアドレスこっちでした

632 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 00:16:41 ]
>>629
なんかあるのかと思ったけど、意味不明に煽ってるだけか。。。
まあ、>>623-624 の件に関しては今までそれ不便とかよくないとか言われたなかったし、そうだろうな。


633 名前:デフォルトの名無しさん [2009/08/28(金) 00:34:58 ]
C++のifstreamについて質問です
プログラムのコンストラクタ内でファイルオープンし、メイン内でファイルから一行読み出したいのですが、うまくいきません。
.isopenで調べてみると、コンストラクタ内ではOPENできてますがメインのほうだとCLOSEしてます。
ifstreamとはそういうものなのでしょうか。強制的にOPENしっぱなしには出来ないのですが?

634 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 00:39:10 ]
>>633
どこか他の関数で読もうとしてるだろ
ifstreamの参照を渡さないとcloseされるぞ

635 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 00:41:48 ]
できます、というかコンストラクタもメインも関係ない
どうやってifstreamインスタンスを渡してるの?

636 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 02:12:44 ]
>>626
他人のコードを見るときは常に俺スタイルにコンバートしてから読みますので何でもいいです(キリッ

637 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 02:22:46 ]
グローバルスコープなファイルオブジェクトがほしいなら
FILE構造体へのポインタを使うCの手法を使えばいいのだ。

これなら、一度開いたら、明示的に閉じない限り、
ファイル終了までずっと、プログラムのすべての場所からアクセス可能になる。

638 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 03:46:06 ]
>>630-631
リンク先に表示されてるエラーさえ取ればどっちでも通ったよ。

639 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 04:12:15 ]
char a[N]; って感じで配列をスタックに作るとき、おまいらは何バイトまでなら許せますか。

640 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 05:54:38 ]
8



641 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 07:32:18 ]
ワーク用なら 2Kぐらい

642 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 09:17:57 ]
質問です。

void Test
{
int a = 0;

}

こんな関数があるとして、この関数内で動く別関数を定義したいと思います。
その際、int aにアクセスする方法はあるでしょうか?
ぱっと思いつくのはインラインクラスで

void Test
{
int a = 0;
struct Func
{
static void hoge()
{
//色々処理
}
}

}

なのですが、そとの a にアクセスすることができません。
hogeの引数に参照として渡すのも良いのですが、数が多いと厄介です。

何か良い方法はありますでしょうか?
可能ならマクロでは無い方法が良いのですが…

643 名前:デフォルトの名無しさん [2009/08/28(金) 09:29:01 ]
可変長引数をそのままバケツリレーしたいのですが、どうすれいいでしょうか?
具体的にはprintfをラップしてmy_printfを作りたいのです。

void myprintf (const char* s, ...)
{
printf (s, ...);
}

↑こういう事がやりたいです

644 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 09:44:39 ]
>>642

void Test {
 struct Func {
  int a;
 };
}


645 名前:デフォルトの名無しさん mailto:sage [2009/08/28(金) 09:46:51 ]
>>643
vprintf使う






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<156KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef