1 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 21:36:23 ] エスケープシーケンスやWin32APIなどの環境依存な物でもOK。 ただしその場合、質問者は必ず、環境を書きましょう。 ※sageは禁止です。 【前スレ】 【初心者歓迎】C/C++室 Ver.34【環境依存OK】 pc10.2ch.net/test/read.cgi/tech/1169039760/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
41 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 09:35:38 ] externって「どっかにあるから探せよコラwwww」っていう感じくらいしかわかってない
42 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 09:45:48 ] extern 無しは「ここにおいとくから使えよコラwww」 ヘッダー内で extern 無しを書いて、あちこちでインクルードされると、 じゃどれつかうんだよコラ!!! とリンカが怒る
43 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 10:06:32 ] なるへそ
44 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 10:19:44 ] 超訳/超解説の類って集めると楽しそうだ。役には立たなさそうだが。
45 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 10:40:48 ] D&Eによれば、Stroustrupはグローバル変数肯定派だよ Simula使った後にC with classを開発する際にその必要性を 痛感していたようだ C++ならてきとーにnamespaceにくるんどけば、別に困らんと思うよ
46 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 10:53:43 ] まず、宣言と定義を理解しているかを各自再確認するように。
47 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 12:22:01 ] 本物のプログラマはヘッダを書かない。 よって本物のプログラマはグローバル変数を使わない
48 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 12:26:19 ] へえ
49 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 13:47:07 ] >>37 #import使えば戻り値のHRESULTの値がエラーのとき勝手に例外に変えてくれるから、 それに関しては毎回FAILDなんかで調べる必要はなくせるぞ。
50 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 15:17:14 ] >>47 偽者発見
51 名前:デフォルトの名無しさん [2007/02/21(水) 17:33:39 ] C++ で exit 関数とか abort 関数を使ってもいいの?
52 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 17:41:53 ] exitを呼ぶと、関数呼び出しだから自動変数のデストラクタは呼ばれない。 グローバル変数など静的記憶期間にあるオブジェクトはデストラクタで解体される。 abortはそれすらも保障がない。 それを踏まえた上で呼ぶのなら誰も止める者はいない。
53 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 17:42:22 ] >>51 デストラクタがすっ飛ばされちゃうんだっけ?
54 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 17:46:50 ] exit と同じことをやろうと思ったら、 例外をスローして main でキャッチして return しかないのか。。。
55 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 18:28:37 ] >>54 簡単に実装できるからいいんじゃね? でも catch(...) とかあるから確実に exit することができないって問題があるか。 まぁ、これは利点でもあるわけだが。
56 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 18:33:57 ] 全部オブジェクトのポインタをグローバルに保っておいて適当な関数で解放させるようにしてその関数をatexitで登録したらいいんじゃないかな?
57 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 18:37:38 ] 単純にcatch(...)で捕まえたらmainへ向けてさらにthrowすれば良いのでは?
58 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 18:47:56 ] だめだめ
59 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 18:51:23 ] >>57 それは自分ですべてのコントロールが可能であることが前提だし、 catch(...)じゃなにを捕まえたのかわからんから再throwすべきものなのか 再throwしちゃいけないものなのかの判断ができんし。
60 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 21:40:16 ] >59 よく分からない例外を握りつぶすなよ。 処理できる例外なら...で捕まえるなよ。
61 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 02:02:00 ] struct OBJECT { FLOAT fHigh; }; のとき、fHighを初期化するには、何か特別なことをしなければいけないのでしょうか?
62 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 02:24:16 ] >>61 コンストラクタで初期化すれば?
63 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 02:58:25 ] >>61 ふつうに初期化すればいいよ。
64 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 02:59:14 ] >>61 struct OBJECT a={12.345};
65 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 06:44:45 ] そもそもFLOATってどんな型だよ。
66 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 09:43:15 ] >>62 を検索したところ、まさにそれでした!!ありがとうございました。
67 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 19:55:42 ] C++でscanf()のいい代替物って無いんですかね
68 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:07:15 ] #include <cstdio> std::scanf()
69 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:11:32 ] >>68 型安全性が無いのと、文字列読み込みで長さを無制限にできない点がちょっと。 素直にstd::stringに読み込みたいのですが。
70 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:14:34 ] >>67 std::basic_istream<_Elem,_Traits> operator>>(なんとか)
71 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:15:14 ] >>70 それって、%[a-z]とか%[^,]みたいなことができますか?
72 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:20:25 ] boost::format
73 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:21:12 ] boost::spirit
74 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:23:11 ] >>72 boost::formatがサポートしているのは出力だけだと思っていました。 入力もサポートしていたのですね。
75 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:24:14 ] >>73 それはscanf()の代わりにlex & yaccを使え、と言っているようなもので、 適切な代替物というよりはオーバースペックに思えます。 無論、もともとlexが適切なケースではlexを使えばよいでしょう。
76 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:27:14 ] 少なくとも俺がBoostを使い始めてからの3年間では 入力でboost::formatが使えるなんて与太話は聞かない。 つ boost::Xpressive
77 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:28:45 ] readlineしてregexp。
78 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:33:38 ] >>76 初めて知りました。boost::regexの次期バージョンなのでしょうか。 >>77 regexpだと、その後さらに型変換が必要ですよね。文字列からの。 scanf()より余程複雑な字句解析を行うことができますが、 記述性と簡便性においては、かなり劣るといわざるを得ないのではないでしょうか。
79 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:37:49 ] なんだか要求が微妙すぎるな。 自作するしかないのでは。
80 名前:デフォルトの名無しさん mailto:sage [2007/02/22(木) 20:44:27 ] googleがPCREに寄贈したラッパーコード(pcrecpp)では、 int n; string s; pcrecpp:RE re("(\\w+)=(\\d+)"); re.FullMatch("ruby=1234", &s, &n); のようなことが出来るようですね。 これぐらいだとかなりいい感じです。
81 名前:デフォルトの名無しさん [2007/02/23(金) 11:36:38 ] 仮想関数についての質問です 派生クラスで再定義するメンバ関数以外に仮想関数にする意味はありますか?
82 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 11:45:35 ] >>81 あんまり無い。 仮想関数の意味を理解していれば自明だと思うが。 ただしデストラクタとか暗黙のうちに再定義されるものも あるので、知らないと良く分からない場合もあるかも。 あとは RTTI を有効にするためだけのダミーとか。
83 名前:デフォルトの名無しさん [2007/02/23(金) 17:58:49 ] 整数型のメンバ配列変数の便利な初期化方法を教えてください
84 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 18:05:45 ] >>83 つ[std::vector]
85 名前:デフォルトの名無しさん [2007/02/23(金) 18:08:07 ] 普通の配列の初期化は無理ですか?
86 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 18:12:33 ] コンストラクタで memset すればいいのでは。
87 名前:デフォルトの名無しさん [2007/02/23(金) 18:25:57 ] memsetでやります
88 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 18:39:05 ] memset()なんて濫りに使うもんじゃない。 せめてstd::fill()を使え。
89 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 18:41:54 ] そのほうがよかろう
90 名前:デフォルトの名無しさん [2007/02/23(金) 19:41:21 ] カラフルなテキストを表示したいんですけど SetTextColor+DrawTextだと限度を感じました。(頑張っても行単位がいいところ) 黒黒赤赤黒黒 黒黒青青赤青 こんな風に描写するのに適した関数教えてください。
91 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 19:42:59 ] >>90 スレ違い Win32API質問箱 Build50 pc10.2ch.net/test/read.cgi/tech/1171721448/
92 名前:デフォルトの名無しさん [2007/02/23(金) 19:53:32 ] >>90 一文字ずつ色設定して一文字ずつ書き込む どうかんがえても、これしかないでしょう どの環境でも
93 名前:デフォルトの名無しさん [2007/02/23(金) 19:59:59 ] VisualStudio 2002環境で確認したのですが stringstream::operator <<()を使用すると プロセス終了まで開放されないメモリプールが発生しているようなのですが 対応方法をご存知の方いらっしゃいませんか? スレッドを作っては消すを繰り返すプログラムで 生成したスレッド内でoperator<<()を使用すると使用メモリが増加するのですが インスタンス・スレッドハンドルの開放を行ってもメモリが減りません (インスタンスを生成しただけでは問題ないようです) CreateThread()ではCライブラリでメモリリークが発生するとの記述もありますが スレッドを_beginthreadex()で生成しても発生していて困っています
94 名前:90 mailto:sage [2007/02/23(金) 20:08:37 ] >>91 スマン去ります。 >>92 文字列中のタグ解析して色自動でつけてくれるよな物が関数化されてるかと思って
95 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 21:12:58 ] >>90 Win32APIスレ行け んでもってリッチテキストでも使ってろ
96 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 00:15:58 ] >>93 それは繰り返しただけメモリ使用量が増加していくの? プールがちゃんと再利用されてれば問題ないようにも思うんだけど。
97 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 11:50:18 ] 質問です。 配列を使い、その値の合計値を出す際に私はループカウンタを利用して足す手法を 思いつくのですが、それ以外の方法があると聞きました。 ですが、それ以外の方法が思いつかなく質問させてください。 int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int nSum = 0; for ( int i = 0; i < 10; i++ ) { nSum += a[i]; } return nSum; ここでループカウンタを使用せず、配列の全てを足すにはどうしたら良いでしょうか。
98 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 11:57:24 ] >>97 素直が一番 こんなのじゃなくて int nsum(int data[], int data_num){ if(data_num<=0) return 0; return data[data_num-1]+nsum(data, data_num-1); } int nsum(int data[], int data_num){ int *p, sum=0; for(p=&data[0];p!=&data[data_num];p++) sum+=*p; return sum; }
99 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 11:59:22 ] >>97 std::accumulate()
100 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 12:05:12 ] 回答者にも遠慮なく突っ込みを入れよう。 引き数がポインタなので、&data[0]する意味がない。p = dataで充分。 そもそも、ポインタを回す必要はない。ポインタ演算はバグの温床として禁止するコーディング規約もあるくらいだ。 したがって、 int nsum(int data[], int data_num){ // if (data_num < 0 || data == NULL) return 0; // 状況によっては神経質にここまでやるべき。 int sum = 0; for (int ic = 0; ic < data_num; ++ic) { sum += data[ic]; } return sum; } の方が自然だろう。
101 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 12:12:07 ] >>100 >引き数がポインタなので、&data[0]する意味がない。p = dataで充分。 終了条件と書き方を合わせたほうがいいと判断した >そもそも、ポインタを回す必要はない。 *ループカウンタを使用せずに* ついでいうと >>98 の書き方を推奨してはいない
102 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 12:14:39 ] std::accumulate( &data[0], &data[num], 0 )
103 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 14:12:19 ] >>101 ちょっと>>98 を改造して末尾再帰になるようにしたぞ。 これなら文句あるまい。 #include <stdio.h> int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int nsum(int data[], int data_num, int acc){ return data_num<=0?acc:nsum(&data[1], data_num-1, *data+acc); } int main(void) { printf("%d\n", nsum(a, 10, 0)); return 0; }
104 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 16:37:53 ] WinAPIの関数で、DWORD型で(コールバック)関数のアドレスを渡す ものがあるのですが、 これに自作のクラスのメンバ関数のアドレスを渡すと、DWORDに変換できないと言われ、コンパイルできません。 そのメンバ関数がstaticなら、コンパイルに成功するので、 「メンバ関数は、普通の関数とは構造が異なる」という理由だと思うのですが・・・ メンバ関数のアドレスを渡すことは不可能ですか?
105 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 16:43:43 ] >>104 非staticなメンバ関数≒インスタンス情報をパラメータに取るstaticなメンバ関数 なので、 そのままでは渡せません。素直にstaticなメンバ関数を渡せば宜しいのでは?
106 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 16:47:55 ] ここでエスパー ウィンドウクラスを作ろうとしているなら、 つ [SetProp]
107 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:11:31 ] >>104 その「コールバック関数を引数に取る関数」に、 コールバック関数に渡す値という引数はないか? ところでWindows APIのコールバック関数のアドレスを引数に取るのだったら、 DWORD型ではなく何か関数へのポインタ型になっていると思うのだが、 一体何の関数だ?
108 名前:デフォルトの名無しさん [2007/02/24(土) 17:13:24 ] 初心者です if文の中で処理をしてから判断できるんですか? if(a=5,a==5)みたいな感じ
109 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:16:39 ] こんな感じのこと? int moji; while((moji=getchar())!=EOF) putchar(moji); 典型的なパターンの時以外はやめたほうがいいよ
110 名前:デフォルトの名無しさん [2007/02/24(土) 17:21:20 ] 評価式と別の普通の式をif文の中で分けて使いたいんですが
111 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:22:13 ] やめておいたほうがいい
112 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:26:56 ] >>108 >108の例だと、素直に a = 5; if (a == 5) ...; と書いた方がいい。 醜くなるだけでメリットは殆どない。
113 名前:デフォルトの名無しさん [2007/02/24(土) 17:34:40 ] では例えば if(関数式==1) else if(関数式==1) else if(関数式==1) else if(返り値=関数==1) のときの else if(返り値=関数)の関数にかかる時間を計りたいとき 関数の中で時間を計らないで関数の呼び出されてから終了までの 経過時間を計りたいときはどうすればいいですか? その場合 if(整数A=clock(),評価式) 整数B=clock(); 整数A-=整数Bでいけますか?
114 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:03:27 ] clockは経過時間ではなくCPU時間
115 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:05:28 ] デバッグ目的なら好きにすれば?
116 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:06:31 ] デバッグ目的ならプロファイラがいいと思うけど
117 名前:デフォルトの名無しさん [2007/02/24(土) 18:07:24 ] そのあとの経過時間によって処理を分けるので^^; なにか良い方法があれば教えてください
118 名前:デフォルトの名無しさん [2007/02/24(土) 18:08:46 ] >>114 1000で割れば経過秒数になりますよね?
119 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:10:51 ] CLOCKS_PER_SEC で割る
120 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:11:17 ] なんか激しく無謀なことをしている悪寒。
121 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:16:02 ] ゲームでPCスペックが低い時にフレームスキップするみたいなことをしたい訳だな
122 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:38:30 ] >>113 if(返り値=関数==1) こういうのって修正とかデバッグなどしにくいから俺としてはNG。 返り値=関数; if(返り値==1) 最初からこうならデバッグとか修正とかしやすい。 確かに行数増えるけど 今の俺はそんなこと気にしなくなった。 経過時間は以下みたいに巣りゃいいんじゃナインお st = 現在時間取得 返り値=関数 et = 現在時間取得 経過時間 = et - st
123 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:43:36 ] >>122 それ意味変わってね? ==のほうが優先順位高いよ。
124 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:43:38 ] >>122 >>113 をよく嫁
125 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:46:43 ] >>113 自体エスパーが必要だと思うんだが
126 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:47:50 ] 122じゃないけど、自分も同じことやってたよorz
127 名前:デフォルトの名無しさん [2007/02/24(土) 18:51:23 ] >>125 初心者なんですいません やってみたらできたんで今はclock()を使ってます
128 名前:デフォルトの名無しさん [2007/02/24(土) 20:30:32 ] >>96 1スレッドごとにプールを製作するようです したがって、同一スレッド内では再利用されるので問題ないのですが スレッドを閉じて新しいスレッドを生成すると 新しいプールが作成されて、古いプールが残るようなのです このプールがいつまでも残っているようで困っております 遅レスでもうしわけないです
129 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 20:32:31 ] CRTはソースあるんだから嫁よ。
130 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 20:57:20 ] >>128 「〜ようです」って、何見て言ってるんだ?
131 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 21:04:07 ] >>128 「〜ようです」って、何見て言ってるんだ?
132 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 21:12:55 ] >>128 「〜ようです」って、何見て言ってるんだ?
133 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 21:17:32 ] 何度言えば気が済むんだ?
134 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 21:18:15 ] malloc()/newの類はfree()/deleteしても一般にはOSにメモリを返さないという 超基本的事項を知っているか。 free()されたメモリはOSに返さず次のmalloc()で再利用するのがこうした 関数の基本的な戦略だ。 したがって、一般にプロセスの最初にガバッとmalloc()して大きな仕事をし、 その後free()してもプロセスのワーキングセットは大きいままだ。 これは俗に言う「メモリリーク」ではないのだが、 それが問題になるようであれば、自分でHeapAlloc()なりVirtualAlloc()なりを 用いてカスタムのアロケータを書いて、basic_stringstream<>の テンプレートパラメータとして渡してやるんだな。
135 名前:デフォルトの名無しさん [2007/02/24(土) 22:15:30 ] >>134 ありがとうございます やってみます
136 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 22:18:53 ] HeapAlloc/FreeだってOSに返さないで次のHeapAlloc呼出に再利用するぞ。 HeapDestroyでは流石にOSへ返すが。
137 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 22:35:45 ] Linux、UNIXあるいはMacで、OSの名称やバージョン情報を取得するにはどの関数を使えば良いですか? 例えば、FreeBSD 6.0、Vine Linux 4.0などです。 WindowsはGetVersionExなどで出来ました。
138 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 22:38:59 ] man 3 uname
139 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 23:02:10 ] OSはlinuxです。C/C++勉強してます。 ディレクトリの中のファイルの日付を取得したいのですが、 opendirとreaddir関数使いました。 struct dirent { ino_t d_ino; /* "inode number" of entry */ off_t d_off; /* offset of disk directory entry */ unsigned short d_reclen; /* length of this record */ char d_name[1]; /* name of file */ }; この中に日付無いのですが、どうしたらよろしいでしょうか。 よろしくお願いします。
140 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 23:12:23 ] >>139 つ[stat()]
141 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 23:37:57 ] >>140 レスありがとうございます。 d_nameを元にファイルのpath指定して、 stat()実行して、struct statを取得する感じですか。 なんか大変な感じします。(汗