[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/13 19:22 / Filesize : 243 KB / Number-of Response : 945
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part69



1 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:04:54 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part66
pc12.2ch.net/test/read.cgi/tech/1231640498/

※part63, part66 が重複していたようですので part69 としました。

641 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 21:11:30 ]
>>635
VC++ではマルチスレッド対策の効果を独自に付加している。
msdn.microsoft.com/en-us/library/12a04hfd.aspx
Unixだとマルチスレッドでvolatileなんて使うなボケらしいが。

const_castで外したくなる状況は分からない。

642 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 22:40:15 ]
誰も答えてやらない>>616のために
Visual C++ Express Editionでぐぐれ

643 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 22:44:10 ]
Visual C++ Express Editionを知った後にTurbo Cを使うなんて、、、地獄だ。。

644 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 22:45:14 ]
>>638, >>641
どうも、ほとんどアプリ系じゃ使わんということですな

>>641 の例じゃ普通はmutexやクリティカルセクション使うんじゃないの
それでvolatileを使うメリットがよく分らん,orz. コードが簡単になるがメリット?

645 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 23:24:24 ]
Effective C++でconst_castはoperator[]の定義で使うことがあるみたいに書いてあったよね?
ttp://ritaz.blog64.fc2.com/blog-entry-66.html
より引用。

class sample
{
public:
...;
const char& operator[](unsigned int position) const
{
...;
return dat[position];
}
char& operator[](unsigned int position)
{
return const_cast<char&>(static_cast<const sample&>(*this)[position]);
}
...;
};


646 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 23:32:43 ]
>>645
blogにも書いてあるが、やりすぎな工夫の一例だな

647 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 23:44:12 ]
>>644
どちらかというと、そういう排他制御の仕組みを自分で作るときに使う。

例えば下のコードをコンパイラが最適化した結果、
ロック確保する前や解放した後にhogeへ読み書きするコードが生成されたらシャレにならない。
MS仕様では、volatileなデータに読み書きするとそこを境界として、それより前後に読み書き処理が
ずらされないように最適化を抑えると言っている。

void f(hoge_t* hoge) //hogeを使うには排他制御でロックが必要とする
{
// ...
ロック確保

hogeを使う

ロック解放
// ...
}

648 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 23:48:16 ]
>ロック確保する前や解放した後にhogeへ読み書きするコードが生成されたらシャレにならない。

意味が分からん。

最適化によって、「hogeを使う」に相当するコードが、「ロック確保」の前や「ロック解放」の後に配置されたらシャレにならないってこと?


649 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 23:50:52 ]
>>648
ああ、ごめん。そういうこと。
携帯から打つのが面倒でいろいろ略した。



650 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 00:34:14 ]
>>642
ありがとうございます。探してみます。

651 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 00:44:58 ]
>>645
それ第何版の何節に書いてあるの?

652 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 01:30:20 ]
>>644
そういう用途にも使えるってだけでWindowsでもマルチスレッドでvolatileなんて使わない
mutexなりクリティカルセクションなりInterlocked-系関数なり使えばそこでフェンス張られるし
(Interlocked-系関数でvolatile使われてるけどね。間接的には使うことになるのかな)

やっぱり組み込みとかドライバ以外で使うことはないと思うな

653 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 17:24:40 ]
>>647, >>652
どうも、どうも

>>647
>そういう排他制御の仕組みを自分で作るときに使う
ずばり、自分でそういう仕組みは作ることないです

654 名前:645 mailto:sage [2009/05/31(日) 20:04:50 ]
>>651
忘れた。
原著第3版に書いてあった。
確か、最初の方の章に。

655 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 21:20:51 ]
改訂2版にはどこにも書いていないんだが、
第3版には本当に書いてあるのか?


第4版まであと2年はかかりそうな気がするし、
第3版買ってくるか・・・

656 名前:645 mailto:sage [2009/05/31(日) 21:28:28 ]
>>655
第3版には本当に書いてある。
厳密に同じコードかどうが覚えてないが、
const版をnon-const版にて呼び出してconst_castでconst属性を外す
という方式であることは本当。
俺もそんなことして良いの!?と思ったから信じられなくても無理はない。


657 名前:645 mailto:sage [2009/05/31(日) 21:31:01 ]
わざわざ引っ張ってきて確かめみた。
原著第3版(日本語翻訳されているもの)で
15ページから始まる項目にある。

658 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 21:48:18 ]
2版の21項「使えるときは、必ずconstを使おう」に
対応するんじゃないかなと思うけど、
そこではmutableをサポートしてないコンパイラのための苦肉の策として
「みっともないけど」と前置きした上でconst外しをしている。

これのことじゃないよな?

659 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:06:17 ]
>>658
じゃないってば。
少しは俺を信じろ(笑)

他の人も誰か証言してくれ。



660 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:08:18 ]
ようやっと見つけたが、
さっぱり読めなくて意図が分からん。
books.google.co.jp/books?id=d-2Im_Ox7qMC&pg=PA24&as_brr=3&source=gbs_toc_r&cad=0_0#PPA41,M1

俺の英語力も落ちたな・・・

661 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:10:32 ]
ああ、これって王家の血を引く者にしか読めないよ

662 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:10:40 ]
>>659
すまんwww
明日買ってくる。

663 名前:645 mailto:sage [2009/05/31(日) 22:12:21 ]
>>660
メンバ関数foo()のconst版とnon-const版の定義が
同じようなものになることは多々あるじゃない。
同じような定義を繰り返し書きたくない、そんなあなたにconst_cast

って言うような主旨。
const版をうまく定義することで、non-const版の定義は
それを呼び出してconst性を除去するだけ
で良くなる。


664 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:13:17 ]
>>661
俺読めたw
・・・そろそろ天の啓示が来る頃だろうか。

665 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:14:26 ]
>>664
もしかして、お兄様なの!
こんなところで巡り合えるなんて。。

666 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:16:24 ]
おまえか
しょせん、暇をもてあました神々の遊び

667 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:20:04 ]
理解した。解説thx

感覚的にconst側で非constのコードを
再利用したくなりそうなものだけど
それも理由があるのかな。

とりあえず第3版買ってくるよ。
生き別れた妹はいなかった気がするし。

668 名前:645 mailto:sage [2009/05/31(日) 22:23:19 ]
>>667
俺もそう思ったが、
理由としては
const側で非constメンバ関数を呼び出すというのはダメ
ってことらしい。
たとえ実際にはオブジェクトが変更されないとしても。

まあ買ってくる価値はあるかと。
何てったって名著だし、無駄な出費ではないと思う。

669 名前:デフォルトの名無しさん [2009/05/31(日) 22:41:23 ]
#define UNICODE
#define _UNICODE
で定義されたソースコードがあるとします。

それを
#define UNICODE
#define _UNICODE
と定義してはエラーになってしまう、つまりANSI版のソースに混ぜて使いたい場合どの
ようにすればいいのでしょうか?

たとえば


int WINAPI WinMain(…){
    …(ANSIソースコード)
   sub();
}

int sub(){
#define UNICODE
#define _UNICODE
   …(UNICODEソースコード)
}


みたいなことはできるでしょうか?




670 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:49:30 ]
できます。

671 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 22:52:12 ]
いまいち質問内容がよく分からんが、

#define UNICODE
#define _UNICODE
したあと
#undef UNICODE
#undef _UNICODE
すればdefineは消える。

でもWIN32なら、
UNICODE版、ANSI版両方そろってるはずだが。

672 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 23:25:45 ]
CreateWindow("aaa",....
とかやってるんだろ

673 名前:デフォルトの名無しさん [2009/05/31(日) 23:59:32 ]
>>670 >>671
いやできなかった
結論からいうと
原理からいうとその方法でできるのは確かなんだが
UNICODEと_UNICODEは最初の最初で定義しておかなければならならないみたいだ
先にwindows.hとか読み込まれてるからその関係で動作がおかしくなる

>>672
アホすぎ



てか解決法をいうと単純にソースファイルをわければ解決できる
最初からやればよかったけど

674 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 00:14:01 ]
本筋とは全く関係ないが、>>669を見ると_tWinMainにしろと言いたくなる。

675 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 01:15:41 ]
もうこれから書くコードは全部_UNICODEでいいかもと思ってしまうがな。

676 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 04:06:41 ]
なに、いいってことよ┏( ^ω^)┛

677 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 14:32:49 ]
下の様な感じで合成関数を作ろうと思ったのですが、
error C2678: 二項演算子 '*' : 型 'composite_impl<result_type_,arg_type_>' の左オペランドを扱う演算子が見つかりません
とエラーが出ます。どうやって回避すればいいのでしょうか?

678 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 14:33:55 ]
struct composite_type{};
template<typename result_type_, typename arg_type_>
struct composite_impl{
typedef result_type_ result_type; typedef arg_type_ arg_type; typedef result_type (*fn_type)(arg_type);
static fn_type &fn_holder(){ static fn_type fn; return fn; }
result_type operator ()(arg_type a) const{ return (fn_holder())(a); }
};
template<typename result_type_a_, typename result_type_b_, typename arg_type_b_>
struct composite_impl<result_type_a_, composite_impl<result_type_b_, arg_type_b_> >{
typedef result_type_a_ result_type; typedef arg_type_b_ arg_type; typedef result_type (*fn_type)(arg_type);
static fn_type &fn_holder(){ static fn_type fn; return fn; }
result_type operator ()(arg_type a) const{ return (fn_holder())(composite_impl<result_type_b, arg_type_b_>()(a)); }
};
template<typename result_type, typename arg_type>
inline composite_impl<result_type, arg_type> operator *(composite_type, result_type (*fn)(arg_type)){
composite_impl<result_type, arg_type> a; a.fn_holder() = fn; return a;
}
template<typename result_type_a, typename result_type_b, typename arg_type_b>
inline composite_impl<result_type_a, composite_impl<result_type_b, arg_type_b> > operator *(composite_impl<result_type_a, result_type_b> a, result_type_b (*fn)(arg_type_b)){
composite_impl<result_type_a, composite_impl<result_type_b, arg_type_b> > a; a.fn_holder() = fn; return a;
}
composite_type composite;
#include <iostream>
#include <cstring>
int fn_a(int a){ return a * a; }
char *fn_b(int a){ static char str[0xFF]; std::sprintf(str, "%d", a + 1); return str; }
int main(){ std::cout << (composite * fn_a * fn_b)(2) << std::endl; return 0; }

679 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 14:42:39 ]
>>668
> const側で非constメンバ関数を呼び出すというのはダメ
> ってことらしい。
これって、単純にconstメンバ関数内で非constメンバ関数を呼び出すと
コンパイルが通らないって話。



680 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 15:00:03 ]
>>679
const_castで*thisからconstを外すって話だよ。

681 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 15:12:45 ]
>>680
あーそういうことね。
でも*thisのconst外しが駄目なのも当たり前の話だな。

682 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 20:59:19 ]
*thisのconstは外してないぜ
むしろconstメンバ関数を呼ぶために*thisにconstを付けてる
外してるのは戻り値のconst

683 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 21:04:09 ]
>>682


>>667-668
>>679-681
を読みかえしくれ。



684 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 21:13:26 ]
???
>>645のことだろ?
static_cast<const sample&>(*this)は明らかに*thisにconstを付けてる
何か間違ってるのか

685 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 21:15:12 ]
>>684
> >>645のことだろ?
否。
>>667-668の事。
それに対し>>679-681というやりとりが行われている。
皆は>>645は理解している。


686 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 21:18:48 ]
なるほど理解した

687 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 22:34:32 ]
いろいろあるよ。
www.sengoku.co.jp/CategoryIndex/wire.htm

個人的には極細より線と鈴メッキ銅線が好きだけど (どうせ趣味だし)、
信頼性からジュンフロン線使う人のほうが多い。
このシリーズのより線はストリッパー必須。

ジュンフロンは苦手です。ええ。

688 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 22:36:18 ]
ご、誤爆・・・

689 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 22:43:04 ]
どんまい、
というかハードとソフト両方いけるとかうらやましい



690 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 22:45:09 ]
>>687
全然 なんだかわからないwww
すごいな。

691 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 01:02:51 ]
とりあえずイミフだからストリッパーってあたりに反応しとこうぜ

692 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 01:44:25 ]
ストリッパーくらい分かるだろ
線の被覆を剥ぐための工具だろ

693 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 02:19:34 ]
struct A{A();virtual void fun() = 0;};
struct B:A{B();fun();};
struct C{C(A&b); C problem(A&b);};

C c(B());
c.problem(B()); // no-match function になるのは何故?

C::problem(一時オブジェクト参照)を弾くならコンストラクタでも弾くべきだと思うんだけど

694 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 02:57:23 ]
>>692
しらんがな(´・ω・`)

695 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 03:51:45 ]
ドラクエなどで登場する戦士や魔法使いを意味するFighterクラスと Mageクラスがあったとして、
そのクラスのインスタンスが持つHPやMP,攻撃力などのステータス一覧を表示する関数を作るとき、
クラス自信にその関数を持たせるのか、あるいはクラスとは関係のない部分で作るのか、どちらがいいんでしょう?
クラス設計の考え方がまったくわかりません・・。


696 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 06:17:21 ]
>>695
その場合はカプセル化を優先する。

まず、HPやMP,攻撃力などのステータスを格納する変数(intだったりstd::size_tだったりするだろう)のアクセス指定子がどう宣言されているかによって考えを分ける。
1.
もしprivateで宣言されていて、そのステータスをpublicなメンバ関数h_point()で取得するような仕組みにしている場合(むろんそれが望ましい)は、「クラスとは関係のない部分で作る」が正解。
つまり別の関数show_status(〜)を作り、〜の部分にキャラクタのインスタンスを渡すようにする。
2.
もしpublicで宣言されているならば、「クラス自身にその関数を持たせる」ないし「friend指定して外部関数を作る」が正解。しかしステータスを格納する変数がpublic指定されていること自体、そもそも望ましくないことだが。


697 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 06:23:39 ]
>>693
private継承しているからだろ

698 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 08:07:42 ]
>>693
そのコンストラクタで本当に動くか試した?

699 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 17:56:43 ]
C c(B());

C c(B (*)());
という関数宣言に解釈される。
B b0;
C c(b0);
c.problem(b0);
とするとできましたが。
関数の引数のリファレンスの型にconstをつけて
"const B&b"、"const A&b"のようにすると
C c = C(B());
c.problem(B());
でもいけました。
なぜかは僕には分かりませんのでどなたか解説お願いします。
コンパイラはgcc4.2.1で確かめました。



700 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 19:02:59 ]
const参照型のインスタンスは、呼び出す側が値渡しと同じ感覚で扱えるように、
一次オブジェクトで初期化できることになっている。

701 名前:693 mailto:sage [2009/06/02(火) 20:13:27 ]
実コードはstruct Bにtemplate特殊化やらvirtualメンバやらなんやら絡んで魔窟状態で実は
C c(static_cacst<A&>(B())); に成ってますた。

>>699
C c((B())); でも逝けますね。

702 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 21:44:52 ]
>>701
Effective STL の第1章第6項「C++の最も奇妙な解析に注意しよう」に書かれてるね。
(この本自体はSTLの解説本だけど…)
でも、すべてのコンパイラで成功するとも書かれていない・・・おそろしや。

703 名前:デフォルトの名無しさん [2009/06/03(水) 17:16:04 ]
#include <stdio.h>

void main(void)
{
char data[3465300]
int idata[3465300];
int KOTAE[3465300/2];
int data1[12032/2][300];
int idata1[300][300];
int i,j,id,a,b,No,day,LDAY,d;
char fnamein,fnameout;
FILE *fin,*fout;
#define LDAY 30 //月ごとに変える
//No=1→ステータス;No=2→交通量;No3=速度;No4=オキュパンシー
#define No 2
for(day=0;day<LDAY;day++){
d=day+1;
printf("%d/%d\n",d,LDAY);
sprintf(fnamein,"D:\\/torakan-Y/R_barashi/Ku0409/Ku0409%02d.dat",d);
sprintf(fnameout,"D:\\/torakan-Y/R_barashi/Ku04/Q_Ku0409%02d.txt",d);
fin = fopen(fnamein,"rb");
fread(&data,1,3465216,fin);
fclose(fin);
if((fout=fopen(fnameout,"w"))==NULL) printf("Cannot open output file\n");


704 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 17:17:18 ]
>>703
なんだこの凶悪なのはっ!!

705 名前:703 [2009/06/03(水) 17:19:00 ]
703のプログラムですが、コンパイルは通る一方で
出力される結果が同じ数字の繰り返しになってしまいます。

エラーの原因としては、以下の4行が怪しいと思っています。
詳しい方、よろしくお願いします。
sprintf(fnameout,"D:\\/torakan-Y/R_barashi/Ku04/Q_Ku0409%02d.txt",d);
fin = fopen(fnamein,"rb");
fread(&data,1,3465216,fin);
fclose(fin);

706 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 17:23:44 ]
>>705
あんたが勝手に”エラー”って呼んでいるものを,具体的に書き表してごらんよ
少なくとも”出力される結果が同じ数字の繰り返し”になることは具体的に書け

707 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 17:29:33 ]
変数宣言で嫌になるものは久しぶり…

708 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 17:32:39 ]
スレの住人の中におエスパー様はおられませんか?

709 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 17:34:40 ]
>>703
とりあえず変数を#defineで上書きしているのが分かった



710 名前:703 [2009/06/03(水) 17:42:02 ]
≫>705様
レスありがとうございます。
出力されたファイルを開くと
526855268552685といった感じで同じ数列がただ繰り返されたファイルが
出力されます。

このプログラムはもともと、膨大なデータの中から
一部分を抽出するプログラムとなっています。
また、その莫大なデータにはそのような数列は見られないので
勝手にエラーと判定してしまいました。

>709様
ありがとうございます。
さっそく そこを修正したいと思います。

711 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 17:52:30 ]
>>710
かんじんのファイルに出力している部分が・・・ねぇwwwwwwさすがにESPじゃない俺にはむり

712 名前:703 [2009/06/03(水) 17:57:36 ]
for(i=0;i<3465216;i++){
idata[i]=int(data[i]);
if(idata[i]<0){
idata[i]=256+idata[i];
}
}
id=0;
for(i=0;i<3465216;i=i+2){
a=idata[i]/16;
b=idata[i]%16;
KOTAE[id]=a*16*16*16+b*16*16+idata[i+1];
id=id+1;
}

id=0;
for(j=0;j<288;j++){
for(i=0;i<12032/2;i++){
data1[i][j]=KOTAE[id];
id=id+1;
}
}

713 名前:703 [2009/06/03(水) 18:00:29 ]

/*区間データの抜き出し*/
id=0;
//////6号三郷JCT‐江戸橋JCT間////////////
for(j=0;j<288;j++){
for(i=0;i<17;i++){
idata1[id][j]=data1[4*i+(8+4*501+No-1)][j];
id=id+1;
}
id=0;
}

for(j=0;j<288;j++){
for(i=0;i<2;i++){
idata1[id+17][j]=data1[4*i+(8+4*772+No-1)][j];
id=id+1;
}
id=0;
}



714 名前:703 [2009/06/03(水) 18:02:01 ]
for(j=0;j<288;j++){
for(i=0;i<15;i++){
idata1[id+19][j]=data1[4*i+(8+4*542+No-1)][j];
id=id+1;
}
id=0;
}

for(j=0;j<288;j++){
for(i=0;i<34;i++){
fprintf(fout,"%d",idata1[i][j]);
}
fprintf(fout,"\n");
}
}
}


715 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 18:02:27 ]
>>712
> for(j=0;j<288;j++){ 
> for(i=0;i<12032/2;i++){ 
この辺で悪意を感じた

あと,もし仮に名前を付け替えるのが許可されているなら,ぜひデータ構造と名前を変えるべきだとおもふ


716 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 18:10:48 ]
まずマジックナンバーが多過ぎるから定数で宣言して分かりやすい名前を付けるべき

それと、
>char fnamein,fnameout;
ここはファイル名格納するバッファじゃなかろうか

717 名前:703 [2009/06/03(水) 18:11:01 ]
>712

すいません。まったく悪意はないです。
もうしわけないです。

名前は変更できます。



718 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 18:16:08 ]
なげぇwww
codepad
ttp://codepad.org/
せめてここに貼るとかさあ。。

719 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 18:19:07 ]
そもそも何の目的で作られた何をするためのプログラムで
どうなれば成功なんだよ
そこが分からないのに何も答えられるわけがないだろ

どうせ宿題なんだろうけど



720 名前:703 [2009/06/03(水) 18:26:59 ]
>719様

説明不足ですいません。
トラカンデータといわれる交通量や平均速度といった
情報が網羅されているデータから
一部分を抽出して、自分たちが調べたい路線の
交通量を抜き取るプログラムです。

数列が同じ数字の繰り返しにならなければ、ほぼ成功だと思います。

宿題ではないです。申し訳ないです。

>718様
さっそく、張ってみようと思います。

721 名前:703 [2009/06/03(水) 18:30:03 ]
codepad.org/jC9g9phJ

さっそく貼ってみました。

722 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 18:32:15 ]
ふむふむ
ひどすぎて目眩がしてきた

一つ言えるのは、これはCであってC++ではないということだ
だからスレ違い

723 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 18:32:56 ]
と思ったらnew使ってるからC++かよ
なんだこれは

724 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 18:52:09 ]
読むのに時間かかりそうだ…

725 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 19:03:32 ]
管理番号とかファイルのパスとか
危険な香りのする文字列がたくさんあるけど大丈夫なのか

726 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 19:09:39 ]
>>703
とりあえず
fread(&data,1,3465216,fin);

fread(data,1,3465216,fin);

727 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 19:12:43 ]
プログラムに間違いらしきものはなし。
データ解析部分でデータの構造が合致していないような感じだが?

728 名前:703 [2009/06/03(水) 19:18:54 ]
>726様

あなたは神様です。
あなたのおかげで無事解決しました。

なんてお礼をいえばいいのかわかりません。

729 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 20:18:52 ]
すげえうれしくない感謝の言葉だなぁ



730 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 20:22:20 ]
You are God.
I solved the problem, thank you.
What it only has to say the reward is not understood.

731 名前:703 [2009/06/03(水) 20:27:36 ]
と思ったら、まだ解決していませんでした。
申し訳ないです。

732 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 20:39:13 ]
<stdexcept> と <exception> って、
どっちをインクルードするほうが望ましいの?

733 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 20:41:32 ]
<stdexcept>で定義されている例外を使いたければ<stdexcept>

734 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 20:42:12 ]
>>731
書き直してもいい?

要するにファイルの内容は unsigned short 型のデータが
ビッグエンディアンで 6016x288 個格納されているのを
data1 に代入すれば data も idata も KOTAE も必要ないよね

735 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 20:53:56 ]
>>703
社内で使ってる(であろう)コードをこんなところに晒して、
ただで済むと思ってるのか?
オープンソースじゃないだろうし、上司に知られたらやばいんじゃねーの。

736 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 21:21:08 ]
スタックオーバーフローエラーを直してくれた先輩には
もう見限られたのか?

737 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 21:58:15 ]
>>731
なにが解決してないの?

738 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 22:40:43 ]
ほんとプロが作るソースって
ゴミクズだよな。
どこもかわらねえなぁ。

739 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 22:48:19 ]
え?>>703の話なら、プロのコードじゃないっしょ。

社内でコンピュータにちょっと詳しい人(事務職とかバイトのお兄ちゃんとか)に
アホ課長が「エクセルで計算するのめんどいからお前プログラム書けよ」って
仕方なくしこったんじゃない?

どうみてもCで書いたコードを、その人がやめちゃって保守要員がいなくなったので
これまたその辺のちょっとコンピュータ詳しい奴にむりくりやらせてるってところでは。

すごいエスパー。昔、エスパドリューはエスパーが身につける特別な装備だと思っていたのを思い出した。



740 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:49:15 ]
ふと思ったんだが↓↓

C++では関数が返せる変数の型は1つだけである。
(その型と継承関係によってはその子クラスの型でも返せることもあるが。)
ところが、例外処理におけるthrowは関数から外へ任意の型の例外を投げることが可能である。
これをその関数の返り値(戻り値)とみなして
プログラミングをするという面白い技法が
この世に存在していてもおかしくないのではないか

と思ったのだが、誰か知っている人いない?
例外を使ったプログラミングの話をしている訳じゃ無くて
あくまでthrowによる例外を戻り値として利用するスタイルってことで。

741 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:55:54 ]
テンプレートクラスを使えば戻り値の型なんて自由自在ですよ。
無茶しないでください。


742 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:57:22 ]
そのアイデアに「catchされなければ呼出元へ伝播する」という例外の特徴も考慮した?
していないならboost::any返せばいいでしょという話だと思う。

743 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:57:35 ]
>>740
実用してる奴がいたら絶対に近づきたくないが
ネタとしてはおもしろそうだな。

はたして意味のあるプログラムを作ることができるのか・・・

744 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 00:04:54 ]
もしうまいことやったとしても、Schemeなんかの継続のきわめて限定的なまねごとになるのではと思う。
どういう形か想像もつかないが。

745 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 00:10:33 ]
継続ねえ。
じゃあお題は例外でC#で言うところのyield()を作る
でどうよ。

746 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 00:17:20 ]
_


さっそく自分で否定しちまった・・・

747 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 00:39:24 ]
>>740のは面白いな
何か可能性を感じる

748 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 01:27:32 ]
variantでいいじゃん
戻り値の型として使いたいものの集合がコンパイル時に決まっていないと
例外使う方法も結局何もできないわけだし

749 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 02:00:23 ]
変態プログラミングの可能性と聞いて



750 名前:703 [2009/06/04(木) 02:02:54 ]
>734様

先程、プログラミングを回してみた結果
無事解決しました。
727様のおっしゃるとおり
データ解析部分でデータの構造が合致してないことが
原因でした。
もし、お時間があるなら、書き直してくださったプログラムを
見せていただきたいです。

751 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 02:36:54 ]
>>740
そういうのはイベント駆動型とかいうやつじゃないか

752 名前:740 mailto:sage [2009/06/04(木) 06:28:37 ]
>>741
え?
どういうことだい?
よく分からないんだが。。。

みんなありがとう。
俺も絶対やらないと思うけど、
>そのアイデアに「catchされなければ呼出元へ伝播する」という例外の特徴も考慮した?
一応考えてる。
boost::anyやvariantは頭をよぎったが忘れることにした。

うーん、むずかしいよねぇ。
少なくとも俺はやらないけど、きっと誰かが何かすごいことを
やってくれるんじゃないかと思った。


753 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 11:11:57 ]
やらないのかよ

754 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 11:52:00 ]
>>752
c#でもやっていてください
とくにLINQ

755 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 14:00:53 ]
>>752
例外のキャッチってコストかかるんでパフォーマンス劣化が激しいと思うぞ

756 名前:デフォルトの名無しさん [2009/06/04(木) 14:02:25 ]
アゲ

757 名前:732 mailto:sage [2009/06/04(木) 17:05:22 ]
>>733
ありがとう!

758 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 17:20:46 ]
>>740
むやみやたらにthrow使うのはgotoと大して変わらないので、
普通やらん。
やめとけ。

759 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 17:51:57 ]
普通に関数オブジェクトでも引数として渡せばいいだけやん。



760 名前:740 mailto:sage [2009/06/04(木) 17:57:29 ]
もちろん俺だって普通はやらんさ。

でもまあどこかの変態級のプログラマがうまくこれを生かして…(ry

761 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 20:32:06 ]
試しに
#define return assert(0)
して、throw以外で関数から出るのを禁止してプログラム書いてみたらいい
何かが見えてくるかもしれんぞ

762 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 20:42:01 ]
C++の関数を全部こう書き換える

retType func(/* ... */){
  /* ... */
  return foo;
}



function func(/* ... */) throw(retType){
  /* ... */
  throw foo;
}

そして
class function{private:function();~function();};
と定義すれば、めでたく例外指向プログラミング言語の出来上がり

使うのは遠慮します

763 名前:740 mailto:sage [2009/06/04(木) 21:00:49 ]
>>761-762
ありがとう。
うーん、なんとも気持ち悪い物が出来上がりそうだw

764 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 23:10:07 ]
三値論理の関数型言語?で似たような事が出来たような?
よくわからんが

765 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 23:20:59 ]
boost::any を使えば受け取る側は関数側から何が返ってくるか知らなくてもいいけど
例外の場合は、帰ってくる型が何であるかは知っておく必要があるよね?

間違ってるかしら・・・

766 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 23:47:52 ]
>>765
一応catch(...)で、何でも受けれる。
受けられるだけだが。

戻り値返しにない例外の機能として、
安全な中間すっとばしがある。

funcA() -> funcB() -> funcC() -> 例外発生
↑-----------------------------」

これを使えば、非常に柔軟な逆フロー制御が実現できる。
つまり、メインルーチンを例外のcatch()ブロックに書くのだ。
これを使って何が出来るかというと、それは次の人どうぞ。

767 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:11:17 ]
一方ロシアはgotoを使った。

768 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:16:15 ]
anyだろうと何だろうと型を知らないと何も出来ないから、
結局そのままどっかに転送するしかないよな
throw;で同じ事が出来そうな気はする

769 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:19:15 ]
VC9だと落ちるんだけどw
#include <iostream>
void fib(int n) {
  if (n < 2) { throw 1; }
  else {
    try { fib(n-1); } catch (int r1) {
      try { fib(n-2); } catch (int r2) {
        throw r1 + r2;
      }
    }
  }
}
int main() {
  try { fib(20); } catch (int ret) {
    std::cout << ret << std::endl;
  }
  return 0;
}



770 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:21:40 ]
あーそうだ、多重例外は未定義だったな

標準C++の範囲で例外指向プログラミングはできないようです

771 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:29:57 ]
うーん、
変態Chain Respinsibility?

void discover() {
 switch (random) {
 case 0:
  throw Chair;
 case 1:
  throw Human;
 case 2:
  throw Orange;
 case 3:
  throw Truth;
 }
}

void loop() {
 while (1) {
  Sitter(Killer(Eater(Philosopher(discover))));
 }
}

どうすんだこれ・・・

772 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:31:46 ]
綴りひでぇorz

773 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:45:36 ]
いいかんじに変態的だな

774 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 02:23:18 ]
>768
visitorで何とかする手はあるよ。
ttp://www.boostpro.com/vault/index.php?action=downloadfile&filename=holder.zip&directory=Data%20Structures&


775 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 05:26:42 ]
多重例外って何ですか?
アクティブな例外が2つ以上同時に発生することですか?
それともtry・catchブロックの中にtry・catchブロックがあることですか?

776 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 09:32:40 ]
例外ハンドラで例外が出ること

777 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 11:12:55 ]
テンプレートクラスで自身を返す場合、書き方としてどっちが正しいのでしょうか。
1も正しいなら今後1で書こうと思ってます。

template<class T> class X
{
public:
X &Func() // 1
X<T> &Func() // 2
{
return *this;
}
}


778 名前:デフォルトの名無しさん [2009/06/05(金) 11:33:33 ]
C++を1から学習しようかと思うのですが、参考書は何がおすすめでしょうか?
visual C++を使おうかと思っているのですが。
分厚くてもよいので、一冊で応用まで深く学習出来るのはありませんかね?

779 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 11:52:54 ]
>>777
2、テンプレート引数を省略しないといけないのはコンストラクタだけ



780 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 12:03:14 ]
>>778
禿本を買っておけば間違いは無い

781 名前:デフォルトの名無しさん [2009/06/05(金) 13:44:02 ]
>>780
禿本とは何ですか?

782 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 13:53:12 ]
softbank

783 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 13:54:12 ]
そういう時に真っ先に「C++ 禿本」で検索しない精神がよくわからん。

784 名前:デフォルトの名無しさん [2009/06/05(金) 14:47:44 ]
検索したのですが、出てきませんでした。
ていうより、59件ヒットしてその全てがただ禿本とC++を含んでるやつのみで
何の略かも書いてありませんでした。
その本の正式名称がわかりません。
すいませんが、本の正式名称で書いていただけませんか?


785 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 15:01:04 ]
C++ 禿

でぐぐったら一番上におっさんの名前出てきたわw

786 名前:780 mailto:sage [2009/06/05(金) 15:04:39 ]
確かにC++ってググるときに引用符を付けないと駄目なんだよな。

正式名称はThe C Programming Language(邦訳はプログラミング言語C++)
著者はC++の設計者である禿ことBjarne Stroustrupだ。
www.research.att.com/~bs/ に写真があるからよく拝んでおくように。

日本語訳については色々言われているみたいだが、俺は原著しか使ったことが
ないので分からん。英語に問題ないなら原著をすすめておく。

787 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 15:07:13 ]
一番、二番目に出てくるならまだしもそれ以外でググレとか言う奴の精神が分からん。
素直に教えて感謝されればいいのに

788 名前:デフォルトの名無しさん [2009/06/05(金) 15:12:09 ]
>>786
禿本とはそういう意味だったのですか。
教えてくださってどうもありがとうございました。参考にします。


789 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 15:37:25 ]
確かに"禿本"だけであとググれってのはちょっとひどいなw

英語に問題ないならTC++PL(禿本)よりも先にProgrammingを読んだほうがいいかも
同じようなこと書いてあるけどProgrammingのほうが分かりやすい
TC++PLにしか書いてないこともあるからどのみちTC++PLは読むんだけどね



790 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 15:39:18 ]
途中で送信しちまった…
TC++PL(禿本): www.research.att.com/~bs/3rd.html
Programming:  www.research.att.com/~bs/programming.html

791 名前:780 mailto:sage [2009/06/05(金) 15:42:31 ]
>>876
自己レススマソ。原著名間違えた。K&Rじゃないっての。

>>787
まあ2chだから仕方ないね。
禿本ってこのスレでは良く知られてると思ってたけど、意外とそうでもないのかな。

792 名前:777 mailto:sage [2009/06/05(金) 15:44:42 ]
>>779
ありがとう。コンパイル通るからいいのかと思ったけど
やっぱり基本的には全部書かないとだめなのね。


793 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 15:45:04 ]
禿本と書いてても意味がわからんからスルーしてた
スルーで正解だった

794 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 16:20:14 ]
>>787
> 一番、二番目に出てくるならまだしも
Googleを使わせるか否かを考えるのに「一番、二番目に出て来るかどうか」を基準にする、
怠惰な人間をつけあがらせる使命でもあるかのような考え方は理解不能だし、
悪いけど二番目の結果(環境依存OKスレの2スレ目)にこういう文章が出て来るぞ。
> 「プログラミング言語C++」は禿本と呼ぶ。

あ、"C++"と"禿本"をダブルクォーテーションで括る発想に至らないバカは考慮してないけど。

795 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 16:27:12 ]
質問です。どうしてこのスレには捻くれた奴が湧くんですか?

796 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 16:30:53 ]
たとえばどのレスのことなのか例を挙げてくれないと、
本当にそういう傾向があるのか、自分のバカさを指摘されたバカが
必死にそう見ようとしてるだけなのか判断つかず、回答できないです。

797 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 19:26:31 ]
>>792
2でもいいんだけどね。テンプレートパラメータは
宣言された範囲(テンプレートのスコープ)内では省略していいことになっている。
クラス定義の冒頭で template が宣言されていて、その範囲内に入っているので、
この場合のメンバ関数宣言のテンプレートパラメータは省略できる。
(Accelerated C++ p.197などを参照)

template < class T > class foo {
 template < class T > foo &bar( foo<T> &t );
};

のような紛らわしい宣言も可能な様子。

798 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 19:26:34 ]
>>795
捻くれものは大抵、過去に何らかの形で虐げられた経験がある
あとはわかるな?

799 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 19:29:36 ]
>795
C++自体が捻れた言語だからです。



800 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 15:12:48 ]
>>797
全然別人なんだけど割り込んで聞いて良い?

template < class T > class foo {
 template < class T > foo &bar( foo<T> &t );
};
ってのは要するに
template < class T > class foo {
 template < class U > foo<T> &bar( foo<U> &t );
};
ってことだよね?

801 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 20:23:43 ]
>>798
わかります。
現実の現在で叩きのめされたので、架空の過去を夢想して脳内逆襲ですね?

802 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 20:26:59 ]
>>800
最初の方はgcc 4.2.1ではエラーになった。

803 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 21:46:37 ]
(・3・) エェー。ぼじゅあるくっぷぷ(Visual C++)では問題なしだYO

>>800
Yes。

804 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 22:04:24 ]
以下の変態プログラムでテンプレートパラメータの挙動についてご確認ください
#include <iostream>
using namespace std;

template < class T > class foo {
public:
foo() : x( 0 ) {};
foo( foo *p ) : x( p ) {};
template < class T > foo &bar( foo<T> &t ){
cout << t.member << endl;
return *x;
}
T member;
foo *x;
};

int main() {
foo< int > base;
base.member = 1000;

foo< int > i(&base);
foo< char > c;
i.member = 1;
c.member = 'a';

foo< int > r = i.bar( c );
cout << r.member << endl;
}

805 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 05:02:33 ]
危うく騙されそうになったが
return *xだから挙動自体は普通だな

806 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 05:28:11 ]
r.memberが初期化されない…と思ったがコピーコンストラクタじゃないのか。

807 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 12:07:05 ]
>>804
読むだけで疲労した。
barメンバ関数が何をやりたいのか意図が分からない
(練習プログラムだから仕方ないことだが。)
のに理解をじゃまされた。

分かって良かった。

808 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 12:38:25 ]
>>807
>>797の再現じゃないの?

809 名前:807 mailto:sage [2009/06/07(日) 12:56:34 ]
>>808
ああそうなのか、ここのところこのスレ見てなかったから
全然流れを読んでなかったわ。




810 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 13:58:30 ]
下のように、クラスAAのインスタンスを、メモリーに割り当てたときに。
コンストラクタとデストラクタをどうやって起動したらいいのでしょ?

class AA { int i1,i2; AA(); ~AA(); }
void func()
{
 char dat[100];
 AA *dat;
 dat = (AA *)dat;
}

811 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:02:17 ]
コンストラクタ
new(dat) AA();
デストラクタ
dat->~AA();

812 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:11:53 ]
AA * dat = new AA[100];
delete[] dat;

813 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:38:59 ]
上の例、バッファーとポインターが同じでした、ミスすみません
>>881 下記のようにうにエラーになります  >>812 100個のインスタンスを作るわけではないです
class AA
{
 int a1,a2;
public:
 AA() { printf("AA コンストラクタ\n"); }
 ~AA() { printf("AA デストラクタ\n"); }
};
int _tmain(int argc, _TCHAR* argv[])
{
 char buf[100];
 AA *datp;
 datp = (AA *)buf;
 new(datp) AA(); // ここがエラーになる…
 datp->~AA();
 return 0;
}
エラー 1 error C2660: 'operator new' : 関数に 2 個の引数を指定できません。


814 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:39:55 ]
#include <new> が抜けてるだろ

815 名前:デフォルトの名無しさん [2009/06/07(日) 14:41:49 ]
atnd.org/events/702

124.45.27.25:12086/stream.mp3.m3u
IRCNET #CRYBUTSU

816 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:55:53 ]
>>814 できました、ありがとうございます。

817 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 15:12:11 ]
ローカル変数に対するplacement newって、アラインメントを気にする必要がなかったっけ?

818 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 15:16:19 ]
気にする必要があると思います。
実際のプログラムは、sizeof で確認をしています

819 名前:デフォルトの名無しさん [2009/06/07(日) 16:27:09 ]
std::vector のようなコンテナを作ろうと思うんだが、
要件について詳しくまとまってるページない?



820 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 16:49:49 ]
規格を読め

821 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 16:55:54 ]
別にinterfaceクラスを継承してるわけでもないし、
要件なんて無いぞ。

822 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:05:30 ]
要するに value_type なんかの必須 typedef や
領域確保時の用件とかを知りたいんじゃろ?

領域確保に new を使っちゃらめとか、
知らないとはまる部分もあるしー。

823 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:09:05 ]
>>819
www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf
の23.2.6をしっかり読むこと。

SGIのドキュメントはまとまっていて良かったんだが、最新の仕様と乖離してるのかな。
www.sgi.com/tech/stl/Vector.html

>>821
馬鹿か?

824 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:17:18 ]
>>820-823
トンクス

825 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:21:58 ]
>>821
ちょwww

826 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 19:02:35 ]
>>769-770
>>775-776
このレスで出てきている多重例外「例外ハンドラで例外が出ること」についてですが、
try
{foo();}//適当な例外を投げる関数
catch(const std::exception& ex)
{throw 42;}//ここが多重例外
ってことですよね?
では
try
{foo();}//適当な例外を投げる関数
catch(const std::exception& ex)
{throw ex;}//ここは?
この様に例外を再送する場合も多重例外となり未定義の動作ですか?
また、再送する場合{throw;}と書いても未定義になりますか?


827 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 19:33:06 ]
>>826
>770や>776は何か勘違いしているような・・・。
例外ハンドラ(catch節)で例外を投げるのは正当。

多重例外というのはもっと異常な事態で、
例外によるスタックの巻戻し中にデストラクタがさらに例外を投げたとか、
値渡しのcatchへ例外をコピー中にコピーコンストラクタが例外を投げたとかのことを言い、
そういう時でも未定義ではなく、terminate()が呼ばれるんじゃなかったっけ?

828 名前:==775==826 mailto:sage [2009/06/07(日) 20:20:29 ]
とりあえず例外の再送出は問題ないと分かれば当面は解決です。ありがとうございます。

>>827
>例外によるスタックの巻戻し中にデストラクタがさらに例外を投げた
は、
私(>>775)の言う
>アクティブな例外が2つ以上同時に発生すること
ってヤツですよね。
この場合は未定義だとEffective C++で紹介されています。
しかし
デストラクタからの例外送出::実装技術
ttp://cppemb.blog17.fc2.com/blog-entry-31.html
ここによると
>デストラクタから例外を送出するクラスAのオブジェクトを自動記憶域で宣言し、
>その生存期間内で他の例外が発生した場合、A::~A()が呼び出されて、
>その中でまた例外が送出されます。これは二重例外と呼ばれ、
>問答無用でstd::teminateが呼び出されます。
>次に、デストラクタから例外を送出するかもしれないオブジェクトを
>静的記憶域期間で宣言した場合を考えてみてください。
>静的記憶域のオブジェクトを監視ブロック(try〜catchの制御文)で囲む構文を
>記述することはできません。すなわち、こちらはデストラクタから例外が発生した
>時点で(std::terminateの呼び出しではなく)未定義の動作になります。
と書いてありますが、果たして何がどうなんでしょうね。


829 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 21:16:02 ]
catch節で例外を受けた場合、受け取った例外を再送するか、
受け取った例外を破棄して別の例外を送出するしかなくて、
結局、伝播する例外は1つだけになるので問題ない。
それ以外で例外伝播中に他の例外が発生すると、
2つの例外を伝播させなければならなくなるけど、
それはできないことになってて、かわりにstd::terminate()が呼ばれる。



830 名前:828 mailto:sage [2009/06/07(日) 22:14:01 ]
>>829
・・・としますと
Effective C++の未定義だという記述の方が誤りで、
デストラクタからの例外送出::実装技術
ttp://cppemb.blog17.fc2.com/blog-entry-31.html
の方が正しいと言うことでしょうか?


831 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 03:03:48 ]
多重例外が未定義動作だなんてどこに書いてあった?

832 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 05:20:46 ]
デストラクタで例外を投げてもちゃんと動作は定義されている
意味のある(まともな)動作をさせるのが困難というだけ

833 名前:828 mailto:sage [2009/06/08(月) 06:59:07 ]
>>831
Effective C++ 原著第3版
p39末行
〜p40頭の数行
にかけて、はっきりと未定義と書かれています。

>>832
それもEffective C++で上と同じ節に書いてあります。


834 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 08:03:12 ]
>>830
静的記憶域期間を持つオブジェクトがデストラクタで例外送出したらterminateじゃなかったっけ

と思ったら「staticでnon-local」はterminateらしい
「staticでlocal」は記述が見当たらねぇ…

835 名前:828 mailto:sage [2009/06/08(月) 16:14:44 ]
そしてまあ困ったことに、たしかVC2008とかの有名どころですら
複雑な例外処理の仕様は、正確には実装されていないと聞いたことがあります。

結局は多重例外になるという状況を作らないように気をつけていくしかないのでしょうかね。


836 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:14:03 ]
>>833
そこは仕様書を持ち出すべきだろ。

837 名前:828 mailto:sage [2009/06/08(月) 21:15:40 ]
>>836
私は仕様書を持ってないんですよ。
趣味グラマなもんでして。

838 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:22:44 ]
例外処理の実装を詳しく説明している書籍は何がありますか?


839 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:26:27 ]
more exceptional C++



840 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 21:55:50 ]
>>837
興味があるならタダで見られる、日本語で。
www.jisc.go.jpから規格番号X3014。

841 名前:837 mailto:sage [2009/06/08(月) 21:58:59 ]
>>840
ありがとうございます。
なんとかDLしたいものですが、ガードされているようですね。

必要に応じてWEBで見るようにします。

842 名前:デフォルトの名無しさん mailto:sage [2009/06/08(月) 23:40:41 ]
FDISでよければこことか
ttp://www.kuzbass.ru/docs/isocpp/

15.5.1に
>when the exception handling mechanism,
>after completing evaluation of the expression to be thrown but before the exception is caught,
>calls a user function that exits via an uncaught exception,
>...
>In such cases, void terminate(); is called.
とあるから、terminate()が呼ばれるのは間違いないと思うのだが、
Effective C++には確かに未定義っぽいことが書いてあるし…
英語版でもそうなのかなあ

843 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 00:25:07 ]
しかし、デストラクタで例外なげるようなプログラムなんて書く訳無いし、あんまり気にしすぎても仕方ないよ。
いえ、ごめんなさい。

844 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:20:17 ]
関数テンプレートがインスタンスを指定することによって実体化できるのに対し、
クラステンプレートは型名を指定しないと実体化できないところに不便さを感じます(boost::rangeとか特に)。
何かいい方法はないですかね?

845 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:26:59 ]
そのためのtypedefだろ?

846 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 20:27:22 ]
クラステンプレートは、型を引数に取って型を返す関数

847 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:35:16 ]
>>846
TMPか。

848 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:40:37 ]
>>844
std::make_pairやboost::make_iterator_rangeのように関数テンプレートでラップすればいい。

849 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 21:41:43 ]
>844
関数テンプレートもインスタンスで指定しているわけじゃないぜ。単に引数の型を推論しているだけ。
#動的な型は対応できない

どうしてもというなら関数テンプレートでラッパー作ればよろし。




850 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:05:43 ]
>>845
型指定するのが手間に思えます。型推論してくれないかなと。
>>846
関数の引数をテンプレートに変更してもそのまま使えるのに、クラスのメンバ変数をテンプレートにすると使う側に手間が増えるのが不便に感じます。
>>848
makeXXXの戻り値を受け取るところで結局型指定が必要になってしまいます。
>>849
書き方が悪かったです。

template<class T>
void F(T t);
template<class T>
class C {
  T t_;
public:
  C(T t):t_(t){}
};
F(hoge);// hogeを簡単に渡せる
C<Hoge> c(hoge);// 型を指定しないと渡せない
この違いを埋めることってできないですか?
rangeを渡す時、後者はめんどくさく感じて仕方ないです。

851 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:13:14 ]
>>850
> F(hoge);// hogeを簡単に渡せる 
> C<Hoge> c(hoge);// 型を指定しないと渡せない 
どう書ければうれしいの?

852 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:31:30 ]
>>851
Hogeを書かなくてよくなればうれしいです。
言語の仕様上、Cを非テンプレートクラスにするしかないですかね。
boost::any使っても値を取り出すことができないし、うーん・・・。

853 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:49:02 ]
class B{public:virtual B&fn()=0;};
template<T>class A:B{public:T t_;A(T t);B&fn();};
class C{A&a;public:template<T>C(T t):a(C<T>(t)){};B&fn(){return a.fn();}};

実現しようと思えば物凄く面倒。

854 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 22:53:56 ]
>>852
つまりこういうこと?
 C<> c(hoge);

855 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:04:50 ]
>850
F(hoge)のhogeはどのみち静的な型になってるだろ。
C<Hoge>とするのに比べてそんなに汎用性が高くなっているわけじゃないよ。

型を推論してくれるから面倒なことは少ないけど。まあ、素直にC++0xのauto待ちでいいんじゃね?

856 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:40:44 ]
>>853
頭がクラクラしてきます。
>>854
そのコードが許されれば大満足です。
>>855
単純に入力の手間の問題ですね。
boost::range使っていて、コードを書いてる時に型を意識しないといけないのはつまらないなーと思いました。

857 名前:デフォルトの名無しさん mailto:sage [2009/06/09(火) 23:54:20 ]
100万回呼ばれるメソッドがあったとして

Hoge * f(...)

Hoge & f(...)

ってどっちがお得なのでしょうか?

858 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 00:00:24 ]
コンパイラしだいだけど、大体、どっちもいっしょ。

859 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 00:02:27 ]
100万回程度ならどっちも同じ。



860 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 01:17:43 ]
>>859

じゃあ1無量大数回なら?

861 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 01:24:23 ]
呼び出しの時間なんて気にするなってことだろjk
マイクロ秒で競ってどうするんだよ…

862 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 02:06:29 ]
呼び出し側にも依るが、参照とポインタだけの違いならまったく同じバイトコードになる可能性が高い
参照なんてのは結局ただのポインタだからね

863 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 02:11:09 ]
参照の場合はコンパイル時のチェックがかかるだけで、バイナリは同じものになるって話を聞いたことがあるが・・・
ホンマかいな

864 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 02:12:05 ]
コンパイルの時間まで考慮するならHoge*f(...)の方が早くなる可能性があるな

865 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 05:24:40 ]
>>863
絶対じゃないだろうが、その可能性はあるでしょうな。

参照はどう実装しても良いわけで、
別に参照はポインタを用いて実装されているという保証はない。
だが普通ポインタを用いて実装するので、。

866 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 18:13:43 ]
TCP/IPのソケット通信プログラムなのですが

connectを実行し、接続確認にsendとrecv
を行っているのですが、recvでソケットエラー
が発生し、GetLasterrorでエラーコード
を取得すると「既に使われている(183)」でした。

何故こんなエラーになるのか分からず
困っています。どなたか教えて下さい。

867 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 19:08:03 ]
環境がわからないし、エラーは正確に書くべき。

868 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 19:09:46 ]
WSAGetLastError呼べよ

869 名前:866 mailto:sage [2009/06/10(水) 19:33:58 ]
>>867
送信先:Windows2003Server
送信元:WindowsXP
開発:VC2005

recv()の戻り値が-1
WSAGetLastErrorでエラーコードを取得したら
183だった。
ということですm(_ _)m

>>868
すまん、WSAGetLastError使ってた。



870 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 20:26:54 ]
wineをみるとWSAGetLastErrorとGetLastErrorは同じものです。
recvのすぐ後でミューテックスをロック/アンロックなどを
しているんではないですか?

871 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:06:23 ]
class MyClass {
protected:
struct foo_t{
struct bar_t{

}foo;

};

872 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:10:14 ]
すみません。途中で書き込んでしまいました。
class MyClass {
protected:
 enum {NUM = 5};
 struct foo_t{
  struct bar_t{
  }bar[NUM];
 }foo;
};
VC6で上記コードをコンパイルすると、NUMにアクセスできないというエラーが出ます。
NUMをpublicで定義すると大丈夫です。
構造体の入れ子になった場合はpublicでないとアクセスできないのでしょうか?

class MyClass {
protected:
 enum {NUM = 5};
 int foo[NUM];
};
ちなみにこちらは問題ありませんでした。

873 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:13:49 ]
bar_tを外で宣言するか
foo_tに適切なコンストラクタを用意すれば良い

874 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:20:09 ]
gcc4.2.1なら大丈夫

875 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:20:18 ]
レスありがとうございます。

fooはPOD型であってほしいので、コンストラクタを用意するのは望ましくないです。
後出しですみません。

bar_tを外で宣言するというのはどういうことでしょうか?

876 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:21:33 ]
>>874
VC6なのでenumハックを使っています。

877 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:39:37 ]
VC6なんて窓から投げ捨てろ

878 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:40:35 ]
>>876
VC6はもうVC6言語だと思った方がいいくらい、標準と違う。
そんなクソ環境、捨ててしまえ。

879 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:48:19 ]
eclipseとgccにすればっ



880 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:52:01 ]
VCのお手軽感捨てたくなければ最新のExpressって手もあるな
VC6はリソースの編集専用にすればよろし

881 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:52:07 ]
全く持ってその通りなんですが、納品先がVC6で開発してるものでorz

882 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:54:53 ]
納品先を捨ててしまえ!、え?、違うって(ry

883 名前:デフォルトの名無しさん mailto:sage [2009/06/10(水) 23:59:41 ]
publicにすればビルドできるのでそうしときます

884 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:06:36 ]
gccってfriendつけないでも平気なんだ 知らなかった

885 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:11:06 ]
今、双方向のリスト構造のテストプログラム組んで思ったんだけど

int main{
  // hpはノードのポインタ型
  //--上・省略--
  hp = hp->next;
  //--下・省略--
}

っていう風にやったら普通にうまくいくんだけど、
これを関数かしてやって
void gotoNextNode(Node* pnode){
  pnode = pnode->next;
}

int main{
  // hpはノードのポインタ型
  //--上・省略--
  gotoNextNode(hp);
  //--下・省略--
}

ってやったら「pnode = pnode->next;」の部分が効かないみたいなんだけどなんでだろorz?

886 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:14:28 ]
それは、ローカル変数に入れても、なにもならん

887 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:15:48 ]
gotoNextNode(&hp);

888 名前:885 mailto:sage [2009/06/11(木) 00:18:06 ]
ノードのポインタ型は下のようになってて
typedef struct _Node{
    int num;
    struct _Node *next;
    struct _Node *back;
}Node;
ポインタ渡してるからいけるんじゃね?・・・って思ったんだけどさ

889 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:19:12 ]
*pnode = pnode->next;
じゃなくて?



890 名前:885 mailto:sage [2009/06/11(木) 00:20:06 ]
んで、hpはNode* hpで定義してます

891 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:20:53 ]
void gotoNextNode(Node* &pnode){

892 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:22:51 ]
C++ならポインタのリファレンスが使えるから

gotoNextNode(Node*& pnode)

893 名前:885 mailto:sage [2009/06/11(木) 00:27:08 ]
うは、確かに*の横に&付けたらうまくいったわサンクスコ
*&なんて使い方初めて知ったわ

894 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 00:29:27 ]
void gotoNextNode(Node**pnode){
*pnode = (*pnode)->next;
}

型 & hoge
だから別に特殊なことやってる訳じゃないよ

895 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:40:37 ]
なんで二重ポインタやポインタ+リファレンスを使わないといけないんだろう・・・?
ポインタが仮想変数になったときにポインタじゃなくて値として扱われてしまうとか?

896 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:46:44 ]
int i = 5;
myFunc(i);
void myFunc(int a)
{
 a = 1;
}

ってやって、iの値が変わらないんだけど!って言ってるのと同じであることはわかった上で、
不満だと言っている?

897 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:47:44 ]
単純に「ポインタで受け取れば引数の変更が呼び出し元に反映される」と考えてはいけない。
引数に対する変更が呼び出し元に反映されるためには、
変更したいものを指すポインタを受け取るとか、変更したいものを参照で受け取るとか
しないといけない。

>>855の hp = hp->next; というコードは、ポインタの値を変更してるよね。
「変更したいもの」がポインタなんだ。
だから、ポインタのポインタとか、ポインタの参照を受け取らなければならない。

898 名前:897 mailto:sage [2009/06/11(木) 01:48:37 ]
>>855じゃなくて>>885だった。分かると思うけど。

899 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:52:06 ]
void myFunc(int a)
{
 a = 1;
}
の例はすぐに関数抜けた時点でaが開放されて値が消えるってのは分かるけど・・・
その例と同じってのは分かってないわ・・・スマン



900 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:59:13 ]
typedefしたら分かりやすいか?

typedef Node* PNode;
PNode hp;

void gotoNextNode(PNode pnode){
  pnode = pnode->next;
}

int main{
  // 略
  gotoNextNode(hp);
  // 略
}

hpは変更されない。これはほぼ>>896と同じ。
受け取ったPNode値への変更が呼び出し元に反映されるには、PNode* や PNode& で受け取らないと。

901 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 01:59:44 ]
int型の変数である、iの値を変更したい場合に、
int型を指すことができるポインタ(int*)、もしくは参照(int&)で受けなければならない
というのはわかっているってことね?

だったら、こう置き換えてみたら?
Node*型の変数である、hpの値を変更したいのであれば
Node*型を指すことができるポインタ(Node**)、もしくは参照(Node*&)で受けなければならない

902 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 02:06:48 ]
あー、typedefで何を言いたいかって考えたらなんとなく分かってきたわ。
単にポインタで受け取る時は値を変更する時にも使うから、
それと同じ状態になって関数を抜けるから無効になってるということで
ポインタを変更したいときはPNode* や PNode& で受け取らないといけないって感じでおk?

903 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 02:17:44 ]
ポインタを代入したいから >895

904 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 02:24:21 ]
>>902
まあ、そういう理解でおk。
typedefなんか持ち出して余計混乱させたらどうしようかと思ったが、たぶんちゃんと通じてると思う。

905 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 16:09:30 ]
K&Rでは構造体をうまく使ってわかりにくいダブルポインタを回避していた
C++ならイテレータクラスを作ってポインタのやり取りそのものを回避(中は結局ポインタだけど)

ダブルポインタを使う時点でもしかしたら設計に問題が^^

906 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 20:45:54 ]
pimplで使うスマートポインタって皆さんどうしてます?
ディープコピー方式のoperator=を持つshared_ptrがあれば便利だと思うんですが、どうもなさそうです。

907 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 20:54:12 ]
>>906
shared_ptrは浅いコピーだからこそpimplイディオムは生きるのだよ。

でもまあディープコピーにしたいこともあるのかもね。
ディープコピーにしたいってどんな状況?
class MyClass;
class MyClass_impl;
だとして、MyClassのコピーコンストラクタを適切に定義すれば
boost::shared_ptrで十分じゃないかと思うよ。

908 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:07:50 ]
>>907
pimplイディオムを使わないでMyClassを実装した場合と同じ挙動にしたいです。
コピーコンストラクタやoperator=を書かない事(コンパイラまかせ)はよくあるので、
そういった場合にpimplで実装した事によって挙動が変わるのは嫌だなと思います。

909 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:30:54 ]
pimpl使う版と使わない版のMyClassが必要で、その挙動を変えないためってこと?
何のためにそんなことするのかは知らないけど、同じようなクラス2つ書いてコード重複するくらいなら
pimplなんか使わない方がいいよ



910 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:01:04 ]
>>909
pimpl版と非pimpl版の2つがあるわけではないです。
pimplイディオムで実装することによって、注意しなければいけない事を増やしたくないという意味です。
MyClassのコピーコンストラクタやoperator=を書き忘れて(pimplじゃなければ書かなくてもOKだから忘れやすい)
バグが発生したりしないために自動でディープコピーになってくれた方が便利だと思います。

911 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:14:55 ]
>910
boost::any使いなされ。あれは値のセマンティクスになってるよ。
>774みたいに突っ込むコンテナによってセマンティクスを変える手もあるけど。

912 名前:907 mailto:sage [2009/06/11(木) 22:17:10 ]
>>910
あー、言いたいこと分かった。
要は君自身、今のところは問題無くpimplイディオムを使えてはいるけど、
いつかうっかりしそうだからディープコピーなshared_ptrがあったら
いいなぁ
ってことだよね?

でも
>自動でディープコピーになってくれた方が便利だと思います。
いやいやそりゃ困るよ。
浅いコピーだからこそ生きるpimplイディオムの状況ってかなりあるのだよ。
例えばoperator=で浅いコピーにすることにより超高速なコピーが出来るわけ。

913 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:29:39 ]
デフォでshallow copyで
deep copyは明示的にclone()を使うっていう決まりを作るとか

914 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:38:07 ]
デフォはdeep copyで
shallow copyは明示的にdangerous_clone()を使う決まりの方がいいです

915 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:57:35 ]
>>911
pimplにboost::anyを使うというのは初めて知りました。
確かに便利ですね。
弱点をあげるなら、速度が若干遅くなりそうなところでしょうか。

>>912,913
>>914の方が私は直感的にわかりやすく感じます。

ありがとうございました。


916 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 23:07:55 ]
直感的にわかりやすいかどうかよりも、間違いが起こりにくいという点で>>914の方がいいなあ。
間違えてデータ壊れるか、間違えて処理が遅いか、なら後者の方がいい

917 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 00:48:51 ]
C++はヒープの無い環境でも使えるようになっていて、
組み込みでも実際使われている。
それをデフォでdeep copyなんかにされたらたまったものじゃない。

918 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:09:30 ]
deep copyだとまずい理由がある時は明示的にshallowにすればいいじゃん。
deepで困るケースは少ないんだからデフォはdeepでOK。
つーかshallow copyによる高速化とpimpl関係なくない?たまたま一石二鳥になっているだけで。

919 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:19:44 ]
そもそも、pimplで深いコピーにするのが不可能でも特別面倒でもないでしょ。
ほかのメンバ関数と同じ調子で、コピーコンストラクタとoperator =を定義するだけのはず。



920 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:25:56 ]
だからコピーコンストラクタと代入演算子を定義し忘れるから
Pimplはdeep copyをデフォにして欲しいと言ってんの

もしかしてアフォ?

921 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 02:22:00 ]
shallow copyをする気がないなら、そもそもshared_ptrにしなくていいのでは。
auto_ptrやscoped_ptrにすれば、コピーコンストラクタと代入演算子を定義し忘れることはない
(定義し忘れるとコピーがコンパイルエラー)。

922 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 03:05:27 ]
>>921
auto_ptrもscoped_ptrも不完全型には使えない。
ttp://d.hatena.ne.jp/Cryolite/20060108 (不完全型によるコンパイラファイアウォールとスマートポインタの両立(その1)以降を参照)

空のデストラクタを書くのも手間だし、コピーコンストラクタと代入演算子を書くのも手間。
deep copyにしたくてshared_ptrを使いたいなんて言ってるやつはいない。pimplにぴったりのスマートポインタないっていう話。

923 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 04:03:21 ]
うーん。明示的にデストラクタ書かなきゃいけないのがそんなにデメリットだとは思ってなかったんだが
まあ、気にする人も結構いるのか。

924 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 04:13:30 ]
unique_ptrがoperator=でdeep copyしてくれればいいのに。

925 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 06:54:12 ]
当然じゃねーの?てな部分に疑問を呈す >>922 の様な人が声高に暴れて言語やライブラリのカオス度が濃くなるんだよな
科学技術とか未踏の分野の開拓なら役に立つかもしれんけど邪魔な存在だな

926 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 07:35:04 ]
しかしpimpl_ptrは何回もrejectされている…

927 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 08:26:46 ]
pimpl自体、きもいイディオムだから、あんなの使わなくて済むようななにかを追加して欲しい

928 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 08:27:37 ]
何の話をしているのかいまいちわからないが
ポインタ型があったとして

A a, b;
A *pa=&a, *pb=&b;
pa = pb;

こうしたら、aがbの値に上書きされるってこと?
なんだがおかしいね。
*pa = *pb; だよね普通。


929 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 09:52:42 ]
個人的にpimplを使うようなでかいクラスは大体コンストラクタとかも
全部ソースで定義するのでscoped_ptrで問題なし



930 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:44:45 ]
ちょいとしつもんだんですが、

30,000x30,0000x4程度のbool配列と、30,000x30,0000のint配列を使いたいという思いでいっぱいです。

しかし単純に配列を作ってしまうと、やはりout of memoryです。

どうにかして要素数を減らすのが一番だとは思うんですが、

一般的に、このように膨大な要素の配列を扱わざるをえない場合にはどのような方法を用いるのでしょうか?


931 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:49:51 ]
>>930
疎なデータならその部分だけを保持する

932 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:51:08 ]
>>930
速度が滅茶苦茶遅くていいならファイルをメモリと見なし
operator[]をオーバーロードするとか

933 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:09:18 ]
>ちょいとしつもんだんですが、

質問団?w
そのくらいの量なら、64bitOSで普通にnewでもvectorでも持てると思うけど。
まぁ、swapされるのは覚悟する必要があるな。
処で、それ本当に必要なの? 疎行列として扱うとか、boolではなくcharかbitで保持するとかできない?

934 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:29:57 ]
>>933
>64bitOSで普通に
さらっと、OSレベルで条件付け加えんなw
アフォか

935 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:32:54 ]
>>934
2バイト整数を3万掛ける3万なら、32bitOSでも普通にOK。
今時、Windowsでも2GB位積んでるのが当たり前だしね。

936 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:38:47 ]
> 30,000x30,0000x4程度のbool配列と、30,000x30,0000のint配列を使いたいという思いでいっぱいです。

30,0000?


937 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:41:11 ]
うお、それは気づかなかった。30万なのか?w

938 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:43:13 ]
2G程度あっても無駄無駄無駄ーなのです

939 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:58:11 ]
ごめんなさい!3万x3万です!ちなみに768MBしか積んでません><クズです!
>>931-933
0or1のフラグとして使うつもりでboolを使いました。

やろうと思っていることは、「生物学で使うDNA塩基配列のアライメント」で
int 3マンx3マンを隅から数値を埋めていく一方で、
その数値を確認しながら条件に従って、その要素に対応するboolの配列の要素1-3に1or0を入れていく。

ということを行っています。

intの配列array[i][j]については[i+1][j+1]まで処理した時点で破棄できるのでもっと少なくできると思うんですが、

bool配列についてはすべて埋め終わった後に、もう一度フラグの確認をしていくのですべて残しておく必要があります。


ちなみにbool型が一番サイズが小さいと勝手に思い込んでいました。



940 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:05:43 ]
なんだか良くわからないけど,計算用の鯖用意すれば解決するんじゃないかな^^;
パソコンでやるなら>>933とか.

でも
> int 3マンx3マンを隅から数値を埋めていく一方で、 
> その数値を確認しながら条件に従って、その要素に対応するboolの配列の要素1-3に1or0を入れていく。
これって注意深く行うとすると,今状態[3万×3万]と次状態[3万×3万]が必要になるんじゃないかい?
軽くめんどくさい

941 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:26:39 ]
int配列やbit配列の要素間で、相互参照がないなら
ストレージに対して、逐次読み出し、逐次書き込みで
いいんじゃねーの。

942 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:31:29 ]
塩基配列なら AGTC の4種
30kx30k 900M
1bit データなら 900M/8 = 112MB
塩基配列なら4種2bit 900M/4 = 225MB

メモリに載せるのは可能っぽい

943 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:35:52 ]
>>939
768MBでも仮想記憶があるから屑だなんて言っちゃイヤ!

と言うのはさておいて。

>intの配列array[i][j]については[i+1][j+1]まで処理した時点で破棄できるのでもっと少なくできると思うんですが、
これは、相互参照があるってことなのかな?
だとしても、1行3万点として前後1行ずつで併せて3行がメモリにあれば事が足りるよね。
後は、ディスクをぶん回すことになるけどなんとかなりそうだ。
# 最初は1000x1000くらいに絞って作らないとデバッグの段階で死ねるね。

944 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:51:27 ]
連続領域で取ることができないだけなので、int**にして3万を3万回動的確保すればいけるんじゃないの?






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<243KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef