- 1 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 00:00:47 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.49【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1203478421/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 2 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 00:04:57 ]
- >>1乙
こっちのが早いかな
- 3 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 00:07:48 ]
- 1乙です。
これか?
- 4 名前:デフォルトの名無しさん [2008/02/28(木) 00:08:26 ]
- age
- 5 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 00:15:18 ]
- あっちの方がかっこよかったけどこっちのが早いからこっちか。
- 6 名前:デフォルトの名無しさん [2008/03/14(金) 21:41:58 ]
- class Point {
public: Point(); void setPoint(Point p); void printPoint(); private: double x, y; }; このクラスって、x,yに値を代入できますか?
- 7 名前:デフォルトの名無しさん [2008/03/14(金) 21:47:04 ]
- double d;
d=1.2-1.1 0.09999999999 d=1.0/10.0; 0.1 この違いは何故((((;゜Д゜)))?
- 8 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:50:29 ]
- 基本的に浮動小数点数では実数を正確に表せない
浮動小数点 誤差でググるんだ
- 9 名前:デフォルトの名無しさん [2008/03/14(金) 21:54:07 ]
- >8
いえ、それは分かるのですがどちらも答えが0.1で循環小数になるのに なぜ割り算の方だけ正確な答えが出るのか聞きたいのです。
- 10 名前:デフォルトの名無しさん [2008/03/14(金) 22:01:11 ]
- pc11.2ch.net/test/read.cgi/tech/1203478421/
いまだに前前スレが落ちていない。
- 11 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:02:43 ]
- 【前スレ】
【初心者歓迎】C/C++室 Ver.50【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1204124499/
- 12 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:03:17 ]
- >>9
1.0 とか 10.0 は誤差なく正確に表現できるが、 1.1 とか 1.2 は正確に表現できない (誤差が含まれている) から 誤差というのはだんだん蓄積するので、もともと誤差が含まれているもの同士を演算すると、さらに誤差が大きくなる
- 13 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:03:48 ]
- ん、こっち先使うのか?
- 14 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:04:07 ]
- 質問です
int *num = new int[100*100*100]; これを0で初期化したいのですが どうやればいいのでしょうか forループで回す以外の方法ありますか?
- 15 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:05:52 ]
- memset
- 16 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:06:10 ]
- >>14
while ループ
- 17 名前:デフォルトの名無しさん [2008/03/14(金) 22:07:35 ]
- >12
あ、演算結果じゃなくてそっちのほうの誤差だったんですね。
- 18 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:08:03 ]
- >>14 std::fill, std::fill_n
- 19 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:23:20 ]
- スタックに確保して自爆しよう!
- 20 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:25:18 ]
- >>14
int *num = new int[100*100*100]();
- 21 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:50:34 ]
- >>20
これ知らないやつ多いよな
- 22 名前:デフォルトの名無しさん [2008/03/14(金) 22:51:11 ]
- i--; なんとなく顔文字に見える(--;)
- 23 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 23:06:46 ]
- >>20
最後の()は記入ミスだよな?
- 24 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 23:12:42 ]
- えー
- 25 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 23:15:01 ]
- 配列で要素を確保する場合、デフォルトコンストラクタなら要素ごとに呼べるよ。
- 26 名前:デフォルトの名無しさん [2008/03/14(金) 23:16:30 ]
- >>23
intクラスのデフォルトコンストラクタを呼ぶという発想もできない奴
- 27 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 23:23:28 ]
- >>14
配列 new なんて忘れて std::vector にするのがいいよ。
- 28 名前:デフォルトの名無しさん [2008/03/14(金) 23:23:51 ]
- 間違ってVisual C++スレで聞いてしまったのでこちらで。
class test{ int i; test(){ test(1); } test(int i){ this->i = i; } } こんな感じでコンストラクタをオーバーロードし、コンストラクタからコンストラクタを呼び出すことはできないのでしょうか?
- 29 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 23:26:02 ]
- 確かできないはず
C++0xでは出来る様になるらしい
- 30 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 23:26:14 ]
- >>28
現行の規格ではできない。 C++0x が普及するまでは private な初期化関数を 使うのがベスト。元々代入でいい(初期化にこだわらない)なら、違いは無い。
- 31 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 23:26:17 ]
- 今はできない。けどC++0xにそういう話があった気がする。
- 32 名前:30 mailto:sage [2008/03/14(金) 23:27:57 ]
- うは。みんな C++0x 待ち遠しいんだな。
- 33 名前:デフォルトの名無しさん [2008/03/14(金) 23:28:04 ]
- >>29-31
短時間で返答ありがとうございました。 初期化関数を検討してみます。
- 34 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 01:26:57 ]
- 出来ないというのは嘘だな。
コンストラクタ内でコンストラクタを呼び出すことはできる。 しかし、JAVAのように望んだ結果にはならない。
- 35 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 01:38:00 ]
- placement newを使えばできるかも?
new(this)test(1); とか いろいろ怖いけど
- 36 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 01:43:08 ]
- 今でもコンストラクタは呼べたような気がする。
環境依存かもしれないが。 確かメンバ初期化子は無視されたはず。
- 37 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 01:48:02 ]
- 呼べるけど今は一時オブジェクトができるだけじゃないのか。
- 38 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 01:49:38 ]
- ああ、そうなるのか。
- 39 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 02:37:45 ]
- superがあると確かに便利
- 40 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 02:52:15 ]
- superのコンストラクタは初期化子で呼べるけど、何か別のことを言ってる?
- 41 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 03:10:10 ]
- 多重継承可能な言語でsuperはありえないな
- 42 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 03:21:07 ]
- むしろECMAScript風に配列を返せば
- 43 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 03:58:10 ]
- 他人が書いた基底クラスに、こんな書き方がありました
class Base { public: virtual void f() = 0; protected: Base() {} ~Base() {} }; 基底クラスのデストラクタは仮想にするべきなんですよね?でも、この基底クラスのデストラクタは仮想じゃない… 単なる書き忘れか?とか思ったんですが、よく見ると、デストラクタはprotectedになってます。ということは、 Base *p = new Derived(); delete p; // Base::~Base() はprotectedでアクセスできないのでコンパイルエラー となると思います。ちょっと混乱したんですが、こうすると、 「派生クラスをnewして基底クラスでdeleteができなくなる代わりに、仮想デストラクタにしなくても問題ない」ということでしょうか。 わざわざこうして仮想デストラクタにしない理由は、速度の理由でしょうか (それとも、new/deleteなんてしないで、普通にスタックに置いて使って欲しいっていう意味が込められてる?
- 44 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 04:04:40 ]
- あってる。
既定クラスでdelete出来なくなるかわりに、いちいち仮想関数が呼び出されるオーバーヘッドがなくなる。
- 45 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 04:21:20 ]
- Baseのポインタからインスタンスの破棄をしなくてもいい場合は処理速度を優先してそうする。
基本的に仮想関数を使うというのは、基底クラスからは静的には“見えない”関数を実行時に扱えるようにする為のもの。
- 46 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 07:27:51 ]
- C++のプログラムだけでラジオは作れますか?
AMとかFMの?
- 47 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 08:01:34 ]
- プログラムを走らせるハードによるんでないかい?
- 48 名前:デフォルトの名無しさん [2008/03/15(土) 11:17:00 ]
- ローカルでポインタのポインタを作る場合って、
2回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すれば、 必要なメモリを全部ロックしてくれるんでしょうか?
- 49 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 11:42:53 ]
- >>41
単一継承している時だけ使えるのなら問題はない。
- 50 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 11:45:09 ]
- >>48
>ローカルでポインタのポインタを作る場合って、 >2回newしないといけないのでしょうか? ローカル変数としてポインタのポインタを作りたいだけなら、int **p; と宣言するだけでいい。 >それともポインタのポインタだけnewすれば、 >必要なメモリを全部ロックしてくれるんでしょうか? そんなことはない。自分でnewしたものしか確保されない。 そもそも>>48のコードを見ると、newしているとのはintとint*だけで、ポインタのポインタ(int**)はnewしていないが。 自分がやろうとしていることをうまく説明できていない、または 自分がその関数のなかで何をしたいのか整理できてないでしょ。
- 51 名前:50 mailto:sage [2008/03/15(土) 11:46:16 ]
- >そもそも>>48のコードを見ると、newしているとのはintとint*だけで、ポインタのポインタ(int**)はnewしていないが
なんか変なこといってた。ゴメン、無視して。
- 52 名前:デフォルトの名無しさん mailto:sage [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);
- 53 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:06:01 ]
- ていうかロックってどこから出てきたの?
- 54 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:08:31 ]
- メモリの確保のことをロックとか俺用語使ってる気がする。
- 55 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:12:30 ]
- というと、もしかしてmalloc()はマ・ロック?
- 56 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:27:11 ]
- マルロック
- 57 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:35:57 ]
- えむ あ ろっく
- 58 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 12:42:53 ]
- memory allocation lock
それをロックするなんてとんでもない!
- 59 名前:デフォルトの名無しさん [2008/03/15(土) 16:03:21 ]
- マルチスレッド処理を勉強してます。
現在、別スレッドからメインスレッドで処理するときはPostMessageを使ってますが、 他によい方法はありますか。
- 60 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 16:13:35 ]
- 良いかどうかわからないけど、自前で処理キューを作って
メインループをMsgWaitForMultipleObjectsでまわすとか・・・
- 61 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 16:37:13 ]
- >>60
よくこの文章の意味が判ったなぁ。 >別スレッドからメインスレッドで処理する
- 62 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 16:41:21 ]
- 普通に解るけど
- 63 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 17:53:54 ]
- マルチスレッドスレか Win32API スレに行った方がいいと思うが。
- 64 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:02:32 ]
- とあるメソッドの中で
オブジェクトを生成してあれこれする時 newして操作するのと 一時オブジェクトとして生成して操作するのは どちらのほうが一般的なんでしょうか?
- 65 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:07:18 ]
- new する必然性があるなら new するし、
そうする必然性が無いなら積極的には new しない。
- 66 名前:デフォルトの名無しさん [2008/03/15(土) 21:12:33 ]
- vectorで、循環しているやつをつくりたいときはどうすればよいですか?
つまり、 vector<int> a(10); のとき、 a[10]と書いてa[0]の意味になってくれるとうれしいんですが。 いまは添字をif文で判定してます。
- 67 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:13:55 ]
- i が必ず正なら a[i % 10] でいける。
- 68 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:14:01 ]
- 継承してoperator[]をオーバーライドすればいいんじゃね。
イテレータはしらね
- 69 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:18:42 ]
- 仮想デストラクタでない vector の継承は危険だな。
内包して似たクラスを作った方がいい。
- 70 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:21:36 ]
- もしかしたらboost.circular_bufferでいいのかもしれない
- 71 名前:48 mailto:sage [2008/03/15(土) 21:38:34 ]
- >>50
ありがとうございます。 ポインタのポインタはローカル変数で使うのでなく、 関数内で作った後、関数外の色んな場所で使います。 色んな場所で使うんですが、 中身を一括で変更しないといけない時があったので、 ポインタのポインタにしました。
- 72 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:40:36 ]
- 52 は無視か・・・。
- 73 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 22:22:23 ]
- >>72
まあそういうこともある。
- 74 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 22:46:55 ]
- 某RPGの白魔法風にメアロケとかなんかそういう呼び方ないの?w
- 75 名前:48 mailto:sage [2008/03/15(土) 22:54:31 ]
- いや、無視したわけじゃないんですが。
イマイチ言わんとしていることがよく分かりませんでした。 下の用途でも、 int** array_2dim = new int*[3]; ←は、 int* array_2dim[3]; ←でいいんじゃなかと思うんですが。
- 76 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:00:23 ]
- >>74
ねぇよw 一瞬何のことかとw
- 77 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:04:13 ]
- >>75
配列のサイズがコンパイル時に決まるならそれでいいし、 コンパイル時に決まらないなら new するしかない。
- 78 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:08:10 ]
- new するしないかはやりたいことによって決まるのであって、
int** を使うから new を使うとかそういうことで決まるものではない。
- 79 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:11:52 ]
- コンストラクタの中で冷害が起きるとデストラクタは呼ばれるの?
- 80 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:12:40 ]
- オブジェクトの生成が終わってないのでデストラクタは呼ばれない。
- 81 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:12:57 ]
- >>79
冷害がおきると米が不作になります
- 82 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:13:05 ]
- まだできてないモノの後始末をどう付けろというのだ
- 83 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:13:19 ]
- でも構築済みのメンバ変数のデストラクタは呼ばれる。
- 84 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:13:23 ]
- >>79
構築済みの基本クラスとメンバ変数の分は呼ばれる 自分のは呼ばれない
- 85 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:26:08 ]
- 一次元配列のアドレスを関数に渡して手を加えたいんだけど、
できれば例文を使ってやり方を示していただけませんか
- 86 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:27:37 ]
- >>79
他の人が書いてる通り、構築済みメンバのみ呼ばれる。 あと、コンストラクタから例外を出してはいけないという迷信を信じないようにね。
- 87 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:31:58 ]
- >>85
#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); }
- 88 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:35:15 ]
- >>87
ありがとうございます。メモ帳に保存して勉強します。
- 89 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:36:24 ]
- サイズ渡すの忘れてたよw
add(a, b, 5); show(a, 5); な。
- 90 名前:デフォルトの名無しさん [2008/03/15(土) 23:41:30 ]
- >>67-69
ありがとうございます。とりあえず67さんの方法でやってみようと思いますが、68と69さんの方法って どうやればいいですか?いちおうこんな感じに書いてみたのですが、template <class T> class cvector : public std::vector<T> { T operator[](int n) { return this[n % this->size()]; } };
- 91 名前:デフォルトの名無しさん [2008/03/15(土) 23:43:06 ]
- pc11.2ch.net/test/read.cgi/streaming/1202224933/
740 :ゴキ ◆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してくれるんですか><
- 92 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:46:06 ]
- assert(n >= 0); がないと危険だな。
まあそれはいいとして、 vector を継承すると std::vector<T>* v = new cvector<T>; とした場合に delete v; の動作が未定義だし、 vector<T>& に渡せるけど、 operator[] が仮想関数じゃないから危険だな。
- 93 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:47:10 ]
- this 使うなら (*this)[n % size()] だし、
operator[](n % size()) でもいいな。
- 94 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:51:04 ]
- いくらなんでも std::vector<T>* は無いだろw
- 95 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:52:04 ]
- int -> size_t
public -> private
- 96 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 23:55:57 ]
- n に負の数を渡した場合のチェックが出来ないのが size_t の悩みどころだな。
リングバッファだと 「範囲外のインデックス」 ってのが存在しないから 0 <= n && n < size() なら有効・・・とかできないし。
- 97 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:00:29 ]
- リングバッファならむしろ負の数サポートが欲しいところ。
v[-1] == v[size()-1]
- 98 名前:デフォルトの名無しさん [2008/03/16(日) 00:26:29 ]
- >>92-97
ありがとうございます。 アドバイスを総合して実装してみたのですが、コンパイルが通りません。 #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]; の行です。 どうかもうすこし教えてください。
- 99 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:28:34 ]
- >>98
エラーメッセージそのまんまだろ。何がわからないんだ?
- 100 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:30:18 ]
- private ってのは危険だから private 継承しろって意味じゃないのか
- 101 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:43:03 ]
- operator[]の前行にpublic:
|

|