スレを勃てるまでもな ..
2:デフォルトの名無しさん
09/07/19 22:33:48
まんこしゃぶり虫乙
3:デフォルトの名無しさん
09/07/19 23:02:47
刀、 , ヘ
/´ ̄`ヽ /: : : \_____/: : : : ヽ、
,. -‐┴─‐- <^ヽ、: : : : : : : : : : : : : : : : : : : : : : }
/: : : : : : : : : : : : : :`.ヽl____: : : : : : : : : : : : : : : : : : /
,. -─「`: : : : : : : : : :ヽ: : : : : : : : :\ `ヽ ̄ ̄ ̄ フ: : : : :/
/: :.,.-ァ: : : |: : : : : : : : : :\: : : : :: : : :ヽ \ /: : : :/
 ̄ ̄/: : : : ヽ: : : . . . . . . . . . . .、 \=--: : : :.i / /: : : : :/
/: : ∧: \: : : : : : : : : : ヽ: :\: : : 〃}/ /: : : : :/ 、
. /: : / . : : :! ヽ: : l\_\/: : : : :\: ヽ彡: : | /: : : : :/ |\
/: : ィ: : : : :.i: : | \!___/ ヽ:: : : : : : :\|:.:.:.:/:! ,': : : : / |: : \
/ / !: : : : :.ト‐|- ヽ \: : : : : l::::__:' :/ i: : : : :{ |: : : :.ヽ
l/ |: : :!: : .l: :| \: : : l´r. Y {: : : : :丶_______.ノ: : : : : :}
l: : :l: : :ト、| 、___,ィ ヽ: :| ゝ ノ '.: : : : : : : : : : : : : : : : : : : : : : /
|: : :ト、: |: :ヽ ___,彡 ´ ̄´ ヽl-‐' \: : : : : : : : : : : : : : : : : : イ
!: :从ヽ!ヽ.ハ=≠' , ///// ///u /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
V ヽ| }/// r‐'⌒ヽ イ〉、
ヽ、______ー‐‐' ィ´ /:/:7rt‐---、 こ、これは>>1乙じゃなくて
ィ幵ノ ./:/:./:.! !: : : : :!`ヽ ポニーテールなんだから
r‐'T¨「 |: | !:.∨:/:./: :| |: : : : .l: : : :\ 変な勘違いしないでよね!
/: : .|: :| !:.!ィ¨¨ヾ、:.:/ !: : : : l: : : : : :.\
4:デフォルトの名無しさん
09/07/20 17:32:48
テンプレートやマクロやらを使ったりして、クラスの変数名を変更する事ってできますか。
class point {
double x, y, z;
コピー等の処理
point特有の処理
}
class color {
double r, g, b;
コピー等の処理
color特有の処理
}
というのを
class Bass {
a, b, c ← この名前を継承先のクラスに応じて動的に変化させたい
コピー等の処理
}
class point : public Bass {point特有の処理}
class color : public Base {color特有の処理}
一応、取り敢えず現在の実装では
class point : public Bass {
GetX(), SetX(...)
point特有の処理
}
とかやってます。これをp.SetX(100)とやってるのをp.xとできたらうれしいなと。
5:デフォルトの名無しさん
09/07/20 18:19:38
>>4
参照でいけないかな
class base {
protected:
double a, b, c;
};
class point : public base {
public:
double &x, &y, &z;
point() : x(base::a), y(base::b), z(base::c) { }
};
class color : public base {
public:
double &r, &g, &b;
color() : r(base::a), g(base::b), b(base::c) { }
};
6:デフォルトの名無しさん
09/07/20 18:45:06
>>5
ありがとうございます。
なるほど、テストしてみたらいけました。
データ量は、かなり増えてしまいそうですね;
ついでに、速度に関して実験してみました。
point p;
base b;
for(int i=0;i<1000000;i++)
for(int j=0;j<1000;j++)
p.x = tmp[j]; または b.a = tmp[j];
で比較したら、5%ほどオーバーヘッドがあるようです。思ったよりも速かった。
VSで実験してますが、最適化オプションつけると、b.aが全部最適化で
省略されてしまうのでDebugモードでの比較です。
コンパイル時に、この辺を上手く置き換えてくれる技とかがあると面白いのですが。
7:4
09/07/20 19:42:03
個人的には、こんなのを作ってはいるのですが。
ちょっとソースが汚いのとがちょっとアレなんです。
#define SET_BASE(name, a, b, c) \
template <class Ty> \
class base_ ## name { \
public: \
base_ ## name () {\
static_cast<Ty&>(*this).##a = 10; \
static_cast<Ty&>(*this).##b = 10; \
static_cast<Ty&>(*this).##c = 10; \
} \
};
SET_BASE(point, x, y, z)
SET_BASE(color, r, g, b)
class point : public base_point<point> {
public:
double x, y, z;
};
class color : public base_color<color> {
public:
double r, g, b;
};
8:デフォルトの名無しさん
09/07/20 19:50:35
個人でやってるプログラム?チームでやるなら保守を妨げる要因にしかならんと思うんだけど。
colorクラスにalphaが加わったらどうすんのよ?まぁ同じ事をそこらに書くのが面倒くさいってのは分かるけど。
9:デフォルトの名無しさん
09/07/20 19:59:33
個人です。実用性というより、単なる趣味ですねw
10:デフォルトの名無しさん
09/07/20 20:15:11
メンバ変数のアクセサ書くの面倒だったらGET_SET_ACCESSORをパクるってのは?
11:デフォルトの名無しさん
09/07/20 20:46:17
>>10
カプセル化置いてけぼりのアクセサ書くなら
もうオブジェクト指向やめれ。
12:デフォルトの名無しさん
09/07/20 20:58:15
つーか、大量にそういうの使うってことかね?
やり方自体を変えた方が良さそうだけど。
13:デフォルトの名無しさん
09/07/20 21:08:34
>>11
えっ?GET_SET_ACCESSORはメンバ変数へアクセス(set/get)するためのメンバ関数を作るマクロですけど?
14:デフォルトの名無しさん
09/07/20 21:10:42
だ か ら
>>13
カプセル化置いてけぼりのアクセサ書くなら
もうオブジェクト指向やめれ。
15:デフォルトの名無しさん
09/07/20 21:13:27
>>13
カプセル化知らないん?
カプセル化とは 【encapsulation】 - 意味/解説/説明/定義 : IT用語辞典
URLリンク(e-words.jp)
16:デフォルトの名無しさん
09/07/20 21:14:20
普通に考えたら、colorクラスのa,b,cとポイントクラスのx,y,zは
たまたま現在の実装がdoubleなだけで、意味するところは別物だから
同じにしようとは思わないと思うがなー
17:デフォルトの名無しさん
09/07/20 21:15:13
setで引数のチェックしたり、getで何か処理するならGET_SET_ACCESSORは使えないけど、
単純に代入、returnするだけならGET_SET_ACCESSORでいいんじゃないの?
18:デフォルトの名無しさん
09/07/20 21:18:47
>>17
>単純に代入、returnするだけ
それがカプセル化置いてけぼりにしてるってことなんじゃ
19:デフォルトの名無しさん
09/07/20 21:22:19
>>17
頼むから、カプセル化のことも思い出してあげてください。
20:デフォルトの名無しさん
09/07/20 21:24:43
単純に代入/returnするなら構造体でもいいけど
class使ったほうが利便性が良いならメンバ変数をprivateにしてアクセサを用意してあげれば良いんじゃないの?
で、いちいちset〜、get〜書くのが面倒ならGET_SET_ACCESSOR使えばって話なんだけど?
>>15
知ってるわ。
21:デフォルトの名無しさん
09/07/20 21:33:20
>>20
じゃあ重要性を知らないって事?
22:デフォルトの名無しさん
09/07/20 21:37:11
>>20
もう構造体とかクラスとか語る資格なさすぎる。
どこの言語使いだった人?
23:デフォルトの名無しさん
09/07/20 21:38:59
あんまりいじめるなよ。
24:デフォルトの名無しさん
09/07/20 21:39:54
>>22
C/C++/C#、Javaとか色々。カプセル化は情報隠滅も含むもんじゃないの?
本来は別々のものらしいけど、調べてもほぼ等価みたいな扱いしてるところ多いし。
たしか前スレでもそういうこと言ってたと思うけど。
25:デフォルトの名無しさん
09/07/20 21:39:57
エスペラント語一級です。
26:デフォルトの名無しさん
09/07/20 22:36:56
隠滅はマズいんじゃね?
27:デフォルトの名無しさん
09/07/20 22:39:55
隠蔽は良くないよ
28:デフォルトの名無しさん
09/07/20 22:42:07
なんだよ隠滅って隠滅はないわ。
○隠蔽
×隠滅
だねorz
29:デフォルトの名無しさん
09/07/20 22:54:07
OS:XP
VisualStudio 2005 C++
バイナリファイルから文字列を抽出しようとしているのですがうまくいきません。
文字列は "amai_skin.dds" です。 直前にint型の文字数+null文字(14)が入っています。
抽出直前のブレークポイントでファイルポインタを覗くときちんとこの文字列が入っています。
int len;
fread(&(len), sizeof(int), 1, fp);
↓パターン1
char* tests = 0;
fgets(tests, len, fp); // 実行時エラー(Expression: (string!=NULL) || (cout==0))
↓パターン2
char* tests = 0;
fread(tests, len, 1, fp); // 実行時エラー(Expression: (buffer!=NULL))
↓パターン3
string tests;
fread(&(tests), len, 1, fp); // エラーは出ないが "n.dds" とだけしか格納されない
30:デフォルトの名無しさん
09/07/20 22:56:55
>>29
ファイル入出力以前の問題。
URLリンク(www.kouno.jp)
6.2や6.8を参照のこと。
31:デフォルトの名無しさん
09/07/21 00:01:27
↓パターン4
vector<char> tests;
tests.resize(len);
fread(&(tests[0]), len, 1, fp);
で、無事取り出せました。多謝!
32:デフォルトの名無しさん
09/07/21 01:49:52
文字を入れる領域が確保できてないよ。
× char* tests = 0;
○ char tests[256];
33:デフォルトの名無しさん
09/07/21 13:57:47
いまさらですが、メンバを変更しないメンバ関数にはconstをつけるようにし始めました。
ただ、メンバを参照すらしない、ただの便利関数みたいなのがあるのですが、
これについてはconstではなく、staticメンバにするのがスジでしょうか?
便利関数を分類してまとめてライブラリにするのがまっとうな流れだとも思いますけど…
34:デフォルトの名無しさん
09/07/21 14:01:40
>>33
static関数にするとクラス名に依存することになるので、
仮令そのインスタンスを参照していなくても密接に関わる関数ならconstメンバでいいと思う。
また、クラスそのものにも関係ないような関数ならそもそもメンバにしておかない方がいい。
35:デフォルトの名無しさん
09/07/21 14:02:51
privateなstaticメンバ関数ならよく作ってるよ
もちろんstaticな便利関数をユーティリティクラスにまとめることもある
要するにどっちもアリ
36:デフォルトの名無しさん
09/07/21 14:11:44
ご意見ありがとうございました。
クラスとの関係が強いものについてはconst、そうではないものについてはprivateなstaticにしようと思います。
メンバに入れるべきでは無いというのは重々承知しておりますが、当方、メンテのため。。やむを得ずです。
37:デフォルトの名無しさん
09/07/21 19:49:05
#include <iostream>
using namespace std;
int x = 0;
class B {
public:
B() : b(::x) {};
virtual ~B() {};
void func() {cout << __FUNCTION__":" << b << endl;};
virtual void vfunc() {cout << __FUNCTION__":" << b << endl;};
private:
int b;
};
class D : public B {
public:
D() : d(::x) {};
virtual ~D() {};
void func() {cout << __FUNCTION__":" << d << endl;};
virtual void vfunc() {cout << __FUNCTION__":" << d << endl;};
private:
int d;
};
int main(void) {
B& r = D();
r.func();
r.vfunc();
x = 100;
r = D();
r.func();
r.vfunc();
return 0;
}
38:デフォルトの名無しさん
09/07/21 19:49:46
B::func:0
D::vfunc:0
B::func:100
D::vfunc:0
2回目のD::vfuncが0になるのはどうして?
39:デフォルトの名無しさん
09/07/21 20:15:55
まず、B& r = D();がコンパイルエラーにならない時点でダメ。もし、VCなら必ず/W4か/Zaを付けろ。
仮に、D d; B& r = d;だとして話を進める。
r = D();は左辺の型がB&だから、クラスBの暗黙に生成されるoperator =(const B&)が呼ばれる。
それは当然Bのメンバを代入するだけなので、r.dの値は変化しないというわけ。
40:デフォルトの名無しさん
09/07/21 20:24:07
なるほど!d!
41:デフォルトの名無しさん
09/07/21 22:27:54
すごいことかんがえたぞ!ぼくてんさい!あいちゃん!
もうたんじゅんなせったげったをかくひつようはないよ!
class Accessor {
protected:
template <typename T> class Proxy {
private:
T m_val;
public:
Proxy() : m_val() {}
Proxy(const T& val) : m_val(val) {}
Proxy(const Proxy& rhs) {m_val = rhs.m_val;}
Proxy& operator=(const Proxy& rhs) {m_val = rhs.m_val; return *this;}
operator T() const {return m_val;}
};
};
class Foo : public Accessor {
public:
Proxy<int> m_bar;
Proxy<double> m_baz;
};
int main(void) {
Foo foo;
foo.m_bar = 100;
foo.m_baz = 1.23;
cout << foo.m_bar << endl;
cout << foo.m_baz << endl;
return 0;
}
42:デフォルトの名無しさん
09/07/22 19:24:57
OPENGL(c++でコーディング)の描画処理のなかの、
「(A型の変数) = (A型の変数)」(×約6000ループ)
という処理をわけあって、
「(A型の変数) = (vector< vector< A > >型の変数)」(×約6000ループ)
という処理に変えただけで滅茶苦茶重くなりました
データ量だけでなく、代入処理でも速度に違いが出てくるものなのでしょうか?
43:デフォルトの名無しさん
09/07/22 19:33:00
A型の変数にvector< vector< A > >型の変数をいれられるの?
44:デフォルトの名無しさん
09/07/22 19:34:40
代入演算子さえ書けば・・・
45:デフォルトの名無しさん
09/07/22 19:50:56
書き方が悪かった・・・実際にはこんな感じです
// 軽いバージョン
A vertex;
A vertex_data[n];
B face[n];
for(int i=0;i<6000;i++){
for(int j=0;j<3;j++){
vertex = vertex_data[(face[i].v_index[j])];
}
}
↓
// 重いバージョン
A vertex;
vector< vector<A> > vertex_data;
vector< vector<B> > face;
for(int i=0;i<1;i++){ // 必須の記述
for(int j=0;j<6000;j++){
for(int k=0;k<3;k++){
vertex = vertex_data[i][(face[i][j].v_index[k])];
}
}
}
46:デフォルトの名無しさん
09/07/22 19:51:06
毎週ジャンプ1冊買って帰ってたのを
わけあって100冊買って帰るように
しただけで滅茶苦茶筋肉痛になりました
冊数だけでなく、歩き方でも体の負担に違いが出てくるものなのでしょうか?
47:デフォルトの名無しさん
09/07/22 19:54:05
それだとそんなに重くならないような気がするなぁ
役に立てそうにない
48:デフォルトの名無しさん
09/07/22 19:55:55
またデバッグバージョンとかいうオチじゃ・・
49:デフォルトの名無しさん
09/07/22 20:06:12
アッー!
どっちもデバッグモードでした(・ω・)
ループ外の初期処理が相当重くなったんですが、
デバッグモードだとループ内の処理速度にも影響を及ぼすということでしょうか・・・?
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
マナたん(藁)→ロベールの次に読めるまともな本を教えて下さい
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5020日前に更新/231 KB
担当:undef