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


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

C/C++小心者スレッドPart1



1 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 06:18:18 ]
プログラミング言語C/C++についての、小心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは>>2以降。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・ぐぐる
 ・マニュアルで探す 
 ・FAQを読む 例えば www.bohyoh.com/CandCPP/FAQ/index.html
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(なるべくそのままで)
 ・実行環境(OS名、コンパイラ名)
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ 
相手は小心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって小心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。


宗教的な話題は禁止します。


367 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 02:04:06 ]
seq1=str.data();

これじゃよ。data() や c_str() の仕様をみるのじゃ。
記録するな。使ったらすぐ捨てろ。わかったな、今畜生。

368 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 02:05:26 ]
>>366
やっぱり釣りなのね?
釣りに決まってる。
釣りではないなんていわせない。
釣りでなくちゃおかしい。
釣りだよね?
釣 り だ よ ね?

369 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 02:11:52 ]
とりあえずわかったことは私はウンコマンということでしょうか。
つまりはチンカス以下。チンチンの先っちょについたティッシュのカスを師と崇めて行けというほどの。

ちょっと出直してくる。ありがとうござました。

370 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 02:16:22 ]
>>366
#include <algorithm>

seq1 = str.data(); → std::copy(str.begin(), str.end(), seq1);
別にmemcpyでもいいんだけど。

371 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 02:21:00 ]
>>366
> const char *seq1 = new char[h];

配列 new なんか使うからだ。
std::vector<char> seq1(str.begin(), str.end());
にしとけば int h も delete seq1 も要らない。

372 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 02:22:41 ]
>>371
そもそもstringのまま扱うのでいい気がしてくる。

373 名前:デフォルトの名無しさん [2009/06/14(日) 18:57:00 ]
int main(){
string seq1;
とすればいい。コピーする手間もない

374 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 19:40:25 ]
すいません、質問宜しいでしょうか?

vc++なのですが、ダブルクリックするとAP画面を開きだすタイプのexe(コマンドプロンプトが開くタイプではないexe)の
ソースコード内にて『cout文』が記述されています。

コマンドプロンプト以外のどこかに内容が出力されていたりするんでしょうか?

分かりにくいと思いますが、よろしくお願いいたします。



375 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 09:27:30 ]
>>374
恐らく、電子の藻屑と消えています。



376 名前:374 mailto:sage [2009/06/15(月) 22:14:59 ]
>>375
ありがとうございました。

377 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 09:22:17 ]
どうしても回収したいなら標準出力をリダイレクトすればファイルに落とせるんじゃないかな。
詳しくは環境依存C/C++スレかWinAPIスレ辺りで。

378 名前:デフォルトの名無しさん [2009/06/30(火) 00:19:00 ]
Linuxアップデートしたらatoi( )無くなって驚いた。
奴は引退したんだな。

379 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 00:43:00 ]
そなの?
うちのLinuxはアップデートしてもいなくなってなかったよ

380 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 01:06:00 ]
itoa()は引退するかもしれないがatoi()は標準関数でしょ

381 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 09:55:51 ]
はい、atoi()はdeprecated3人組の筆頭ですからおいそれとはなくなりませんよ。

382 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:01:01 ]
itoaを標準化しろよ
あるいは%bを

383 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 21:09:00 ]
itoa()はやっぱし簡単にsprintf()で代用できるから標準じゃないのかなあ

それにしてはatoi()にはstrtol()という基数変換関数が用意されているし

いまいち対称性に欠けるよなあ

384 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 09:11:55 ]
Cの標準ライブラリに関しては、対称性なんて考え出したら禿げるよw

385 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 10:38:00 ]
ネーミングにセンスがないのは仕方ないよなあ

昔のCは昔のFORTRANと同じく識別子は先頭の6文字しか
認識しなかったからなあ

だから無秩序な切り詰めで読みにくいったらありゃしない

create()かcreat()になっているし
この当たりはK&Rのジョークにも出てくるが



386 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 11:17:53 ]
このスレまじ勉強になりすぎワロタ

387 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 18:37:21 ]
>>385
creatについては字数制限だという風に広まった方が彼も喜ぶか

388 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 19:48:48 ]
winbase.hについて教えてください。

win32コンソールアプリでプロジェクトを作ると古いwinbase.hが
インクルード対象になってGetProcessHandleCountなどが
定義されていません。
プラットフォームSDKのwinbase.hだと定義されてます。

これはwin32コンソールアプリでは新しいAPIをサポートしていないと
言うことでしょうか。
無理やり古いwinbase.hに突っ込んだら動くには動いたのですが
別の方法で新しいAPI関数を、コンソールアプリで使う方法は
ないでしょうか?


389 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 22:47:35 ]
パスの順番を変える

390 名前:388 mailto:sage [2009/07/02(木) 14:34:04 ]
お返事ありがとうございます。
読み込むインクルードファイルのパスを
変えるということでしょうか。
調べてみます。

391 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 20:46:04 ]
環境変数ならその順番、ツールなら書いた順番
VC++なら設定のとこで上下に動かして優先順位変えられるべ

392 名前:388 mailto:sage [2009/07/03(金) 01:03:15 ]
バージョンは2005なのですがなかなか
設定できるところが見つかりません。

もうちょっと調べてみます。


393 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 02:09:35 ]
インクルードパスの設定はうまくいっていて、
WINVERとかを設定していないだけということはないよな?

394 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 10:49:13 ]
コピーしたら動いたらしいから大丈夫では?
VCの基本だが、、、ツール - オプション - プロジェクトおよびソリューション - VC++ディレクトリ
プラットフォーム[Win32] ディレクトリを表示するプロジェクト[インクルードファイル]
で該当のインクルードパスを追加、もしあるなら上に移動

395 名前:392 mailto:sage [2009/07/03(金) 18:24:08 ]
色々とすみません。

みてみたのですがオプションのプロジェクトとソリューションの下に
VC++の階層がありませんでした。
なぜ出ていないのか調べてみます。



396 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 21:28:58 ]
左の三角クリックしても出てこない?

397 名前:395 mailto:sage [2009/07/04(土) 01:24:57 ]
ありがとうございます。

見当たらないです。
VBの環境設定と、もう一つなんかしかないんです。
何が悪いのやら・・・


398 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 01:38:24 ]
VisualBasicの規定値と全般かビルド/実行あたりか。
変だなあ、、、設定のインポートとエクスポートからリセットしてみては・・・

399 名前:397 mailto:sage [2009/07/04(土) 11:12:02 ]
ありがとうございます。

設定のインポートとエクスポートはありました。
それで初期化して見ます。

非常に助かります。
結果、ご報告させていただきます。


400 名前:399 mailto:sage [2009/07/06(月) 10:06:25 ]
おはようございます。
設定のインポートとエクスポートで
環境の初期化ができました!
早速ディレクトリを色々いじってみます。


401 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 10:49:35 ]
ホビープログラマさんかしら
いじる前に初期化した状態でビルドしてみたらどう?

402 名前:400 mailto:sage [2009/07/06(月) 15:21:49 ]
御助言ありがとうございます。お察しのとおり自分は素人です。
設定初期化後にビルドしても識別子が見つかりませんになりました。
インクルードファイルの上位をSDKにしてもだめでした。
また、コンソールアプリのwinbaseには_WIN32_WINNTの
定数が0500までしかなかったので0501以降のAPIは事実上
未対応なのがコンソールアプリの習いなのでしょうか。
インクルードの優先設定に間違いがないか調べてみます。

403 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:29:59 ]
$(VCInstallDir)include
$(VCInstallDir)atlmfc\include
$(VCInstallDir)PlatformSDK\include
$(FrameworkSDKDir)include

特に変更してない、うちの環境はこんな順になってる。

404 名前:402 mailto:sage [2009/07/06(月) 18:02:09 ]
わざわざありがとうございます。

自分の環境も同様に無印が一番上でした。

となるとインストールパッケージのせいなんでしょうか。
自分のはプロフェッショナルのSP3でした。

405 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 01:33:09 ]
そんで、どこにあるwinbase.hが気に入らないの?
それと、ホビープログラマさんがなんでわざわざプロフェッショナル版を買っちゃった(んだよね?)の?



406 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 01:55:39 ]
プロフェッショナルになりたいからじゃないかな。
自分もお金合ったらプロフェッショナル版ほしかったなぁ。
あの赤いパッケージが3倍開発速度が速くなりそうな感じがしていい。

407 名前:404 mailto:sage [2009/07/07(火) 10:14:45 ]
おはようございます。

visual studio 8フォルダのvcフォルダ直下のincludeフォルダ内のwinbaseです。
ファイルの日付も古いのでコンソールでは新しいAPIは対応してないのかと
思いました。

プロフェッショナルバージョンを購入したのは
おっしゃる通り目標でして。。
今は事務なのですがいつかは開発に行くのが目標なんです。

408 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 14:35:05 ]
C:\Program Files\Microsoft Visual Studio 8\VC\include
うちはここにはwinbase.hないなあ。

ちゃんと情報出しとけば7/2ぐらいにはいろいろ解決できてただろうね。

409 名前:407 mailto:sage [2009/07/07(火) 22:30:29 ]
定数「_WIN32_WINNT」の値を0x501で定義し、VCの設定を初期化し
$(VCInstallDir)includeを最上にした状態で、リビルドしたら
上手くいきました!
includeの参照がPlatformSDKに変わってました。

先達の皆様、色々とありがとうございました。


410 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 23:29:34 ]
#include <stdio.h>
#define N 10

int main(void){
int i, j = 1, x, y;
int d[N][N]={};

/* 三角形を作成 */
for (i = 1 ; i < N ; i++, j = 1){
d[i][0] = 1;
while (j <= i - 1){

d[i][j] = d[i-1][j-1] + d[i-1][j];
j ++;
}
}

/* 三角形の表示 */
for (y = 0; y < N; y++) {
for (x = 0; x < N-y-1; x++)
printf(" ");
for (x = 0; x < y; x++)
printf("%5d ", d[y][x]);
printf("\n");
}
return 0;
}

pc12.2ch.net/test/read.cgi/tech/1245853701/835
pc12.2ch.net/test/read.cgi/tech/1246342847/440
これでどうかな?

411 名前:デフォルトの名無しさん mailto:sage [2009/07/12(日) 09:10:31 ]
なんかひどいものを見た。

412 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 23:10:33 ]
・環境変数の設定がおかしくてヘッダファイルが見つからない
・ヘッダファイル名をタイプミスした
のどっちかじゃないかなあ?

pc12.2ch.net/test/read.cgi/tech/1244942050/957
pc12.2ch.net/test/read.cgi/tech/1245059383/785

413 名前:デフォルトの名無しさん mailto:sage [2009/08/14(金) 17:15:35 ]
新規作成→プロジェクト→Win32→Win32プロジェクト
で作成したVC++のアプリが
Net3.5を入れないと「構成が正しくない…」のエラーで
起動出来なかったのですが

ネイティブなWin32アプリのはずなのに
別途ランタイムが必要だったのはなぜでしょうか?

構成やコードを何度も見直しましたが
Win32 APIしか使用してません


414 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 18:45:59 ]
Microsoft製品にはよくある現象。
Visual Studio 2008なんてC++しか使わない人でも
C#をインストールしなければならないという罠を実装。

415 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 20:06:29 ]
いままでそんな事態に遭遇したことないわ



416 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 23:59:19 ]
.NET3.5を入れるときにたまたまCランタイムのDLLもインストールされただけだろう。
/MTでやっとくと解決するかもね

417 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 13:28:48 ]
リリースビルドにした?

418 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 20:02:59 ]
>>416
/MTでやったらエラーは出ず
Net3.5を入れなくても動作しました

>>417
もちろんリリースビルドのexeです


VS2008で作ったのをXP SP2で確認したのだけど
特別なAPIを使った訳でもないし

ネイティブなWin32アプリが動かなかった原因は未だ分からず


419 名前:417 mailto:sage [2009/08/18(火) 00:27:15 ]
>>418
状況から察するに別マシンで動かしてるんだよね
もちろんリリースビルド、というのだから、もちろんランタイムDLLも別マシンにインストールしている?

420 名前:デフォルトの名無しさん [2009/08/18(火) 04:20:34 ]
WIN APIのみのネイティブなアプリなら
クライアント側は他にランタイムは不要じゃないの?

自分は開発したことないから詳しくは知らないけど


421 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 09:58:07 ]
ここでいうランタイムはC標準関数のランタイム
/MTはスタティックリンク
/MDはダイナミックリンク(DLL)

422 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:12:37 ]
>>416の1行目が正解のはず。

その場合、.NET Frameworkを入れずともVisual C++ランタイムだけをインストールすればいい。
現在、最新のはこれ。
VC++ 2005
www.microsoft.com/downloads/details.aspx?FamilyID=766a6af7-ec73-40ff-b072-9112bab119c2&DisplayLang=ja
VC++ 2008
www.microsoft.com/downloads/details.aspx?FamilyID=2051a0c1-c9b5-4b0a-a8f5-770a549fd78c&DisplayLang=ja

423 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 02:31:50 ]
>>422
みんな正解を言っている。
そんで、Win32APIだけしか使っていないのにmsvcrtを入れなければならない理由は何?
というとこまで進んでたんじゃないの?

424 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 02:34:32 ]
もちろん、>>417も、
ランタイムをインストールしたが動かない
→Debugビルド版のdllは頒布されていない
という穴にはまりやすいという点で有意義

425 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 14:26:00 ]
つまりWin32 APIのみのソフトでも
ランタイムから何らかの機能を使っていて
単独では動作不可ということか

そのランタイムは何かと一緒にインストされる事多いし
普段は目に見えない部分だから勉強になるなぁ



426 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 17:34:19 ]
>>425
本当にWin32 APIだけで組めばCランタイムはいらないよ。
printf()もmalloc()もスタートアップルーチンも使えないけどな。


427 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 17:39:44 ]
マングリングの兼ね合いで同一バージョンでビルドされたDLLが必要になったりしないもんなの?

428 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 17:51:20 ]
全てを同一バージョンでビルドするのが前提でも、extern "C"するのが普通だと思う。

429 名前:デフォルトの名無しさん [2009/08/20(木) 21:24:16 ]
すいません、質問させてください。

AfxBeginThreadを使ってマルチスレッド処理をおこなっているのですが、
制御関数の中でreturnして終わらせているはずなのに、
AfxBeginThreadの戻り値のCWinThread*が生きたままになっています。

そこで制御関数の中でおこなっているreturn処理に問題があるのではないかと
考えているのですが、

rerturn 0

return -1
ではスレッド終了の動作に何か違いがあるのでしょうか?

430 名前:429 [2009/08/20(木) 22:22:31 ]
何度もすいません。質問を変えます。
CWinThread* th;
th = AfxBeginThread(func,this);

uint aaa::func(LPVOID lpvThis)
{
〜略〜
if(){
 return 0;
}
else{
return -1;
}
}



1.AfxBeginThread内でreturnした時点でスレッド自体は終了しているが、『th』は生成されている。
  (th->m_hThreadはnullだがthはnullではない)という認識でよろしいでしょうか?
2.returnされた値が0か-1で動作上違いはあるのでしょうか?
3.returnされた値が0か-1でthの中身は違うのでしょうか?


431 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 23:27:28 ]
m_bAutoDeleteがFALSEの場合はスレッド作成側で破棄しないとダメだよ。
自動で破棄されるようにするには、サスペンド状態で開始し、m_bAutoDeleteをTRUEにし、リジュームする。

432 名前:429 [2009/08/21(金) 10:36:16 ]
429です。
あれからいろいろ調べました。

430の問について
>>2.returnされた値が0か-1で動作上違いはあるのでしょうか?
ない。GetExitCodeThreadを使って戻り値を判別しようと思えばできる。

>>3.returnされた値が0か-1でthの中身は違うのでしょうか?
違わない。AfxBeginThreadが実行された時点でthは生成される。
制御関数内でreturnされた値によって生成される、されないが決まるものではない
(厳密に言うとreturnされた時点でth->m_hThreadの値が変わるので、違うといえば違うのだが、、、)

というところまでです。

まだ分からないのが1なのですが、
一度生成された『th』が自動的にnullになることはあるのでしょうか?
431さんの言うとおり、サスペンド状態で開始し、m_bAutoDeleteをTRUEにし、リジュームすれば
『th』は自動的にnullになるのでしょうか?
逆にサスペンド状態で開始せず、リジュームしない状態ならばth』が自動的にnullになることはありえないのでしょうか?


431さん、ありがとうございます。
m_bAutoDeleteなのですが、あれって初期値はtrueですよね。
m_bAutoDeleteがtrueの場合はサスペンド状態で開始、リジューム等の処理をおこなわなくても自動的に破棄されるのでしょうか?





433 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 13:48:43 ]
class CTest
{
  private:
    int a;
  public:
    setValue(int val); // valをaに格納
};

CTest test;
test.setValue(10);
sprintf(buff,"%d",test);

こうやると10がbuffに出力されるんですが
これはよくないやり方ですよね (稀に不正な結果になりました)

test+=10;
if (test>=10) ...
++test;
int val=(int)test;

こういうのはoperatorを使えばaを対象にさせることができますが

sprintf(buff,"%d",test);

やはりこういうふうにtest単体だけを置いても
実際にはtest.aが返るようにするのは無理でしょうか?
何らかのoperatorが暗黙で呼ばれないかと思ったのですが
どれを使っても駄目でした

434 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 13:59:53 ]
>>433
一応C++ではiostreamを使うべしということになっている

435 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 15:49:04 ]
>>433
intへの変換を定義して
sprintf(buff,"%d",(int)test);
ってやるのは?



436 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 17:45:22 ]
>>434
iostreamって<<とかするやつですよね?
これってあらゆるケースで機能するんでしょうか?
出力以外でも普通の変数のように振舞いたいんです

//void func(int);
func(test); // test.aが渡ってほしい

>>435
もちろんoperator intなどもやってます
でもこの書き方はintという型でほしいからであって
普段は型を意識しないようにしたいんです

437 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 17:58:19 ]
>>436
> //void func(int);
> func(test); // test.aが渡ってほしい
intへの変換が定義されていれば、そのように振る舞う

> 普段は型を意識しないようにしたいんです
プログラマが型を意識せず、引数の型を意識しないprintf系関数を用い、誰が型を判断するのか。
ビャーネはそれが嫌いでiostreamを使うようにすべきと主張しているのではないか

438 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 19:34:19 ]
>>437
>> func(test); // test.aが渡ってほしい
>intへの変換が定義されていれば、そのように振る舞う
おっとすいませんこれは問題なかったですね
型がわからないsprintfなどが問題でした

>ビャーネはそれが嫌いでiostreamを使うようにすべきと主張しているのではないか
うーんなるほど
ちょっとiostreamを考えてみます

439 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 00:12:28 ]
関数の引数でどの型でも指定出来るようにしたいのですが
ポインターを使ってアドレス渡しをする方法以外に
何かないでしょうか?

printfの変数指定する引数のような感じです

440 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 01:15:44 ]
>>439
printf: 可変個引数(1番目の引数、書式文字列で引数の型を判別)
iostream: 想定される型に対して全部多重定義しておく

ほか、場合によってはテンプレートやBoost.Anyという手も使える。

441 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 13:24:37 ]
何をしようとしてるかに依るだろうね。比較的一般的な型が扱える関数
なら template が一番自然に思う。swap みたいに。ただ、swap は
定義されてるし、アドレス与えてるけど。

442 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 05:41:24 ]
質問があります。
C++でオブジェクトを作るとき
1)MyObj = a;
2)MyObj = new MyObj();

上の違いって、1はスタック上にオブジェクトを作っている
2はヒープ上にオブジェクトを作っている
というような解釈でいいのでしょうか?
ということはJavaやC#は、基本的にプリミティブタイプ以外
オブジェクトはすべてヒープ上に作られているということですか?

443 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 07:44:10 ]
>>442
1)と2)の例がおかしいし、C++がそうだとしてそれをJavaやC#にも当ては
めるのは論理的ではない。



444 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 12:17:33 ]
>>443
すみません
1)MyObj a;
でした・・・
理論的ではないのでしょうか?
C++でもヒープ上で使われなくなったオブジェクトをガービッジと呼ぶと聞いたので根本的な部分は一緒なのかな、と思いまして・・・

445 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 12:37:23 ]
>>444
・>443は「論理的ではない」と指摘している。「理論的」かどうかは言及していない。
・例がおかしいのは結局直っていない。
・「ヒープ上で使われなくなったオブジェクト」は「ガービッジ」とは呼ばれない。
・JavaやC#の実装がC++と同じである保証はない。



446 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 13:00:25 ]
garbageのカタカナ表記ってJISとかで決められてるの?

447 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 13:03:02 ]
ガベージ ガーベジ ガーベージ ガーベッジ ガービッジ
この辺はどれでもまあ通じるからいいかなって思うわ
ガベッジはイマイチ。

448 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 14:49:20 ]
>>445
いやgarbageって呼ばれるから。出直してこい

449 名前:429 [2009/08/25(火) 15:55:43 ]
皆さん、失礼します

AfxBeginThreadにて生成されたスレッドのm_bAutoDeleteの値がtrueであるにもかかわらす
破棄されないことがあるのはなぜでしょうか?

450 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 16:02:08 ]
>>442,444
で、文意を汲みとってあげると
1) MyObj a;
2) MyObj* a = new MyObj;
だとして、C++でさえ1がスタックで2がヒープとは限らない。

まあ普通に使われるWindowsやUNIXの処理系なら、前者はグローバル変数
やstatic変数じゃない自動変数ならスタックに確保されて、後者は
operator newで変なことしてなければヒープに置かれると思う。

C#やJavaでどうなるかは、処理系のソースを見たことないので何とも言
えない。処理系がじゅうぶん賢ければ、newしてたってスタック上にオブ
ジェクトを置くことは技術的に可能だと思う。


451 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 16:52:40 ]
newするオブジェクトの実態をスタックに置く最適化は「エスケープ解析」という名称で有名。Javaはやっている。
逆に、MyObj a;をヒープに置くのは、C++/CLI(VC++で.NET Frameworkを対象にコンパイルしたとき)で行われることがある。
まあ、そんな例外的な事象もある。

452 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 16:58:20 ]
>>449
AfxEndThreadは呼んでるのかな

453 名前:429 [2009/08/25(火) 17:27:49 ]
呼んでませんね。制御関数はreturnで終了させています。

制御関数を終わらせるにはreturnとAfxEndThreadの2つの方法が存在するが、
どちらでもOKだという認識です。

これが既に間違っているのでしょうか?

現在は431さんの方法
>m_bAutoDeleteがFALSEの場合はスレッド作成側で破棄しないとダメだよ。
>自動で破棄されるようにするには、サスペンド状態で開始し、m_bAutoDeleteをTRUEにし、リジュームする。
で試しています。


454 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 17:47:03 ]
>>453
正常終了じゃないのにreturnで終わってるとか。

455 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 18:05:37 ]
クラスについての質問なんですがあるサンプルプログラムで、

class Test01 {
protected:
int hoge01, hoge02;
public:
Test01();
~Test01();
}
// コンストラクタ
Test01::Test01() : hoge01(10), hoge02(20) {}

の様な部分があるんですがこの Test01::Test01() の後に続く : hoge01(10), hoge02(20) という記述の仕方は一体なんなんですか?
その後のプログラムの動作からメンバ変数に値を代入しているというのは分かるのですが、どうもはっきりしてなくもやもやします。
なのでこの書式の具体的な動作と名称を教えて下さい。



456 名前:429 [2009/08/25(火) 18:15:16 ]
>正常終了じゃないのにreturnで終わってるとか。
正常終了じゃないときはreturnで終わらせてはいけないのでしょうか?

あと正常終了かどうかはどうやって判断すればいいのでしょうか?
自分の作った独自のロジックの中での正常かエラーかなんて
AfxBeginThreadの戻り値には関係ないと思うのですが、、、

それとも制御関数の中でエラーが発生してスレッドが落ちてしまった時に
AfxBeginThreadの戻り値はnullに戻らずそのままになってしまうということなのでしょうか?
ついでにそのときに画面には何もエラーが出てこないものなのでしょうか?

457 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 18:20:49 ]
>>456
俺もよく知らないで書いてんだけどね。
これ見ると正常終了以外はreturn使ってはいけないように見えるよね。
msdn.microsoft.com/ja-jp/library/2s21xzfe(VS.80).aspx

スレッドで使用しているリソースはすべて解放し終わってから抜けてる?

458 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 18:26:11 ]
>>455
メンバ変数を初期化する初期化子
初期化と代入の違いはメンバ変数がクラス型になるとわかる

459 名前:429 [2009/08/25(火) 18:28:09 ]
>>457
本当ですね。

スレッドの正常終了は
「 AfxEndThread 関数を使うことも、return ステートメントを使うこともできます。」
と書かれているのに対し、
スレッドの中断は
「終了するスレッドから AfxEndThread を呼び出すだけです。」
と書かれていて、returnには一切触れていませんね。

何でもかんでもreturnで返しているのが原因かなぁ、、、


460 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 18:35:44 ]
>>458
ありがとうございます

461 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 18:58:49 ]
>>455
メンバ変数のコンストラクタ呼び出し
作成時にパラメータを必ず受け取る必要のあるクラスオブジェクトや基本クラスがあるときなんかに必要になる
ちなみに変数名(初期化データ)はローカル変数宣言時でも使える, 代入演算処理が不要になるおまけつき
void hoge(){ int a(0); // aを0で初期化 };


462 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 19:08:50 ]
>>461
ご丁寧にどうもありがとうございます、参考になりますm(_ _)m

463 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 19:58:05 ]
>>459
少なくともreturnで終了させる場合はデストラクタも呼ばれ正常終了する。
異常終了とはデストラクタが呼ばれないことを覚悟して強制終了させることだと思う。
msdn.microsoft.com/ja-jp/library/2s21xzfe(VS.80).aspx
はAfxEndThreadで終了させる場合にデストラクタが呼ばれるとはどこにも書いてない。
MFCのAfXEndThreadは知らないが、Win32のEndThreadはデストラクタは呼ばれない。
ランタイムの_endthreadExも同様だけど、returnで終了した場合はデストラクタが呼ばれてから_endthreadEx
が呼ばれるので問題ない。


464 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 19:59:27 ]
>>463訂正
Win32のEndThread X
Win32のTerminateThread O


465 名前:429 [2009/08/25(火) 20:53:01 ]
>>463
そうなんですか、詳しい説明、ありがとうございます。。。
原因わけとして、returnで返すことは何も悪くないと。

デストラクタが呼ばれないと、スレッドが生きたままになってしまうことがあるということか、、、

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





466 名前:デフォルトの名無しさん [2009/08/25(火) 20:58:02 ]
char* pool = new char[100];
Hoge* ptr = reinterpret_cast<Hoge*>(pool);

というコードがあったとして、
delete ptr; よりも delete [] pool; が呼び出された場合、
ptrは解放されずにメモリリークを起こすことになるんでしょうか?

467 名前:デフォルトの名無しさん mailto:sage [2009/08/25(火) 21:03:05 ]
というか、Hoge を new したわけではないのだから、Hoge を delete すべきではない
delete は new した char[100] に対してのみ行うべき






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<246KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef