1 名前:デフォルトの名無しさん [2008/02/20(水) 12:33:41 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.48【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1202141921/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
47 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:36:56 ] freeするならメモリ確保にはmalloc使えということだな。
48 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:37:08 ] >>44 デストラクタです><
49 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:39:04 ] デコンストラクタワロタw
50 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:43:37 ] デコンストラクタ の検索結果 約 1,390 件
51 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:44:45 ] "デコンストラクタ" の検索結果 約 788 件
52 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:46:50 ] >>46 newをオーバーロードしてmallocで実装ということでしょうか?
53 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:49:02 ] >>52 new/delete new[]/delete[] malloc/free 対応関係を間違えるな。
54 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:51:01 ] >>52 T* p = static_cast<T*>(::operator new(sizeof (T))); // 領域のみ確保 new (p) T(); // コンストラクタを呼ぶ(placement new) p->~T(); // デストラクタを呼ぶ ::operator delete(p, p); // placement delete(省略可) ::operator delete(p); // 領域を解放
55 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:51:39 ] #include <new> #include <cstdlib> class c {}; void* p = std::malloc(sizeof (c)); c* obj = new(p) c; //... obj->~c(); //... std::free(obj); malloc/freeでなくても、operator new/delete関数とかでもいいだろうけどね。
56 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:52:20 ] >>52 違う。配置構文newだ。 newは大抵mallocをラッピングしてて効率は悪い。
57 名前:sage [2008/02/21(木) 03:23:25 ] 言語の使い方ではないのですが、一応処理系の一部ということで 質問させて頂きたいのですが、静的リンクされたELFバイナリにおいて、 リンクされているライブラリのバージョンを そのバイナリから知る方法はあるのでしょうか?
58 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 03:24:44 ] すみません・・sageを記入する欄を間違えました。
59 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 07:51:13 ] カレンダー作りたいんで、各月何日まであるか年によって違うのでその法則を 教えて欲しいんだけどスレ違い?
60 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 08:01:08 ] 年によって日数が変わる月は2月だけだろ・・・。 最近の小学校は閏年も教えんのか?
61 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 08:05:52 ] ありがとう2月だけなのか。習ったけど忘れてた
62 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 09:44:16 ] 1752年9月も変わってるな
63 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 10:04:47 ] どうやって生きてるのか不思議だな
64 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 10:07:28 ] カレンダー作るのに当時生きてるかはあまり関係ないかと。 unix系のOS使えるなら、 cal 9 1752 でカレンダー出るな。
65 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:05:21 ] 1752年9月がイリーガルなのは一部の国だけだけどな。
66 名前:デフォルトの名無しさん [2008/02/21(木) 13:11:47 ] class ttt { public: int i; int j; double k; }; int main() { ttt t = {1,2,3.001}; structやclassがこういう風に初期化できるのを最近知ったのですが、これって普通に 使う書き方でしょうか?結構C++長いこと使ってきたけど、知らなかったよ。
67 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:22:04 ] C/C++を勉強し始めて1年の俺的には、クラスならメンバ変数公開しないのでやらない。そこはコンストラクタで。 PODな構造体なら hoge h = {0}; とか、 Win32APIで構造体のサイズを入れる必要がある物は WNDCLASSEX wc = {sizeof(WNDCLASSEX)}; とかやるけど・・・ 俺も疑問なんだけど、 hoge h = {0}; って感じで初期化って普通にやるの? 俺より何年もCやってる先輩が言うには、「そんなんで0フィルされるのか?memset使えよ」って言われたんだが。
68 名前:デフォルトの名無しさん [2008/02/21(木) 13:22:38 ] Cを昨日から勉強しましたが、今日でやめます。
69 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:44:25 ] >>67 「0フィル」が「全ビットを 0x00 で埋める」って意味なら memset() で正解。 ただし「全メンバを 0 で初期化する」なら memset() は間違いで {0} で初期化するのが正解。 この2つはメンバにポインタや浮動小数点数が混ざってると意味が違うので、動作が 異なる可能性がある。 C++ でメンバに POD 以外が混ざってる場合には、 memset() での 「0フィル」は未定義動作につながる。
70 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:47:26 ] >>66 >>39 の使い方が一般の気がする。 コピコン便利だし
71 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:49:23 ] >>67 ポインタや浮動小数点数などでは、 Cのソース上では0と表現される値でも、内部では0以外のビットパターンを持つことがある。 そんな場合にも対応できるので、変数初期化のほうが移植性が高いとされる。
72 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:52:19 ] #include <iostream> using namespace std; template <typename T> void printchar(T c){ cout << c << endl; } int main(void){ cout << "print int" << endl; printchar(10); cout << "print double" << endl; printchar(32e-2); cout << "print char" << endl; printchar('A'); cout << "print char*" << endl; printchar("test char"); cout << "print void" << endl; // printchar(); return 0; } コメントアウトした行でコンパイルエラーなのですが、 引数がvoidだと何もしないっていう処理はどう書けばいいのでしょうか。
73 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:53:37 ] void printchar(){ }
74 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:54:36 ] なるほど。 そういえば、Win32APIとかの解説ページを見ると、memsetで構造体を初期化してる人もいるよね(メンバにポインタがあるにもかかわらず Windowsでしか動かない移植性がないプログラムだから問題ないんか。
75 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:55:35 ] >73 やっぱりそうするしかないですか。 ありがとうございます。
76 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 14:50:44 ] 素朴な疑問なんだけど、 #include <> なんかの"#"ってどんな意味があるんですが? cgiみたいに、特別な物でそうゆう仕様という認識で良いのでしょうか? 初めて触った時はコメントアウトじゃんと思ったりもしましたけど。
77 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 14:53:01 ] >>75 template<typename T>void printchar(T c = 0) {if (c) cout << c << endl;} ではどう? 使うときにはprintchar<char>()のように型を指定する必要があるけど。
78 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 14:54:35 ] >>76 プリプロセッサに対する指令
79 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:01:13 ] >>76 >cgiみたいに、特別な物でそうゆう仕様という ややあたり、起源はいっしょ C++のコンパイルの前に通すテキスト加工スクリプトの様なもの。 もはや意識している人いないれどね。 起源はそうでも、すでにC++の一部機能です。
80 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:07:15 ] printchar('A'); がマンドクセにみえた俺は病気
81 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:11:12 ] 単純にテンプレートのprintcharとは別にinline void printchar() {}を多重定義するだけではだめなの?
82 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:20:40 ] >>81 すでに出てるし、そして当人は二つ書くことになにかご不満のご様子
83 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:29:36 ] C/C++でGUIを実装する方法にはどのようなものがあるのでしょうか? 代表的なものにWinAPIとMFCがあると調べてわかったのですが、どちらも難解そうな上 ニュアンス的なものですが、主流ではないような印象を受けました C/C++で作ったDLLをC#で使う?ような方法にも辿りついたのですが それだと使う側に.NETが必要になるようなので、それなら最初からC#を使った方が…と思います どういった方法がベターなのでしょうか?
84 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:38:12 ] >>83 ↓のページから好みに合ったものを選べ ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E3%83%BB%E3%83%84%E3%83%BC%E3%83%AB%E3%82%AD%E3%83%83%E3%83%88
85 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:44:15 ] 普段は小物を作るのにVisual StudioのリソースエディタとATL/WTLをよく使っているけど、 C++はGUI作るツールに満足なものがないから、GUIに向いていない環境だと俺は思っている。 もっとましな状況になってほしい。 いろんなものが乱立していて決定打がないんだけど、 Windowsでは、Windows APIが最下層で、ほかがそのラッパーになっているので、 自然、Windows APIが共通語彙になっているという面はある。 だから、今何を使うにしても、いつかは素のWindows APIプログラミングに触れていてほしいなと思う。
86 名前:デフォルトの名無しさん [2008/02/21(木) 15:46:41 ] 整数を逆に並べて返す関数は以下でよいですか? 例) 12345→54321 12000→21 int reverseDigit(int input) { int a = input; int tmp[12]; int i = 0; while (a > 0) { tmp[i] = a % 10; a = a / 10; i++; } int res = 0; int n = 1; for (int j = i - 1; j >= 0; j--) { res = res + tmp[j] * n; n = n * 10; } return res; }
87 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 16:27:35 ] >>84-85 なるほど、見た感じWinAPIに一番無難な印象を受けてしまいました Windowsがこの先消えうせることはなさそうですしとりあえずWinAPI触ってみます、ありがとうございました
88 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 17:44:38 ] >>86 試して問題ないならいいんじゃない? 負数で破綻するけど。 それと、一旦各桁に分割した結果を配列で保存するなら、 sprintf()で文字列にしてから逆順にして、atoi()で戻してもいいかも知れない。
89 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 17:48:39 ] int a = input;に意味がないね そのままinputを使えばいい 知っててわざとやってるなら別にいいが
90 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 17:57:34 ] c言語でhttpサーバを作っててわからなくなったので質問させてください。 サーバからクライアントへsendを使ってメッセージを送信した際、 メッセージの送信完了を伝えるには、ソケットをclose(あるいはshutdown) する以外に方法はないですか? つまり、ソケットを閉じずに、コネクションを維持したまま、 送信完了を伝えたいのですが、できませんか?
91 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 17:57:59 ] >>89 意味ある、というか引数いじらないのは鉄則だよ。 一時変数ケチってinputを加工するのは無駄なバグの元。
92 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 18:18:34 ] >>90 HTTPであれば、レスポンスにContent-Lengthを入れれば、クライアント がそのサイズの受信でデータ終了だと思ってくれる。
93 名前:90 mailto:sage [2008/02/21(木) 18:29:55 ] >>92 なるほど、そういう方法なんですね。 助かりました。ありがとうございます。
94 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 20:25:25 ] >>87 C#使った方がいいと思うってもう遅いけど
95 名前:デフォルトの名無しさん [2008/02/21(木) 21:40:29 ] C++ならボーランドが最強 デルファイ言語の環境のまま、言語だけC++
96 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:41:13 ] 正直決定打といえるほどのものじゃない
97 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:41:44 ] でもスタックにVCLのオブジェクト置けないんだよね
98 名前:デフォルトの名無しさん [2008/02/21(木) 21:45:50 ] 物理メモリの未使用量はどう調べられますか?
99 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:48:34 ] >>98 環境を書けよ。でないと答えようが無い
100 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:50:15 ] >>98 パソコンから取り外せば全容量使えるよ。
101 名前:デフォルトの名無しさん [2008/02/21(木) 21:50:59 ] WindowsXPです
102 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:53:40 ] じゃあタスクマネージャだな
103 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:54:02 ] >>101 毒餃子を食わす国の人ですか?
104 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:54:36 ] >>101 GlobalMemoryStatus で調べろ
105 名前:デフォルトの名無しさん [2008/02/21(木) 21:57:57 ] サンクス
106 名前:デフォルトの名無しさん [2008/02/21(木) 22:27:36 ] newやvectorで確保が失敗したかチェックするにはどうすればいいですか?
107 名前:デフォルトの名無しさん [2008/02/21(木) 22:31:16 ] あとメモリが少なくて、確保に時間がかかる場合、途中で止めるか、かかる時間を予測できますか?
108 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:32:24 ] VC9なのですが、SHA-256の定番なライブラリってないでしょうか? JpegのIJGライブラリみたいなものがあると嬉しいのですが
109 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:32:32 ] >>106 長い思考の旅の後には、失敗しないからチェックは不要という結論になるよ。
110 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:43:28 ] >>106 bad_alloc 例外をつかまえる。
111 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:45:29 ] bad_alloc例外が必ず捕まえられる保障はないそうだよ。 by Sutter
112 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:48:48 ] set_new_handler
113 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:52:19 ] >>106 たくさんのレスが付くと思う。 そして、>>109 にたどり着くと思う。
114 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:56:42 ] メモリ確保できなきゃ 大抵はそのまま異常終了するしかない事が多い。 ダウンするとマズいシステムの場合は そうも言ってられないが。
115 名前:デフォルトの名無しさん [2008/02/21(木) 23:19:36 ] ビルドのエラーについて質問です。 timeGetTime関数を呼ぶだけの関数を作成したのですが、 ビルドで以下のエラーになりました。 LNK2019: 未解決の外部シンボル __imp__timeGetTime@0 が関数 "int __cdecl MainRoutine(void)" (?MainRoutine@@YAHXZ) で参照されました。 ソースは以下になります。 #include <windows.h> #include <mmsystem.h> int MainRoutine() { DWORD dwTime; dwTime = timeGetTime(); return 0; } VC2008 Express Editionを使用しています。 他に何か設定が必要なのでしょうか?
116 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:20:20 ] ライブラリのリンクが必要。
117 名前:デフォルトの名無しさん [2008/02/21(木) 23:29:07 ] >115です。 すいません。記述漏れです。 以下の設定はすでにしていました。 「ツール」-「オプション」-「プロジェクトおよび〜」- 「VC++ディレクトリ」-「ライブラリリンク」にて、 C:\Program Files\Microsoft Platform SDK\Lib ほかのライブラリのリンクが必要なのですか? 必要な場合、どこのライブラリをリンクすればいいでしょうか?
118 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:30:16 ] それはライブラリを検索するディレクトリを指定しているだけで リンクするライブラリを選択するオプションではない。 何をリンクすればいいかはググれ。
119 名前:デフォルトの名無しさん [2008/02/21(木) 23:38:58 ] >115です。 今は、ライブラリのリンクが出来てなかったと言うことなんで、 リンクの方法、リンクするライブラリについては、また調べてみます。 回答ありがとうございました。
120 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:46:57 ] ifやswitchってこんな風に書くのあり? if(i==(1||2||3||4||5)) switch(i){ case (1||2||3||4||5): break; }
121 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:48:33 ] おかしくね
122 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:49:51 ] >>120 C++ で operator をオーバーライドすれば可能かもしれませんね
123 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:54:50 ] >>120 caseの中身は定数でよろしく
124 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:01:36 ] >>120 switch(i){ case 1: case 2: case 3: case 4: case 5: break; }
125 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:02:21 ] d caseの方は間違ってるのね ifの方も駄目?
126 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:03:55 ] >>124 ああ、caseでbreak書かなかったらそのまま下までいくからそういう風に書いたらいいのか
127 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:06:12 ] C#では見事に禁止だな
128 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:07:40 ] >>125 文法的に間違いではないが、お前の期待する動作はしないと思う (1||2||3||4||5)は常に真となり、それとiの値が等しいかどうか だよ?これ
129 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:08:18 ] >>125 ifの方も意図しているであろう動作はしない。 ただしコンパイルは通る。警告くらい出してくれるかも知れんが・・・
130 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:11:14 ] ありがとうございます。自分でもためしてみたけど無理だった コンパイル通ってたから上手く動いてると思ってそのままつかってたよ…
131 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:19:40 ] >>127 C#も124みたいにcaseラベルを並べるのはありだと聞いた。
132 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:22:16 ] 並べさせるくらいなら、コンマ区切りで書かせてくれてもいいのにね。
133 名前:デフォルトの名無しさん [2008/02/22(金) 00:27:11 ] クラスの定義と代入を同時にやるにはどうやればいいですか? int a=10; のようにです
134 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:28:19 ] 「代入」 は既に宣言されている変数に対して行う操作なので 同時に出来る訳が無い。 初期化なら別だが。
135 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:30:45 ] operator を使おう
136 名前:デフォルトの名無しさん [2008/02/22(金) 00:30:52 ] 事故解決しました
137 名前:デフォルトの名無しさん [2008/02/22(金) 00:32:34 ] これでできました int main() { class Test{ int x; public: Test (int y) {x=y;} print(){ cout<<x<<endl; } }; Test a=10; a.print(); return 0; }
138 名前:デフォルトの名無しさん [2008/02/22(金) 00:35:31 ] Test a=10; a.print(); a=20; a.print(); もできるんですね C++はすごいですね
139 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:37:27 ] 往々にして望まない機能だけどな。 基本的に引数1つのコンストラクタには explicit つけとけ。
140 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:42:12 ] それよりも、構造体って感じの型でないクラスなのに コピーコンストラクタとoperator =をコンパイラ任せにしているのが嫌だね。
141 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:43:15 ] コンパイラ任せに出来る時は コンパイラ任せでいいよ。
142 名前:デフォルトの名無しさん [2008/02/22(金) 00:48:46 ] 138じゃないですが、 >>139 なんでですか? (本当に理由を知りたいです。)
143 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:59:34 ] #include <iostream> #include <vector> class Vector { public: Vector(size_t size) : m_array(size) { } void output() const { for(std::vector<int>::const_iterator it = m_array.begin(); it != m_array.end(); ++it) { std::cout << *it << ' '; } std::cout << std::endl; } private: std::vector<int> m_array; }; void Foo(const Vector& v) { v.output(); } int main() { Foo(5); ←←←←←←← } これが直感的な挙動ではないことは分かってもらえると思う。 でも、コンパイル通るし、正常に動く。 explicit つけるとこういう時にコンパイルエラーにできる。 それでも Foo(Vector(5)); なら可だが、これは問題ないと感じてくれると思う。
144 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:59:53 ] >>91 どんなバグがでるのですか? 呼び出し側なにか影響でうるのですか?
145 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:01:23 ] input を変更した後に、 input が変更されていない事を前提とした処理を書いてしまうかもしれない。 あるいは、そういう処理があるにも関わらず、 それより前の地点で input を変更してしまうかもしれない。 そうなっていないか注意して探すよりは、 引数をいじらない方が良い。
146 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:08:46 ] みんな仮引数にconstって使わないんだよね。
147 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:09:55 ] 一時期付けてみたけど、 あんま意味ないと思ってやめた。