- 1 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 00:25:51 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.63【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1231499251/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
- 296 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 23:59:08 ]
- グローバル変数についての質問です。
C言語の参考書などには「グローバル変数は初期化をしなくてもはじめから0が入る」 と書かれていたので今まで特に初期化処理を追加せずに書いてきたのですが、 プログラムの途中でグローバル変数を初期化(中身を全て0にする)処理を入れる必要が出たので //EDIT_DATAは構造体配列で事前にDATA EDIT_DATA[16][64][34][64]と宣言しています。 memset(EDIT_DATA, 0, sizeof(EDIT_DATA)); という処理を加えたところ途端にメモリの使用量が跳ね上がりました。 最初から0が入っているのであれば、新たに0を入れ直してもメモリの使用量はかわらないと思ったのですが、どうやら違うようなので いったい初期化処理を行っていない宣言した直後のグローバル変数と memsetを利用し初期化処理を行ったグローバル変数では何が違うのかを教えて頂きたいです。
- 297 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 00:16:13 ]
- おまいの使ってるOSが
書き込みが起こるまでは非初期化データ領域(BSS等と呼ばれる)には アドレスを割り当てるだけで物理メモリは割り当てない仕様になっているから。
- 298 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 01:38:45 ]
- >>297
私の知識不足で非初期化データ領域や物理メモリと言われても、ぱっと理解できなかったのですが 以下のような考えでよいのでしょうか? 私の使っているOS(WinsowsXP)の場合 ・関数内で宣言するローカル変数の場合 void main(){ int a; //この時点で非初期化データ領域に変数aの存在が知らされる。 printf("%d\n", a); //この時点では値を代入したわけではないので何が表示されるか分からない(物理メモリにはaが存在しないのでメモリの使用量は増えない) a = 0; //値が代入された(これによりaには0という値が存在するということになり物理メモリに割り当てられメモリの使用量が増える) printf("%d\n", a); //0が表示される(物理メモリにはaが存在する) } ・関数外で宣言するグローバル変数の場合 int b; //この時点で非初期化データ領域に変数bの存在が知らされる。 void main(){ printf("%d\n", b); //0が表示される(物理メモリに割り当てられているわけではないがグローバル変数なので特別にbは0として扱える) b = 0; //値が代入された(これによりbには0の値が存在するということになり物理メモリに割り当てられメモリの使用量が増える) printf("%d\n", b); //0が表示される(物理メモリにはbが存在する) }
- 299 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 06:38:13 ]
- >298
とりあえず環境依存の話だというのは認識しておいてくれ。 まずローカル変数とグローバル変数では確保されるメモリ領域が異なる。 ローカル変数は BSS には確保されない(スタックに確保される)。 非初期化データ領域への割り当てはコンパイラ、リンカによって行われるので実行時に 「知らされる」という表現はおかしい。 物理メモリの割り当ては OS、ローダが行う。 恐らく、書き込みじゃなくて読み込みでも物理メモリへの割り当ては発生すると思われる。 なので memset じゃなくてループで全領域に対してアクセスしてもメモリ使用量は増えないか? 「仮想記憶」でぐぐるといいと思う。
- 300 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 08:00:03 ]
- void fn(int x){〜;};
void fn_nul(int){}; if(a){ fn(a);} と static void (*const_f[2])(int) = {fn, fn_nul}; f[(a>>3)&0x1](a); どっちが効率いいかな?
- 301 名前:300 訂正 mailto:sage [2009/03/08(日) 08:01:30 ]
- static void (*const _f[2])(int) = {fn, fn_nul};
_f[(a>>3)&0x1](a);
- 302 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 08:08:17 ]
- >>299
やはり知識不足で具体的には理解できておらず、考えを上手く文字にまとめる事ができませんでしたが ぐぐりつつ調べてみた結果、何となくではありますがイメージすることができました。 仰るとおりfor文でアクセスした結果もmemsetした際と同じ結果になりました。 もう少し時間をかけてじっくりと理解を深めていこうかと思います。 ありがとうございました。
- 303 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 10:23:48 ]
- CPUアーキテクチャ側から勉強するといいかもね。
俺は「はじめて読む486」という本が参考になった。
- 304 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 10:46:03 ]
- >>301
下の方が効率いい。 ただし、何かコメントしておかないと 可読性が低い。
- 305 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 17:01:16 ]
- >>303
CPUじゃなくOS
- 306 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 19:10:52 ]
- 困ってます。教えてください。
1つはサウンドバッファ書き込み用のCALLBACK関数で、 もう一つはMAINスレッドにあるリードルーチン。 MAINスレッドにあるリードルーチンをある条件時に寝かせ、 CALLBACK関数側から寝てる状態を起こしたい処理なのですが、 何か良い方法ありますでしょうか? sigwait()を使ってできそうなんだが、通常処理なので signalは使いたくないのです。よろしくお願いします。
- 307 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 19:12:40 ]
- >>306
環境依存なので利用環境を書いてね
- 308 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 19:31:42 ]
- 306です。
環境:linux. gcc version 4.3.2 ,SDL(Callback) マルチスレッドではないのですが、CallBack関数側から、 MAINスレッドの寝ている状態を起こせないものかと、、、 MAINスレッドでやっている処理は、標準入力から データ読み込み、固定領域にバッファリングしています。 バッファが一杯だったら、標準入力からの読み込みは しないで寝かせたいのです。(BusyWaitやポーリングはNG) gdk_input_addとgtk_mainの組み合わせで とりあえずできたのですが、gtkを使うのは目的外かと、 よろしくお願いします。
- 309 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 20:08:54 ]
- >>308
pthread.h を覗いてみては? pthread_cond_??? あたりでいけそう
- 310 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 21:11:29 ]
- >>309
サンクスです。チューw pthread_cond_wait(&cond,&mutex); pthread_cond_signal(&cond); 上記で実装しました。動作OKでした。 mutexの使い方は良く判りませんがこれから理解しておきます。 CPUもビジーウェイトにはなっていないのでOKです。ありがとうございました。 (DIONは書き込み規制はいってるの?)
- 311 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 03:45:12 ]
- ATL/WTLを参考にwindowsの簡易クラスライブラリ作ってみてるのですが
(ただのパクリですが・・・もちろん勉強のためです) CStatic : public CWindow { public: CStatic(HWND hWnd) : CWindow(hWnd) {} CStatic& operator=(HWND hWnd) { m_hWnd = hWnd; return *this; } ... }; CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す などのCStaticコンストラクタの初期化がコンパイル通りません。 >error C2679: 二項演算子 '=' : 型 'class CWindow' の右オペランドを扱う演算子は定義されていません。(または変換できません) 考えてみれば派生クラスに基底クラス代入しようとしてるので当然の結果だと思うのですが ATL/WTLではこれが上手くいっているのは何故なんでしょうか? ATL/WTL見たことある方で分かられる方があればご教示ください。
- 312 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 04:09:36 ]
- CStatic& operator=(HWND hWnd)
それ以前にこれ間違ってね?
- 313 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 04:16:54 ]
- >>312
レスありがとうございます。 WTLのをそのまま流用したつもりでしたが; どこが間違ってるのでしょうか?戻り値の参照ですか?
- 314 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 04:27:45 ]
- いや、それだけしかないなら
CStatic text = GetDlgItem(IDC_STATIC); // CWindow型を返す これに当てはまるoperator=が無いじゃん
- 315 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 04:47:48 ]
- >>314
すみません、そもそもoperator=は今回関係ないみたいです。 コンストラクタの初期化で CStatic text(GetDlgItem(IDC_STATIC)); CStatic text = GetDlgItem(IDC_STATIC); 上の2つは同じという認識だったのですが上だけコンパイル通ります; CWindowでは operator HWND() const { return m_hWnd; } を持ってるので初期化構文でこれが適用されるかと期待したのですが。
- 316 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 10:11:14 ]
- IDC_STATICは実際にこう書いてるの?
IDC_STATICは-1でdefineされていて、こういう場面で使えないと思うけど。
- 317 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 19:02:57 ]
- >>316
遅くなりすみません。実際は違う値(オリジナルの値)です。すみません。 例えばATL/WTL解説で有名な↓ここ home.att.ne.jp/banana/akatsuki/doc/atlwtl2/stdctrl05/index.html では CStatic view = GetDlgItem(IDC_STATIC_VIEW); としておられます。
- 318 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:03:55 ]
- >>315
コンストラクタにexplicit付いてんじゃねぇの
- 319 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:49:52 ]
- >>318
explicitは付けていません。変換コンストラクタについてもっと勉強が必要でしょうか; 試しに簡易コードで再現してみました。皆さんの環境ではコンパイル通りますでしょうか? class A { // 基底クラス public: DWORD_PTR a; // データメンバ operator DWORD_PTR() { return a; } A(DWORD_PTR x = 0) : a(x) {} // コンストラクタ A getData() { return A(a); } // 自クラスでキャスト }; class B : public A { // 派生クラス public: B(DWORD_PTR x = 0) : A(x) {} // コンストラクタ B& operator=(DWORD_PTR x) { a = x; return *this; } }; A aaa; B bbb = aaa.getData(); // NG bbb = aaa.getData(); // OK それともこの再現自体が間違ってるのでしょうか・・・?
- 320 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 20:53:33 ]
- >>319
class A に A(a)のコンストラクタは付けないの?
- 321 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:06:28 ]
- >>319
VC2008EEで通ったけど
- 322 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:42:54 ]
- class Aの中でコピイコンストラクタ俺タイプが隠してあるんじゃ?
- 323 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 21:59:40 ]
- [質問内容]
C++で、ヘッダに書いたクラスの宣言の中にあるstatic constなメンバ構造体、 メンバ配列についてお行儀のよい書き方を教えてください。 メンバ構造体の初期化値(たとえば、文字列 "hogehoge" や 10 や 20 といった値)は、cppで持つとして、 文字列や値は同様にメンバ変数として持つのか? それとも、 cppの上の方に無名空間で切った変数を新たに宣言するのか? そもそも前提条件のstatic constな値を持つメンバ構造体や配列は、クラスに持たないで cppの上の方に無名空間で値を作って、ポインタかなんかで受けるのが正しいのか? ちょっと、わからないので教えてください。
- 324 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 22:34:42 ]
- static constならクラス内で初期化しない?
- 325 名前:323 mailto:sage [2009/03/09(月) 22:42:56 ]
- 簡単に言うと、以下のようなクラスを考えてください。
<hoge.h> class CHoge { public: CHoge(){} ~CHoge(){} private: enum { END = 10 }; static const int Array[END]; }; <hoge.cpp> const int CHoge::Array[END] = { 0,1,2,3,4,5,6,7,8,9 //!< ←ここの値をどのように書くとお行儀がいいか? }; >>324 レスありがとうございます。 その場合、マジックナンバなどはどこに宣言してありますか?
- 326 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 22:52:04 ]
- >>325
そのまま数値書いてコメント付けとけばいいんじゃねぇの。 その値をどういう意味があって、どう使うかわからんから ケースバイケースとしか言いようが無いと思うけど。
- 327 名前:323 mailto:sage [2009/03/09(月) 23:05:52 ]
- >>326 レスありがとうございます。
ケースバイケースについて質問なんですが、ユーザーインターフェイスを作成するときにボタンがあったとします。 ボタンに表示する文字列とか,ボタンのサイズを持つ構造体配列を作ると その構造体配列自体で、共通する値が出てきます。 <hoge.h> class CHoge { public: CHoge(){} ~CHoge(){} private: enum { END = 3 }; struct BTN_TAG { int X; int Y; int W; int H; char *Str; }; static const BTN_TAG m_BTN[END]; }; <hoge.cpp> const CHoge::BTN_TAG CHoge::m_BTN[END] = { { 100, 200, 200, 50, "ボタン1" }, //!< ここら辺の100とかの値 { 100, 300, 200, 50, "ボタン2" }, { 100, 400, 200, 50, "ボタン3" }, }; こういう場合は、どのようにするのがお行儀がいいでしょうか?
- 328 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:14:02 ]
- 文字リテラル : リージョン の比次第だけどリージョン固定のクラス作れば?
- 329 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:26:46 ]
- >>327
そのまま100でいいんじゃないかなぁ。 200と50がデフォルトのボタン幅・高さとかだったり 頻繁に調整する必要があるなら、無名名前空間にでも定数作ればいいと思う。 でもまぁ俺だったら、UIの情報はプログラム中に書かず リソースや外部ファイルに書いて実行時に読み込むけど。
- 330 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:27:48 ]
- >>328
返信ありがとうございます。 リージョン固定というのを不勉強で知らないのですが、 CHogeからのみ参照できる、statc constだらけのクラスと考えれば いいでしょうか?
- 331 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:35:33 ]
- template<TwidthX, TwidthY>class Btn{
static struct{int x, y; char *c;}m_BTN[3]; } 追い出すメリットが勝つるメンバは追い出す。
- 332 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:46:04 ]
- >>329
返信ありがとうございます。 考え方として了解しました。
- 333 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 23:59:08 ]
- >>331
返信ありがとうございます。 Btnクラスを作って、CHogeで参照するということでいいでしょうか? (CHogeがメンバクラス(Btn)をもつという解釈でいいでしょうか?) templateにしている理由が理解できていないのですが、お時間があれば説明いただけないでしょうか?
- 334 名前:デフォルトの名無しさん [2009/03/10(火) 04:18:48 ]
- class Game {
char **board; public: void init() { board = reinterpret_cast<char**>(new char[9][9]); } }; こう書くとコンパイルは通るんですが、boardにはBadpointerの値が 入ってます。なにか間違ってますでしょうか?
- 335 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 04:36:16 ]
- 何もかもが間違っているような・・・
なんでキャストしてるのん? そして何ゆえそんな危険なキャストしてるのん? あと、配列の配列は配列のポインタで受けることはできても ポインタのポインタで受けることはできないよ? っていうか、僕も初心者だから意味わからん^^
- 336 名前:デフォルトの名無しさん [2009/03/10(火) 05:50:54 ]
- >>335
ありがとうございます。 char *p[10] = new (char*)[10]; とか出来なくて、あんなコードになってしまいました。 どうすればいいですか? char **p; char *p[10]; とかをnewで初期化するにはどうすればいいですか?
- 337 名前:デフォルトの名無しさん [2009/03/10(火) 06:55:33 ]
- p = new char[10];
- 338 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 10:30:43 ]
- そもそもinit()を呼んでいるのだろうか。
- 339 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 13:26:15 ]
- char** p;
p = new char*[10];
- 340 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 15:44:07 ]
- void init(int sfx1,int sfx2){ // 素敵な cast をどうしても使いたい場合。
board = reinterpret_cast<char**>(new char[sfx1*(sizeof(char*)+sfx2)]); for(int i = 0; i< sfx1; ++i)board[i] = new(reinterpret_cast<char*>(board)+sfx1*sizeof(char*)+(sfx2*i))char[sfx2]; }
- 341 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 16:09:07 ]
- >>340
何がなにやらわけわからんw
- 342 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 17:33:37 ]
- >>340 を理解した上で
char *p[10]; とは char* を 10個用意する事だよ と指摘されればポンと膝を打つ って寸法だ。
- 343 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 18:27:00 ]
- newってtry-catchするのとnothrowするのどっちがいいの?
- 344 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 18:52:35 ]
- >>343
try-cathc も nothrowも付けずにほっとく
- 345 名前:デフォルトの名無しさん mailto:sage [2009/03/10(火) 20:13:46 ]
- 膝を打った後どっちに進むかは読み書きしたコード量に因るかな
- 346 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 01:31:35 ]
- ptr_arrayつかうか、吹っ切れてmallocに先祖返りするかってことかい?
- 347 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 01:48:32 ]
- パッディングの罠に嵌りに逝くか[]演算子のくっ付き方を考えるか
- 348 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 07:51:57 ]
- 初心者が配列 new なんか使うんじゃねーよ。 std::vector にしとけ。
- 349 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 15:13:45 ]
- vector 使うのが正解
下手に深く判ってるコード書いて、おまけに手が遅かったりしたら上司に認められて 他人のクソコードをメンテする係に抜擢されちまうよ
- 350 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 15:37:46 ]
- C++ Coding Standradsでは
生の配列はクラス内部で小さなデータを持ちまわるような場合は使ってもいいって書いてたな、確か。 同じく、生ポインタも局所的な使い方なら可。スマポは便利だがやや使われすぎの嫌いがあるとも。 Googleコーディング標準ではスマポよりもまずスコポの使用を考えたら?って提案してた。
- 351 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 16:08:52 ]
- スコティッシュポールド
- 352 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 16:10:08 ]
- 最近の若い子の省略はよくわからんのぉ
- 353 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 16:13:29 ]
- シコスでは
生配はクラ内で小デを持ちまわるような場合は使ってもいいって書いてたな、確か。 同じく、生ポも局所的な使い方なら可。スマポは便利だがやや使われすぎの嫌いがあるとも。 グルコではスマポよりもまずスコポの使用を考えたら?って提案してた。
- 354 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 16:22:02 ]
- スコポ の検索結果 約 495 件中 1 - 10 件目 (0.43 秒)
スマポ の検索結果 約 1,710 件中 1 - 10 件目 (0.09 秒)
- 355 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 17:25:01 ]
- >>350
scoped_ptrもスマートポインタの一種だよ。
- 356 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 18:42:06 ]
- 局所的、たとえば小さな関数内とかじゃ、なまぽで良いだろ
出来れば、ぽんたを扱わないで良い言語を使い、でC++で無いといけないところだけ 達人がその部分をプログラムする。
- 357 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 18:47:38 ]
- スマポってのも曖昧な言葉だな
auto_ptrなんか心情的にはそう呼びたくないけど一応スマポだし *とかが使えるからってイテレータまでスマポ呼ばわりする奴もいるし 逆にshared_ptr以外はスマポじゃないって奴もいるし スマポって何?
- 358 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 18:50:02 ]
- アホコードを書くDQNを隔離しておくための足かせ
- 359 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 19:00:48 ]
- ポインタのような動きをするものは全てスマートポインタ
具体的に言うと*とか->が使える生ポインタ以外の物
- 360 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 19:02:12 ]
- そーなのかー
- 361 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 19:20:52 ]
- >>358
お舞! それは絶対に正しい。 ポインタすら使えない、つまりC++を扱ってはいけないような奴に、 C++を使わせるのに必要なものだよな
- 362 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 19:27:16 ]
- 自己も相対的にDQNかも知れない場合に備え
自主的に足かせを装着する訳だが
- 363 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 20:32:27 ]
- >>362
ですよね〜。
- 364 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 21:43:09 ]
- ほんとDQNですみません。
- 365 名前:デフォルトの名無しさん [2009/03/12(木) 02:06:14 ]
- ここでC++の勉強法を質問するのはスレ違いでしょうか?
それらしいスレがなかったので、一度ここで聞いてみようかなと… 独学のため、先輩方の意見などをお聞きしたいと思っています。
- 366 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 02:54:55 ]
- おれも知りたいかも
Cやったら、ビジネス的な意味とオブジェクト指向を学びたいので、次はJavaに行くべきか、C++もやったほうがいいのか、迷う C++は、モノにするには、やる範囲が広そうだし、Javaなのかな ビジネス的な意味でC++,C#,Javaの位置付けってどういうもんなんですか?
- 367 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 06:58:49 ]
- スレ違い
- 368 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 12:20:28 ]
- まずビジネス的な意味というのがわからん訳だが
- 369 名前:デフォルトの名無しさん [2009/03/12(木) 19:44:28 ]
- Windows上のC++の質問なんですが、プロパティの中のコード生成のランタイムライブラリーには
/MT /MTd /MD /MDd の4つの選択肢がありますが、デフォルトは/MDdだと思いますが、本のサンプルを実行する際に、 /MTdに変更するように指示があり、実際変更しなければコンパイルできませんでした。 どういう場合に/MTdにしなければだめになるのでしょうか?
- 370 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 20:13:31 ]
- >>369
ソリューションの構成をDebugからReleaseにする ツールバーの下にDebugっていうドロップダウンリストがあるからそこで切り替えろ
- 371 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 20:22:34 ]
- ネットワーク共有ファイルに対してFindFirstFileを行うにはどうすればよいのでしょうか?
例えば \\Server\folder\test.txt にあるファイルに対して FindFirstFile( "\\\\Server\\folder\\test.txt",&data ); とやっても失敗になってしまいます。 ショートパスからロングパスにしたいのですが、、、、
- 372 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 21:58:54 ]
- ドライブにマウントしてから x:\test.txt とかでアクセスすればいいのでは?
- 373 名前:デフォルトの名無しさん [2009/03/13(金) 14:45:20 ]
- 2chトリップ生成プログラム教えてください。
ライブラリ作った人とかいますか?
- 374 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 15:17:00 ]
- 団子さんの出番ですね!!
- 375 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 15:21:22 ]
- やばい、>>374と同じ事が頭に浮かんだ
- 376 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 15:37:46 ]
- >>373
2chのトリップと互換のPHPやらPerlやらの掲示板ソースでも探したらあるよ
- 377 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 15:40:55 ]
- [環境]C++ WindowsMobile向けアプリ(練習でデスクトップ版を作ります)
GoogleCalendarとの同期を取るアプリを作りたいんですが、 最初の認証(ユーザーアカウント&パスワード)をどうやって投げれば いいのかご存知の方いらっしゃいましたら、ご教授願えないでしょうか?
- 378 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 15:44:06 ]
- >>373
PHPのを探してきた $trip = ''; if (preg_match("/([^\#]*)\#(.+)/", $_POST['FROM'], $match)) { $salt = substr($match[2]."H.", 1, 2); $salt = preg_replace("/[^\.-z]/", ".", $salt); $salt = strtr($salt,":;<=>?@[\\]^_`","ABCDEFGabcdef"); $trip = substr(crypt($match[2], $salt),-10); $_POST['FROM'] = $match[1].'</b>◆'.$trip.'<b>'; } cryptがDESかMD5かで結果が変わる
- 379 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 15:55:43 ]
- >>373
Cのソースがあった www.geocities.com/tk2001b/utripper/
- 380 名前:デフォルトの名無しさん [2009/03/14(土) 20:40:26 ]
- using namespace std;
とソースの上に書くのと、 ソース全体を namespace std { ... } というようにnamespaceの中に書くのとは、同じ意味ですか?
- 381 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 20:45:14 ]
- 違います
- 382 名前:デフォルトの名無しさん [2009/03/14(土) 21:00:19 ]
- ありがとうございます。
どう違うか、教えてください。
- 383 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:04:06 ]
- 利用と宣言の違い棚。
- 384 名前:デフォルトの名無しさん [2009/03/14(土) 21:11:37 ]
- わかりました。
後者の場合stdの中で宣言するというだけなので、Main関数を入れたりとかは できないということですね。 ありがとうございました。
- 385 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:22:45 ]
- std 名前空間内に自分で宣言を追加してはいけない。
規格上未定義動作になる。
- 386 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 00:23:57 ]
- std::swapの特殊化は置いてもいいけどね。
- 387 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 00:31:35 ]
- std::swapの特殊化じゃなくて、テンプレートの完全特化が許されてるってことね
- 388 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 01:03:47 ]
- stringのvectorにファイルを一行づつ読み込んで、まとめて別のファイルに書き込むというプログラムを作ってるんですけど
エラーチェックは↓見たいな感じで十分ですかね? #include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; void read(char *file, vector<string> &lines); void write(char *file, vector<string> &lines); int main(void) { vector<string> lines; read("C:/Work/from.txt", lines); write("C:/Work/to.txt", lines); cout << "正常終了" << endl; return 0; }
- 389 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 01:04:39 ]
- void read(char *file, vector<string> &lines)
{ ifstream ifs(file); if(!ifs.is_open()){ cout << "コピー元ファイルを開けない" << endl; exit(EXIT_FAILURE); } while(ifs.good()){ string line; getline(ifs, line); lines.push_back(line); } if(!ifs.good() && !ifs.eof()){ cout << "読み込み途中でエラー" << endl; ifs.close(); exit(EXIT_FAILURE); } }
- 390 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 01:05:31 ]
- void write(char *file, vector<string> &lines)
{ ofstream ofs(file); if(!ofs.is_open()){ cout << "コピー先ファイルを開けない" << endl; exit(EXIT_FAILURE); } vector<string>::iterator i = lines.begin(); while(ofs.good()) { ofs << *i; if(++i == lines.end()) break; ofs << endl; } if(!ofs.good() && !ofs.eof()) { cout << "書き込み途中でエラー" << endl; ofs.close(); exit(EXIT_FAILURE); } }
- 391 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 01:39:45 ]
- while (!feof()) {}
と同じ匂いを感じる。 ところで、 while (...) { string str; ... } より string str; while (...) { ... } の方が、コンストラクタとデストラクタが毎回走らない分、コスト的には良いよね? でも、スコープを限定した方が可読性等の面からは好ましいよね? どっちが良いのかな。
- 392 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 01:44:22 ]
- その辺を言い出したらvectorから見直しだけどな。
- 393 名前:デフォルトの名無しさん [2009/03/16(月) 02:11:37 ]
- >>391
{string str; while(...){...}}
- 394 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 02:26:56 ]
- for(string str; ifs.good();)
- 395 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 02:36:54 ]
- 初期化がループに依存しないならコンパイラが良きに計らってくれると思うよ。
- 396 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 02:40:10 ]
- getline(,)後!ifs.good()でも1回push_backしちゃうのはマズくないか。
|

|