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


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

C++相談室 part48
751 名前:デフォルトの名無しさん :2006/04/11(火) 01:24:23
んー話は変わるけど、動作がわからない物については、デバッグでコンパイルして、
ソースと逆アセンブル混合で見る(VC8)とよくわかるね。

楽ばかりしてないで最終的には規格票を見なきゃならないんだが、あれ全部を
見るのは大変なので、ちょっとした事は上の方法で見ている。バイナリ嘘つかない。

752 名前:デフォルトの名無しさん :2006/04/11(火) 01:29:00
>>751
> バイナリ嘘つかない

そうでもないよ。未定義動作になるソースに対しても何かしらコードは出るしね。
あと、人に説明するときに「VC8がこうコンパイルしたから〜」じゃ、さすがに
根拠にならない。おとなしく規格嫁。

753 名前:デフォルトの名無しさん :2006/04/11(火) 02:01:58
>748
Sutterお勧めの方法じゃないの?

754 名前:デフォルトの名無しさん :2006/04/11(火) 02:40:34
>>748
>vector<string>を直で返すのはさすがに気が引けるし。
TSC計ってみたけど,うち(A),(B)で殆ど差でないけどなぁ
typedef vector <string> Container;
void init_container (Container &p) {
static const size_t container_size (10), string_size (100);
p.reserve (container_size);
for (size_t i (0); i < container_size; ++ i) {
char c ('a'); string s;
for (size_t j (0); j < string_size; ++ j) s.push_back (c ++);
p.push_back (s);
}
}
Container get_container () {
Container result;
init_container (result);
return result;
}
auto_ptr <Container> get_container_ptr () {
auto_ptr <Container> result (new Container ());
init_container (*result);
return result;
}
Container c0 (get_container ()); // (A)
auto_ptr <Container> c1 (get_container_ptr ()); // (B)


755 名前:デフォルトの名無しさん :2006/04/11(火) 09:07:13
以下のようにするとエラーがでてしまうのですが、何がいけないのでしょうか?(VC8Expr)

std::vector<char> v;
std::insert_iterator<std::vector<char> > out_itr(v,v.begin());

std::string str("test");
std::copy(str.begin(),str.end(),out_itr);

out_itr = 'a';++out_itr;//ここ

756 名前:デフォルトの名無しさん :2006/04/11(火) 09:14:28
*out_itr = 'a';

後,状況によるけれどそのコードでやっていることをやりたいなら
'a' を最初に突っ込んで,次に [str.rbegin(), str.rend()) を
back_inserter に突っ込むほうが効率は良い.

757 名前:755 :2006/04/11(火) 09:27:24
>>756
ありがとう、ポインタに値代入しちゃだめですね...orz




758 名前:デフォルトの名無しさん :2006/04/11(火) 09:34:08
>>757 ポインタじゃないお

759 名前:デフォルトの名無しさん :2006/04/11(火) 14:51:12
背伸びする前に、何をやってるかきちんと理解するところからはじめないと。

760 名前:デフォルトの名無しさん :2006/04/11(火) 17:33:47
>>759
お前もな。

761 名前:デフォルトの名無しさん :2006/04/11(火) 18:03:21
>>760
もちろんそのつもりですがなにか?

762 名前:デフォルトの名無しさん :2006/04/11(火) 19:14:44
>>760
>>761
    _, ,_  パーン
  ( ‘д‘)
   ⊂彡☆))Д´) ←>>740, 761

763 名前:デフォルトの名無しさん :2006/04/11(火) 22:29:37
伝統的に沸点低いよな、ここ。

764 名前:デフォルトの名無しさん :2006/04/11(火) 22:57:03
ポインタなんて、なければいいのに

765 名前:デフォルトの名無しさん :2006/04/11(火) 23:04:32
ポインタがわからない PG なんていなくていいのに

766 名前:デフォルトの名無しさん :2006/04/11(火) 23:10:53
人の欠点は平気で責めたがるのに、自分の欠点は見ない奴が多いな。
俺もそうだけどな。

767 名前:デフォルトの名無しさん :2006/04/11(火) 23:25:44
欠点だから責めてはならないという法はない
致命的な欠点は仕事への責任感に比例して放置できない
全盲の人が機長になれないのと同じ

768 名前:デフォルトの名無しさん :2006/04/11(火) 23:30:22
>>767
別に責めてはならないとは言ってない。
ただ人を責める前に自分の欠点を直してからにしろと言いたい。
ある奴の欠点が他人から丸見えなのに、そいつに説教されると腹が立つだろう。

769 名前:デフォルトの名無しさん :2006/04/11(火) 23:31:52
致命的な欠点と、仕事はできてる欠点を同列には語れない

770 名前:デフォルトの名無しさん :2006/04/11(火) 23:32:27
>>769
わからん奴だな。俺は致命的な欠点については何も言ってない。
お前が勝手に言ってるだけだろう。

771 名前:デフォルトの名無しさん :2006/04/11(火) 23:35:12
PG がポインタわかんねーのは、まごうことなき致命的な欠点
治して来てもらう以外に打つ手はない

772 名前:デフォルトの名無しさん :2006/04/11(火) 23:36:29
>>771
それを先に言え馬鹿。
何の一般論かと思ったぜ。

773 名前:デフォルトの名無しさん :2006/04/12(水) 00:17:06
流れ嫁。

774 名前:デフォルトの名無しさん :2006/04/12(水) 00:41:58
全ての型に文字列変換するインターフェースを付けたくて
struct IStringifiable{
  virtual string toString() const = 0;
  virtual void Parse(const string& source) = 0;
};
template < typename T > struct Stringifiable : public T, public IStringifiable{
  virtual string toString() const { 云々かんぬん… }
  virtual void Parse(const string& source) { 云々かんぬん… }
};
なんてことをしたら Stringifiable< int > みたいにしても
プリミティブ型を継承できなくて('正しい基本クラスではない'と怒られる)困っています。
この場合StringifiableクラスのメンバーにT型のインスタンスを持つしかないんでしょうか?

775 名前:デフォルトの名無しさん :2006/04/12(水) 00:43:25
>>774
その通り。

776 名前:デフォルトの名無しさん :2006/04/12(水) 00:44:19
何したいのかわからん。


777 名前:デフォルトの名無しさん :2006/04/12(水) 00:51:02
>>774
string StringFrom(T source);
void ParseTo(T& target, string source);

int と Stringifiable についてオーバーロードするか、
template にして特殊化すればいいんじゃね?

778 名前:774 :2006/04/12(水) 01:01:26
INIファイルやらコマンドラインやらからの入力に対応できる変数
みたいなモノを考えてました

例えば繰り返す回数をStringifiable< int > repeat_countみたいに定義しておいて

 IIniFile::Bind("ファイル名", "セクション名", "キー名", repeat_count);
 ICommandLine::Bind("コマンドライン名", repeat_count);

といった感じに関連付けておけば

 IIniFile::Load("ファイル名");
 ICommandLine::Eval(lpCmdLine);

とやった時に変数の内容が更新されているような。
これをメンバー変数でやるようにしてしまうと repeat_count = 10;
という式が書けなくなってしまうのでなんだかな〜と思ったわけです。

あ、operator const T() constとoperator=(const T& source)を
オーバーロードすりゃいいのかな?

779 名前:デフォルトの名無しさん :2006/04/12(水) 01:11:04
template<typename T> string ToString( const T& );
と宣言しといて、
template<> string ToString( const struct Hage& arg ){
//argを文字列に変換するコード
}
みたいなのを文字列に変換したい型の数だけ実装して、
strunt Hage a = {〜〜〜};
string hageStr = ToString(a);
みたいに使えばよくね?

780 名前:774 :2006/04/12(水) 01:48:21
>>779
いや、それだとバインドができないので…


とりあえず>>778の最後の解決法でやってみてるけど
ユーザー定義型についてStringifiableのメソッドを特殊化してもらうときに
メンバー変数名がわかってないと書けないのは気持ち悪いなぁ

781 名前:デフォルトの名無しさん :2006/04/12(水) 01:58:29
int repeat_count;と定義して、
IIniFile::Bind("ファイル名", "セクション名", "キー名", &repeat_count);
という風に使うインタフェースのほうがきれいじゃないだろうか。
Bindをいちいちテンプレートにするのが嫌なら、
IIniFile::Bind("ファイル名", "セクション名", "キー名", make_stringfier(&repeat_count));
とか。

782 名前:774 :2006/04/12(水) 02:26:45
>>781
Bindの中でrepeat_countを参照で持つStringifiableのインスタンス作って
それを保持しとけば良いってことかな?
IIniFileとかの中ではいじくりたい変数の型を意識したくないので
なにかしらインターフェースを噛ませる必要があるのだけども

今後テキストエディットからの入力とか、外部から文字列で飛んでくる値を
全部透過的に扱うつもりなんだけど、受け取りたい対象毎に
(INIファイル用、コマンドライン用、エディタからの入力用…etc)
Stringifiableのインスタンスがどんどん増えてくのはどうなんだろう…

ちなみに後出しになって申し訳ないけどソースコード上である変数が
外部から書き換えられる可能性がありますよと明示したい意図もあったりして
説明のため直感的な名前にしたけどほんとはIStringifiableじゃなくて
IConfigurableってインターフェース名です

783 名前:デフォルトの名無しさん :2006/04/12(水) 02:34:38
もう質問は無いな。がんばれよ。

はい次の人どうぞ。

784 名前:デフォルトの名無しさん :2006/04/12(水) 18:02:37
>>779
それだったら、operator <<と>>を作ってboost::lexical_castでよくね?

785 名前:デフォルトの名無しさん :2006/04/12(水) 19:06:14
>>778 どうよ?

// 文字列 => 変数への変換
template< typename T > struct parser {
 void operator()( T & dest, string const & src ) const {
  dest = ::boost::lexical_cast< T >( src );
 }
};
// データバインドを行う
struct data_binder {
 ::boost::function< void ( string const & ) > update;
 template< typename T > void bind( T & value ) {
  update = ::boost::bind( parser<T>(), value, ::boost::bind::_1 );
 }
};
// 派生クラス
class ini_file : data_bindable {
 static map< path, data_binder > content;
public:
 template< typename T >
 static void bind( string const & fn, ...中略..., T & value )
 {
  path x( fn, section, key ); // パスを作成
  content[x].bind( value ); // バインド完了
 }
 static void load( string const & filename ) {
  /* 何かループ */ {
   // TODO: データ読み込み
   content[ /*パス*/ ].update( /*読み込んだデータ*/ );
  }
 }
};

786 名前:785 :2006/04/12(水) 19:10:23
あ、ini_file のベースになってる data_bindable は何の意味もないな。
忘れてくれ。

787 名前:デフォルトの名無しさん :2006/04/13(木) 08:57:51
スタックオーバーフローの例外が発生するのですが、こういうものなのでしょうか?

struct SList
{
boost::shared_ptr<SList> next;
};

int main(){
SList a;
SList* p = &a;
for(int i=0;i<100000;i++){
p->next = boost::shared_ptr<SList>(new SList);
p = p->next.get();
}
}

788 名前:デフォルトの名無しさん :2006/04/13(木) 09:04:18
>>787
cygwin g++ 3.4.4 で試したけど、何事も無く終了したよ。

789 名前:デフォルトの名無しさん :2006/04/13(木) 09:31:00
>>787
SList のデストラクタが全要素分再帰的に呼び出されることになるので、
デストラクタ呼び出しごとのスタック消費の 100000 倍のスタックが必要になる。

環境が書いてないことから想像すると Win32 で VC のデフォルト設定だろうから
スタックが 1M バイト割り当てられていたとして、1回のデストラクタ呼び出しによる
スタック消費が 10 バイト以内( 2 ワード以内)に収まっていればいい計算だが、微妙だな。

790 名前:787 :2006/04/13(木) 09:39:03
>>788
VC8Expressなんですが、
コンパイラオプションから/clrをはずしたらうまくいきました。
バグなのかな...


791 名前:デフォルトの名無しさん :2006/04/13(木) 09:49:31
>>790
CLR が挟まってるならスタック消費が 2 ワードじゃ済まなさそうだな。納得。

792 名前:785 :2006/04/13(木) 10:05:38
>>785 の data_binder は↓のようにしないとダメだな。
_1 がいつの間にか無名NSに移動してたのは驚いた

// データバインドを行う
struct data_binder {
 ::boost::function< void ( string const & ) > update;
 template< typename T > void bind( T & value ) {
  update = boost::bind( parser<T>(), boost::ref(value), _1 );
 }
};


793 名前:デフォルトの名無しさん :2006/04/13(木) 10:07:55
ぶぅすとってオイシイ?

794 名前:デフォルトの名無しさん :2006/04/13(木) 10:17:33
はい、オイシイです

795 名前:デフォルトの名無しさん :2006/04/13(木) 10:20:49
あれあれ?怒らせていいんですか?使いますよ。イオナズン。

796 名前:787 :2006/04/13(木) 10:21:13
>>789
>>791
デストラクタが深い再帰にならないようにしないといけないんですね。
(/clrだとi=4393までしかいけませんでした。)

797 名前:デフォルトの名無しさん :2006/04/13(木) 13:19:23
小ブロック程度のnewで、メモリを確保できないって事あるんですかね?
一般的な環境(Win Mac Linux辺り)で

なんか丁寧に例外取ってるの馬鹿らしくなってきまして

798 名前:デフォルトの名無しさん :2006/04/13(木) 13:28:35
>>797
メモリが有限の資源である以上ある。
丁寧に例外を取るって何やってるか知らんが、多分間違った考え方してる。

799 名前:デフォルトの名無しさん :2006/04/13(木) 13:36:24
>>798
もちろんnewする度にそこでtry-catchしている訳ではなく、メモリ確保できなかったら、
中間層辺りcacthし、データをバックアップする程度なんですが。

仮想メモリもあるし、それすら使い果たす頃には
例外取ってバックアップどころじゃない気もするんですよね

800 名前:デフォルトの名無しさん :2006/04/13(木) 13:55:10
こんなかんじですKA?(><)

hevy_weight * p = 0;
try {
 p = new hevy_weight();
}
catch( std::bad_alloc const & ) {
 throw std::runtime_error("メモリ不足です!");
}


801 名前:デフォルトの名無しさん :2006/04/13(木) 13:55:51
スタックの話でなかったの?

802 名前:デフォルトの名無しさん :2006/04/13(木) 14:35:09
ちがうやつじゃね?
そしてheavyなスペル違うぞ

803 名前:デフォルトの名無しさん :2006/04/13(木) 15:17:40
>>800 は heavy のスペル違うけど、ひょっとして
メモリ不足で bad_alloc 投げてるのに、ヒープに文字列保存する runtime_error 投げんのかよ!?
みたいな感じでは?


804 名前:デフォルトの名無しさん :2006/04/13(木) 17:38:23
>>799
一般向けOSだとメモリはページ単位(4KBとか)で確保するものが多いから
それ以下のメモリ要求に対し失敗したらruntime_errorも投げれなそう。

漏れの個人的テストだと、小ブロックの確保時にbad_allocが投げられることはあるけど、
わざとそういう状況を作るか、プログラムのバグでHDDが異常にガリガリ言った後に投げられるか、
いずれにしても例外が投げられる前から予想できるときにしか投げられなかった。

そこで、bad_allocに対してtry〜catchをするのではなく、予期しない例外のひとつとしてcatch(...)。
むしろbad_allocより、制御装置固有のとか、特定用途の例外を知りたいわけで。


805 名前:797 799 :2006/04/13(木) 18:36:29
800さんは別の方です

>>804
勉強になります。貴重な情報感謝。
なるほど、確保失敗時は厳しいので、細かくやらず大きいくくりで捉えておこうという訳ですか。
ありがとうございました。

806 名前:デフォルトの名無しさん :2006/04/13(木) 23:11:28
windowsの「メモリがありません」ダイアログに頼ってます。

807 名前:デフォルトの名無しさん :2006/04/14(金) 14:48:58
最近boostを勉強しはじめたんですが、shared_ptrに入っているオブジェクトのポインタを
ダウンキャストしたい時はどうすればいいんでしょうか?
(例)
class foo{};
class bar : public foo{};
typedef boost::shared_ptr<foo> pfoo;

foo* b1 = new bar();
pfoo b2 = pfoo(new bar());

// b1なら、
if (dynamic_cast<bar>(*b1)) cout << "this is bar1" << endl;

// b2だと?
if (dynamic_cast<bar>(*b2)) ; // error!

808 名前:デフォルトの名無しさん :2006/04/14(金) 14:53:18
>>807
訂正
if (dynamic_cast<bar*>(b1)) cout << "this is bar1" << endl;

809 名前:デフォルトの名無しさん :2006/04/14(金) 14:56:34
諸君、活発に議論しているかね?

810 名前:デフォルトの名無しさん :2006/04/14(金) 14:58:11
dynamic_cast<bar&>(*b2)

811 名前:デフォルトの名無しさん :2006/04/14(金) 15:09:06
>>807
dynamic_cast<bar*>(b2.get())

fooのデストラクタがvirtualになってないよ。


812 名前:デフォルトの名無しさん :2006/04/14(金) 15:22:29
>>811
b2.get()でいけました。 ありがとう
fooのデストラクタは、例では書かなかったけど作ってるプログラムはvirtualになってます。

813 名前:デフォルトの名無しさん :2006/04/14(金) 16:38:36
>>807
専用のキャストが用意されています.

http://www.boost.org/libs/smart_ptr/shared_ptr.htm#dynamic_pointer_cast

あと蛇足ですけれど, shared_ptr<foo>(new bar()) な形で shared_ptr を
生成していればデストラクタが virtual でなくても bar のデストラクタが走ります.

814 名前:デフォルトの名無しさん :2006/04/14(金) 16:41:45
>>812
もう遅いかもしれないが、shared_ptr 専用の

shared_static_cast
shared_dynamic_cast
shared_polymorphic_cast
shared_polymorphic_downcast

が定義されている。
上の例だと、

if( shared_polymorphic_downcast<bar>(b2) )

でもいい。

815 名前:デフォルトの名無しさん :2006/04/14(金) 16:48:28
>>813>>814
おぉ、ありがとう。 専用のがあるんですね。
そっち使うことにします。

816 名前:デフォルトの名無しさん :2006/04/14(金) 19:27:50
質問なんですが、Windows付属のペイントソフトでブラシの太さ(堅さ?)を3段階で選べますよね?
あれをユーザが0から100の値で選べるようにするにはどういうコードを書いたらいいんでしょうか?

817 名前:デフォルトの名無しさん :2006/04/14(金) 19:32:11
>>816
スレ違い

818 名前:デフォルトの名無しさん :2006/04/14(金) 19:34:35
>>817
すいませんでしたorz

819 名前:デフォルトの名無しさん :2006/04/14(金) 19:58:43
>>816
http://pc8.2ch.net/test/read.cgi/tech/1144962549/1-4

820 名前:816 :2006/04/14(金) 20:11:17
>>819
ありがとうございます!

821 名前:デフォルトの名無しさん :2006/04/15(土) 11:46:33
boost::shared_ptrで質問です。

class hoge; // forward
boost::shared_ptr<hoge> PHoge;
class hoge
{
  [※1] owner;
  vector<PHoge> hoges;
};
こんなクラスがあるとき、
あるhogeオブジェクトAOwnerと、
AOwnerに所有されている、AOwnedがあるとき、
AOwnerのvector hogesに、AOwnedが入り、
AOwnedのownerにAOwnerを指すポインタを持ちたいとき
AOwnedのownerはweak_ptrにする必要があるのでしょうか?

boost::shared_ptrの循環参照の説明読んでたら頭が混乱してしまいました。

822 名前:デフォルトの名無しさん :2006/04/15(土) 12:37:50
ゲ製から誘導されて

あちこち探し回っても、的確な答えが見つからないので

C++の話だが、
SaveDigit(FILE* stream, int nData);
LoadDigit(FILE* stream, int* nData);
名前の通り、int型のファイル入出力を行う関数があるのだが、
COLORREFやDWORDやunsigned intをこの関数で保存したい場合、
当たり前だがキャストが必要になる。

このキャストの時、データは破壊されないのだろうか?
それとも、各型毎の関数を作るかテンプレート関数を作るべき?


823 名前:デフォルトの名無しさん :2006/04/15(土) 12:40:04
>>822
各型のサイズやビットパターンは環境依存

824 名前:デフォルトの名無しさん :2006/04/15(土) 12:54:24
>823
サンクス、危うく環境依存のバグを埋め込むとこだった…orz


825 名前:デフォルトの名無しさん :2006/04/15(土) 13:38:33
std::vector<Hoge> container;
boost::ptr_vector<Hoge> ptr_container;

containerからptr_containerに内容をコピーしたいのですが
std::copy(container.begin(), container.end(), std::back_inserter(ptr_container));
ではptr_container.push_back()がHoge*を要求するのでできません。
newしてpush_backするback_insert_iteratorを作る以外で何か方法ありませんか?
標準 or Boostにあるものを使って書ければベストなのですが。

826 名前:デフォルトの名無しさん :2006/04/15(土) 13:49:30
newする関数オブジェクトを書いてstd::transform

827 名前:デフォルトの名無しさん :2006/04/15(土) 13:51:45
using namespace boost::lambda;
std::transform(container.begin(), container.end(),
std::back_inserter(ptr_container), new_ptr<Hoge>(_1));

828 名前:825 :2006/04/15(土) 14:05:34
あ、transformですか。copyという事に執着してました。
push_backイテレータ作るよりはシンプルですね。
これで行きます。ありがとうございました。

829 名前:デフォルトの名無しさん :2006/04/15(土) 22:30:07
質問があるんですが、VC++とC++は違うんでしょうか?
いやですね、C++を学習するつもりで本を買ったのですがVC++を買ってました。
C++を学ぶならC++のやつを買いなおした方がいいでしょうか?

830 名前:デフォルトの名無しさん :2006/04/15(土) 22:44:34
>>829
ありゃ、マルチかい…。あっちに答えといたよ。

スレッドを立てるまでもない質問雑談スレ23
http://pc8.2ch.net/test/read.cgi/prog/1139729337/839

831 名前:デフォルトの名無しさん :2006/04/16(日) 22:11:16
オラに10日でC++ヲミニツケルチカラヲクレ

832 名前:デフォルトの名無しさん :2006/04/16(日) 22:15:10
>>831
つ精神と時の部屋

833 名前:デフォルトの名無しさん :2006/04/16(日) 22:20:27
831じゃないけどC++勉強したいけどどこから手をつけていいのか解らなくて
右往左往してる弱った....

834 名前:禿@ベル研究所 ◆HsptrkZmYk :2006/04/16(日) 22:24:29
まずは漏れの本を読め。
話はそれからだ。

835 名前:デフォルトの名無しさん :2006/04/16(日) 22:31:15
Cを知ってるなら簡単だろ
STLやクラスの高度な機能は後回し

836 名前:833 :2006/04/16(日) 23:47:41
ループとか標準関数とかはわかったけど
ここからどうすればいいの?
何かね課題みたいにプログラム作りたいんだけど
なんかいい例ない?1万ステップぐらいのやつがいいんだけど

837 名前:デフォルトの名無しさん :2006/04/16(日) 23:57:30
だれかヘルプミー。

g++ 3.4.4 (cygwin special)で以下のコードをコンパイルしたら、

#include <fstream>

bool pattern::read(std::ifstream& ifs)
{
  int w;
  ifs >> w;
}

こんなエラーがでました。

pattern.cpp: In member function `bool pattern::read(std::ifstream&)':
pattern.cpp:39: error: no match for 'operator>>' in 'ifs >> w'

intに対しては operator>> は(cinと同様に)定義されてると思うんだけど……。
なんか不味いことしてますか?

838 名前:デフォルトの名無しさん :2006/04/17(月) 00:27:20
>>837
そのコードは pettern の宣言が無いというエラーになった。

エラーの出るソースはそれだけじゃないだろ。
問題が再現できるコードをちゃんと作れ。

839 名前:837 :2006/04/17(月) 00:53:23
>>838
すみませんでした。正確には以下の通りです。

#include <iostream>

class pattern{
public:
  bool read(std::ifstream&);
};

bool pattern::read(std::ifstream& ifs)
{
  int w;
  ifs >> w;
}


840 名前:デフォルトの名無しさん :2006/04/17(月) 00:55:27
>>839
× iostream
○ fstream

再現コード作ってるときに気付くのが、よくあるパターンなんだがな。

841 名前:デフォルトの名無しさん :2006/04/17(月) 00:57:28
>>836
1万ステップは無いと思うが、課題が欲しいなら↓こんなスレがある。

C/C++の宿題を片付けます 63代目
http://pc8.2ch.net/test/read.cgi/tech/1143405137/

842 名前:デフォルトの名無しさん :2006/04/17(月) 01:05:56
>>840
うう、ifstreamは<fstream>ですね。
恐ろしく凡ミスに答えてくださってアリガトウございます。
全くお恥ずかしい限りで……。


843 名前:デフォルトの名無しさん :2006/04/17(月) 04:58:33
new ch[10];

などとして確保したバッファ領域にデータを代入した後、そのデータはそのままに、
おしりに、さらに10バイト分のデータを追加したい場合、Cだと realloc()で、代入
データをそのままに、メモリー領域を拡大できますが、new した場合はそのような
事はできませんか?

できない場合は、別途 20バイト分newして、そこにそれぞれをコピーして繋げる
しかないでしょうか?


844 名前:デフォルトの名無しさん :2006/04/17(月) 04:59:04
new ch[10] -> new char[10]の間違いでした。

845 名前:デフォルトの名無しさん :2006/04/17(月) 05:28:34
>>843
その通り。realloc()を使わない方が良いのは、delete演算子で
デストラクタが働く事があるためです。

846 名前:デフォルトの名無しさん :2006/04/17(月) 05:29:25
いや、むしろ
×realloc()を使わない方が良いのは
○realloc()を使ってはいけないのは

847 名前:デフォルトの名無しさん :2006/04/17(月) 08:53:06
>>843
先ずはnew/deleteを使う戦略を見直す。
例えば、vectorなら何も悩む必要がなくなる。

848 名前:デフォルトの名無しさん :2006/04/17(月) 09:36:58
一応デストラクタを自前で呼ぶ事もできるけど、
そこまでパフォーマンスを追求する(realloc を使う)必要性があるか、だな。

849 名前:デフォルトの名無しさん :2006/04/17(月) 19:24:35
>>841
そこほとんどCじゃんw
たまに、悪ふざけしているような回答者がC++でコード書いてるけど

というか、まあ、どうやって身に付ければいいんだろうね
おれは適当に本読んで、プログラム書いたりしてるけど
細かいところの知識があちこち欠けている気がする
ADLとか

850 名前:デフォルトの名無しさん :2006/04/17(月) 19:27:43
まともでそこそこなアプリ作ろうとしたら軽く1万いきそうだけど・・・

851 名前:デフォルトの名無しさん :2006/04/17(月) 19:33:34
>>849
それを題材としてC++で組め、っていう話だろう・・・

852 名前:デフォルトの名無しさん :2006/04/17(月) 23:25:41
Aというクラスがあったとして、
A* pa1 = new A();
A* pa2 = new A;
この2つの命令に何か違いはあるのでしょうか。

同じ意味だとは思うんですが、確信が持てないです。
ちょっとした違いでもあれば教えて下さい。

delete pa1;
delete pa2;

853 名前:デフォルトの名無しさん :2006/04/17(月) 23:41:28
>>852
前者は0フィル。
後者はデフォルト・コンストラクタが呼ばれる。

854 名前:デフォルトの名無しさん :2006/04/17(月) 23:42:22
あ。もちろん前者も0フィルの後デフォルト・コンストラクタが呼ばれる。

855 名前:デフォルトの名無しさん :2006/04/17(月) 23:48:36
0で初期化なんてあったっけ?

856 名前:852 :2006/04/17(月) 23:56:12
>>853
実際に試してみたんですが、どちらも初期化されてませんでした。
C++言語仕様ではそうなっていて、私の環境では仕様に沿ってない実装ってことになるのでしょうか。

それとも他の意味があるのかな。

857 名前:デフォルトの名無しさん :2006/04/17(月) 23:56:39
C#と混同してるんだろ。

858 名前:852 :2006/04/18(火) 00:01:36
確かに、C#はフィールドを初期化しますね。
なかなか素敵な言語仕様です。

結局、上で挙げた2つは全く同じだ、ということになるんですかね。

859 名前:デフォルトの名無しさん :2006/04/18(火) 00:01:52
§5.3.4.15
15 A new-expression that creates an object of type T initializes that object as follows:
. If the new-initializer is omitted:
. If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is defaultinitialized
(8.5). If T is a const-qualified type, the underlying class type shall have a user-declared
default constructor.
. Otherwise, the object created has indeterminate value. If T is a const-qualified type, or a (possibly
cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of
const-qualified type, the program is ill-formed;

という事で、非POD型はデフォルト・コンストラクタ、POD型は不定値。

860 名前:デフォルトの名無しさん :2006/04/18(火) 00:04:52
追加

. If the new-initializer is of the form (), the item is value-initialized (8.5);
. If the new-initializer is of the form (expression-list) and T is a class type, the appropriate constructor is
called, using expression-list as the arguments (8.5);
. If the new-initializer is of the form (expression-list) and T is an arithmetic, enumeration, pointer, or
pointer-to-member type and expression-list comprises exactly one expression, then the object is initialized
to the (possibly converted) value of the expression (8.5);
. Otherwise the new-expression is ill-formed.

で、§8.5を見てみると・・・・

8 [Note: since () is not permitted by the syntax for initializer,
X a();
is not the declaration of an object of class X, but the declaration of a function taking no argument and
returning an X. The form () is permitted in certain other initialization contexts (5.3.4, 5.2.3, 12.6.2). ]


861 名前:デフォルトの名無しさん :2006/04/18(火) 00:09:10
5 To zero-initialize an object of type T means:
. if T is a scalar type (3.9), the object is set to the value of 0 (zero) converted to T;
. if T is a non-union class type, each nonstatic data member and each base-class subobject is zeroinitialized;
. if T is a union type, the object’s first named data member89) is zero-initialized;
. if T is an array type, each element is zero-initialized;
. if T is a reference type, no initialization is performed.
To default-initialize an object of type T means:
. if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is
ill-formed if T has no accessible default constructor);
. if T is an array type, each element is default-initialized;
. otherwise, the object is zero-initialized.
To value-initialize an object of type T means:
. if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is
called (and the initialization is ill-formed if T has no accessible default constructor);
. if T is a non-union class type without a user-declared constructor, then every non-static data member
and base-class component of T is value-initialized;

という事で、A()の形は非POD型はデフォルト・コンストラクタ、POD型はzeroで初期化される。
ここがAという形とは違う唯一の点か。

862 名前:デフォルトの名無しさん :2006/04/18(火) 00:15:10
ごめん>>860は不要。>>859>>861だけ見てね。

#include <iostream>

struct A {
int a;
};

int main()
{
int* pi1 = new int();
int* pi2 = new int;
A* pa = new A();
A* pb = new A;

std::cout << *pi1 << std::endl; // ここだけ必ず 0
std::cout << *pi2 << std::endl;
std::cout << pa->a << std::endl;
std::cout << pb->a << std::endl;

delete pb;
delete pa;
delete pi2;
delete pi1;
}


863 名前:852 :2006/04/18(火) 00:21:46
なるほどなるほど。
これからは、new intに()をつけようって思いました。
ありがとうございました。

864 名前:デフォルトの名無しさん :2006/04/18(火) 00:35:30
#include <iostream>

struct A {
int a;
};

struct B {
int b;
void print() const {
std::cout << b << std::endl;
}
private:
virtual void f() {} // 非PODにする
};

int main()
{
int* pi1 = new int();
int* pi2 = new int;
A* pa = new A();
A* pb = new A;
B* pa2 = new B();
B* pb2 = new B;

std::cout << *pi1 << std::endl; // ここは必ず 0
std::cout << *pi2 << std::endl;
std::cout << pa->a << std::endl; // ここも必ず 0
std::cout << pb->a << std::endl;

pa2->print(); // もはや0である保証はない
pb2->print();


865 名前:デフォルトの名無しさん :2006/04/18(火) 00:35:43

delete pa2;
delete pb2;
delete pb;
delete pa;
delete pi2;
delete pi1;
}


866 名前:デフォルトの名無しさん :2006/04/18(火) 00:42:49
俺も知らなんだ。

便乗して

char p[] = "123456";
new(p) char[3](); // 先頭3つだけ0にセット

これもあり?

867 名前:デフォルトの名無しさん :2006/04/18(火) 01:49:42
>>863
そもそもintをnewすることがナンセンス。

868 名前:デフォルトの名無しさん :2006/04/18(火) 01:50:54
>>866 おk

#include <iostream>
#include <algorithm>

void print(int i) {
std::cout << i << ' ';
}

int main()
{
char p[] = "123456";
new(p) char[3](); // 先頭3つだけ0にセット

std::for_each(p, p + sizeof(p), print);
}


869 名前:デフォルトの名無しさん :2006/04/18(火) 01:56:34
配置newってdeleteしなくていいの?

870 名前:デフォルトの名無しさん :2006/04/18(火) 02:09:59
>>869
配置newで配置したオブジェクトがデストラクタを持っている時だけ
呼び出す必要がある。

というか、char[3]ってデストラクタないでしょう。呼び出したくても
呼び出せない。

871 名前:デフォルトの名無しさん :2006/04/18(火) 02:14:24
まさか delete p; したいとか?
そんな事は思ってないよね?

872 名前:833 :2006/04/18(火) 02:20:17
delete char[3] したいです。
new char[3]できるからしたいです

873 名前:デフォルトの名無しさん :2006/04/18(火) 02:34:03
>>872
やっても構わないけど、undefinedだよ。鼻から悪魔が出てくるかも。

new char[3] と new(p) char[3] の違いをもう一度調べてみよう。

874 名前:デフォルトの名無しさん :2006/04/18(火) 04:18:19
>>862
> std::cout << pa->a << std::endl;
↑ここも必ず 0 じゃね?

>>864
> pa2->print(); // もはや0である保証はない
↑ここも必ず 0 じゃね?
new B() は "value-initialized" で B は
"a class type with a user-declared constructor" じゃなくて
"a non-union class type without a user-declared constructor" だから
pa2->b は "value-initialized" → "zero-initialized" で 0 になるだろ。

875 名前:デフォルトの名無しさん :2006/04/18(火) 04:59:51
型を返す非static関数は書けますか?

876 名前:デフォルトの名無しさん :2006/04/18(火) 05:11:07
>>875 「型を返す」の意味がわからん。

877 名前:デフォルトの名無しさん :2006/04/18(火) 05:21:33
>>874
そう思うならやってみろや。
わざわざ仮想関数を入れてnon-PODにしている意味がわからないのか?

878 名前:デフォルトの名無しさん :2006/04/18(火) 09:08:41
>>875
直接に型は返せないが、
ポリモーフィズムや列挙型を使って
それなりのことはできる。

879 名前:デフォルトの名無しさん :2006/04/18(火) 09:11:10
そこでthisポインタをthrowですよ。

880 名前:デフォルトの名無しさん :2006/04/18(火) 09:13:56
お前等エスパーだな。

881 名前:デフォルトの名無しさん :2006/04/18(火) 09:18:04
オブジェクトへの参照を返しながら
そのオブジェクトをこっそり delete するのって、
登り掛けてる人のハシゴはずすみたいで
いたずらっぽくて楽しいよな。

882 名前:デフォルトの名無しさん :2006/04/18(火) 09:25:09
>>879
型が分からなければcatchできないのでは?


883 名前:デフォルトの名無しさん :2006/04/18(火) 09:26:49
>>879
パフォーマンスを度外視すれば確かに
型を返したと言えるね。

884 名前:876 :2006/04/18(火) 09:39:17
自己解決しましたwww

885 名前:デフォルトの名無しさん :2006/04/18(火) 10:02:54
>>875
type_info か?

886 名前:デフォルトの名無しさん :2006/04/18(火) 10:09:51
>>877
とりあえず g++ でやってみたら全部 0 になったわけだが。
規格の話をしてるんだから、自分の持ってるコンパイラの
実験結果がわかっても意味無いだろ。

POD かどうかは "a class type with a user-declared constructor" にも
"a non-union class type without a user-declared constructor" にも関係ないから
意味がわからん。

887 名前:デフォルトの名無しさん :2006/04/18(火) 10:26:38
>>885
あまりにも使わないので、存在を忘れかけていた。

888 名前:デフォルトの名無しさん :2006/04/18(火) 10:31:06
型情報じゃなく、型そのものを返す関数やクラスは作成できないものか、という意味でした。
考えてたら夜があけてしまい、2chに質問書いて寝ていま起きましたスンマセン


889 名前:886 :2006/04/18(火) 10:38:39
struct A
{
  int a;
// virtual ~A();
};
A* f() { return new A(); }

こんなコードのアセンブリ吐かせてみた。
cygwin gcc 3.4.4 では non-POD にすると a は初期化されなかった。

とりあえず、 value-initialized に頼るのはまだまだ危険みたいだな。
だれか他のコンパイラの対応状況をレポートしてくれると助かる。

890 名前:デフォルトの名無しさん :2006/04/18(火) 10:39:48
>>888 だから、意味がわかんねぇって。 C++ でおk

891 名前:デフォルトの名無しさん :2006/04/18(火) 10:56:16
型は返せません、以上。

892 名前:デフォルトの名無しさん :2006/04/18(火) 11:02:05
template でメタプログラミングしてることも考えると、そうとも言い切れない。
875 や 888 は、絶対違うだろうけど。

893 名前:デフォルトの名無しさん :2006/04/18(火) 11:17:57
>>888
どういう使いかたを想定している?

894 名前:デフォルトの名無しさん :2006/04/18(火) 11:30:34
多分、こんな使い方を想定してるんだろう。

type foo() {
 return int;
}

type t = foo();
t n = 0;
cout << n << endl;

まあ、直接は無理だな。
近い事はできるかもしれんが。

895 名前:デフォルトの名無しさん :2006/04/18(火) 11:34:32
実はファンクタを作りたいだけだったりして。

896 名前:デフォルトの名無しさん :2006/04/18(火) 11:41:56
>>894
衝動的に MP に置き換えてみたが、面白くなかった。

struct foo {
 typedef int type;
};

typedef foo::type t;
t n = 0;
cout << n << endl;

897 名前:デフォルトの名無しさん :2006/04/18(火) 11:46:21
#include <iostream>
#include <memory>

class FooType {
public:
 virtual void run() = 0;

protected:
 template <typename type> static void body() {
  type n = 0;
  std::cout << n << std::endl;
 }
};

template <typename type> class FooTypeRet : public FooType {
public:
 virtual void run() {
  body<type>();
 }
};

std::auto_ptr<FooType> foo() {
 std::auto_ptr<FooType> type(new FooTypeRet<int>);
 return type;
}

int main() {
 std::auto_ptr<FooType> type = foo();
 type->run();
}

近いと言えば近いのかもしれないコード。

898 名前:デフォルトの名無しさん :2006/04/18(火) 12:30:45
VC++6でSHORT型の配列1000個を持っているクラスのインスタンスを1ギガ分くらい確保したいのですが、何故か動きません。
*P=NEW CLASS1[500000]

2*30000 600MBなら取れるのですがそれ以上になると落ちます。

助けてください

899 名前:デフォルトの名無しさん :2006/04/18(火) 12:50:41
C++標準にSHORTやNEWなんてのはありません。
スレ違い。

900 名前:デフォルトの名無しさん :2006/04/18(火) 12:57:15
shortとnewは標準C++規約じゃなかったんですね。


901 名前:デフォルトの名無しさん :2006/04/18(火) 12:59:57
>>900 キーワードは case sensitive です。

902 名前:デフォルトの名無しさん :2006/04/18(火) 13:10:23
自分で解決してみます。携帯なんでめんどい

903 名前:デフォルトの名無しさん :2006/04/18(火) 13:36:30
アセンブラ部分に別変数を噛ませたら解決しました

904 名前:デフォルトの名無しさん :2006/04/18(火) 14:28:19
最後までスレ違いには気付かないわけだな

905 名前:デフォルトの名無しさん :2006/04/18(火) 15:18:44
PentiumDのマシンを買うことを検討しているのですが
gccなどで、両方のコアに計算させたいと考えています。

コンパイラオプションなどで簡単に処理を分散させることはできるでしょうか?
あるいは、それぞれのコアに分担を割り振る命令がC++のコードレベルで必須と
なるでしょうか。

よろしくお願いします。

906 名前:デフォルトの名無しさん :2006/04/18(火) 15:45:17
スレッド分ければ勝手にやってくれるんじゃね?

ちなみにオレはデュアルコアが欲しくて仕方ないんだが、
あと半年なんとか我慢して待つつもり。

907 名前:デフォルトの名無しさん :2006/04/18(火) 16:21:06
漏れは Vista SP1 待ち。
あと2年はあたらしいPC買えそうにもない

908 名前:905 :2006/04/18(火) 16:43:42
>>906
ttp://www1.jp.dell.com/content/topics/segtopic.aspx/misc/dm/wb2_landing?c=jp&l=jp&s=bsd&~tab=3
> PentiumD 820 (2.80GHz)
> 512MBメモリ
> 80GB HDD
送料込みで29980円なので、やすいかなと思い検討しています。

単純だけれど、とてもでかい配列の計算です。
なるべくスレッドを分けたりしたくないのですが、やはり難しいでしょうか。

或いはこの用途では
PentiumD 820 (2.80GHz)は
Pentium4 521(2.80GHz)に比較し殆どアドバンテージがないと考えてよいでしょうか?

909 名前:デフォルトの名無しさん :2006/04/18(火) 16:45:30
>>905
>コンパイラオプションなどで簡単に処理を分散させることはできるでしょうか?
>あるいは、それぞれのコアに分担を割り振る命令がC++のコードレベルで必須と
>なるでしょうか。
後者
マルチスレッド
マルチプロセス
あたりがキーワード


910 名前:905 :2006/04/18(火) 16:53:48
>>909
後者とのこと
ありがとうございます。
キーワード含め、もう少し調べてみます。

911 名前:905 :2006/04/18(火) 17:15:23
http://jp.xlsoft.com/documents/intel/compiler/525J-001.pdf
のpage10 
5.1.自動並列化
のあたりを読むと、コンパイラオプション(linuxの場合、-parallel指定)にて
並列化される可能性があることがわかりました。

自動並列化により、ループ内の処理がコード的に分割される様子もわかりました。
gccで対応しているかわかりませんが、可能性があることがわかりました。

912 名前:デフォルトの名無しさん :2006/04/18(火) 17:35:59
無料かつOpenMPで並列化するのならWindows環境だとVC++2005Expressが一番楽だぞ。
LinuxならICCが無料で使える。gompは・・・まあ、ね。

913 名前:905 :2006/04/18(火) 18:29:54
>>912
ありがとうございます。
ICCいいですね。

あと
GCCも4.2でOpenMP対応するとの説もあるようで、先が楽しみです。

みなさま、ありがとうございました。

914 名前:デフォルトの名無しさん :2006/04/18(火) 20:43:03
>>898
VC6 やとデフォで nothrow ちゃうか?

915 名前:デフォルトの名無しさん :2006/04/18(火) 20:44:38
>>905
CPU アフィニティは OS のシステムコールで制御するものなんで
このスレで話せることは少なそうだな

916 名前:デフォルトの名無しさん :2006/04/19(水) 00:24:01
>>905
PentiumDは爆熱騒音の原因になる地雷CPU。
急ぎじゃなければ7月以降に出る予定になっているConroeコアのCPU、
が搭載されたPCにした方がいいと思うぞ。

まぁ、発売時期が明確になっていないのが難点だが。

■Quake 4で1.5倍,F.E.A.R.で1.7倍!?Pentium Dより圧倒的に高速なConroe
ttp://www.4gamer.net/news/history/2006.04/20060406232305detail.html

917 名前:833 :2006/04/19(水) 01:07:16
6/7日発売だよ焜炉
自作板の情報だからまぁほぼ確定だと思うよ

918 名前:デフォルトの名無しさん :2006/04/19(水) 01:15:25
template <class T>
class Hoge : Hogehoge<T> {
    ...
};
このようなクラスがあったとき、Hoge のコンストラクタのイニシャライザで
@Hoge(int x) : Hogehoge(x) { ... }
AHoge(int x) : Hogehoge<T>(x) { ... }
とするのではどちらが正しいのですか?
VC8では両方、g++3.4ではAがコンパイル通ったのですが

919 名前:デフォルトの名無しさん :2006/04/19(水) 01:27:52
A

920 名前:デフォルトの名無しさん :2006/04/19(水) 03:36:22
namespace LLNN = LongLongNamespaceName;
上の様な分って重なっても大丈夫なのでしょうか?
例えば、
a.h
namespace LongLongNamespaceName {ほげ}
namespace LLNN = LongLongNamespaceName;

b.h
#include "a.h"
namespace LongLongNamespaceName {はげ}
namespace LLNN = LongLongNamespaceName;
上の場合、b.hでnamespace LLNN = LongLongNamespaceName;の部分がa.hのそれと
ダブってしまうと思うのですが

921 名前:デフォルトの名無しさん :2006/04/19(水) 03:48:51
いいよ。
っていうか試してみたらすぐ分かると思うが

922 名前:デフォルトの名無しさん :2006/04/19(水) 19:04:00
template <class T>
class C {
public:
    T& getT() { return t_; }
private:
    T t_;
};
template <class T>
class D : public C<T> {
public:
    T& f() { return getT(); }
};
上記のコードをg++3.2でコンパイルしたところ、
Main.cpp: In member function `T& D<T>::f()':
Main.cpp:11: error: there are no arguments to `getT' that depend on a template parameter, so a declaration of `getT' must be available
Main.cpp:11: error: (if you use `-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
とエラーが出ました。私にはどこも間違っているように見えないのですが、これはg++のバグでしょうか?
それとも上記のコードにどこか間違いがあるのでしょうか?

923 名前:デフォルトの名無しさん :2006/04/19(水) 19:12:43
>>922
Dの基底であるC<T>はテンプレート引数であるTに依存しているから
Dのコンパイル時点では型が確定していないのでgetTを持つかどうかが不明。よってエラー。
ってことらしい。

924 名前:デフォルトの名無しさん :2006/04/19(水) 19:19:09
>>922
言い忘れた。
this->getT()やC<T>::getT()と明示的に呼ぶか
適当な所でusing C<T>::getT;を入れればOKっぽい。

925 名前:デフォルトの名無しさん :2006/04/19(水) 19:40:29
>>924
ありがとうございます
教えていただいた方法で問題は解決出来たのですが、
>Dのコンパイル時点では型が確定していないのでgetTを持つかどうかが不明。
というのがよく理解できませんでした。
Tの如何に関わらず、C<T>はgetTを持つので、C<T>からpublicに派生する
Dも当然getTを持つと思うのですが・・

926 名前:デフォルトの名無しさん :2006/04/19(水) 19:50:15
>>925
テンプレートの解釈は、二段階の名前解決をふむ。
最初は、Nondependentな名前のみが解決され、
インスタンス化されるときに、Dependetな名前が解決される。
Two-Phase Lookupという。
Dependentは、簡単に言うとテンプレートがかかわるもの。

たとえば、グローバルにgetT()という関数があったらどうなる?
当然、こっちのほうを呼び出すべき。
VCとかは、インスタンス化されるときに、すべての名前を解決するから、
>>922のようなコードでも、問題なく通ってしまう。



927 名前:デフォルトの名無しさん :2006/04/19(水) 19:51:51
>>925
この説明がわかりやすいかな。

ttp://www.codeproject.com/cpp/TwoPhaseLookup.asp

928 名前:デフォルトの名無しさん :2006/04/20(木) 09:27:44
Win32 APIでよくあるA/Wを吸収するマクロは型の場合、typedefでも代用できますか?

#ifdef UNICODE
typedef CHogeA CHoge;
#else
typedef CHogeW CHoge;
#endif

929 名前:デフォルトの名無しさん :2006/04/20(木) 09:39:32
>>928
可能、というよりWinAPIでもTCHAR型は

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

となっているはず

930 名前:デフォルトの名無しさん :2006/04/20(木) 09:50:25
>>929
どうも有り難うございます。
てっきり#defineだけかと思ってました。

931 名前:デフォルトの名無しさん :2006/04/20(木) 15:25:14
A/Wの区別って、引数リストで区別できないの?

932 名前:デフォルトの名無しさん :2006/04/20(木) 15:42:53
>>931
APIはC++だけのものじゃないので無理。

933 名前:デフォルトの名無しさん :2006/04/20(木) 15:52:38
boost::ptr_vectorには何故resizeが無いのでしょうか?

934 名前:デフォルトの名無しさん :2006/04/20(木) 15:55:24
>>933
つ[boostスレ]

935 名前:デフォルトの名無しさん :2006/04/20(木) 18:38:17
>>931
GetWindowTextA/Wのように引数や戻り値まで全く同じものがある。
それでもC++ならテンプレートの特殊化でどうにかできるけれどさ。

936 名前:デフォルトの名無しさん :2006/04/20(木) 18:54:06
C++のオーバーロードでは、GetCommandLineは区別できないな

937 名前:デフォルトの名無しさん :2006/04/20(木) 20:04:57
ファイルの文字を一文字ずつ取得したくて
while (!ifstr.eor()) { // ifstr = ifstream
char ch;
ifstr >> ch;
cout << ch;
}
と書いたのですが、何故か改行が表示されなかったので、今度は
while (!ifstr.eor() {
std::cout << (char)ifstr.get();
}
としたら今度は一番最後に変な文字(見たところ値は-1のようです)が表示されるようになりました。
どうすれば私のしたいことが出来るようになるのか教えてください

938 名前:デフォルトの名無しさん :2006/04/20(木) 20:19:09
とりあえず、chはループの外で宣言な。

939 名前:デフォルトの名無しさん :2006/04/20(木) 20:22:37
getして
初めて気づく
俺EOF

940 名前:デフォルトの名無しさん :2006/04/20(木) 21:30:14
エオフ

941 名前:デフォルトの名無しさん :2006/04/20(木) 21:37:09
独習C++という本の12章の理解度チェックの問題4
の解答をコンパイルしてみたらエラーで動きません。
警告も出ています。

警告の内容は以下のとおりです
c:\一鉄\趣味\ゲーム作成\勉強\TeachYourselfC++\12-check-4.cpp(45) : warning C4541: 'typeid' が /GR- を使用したポリモーフィック型 'A' で使用されています; 動作結果は保証されません。
c:\一鉄\趣味\ゲーム作成\勉強\TeachYourselfC++\12-check-4.cpp(47) : (省略)
c:\一鉄\趣味\ゲーム作成\勉強\TeachYourselfC++\12-check-4.cpp(49) : (省略)

警告だけで、エラーではないのでコンパイルは出来ます。
ですが実行時になってからエラーが表示されます
それの内容は
This Application has requested the Runtime to terminate it in an unsual way.
Please contact the application's support tema for more information.

です。
いろいろためしてみると
myclassというクラスとそのクラス型のobjというオブジェクトがあったとすると
typeid(obj)は機能するのですが
typeid(myclass)は機能しません。

だれかどうすればいいか分かる方はいませんか?
長々とすいませんですた


942 名前:デフォルトの名無しさん :2006/04/20(木) 21:43:37
>>941
コンパイラによっては、RTIIを使う際コンパイラオプションで
RTIIを使うことを指定しないといけないことがある。

943 名前:デフォルトの名無しさん :2006/04/20(木) 21:44:09
一鉄w

944 名前:デフォルトの名無しさん :2006/04/20(木) 21:50:12
一鉄打ち込んだソースみせてくれよ

945 名前:デフォルトの名無しさん :2006/04/20(木) 21:57:40
>>942
細かいことなんだが、実行時型情報はRTTIじゃなかったか?

946 名前:デフォルトの名無しさん :2006/04/20(木) 22:50:13
run time type informations

947 名前:デフォルトの名無しさん :2006/04/20(木) 23:30:33
>>943-944
orzOLT

948 名前:デフォルトの名無しさん :2006/04/20(木) 23:31:21
>>942
どうもです^^

949 名前:デフォルトの名無しさん :2006/04/21(金) 04:41:40
run time type identification?

950 名前:デフォルトの名無しさん :2006/04/21(金) 07:20:35
information

951 名前:デフォルトの名無しさん :2006/04/21(金) 09:48:04
string型に格納されている文字列の
一番最後の文字を取るにはどうすれば良いですか?
vectorとかならback()で取れるんですが・・

952 名前:デフォルトの名無しさん :2006/04/21(金) 10:10:12
*str.rbegin()
str[str.size() - 1]
*(str.begin() + str.size() - 1)
*(--str.end())

953 名前:デフォルトの名無しさん :2006/04/21(金) 11:28:20
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#534

954 名前:デフォルトの名無しさん :2006/04/21(金) 13:06:18
>>938
えっ!?

955 名前:デフォルトの名無しさん :2006/04/21(金) 13:07:07
そろそろ次スレ。
テンプレにある cuj のリンクどうする?

956 名前:デフォルトの名無しさん :2006/04/21(金) 16:18:45
>>953
>OK, we all know std::basic_string is bloated and already has way too many members.
書き出しがこれかよwww

957 名前:デフォルトの名無しさん :2006/04/21(金) 17:50:02
C++98→C++03の変更は細かい修正だけと聞いていますが、
その差分だけまとめた文書はないでしょうか?
双方もっているのですが、自分で調べるのは大変なので。

958 名前:デフォルトの名無しさん :2006/04/21(金) 23:13:36
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html

のページで "Status: TC" という語で検索する

959 名前:957 :2006/04/22(土) 09:01:55
ありがトン

960 名前:デフォルトの名無しさん :2006/04/23(日) 12:10:55
あふぉぢゃねーの

961 名前:デフォルトの名無しさん :2006/04/25(火) 14:09:13
fread(3)とかの3って引数の数?manの3?
どっちが一般的?

962 名前:デフォルトの名無しさん :2006/04/25(火) 14:19:00
manの3。ライブラリだぜということ。UNIX以外では意味ない。
引数の数で使うことはない。
それからスレ違い。

963 名前:デフォルトの名無しさん :2006/04/25(火) 16:47:17
std::vectorやstd::map等のコンテナについてなんですが
begin(), end()や、イテレータの代入・インクリメント・デクリメント等の操作で
例外がthrowされる可能性はあるんでしょうか?

964 名前:デフォルトの名無しさん :2006/04/25(火) 16:51:43
begin() end() それぞれの operator についてソースを読めば?

965 名前:デフォルトの名無しさん :2006/04/25(火) 16:53:00
いや、実装依存の話じゃなく規格で定められているのかなと。

966 名前:デフォルトの名無しさん :2006/04/25(火) 17:54:09
それこそ規格書読めばという話になるが

967 名前:デフォルトの名無しさん :2006/04/25(火) 18:33:34
>>963
禿本Special Editionの付録Eを読んで。
今手元にないからアレだけど。

968 名前:デフォルトの名無しさん :2006/04/25(火) 18:55:46
規格書持ってないんで
ttp://www.kuzbass.ru/docs/isocpp/
ここで調べたけど書いてないみたい。

969 名前:デフォルトの名無しさん :2006/04/25(火) 19:03:13
強い保証と非送出保証が書かれてないものは規格的に未定義。

970 名前:デフォルトの名無しさん :2006/04/27(木) 14:44:11
ifstreamでテキストファイルを読み込む場合なんですが、
一度目は問題なく読み込めるんですが、
同じ作業中にもう一度同じファイルを読み込もうとした場合、
ちゃんと読み込めないことがあるんですが、どうなってるんでしょう?

971 名前:デフォルトの名無しさん :2006/04/27(木) 15:01:46
「ちゃんと読み込めない」を具体的に

972 名前:デフォルトの名無しさん :2006/04/27(木) 15:10:50
foo970(char *filename) {
  ifstream file1(filename);
   :
   :
  //←なぜかクローズしてない
  ifstream file2(filename);
  readline(line); // ちゃんと読み込めない
}


973 名前:970 :2006/04/27(木) 15:10:56
ファイルのオープンはできてるんですが、
文字をどうも文字化けを起こした状態で読み込んでしまっているようです。
必ず起こるわけではなく、時折繰り返しているうちに起こります。

974 名前:970 :2006/04/27(木) 15:12:57
クローズはきちんと行ってます。

975 名前:デフォルトの名無しさん :2006/04/27(木) 15:13:50
最初に開いたファイルに書き込みとかしてるの?

976 名前:970 :2006/04/27(木) 15:14:12
書き込みはしてません。読み込むだけです。

977 名前:デフォルトの名無しさん :2006/04/27(木) 15:16:28
読めないファイルとコードを晒してくれたほうが早いな

978 名前:デフォルトの名無しさん :2006/04/27(木) 15:18:22
とりあえず、open出来たかどうかとか、読み込み成功したかとかは
is_open(), good()とかで確認してる?

979 名前:970 :2006/04/27(木) 15:19:17
丸コピでスマソ。
fi.open(fileChar, ios::in | ios::binary);
if (fi){
while(charaNum < 100){
charaNum++;
fi.seekg(1, ios::cur);
}
fi.seekg(0, ios::beg);

while(!fi.eof()) //ファイルの最後にきたら終了
{
sprintf(cha2, "%s", cha1);
fi.read(cha1, 1);
sprintf(chan, "%s%s", cha2, cha1);
if (strcmp(chan, "le") == 0){//改行
strs.erase(strs.end() - 1);
strvec.push_back(new string(strs, 0, strs.size()));
strs = "";
fi.seekg(2, ios::cur);
}else{
strs.append(cha1);//文字を保存
}
}
fi.getline(chars, 255);
strvec.push_back(new string(chars));
}
fi.close();


980 名前:デフォルトの名無しさん :2006/04/27(木) 15:23:39
つバッファオーバーフロー

981 名前:デフォルトの名無しさん :2006/04/27(木) 15:31:04
初期化してないcha1の使いまわしでcha2が溢れてるだけじゃねーの?

982 名前:970 :2006/04/27(木) 15:32:19
再度読み込む際は、これのあるオブジェクトごとdeleteしてるので、
バッファオーバーフローは無いと思うんですが。
一応格納する文字列のサイズは読み込む際は毎回0になってます。

983 名前:970 :2006/04/27(木) 15:33:19
sprintf(cha1, "");
sprintf(cha2, "");
で一応初期化はしてます。

984 名前:デフォルトの名無しさん :2006/04/27(木) 15:33:33
chaではじまる変数の宣言と読み込もうとしたファイルのサイズも晒せ

985 名前:970 :2006/04/27(木) 15:37:15
vector<string*> strvec;//ファイル内容行ごとに格納
string strs;//一行読み込み
int charaNum;//文字数
char cha;
char cha1[2];
char cha2[2];
char chan[4];
char fileChar[100];
ifstream fi;//ファイル入力
ファイルサイズは34.6kb〜65.9kbです。

986 名前:デフォルトの名無しさん :2006/04/27(木) 15:48:50
sprintf(cha1, "");がまずい

最初の一バイト目だけ'\0'で初期化されるけど、ニバイト目にはゴミが入ってる可能性がある。
fi.read(cha1, 1); で一バイト目に文字を入れたのはいいけど、ニバイト目に運良く'\0'が入っていれば次の
sprintf(chan, "%s%s", cha2, cha1); で期待通りの動作になる。

でも、ニバイト目に'\0'じゃないなにか ('A'とか)がはいってると
sprintf(chan, "%s%s", cha2, cha1); で readで読んだ一文字目 + 'A' + '\0'が現れるまで延々と続く
ゴミ文字列がchanにコピーされる

chanのサイズが4バイト分しかないんで、3文字+'\0'を越える長さの文字列を入れると悲しいことが起こる。

readした直後に cha1[1] = '\0';とかやっとけば問題ない

二文字目にたまたま何が入ってるかは、おまいのプログラムのつくりによるんだが
一回目は'\0'が入ってて、二回目以降は違うものが入ってるんだと思う


987 名前:970 :2006/04/27(木) 16:09:04
ありがとうございました。
おかげ様で上手く行きそうです。
助かりました。
こんな落とし穴があったとは。

988 名前:デフォルトの名無しさん :2006/04/27(木) 17:57:09
std::ifstreamやofstreamなどのファイルストリームが
デストラクタで自動的にcloseされるようになっていない
のには何か理由があるのですか?

989 名前:デフォルトの名無しさん :2006/04/27(木) 20:24:00
>>988
デストラクタでcloseされるよ。

990 名前:デフォルトの名無しさん :2006/04/28(金) 01:13:15
>>970
最後まで読んでstd::ios::eofbitとかstd::ios::failbitが立ってしまってんだろ。

C++のファイルストリームは、Cとは違い、一度これらのフラグが立ったら、
自動ではクリアされない。そして、クリアしないと入出力が停止される。

clear()汁。

991 名前:デフォルトの名無しさん :2006/04/28(金) 07:47:59
俺の股間もよく failbit がたってしまいます。
clear() しても今度はすぐにストリームが空になって
eofbit たってしまいます。




992 名前:デフォルトの名無しさん :2006/04/28(金) 08:29:50
これだからスパゲティちんこは・・・

993 名前:デフォルトの名無しさん :2006/04/28(金) 08:32:04
>>991 は熱しやすく冷めやすい

994 名前:デフォルトの名無しさん :2006/04/28(金) 09:40:36
openできなくなるよりマシ

995 名前:デフォルトの名無しさん :2006/04/28(金) 09:45:58
(脳内)彼女のソケットも open できません。

996 名前:デフォルトの名無しさん :2006/04/28(金) 09:53:44
C++相談室 part49
http://pc8.2ch.net/test/read.cgi/tech/1146185570/

立てたから後頼む。俺ちょっと出かけるんで。すまん。

997 名前:デフォルトの名無しさん :2006/04/28(金) 10:04:30
STLつかうと一気に実行ファイルサイズが10倍に?!

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

999 名前:デフォルトの名無しさん :2006/04/28(金) 11:20:19
すげえ!うむごくろう

1000 名前:デフォルトの名無しさん :2006/04/28(金) 11:24:39
1000


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