- 1 名前:デフォルトの名無しさん [2009/07/19(日) 22:32:32 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/ スレを勃てるまでもないC/C++の質問はここで 3 pc11.2ch.net/test/read.cgi/tech/1187521676/ スレを勃てるまでもないC/C++の質問はここで 4 pc11.2ch.net/test/read.cgi/tech/1221633708/ スレを勃てるまでもないC/C++の質問はここで 5 pc11.2ch.net/test/read.cgi/tech/1230516307/ スレを勃てるまでもないC/C++の質問はここで 6 pc11.2ch.net/test/read.cgi/tech/1231564903/ スレを勃てるまでもないC/C++の質問はここで 7 pc11.2ch.net/test/read.cgi/tech/1232983248/ スレを勃てるまでもないC/C++の質問はここで 8 pc12.2ch.net/test/read.cgi/tech/1235921779/ スレを勃てるまでもないC/C++の質問はここで 9 pc12.2ch.net/test/read.cgi/tech/1240022781/ スレを勃てるまでもないC/C++の質問はここで 10 pc12.2ch.net/test/read.cgi/tech/1242300936/ スレを勃てるまでもないC/C++の質問はここで 11 pc12.2ch.net/test/read.cgi/tech/1245059383/
- 263 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 00:21:20 ]
- 今時ポインタがあるプログラミング言語なんてゴミ
らしいのですが いまどき一番需要のあるプログラミング言語は何でしょうか?
- 264 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 00:30:01 ]
- >>263
スレタイ読め ・・・っとただの釣りだったか。
- 265 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 02:05:25 ]
- char (*a)[10];
a = malloc(10 * n * sizeof(char*)); とすれば、n行10列のメモリ領域を確保できると思います。 しかし、実際にこの領域に格納したいデータは、 hoge0、hoge1、…、hoge100、… のように、添え字がついており、長さがどんどん長くなります。 極端な話、char (*a)[100]; のように、十分に大きい値に設定しておけば問題ないのですが、 何かメモリ領域をうまくとる方法はありませんか。
- 266 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 03:06:38 ]
- char (*a)[10];
a = malloc(n*sizeof(char [10])); sizeof(char *)で何をしようと思ったのか理解できないのだが もう少し詳しく書いてくれると良い情報が聞き出せるかもね
- 267 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 04:37:52 ]
- reallocしたいとか
vector使えとか そういう話じゃないかね
- 268 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 05:15:11 ]
- ジャグ配列が欲しいって話だろ
- 269 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 12:06:41 ]
- explicitをコピコンに使うと値渡し・返しができなくなるんだけどそういうもんなの?
- 270 名前:phenix mailto:sage [2009/08/07(金) 16:16:32 ]
- >>269
hoge a=b;で渡せないって意味ならそう。 hoge a(b);で渡せる。
- 271 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 18:47:28 ]
- フェニックスさんキタ!!
- 272 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 12:24:01 ]
- 関数の仮引数名に悩む場合
(どうすれば分かりやすくなるかな?とか) どう考えて付ける?
- 273 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 12:32:22 ]
- 変数名と同じ扱いでいいんじゃない?
- 274 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 12:36:32 ]
- >>273
俺は 同じ型の引数を持つ場合、 void foo(hoge_1, hoge_2) の様にしているんだが、 果たしてこれで分かりやすいと言えるのだろうか。 void foo(hoge_lhs, hoge_rhs) とどっちが分かりやすいだろう? と言うか分かりやすい引数って何だろう?
- 275 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 12:56:01 ]
- ユニークな名前付ける方がいいよ
file_copy(file1, file2) より file_copy( src, dst ) みたいに
- 276 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 13:01:10 ]
- 判り易くしようとすると変数名が長くなりがちだから、
そこらへんのバランスをどうするかが難しいな。
- 277 名前:272 mailto:sage [2009/08/08(土) 13:06:24 ]
- みんなありがとう。
指針とさせてください。
- 278 名前:デフォルトの名無しさん [2009/08/08(土) 16:23:05 ]
- windows xp でファイルの存在を確認したい
プログラムを書きたいのですができなくて困っています。 開発環境はVC++ 2008 Express Edition(win32 プロジェクト)でやっています。 下のプログラムのように、LPCWSTR型にファイルパスを直接代入すれば できるのですが、ファイルパスはstd::string型の変数で扱いたいです。 LPCWSTR lpszFilePath = TEXT("test.jpg"); if( PathFileExists( lpszFilePath ) ) { cout << "指定されたパスにファイルが存在" << endl; } else { cout << "ファイルはありません" << endl; } std::stringからLPCWSTRへの型変換の問題になると思うのですが これがわかりません。
- 279 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 16:34:08 ]
- LPCWSTR は Long Pointer to Const Wide String なので
C++標準に置き換えると const wchar_t *になるよね? なので、std::stringでは扱えません。 std::string を使う場合は LPCSTR を使いましょう。
- 280 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 16:50:05 ]
- >>278
AとWを相互に変換するライブラリがあるらしいよ。使ったことないけど… msdn.microsoft.com/ja-jp/library/87zae4a3(VS.80).aspx #include <atlstr.h> std::string s = "test.jpg"; LPCWSTR lpszFilePath = CA2W(s.c_str());
- 281 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 16:55:57 ]
- 俺も>>279だな
LPCWSTR → LPCSTR PathFileExists → PathFileExistsA
- 282 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 17:03:47 ]
- Standard Edition 以上なら CString ですんじゃうんだけどねぇ。
MFCは嫌い? あ、そう。
- 283 名前:278 mailto:sage [2009/08/08(土) 17:06:36 ]
- >>279-281
ありがとうございます、できました。 string hogeStr = "test.jpg"; LPCSTR lpszFilePath2 = hogeStr.c_str(); if( PathFileExistsA( lpszFilePath2 ) ) { cout << "指定されたパスにファイルが存在" << endl; } else { cout << "no file!!!!!!!!!!!!!!!!!" << endl; } ちなみに>>280さんのATL(#include <atlstr.h>)は Express editionでは使えないみたいです。 ttp://www.microsoft.com/japan/msdn/vstudio/2008/product/express/aboutexpress.aspx もう、やりたいことができたのでいいんですけど・・・ ともかく皆さんありがとうございました。
- 284 名前:278 mailto:sage [2009/08/08(土) 17:09:20 ]
- 更新しわすれた・・・
>>282 そうですね、Cstringも同じですね。 嫌いというか今はただお金をかけたくないんだけなんですけどね・・・
- 285 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 17:18:30 ]
- ナロー文字とワイド文字の混在は厄介だね。
char、wchar_t のかわりに TCHAR マクロを "文字列", L"文字列"のかわりに _T("文字列") マクロを使い、 さらに プロジェクト→プロパティ→構成プロパティ→全般→文字セットで 「設定なし」を選んでプロジェクト全体をshift-JIS標準に。 そうすればlocaleとかwstringとかwcoutとかostream_iterator< wchar_t >とか いちいち考えなくてすむ。
- 286 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 19:16:17 ]
- いやいや、stringのほうを両対応に変えようよ。
typedef std::basic_string<TCHAR> tstring; tstring filePath = TEXT("test.jpg"); if ( PathFileExists( filePath.c_str() ) ) { cout << "指定されたパスにファイルが存在" << endl; } else { cout << "ファイルはありません" << endl; }
- 287 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 20:20:47 ]
- でもその tstring は cout に渡せるときには wcout には渡せず、
wcout に渡せるときは cout に渡せないというような厄介なことになるよ。 Win APIやMFC、ATL側はひとつの名前で char と wchar_t に破綻なく処理を分岐してくれるけど C++ 標準で同じことやろうとすると膨大なマクロなりtypedefなりを組むことになる。 その上、結局プログラマに「それはcharなのかwchar_tなのか」ということを意識させることに。 …と、思う。素直にMicrosoftの標準に従っといたほういい。 Windowsの開発環境は特殊だから。
- 288 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 20:44:49 ]
- toutを作ればいいじゃない
- 289 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 20:56:39 ]
- Microsoft標準に従うというのはプロジェクト全体をshift-JIS標準にすること?
- 290 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 21:07:05 ]
- 汎用テキストマッピング(_T()とかTCHARとか使うやつ)なんて破綻してるから使わないほうがいいよ。
実際の現場で、文字列の編集のある処理で、ワイド文字とマルチバイト文字の両方で 動くように書いてるやつなんて、すごい少数だろ。 さらに、両方でテストしてるところなんて皆無だろうし。 (テスト以前に両方でコンパイルを通してるところもなさそう) 汎用テキストマッピングを使っても、実際には片方でしか動かないコードしかできないし、 いまさらwin9x系に対応する意味とかないし、最初からワイド文字きめうち問題ないよ。 問題ないっていうか、変にワイド、マルチ文字両たいおうしたつもりのコードのほうが 問題おこしそう。
- 291 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 21:16:41 ]
- つーか、相当処理がカツカツじゃなければ、一旦なんらかの内部コードに変換して統一した方がいいと思う。
まぁ、扱う入力データの種類にもよるが。
- 292 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 22:49:27 ]
- >変にワイド、マルチ文字両たいおうしたつもりのコードのほうが問題おこしそう。
まったくそのとおりだと個人的にも思うが tstring のようにC++標準を両対応にするくらいなら まだTCHARとか使っておいたほうが安全だと思う。
- 293 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 00:45:30 ]
- C言語で動画処理をしようと思っています
aviファイル読み込み→キャプチャ→RGBに対してフィルタ処理→表示 というようにしたいのですが、キャプチャしたときにRGBをしまう配列を指定できないでしょうか? 具体的には unsigned char を四つ持つ構造体に対して、ひとつメンバを余らせて一画素ずつ入れたいです 現在OpenCVで試しているのですが、RGBはunsigned char型の配列に自動的にしまわれてしまい、 キャプチャの値を構造体に入れなおすと時間がかかってしまいます これができればOpenCVでなくてもかまわないので、誰かお知恵をお貸しください
- 294 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 01:17:04 ]
- なぜ「ひとつメンバを余らせ」たいのか、OpenCVがキャプチャしてくれた
配列じゃなぜダメなのか?C言語が良いのか? その辺をもう少し詳しく。 でないとDirectShowって言っちゃう。
- 295 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 02:58:51 ]
- 293です、詳しく説明します
実はCUDAというものでGPUを使った画像処理を行っているのですが、それを動画に応用したいのです 簡単にいえばCUDAでは4バイトずつデータにアクセスすると高速化する特性があります そこでひとつ空きを作って無理やり4バイトにし、構造体単位でアクセスを行っています これを空きなしの3バイトにしたところ10倍近く遅くなったので、1バイトのchar型だとさらに遅くなる可能性があります C言語がいいのはCUDAがC言語を拡張したものだからです
- 296 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 03:28:51 ]
- >>295
OpenCVを使うのであれば IplImageを作るときにIPL_DEPTH_8Uにするのではなく IPL_DEPTH_32S又はIPL_DEPTH_32Fにして宣言すれば4Bになるんじゃないでしょうか? imageDataのR,G,Bは8bit*4なのに注意してください。 参考にどうぞ rest-term.com/contents/other/technote/index.php/OpenCV#content_1_6
- 297 名前:293 mailto:sage [2009/08/09(日) 12:55:44 ]
- ありがとうございます!
ためしてみます
- 298 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:08:07 ]
- 引き数にだけ文字列を使いたい時でもconst string&使ったほうがいいの?
- 299 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:12:42 ]
- >>298
何を言っているのかわからん。
- 300 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:21:28 ]
- >>298 もしかしてこういうことか?
void foo(const string& s) { cout << s << endl; } void bar(const char* s) { cout << s << end; } int main() { foo("footest"); // リテラル文字列をstring&に渡す bar("bartest"); // char*に渡す } こういう話だったら、const char* でもいいだろうけど char*とstringが混在すると面倒だから俺は全部stringに統一
- 301 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:55:20 ]
- そんなかんじですね
ヘッダ解析のコストもあるしchar*でわたして必要ならソースでstringにかえればいいかなと・・・
- 302 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:01:04 ]
- C++ code - 21 lines - codepad
ttp://codepad.org/ADzqt4PN struct Animalのstatic constなメンバであるweight = 10; を、Animalを継承したHumanで別の数字に変更したい場合、 このような方法でよろしいでしょうか?
- 303 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:25:57 ]
- >>302
それでおk。 あと struct Animal { static const int weight = 10; }; が他人が作った物である場合、 struct Human : Animal { enum{ weight = 50 }; }; こうやって書き換えた方が良い。 互換性が高い。
- 304 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:06:43 ]
- >>303
互換性ってなんの?
- 305 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:14:18 ]
- >>303
enum って何の略か分かってる?
- 306 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:18:36 ]
- >>305
enumハックしらないの?
- 307 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:20:52 ]
- 互換性って古めのコンパイラだと前者を配列の宣言に使用できないとかそういうこと?
- 308 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:27:30 ]
- いまさらenumハックを自信ありげに言われてもなあ
- 309 名前:302 mailto:sage [2009/08/09(日) 23:18:20 ]
- ありがとうございます。
enumハックで行かせていただきます。
- 310 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:40:46 ]
- よせ、あくまでハックはハックだ
正攻法には劣る
- 311 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:57:49 ]
- >>308
いくつかの環境で開発をしたことがあるなら当たり前の知識である enumハックのコードを見て、enumが何の略かなんて問うのもどうかと思うよねw
- 312 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 00:04:28 ]
- >>305
enumハックをしらないやつがなんでまた偉そうにw
- 313 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 00:06:07 ]
- >>310
劣るかなぁ?どう劣る? 読みづらいとか?
- 314 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 01:22:44 ]
- たびたびすみません、293です
296さんのサイトを見てみたのですが、どうやらこちらの説明不足だったようです 一つのチャンネルを4バイトで表したいのではなく、ピクセルそのものを4バイトで表したい つまり、cvCreateImage(cvSize(x, y), IPL_DEPTH_8U, 4); このようにしたかったのです それで実際に試してみたのですが、うまくいきません キャプチャを cvQueryFrame で行っているのですが、おそらくここでメモリを取り直されているのだと思います 実装部分を探して改良しようとも思ったのですが見つかりませんorz 半分スレ違いみたいな内容ですが、解決方法があったらご教授ください
- 315 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 01:55:20 ]
- >>314
Grabが3yte/pixelで行われる限り、一度は3byte/pixelから 4byte/pixelへの 拡張をしてやらないといけないと思うよ。 OpenCVでやるか(cvCopy?)、自前の関数でやるかは別として。
- 316 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 02:06:10 ]
- >>314
「cuda rgba」でググったらぴったりのものが出てきた。 wiki.livedoor.jp/mikk_ni3_92/d/OpenCV::RGBA%B2%E8%C1%FC%BA%EE%C0%AE
- 317 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 04:48:35 ]
- 生成と同時にコンストラクタに値を与えたいオブジェクトがあるので、
CTest* ctest[10]; for(int i=0;i<10;i++){ ctest[i] = new Ctest(); } と統一してるんですが、最初に要素数を決めなきゃいけないのと、 newとdeleteを使う分、かったるいので vector<CTest*> ctest; for(int i=0;i<10;i++){ ctest.push_back( ? ); } って風にしようとしてるんですが、ここで「?」になにも入れないと 「0個の引数は指定できない」と怒られます この場合「?」の部分はCTestコンストラクタに渡す引数になると思ってたんですが、 引数がない場合はどうすればいいでしょう? やはりnewとdeleteを使わなきゃいかんのでしょうか
- 318 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 05:46:18 ]
- vector<CTest*> ctest(10);
でいけたような。
- 319 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 06:17:46 ]
- >>317
CTest*のvectorでしょ push_backするのはCTest*じゃないの? ctest.push_back(new CTest()); とか ctest.push_back(NULL); とか・・・
- 320 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 07:05:40 ]
- ctest.push_back(new CTest());
とか ctest.push_back(NULL); とか ctest.resize(i+1); ctest[i] = new ctest(); とか試してみたけど、 error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です error LNK2019: 未解決の外部シンボル __CrtDbgReportW が 関数 "public: class Ctest * & __thiscall std::vector<class Ctest *,class std::allocator<class Ctest *> >::operator[](unsigned int)" (??A?$vector@PAVCtest@@V?$allocator@PAVCtest@@@std@@@std@@QAEAAPAVCtest@@I@Z) で参照されました。 Main.obj なにこれ(゜д゜)
- 321 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 07:59:13 ]
- 失礼、ランタイムライブラリをマルチスレッド(/MT)から
マルチスレッドデバッグ(/MTd)に変えたら解決しました。 理屈はわかりませんが・・・ CTest.push_back( new CTest(引数) ); でいけそうですが、この場合、指定のオブジェクトを破棄するとき deleteで指定のアドレスを破棄してから、vectorのポインタを破棄する、 というクドいコードになりますね・・・ かといって、vector<CTest>と、ポインタで持たずにnewを使わなければ 引数付きコンストラクタでの初期化がややこしくなりますし・・・ しかたないですかね
- 322 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 11:36:10 ]
- >>321
それは仕方がない。というかnewした以上、deleteするのは当たり前。 vectorにオブジェクトのポインタをプールするなんてまぁよく聞く話だし。 デストラクタに全要素deleteするコード書いとけ。
- 323 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 11:38:19 ]
- >>321
>引数付きコンストラクタでの初期化がややこしくなりますし・・・ そもそも、ここが判らん。
- 324 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 12:46:32 ]
- >>321
boost::ptr_vectorで解決
- 325 名前:293 mailto:sage [2009/08/10(月) 14:50:51 ]
- >>315
確かにキャプチャ部分がこうなっている以上コピーするしかないですよね Grabを自前で実装できればよいのですが、キャプチャ自体がどのように行われているかさえ まだ理解していないので当分コピーで済ませていこうと思います ありがとうございました >>316 このようなページを知らなかったとはまだまだ勉強不足のようですorz もうちょっと自分で調べてみようと思います ありがとうございました
- 326 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:59:01 ]
- >>321
それなら std::vector<boost::shared_ptr<CTest> > ctest; ctest.push_back(boost::shared_ptr<CTest>(new CTest())); コンパイルして書いてるわけじゃないから何か変だったら適当になおして
- 327 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:40:28 ]
- const char * const p= "有効な文字列p";
const char * const q= "有効な文字列q"; このようなpとqに格納されている文字列が等しいかどうかを調べる場合、 strcmp を使う方法と std::string(p)==q や std::string(p)==std::string(q) とする方法と、どちらが望ましいでしょうか?
- 328 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 19:14:12 ]
- そら、態々メモリ割り当てずに strcmp が速いでしょ。
- 329 名前:327 mailto:sage [2009/08/10(月) 19:17:27 ]
- >>328
ありがとうございます。
- 330 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:26:59 ]
- 男キャラを担当する女声優はわんさかいるけど、
女キャラを担当する男声優なんて聞いたことない
- 331 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:27:39 ]
- 超誤爆
- 332 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:36:20 ]
- どのスレだよw
- 333 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:40:42 ]
- class Aからclass Bへの暗黙の型変換が許されている状況で、
A hoge; として B piyo = hoge; B piyo(hoge); B piyo = (A)hoge; B piyo = static_cast<A>(hoge); これら4つは全く等価だと考えてよろしいですか?
- 334 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 23:27:55 ]
- 少なくとも一番目と二番目は全く違うような。
- 335 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 23:36:36 ]
- >>334
違いますか? どのあたりが違いますか?
- 336 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 02:15:35 ]
- 同じだよ。どれもコピーコンストラクタが呼ばれる。
ときおり初心者が1番目の式を代入と勘違いするけど 普通の教科書にはそれは代入じゃねぇンだよって説明が書いてあるので それを知らないのは教科書をよく読んでいない証拠。 もし書いてないなら、その教科書は資源ごみにでも出したほうがいい。
- 337 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 05:33:53 ]
- すんごい初歩的な質問だと思うんですけど、
deleteで解放をし忘れしているプログラムを何度も動かした場合、 不要なデータはPC上に残り続けるんでしょうか? 溜まったそれらのデータをなんとか解放、削除したい場合は どうすればいいんでしょ?
- 338 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 06:04:39 ]
- 一度プログラムを終了させれば
まともなOSなら deleteしていなくても問題ない。 少なくとも、普通の方法で確保したメモリを プロセスが終了しても解放しないものはまず無い。 メモリ以外のリソースはそうでもない場合もある。
- 339 名前:337 mailto:sage [2009/08/11(火) 06:10:01 ]
- 多謝
- 340 名前:333 mailto:sage [2009/08/11(火) 10:32:22 ]
- >>336
やっぱり全く等価ですよね。 どうもありがとうございます。
- 341 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 10:37:12 ]
- explicitを付けて(1)を使えなくしてやるー
- 342 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 10:53:55 ]
- >>334
こいつ恥ずかしいなwww >>338 メモリ管理問題 ttp://kmaebashi.com/programmer/c_yota/malloc.html 熟読せよ
- 343 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 11:17:26 ]
- >>342
言いたいことがあるなら自分の言葉でどうぞ。
- 344 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 11:24:16 ]
- 共用体について質問です
union AB{ A a; B b; }; void init(union AB ab){ union AB ans; ans = ab; } void main(){ init( (A)10 ); // 10をA型にキャストして引数に与える init( (B)10 ); // 10をB型にキャストして引数に与える } ・・・このソースでなにがしたいかと言うと、 引数に与えた型を判別して、A型ならans.aに、B型ならans.bに 自動的に代入してほしいのです。 考え方が間違えてるのか「AからABに変換できません」とエラーが出ます この場合、どうしたらいいのでしょうか?
- 345 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 11:27:14 ]
- 共用体にA用とB用のコンストラクタを設ける
- 346 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 11:28:05 ]
- >>344
>引数に与えた型を判別して C++ でも使いましょう。
- 347 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 11:29:05 ]
- >>344
まて、その前にクラスはまともに使えるのか? 例えば >>333 この様なclass Aとclass Bを記述することは出来るだけの技量はある?
- 348 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 11:36:51 ]
- クラスは普通に使ってます。
というかこの質問が、同じクラスのメンバ変数が2タイプに分かれる場合があって、 2つ変数を設けて片方を空っぽにするのが気持ち悪いので、共用体を使おうとしてるのです (初期化関数を統一したいのもあります) ただ「共用体にコンストラクタを設ける」といわれるとなんのことやら・・・ 共用体がクラスのように扱える、ということでしょうか
- 349 名前:342 mailto:sage [2009/08/11(火) 11:39:39 ]
- >>343
こいつ(は無知なのに「全く違う」という強い否定を使い それが全くの初歩の話題であったことを知り) 恥ずかしい(とさぞかし思っているだろう)なwww で満足?
- 350 名前:343 mailto:sage [2009/08/11(火) 11:41:05 ]
- >>349
あ、いや、後段の方。
- 351 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 11:41:40 ]
- >>348
クラスと同じように共用体もコンストラクタやデストラクタを持てる union AB{ .... AB(A a){ this->a = a; } AB(B b){ this->b = b; } };
- 352 名前:347 mailto:sage [2009/08/11(火) 11:41:42 ]
- >>348
>クラスは普通に使ってます。 じゃあとりあえず、 自分のコードのunionになっている場所をclassに単純に書き換えて 実現してみてよ。 それがすぐ答えにつながる。
- 353 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 12:06:41 ]
- >>342
理屈上はそうかも知れんが、 free()しないとメモリを管理できてないような気がする。 特にdeleteしないとデストラクタがどう動くかよく分からん。
- 354 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 12:11:00 ]
- つーか、共用体にする意味があるのか?
気持ち悪いと言う理由だけでは意味がなさ過ぎる。 どちらかだけ有効だと言うのであれば、boost::optionalでも使って有効性をチェックすればいいだけの気もするが。
- 355 名前:342 mailto:sage [2009/08/11(火) 12:12:23 ]
- いや俺はfree()しないことに反対な人だから。
ただこういう意見な人も居るよっていいたかっただけだ。
- 356 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 12:12:23 ]
- >>353
deleteしなければデストラクタが動くわけないじゃん。 OSは、クラスの管理までしてくれるわけじゃないよ。
- 357 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 12:13:11 ]
- >>354
boost::optional の使いどころおかしくねぇか? valiantじゃなくて?
- 358 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 12:23:55 ]
- >>357
元質の趣旨が判らんから勝手に推測した。valiantを使うべきならそうしてくれ。
- 359 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 20:28:12 ]
- class hoge {
public: static fuga(); }; これって普通の関数と比べてなんかいいことあんの?
- 360 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 20:35:16 ]
- >>359
静的メンバ関数でググれ
- 361 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 20:38:17 ]
- >>359
1・それがいいか悪いかは別として、似たようなstatic関数が100個くらいあったとき まとめて他のクラスのfriendにできる 2・hogeのstaticじゃないprivateなメンバに触れる
- 362 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 20:55:02 ]
- あぁプライベートメンバに触れるのかそれは便利そうだ
二項演算しとかに使えそう
- 363 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 20:59:09 ]
- とおもったらオペレーターは静的にできなかった・・・
ぬかよろこびだったでござる
|

|