【初心者歓迎】C/C++室 Ver.50【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.50【環境依存OK】 - 暇つぶし2ch2:デフォルトの名無しさん
08/02/28 00:04:57
>>1
こっちのが早いかな

3:デフォルトの名無しさん
08/02/28 00:07:48
1乙です。
これか?

4:デフォルトの名無しさん
08/02/28 00:08:26
age

5:デフォルトの名無しさん
08/02/28 00:15:18
あっちの方がかっこよかったけどこっちのが早いからこっちか。

6:デフォルトの名無しさん
08/03/14 21:41:58
class Point {
public:
Point();
void setPoint(Point p);
void printPoint();

private:
double x, y;
};

このクラスって、x,yに値を代入できますか?



7:デフォルトの名無しさん
08/03/14 21:47:04
double d;

d=1.2-1.1

0.09999999999

d=1.0/10.0;

0.1

この違いは何故((((;゜Д゜)))?


8:デフォルトの名無しさん
08/03/14 21:50:29
基本的に浮動小数点数では実数を正確に表せない

浮動小数点 誤差でググるんだ


9:デフォルトの名無しさん
08/03/14 21:54:07
>8
いえ、それは分かるのですがどちらも答えが0.1で循環小数になるのに
なぜ割り算の方だけ正確な答えが出るのか聞きたいのです。


10:デフォルトの名無しさん
08/03/14 22:01:11
スレリンク(tech板)

いまだに前前スレが落ちていない。

11:デフォルトの名無しさん
08/03/14 22:02:43
【前スレ】
【初心者歓迎】C/C++室 Ver.50【環境依存OK】
スレリンク(tech板)

12:デフォルトの名無しさん
08/03/14 22:03:17
>>9
1.0 とか 10.0 は誤差なく正確に表現できるが、
1.1 とか 1.2 は正確に表現できない (誤差が含まれている) から
誤差というのはだんだん蓄積するので、もともと誤差が含まれているもの同士を演算すると、さらに誤差が大きくなる

13:デフォルトの名無しさん
08/03/14 22:03:48
ん、こっち先使うのか?

14:デフォルトの名無しさん
08/03/14 22:04:07
質問です

int *num = new int[100*100*100];

これを0で初期化したいのですが
どうやればいいのでしょうか
forループで回す以外の方法ありますか?

15:デフォルトの名無しさん
08/03/14 22:05:52
memset

16:デフォルトの名無しさん
08/03/14 22:06:10
>>14
while ループ

17:デフォルトの名無しさん
08/03/14 22:07:35
>12
あ、演算結果じゃなくてそっちのほうの誤差だったんですね。

18:デフォルトの名無しさん
08/03/14 22:08:03
>>14 std::fill, std::fill_n

19:デフォルトの名無しさん
08/03/14 22:23:20
スタックに確保して自爆しよう!

20:デフォルトの名無しさん
08/03/14 22:25:18
>>14
int *num = new int[100*100*100]();

21:デフォルトの名無しさん
08/03/14 22:50:34
>>20
これ知らないやつ多いよな

22:デフォルトの名無しさん
08/03/14 22:51:11
i--; なんとなく顔文字に見える(--;)

23:デフォルトの名無しさん
08/03/14 23:06:46
>>20
最後の()は記入ミスだよな?

24:デフォルトの名無しさん
08/03/14 23:12:42
えー

25:デフォルトの名無しさん
08/03/14 23:15:01
配列で要素を確保する場合、デフォルトコンストラクタなら要素ごとに呼べるよ。

26:デフォルトの名無しさん
08/03/14 23:16:30
>>23
intクラスのデフォルトコンストラクタを呼ぶという発想もできない奴

27:デフォルトの名無しさん
08/03/14 23:23:28
>>14
配列 new なんて忘れて std::vector にするのがいいよ。

28:デフォルトの名無しさん
08/03/14 23:23:51
間違ってVisual C++スレで聞いてしまったのでこちらで。

class test{
int i;
test(){ test(1); }
test(int i){ this->i = i; }
}

こんな感じでコンストラクタをオーバーロードし、コンストラクタからコンストラクタを呼び出すことはできないのでしょうか?

29:デフォルトの名無しさん
08/03/14 23:26:02
確かできないはず

C++0xでは出来る様になるらしい

30:デフォルトの名無しさん
08/03/14 23:26:14
>>28
現行の規格ではできない。 C++0x が普及するまでは private な初期化関数を
使うのがベスト。元々代入でいい(初期化にこだわらない)なら、違いは無い。

31:デフォルトの名無しさん
08/03/14 23:26:17
今はできない。けどC++0xにそういう話があった気がする。

32:30
08/03/14 23:27:57
うは。みんな C++0x 待ち遠しいんだな。

33:デフォルトの名無しさん
08/03/14 23:28:04
>>29-31
短時間で返答ありがとうございました。
初期化関数を検討してみます。

34:デフォルトの名無しさん
08/03/15 01:26:57
出来ないというのは嘘だな。
コンストラクタ内でコンストラクタを呼び出すことはできる。
しかし、JAVAのように望んだ結果にはならない。

35:デフォルトの名無しさん
08/03/15 01:38:00
placement newを使えばできるかも?
new(this)test(1);
とか
いろいろ怖いけど

36:デフォルトの名無しさん
08/03/15 01:43:08
今でもコンストラクタは呼べたような気がする。
環境依存かもしれないが。
確かメンバ初期化子は無視されたはず。

37:デフォルトの名無しさん
08/03/15 01:48:02
呼べるけど今は一時オブジェクトができるだけじゃないのか。

38:デフォルトの名無しさん
08/03/15 01:49:38
ああ、そうなるのか。

39:デフォルトの名無しさん
08/03/15 02:37:45
superがあると確かに便利

40:デフォルトの名無しさん
08/03/15 02:52:15
superのコンストラクタは初期化子で呼べるけど、何か別のことを言ってる?

41:デフォルトの名無しさん
08/03/15 03:10:10
多重継承可能な言語でsuperはありえないな

42:デフォルトの名無しさん
08/03/15 03:21:07
むしろECMAScript風に配列を返せば

43:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/15 04:04:40
あってる。
既定クラスでdelete出来なくなるかわりに、いちいち仮想関数が呼び出されるオーバーヘッドがなくなる。

45:デフォルトの名無しさん
08/03/15 04:21:20
Baseのポインタからインスタンスの破棄をしなくてもいい場合は処理速度を優先してそうする。
基本的に仮想関数を使うというのは、基底クラスからは静的には“見えない”関数を実行時に扱えるようにする為のもの。

46:デフォルトの名無しさん
08/03/15 07:27:51
C++のプログラムだけでラジオは作れますか?
AMとかFMの?

47:デフォルトの名無しさん
08/03/15 08:01:34
プログラムを走らせるハードによるんでないかい?

48:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/15 11:42:53
>>41
単一継承している時だけ使えるのなら問題はない。

50:デフォルトの名無しさん
08/03/15 11:45:09
>>48
>ローカルでポインタのポインタを作る場合って、
>2回newしないといけないのでしょうか?
ローカル変数としてポインタのポインタを作りたいだけなら、int **p; と宣言するだけでいい。

>それともポインタのポインタだけnewすれば、
>必要なメモリを全部ロックしてくれるんでしょうか?
そんなことはない。自分でnewしたものしか確保されない。
そもそも>>48のコードを見ると、newしているとのはintとint*だけで、ポインタのポインタ(int**)はnewしていないが。

自分がやろうとしていることをうまく説明できていない、または
自分がその関数のなかで何をしたいのか整理できてないでしょ。


51:50
08/03/15 11:46:16
>そもそも>>48のコードを見ると、newしているとのはintとint*だけで、ポインタのポインタ(int**)はnewしていないが
なんか変なこといってた。ゴメン、無視して。

52:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/15 12:06:01
ていうかロックってどこから出てきたの?

54:デフォルトの名無しさん
08/03/15 12:08:31
メモリの確保のことをロックとか俺用語使ってる気がする。

55:デフォルトの名無しさん
08/03/15 12:12:30
というと、もしかしてmalloc()はマ・ロック?

56:デフォルトの名無しさん
08/03/15 12:27:11
マルロック

57:デフォルトの名無しさん
08/03/15 12:35:57
えむ あ ろっく

58:デフォルトの名無しさん
08/03/15 12:42:53
memory allocation lock

それをロックするなんてとんでもない!

59:デフォルトの名無しさん
08/03/15 16:03:21
マルチスレッド処理を勉強してます。
現在、別スレッドからメインスレッドで処理するときはPostMessageを使ってますが、
他によい方法はありますか。

60:デフォルトの名無しさん
08/03/15 16:13:35
良いかどうかわからないけど、自前で処理キューを作って
メインループをMsgWaitForMultipleObjectsでまわすとか・・・

61:デフォルトの名無しさん
08/03/15 16:37:13
>>60
よくこの文章の意味が判ったなぁ。
>別スレッドからメインスレッドで処理する

62:デフォルトの名無しさん
08/03/15 16:41:21
普通に解るけど


63:デフォルトの名無しさん
08/03/15 17:53:54
マルチスレッドスレか Win32API スレに行った方がいいと思うが。

64:デフォルトの名無しさん
08/03/15 21:02:32
とあるメソッドの中で
オブジェクトを生成してあれこれする時

newして操作するのと
一時オブジェクトとして生成して操作するのは
どちらのほうが一般的なんでしょうか?

65:デフォルトの名無しさん
08/03/15 21:07:18
new する必然性があるなら new するし、
そうする必然性が無いなら積極的には new しない。

66:デフォルトの名無しさん
08/03/15 21:12:33
vectorで、循環しているやつをつくりたいときはどうすればよいですか?
つまり、
vector<int> a(10);
のとき、
a[10]と書いてa[0]の意味になってくれるとうれしいんですが。
いまは添字をif文で判定してます。

67:デフォルトの名無しさん
08/03/15 21:13:55
i が必ず正なら a[i % 10] でいける。

68:デフォルトの名無しさん
08/03/15 21:14:01
継承してoperator[]をオーバーライドすればいいんじゃね。
イテレータはしらね

69:デフォルトの名無しさん
08/03/15 21:18:42
仮想デストラクタでない vector の継承は危険だな。
内包して似たクラスを作った方がいい。

70:デフォルトの名無しさん
08/03/15 21:21:36
もしかしたらboost.circular_bufferでいいのかもしれない

71:48
08/03/15 21:38:34
>>50
ありがとうございます。

ポインタのポインタはローカル変数で使うのでなく、
関数内で作った後、関数外の色んな場所で使います。

色んな場所で使うんですが、
中身を一括で変更しないといけない時があったので、
ポインタのポインタにしました。

72:デフォルトの名無しさん
08/03/15 21:40:36
52 は無視か・・・。

73:デフォルトの名無しさん
08/03/15 22:22:23
>>72
まあそういうこともある。


74:デフォルトの名無しさん
08/03/15 22:46:55
某RPGの白魔法風にメアロケとかなんかそういう呼び方ないの?w

75:48
08/03/15 22:54:31
いや、無視したわけじゃないんですが。
イマイチ言わんとしていることがよく分かりませんでした。

下の用途でも、
int** array_2dim = new int*[3]; ←は、
int* array_2dim[3]; ←でいいんじゃなかと思うんですが。

76:デフォルトの名無しさん
08/03/15 23:00:23
>>74
ねぇよw
一瞬何のことかとw

77:デフォルトの名無しさん
08/03/15 23:04:13
>>75
配列のサイズがコンパイル時に決まるならそれでいいし、
コンパイル時に決まらないなら new するしかない。

78:デフォルトの名無しさん
08/03/15 23:08:10
new するしないかはやりたいことによって決まるのであって、
int** を使うから new を使うとかそういうことで決まるものではない。

79:デフォルトの名無しさん
08/03/15 23:11:52
コンストラクタの中で冷害が起きるとデストラクタは呼ばれるの?

80:デフォルトの名無しさん
08/03/15 23:12:40
オブジェクトの生成が終わってないのでデストラクタは呼ばれない。

81:デフォルトの名無しさん
08/03/15 23:12:57
>>79
冷害がおきると米が不作になります

82:デフォルトの名無しさん
08/03/15 23:13:05
まだできてないモノの後始末をどう付けろというのだ

83:デフォルトの名無しさん
08/03/15 23:13:19
でも構築済みのメンバ変数のデストラクタは呼ばれる。

84:デフォルトの名無しさん
08/03/15 23:13:23
>>79
構築済みの基本クラスとメンバ変数の分は呼ばれる
自分のは呼ばれない

85:デフォルトの名無しさん
08/03/15 23:26:08
一次元配列のアドレスを関数に渡して手を加えたいんだけど、
できれば例文を使ってやり方を示していただけませんか

86:デフォルトの名無しさん
08/03/15 23:27:37
>>79
他の人が書いてる通り、構築済みメンバのみ呼ばれる。
あと、コンストラクタから例外を出してはいけないという迷信を信じないようにね。

87:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/15 23:35:15
>>87
ありがとうございます。メモ帳に保存して勉強します。

89:デフォルトの名無しさん
08/03/15 23:36:24
サイズ渡すの忘れてたよw

 add(a, b, 5);
 show(a, 5);

な。

90:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/15 23:43:06
スレリンク(streaming板)
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:デフォルトの名無しさん
08/03/15 23:46:06
assert(n >= 0); がないと危険だな。

まあそれはいいとして、
vector を継承すると

std::vector<T>* v = new cvector<T>;

とした場合に delete v; の動作が未定義だし、
vector<T>& に渡せるけど、
operator[] が仮想関数じゃないから危険だな。

93:デフォルトの名無しさん
08/03/15 23:47:10
this 使うなら (*this)[n % size()] だし、
operator[](n % size()) でもいいな。

94:デフォルトの名無しさん
08/03/15 23:51:04
いくらなんでも std::vector<T>* は無いだろw

95:デフォルトの名無しさん
08/03/15 23:52:04
int -> size_t

public -> private

96:デフォルトの名無しさん
08/03/15 23:55:57
n に負の数を渡した場合のチェックが出来ないのが size_t の悩みどころだな。
リングバッファだと 「範囲外のインデックス」 ってのが存在しないから
0 <= n && n < size() なら有効・・・とかできないし。

97:デフォルトの名無しさん
08/03/16 00:00:29
リングバッファならむしろ負の数サポートが欲しいところ。
v[-1] == v[size()-1]

98:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/16 00:28:34
>>98
エラーメッセージそのまんまだろ。何がわからないんだ?

100:デフォルトの名無しさん
08/03/16 00:30:18
private ってのは危険だから private 継承しろって意味じゃないのか

101:デフォルトの名無しさん
08/03/16 00:43:03
operator[]の前行にpublic:

102:デフォルトの名無しさん
08/03/16 00:45:09
>>100
private継承しようとするとpush_backが使えなかったので、public継承にしました。
>>99
これってどう継承してもよびだせないということですか?



103:デフォルトの名無しさん
08/03/16 00:51:53
class cvector -> struct cvector

>int index = (n >= 0) ? n : this->size()-n;
this->size()-nだとリングにならないよ

(n >= 0) ? n : (size() - (-n % size()));

あと、&nbsp;と書くとレスに連続した半角空白を入れられる

104:デフォルトの名無しさん
08/03/16 00:53:38
operator[] が private だから呼べねーよ!
ってコンパイルエラーだな。

105:デフォルトの名無しさん
08/03/16 01:05:00
負の数を認めない型の値の最上位ビットが立っているかどうかなら、
1 << (sizeof(type) * 8 - 1) とand取ってifすれば得られるぜ。

106:デフォルトの名無しさん
08/03/16 01:10:48
そこまでして符号無しにこだわる必要は無いと思うというか、
その時点で引数を符号無しにするべきではないと思うというか。

107:デフォルトの名無しさん
08/03/16 01:26:05
符号なしにしないとオーバーライドできない、っていうか、
operator[]はvirtualじゃないからオーバーライドできない。

108:デフォルトの名無しさん
08/03/16 01:26:55
ならオーバーロードで

109:デフォルトの名無しさん
08/03/16 01:32:28
そもそも vector を public 継承しようとしている時点であれというか。
vector とは性質的に別ものだから内包して自分でメンバ定義していくのが正しい。
単純な委譲で済む関数はインライン関数にしとけばインライン展開されるだろうし。

どうしても継承したいなら private 継承して、
size() とかそのままでいい関数は using する。

110:デフォルトの名無しさん
08/03/16 01:34:09
つうか普通このケースでは包含だよなぁ

111:デフォルトの名無しさん
08/03/16 01:42:27
質問よろしいですか?

0 1 2
3 4 5
6 7 8

このようになっている時にクラーメルの公式のように(掛け算ではありませんが)
1+5+6というふうにするにはfor文でどのようにすればいいのでしょうか?

112:デフォルトの名無しさん
08/03/16 01:57:23
int data[3][3]; とするならば

int sum = 0;
for(int i=0; i<3; i++)
{
  int x = data[i][(i + 1) % 3];
  sum += x;
}
// sum = 1+5+6 = 12

113:デフォルトの名無しさん
08/03/16 02:01:02
3つしかあり得ないならハードコーディングするのも手だと思う。
for 使うなら % だろうけど、逆向きの時は少し注意が必要(i が負になるとマズい)。

114:デフォルトの名無しさん
08/03/16 02:05:16
配列アクセス用のインデクステーブルを作るとか

115:デフォルトの名無しさん
08/03/16 02:05:33
>>112,113
すいません、言葉が足りてませんでした
配列は固定ではなくN×N行列で
ポインタを*paとする時

pa    pa+1  pa+2
pa+3   pa+4  pa+5
pa+6   pa+7  pa+8

でどう求めるかということでお願いします

116:デフォルトの名無しさん
08/03/16 02:12:47
[i][(i + 1) % 3] を [i * N + (i + 1) % N] にするだけでしょ。

117:デフォルトの名無しさん
08/03/16 02:14:36
for 使うなら % だろうけど、逆向きの時は少し注意が必要(i が負になるとマズい)。

118:デフォルトの名無しさん
08/03/16 02:21:37
>>116

i=0  0*3+(0+1)%3 = 0
i=1  1*3+(1+1)%3 = 3
i=2  2*3+(2+1)%3 = 7

こうなるんじゃないんですか?

119:デフォルトの名無しさん
08/03/16 02:23:30
>>118
頭大丈夫か

120:デフォルトの名無しさん
08/03/16 02:26:40
小学生からやりなお(ry

121:デフォルトの名無しさん
08/03/16 02:26:50
>>118
とりあえず今日はもう寝とけ

122:デフォルトの名無しさん
08/03/16 02:26:54
>>119
すいません勘違いしてました
どうもありがとうございました

123:デフォルトの名無しさん
08/03/16 11:30:09
       ∧∧
       / 中\
      (  `ハ´) いつになったら福田康夫は日本人が犯人だと認めるアルか
      ( ⊃┳⊃
      c(_)ヘ⌒ヽフ 【中国産・毒ギョーザ】日本人が“犯人”? 共同通信の日本人記者拘束で中国のネット世論沸騰★5
     (朝日(-@∀@) スレリンク(newsplus板)
≡≡≡ ◎―◎⊃⊃ キコキコ

124:デフォルトの名無しさん
08/03/16 11:40:32
毒餃子は中国工場内での混入がほぼ間違いなくなったよな。
濃度は3000ppmって。。漬け置きレベルらしいな。
シナはどこまでも外道。オリンピック開催させるなよ。

125:デフォルトの名無しさん
08/03/16 11:41:33
102です。以下のように実装してみて、動作することを確認しました。でも2点質問させてください。
(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);
  }
};




126:デフォルトの名無しさん
08/03/16 12:00:48
>>125
(1)レスを追ってないから知らん

(2)転送関数

127:デフォルトの名無しさん
08/03/16 13:00:00
Linux+gccでCPUの型番や周波数などを取得する方法を教えてください

128:103
08/03/16 13:00:16
>int index = (n >= 0) ? (n % v.size()) : (v.size()-(-n % v.size()));
>>103のは元のソースがreturn [index % size()];なので、それを前提としてたんだけど・・・。

return v[index];にするなら、負の数の方も、もう一度%しないと、
n == -size() のとき、return v[size()]; になっちゃうよ。

129:103
08/03/16 13:02:20
return v[index];

return v[index==size()?0:index];
にするのでも良いけど。

130:デフォルトの名無しさん
08/03/16 13:04:24
>>125
ring_vectorの方で良いよ。
継承するの変だと思うし。

131:デフォルトの名無しさん
08/03/16 13:04:53
system("cat /proc/cpuinfo");

132:デフォルトの名無しさん
08/03/16 13:12:54
クラスで場合によっては定義しない変数は宣言できますか?
ありましたら、どうすればいいか教えてください。

133:デフォルトの名無しさん
08/03/16 13:17:07
template <typename T>
class 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;
};

みたいな。

134:デフォルトの名無しさん
08/03/16 13:24:34
>>132
質問をもう少しkwsk

135:デフォルトの名無しさん
08/03/16 13:26:44
>>132
使わなければ

136:デフォルトの名無しさん
08/03/16 13:32:21
使わなくても定義は必要じゃね

137:デフォルトの名無しさん
08/03/16 13:38:31
だから、仮想デストラクタを持たないvectorを継承すんなよw

138:デフォルトの名無しさん
08/03/16 13:40:56
そろそろvirtualから離れようぜ

139:133
08/03/16 13:48:13
何か問題が?

140:デフォルトの名無しさん
08/03/16 13:53:31
>>139
使い方によってはvectorのデストラクタが呼ばれないことがある。

141:133
08/03/16 13:56:17
使い方?vector<T> *にキャストする話?
出来るの?private継承なのに。

142:デフォルトの名無しさん
08/03/16 14:14:38
>>141
定義をそれ以上いじらなければ問題ないっしょ。
std::vector<T>* p() {return this;}
みたいなメンバ関数を追加したりすれば、
privateな継承でも基底のポインタが得られるので、
単にprivate継承であるというだけで常に安心できるわけではない。

143:デフォルトの名無しさん
08/03/16 14:17:26
それをdeleteしたら吹くw

144:デフォルトの名無しさん
08/03/16 14:23:24
そんなメンバをつくって、しかもdeleteしちゃうような輩は、
vector<int> v;を使わせても
delete &v[1];とかするだろうなw

145:デフォルトの名無しさん
08/03/16 14:25:01
イテレータは循環するようにしなくていいのか?

146:デフォルトの名無しさん
08/03/16 14:28:34
ちょw end()どこだよw
コンテナじゃないんだし、いらないっしょ

147:デフォルトの名無しさん
08/03/16 14:35:21
どのイテレータをインクリメントしてもendと等しくはならない、とか

148:デフォルトの名無しさん
08/03/16 14:46:28
STLのアルゴリズムに食わせられないじゃん

149:デフォルトの名無しさん
08/03/16 14:48:38
>>134-135
extern 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();
};
多次元とか宣言すると不安で不安で。
もしかして宣言ってメモリ確保しなければ全然処理重くならないですか?
すげえ初歩ですが。

150:デフォルトの名無しさん
08/03/16 14:53:38
メモリを喰うのが嫌ならクラスを分けるか、
動的に確保するしかないかと

151:デフォルトの名無しさん
08/03/16 15:03:56
>>149
bmpAに不要なメンバを BMPImgData から除去して、BMPImgDataを継承した別クラスBMPImgData2にそのメンバを追加すれば?
BMPImgData bmpA;
BMPImgData2 bmpB;
もちろん、クラス名は適切に。


152:デフォルトの名無しさん
08/03/16 15:13:50
namespace AAA {
void func() {}
}
class Hoge {
friend void AAA::func();
};
とするとコンパイルできません。どうすればよいですか?

153:デフォルトの名無しさん
08/03/16 15:15:57
>>152
>どうすればよいですか?
コンパイルエラーのメッセージを書く。
そのメッセージについて>>152が何を考えて、何が分からないのかを書く。
エラーメッセージの内容を調べて無いなら、調べてから出直し。


154:149
08/03/16 16:02:00
>>150-151
ありがとうございます。^^

155:デフォルトの名無しさん
08/03/16 16:02:38
>^^
むかつくからやめろ

156:デフォルトの名無しさん
08/03/16 16:11:29
^^;

157:デフォルトの名無しさん
08/03/16 16:20:40
--;

158:デフォルトの名無しさん
08/03/16 16:54:21
(;:. @益@)

159:デフォルトの名無しさん
08/03/16 18:08:37
vectorやらlistを使用する際
コンストラクタで指定した長さ以上の要素を食わせるとどうなるのでしょうか?

160:デフォルトの名無しさん
08/03/16 18:09:22
>>159
「食わせる」って何?

161:デフォルトの名無しさん
08/03/16 18:10:32
ああ、すいません
要素数20のlistに21個目の要素を追加しようとするとどうなるのかなぁと

162:デフォルトの名無しさん
08/03/16 18:11:03
int型の変数をchar型の配列にするにはどうすればいいのでしょうか?

163:デフォルトの名無しさん
08/03/16 18:13:13
>>161
そりゃ、追加されるんだろ。

164:デフォルトの名無しさん
08/03/16 18:15:17
>>161
STLのコンテナは、追加はいくらでもやってよい。
コンストラクタで要素数を指定するのは、
あらかじめメモリを確保しておくことで、後から再確保するのを防ぐ、単なる最適化に過ぎない。

165:164
08/03/16 18:17:49
すまん、reserveと勘違いした。
コンストラクタで指定した要素数は、ちゃんと要素が追加されるよな。

166:デフォルトの名無しさん
08/03/16 18:21:25
v[20] = 1; とかで追加した気になってるかもしれないから
「追加」 の定義をきちんと聞いておいた方がいいぜ。

167:デフォルトの名無しさん
08/03/16 18:26:50
>>166
それは既存要素に対する代入だろ。sizeには反映されない。
下手したらコンテナの整合性を壊す。

て、>>166は言いたいんだと思う。

168:デフォルトの名無しさん
08/03/16 19:11:13
>>162
やりたいことをもっと明確に説明しないと回答のしようが無い。
たとえば12345という値を持つint型変数があったとして、どのような状態のchar配列が欲しいんだ?

169:デフォルトの名無しさん
08/03/16 19:32:59
>>162
int型をchar型の要素数4(とは限らんが)の配列として扱うの?
それなら共用体になるが

170:デフォルトの名無しさん
08/03/16 19:45:07
ありがとうございます
共用体しらべてみます

171:デフォルトの名無しさん
08/03/16 20:19:59
>>170
エンディアンには気をつけてな
どうせsprintfとかいうオチだとは思うが

172:デフォルトの名無しさん
08/03/16 23:21:29
URLリンク(www.imgup.org)
・・・VISUAL C++というソフトを使っていたら突然こうなりました
OSはVISTAで、これ以降いくらプロジェクトを作成しようとも、どうやら自動生成されるファイルが欠落しているようです
アンインストール、再インストールも試しましたが無駄でした、当然管理者権限もです。 どうすればいいでしょうか?

173:デフォルトの名無しさん
08/03/16 23:32:10
メッセージのファイルはあったか?あったらそれを直接クリックしてみな。

174:デフォルトの名無しさん
08/03/16 23:36:03
>>173
なかったです、正常動作している友人のプロジェクトフォルダを丸ごとZIPで送ってもらったら
DEBUGフォルダがありましたが、自分のほうでは生成されなくなってました

175:デフォルトの名無しさん
08/03/16 23:38:59
ウイルス・・・じゃないよな?

今までは正常に実行できてたんだよな?

176:デフォルトの名無しさん
08/03/16 23:48:51
ないってことは、コンパイルされた結果のファイルが無いんだな。
リビルドして、出力ウインドウにエラーメッセージがないか確認するべし。
プロジェクトのプロパティーページのリンクの項の出力ファイルのパスを確認しよう。その友人のプロジェクトが絶対パスになってないか?

177:デフォルトの名無しさん
08/03/16 23:51:08
VC2005 って Vista に対応してたっけ?

178:デフォルトの名無しさん
08/03/16 23:57:08
Vista対応パッチがあるという話は聞いたゾ。俺Xpだからよくわかんね

179:デフォルトの名無しさん
08/03/16 23:57:50
>>176
// 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をためしてみます   一旦ありです

180:デフォルトの名無しさん
08/03/17 00:01:22
えー

181:デフォルトの名無しさん
08/03/17 00:04:13
mainは一個でいいです。どちらか一方だけにしましょう。



182:デフォルトの名無しさん
08/03/17 04:09:01
イテレータを循環に、ってできるのですか?

183:デフォルトの名無しさん
08/03/17 04:26:18
演算子オーバーロードすればできるんじゃね?

184:デフォルトの名無しさん
08/03/17 07:29:05
自分でイテレータを作れば。

185:デフォルトの名無しさん
08/03/17 09:09:35
>>183-184
自分でイテレータってつくれるんですか?
あと、演算子のオーバーロードでできるんでしょうか?



186:デフォルトの名無しさん
08/03/17 09:11:19
できるっていってるじゃない。

187:デフォルトの名無しさん
08/03/17 10:44:58
>>186
もうちょっとだけ具体的に言ってみてよ。

188:デフォルトの名無しさん
08/03/17 10:54:37
>>187 何を?

189:デフォルトの名無しさん
08/03/17 11:09:18
独自イテレータのつ•く•り•か•た


190:デフォルトの名無しさん
08/03/17 11:13:53
質問すればいいじゃん

191:デフォルトの名無しさん
08/03/17 11:16:27
ググッたけどわかりませんでした。

192:デフォルトの名無しさん
08/03/17 11:33:44
class iterator {};

できあがり。
これ以上具体的な回答は、質問が具体的でない限りあり得ない。

193:デフォルトの名無しさん
08/03/17 13:03:46
ありえないのはオマエの禿頭

194:デフォルトの名無しさん
08/03/17 13:19:10
ムキになるなよw

195:デフォルトの名無しさん
08/03/17 13:27:01
ムケてるのはオマエの禿頭

196:デフォルトの名無しさん
08/03/17 13:41:30
ムケてないのか…

197:デフォルトの名無しさん
08/03/17 14:24:11
包茎で無能じゃ救いようがないよ・・・

198:デフォルトの名無しさん
08/03/17 14:39:59
包茎で無能だけど禿げてはいないぞ(怒)

199:デフォルトの名無しさん
08/03/17 15:12:57
しまった……全部に当てはまる……。

200:デフォルトの名無しさん
08/03/17 15:35:27
包茎で禿げてるから、無能と呼ばれないように頑張るわ……

201:デフォルトの名無しさん
08/03/17 20:56:53
包茎で禿で不能です

202:デフォルトの名無しさん
08/03/17 21:45:45
operator==とかの引数の対称性って手動で保守するしかないんですか?
こういうやつ↓
bool operator==(const A& lhs, const B& rhs)
{...}
bool operator==(const B& lhs, const A& rhs) // これを自動化したい
{ return rhs == lhs; }

203:デフォルトの名無しさん
08/03/17 21:52:23
boost

204:デフォルトの名無しさん
08/03/17 21:52:26
>>202
Boost.Operatorsにまとめられている。
その例だと、Aがequality_comparable<A, B>を継承して、
operator==(const A& lhs, const B& rhs)を定義すれば、
operator==(const B& lhs, const A& rhs)とoperator !=が作られる。

205:デフォルトの名無しさん
08/03/17 22:56:40
大体の人はよく使う関数などをまとめた個人用ライブラリを作ってると思うのですが
どのように管理しているんでしょうか?

* mylib/*.{h,c} と一つのディレクトリにヘッダとソース。
* mylib/include/*.h,mylib/src/*.c で mylib/lib/libmylib.a とか。
普通のライブラリ風に。

で使うときにはどうしてます?

* mylib ごとコピーして?
* mylib/include/ とかにパスを通してる。で -lmylib

どうすると楽なのか悩んでます。


206:デフォルトの名無しさん
08/03/17 22:59:48
不良債権が流行った頃
護送船団とか何とか叩いておいてアメリカがこの様なわけだが


207:デフォルトの名無しさん
08/03/17 22:59:54
>>205
コンパイラオプション (多分 -I) + makefile

208:デフォルトの名無しさん
08/03/17 23:44:55
クラスAがあり、クラスBがクラスAのインスタンスのポインタpを持っている形のプログラムがあります。
クラスAにはchar変数textがあり、クラスBからsprintf(p->text, "test");を実行します。
この時エラーが起きてプログラムが強制終了するのですが、何かおかしな手順を踏んでいるのでしょうか?

209:デフォルトの名無しさん
08/03/17 23:47:16
if文とfor文だけで一次元配列を大きい順にソートしたいんですけど
自分の力量では出来ませんでした。
やり方を教えてください。

210:デフォルトの名無しさん
08/03/17 23:50:39
>>208
クラス定義を貼れ

211:デフォルトの名無しさん
08/03/17 23:56:47
>>209
ソートでググれ。

212:デフォルトの名無しさん
08/03/18 00:08:51
>>210
クラス定義はしてあります。

213:デフォルトの名無しさん
08/03/18 00:11:05
ぬう。言葉が通じない

214:デフォルトの名無しさん
08/03/18 00:12:11
>>208
・pがAのインスタンスを指していない。
・pが指しているAのインスタンスはすでに死んでいる。
・A::textが5byteに満たない。
・sprintfの前までに何かメモリを壊している。
・その他
この中のどれなのか判定してやるから、ソースを貼れと言ってるの

215:デフォルトの名無しさん
08/03/18 00:15:58
意味をはき違えました。
コードが非常に長いので今編集しています。

216:デフォルトの名無しさん
08/03/18 00:29:58
class Task
{
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(); }
}

217:デフォルトの名無しさん
08/03/18 00:30:21
main()
{
Task task;
task.Add(new Font(), "font");
task.Add(new Edit(), "edit");
while(true)
task.Do();
}

色々大量に省きましたが大体こんな感じです。

218:208
08/03/18 00:33:47
すいません、自己解決しました。

219:デフォルトの名無しさん
08/03/18 00:37:07
EditのInit()はどこで呼ばれてんの

220:デフォルトの名無しさん
08/03/18 00:41:22
>>205
これ俺も気になる。なかなか話題にもならないし、ぐぐっても出てこないし、
みんなどうしてるって疑問は昔からあった

俺は mylib/include、mylib/source、mylb/lib にして、
include、lib にパスを通す派

221:208
08/03/18 00:45:27
>>219
Add内に実行する部分があるのでそこで実行されてます。
上のだと省いてます。

インスタンスの登録順序のせいでポインタが格納できていないのが問題でした。

222:デフォルトの名無しさん
08/03/18 00:51:13
>>220
コピーしたら元を変更したときにコピーした数だけ更新してまわらないといけないだろ。
ディレクトリ分けてパス指定するのが当然だから、話題にもならないんじゃない?

223:デフォルトの名無しさん
08/03/18 00:55:36
Visual C++で

FileInfo^ fi = gcnew FileInfo(filename);
__int64 size = fi->Length;

のように取得したファイルサイズを32bitに変換し、さらにリトルエンディアンに変換した後、
バイナリでファイルに書き出したいのですが、何か良い方法はありますか?


224:デフォルトの名無しさん
08/03/18 01:00:11
>>223
c++/cliは別スレで。

225:208
08/03/18 01:01:47
文字列代入でつまりました。
LPTSTR text;
_stprintf(text, "text");
これでエラーが起こるのですが、正しくはどうすればいいのでしょうか?

226:デフォルトの名無しさん
08/03/18 01:02:01
>209
とりあえず速度とか、プログラムらしさというのを全く気にしなくて良いなら(勉強の一貫なら)

一度、数字の書いたカードを手作業で並べ替えてみるといいかもしれない。
そのときの手順を1つ1つメモしていくんだ。

227:デフォルトの名無しさん
08/03/18 01:04:09
>>225
text はどこを指しているのか。

228:デフォルトの名無しさん
08/03/18 01:04:26
>>223
VC++なら、x86だから元々リトルエンディアンですが。
つーか、下位バイトから順番に出力すればいいのでは?

229:デフォルトの名無しさん
08/03/18 01:07:32
>>226
やってみます・・・

230:208
08/03/18 01:08:08
>>227
ありがとうございました。
TCHAR関係すべて勘違いしていました。

231:202
08/03/18 01:30:50
>>203,204
レスthx
いろいろなoperatorを定義する時に便利そうですね。
でも、operator==だけを見ると、あまり便利に感じないです。
// Hoge.cpp
#include "A.h"
#include "B.h"
bool operator==(const A& lhs, const B& rhs) {...}
というのを考えていたので、Aに修正を加えないといけないのがちょっと・・(Bはそのままというのも気になる)。
普通に定義することにします。

232:デフォルトの名無しさん
08/03/18 02:07:56
209です。ググったりしたのですが難しいです。
よろしければ手直ししていただけませんか。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]);
}

233:デフォルトの名無しさん
08/03/18 02:12:58
開発環境はVS6、コードはANSIです。

_msize()ってmalloc()やrealloc()などで
指定したメモリサイズを返すと思ってましたが、
つなげるランタイムライブラリによって変わるのですか?

現状でコンパイルオプション「コード生成」の「使用するランタイムライブラリ」を
「シングルスレッド(デバッグ)」にすると指定したサイズ、
「シングルスレッド」にすると指定したサイズから直近の16の倍数値が返ってきます。
これってC言語をする人にとって知ってて当たり前のことなんですか?
それともオプションで調整できることなんですか?


234:205
08/03/18 02:17:24
>>207,220
やっぱりそういう感じになるんですかね。

>>222
そう思ったんですけど頻繁に mylib は更新されて少し前に書いたものが
コンパイル通らなくなったりして結局使ってる側を修正しないといけなかったりで…

どうするといい感じに管理できるのかなぁと。

235:208
08/03/18 02:17:32
>>232
バブルソートでググってみ。
選択ソート、挿入ソートでもOK。
それでダメなら、並び変えるときに自分がどういう手順を追っているか考えてみ。

10 8 3 5 7 1 6 2 4 9

1 2 3 4 5 6 7 8 9 10

1つずつ動かして、その手順を元にコード起こす。

236:デフォルトの名無しさん
08/03/18 02:19:42
>>232
とりあえず要素5つくらいの配列を考えて、そのプログラムを動かすと配列の要素がどう変わっていくかを
紙の上で1ステップずつ書き出してみな。
・勉強したアルゴリズムの通りに並んでいかないなら、プログラムのロジックが間違っている。
・ググって調べたアルゴリズムがまだ理解できていないなら、まずはそれを理解するとこ。
 アルゴリズムの説明が欲しいなら、どこか適切なスレへ。
・自分で書いたプログラムがどういう動作になるのかを追えないなら、勉強不足。
 C言語の仕様的に分からないことがあるなら、また質問してみれば?

237:デフォルトの名無しさん
08/03/18 02:24:24
>>232
qsort()じゃだめなんですか?
勉強の為にソートロジック作るなら
クイックソートやマージソートやバブルソートなどで検索すればコードがでてくると思いますよ。

参考までに一番単純なバブルソートの例を

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;
}
}
}
}


238:デフォルトの名無しさん
08/03/18 02:27:32
>>233
_msize()ってANSIじゃないでしょ。

239:デフォルトの名無しさん
08/03/18 02:30:14
>>238
う・・・だったみたいですね。
Win32APIやMFCでなくコンソールアプリケーションで作成に訂正です。


240:233
08/03/18 02:33:14
long lGetSize = 0;
char *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

って具合です。


241:デフォルトの名無しさん
08/03/18 02:34:05
>>235-237
ありがとうございます。
qsortも使い方が分からないのでとにかくif文とfor文でやることにしていました。
>>237さんのバブルソートの例を見ながら組み上げたいと思います。

242:デフォルトの名無しさん
08/03/18 02:40:20
>>240
_msizeの動作は詳しく無いから想像だけど…。
リリース版では効率化のために1とか13とか中途半端なバイト数で確保せずに、16バイト単位で領域の割り当てをするけど
デバッグ版ではデバッグしやすいように指定したバイト丁度を割り当てているのでは?
(実際には管理領域やメモリ破壊検知などのためにもっと余分に割り当てているだろうけど。)


243:233
08/03/18 02:52:02
>>242
確かにこの現象が判明したのはリリースでのコンパイルですが、
デバッグで「使用するランタイムライブラリ」を「シングルスレッド」に変えるだけでも同じ現象になるのです。

これはもうランタイムライブラリの仕様としか言いようがないのでしょうか?
同じコードなのに違う動作をするというのはどうも納得いかないのです。
(オプション変更によってコンパイルorリンクエラーになるならまだわかりますが・・・)
これがC言語をする人にとって周知の事なら自分の知識不足として納得しようかと思い書き込みましたw


244:デフォルトの名無しさん
08/03/18 03:07:25
>>243
MSDNによれば
>ヒープに割り当てられたメモリ ブロックのサイズを返します。
と書いてある。
あくまで「割り当てられたサイズ」であり、これは「要求したサイズ」とは必ずしも一致しない。

>同じコードなのに違う動作をするというのはどうも納得いかないのです。
ランタイムライブラリに依存する処理なのだから、リンクするランタイムライブラリが異なれば
結果が異なることは特に不自然ではないと思う。

>これがC言語をする人にとって周知の事なら自分の知識不足として納得しようかと思い書き込みましたw
すでに出ていることだけど _msizeはANSIの標準ではなく MS固有のAPIでしかないのだから、
C言語をする人にとって周知の事というわけではない。



245:233
08/03/18 03:20:59
>>244
言ってることはわかるのですが、
それならデバッグ用のランタイムの動作はデバッグなしのランタイムとあわせるべきじゃないかと思いますね。
例えば、デバッグでステップ実行で確認したのにデバッグ外すと動作変わるなら、デバッグの意味ないですよね。
とりあえず周知でないこととオプションで対応できるようなことでないのはわかりました。


246:デフォルトの名無しさん
08/03/18 03:35:54
>>245

つ URLリンク(msdn2.microsoft.com)(VS.80).aspx

247:デフォルトの名無しさん
08/03/18 06:05:02
下のプログラムは
ファイル名を入力させて
検索文字列を入力して
「該当ファイルの検索文字列を含む行を全て表示するプログラム」です

しかしながら実行すると下のコードの
getlineがすっとばされてしまい
こちらから検索文字列の入力を行うことができません
なぜですか?

248:デフォルトの名無しさん
08/03/18 06:05:33
#include <iostream>
#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;
}


249:247
08/03/18 06:12:54
環境はcygwinを使っています

250:sage
08/03/18 06:49:59
getlineの定義は
istream &getline( char *バッファ, streamsize 文字数 );
istream &getline( char *バッファ, streamsize 文字数, char 境界文字 );
ですよね
cin.getline(s,MAXSIZE)
にしたらだめでしょうか

251:デフォルトの名無しさん
08/03/18 06:55:30
ファイル名で入力した際に入ってきた改行文字が残っているんではないですか
getline(cin,s) の前に
cin.ignore(); で一文字削ってみては

252:デフォルトの名無しさん
08/03/18 07:31:29
>>244の補足になるけど、malloc/calloc/reallocも
標準では、指定された大きさ「以上」のメモリを確保するとなっていて、
ぴったりちょうどの大きさを割り当てなければならないという決まりはない。

253:デフォルトの名無しさん
08/03/18 07:48:32
>>245
そもそも_msize()==(要求サイズ)という条件に依存しようとすることが間違い。
>>244にあるとおり、この条件が常に成立するなどとは、MSは言っていないはず。
処理系依存ってやつ。

254:デフォルトの名無しさん
08/03/18 09:20:07
>>245
> 例えば、デバッグでステップ実行で確認したのにデバッグ外す
> と動作変わるなら、デバッグの意味ないですよね。

デバッグビルドでデバッグし易いようにコードが変わるのは、よくある
こと。デバッグビルドとリリースビルドで動作に違いがないなら、デバッ
グビルドの意味ないじゃん。


255:デフォルトの名無しさん
08/03/18 11:58:02
デバッグビルドだとちゃんと動くけどリリースビルドにすると落ちるとか言うのはよくあるよな。
たいていは初期化不足だけど。

256:デフォルトの名無しさん
08/03/18 14:35:41
>デバッグの意味ないですよね
あるよ。
デバッグビルドとリリースビルドの違いで困るプログラムは、
まずいプログラムだから、それを自覚することが出来る。

257:デフォルトの名無しさん
08/03/18 17:33:21
C言語とか意味わかんね
柴田望洋ってどうなの?

258:デフォルトの名無しさん
08/03/18 17:50:42
柴田望洋についての話に進める前にC言語を意味分かるようにする事の方が先決というか
それを先にやらないと柴田望洋について話しても何も分からないと思うというか
C言語すら分からないようじゃ柴田望洋についての話も分からんだろうというか
それ以前に柴田望洋の話はマ板でやれ。

259:デフォルトの名無しさん
08/03/18 17:54:45
1:#include <iostream>
2:#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


260:デフォルトの名無しさん
08/03/18 17:57:53
4,8,11行目を見て、何か気付かないか?

261:デフォルトの名無しさん
08/03/18 17:59:04
namespaceや名前空間でググれ

262:デフォルトの名無しさん
08/03/18 18:03:35
うわ、自分で書き込んだレスみたらすぐ分かったw
エディタで見てるときはどうしても気付かなかったのに。
お目汚しすいませんでした・・・



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