C/C++小心者スレッドP ..
[2ch|▼Menu]
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
の二つあります。

どうぞお願いします

566:デフォルトの名無しさん
09/11/23 15:13:31
いや別にコンソール使わなくてもいいと思うけど

567:デフォルトの名無しさん
09/11/23 15:19:55
オセロ

568:デフォルトの名無しさん
09/11/23 15:29:16
ウィンドウ出す方法でも勉強したらいいんじゃね

569:デフォルトの名無しさん
09/11/23 16:58:24
>>564
ハァ?

570:デフォルトの名無しさん
09/11/23 20:47:18
>>569
俺も>>564は普通に当然だと思うが

571:デフォルトの名無しさん
09/11/23 21:21:03
>>565
テトリスなら2, 30分ぐらいで作れて遊べるから楽しいんじゃない?
昔、流行った頃は電卓に搭載されたぐらいシンプルなものだし

572:565
09/11/23 21:50:09
>>566
おぉそうですか。Winプログラムじゃ、"Hello, world"で挫折すると聞いていたもので・・・
窓だと、どのようなプログラムがよいか、よろしければお教えくださいm(_ _)m

>>567
なるほど!いいですね
次の手を思考ルーチンを、自分で考えてみるってのも、楽しいかもしれませんね!
ありがとうございました

>>568
ぐ、やはりWindowsプログラミングですかね、
とりあえずこのソースを打ち込め!的なページを見てみます

>570
テトリスですか!いいですね、、、
mainをぐるぐる回して、関数の戻り値を確認すれば出来るのだろうか…やってみます!
ありがとうございました

573:デフォルトの名無しさん
09/11/24 00:20:57
CとC++の違いをお願いします。
また、
URLリンク(www.amazon.co.jp)
この本はCではなくC++を扱ってるように思うのですが、どうなのでしょうか

574:デフォルトの名無しさん
09/11/25 00:50:20
どうみてもC
VC++はCも扱える

575:デフォルトの名無しさん
09/11/25 02:04:41
どう見てもC


初心者の俺がもってるイメージとしては

c = 関数関数関数関数
cpp = c + クラス他

576:デフォルトの名無しさん
09/11/25 02:07:32
言語仕様としては間違ってなくもないけど
実際のコーディングがまったく違うよ。

577:デフォルトの名無しさん
09/11/25 19:49:14
C++を有る程度使えるようになってから
このまえCだけで全部つくる必要がでたときすごくとまどったな

なんつっても文字列操作が…

578:デフォルトの名無しさん
09/11/25 23:00:39
いつかC++のクラスやSTLが突然使えなくなる日が来るんじゃないかと思ふことがある

579:デフォルトの名無しさん
09/11/28 00:24:14
〜ヘッダ〜
class BBB;
class AAA{
  BBB *processor;
  void do();
}
〜ソース〜
AAA::do(){
  BBB &processor = *(this->processor);
  processor.execute();
}

プログラミングの出来る友達のソースを見たらこのような記述がありました。
このようにするメリットって何があるのですか?
友達にも聞いたのですが、いまいち理解できませんでした。

580:デフォルトの名無しさん
09/11/28 03:24:18
いわゆるpimplだな。
他のソースからそのヘッダだけインクルードしてAAAを使いたい場合に有効。

AAAのインスタンスを生成するには、AAAのメンバ変数のサイズが全部確定してないと
ならない。プライベートメンバでも何でも。
でも、ヘッダにAAAのプライベートメンバ変数まで全部書くようにしてると糞ソースに
なる。
だから、BBBを名前だけ宣言しといて、AAAのメンバ変数に「BBBへのポインタ」を
置く。ポインタなら中身が分からなくてもサイズは確定するから。
で、プライベートな実装は全部BBBの中に突っ込んで、AAAはBBBに丸投げする。

581:デフォルトの名無しさん
09/11/29 05:28:36
下のプログラムで、なぜかswitchのところでひっかかってしまいます。原因は何でしょうか。
プログラムの内容はsuujiに乱数を入れ、その乱数が〜なら○○を出力する、というものです。

int suuji;
suuji = rand() % 5 ;
printf("\n\n\n\nテストプログラム1\n");
switch (suuji)
{
case '0' :
printf("\nCASE 0");
break;
case '1' :
printf("\nCASE 1");
break;
case '2' :
printf("\nCASE 2");
break;
case '3' :
printf("\nCASE 3");
break;
case '4' :
printf("\nCASE 4");
break;
}
return 0;

582:581
09/11/29 05:30:54
頭にくる
int main(void)
がぬけてました。

また、ひっかかるというのは表示されないということです

583:デフォルトの名無しさん
09/11/29 06:40:40
suuji = rand() % 5 + 0x30;

これで^^

584:デフォルトの名無しさん
09/11/29 08:38:50
やべえ俺>>583を見てもなお引っかかっちまった
文字'0'(ASCIIコード0x30)と比較してるのか

585:デフォルトの名無しさん
09/11/29 14:14:52
if(1){****}
とあった場合、
まともな(有名どころのg++とかVCとか)コンパイラなら
if(1)という無駄なオーバーヘッドは消してくれると期待できますか?
あるいはif(0)も同じく最適化してくれますかね?

586:585
09/11/29 14:22:33
#include <iostream>

const int num = 1;

int main()
{
if(num){std::cout << "num" << std::endl;}
if(!num){std::cout << "!num" << std::endl;}

return 0;
}
これがg++ (最適化-O1) でasmファイルが同じになりました。
他のコンパイラでも期待して良い物なのでしょうか?


587:デフォルトの名無しさん
09/11/29 18:11:43
よほど特殊な狂った(または単純に超絶バカな)コンパイラでなければ、最適化を
切ったりしない限りは当たり前のように消える

588:デフォルトの名無しさん
09/11/29 18:32:50
>>587
ありがとうございます。


589:デフォルトの名無しさん
09/11/29 19:33:54
C++のクラス&構造体に関する質問です。

構造体を静的メンバとして定義するには、どうしたらいいのでしょうか。
以下のようなコードで、int型の数値をstruct型にまとめたいのです。


class Perception {
public:
   static int trackingPointX;
   static int trackingPointX;
}
int Perception::trackingPointX = 0;
int Perception::trackingPointY = 0;

int main() {
   printf("%d", Perception::trackingPointX);
   return 0;
}


いろいろと検索・試作してみましたが、実装方法が分かりませんでした。
よろしくお願いします。

590:デフォルトの名無しさん
09/11/29 19:44:36
>>589
よくわからんな。
そのコードのどこが気に入らないの?

591:デフォルトの名無しさん
09/11/29 19:49:13
struct Perception
{
  static int trackingPointX;
  static int trackingPointY;
};

592:589
09/11/29 19:51:37
>>590
printf("%d", Perception::trackingPoint0.x);
printf("%d", Perception::trackingPoint1.x);
printf("%d", Perception::trackingPoint2.x);
・・・という風にしたいんです。

593:デフォルトの名無しさん
09/11/29 19:56:42
#include <stdio.h>

struct _Perception
{
  struct Point{ int x; int y; };

  Point trackingPoint0;
  Point trackingPoint1;
  Point trackingPoint2;
};

_Perception Perception;

int main()
{
  printf("%d", Perception.trackingPoint0.x);
  /* ...*/
  return 0;
}

594:589
09/11/29 20:22:19
>>593
構造体をクラス変数として使いたいなら、メンバ変数として定義した上で
あらかじめクラスを作っておく方法しかないんですかね・・・。

595:デフォルトの名無しさん
09/11/29 20:28:31
>>594
クラスインスタンス作るのが気に入らないなら 593 のメンバ変数に static つければいいだろうが。

>>593 要らんところで予約名使うなよ。

596:589
09/11/29 20:38:31
>>595さんの方法も試してみます。ありがとうございます。
とりあえずは以下の方法で実装できました。(言われてみれば当たり前かも・・・汗)


struct TrackingPoint { int x; int y; };

class Perception {
public:
   static TrackingPoint trackingPoint0;
   static TrackingPoint trackingPoint1;
   static TrackingPoint trackingPoint2;
};
TrackingPoint Perception::trackingPoint0 = {0, 0};
TrackingPoint Perception::trackingPoint1 = {1, 1};
TrackingPoint Perception::trackingPoint2 = {2, 2};

int main() {
   printf("%d", Perception::trackingPoint0.x);
   printf("%d", Perception::trackingPoint1.x);
   printf("%d", Perception::trackingPoint2.x);
   return 0;
}

597:デフォルトの名無しさん
09/12/02 00:53:41
MFCを使ったサンプルプログラムを実行したいのですが、
.NET 2008だと有料版を買うしか無いのですよね・・・?

598:デフォルトの名無しさん
09/12/02 01:28:33
>>597
「.NET 2008」って、「Visual Studio .NET か Visual Studio 2008」ってこと?
まあ、そうだね。MFCを無料で入手する手段はないと思うよ。

ちょっと試すぐらいなら、現在無料で配布中の VS 2010 懼ァイ22でいけるか
もしれない。


599:デフォルトの名無しさん
09/12/02 04:05:07
>>598
説明が足りなくてすいません
Visual Stadio .NET Express EditionでMFCを使用したサンプルプログラムの動きを見たかったのです
VS2010なら、動作してくれるのかな?
ちょっとダウンロードして実行してみます

600:デフォルトの名無しさん
09/12/02 10:03:55
1回動けばいいだけなら評価版をダウンロードすればいいだけだな

601:デフォルトの名無しさん
09/12/07 21:57:33
a、b、cの3つのint型にそれぞれ8bit(01001110のようなもの)のデータをくっつけたいのですが、どうすればよいでしょうか。
つまり、aに5、bに3、cに8というデータがあったら、新しいint型のdに538というように
ひとつの24bitのデータにしたいのです。

なにか良い手段がありましたら、お願いします。

602:デフォルトの名無しさん
09/12/07 23:27:47
>>601
a、b、cを左に8回シフトして0xffffff00(32bitの場合)とANDを取り
次に8bitデータとORを取る

603:デフォルトの名無しさん
09/12/07 23:28:31
あっごめん24ビットデータか

じゃあ0xffff00とANDを取って

604:デフォルトの名無しさん
09/12/08 01:14:20
>>601
> つまり、aに5、bに3、cに8というデータがあったら、新しいint型のdに538というように

これ、 4 ビットずつ 3 つで 12 ビットのデータにしてね?

605:デフォルトの名無しさん
09/12/08 01:27:26
>>604


606:デフォルトの名無しさん
09/12/08 04:37:51
>>601
1行目と2行目以降が同じ意味に聞こえないんだけど、もしかしてこういうこと?

int d = ((a & 0xff) << 16) | ((b & 0xff) << 8) | (c & 0xff);

607:デフォルトの名無しさん
09/12/08 07:44:40
visual C++ 2008 Express Edition でシンプルなソフトを作ってみました。
そこで質問があるのですが、もし分かる人いたら教えてください。

@実行ファイルにアイコンをつけたいんですが、プロジェクトファイルを作成してしまった後でも、
アイコンをつける方法はあるのでしょうか。
(アイコンの絵柄のきれいさはあまりこだわりませんが、せっかくなんでアイコン作ってみたくて)

ARelease環境で作成されたフォルダをみると
プログラムの中で使う画像ファイルがなぜかないので手作業でフォルダに追加しないといけなかったり、
作成されたフォルダの中にexeファイル以外のファイルが8つぐらいあったりしてごちゃごちゃするので、
最終的に作成するファイルをexeファイルだけにする方法はないでしょうか?

608:デフォルトの名無しさん
09/12/08 12:46:29
昔はリソーススクリプトをごりごりしていたけど(VC++ 6.0)
いまはXMLになっている気がする(VS 2003頃からか)

とりあえず、スレ違い
Visual Studio 2008 Part 19
スレリンク(tech板)

609:デフォルトの名無しさん
09/12/08 14:11:26
>>607
>最終的に作成するファイルをexeファイルだけにする方法はないでしょうか?
ビルド後のイベントに消すコマンドを書けばよいがそんなことは普通しない。
分割コンパイルの意味がなくなる。

610:デフォルトの名無しさん
09/12/08 20:40:37
>>601が真にやりたいことが理解できてなくて
説明がうまいこといってないのか
俺の読解力がないのかが判断つかねえ

611:デフォルトの名無しさん
09/12/08 21:29:28
R=5 G=3 B=8から、RGB値の#538が欲しい、だと解釈したので>>606でいいと思ってる

612:デフォルトの名無しさん
09/12/08 21:41:17
サンプルのdが0x538だったら惑うことも無かったろう

613:612
09/12/08 21:42:19
8bitの合成で24bitだから正しくは0x050308か

614:デフォルトの名無しさん
09/12/11 12:49:28
>>601
今の人はビットフィールドって知らないのか?

615:デフォルトの名無しさん
09/12/11 12:51:22
はぁ?

616:デフォルトの名無しさん
09/12/11 12:58:29
>>610
1行目と2行目の関連がまるで見えないので説明の問題だと思う

617:デフォルトの名無しさん
09/12/11 13:00:10
>>614
もし、8ビット毎の合成だったらunionだけでOKだな

618:デフォルトの名無しさん
09/12/11 16:24:01
C++/CLIってググっても情報少ないんだけど、
あまり使われていないのでしょうか?

619:デフォルトの名無しさん
09/12/11 16:31:41
えぇ、使われてません。
C++のルールからあまりに外れまくっている上に
C#より面倒なくせにやれることはC#未満という有様なので。

用途がすごく限られます。

620:デフォルトの名無しさん
09/12/11 16:45:58
>>618
殆どはC#とC++の情報を読み替えるだけで賄える

621:デフォルトの名無しさん
09/12/12 10:38:17
aとbというunsigned long型で、
aとbの差が±30以上ならint型cに1を入れる、というプログラムを作成したいのですが、
なにかいい方法はありませんか?

622:デフォルトの名無しさん
09/12/12 10:42:36
普通に引き算の結果を比較するんじゃダメなの?

623:デフォルトの名無しさん
09/12/12 10:43:50
>>621
どうやったらダメだったのかとか自分の案くらい書けば?

624:デフォルトの名無しさん
09/12/12 10:44:31
unsigned じゃ引き算の結果のマイナスは表現できないから困るだろ

625:デフォルトの名無しさん
09/12/12 10:51:25
int main(){
unsigned long a = 39.5;
unsigned long b = 6.4;
unsigned long d;
if(a>b){
d = a-b;
}else{
d = b-a;
}
int c = 0;
if(d>30){
c= 1;
}
cout << c << endl;
}

626:デフォルトの名無しさん
09/12/12 10:51:25
絶対値とりゃいい

627:デフォルトの名無しさん
09/12/12 11:49:49
if (a >= b + 30 || b >= a + 30) {
c = 1;
}

628:デフォルトの名無しさん
09/12/12 11:53:10
最大値付近だとまずくない?

629:デフォルトの名無しさん
09/12/12 12:15:02
まずかった
なんか綺麗に書けないかなと思ったけど難しかった

630:デフォルトの名無しさん
09/12/12 12:34:01
if (abs(a-b) > 30) c = 1;

631:デフォルトの名無しさん
09/12/12 12:34:58
「30以上」

632:デフォルトの名無しさん
09/12/12 12:42:20
abs()の引数はintじゃねーの?

633:デフォルトの名無しさん
09/12/12 13:28:53
unsigned longのままでやりたいなら
c = (a > b ? a - b : b - a) > 30 ? 1 : c;


634:デフォルトの名無しさん
09/12/12 15:08:18
横からスマソ

int型のif文で、
if (x <= -50)
みたいにできなかったっけ?

635:デフォルトの名無しさん
09/12/12 15:16:04
>>634
出来るが、一体どうしたね

636:デフォルトの名無しさん
09/12/12 15:21:43
いや、int型のほうは負も扱えたよなと思って

637:デフォルトの名無しさん
09/12/12 15:22:29
>>636
今更なにを。。。

どの言語を普段お使いの方ですか?


638:デフォルトの名無しさん
09/12/12 18:59:13
ここ数年、開発部門から離れてCとかC++も触れる機会が無かったからさ

そろそろ戻れるって聞いて、必死で覚えなおしてる

639:デフォルトの名無しさん
09/12/12 19:01:58
×戻れる
○戻される

640:デフォルトの名無しさん
09/12/12 19:14:33
>>1
なんで宗教的な話は禁止とか書いてあんの?
プログラムと宗教って何か関係性でもあったの?
普通に考えたらプログラム板なんだから宗教の話なんてスレチのイタチだってのに
わざわざ書くってことは何か理由がってのこと?

641:デフォルトの名無しさん
09/12/12 19:51:37
はい

642:デフォルトの名無しさん
09/12/12 20:37:59
>>640
vimとemacsのどちらがよりC++コーディングに適しているのか教えてください

643:デフォルトの名無しさん
09/12/12 21:20:01
以下のコードのように文字列定数の先頭アドレスを返して
関数呼び出し元で利用するのは問題ないでしょうか。
手元の環境(gcc 4.4.0)では"abc"と表示されました。

#include <stdio.h>

char *func() {
return "abc";
}

int main(void) {
puts(func());
return 0;
}


644:デフォルトの名無しさん
09/12/12 21:41:40
>>643
定数は問題ない

645:デフォルトの名無しさん
09/12/12 21:58:57
問題ないけど戻り値の型はconst chara*のほうがいいと思う

646:643
09/12/12 22:46:26
ありがとうございます。

647:デフォルトの名無しさん
09/12/13 04:59:03
>>642
それはエディタ論争だから鼬害

648:デフォルトの名無しさん
09/12/13 10:14:46
>>647
バカ発見www
単に彼は「宗教的な話は禁止」の例えで出したんだろjk


649:デフォルトの名無しさん
09/12/13 10:20:43
この板における「宗教」の意味を理解してないか、わざと理解してないふりをしてるアホには、
何を言っても無駄だろう。

650:デフォルトの名無しさん
09/12/13 11:21:40
viにしろ!!!!

651:デフォルトの名無しさん
09/12/13 13:22:13
神は量子クラスを継承して光子オブジェクトを作られたわけだが
それ以前から原子クラスを継承した水素オブジェクトは存在したのだな

652:デフォルトの名無しさん
09/12/13 13:33:22
>>651
いや存在してないと思うぜ。逆じゃねぇのか?

あと、テンプレートの特殊化の方が近いと思うんだぜ。
template<double spin, double Mass, double Electric charge, 俺の知らない要素>
class SubatomicParticle;


653:デフォルトの名無しさん
09/12/13 13:48:26
逆というか、skyとgroundクラスをまず最初に作って
そのとき一緒にwaterクラスも実装したらしい

654:デフォルトの名無しさん
09/12/13 15:26:49
宗教的な話題は禁止します。

655:デフォルトの名無しさん
09/12/13 15:33:52
リアル宗教ktkr

656:デフォルトの名無しさん
09/12/13 17:01:10
C#信者だけど質問してもいい?


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

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