■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part28
501 名前:デフォルトの名無しさん :04/03/19 16:43
>>500
ちなみにコンストラクタを明示的に呼ぶとどうなるかと
言うと、そのコンストラクタで一時オブジェクトが作成され、
一時オブジェクトが不要になった時点で削除されるから。
*thisにその一時オブジェクトを代入するか、placement new
を使えばできない事もないが、お勧めしない。

502 名前:デフォルトの名無しさん :04/03/19 16:47
>>498
質問の回答じゃないけど

>CTest():m_nData(0){};
>CTest(int n){m_nData=n;}

これって
CTest(int n = 0): m_nData(n) {}
でいいんじゃないかな。

503 名前:デフォルトの名無しさん :04/03/19 16:59
コンストラクタを明示的に呼び出すとカタストロフィ。

#include <iostream>

class A {
int* p;
public:
A(int i = 0) : p(new int[i]) { std::cout << "Ctor(" << i << ")\n"; }
~A() { std::cout << std::hex << p << "\n"; delete p; std::cout << "Dtor\n"; }
void Init(int i = 0) { delete p; *this = A(i); std::cout << "Init(" << i << ")\n"; }
};

int main()
{
A a(10);
a.Init(5);
}

504 名前:デフォルトの名無しさん :04/03/19 17:02
>>503
それはまともなoperator=を実装していないのが悪いんじゃないか?

505 名前:デフォルトの名無しさん :04/03/19 17:07
this->CTest::CTest(n)で呼べたりしない?

506 名前:デフォルトの名無しさん :04/03/19 17:08
>>504 しかしこれでもアカン。危険すぎ。

#include <iostream>

class A {
int* p;
public:
A(int i = 0) : p(new int[i]) { std::cout << "Ctor(" << i << ")\n"; }
~A() { std::cout << std::hex << p << "\n"; delete p; std::cout << "Dtor\n"; }
void Init(int i = 0) { *this = A(i); std::cout << "Init(" << i << ")\n"; }
A& operator=(const A& ca) {
delete p;
p = ca.p;
return *this;
}
};

int main()
{
A a(10);
a.Init(5);
}

507 名前:デフォルトの名無しさん :04/03/19 17:17
>>506
設計がおかしい。それだとまともにコピーできない。

class A {
  int *p;
  std::size_t size;
  public:
  A(int i = 0) : p(new int[i]) {}
  ~A() {delete []p;}
  A &operator=(const A &ca) {
    idelete []p; p = new int[ca.size]; std::copy(ca.p, ca.p+ca.size, p); return *this;
  }
  void Init(int i = 0) {*this = A(i);}
};

これで(例外安全は別にして)問題ないはずだが?

508 名前:デフォルトの名無しさん :04/03/19 17:22
>>507
ありがd。やはり明示的にコンストラクタを呼び出すのはやめます。。。

509 名前:デフォルトの名無しさん :04/03/19 17:24
>>507
横やりスマソ。
A(int i = 0) : p(new int[i]), size(i) {}
ですよね。

510 名前:デフォルトの名無しさん :04/03/19 17:26
>>508
いや、operaotor= を正しく書けば明示的にコンストラクタを
呼び出しても良いという例かと。この場合は。

511 名前:505 :04/03/19 17:33
スルーかよぅ
this->CTest::CTest(n)だと
一時オブジェクトじゃなくちゃんと呼ばれてる見たいなんだが。
でも仮想関数が絡むとらえらい事なるからどっちにしろ使えねーなぁ。

512 名前:デフォルトの名無しさん :04/03/19 17:42
>>511
コンパイルエラー。

513 名前:505 :04/03/19 17:50
>>512
void CTest::Init(int n)
{
 this->CTest::CTest(n);
}
よ?
VC7.1では通ったけど、他では通らんのかね?

514 名前:デフォルトの名無しさん :04/03/19 18:01
>>513
取り敢えずMinGW(gcc3.3.3)ではエラー。
今標準で該当部分を探している所。

515 名前:デフォルトの名無しさん :04/03/19 18:14
ttp://www.kuzbass.ru/docs/isocpp/special.html#class.ctor

12.1.2当たりかな。

"Because constructors do not have names, they are never found
during name lookup;"

関数のように呼び出すのはだめだが、一時オブジェクトの生成の
ために呼び出すのは良いらしい。よくわからんけど。

516 名前:デフォルトの名無しさん :04/03/19 20:19
#include <iostream>
using namespace std;

int main()
{
int num1, sum=0;
cout << "何個の数字の和を求めますか?\n";
cin >> num1;

if(num1 >= 1 && num1 <= 10){
cout << "数値を" << num1 << "個入力してください。\n";
int pok[num1-1];
for(int i=0; i<=num1-1; i++){
cin >> pok[i];
sum = sum + pok[i];
}
cout << "合計値は" << sum << "です。\n";
}
else
cout << "数値が正しくありません\n";

return 0;
}



と入力して、ユーザーが指定した数の和を求めようと思うのだが
pok[num1]のところで「サイズを指定してください」とエラーがでます。
cin >> num1 で入力されたサイズを作りたい場合はどうすればよいのですか?

517 名前:デフォルトの名無しさん :04/03/19 20:22
>>516
配列変数のサイズはコンパイル時に確定していなければならない。
int pok[num1-1]; ではなく
std::vector<int> pok(num1); だな。(要 #include <vector>)
あとnum1-1は一個少なく確保されてメモリ破壊ネタだね。

518 名前:516 :04/03/19 20:30
int pok[num1-1]; のところ勘違いしてました……
std::bector<int〜〜 とやるのですね。
どうもありがとうございます。

519 名前:デフォルトの名無しさん :04/03/19 20:34
なぜかgccだと通るな
$ gcc test.c && ./a
size:100
400

#include <stdio.h>

int main()
{
int i;
scanf("size:%d", &i);
int arr[i];

printf("%d\n", sizeof(arr));
return 0;
}


520 名前:デフォルトの名無しさん :04/03/19 20:42
>>519
それはC99の機能。

521 名前:デフォルトの名無しさん :04/03/19 20:43
>>519
現行のC++規格的には通らないが、C99では通るしな。

522 名前:デフォルトの名無しさん :04/03/19 21:07
>>497
B を操作する inline 関数を実装したいときには、
A の宣言部の直後に include する。

523 名前:デフォルトの名無しさん :04/03/20 09:17
朝このスレを見て伸びてないとガックリする。

524 名前:一星 ◆Cppn/.YI3. :04/03/20 12:56
#include <iostream.h>
class Book{
string name;
int thicness; // mm
string color;
public:
Book(string,int,string);
};
Book :: Book(string r_name,int r_thicness,string r_color){
name = r_name;
thicness = r_thicness;
color = r_color;
cout<<name<<"が作成されました。"<<endl;
}
int main(void){
Book mine[16]("ある本",20,"青"); // エラーになる
getchar();
return 0;

}


 上の様に、オブジェクト配列にコンストラクターを適用するにはどうすればいいんでしょうか?
『{}』を使ってみたりもしましたがよくわかりませんでした。わかる方は、ご教授お願いします。

525 名前:デフォルトの名無しさん :04/03/20 13:06
>523
朝だからしょうがない。

526 名前:デフォルトの名無しさん :04/03/20 13:07
#include <vector>
std::vector< Book > mine( 16 , Book("ある本",20,"青") );

あとは、余計かもしれないけど。
×<iostream.h> → ○<iostream> で名前空間指定しる。
コンストラクタでは初期化リストを使え。
#include <string> #include <cstdio> が足りない。


527 名前:大猿じゃないけど ◆N773RO82ms :04/03/20 13:33
>>524
new を使ってもできそう。
ただ delete[] するのが面倒ですが。
#include <iostream> // std::cout, std::endl
#include <string> // std::string
#include <cstdio> // getchar()

using namespace std;

class Book {
string name;
int thicness; // mm
string color;
public:
Book(string r_name, int r_thicness, string r_color)
: name(r_name), thicness(r_thicness), color(r_color)
{ cout << name << "が作成されました." << endl; }
};

int main()
{
Book* mine = new Book[16]("ある本", 20, "青");
getchar();
delete[] mine;
return 0;
}


528 名前:デフォルトの名無しさん :04/03/20 13:45
>>527
できそうだけどできないよ。

529 名前:527 :04/03/20 13:47
g++ ではできたよ。環境依存?

530 名前:デフォルトの名無しさん :04/03/20 13:48
g++ の拡張機能だろ。

531 名前:デフォルトの名無しさん :04/03/20 13:49
>>524
コンストラクタは呼ばれるが、引数を与えることはできない。

532 名前:527 :04/03/20 14:05
>>530
その通りみたいですね。
ISO/IEC 14882:1998 にも
void* operator new(std::size_t) throw(std::bad_alloc);
void* operator new[](std::size_t) throw(std::bad_alloc);
しか載ってませんでした。

-pedanticオプションつけたらコンパイルできなかったし。

533 名前:デフォルトの名無しさん :04/03/20 14:17
一応補足。

本当に配列の要素をコンストラクタで初期化したい場合は初期化リストで明示的にやるしかない。
Book mine[2] = { Book("Book",20,"Blue"), Book("Book",20,"Blue") };

で、単に何らかの値で初期化しておきたい場合には、デフォルトコンストラクタを使うこともできる。
配列の初期化に初期化子を用いない場合、デフォルトコンストラクタがその初期化に用いられる。
class Book ではユーザ定義のコンストラクタが存在するため、デフォルトコンストラクタも明示的に
定義する必要がある。

534 名前:デフォルトの名無しさん :04/03/20 14:18
#include <string>
#include <iostream>

using namespace std;

class Book {
string name;
int thickness; // mm
string color;
public:
Book(string,int,string);
Book(); // default constructor
~Book();
};

Book::Book(string r_name,int r_thickness,string r_color):name(r_name),thickness(r_thickness),color(r_color) {
cout << "(\"" << name << "\"," << thickness << ",\"" << color << "\") is constructing" << endl;
}

Book::Book():name("A book"),thickness(20),color("Blue") {
cout << "(\"" << name << "\"," << thickness << ",\"" << color << "\") is constructing" << endl;
}

Book::~Book() {
cout << name << " is destructing" << endl;
}

int main(void) {
Book mine[2]={ Book("A Book",20,"Blue"), Book("A Book",20,"Blue") };
Book mine2[3];
return 0;
}

535 名前:デフォルトの名無しさん :04/03/20 14:26
>>532
> その通りみたいですね。
> ISO/IEC 14882:1998 にも
> void* operator new(std::size_t) throw(std::bad_alloc);
> void* operator new[](std::size_t) throw(std::bad_alloc);
> しか載ってませんでした。

それは allocation function の話であって、new expression とはまた別の話だと思われ。
依然として↓は OK なわけで。
Book* = new Book("A book", 20, "Blue");

長いんでコピペしないけど、5.3.4 New の 15 だと思う。

536 名前:532 :04/03/20 14:44
>>535
ありがd
読んでみます。

537 名前:デフォルトの名無しさん :04/03/21 09:34
グローバル関数版のgetline()はどのヘッダに含まれますか?

538 名前:デフォルトの名無しさん :04/03/21 12:21
>>537
<string>

539 名前:デフォルトの名無しさん :04/03/21 12:56
>>538
<iostream>かと思ってたました
thanks alot !!

540 名前:デフォルトの名無しさん :04/03/21 13:30
>>539
ちょっと待て。
istream& getline(istream& strm, string& str)
の事だよな。念のため。


541 名前:デフォルトの名無しさん :04/03/21 13:37
>>540
第3引数にchar型のパラメータがあったかもしれないすが・・
ちなみに、リターン値の参照は第1引数と同じ参照ですか?

542 名前:デフォルトの名無しさん :04/03/21 13:44
>>541
istream& getline(istream& strm, string& str, char delim)
というのもある。

参照は同じなので、getline(cin, str) >> ss; なんて書き方も
できる。

543 名前:デフォルトの名無しさん :04/03/21 13:49
>>542
重ね重ねthanks

544 名前:デフォルトの名無しさん :04/03/21 16:46
リンクリストについての質問なのですが、
class ABC{
public:
int data;
void func();
ABC *next; //最後の場合は自分をさす
};
な感じの単方向リンクリストで最初から最後まで回すときなんですが
ABC *lp;
while(lp->next != lp)
{
 lp->func();
 lp = lp->next;
}
lp->func();
のように現在使ってる本に書かれていました。
上のように簡単な処理ならいいのですがもう少し複雑になったときに
whileを終えたあとのリスト最後の要素のlp->func();の部分がスマートじゃありません。
何かいい方法はあるでしょうか?
while(1)
{
 lp->func();
 if(lp->next == lp)
  break;
 lp = lp->next;
}
というのは考え付いたのですが何か不都合とかは起きてしまいますか?
どなたかアドバイスよろしくお願いします。

545 名前:デフォルトの名無しさん :04/03/21 16:54
>> 最後の場合は自分をさす

最後の場合はNULLじゃね?

546 名前:デフォルトの名無しさん :04/03/21 16:55
あと、見た目をスマートにしたかったら、
リストとイテレータに分けるべきだろうね

547 名前:544 :04/03/21 17:01
>>545
その本では自分を指すようにしてました。
NULLでもいいのですが同じかなァと思いまして。

>>546
質問では宣言とか余分なものが入って長くなっちゃうので
イテレータを入れてませんが実際には使ってます。

548 名前:デフォルトの名無しさん :04/03/21 17:13
> イテレータを入れてませんが実際には使ってます。
イテレータって何のことを言ってるかわかってるのか?

で、
ABC* lp;
do{ ABC& current = *lp; lp = lp->next; current.func(); } while( );

549 名前:デフォルトの名無しさん :04/03/21 17:26
>>547
> その本では自分を指すようにしてました。

マジか ?
その本の名前プリーズ。

550 名前:デフォルトの名無しさん :04/03/21 17:31
>>547
リンク手繰っていくときにバグがあると
自分自身をポイントすると無限ループに、
NULLならエラーでとまってくれるので
どっちでもいいならNULLにしといたほうがいいよ。
デバッガでも終端であることを認識しやすいし。
あとどちらが一般的かといえばNULLの方。

551 名前:544 :04/03/21 17:34
>>548
あ、ちょいと勘違いしてました。
すいません…

>>549
C言語アルゴリズム徹底入門 柏原正三著
の「動的な双方向リンクリスト」の項です。

552 名前:544 :04/03/21 17:35
>>550
なるほど。ありがとうございます。
NULLで行きます。

553 名前:デフォルトの名無しさん :04/03/21 17:44
>>550
て言うか、自分を指す方になんかメリットあるのかなぁ。
俺は、初めて聞いたよ。

554 名前:柏原正三 :04/03/21 17:46
>>550
>NULLならエラーでとまってくれるので

そんな保障は何処にもないが?

純粋にどちらが安全か、という意味でいうなら
自分自身を指している方が安全。

ただループするだけであって、未定義動作をするわけではない。


555 名前:デフォルトの名無しさん :04/03/21 17:50
>>554
変なところに突っ込むね。
エラーでとまってくれない環境があるなら教えてくれ。
その環境で開発するときには注意するよ。

556 名前:デフォルトの名無しさん :04/03/21 17:50
> そんな保障は何処にもないが?

「NULLなら止まってくれる環境がたくさんあるので」
なら満足してくれるかい?

557 名前:デフォルトの名無しさん :04/03/21 17:54
おまいら釣りにひっかからないでください

558 名前:デフォルトの名無しさん :04/03/21 18:15
釣りではなく、こうしてそこそこ展開させるためのネタ投下では。

559 名前:デフォルトの名無しさん :04/03/21 18:33
便乗レスで申し訳ありませんが>>548さんの
ABC* lp;
do{ ABC& current = *lp; lp = lp->next; current.func(); } while( );
の意味が理解できません。
ABC& currentというのはどのようなものなのでしょうか

560 名前:デフォルトの名無しさん :04/03/21 18:38
>>559
参照型、この場合は lp が指すオブジェクトのエイリアスと
なる。lp = lp->next として lp の値が変わっても、参照型は
変化しない。

別にここを
ABC* currentp = lp; lp = lp->next; currentp->func();
と書いてもいい。これなら理解しやすいだろう。

561 名前:デフォルトの名無しさん :04/03/21 18:59
ヘッダを特定のnamespaceに閉じ込めることはできますが、
リンクされるライブラリの方を特定のnamespaceの中に入れるには
どうしたらいいのでしょうか?

具体的な問題は、
「namespace A」に置かれるクラスとライブラリa.hとa.lib、
a.hとa.libをリンクして作られるライブラリb.hとb.lib、があり、
このb.hとb.libを、namespace Aで作られるライブラリCでも利用したいということです。
DLLであれば、それぞれスタティックリンクされるため、このような問題は起きませんが、
スタティックリンクだと、ライブラリCのビルドモデルが変わったり、
一部の仕様が変わると問題が起きます。

構造的にはこのような感じにしたいのです。
namespace A{
ファイルアクセスクラス(b.libを作った時とは変更されている)
namespace B{
namespace A{
ファイルアクセスクラス
}
}
}
「ファイルアクセスクラス」を同じファイルでも別の実体としてリンクしたい。


562 名前:デフォルトの名無しさん :04/03/21 19:05
>>561
いみわからん。

特に、
> リンクされるライブラリの方を特定のnamespaceの中に入れる
> ビルドモデルが変わったり
> 「namespace A」に置かれるクラスとライブラリ
> namespace B{
> 同じファイル
> 別の実体としてリンク

563 名前:デフォルトの名無しさん : :04/03/21 19:09
new のオーバーロードして メモリ確保時のファイル、行番号を
管理できるようにするものを作っているのですが、

#include <new>
void* operator new( size_t size , const char *file , unsigned line );
とnewをオーバーロードして

呼び出し側で
char hoge = new( _FILE_ , __LINE__ )char;
と書いてコンパイルしたところ

下のようなワーニングメッセージが出てしまいます。

warning C4291: 'void *__cdecl operator new(unsigned int,const char *,unsigned int)' : 初期化コードが例外をスローすると、'new' 演算子を使用しているとメモリを解放しません。

これのなにがまずいのでしょうか?


564 名前:デフォルトの名無しさん :04/03/21 19:13
>>562
すみません。
まず、namespace Aで作られる大型ライブラリCがありまして、
そのライブラリCの一部のファイルを利用したBというライブラリを作ったところ、
このライブラリBを、元の大型ライブラリCでも利用したいということになったのです。


565 名前:デフォルトの名無しさん :04/03/21 19:16
>>563
operator delete が定義してないからだろ。

566 名前:デフォルトの名無しさん :04/03/21 19:19
>544
最後のnextにNULLを入れれば
while(lp != NULL)
{
 lp->func();
 lp = lp->next;
}
でいーんじゃない?
最後のリンクに自分を入れるから余分なものが必要になっちゃってるのでは…?

567 名前:デフォルトの名無しさん :04/03/21 19:20
>>563
Effective C++の第10項をよく読んでみよう。

568 名前:デフォルトの名無しさん :04/03/21 19:25
>>555
> エラーでとまってくれない環境があるなら教えてくれ。
GBA とかドリームキャストとか。あと組み込み系も TLB なかったり、
アドレス 0 に ROM がマッピングされてたりするので、読み出しても
ふつーにデータが返ってきたりする。(書き込みは無視される)

でも NULL 入れとけというのは同意だけど。多くの環境だとそれで落ちるし、
実機上ではダメでもエミュレータでならトラップ掛けられる場合も多い。

>>554
> ただループするだけであって、未定義動作をするわけではない。
いずれにしても、リリースする段階で残っていたらアウトっつー類のバグだ。
テスト段階で検出しないとマズい。

569 名前:柏原正三 :04/03/21 19:51
>>566
>最後のリンクに自分を入れるから余分なものが必要になっちゃってるのでは…?

それでは比較の操作が1回余分に発生する。

>>568
>テスト段階で検出しないとマズい。

未定義である以上、実行時の結果だけでバグでないと
保障することはできない。

テストの時、たまたま予想通りの動作をしていたらどうする?


570 名前:デフォルトの名無しさん :04/03/21 19:54
ウワァァァァァァヽ(`Д´)ノァァァァァァン!
C++の話題にしてくれよ!実装依存の話は聞きたくない!

571 名前:デフォルトの名無しさん :04/03/21 20:07
このスレにはGBAとかドリームキャストとか組み込み系のプログラマが多い。
それらの人たちにとっても意味のある議論をしなければならない。

それが分からない厨房は帰れ。

572 名前:デフォルトの名無しさん :04/03/21 20:11
>それでは比較の操作が1回余分に発生する。
確かにそうだな…
というかよくそんなレスを思いついたものだ

573 名前:デフォルトの名無しさん :04/03/21 20:14
>>571
それはあなたの脳内だけに留めてください。お願いです。

>>572
俺もそう思った。確かに間違ってはいないが。

574 名前:デフォルトの名無しさん :04/03/21 20:17
>>570
NULLの安全性(若しくは有用性?)の話は十分にgenericな話題
空想論に走るのを防止する目的で要求しだい実例を挙げているだけ
そこはスルーしててもちゃんと通じる話だよ?

575 名前:デフォルトの名無しさん :04/03/21 20:20
これらの話を理解したうえで、NULLにする、しないを選択すればいいんじゃないかなあ
「本に書いてあったから」なんて理由で使うのはどうかと思う

576 名前:デフォルトの名無しさん :04/03/21 20:20
つか全然C++じゃないな。むしろCだ。

577 名前:デフォルトの名無しさん :04/03/21 20:22
C++ならNULLではなく0で議論して欲しいナァ・・・・
まあどちらでも同じなんだけど。

578 名前:デフォルトの名無しさん :04/03/21 20:22
>>576
おお同士よ

579 名前:デフォルトの名無しさん :04/03/21 20:31
>>576 578
だってもともとが「C言語アルゴリズム徹底入門」から出た質問だもの
端からスレ違いだって

580 名前:デフォルトの名無しさん :04/03/21 20:46
NULLを使わず0を使う方針をとった場合、ドキュメント中の「ヌルポインタの値」はどう書きますか?
ポインタを返す関数の仕様を「〜の場合は0を返す」と書くことになるんでしょうか?

581 名前:デフォルトの名無しさん :04/03/21 20:48
>>580
素直にNULLでいいじゃん。そこで「0でも同じなんですけど!」
と反論しても空しいし。

582 名前:デフォルトの名無しさん :04/03/21 20:53
>>580
俺だったら>>580さんのようにすると思う。と言うかしている。
大抵のC++処理系は #define NULL 0 としてあるが、そうで
ない処理系もあるだろうから、移植性を重視するならNULL
は撤廃した方がいいよ。

583 名前:デフォルトの名無しさん :04/03/21 20:57
>>582
C++ではNULLは0って規格で決まってるんじゃなかったっけ?

584 名前:デフォルトの名無しさん :04/03/21 21:05
>>582
ttp://www.kuzbass.ru/docs/isocpp/lib-support.html#lib.support.types

18.1.4
[Footnote: Possible definitions include 0 and 0L, but not (void*)0. --- end foonote]

つまりNULLは0または0Lしか許されない。

585 名前:デフォルトの名無しさん :04/03/21 21:06
>>580
国内では「空ポインタ」と訳すのが標準のはず

586 名前:580 :04/03/21 21:08
>>581
そうすると、例の関数の戻り値をテストするコードはNULLを使うのが正しいと感じます。
関数の仕様にそう書いてあれば、それを読んだユーザーが == NULL でテストするのは自然なことです。
これはNULLを使わないと言う方針に反してしまうのです。

だからといって、ドキュメント中に0じゃぁさすがに伝わりにくいんじゃないか、と思うわけで。

587 名前:デフォルトの名無しさん :04/03/21 21:09
#include <iostream>
#include <iomanip>

struct X { int a, b; };

int X::*c;
int X::*d = 0;

template <class T>
struct Y
{
union
{
T* e;
unsigned char* f;
};
};



588 名前:デフォルトの名無しさん :04/03/21 21:10
template <class T>
inline
void dump(T* p)
{
Y<T> y;
y.e = p;

for(std::size_t i = 0; i < sizeof(T); i++)
{
std::cout
<< std::hex
<< std::setw(2)
<< std::setfill('0')
<< int(*y.f++)
<< ' ';
}
std::cout << std::endl;
}


589 名前:デフォルトの名無しさん :04/03/21 21:10
int main()
{
dump(&c);
dump(&d);

static int X::*c;
static int X::*d = 0;
dump(&c);
dump(&d);

return 0;
}


590 名前:デフォルトの名無しさん :04/03/21 21:11
587=588=589だが、もまいらの処理系ではどんな結果になる?

591 名前:デフォルトの名無しさん :04/03/21 21:13
>>586
他にも回避策はある。(lp == NULL) で比較するのではなく (!lp)
とすれば。

592 名前:デフォルトの名無しさん :04/03/21 21:16
>>590 MinGW(gcc3.3.3)の実行結果。

ff ff ff ff
ff ff ff ff
ff ff ff ff
ff ff ff ff

593 名前:デフォルトの名無しさん :04/03/21 21:26
VC7.1ではこうなる。

00 00 00 00
ff ff ff ff
00 00 00 00
ff ff ff ff

というかメンバへのポインタの値を直接参照してもあまり
意味がないような。

594 名前:デフォルトの名無しさん :04/03/21 21:42
>>585
いいえ、「ヌルポ」です。

595 名前:デフォルトの名無しさん :04/03/21 21:44
>>594
ガッ!

596 名前:デフォルトの名無しさん :04/03/21 21:51
これからCを始めようと考えているんだけど・・・。
いきなりじゃぁ、ちょっと訳解らんw

テンプレのサイト回ってきます・・・。

597 名前:デフォルトの名無しさん :04/03/21 22:17
>>596
Cなんですか?C++の間違いじゃないんですか?

598 名前:デフォルトの名無しさん :04/03/21 22:47
>>596
それはいきなりすぎます。
まずはキスから始めた方がよいのではないでしょうか?

599 名前:デフォルトの名無しさん :04/03/21 22:49
>>598
参考文献:「はじめてのC」

600 名前:デフォルトの名無しさん :04/03/22 08:51
はじめての化学兵器

601 名前:596 :04/03/22 15:19
>>597
え?CとC++って、違うんですか?
てっきり、似たようなものだと・・・。

>>598
そっちの「C」じゃ無いってw

602 名前:デフォルトの名無しさん :04/03/22 15:26
C++ は C を強化した言語で、
C++ 的に組んだプログラムは
C とは全く違うものになる。
C 的に組んだプログラムは
さほど変わらないけどね。

603 名前:デフォルトの名無しさん :04/03/22 16:37
>>601
> え?CとC++って、違うんですか?
> てっきり、似たようなものだと・・・。
似たようなものであり、違うものです。
つーか「似たような」という表現は通常、異なる物同士に対して使う形容なわけで、
この質問はちょいと変ではないかと。

604 名前:デフォルトの名無しさん :04/03/22 16:54
C++の記述はなんか読みにくいので漏れはC的に組んでるがみなさんはC++を使うときいかように?

605 名前:デフォルトの名無しさん :04/03/22 17:08
>>604
Cの記述はなんか読みにくいので漏れはC++的に組んでまつ。

606 名前:デフォルトの名無しさん :04/03/22 17:44
C++初心者で、Cをやった経験がない人なら、C++でいきなり
始める方が良い。Cで一度ポインタに関する変な癖が付いて
しまうと、そこから脱却してC++らしい考え方を身に付けるの
は骨が折れるぞ。

607 名前:デフォルトの名無しさん :04/03/22 19:06
ポインタの使い方を誤って、メモリが使い物にならなくなることってあるのですか?

608 名前:デフォルトの名無しさん :04/03/22 19:20
あります。気を付けないと火を吹くこともあるので
十分注意してください。説明書にも但し書きがあるはずです。

609 名前:デフォルトの名無しさん :04/03/22 19:40
初心者に妙なこと吹き込むスレはここですか?

610 名前:607 :04/03/22 19:47
Helpみたら「ポインタの 1 つがアドレス 0x00408000 のメモリを壊してしまったようです。どうなっているか調べる方法はありますか。
」というのがありました。 そのアドレスを壊しちゃうと、その場所はもう使えない??
壊してばかりいると、64Mのメモリが10Mとかになっちゃうのですか…?

611 名前:デフォルトの名無しさん :04/03/22 20:06
>>610
C++の勉強はやめて、Cの勉強しなさい。

612 名前:デフォルトの名無しさん :04/03/22 20:29
あまりいろんなアドレスを壊しちゃうと
次第にOSの使えるメモリが少なくなっていきます。
やりすぎるとWindowsの起動にも支障をきたすようになりますよ。

613 名前:デフォルトの名無しさん :04/03/22 21:25
>>612
>やりすぎるとWindowsの起動にも支障をきたすようになりますよ。
デバイスドライバに関わるプログラムでも組めばそうですが、
普通のアプリを作っている限りにおいては、バッファの不正書込みで
OSの挙動がおかしくなる事はないですが・・・。
WindowsCEやWindows3.xはヤバイかもしれないけど。

614 名前:デフォルトの名無しさん :04/03/22 21:28
HD アクセスを行う処理が変になって、
HD に過負荷をかけて壊してしまうことはあるかもしれない。

>>610
その場合の「壊す」というのは、物理的に壊すのではなく、
そこの値を勝手に変更してしまうことを指す。

615 名前:607 :04/03/22 21:34
いろいろ教えてくださりありがとうございます。
一回再起動すれば元通りになるということでしょうか?
普通にポインタの勉強でいろいろいじってる分には物理的に壊れることないでしょうか?
もし壊れることあるなら、試行錯誤できないでう。。。

616 名前:デフォルトの名無しさん :04/03/22 21:36
うそをうそと見抜けない人と
ネタにマジレスをする人が集まるスレはここですか?

617 名前:デフォルトの名無しさん :04/03/22 21:40
>>615
それを言うなら昔のDOS環境でのCは今より遙かに危険だったぞ。
ディスプレイに規格外の同期信号が入ると今のディスプレイなら
勝手に阻止してくれるが、昔のはそのままディスプレイから煙を
吹いて逝ってしまう事があったからな。

滅多な事ではハードウェアにダメージを与える事はできないと思わ
れ。但しデバイスドライバを作っている場合は変なコマンドをデバイ
スに送って壊してしまう事があるかもしれない。クロック周波数とか
HDDにコマンドを送るような時。

618 名前:デフォルトの名無しさん :04/03/22 21:48
>>615
ほとんどないから、試行錯誤してヨシ。
そのプログラムの挙動がおかしくなるだけ。
そんな場合はそのプログラムを強制終了すればいいだけ。

場合によっては強制終了が出来なくなる場合もあるが、
ほとんどまれなので、遠慮なくメモリを破壊して
Windowsカーネルのメモリ保護機能を楽しんでいい。

619 名前:607 :04/03/22 22:07
ありがとございます。 心置きなく試行錯誤できます。

620 名前:デフォルトの名無しさん :04/03/22 22:25
>>619
まず壊しても誰にも怒られないマシンを持て
びくびくおどおどしてちゃ何も試せないだろ

因みに俺は実用と実験用に別々のマシンを使ってる
氏なれたら困るマシンで怪しいことは一切しない

621 名前:デフォルトの名無しさん :04/03/22 22:27
このスレネタ師が一日中張り付いてるな

622 名前:デフォルトの名無しさん :04/03/22 22:36
ゴキブリとネタ師は1匹見つけたら30匹はいると思え。

623 名前:デフォルトの名無しさん :04/03/22 23:20
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
int nn[4];

srand(time(NULL));

cout << "0〜9の中から4個ランダムに選ぶ" << '\n';
for (int i=0; i<=3; i++){
nn[i] = rand() % 10;
cout << nn[i] << ' ';
}

return 0;
}

1〜9までの間からランダムに4個選ぶのを作ったんだけど、0,7,9になる確率が多いようなのは気のせい??

624 名前:デフォルトの名無しさん :04/03/22 23:21
469 名前:デフォルトの名無しさん[sage] 投稿日:04/03/22 23:03
randを使って0からRAND_MAXまでの乱数を発生させるとき、
最大値をRAND_MAXではなく100にしたいのですが、
この際、rand%101としたとき、
発生される0から100の間の数字には微妙な偏りが生じてしまうと思うのですが、
このような偏りを生じさせず、きちんとランダムに0から100の間で乱数を発生させる方法はありますでしょうか。

470 名前:デフォルトの名無しさん[sage] 投稿日:04/03/22 23:07
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/rand.3.html

471 名前:デフォルトの名無しさん[sage] 投稿日:04/03/22 23:09
良い乱数・悪い乱数
http://www001.upp.so-net.ne.jp/isaku/rand.html

472 名前:デフォルトの名無しさん[sage] 投稿日:04/03/22 23:12
>>470
>>471
どうもありがとうございました。

473 名前:デフォルトの名無しさん[sage] 投稿日:04/03/22 23:14
あとセキュリティにかかわるなら/dev/random



625 名前:デフォルトの名無しさん :04/03/22 23:21
Effective C++のオンライン版をこっそり全部見られるところってない?

626 名前:デフォルトの名無しさん :04/03/22 23:31
>>625
英語版なら知ってるけど。

627 名前:デフォルトの名無しさん :04/03/22 23:35
>>626
どこですか?

628 名前:623 :04/03/22 23:41
>>624
ありがとうございます。 前者のを試してみたら、最初の数が常に8になってしまいました。
後者は難しくて理解できないさ。
うーむ・・・

629 名前:デフォルトの名無しさん :04/03/22 23:52
C++ならboost::random使えや。

630 名前:デフォルトの名無しさん :04/03/22 23:57
>>626
ttp://www.mycnknow.com/c.htm
悪用しないようにな。

631 名前:デフォルトの名無しさん :04/03/23 00:03
文字列(半角10文字以下・dogなど)を10回入力、アルファベット順に表示させるものですが、これからどう作ればいいですか?読み込みとかが良く分からないです
/*読み込み*/
for(tate=0;tate<=kaisu;tate++){
for(yoko=0;yoko<=MAX;yoko++){
gets(moji);
moji[tate][yoko]=atoi(moji);
}
}
for(tate=0;tate<kaisu;tate++){
for(yoko=0;yoko<MAX;yoko++){
printf("%s",moji[yoko][tate]);
printf("\n");
}
}
}
/*ソート*/
for(i=0;i<kaisu;i++){
for(j=i+1;j<kaisu;j++){
if(moji[i]>moji[j]){
temp=moji[i];
moji[i]=moji[j];
moji[j]=temp;
}
}
}
/*表示*/
for(i=0;i<kaisu;i++){
printf("%s\n",moji[i]);
}
return(0);
}

632 名前:623 :04/03/23 00:10
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
int nn[4];

srand(time(NULL));

cout << "1〜9まで\n";
for (int i=0; i<=3; i++){
nn[i] = 1 + (9.0 * rand() / (RAND_MAX+1.0));
}
for (int j=0; j<=3; j++){
nn[j] = 1 + (9.0 * rand() / (RAND_MAX+1.0));
cout << nn[j] << '\n';
}

return 0;
}

2かいランダムに発生させたら、最初の文字が8じゃなくなりました。

633 名前:デフォルトの名無しさん :04/03/23 11:59
お願いします。
例えばある関数からダイアログを表示するとき
void foo()
{
CDialog dlg;
dlg.DoModal();
}
と書くのと
void foo()
{
CDialog* pDlg=new CDialog();
dlg.DoModal();
delete pDlg;
}
と書くのとがありますが、どうやって使い分けるのでしょう?
また同様にクラス内でも変数として宣言してしまう
場合と、ポインタとして宣言してコンストラクタ等で
newする場合がありますが、どう使い分ければいいのでしょうか?

634 名前:デフォルトの名無しさん :04/03/23 12:16
>>633
前者でできるんだったらとりあえずそれでやっとけ。

635 名前:デフォルトの名無しさん :04/03/23 17:00
class hoge{
int* fuga
hoge(int i){ new int fuga[i];}
~hoge(){delete [] fuga;}
};

int main(){
for(int i = 0; i < 5; i++){
 hoge fuga(i);
}

return 0;
}

このようにすると、まずhoge(0)と初期化され、
その後hoge(1)..というようにhoge(5)まで初期化されますが、
その際にデストラクターが呼び出されずにメモリリークしますか?

636 名前:デフォルトの名無しさん :04/03/23 17:02
>>635
しない。

(public:が抜けてるけど。)

637 名前:デフォルトの名無しさん :04/03/23 18:44
>>633
漏れが new で作る場合はむしろモードレス

638 名前:デフォルトの名無しさん :04/03/24 00:20
>>633
補足しておく。

>どうやって使い分けるのでしょう?
ダイアログ(変数)の生存期間によって使い分ける。
>>637 が言ってるのもそういうことね。
特定のブロック内だけ(この場合foo()の中)でいいのならば自動変数として確保する。
任意のタイミングで生成・破棄したい場合に new/delete の組を使う。
別に下の例の方でも構わないといえば構わないが、いちいちメモリを確保、解放するのが面倒だし、無駄。
さらに例外のことを考えると自動変数にするのが良い。

>また同様にクラス内でも(以下略)
ポインタにしといてコンストラクタで new する場合ってのはあんまりないんじゃなかろうか。
一応思いつくのはこんな感じ。

1.可変長配列の場合
2.NULL であることに意味がある、NULL を表現する必要がある場合
 (この場合、コンストラクタではむしろ NULL 初期化する方が多いかも)
3.(ポインタを通して)1つのインスタンスを共有する可能性がある場合
 (単純にコンストラクタで new 使って生成したりしないような気もするが)

結局のところ >>633 で正解だと思われ。

>>635
fuga の生存期間は for 文の {} の中だけなので、ループが回るたびに、fuga は生成され破棄される。
つか、試してみればいいじゃないか。
ところで、
×hoge(int i){ new int fuga[i];}
○hoge(int i){ fuga = new int[i];}
だよな?

639 名前:デフォルトの名無しさん :04/03/24 00:22
訂正
×結局のところ >>633 で正解だと思われ。
×結局のところ >>634 で正解だと思われ。


640 名前:デフォルトの名無しさん :04/03/24 00:39
4.Pimpl イディオム

>633
ものすごくオブジェクトのサイズがでかくて、スタックに積むのが不安なとき、とか?
そんな糞設計ないと思うが。

641 名前:633 :04/03/24 01:11
>>634-637-638-640
今帰ってきました。遅れてすみません。
みなさん丁寧にどうもありがとう。
よくわかりました。もっと勉強してきますです。


642 名前:デフォルトの名無しさん :04/03/24 07:13
数が変化するオブジェクトを管理するにはどうやるのがいいでしょうか?
自分で調べた・聞いた結果としましては、
STLはどれも重くて生成・削除が激しいものにはきつい。
このスレを見てたところリスト構造というのがあり、少なくともSTLよりは
ずっとイイみたいなので今はこれを使っています。
あとは普通に最大数の配列を用意しておいてフラグなどのtrue/falseで
最初から最後までまわす方法ですが、さすがに要素が多いとキツイかと思ってましたが
某所に「今のPCの性能はいいからいくらでも問題ない」みたいなことがかいてありました。
しかしメモリを節約するに越したことはないですし…

何かいい方法がありましたら教えていただけないでしょうか。
よろしくお願いします。

643 名前:デフォルトの名無しさん :04/03/24 07:28
STLとは何か判ってますか?

644 名前:デフォルトの名無しさん :04/03/24 10:21
>>642
まず質問の仕方から勉強しましょう。


645 名前:デフォルトの名無しさん :04/03/24 10:41
>>642
>数が変化するオブジェクトを管理するにはどうやるのがいいでしょうか?
>自分で調べた・聞いた結果としましては、
>STLはどれも重くて生成・削除が激しいものにはきつい。

お前は、オブジェクトという言葉を使うのさえ10年早い。
STLが何故重いのか、どれぐらい重いのかを説明できるか?


646 名前:デフォルトの名無しさん :04/03/24 11:09
未来のC++プログラミングは全ての実装をヘッダファイルで行い、
アプリケーション中、ただ一つのmain.cppでは、
コンフィギュレーションの類いを記すだけとなる、
という話は本当ですか?

647 名前:デフォルトの名無しさん :04/03/24 11:22
C++に未来なんてないので嘘です。

648 名前:デフォルトの名無しさん :04/03/24 11:49
>>642
srd::list使えば?
リスト構造ですよ。ちなみにこれ、STLね。

649 名前:デフォルトの名無しさん :04/03/24 11:55
>>648
STLはどれも重くて生成・削除が激しいものにはきつい。
そんなものをすすめるあなたは荒らしですね。
荒らしは死んでください。

650 名前:デフォルトの名無しさん :04/03/24 12:19
>>646
循環参照にはどう対応するんだ(w


651 名前:デフォルトの名無しさん :04/03/24 13:41
全部テンプレートなので循環しても大丈夫ですヨ(w

652 名前:デフォルトの名無しさん :04/03/24 13:54
> ただ一つのmain.cppでは、
> コンフィギュレーションの類いを記すだけとなる

コンフィギュレーションもファイルから読み込みますから

653 名前:デフォルトの名無しさん :04/03/24 14:03
C#みたいに1つのファイルに関数の中身記述するのはいやだな。

654 名前:デフォルトの名無しさん :04/03/24 14:33
>>649は、本気で言ってるのかな?
生成・削除が激しい場合はそもそも動的な確保を頻繁にやらないでしょ。
STL云々より、設計の進め方自体が間違っていると思うのだが。
それをSTLのせいにしたあげく2chで質問をしているって感じですかねw

ひょっとしてstd::vectorなどに、「サイズやインデックス管理が一切必要ない」
という理想を求めてますか?そんな要求はそもそも無茶ですけど。
プログラマは皆それ理解した上でSTLを使っているのですが、>>649はそうではないようですね。

655 名前:デフォルトの名無しさん :04/03/24 14:34
C++の限界という奴ですね。失望しました。

656 名前:デフォルトの名無しさん :04/03/24 14:41
>>642
マジレスしとく
>STLはどれも重くて生成・削除が激しいものにはきつい。
何処で誰に聞いたのかは知らないが、十中八九あなたの勘違い/読み間違い。
正しくは、コンテナによっては、アイテムの追加挿入削除にコストがかかるものと
そうでないものとがあるということ。このことは別にSTLのコンテナに限らない。

配列やSTLのvectorは前者の代表で、リスト構造は後者の代表。
なおSTLにもリストは用意されている。

どうやらあなたは基本的な用語や概念の理解が不十分のようです。
もう一度基礎をしっかり勉強することをお勧めします。
そうすれば、とんちんかんな質問をして、あきれられたり煽られたりすることも
なくなるでしょう。

657 名前:デフォルトの名無しさん :04/03/24 14:46
>>655
言語の仕様の問題ではなく各プログラマの使うアルゴリズムの問題だって事に気づかず、
C++のせいにする人は、C++開発力だけでなくプログラミング能力自体が未熟といえます。

658 名前:デフォルトの名無しさん :04/03/24 14:49
STLのコンテナが遅い?
ベースとなっているデータ構造をご存じですか?まあそもそも
STLのコンテナが保証しているのはO値だけでコンテナの実現
方法までは規定してないけど。

仮にstd::vectorが配列、std::listがポインタ、std::setが赤黒木
だとするとそれに十分見合う速度は出ていると思います。

これでも遅くて使い物にならないのなら一切new/deleteを含む
アロケータを使用しない独自のコンテナを自作すべきです。
またはtraditionalなC式のイテレータを持たないデータ構造に
するか。その場合配列を除いて<algorithm>は使用不可になっ
てしまいますが。

659 名前:デフォルトの名無しさん :04/03/24 14:51
ここは初心者の些細な一言にヒステリックに力いっぱい反論するスレですか?

660 名前:デフォルトの名無しさん :04/03/24 14:51
ちと訂正。
×std::listがポインタ
○std::listが双方向リスト

661 名前:デフォルトの名無しさん :04/03/24 14:51
おい、ちょっとまておまいら。
649!=642で、649はどうみても荒氏だろ。

662 名前:デフォルトの名無しさん :04/03/24 14:59
STLに関する評価をしているサイトは多々ありますが、
その文章を的確に理解している人は少ないようです。

「STLの主たる目的はメモリリークを回避するためのものであり、
実行パフォーマンスを向上するためのものではない。」

という文章から読者はどのように解釈するでしょうか?
STLはパフォーマンスが悪い、等とはどこにも書かれていません。
かといってSTLはパフォーマンスが良いとも書かれていません。

パフォーマンスを向上させる責任はあくまでもプログラマにあります。

663 名前:デフォルトの名無しさん :04/03/24 15:07
STLかー。結構がんばってはいるけど普通に遅いよな。
俺の書いたコンテナのコードのほうが20%〜300%速いし。

STLの存在価値は速度ではなくアルゴリズムに疎いショボコーダでも
そこそこの質と速度のコードが書けるようになるって事だから
盲信したり拒絶したりするのはどうかと思うよ。

664 名前:デフォルトの名無しさん :04/03/24 15:31
>>663
またまた痛いのが来たな(w
作ったというコンテナは、STLと同じテンプレート(汎用)コンテナなのか?
それとも、特定オブジェクトに最適化して可植性を犠牲にしたコンテナ(あくまで自称)なのか?

665 名前:デフォルトの名無しさん :04/03/24 15:32
>>663
それは言えてる。「盲信したり拒絶したり」しないで、STLの
性能と便利さを天秤にかけた後にプログラムに使用するか
どうか決定すればよいだけの話。

それを言うなら、C++の標準入出力ライブラリなんて、Cの
stdio.hより禿げしく重いし遅いものがたくさんある。速度は
度外視して便利さを追求したものならstd::stringstreamなん
てものもある。これらは継承によって構築されているので
ほとんどインターフェースが共通していて覚えやすい。

STLは継承は使用していないが、コンテナにクラスのポインタ
を入れられるので多態性を表現するのにも使える。

666 名前:デフォルトの名無しさん :04/03/24 15:38
>C++の標準入出力ライブラリなんて、Cのstdio.hより禿げしく重いし遅いものがたくさんある。
STLとiosクラス群は全く別の物です。
同列に論じている時点でどうかと思われます。

667 名前:デフォルトの名無しさん :04/03/24 15:40
標準入出力もテンプレートライブラリで実装すればいいのに。

668 名前:デフォルトの名無しさん :04/03/24 15:50
「STLはダメ」とか言ってる時点で失格です。
自作コンテナ賞賛の時点で失格です。
出直しましょう。

結論から言えば、自作コンテナなどという物は一切必要ありません。
私も駆け出しの頃、メモリ管理を覚える勉強がてら
コンテナ(自称)を作ってSTLと競わせて独りよがりな優越感に浸ったりしてました。
結局STLだけで必要十分という結論に達しました。

669 名前:デフォルトの名無しさん :04/03/24 16:01
std::vector が遅いとかいっているやつは、
reserve や insert のことを何も知らず、ただ push_back のみを利用して
評価しているだけのような気がする。

670 名前:デフォルトの名無しさん :04/03/24 16:03
自作コンテナ派は痛いよ、ホントw

671 名前:デフォルトの名無しさん :04/03/24 16:15
>>669
私もそう思います。
ただし、STLのstd::stringは曲者です。

std::string::reserve()の挙動がVC++とgccで異なります。
gccのstd::string::reserve()は恐ろしい事に何もしないみたいです。
つまり、サイズが多目にある事を前提にしたコードを
VC++環境で書くとgccに持っていった時悲惨な目に遭います(泣

672 名前:デフォルトの名無しさん :04/03/24 16:29
>>663
>STLかー。結構がんばってはいるけど普通に遅いよな。
>俺の書いたコンテナのコードのほうが20%〜300%速いし。
STLを盲信したり拒絶したりしないのは評価できるが、300%速くなった時点で、
何か疑問に思うことは無かったのですか?
自分を盲信したり拒絶したりしないほうがいいと思います。

673 名前:デフォルトの名無しさん :04/03/24 16:41
今日はえらくスレレベルが低いな、もともと低いけど。
お目出度い自作コンテナ厨が御来訪でつか?w

早く>>668にみたいに卒業しないとな。精進しろよw

674 名前:デフォルトの名無しさん :04/03/24 16:47
以降、STLの効率については Efficient C++ を読んだ上でお願いします。

675 名前:デフォルトの名無しさん :04/03/24 17:06
STLといってもコンパイラや実装によって違うのでは?
だれかベンチ取ってないの?
自作コンテナとやらと比べたベンチはあるんでしょ?

676 名前:642 :04/03/24 18:29
えーとつまりSTLではなくリスト構造を自分で作ったほうが
速いということでいいんでしょうか。
自分で作る場合はポインタ配列をnewして
NULLをセットすればいいんでしょうか。
動作が安定したら将来的には高速化を考えています。
アセンブラコードで高速化するといいと聞いたのですが
アセンブラコードからnewを呼ぶ事も可能ですか?

よろしくお願いします。

677 名前:デフォルトの名無しさん :04/03/24 18:36
>>676
悪いことは言わん。その程度の理解しかしてないのならおとなしくSTLを使っとけ。

678 名前:デフォルトの名無しさん :04/03/24 18:39
>>676
>自分で作る場合はポインタ配列をnewしてNULLをセットすればいいんでしょうか。
素だとするととんでもないやっちゃな(w
ひょっとしてリア厨かな?
工房だともうちょい知能が高いような気がする。

679 名前:デフォルトの名無しさん :04/03/24 18:39
コンテナなんて実装すんのつまんねーし面倒くせーよ。馬鹿しかやらねー。
と思っているからSTLを使っています。

680 名前:642 :04/03/24 18:40
>>677
確かに理解の度合いは低いかもしれませんが、
一度決めた方法以外のものを他の人が押し付けるのはよくないと思います。
質問には答えてくれないのでしょうか。

681 名前:デフォルトの名無しさん :04/03/24 18:43
>>676
>えーとつまりSTLではなくリスト構造を自分で作ったほうが
>速いということでいいんでしょうか。
測ってみろ。
>自分で作る場合はポインタ配列をnewして
>NULLをセットすればいいんでしょうか。
違う。
>動作が安定したら将来的には高速化を考えています。
>アセンブラコードで高速化するといいと聞いたのですが
>アセンブラコードからnewを呼ぶ事も可能ですか?
可能だ。

682 名前:デフォルトの名無しさん :04/03/24 18:44
Unko* unko = new Unko[100];ポインタ配列をnewして
unko = NULL;NULLをセット
>>動作が安定したら
しません。

683 名前:682 :04/03/24 18:44
ぎゃー!

684 名前:デフォルトの名無しさん :04/03/24 18:50
>>680
だから、君の理解の度合いで自力でコンテナ実装するのは不可能。
一から勉強しなおすか、とりあえず出来合いのものを利用するしかない。

つか、多分STLも使えないと思う。それこそstd::vectorでひたすらpush_back()

で、やっぱりリア厨か。

685 名前:デフォルトの名無しさん :04/03/24 19:08
>>680
決めてしまったなら思い直せ。言えるのはそれだけだ。

686 名前:デフォルトの名無しさん :04/03/24 19:31
我々は沢村の誕生を見た。

687 名前:デフォルトの名無しさん :04/03/24 19:35
お前らリア厨を馬鹿にしすぎ。
ってか、「リア厨」ってむやみに言うな。

688 名前:(^^;)ガクガクぶるぶる :04/03/24 19:36
>>ってか、
>>ってか、
>>ってか、

689 名前:デフォルトの名無しさん :04/03/24 19:47
>>684
std::back_inserterとかstd::back_insert_iteratorを(ry

690 名前:デフォルトの名無しさん :04/03/24 20:05
(;´Д`)「STLがうまく使えないや・・・。」

(心理学用語としての)合理化

(゚∀゚)「STLは使い物にならないね!」


こういうのは典型的なアフォ。氏ね。

691 名前:デフォルトの名無しさん :04/03/24 20:19
>>690
賛成

692 名前:デフォルトの名無しさん :04/03/24 20:25
>>690
なんだ、その程度のヤシにマジレスしていたのか。我ながら
情けない。

693 名前:デフォルトの名無しさん :04/03/24 20:51
char unum[3];
cin >> unum;
cout << unum[5] << '\n';

入力時に”123456789"って9桁入力しても
cout << unum[5] << '\n';で反映されちゃうんですが、これが反映されない方法ってありますか?

694 名前:デフォルトの名無しさん :04/03/24 21:05
>>693
ちょっと待て、一体何がしたいのか教えてくれ…
入力長を制限したいのか、それとも本気でunum[5]を使いたいのか

695 名前:デフォルトの名無しさん :04/03/24 21:07
>>693

#include <iostream>
#include <iomanip>

int main()
{
 char unum[3];

 std::cin.get(unum, 3);
 std::cout << unum << '\n';
}

696 名前:693 :04/03/24 21:10
英数字を3文字しか入力できないようにしたいんです。
ifを使って5文字目が何もなかったら処理をしようかと思ったのに、入力したものが反映されてしまいます。

697 名前:デフォルトの名無しさん :04/03/24 21:13
>>693
OK、おまいはまず'\0'というものを知るべきだ

698 名前:693 :04/03/24 21:18
うーもう一度配列のページ見てきます……

699 名前:デフォルトの名無しさん :04/03/24 21:23
>>693
char unum[3];
って宣言したとき、安全にアクセス可能なのは
unum[4]までよ、しかもunum[4]に書き込みは言語道断
その値も何が入ってるかわかったもんじゃない
つまり、unum[4]はforループかなにかで
「ちょっとオーバーしちゃった。てへへ」な用途にしか使えない。
umin[5]以降のアクセスは超絶的未意義何があっても文句は言えない。

まあつまるところ、普段はunum[0]からunum[3]までにしておけと言うことです。

700 名前:699 :04/03/24 21:32
ぐふっ。一個ずつずれてる…

char unum[3]のときumun[n]のnが
0-2 安全にアクセス可能
3 アクセスは可能、書き込み不可、値は不定
4以降 未定義

に修正しておくんなまし

701 名前:デフォルトの名無しさん :04/03/24 21:46
>>699-700
式として見ると、unum[3]は未定義じゃあないかな。unum+3を逆参照していることになる訳だから。
unum+3だけであれば安全だけどね。

あともう一つ。unum+3は「ちょっとオーバーしちゃった。てへへ」な用途以外にも、
イテレータの終端としての重要な役割がある。

702 名前:デフォルトの名無しさん :04/03/24 21:46
char unum[3]はアドレスを得ることが可能なだけじゃねーの??

703 名前:702 :04/03/24 21:47
char unum[3]じゃ定義だろうがアホ>俺
unum[3]の間違い

704 名前:デフォルトの名無しさん :04/03/24 22:02
アドレスが有効であることを保証する、だったかなあ
つまり
char* p = &unum[2];
p++;
のとき
&p = &unum[3];
を保証する、みたいな

705 名前:701 :04/03/24 22:07
>>702
>>701に対して書いているのかな?そうだとしたら補足しておく。
>>701で言いたかったのは、char unum[3];という宣言があったとき、*(unum + 3)のシンタックスシュガー
としてのunum[3]は未定義じゃないか、ということ。[]演算子は、ポインタのインクリメントだけでなく、
逆参照を行うのだから、配列の末尾+1の場合は未定義になると思うのだけど。

706 名前:デフォルトの名無しさん :04/03/24 22:17
sizeof( unum[3] )

707 名前:デフォルトの名無しさん :04/03/24 22:26
char c
c ='0'
c = '\0'
c = 0
全部違う値ですか?

708 名前:デフォルトの名無しさん :04/03/24 22:30
>>707
確実に言える事は c = '0' だけは違うって事かな。

709 名前:デフォルトの名無しさん :04/03/24 22:33
>>707
'\0'は全ビットが0だったかな。

710 名前:デフォルトの名無しさん :04/03/24 22:41
それにしても春厨が出没してからというもの、質問の質が
下がったな。それともいきなりC++から始めたのでCの知識
が足りない奴が増えたのか。

std::cinからの入力はなるべくstd::stringを使ってくれよ。Cの
悪夢に戻りたくねー。

711 名前:デフォルトの名無しさん :04/03/24 23:01
しばらく見ない間に偉くレベルの低いスレになったもんだな
おまいらもいい加減放置というものを覚えてくだちい


712 名前:デフォルトの名無しさん :04/03/24 23:02
質問のレベルが低いのは、ネットでフリーのコンパイラをダウン、
入門サイトを渡り歩いてベンキョーしてるやつが増えたからでしょ。
それだけプログラミングの敷居が下がったってこと。
あいてするのが面倒なら、スルーするか、初心者スレに誘導したらいいでしょ。

713 名前:702 :04/03/24 23:02
>>705
違う。>>700にレスしたの。
割り込まれるとは思わなかったからレスアンカーは省略した。

714 名前:642 :04/03/24 23:07
なんか偽者が暴れてるみたいで…
まずなぜこの質問したかというとこのスレの上の方に
STGゲームの弾みたいな生成・削除が激しいものはSTLより
リンクリストがいいのでは?と書かれていたからです。
あとはサイトをまわってもたいていはSTLは重いから使わない方がよい(便利ではあるが)
とありましたので…
なぜあれほどたたかれたのか理由はよくわからないのですが返答よろしくお願いします

715 名前:デフォルトの名無しさん :04/03/24 23:10
STLつかうと一気にメモリーの消費量が10倍に?!

716 名前:デフォルトの名無しさん :04/03/24 23:13
100倍でしょ??

717 名前:デフォルトの名無しさん :04/03/24 23:16
>>716
空気読め糞野郎。

718 名前:デフォルトの名無しさん :04/03/24 23:16
>>714
ログ読んで判らんのなら初心者スレにでも逝けば?

719 名前:642 :04/03/24 23:19
初心者禁止なんですか?

720 名前:デフォルトの名無しさん :04/03/24 23:20
>>719
はい。

721 名前:デフォルトの名無しさん :04/03/24 23:20
今のマシンでvectorつかったぐらいで重くなるゲームってすごいね

722 名前:デフォルトの名無しさん :04/03/24 23:20
>>714
std::listって知ってるか?
あとリンクリストって何かわかってるか?

723 名前:デフォルトの名無しさん :04/03/24 23:22
>>715
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

これはメモリサイズにもそのまま言えると思う。

724 名前:デフォルトの名無しさん :04/03/24 23:26
>>714
【初心者歓迎】C/C++室 Ver.5【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1077102238/

ただし、君のレベルだと、ここでも
「顔洗って出直せ=一から勉強しなおせ」
で叩き出されると思いますが。

あと、STG云々に関しては完全に間違って理解してますよ、君。

725 名前:720 :04/03/24 23:28
>>642
vectorで大量に多摩オブジェクト配列を確保しておく。
多摩オブジェクトにメンバ変数に使用・未使用のフラグを入れておく。
新規に多摩が必要になった場合は、
アルゴリズムのupper_bound()で未使用の多摩オブジェクトを探し出して再利用。
使い終わったらフラグを未使用状態にセット。
多摩の同時出現最大数は制限すべきだし、実際制限しないとヤバイ。

726 名前:デフォルトの名無しさん :04/03/24 23:28
>>723
すげえ。ダイナミックリンクしといてファイルサイズもメモリサイズも
増えないとかいってるよ。この人。

727 名前:デフォルトの名無しさん :04/03/24 23:30
>>715
>>723
そのネタいい加減に止めれ (;´Д`)

728 名前:デフォルトの名無しさん :04/03/24 23:31
>>723>>726
以前にも見たので秋田。
楽しいのか?そういう書込み。

729 名前:デフォルトの名無しさん :04/03/24 23:32
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいのですか?

730 名前:デフォルトの名無しさん :04/03/24 23:33
ネットワークプログラミング相談室以上に殺伐としたスレッドですね。

731 名前:デフォルトの名無しさん :04/03/24 23:33
>>714
STLで生成・削除が激しいから遅いという理由はおかしい

だが、バッドノウハウを吸収したいなら「タスクシステム」で検索してみなさい
「やねうらお」でもいい

732 名前:デフォルトの名無しさん :04/03/24 23:34
>>729
VCスレに行け。
その前にそのエラーでそのままググれ。

733 名前:デフォルトの名無しさん :04/03/24 23:38
リンクリストでも生成・削除が激しいと重くなるよ
C++の宿命だからな
コンシューマ機でよくやるオブジェクトのサイズを全部同じにしてしまうという荒業もある
ただのはいれつ のようだ

734 名前:デフォルトの名無しさん :04/03/24 23:41
>>729
リビルドしてみれ。それでも駄目ならプリコンパイル済ヘッダを使わない設定にする。

735 名前:デフォルトの名無しさん :04/03/24 23:42
>>733
C++じゃなくてOSのメモリマネージャの宿命かと。
そんなわけでプログラマ自身がメモリマネージャに就任しなければならない。

メモリマネージャに就任したPGからの会見コメント


736 名前:デフォルトの名無しさん :04/03/24 23:43
>>733
C++の宿命???????

737 名前:デフォルトの名無しさん :04/03/24 23:46
>>729
#include "stdafx.h"
後死ね。

738 名前:デフォルトの名無しさん :04/03/24 23:48
一度荒れだすと際限がないな。

739 名前:デフォルトの名無しさん :04/03/24 23:49
>>737
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

740 名前:デフォルトの名無しさん :04/03/24 23:53
何度も出たネタにマジレスする奴も出てくるから今度からテンプレに入れてくれ

741 名前:デフォルトの名無しさん :04/03/25 06:32
>>729>>732>>734>>737>>739 はコピペ。

742 名前:デフォルトの名無しさん :04/03/25 06:33
>>714
ttp://www.aya.or.jp/%7Esanami/peace/index.html#CODE44

743 名前:デフォルトの名無しさん :04/03/25 12:03
春〜Spring〜♪

744 名前:デフォルトの名無しさん :04/03/29 04:34
----------------- ここから再開 -----------------

745 名前:デフォルトの名無しさん :04/03/29 17:11
744 名前: デフォルトの名無しさん 投稿日: 04/03/25 14:30
同じ関数名を持つ複数のライブラリを扱うにはどうしたらいいのでしょうか?
ライブラリAにもBにもinit()という関数があり、両方使う必要が出てきました。
ヘッダの方はnamespaceに置きましたが、
namespace His_Lib{
#include "his.h"
}
namespace Her_Lib{
#include "her.h"
}
ライブラリをリンクするときにエラーになります。区別するにはどうしたらいいのでしょうか。

745 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 14:39
::で解決した?

746 名前: デフォルトの名無しさん 投稿日: 04/03/25 14:40
>>745

747 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 14:43
どうしようもありません

746 名前:デフォルトの名無しさん :04/03/29 17:12
748 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 14:43
>>744
どっちかのライブラリを変更して再コンパイルすることはできる状況なの?
どっちも変更できなくても、Windows の DLL だとまあ何とかできる。

749 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 15:03
>>748
ソースがあれば変更すればいいのですが、ソースがないのです。
スタティックリンクするライブラリだけなので・・・

750 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 15:10
>749

>748はWinの場合なら、
それぞれ別のバイナリ(DLL)としてリンクして、
GetProcAddressでアドレス取得して使えってことでしょ

751 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 15:36
>744
まさに、グローバル名前空間を浸食する二つのライブラリが衝突した瞬間ですな。
namespace はこうならないように予防するためのもので、対処するためのものじゃないです。

で、多重定義になる以上、
どうやっても同じバイナリに二つのライブラリを入れることは無理かと。

752 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 15:55
スタティックか。じゃあムリだね。

オブジェクトファイルを取り出してバイナリエディットで関数名変える
ぐらいしか手はないかと。

747 名前:デフォルトの名無しさん :04/03/29 17:13
753 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 16:28
C++ にはある文字 ch がそのロケールにおける数字かどうか判別する方法として、
std::isdigit テンプレート関数がありますが、 ch をそのロケールで対応する
数値に変換する関数というのはあるのでしょうか?

std::locale lc;
if( std::isdigit( ch, lc ) )
{
// 数字に変換するには?
}

754 名前: 753 [sage] 投稿日: 04/03/25 16:52
最初は、純粋に '0' (wchar_t なら L'0' )を引けばいいかなーと
思っていたのですが、
std::locale lc( "japanese");
isdigit( L'1', lc ) // 全角1
が true を返すので、どうしたもんかーとか思っているわけです。

755 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 17:09
>>753
std::num_putかな?
ようわからん。

756 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 17:12
std::num_get?

757 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 17:30
>>750
全然違う

748 名前:デフォルトの名無しさん :04/03/29 17:14
758 名前: 753 [sage] 投稿日: 04/03/25 18:02
>>755 >>756
num_get は、いちいち、stream を作成しないといけない上に、
あろうことか VC++7.1 では wchar_t の num_get を用いると、
例外で落ちます。
また、数字1文字だけを数値に変換したいのに、わざわざ num_get を使うのも、
気が引けます。

759 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 19:17
>>758
一文字だけでいいのなら

ch-'0';
ただしロケールとかは完全に無視してるけど。

複数の文字なら。
int result;std::string buf;
std::istringstream(buf) >> result;

760 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 19:34
>>759
ふりだしにもどんな

749 名前:デフォルトの名無しさん :04/03/29 17:15
761 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 20:46
>>744
それぞれのスタティックライブラリをラップするDLLを自作しれ

762 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 21:03
class A {
public:
A(const char* name) : name_(name) {}
~A(){}
private:
const char* name_;
};

class B {
public:
B() {
a.insert(new A("aaa"));
a.insert(new A("bbb"));
}
~B(){}
private:
std::vector<A*> a;
};

~B(){}でaの要素を開放する必要ありますか?
763 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 21:11
だまって boost::shared_ptr 使っとけ。
要素が文字列だけなら string でいいけど。

つーか vector に一引数の insert はないんだが

750 名前:デフォルトの名無しさん :04/03/29 17:15
764 名前: 762 [sage] 投稿日: 04/03/25 21:51
>>763 レスありがd。使ったことないけど、チャレンジしてみます。
a.push_back(new A("hoge"));のまちがいです^^;

765 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 22:20
>>762
ある

766 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 23:05
そもそもvector<A>じゃだめなの?

767 名前: デフォルトの名無しさん 投稿日: 04/03/26 00:07
> また、テンプレートライブラリ(STL含む)に関する質問は
> 専用の別スレへどうぞ。
> 過去スレ、関連スレ、関連リンクなどはこちら>>2-13


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.