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


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

【初心者歓迎】C/C++室 Ver.69【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 16:10:55 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.68【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1253193779/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か   に置換すると見栄えだけはよくなります。

2 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 16:39:55 ]
>>1
お疲れさまです。

3 名前:前スレ964 [2009/10/20(火) 16:45:59 ]
pc12.2ch.net/test/read.cgi/tech/1253193779/
atexit()で終了関数呼び出して
その中で
delete this;
なんてやったらだめなんでしょうかね?

4 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 16:56:21 ]
pc12.2ch.net/test/read.cgi/tech/1253193779/764かな?
そこまでして自己破壊する理由は?
単にexit()を使わなければいいだけなのに敢えてそうしない理由が判らん。

5 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 17:11:15 ]
> exit関数をつかったらデストラクタを呼び出せずにプログラムが終了してしまうので
exit関数を使わなければよいことは分かってるんでしょう。
その上で、どうしてもexit関数を使いたいってことだろうから
余程の事情があるんだと思うよ。
好奇心からという可能性も。

6 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 17:46:34 ]
>>3
exitを使わない方法を検討した方がいいよ

7 名前:前スレ964 [2009/10/20(火) 18:18:10 ]
まちがえた>>764です

8 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 19:37:58 ]
>>3
exitすれば自動変数のデストラクタが呼ばれないから無理です。

9 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:00:43 ]
だがちょっと待ってほしい。atexitで自動変数のクラスオブジェクトのデストラクタを呼ぶ
というのはどうか。

hoge.~hoge();


10 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 23:14:07 ]
>>9
スタックが全部破棄された後なんだからダメだろうよ。



11 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 00:07:30 ]
ウィンドウズモバイルとか携帯用OSでC/C++ってできるの?


12 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 00:09:50 ]
できるよ。

13 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 00:24:50 ]
まじポン?

14 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 00:27:28 ]
「できる」の意味がわからんが、使えないわけがないだろう。

15 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 00:29:59 ]
visual c++とかも使えるのか

16 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 00:33:09 ]
eMbedded Visual C++ 4.0

17 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 05:47:46 ]
BREWとかもC++環境は一応あるな
制約が相当ひどいけど、少しずつマシにはなっている模様(例外が使えなかったのが
使えるようになったり)

18 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 11:01:08 ]
どうすればいいんでしょうか?

19 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 11:03:22 ]
何をどうしたいんでしょうか?

20 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 13:11:16 ]
GetWindowRectがうまくつかえません、教えてください
左上100,100の座標にあるウインドウのサイズを取得したいのですが
GetWindowRect関数でエラーが出てしまいます
#include <iostream>
#include <string>
#include <windows.h>
#include <WCHAR.H>
using namespace std;
int main(){

HWND bbb ;
POINT aaa = {100,100};
bbb = WindowFromPoint(aaa);//左上のウィンドウを取得

LPRECT x ; //ウィンドウの座標値用変数
GetWindowRect(
bbb, // ウィンドウのハンドル
x // ウィンドウの座標値
);
cout<<x->top<<"\n"<<x->bottom<<"\n"<<x->left<<"\n"<<x->right<<"\n";
}



21 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 13:13:10 ]
>>20
危ないから、xはポインタにしないで〜。

22 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 13:35:16 ]
#include <iostream> 
#include <string> 
#include <windows.h> 
#include <WCHAR.H> 
using namespace std; 
int main(){ 
HDC hdc=NULL;
HWND bbb=NULL ; 
POINT aaa = {100,100}; 
bbb = WindowFromPoint(aaa);//左上のウィンドウを取得 

RECT x ; //ウィンドウの座標値用変数 
GetWindowRect( 
bbb, // ウィンドウのハンドル 
&x // ウィンドウの座標値 
); 
/*omake*/
hdc = GetDC(NULL);
MoveToEx(hdc,x.left,x.top,NULL);
LineTo(hdc,x.left,x.bottom);
LineTo(hdc,x.right,x.bottom);
LineTo(hdc,x.right,x.top);
LineTo(hdc,x.left,x.top);
ReleaseDC(NULL,hdc);
/**/
cout<<x.top<<"\n"<<x.bottom<<"\n"<<x.left<<"\n"<<x.right<<"\n"; 
return 0;


23 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 13:41:06 ]
>>21-22
ありがとうございます!

24 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 14:41:16 ]
C言語始めたばかりのものです。
ファイルを開いて、1レコードづつ読みこんでから各項目ごとに決められた
バイト数で分けるのって、どうゆう関数を使えばいいんでしょうか


25 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 14:47:24 ]
fopen(), fclose()
fgets()
sprintf()

26 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 14:53:02 ]
ほかのプログラムの出力をメモリに読み込むにはどうすればいいの?

たとえば適当な数列を並べて出力するプログラムがあったとして
それを文字列としてstringに入れるといった感じで

27 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 15:00:42 ]
>>26
大抵の環境なら、リダイレクトを使えばいい。
例えばWindowsなら
some.exe | other.exe
unix系なら
some | other
といった要領。
これなら前者は標準出力でいいし、後者は標準入力でいい。
必要なら、片方がもう片方をpopen()で起動してもいい。
双方向であったりパフォーマンスが要求されるなら事が足りないが、
先ずはこの辺りから始めては如何か。

28 名前:デフォルトの名無しさん [2009/10/21(水) 15:08:32 ]
>>25
ありがとうございます。
やってみます

29 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 15:59:14 ]
ポップアップメニューを表示させたくて、下のコードを書いたんですが、セパレータが一つあるだけのポップアップメニューが表示されてしまいます。
本当は「v メニュー」というのが表示されて欲しいのですが。どこを直せばいいでしょう。
環境はVC++2008EEです。

HMENU menu = CreatePopupMenu();
MENUITEMINFO mii;
memset(&mii, 0, sizeof(MENUITEMINFO));
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA;
mii.fType = MFT_STRING;
mii.wID = 1;
mii.fState = MFS_CHECKED;
mii.dwItemData = (DWORD)"メニュー";
InsertMenuItem(menu, 0, true, &mii);

POINT pt;
GetCursorPos(&pt);
TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, pt.x, pt.y, 0, hwndView, NULL);
DestroyMenu(menu);

30 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:06:35 ]
メソッドの返り値を.演算子呼び出しのときと->演算子呼び出しのときで分岐することはできますか?

struct widget
{
    xxx method();
};

widget w, *p = new widget;

w.method(); // 参照を返したい
p->method(); // ポインタを返したい

// ↓のように使いたい

w.method().method().method();
p->method()->method()->method();

// ↓のような形は統一感がないから避けたい

p->method().method().method();



31 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:07:44 ]
>>10
実験してみたら、スタックが全部破棄される前にatexitで登録した関数で
デストラクタを走らせることができたよ。

32 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:10:29 ]
>>30
> w.method().method().method();
> p->method()->method()->method();

こっちのほうがよっぽど統一感がない。

そもそも.演算子はオーバーロードできない。

33 名前:29 mailto:sage [2009/10/21(水) 16:15:48 ]
mii.dwItemData = (DWORD)"メニュー";
のところを
mii.dwTypeData = _T("メニュー");
mii.cch = wcslen(mii.dwTypeData);

にしたら一応出るようになりました。失礼しました〜。

34 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:54:41 ]
最近気がついたんだけど、メンバ変数を下のほうに書くスタイルだとclassよりstructのほうが楽だね


35 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:31:57 ]
>>34
何がどう楽?

36 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:34:53 ]
デフォルトプロテクションじゃね? しらんけど

37 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 19:31:40 ]
総和を求めるプログラムです、いつも思うのですが、この
template <typename T, class Iterator>
という引数を
template <class Iterator>
Iterator だけにして、Iterator からT 型を推論できないでしょうか?
具体的に説明しますと
std::vector<int> vec;
std::vector<int>::iterator = vec.begin();
このvec.begin() からint 型を推論できないでしょうか?

template <typename T, class Iterator>
T Sum(Iterator& first, Iterator& last)
{
T sum = 0;
while ( first != last ) {
sum+=*first;
++first;
}
return sum;
}

38 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 19:40:38 ]
>>37
std::accumulateに何の不満があるのか

39 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 19:46:33 ]
>>37
std::iterator_traits<Iterator>::value_type

40 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 19:50:08 ]
>>38
ありがとうございます。
たしかに、acumulate で総和は求まるのですが、総和を求めるということは
今回、例えであって、疑問の本質はIterator からT 型が推論できるテクニックが知りたいのです、
言葉足らずですみません。




41 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 19:51:20 ]
>>39
ありがとうございます
やっと、std::iterator_traits の意味が理解できました。

42 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 19:52:03 ]
C++0xならもっと気楽になるね

43 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 19:53:42 ]
質問の本質をちゃんと読めないコミュ力不足の回答者って困るよね


〜はどう実装してるの? つミboost::hogehoge ←こいつマジアホ


44 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:03:02 ]
この質問内容だとaccumulateを提示されるのは当然じゃね

45 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:04:26 ]
言葉足らずというか余計なこと言うからじゃね?

46 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:04:27 ]
Boostならともかく標準だしなぁ

47 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:06:42 ]
template <typename T, class Iterator>
という引数を
template <class Iterator>
Iterator だけにして、Iterator からT 型を推論できないでしょうか?
総和を求めるプログラムを例として説明しますと

という書き始めであればよかったと

48 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:08:26 ]
つーか>>43が要らないだけじゃね?

49 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:24:41 ]
>>47
これがベストかな。一応質問では推論できないか?というところが疑問文だから、
それに答えればいいのだろうけど。まあ、でも、誤解はしなかった。

50 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 22:36:30 ]
>>31
スタックが破棄される前なのか後なのか、どうやって確認したんだ?



51 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 22:37:13 ]
>>30
(*p).method().method().method() ですべて解決だ。

52 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 23:01:21 ]
>>41です。おかげさまで、
template <typename T, class Iterator>
という引数を
template <class Iterator>
Iterator だけにして、Iterator からT 型を推論できるようになりました。ありがとうございました。
さて、教えて頂いた知識をベースに標準偏差を求めるプログラムを作り、コードをここに貼りました
codepad.org/H2ZC4RSO(掲示しているcodepad のコンパイラではエラーが出ていますが、VS2005 ではコンパイル、実行できます)
StandardDeviation クラスに、下記の関数を組み入れたいのですが、上手くいきません、方法を教えて頂けないでしょうか。
/**
* @brief 平均値
* @param[in] Iterator first 配列の先頭
* @param[in] Iterator last 配列の末尾
* @return sum / cou 平均値
*/
template<class ResultType>
typename std::iterator_traits<ResultType>::value_type average(ResultType first, ResultType last)
{
typedef std::iterator_traits<ResultType>::value_type value_type;
value_type cou = last - first;
value_type sum = std::accumulate(first, last, value_type(0.0));
return sum / cou;
}

53 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 23:16:42 ]
template<class ResultType>
typename std::iterator_traits<ForwardIter>::value_type average(ForwardIter first, ForwardIter last)
{
typedef std::iterator_traits<ForwardIter>::value_type value_type;
value_type cou = *last - *first;
value_type sum = std::accumulate(first, last, value_type(0.0));
return sum / cou;
}

54 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 23:17:13 ]
>>52
std::iterator_traits<ResultType>::difference_type

55 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 23:17:24 ]
あ、1行目もForwardIterね

56 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 23:20:19 ]
>>52
イテレータの距離を求めるにはstd::distanceを使う。

57 名前:53 mailto:sage [2009/10/21(水) 23:24:39 ]
なんか俺意味わからないことやってるね。死のう


58 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 23:31:10 ]
>>41 です
皆さんありがとうございます。これでいいのかな?そして、この平均値を求める関数を、クラスに組み入れるにはどうしたらいいのでしょうか?
わざわざ、クラスに組み入れなくてもいいじゃんという、意見も聞こえてきそうなのですが、教えて頂けないでしょうか。
template<class ForwardIter>
typename std::iterator_traits<ForwardIter>::value_type average(ForwardIter first, ForwardIter last)
{
typedef std::iterator_traits<ForwardIter>::value_type value_type;
value_type cou = std::distance(first, last);
value_type sum = std::accumulate(first, last, value_type(0.0));
return sum / cou;
}

59 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 23:35:00 ]
class Hoge { template <・・・> ave(I f, I l) {・・・ } };

Hoge h; res = h.ave(f, l);

60 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 23:44:11 ]
>>58
couの型はvalue_typeじゃないだろ。




61 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 23:53:42 ]
>>58 です、下記の通りにしますと、こうなってしまうのですが?
error C2955: 'StandardDeviation' : クラス テンプレート を使用するには テンプレート 引数リストが必要です
error C2133: 'sd' : サイズが不明です。
error C2512: 'StandardDeviation' : クラス、構造体、共用体に既定のコンストラクタがありません。
error C2662: 'double StandardDeviation<ForwardIter>::average<std::_Vector_iterator<_Ty,_Alloc>>(ForwardIter,ForwardIter)' : 'StandardDeviation' から 'StandardDeviation<ForwardIter> &' へ 'this' ポインタを変換できません。
template <typename ForwardIter>
class StandardDeviation
{
ForwardIter val_;
public:
template<class ForwardIter>
typename std::iterator_traits<ForwardIter>::value_type average(ForwardIter first, ForwardIter last)
{
typedef std::iterator_traits<ForwardIter>::value_type value_type;
int cou = std::distance(first, last);
value_type sum = std::accumulate(first, last, value_type(0.0));
return sum / cou;
}
StandardDeviation( const ForwardIter& val ) : val_( val ){}
void operator()( ForwardIter& elem ) const
{
elem -= val_;
elem *= elem;
}
};
StandardDeviation sd;
AVE = sd.average(vec.begin(), vec.end());


62 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 00:07:29 ]
なんでそこに入れるんだよ。アホか

63 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 00:52:26 ]
codepad.org/J9oJ1Pbm

64 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 00:56:04 ]
あ、関係ないけど、>>63のfor_eachは移植性ないよ。

65 名前:41 mailto:sage [2009/10/22(木) 01:48:56 ]
>>63
標準偏差の答えが、合っています?


66 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 01:56:33 ]
size_t cou = abs( distance( first, last ) );

こう修正しないとだめだな。

67 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 02:00:56 ]
>>66
std::accumulate使ってるんだからfirst<lastを仮定していいだろ

68 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 02:17:08 ]
ふむ。確かに。では単純に

size_t cou = distance( first, last ); // first と last の順番が逆

と修正。

69 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 06:52:00 ]
>>50
別のクラスオブジェクトをmainの自動変数で作って、exit呼び出し時にデストラクタが走ってない
ことを確認した。

70 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 08:12:32 ]
>>69
デストラクタが走らないとまずいね




71 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 10:10:50 ]
>>70
だからatexit()で走らせたんだろ。

72 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 10:28:26 ]
このStandardDeviationって名前は気持ち悪いなぁ。
operator()()が返すのは単に(内部で持っている)平均値との差の平方じゃないか。
どうせなら、StandarDeviation(vec.begin(), vec.end())って関数にしてくれ(ぉぃ
# まぁ、既に手元には平均やら標準偏差やらを返すメンバ関数を持つ、クラスがあるから要らないけど。

73 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 12:35:16 ]
>>69
それがスタック破棄の前後と関係すると思ってるのなら勘違い。

74 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 12:51:35 ]
>>73
なぜ? スタックの破棄はオブジェクトの破棄を終えてから行うのでは?

75 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 13:15:55 ]
>>74
通常の関数脱出時の動作ではそうだけど、 exit() したときにはそもそも関数脱出の
動作は行われないのだから、関係ないでしょ。


規格を確認すると 3.6.1 p4 に exit() 呼び出し時の動作が書いてあった。
> Calling the function
> void exit(int);
> declared in <cstdlib> terminates the program without leaving the current block and hence without
> destroying any objects with automatic storage duration.

これに加えて 3.7.2 Automatic storage duration p1 から
> The storage for these objects lasts until the block in which they are created
> exits.
ということで、スタックは保持されたままなので atexit() で自動変数のデストラクタを
呼びだしても問題ないみたい。


ただし、 atexit() にその処理を正しく登録することがほとんど不可能なんじゃないかと思う。

76 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 13:25:50 ]
>>75
なるほど。exit呼び出し時にはオブジェクトの破棄を行わないのだから、>>69では
確認になってないということね。だが、それでは、>>10の突っ込みがよく分からないが。
>>75=>>10という意味ではない)

ただ、実験したのは>>9なので、君の言うとおり結局は問題ないでしょ。atexitに登録した
関数ではグローバル変数のポインタにmainでの自動変数のアドレスを代入して行った。
ほぼ無意味で、実用性のない手法だが、可能は可能ということで。

77 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 13:29:55 ]
と言うか、スタック上のオブジェクトが破棄されないのであれば、>>73の指摘の
意味がよく分からない。スタック上のオブジェクトが破棄されないのだから、
mainでの自動変数のデストラクタより、atexitに登録した関数でmainでの自動変数の
デストラクタのほうが先に走るのは当たり前だから。

78 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 13:42:35 ]
「よく分からない」
の使い方が変じゃないか?
>>10はそれを勘違いしてたのだろうか
>>73はスタックが保持されることを知らなかったのだろうか
とかでよくね


79 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 13:43:51 ]
×>>73の指摘の意味がよく分からない
>>73は俺と同じく、スタックが保持されることが確実であることを知らない人だったのかな

80 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 13:45:11 ]
exitを呼び出した時点で自動変数のデストラクタを呼び出さないまま、その記憶域だけが
解放されてしまう可能性があると考えていたんだろう。で、実はその心配はないという話。



81 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 13:45:37 ]
>>75の最終行の通りだと思う。

82 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 13:49:36 ]
>>78
変ではないと思うよ。

>>79
まあ、そういうことだね。

>>81
不可能ではないよ。実際やったので。

83 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 14:01:07 ]
つーかそんな怪しいことするくらいなら例外投げればいいのに

84 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 14:03:27 ]
>>83
>>76の最終行だね。

で、この話は前スレから続いてて、>>3>>8が突っ込んで、>>9で冗談めかして書いた
という流れ。

85 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 14:04:53 ]
>>82
だから、間違いなくatexit()で呼び出されるように登録することは難しいといいたいのだろ。
少なくとも、exit()を使わないと言う同程度で済むもっとスマートな方法があるのだから。

86 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 14:07:33 ]
>>85
>>76
> atexitに登録した関数ではグローバル変数のポインタにmainでの自動変数のアドレスを代入して行った。

これでは駄目か?

> 少なくとも、exit()を使わないと言う同程度で済むもっとスマートな方法があるのだから。

例えば? 例外は話題にあったけど、それはパフォーマンスコストが高くなる可能性があると
いう意見があった。だが、例外でってこと?


87 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 14:09:39 ]
分かりづらいかな。

つまり、main内で自動変数のオブジェクトのアドレスをグローバル変数のポインタに
代入し、atexitに登録した関数内でそのグローバル変数のポインタから逆参照して
デストラクタを実行する処理を書いたということ。

88 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 14:17:27 ]
ぶっちゃけatexitでどうにかしようとする方が遙かにコストは高いだろ
つーか例外コストを異常に高く考えすぎ

89 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 14:23:31 ]
>>86
正常系なら main まで return してくるのが望ましい。
異常系なら例外でおk。

90 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 14:24:55 ]
>>87
そんな方法、ふつうにいくつか関数呼び出してそれぞれに自動変数があるってだけで破綻するだろ。



91 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 15:39:42 ]
>>88 >>90
atexitで何とかするってのは元々ネタで、それが駄目とか言われたからやってみたって
流れなんじゃないの。

>>89
mainまでreturnしてくるってのは正しい手法ではあるが、普通であって、スマートではないな。
実際面倒だし。

92 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 16:38:36 ]
cデータを1件ずつ読んで、商品番号をキーに金額を集計し商品番号が変わったらブレイクして
集計した金額を出力させたいのですがif文での作り方がわかりません。
誰か教えてください。

93 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 18:33:03 ]
>>92
前の商品番号を記録しておく

94 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 19:00:24 ]
メインスレッドをサブスレッドから一時休止するためにHANDLEがほしいのですが、
メインスレッドのハンドルを取得する関数ってありますか?

95 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 19:05:22 ]
>>94
環境依存。まぁ、サブスレッド起動時に渡しておけば?

96 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 19:59:46 ]
>>91
> それが駄目とか言われたからやってみた
そんで、ほんとに出来たのかなあと思って突っ込んだらだんまりになっちゃったという流れ

97 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 20:00:58 ]
できるかできないか以前の問題だと思うがな
やれたところで糞設計すぎて全く話にならないのは確定なんだし

98 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 20:04:41 ]
struct iface
{
virtual void method() = 0;
};

class widget : public iface
{
virtual void method() { ・・・ }
};

int main(void)
{
iface *p = new widget; p->method(); return 0;
}

こういう風に継承の過程で可視性を変えるのはありなんでしょうか?

99 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 21:03:15 ]
>>96
できたのは事実だし、だんまりでもない。スレを読み返せ。

>>97
やりもしないでやった気でいるよりもましだと思うぜ。

100 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 21:06:16 ]
環境依存のことを実験しても意味ないだろ








[ 続きを読む ] / [ 携帯版 ]

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

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