C/C++小心者スレッドP ..
[2ch|▼Menu]
371:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/06/14 02:22:41
>>371
そもそもstringのまま扱うのでいい気がしてくる。

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

374:デフォルトの名無しさん
09/06/14 19:40:25
すいません、質問宜しいでしょうか?

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

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

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



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

376:374
09/06/15 22:14:59
>>375
ありがとうございました。

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

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

379:デフォルトの名無しさん
09/06/30 00:43:00
そなの?
うちのLinuxはアップデートしてもいなくなってなかったよ

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

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

382:デフォルトの名無しさん
09/06/30 19:01:01
itoaを標準化しろよ
あるいは%bを

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

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

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

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

385:デフォルトの名無しさん
09/07/01 10:38:00
ネーミングにセンスがないのは仕方ないよなあ

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

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

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

386:デフォルトの名無しさん
09/07/01 11:17:53
このスレまじ勉強になりすぎワロタ

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

388:デフォルトの名無しさん
09/07/01 19:48:48
winbase.hについて教えてください。

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

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


389:デフォルトの名無しさん
09/07/01 22:47:35
パスの順番を変える

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

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

392:388
09/07/03 01:03:15
バージョンは2005なのですがなかなか
設定できるところが見つかりません。

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


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

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

395:392
09/07/03 18:24:08
色々とすみません。

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

396:デフォルトの名無しさん
09/07/03 21:28:58
左の三角クリックしても出てこない?

397:395
09/07/04 01:24:57
ありがとうございます。

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


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

399:397
09/07/04 11:12:02
ありがとうございます。

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

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


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


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

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

403:デフォルトの名無しさん
09/07/06 16:29:59
$(VCInstallDir)include
$(VCInstallDir)atlmfc\include
$(VCInstallDir)PlatformSDK\include
$(FrameworkSDKDir)include

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

404:402
09/07/06 18:02:09
わざわざありがとうございます。

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

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

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

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

407:404
09/07/07 10:14:45
おはようございます。

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

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

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

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

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

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


410:デフォルトの名無しさん
09/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;
}

スレリンク(tech板:835番)
スレリンク(tech板:440番)
これでどうかな?

411:デフォルトの名無しさん
09/07/12 09:10:31
なんかひどいものを見た。

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

スレリンク(tech板:957番)
スレリンク(tech板:785番)

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

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

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


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

415:デフォルトの名無しさん
09/08/16 20:06:29
いままでそんな事態に遭遇したことないわ

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

417:デフォルトの名無しさん
09/08/17 13:28:48
リリースビルドにした?

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

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


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

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


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

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

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


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

422:デフォルトの名無しさん
09/08/19 00:12:37
>>416の1行目が正解のはず。

その場合、.NET Frameworkを入れずともVisual C++ランタイムだけをインストールすればいい。
現在、最新のはこれ。
VC++ 2005
URLリンク(www.microsoft.com)
VC++ 2008
URLリンク(www.microsoft.com)

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

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

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

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

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


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

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

429:デフォルトの名無しさん
09/08/20 21:24:16
すいません、質問させてください。

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

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

rerturn 0

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

430:429
09/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:デフォルトの名無しさん
09/08/20 23:27:28
m_bAutoDeleteがFALSEの場合はスレッド作成側で破棄しないとダメだよ。
自動で破棄されるようにするには、サスペンド状態で開始し、m_bAutoDeleteをTRUEにし、リジュームする。

432:429
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/08/21 13:59:53
>>433
一応C++ではiostreamを使うべしということになっている

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

446:デフォルトの名無しさん
09/08/25 13:00:25
garbageのカタカナ表記ってJISとかで決められてるの?

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

448:デフォルトの名無しさん
09/08/25 14:49:20
>>445
いやgarbageって呼ばれるから。出直してこい

449:429
09/08/25 15:55:43
皆さん、失礼します

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

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

452:デフォルトの名無しさん
09/08/25 16:58:20
>>449
AfxEndThreadは呼んでるのかな

453:429
09/08/25 17:27:49
呼んでませんね。制御関数はreturnで終了させています。

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

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

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


454:デフォルトの名無しさん
09/08/25 17:47:03
>>453
正常終了じゃないのにreturnで終わってるとか。

455:デフォルトの名無しさん
09/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
09/08/25 18:15:16
>正常終了じゃないのにreturnで終わってるとか。
正常終了じゃないときはreturnで終わらせてはいけないのでしょうか?

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

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

457:デフォルトの名無しさん
09/08/25 18:20:49
>>456
俺もよく知らないで書いてんだけどね。
これ見ると正常終了以外はreturn使ってはいけないように見えるよね。
URLリンク(msdn.microsoft.com)(VS.80).aspx

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

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

459:429
09/08/25 18:28:09
>>457
本当ですね。

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

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


460:デフォルトの名無しさん
09/08/25 18:35:44
>>458
ありがとうございます

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


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

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


464:デフォルトの名無しさん
09/08/25 19:59:27
>>463訂正
Win32のEndThread X
Win32のTerminateThread O


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

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

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



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

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

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

468:デフォルトの名無しさん
09/08/25 21:20:33
ポインタをキャストしてるだけだから参照してるアドレスは同じってことだ

469:デフォルトの名無しさん
09/08/25 21:21:05
>>467
なるほど。
newはnew、キャストはキャストってことですね。
ありがとうございます。

470:デフォルトの名無しさん
09/08/26 02:42:25
>>468
だからといって ptr を用いてdeleteできるとは思わんがね

471:デフォルトの名無しさん
09/08/26 10:06:16
デストラクタだけの問題だ

472:デフォルトの名無しさん
09/08/27 19:08:10
BYTE a[10],b[5];
としてaとbの配列を結合したい場合
新しい配列へ最初にa、次にbと
ループでコピーする以外に良い方法はありませんか?

強引に普通のcharとしてstrcatすると
当然ながら上手く結合されなくて


473:デフォルトの名無しさん
09/08/27 19:13:32
memcpy()

474:デフォルトの名無しさん
09/08/27 20:20:22
>>473
助かりました

475:デフォルトの名無しさん
09/08/29 03:00:17
ファイルの後ろから指定サイズ分の領域を削除したいのだけど
先頭から削除領域までをコピーしたファイルを新たに作り
その後前のファイルを消すやりかたではなくて
直接その領域を無効化するにはどうすれば良いですか?

476:デフォルトの名無しさん
09/08/29 03:15:13
>>475
対象 OS のファイル操作 API を調べると良いよ。

477:デフォルトの名無しさん
09/08/29 08:25:48
CreateFileで開いたら
SetFilePointerで削除したいところまで移動させて
SetEndOfFileで切り捨てられる

478:デフォルトの名無しさん
09/08/29 15:14:49
>>476-477
感謝します

479:デフォルトの名無しさん
09/08/30 01:59:29
0x1234L
のように末尾に付く
Lの意味や読み方ってなんでしょう?

480:デフォルトの名無しさん
09/08/30 02:02:15
その数値がlong型であることを表す
読み方は「エル」でいいんじゃね?

481:デフォルトの名無しさん
09/08/30 02:03:45
>>479
整数リテラルの型を long にする指定。
読み方って、どういうこと?「える」とか、そういうの?

482:デフォルトの名無しさん
09/08/30 02:04:29
うは、ごめん。

483:デフォルトの名無しさん
09/08/30 02:13:27
サフィックスという言葉を知りたかったんじゃないのかと

484:名無しさん@そうだ選挙に行こう
09/08/30 03:45:26
なるほど、詳しい解説ありがとうございました

485:デフォルトの名無しさん
09/09/05 19:54:04
リストボックスでデータが追加されると
自動で最終行へスクロールするようにしたいのですが
LB_GETCOUNTで項目数取得 → LB_SETCURSELでその行へ移動
とやっても上手く行きません

どうやればいいでしょうか?

486:デフォルトの名無しさん
09/09/05 20:02:23
>>472
最初から連結したバイト列を保存する配列を用意しておいて、
前半をAとして使って後半をBとして使うのではダメなのか?


>>485
そのあんたの使っているリストボックスとやらが含まれているライブラリのマニュアルを読んでください。
私には、それがどんなものかは想像するくらいしかありませんから。

487:デフォルトの名無しさん
09/09/05 20:29:28
>>485
LB_SETCURSELのインデックスは0からのはずなのでLB_GETCOUNTの行は範囲外ではないか?

488:デフォルトの名無しさん
09/09/06 01:42:00
ReadFileでファイルからデータを読み込み
ComboBoxへリストとして追加したいのですが
改行ごとの読み込み処理は皆さんどうやっていますか?

現在C++へ移行中で.NetではReadLineで簡単に出来たのですが
なかなか良い方法が見つからず数日ほど悩んでいます

489:デフォルトの名無しさん
09/09/06 02:02:46
その流れだといろんな事が簡単にはできなくなるから覚悟しておいた方がいいと思うよー

490:デフォルトの名無しさん
09/09/06 09:47:42
>488
改行単位で読むだけなら getline じゃないの?

491:デフォルトの名無しさん
09/09/07 23:05:18
ウィンドウサイズで
大きさを制限する方法なら沢山出てくるのに
矢印自体を無効化する方のが見つからない

案外スタイル指定だけで出来たりするのかな

492:デフォルトの名無しさん
09/09/07 23:10:16
WindowsならWS_POPUPにしてWS_THICKFRAMEを外せばおk

493:デフォルトの名無しさん
09/09/08 16:42:30
>案外スタイル指定だけで出来たりするのかな
その通り

494:デフォルトの名無しさん
09/09/26 03:42:47
for (int i=0;i<N;i++)
{
    //処理A
    //処理B
}
より
for (int i=0;i<N;i++)
{
    //処理A
}
for (int i=0;i<N;i++)
{
    //処理B
}
と書いた方が速くなるときがあるのですが、何故だかがわかりません。
考えられる理由を教えてください

495:デフォルトの名無しさん
09/09/26 03:52:15
大雑把過ぎてよくわからんけど、ぱっと思いつくのは
1.キャッシュに乗った
2.loop unrollが効いた

496:デフォルトの名無しさん
09/09/26 13:04:41
一番考えられるのは、測定ミスだな

釣りじゃないなら、Nの値と処理A,Bの内容を示せよ
あと時間測定の方法も

497:デフォルトの名無しさん
09/09/26 13:09:04
Windowsなら SetPriorityClass()、QueryPerformanceFrequency()、
QueryPerformanceCounter() を使って自動的に測定させればよい

SetPriorityClassを使うのはバックグラウンドでいらないプロセスが動いて
測定値にバラツキが出るのを防ぐため

測定後に元に戻しておかないと大変な事になる(再起動)

498:デフォルトの名無しさん
09/09/30 02:44:19
>>494
どっちかのループでSSEが効いたんじゃない?

499:デフォルトの名無しさん
09/10/18 10:00:21
C++でコードを書いていて引数にとったクラスにメソッドを適用する
関数を書きました。そのメソッドはクラスのprivate変数を変更するメソッドです。
デバッグプリントを追加して、メソッドが呼ばれている事や、
メソッドによってprivate変数が変更されている事を確認したのですが。
その関数を実行した次の行でそのprivate変数を確認するともとに戻ってしまっています。
適切に変更したいのですが、よろしくお願いします。
OS:MacOSX 10.6
Compiler: g++ 4.2.1

よろしくお願いします。

500:デフォルトの名無しさん
09/10/18 10:05:43
>>499
引数の型はなにかね?

501:デフォルトの名無しさん
09/10/18 10:19:33
メソッドの引数ですか?
独自で作ったHogeクラスのインスタンスです。
void FooBar (Hoge x)
{
x.SetX(10);
}

みたいな感じで使っています。
Hoge baz;
FooBar(baz); //ここでbazのprivate変数Xは10にかわったはず!!
baz.GetX() //なぜかここの返り値がもとのXのまま

といった感じです。


502:デフォルトの名無しさん
09/10/18 10:23:54
そりゃbazの変数が変わったように見えてるだけで、実際変わったのはxの変数だ。
bazとxのアドレス確認してごらん。

503:デフォルトの名無しさん
09/10/18 10:26:00
なるほど、関数はHogeインスタンスのポインタを引数にとるようにし、
bazのポインタを引数に渡せばいいという事でしょうか?


504:デフォルトの名無しさん
09/10/18 10:29:53
ポインタでもいいし、C++だと参照ってのもあるから好きなほうを使えばおk。

505:デフォルトの名無しさん
09/10/23 09:01:30
負の値も含めて四捨五入する方法を教えてください

506:デフォルトの名無しさん
09/10/23 10:22:17
std::vector<int> vA;
std::vector<int> vB;

// vAに値をpush_back

vB.reserv(vA.size());
std::copy(vA.begin(), vA.end(), vB.begin());


としたときに vB.size() でサイズを取得するには何か細工が必要ですか?

507:デフォルトの名無しさん
09/10/23 10:23:42
>>505
URLリンク(tech.ckme.co.jp)

508:506
09/10/23 10:42:22
すみません解決しました

509:デフォルトの名無しさん
09/10/28 05:31:06
Windowsで実行ファイルのディレクトリを取得する方法を教えてください

510:デフォルトの名無しさん
09/10/28 09:06:03
WinAPIスレにでもどうぞ。
それにしても、「実行ファイルのディレクトリ」とは「実行ファイルのあるディレクトリ」なのか
「実行ファイルを起動したときのディレクトリ」なのかはっきりしないもんだな。

511:デフォルトの名無しさん
09/10/28 22:00:44
後者は普通カレントディレクトリと呼ぶだろ

512:デフォルトの名無しさん
09/10/28 22:40:41
実行ファイルを起動したときのディレクトリのことをカレントディレクトリと呼ぶだって?
やめてくれないか。

513:デフォルトの名無しさん
09/10/28 23:00:36
>>509
GetModuleFileName
_fullpath
とか、使って

514:デフォルトの名無しさん
09/10/28 23:42:32
>>512
「実行ファイルを起動したときのカレントディレクトリ」と言いたいのだと思う。

515:デフォルトの名無しさん
09/10/29 02:13:32
/usr/bin/ls

516:デフォルトの名無しさん
09/10/30 03:42:49
デフォルトのコピーコンストラクタは
ビットコピーをすると教わりましたが

stlコンテナを含む自作クラスについて
それをすると問題が起こりませんか?
大丈夫ですか?

代入してスコープ抜けるとき
コピー先の奴が元のを破棄してしまいませんか?

517:デフォルトの名無しさん
09/10/30 04:50:35
>>516
> デフォルトのコピーコンストラクタは
> ビットコピーをすると教わりましたが

それは、うそだ。

518:デフォルトの名無しさん
09/10/30 06:57:24
>>517
では全てのメンバオフジェクトに
operator=を適用するのですか?

519:デフォルトの名無しさん
09/10/30 07:38:15
>>518
コピーコンストラクタならコピーコンストラクタ。
operator= なら operator= 。

520:デフォルトの名無しさん
09/10/30 07:40:49
>>519
アハ!悟った!
あり^^

521:デフォルトの名無しさん
09/11/13 18:43:32
すみません。計算式についてなのですが

long a = 3210;
double b = 23.456789;
long y = (a*3.1415) - (b+10.5) * 6.28;

例えばこうやって変数yを求めた場合、
「計算の為に見えない変数が確保され、メモリを消費する」という現象は起きるのでしょうか?
もしそうだとするならば、

long a = 3210;
double b = 23.456789;
double c = a*3.1415;
double d = (b+10.5) * 6.28;
long y = c - d;

こうやって(計算式がもっと長ったらしい場合)コードの可視性を良くしておいても
メモリ消費や、処理の負荷は変わらなかったりするのでしょうか?
それとも何かルールが有るのでしょうか。

「このURL読んで来い」とかだけでも何でも構いませんので、
情報を教えて頂けると助かります、よろしくお願いします。 orz

522:デフォルトの名無しさん
09/11/13 18:47:34
>>521
気にするな、コンパイラは善きに計らってくれる。

523:デフォルトの名無しさん
09/11/13 18:50:51
>>521
どうしても気になるなら、(最適化ありで)コンパイラにアセンブリ出力を出させて較べてみればいい。
>521が全てなら、恐らくはyが即値で得られるだろう。

524:デフォルトの名無しさん
09/11/13 20:51:29
>>522-523
アセンブリ出力・・やってみて確認してみようと思います。
ありがとうございました。 orz

525:デフォルトの名無しさん
09/11/13 22:05:01
すみません。
「整数同士の割算」の結果が「整数のみ」か「少数を含む」かを見分ける時、
今はintとdouble2つの割算をし、それらが等しいかif判定しているのですが
もっとスマートな方法をご存知な方はいらっしゃられないでしょうか?

526:デフォルトの名無しさん
09/11/13 22:40:57
if(a%b==0)

527:デフォルトの名無しさん
09/11/14 05:12:31
割り切れるかどうかってこと?
あんまりこういうこと言うスレではないかもしれんけど、正直、一瞬で>>526
浮かばないようだとヤバくね?

528:デフォルトの名無しさん
09/11/14 16:04:09
そりゃ人によるでしょ。C/C++勉強し始めてすぐならしょうがない。
仕事でC/C++使ってる人間なら確かにヤバい。


529:デフォルトの名無しさん
09/11/15 11:17:26
>>526-528
成る程。何か効率化の方法が有りそうだとは思ってたのですが
526の式にピンとこず、実際数値を当てて試してやっと理解できました。
アマチュアだけど、センスがないなぁ・・自分。
ありがとうございました。

530:デフォルトの名無しさん
09/11/15 14:31:50
%を知らなかった(か、見たことはあるけど使ったことがなかった)のか?

531:デフォルトの名無しさん
09/11/15 15:37:13
>>530
いえ。知っていてほんの数回は使っていたんですが、実際に余った数値そのものが欲しい時ばかりでした orz
普段少数しか扱ってなくて、余り=何かの数値 という先入観が強かったのも有るかもしれません。

ピンと来れず申し訳ないです。 orz

532:デフォルトの名無しさん
09/11/15 16:12:09
まぁ謝ることではない

FuzzBuzz問題を解けないのが普通、って話も少し実感できた

533:デフォルトの名無しさん
09/11/15 16:12:49
FizzBuzz問題だった

534:デフォルトの名無しさん
09/11/15 23:27:57
まぁこういうのはセンスよりも経験だから
積めばそのうちピンと来るようになるさ

535:デフォルトの名無しさん
09/11/17 19:07:57
代入演算子=がオーバーロードされているBaseクラスを
public継承したDerivedクラスがあり、
そのDerivedクラスは代入演算子=をオーバーライドしてあります。

そんなDerivedクラスのコンストラクタ中で、
@*this=100;
Athis->operator=(100);
Boperator=(100);
CBase::operator=(100);
これらはして良いコードでしょうか?



536:デフォルトの名無しさん
09/11/18 00:55:29
>>535
1〜4のどれもコンパイルエラーにならないんで、あとはやりたいことを
書いてもらわない限りはそれ以上の良し悪しを判断できない。

537:535
09/11/18 06:13:06
>>536
ありがとうございます。
コンストラクタ中で、thisポインタや代入演算子を使用しても大丈夫なのでしょうか?
ということが伺いたかったのです。


538:デフォルトの名無しさん
09/11/18 08:31:52
>>537
同じじゃねーか馬鹿。

コンパイルは通る。一定の動作もする。
「大丈夫」かどうかは、少なくともその動作が期待している動作と合致するかどうかによる。
今のところ期待している動作は不明。したがって判別不能。

539:537
09/11/18 20:03:46
仕様上未定義の動作でないことが分かれば大丈夫です。
ありがとうございました。

540:デフォルトの名無しさん
09/11/18 23:21:25
条件によっては未定義動作も有りうるって言われてるんじゃないの?

541:デフォルトの名無しさん
09/11/19 17:39:59
質問です
10×10のマス目を「0,1,2」で埋める。使わない数字があっても可
それを例
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
と言うテキストファイルで出力したい。ファイル名は連番。
すべての可能性を(回転して同一等を排除しない)出力するためのプログラムって
どうやって書いたらいいんでしょうか??

見当が付きません。

542:デフォルトの名無しさん
09/11/19 17:45:00
3^100 ≒ 5.15×10^47通り全部書き出す気?

543:デフォルトの名無しさん
09/11/19 17:49:05
3~100になるんですか……
100~3だと思ってた…………

えらいことになりますね。

544:デフォルトの名無しさん
09/11/19 18:07:30
>>541 のお陰で、STL に next_combination がないことに
今頃気付いた。

545:541
09/11/19 20:45:31
少しアプローチの仕方を変えてみようかな
まず10桁の数字を「1,2,3」で埋める。使わない数字があっても可

これなら3^10=59049個で、一つずつファイルに出力は厳しいけど
一覧で表示だけならできそうだ。

1111111111〜3333333333
までの数字で「0,4,5,6,7,8,9」を含む物を削除ってほうがわかりやすいのかな。

まぁそのあとどうやって縦に10桁並べるのかよくわからんけどww



546:デフォルトの名無しさん
09/11/19 23:10:34
質問ですstd::string クラス文字列の内容ををchar型配列に移すときに

      char *text;
      string str ="testtxt";
      int i=0;
      int len = str.length();
      text = new char[len];
      while(i<len){
            text[i] = str.at(i);
            i++;
      }

こうしたんですがもっとこう単純で綺麗に出来ないものでしょうか?

547:デフォルトの名無しさん
09/11/19 23:44:51
>>546
whileの代わりにstd::copy(str.begin(), str.end(), text);とかstd::memcpy(text, str.data(), len)とか。
ところで、'\0'の終端がなくていいの?

548:デフォルトの名無しさん
09/11/20 00:32:49
いいんです。あったら上司に怒られます。

549:デフォルトの名無しさん
09/11/20 01:19:51
質問です。
ループ中の変数 j をファイル名としてテキストファイル"1.txt"〜"8.txt"を
どんどん新規作成していきたいのですが、
「f.open(ji,ios::out)の第一引数は const char*だカス」と怒られます。
こういう場合はどのように行うのでしょうか?

自分で書いてみたものを張ります。
for(int i=0;i<9;i++){
char t_char[10];
sprintf(t_char, "%d", j);
string ji = "";
ji += t_char;
ji += ".txt";
fstream f;
f.open(ji,ios::out)
f.close();
}

550:デフォルトの名無しさん
09/11/20 01:22:43
>>546
std::vector<char> text(str.begin(), str.end());

551:デフォルトの名無しさん
09/11/20 01:23:37
>>549
ji.c_str()

552:デフォルトの名無しさん
09/11/20 01:33:49
>>549
f.open(ji.c_str(),ios::out) かな

553:デフォルトの名無しさん
09/11/20 03:14:37
>>547
>>550
ありがとうございます!

554:デフォルトの名無しさん
09/11/20 12:31:02
>>549
sprintf(t_char, "%d.txt", j);
fstream f;
f.open(t_char,ios::out)


555:デフォルトの名無しさん
09/11/21 20:36:18
>>551
>>552
>>554
ありがとうございます!!

556:デフォルトの名無しさん
09/11/21 23:20:28
Shift-JISの場合は
char*型 strlen strcpyなどを使いますよね?
UTF-8を扱う場合の変数型や文字列処理の関数はどうなりますか?

557:デフォルトの名無しさん
09/11/21 23:35:29
基本的に、strをwcsに置き換えればOK

558:デフォルトの名無しさん
09/11/21 23:42:03
UTF-8ってShift-JIS同様マルチバイト文字ではないのですか?
UNICODEはワイド文字で、UNICODEとUTF-8は別物ですよね?

559:デフォルトの名無しさん
09/11/22 01:44:23
>>557
それはおかしい。
UTF-8はマルチバイト文字に分類される。
UTP-8を直接扱うときはcharとそれを扱う関数を使って問題ない。

560:デフォルトの名無しさん
09/11/22 01:53:17
えー。UTF-8というのはUnicodeのエンコード方式のひとつです。
Unicodeというのはいっぱいある文字を一覧表にしただけだと思ってください。
その一覧表をコンピュータでどのように表現するか、
2バイトで1セットとするコードを使うとか、
4バイトで1セットとするコードを使うとか、
最初の方は1バイトで、大部分は2バイトだけど、いい具合に3バイトとするコードを使うとかetc、etc…
そういうなかのひとつがUTF-8です。UTF-8は可変長バイトです。

Unicodeを扱う場合、localeを正しくセットした上で、
wchar_tとwchar_tを処理するライブラリを使います。

ただし、UTF-8が本当に使えるかどうかは
コンパイラしだいです・・・。

561:556=558
09/11/22 01:55:15
>>559
UTF-8を扱うときはShift-JISと同じように扱って大丈夫なんですね。
ありがとうございました。

562:デフォルトの名無しさん
09/11/22 03:26:17
>>560
UTF-8を単なるバイト列と見なして入力・処理・出力するだけなら、
単なるバイナリデータと同じchar型で扱って何の問題もない。
そのデータ中に'\0'が現れなければ、strlenやstrcpyはうまく動く。
普段使っているマルチバイト文字と改行の扱いが同じならテキストモードでのファイル読み書きもうまくいく。
ここまでlocaleの出番無し。

もちろん、この状態を「本当に使える」と言わないと主張するならそれに賛成するよ。

563:デフォルトの名無しさん
09/11/22 04:07:31
>>562
UTF-8はASCII互換部分があるからそういうことができるのかな。
いまいちこの辺はよくわからんです*_*

564:デフォルトの名無しさん
09/11/22 10:05:16
UTF-8は外部インターフェース用と考えた方が良い
直接文字列操作するなんて考えたくない

565:デフォルトの名無しさん
09/11/23 15:09:23
C言語の質問です。

C言語の基本はとりあえず理解したのですが、実際に自分でプログラムを組もうとした時
はて、真っ黒コンソールで走る、組んでて楽しいプログラムって何だ?と、困っています。

そこで、こんなコンソールのプログラムなら、作ってて面白いし、勉強にもなるんじゃ?といった案をお教えください。
ちなみに、基本情報処理者の資格を一応持っているので、多少のシステム関係の知識はあります。

プログラミング環境は、
・Borland C++ Compiler 5.5.1
・Microsoft Visula Stdio 2005
の二つあります。

どうぞお願いします


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4744日前に更新/246 KB
担当:undef