【初心者歓迎】C/C++室 Ver.50【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/02/28(木) 00:00:47ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1203478421/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2008/02/28(木) 00:04:57こっちのが早いかな
0003デフォルトの名無しさん
2008/02/28(木) 00:07:48これか?
0004デフォルトの名無しさん
2008/02/28(木) 00:08:260005デフォルトの名無しさん
2008/02/28(木) 00:15:180006デフォルトの名無しさん
2008/03/14(金) 21:41:58public:
Point();
void setPoint(Point p);
void printPoint();
private:
double x, y;
};
このクラスって、x,yに値を代入できますか?
0007デフォルトの名無しさん
2008/03/14(金) 21:47:04d=1.2-1.1
0.09999999999
d=1.0/10.0;
0.1
この違いは何故((((;゜Д゜)))?
0008デフォルトの名無しさん
2008/03/14(金) 21:50:29浮動小数点 誤差でググるんだ
0009デフォルトの名無しさん
2008/03/14(金) 21:54:07いえ、それは分かるのですがどちらも答えが0.1で循環小数になるのに
なぜ割り算の方だけ正確な答えが出るのか聞きたいのです。
0010デフォルトの名無しさん
2008/03/14(金) 22:01:11いまだに前前スレが落ちていない。
0011デフォルトの名無しさん
2008/03/14(金) 22:02:43【初心者歓迎】C/C++室 Ver.50【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1204124499/
0012デフォルトの名無しさん
2008/03/14(金) 22:03:171.0 とか 10.0 は誤差なく正確に表現できるが、
1.1 とか 1.2 は正確に表現できない (誤差が含まれている) から
誤差というのはだんだん蓄積するので、もともと誤差が含まれているもの同士を演算すると、さらに誤差が大きくなる
0013デフォルトの名無しさん
2008/03/14(金) 22:03:480014デフォルトの名無しさん
2008/03/14(金) 22:04:07int *num = new int[100*100*100];
これを0で初期化したいのですが
どうやればいいのでしょうか
forループで回す以外の方法ありますか?
0015デフォルトの名無しさん
2008/03/14(金) 22:05:520016デフォルトの名無しさん
2008/03/14(金) 22:06:10while ループ
0017デフォルトの名無しさん
2008/03/14(金) 22:07:35あ、演算結果じゃなくてそっちのほうの誤差だったんですね。
0018デフォルトの名無しさん
2008/03/14(金) 22:08:030019デフォルトの名無しさん
2008/03/14(金) 22:23:200020デフォルトの名無しさん
2008/03/14(金) 22:25:18int *num = new int[100*100*100]();
0021デフォルトの名無しさん
2008/03/14(金) 22:50:34これ知らないやつ多いよな
0022デフォルトの名無しさん
2008/03/14(金) 22:51:110023デフォルトの名無しさん
2008/03/14(金) 23:06:46最後の()は記入ミスだよな?
0024デフォルトの名無しさん
2008/03/14(金) 23:12:420025デフォルトの名無しさん
2008/03/14(金) 23:15:010026デフォルトの名無しさん
2008/03/14(金) 23:16:30intクラスのデフォルトコンストラクタを呼ぶという発想もできない奴
0027デフォルトの名無しさん
2008/03/14(金) 23:23:28配列 new なんて忘れて std::vector にするのがいいよ。
0028デフォルトの名無しさん
2008/03/14(金) 23:23:51class test{
int i;
test(){ test(1); }
test(int i){ this->i = i; }
}
こんな感じでコンストラクタをオーバーロードし、コンストラクタからコンストラクタを呼び出すことはできないのでしょうか?
0029デフォルトの名無しさん
2008/03/14(金) 23:26:02C++0xでは出来る様になるらしい
0030デフォルトの名無しさん
2008/03/14(金) 23:26:14現行の規格ではできない。 C++0x が普及するまでは private な初期化関数を
使うのがベスト。元々代入でいい(初期化にこだわらない)なら、違いは無い。
0031デフォルトの名無しさん
2008/03/14(金) 23:26:17003230
2008/03/14(金) 23:27:570033デフォルトの名無しさん
2008/03/14(金) 23:28:04短時間で返答ありがとうございました。
初期化関数を検討してみます。
0034デフォルトの名無しさん
2008/03/15(土) 01:26:57コンストラクタ内でコンストラクタを呼び出すことはできる。
しかし、JAVAのように望んだ結果にはならない。
0035デフォルトの名無しさん
2008/03/15(土) 01:38:00new(this)test(1);
とか
いろいろ怖いけど
0036デフォルトの名無しさん
2008/03/15(土) 01:43:08環境依存かもしれないが。
確かメンバ初期化子は無視されたはず。
0037デフォルトの名無しさん
2008/03/15(土) 01:48:020038デフォルトの名無しさん
2008/03/15(土) 01:49:380039デフォルトの名無しさん
2008/03/15(土) 02:37:450040デフォルトの名無しさん
2008/03/15(土) 02:52:150041デフォルトの名無しさん
2008/03/15(土) 03:10:100042デフォルトの名無しさん
2008/03/15(土) 03:21:070043デフォルトの名無しさん
2008/03/15(土) 03:58:10class Base {
public:
virtual void f() = 0;
protected:
Base() {}
~Base() {}
};
基底クラスのデストラクタは仮想にするべきなんですよね?でも、この基底クラスのデストラクタは仮想じゃない…
単なる書き忘れか?とか思ったんですが、よく見ると、デストラクタはprotectedになってます。ということは、
Base *p = new Derived();
delete p; // Base::~Base() はprotectedでアクセスできないのでコンパイルエラー
となると思います。ちょっと混乱したんですが、こうすると、
「派生クラスをnewして基底クラスでdeleteができなくなる代わりに、仮想デストラクタにしなくても問題ない」ということでしょうか。
わざわざこうして仮想デストラクタにしない理由は、速度の理由でしょうか
(それとも、new/deleteなんてしないで、普通にスタックに置いて使って欲しいっていう意味が込められてる?
0044デフォルトの名無しさん
2008/03/15(土) 04:04:40既定クラスでdelete出来なくなるかわりに、いちいち仮想関数が呼び出されるオーバーヘッドがなくなる。
0045デフォルトの名無しさん
2008/03/15(土) 04:21:20基本的に仮想関数を使うというのは、基底クラスからは静的には“見えない”関数を実行時に扱えるようにする為のもの。
0046デフォルトの名無しさん
2008/03/15(土) 07:27:51AMとかFMの?
0047デフォルトの名無しさん
2008/03/15(土) 08:01:340048デフォルトの名無しさん
2008/03/15(土) 11:17:002回newしないといけないのでしょうか?
例えば、下のようなことをしないといけないですか?
int** getPointerPointer()
{
int i = 123;
int* p = new int;//int値のためのメモリをロック(1回目)
*p = i;
int** pp = new int*;//intポインタのためのメモリをロック(2回目)
*pp = p;
return pp;
}
それともポインタのポインタだけnewすれば、
必要なメモリを全部ロックしてくれるんでしょうか?
0049デフォルトの名無しさん
2008/03/15(土) 11:42:53単一継承している時だけ使えるのなら問題はない。
0050デフォルトの名無しさん
2008/03/15(土) 11:45:09>ローカルでポインタのポインタを作る場合って、
>2回newしないといけないのでしょうか?
ローカル変数としてポインタのポインタを作りたいだけなら、int **p; と宣言するだけでいい。
>それともポインタのポインタだけnewすれば、
>必要なメモリを全部ロックしてくれるんでしょうか?
そんなことはない。自分でnewしたものしか確保されない。
そもそも>>48のコードを見ると、newしているとのはintとint*だけで、ポインタのポインタ(int**)はnewしていないが。
自分がやろうとしていることをうまく説明できていない、または
自分がその関数のなかで何をしたいのか整理できてないでしょ。
005150
2008/03/15(土) 11:46:16なんか変なこといってた。ゴメン、無視して。
0052デフォルトの名無しさん
2008/03/15(土) 12:00:24完全に無視されても困るかな。
こういう関数があった場合、
void show(const int* const* array_2dim, int i_size, int j_size) {
for(int i = 0; i < i_size; ++i) {
for(int j = 0; j < j_size; ++j) {
std::cout << array_2dim[i][j] << ", ";
}
std::cout << std::endl;
}
}
こういう風に使うなら new なんて要らないし、
const int array0[] = { 1, 2, 3 };
const int array1[] = { 4, 5, 6 };
const int array2[] = { 7, 8, 9 };
const int* const array_2dim[] = { array0, array1, array2 };
show(array_2dim, 3, 3);
こういう風に使うなら new を2回使う。
int** array_2dim = new int*[3];
for(int i = 0, n = 1; i < 3; ++i) {
array_2dim[i] = new int[3];
for(int j = 0; j < 3; ++j, ++n) {
array_2dim[i][j] = n;
}
}
show(array_2dim, 3, 3);
0053デフォルトの名無しさん
2008/03/15(土) 12:06:010054デフォルトの名無しさん
2008/03/15(土) 12:08:310055デフォルトの名無しさん
2008/03/15(土) 12:12:300056デフォルトの名無しさん
2008/03/15(土) 12:27:110057デフォルトの名無しさん
2008/03/15(土) 12:35:570058デフォルトの名無しさん
2008/03/15(土) 12:42:53それをロックするなんてとんでもない!
0059デフォルトの名無しさん
2008/03/15(土) 16:03:21現在、別スレッドからメインスレッドで処理するときはPostMessageを使ってますが、
他によい方法はありますか。
0060デフォルトの名無しさん
2008/03/15(土) 16:13:35メインループをMsgWaitForMultipleObjectsでまわすとか・・・
0061デフォルトの名無しさん
2008/03/15(土) 16:37:13よくこの文章の意味が判ったなぁ。
>別スレッドからメインスレッドで処理する
0062デフォルトの名無しさん
2008/03/15(土) 16:41:210063デフォルトの名無しさん
2008/03/15(土) 17:53:540064デフォルトの名無しさん
2008/03/15(土) 21:02:32オブジェクトを生成してあれこれする時
newして操作するのと
一時オブジェクトとして生成して操作するのは
どちらのほうが一般的なんでしょうか?
0065デフォルトの名無しさん
2008/03/15(土) 21:07:18そうする必然性が無いなら積極的には new しない。
0066デフォルトの名無しさん
2008/03/15(土) 21:12:33つまり、
vector<int> a(10);
のとき、
a[10]と書いてa[0]の意味になってくれるとうれしいんですが。
いまは添字をif文で判定してます。
0067デフォルトの名無しさん
2008/03/15(土) 21:13:550068デフォルトの名無しさん
2008/03/15(土) 21:14:01イテレータはしらね
0069デフォルトの名無しさん
2008/03/15(土) 21:18:42内包して似たクラスを作った方がいい。
0070デフォルトの名無しさん
2008/03/15(土) 21:21:36007148
2008/03/15(土) 21:38:34ありがとうございます。
ポインタのポインタはローカル変数で使うのでなく、
関数内で作った後、関数外の色んな場所で使います。
色んな場所で使うんですが、
中身を一括で変更しないといけない時があったので、
ポインタのポインタにしました。
0072デフォルトの名無しさん
2008/03/15(土) 21:40:360073デフォルトの名無しさん
2008/03/15(土) 22:22:23まあそういうこともある。
0074デフォルトの名無しさん
2008/03/15(土) 22:46:55007548
2008/03/15(土) 22:54:31イマイチ言わんとしていることがよく分かりませんでした。
下の用途でも、
int** array_2dim = new int*[3]; ←は、
int* array_2dim[3]; ←でいいんじゃなかと思うんですが。
0076デフォルトの名無しさん
2008/03/15(土) 23:00:23ねぇよw
一瞬何のことかとw
0077デフォルトの名無しさん
2008/03/15(土) 23:04:13配列のサイズがコンパイル時に決まるならそれでいいし、
コンパイル時に決まらないなら new するしかない。
0078デフォルトの名無しさん
2008/03/15(土) 23:08:10int** を使うから new を使うとかそういうことで決まるものではない。
0079デフォルトの名無しさん
2008/03/15(土) 23:11:520080デフォルトの名無しさん
2008/03/15(土) 23:12:400081デフォルトの名無しさん
2008/03/15(土) 23:12:57冷害がおきると米が不作になります
0082デフォルトの名無しさん
2008/03/15(土) 23:13:050083デフォルトの名無しさん
2008/03/15(土) 23:13:190084デフォルトの名無しさん
2008/03/15(土) 23:13:23構築済みの基本クラスとメンバ変数の分は呼ばれる
自分のは呼ばれない
0085デフォルトの名無しさん
2008/03/15(土) 23:26:08できれば例文を使ってやり方を示していただけませんか
0086デフォルトの名無しさん
2008/03/15(土) 23:27:37他の人が書いてる通り、構築済みメンバのみ呼ばれる。
あと、コンストラクタから例外を出してはいけないという迷信を信じないようにね。
0087デフォルトの名無しさん
2008/03/15(土) 23:31:58#include <iostream>
void add(int* x, const int* y, int size) {
for(int i = 0; i < size; ++i) {
x[i] += y[i];
}
}
void show(const int* x, int size) {
for(int i = 0; i < size; ++i) {
std::cout << x[i] << ", ";
}
std::cout << std::endl;
}
int main() {
int a[5] = { 1, 2, 3, 4, 5 };
int b[5] = { 5, 4, 3, 2, 1 };
add(a, b);
show(a);
}
0088デフォルトの名無しさん
2008/03/15(土) 23:35:15ありがとうございます。メモ帳に保存して勉強します。
0089デフォルトの名無しさん
2008/03/15(土) 23:36:24add(a, b, 5);
show(a, 5);
な。
0090デフォルトの名無しさん
2008/03/15(土) 23:41:30ありがとうございます。とりあえず67さんの方法でやってみようと思いますが、68と69さんの方法って
どうやればいいですか?いちおうこんな感じに書いてみたのですが、template <class T>
class cvector : public std::vector<T>
{
T operator[](int n) {
return this[n % this->size()];
}
};
0091デフォルトの名無しさん
2008/03/15(土) 23:43:06740 :ゴキ ◆KBolwFjGFs :2008/03/02(日) 16:10:33 ID:XSKtFMSK0
いつになったら五期鬼太郎43・44・46・47話うpしてくれるんですか><
750 :ゴキ ◆KBolwFjGFs :2008/03/02(日) 17:10:36 ID:XSKtFMSK0
いつになったら五期鬼太郎43・44・46・47話うpしてくれるんですか><
762 :ゴキ ◆KBolwFjGFs :2008/03/02(日) 23:15:47 ID:XSKtFMSK0
いつになったら五期鬼太郎43・44・46・47話うpしてくれるんですか><
772 :ゴキ ◆KBolwFjGFs :2008/03/03(月) 02:23:17 ID:FCp+FnG70
いつになったら五期鬼太郎43・44・46・47話うpしてくれるんですか><
811 :ゴキ ◆KBolwFjGFs :2008/03/04(火) 00:55:53 ID:4/B+VsKZ0
いつになったら五期鬼太郎43・44・46・47話うpしてくれるんですか><
0092デフォルトの名無しさん
2008/03/15(土) 23:46:06まあそれはいいとして、
vector を継承すると
std::vector<T>* v = new cvector<T>;
とした場合に delete v; の動作が未定義だし、
vector<T>& に渡せるけど、
operator[] が仮想関数じゃないから危険だな。
0093デフォルトの名無しさん
2008/03/15(土) 23:47:10operator[](n % size()) でもいいな。
0094デフォルトの名無しさん
2008/03/15(土) 23:51:040095デフォルトの名無しさん
2008/03/15(土) 23:52:04public -> private
0096デフォルトの名無しさん
2008/03/15(土) 23:55:57リングバッファだと 「範囲外のインデックス」 ってのが存在しないから
0 <= n && n < size() なら有効・・・とかできないし。
0097デフォルトの名無しさん
2008/03/16(日) 00:00:29v[-1] == v[size()-1]
0098デフォルトの名無しさん
2008/03/16(日) 00:26:29ありがとうございます。
アドバイスを総合して実装してみたのですが、コンパイルが通りません。
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
class cvector : public std::vector<T> {
T operator[](const int n) const {
int index = (n >= 0) ? n : this->size()-n;
// assert(n >= 0);
return (*this)[index % this->size()];
}
};
int main(){
cvector<int> vec;
vec.push_back(11);
cout << vec[0];
return 0;
}
コンパイルエラーはこうです。
test.cpp:6: error: 'T cvector<T>::operator[](int) const [with T = int]' is private//T operator[](const int n) const {の行です。
test.cpp:15: error: within this context // cout << vec[0]; の行です。
どうかもうすこし教えてください。
0099デフォルトの名無しさん
2008/03/16(日) 00:28:34エラーメッセージそのまんまだろ。何がわからないんだ?
0100デフォルトの名無しさん
2008/03/16(日) 00:30:180101デフォルトの名無しさん
2008/03/16(日) 00:43:030102デフォルトの名無しさん
2008/03/16(日) 00:45:09private継承しようとするとpush_backが使えなかったので、public継承にしました。
>>99
これってどう継承してもよびだせないということですか?
0103デフォルトの名無しさん
2008/03/16(日) 00:51:53>int index = (n >= 0) ? n : this->size()-n;
this->size()-nだとリングにならないよ
(n >= 0) ? n : (size() - (-n % size()));
あと、 と書くとレスに連続した半角空白を入れられる
0104デフォルトの名無しさん
2008/03/16(日) 00:53:38ってコンパイルエラーだな。
0105デフォルトの名無しさん
2008/03/16(日) 01:05:001 << (sizeof(type) * 8 - 1) とand取ってifすれば得られるぜ。
0106デフォルトの名無しさん
2008/03/16(日) 01:10:48その時点で引数を符号無しにするべきではないと思うというか。
0107デフォルトの名無しさん
2008/03/16(日) 01:26:05operator[]はvirtualじゃないからオーバーライドできない。
0108デフォルトの名無しさん
2008/03/16(日) 01:26:550109デフォルトの名無しさん
2008/03/16(日) 01:32:28vector とは性質的に別ものだから内包して自分でメンバ定義していくのが正しい。
単純な委譲で済む関数はインライン関数にしとけばインライン展開されるだろうし。
どうしても継承したいなら private 継承して、
size() とかそのままでいい関数は using する。
0110デフォルトの名無しさん
2008/03/16(日) 01:34:090111デフォルトの名無しさん
2008/03/16(日) 01:42:270 1 2
3 4 5
6 7 8
このようになっている時にクラーメルの公式のように(掛け算ではありませんが)
1+5+6というふうにするにはfor文でどのようにすればいいのでしょうか?
0112デフォルトの名無しさん
2008/03/16(日) 01:57:23int sum = 0;
for(int i=0; i<3; i++)
{
int x = data[i][(i + 1) % 3];
sum += x;
}
// sum = 1+5+6 = 12
0113デフォルトの名無しさん
2008/03/16(日) 02:01:02for 使うなら % だろうけど、逆向きの時は少し注意が必要(i が負になるとマズい)。
0114デフォルトの名無しさん
2008/03/16(日) 02:05:160115デフォルトの名無しさん
2008/03/16(日) 02:05:33すいません、言葉が足りてませんでした
配列は固定ではなくN×N行列で
ポインタを*paとする時
pa pa+1 pa+2
pa+3 pa+4 pa+5
pa+6 pa+7 pa+8
でどう求めるかということでお願いします
0116デフォルトの名無しさん
2008/03/16(日) 02:12:470117デフォルトの名無しさん
2008/03/16(日) 02:14:360118デフォルトの名無しさん
2008/03/16(日) 02:21:37i=0 0*3+(0+1)%3 = 0
i=1 1*3+(1+1)%3 = 3
i=2 2*3+(2+1)%3 = 7
こうなるんじゃないんですか?
0119デフォルトの名無しさん
2008/03/16(日) 02:23:30頭大丈夫か
0120デフォルトの名無しさん
2008/03/16(日) 02:26:400121デフォルトの名無しさん
2008/03/16(日) 02:26:50とりあえず今日はもう寝とけ
0122デフォルトの名無しさん
2008/03/16(日) 02:26:54すいません勘違いしてました
どうもありがとうございました
0123デフォルトの名無しさん
2008/03/16(日) 11:30:09/ 中\
( `ハ´) いつになったら福田康夫は日本人が犯人だと認めるアルか
( ⊃┳⊃
c(_)ヘ⌒ヽフ 【中国産・毒ギョーザ】日本人が“犯人”? 共同通信の日本人記者拘束で中国のネット世論沸騰★5
(朝日(-@∀@) http://mamono.2ch.net/test/read.cgi/newsplus/1204264902/
≡≡≡ ◎―◎⊃⊃ キコキコ
0124デフォルトの名無しさん
2008/03/16(日) 11:40:32濃度は3000ppmって。。漬け置きレベルらしいな。
シナはどこまでも外道。オリンピック開催させるなよ。
0125デフォルトの名無しさん
2008/03/16(日) 11:41:33(1)vectorを継承した方で、size()はusingsしておけばいいといわれましたが、やり方がわかりません。
でも知りたいのでどうか教えてください。
(2)同じくvectorを継承した方で、public継承するのはよくないと言われましたが、(繰り返しになりますが)
private継承するとpush_back等のvectorクラスの機能が使えないと思います。ここはどうするべきなのでしょうか?
template <typename T>
class ring_vector {
public:
T operator[](const int n) const {
int index = (n >= 0) ? (n % v.size()) : (v.size()-(-n % v.size()));
return v[index];
}
std::vector<T> v;
};
template <typename T>
class ring_vector2 : public std::vector<T> {
public:
T operator[](const int n) const {
int index = (n >= 0) ? (n % this->size()) : (this->size()-(-n % this->size()));
return std::vector<T>::operator[](index);
}
};
0126デフォルトの名無しさん
2008/03/16(日) 12:00:48(1)レスを追ってないから知らん
(2)転送関数
0127デフォルトの名無しさん
2008/03/16(日) 13:00:000128103
2008/03/16(日) 13:00:16>>103のは元のソースがreturn [index % size()];なので、それを前提としてたんだけど・・・。
return v[index];にするなら、負の数の方も、もう一度%しないと、
n == -size() のとき、return v[size()]; になっちゃうよ。
0129103
2008/03/16(日) 13:02:20を
return v[index==size()?0:index];
にするのでも良いけど。
0130デフォルトの名無しさん
2008/03/16(日) 13:04:24ring_vectorの方で良いよ。
継承するの変だと思うし。
0131デフォルトの名無しさん
2008/03/16(日) 13:04:530132デフォルトの名無しさん
2008/03/16(日) 13:12:54ありましたら、どうすればいいか教えてください。
0133デフォルトの名無しさん
2008/03/16(日) 13:17:07class ring_vector3 : private std::vector<T> {
typedef std::vector<T> parent;
public:
T operator[](const int n) const {
int index = (n >= 0) ? (n % this->size()) : (this->size()-(-n % this->size()));
return parent::operator[](index);
}
using parent::push_back;
};
みたいな。
0134デフォルトの名無しさん
2008/03/16(日) 13:24:34質問をもう少しkwsk
0135デフォルトの名無しさん
2008/03/16(日) 13:26:44使わなければ
0136デフォルトの名無しさん
2008/03/16(日) 13:32:210137デフォルトの名無しさん
2008/03/16(日) 13:38:310138デフォルトの名無しさん
2008/03/16(日) 13:40:560139133
2008/03/16(日) 13:48:130140デフォルトの名無しさん
2008/03/16(日) 13:53:31使い方によってはvectorのデストラクタが呼ばれないことがある。
0141133
2008/03/16(日) 13:56:17出来るの?private継承なのに。
0142デフォルトの名無しさん
2008/03/16(日) 14:14:38定義をそれ以上いじらなければ問題ないっしょ。
std::vector<T>* p() {return this;}
みたいなメンバ関数を追加したりすれば、
privateな継承でも基底のポインタが得られるので、
単にprivate継承であるというだけで常に安心できるわけではない。
0143デフォルトの名無しさん
2008/03/16(日) 14:17:260144デフォルトの名無しさん
2008/03/16(日) 14:23:24vector<int> v;を使わせても
delete &v[1];とかするだろうなw
0145デフォルトの名無しさん
2008/03/16(日) 14:25:010146デフォルトの名無しさん
2008/03/16(日) 14:28:34コンテナじゃないんだし、いらないっしょ
0147デフォルトの名無しさん
2008/03/16(日) 14:35:210148デフォルトの名無しさん
2008/03/16(日) 14:46:280149デフォルトの名無しさん
2008/03/16(日) 14:48:38extern BMPImgData bmpA;
extern BMPImgData bmpB;
class BMPImgData {
public:
HDC mHdc;
int w; //幅、高さ
int h;
int anmx;
int mv;
//・・・・
//↓bmpAには不要
POINT ptgt; //リアルマップ座標(移動)0~10
POINT tgt; //目標リアルマップ座標
POINT Root[MAX_MAPX][MAX_MAPY]; //マップ座標
//・・・
BMPImgData();
~BMPImgData();
};
多次元とか宣言すると不安で不安で。
もしかして宣言ってメモリ確保しなければ全然処理重くならないですか?
すげえ初歩ですが。
0150デフォルトの名無しさん
2008/03/16(日) 14:53:38動的に確保するしかないかと
0151デフォルトの名無しさん
2008/03/16(日) 15:03:56bmpAに不要なメンバを BMPImgData から除去して、BMPImgDataを継承した別クラスBMPImgData2にそのメンバを追加すれば?
BMPImgData bmpA;
BMPImgData2 bmpB;
もちろん、クラス名は適切に。
0152デフォルトの名無しさん
2008/03/16(日) 15:13:50void func() {}
}
class Hoge {
friend void AAA::func();
};
とするとコンパイルできません。どうすればよいですか?
0153デフォルトの名無しさん
2008/03/16(日) 15:15:57>どうすればよいですか?
コンパイルエラーのメッセージを書く。
そのメッセージについて>>152が何を考えて、何が分からないのかを書く。
エラーメッセージの内容を調べて無いなら、調べてから出直し。
0155デフォルトの名無しさん
2008/03/16(日) 16:02:38むかつくからやめろ
0156デフォルトの名無しさん
2008/03/16(日) 16:11:290157デフォルトの名無しさん
2008/03/16(日) 16:20:400158デフォルトの名無しさん
2008/03/16(日) 16:54:210159デフォルトの名無しさん
2008/03/16(日) 18:08:37コンストラクタで指定した長さ以上の要素を食わせるとどうなるのでしょうか?
0160デフォルトの名無しさん
2008/03/16(日) 18:09:22「食わせる」って何?
0161デフォルトの名無しさん
2008/03/16(日) 18:10:32要素数20のlistに21個目の要素を追加しようとするとどうなるのかなぁと
0162デフォルトの名無しさん
2008/03/16(日) 18:11:030163デフォルトの名無しさん
2008/03/16(日) 18:13:13そりゃ、追加されるんだろ。
0164デフォルトの名無しさん
2008/03/16(日) 18:15:17STLのコンテナは、追加はいくらでもやってよい。
コンストラクタで要素数を指定するのは、
あらかじめメモリを確保しておくことで、後から再確保するのを防ぐ、単なる最適化に過ぎない。
0165164
2008/03/16(日) 18:17:49コンストラクタで指定した要素数は、ちゃんと要素が追加されるよな。
0166デフォルトの名無しさん
2008/03/16(日) 18:21:25「追加」 の定義をきちんと聞いておいた方がいいぜ。
0167デフォルトの名無しさん
2008/03/16(日) 18:26:50それは既存要素に対する代入だろ。sizeには反映されない。
下手したらコンテナの整合性を壊す。
て、>>166は言いたいんだと思う。
0168デフォルトの名無しさん
2008/03/16(日) 19:11:13やりたいことをもっと明確に説明しないと回答のしようが無い。
たとえば12345という値を持つint型変数があったとして、どのような状態のchar配列が欲しいんだ?
0169デフォルトの名無しさん
2008/03/16(日) 19:32:59int型をchar型の要素数4(とは限らんが)の配列として扱うの?
それなら共用体になるが
0170デフォルトの名無しさん
2008/03/16(日) 19:45:07共用体しらべてみます
0171デフォルトの名無しさん
2008/03/16(日) 20:19:59エンディアンには気をつけてな
どうせsprintfとかいうオチだとは思うが
0172デフォルトの名無しさん
2008/03/16(日) 23:21:29・・・VISUAL C++というソフトを使っていたら突然こうなりました
OSはVISTAで、これ以降いくらプロジェクトを作成しようとも、どうやら自動生成されるファイルが欠落しているようです
アンインストール、再インストールも試しましたが無駄でした、当然管理者権限もです。 どうすればいいでしょうか?
0173デフォルトの名無しさん
2008/03/16(日) 23:32:100174デフォルトの名無しさん
2008/03/16(日) 23:36:03なかったです、正常動作している友人のプロジェクトフォルダを丸ごとZIPで送ってもらったら
DEBUGフォルダがありましたが、自分のほうでは生成されなくなってました
0175デフォルトの名無しさん
2008/03/16(日) 23:38:59今までは正常に実行できてたんだよな?
0176デフォルトの名無しさん
2008/03/16(日) 23:48:51リビルドして、出力ウインドウにエラーメッセージがないか確認するべし。
プロジェクトのプロパティーページのリンクの項の出力ファイルのパスを確認しよう。その友人のプロジェクトが絶対パスになってないか?
0177デフォルトの名無しさん
2008/03/16(日) 23:51:080178デフォルトの名無しさん
2008/03/16(日) 23:57:080179デフォルトの名無しさん
2008/03/16(日) 23:57:50// test.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
これに
int main(void) { return 0;}
これを書き足してリビルドしたら
1>------ すべてのリビルド開始: プロジェクト: test, 構成: Debug Win32 ------
1>プロジェクト 'test'、構成 'Debug|Win32' の中間出力ファイルを削除しています。
1>コンパイルしています...
1>stdafx.cpp
1>test.cpp
1>コードを生成中...
1>マニフェストをリソースにコンパイルしています...
1>リンクしています...
1>LINK : 前回のインクリメンタル リンクで C:\Users\owner\Desktop\Documents\Visual Studio 2005\Projects\test\Debug\test.exe が見つからなかったか、ビルドされませんでした。フル リンクを行います。
1>LINK : warning LNK4067: エントリ ポイントがあいまいです。'mainCRTStartup' が選択されます。
1>マニフェストを埋め込んでいます...
1>ビルドログは "file://c:\Users\owner\Desktop\Documents\Visual Studio 2005\Projects\test\test\Debug\BuildLog.htm" に保存されました。
1>test - エラー 0、警告 1
========== すべてリビルド: 1 正常終了、0 失敗、0 スキップ ==========
で、ぱっとみは何とかなったみたいです 再度printfをためしてみます 一旦ありです
0180デフォルトの名無しさん
2008/03/17(月) 00:01:220181デフォルトの名無しさん
2008/03/17(月) 00:04:130182デフォルトの名無しさん
2008/03/17(月) 04:09:010183デフォルトの名無しさん
2008/03/17(月) 04:26:180184デフォルトの名無しさん
2008/03/17(月) 07:29:050185デフォルトの名無しさん
2008/03/17(月) 09:09:35自分でイテレータってつくれるんですか?
あと、演算子のオーバーロードでできるんでしょうか?
0186デフォルトの名無しさん
2008/03/17(月) 09:11:190187デフォルトの名無しさん
2008/03/17(月) 10:44:58もうちょっとだけ具体的に言ってみてよ。
0188デフォルトの名無しさん
2008/03/17(月) 10:54:370189デフォルトの名無しさん
2008/03/17(月) 11:09:180190デフォルトの名無しさん
2008/03/17(月) 11:13:530191デフォルトの名無しさん
2008/03/17(月) 11:16:270192デフォルトの名無しさん
2008/03/17(月) 11:33:44できあがり。
これ以上具体的な回答は、質問が具体的でない限りあり得ない。
0193デフォルトの名無しさん
2008/03/17(月) 13:03:460194デフォルトの名無しさん
2008/03/17(月) 13:19:100195デフォルトの名無しさん
2008/03/17(月) 13:27:010196デフォルトの名無しさん
2008/03/17(月) 13:41:300197デフォルトの名無しさん
2008/03/17(月) 14:24:110198デフォルトの名無しさん
2008/03/17(月) 14:39:590199デフォルトの名無しさん
2008/03/17(月) 15:12:570200デフォルトの名無しさん
2008/03/17(月) 15:35:270201デフォルトの名無しさん
2008/03/17(月) 20:56:530202デフォルトの名無しさん
2008/03/17(月) 21:45:45こういうやつ↓
bool operator==(const A& lhs, const B& rhs)
{...}
bool operator==(const B& lhs, const A& rhs) // これを自動化したい
{ return rhs == lhs; }
0203デフォルトの名無しさん
2008/03/17(月) 21:52:230204デフォルトの名無しさん
2008/03/17(月) 21:52:26Boost.Operatorsにまとめられている。
その例だと、Aがequality_comparable<A, B>を継承して、
operator==(const A& lhs, const B& rhs)を定義すれば、
operator==(const B& lhs, const A& rhs)とoperator !=が作られる。
0205デフォルトの名無しさん
2008/03/17(月) 22:56:40どのように管理しているんでしょうか?
* mylib/*.{h,c} と一つのディレクトリにヘッダとソース。
* mylib/include/*.h,mylib/src/*.c で mylib/lib/libmylib.a とか。
普通のライブラリ風に。
で使うときにはどうしてます?
* mylib ごとコピーして?
* mylib/include/ とかにパスを通してる。で -lmylib
どうすると楽なのか悩んでます。
0206デフォルトの名無しさん
2008/03/17(月) 22:59:48護送船団とか何とか叩いておいてアメリカがこの様なわけだが
0207デフォルトの名無しさん
2008/03/17(月) 22:59:54コンパイラオプション (多分 -I) + makefile
0208デフォルトの名無しさん
2008/03/17(月) 23:44:55クラスAにはchar変数textがあり、クラスBからsprintf(p->text, "test");を実行します。
この時エラーが起きてプログラムが強制終了するのですが、何かおかしな手順を踏んでいるのでしょうか?
0209デフォルトの名無しさん
2008/03/17(月) 23:47:16自分の力量では出来ませんでした。
やり方を教えてください。
0210デフォルトの名無しさん
2008/03/17(月) 23:50:39クラス定義を貼れ
0211デフォルトの名無しさん
2008/03/17(月) 23:56:47ソートでググれ。
0212デフォルトの名無しさん
2008/03/18(火) 00:08:51クラス定義はしてあります。
0213デフォルトの名無しさん
2008/03/18(火) 00:11:050214デフォルトの名無しさん
2008/03/18(火) 00:12:11・pがAのインスタンスを指していない。
・pが指しているAのインスタンスはすでに死んでいる。
・A::textが5byteに満たない。
・sprintfの前までに何かメモリを壊している。
・その他
この中のどれなのか判定してやるから、ソースを貼れと言ってるの
0215デフォルトの名無しさん
2008/03/18(火) 00:15:58コードが非常に長いので今編集しています。
0216デフォルトの名無しさん
2008/03/18(火) 00:29:58{
public:
void Add(Task *obj, LPCSTR name);//インスタンスを登録する関数です。
Task* Find(char *name);//インスタンスのポインタを返す関数です。
void Do();//登録されたインスタンスのExec();を実行
protected:
virtual void Exec();
}
class Font : public Task
{
public:
char text[10];
protected:
void Exec(){ cout << text << endl; }
}
class Edit : public Task
{
public:
Init(){ font=(Font*)Find("font"); }
void setFont(){ sprintf(font->text, "text"); }
private:
Font *font;
protected:
void Exec(){ setFont(); }
}
0217デフォルトの名無しさん
2008/03/18(火) 00:30:21{
Task task;
task.Add(new Font(), "font");
task.Add(new Edit(), "edit");
while(true)
task.Do();
}
色々大量に省きましたが大体こんな感じです。
0218208
2008/03/18(火) 00:33:470219デフォルトの名無しさん
2008/03/18(火) 00:37:070220デフォルトの名無しさん
2008/03/18(火) 00:41:22これ俺も気になる。なかなか話題にもならないし、ぐぐっても出てこないし、
みんなどうしてるって疑問は昔からあった
俺は mylib/include、mylib/source、mylb/lib にして、
include、lib にパスを通す派
0221208
2008/03/18(火) 00:45:27Add内に実行する部分があるのでそこで実行されてます。
上のだと省いてます。
インスタンスの登録順序のせいでポインタが格納できていないのが問題でした。
0222デフォルトの名無しさん
2008/03/18(火) 00:51:13コピーしたら元を変更したときにコピーした数だけ更新してまわらないといけないだろ。
ディレクトリ分けてパス指定するのが当然だから、話題にもならないんじゃない?
0223デフォルトの名無しさん
2008/03/18(火) 00:55:36FileInfo^ fi = gcnew FileInfo(filename);
__int64 size = fi->Length;
のように取得したファイルサイズを32bitに変換し、さらにリトルエンディアンに変換した後、
バイナリでファイルに書き出したいのですが、何か良い方法はありますか?
0224デフォルトの名無しさん
2008/03/18(火) 01:00:11c++/cliは別スレで。
0225208
2008/03/18(火) 01:01:47LPTSTR text;
_stprintf(text, "text");
これでエラーが起こるのですが、正しくはどうすればいいのでしょうか?
0226デフォルトの名無しさん
2008/03/18(火) 01:02:01とりあえず速度とか、プログラムらしさというのを全く気にしなくて良いなら(勉強の一貫なら)
一度、数字の書いたカードを手作業で並べ替えてみるといいかもしれない。
そのときの手順を1つ1つメモしていくんだ。
0227デフォルトの名無しさん
2008/03/18(火) 01:04:09text はどこを指しているのか。
0228デフォルトの名無しさん
2008/03/18(火) 01:04:26VC++なら、x86だから元々リトルエンディアンですが。
つーか、下位バイトから順番に出力すればいいのでは?
0229デフォルトの名無しさん
2008/03/18(火) 01:07:32やってみます・・・
0231202
2008/03/18(火) 01:30:50レスthx
いろいろなoperatorを定義する時に便利そうですね。
でも、operator==だけを見ると、あまり便利に感じないです。
// Hoge.cpp
#include "A.h"
#include "B.h"
bool operator==(const A& lhs, const B& rhs) {...}
というのを考えていたので、Aに修正を加えないといけないのがちょっと・・(Bはそのままというのも気になる)。
普通に定義することにします。
0232デフォルトの名無しさん
2008/03/18(火) 02:07:56よろしければ手直ししていただけませんか。Visual C++ 6.0です。
int hairetu(int jun[N]){
int max,j,k,retu[N],jun2[N];
for(j=0;j<N;j++){
jun2[j]=jun[j];
}
for(k=0;k<N;k++){
for(j=0;j<N;j++){
if(max<jun[j])
max=jun[j];
jun[j]=jun2[k];
}
retu[k]=max;
max=retu[k];
}
for(j=0;j<N;j++){
jun[j]=retu[j];
}
return(jun[N]);
}
0233デフォルトの名無しさん
2008/03/18(火) 02:12:58_msize()ってmalloc()やrealloc()などで
指定したメモリサイズを返すと思ってましたが、
つなげるランタイムライブラリによって変わるのですか?
現状でコンパイルオプション「コード生成」の「使用するランタイムライブラリ」を
「シングルスレッド(デバッグ)」にすると指定したサイズ、
「シングルスレッド」にすると指定したサイズから直近の16の倍数値が返ってきます。
これってC言語をする人にとって知ってて当たり前のことなんですか?
それともオプションで調整できることなんですか?
0234205
2008/03/18(火) 02:17:24やっぱりそういう感じになるんですかね。
>>222
そう思ったんですけど頻繁に mylib は更新されて少し前に書いたものが
コンパイル通らなくなったりして結局使ってる側を修正しないといけなかったりで…
どうするといい感じに管理できるのかなぁと。
0235208
2008/03/18(火) 02:17:32バブルソートでググってみ。
選択ソート、挿入ソートでもOK。
それでダメなら、並び変えるときに自分がどういう手順を追っているか考えてみ。
10 8 3 5 7 1 6 2 4 9
↓
1 2 3 4 5 6 7 8 9 10
1つずつ動かして、その手順を元にコード起こす。
0236デフォルトの名無しさん
2008/03/18(火) 02:19:42とりあえず要素5つくらいの配列を考えて、そのプログラムを動かすと配列の要素がどう変わっていくかを
紙の上で1ステップずつ書き出してみな。
・勉強したアルゴリズムの通りに並んでいかないなら、プログラムのロジックが間違っている。
・ググって調べたアルゴリズムがまだ理解できていないなら、まずはそれを理解するとこ。
アルゴリズムの説明が欲しいなら、どこか適切なスレへ。
・自分で書いたプログラムがどういう動作になるのかを追えないなら、勉強不足。
C言語の仕様的に分からないことがあるなら、また質問してみれば?
0237デフォルトの名無しさん
2008/03/18(火) 02:24:24qsort()じゃだめなんですか?
勉強の為にソートロジック作るなら
クイックソートやマージソートやバブルソートなどで検索すればコードがでてくると思いますよ。
参考までに一番単純なバブルソートの例を
void bubble_sort(int a[], int n)
{
int i, j, t;
for (i=0; i<n-1; i++) {
for (j=n-1; j>i; j--) {
if (a[j-1] > a[j]) {
t = a[j];
a[j] = a[j-1];
a[j-1] = t;
}
}
}
}
0238デフォルトの名無しさん
2008/03/18(火) 02:27:32_msize()ってANSIじゃないでしょ。
0239デフォルトの名無しさん
2008/03/18(火) 02:30:14う・・・だったみたいですね。
Win32APIやMFCでなくコンソールアプリケーションで作成に訂正です。
0240233
2008/03/18(火) 02:33:14char *pcDat = NULL;
pcDat = realloc(NULL, 1);
lGetSize = _msize(pcDat);
printf("1 = %ld\n", lGetSize);
→ シングルスレッド(デバッグ)での結果=1
→ シングルスレッドでの結果=16
pcDat = realloc(NULL, 13);
lGetSize = _msize(pcDat);
free(pcDat);
printf("13 = %ld\n", lGetSize);
→ シングルスレッド(デバッグ)での結果=13
→ シングルスレッドでの結果=16
pcDat = realloc(NULL, 17);
lGetSize = _msize(pcDat);
free(pcDat);
printf("17 = %ld\n", lGetSize);
→ シングルスレッド(デバッグ)での結果=17
→ シングルスレッドでの結果=32
って具合です。
0241デフォルトの名無しさん
2008/03/18(火) 02:34:05ありがとうございます。
qsortも使い方が分からないのでとにかくif文とfor文でやることにしていました。
>>237さんのバブルソートの例を見ながら組み上げたいと思います。
0242デフォルトの名無しさん
2008/03/18(火) 02:40:20_msizeの動作は詳しく無いから想像だけど…。
リリース版では効率化のために1とか13とか中途半端なバイト数で確保せずに、16バイト単位で領域の割り当てをするけど
デバッグ版ではデバッグしやすいように指定したバイト丁度を割り当てているのでは?
(実際には管理領域やメモリ破壊検知などのためにもっと余分に割り当てているだろうけど。)
0243233
2008/03/18(火) 02:52:02確かにこの現象が判明したのはリリースでのコンパイルですが、
デバッグで「使用するランタイムライブラリ」を「シングルスレッド」に変えるだけでも同じ現象になるのです。
これはもうランタイムライブラリの仕様としか言いようがないのでしょうか?
同じコードなのに違う動作をするというのはどうも納得いかないのです。
(オプション変更によってコンパイルorリンクエラーになるならまだわかりますが・・・)
これがC言語をする人にとって周知の事なら自分の知識不足として納得しようかと思い書き込みましたw
0244デフォルトの名無しさん
2008/03/18(火) 03:07:25MSDNによれば
>ヒープに割り当てられたメモリ ブロックのサイズを返します。
と書いてある。
あくまで「割り当てられたサイズ」であり、これは「要求したサイズ」とは必ずしも一致しない。
>同じコードなのに違う動作をするというのはどうも納得いかないのです。
ランタイムライブラリに依存する処理なのだから、リンクするランタイムライブラリが異なれば
結果が異なることは特に不自然ではないと思う。
>これがC言語をする人にとって周知の事なら自分の知識不足として納得しようかと思い書き込みましたw
すでに出ていることだけど _msizeはANSIの標準ではなく MS固有のAPIでしかないのだから、
C言語をする人にとって周知の事というわけではない。
0245233
2008/03/18(火) 03:20:59言ってることはわかるのですが、
それならデバッグ用のランタイムの動作はデバッグなしのランタイムとあわせるべきじゃないかと思いますね。
例えば、デバッグでステップ実行で確認したのにデバッグ外すと動作変わるなら、デバッグの意味ないですよね。
とりあえず周知でないこととオプションで対応できるようなことでないのはわかりました。
0246デフォルトの名無しさん
2008/03/18(火) 03:35:54つ http://msdn2.microsoft.com/ja-jp/library/974tc9t1(VS.80).aspx
0247デフォルトの名無しさん
2008/03/18(火) 06:05:02ファイル名を入力させて
検索文字列を入力して
「該当ファイルの検索文字列を含む行を全て表示するプログラム」です
しかしながら実行すると下のコードの
getlineがすっとばされてしまい
こちらから検索文字列の入力を行うことができません
なぜですか?
0248デフォルトの名無しさん
2008/03/18(火) 06:05:33#include <string>
#include <vector>
#include <fstream>
using namespace std;
int main()
{
string s;
vector<string> v;
cout << "Input filename" << "\n";
cin >> s;
ifstream in(s.c_str());
while(getline(in,s))
v.push_back(s);
cout << "検索文字列";
//↓の入力がすっとばされてしまう
getline(cin,s);
for(vector<string>::size_type i = 0;i < v.size();i++){
if(v[i].find(s) != string::npos)
cout << i << ":" << v[i] << "\n";
}
return 0;
}
0249247
2008/03/18(火) 06:12:540250sage
2008/03/18(火) 06:49:59istream &getline( char *バッファ, streamsize 文字数 );
istream &getline( char *バッファ, streamsize 文字数, char 境界文字 );
ですよね
cin.getline(s,MAXSIZE)
にしたらだめでしょうか
0251デフォルトの名無しさん
2008/03/18(火) 06:55:30getline(cin,s) の前に
cin.ignore(); で一文字削ってみては
0252デフォルトの名無しさん
2008/03/18(火) 07:31:29標準では、指定された大きさ「以上」のメモリを確保するとなっていて、
ぴったりちょうどの大きさを割り当てなければならないという決まりはない。
0253デフォルトの名無しさん
2008/03/18(火) 07:48:32そもそも_msize()==(要求サイズ)という条件に依存しようとすることが間違い。
>>244にあるとおり、この条件が常に成立するなどとは、MSは言っていないはず。
処理系依存ってやつ。
0254デフォルトの名無しさん
2008/03/18(火) 09:20:07> 例えば、デバッグでステップ実行で確認したのにデバッグ外す
> と動作変わるなら、デバッグの意味ないですよね。
デバッグビルドでデバッグし易いようにコードが変わるのは、よくある
こと。デバッグビルドとリリースビルドで動作に違いがないなら、デバッ
グビルドの意味ないじゃん。
0255デフォルトの名無しさん
2008/03/18(火) 11:58:02たいていは初期化不足だけど。
0256デフォルトの名無しさん
2008/03/18(火) 14:35:41あるよ。
デバッグビルドとリリースビルドの違いで困るプログラムは、
まずいプログラムだから、それを自覚することが出来る。
0257デフォルトの名無しさん
2008/03/18(火) 17:33:21柴田望洋ってどうなの?
0258デフォルトの名無しさん
2008/03/18(火) 17:50:42それを先にやらないと柴田望洋について話しても何も分からないと思うというか
C言語すら分からないようじゃ柴田望洋についての話も分からんだろうというか
それ以前に柴田望洋の話はマ板でやれ。
0259デフォルトの名無しさん
2008/03/18(火) 17:54:452:#include <string>
3:
4://using namespace std;
4:
6:class Foo {
7:private:
8: std::string s;
9:
10:public:
11: string getValue ( void ) { return s; };
12: void setValue ( const string s_in ) { s = s_in; };
13:};
14:
15:int main ( void ) {
16: Foo f;
17: f.setValue("abcd");
18: std::cout << f.getValue() << std::endl;
19: return (0);
20:}
これをコンパイルすると、次のメッセージが出てコンパイルエラーになってしまいます。
"foo2.cpp", 行 11: エラー: 型の名前が予期される位置に "string" があります.
4行目のusingステートメントを有効にするとコンパイルできます。
何が間違ってるのでしょうか?
Cは経験あるのですが、C++はド素人で良く分かりません(T_T
0260デフォルトの名無しさん
2008/03/18(火) 17:57:530261デフォルトの名無しさん
2008/03/18(火) 17:59:040262デフォルトの名無しさん
2008/03/18(火) 18:03:35エディタで見てるときはどうしても気付かなかったのに。
お目汚しすいませんでした・・・
0263デフォルトの名無しさん
2008/03/18(火) 21:48:58変数に1足していく
ってしたいんですがどうもたまに同時にアクセスしてしまうようでぶっ飛んだ
数字になってしまいます。
どうすれば上手くいきますか?
0264デフォルトの名無しさん
2008/03/18(火) 21:50:000265デフォルトの名無しさん
2008/03/18(火) 21:55:060266デフォルトの名無しさん
2008/03/18(火) 22:24:08ありがとう。使い方調べてくる
0267デフォルトの名無しさん
2008/03/18(火) 22:38:12{
public:
test(){ array = new double[100]; InitArray(); }
void InitArray();//array内をすべて初期化
double get(int x){ return array[x];}
private:
double *array;
}
こんなクラスがあるとき、他クラスでインスタンスを作り、
get(N);(N<100)を実行するとエラーが起きるのですが、
どこがおかしいのでしょうか?
0268デフォルトの名無しさん
2008/03/18(火) 22:46:44何も問題はなさそうだが。
get呼び出しの辺りとか、InitArrayの中とか、
もう少し見せてくれれば、何かわかるかも。
0269デフォルトの名無しさん
2008/03/18(火) 22:54:21実は N=-1 だったとかw
0270デフォルトの名無しさん
2008/03/18(火) 22:56:43やっぱり問題ないですよね・・・。
>>269
N>=0です。w
0271デフォルトの名無しさん
2008/03/18(火) 22:58:25全ての型に対して一様に動作しないといけない状況ってSTL以外にめったに無いと思うのですが・・・
0272デフォルトの名無しさん
2008/03/18(火) 23:13:47ほかによくある使い道を挙げるとしたら、
ポインタの類(auto_ptr, shared_ptrとか)
charとwchar_t(例えばstd::coutとstd::wcout、
std::stringとstd::wstring、CStringAとCStringWとか)
0273デフォルトの名無しさん
2008/03/18(火) 23:21:29そうでない人にとっても、少し汎用的なコードを書きたいときには有用だし、
メモリ使用量や処理速度を改善するような使い方もできる。
0274デフォルトの名無しさん
2008/03/19(水) 00:24:150275デフォルトの名無しさん
2008/03/19(水) 00:25:22どこでエラーが起こってるのかデバッガで追えばいいよ。
0276デフォルトの名無しさん
2008/03/19(水) 01:03:28何もしないか、あの手この手でエラーにするかの2択。
std::basic_string(stringとwstringのtypedef元)とかだと
32ビット整数型を要素にしてUTF-32文字列にするという風に、
char/wchar_t以外でも使えないわけではない。
0277デフォルトの名無しさん
2008/03/19(水) 01:34:40やっと解決しました。
単純なミスしてました。
新たな問題が発生したのでよろしくお願いします。
クラスが2つあります。
クラスは互いにインスタンスをポインタとして取得しておく必要があります。(互いの変数を取得しあうため。)
しかし、互いのヘッダをincludeしあい、メインで両方のクラスのヘッダをincludeするとループが生じ、コンパイルできません。
この場合どういった手を打てばいいのでしょうか?
0278デフォルトの名無しさん
2008/03/19(水) 01:42:070279デフォルトの名無しさん
2008/03/19(水) 01:44:08意図しない型についてはエラーを出すことも出来るのですか
使い道が無いか少し意識して考えてみようと思います
0280デフォルトの名無しさん
2008/03/19(水) 01:44:450281デフォルトの名無しさん
2008/03/19(水) 01:46:55後者は方言です。
0282デフォルトの名無しさん
2008/03/19(水) 01:57:50ありがとうございました。
0283デフォルトの名無しさん
2008/03/19(水) 01:58:31アンカミスりました。orz
0284デフォルトの名無しさん
2008/03/19(水) 03:06:510285デフォルトの名無しさん
2008/03/19(水) 03:12:100286デフォルトの名無しさん
2008/03/19(水) 03:38:19正確には、#pragma onceはインクルードガードの実現手段の1つ、じゃない?
>284
importみたいな?
0287デフォルトの名無しさん
2008/03/19(水) 05:18:21間に合ってるから「用意するべき」と言うほど必要ではないと思う
言語規格にあればいいかもねって程度
0288デフォルトの名無しさん
2008/03/19(水) 07:22:07#pragma once は環境依存だろ。
0289デフォルトの名無しさん
2008/03/19(水) 07:22:330290デフォルトの名無しさん
2008/03/19(水) 08:46:42必要最小限のファイルってなんですか?
0291デフォルトの名無しさん
2008/03/19(水) 08:49:250292デフォルトの名無しさん
2008/03/19(水) 08:53:31<utility> って pair しか入ってないんですね。
0293デフォルトの名無しさん
2008/03/19(水) 10:30:250294デフォルトの名無しさん
2008/03/19(水) 11:10:47=を定義するだけで!=を自動で定義してくれるとか、
便利といえば便利かもしれないですね。
Boost にもそんなコンセプトのものがあったような。
0295デフォルトの名無しさん
2008/03/19(水) 11:11:04if(!InitApp(hCurInst))
return FALSE;
if(!InitInstance(hCurInst, nCmdShow))
return FALSE;
こういったifの条件式に!関数名だけが来ている時は何を基準に真偽を判定しているんでしょうか?
その関数が成功したか否かでしょうか?
0296デフォルトの名無しさん
2008/03/19(水) 11:13:04!が前にそれが逆転する。
0297デフォルトの名無しさん
2008/03/19(水) 11:18:39関数の返り値見ないことにはなんともいえない。
0298デフォルトの名無しさん
2008/03/19(水) 11:21:06if(!expr) は if(expr == 0) と同義。
0299デフォルトの名無しさん
2008/03/19(水) 11:24:57一応補足。
関数の値として0が返ってきたからといって、
それが失敗を意味するとは限らないです。
InitApp 本体のソース又はドキュメントを読みましょう。
0300デフォルトの名無しさん
2008/03/19(水) 13:22:25それ猫でもWinプログラムのコードだろ
C言語の基礎を学んでから読みなさい
0301デフォルトの名無しさん
2008/03/19(水) 13:42:41InitAppの返り値の型のoperator !と==によって変わらないか?
0302デフォルトの名無しさん
2008/03/19(水) 13:45:46C++でオーバーロードされていればな。
まあ>>295の質問には実害ないだろ。
なおCでは真実。
0303デフォルトの名無しさん
2008/03/19(水) 17:51:370304デフォルトの名無しさん
2008/03/19(水) 17:53:020305デフォルトの名無しさん
2008/03/19(水) 18:36:400306デフォルトの名無しさん
2008/03/19(水) 18:38:50ld
0307デフォルトの名無しさん
2008/03/19(水) 18:41:20ありがとうございます。
0308デフォルトの名無しさん
2008/03/19(水) 19:00:180309デフォルトの名無しさん
2008/03/19(水) 19:02:210310デフォルトの名無しさん
2008/03/19(水) 19:17:25C++なら普通は変換指定文字列なんて使わない気が
0311デフォルトの名無しさん
2008/03/19(水) 20:24:17プロジェクトからビルドして実行する分には問題ないのですが、作成されたexeを実行すると「メモリが不足しています。」
とエラーが出ます。
Release/Debugの両方とも同じ結果でした。
newで止まっているっぽいのですが、メモリが不足するほど読み込んでないのになぜエラーが出るのかと言う疑問と
プロジェクトから実行するとなぜ問題のないのかが気になります。
後者に関して、本来(exeファイル)ならかけられている制限が取り払われた状態になっているのでしょうか。
0312デフォルトの名無しさん
2008/03/19(水) 22:13:400313デフォルトの名無しさん
2008/03/19(水) 22:20:23{
int initialized;
int num;
void *in_event;
void *out_event;
int resp;
void *lock;
AA_T callback;
} AA_T;
static AA_T aa = {0, -1}; /* ここの初期化の意味は? */
:
こんなコードを見たのですが、aa = {0, -1} の部分は、どこを初期化してるんでしょうか?
これは、単に static AA_T aa; と書いておけば、aa のメモリー領域が全て0で初期化される気がするのですが。
0314デフォルトの名無しさん
2008/03/19(水) 22:21:57最初の 2 つが 0, -1 で初期化され、
あとは全て 0 で初期化される。
つまり、num を -1 にしたかったんだろう。
ところで、AA_T が AA_T をメンバに持ってるのはいいのか?
0316デフォルトの名無しさん
2008/03/19(水) 22:26:16GUIのメニューから実行するということだろ。
0317313
2008/03/19(水) 22:40:12なるほど、判りました。
> ところで、AA_T が AA_T をメンバに持ってるのはいいのか?
すみません。
ここは、記載ミスで AA_T callback => AA_CB_T callback でした。
0318デフォルトの名無しさん
2008/03/19(水) 22:52:450319デフォルトの名無しさん
2008/03/19(水) 22:52:59int main(int argc, char* argv[])
{
std::atexit(0);
return 0;
}
'std' : 識別子がクラス名でも名前空間名でもありません。
というエラーが出ます。環境はVC2008EEです。
どういうことですか?
0320デフォルトの名無しさん
2008/03/19(水) 22:59:33俺も2008 EEだが問題なくコンパイルできる。
0321デフォルトの名無しさん
2008/03/19(水) 23:11:19public:
Pair(int a, int b) : a_(a), b_(b)
int a_;
int b_;
};
Pair p(1, 2);
みたいに書くことがあると思うんですが Pair を値として返す関数
Pair getPair(int x)
{
Pair p(1, x);
return p;
}
って書きますよね。
getPair(int x) を1行で return xxx ; って書く方法はないでしょうか。
ポインタを返すのであれば
return new Pair(1, x);
とかけますがそんなのをイメージしています。
0322デフォルトの名無しさん
2008/03/19(水) 23:14:32return Pair(1,x);
0323デフォルトの名無しさん
2008/03/19(水) 23:15:07return Pair(1, x);
0324デフォルトの名無しさん
2008/03/19(水) 23:16:10こんな簡単だったとは。。
0325デフォルトの名無しさん
2008/03/19(水) 23:34:25public:
Hoge(int n) : n_(n) {}
protected:
const int n_;
};
Hoge h1(3); // これは OK
Hoge* h2 = new Hoge(4); // これもOK
Hoge* hoges = new Hoge[3]; // これがだめ
↑のようなコードで配列の確保がだめな理由と回避方法を教えてください。
よろしくお願いします。
const にしているのはインスタンス作成後に変更がないからです。
0326デフォルトの名無しさん
2008/03/19(水) 23:35:580327デフォルトの名無しさん
2008/03/19(水) 23:38:08Pair なんて構造体をいちいち作らなくても std::pair ってそのまんまのが標準で用意されとるべ。
ヘッダファイルは utility 。
0328デフォルトの名無しさん
2008/03/19(水) 23:40:25コピーコンストラクタを用意して、
std::vector に対して push_back していくといいよ。
0329デフォルトの名無しさん
2008/03/19(水) 23:40:44ありがとうございます。
class Hoge {
public:
Hoge() : n_(0) {} // 追加
Hoge(int n) : n_(n) {}
protected:
const int n_;
};
Hoge h1(3); // これは OK
Hoge* h2 = new Hoge(4); // これもOK
Hoge* hoges = new Hoge[3]; // OK になった
for (int i = 0; i < 3; i++) {
hoges[i] = Hoge(1234); // これはNG
}
うまくいきましたが別の所でひっかかりました。
引き続きお願いします。
0330デフォルトの名無しさん
2008/03/19(水) 23:40:550331デフォルトの名無しさん
2008/03/19(水) 23:41:22ありがとうございます。
ちょっと都合がありまして配列を使いたいのです。
難しいでしょうか。
0332デフォルトの名無しさん
2008/03/19(水) 23:42:06分かりにくくてすみません。
Pair は例として挙げただけでした。ごめんなさい。
0333デフォルトの名無しさん
2008/03/19(水) 23:42:38vector が使えないって、組み込み?
placement new を使うといいよ。
0334デフォルトの名無しさん
2008/03/19(水) 23:48:06n_を非constにし、コピー代入演算子を定義する。
0335デフォルトの名無しさん
2008/03/19(水) 23:49:19そりゃ
せっかくn_をconstにして変更不可能にしてるのに
hoges[i] = Hoge(1234);
とかで変更できたら逆に困るじゃないか。
変更するなら非constにしないと。
0336デフォルトの名無しさん
2008/03/19(水) 23:49:59近いです。STLとかテンプレートとか例外使えない環境です。
C++編(言語解説) 第36章 placement new
http://www.geocities.jp/ky_webid/cpp/language/036.html
を読んでみたのですが分かりませんでした。
もし良かったら今回の例でのやりかたを教えていただけないでしょうか。
0337デフォルトの名無しさん
2008/03/19(水) 23:50:48変更したいんじゃなくて、初期化したいんだと思われ。
0338デフォルトの名無しさん
2008/03/19(水) 23:52:11すみません。そのあたりが良く分かっていないです。
Hoge* hoges = new Hoge[3];
では入れ物だけを用意したイメージなのですがそこが違っていてデフォルトコンストラクタが呼ばれてしまうってことですよね。
確保した領域の1番目に Hoge(1234) 、2番目に Hoge(3456) を入れたいんですが、 const のままでは無理なのでしょうか。
0339デフォルトの名無しさん
2008/03/19(水) 23:56:55まぁ、そんな気はしてた。
>>338
残念ながら入れ物だけじゃなくて中身も用意するのがC++流
結論だけいうとconstのままでも不可能ではない。
ただplacement newとかconst_castとかの黒魔術が必要になるからお勧めできない。
素直にconst外すのが良いと思う。
0340デフォルトの名無しさん
2008/03/19(水) 23:58:00ほれ。まあ言う程は汚くないと思う。
クラス化した方がいいかもしれないけど。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6157.txt
0341デフォルトの名無しさん
2008/03/19(水) 23:59:21丁寧にありがとうございます。
黒魔術を見てみたい気もしますがw
> 中身も用意するのがC++流
これで納得しました。
ところでデフォルトコンストラクタ以外で中身をつくることはできるのでしょうか?
0342デフォルトの名無しさん
2008/03/20(木) 00:02:01と考えると、vp_hoges はまあ要らない。
まあ、うっかり delete[] hoges; なんてすると悲惨なことになるので、
それを戒めるためにとりあえず vp_hoges を使ってる。
実用する時は別に vp_hoges は要らないと思う。
0343デフォルトの名無しさん
2008/03/20(木) 00:02:07ありがとうございます!
new(&hoges[i]) Hoge(HogeInit[i]);
ここで placement new を使って初期化した中身が確保されるメモリ領域を指定しているのですね。
勉強になります。
ご親切にありがとうございました。
0344デフォルトの名無しさん
2008/03/20(木) 00:12:13これもまた勉強になりました。
0346デフォルトの名無しさん
2008/03/20(木) 08:42:25int a[10];
の時、
void func(int* const &a);
void func(int a[10]);
void func(int (&a)[10]);
とか書くとコンパイルはできるのですが、どれもポインタ渡しになっているようです。
(sizeof()をやると配列なら40が返るはずだけど、4が返るから)
どうやっても配列のままで渡せないというのは、どうやれば確認できるでしょうか。
0347デフォルトの名無しさん
2008/03/20(木) 08:50:07void foo(int (&a)[10]);
0348デフォルトの名無しさん
2008/03/20(木) 08:51:14そうじゃなくてsizeofでちゃんと大きさかえってない?
0349デフォルトの名無しさん
2008/03/20(木) 08:54:55返ってる。じゃあやっぱり渡せるのですかね?
こんな感じ?
template <int N>
void foo(int (&a)[N]);
0350デフォルトの名無しさん
2008/03/20(木) 08:56:06と
std::basic_string<WCHAR>
の中身を変換する方法はありますか?
VC9です。
0351デフォルトの名無しさん
2008/03/20(木) 09:05:00mbstowcsとwcstombs
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_crt_mbstowcs.asp
0352デフォルトの名無しさん
2008/03/20(木) 09:08:11wchar_tの注意事項と説明と変換プログラムが書かれてる
ttp://hw001.gate01.com/eggplant/tcf/cpp/wchar_t_trap.html
※ std::basic_string<WCHAR> == std::basic_string<wchar_t> == std::wstring
0353デフォルトの名無しさん
2008/03/20(木) 09:38:42>>351はC標準。
mbstowcs実行前にsetlocaleでロケールを指定する。
setlocaleはプロセス単位の変更を行うためスレッドセーフでない。
そのため、通常はmain最初の方でsetlocaleする。
>>352はC++標準
ロケールはstd::localeとして引数で渡される。
※ 当然スレッドセーフ
どちらの方法も、ロケールが無いと
charの正体(Shift_JISなど)が分からないので、
指定する必要があるが、
標準ロケールを指定しておけばおk。
0354デフォルトの名無しさん
2008/03/20(木) 09:52:150355デフォルトの名無しさん
2008/03/20(木) 10:11:27「正確でない」より「正確には、こう」という書き方の方が
有用だと思うんですよね
0356デフォルトの名無しさん
2008/03/20(木) 10:59:430357デフォルトの名無しさん
2008/03/20(木) 11:06:040358デフォルトの名無しさん
2008/03/20(木) 11:06:38そうとも言えない。答えを書いちゃうと、自分で調べようとしない癖がつくから。
ま、答えを求めてるなら教えても良いんだけど、それだと成長しないからね。
0359デフォルトの名無しさん
2008/03/20(木) 11:31:28ところが、相談室のも含めて2例とも
「回答側」への難癖なんですよねw
http://pc11.2ch.net/test/read.cgi/tech/1205059063/105n-
流石に「質問者へのヒント」が悪いとは思ってなく、
むしろ質問者に対しては>>358と同じ考えです
0360デフォルトの名無しさん
2008/03/20(木) 11:40:18〜の記述が間違ってますよ、とかコメントする奴w
気付いたならお前が訂正してやれよっていうw
0361デフォルトの名無しさん
2008/03/20(木) 11:46:070362デフォルトの名無しさん
2008/03/20(木) 11:47:14理解した。確かに回答者同士でやり合いが始まると質問者はポカーンだ。
0363デフォルトの名無しさん
2008/03/20(木) 11:47:28正確にわかりやすく書くのは実は結構大変
かと言って間違いをスルーするのも初心者に誤解を与えかねない
→マンドクセ
→煽り気味に間違いを指摘又はググレカス
→荒れる
そんな感じ
0364デフォルトの名無しさん
2008/03/20(木) 15:32:530365デフォルトの名無しさん
2008/03/20(木) 15:41:45・規格は絶対。
・規格は参考に過ぎない。
・規格?何それ美味しいの?
前二者は互いに敵対関係。
0366デフォルトの名無しさん
2008/03/20(木) 15:43:25・調べない奴はどう言っても調べない
・調べた後の奴にとっては時間の無駄
・寸止めしたところで調べ方は理解できない
・知識量によっては寸止めされていることに気付かない
・ログの蓄積にならない
・場合によっては荒れる
・一部の回答者が回答した気分になりたいだけ
ということがある点で、質問には端的に全部答えてしまった方が
双方に手間が無くて良いのではないかと思うようになった。
0367デフォルトの名無しさん
2008/03/20(木) 15:45:580368デフォルトの名無しさん
2008/03/20(木) 15:50:150369デフォルトの名無しさん
2008/03/20(木) 17:53:45http://www.nicovideo.jp/watch/sm2698774
初心者は、C に ++ や # がついただけで言語が変るなんて知らない。
Google 検索で 「C」 & 「文字列」で検索すると、C, C++, C# の説明が混在。
初心者はこれらの説明を混同してプログラムを書こうとする。
というオチで OK ?
0370デフォルトの名無しさん
2008/03/20(木) 17:59:360371デフォルトの名無しさん
2008/03/20(木) 18:09:56他にも char **argv, char argv[][] など色々ある中で、
初心者に教えるとしたら経験上どれが最も良い?
0372デフォルトの名無しさん
2008/03/20(木) 18:11:33文字列の配列って感じがするし。
0373デフォルトの名無しさん
2008/03/20(木) 18:11:560374デフォルトの名無しさん
2008/03/20(木) 18:11:590375デフォルトの名無しさん
2008/03/20(木) 18:12:01ポインタのポインタとか言うとなぜか途端に分からなくなる奴いるし
0376デフォルトの名無しさん
2008/03/20(木) 18:15:480377デフォルトの名無しさん
2008/03/20(木) 18:18:04* を2つの半角スペースで挟んでるのは意図的かなぁ。
int* a が int *a より良いのは賛成。
でも、int* a,b; が int* a; int* b; と同じでないと知ると
初心者はCが嫌いになるw
0378デフォルトの名無しさん
2008/03/20(木) 18:20:49それは規格に準拠していない
0379デフォルトの名無しさん
2008/03/20(木) 18:21:27int *&r = p; とか逆に分かりにくい。
0380デフォルトの名無しさん
2008/03/20(木) 18:26:16どのへんが?後学のために。
0381デフォルトの名無しさん
2008/03/20(木) 18:26:21動画見て「初心者には scanf を教えるしかないか」と思ったけど、
wikipedia みて、scanf 復権!という流れなのを知ったのがつい先月。
0382デフォルトの名無しさん
2008/03/20(木) 18:28:04いや、今はmainの引数の話だからってことだと思うよ。
0383デフォルトの名無しさん
2008/03/20(木) 18:30:13規格にはconstをつけていいとは書いてない。
0384デフォルトの名無しさん
2008/03/20(木) 18:30:33流れをkwsk
つか別にscanfで困ることって無いと思うけどね
0385デフォルトの名無しさん
2008/03/20(木) 18:43:00処理系定義を許してるからportability無視すれば何でもありだけどな。
0386デフォルトの名無しさん
2008/03/20(木) 18:46:51ごめん、wikipwdia じゃなかったのかも。履歴を調べても見つからない。
「セキュリティの問題からこれまで scanf を使うべきではないという指摘が
あったが、正しく対処すれば問題は生じない。そのため scanf 自身が
使ってはならない関数とは言えない」
というような意味の文章をみたと思ったんだけど。
先輩方からscanfは絶対使うなと言われ、これまで従ってきたので。
0387デフォルトの名無しさん
2008/03/20(木) 18:47:540388デフォルトの名無しさん
2008/03/20(木) 18:49:57初心者向けの本に登場させるのであれば、正しい使い方を必ず載せるべきだ。
0389デフォルトの名無しさん
2008/03/20(木) 18:56:070390デフォルトの名無しさん
2008/03/20(木) 18:58:52了解。初心者に scanf から教育して OK なんだ。
その際は、wikipedia にあるように、
char a[20];
scanf("%s", a);
ではなくて、
char a[20];
scanf("%19s", a);
と教えないといけないわけか。
もちろん、
char a[20];
scanf("%19[^\n]%*[^\n]", a);
getchar();
を最初から教えるという手もあるけどw たぶん初心者には無理。
0391デフォルトの名無しさん
2008/03/20(木) 18:59:31セキュリティに関わるような場所に初心者を使う意味がわからん
0392デフォルトの名無しさん
2008/03/20(木) 19:00:410393デフォルトの名無しさん
2008/03/20(木) 19:01:40scanfにfgetsにと使い分ければいいじゃないか
なんでも一つで済ませようとするのはイクナイ
0394デフォルトの名無しさん
2008/03/20(木) 19:06:30フォーマットを動的に生成するしかないってのが。
printf は * があるのに。
0395デフォルトの名無しさん
2008/03/20(木) 19:08:07配列を実際に定義しているところはどのように修正すればよいのだろうか
0396デフォルトの名無しさん
2008/03/20(木) 19:08:590397デフォルトの名無しさん
2008/03/20(木) 19:09:50了解。ちなみに私もfgetsとsscanf派。
先輩からの指導では、scanf は禁止だったが sscanf はOKだった。
Cを教える学校の先生って大変なんだろうな。
そう考えると初音ミクのCプログラミングの動画は奥深いw
0398デフォルトの名無しさん
2008/03/20(木) 19:41:20どういう理由からそうなってるの?
0399デフォルトの名無しさん
2008/03/20(木) 22:42:53class Base {
:
};
class Child1 : public Base {
:
};
class Child2 : public Base {
:
};
void main(void) {
Base* A = new Child1();
:
↑こうやって作ったインスタンスの破棄の際、とりあえずtypeidで分岐させてから
適切な型にダウンキャストして破棄する方法を現在取っています。
if (typeid(*A) == typeid(Child1)) {
delete(dynamic_cast<Child1*>(A));
} else if (typeid(*A) == typeid(Child2)) {
delete(dynamic_cast<Child2*>(A));
} else {
delete(A);
}
}
しかしこれだと派生型が増えれば増えるほどコードがずらずら長くなってしまうので、
もしもっとスマートな破棄の方法があれば教えて頂けませんか。
0400デフォルトの名無しさん
2008/03/20(木) 22:54:02virtual
0401デフォルトの名無しさん
2008/03/20(木) 22:55:09Baseクラスに仮想デストラクタを定義する。
0402デフォルトの名無しさん
2008/03/20(木) 22:59:15デストラクタをvirtualにしとけば、そもそもキャストは不要ってことでいいですか?
どうもありがとうございました。
0403デフォルトの名無しさん
2008/03/20(木) 23:09:53string s;
getline(cin, s);
の方向で
0404デフォルトの名無しさん
2008/03/20(木) 23:10:44クラスにstaticの変数や関数を持ってない方が処理は速いのでしょうか?
0405デフォルトの名無しさん
2008/03/20(木) 23:12:17んなことないんじゃないの?
クラスのstatic変数って、単にグローバル変数をクラスのスコープで隠してるだけだし。
0406404
2008/03/20(木) 23:19:51グローバル変数かクラスのstaticにするか迷ってたので、
クラスのstaticにすることにします。
0407デフォルトの名無しさん
2008/03/20(木) 23:50:18void func_a() throw(exception){ func_b(); }
0408デフォルトの名無しさん
2008/03/20(木) 23:56:24func_bから投げられた例外をfunc_aの呼び出し元に通知する必要があるなら投げればいい。
0409408
2008/03/20(木) 23:57:030410デフォルトの名無しさん
2008/03/20(木) 23:57:440411デフォルトの名無しさん
2008/03/21(金) 00:02:09必要だと思えば付けるし、必要でないと思うなら付けない。
0412デフォルトの名無しさん
2008/03/21(金) 00:15:41強いて使うならデストラクタにthrow()書く位
0413デフォルトの名無しさん
2008/03/21(金) 00:21:040414デフォルトの名無しさん
2008/03/21(金) 00:21:40かといって unexpected を避けるために例外握りつぶすのもどうなんだ? って感じ。
握りつぶすなら unexpected なくてもいいじゃん?
0415デフォルトの名無しさん
2008/03/21(金) 02:38:00thisポインタをグローバル変数に格納しても、
正常にオブジェクトのアドレスが保存されるでしょうか?
0416デフォルトの名無しさん
2008/03/21(金) 02:39:36コンストラクタが失敗しなければ、Yes。
0417デフォルトの名無しさん
2008/03/21(金) 02:44:010418デフォルトの名無しさん
2008/03/21(金) 09:45:06欲しい結果が出ません。
0419デフォルトの名無しさん
2008/03/21(金) 09:47:10それで?
0420デフォルトの名無しさん
2008/03/21(金) 10:01:27#include <math.h>
using namespace std;
const int rate=44100;
int p(double q, int f, int t)
{
const double pi=3.1415;
double x;
x=sin(2*pi*f/rate*q);
cout << int(x*127+128+0.4999);
cout << "\n";
if (f<t) p(q,f+1,t);
return 0;
}
int main(void)
{
p(440.0 , 0, rate);
return 0;
}
このプログラムで、\nが何を意味しているのか
分からないです。
0421デフォルトの名無しさん
2008/03/21(金) 10:04:57endl
0422デフォルトの名無しさん
2008/03/21(金) 10:05:48図書館や本屋で立ち読みとかすればいい。
0423デフォルトの名無しさん
2008/03/21(金) 10:07:38ダウト。endlはそれだけの機能ではない。
0424デフォルトの名無しさん
2008/03/21(金) 10:10:01改行してる
0425デフォルトの名無しさん
2008/03/21(金) 10:15:16ありがとうございます
0426デフォルトの名無しさん
2008/03/21(金) 10:28:43std::vectorを使った場合、メモリはどこの領域に確保されるのでしょうか?
ググッたところテンポラリ領域だと出てきたのですが、テンポラリ領域が
何処にあるのか分かりません。
また、PCの場合とマイコンでは確保される領域に違いがあるのでしょうか?
関数名
{
char buffer[256] ← スタックに確保
char* buffer = new char[サイズ]; ← ヒープに確保
std::vector<char> buffer(サイズ); ← ?
}
0427デフォルトの名無しさん
2008/03/21(金) 10:33:56std::vectorは大抵の場合は内部でヒープにメモリ領域を確保してデータを取り扱っている。
それ以外に方法がない。
0429デフォルトの名無しさん
2008/03/21(金) 10:45:54つーか、テンポラリ領域って何だよ。
0430426
2008/03/21(金) 10:51:59なんだろ??
テンポラリ = 一時的な
あ、なんとなく分かりました。
そんな未知の領域があるのかと思ってました。
ありがとうございます。
0431デフォルトの名無しさん
2008/03/21(金) 12:46:07jnethack を EUC-JP から UTF-8 化しようとしています。
jnethack には japanese/jlib.c というファイルがあり、その中で、
void
jputchar(int c)
{
static unsigned int buf[2];
jbuffer((unsigned int)(c & 0xff), buf, NULL, NULL, NULL);
}
0432431
2008/03/21(金) 12:47:27jbuffer(
unsigned int c,
unsigned int *buf,
void (*reset)(),
void (*f1)(unsigned int),
void (*f2)(unsigned int, unsigned int))
{
static unsigned int ibuf[2];
unsigned int c1, c2;
unsigned char uc[2];
unsigned char *p;
if(!buf) buf = ibuf;
if(!reset) reset = tty_reset;
if(!f1) f1 = tty_jputc;
if(!f2) f2 = tty_jputc2;
c = c & 0xff;
if(!(buf[0]) && (is_kanji(c))){
buf[1] = c;
++buf[0];
return 0;
}
0433431
2008/03/21(金) 12:48:26c1 = buf[1];
c2 = c;
if(IC == output_kcode)
;
else if(IC == EUC){
switch(output_kcode){
case JIS:
c1 &= 0x7f;
c2 &= 0x7f;
break;
case SJIS:
uc[0] = c1;
uc[1] = c2;
p = e2sj(uc);
c1 = p[0];
c2 = p[1];
break;
default:
impossible("Unknown kcode!");
break;
}
}
0434431
2008/03/21(金) 12:49:02uc[0] = c1;
uc[1] = c2;
p = sj2e(uc);
switch(output_kcode){
case JIS:
c1 &= 0x7f;
c2 &= 0x7f;
break;
case EUC:
break;
default:
impossible("Unknown kcode!");
break;
}
}
f2(c1, c2);
buf[0] = 0;
return 2;
}
else if(c){
f1(c);
return 1;
}
reset();
return -1;
}
となっており、2バイトの EUC-JP や SJIS ならなんとかなりそうですが、
1-3バイトの UTF-8 だと、jputchar のコードを書き換えないといけなさそうです。
なんか良いアイデアはありませんか?手詰まりで困っています。
よろしくお願いいたします。
0435デフォルトの名無しさん
2008/03/21(金) 14:58:290436デフォルトの名無しさん
2008/03/21(金) 15:08:43UTF-8対応のキモの部分だろうから、自分で頑張れよ。
問題がもっと小さく具体的にならないと、こういう場ではアドバイスしにくいよ。
0437431
2008/03/21(金) 15:35:27うーん、やっぱりそうすか。
2バイトベッタリなコードなんで、もう UTF-8 対応を諦めて、
EUC-JP で妥協しようかとも思っています。
ありがとうございました。
0438デフォルトの名無しさん
2008/03/21(金) 16:05:170439デフォルトの名無しさん
2008/03/21(金) 16:38:10どうしたいのか分からんけど、
内部コードはUTF-16で良いんじゃね?
サロゲートも抜きで。
0440431
2008/03/21(金) 18:01:17うーん、良いアイデアかと思って調べてみたけど、内部コードを UTF-16 にしたら、
printf では UTF-16 のコードをだだ流しになって、LANG=ja_JP.UTF-8 環境では文字化けしそう。
問題の jputchar がなんとか内部コード UTF-8 に対応すれば、
printf 系はそのままにできるんじゃないかと思ってます。
0441デフォルトの名無しさん
2008/03/21(金) 18:51:15foo(first,...)の書式を使うか
引数に配列を取るか
引数にvectorやlistをとるか
どれが一番無難でしょうか
0442デフォルトの名無しさん
2008/03/21(金) 19:04:38個数が渡せない
C++限定で良いならvector
0443デフォルトの名無しさん
2008/03/21(金) 19:05:55型は固定なん?
固定じゃないなら、下二つを行う場合は
CVariantみたいななんても入るクラスを作る必要があるよ。
0444デフォルトの名無しさん
2008/03/21(金) 19:08:160445デフォルトの名無しさん
2008/03/21(金) 19:12:410446デフォルトの名無しさん
2008/03/21(金) 19:17:180447デフォルトの名無しさん
2008/03/21(金) 19:18:51あたりを参考にすると C++ 風の可変個引数になると思う。
0448デフォルトの名無しさん
2008/03/21(金) 19:24:180449デフォルトの名無しさん
2008/03/21(金) 19:27:180450デフォルトの名無しさん
2008/03/21(金) 19:28:40今回は固定で大丈夫ですが
型も変わる場合はそれ用のクラスかテンプレートが必要になるのでしょうか?
0451デフォルトの名無しさん
2008/03/21(金) 19:33:01コンマ演算子をオーバーロードすることも可能だからな。
0452デフォルトの名無しさん
2008/03/21(金) 19:39:22型が固定なら何でも大丈夫。
型が不定の場合、vectorや配列だと何が困るかというと、
vector<???>の???に入る型が決まらないということ。
決まった基底クラスがあるならまた別なんだろうけど。
0453デフォルトの名無しさん
2008/03/21(金) 19:40:500454デフォルトの名無しさん
2008/03/21(金) 20:55:220455デフォルトの名無しさん
2008/03/21(金) 21:25:37環境はlinux(euc-jp)、gcc3.4、ソースの文字コードはshift-jis。
-fshort-wcharオプションでwcharを4バイトから2バイトに変更したのですが、
そうしたらwprintfの出力が上手くいかなくなってしまいました。
(-fshort-wcharオプションを使わなければ出力されます。)
例:
set_locale(LC_ALL,"");
wprintf(L"aaaaa\n"); // wcharを2バイトにすると出ない...
wcharが2バイトの状況でwprintfを使用するためにはどのようにすればよいのでしょうか?
0456デフォルトの名無しさん
2008/03/21(金) 22:47:30こんな感じで中身を入てるのですが、
STRUCT_TYPE* pvar = new STRUCT_TYPE;
(*pvar).x = a;
(*pvar).y = b;
(*pvar).z = c;
STRUCT_TYPE var = {a, b, c}; のように
{ } を使って1行で書く方法ってないでしょうか?
0457デフォルトの名無しさん
2008/03/21(金) 22:51:140458デフォルトの名無しさん
2008/03/21(金) 22:56:050459デフォルトの名無しさん
2008/03/21(金) 23:01:180460デフォルトの名無しさん
2008/03/21(金) 23:13:14もし、毎回書くのが面倒、という話なら生成関数作れば良いと思う
0461デフォルトの名無しさん
2008/03/21(金) 23:25:57コンストラクタ書けばいいんじゃない?
0462456
2008/03/21(金) 23:36:29構造体もコンストラクタ作れるとは。
クラスと変わらないですね。
コンパウンドリテラルはうちでは使えないっぽかったです。
0463デフォルトの名無しさん
2008/03/21(金) 23:48:33structはすべてのメンバがpublicなclassと等しいことになってる。
0464デフォルトの名無しさん
2008/03/21(金) 23:51:06ウイルスバスター2008が下記レジストリの記入を拒否しました(危険度:高)と出ます。
HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Proxy Server
なんとか回避する方法はないでしょうか?
0465デフォルトの名無しさん
2008/03/21(金) 23:51:29途中にprivate:と書けるので、正確じゃないな。
・アクセス指定を書く前のデフォルトがpublic
・アクセス指定を書かずに継承したとき、public継承
じゃなかったっけ
0466デフォルトの名無しさん
2008/03/22(土) 00:21:381本198円の清涼飲料水1本と、1本138円の牛乳2本を購入し、
千円札で払った場合のお釣りを求めよ。
ただし、5%の消費税を追加し、お釣りの額は整数とする。
なお、消費税を四捨五入するかどうかは自由とする。
という問題が出されて、
#include <stdio.h>
int main(void)
{
int a = 1000,b = 198,c =138,
d = (int)(b + c * 2);
printf("%d\n",a - d);
return 0;
}
自分はこう記述したら答えが模範解答と食い違っていて、なおかつ
※変数を使わず解いても良いが、使えば後で変更が楽である。
※キャスト変換を忘れている場合は減点とする。
※答えを実数にした場合も減点とする。
※計算方法によっては答えが微妙に異なる。
とあったのですが、自分の解き方であっていたのでしょうか? どうも複数正解があるようで・・・
0467431
2008/03/22(土) 00:24:210468465
2008/03/22(土) 00:26:48アッー!
追記 問題引用元 ttp://homepage3.nifty.com/mmgames/c_guide/index.html
0469デフォルトの名無しさん
2008/03/22(土) 00:58:06wstring s;
wcin >> s;
wcout << s << endl;
ってやると何入力しても出力がなくてwcinが無効になっちゃうんですけど
どういうことでしょうか?
0470デフォルトの名無しさん
2008/03/22(土) 00:59:560471デフォルトの名無しさん
2008/03/22(土) 01:07:21wprintf()の中身も -fshort-wchar でコンパイルする必要あり。
で、wprintf()が2バイトのwchar_tを想定して書かれているとは思えない
ので、たぶんムリ。
0472デフォルトの名無しさん
2008/03/22(土) 01:48:570473デフォルトの名無しさん
2008/03/22(土) 02:42:450474デフォルトの名無しさん
2008/03/22(土) 02:44:170475デフォルトの名無しさん
2008/03/22(土) 02:55:07#include <stdio.h>
int main()
{
/* 本当は64bit整数にすべき */
int juice = 198;
int milk = 138;
/* 浮動小数点の誤差を回避するために一万倍にする。 */
int amount = juice * 10000 + milk * 10000 * 2;
int total = amount * 105 / 100;
int round_down = total / 10000;
int round_up = (total + 9000) / 10000;
int half_adjust = (total + 5000) / 10000;
printf("切り捨て = %d, 切り上げ = %d, 四捨五入 = %d\n",
round_down, round_up, half_adjust);
return 0;
}
0476デフォルトの名無しさん
2008/03/22(土) 03:01:220477デフォルトの名無しさん
2008/03/22(土) 03:10:14しかも初代ペンティアムで浮動小数てn(ry
0478デフォルトの名無しさん
2008/03/22(土) 04:35:52int型にしたいんですがどうすればいいんですか?
0479デフォルトの名無しさん
2008/03/22(土) 04:39:550480デフォルトの名無しさん
2008/03/22(土) 04:47:04main関数の引数として文字列受け取った後
なんとか変換する
0481478
2008/03/22(土) 04:52:05こんな感じでおkですか?
一応ちゃんと動作しました
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
using namespace std;
int main(int argc,char* argv[]){
int x;
vector<int> v;
for(int i = 1;i < argc;i++){
istringstream iss(argv[i]);
iss >> x;
v.push_back(x);
}
sort(v.begin(),v.end());
for(vector<int>::iterator i = v.begin();i != v.end();++i){
cout << *i << " ";
}
return 0;
}
0482455
2008/03/22(土) 10:21:18-fshort-wcharしつつ、wprintf使うときはwcharからu32に
コピーするとかしか手がなさそうですね。
-fshort-wcharするとw系ライブラリ自体が使い物にならなくなっちゃうって事ですね。
腐ってる...
0483デフォルトの名無しさん
2008/03/22(土) 11:06:50アーキテクチャの都合から使用が要請されるという類のオプションだと思っている。
#例えばWindowsとか。
0484デフォルトの名無しさん
2008/03/22(土) 11:13:39腐ってるな
0485デフォルトの名無しさん
2008/03/22(土) 12:22:16struct{
int x;
};
};
//1
A a{{4}};
//2
A b;
b.x=4;
この1と2って何が違うんでしょうか?1はコンパイラによってできないと思うんですが、
できるとしたらそのメリットはまとめられる以外に何かあるんでしょうか?
0486デフォルトの名無しさん
2008/03/22(土) 12:33:491は初期化するコードが発生しない。最初から初期値がメモリに存在するようになる。また、constが使える。
0487デフォルトの名無しさん
2008/03/22(土) 12:42:080488デフォルトの名無しさん
2008/03/22(土) 16:04:47テンプレート型にクラスを設定すれば上手くいくんですが、
構造体を設定すると、int(NULL)が構造体の型に変換できません、
というエラーが出てしまいます。
テンプレート型の値を返す関数で、エラーが発生した場合、
戻り値はどうするのが一般的なのでしょうか?
0489デフォルトの名無しさん
2008/03/22(土) 16:06:35テンプレート型と申したか
0490488
2008/03/22(土) 16:13:03こんな感じです。
template <typename T>
T get(int idx) {
if(エラーの場合) return NULL;
return T型の値;
}
0491488
2008/03/22(土) 16:15:590492デフォルトの名無しさん
2008/03/22(土) 16:16:530493デフォルトの名無しさん
2008/03/22(土) 16:21:020494デフォルトの名無しさん
2008/03/22(土) 16:22:47そういう場合は戻り値はboolにして、引数で操作対象のポインタか参照を
受け取る方が書きやすいかも。
template <typename T>
bool get(T &ret, int idx) {
if(エラーの場合) return FALSE;
ret = T型の値;
return TRUE;
}
0495デフォルトの名無しさん
2008/03/22(土) 16:26:360496デフォルトの名無しさん
2008/03/22(土) 16:33:380497488
2008/03/22(土) 16:57:02例外を使うことにしました。
他の方法も、知らなかったので勉強になりました。
もう一つ考えたのが、エラーの場合0でクリアした値を返すというものなんですが、
これって T がポインタだった場合NULLを返してることになるのでしょうか?
T var;
ZeroMemory(&var, sizeof(T));//varを0でクリアする
return var;
0498デフォルトの名無しさん
2008/03/22(土) 17:09:18大抵の場合はNULL=0なので、問題は無い。
しかし極まれにNULLポインタの値が0じゃない環境もあると、
昔脅されたことがあるので、将来組み込みとかやる時は思い出してね。
0499488
2008/03/22(土) 17:13:57たぶんやることは無いと思いますが、覚えておきます。
0500デフォルトの名無しさん
2008/03/22(土) 17:22:51Tをかなり限定してしまう方法だな。
例外以外だったら、std::pair<T,bool>を返して、boolのほうでエラーを示せば?
0501デフォルトの名無しさん
2008/03/22(土) 17:32:40----------------------------------------------------------------------
ゼロと評価される右辺値をもつ整数型の汎用整数数式を、空ポインタ定数と呼
ぶ。空ポインタ定数は、ポインタ方に変換することができる。その結果は、そ
の型の空ポインタ値となる。空ポインタ値は、オブジェクト先ポインタ型又は
関数先ポインタ型のどんな値とも区別できる値とする。同じ型の二つの空ポイ
ンタ値は、比較で等しくなるものでなければならない。空ポインタ定数から、
cv修飾付きの方へのポインタへの変換は、単一の変換となり、ポインタ変換の
後で修飾変換を行うことはない。
Tがオブジェクト方の場合、型"cv Tへのポインタ"の右辺値は、型"cv voidへの
ポインタ"の右辺値に変換することができる。"cv Tへのポインタ"から"cv
voidへのポインタ"への変換結果は、あたかもそのオブジェクトが、型Tの最派
生したオブジェクトであるかのように(すなわち、ある基底クラスの部分オブジェ
クトとしてではなく)、型Tのそのオブジェクトがある記憶域の先頭位置を指す
ものとする。
Dをクラス型とし、BをDの基底クラスとする場合、型"cv Dへのポインタ"の右辺
値は、型"cv Bへのポインタ"の右辺値に変換することができる。ただし、Dから
基底クラスBをアクセスできない場合、又はBがあいまいな場合、その変換を必
須とするプログラムは、不適格とする。変換の結果は、派生クラスのオブジェ
クトの中の基底クラスの部分オブジェクトへのポインタとする。空ポインタ値
は、目的の型の空ポインタ値に変換される。
0502デフォルトの名無しさん
2008/03/22(土) 18:07:04そもそもどうして-fshort-wcharを使いたいの? ふつうは使う状況には
ならないはずだけど。環境が4バイトのwchar_tを提供しているならその
まま使うべきっすよ。
0503デフォルトの名無しさん
2008/03/22(土) 18:17:13ってcppに書くのかヘッダーに書くのかどっちがいいですか?
0504デフォルトの名無しさん
2008/03/22(土) 18:27:320505503
2008/03/22(土) 18:43:070506デフォルトの名無しさん
2008/03/22(土) 18:48:41inlineとかでヘッダにあるならヘッダに#pragma書いてるな
0507デフォルトの名無しさん
2008/03/22(土) 19:05:58強いて言うなら変更したい時にコンパイル時間の少なくなるよう、
単独の .cpp ファイルを作ってそこに書くのがベスト。
0508デフォルトの名無しさん
2008/03/22(土) 19:13:30プログラム側の意思で回避出来たら意味ねーだろw
0509デフォルトの名無しさん
2008/03/22(土) 19:17:030510デフォルトの名無しさん
2008/03/22(土) 19:21:260511デフォルトの名無しさん
2008/03/22(土) 19:35:31お勧めなシミュレータってありますか?
0512デフォルトの名無しさん
2008/03/22(土) 21:08:26子クラスを使うことってできないのでしょうか?
0513デフォルトの名無しさん
2008/03/22(土) 21:14:56使える
0514デフォルトの名無しさん
2008/03/22(土) 21:23:16class Parent{
void func(Child var){}//Childがまだ宣言されてないからエラー、
};
class Child: public Parent{};
この順で書くと、
class Child: public Parent{};//Parentがまだ宣言されてないからエラー
class Parent{
void func(Child var){}
};
になってしまうのですが、どう書けばいいのでしょうか?
0515デフォルトの名無しさん
2008/03/22(土) 21:26:18class Child;
class Parent{
void func(Child var);
};
class Child: public Parent{};
void Parent::func(Child var){}
0516デフォルトの名無しさん
2008/03/22(土) 21:32:250517デフォルトの名無しさん
2008/03/22(土) 21:33:23それは互いをメンバにもってるときじゃないか?
0518503
2008/03/22(土) 21:35:06ヘッダーには処理を書かない派なのでcppに書きたいと思います。
0519デフォルトの名無しさん
2008/03/22(土) 21:41:44そういえばメンバに持つ場合だった
0520デフォルトの名無しさん
2008/03/22(土) 21:44:580521503
2008/03/22(土) 21:46:38関数の定義はcppに書くということです。
lib使ってる部分ということです。
0522デフォルトの名無しさん
2008/03/22(土) 21:51:15プロジェクトファイルでの設定は見づらいから
俺は #pragma の方が好みだな。
ソースファイルの受け渡しだけでも設定が有効だし。
>>521
??
0523503
2008/03/22(土) 21:58:12#pragma once
void f();
//cpp
#include "header.h"
#pragma comment(lib, "lib")
void f()
{
lib_f(); // ←ここでlibの関数を呼んでるのでcppに#pragmaを書く。
}
こういう解釈だったのですが何かおかしかったでしょうか・・・
0524503
2008/03/22(土) 21:59:01#pragma once
#include "lib.h"
void f();
ヘッダーはこうでした
0525デフォルトの名無しさん
2008/03/22(土) 22:03:070526514
2008/03/22(土) 22:04:33当たり判定のための領域を表す、抽象クラスBoundsを作り、
その子クラスにCircle、Rectなどを作りました。
当たり判定をするときは、Bounds型の変数を使って、
以下のように判定ををしてます。
Bounds* bd1 = new Circle();
Bounds* bd2 = new Rect();
BOOL result = bd1->isCrashed(bd2);
この書き方で、Circleの isCrashed(Rect* p) を呼びたいんですが、
なんか上手い方法はないでしょうか。
今は各オブジェクトにクラスタイプを表す変数を持たせて、
Bounds の virtual BOOL isCrashed(Bounds* p) で、
子クラスのisCrashed(Bounds* p) を呼び、
そこでタイプ変数により isCrashed((Rect*)p) とpをキャストして、
子クラスのisCrashed(Rect* p) を呼び出してます。
0527デフォルトの名無しさん
2008/03/22(土) 22:20:43#pragma comment(lib, "...") は
どこかのファイルに書いてありさえすれば、
どのファイルに書いてあってもいい。
0528デフォルトの名無しさん
2008/03/22(土) 22:23:09それは典型的なデザインパターンのひとつのVisitorパターンですね。
ダブルディスパッチとも言うかな
struct Circle;
struct Rect;
struct Bounds{
virtual bool isCrashed(Bounds*) = 0;
virtual bool isCrashed(Circle*) = 0;
virtual bool isCrashed(Rect*) = 0;
};
struct Circle : Bounds{
bool isCrashed(Bounds*p){return p->isCrashed(this);}
bool isCrashed(Circle*p){return puts("Circle Circle");}
bool isCrashed(Rect*p){return puts("Circle Rect");}
};
struct Rect : Bounds{
bool isCrashed(Bounds*p){return p->isCrashed(this);}
bool isCrashed(Circle*p){return puts("Rect Circle");}
bool isCrashed(Rect*p){return puts("Rect Rect");}
};
0529528
2008/03/22(土) 22:25:31衝突判定だから左右入れ替わっても問題ないとは思うけど。
0530デフォルトの名無しさん
2008/03/22(土) 22:30:39lib.h内の関数を呼ぶとビルドにlibが必要なら、
#include "lib.h"
#pragma comment(lib, "lib")
をセットで書いた方が良いと思う。cpp, h 関係無く。
0531デフォルトの名無しさん
2008/03/22(土) 22:34:39参考になるようなものはないでしょうか?
0532デフォルトの名無しさん
2008/03/22(土) 22:35:20STL の list
0533デフォルトの名無しさん
2008/03/22(土) 22:41:09listだと1種類の型しか格納できないので
一つのlistに沢山の型が詰め込めるようにしたいのです
0534デフォルトの名無しさん
2008/03/22(土) 22:43:000536デフォルトの名無しさん
2008/03/22(土) 22:44:57boost::ptr_list<BaseClass> を使って
派生クラスを new して突っ込む方がいい気はするけど。
0537514
2008/03/22(土) 22:48:16ありがとうございます。上手くいきました。
しかし、引数の左右を入れ替えることまで計算済みじゃないんでしょうか?
これだと、Circle::isCrashed(Bounds*p)で無限ループになってしまいます。
struct Circle : Bounds{
bool isCrashed(Bounds*p){return isCrashed(p);}
bool isCrashed(Circle*p){return puts("Circle Circle");}
bool isCrashed(Rect*p){return puts("Circle Rect");}
};
0538デフォルトの名無しさん
2008/03/22(土) 22:56:09ヘッダーに書いておくと、勝手にライブラリを選択してくれて便利かもな。
これは使わせてもらうよ。
0539デフォルトの名無しさん
2008/03/22(土) 22:58:45うん、引数の左右の入れ替えは意図的。
left->isCrashed(right);でleftの型に応じた関数を呼び出す。
その中でright->isCrashed(left)を呼び出してrightの型に応じた関数を呼び出す。
この2段階の呼び出しで左右の型両方に対応した関数を呼び出してる。
実際にはisCrashed(Circle*)とかはprotectedにして置けば、
isCrashed(Bounds*)からしか呼び出せないことになるから必ず左右の入れ替えを起こせるようになる。
こうしておけば順序が重要な場合にも使えるようになる。
0540デフォルトの名無しさん
2008/03/22(土) 23:02:55色々なOO言語のアクセス権限がごっちゃになって適当な事、書いてしまった。
0541デフォルトの名無しさん
2008/03/22(土) 23:05:59interface
isCrashed(RECT*)とisCrashed(POINT*);
を定義して
operator RECT*
operator POINT*
をそれぞれの派生クラスで定義すればいいだけの話じゃね?
俺ならoperatorにもisCrashedの引数にもconst修飾するけど。
0542541
2008/03/22(土) 23:13:23RECT とPOINTは Rect型とCircle型と解釈してくれ。
検証用に作ったコードで考えてしまった。
0543デフォルトの名無しさん
2008/03/22(土) 23:15:37そのやり方だと、これが実現できない
(理由: Boundsには operator RECT* も operator POINT* も定義されてないから)
Bounds* bd1 = new Circle();
Bounds* bd2 = new Rect();
BOOL result = bd1->isCrashed(bd2);
0544デフォルトの名無しさん
2008/03/22(土) 23:17:34本人じゃないけど、どういう実装なん?
leftもrightも型分からんはずだから
そのやり方でダブルディスパッチ(相当)の処理を行えるとは思いにくいんだけど。
0545514
2008/03/22(土) 23:32:20衝突判定なので、左右逆でも問題ないし、
引数入れ替える方法は天才的だと思いましたが、
ちょっと左右を元に戻す方法が気になる。。。
0546デフォルトの名無しさん
2008/03/22(土) 23:42:53strlenにsize_tよりも大きな文字列(へのポインタ)を
突っ込んでもセキュリティ上問題ないですか?
***
バッファオーバーフロー対策で、
サイズさえ分かればちゃんと対策すればなんとか
なりそうっていう感じはわかってきたのですが、
そのサイズを求めるときに不安になったので。
0547デフォルトの名無しさん
2008/03/22(土) 23:48:120548デフォルトの名無しさん
2008/03/23(日) 00:00:250550デフォルトの名無しさん
2008/03/23(日) 00:10:060551デフォルトの名無しさん
2008/03/23(日) 00:17:410552デフォルトの名無しさん
2008/03/23(日) 01:11:420553デフォルトの名無しさん
2008/03/23(日) 02:18:330554デフォルトの名無しさん
2008/03/23(日) 02:50:590555デフォルトの名無しさん
2008/03/23(日) 03:25:28文字列操作関数でcharかwchar_tしか必要ない場合のように
特定の型のみを生成可能にするにはどうしたらよいでしょうか?
0556デフォルトの名無しさん
2008/03/23(日) 03:26:390557デフォルトの名無しさん
2008/03/23(日) 03:39:02template <> struct HogeCanUse<char > { typedef int Well; };
template <> struct HogeCanUse<wchar_t> { typedef int Well; };
template <typename T>
class Hoge
{
typedef HogeCanUse<T> CanUse;
typedef typename HogeCanUse<T>::Well Well;
};
int main()
{
Hoge<char> hoge;
Hoge<int> hoge;
}
とか。
char/wchar_t なら std::char_traits あたりを利用すると
似たようなことができるかもしんない。
0558デフォルトの名無しさん
2008/03/23(日) 11:31:20UTF8とか16とか?
環境による?決まっている?とか。
・
0559デフォルトの名無しさん
2008/03/23(日) 11:43:31環境による
0560558
2008/03/23(日) 13:09:530561デフォルトの名無しさん
2008/03/23(日) 13:15:350562デフォルトの名無しさん
2008/03/23(日) 13:22:55簡易的なLexical_castを作りたいのですが
stringstreamを使うのと特殊化してsprintf系を使うのはどちらが高速に処理できるでしょうか?
0563デフォルトの名無しさん
2008/03/23(日) 13:44:010564デフォルトの名無しさん
2008/03/23(日) 13:45:21iostream系使ってるのはoperator<<のオーバーロードを利用したいからで、
sprintf使うと色々幅が狭まらない?
0565デフォルトの名無しさん
2008/03/23(日) 13:50:390566デフォルトの名無しさん
2008/03/23(日) 14:43:27i>>1 とビットシフトした方が速いのでしょうか?
WindowsXPで動作するアプリで、VC++.NET2003で作ってます。
0567デフォルトの名無しさん
2008/03/23(日) 14:46:30気にせず i/2 としとけ。
0568デフォルトの名無しさん
2008/03/23(日) 14:47:040569デフォルトの名無しさん
2008/03/23(日) 14:48:36sprintf
by Exceptional C++ Style
0570デフォルトの名無しさん
2008/03/23(日) 14:52:23>>568
ありがとうございます。
見にくいので、気にせずi/2することにしました。
0571デフォルトの名無しさん
2008/03/23(日) 14:54:18符号付整数だとシフトだけで済むぶんi >> 1とかのほうが多くの場合速い。
符号無整数だとよっぽど酷いコンパイラを使わない限り最適化で同じになる。
0572デフォルトの名無しさん
2008/03/23(日) 14:55:27意図したことをそのまま書いた方が
最適化が考慮されている可能性は高いので、
シフトにしない方がむしろいいと思う。
0573デフォルトの名無しさん
2008/03/24(月) 02:23:38で
cout << &ss;
cout << (void *)ss;
の2つの結果が同じなのは、なぜですか?
下の意味がよくわからないです。
0574デフォルトの名無しさん
2008/03/24(月) 02:26:23なんで同じであることに納得いかないのか分からん
どうなると思ってたんだ?
0575デフォルトの名無しさん
2008/03/24(月) 02:41:160576デフォルトの名無しさん
2008/03/24(月) 05:49:450577デフォルトの名無しさん
2008/03/24(月) 07:15:27void* とか他のポインタの場合はアドレス表示。
0578デフォルトの名無しさん
2008/03/24(月) 09:27:08上が配列ssのアドレス、下が配列ssの最初の要素へのアドレス。
配列へのポインタ、charへのポインタをvoidに変換しているという点で
型は違うが、アドレスは同じだと思うんだ俺。
0579デフォルトの名無しさん
2008/03/24(月) 10:43:19>上が配列ssのアドレス、下が配列ssの最初の要素へのアドレス。
ちょっと違う。前者は配列ssへのポインタがで、後者は配列ssへのポインタと同値の型を伴わないポインタ。
アドレスでなければいけないとは決まっていないし、値を取り出しているかどうかは実装依存。
# printf("%p", ss)で何が出力されるかと同じ問題だね。大抵は、16進でアドレスを出力するのだろうけれど。
0580デフォルトの名無しさん
2008/03/24(月) 10:44:49符号付整数の右シフトは環境依存なので、不用意に使うのは如何なものかと。
それに、実際に速いのか? 「多くの場合」とは? 案外処理時間は同じかも知れんぞ。
0581デフォルトの名無しさん
2008/03/24(月) 11:16:22単に速度に差があるという指摘のみ。
符号付シフトがコンパイラ依存なのには同意。
速度は実際のところ実測しないと分からないから正直、
適当に推測して書いた。
ただ、符号付除算は最適化前提でもシフトよりは軽くならんだろ。
>>は算術シフト、>>>は論理シフトとすると
x/2は大体こういう式に相当する
(x >> 1) + (x >>> 31 & x) ・・・ 32bit整数の場合
で、この演算コストがx >> 1より軽い事はまずないだろーって感じの推測。
これがシフト演算1命令より軽いアーキテクチャってあったっけ?
ま、正直C/C++の話題からはずれ気味なんでどうでもいいや。
0582デフォルトの名無しさん
2008/03/24(月) 11:35:29例えば、-3/2は-1だけど、-3を右シフトしても-2にしかならないと思う。
0583デフォルトの名無しさん
2008/03/24(月) 11:55:05結果は異なるのは当然やん?
だから、符号付除算をシフトに置き換える最適化をしても、
結果の補正に演算が必要になる。
その補正の演算分だけ符号付除算が遅いって話だよ。
0584デフォルトの名無しさん
2008/03/24(月) 11:58:59double型のまま計算するより
有効数字倍(10倍やら100倍やら)のint型に変換してから処理して
最後にまたdoubleに戻してやる方が処理によっては高速になるとかいうテクニックがあるようですが
このとき
double型を1000倍してから1/1000するより
1024倍して1/1024する方が除算がシフト演算になるからより高速になると聴いたのですが本当ですか?
0585デフォルトの名無しさん
2008/03/24(月) 12:05:55double→int変換は結構遅かったような
0586デフォルトの名無しさん
2008/03/24(月) 12:10:16それはシフトじゃなくて、
1000じゃなくて1024にすれば浮動少数の指数部だけ変更すればいいから速いって話じゃないの?
コンパイラが乗除算を指数部への加減算に置き換えてくれるかどうかは疑問。
浮動少数周りの最適化ってコンパイラにはあんまり期待できないし。
0587デフォルトの名無しさん
2008/03/24(月) 12:17:38結果が違ってしまうシフトは負の値には使えないって結論でいいの?
それとも、結果が違ってでも速くしたいのならシフトも試してみろってこと?
0588デフォルトの名無しさん
2008/03/24(月) 12:35:50いや、符号付の2の除算と(算術or論理)シフトは本質的に異なる演算でシフトのほうが補正がない分速いってだけ。
二つの演算の速度の差以外はなにひとつ主張する気はないし、それ以外の結論も出していない。
そこから先は個々人で判断するべきだと思っている。
0589デフォルトの名無しさん
2008/03/24(月) 12:58:27少し書き方が悪かったけど、あげあしはとらないでよ。
0590デフォルトの名無しさん
2008/03/24(月) 14:54:440591デフォルトの名無しさん
2008/03/24(月) 15:01:550592デフォルトの名無しさん
2008/03/24(月) 15:13:210593デフォルトの名無しさん
2008/03/24(月) 15:14:540594デフォルトの名無しさん
2008/03/24(月) 15:21:28は5*10の配列でしょうか?
vector<int[10]> s;
として、push_backで追加するにはどうすればいいですか?
何を追加したら増えますか?
0595デフォルトの名無しさん
2008/03/24(月) 15:22:460596594
2008/03/24(月) 15:22:59256個の固定配列が、可変個数必要なのですが、どのように定義するのが良いですか?
0598デフォルトの名無しさん
2008/03/24(月) 15:35:410599デフォルトの名無しさん
2008/03/24(月) 15:56:43struct Array256 {
int array[256];
};
or
#include <boost/array.hpp>
typedef boost::array<int, 256> Array256;
vector<Array256> s;
0600デフォルトの名無しさん
2008/03/24(月) 16:04:16そのポインタがどの派生クラスを指しているかを直接知る方法はありませんか?
メンバ変数にどの派生クラスか印すのが手っ取り早いとは思いますが
0601デフォルトの名無しさん
2008/03/24(月) 16:09:31なんで派生クラスの種類が知りたいんだ?
0602デフォルトの名無しさん
2008/03/24(月) 16:28:33class Base {};
class Derived1 : public Base {};
class Derived2 : public Base {};
...
Base *obj;
Derived1 *derived = dynamic_cast<Derived1 *>(obj);
これでderivedがNULLで無ければ、objはDerived1派生クラス。
RTTI必須なので注意。
0603デフォルトの名無しさん
2008/03/24(月) 16:29:10dynamic_castかtypeid使えば?
個人的には>>601に同意だけど
0604デフォルトの名無しさん
2008/03/24(月) 16:30:590605デフォルトの名無しさん
2008/03/24(月) 16:42:340606デフォルトの名無しさん
2008/03/24(月) 16:43:550607デフォルトの名無しさん
2008/03/24(月) 16:47:180608デフォルトの名無しさん
2008/03/24(月) 16:47:45それデザパタのコンポジットパターンでいいじゃん。
いちいちdynamic_castとか必要か?
0609デフォルトの名無しさん
2008/03/24(月) 16:53:36抽象化ミスってるか、多態で解決できることに気付いていないかのどっちか。
0610デフォルトの名無しさん
2008/03/24(月) 17:00:07f = new File;
f.add(new File);
こんなのを静的にエラーにしないといけない場合は、そのパターンとれないっしょ。
0611デフォルトの名無しさん
2008/03/24(月) 17:02:54};
class directory : public basic_file {
public:
void add(basic_file* file);
};
class file : public basic_file {
};
0612デフォルトの名無しさん
2008/03/24(月) 17:09:030613デフォルトの名無しさん
2008/03/24(月) 17:19:12静的にエラーというのが何を指しているかいまいち分からん。
コンパイル時に弾きたいならFileクラスでaddのアクセス権限をprivateにしときゃいんじゃね
0614デフォルトの名無しさん
2008/03/24(月) 17:40:400615デフォルトの名無しさん
2008/03/24(月) 17:46:23まさに「抽象化ミスってる」例だな。
0616デフォルトの名無しさん
2008/03/24(月) 17:47:27f = new File;
f.add(new File);
には突っ込まないんだね。
正しく?は
f = new File;
f->add(new File);
0617デフォルトの名無しさん
2008/03/24(月) 17:49:10環境表示部分のEDITクラスらしきものとBUTTONクラスらしきボタン2つがあるんですが
これらのコントロールはspy++でハンドルを取得しようとしてもその親ウィンドウらしきハンドルしか取れないんですが
CreateWindow等で作成したコントロールでも親ウィンドウで何らかの処理をするとハンドルを隠す事が出来るのか
それともコントロールに見えるけど実は全部描いて作って処理も既存のクラスのように振舞っているのでしょうか?
また、前者ならどのような処理をしているのでしょうか
他人のソースコードなんてそんなに見たことないのにあの量のコードじゃ目が点になってしまい挫折してしまいましたorz
0618デフォルトの名無しさん
2008/03/24(月) 17:52:42今は別に表記の話題をしてるわけじゃないから、
pseudocodeと思っとけばいいだろ。
# D言語ならそのまま通るし。
0619デフォルトの名無しさん
2008/03/24(月) 18:05:28「論理的な不変性を保証しない」例が、
載っているのですが、
試しにコードを書いて実験したところ、
確かにコンパイルは通りますが、
実行時エラーとなります。
なにがいけないのか、わかる方、
教えてください。
・実行時エラーの原因
・本の意図することを確かめる方法
class CTextBlock{
private:
char *pText;
public:
CTextBlock (char* ini_txt) : pText(ini_txt){};
char& operator[](size_t position) const
{return pText[position];}
};
int main() {
const CTextBlock cctb("Hello");
char* pc = &cctb[0];
*pc = 'J'; // ここで"Jello"になるはず
}
この最後の部分で、本では"Jello"になると言っていますが
このコードでは実行時エラーになってしまいます。。。
0620デフォルトの名無しさん
2008/03/24(月) 18:09:520621デフォルトの名無しさん
2008/03/24(月) 18:13:29(特例でこの場合はchar*に暗黙にキャストされてるけど)
本来書きかえれないものを書き換えたからエラーが起きたんだろう。
0622デフォルトの名無しさん
2008/03/24(月) 18:17:43ありがとうございます。
では、本でやっていることは無理ということなのでしょうか。
それとも私のコードが悪いのでしょうか。
上記のmainは本そのまま、operator[]記述も本そのままです。
constなのに書き換えられちゃうよ、ということが証明したいのだと
思うのですが。
0623デフォルトの名無しさん
2008/03/24(月) 18:46:23全部自分で描いてると思うよ
でなきゃテーマ切り替えたりできんだろう
0624デフォルトの名無しさん
2008/03/24(月) 18:49:11動く環境もあるのは確かなんだけどな。
まあ、組み込みとか MS-DOS とかそういう環境だろうな。
0625デフォルトの名無しさん
2008/03/24(月) 18:54:21既にありませんか?
stringを100万行とかはメモリに確保するのは困難ですが
HDDなら簡単です
0626デフォルトの名無しさん
2008/03/24(月) 19:01:13ありがとうございます。
それでは、ここは気にしないことにします。
0627デフォルトの名無しさん
2008/03/24(月) 19:02:04ifstream,ofstreamを使ってちまちまやりましょう。
0628デフォルトの名無しさん
2008/03/24(月) 19:03:12よくある実装は文字列リテラルをROM領域に配置するというもの。
寛容に読むことも大事ですよ。メイヤーズが言いたいことはビットレベルの不変性
は保たれていても、この例のように例えばクラス外部で保持しているデータは変更
される危険があることを言っている。この考えは、いろいろな状況で応用できるでしょう。
まあ、気になるならメイヤーズに直接メールして聞いてもいいんじゃないか?
0629デフォルトの名無しさん
2008/03/24(月) 19:22:37やっぱりそうですか
自由度の高さから自前で描いてるような気はしてましたけど
あまりの完成度なので…
ありがとうございました。
0630デフォルトの名無しさん
2008/03/24(月) 21:01:49無いと思うけど、100万行も何のデータに使うの?
0631デフォルトの名無しさん
2008/03/24(月) 21:04:15100万行に限りませんが、vectorの同等の使い方で
int型配列100メガとか、1ギガとか、メモリ上に確保が難しい場合にメモリが空けられます
0632デフォルトの名無しさん
2008/03/24(月) 21:11:04数値計算とか画像処理とかやってたら普通に必要になることはあるよね。
そんときゃ自作した。
全部 HDD に置くとパフォーマンスに影響出るから、
一部をメモリに置くとかやった。
そういう形の最適化を個々のケースに対して行うことがあるから
出来合いのものは(多分ないとは思うけど)使わない方がいいかもね。
0633デフォルトの名無しさん
2008/03/24(月) 21:14:530634デフォルトの名無しさん
2008/03/24(月) 21:26:00サンクス
0635デフォルトの名無しさん
2008/03/24(月) 21:35:590636デフォルトの名無しさん
2008/03/24(月) 21:40:36処理の都合で、というのならともかく、パフォーマンス目的で自前のバッファを持たすのは無駄である可能性がある。
そのバッファもページングでHDDへ送られる可能性があることをお忘れなく。
0637デフォルトの名無しさん
2008/03/24(月) 21:45:36別のデータが出てきて追い出される可能性がある ( メモリを圧迫するという事 )
そしたら初めから最大値を10Mまでと決めておけばメモリの確保が出来る
0638デフォルトの名無しさん
2008/03/24(月) 21:48:170639デフォルトの名無しさん
2008/03/24(月) 22:45:06やりたいこと : サンプルプログラムのコンパイル
環境
OS : windowsXP
memory : 512MB
CPU : Pentium3 1.13GHz
ファイル名 test.c
内容
#include <stdio.h>
main()
{
printf("こんにちは");
}
やったこと
このファイルをborlandとやらのbcc32.exeにD&D
結果
コマンドプロンプトが一瞬出現、消失。
何がなにやらさっぱりです。
0640デフォルトの名無しさん
2008/03/24(月) 22:47:20ググれ
詳細に解説してあるサイトがあるから
0641デフォルトの名無しさん
2008/03/24(月) 22:48:05プログラムが”正常に”終了したのでプロンプトが閉じられました
printf()のあとにgetchar()でも追加しとけ
0642デフォルトの名無しさん
2008/03/24(月) 22:49:37いやいや、それよりずっと以前の問題だからw
0643デフォルトの名無しさん
2008/03/24(月) 22:55:25正直なのはいいことだが、20分は短すぎるぞ。もっと悩め
0645デフォルトの名無しさん
2008/03/24(月) 23:07:340646デフォルトの名無しさん
2008/03/24(月) 23:20:400647デフォルトの名無しさん
2008/03/24(月) 23:22:150648デフォルトの名無しさん
2008/03/24(月) 23:22:43PATHとやらも設定したんで今日は電源落として寝るよ。
0649デフォルトの名無しさん
2008/03/24(月) 23:25:58をして電源落とすところを想像して興奮した
0650639
2008/03/24(月) 23:31:000651デフォルトの名無しさん
2008/03/24(月) 23:42:11性能低かったのかね。
0652デフォルトの名無しさん
2008/03/25(火) 00:27:20C++だとconst char *なの?
C言語だと、文字列リテラルの書き換えは未定義で、
VC++ではオプションで動作を変えれた気がするんだけど、
ウソ情報かも知れない。
0653デフォルトの名無しさん
2008/03/25(火) 00:33:230654デフォルトの名無しさん
2008/03/25(火) 00:34:40あるよ
0655デフォルトの名無しさん
2008/03/25(火) 00:46:160656デフォルトの名無しさん
2008/03/25(火) 00:49:220657デフォルトの名無しさん
2008/03/25(火) 00:50:400658デフォルトの名無しさん
2008/03/25(火) 00:57:350660デフォルトの名無しさん
2008/03/25(火) 07:19:100661デフォルトの名無しさん
2008/03/25(火) 10:38:53とほてっぷ
0662デフォルトの名無しさん
2008/03/25(火) 12:33:41decay
0663デフォルトの名無しさん
2008/03/25(火) 13:21:290664デフォルトの名無しさん
2008/03/25(火) 14:08:13class Abstract{
virtual void piyo()=0;
};
struct Hoge{
Abstract a;
};
もちろん実際に使う時にはAbstractの派生クラスの具象クラスしか代入はしませんが、
これに準ずる方法などありますでしょうか?
0665デフォルトの名無しさん
2008/03/25(火) 14:12:55じゃダメなの?
0666デフォルトの名無しさん
2008/03/25(火) 14:19:10じゃダメなの?
0667デフォルトの名無しさん
2008/03/25(火) 14:20:58じゃダメなの?
0668デフォルトの名無しさん
2008/03/25(火) 14:24:23じゃダメなの?
0669デフォルトの名無しさん
2008/03/25(火) 14:28:37実態じゃなきゃダメなんです。
>>666
auto_ptr使ったことないんですが、ちょっと調べます。
用途を書いておくと、あるクラスにAbstractの派生クラスを渡しそれらを一つのvectorで保持するという物なのです。
Javaで言う<T extends Abstract>(だっけ?)みたいなことができれば解決できるかもしれないんですが・・・
0670デフォルトの名無しさん
2008/03/25(火) 14:38:33javaでのAbstract a;と
c++でのAbstract* a;は
大雑把に言うと、同じもの。
まずはc++でのポリモーフィズムの書き方について、
サイト見て回った方が良いと思うよ。
0671デフォルトの名無しさん
2008/03/25(火) 14:39:02実体じゃn
今はテンプレートでこんな感じで組んでます。
class Touroku{
struct hina{
template<class T>T data;
template<class T>hina(T& t):data(t){}
その他のデータ
};
std::vector<hina> items;
public:
template<class T>void add(T&);
};
template<class T>
void Touroku::add(T& t){
items.push_back(hina(t));
}
これだと下の関数を呼び出すと外部シンボルが未解決とでてコンパイルできません。
どうすればいいんでしょうか?
0672デフォルトの名無しさん
2008/03/25(火) 14:43:54それは分かってるつもりなんですが・・・
でもC++じゃポインタ渡しただけじゃコピー用のメソッドとか作っておかないと
中身同じの実体同士の代入と同じ効果得られなくないですか?
0673デフォルトの名無しさん
2008/03/25(火) 14:45:38おまえはJavaもC++も一から勉強しなおしたほうがいいかもな。
0674デフォルトの名無しさん
2008/03/25(火) 14:46:56すいません。ちょっと解説お願いします
0675デフォルトの名無しさん
2008/03/25(火) 14:49:36String str1 = "hogehoge";
String str2 = str1;
としたとき、str1もstr2も同じ"hogehoge"という文字列のインスタンスを指すって理解してる?
してるなら、
const char* str1 = "hogehoge";
const char* str2 = str1;
これは?
0676デフォルトの名無しさん
2008/03/25(火) 14:51:180677デフォルトの名無しさん
2008/03/25(火) 14:56:43Javaでも実体同士の代入と同じ効果が欲しけりゃ、
clone書くなりする必要があるわけだが。
0678デフォルトの名無しさん
2008/03/25(火) 15:02:14しばらく離れてたからってのは言い訳にならないですよね・・・
(そういえば、配列とかも渡した先で変更したら中身変わってますよね。^^;)
でもとにかく、実体でコピーさせたいんですけど、>>671のコードどこが間違ってるか
分かりますでしょうか?
0679デフォルトの名無しさん
2008/03/25(火) 15:03:380680デフォルトの名無しさん
2008/03/25(火) 15:05:140681デフォルトの名無しさん
2008/03/25(火) 15:07:33template <class T>
class Touroku {
struct hina {
T data;
hina(T& t) : data(t) {}
};
std::vector< hina<T> > items;
public:
void add(T& t);
};
template <class T>
void Touroku<T>::add(T& t)
{
items.push_back(hina(t));
}
int main() {}
とりあえずbcc32で通ったコード
0682デフォルトの名無しさん
2008/03/25(火) 15:08:590683デフォルトの名無しさん
2008/03/25(火) 15:11:230684デフォルトの名無しさん
2008/03/25(火) 15:20:02ポインタで何とかするもの考えて見ます。
0685デフォルトの名無しさん
2008/03/25(火) 15:28:32{
virtual void func() = 0;
};
class Nanika
{
std::vector< boost::shared_ptr<Abstract> > items;
public:
void add(boost::shared_ptr<Abstract> item);
};
void Nanika::add(boost::shared_ptr<Abstract> item)
{
items.push_back(item);
}
struct Test : public Abstract
{
void func() {}
}
int main()
{
Nanika n;
n.add(boost::shared_ptr<Abstract>(new Test));
}
0686デフォルトの名無しさん
2008/03/25(火) 19:14:04で具象化するときコンパイルエラーになっちゃうけど、既存のスマポはどうしてるんでしょうね
0687デフォルトの名無しさん
2008/03/25(火) 19:15:44参照を返した
0688デフォルトの名無しさん
2008/03/25(火) 21:38:30#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE (5)
void FreeAddress( char **cData , int iLen ){
if( iLen >= 0 ){
for(int i = 0 ; i < iLen ; i++ ){
free( cData[ i ] );
}
}
}
int main( ){
char *cData[BUFSIZE] , *cBuf, cCopy[5];
for(int i = 0; i < BUFSIZE; i++ ){
cBuf = malloc( sizeof( char ) * 5 );
if( cBuf == NULL ){//失敗したら消す
FreeAddress( cData , i );
// return 0;
}
else{
sprintf(cCopy ,"%04d", i );
strcpy( cBuf , cCopy );
cData[i] = cBuf;
}
}
for(int i = 0 ; i < BUFSIZE; i++ ){
printf("%s\n",cData[i]);
}
return 0;
}
0689デフォルトの名無しさん
2008/03/25(火) 22:22:40多分、よろしい。
ただ、free(cData[i]) の後に cData[i] = NULL を書くか、
FreeAddress( cData , i ) の後の return 0 を有効にしないと、
エラー後の文字列出力が正しく行えない。
0690デフォルトの名無しさん
2008/03/25(火) 22:34:35というif文はどう作ればいいのでしょうか?
0691デフォルトの名無しさん
2008/03/25(火) 22:36:46if (strcmp(nyuuryoku, arumojiretu) == 0)
0693デフォルトの名無しさん
2008/03/25(火) 22:56:50ちなみに と書けば半角空白でも連続して入れられる。
↓をコピペして書くと
if(1){
f();
}
↓となる
if(1){
f();
}
0694デフォルトの名無しさん
2008/03/25(火) 22:59:26インデントされて見えるから、特別読みにくかったらそうすれば言いだけの話。
0695デフォルトの名無しさん
2008/03/25(火) 23:03:470696デフォルトの名無しさん
2008/03/25(火) 23:08:23janeとかだと、逆に でコピーされる?
というか、janeでインデント見れるってことは、
datには情報残ってるんだな。知らなかったよ。
壷の前にローカル串入れていじってみるわ。
0697デフォルトの名無しさん
2008/03/25(火) 23:10:01jane使ってたけど知らなかった。ctrlなしならそのスレにジャンプなんだな。thx
0698デフォルトの名無しさん
2008/03/26(水) 00:44:49Windowsが直接呼び出すウインドウプロシージャから
各インスタンスのウインドウプロシージャ関数を呼び出すとき、
ウインドウプロシージャで得られたウインドウハンドルからそれぞれの
インスタンスを特定するコードを書いています。
で、ウインドウハンドルとインスタンスの関連付けは
ウインドウハンドルを戻り値として得られるCreateWindowEx()直後で
やってるのですが、CreateWindowEx()終了前に呼び出されるWM_CREATEを
どうやって捕まえるかで悩んでます。
CreateWindowEx()直前で未登録インスタンスを
Windowsが直接呼ぶウインドウプロシージャに予め教えておき、
関連付けのないウインドウハンドル&WM_CREATE時は
予め教えておいたインスタンスを呼び出す方法を考えたのですが、
どうも美しくない。何かの間違いで予期しない動きもしそうですし。
そこで皆さんの知恵を拝借いただければと思った次第です。
0699デフォルトの名無しさん
2008/03/26(水) 00:47:200700デフォルトの名無しさん
2008/03/26(水) 00:49:390701デフォルトの名無しさん
2008/03/26(水) 00:54:03もう一つ質問があります
staticな可変個 (動的) 配列は、static int *x;とすればですか?
なんども別なのが作られませんよね?
0702デフォルトの名無しさん
2008/03/26(水) 00:54:13CREATESTRUCT の lpCreateParams に入ってるので
ウィンドウプロシージャでそれを拾って OnCreate を呼べばいい。
0703デフォルトの名無しさん
2008/03/26(水) 00:56:13static int *x = new int[100];
と書いた場合、new は最初の1度しか呼ばれない。
static int *x;
x = new int[100];
と書いた場合、毎回 new される。
初期化と代入の違いってやつやね。
まあ、new だとプログラム終了時に delete してもらえないので、
std::vector を使うのを薦める。
0704701
2008/03/26(水) 00:56:35関数内で、static vector<int> x;
と定義して、xが変更されたとします
次に関数呼び出しがあったときもxは残っていますか?
0706デフォルトの名無しさん
2008/03/26(水) 00:57:440707デフォルトの名無しさん
2008/03/26(水) 00:59:180708デフォルトの名無しさん
2008/03/26(水) 01:00:55よく考えて使うように。
0709デフォルトの名無しさん
2008/03/26(水) 01:13:32たとえば、1のとき、2のときで値を保持します
0710デフォルトの名無しさん
2008/03/26(水) 01:16:36異なるnが増えるごとに、vectorの個数を増やして
mapでハッシュとして関係づけます
ほかの方法ありますか?
0711デフォルトの名無しさん
2008/03/26(水) 01:16:52staticなmapを用意すればいいんでね?
でも、それは多分よい設計ではない。
0712710=709
2008/03/26(水) 01:20:41static なmapが一番簡単ですか 710は勘違いしてました
0713デフォルトの名無しさん
2008/03/26(水) 01:29:03よく考えて使うように。
0714デフォルトの名無しさん
2008/03/26(水) 01:36:37構造体配列についてお聞きしたいのですが
KATA k[2] = {{1,1}, {2,4}};
という構造体で定義して
この関数呼び出しで{1,1}をひとつのprint文で表示する
方法ってありますか?
関数でvoid*baseで受け取った場合
printf("%d",*base1);
とすると1だけ表示されます
r(k,sizeof(k)/sizeof(k[0],sizeof(KATA);
としたとき
rの関数内でこの構造体配列の
0715デフォルトの名無しさん
2008/03/26(水) 01:39:32おちつけ。
0716714
2008/03/26(水) 01:56:24すべてのメンバを表示することは可能なのでしょうか?
0717デフォルトの名無しさん
2008/03/26(水) 02:03:21printf( "%d %d", ( KATA * )base1.value1, ( KATA * )base1.value2 );
とかは?
となるとかなり環境依存のコードでなきゃ無理だと思う。
0718714
2008/03/26(水) 02:09:04はい。そのは仕様でvoid*となっているので変えられません
base1.value1が引数でvoid*型なんで
char*でキャストしてポインタで考えるんですが
どうしても先頭しか表示できないんで困ってます
0719デフォルトの名無しさん
2008/03/26(水) 02:51:58class cls {
public:
int n;
cls(){ n=10; }
};
int F(int n){
static map < int, cls > x;
return x[n].n;
x[n].n++;}
main(){
cout<<F(0)<<endl;
cout<<F(0)<<endl;
}
0720デフォルトの名無しさん
2008/03/26(水) 02:56:330721デフォルトの名無しさん
2008/03/26(水) 03:30:31foo( ( void* )( &k[1] ) );
なら呼ばれる側は
void foo( void* p ) {
KATA* k = ( KATA* )p;
printf( "%d %d", k->value1, k->value2 );
}
な感じ。value1とかは適当に置き換えて
0722デフォルトの名無しさん
2008/03/26(水) 03:32:490723デフォルトの名無しさん
2008/03/26(水) 03:50:08困るのは判るが、先ずは自分の書き込みを読み直す癖をつけろ。
0724デフォルトの名無しさん
2008/03/26(水) 03:56:39Cの勉強を始めようと思い独習Cという本の3版を買ったのですが、時間がとれずにいるあいだ、4版が出てしまいました
ご存じの方がいらっしゃれば、
3→4での主な変更点(買い換えを勧められるような変更があったかどうか)を教えていただけないでしょうか
googleで検索しても、Vista対応、コンパイラ刷新程度のことしかわかりませんでしたのでここで質問させていただきます
私はほとんど初学で、リファレンスを写しながら数百行程度のプログラムを数個つくったことがあるだけ
ということもアドバイスの考慮に入れていただけると幸いです
もしすれ違いでしたら申し訳ありません
0725デフォルトの名無しさん
2008/03/26(水) 05:11:25気にせず勉強がんばれ
0726デフォルトの名無しさん
2008/03/26(水) 05:20:35とすると、x[n]はクラスですが、
その初期化の時に番号nを使う事は出来ませんか?
0727デフォルトの名無しさん
2008/03/26(水) 05:26:150728デフォルトの名無しさん
2008/03/26(水) 05:27:120729726
2008/03/26(水) 05:32:09毎回書き換えが行われてしまいます 初めの一回だけにしたいんです
0730デフォルトの名無しさん
2008/03/26(水) 05:33:53始めにあり得ない値で初期化しておき、そのときだけnで書き換える事にします
0731デフォルトの名無しさん
2008/03/26(水) 06:56:320732デフォルトの名無しさん
2008/03/26(水) 07:09:41x.insert(std::pair<int, cls>(n, cls(n)));
0733デフォルトの名無しさん
2008/03/26(水) 08:15:47void *operator new(size_t size){ return malloc(size); }
これで、以下のプログラムが動くんですが、理屈がよくわかりません。
TestClass* pobj = new TestClass();
関数っぽく書くと、こんな感じのように思うんですが、
TestClass* pobj = new(TestClass());
size_t型を引数にしてるのに、何故引数にTestClass()を入れられるのでしょうか。
それと、malloc()でメモリを確保しているのは分かるんですが、
どこで、そのメモリにオブジェクトのデータがコピーされてるんですか。
0734デフォルトの名無しさん
2008/03/26(水) 08:27:40newが無い?
733の定義はnew演算子の定義じゃん。
newを演算子として認識はするんでしょ。
0735デフォルトの名無しさん
2008/03/26(水) 08:35:03その定義は、メモリを確保してnewに与えるためのもので、new本体ではない。newはコンパイラがうまく処理してくれる。
0736デフォルトの名無しさん
2008/03/26(水) 08:36:480737デフォルトの名無しさん
2008/03/26(水) 10:06:040738デフォルトの名無しさん
2008/03/26(水) 11:58:370739デフォルトの名無しさん
2008/03/26(水) 12:11:07C、C++の最適化について語るスレ 2
http://pc11.2ch.net/test/read.cgi/tech/1177808054/
0740デフォルトの名無しさん
2008/03/26(水) 12:20:16class Hoge{
template<typename U>Hoge& operator =(const Hoge<U>&);
};
このテンプレート関数を部分特殊化したいんですけど、
一つ目はUがTと等しいタイプで二つ目はTとUがクラスであるタイプ
なんですが、いまいち書き方が分かりません。ご教授願います。
0741デフォルトの名無しさん
2008/03/26(水) 12:25:36その2つの特殊化があるとして、TとUが等しいクラス型だった場合は
どっちが使われるんだ?
0742デフォルトの名無しさん
2008/03/26(水) 12:38:51U と T が等しい場合はコンパイラが生成する oeprator = と同じ引数になるんで
テンプレートが使われることは無い。特殊化として書きたかったバージョンを普通の
代入演算子として書いとけばいいよ。
0743デフォルトの名無しさん
2008/03/26(水) 12:59:49その場合はどちらでも良い実装なのですが、コンパイラ的にはどうなのか分かりません。
>>742
実はこれスマートポインタクラスなのでそれではダメなんです。参照カウントのインクリメントが
必要なので、
二つ目のは派生クラスから基底クラスへの代入ができるようにするためのものなんですが、
これで合ってるのかなぁ・・・
0744デフォルトの名無しさん
2008/03/26(水) 13:06:351つ目はテンプレートでないHoge& operator =(const Hoge&);を定義すれば実現できる。
(742の言い直しだけど)
2つ目のスマートポインタでアップキャストは740のやつをそのまま
(部分特殊化せず)使ってできないのか?
boost::shared_ptrはそうしていたはずだが。
0745デフォルトの名無しさん
2008/03/26(水) 13:19:55二つ目を740で定義してるんですが、以下のようなところで変換できないと言われてしまいます。
class Base{};
class Derive:public Base{};
void hoge(my_ptr<Base>);
{
hoge(my_ptr<Derive>(new Derive()));
}
0746デフォルトの名無しさん
2008/03/26(水) 14:14:40�@my_ptr<Base>とmy_ptr<Derived>は異なる型。
�A関数への引数渡しは初期化のセマンティクス(代入演算子は使われない。)
�BMore Effective C++ 項目28を読む。
0747デフォルトの名無しさん
2008/03/26(水) 14:20:51コピーコンストラクタの定義も加えたらコンパイルは通りましたが、
�@のルールからパブリックでないポインタ本体やカウント変数へのアクセスが
できません。これを解決する手段というのはあるのでしょうか?
0748デフォルトの名無しさん
2008/03/26(水) 14:33:36初期化のセマンティクスってなんですか?
0749デフォルトの名無しさん
2008/03/26(水) 14:44:23(operator =ではなく)コンストラクタによって
行われているということ。
0750デフォルトの名無しさん
2008/03/26(水) 15:06:05なるほど
実引数が元々持ってた変数等の値の代入もコンストラクタで行われるのですか?
0751デフォルトの名無しさん
2008/03/26(水) 15:29:27何を言ってるのかわからない
こういうことだろ
void foo(Bar x) {
}
int main() {
Bar y;
foo(y); // Bar のコピーコンストラクタを使って実引数 y から foo の仮引数 x を初期化する
}
0752デフォルトの名無しさん
2008/03/26(水) 15:33:35となると、めんどくさがらずにちゃんとコピーコンストラクタを用意してあげないと後々面倒になりそうだ
0753デフォルトの名無しさん
2008/03/26(水) 16:26:52メンバにFILEやHANDELの様な物を持つ場合これらの扱いはどうしたらいいのでしょうか?
ポインタの場合は参照先を共有するか、実体をコピーしてくるかはそれぞれだと思うのですが・・・
0754デフォルトの名無しさん
2008/03/26(水) 16:34:09自己レス
HANDELじゃなくてHANDLEだったわorz
0755デフォルトの名無しさん
2008/03/26(水) 16:43:15共有するか、コピーコンストラクタと代入演算子をprivateにしてコピー不可とする
0756デフォルトの名無しさん
2008/03/26(水) 16:56:400757デフォルトの名無しさん
2008/03/26(水) 16:58:310758デフォルトの名無しさん
2008/03/26(水) 17:16:580759デフォルトの名無しさん
2008/03/26(水) 17:20:010760デフォルトの名無しさん
2008/03/26(水) 17:39:56vtunesで各関数のアクセスメモリ数調べるためにはどこをいじればいいんでしょうか
使ってる人いたら教授願いたいのですが・・・
0761デフォルトの名無しさん
2008/03/26(水) 18:03:38それは内部でということでしょうか?関数内では
p=(T*)arg.p;
というようにはしてますが・・・
それ以前の話でしたらもう少し詳しくお願いできますでしょうか?
0762デフォルトの名無しさん
2008/03/26(水) 18:56:05new TestClass(); の動作は、
1. operator new(sizeof (TestClass)) を実行してメモリを確保する
2. 返されたメモリ領域を使ってコンストラクタを実行する
この2つ。
void *p = operator new(sizeof (TestClass));
みたいに直接 operator new を呼ぶとコンストラクタは呼ばれないが、
ちゃんと new 演算子を使えばコンストラクタが呼ばれるようになっている。
0763733
2008/03/26(水) 21:06:01>>735
>>762
どうもありがとうございます。
new で確保されたメモリでコンストラクタを実行するのは、
定義とか関係なく、コンパイラの特殊機能ということですね。
new の機能が使えなかったわけじゃなく、
operator newにメモリを確保する機能が実装されてなかったから、
自前でmallocしてただけってことでしょうか。
0764デフォルトの名無しさん
2008/03/26(水) 21:18:01殆どのC++での実装がmallocを呼ぶようになってたと思うよ。
0765デフォルトの名無しさん
2008/03/26(水) 21:47:13C++はnew
0766デフォルトの名無しさん
2008/03/26(水) 21:55:230767デフォルトの名無しさん
2008/03/26(水) 22:42:46char buff[100]とでも宣言してメモリを確保した後、
int *a=new(buff) int[50];
とした場合、int型の配列の後半は、最初に確保したメモリをはみ出します
その場所がすでに使用済みだった場合、正常に動作しなくなるのでしょうか
0768デフォルトの名無しさん
2008/03/26(水) 23:08:050769デフォルトの名無しさん
2008/03/26(水) 23:09:22ごめん。ちょっとうろ覚えだったw
boost::shared_ptr.hppみたらフレンドになってるじゃん
private:
template<class U> friend class Hoge;
みたいにするらしい
0770デフォルトの名無しさん
2008/03/26(水) 23:22:16最近の一般的なPCではcharは1バイトでintは4バイトなんだから当然だろ
0771デフォルトの名無しさん
2008/03/26(水) 23:25:02いや、超えた分は別のところにしっかり確保されるのか、
気にせず確保してない部分に書き込んでバグるのか、
多分後者だろうけど、聞いてみました
thx
0772デフォルトの名無しさん
2008/03/26(水) 23:30:47確保し直しなんて起きなくて当然じゃよ。
0773デフォルトの名無しさん
2008/03/26(水) 23:32:22おお!できました!
テンプレートって面白いし使えると便利なのに複雑すぎて使いこなせない(´;ω;`)
0774デフォルトの名無しさん
2008/03/26(水) 23:45:23newも結局ヒープから領域を取ってくる必要がある。
0775デフォルトの名無しさん
2008/03/26(水) 23:52:060776デフォルトの名無しさん
2008/03/26(水) 23:56:030777デフォルトの名無しさん
2008/03/27(木) 00:04:150778デフォルトの名無しさん
2008/03/27(木) 00:07:500779デフォルトの名無しさん
2008/03/27(木) 01:42:33ある一つのクラスだけ、メソッドの返り値がintじゃなくてdoubleが必要になってしまいました
こういう場合はどうしたらよいのでしょうか?
0780デフォルトの名無しさん
2008/03/27(木) 02:06:11・そのクラスを継承ツリーから外す
・戻り値がdoubleの仮想関数を継承ツリーの最上位に作る
のどっちかかなぁ。
0781デフォルトの名無しさん
2008/03/27(木) 04:10:540782デフォルトの名無しさん
2008/03/27(木) 04:24:39boostの実装の理解は難しい≠boostの使用は難しい
0783デフォルトの名無しさん
2008/03/27(木) 04:39:36map < HANDLE, クラス > x;
と定義して
x[fp].read() として使いたいのですが、readの中でファイルハンドルfpを使いたいとします
x[fp].read(fp) と2回fpを書くしかありませんか?
0784デフォルトの名無しさん
2008/03/27(木) 04:42:240785デフォルトの名無しさん
2008/03/27(木) 04:42:38コマンドプロンプトでしかプログラムを動かしたことがないのですが
FLASHのようにカーソルがのったときになにかする・・・のようなことをしたいときには
どういう機能を使えばいいのでしょうか?GUIというやつでしょうかそれともDirectXとかでしょうか
無知ですみませんがよろしくお願いします。
0786デフォルトの名無しさん
2008/03/27(木) 04:43:570787デフォルトの名無しさん
2008/03/27(木) 04:46:02即レスありがとうございます
がんばってC#やってみます
0788デフォルトの名無しさん
2008/03/27(木) 09:40:31とりあえずグラフィカルなプログラムを体験してみるならSDLあたりが簡単
0789デフォルトの名無しさん
2008/03/27(木) 09:48:510790デフォルトの名無しさん
2008/03/27(木) 09:50:57なりませんぜ
0791デフォルトの名無しさん
2008/03/27(木) 10:09:138bitで入ってきたデータを整数型に直して評価した後、bitsetに入れ込んでbitごとのflagを確認したいのですが
例えば
01010000 → 80 → 00001010
とbitsetに入れ込んだときに前後が入れ替わってしまうのをどうにかする方法は無いでしょうか?
0792デフォルトの名無しさん
2008/03/27(木) 10:28:21GPLだと思っていたらLGPLでした
スタティックリンクしなければ大丈夫みたいですね
0793デフォルトの名無しさん
2008/03/27(木) 12:05:18基底クラスのコンストラクタ→派生クラスのコンストラクタの順で呼び出されるけど
コピーコンストラクタも同様でいいのでしょうか?
0794デフォルトの名無しさん
2008/03/27(木) 12:16:38Intel CPU(little endian)マシンでも
bitset<8> bs(80);
とすれば01010000となるけど?
何で入れ替わってしまうの?
まあ入れ替わるなら望むビットパターンになるように
0x08にしてbitset作れば?
0795デフォルトの名無しさん
2008/03/27(木) 12:17:370x08 ×
0x05 ○
0796デフォルトの名無しさん
2008/03/27(木) 13:10:490797デフォルトの名無しさん
2008/03/27(木) 13:12:310798デフォルトの名無しさん
2008/03/27(木) 13:22:31事後条件を弱化してるならOOPの基本からやりなおせ
0799デフォルトの名無しさん
2008/03/27(木) 14:13:54すべてのクラスをdoubleで書き直す
設計がおかしいなら設計から直すべき
0800デフォルトの名無しさん
2008/03/27(木) 14:28:550801デフォルトの名無しさん
2008/03/27(木) 14:36:57継承を用いず、templateを用いる
0802デフォルトの名無しさん
2008/03/27(木) 15:19:21二回辞書引く気か?
0803デフォルトの名無しさん
2008/03/27(木) 16:56:45すべて実行可能ファイルが467キロバイトになります。
なんでこんなにでかくなるんですか???
あとなんで全部同じ大きさなんですか???
ほかの環境でもそうなるんですか???
0804デフォルトの名無しさん
2008/03/27(木) 17:00:13STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0805デフォルトの名無しさん
2008/03/27(木) 17:04:130806デフォルトの名無しさん
2008/03/27(木) 17:35:39コンパイルするときに -s を付けるか、コンパイルした後に実行ファイ
ルを strip してください。
0807デフォルトの名無しさん
2008/03/27(木) 17:39:04VCやbccならそこまで大きくならない。STL使うと少し膨れるけど
どっちにしろダウンロード時間が1秒のびる程度なんだから文句いうな
0808デフォルトの名無しさん
2008/03/27(木) 17:42:20教えてください。
VS2005でC++でプログラムを始めたんですが、最初の第1歩でつまずきました。
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World." << endl;
return 0;
}
としてビルドしたところ、
「対応する関数ヘッダーがありません(旧形式の仮引数リスト?)」
とエラーがでます。
どこかで、#include <iostream>は古い形式だから新しい形式で書かなければならない、
と読んだような気がするのですが、見つからなくなってしまい、
ここに書き込んだ次第です。
すみませんがエラー解決方法を教えていただけないでしょうか?
0809デフォルトの名無しさん
2008/03/27(木) 17:47:06#include <iostream.h>
エラーはそのまま貼り付けれ
0810808
2008/03/27(木) 17:49:00error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?) C:\Program Files\Microsoft Visual Studio 8\VC\include\cstdio 24
です。
0811デフォルトの名無しさん
2008/03/27(木) 17:52:16int main();
{
}
とかなってないか?
0813デフォルトの名無しさん
2008/03/27(木) 17:53:57でもいつも途中で挫折してしまいます。
昔のノート見たら日付が5年前だし・・・それでいて全く進んでないし・・・
皆さん勉強する上で、どうやってモチベーションを維持しいますか?
0814デフォルトの名無しさん
2008/03/27(木) 17:57:04テンプレートでどう対応するのですかorz
テンプレート使ったこと無いので見当が付きません
0815デフォルトの名無しさん
2008/03/27(木) 18:04:26とりあえず大きな目標を一つ、ちょっとしたソフトを完成させるとか
ベテランから見たらどんなに稚拙で汚いコードでもとりあえず書く(但し、自分で書ける限り最上のコードでねw)
それでそのソフトを書く上で必要な機能は嫌でも身に付く
あと、本とか目を通して使えそうな自分の知らなかった技術は積極的に使ってみる
C言語かぁ
オブジェクト指向言語だと一定の責任を持つグループ群で完結しやすいからツボにはまると上達が早いんだけどねぇ
0816デフォルトの名無しさん
2008/03/27(木) 18:05:02作りたいものを見つける
目標を作る
とりあえずマインスイーパーとかテトリスでも作ってみるとか
0817デフォルトの名無しさん
2008/03/27(木) 18:18:00A,Bというクラスがあり、
AにはBのインスタンスへのポインタ(pB)、
BにはAのインスタンスへのポインタ(pA)を持たせて
互いにデータのやり取りができるようにしたいんですが
どうやったらできますか?
クラスを宣言する際、
Aの宣言には
B *pB;
という行があるので、先にBを宣言しておく必要があるんですが
逆にBの宣言には
A *pA;
という行があるので、こちらでは先にAの宣言が必要に…
どうしたらいいのかわかりませんorz
誰か方法を教えてください(´・ω・`)
0818デフォルトの名無しさん
2008/03/27(木) 18:21:450819デフォルトの名無しさん
2008/03/27(木) 18:22:30class B
class A
{
/*
Aの内容
B* pB;
*/
};
class B
/*
Bの内容
A* pA;
*/
};
0820デフォルトの名無しさん
2008/03/27(木) 18:26:36>>816
なるほどありがとうございます。目標か
ゲームプログラム作ってみたいが遠いな・・・
独学で勉強してるが途中で頓挫してしまい、最後に見た
ページが『繰り返し処理 while文』だった。
当然その項目を見ても忘れてるので、最初からやり直し
今printfを勉強中 orz
0821デフォルトの名無しさん
2008/03/27(木) 18:33:34>>819
クラスって実体なしで宣言できたんですね、、知らなかったでs
ちょっと試したところいけそうな感じでした。ありがとうございました
0822デフォルトの名無しさん
2008/03/27(木) 18:33:41初めのうちは関数の機能はこういう物かと頭に入れておくだけで良いと思うよ
全部本でお勉強してたらきりがない
いずれHelloWorldと画面に表示するプログラムが書きたいな、と思ったときに
printf()なんて関数があったなーと思い出せればあとは本で調べればいい
0823デフォルトの名無しさん
2008/03/27(木) 18:36:42config.sysやN88書いてニヤニヤしてたものだ。
0824デフォルトの名無しさん
2008/03/27(木) 18:40:58極限までconfigを切りつめて
UMBとEMSに詰め込んで640kのメインメモリをどれだけこじ開けられるか試した物だなあw
0825デフォルトの名無しさん
2008/03/27(木) 18:56:39そうですね気軽に勉強してみます。
0826デフォルトの名無しさん
2008/03/27(木) 19:01:28{
public:
int Piyo() { return m_piyo; }
void Piyo(int value) { m_piyo = value; }
protected:
int m_piyo;
};
とするとプロパティもどきに見えますか?
0827デフォルトの名無しさん
2008/03/27(木) 20:35:450828デフォルトの名無しさん
2008/03/27(木) 21:28:510829デフォルトの名無しさん
2008/03/27(木) 22:14:10送信後少し(500mSecぐらい)間をおいた後、返信の受信を行うのですが
Sleepをつかうと他の一切の処理を受け付けなくなってしまうようです
他の方法で送信後のディレイをうまく設定することは出来ないでしょうか?
0830デフォルトの名無しさん
2008/03/27(木) 22:17:48・ マルチスレッド
お好きな方をどうぞ
0831デフォルトの名無しさん
2008/03/27(木) 22:29:530832デフォルトの名無しさん
2008/03/27(木) 22:57:44プログラミングの勉強は計算や漢字の練習みたいなもんだから
キーボード打った分量と時間が全てですよ。
ノートとかとってるようだと何時までたってもダメだお
まあ頑張れ
0833デフォルトの名無しさん
2008/03/27(木) 23:36:11先頭ではなくなりますか? それともpは先頭のままですか?
0834デフォルトの名無しさん
2008/03/27(木) 23:41:20マルチスレッドですか
マルチスレッドな設計になってないんですよねorz
DOS窓で試験してたときは普通に動いてたんだけどなぁ
0835デフォルトの名無しさん
2008/03/27(木) 23:44:21vectorならpush_backやinsertを呼んだ時点でローカルな反復子は全部無効にならなかったっけ?
0836デフォルトの名無しさん
2008/03/27(木) 23:44:47コンテナによっては、挿入によりイテレータが無効になるものがある。
「イテレータ 無効化」でぐぐれ。
無効にならないとしても、前に挿入したなら先頭ではなくなる。
0837デフォルトの名無しさん
2008/03/27(木) 23:46:210838デフォルトの名無しさん
2008/03/27(木) 23:53:300839デフォルトの名無しさん
2008/03/28(金) 00:14:11C/C++自体を勉強する方法だと長続きしないから
Windows ゲームプログラミング 第2版
という書籍を購入して勉強するってのはどう?
0840デフォルトの名無しさん
2008/03/28(金) 00:17:50人間として欠陥があると思う。
0841デフォルトの名無しさん
2008/03/28(金) 00:21:09凄いことを言い出すんだな
0842デフォルトの名無しさん
2008/03/28(金) 00:32:360843デフォルトの名無しさん
2008/03/28(金) 00:34:580844デフォルトの名無しさん
2008/03/28(金) 00:35:420845デフォルトの名無しさん
2008/03/28(金) 00:37:07python「お前らばかりに良い思いさせるかよ!」
0846デフォルトの名無しさん
2008/03/28(金) 01:16:550847デフォルトの名無しさん
2008/03/28(金) 01:18:190848デフォルトの名無しさん
2008/03/28(金) 01:37:070849デフォルトの名無しさん
2008/03/28(金) 02:12:15高々2スレッドにするのがそんなにキツイとも思えないけどなぁ
シリアル通信andスレッド で検索すればいっぱいでてくるじゃないか
0850デフォルトの名無しさん
2008/03/28(金) 07:15:59これは関数オーバーロードになるのですか?
int operator[](int n) const {...}
int& operator[](int n) {...}
みたいな感じです。
0851デフォルトの名無しさん
2008/03/28(金) 07:19:480852デフォルトの名無しさん
2008/03/28(金) 08:10:160853デフォルトの名無しさん
2008/03/28(金) 08:25:00はぁ?白痴はすっこんでろ
0854デフォルトの名無しさん
2008/03/28(金) 08:47:540855デフォルトの名無しさん
2008/03/28(金) 10:54:50とりあえずマルチスレッドで実装できました
ただ、定期的に通信を監視するクラスとコマンドを送信するクラスが有り
この二つのクラスが通信クラスをsingletonで共有してるのですが
監視クラスが別スレッドで通信クラスを使用してるとき
コマンド送信クラスが通信クラスを使おうとすると問題になりますよね?
0856デフォルトの名無しさん
2008/03/28(金) 10:59:31呼ばれるのでしょうか?
class test {
public:
int aaa[10];
int &operator[](int n) {
return aaa[n];
}
const int &operator[](int n) const {
return aaa[n];
}
};
853は自分じゃありません。
0857デフォルトの名無しさん
2008/03/28(金) 11:02:39const test t;
t[0];
とか
0858デフォルトの名無しさん
2008/03/28(金) 12:57:47以下のように構造体内で足し算を行う関数へのポインタを持っている場合
----------ここから----------
#include <stdio.h>
int sum(int,int);
struct calc {
int data;
int (*sum_op)(int,int);
};
int main(void){
struct calc calc0;
struct calc *calc1 = &calc0;
calc1->data = 0;
calc1->sum_op = sum;
calc1->data = calc1->sum_op(123,456);
printf("123 + 456 = %d\n",calc1->data);
}
int sum(int a,int b){ return (a+b);}
----------ここまで-----------
0859デフォルトの名無しさん
2008/03/28(金) 12:58:37このcalc1->data = calc1->sum_op(123,456)なんですが
calc1->sum_opは関数へのポインタなので
calc1->data = (*calc1->sum_op)(123,456)
とすべきだと思うんですが実際はどちらが正しいのでしょう?
どちらもコンパイルには成功し実行結果も
>123 + 456 = 579
となり困っています。以上よろしくお願いします。
0860デフォルトの名無しさん
2008/03/28(金) 13:12:29http://www.kouno.jp/home/c_faq/c4.html#12
0861デフォルトの名無しさん
2008/03/28(金) 13:16:34単純に排他制御したいならMutexとか使って使用中ならreturn;でOK
0862デフォルトの名無しさん
2008/03/28(金) 13:21:24ありがとうございました。
0863デフォルトの名無しさん
2008/03/28(金) 20:06:15もしご存知でしたら教えてください。
○機能
socket、スレッド、ODBC。
(まとめてでも、個別機能のライブラリx3でもかまわない)
○条件
・CまたはC++で使用可能
・Linux(Fedora)版とWindows版があり、同一インターフェイスを持っている
(Linux(Fedora)とWindowsである程度のソースレベル互換を実現出来る)
・またはラッパー自体にソースレベル互換がある
スレ趣旨と若干ずれてるかもしれませんがほかに該当するところがなかったので……
お願いします。
0864デフォルトの名無しさん
2008/03/28(金) 20:10:37ODBCはやったことないんでわからない、すまん。
0865863
2008/03/28(金) 20:32:10ありがとうございます。早速ぐぐってみます。
>>863に補足。
最終的にPostgreSQLとやりとりしたいだけなので
最悪ODBCじゃなくてもかまいません。
0866デフォルトの名無しさん
2008/03/28(金) 20:50:280867デフォルトの名無しさん
2008/03/28(金) 20:58:520868デフォルトの名無しさん
2008/03/28(金) 22:04:53Asioって1.35からではないの?
1.34.1が最新みたいだけど。
0869デフォルトの名無しさん
2008/03/28(金) 22:06:080870デフォルトの名無しさん
2008/03/28(金) 22:43:53Non Boost版を単体で使うのはだめ?
0871デフォルトの名無しさん
2008/03/28(金) 22:45:18ttp://builder.japan.zdnet.com/sp/c-programming-language/story/0,3800083430,20370255,00.htm
こんな記事書いたらだめだよ
0872デフォルトの名無しさん
2008/03/28(金) 22:49:33> int *n;
> *n = 5; /* ポインタ変数nに値5を代入 */
> printf( "%d\n", *n ); /* ポインタ変数nが持つ値(5)の出力 */
> return 0;
> }
ちょっと待て
なんだコレ
0873デフォルトの名無しさん
2008/03/28(金) 22:53:37ついでに 2 ページ目にも同様の間違いあり
0874デフォルトの名無しさん
2008/03/28(金) 22:59:170875デフォルトの名無しさん
2008/03/28(金) 23:04:360876デフォルトの名無しさん
2008/03/28(金) 23:39:03どこが間違いなの?
0877デフォルトの名無しさん
2008/03/28(金) 23:57:380878デフォルトの名無しさん
2008/03/28(金) 23:57:47nを初期化せずに*nと書くのは間違い。
記事では
> このときnには代入された値を記憶した場所(アドレス)が自動的に代入されるため
などと大嘘を書いているが、信じちゃいけない。
このサンプルコードなら、
int x;
int *n = &x;
とするのが正しい。
0879デフォルトの名無しさん
2008/03/29(土) 00:11:58コンストラクタの実装はクラス定義の中に書くしかないのでしょうか?
class SampleClass {
int var;
SampleClass():var(0){//ここに実装を書くしかない? }
};
SampleClass::SampleClass() {//こんな風に外に書くことはできない? }
0880デフォルトの名無しさん
2008/03/29(土) 00:13:05SampleClass::SampleClass() : val(0) {}
0881デフォルトの名無しさん
2008/03/29(土) 00:15:00int var;
SampleClass();
};
SampleClass::SampleClass() : val(0)
{
//実装
}
0882デフォルトの名無しさん
2008/03/29(土) 00:18:33クラス定義内ではコンストラクタの宣言だけして、
外に内容を書けばいいってことですか。
0883デフォルトの名無しさん
2008/03/29(土) 00:25:14すげえなあ
これでプロの技術物書きなんだから尊敬するわ
0884デフォルトの名無しさん
2008/03/29(土) 00:33:40もしくはあり得ないのでしょうか?
職場の先輩が、char ch = '\0'; を、
char ch = NULL; と書いてたんですが、
微妙に気持ち悪いです。
気にするほどではないのでしょうか?
0885デフォルトの名無しさん
2008/03/29(土) 00:37:480886デフォルトの名無しさん
2008/03/29(土) 00:39:39「先輩、気持ち悪い」って吐き捨ててから帰宅すればおk
0887デフォルトの名無しさん
2008/03/29(土) 00:40:480888デフォルトの名無しさん
2008/03/29(土) 00:41:02気にしろ
0889デフォルトの名無しさん
2008/03/29(土) 00:43:460890デフォルトの名無しさん
2008/03/29(土) 00:51:17>>886
残念ながらたぶんもう一緒に仕事をすることはないです。
自分はC言語初めてまだ3ヶ月なんですが、
その人はCを仕事で20年近くやってる人だったので、
NULLでもいいのかなと迷ってました。
0891デフォルトの名無しさん
2008/03/29(土) 00:51:350892デフォルトの名無しさん
2008/03/29(土) 00:57:410893デフォルトの名無しさん
2008/03/29(土) 01:12:140894デフォルトの名無しさん
2008/03/29(土) 01:12:34がっ
0895デフォルトの名無しさん
2008/03/29(土) 01:15:410896デフォルトの名無しさん
2008/03/29(土) 01:18:090897デフォルトの名無しさん
2008/03/29(土) 01:23:49書こうと思ったらすでに書かれてた…
0898デフォルトの名無しさん
2008/03/29(土) 01:25:40taskとpthreadのどちらを使うべきかを検討しています。
現状、他のプラットフォームへの移植性を考慮すると
POSIX準拠のpthreadの使用を考えています。
そこで質問となるのですが、
”taskを使った方が良い点”をご存知であれば、ご教授頂きたく。
今のところ、VxWorks上でタスクを管理する環境が整っているのが利点?と
認識しています。
0899デフォルトの名無しさん
2008/03/29(土) 02:09:57ヌルポインタの内部表現のビットパターンが0でなくてもよいが、
その場合でもソースコード上のNULLは0でないといけない(ここ重要)。
だからと言って、NULLを0の代わりに使うのは間違い。
だからCでは近頃#define NULL (void*)0なんて定義が多かったり、
C++だとnullptrキーワードを導入しようとしていたりする。
0900デフォルトの名無しさん
2008/03/29(土) 02:20:230901デフォルトの名無しさん
2008/03/29(土) 02:23:220902デフォルトの名無しさん
2008/03/29(土) 02:45:490903デフォルトの名無しさん
2008/03/29(土) 04:15:45n(人数分)の点数分の数値を入力して比較し最大値を表示させるプログラムなんですが
引数はnだけグローバルを使わないという条件なので
点と最大値を初期化してるため
結果がでません
どのようにすれば上手く最大値を格納できるのでしょうか?
int Amax(int n)
{
int ten,max = 0;
printf("点数?");
scanf("%d",&ten);
if (max < ten)
max = ten;
if (n == 1)
return max;
else
return (Amax(n-1));
}
0904デフォルトの名無しさん
2008/03/29(土) 04:33:35static int max = 0;
0905デフォルトの名無しさん
2008/03/29(土) 07:00:25int Amax(int n)
{
int ten = 0, kekka = 0;
if(n > 1) kekka = Amax(n-1);
printf("score "); scanf("%d", &ten);
if(kekka < ten) return ten;
return kekka;
}
先に一番奥まで潜ってから戻ってきた値と比較して大きい方を返す
0906デフォルトの名無しさん
2008/03/29(土) 08:14:34めがっさワロタw
0907デフォルトの名無しさん
2008/03/29(土) 09:45:42これは酷いw
>>884
お前が正しい。気にするべき。
セマンティクスの矛盾に気持ち悪さを感じられることは良いことだ。
0908デフォルトの名無しさん
2008/03/29(土) 11:10:36の区別が論理的に理解できません。何か規則があるのでしょうか?
例えば、
do {ブロック} while(条件式); //付く
while {ブロック} //付かない
for (;;) {ブロック} //付かない
関数の戻り型 関数名() {実体} //付かない
enum {}; class {}; などの最後に ;が付く理由は理解できます。
それは、その列挙型やクラス型の「変数(オブジェクト)」をブロックの
後ろから;の間までにも書くことができるからですね。
0909デフォルトの名無しさん
2008/03/29(土) 11:11:36int n[1];
*n = 5;
これなら通るんだっけ
0910デフォルトの名無しさん
2008/03/29(土) 11:29:16素直にn[0]と書いたほうが分かりやすいけど
0911デフォルトの名無しさん
2008/03/29(土) 11:46:03多分じゃなく、問題なく通る。
>>908
ブロックの後にはつかない。文の末尾には必要。以上。
つまり、文(...;)かブロック({...})かの違いだけ。
do-whileの場合は、間がどうであろうとwhileが文なので必ず必要になるだけのこと。
0912デフォルトの名無しさん
2008/03/29(土) 11:59:26単に構文規則がそうなっているからというほうが正確。
(それがわかりやすいかどうかはともかく)
0913デフォルトの名無しさん
2008/03/29(土) 12:01:39> while {ブロック} //付かない
のは、「ブロックの後にはつかない」からだけど、ならなぜ
> enum {}; class {}; などの最後に ;が付く
んだろう。
0914デフォルトの名無しさん
2008/03/29(土) 12:04:09単独 while なのか一見わかりにくくなるしな
0915デフォルトの名無しさん
2008/03/29(土) 12:10:50do-whileでなくても、;が付いていて、勘違いしやすい例もあったりする
かも:
while (条件式);
これは、while文で条件が真のときに実行されるのは「空文」です。
空文は、一般の行にも「;」だけを書く文のことで、何もしない文です。
結局、上のwhile()文は、条件式の副作用以外何もしません。
条件が10回分真なら、条件式の中の10回分の副作用が起きるだけです。
0916デフォルトの名無しさん
2008/03/29(土) 12:11:59一応それは、>>908の最後のほうに書いてある通り。
0917デフォルトの名無しさん
2008/03/29(土) 12:37:52その{}はブロック(複文)を構成するものではないから。
0918デフォルトの名無しさん
2008/03/29(土) 14:03:31確かに中身は文の集合(ブロック)だしな
0919デフォルトの名無しさん
2008/03/29(土) 14:04:520920デフォルトの名無しさん
2008/03/29(土) 14:58:00名前空間の{}はブロックではない。
そっちにセミコロンを付けないのは単にそういう構文だからとしか言いようがない。
C/C++で言う文とは、およそ関数の中のものだけ。
式文(空文)、制御文、ラベル付き文、複文。
#ただ、C++だとそれに加えて宣言文 ::= 宣言みたいなことをやっているはずだけど、
#それが通用するのは文を置ける場所(関数内)だけ。
文と(関数・変数・クラス・名前空間などの)宣言は構文上、別物。
名前空間や構造体の中身は、文ではなく宣言の並びと規定されているはず。
式文など一部の文の最後にセミコロンを付けるのと、
変数や関数の宣言の最後にセミコロンを付けるのは、
少なくとも規格に書いてある構文上では独立した事柄。
0921デフォルトの名無しさん
2008/03/29(土) 17:16:57struct {..} a;等の場合はstruct {..}の部分がint a;のintのような扱いだから
do〜whileはコンパイラが通常のwhileと間違えないように例外的に;を使うことに
おそらく、;記号がないと複数行に渡って記述するのに
いちいち\で継続したりする必要があって煩わしいし
かといって沢山;打つのも嫌だから必要最小限にしようって折衷案です
0922デフォルトの名無しさん
2008/03/29(土) 17:37:25structでも『「変数(オブジェクト)」をブロックの後ろから;の間までにも書くことができるから』;を付けるのである
一方namespaceは型ではないから変数を定義することもできない
0923デフォルトの名無しさん
2008/03/29(土) 18:24:210924デフォルトの名無しさん
2008/03/29(土) 19:00:37こういうことができちゃうからねえ。
0925デフォルトの名無しさん
2008/03/29(土) 20:00:490926デフォルトの名無しさん
2008/03/29(土) 20:55:17class down;
down* d;
};
class top::d {};
と書くと、downクラスはtopクラスのクラス内クラスになって、その場合にdownクラスは
topクラスの中以外では使えない、と考えていいですか?
こんなクラス内クラスって、どういう場面でつかうのでしょうか?
0927デフォルトの名無しさん
2008/03/29(土) 20:58:570928デフォルトの名無しさん
2008/03/29(土) 22:07:18以下のようなメンバ関数があるとします。
BClassはBaseClassを派生させたものだとします。
class AClass{
public:
static const BClass* const method(){
return new BClass();
}
};
これの受けて側で
(1)const BaseClass* p = AClass.method(); でも
(2)const BaseClass* const p = AClass. method(); でも コンパイルが通りますが
クラス宣言・定義で const BClass* const 型の戻り値としているのに
(1)でもOKなのは何故でしょうか?
また(1)のpと(2)のpでできることに違いは出てくるでしょうか?
0929デフォルトの名無しさん
2008/03/29(土) 22:10:58const BaseClass* var :
varの参照先を変更する事ができない。
BaseClass* const var :
varを変更する事ができない
const BaseClass* const var :
varの参照先を変更する事ができない。
varを変更する事もできない。
0930デフォルトの名無しさん
2008/03/29(土) 22:11:12上のはAClass::method(); です。
0931デフォルトの名無しさん
2008/03/29(土) 22:15:00宣言・定義で const BClass* const という戻り値を設定しても
使用する側で const BClass* p = AClass::method() とすれば
宣言・定義側の 2番目の const は無視されるということでしょうか。
0932デフォルトの名無しさん
2008/03/29(土) 22:18:56『愛!? 言ってる意味がわかりません』
「好きになりすぎると殺意が芽生えます。キリスト教徒がクルセイドとして他教徒を排除したように!」
『それがわかっていながら、何故戦うのですか?』
「軍人は戦うのが仕事です」
『あなたは歪んでいます!』
「そうしたのはあなたです、ガンダムという存在がわたしを歪めました
だから私はあなたを倒します。世界とかはどうでもいいです…わたしの考えで行動しています」
『あなたも世界の一部じゃないですか?』
「まちがえました。これは世界の声でした」
『違います。あなたは自分勝手に行動しているだけです。あなたは歪んでいます。わたしがそれを注意します』
「ガンダムならそういうと思いました」
翻訳してみたけど、なんだかなぁ、この会話
0933デフォルトの名無しさん
2008/03/29(土) 22:29:30一般的に、T constをTに代入するのはOKだよな。
この場合、T=const BClass*だ。
0934デフォルトの名無しさん
2008/03/29(土) 22:37:10まず、constは左結合、ただし便宜上一番左に書くことも出来る。
なので「const BClass * p」を厳密に書くと「BClass const * p」となる。
同様に「const int n」==「int const n」
次に「BClass const * p」はBClassがconstなので実体が変更出来ない。
「BClass * const p」の場合は*がconstなのでポインタを変更出来ない。
int const n = 10;
int n2 = n; // OK
BClass * const p = ...;
BClass * p2 = p; //OK
0935デフォルトの名無しさん
2008/03/29(土) 22:45:20無視されてないって。
a=b;のとき、aが変更されたとは言うけど、bが変更されたとは言わないでしょ。
0936デフォルトの名無しさん
2008/03/29(土) 22:45:27const BClass* p = AClass::method()は、
新しい変数pを作る(AClass::method()でコピー初期化)という扱い。
pの初期化には、AClass::method()の値を読み取れるかどうかが重要だが、
値を読み取ってpを作ってしまえば、もはやAClass::method()とは無縁。
だから、AClass::method()がconstかどうかと、
それを受けるpがconstかどうかは無関係。
0937934
2008/03/29(土) 22:48:05int n = 10;
int * p = &n;
int * const * p2 = &p;
p2 = NULL; //OK, p2は非const
// *p2 = NULL; //NG, *p2(p)はconst
**p2 = 0; //OK, **p2(n)は非const
0938928
2008/03/29(土) 22:51:36ある関数内でポインタを変更したくないときに、実引数ではなく仮引数で制御するのと同様に
関数の戻り値としてポインタを受け取る場合でも、受け手側で制御すればいいわけですね。
上の例だと、宣言・定義では const BClass* を戻り値としといて、
ポインタを変更したくないのであれば、使用側で
const BaseClass* const p = ... とすれば、いいわけですね。
宣言・定義で const BClass* const とするのは、文法的には可能だけれど
意味のないことなんですね。
0939デフォルトの名無しさん
2008/03/29(土) 22:54:06もういちどれすをよみなおそう。
0940934
2008/03/29(土) 22:56:03int n2 = n; //OK
↑程度は理解出来ているだろう、という前提で書いたけど、
大丈夫・・・だよな?
0941934
2008/03/29(土) 23:04:01>関数の戻り値としてポインタを受け取る場合でも
関数の戻り値をpに入れるのと、
別の変数をpに入れるのは基本的には同じだよ。(※rvalueは今は無視で)
多分、何か勘違いしていると思う。
0942928
2008/03/29(土) 23:04:56はい、それは理解しています。
>>939
(1)static const BClass* const method(); は
const BClass* const 型 の値を返すという意味で
(2)static const BClass* method(); は
const BClass* 型の値を返す という意味ですよね・・・
0943デフォルトの名無しさん
2008/03/29(土) 23:05:55最初のconstは意味がある。
賢いコンパイラなら
warning: type qualifier on return type is meaningless
static const BClass* const method(){
みたいに警告が出るだろ。
0944デフォルトの名無しさん
2008/03/29(土) 23:09:31test a;
a++; // test &operator++(int);
++a; // test &operator++();
と定義するじゃないですか。でも、a++だと引数が必要で++aだと引数が不要になっているのは
どういう理由によるのでしょうか。
あと、独自クラスでは後者の方がすこし速いと聞いたのですが、本当ですか?手元で実験した限りでは
とくに性能差はなかったです。
0946934
2008/03/29(土) 23:14:33もう一度intで表現するけど、
>(1)static const BClass* const method();
>(2)static const BClass* method();
は、それぞれ、
static const int method();
static int method();
と同じような意味になる。
戻り値をintでなく、const intにして何か利点があるか考えてみて欲しい。
0947デフォルトの名無しさん
2008/03/29(土) 23:15:05MySQL派なんで使ったことないが
0948デフォルトの名無しさん
2008/03/29(土) 23:20:14引数をとるとか何かで区別しないと、前置か後置か、コンパイラが区別できないから。
>後者の方がすこし速いと聞いたのですが
普通の前置インクリメントの処理内容は、
1.インクリメントする。
2.thisをreturnする。
普通の後置インクリメントの処理内容は、
1.現在の状態を退避する。
2.インクリメントする。
3.退避しておいた状態をreturnする。
だから前置が速い。
0950デフォルトの名無しさん
2008/03/29(土) 23:28:50速度は最適化されて結局同じだから気にしない。
operator++(int);のintは偽の引数で実際はvoidです。
0951デフォルトの名無しさん
2008/03/29(土) 23:31:08後のconstは意味ないが初めのconstは意味がある。
0952デフォルトの名無しさん
2008/03/29(土) 23:37:20>後者の方がすこし速いと聞いたのですが
>>948の人の説明の通りだけど、例を挙げてみる。
sizeof(test)==1MBだとして(あえて極端なサイズで説明)
前置だと、インクリメントして自身の参照を返すだけ。
後置だと、1MBの実体をtmpとしてコピーして、
自身をインクメントして、tmpを返す(値渡しになるのでまた1MBコピー)
つまり後置だとコピーコンストラクタが2回追加される。
2回目についてはmove semanticsを使えば緩和出来るけど。
0953デフォルトの名無しさん
2008/03/30(日) 00:03:28それどのコンパイラ?
コピーコンストラクタがインラインならほとんどのコンパイラで
確実に最適化されるって思ってるんだけど違うのか?
それに説明するなら一般的な例で頼む。極例はずるいよ。
0954デフォルトの名無しさん
2008/03/30(日) 00:16:56↓
場合によっては一部のコンパイラでは最適化されない
↓
前置インクリメントでいい場合は前置を使っておくと速いかもしれない
↓
(平均すれば)後者の方がすこし速い
って流れでしょ。
サイズが極端なだけで例としてはごく一般的だよ。
a++++++++;とかなら極端な例だろうけどさ。
0955デフォルトの名無しさん
2008/03/30(日) 00:18:18ずるいとか言われても(;´д`)
最適化出来るコードなら最適化されるだろうし、
出来ないならされないよ・・・
「後置>前置」なコストと言ったつもりは無かったんだけど、
「後置≧前置」と補足しておいた方がよかったかな。
0956デフォルトの名無しさん
2008/03/30(日) 00:41:10質問文みるかぎりイテレータだろうし、1Mのデータはポインタで保持だろうし、
参照カウンタ使うなり真っ当に実装してればセフセフだし、ちょっと大袈裟じゃない?
と思ったけど、まあ確かに確認した方がいいのかもしれない。。。
0957デフォルトの名無しさん
2008/03/30(日) 00:42:42とりあえず<new>とか<memory>などをインクルードしたら使えるようになるんだけど
0958デフォルトの名無しさん
2008/03/30(日) 00:45:19後方参照も可能。
0959デフォルトの名無しさん
2008/03/30(日) 00:46:121. delete オブジェクトへのポインタ
2. delete [] オブジェクト配列へのポインタ
の二種類ある理由が良く分かりません。
配列かどうかは、内部的に分かりそうなもので、1と書いても
自動的に判断してもし、newで配列として確保された物のポインタ
であるなら、2の意味と捉える事がどうして出来ないのでしょうか。
そして、もし、間違って逆に記述してしまった場合、どうなるの
でしょうか。
0960デフォルトの名無しさん
2008/03/30(日) 00:47:570961デフォルトの名無しさん
2008/03/30(日) 00:48:000962デフォルトの名無しさん
2008/03/30(日) 00:51:30それはたまたま。それを当てにしてはいけない。
0963デフォルトの名無しさん
2008/03/30(日) 00:51:49として、
delete [] pObjs;
で配列全体を削除出来ると言うことは、100個分であるという情報
は、内部的に分かっているんですよね。
なら、
delete pObjs;
としても、100個まとまったメモリブロックだと言う判断は付く
と思うんですが。
0964デフォルトの名無しさん
2008/03/30(日) 00:52:17無理です^^
0965944
2008/03/30(日) 00:52:27後置よりも前置がよい場合がある理由はわかりました。でも、現実には、実装方法が、
++i ===> int &operator++();
i++ ===> int &operator++(int);
となってますが、
++i ===> int &operator++(int);
i++ ===> int &operator++();
となっていても別に直感に反していないような気がするのですが、
何か、現実の実装方法が、「なるほど、理にかなってる」と思えるような理屈はないでしょうか?
0966デフォルトの名無しさん
2008/03/30(日) 00:52:55なぜ?
0967デフォルトの名無しさん
2008/03/30(日) 00:54:13コンパイラ製作会社に問い合わせて独自拡張規格で何とかならないかきいてみたらどう?
0968デフォルトの名無しさん
2008/03/30(日) 00:55:47とりあえず<new>とかをインクルードしとけばいいってことですか
0969デフォルトの名無しさん
2008/03/30(日) 00:56:36名前空間には使用に先立つ明確な宣言などは特に必要ない。
翻訳単位で後に検出できれば問題ない。
0970957
2008/03/30(日) 01:00:320971デフォルトの名無しさん
2008/03/30(日) 01:03:06何がしたいの?
stdにある<new>の機能を使いたいの?
名前空間自体は別に使用に先立って特に何もしなくてもいいけど、
名前空間にある関数やクラスなどについては当然ながら宣言や定義が必要だぞ?
0972957
2008/03/30(日) 01:04:400973デフォルトの名無しさん
2008/03/30(日) 01:04:560974デフォルトの名無しさん
2008/03/30(日) 01:05:58そりゃもちろんdelete1本に絞って、
delete内部で配列かどうか判別するという方法も考えられる。
実装は別に難しくないだろう。全ての単体のnewをnew[1]相当にすればいいだけだ。
だが、そんなオーバーヘッドを許さなかったのが(当時の)C++クォリティ。
D&Eを引いてみてもやっぱりそういう理由のようだ。
0975デフォルトの名無しさん
2008/03/30(日) 01:06:43それはstdを使いたいのではなく、std::bad_allocを使いたいと言う。
0976957
2008/03/30(日) 01:08:450978デフォルトの名無しさん
2008/03/30(日) 01:15:150979デフォルトの名無しさん
2008/03/30(日) 01:21:51最適化のため、そういう保証を課してない。
deleteのときは「何個分か」を見なくて済む。
>>965
D&Eにそれに関する記述がある。
簡単に書くと、
「キーワード使う構文とか考えたけど、
キレる人が結構居たので結局これに落ち着いた。
他の単項演算子は前置形なので、前置インクリメントも同じく引数無し、
(int)は後置のマークとした。
C++の中で異質だけど、十分有効だろう」
とのこと。
>>957
std配下のクラスを使いたいってことだよね?
ヘッダファイルが分かれてるから、必要なものをインクルードすればおk
std:vectorなら<vector>, std:listなら<list>といった感じ。
0980誰か965にも答えてくれ〜
2008/03/30(日) 01:24:590981デフォルトの名無しさん
2008/03/30(日) 01:28:43それともfreadするたびにHDDにアクセスしてコピーするのかどっちなんでしょう
0982デフォルトの名無しさん
2008/03/30(日) 01:32:440983デフォルトの名無しさん
2008/03/30(日) 01:33:21普通はCライブラリとOSでキャッシュするが、
キャッシュサイズとかタイミングは処理系依存。
でも巨大ファイルを全部キャッシュするようなことはしないだろうね。
0984981
2008/03/30(日) 01:34:330985デフォルトの名無しさん
2008/03/30(日) 01:36:020986誰か965にも答えてくれ〜
2008/03/30(日) 01:39:03なるほど、単項演算子は前置だし、定義するときは引数なしでやるから、という論理か。
ところでD&Eっていいですね。俺もそろそろ読む時期がきたかな。
0987デフォルトの名無しさん
2008/03/30(日) 01:52:14ところで、version番号は59にしたけど、これでいいかな。
ttp://pc11.2ch.net/test/read.cgi/tech/1206809426/
0988デフォルトの名無しさん
2008/03/30(日) 02:10:26ごじゅう・・・きゅう!?
0989デフォルトの名無しさん
2008/03/30(日) 02:22:220990デフォルトの名無しさん
2008/03/30(日) 02:22:440991デフォルトの名無しさん
2008/03/30(日) 02:54:07BeginPaint()で取得したHDCを
自作描画クラスのメンバ変数HDC*へ代入してクラス内で使用しても大丈夫でしょうか?
HDC hDC = BeginPaint( hWnd, &ps );
MyDraw mydraw(&hDC); //HDCのアドレスをコンストラクタで取得してメンバ変数として使いまわしたい
/*
色々な処理
*/
EndPaint( hWnd, &ps );
0992デフォルトの名無しさん
2008/03/30(日) 02:59:12いや、結構長い間50で停滞してたし、一回51になったこともあったけど、また50に戻ったりしてるから、、、これくらいかな、と。
だいたい、1つのスレの寿命が1〜3ヶ月くらいだとおもうので、50から59の飛躍といっても4〜5ヶ月くらいの飛躍でしょ。
0993デフォルトの名無しさん
2008/03/30(日) 03:01:46(´・ω・`)?
0994デフォルトの名無しさん
2008/03/30(日) 03:02:43記憶によると50→51→50→?だから次は53くらいだと思うんだが… 59は飛び過ぎじゃね?
0995デフォルトの名無しさん
2008/03/30(日) 03:08:320996デフォルトの名無しさん
2008/03/30(日) 03:15:25EndPaint以降にそのhDCを使い続けることが無ければ、問題ないよ。
0997デフォルトの名無しさん
2008/03/30(日) 10:13:460998デフォルトの名無しさん
2008/03/30(日) 10:22:36>コンパイルしています...
>error: bokkiは実装されていません
0999デフォルトの名無しさん
2008/03/30(日) 10:24:051000デフォルトの名無しさん
2008/03/30(日) 10:27:1010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。