C/C++小心者スレッドPart1at TECH
C/C++小心者スレッドPart1 - 暇つぶし2ch412:デフォルトの名無しさん
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;
②this->operator=(100);
③operator=(100);
④Base::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 でシンプルなソフトを作ってみました。
そこで質問があるのですが、もし分かる人いたら教えてください。

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

②Release環境で作成されたフォルダをみると
プログラムの中で使う画像ファイルがなぜかないので手作業でフォルダに追加しないといけなかったり、
作成されたフォルダの中に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#信者だけど質問してもいい?

657:デフォルトの名無しさん
09/12/13 17:31:08
どうぞ

658:デフォルトの名無しさん
09/12/13 17:40:34
どうぞじゃねぇよ

スレ違いだろ


659:デフォルトの名無しさん
09/12/13 18:00:32
C#信者だけど(C/C++の)質問してもいい?

660:デフォルトの名無しさん
09/12/13 18:08:40
>>659
ダメ
改宗してからおいでなさい。

661:デフォルトの名無しさん
09/12/13 18:15:40
C/C++/C# は宗教だったのか

662:デフォルトの名無しさん
09/12/13 18:26:25
そうです!!

663:デフォルトの名無しさん
09/12/13 20:14:15
すみませんがどうすればいいか教えてください。
下記のコードのcuetarget=cue_parse_file(fp);までは実行に成功するのですが、cd_dump(cuetarget);以降が実行されず、実行が止まってしまいます。

#include "C:/libcue-1.3.0/bin/cd.h" #include "C:/libcue-1.3.0/bin/cdtext.h" #include "C:/libcue-1.3.0/bin/cue_parser.h" #include "C:/libcue-1.3.0/bin/libcue.h" #include "C:/libcue-1.3.0/bin/rem.h" #include "C:/libcue-1.3.0/bin/time.h"
int main(int argc, char** argv) {
FILE *fp; /*ファイルポインタの宣言 */
Cd *cuetarget;
/* ファイルのオープン */
if ((fp = fopen("S:/CDImage.cue", "r")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE); /*エラーの場合は異常終了する */
}else{
cuetarget=cue_parse_file(fp);
if (cuetarget=NULL){
exit(EXIT_FAILURE); /*エラーの場合は異常終了する */
}else{
cd_dump(cuetarget);
}
}
fclose(fp); /*ファイルのクローズ */
return (EXIT_SUCCESS);

・エラーメッセージ
特になし。

・実行環境
OS:WindowsXP コンパイラ:MingW IDE:NetBeans6.0.1 使用したライブラリ:libcue-1.3.0( URLリンク(sourceforge.jp) )

・最終的にやりたいこと
Cueシートの全てのトラックの、トラック名、アーティスト名などの属性を、別に用意したファイルの内容で自動的に置き換える。
(そのためにCueシートの解析用ライブラリをDLしてきた。)


664:デフォルトの名無しさん
09/12/13 20:18:23
とりあえず、PATHを通しとけ
CUEファイルに原因があるかもしれないから
CUEをどこかにあげてみて

665:デフォルトの名無しさん
09/12/13 20:44:05
>>664
PATHは通してあります。
CUEはこれです。
URLリンク(www1.axfc.net)

666:デフォルトの名無しさん
09/12/13 21:19:00
>>663
この辺があやしい

if (cuetarget=NULL){ 



667:663
09/12/13 21:27:17
解決しました。ありがとうございます。我ながら何をやっているのか…。

668:デフォルトの名無しさん
09/12/14 20:10:06
定数を左辺値にしないから・・・・・

669:デフォルトの名無しさん
09/12/14 20:27:02
いまどきのコンパイルなら警告出るだろ

670:デフォルトの名無しさん
09/12/14 22:50:01
脳内警告が常に出ます

671:デフォルトの名無しさん
09/12/15 10:07:23
>>668
左辺値の意味わかってないだろ。
まあどっちにしても定数を左に置くやつは信用できないけどな。

672:デフォルトの名無しさん
09/12/15 10:30:07
>>671
右の間違いだろ

673:デフォルトの名無しさん
09/12/15 10:44:07
プログラムの意味的にそうするのが自然であればそれでいいけど
単に凡ミスを防ぐために読みづらくするのは嫌だと言ってんの。

674:デフォルトの名無しさん
09/12/15 11:21:39
なんだ嫌なのか。

675:デフォルトの名無しさん
09/12/15 12:01:02
俺も定数を左に置くような奴を見たら、どっかおかしい人だと思うだろうな、正直。
当然、そう書こうとする動機は知っているが。

==と間違えて=を書く確率は、ちょっと慣れたまともなCプログラマなら0に限りなく
等しい。つまり、予防策としての効果も0に限りなく等しい。
よって、見た目に優れた書き方の方が良いが、左に定数を書く方がみんな見やすいと
思っているなら相当な変わり者だろう。物事は何でもかんでも対称的ではない。左と
右でどっちが感覚的に自然か、についても対称的な話ではない。現実に定数は右に
書かれる率が圧倒的に高い。

というようなことを感覚で判断できないか、または==と=を間違えることが実際に
ある人なのか、どちらにしても信用には値しないだろうな。

676:デフォルトの名無しさん
09/12/15 12:03:56
ミスの確率の高さ低さより、致命傷になるかどうかじゃね?
今時のコンパイラを正しく使っていれば、間違えても致命傷にはならない
だろうとは思う。

677:デフォルトの名無しさん
09/12/15 12:11:20
if ( MIN <= x && x < MAX ) {} とかは書くけど、
==と=のミスを避けるために左に定数を書くことはないなぁ。
でも、
>ちょっと慣れたまともなCプログラマなら0に限りなく
は、ソースがないから単なる妄想だね。^^

そしてハーブサッター先生の言葉を思い出そう。

678:デフォルトの名無しさん
09/12/15 12:16:48
ハーブサッターの言葉なんぞ多すぎてどれだか分かんねぇよw

679:デフォルトの名無しさん
09/12/15 12:21:59
ハーブサッターの言葉?

気の利いたコードは害悪だ、ってのは覚えてるな。

680:デフォルトの名無しさん
09/12/15 13:54:54
個人的には
>>677
> >ちょっと慣れたまともなCプログラマなら0に限りなく
> は、ソースがないから単なる妄想
そういう統計は誰も取ってくれそうもないが、経験則としてはあるなあ。

681:デフォルトの名無しさん
09/12/15 14:08:48
長くCを書いてると、比較の時は自然と==と入力してしまう

682:デフォルトの名無しさん
09/12/15 15:02:15
0に限りなく近いなら定数を左辺にするテクや、=に警告するコンパイルなんて生まれなかったろうに。

683:デフォルトの名無しさん
09/12/15 15:06:07
if (!ちょっと慣れたまともなCプログラマ) {
  682 名前: デフォルトの名無しさん [sage] 投稿日: 2009/12/15(火) 15:02:15
  0に限りなく近いなら定数を左辺にするテクや、=に警告するコンパイルなんて生まれなかったろうに。
}

684:デフォルトの名無しさん
09/12/15 15:17:15
小心者はどこへいった・・・

685:デフォルトの名無しさん
09/12/15 21:57:19
俺様は比較で代入なんて間違えないぜwwwwっていう勘違いちゃんならいるけど

686:デフォルトの名無しさん
09/12/15 22:35:07
俺様は比較で代入なんて間違えないぜwww
ただタイプミスするだけなんだぜwwww
ダメじゃんorz

687:デフォルトの名無しさん
09/12/15 23:37:27
\(^o^)/オワタ

688:デフォルトの名無しさん
09/12/16 10:47:01
結構膨大なコード書いてきたけど、ごく初期は別にして普通に一度も間違えないけどな

689:デフォルトの名無しさん
09/12/16 11:08:54
間違えることよりも、早期発見できるほうが重要だけどな。
他人の作ったコードもメンテすることあるし。

690:デフォルトの名無しさん
09/12/16 14:09:20
タイプミスばっかでげんなり

691:デフォルトの名無しさん
09/12/16 15:27:40
>>688
PL/SQL と並行してやってると、代入/比較どころか
文字列のクォーテーションまで間違うぜ!

692:デフォルトの名無しさん
09/12/16 16:10:07
他人に「定数は左に書こうぜ」とか言ってたらさらにキチガイじみてるな

693:デフォルトの名無しさん
09/12/16 16:11:16
他人の作ったコードのメンテで「定数は左に」って役に立つの?
右に書いてあるコードを全部左に置き換えてからコード読むとか?

694:デフォルトの名無しさん
09/12/16 16:17:45
「仕事じゃバカのコードもメンテしなきゃならないんだよ」理論の失敗例だな

695:デフォルトの名無しさん
09/12/16 18:25:03
vbの即時で文法ミス見つける機能が他の環境にもあれば そのうち実現するか

696:デフォルトの名無しさん
09/12/17 04:02:14
パソコンの時刻を2038年1月19日3時14分7秒の30秒前に設定して30秒後どうなるのかを誰か試してみてくれないか?
うちのパソコンでは何かうまくゆかないんだ

697:デフォルトの名無しさん
09/12/17 05:03:28
女の腐ったような回りくどさだな
どうせ30年弱の間には解決するだろ

698:デフォルトの名無しさん
09/12/17 08:04:46
何でC/C++スレで2038年問題を?

699:デフォルトの名無しさん
09/12/17 11:32:43
「C/C++スレ」ではなく「小心者スレ」だから

700:デフォルトの名無しさん
09/12/17 11:33:45
>>695
文法ミスじゃないから原因を特定しにくいバグになるんじゃないの?
だから、コンパイル時にエラーとなるように定数を左辺に置くという小技が出てきたわけで。

今は警告でるんだからそんな小技はデメリットしかないと思うよ

701:541
09/12/17 17:41:27
>>541で質問した者です。

検索の結果、やりたいことは「重複順列の列挙」と言うのだと分かりました。
また、列挙までのサンプルソースも手に入りました。
が、

あまりにも数字が多いので、必要のない物を出力前に除外しようと思い立ちました。

そこで質問です。除外条件で
・m桁目に2がある数値は除外
・0が5個以上連続している数値は除外
・左右反転して同一数値になるものは最初に出力した物以外出力しない

等々、どうやって条件付けしたらいいのか分かりません。

702:デフォルトの名無しさん
09/12/17 18:03:47
>>701
どういうものが必要ないかを俺が決めていいのかよ??
じゃぁ(ry

703:デフォルトの名無しさん
09/12/17 19:37:56
条件付けで処理が増える分、余計に遅くなるだけな気もするが。

704:デフォルトの名無しさん
09/12/18 06:40:17
選択整列法の平均比較回数が約N^2/4になるのはなぜですか?

705:デフォルトの名無しさん
09/12/18 10:50:35
平均っていうか、単純選択ソートの比較回数は固定のはずでは

706:デフォルトの名無しさん
09/12/18 10:59:38
選択ソートの比較回数は(N-1)*N/2じゃないの?

707:デフォルトの名無しさん
09/12/18 11:38:27
失礼、挿入整列法でした。

708:デフォルトの名無しさん
09/12/19 00:49:35
スレ違いかもしれないけど。
wiiyourselfとかwiiremoteなどのwii関係のC,C++用のライブラリーでとっつき安いライブラリのおすすめがある人いませんか?
自分の作ったVRウォークスルーもどきにヘッドトラッキングを導入したいんだけど。

709:デフォルトの名無しさん
09/12/19 01:22:28
>>707
俺最低。異物挿入法とか読んだ。どこに異物があるのか。

710:デフォルトの名無しさん
09/12/19 01:49:11
>707
大雑把に説明してみる。
Insertion sort ではどの位置に要素を挿入するべきかを判定するために比較が用いられている。
最初逆順に並んでいる場合(=最悪の場合)は比較回数は 0+1+2+...+(n-1)=n(n-1)/2 になる。
各ステップにおいてどの位置に挿入することになるかは等確率となるため平均を考えると半分の位置になる。
従って 0/2+1/2+2/2+...+(n-1)/2=1/2(0+1+2+...+(n-1))=n(n-1)/4 となる。

711:デフォルトの名無しさん
09/12/19 01:58:03
補足。
>各ステップにおいてどの位置に挿入することになるかは等確率
例えば最悪値で n-1 回比較するケースにおいて平均を考えると (1+2+...+(n-1))/(n-1) = n(n-1)/2/(n-1) = n/2
で大体半分。↑の式でも正確じゃないけどまぁオーダーとしては合ってるはず。

712:デフォルトの名無しさん
09/12/19 02:59:32
質問なのですが、投げられた例外の型ってどうやって判定してるんですか?
catchで分岐する時です。
静的に分かるものですか?
それとも実行時型情報みたいなの使うんでしょうか?


713:デフォルトの名無しさん
09/12/19 08:32:55
>>712
URLリンク(msdn.microsoft.com)

714:デフォルトの名無しさん
09/12/19 08:36:11
>712
静的には分からないので
>実行時型情報みたいなの
を使ってる。
g++ の場合だと正に std::type_info を使ってるらしい。
詳しく知りたい場合は BinaryHacks おすすめ。

715:デフォルトの名無しさん
09/12/19 14:51:07
try{
// コード
}catch(Exception1 e){
//例外1
}catch(Exception2 e){
//例外2
}catch(Exception3 e){
//例外3
}

716:デフォルトの名無しさん
09/12/20 16:14:52
#include <iostream>
using namespace std;
int main()
{
int n=100;
double k = 1.0/n;
for(double i=0.5;i >= -0.5; i-=k){
double x =0.0;
x = i;
cout << x << endl;
}
return 0;
}


これをコンパイルして実行したら0のところがe-16とかの小さい数になってしまいます。
原因を教えてください

717:デフォルトの名無しさん
09/12/20 16:18:46
>>716 URLリンク(www.kouno.jp)

718:デフォルトの名無しさん
09/12/20 17:25:17
>>717
ありがとうございます
0のところだけ別に入れます

719:デフォルトの名無しさん
09/12/20 19:23:07
>>716
0以外の場合は浮動小数点誤差が情報落ちして消えてしまうけど、
0の場合は誤差がそのまま有効な数値になるから。


 cout << x << end;
を使わず
 printf("%.2f\n", x );
を使えばいい

720:デフォルトの名無しさん
09/12/20 20:04:57
定数は左に、インド人は右に。

721:デフォルトの名無しさん
09/12/20 20:44:05
なつかしいなおいw

722:デフォルトの名無しさん
09/12/20 21:42:41
インド人は右ってどういう意味?


723:デフォルトの名無しさん
09/12/20 21:51:22
ハンドルは右

724:デフォルトの名無しさん
09/12/20 21:54:28
そういう意味か!!!

725:デフォルトの名無しさん
09/12/20 22:49:34
>>724 「インド人を右に」でぐぐれ

726:デフォルトの名無しさん
09/12/20 23:01:19
>>716みたいなのだと、100倍した値で計算して、表示の時に100分の1するのもいいかもな

727:デフォルトの名無しさん
09/12/21 01:03:47
別の言い方をすれば、ostreamで浮動小数点数を出力しようとするとprintfの%g相当ということだな。
<iomanip>をインクルードして、例えば
cout << fixed << setprecision(2) << x << endl;
と書けば、%.2f相当の出力になる。

728:デフォルトの名無しさん
09/12/21 22:37:27
VS2010β2のC++を使ってみました。

UInt32 aa;
aa = 0x12;

FileStream^ fs = gcnew FileStream("tmp.bin", FileMode::Create);
BinaryWriter^ binWriter = gcnew BinaryWriter( fs );
binWriter->Write( aa );
binWriter->Close();
fs->Close();

作成したtmp.binが使用中のままになっているため、2回繰り返すとエラーになってしまいます。
Closeしただけではダメなのでしょうか?
すいませんがよろしくお願いします。

729:デフォルトの名無しさん
09/12/21 23:35:48
>>728
CLIの質問は大胆すぎるので別スレでどうぞ


730:デフォルトの名無しさん
09/12/21 23:38:00
>>728
エラーとはどういうこと?
次のように、単純に2回実行することを試したが、なんの例外も投げられることなく実行されるけど。
using namespace System;
using namespace System::IO;

int main()
{
UInt32 aa;
aa = 0x12;
{
FileStream^ fs = gcnew FileStream("tmp.bin", FileMode::Create);
BinaryWriter^ binWriter = gcnew BinaryWriter( fs );
binWriter->Write( aa );
binWriter->Close();
}
{
FileStream^ fs = gcnew FileStream("tmp.bin", FileMode::Create);
BinaryWriter^ binWriter = gcnew BinaryWriter( fs );
binWriter->Write( aa );
binWriter->Close();
}
}

731:728
09/12/22 01:08:58
>>730
すいません、他のサブルーチンがひっかけてました。
ありがとうございました。

732:デフォルトの名無しさん
09/12/22 01:35:39
>>731
そうそう、BinaryWriterのCloseは、大元のストリームもCloseすることになっているから、
fs->Close()は無くても平気だよ。もちろん、あっても害はないから気にしなくても全然問題ない。

733:デフォルトの名無しさん
09/12/24 02:58:29
すみません、
普通、構造体のインスタンスに、STLで見かける.size()メンバなんて有りませんよね?

URLリンク(marupeke296.com)
ここの「アニメーション上位レベル構造体」が「SetLoopTimeメソッド」で.size()されていて
そのままインスタンスを作ってコンパイルしようとすると、当然のように
>error C2228: '.size' の左側はクラス、構造体、共用体でなければなりません
と出ます。
この構造体は何か、普通と違った使い方をしているのでしょうか?
それとも私が、何か知らなければいけない事を知らないだけなのでしょうか。

734:デフォルトの名無しさん
09/12/24 04:52:19
>733
C++は詳しく知らないし、僕が昔使っていたときにはinterfaceなんてなかった気もするがおそらく

class CHighLevelAnimController : IHighLevelAnimController {
  private:
    vector<struct HLANIMATION_DESC> m_Amin;
   CHighLevelAnimController operator=(CHighLevelAnimController& c) { return c; }
  public:
    CHighLevelAnimController() { }
    ~CHighLevelAnimController() { }

    bool SetLoopTime(UINT, FLOAT);
...
};
CHighLevelAnimControllerクラスは、IHighLevelAnimControllerインターフェイスを継承(実装)して
m_Aminオブジェクトは、vector<>のようなテンプレートクラスのインスタンスとしてCHighLevelAnimControllerクラスまたはその基底クラスで定義されている

interfaceキーワードに詳しい人詳細キボン

735:デフォルトの名無しさん
09/12/24 05:39:46
>>734
Windowsでは、どこかのヘッダで#define interface structってされているだけ。

>>733
自分も、m_Animは実際にはなんらかのSTLコンテナか何かなのだと思う。

736:デフォルトの名無しさん
09/12/24 11:08:03
>>734 >>735
何か特別な使い方かと思いましたが、STLに包んでいるとかなのですね。
ありがとうございました。

737:デフォルトの名無しさん
09/12/28 16:13:02
すみません。
起動や大型のファイル群を読み込むなどで10秒前後待たせる時
画面にLoading表示やその進行状況を表示したいのですが、
あれはどう実装するものなのでしょうか?

普通に組むと1つの工程(ファイルなど)単位で処理が停止してしまいますし、
「Loading」「読み込み画面」などの検索ワードでは違うものばかりHitし、
実現方法を見つけられずにいます。 何かご助言を頂けると幸いです orz

738:デフォルトの名無しさん
09/12/28 16:24:50
マルチスレッド

739:デフォルトの名無しさん
09/12/28 16:57:06
1ファイルの読み込み途中の経過を出したいなら、読み込みの関数を呼ぶ度に進行状況のウィンドウを書き換える

740:デフォルトの名無しさん
09/12/28 17:13:38
>>738
ググってみました。マルチプロセス処理というものが有るのですね。
これで実現への道筋が見えました。ありがとうございました。

>>739
そうですね。その程度なら勉強~開発時間を殆どかけずにやれそうですね。
ありがとうございました。

741:デフォルトの名無しさん
09/12/28 17:15:01
凝ったLoading画面を作るならマルチスレッドが楽
止まってないことだけ示したいなら、一部読み込んでは表示、を繰り返せばいい

742:デフォルトの名無しさん
09/12/28 17:15:41
マルチプロセスとマルチスレッドは一般的には別物だぜ

743:デフォルトの名無しさん
10/01/04 09:19:30
端折れば
マルチプロセス>メモリ空間が別
マルチスレッド>同じメモリ空間

744:デフォルトの名無しさん
10/01/04 14:01:26
HAL研のプログラミングコンテストの難易度をおしえてください。
ひととおり文法勉強したんですが、難しく思えます

745:デフォルトの名無しさん
10/01/04 18:35:29
2009年のを見たけど、C++を適切に勉強していれば(文法的には)難しくはないと思うけどな
最短経路問題とかその類のロジックを問う問題でしょ
文法が分からないのであればそれ以前のレベルってことだね

746:デフォルトの名無しさん
10/01/04 19:20:51
どうやらプログラミングではなく、アルゴリズムを競うコンテストっぽいね。



747:デフォルトの名無しさん
10/01/04 21:20:54
>>744
俺も去年の春からプログラミングを勉強し始めたばかりで参加してるけど
アルゴリズムを考えるだけだから文法がわかってれば何も難しくもなくね?

難易度はどうですかって質問の答えにはなってないとは思うけど

748:デフォルトの名無しさん
10/01/05 01:18:43
>>745
>>746
>>747

なるほど。じゃ用意されている関数を使えるレベルすらないので
もう少し勉強してからトライします。もう終わりそうですけど。
レスありがとうございました。

749:デフォルトの名無しさん
10/01/07 06:18:50
openmpはマルチプロセスにする方法はありますか?

750:デフォルトの名無しさん
10/01/07 14:17:20
const Hoge*
const Hoge&
Hoge const*
Hoge const&

の違いを実例を挙げて詳しく教えてください。

751:デフォルトの名無しさん
10/01/07 16:17:41
実例だったら自分で組んでみれば分かるだろ。

752:デフォルトの名無しさん
10/01/07 17:02:22
俺も
const&
の2つがよくわからん。

753:デフォルトの名無しさん
10/01/07 17:18:14
const Hoge& と Hoge const& は一緒だから気にするな
& を超えて Hoge& const になると変わる

754:753
10/01/07 17:19:46
ごめん
何かわけのわからんことを言った
参照はもともと変更不可だから Hoge& const のようなものは無かった
Hoge* const はある

755:デフォルトの名無しさん
10/01/07 17:30:50
>>754もちつけ。参照も変更可能。
#include <iostream>
int main() {
int a = 10, b = 20;
int &r = a;
std::cout << r << std::endl;
r = b;
std::cout << r << std::endl;
/*
int &const cr = a; // `const' qualifiers cannot be applied to `int&'
std::cout << cr << std::endl;
cr = b;
std::cout << cr << std::endl;
*/
int *const cp = &a;
std::cout << *cp << std::endl;
//cp = &b; // error: assignment of read-only variable `cp'
std::cout << *cp << std::endl;
return 0;
}

756:デフォルトの名無しさん
10/01/07 21:52:05
delete this;
って適切に現在?のオブジェクトを破棄してくれるのですか?

757:デフォルトの名無しさん
10/01/07 22:21:38
適切に使えば

758:デフォルトの名無しさん
10/01/07 23:39:12
>>755
>>753が言ってるのは「別のオブジェクトを指すように変更することはできない」ってことだよ。
Hoge&は最初からHoge*const相当で、参照にHoge*に対応するものはないんだから。

759:デフォルトの名無しさん
10/01/08 09:32:09
>>758
別のオブジェクトを指すように変更することはできない?
いつからそうなってんの?w

int a = 10, b = 20;
int &r = a;
std::cout << r << std::endl;
r = b;
std::cout << r << std::endl;

これを実行して確認しる。

760:デフォルトの名無しさん
10/01/08 09:33:45
>>758
あーごめんw 俺が狂ってた。
r = b;
これはひょっとして、代入されてるのか。
( つд∩)うえーん
( つд・∩)チラ

761:デフォルトの名無しさん
10/01/08 09:42:09
int a = 10, b = 20;
int &r = a;
std::cout << &a << ' ' << &b << std::endl;
std::cout << r << ' ' << &r << std::endl;
r = b;
std::cout << r << ' ' << &r << std::endl;

実行結果:

0x22cce4 0x22cce0
10 0x22cce4
20 0x22cce4

___
←樹海| オワタ
 ̄|| ̄ ┗(^o^ )┓三  >>753 >>758 両氏ごめん
 ||    ┏┗  三
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

762:デフォルトの名無しさん
10/01/08 09:50:12
学校の課題で配列に10個の実数を入力して最大値と最小値を求める問題なんですが、最大値は正常に出力されますが、最小値がうまく出力されません。
#include<stdio.h>
int main (void)
{
float x[11];
float max,min;
int i;
printf("実数を10個入力してください\n");
for ( i = 1; i <= 10; i++){
scanf("%f",& x[i]);
}
max = x[0];
for ( i = 1; i <= 10; i++){
if (x[i] > max){
max = x[i];
}
}
min = x[0];
for ( i = 1; i <= 10; i++){
if (x[i] < min){
min = x[i];
}
}

printf("最大値は%fです\n",max);
printf("最小値は%fです\n",min);
return 0;

}
どこが原因なんでしょうか?

763:デフォルトの名無しさん
10/01/08 09:56:55
x[0]が未初期化

764:デフォルトの名無しさん
10/01/08 12:59:46
すみません。複数のクラスを辿りループ処理をするプログラムで
クラス毎に1度だけ変数の初期化をさせたい場合、
1.コンストラクタを使う  (再初期化が必要になった場合、結局の後者いずれかが必要に・・?)
2.各クラスのグローバルスコープに初期化用のstatic boolを置いて処理
3.初期化用メソッドを別に作って纏めて管理

この3つが思い付くのですが、
どういう初期化が定番、もしくは設計的に無難だと思われますでしょうか?

765:デフォルトの名無しさん
10/01/08 13:29:43
staticイニシャライザじゃダメなの?

766:765
10/01/08 13:30:28
ごめんJavaと勘違いしてました

767:デフォルトの名無しさん
10/01/09 09:17:09
>764
辿るのはクラスなのオブジェクトなの?
初期化するのはクラス毎なのオブジェクト毎なの?
どんな処理しようとしてるのかが良く分からない。
擬似コードでいいから書いてみてくれた方が答えやすい。

「クラス毎に1度だけ」の条件を抜いた上で感覚で答えれば、
それが本当に「初期化」ならコンストラクタにすると思う。
状態の再設定が必要なら reset() みたいなメソッドも作るだろうね。

>各クラスのグローバルスコープ
言いたいのはクラススコープじゃね?

768:デフォルトの名無しさん
10/01/10 12:33:35
>>767
初期化じゃなくて再設定って言わないとですね;

>各クラスのグローバルスコープ
すみませんでした、そんなの無いですよね;
つい完成するまでは1行で済むクラスの置いてるソースファイルのグローバルスコープにstatic boolを置く癖から。。  表現に注意します;

そして、変数の再設定メソッドが良さそうですね・・ありがとうございました。

769:デフォルトの名無しさん
10/01/15 17:08:21
すみません。
「配列にはしたくない変数名の末尾」に数字を付けるのは、滅多に見ない気がするのですが、何か危険なのでしょうか?
以前はhennsuuA ..B ..C としていたのですが、最近はhennsuu1 ..2 ..3 とやっているのですが・・

770:デフォルトの名無しさん
10/01/15 17:10:45
そういう命名がふさわしい場合が滅多に無いから

771:デフォルトの名無しさん
10/01/15 17:16:39
a, b, c, 1, 2, 3 なんて機械的な命名ではなく、それぞれの変数の役目に合った意味のある名前を付けるべき
いい名前が思い浮かばないのなら変数名スレに相談してみては

772:デフォルトの名無しさん
10/01/15 17:22:51
単純に通し番号を振るのがふさわしいような場合は、普通は似たような処理をそれぞれ
の変数に適用するだろうから、素直に配列にすることが多いだろ。
配列はふさわしくないが通し番号がふさわしい、という場面が滅多に無いから、そういう
命名も滅多に見ないだけ。
で、その言い方だと頻繁に通し番号を振ってるようだから、やはり命名がおかしいか、
よほど特殊なジャンルで活動しているか。まぁ、後者ならこんな質問は出ないだろうと
思うので、多分前者だろう。

773:デフォルトの名無しさん
10/01/15 17:24:18
たまに通し番号が多発しやすいジャンルもあるから、何を作っててそういうコードに
なるのか知りたい気もする

774:デフォルトの名無しさん
10/01/15 18:12:39
>>770-773
ありがとうございます。危険性そのものは多分、無いのですね。
私のプログラミング能力の低さから来てる問題なのが大半だとは思います。

あとは、
変数1の値に応じて処理をわけ、変数2の値に応じて処理を分け と
どっちも1桁の数値だから配列にして置いてても良いのですが、
一応種類が全く違う2つなので、名前を別にしたいのですが
違い過ぎると使い間違えそうになるので・・とりあえずa, b, c, 1, 2, 3 と
やっちゃってました。

変数名スレッドなるものが有るんですね。 探して見てこようかと思います。
ありがとうございました。

775:デフォルトの名無しさん
10/01/15 19:05:36
まーゲームなんかだと変数名にシリアル振りたくなることはある
でも今時そこまでガチに汚く組まないと困ることはコンシューマでも珍しい

776:デフォルトの名無しさん
10/01/15 22:33:15
意味は異なるが関連のある変数?
なら構造体にするとか

777:デフォルトの名無しさん
10/01/16 17:07:00
ポインタを配列形式でアクセスするとき、添字に負の数を指定するのは文法上許されるのでしょうか。
int a[10];
int *p = a+5;

p[-4] = 0;

778:デフォルトの名無しさん
10/01/16 17:10:40
>>777
値の正負は文法上の問題ではないので、非負の値が許されるなら当然、文法上は、有効。

779:デフォルトの名無しさん
10/01/17 00:43:20
けどすごい紛らわしい書き方だな…

780:デフォルトの名無しさん
10/01/17 12:01:30
まぁ素直に*(p-4)=0と書いた方がいいわな。1[p]とかと似たような空気を感じる。

どうでもいいけど、-4[p]=0は試してないけど有効じゃなさそうだな、優先順位的に。

781:デフォルトの名無しさん
10/01/17 18:13:26
一連の流れでmalloc/freeを連想した

782:デフォルトの名無しさん
10/01/17 20:05:01
>>780
(-4)[p] なら大丈夫

783:デフォルトの名無しさん
10/01/17 20:17:49
そんな書き方、文法が許しても俺が許さん

784:デフォルトの名無しさん
10/01/17 20:38:04
コーディング規約とかで人のプログラミングスタイルを制限するのは
ナンセンスだと思っている俺ですら>>782はぶち殺したくなる


785:デフォルトの名無しさん
10/01/18 09:30:44
べつにいいやんw 一箇所だけとか、少ないときは。
きっと清涼剤のようにさわやかになれるぞ。

786:デフォルトの名無しさん
10/01/18 09:40:05
なれねーよw

787:デフォルトの名無しさん
10/01/18 21:22:34
マジックナンバーならまだ一目でわかるが

int a[10];
int *p = a+5;
int n = -4;
/* 数十行のコード */
n[p] = 0;

とかなってたら明確な悪意を感じる

788:デフォルトの名無しさん
10/01/19 20:40:13
すみません。
共通の変数50個を扱うデータクラスA(インスタンスは500個)に関連して
10種x1~20の配列(ムラの激しい追加情報)が必要なのですが、
全部データクラスAに入れてしまうと、約190個x400インスタンス=76000個分ほどの変数は無駄になる計算で・・。
STLを使うなりクラスをバラにするなり考えているのですが
こういう場合、どうデータを管理するのが定番、妥当なのでしょうか?

789:デフォルトの名無しさん
10/01/19 21:05:01
たかが76000個くらい気にしない、というのも一つの解決方法

790:デフォルトの名無しさん
10/01/19 21:24:38
76000個のインスタンス一つは組み込み型程度なの?
とりあえず気にしないで作ってだめそうだったら工夫するとか?
76000個をヒープに取ったらまずい?


791:デフォルトの名無しさん
10/01/19 21:44:52
使うときに使う分だけ配列を確保すればいいんじゃね?

792:デフォルトの名無しさん
10/01/19 23:57:49
それは本当に配列でなければいけないの?

793:デフォルトの名無しさん
10/01/20 01:55:58
>788
>共通の変数50個
この段階でクラスの切り分け方ミスってるような気もするが。

追加情報については STL のコンテナ使うなり(コンテナの選択は追加、削除、検索の発生の仕方次第)、
適当なクラスにラップするなり、ケース次第だと思う。
追加情報に対して単なるコンテナ以上の操作が必要ならばクラスにラップするかもね。

794:デフォルトの名無しさん
10/01/22 19:56:01
>>789-793
ありがとうございます。巻き添えらしいアクセス制限で返事が遅れてすみません。
今は、言われてみれば数十KB位のようですし、そのままデータクラスAに入れて使う事にします。
問題になってきたらご助言を参考に改良したく思います。
ありがとうございました。

795:デフォルトの名無しさん
10/01/27 13:10:49
すいません。
DIRECT法(DIviding RECTngle)のプログラムを組むことになったのですが、
どうにもとっかかりが無くて困っています。
おおよその理論は分かっているのですが、形にすることが全くできません。
ググって見たりはしたものの、それらしきプログラムソースは落ちていませんでした。
助けていただくことはできますでしょうか?


796:デフォルトの名無しさん
10/01/27 13:36:39
>>795
ググると普通にあるけど…?
ソースが欲しいって訳?

797:デフォルトの名無しさん
10/01/27 18:44:46
>>796
ソースがあれば、いただけると幸いです。

798:デフォルトの名無しさん
10/01/29 17:20:14
795
どなたかお願いします。
書き忘れましたが、C++です。

本当に困ってます

799:デフォルトの名無しさん
10/01/29 17:43:15
留年したまえ

800:デフォルトの名無しさん
10/01/29 17:53:41
>落ちていませんでした

こういうこと書かれると手伝う気うせる

801:デフォルトの名無しさん
10/01/29 20:13:46
>>800
なんでだよw

802:デフォルトの名無しさん
10/01/29 20:25:14
>>801
なんでだよじゃねえだろ。失礼甚だしい

803:801
10/01/29 22:04:27
>>802
まあ・・・確かに落ちているという表現はあまり良くなかったかもしれんな。

ま、その辺は本人がきっと弁明するということで。


804:デフォルトの名無しさん
10/01/29 22:32:16
>>803
お前がその本人だろ・・・
何しれっと他人の振りしてんだよ

805:デフォルトの名無しさん
10/01/30 00:01:15
>>804
いや別人だから失敬な。


まあ何だっていいけど。
証明方法がないもんなぁ。


806:デフォルトの名無しさん
10/01/30 16:20:48
795です。
ご指摘の通り「落ちている」という表現は悪かったと反省してます。
ただ本当に困っています。どなたか助けてくれる方いましたら
本当にお願いします。

807:805
10/01/30 16:26:09
>>806
このスレには低能力者しかいないから
別のスレ(スレリンク(tech板)とか)
に行ってみたらどうでしょうか?

> 証明方法
fusianasanがあったか。
でもまあ晒したくないからやめとこう。

808:805
10/01/30 18:03:11
>>806
言い忘れたが、常識で考えてくれ。
このままだとマルチポストになるぞ。

どっちかでは別スレに行ってきますと断りをいれましょう。


809:デフォルトの名無しさん
10/01/30 18:25:36
すいませんでした。別スレ行きます

810:デフォルトの名無しさん
10/01/30 19:22:32
.                   ____
    _              | (・∀・) |
   `))             | ̄ ̄ ̄ ̄
    ´             ∧
                <⌒>
                 /⌒\
       _________]皿皿[-∧-∧、
    /三三三三三三∧_/\_|,,|「|,,,|「|ミ^!、
  __| ̄田 ̄田 / ̄ ̄Π . ∩  |'|「|'''|「|||:ll;|
 /__,|==/\=ハ, ̄ ̄|「| ̄ ̄ ̄ ̄|「| ̄ ̄|
/_| ロ ロ 「 ̄ ̄ ̄ | | 田 |「|  田 田 |「|[[[[|
|ll.|ロ ロ,/| l⌒l.l⌒l.| |    |「|        |「|ミミミミミミ

811:保守
10/02/06 11:57:12
URLリンク(exlight.net)
C++の初期化指定は複雑
C++の初期化は恐ろしく複雑になってて,

struct S {
int a;
static int b;
int c;
} s = { 1, 3 };

と書いたらs.a = 1,s.c = 3と初期化されるなんてルールも決まっている.あんまり深入りしないでおこう….


812:デフォルトの名無しさん
10/02/06 13:12:32
複雑というより落とし穴だらけ、という感じだな

813:デフォルトの名無しさん
10/02/06 14:04:51
>>811
まあねえ
静的メンバは外で定義しないといけないしね
そうしないとコンパイラから叱られる

814:デフォルトの名無しさん
10/02/06 17:21:56
だが、スタティックメンバ変数程度で*恐ろしく*複雑ってのは、さすがにどうよ?
そりゃCよりは複雑だけど、C++に限らず、いまどきの言語でクラス変数使ったら
同じような状況になるし、少なくともスタティックメンバ変数の初期化ルールは
*恐ろしく*なんて形容されるほどじゃないと思うんだが。

ついでに聞きたいんだけど、C++に限らず、みんなが「こいつは複雑だ」と思った
言語仕様ってある?
例えば多重継承とかテンプレートとかは複雑?簡単?

815:デフォルトの名無しさん
10/02/06 17:49:22
テンプレートの部分特殊化のルールは複雑だと思う

816:デフォルトの名無しさん
10/02/06 17:50:05
あとADLは時々わけがわからなくなる
STLが吐く長いエラーメッセージはさすがに慣れたけど

817:デフォルトの名無しさん
10/02/06 17:55:31
ヘッダに const 定義しても ODR にならない場合のルールは複雑だ。

818:デフォルトの名無しさん
10/02/07 11:35:00
そりゃわかにくく書こうと思えばわかりにくく書けるさ
とにかく他人にも,そして自分にもわかりやすく書くだけ
忘れた頃に見ても

819:デフォルトの名無しさん
10/02/10 02:26:30
座標入れようと思ってdouble[3]のvectorを作ったはいいが、push_backしたときにエラー出る。
仕方ないから

struct XYZ{
double array[3];
XYZ(){}
XYZ(const XYZ&xyz){memcpy(array, xyz.array, sizeof(double)*3);}
~XYZ(){}
XYZ &operator[](unsigned int n){ return array[n]; }
};

って作ったけど、もっと楽にできなかったのかなぁ?


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