スレを勃てるまでもないC/C++の質問はここで 12 at TECH
[2ch|▼Menu]
[1からを表示]
50:デフォルトの名無しさん
09/07/22 20:07:48
ちなみにリリースにするとどっちも速度はほぼ同じになりました(´д`;)

51:デフォルトの名無しさん
09/07/22 20:11:45
ループ外が重くなったというのはさておき、
ループ内の処理速度が相当遅くなってることは明らかだったの?

52:デフォルトの名無しさん
09/07/22 20:15:23
明らかでした。
1秒30フレームで動いていたものが1秒1フレームくらいになりました

53:デフォルトの名無しさん
09/07/22 20:20:10
そっか。変なこと言ってスマソ。
リリースビルドでがんばれ?

54:デフォルトの名無しさん
09/07/22 20:20:19
あ、ループ内の処理速度が遅くなった・・・のではなく、
実行時はループ外は関係ないので、ループ内の処理が重くなってるんだろう・・・と考えたのです

実際、ループ内の処理速度に違いがあるかはよくわかりません。
ただ、ループ外で大幅に処理を追加したので、そいつがデバッグモードだと実行時に常に影響を与え続けるのかな?という疑問です

55:49
09/07/22 20:24:42
あ、言うの忘れてしましたが環境はXP、Visual Studio 2005です
念のため。

56:デフォルトの名無しさん
09/07/22 20:26:47
vectorとかデバッグ時にはありがた迷惑なエラーチェックをたくさん入れてくれて遅くなるかもしれない
リリース時にはきれいさっぱり消え去ってあんまり影響ない

57:デフォルトの名無しさん
09/07/22 21:40:22
>>56
VCだとReleaseでも有難迷惑なコードが大量にorz...


58:デフォルトの名無しさん
09/07/23 00:50:22
Releaseでなんか残ったっけ?

59:デフォルトの名無しさん
09/07/23 01:18:49
>>58
VC8から、Debug/Releaseの指定にかかわらず、
もれなくvector/dequeのoperator []やイテレータに範囲チェックが入るようになった。
それが要らないなら_SECURE_SCLを0と定義する。
URLリンク(msdn.microsoft.com)

60:デフォルトの名無しさん
09/07/23 06:25:17
中身が同じ2つのメンバ関数が必要なんだがどうすればいい?
const T* hoge() const;
T* hoge();
それなりに長いんでコピーしたくない

61:デフォルトの名無しさん
09/07/23 06:28:34
const_castして呼び出せ

62:デフォルトの名無しさん
09/07/23 06:30:15
>>60
Effective C++くらい読もうよ。

63:デフォルトの名無しさん
09/07/23 06:43:58
>>61 トン
>>62 前見たときこれは無理と思ったけどそろそろ読めるかも


64:デフォルトの名無しさん
09/07/23 07:03:04
>>63
要するにthisをconst_castな
Effective C++の初版の21項
「使える時は、必ずconstを使おう」を読むと良い

65:デフォルトの名無しさん
09/07/23 12:55:48
Effective C++は邦訳の改訂第2版しか持ってないんですが
初版の古本とか見たら買ったほうがいいですか

66:デフォルトの名無しさん
09/07/23 15:05:34
>>65
改訂2版でいいよ
俺が言ったのは第3版との区別を付けるため

67:デフォルトの名無しさん
09/07/23 15:18:33
こんな感じかえらい汚いなあ

template <class T>
class Test {
T i;
public:
Test(T t) : i(t) {}
T* func() {
return &i;
}
const T* func() const {
return const_cast<const T* const>(const_cast<Test<T>* const>(this)->func());
}
};

int main()
{
Test<double> t(123);
const Test<int> t2(456);

std::cout << *t.func() << std::endl;
std::cout << *t2.func() << std::endl;
}

68:デフォルトの名無しさん
09/07/23 15:58:53
釣りか素か知らんが黙っとれ

69:デフォルトの名無しさん
09/07/23 16:01:38
>>68
お馬鹿?

70:デフォルトの名無しさん
09/07/23 17:09:54
釣り・・・だよなw

71:デフォルトの名無しさん
09/07/23 17:32:59
iterator it;

(*it).guhehe();


なんで皆これを

it->guhehe();

にしないの?

72:デフォルトの名無しさん
09/07/23 17:34:31
皆ってどの範囲の皆?

73:デフォルトの名無しさん
09/07/23 17:51:33
>>71
エスパー回答すると、以前のSTLのイテレータは後者の
書き方ができなかった

74:デフォルトの名無しさん
09/07/23 17:56:49
ファクトリメソッドに関してなんですけど、独習デザインパターンという本に
class FooFactoryBase {
    public: virtual Foo* create() = 0;
};
class HogeTypeFooFactory {
    public: virtual Foo* create() {return new HogeTypeFoo();}
};
int main(void) {
    FooFactoryBase* factory(new HogeTypeFooFactory());
    Foo* foo(factory->create());
    foo->vfunc();
    delete foo;
    delete factory;
}
とするとクライアントのほうの変更も少なくて便利だよ、みたいな事が書いてあったんですが
なぜこんなまどろっこしいことをするんでしょうか?関数ポインタを使って
typedef Foo* (*createFoo)();
HogeTypeFooFactory {
    public: static Foo* create() {new HogeTypeFoo();}
}
int main(void) {
    createFoo create(HogeTypeFooFactory::create);
    Foo* foo(factory->create());
    foo->vfunc();
    delete foo;
}
と、書いたほうがnew/deleteも少ないし、コードも短いし、仮想テーブルの分メモリも少なくてすむし
再コンパイルするのは新規のファクトリとそれを使うクライアントだけだし、いろいろと優れてるように思えます
継承を使って新しいファクトリを作る利点ってほかに何かあるんでしょうか?

75:デフォルトの名無しさん
09/07/23 18:19:31
答えは簡単、Javaには関数ポインタがないからさ

76:デフォルトの名無しさん
09/07/23 18:28:43
んー、どっちでもいいような気もするねぇ。
ところで、関数ポインタ版の
Foo* foo(factory->create());は
Foo* foo(create());じゃないの?

77:デフォルトの名無しさん
09/07/24 14:22:04
>>66
回答ありがとうございます。ちょっと安心しました。

Efecctive C++第3版も買いたいと思ってますけど、
Amazonレビューみるかぎり翻訳がよくないらしいですね…

78:デフォルトの名無しさん
09/07/24 14:44:16
そお?悪くはなかったよ。
改定第2版を訳してる吉川邦夫先生に比べると落ちるというだけで。
少なくともMore Effective C++よりは数段いいし、
Effective STLと比べても良く出来てる。

79:デフォルトの名無しさん
09/07/24 15:14:25
>>77
翻訳はそこまで悪くない。
Amazonのレビューは鵜呑みにしないほうが良いと思う。

80:デフォルトの名無しさん
09/07/25 11:36:01
#include <iostream>

namespace name1 {
void func() {std::cout << __FUNCTION__ << std::endl;}
};

namespace name2 {
void func() {std::cout << __FUNCTION__ << std::endl;}
};

int main(void) {
using name1::func;
func();
func();
func();

using name2::func;
func();
func();

return 0;
}

こんな感じでusingを使いたいんですが、名前が競合していけませんよといわれました
前回のusingをキャンセルする、上書きする方法はありませんか?

81:デフォルトの名無しさん
09/07/25 12:02:02
>>80
int main(void) {
{
using name1::func;
func();
func();
func();
}
{
using name2::func;
func();
func();
}
return 0;
}
これじゃ駄目なの?

82:デフォルトの名無しさん
09/07/25 12:09:49
その手がありましたか!
関数ポインタ使うところまでは考えたんですがこれのほうがわかりやすくていいですね

83:デフォルトの名無しさん
09/07/25 17:42:12
class Point{
double m_x,m_y;
Point():m_x(0.0),m_y(0.0){};
};
Triangle{
Point m_p[3];
Triange():((m_p(){Point()});
};
上のような感じで、Triangleのコンストラクタでm_p[]の初期化を行いたいのですが、
やり方がよくわかりません。m_p[]をうまく初期化する方法はないでしょうか

84:デフォルトの名無しさん
09/07/25 17:53:36
C++にて

double型の変数xが
確実に正の数(0でないことも負でないこともわかっている)であるとき、
それを10進表示した整数部分の桁数を求める
最も良い(簡単&速い&標準C++準拠)な方法は何でしょうか?



85:84
09/07/25 17:55:48
追記
  文字列表示させる方法もありで。


86:デフォルトの名無しさん
09/07/25 18:09:17
10以下になるまで10で割って割った回数を計ったりするのが一般的
データの分布がdoubleの表現範囲で一様なら二分探索のほうが早いかな

87:84
09/07/25 18:18:42
>>86
俺はいつも(って程でもないが)
std::log10でやったりしているんだけど
そっちの方が速いのかね?


88:デフォルトの名無しさん
09/07/25 18:22:25
%sで文字列にして.までの数を数える。

89:84
09/07/25 18:24:11
>>86
ありがとうございます。
それが一般的なのですね。

>>87
参考にさせていただきますが、
なりすましはご遠慮ください。

>>88
それもありですね。
ありがとうございます。

90:デフォルトの名無しさん
09/07/25 18:28:38
>>86
それって一般的なのかね。

91:デフォルトの名無しさん
09/07/25 20:22:11
>>86 は無いだろう
そんなコード書いてきたら突っ返す

92:デフォルトの名無しさん
09/07/25 21:01:41
>>84
浮動小数点の指数部を取り出して0.3を掛ける。


93:デフォルトの名無しさん
09/07/25 21:27:25
>>92
標準C++準拠だとして、それで行けるの?

94:デフォルトの名無しさん
09/07/25 22:13:22
1000までの数で5a+7b+11c+13d+17e(aからeは0以上の整数)で表せる
全ての数のリストを求めるにはどうすれば良いですか


95:デフォルトの名無しさん
09/07/25 22:25:04
LinuxでC++のプログラム開発するときって、
今は、どうするのが普通?

Eclipseとか使うものなのか?

俺が、大昔にやったときは、Emacs上で全てをシコシコ
してたが、時代は変わってない?

96:デフォルトの名無しさん
09/07/25 22:26:20
>>94
深さ優先探索の考え方でできるよ

97:デフォルトの名無しさん
09/07/25 22:26:21
>>83
現在は残念ながら一般的には無理。
ただし、デフォルト初期化で良ければ、Triange(): m_p() {}とは書ける。

>>93
std::frexpが使えると思う。

98:デフォルトの名無しさん
09/07/25 22:32:18
>>94
表せない数が1 2 3 4 6 8 9だけじゃねーかw

99:デフォルトの名無しさん
09/07/25 22:42:21
まじっすか
実際は問題がもっと複雑で、5,7,11,13,17が
数千個の合成数になります
ただ、考え方は一緒かと思って簡略化してしまったもので

とりあえず深さ優先探索で頑張ってみます


100:83
09/07/25 23:01:22
>>97
int型の配列を初期化しているサンプルを見つけたので
似たようにして初期化できないか苦しんでました。デフォルト値では初期化できるんですね
とりあえず諦めます。ありがとうございました。

101:デフォルトの名無しさん
09/07/25 23:02:16
数千個・・・って逆に表せない数字減るんじゃねーか?
一回表せた数字の整数倍は全部表せるから
幅優先でやって倍数をチェックしたほうが早くなると思う

102:デフォルトの名無しさん
09/07/25 23:02:29
>>100
現行のC++では無理。
ごまかしで良ければboostで出来たと思う。

103:デフォルトの名無しさん
09/07/25 23:20:07
#include <iostream>

class hoge {
private:
    struct fuga {
        fuga(int num[3], int v1, int v2, int v3) {num[0] = v1; num[1] = v2; num[2] = v3;}
    };

    fuga m_fuga;
    int m_num[3];

public:
    hoge(int v1, int v2, int v3) : m_fuga(m_num, v1, v2, v3) {
        std::cout << v1 << std::endl;
        std::cout << v2 << std::endl;
        std::cout << v3 << std::endl;
        };
};

int main(void) {
        hoge h(1, 2, 3);

        return 0;
}

なんか使うのが不安なコードだ・・・
コンストラクタ1回分無駄にするのを承知で素直に{}のなかで代入したほうがいいってことかな
つーか配列の数わかってて数も少ないならint num1, num2, num3;とかで十分だよね

104:デフォルトの名無しさん
09/07/25 23:45:48
    struct fuga {
        fuga(int num[3], int v1, int v2, int v3) {num[0] = v1; num[1] = v2; num[2] = v3;}
    };

の num[3] はどこから拾ってきたのかしら

105:94
09/07/25 23:59:15
やっと出来た
現時点でlimit=10000で50秒ぐらいかかるのでこれじゃ解けなさそう(しかもlimit周辺の値は若干不正確)
幅優先探索って、エラトステネスの篩みたいなやり方?

void solve(VI& v,set<int>& r,int limit){
VI tmp;
int m=*max_element(r.begin(),r.end());
int n=*min_element(v.begin(),v.end());
copy(r.begin(),r.end(),back_inserter(tmp));
for(int i=0;i<v.size();++i){
transform(tmp.begin(),tmp.end(),inserter(r,r.begin()),bind1st(plus<int>(),v[i]));
}
if(n+m<limit){solve(v,r,limit);}
}

//vは{5,7,11,13,17}
//rに結果が入る
solve(v,r,1000);

106:デフォルトの名無しさん
09/07/26 00:03:31
追記:rの初期値も{5,7,11,13,17}

107:デフォルトの名無しさん
09/07/26 06:41:59
>>95
プロジェクトによるけど、viとmakeでやってるところも普通にあるよ。
開発にEclipse使うばあいでも、Eclipseインストールしてなくても
ビルドできるようにしておくことが多い。

108:デフォルトの名無しさん
09/07/26 12:28:08
>>94
なんか題意を正しく把握できてるか不安だが、こんなんでどうよ?

#include <stdio.h>

#define N 1000

char list[N+1];
int num[5] = {5,7,11,13,17};

void f(int n, int pos)
{
int i;

list[n] = 1;
for(i=pos; i<5; i++) {
int temp = n + num[i];
if(list[temp]) continue;
if(temp > N) return;
f(temp, i);
}}

int main(void)
{
int i;

f(0,0);

for(i=0; i<=N; i++) if(list[i]) printf("%d ", i);

return 0;
}

109:デフォルトの名無しさん
09/07/26 12:46:35
>>108
>>99
数千個らしいよ

110:デフォルトの名無しさん
09/07/26 19:34:33
なんでもかんでもクラス化するのって逆に害ですよね?
ビットフラグとかむき出しのほうがいいと思うんですけど

111:デフォルトの名無しさん
09/07/26 19:55:16
>>110
確かに
> なんでもかんでもクラス化
は害になることもあるよ。

でも「なんでもかんでもクラス化すべきでない」っていう人の
大概は、「適切な対象でもクラス化できる技量がない」人だったりするんだよね。

112:デフォルトの名無しさん
09/07/26 20:11:44
>>110 何でもかんでもクラス化するべきですよ。ビットフラグなんか特に。

113:デフォルトの名無しさん
09/07/26 21:36:50
1次元で確保された配列を二次元とみなして使うとして
このとき配列Aの(x1, y1)から(x2, y2)のデータを配列Bの(X, X)から(X+(x2-x1), Y+(y2-y1))にコピーしたい時は
ループまわしてひとつひとつコピーするしかないでしょうか

114:デフォルトの名無しさん
09/07/26 21:51:27
>>113
基本的にはそう。
環境によってはSIMD使って16byteまとめて転送
の様な高速化はできるけど。

115:デフォルトの名無しさん
09/07/27 13:25:52
>>113
せめてX方向1ライン分くらいmemcpyしたら?

116:デフォルトの名無しさん
09/07/27 13:43:11
>>113
x方向にデータが連続していると言う条件はつくけど、std::copyでも使えばいいんでない。
# cなら>115で。

117:デフォルトの名無しさん
09/07/27 13:50:18
そうですね組み込み以外でもつかうんでstd::copyします
>>115,>>116どうもでした

118:デフォルトの名無しさん
09/07/27 19:18:23
C++
コンソールで、カーソルの位置を一行上に挙げたいのだが。
エスケープシーケンスは使えん。
使えるように設定できるのは知ってるが、別の方法で頼んだ。

119:デフォルトの名無しさん
09/07/27 19:21:34
で、その結果は?

120:デフォルトの名無しさん
09/07/27 20:32:20
shared_ptrって

(*p).hoge() と p->hoge();ってどっちがいいの?

121:デフォルトの名無しさん
09/07/27 21:01:46
p->hoge();


122:デフォルトの名無しさん
09/07/27 21:46:51
>>120
何のためにアロー演算子があると思っているのだ。
p->hoge()
が望ましい。

123:助けて
09/07/27 22:16:07
10進数から2進数に変える時、2進数を補数表現で表すプログラムを教えて下さい。

ドシロウトなんで、お願いします。

124:デフォルトの名無しさん
09/07/27 22:19:51
>2進数を補数表現で表す
???????????????

125:デフォルトの名無しさん
09/07/27 22:39:30
>123

十進数 -10 を変換したとして
-1010 ではなく 1111111111110110 と表示したいのか?

126:デフォルトの名無しさん
09/07/27 22:49:21
補数って、1の補数とか2の補数ってやつだよな。
もう忘れた。

127:デフォルトの名無しさん
09/07/27 22:53:44
>>123
signed intなりsigned longに代入したあとに1ビットずつビット演算で取り出す

128:助けて
09/07/27 22:54:36
>125

はい。その通りです。

129:デフォルトの名無しさん
09/07/27 23:05:28
class hoge {
private:
int *p;

public:
hoge(int x) : p(new int[x]) {}
~hoge() {delete [] p;}
void fuga() {・・・}
};

int main(void) {
try {
std::cin >> x;
hoge h(x);
}
catch(std::bad_alloc& e) {
std::cout << e.what() << std::endl;
}

h.fuga();

return 0;
}

↑スコープが外れちゃうからh.fuga()でコンパイルエラーになってしまう
自動変数に対してtry-catchする場合はtryスコープを伸ばすしかない?
保守性を考えて自動変数からスマートポインタに変えるのがいいのかな?

130:デフォルトの名無しさん
09/07/27 23:18:10
>>128
#include <bitset>
#include <iostream>

using namespace std;

int main() {
const unsigned long value = 10;

bitset< 16 > b( value - 1 ), result;
result = ~b;
cout << result.to_string() << endl;
}

131:デフォルトの名無しさん
09/07/27 23:23:38
>>129
君が try しているのは hoge オブジェクトじゃないのか?
それなのに、どうして try の外でそのオブジェクトを使おうとするのだ…。

132:デフォルトの名無しさん
09/07/27 23:41:46
tryしたいのは生成だけなのに延々としたまでスコープを伸ばしたくないんです
tryスコープの中って処理重くなりそうだし、できるだけ短くしたほうがよかないですかね?

133:デフォルトの名無しさん
09/07/27 23:44:25
catchは下のほうにまとまってたほうがよかないか?

134:デフォルトの名無しさん
09/07/27 23:46:42
tryの中だから遅くなるなんてことはない。
実装にもよるが、tryに入るとき、抜けるとき、throwするとき、(catchして)catch節を抜けるときなど
基本的に要所要所でしかコストはかからないとみていい。

135:デフォルトの名無しさん
09/07/27 23:47:17
>>132
わかるわかる。
自転車がパンクしてるかどうかをチェックしたいし、その結果は大事だけど、その後はもちろん自転車に乗るってことだよね

136:デフォルトの名無しさん
09/07/27 23:51:54
あ、あんまし遅くならないんですね
ずっと中の人が監視してなにか操作するたびチェックしてるのかと思ってた・・・
とすると
void func() {
    try{
        // 全処理
    }
    catch(ex1 &e) {
        // 〜
    }
}
    catch(...) {
        // 〜
    }
}
みたいにやるほうがいいのか
どうもどうも。すっきりしました

137:助けて
09/07/28 00:01:45
>130

ありがとです

138:デフォルトの名無しさん
09/07/28 09:48:09
なんでC++の標準ライブラリのヘッダって、.h って統一的なファイル名の
つけ方をやめちゃったの?
拡張子ついてないから、扱いつらくない?

139:デフォルトの名無しさん
09/07/28 10:27:12
>>138
多分苦肉の策だと思う

140:デフォルトの名無しさん
09/07/28 11:01:49
>>138
標準化委員会に言ってくれ。

まあ一応 統一的に(一様に).h付いてないから
俺は許せるけど。

141:デフォルトの名無しさん
09/07/28 11:17:45
>>138
それがファイルでなくても構わないから。

142:デフォルトの名無しさん
09/07/28 11:23:14
タイプ量が減ってありがたいじゃないか。

143:デフォルトの名無しさん
09/07/28 11:35:21
>>141
その点は、Cの.hも同じですがね。

144:デフォルトの名無しさん
09/07/28 14:02:41
.hppが一番クール

145:デフォルトの名無しさん
09/07/28 14:20:10
>>138
Effective C++の49項を見る限りは、.hと差別化する最も単純な方法として
拡張子を無くす案が採られたみたいだね。

146:デフォルトの名無しさん
09/07/28 15:03:46
hxxじゃだめだったんかな

147:デフォルトの名無しさん
09/07/28 15:08:47
画面に指定した座標の点をプロットしたいのですが、
そういったことが出来る簡単なC++ライブラリはありますか?


148:デフォルトの名無しさん
09/07/28 15:11:05
DXライブラリを使いましょう

149:デフォルトの名無しさん
09/07/28 15:11:10
Win32API

150:デフォルトの名無しさん
09/07/28 15:13:10
ありがとうございます。
DirectXスレかAPIスレに逝ってきます

151:デフォルトの名無しさん
09/07/28 15:39:11
>147がLinux使いだったら大笑いだな。まさしく、井蛙の愚だ。

152:デフォルトの名無しさん
09/07/28 15:44:43
>>151
敢えて触れない方がいいと思ったけど、とっても気になったので理由を聞かせてもらおうか

153:デフォルトの名無しさん
09/07/28 16:05:34
>>151
何で?


154:デフォルトの名無しさん
09/07/28 16:18:05
DXライブラリもWinAPIもWindows用だからだろ。JK

155:デフォルトの名無しさん
09/07/28 16:22:26
MACかもしれないといってみるテイスト

156:デフォルトの名無しさん
09/07/28 17:14:57
それがなんで井蛙の愚につながるの?
誰も井の中の蛙ではなくないか?

157:デフォルトの名無しさん
09/07/28 17:17:58
自身の環境を書かない>147や、Windowsだと決めて掛かる>148-149をからかったんだろうけれど、
顧みすれば>151自身が井の中の蛙になっている罠。

158:デフォルトの名無しさん
09/07/28 17:22:37

井(い)の中の蛙(かわず)大海(たいかい)を知らず

自分の狭い知識や考えにとらわれて、
他の広い世界のあることを知らないで
得々としているさまをいう。
井蛙(せいあ)。

まあ・・・なんかどうでも良くなってきた。

159:デフォルトの名無しさん
09/07/28 17:24:58
PC
デバイスA デバイスBでシリアル通信する。

PCからはデバイスA,Bに対して交互に1S間隔で
リードコマンドを発行している。
AまたはBがある状態になるとリードコマンドに対して
1バイトの'b'を返すようになる。
デバイスA、Bともには電源立ち上げ時バージョン情報等を
PCに送るがその文字列の中に'b'が含まれている。
PC側はリードコマンドに対する応答の'b'だけを判断したい。
デバイスA,Bの電源立ち上げ時の情報は固定ではく、'b'が
含まれているとする。
このような内容だとどのようにコマンドに対する応答の'b'
であると判断するのがよいでしょうか?

160:デフォルトの名無しさん
09/07/28 17:32:02
PCのリードコマンドを出す前にPCの受信バッファを空にしておくとか?

161:デフォルトの名無しさん
09/07/28 17:36:31
>>157
決めてかかったわけじゃないですよ
質問者が使う環境じゃなきゃ質問者は勝手に捨て置くでしょ

162:デフォルトの名無しさん
09/07/28 18:21:09
掛け声みたいだな
「無礼者め手打ちにしてくれる、井蛙(せいあー)!!」

163:デフォルトの名無しさん
09/07/28 19:43:24
DXライブラリでゲームを作り始めたのですが、
メインループの書き方がおかしくないか不安です ><

#include "GV.h"

int WINAPI WinMain(
HINSTANCE hI,HINSTANCE hP,
LPSTR lpC,int nC
)
{
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return -1;

Flame* T = new Flame;
SetDrawScreen(DX_SCREEN_BACK);
while(!(ProcessMessage()) && !(CheckHitKey(KEY_INPUT_ESCAPE))
&& (T -> MainLoop()) && !(ScreenFlip()) && !(ClsDrawScreen()));

DxLib_End();
return 0;
}
こんな感じなんですが・・・・


164:デフォルトの名無しさん
09/07/28 19:48:27
もしかして: Frame

165:デフォルトの名無しさん
09/07/28 19:50:52
うわぁ・・・・
勢いだけで作成中なので英語力のなさが出た結果だとしか・・・
orz(それでもゲームを作りたいんです)

166:デフォルトの名無しさん
09/07/28 19:54:48
Yahoo!辞書 - flame
URLリンク(dic.yahoo.co.jp)


167:デフォルトの名無しさん
09/07/28 20:03:24
殻っていみのフレームのつもりがフレイムになってたなんて・・・
もしかしてこの質問ってスレチってやつでしょうか?

168:デフォルトの名無しさん
09/07/28 20:26:56
ゲームプログラムなら俺に聞け ってスレがあるよ

169:デフォルトの名無しさん
09/07/28 20:28:48
ゲ製の方を紹介してやれよ

170:デフォルトの名無しさん
09/07/28 20:46:04
ここより雰囲気のいいスレッドが見つけられないオ↓レ↑は、
専ブラで2chを覗く程度の初心者です。

171:163
09/07/28 21:31:24
とりあえず
スレリンク(gamedev板)
こっち行ってみます。ふんいきこわいけど・・・

スレチすマソでしたー。



172:デフォルトの名無しさん
09/07/28 23:21:22
classの全部のメソッドで通常の例外チェック再スローと
STLなどの外部ライブラリが出すかもしれない把握できない例外用のcatch(...){throw UnknownException();}
をやってるんですが、やりすぎでしょうか?
例外ってドキュメントが少なくてどうやればいいのかなかなか方針が定まりません

173:デフォルトの名無しさん
09/07/28 23:51:33
>>172
どう考えるかによるんじゃね?
例えばSTLの投げる例外ならそのままthrow;で外に再送してあげた方が
むしろ親切では?


174:デフォルトの名無しさん
09/07/29 00:33:01
カプセル化の事を考えて例外も隠蔽して
指定したもの以外出さないほうがいいかなぁと思ったんですが・・・

175:173
09/07/29 07:23:08
>>174
例外クラスは知ってるよね?
例えば
C++編(標準ライブラリ) 第27章 例外クラス
URLリンク(www.geocities.jp)
std::exceptionクラスを継承したものについては
そのまま投げてあげた方が。。
まあ再送しなくても内部で処理できる問題だったらいいけど、
そうでなくて全部例外を飲み込んでUnknownException();にしちゃうのは
どうだろう?

だれか他の方も意見くださいな。

176:デフォルトの名無しさん
09/07/30 19:50:12
shared_ptr<> でnew deleteがほんとに1対1になってるか確かめたいんですけど
グローバル変数を用意してコンストラクタで++、デストラクタで--とすればいいのかなと思うんですが
これだと組み込み型のカウントをするのに困ります。どうすれば良いでしょうか?

177:デフォルトの名無しさん
09/07/30 21:00:36
>>176
グローバルなoperator newとoperator deleteを定義すればいいと思う。

178:デフォルトの名無しさん
09/07/30 21:08:40
>>176何故?何のため?


179:デフォルトの名無しさん
09/07/30 22:07:31
コードを重複して書くのがいやなのでtemplateで書いた
けど公開するのは、例えば<int>と<double>だけに限定したい
こんなときはどうすればいい?

class Hoge {
private:
template <typename T> class Fuga {};

public:
typedef Fuga<int> _IntFuga;
typedef Fuga<double> _DoubleFuga;
};

typedef Hoge::_IntFuga IntFuga;
typedef Hoge::_DoubleFuga DoubleFuga;

これよりいい方法あったら頼む!

180:デフォルトの名無しさん
09/07/30 22:13:07
明示的な実体化をした実装を別ファイルに移して、
クライアントコードから見えなくする

181:デフォルトの名無しさん
09/07/30 22:54:19
>>180
いまいちわからないんだけど、

hoge.h
template < typename Type > class Hoge ;
template <> class Hoge< int > ;
template <> class Hoge< double > ;

hoge.cpp
#include "hoge.h"
template <> class Hoge< int > {} ;
template <> class Hoge< double > {} ;

main.cpp
#include "hoge.h"
int main( void ) { Hoge< int > ihoge ; Hoge< double > dhoge ; /* 〜 */ ; return 0 ; }

みたいな感じ・・・?
これだと結局重複したコードを書いてるから意味無いような
やりかたが間違ってるのかな?

182:デフォルトの名無しさん
09/07/30 22:58:33
ていうか↑コンパイルできないですね
もうちょっと勉強してきます

183:デフォルトの名無しさん
09/07/30 23:01:13
template関連はごちゃごちゃしてるので記憶が曖昧だが許してくれ。

hoge.h
template < typename Type > class Hoge;

hoge.cpp
template < typename Type > class Hoge { } ;
template class Hoge < int > ;
template class Hoge < double > ;

main.cpp
(同じにつき略)

184:デフォルトの名無しさん
09/07/31 02:13:34
class hoge{
private:
class hoge_sub{
};
std::vector<hoge_sub> a(20);
public:
};

class内で固定長のclass型の配列を作りたいのですが
VC++で
error C2059: 構文エラー : '定数'
というエラーを吐かれてしまいます
このような場合どうすれば良いのでしょうか

185:デフォルトの名無しさん
09/07/31 02:22:50
>>184
コンストラクタ初期化子
class hoge{
private:
class hoge_sub{
};
std::vector<hoge_sub> a;
public:
hoge() : a(20) {}
};

186:デフォルトの名無しさん
09/07/31 02:23:01
vectorはそもそも配列じゃないですし
可変長なので固定長にもなりません。^^
vectorではなく、配列を使ってください。
hoge_sub a[20]; のようにするのです。

187:デフォルトの名無しさん
09/07/31 02:52:31
>>185,186
ありがとうございます
class型の配列を扱いたいなと思った時に調べましたところ
vectorを使う方法が紹介されてましたので、誤って認識していました


188:デフォルトの名無しさん
09/07/31 07:17:30
>>187
せめて入門書一冊分くらいは基礎を学んでおいた方がいいとおもうぞ。

189:デフォルトの名無しさん
09/07/31 22:45:01
>>188
入門書として適切なものを教えてください。
いや、手元には独習がありますが、ぜんぜん足りないような気がしているのです。

190:デフォルトの名無しさん
09/08/01 00:53:20
ハーバートシルト先生に教えてもらっておいてまだ足りないとな?

191:デフォルトの名無しさん
09/08/01 08:06:09
独習C++なんて捨ててaccelerated C++とexceptional C++を読むんだ

192:デフォルトの名無しさん
09/08/01 10:16:59
独習C++半分ぐらい読んで、EffectiveC++、More〜を全部読んで、独習デザインパターンも半分ぐらい読んで、ゲーム作る程度にはそれで十分だった

193:デフォルトの名無しさん
09/08/01 10:36:12
あまりの糞さに独習(ryは半分で飽きたということですね…わかります

194:デフォルトの名無しさん
09/08/01 11:42:47
マナたん(藁)→ロベールの次に読めるまともな本を教えて下さい

195:デフォルトの名無しさん
09/08/01 18:27:53
#include <iostream>

class hoge {
private:
int x;

private:
class in_hoge {
public:
in_hoge() {std::cout << x << std::endl;}
};

in_hoge ihoge;

public:
hoge() : x(100), ihoge() {}
};

int main(void) {
hoge h; // output: 100

return 0;
}

コンパイルできないんだけど、どうやれば実装できるかな?

196:デフォルトの名無しさん
09/08/01 18:36:36
>>195
in_hogeのコンストラクタにxを渡せばいいんじゃね?

197:デフォルトの名無しさん
09/08/01 18:51:33
in_hogeの配列を確保する予定なので、コンストラクタに引数を渡せないのです・・・

198:デフォルトの名無しさん
09/08/01 18:57:14
配列使うかわりにvector使えばいいんじゃね?

199:デフォルトの名無しさん
09/08/01 21:48:17
stringのreserve()ってメモリをここでいっぺんに確保して後の操作で動的確保をなるべくしないようにってことでいいの?
resize()との違いがようわからん

200:デフォルトの名無しさん
09/08/01 21:48:44
URLリンク(d.hatena.ne.jp)

忍法ししちょびれ。

201:デフォルトの名無しさん
09/08/01 21:50:28
>>199
Yes, 高洲クリニック。
reserveは指定したサイズになるように「空き容量」を増やす。
resizeは指定したサイズになるように要素の数を増やすか減らす。
増えた要素は例えば0で埋められるし、減らされた要素は削除される。

202:デフォルトの名無しさん
09/08/02 18:41:23
VS C++ 2008 EE で コマンドラインから cl をつかってコンパイルする方法はないものですか?
パスをとおし、バッチファイルvcvers32.bat を実行しただけはうまくいかないようです。

203:デフォルトの名無しさん
09/08/02 18:45:50
>>202
それだけでできると思うけど、スタートメニューの中に
Visual Studio 2008 コマンドプロンプトとかいうのがあるはず。そっちが確実。

204:202
09/08/02 18:49:23
自己解決です。
URLリンク(msdn.microsoft.com)
に詳細がありました。でも専用のcmd を使わないとダメなようです。cygwin プロンプトから実行というわけにはいかないようです。


205:202
09/08/02 18:50:11
>> 203
ありがとうございます。

206:デフォルトの名無しさん
09/08/02 19:01:09
Javaスレ、 C++スレ迷いましたが、上のほうの板は荒れ気味なのでここで質問させてください。宜しくお願いします。
g++ (GCC) 4.2.4 です
java からC++ で作ったプログラムを使いたいのですが、どのような手順で作成すれば良いのでしょうか、
参考になるHP とかがあれば教えてもらえませんか。

207:デフォルトの名無しさん
09/08/02 19:01:53
>>204
Cygwin上で使いたいのなら、自分で環境変数INCLUDEとLIBとPATHを設定すればいい。
C++/CLIを使うならLIBPATHも。
内容はVisual Studioコマンドプロンプトの丸写しでいい。

あるいは、Visual Studioコマンドプロンプト上でCygwin.batを呼んで起動するという手もある。

208:デフォルトの名無しさん
09/08/02 19:02:37
>>206
まずはJNIでググるんだ。
よく分からなかったら、どこがどう分からないかを書き添えてもう1度聞きに来るといい。

209:デフォルトの名無しさん
09/08/02 19:16:43
>>208 さん、早速の回答ありがとうございます
やはりやり方といいますかjava で呼び出すことができるんですね、よく分かりました
Windows でもLinux でもdll を作成してJava Native Interface 機能を用いて呼び出すことができるんですね、どうもありがとうございました。

210:デフォルトの名無しさん
09/08/02 23:29:35
質問です。
C++でソケット使ったメール送信プログラム組んでます。

ループ内でコネクト・ライト・シャットダウン、クローズを
繰り返して複数メールの送信をしているのですが、
データ量が有る場合に送信されずにクローズしてしまいます。
送信バッファの指定・リンガ設定もしたのですが、変わりませんでした。
ソケット内での解決法やロジックでの解決法があれば
教えて下さい。。

211:デフォルトの名無しさん
09/08/02 23:32:05
ソースを晒さないとなんとも

212:デフォルトの名無しさん
09/08/03 00:54:59
>>210
パケットダンプ追えば、何がおきてるかわかるんじゃね?

213:デフォルトの名無しさん
09/08/03 01:47:48
関数の終了コード(errnoとか)は見てる?

214:デフォルトの名無しさん
09/08/03 16:07:40
msdnのドキュメントなんだが、関数別に投げる可能性のある例外とか書いてあるページって無いものかな?
知りたかったらいちいちソース読まないといけないんだろうか・・・

215:デフォルトの名無しさん
09/08/03 16:18:48
ないよー

ちなみに何の関数について知りたい?

216:デフォルトの名無しさん
09/08/03 16:36:11
>>215
今回知りたいのはtr1のmt19937とuniform_intですけど、ほかのも結構頻繁に気になります

217:デフォルトの名無しさん
09/08/03 18:19:23
最近の SDK には boost が含まれてるのか?

218:デフォルトの名無しさん
09/08/03 20:18:14
0xだろ

219:デフォルトの名無しさん
09/08/03 21:48:05
>>217
0xの先取りTR1
randomのほかshared_ptr, regex, unordered_map/setなんかのライブラリが入っている。

VC++では2008に拡張パックまたはSP1で導入できる。
URLリンク(msdn.microsoft.com)

220:デフォルトの名無しさん
09/08/03 21:52:33
VC++のSTLのソースってすごい見づらい

221:デフォルトの名無しさん
09/08/04 17:33:29
関数オブジェクトとかよくいうけど関数ポインタでいいじゃんっておもう
なにがすごいのこれ?

222:デフォルトの名無しさん
09/08/04 17:44:50
インライン展開できる

223:デフォルトの名無しさん
09/08/04 19:34:41
インスタンスが持てる

224:デフォルトの名無しさん
09/08/04 21:34:17
operator =ってコピコンみたいに継承元のコピー勝手に呼んでくれる、みたいな思いやりの精神は無いの?

225:デフォルトの名無しさん
09/08/04 21:47:11
コピコンにそんな機能あったのか

226:デフォルトの名無しさん
09/08/04 21:51:21
ないはず
勝手に呼ばれるのは継承元のデフォコンでは?

227:デフォルトの名無しさん
09/08/04 22:12:57
おまえら普通にコピコンとかデフォコンとかやめてください

228:デフォルトの名無しさん
09/08/04 22:13:45
Base::operator=を最初に呼ばないといかんのかめんどくさいな

229:デフォルトの名無しさん
09/08/04 22:15:28
じゃあシスコンで

230:デフォルトの名無しさん
09/08/04 22:18:21
デスコンとか超強そう

231:デフォルトの名無しさん
09/08/04 22:22:29
デスコン使うとか必死ですねwww

232:デフォルトの名無しさん
09/08/05 13:07:10
例外って難しいです・・・

233:デフォルトの名無しさん
09/08/05 16:30:13
さじを投げてるだけじゃん。
誰かが拾って続きやるかもしれないけど、そいつもさじ投げるかもね。

234:デフォルトの名無しさん
09/08/05 22:01:09
Enterを押したら処理が進むようにするにはどのようにすれば良いのでしょうか?
char dammy;
cin >> dammy;
cout >> "Hit";

のようにしてもEnterだけだと入力を受け付けられず、
なにか文字をいれてEnterをおさないと進みません。
よろしくおねがいします。

235:デフォルトの名無しさん
09/08/05 22:47:39
int dummy;
dummy = cin.get();
cout << "Hit";

236:デフォルトの名無しさん
09/08/05 23:00:53
>>235
ありがとうございます。
ぶじかいけつできました。!!

237:デフォルトの名無しさん
09/08/06 01:24:15
20個ものclassのインスタンスがあるのですが、
rand()%20 +1でせいせいした1~20までの数に合わせて
それぞれのインスタンスにメソッドを適用したいです。
classのインスタンスを引数にわたしてメソッドを実行する関数を書いたので
classの配列をつかってその関数にclassを渡したいです。Web検索で
vectorを使うとかの説明は1つだけ出てきたのですが詳しくわからないのでよろしくおねがいします。

具体的にいうと
class Hoge
{
public:
Hoge() {}
void fuga() {}
};

void foo(Hoge h)
{
h.fuga();
}
int main(void)
{
Hoge a;
Hoge b;
Hoge c;
hit = rand()%3 + 1;
class_array = なんらかのほうほうでa,b,cの配列
foo(class_array[hit]);
return 0;
}
と言う風にかけないかと思っています。
よろしくおねがいします。

238:デフォルトの名無しさん
09/08/06 01:29:08
Hoge a;
Hoge b;
Hoge c;
hit = rand()%3 + 1;

じゃなくて

Hoge class_array[3];
hit = rand()%3;

じゃだめ?

まあfooは参照かアドレスで渡すべきというのは置いておいて。


239:デフォルトの名無しさん
09/08/06 01:31:37
>>238
すみません、大事な部分を忘れていました。
a,b,cのコンストラクタにはいくつかそれぞれ別の引数を渡したいのですが、
それもふまえた上でよろしくおねがいします。(上のコードのclass Hogeのコンストラクタは引数をとる物に変更してください)

240:デフォルトの名無しさん
09/08/06 01:36:19
こら。

Hoge *class_array[3];
にして、それぞれ new すれば良いでしょ。

>それもふまえた上でよろしくおねがいします。
>(上のコードのclass Hogeのコンストラクタは引数をとる物に変更してください)

どんだけ上目線なの。



241:デフォルトの名無しさん
09/08/06 01:38:35
>>240
なるほど、なんとなくわかってきました。
ありがとう御座います。
>どんだけ上目線なの。
すいませんでした、いま自分の望んでいる動作を日本語にするのが難しくて
変な日本語になっていました。すいません。

242:デフォルトの名無しさん
09/08/06 01:40:17
実際はインスタンスが100個以上あるので、できればもう書いて生成してしまったインスタンスを
けしてそれぞれnewし直す事なく修正したかったのですが、無理なようですね。
とりあえずがんばろうと思います。

243:デフォルトの名無しさん
09/08/06 01:43:27
ポインタ知ってる?

244:デフォルトの名無しさん
09/08/06 01:49:11
どうやったらコンテナじゃないインスタンス100個とか糞みたいなコード書けるんだ

245:デフォルトの名無しさん
09/08/06 01:57:56
>>244
すいません、まだC++についてよくわかっていないのです..
おなじ種族に属する物で名前やジャンルが違うものを
100個の内50個はデフォルトでひつようで残りの50個は条件の違いによって
生成時に与えられるパラメータが違うという妙な仕様になっていて
しかも100個どれが使用されるかはわからないという変なプログラムなんですよ。
まあ簡単にいうと動物園みたいなものです。

246:デフォルトの名無しさん
09/08/06 02:03:37
配列にするのが嫌ならswitchでも使えばいいでしょ。
Hoge& selectHitTarget(Hoge& a, Hoge& b, Hoge& c)
{
switch(rand() % 3)
{
case 0: return a;
case 1: return b;
case 2: return c;
}
}
int main(void)
{
Hoge a;
Hoge b;
Hoge c;
Hoge& hit = selectHitTarget(a, b, c);
foo(hit);
return 0;
}

247:デフォルトの名無しさん
09/08/06 02:08:50
246は何の解決にもなってないので却下として、

生成時に与えられるパラメータでインスタンスの生成方法が変わるものを
100個分書いた時点でなんかもう…。ま、書き直しを勧めます。
普通はパラメータは外部配列にしておくか、アルゴリズムで与えて、
オブジェクトが100個だろうが100000個だろうがループで回して配列に
入れながら new するでしょうね。
#スケーラビリティと言います。

この後はアドレス渡しではまって、継承ではまって仮想関数ではまって…
となるのね。出題者は「わん」とか「にゃー」とか呼び分けたいだけなのに、
その手前で悩んでるパターンですかね。。。



248:デフォルトの名無しさん
09/08/06 02:25:46
static変数にパラメーターリストを入れて
デフォルトコンストラクタでそれを参照しながら初期化するとか
でもなんか気持ち悪いな・・・

249:デフォルトの名無しさん
09/08/06 02:30:53
オレだったらコンストラクタをテンプレート関数にして個々のメソッドの中にconstメンバを基にSTATIC_ASSERT吐く様にする

250:デフォルトの名無しさん
09/08/06 02:32:32
モンスターのパラメータ
ランダムエンカウント時のモンスター決定
かと思った

251:デフォルトの名無しさん
09/08/06 11:49:18
URLリンク(racanhack.sourceforge.jp)

このページのコードを実行したいのですがGlibはどうやって導入すればいいんでしょうか
WindowsXPでVisual Studio 2008 Expressを使ってます

252:デフォルトの名無しさん
09/08/06 13:37:37
>>251
GTK+の本家サイトでWin32版がダウンロードできるみたいだよ
URLリンク(www.gtk.org)

253:253
09/08/06 21:02:01
CもしくはC++でウェブ上の画像をURLを指定してhttpでダウンロードしたいのですが
できなくて困っています。

環境は下の通りです。
OS:windows XP
開発環境:Visual C++ 2008 ExpressEdition(win32プロジェクト)

htmlファイルならwininetを使ってダウンロードできたのですが、
画像だとできません。htmlファイルと同様に画像もできないのでしょうか?
また、wininet以外でいい方法があるなら教えてください。

サンプルプログラムは次に書きます。


254:253
09/08/06 21:06:00
HINTERNET hInet, hUrl;
char szBuf[128], *lpszSrc;
DWORD dwRead;
int nTotal = 0;
HGLOBAL hMem;
//目的のURLの入力
char szUrl[] = "URLリンク(hogehogehgoe.co.jp)";
hInet = InternetOpen("hoge",INTERNET_OPEN_TYPE_PRECONFIG,NULL, NULL, 0);
if (hInet == NULL) return -1;
hUrl = InternetOpenUrl(hInet, szUrl, NULL, 0, 0, 0);
if (hUrl == NULL) return -1;
//lpszSrcに1バイトのみ確保
hMem = GlobalAlloc(GHND, 1);
lpszSrc = (char *)GlobalLock(hMem);
while (1) {
InternetReadFile(hUrl, szBuf, (DWORD)sizeof(szBuf) - 1, &dwRead);
szBuf[dwRead] = '\0';
//読み出す物がなくなったのでループ脱出
if (dwRead == 0)break;
//必要バイト数の計算
nTotal += dwRead;
//確保領域の大きさ変更
hMem = GlobalReAlloc(hMem, nTotal, GMEM_MOVEABLE);
if (hMem == NULL) break;
lpszSrc = (char *)GlobalLock(hMem);
if (lpszSrc == NULL) break;
strcat_s(lpszSrc, nTotal+1, szBuf);
}

続く

255:デフォルトの名無しさん
09/08/06 21:07:14
strcat?
画像の途中に 0x00 があったら、そこで切れない?

256:253
09/08/06 21:07:18
//ファイル出力処理
std::ofstream fileout;
fileout.open("D:/hoge.jpg"); // 出力ファイルをオープン
if (!fileout){
MessageBox(NULL , TEXT("エラー!出力ファイルをオープンできません") ,TEXT("") , MB_OK);
return -1;
}
fileout << lpszSrc <<'\n';
fileout.close();

//メモリの解放
GlobalUnlock(hMem);
GlobalFree(hMem);
//インターネットハンドルの解放
InternetCloseHandle(hUrl);
InternetCloseHandle(hInet);

以上です。
すいませんがアドバイスください、お願いします


257:253
09/08/06 21:21:11
>>255
そうなんですか?
じゃあ画像ファイルの場合どうしたらいいのでしょうか?

258:デフォルトの名無しさん
09/08/06 21:30:44
どこまで格納したか覚えておいて、memcpyで

memcpy(&lpszSrc[現在の位置], szBuf, dwRead);
現在の位置 += dwRead;

みたいな感じで


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

5026日前に更新/231 KB
担当:undef