【初心者歓迎】C/C++室 Ver.69【環境依存OK】
at TECH
1:デフォルトの名無しさん
09/10/20 16:10:55
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.68【環境依存OK】
スレリンク(tech板)
【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
URLリンク(codepad.org) (コンパイルもできるし出力結果も得られるのでお勧め)
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
2:デフォルトの名無しさん
09/10/20 16:39:55
>>1
お疲れさまです。
3:前スレ964
09/10/20 16:45:59
スレリンク(tech板)
atexit()で終了関数呼び出して
その中で
delete this;
なんてやったらだめなんでしょうかね?
4:デフォルトの名無しさん
09/10/20 16:56:21
スレリンク(tech板:764番)かな?
そこまでして自己破壊する理由は?
単にexit()を使わなければいいだけなのに敢えてそうしない理由が判らん。
5:デフォルトの名無しさん
09/10/20 17:11:15
> exit関数をつかったらデストラクタを呼び出せずにプログラムが終了してしまうので
exit関数を使わなければよいことは分かってるんでしょう。
その上で、どうしてもexit関数を使いたいってことだろうから
余程の事情があるんだと思うよ。
好奇心からという可能性も。
6:デフォルトの名無しさん
09/10/20 17:46:34
>>3
exitを使わない方法を検討した方がいいよ
7:前スレ964
09/10/20 18:18:10
まちがえた>>764です
8:デフォルトの名無しさん
09/10/20 19:37:58
>>3
exitすれば自動変数のデストラクタが呼ばれないから無理です。
9:デフォルトの名無しさん
09/10/20 23:00:43
だがちょっと待ってほしい。atexitで自動変数のクラスオブジェクトのデストラクタを呼ぶ
というのはどうか。
hoge.~hoge();
10:デフォルトの名無しさん
09/10/20 23:14:07
>>9
スタックが全部破棄された後なんだからダメだろうよ。
11:デフォルトの名無しさん
09/10/21 00:07:30
ウィンドウズモバイルとか携帯用OSでC/C++ってできるの?
12:デフォルトの名無しさん
09/10/21 00:09:50
できるよ。
13:デフォルトの名無しさん
09/10/21 00:24:50
まじポン?
14:デフォルトの名無しさん
09/10/21 00:27:28
「できる」の意味がわからんが、使えないわけがないだろう。
15:デフォルトの名無しさん
09/10/21 00:29:59
visual c++とかも使えるのか
16:デフォルトの名無しさん
09/10/21 00:33:09
eMbedded Visual C++ 4.0
17:デフォルトの名無しさん
09/10/21 05:47:46
BREWとかもC++環境は一応あるな
制約が相当ひどいけど、少しずつマシにはなっている模様(例外が使えなかったのが
使えるようになったり)
18:デフォルトの名無しさん
09/10/21 11:01:08
どうすればいいんでしょうか?
19:デフォルトの名無しさん
09/10/21 11:03:22
何をどうしたいんでしょうか?
20:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/21 13:13:10
>>20
危ないから、xはポインタにしないで〜。
22:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/21 13:41:06
>>21-22
ありがとうございます!
24:デフォルトの名無しさん
09/10/21 14:41:16
C言語始めたばかりのものです。
ファイルを開いて、1レコードづつ読みこんでから各項目ごとに決められた
バイト数で分けるのって、どうゆう関数を使えばいいんでしょうか
25:デフォルトの名無しさん
09/10/21 14:47:24
fopen(), fclose()
fgets()
sprintf()
26:デフォルトの名無しさん
09/10/21 14:53:02
ほかのプログラムの出力をメモリに読み込むにはどうすればいいの?
たとえば適当な数列を並べて出力するプログラムがあったとして
それを文字列としてstringに入れるといった感じで
27:デフォルトの名無しさん
09/10/21 15:00:42
>>26
大抵の環境なら、リダイレクトを使えばいい。
例えばWindowsなら
some.exe | other.exe
unix系なら
some | other
といった要領。
これなら前者は標準出力でいいし、後者は標準入力でいい。
必要なら、片方がもう片方をpopen()で起動してもいい。
双方向であったりパフォーマンスが要求されるなら事が足りないが、
先ずはこの辺りから始めては如何か。
28:デフォルトの名無しさん
09/10/21 15:08:32
>>25
ありがとうございます。
やってみます
29:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/21 16:07:44
>>10
実験してみたら、スタックが全部破棄される前にatexitで登録した関数で
デストラクタを走らせることができたよ。
32:デフォルトの名無しさん
09/10/21 16:10:29
>>30
> w.method().method().method();
> p->method()->method()->method();
こっちのほうがよっぽど統一感がない。
そもそも.演算子はオーバーロードできない。
33:29
09/10/21 16:15:48
mii.dwItemData = (DWORD)"メニュー";
のところを
mii.dwTypeData = _T("メニュー");
mii.cch = wcslen(mii.dwTypeData);
にしたら一応出るようになりました。失礼しました〜。
34:デフォルトの名無しさん
09/10/21 16:54:41
最近気がついたんだけど、メンバ変数を下のほうに書くスタイルだとclassよりstructのほうが楽だね
35:デフォルトの名無しさん
09/10/21 17:31:57
>>34
何がどう楽?
36:デフォルトの名無しさん
09/10/21 17:34:53
デフォルトプロテクションじゃね? しらんけど
37:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/21 19:40:38
>>37
std::accumulateに何の不満があるのか
39:デフォルトの名無しさん
09/10/21 19:46:33
>>37
std::iterator_traits<Iterator>::value_type
40:デフォルトの名無しさん
09/10/21 19:50:08
>>38
ありがとうございます。
たしかに、acumulate で総和は求まるのですが、総和を求めるということは
今回、例えであって、疑問の本質はIterator からT 型が推論できるテクニックが知りたいのです、
言葉足らずですみません。
41:デフォルトの名無しさん
09/10/21 19:51:20
>>39
ありがとうございます
やっと、std::iterator_traits の意味が理解できました。
42:デフォルトの名無しさん
09/10/21 19:52:03
C++0xならもっと気楽になるね
43:デフォルトの名無しさん
09/10/21 19:53:42
質問の本質をちゃんと読めないコミュ力不足の回答者って困るよね
〜はどう実装してるの? つミboost::hogehoge ←こいつマジアホ
44:デフォルトの名無しさん
09/10/21 20:03:02
この質問内容だとaccumulateを提示されるのは当然じゃね
45:デフォルトの名無しさん
09/10/21 20:04:26
言葉足らずというか余計なこと言うからじゃね?
46:デフォルトの名無しさん
09/10/21 20:04:27
Boostならともかく標準だしなぁ
47:デフォルトの名無しさん
09/10/21 20:06:42
template <typename T, class Iterator>
という引数を
template <class Iterator>
Iterator だけにして、Iterator からT 型を推論できないでしょうか?
総和を求めるプログラムを例として説明しますと
という書き始めであればよかったと
48:デフォルトの名無しさん
09/10/21 20:08:26
つーか>>43が要らないだけじゃね?
49:デフォルトの名無しさん
09/10/21 20:24:41
>>47
これがベストかな。一応質問では推論できないか?というところが疑問文だから、
それに答えればいいのだろうけど。まあ、でも、誤解はしなかった。
50:デフォルトの名無しさん
09/10/21 22:36:30
>>31
スタックが破棄される前なのか後なのか、どうやって確認したんだ?
51:デフォルトの名無しさん
09/10/21 22:37:13
>>30
(*p).method().method().method() ですべて解決だ。
52:デフォルトの名無しさん
09/10/21 23:01:21
>>41です。おかげさまで、
template <typename T, class Iterator>
という引数を
template <class Iterator>
Iterator だけにして、Iterator からT 型を推論できるようになりました。ありがとうございました。
さて、教えて頂いた知識をベースに標準偏差を求めるプログラムを作り、コードをここに貼りました
URLリンク(codepad.org)(掲示している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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/21 23:17:13
>>52
std::iterator_traits<ResultType>::difference_type
55:デフォルトの名無しさん
09/10/21 23:17:24
あ、1行目もForwardIterね
56:デフォルトの名無しさん
09/10/21 23:20:19
>>52
イテレータの距離を求めるにはstd::distanceを使う。
57:53
09/10/21 23:24:39
なんか俺意味わからないことやってるね。死のう
58:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/21 23:35:00
class Hoge { template <・・・> ave(I f, I l) {・・・ } };
Hoge h; res = h.ave(f, l);
60:デフォルトの名無しさん
09/10/21 23:44:11
>>58
couの型はvalue_typeじゃないだろ。
61:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/22 00:07:29
なんでそこに入れるんだよ。アホか
63:デフォルトの名無しさん
09/10/22 00:52:26
URLリンク(codepad.org)
64:デフォルトの名無しさん
09/10/22 00:56:04
あ、関係ないけど、>>63のfor_eachは移植性ないよ。
65:41
09/10/22 01:48:56
>>63
標準偏差の答えが、合っています?
66:デフォルトの名無しさん
09/10/22 01:56:33
size_t cou = abs( distance( first, last ) );
こう修正しないとだめだな。
67:デフォルトの名無しさん
09/10/22 02:00:56
>>66
std::accumulate使ってるんだからfirst<lastを仮定していいだろ
68:デフォルトの名無しさん
09/10/22 02:17:08
ふむ。確かに。では単純に
size_t cou = distance( first, last ); // first と last の順番が逆
と修正。
69:デフォルトの名無しさん
09/10/22 06:52:00
>>50
別のクラスオブジェクトをmainの自動変数で作って、exit呼び出し時にデストラクタが走ってない
ことを確認した。
70:デフォルトの名無しさん
09/10/22 08:12:32
>>69
デストラクタが走らないとまずいね
71:デフォルトの名無しさん
09/10/22 10:10:50
>>70
だからatexit()で走らせたんだろ。
72:デフォルトの名無しさん
09/10/22 10:28:26
このStandardDeviationって名前は気持ち悪いなぁ。
operator()()が返すのは単に(内部で持っている)平均値との差の平方じゃないか。
どうせなら、StandarDeviation(vec.begin(), vec.end())って関数にしてくれ(ぉぃ
# まぁ、既に手元には平均やら標準偏差やらを返すメンバ関数を持つ、クラスがあるから要らないけど。
73:デフォルトの名無しさん
09/10/22 12:35:16
>>69
それがスタック破棄の前後と関係すると思ってるのなら勘違い。
74:デフォルトの名無しさん
09/10/22 12:51:35
>>73
なぜ? スタックの破棄はオブジェクトの破棄を終えてから行うのでは?
75:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/22 13:25:50
>>75
なるほど。exit呼び出し時にはオブジェクトの破棄を行わないのだから、>>69では
確認になってないということね。だが、それでは、>>10の突っ込みがよく分からないが。
(>>75=>>10という意味ではない)
ただ、実験したのは>>9なので、君の言うとおり結局は問題ないでしょ。atexitに登録した
関数ではグローバル変数のポインタにmainでの自動変数のアドレスを代入して行った。
ほぼ無意味で、実用性のない手法だが、可能は可能ということで。
77:デフォルトの名無しさん
09/10/22 13:29:55
と言うか、スタック上のオブジェクトが破棄されないのであれば、>>73の指摘の
意味がよく分からない。スタック上のオブジェクトが破棄されないのだから、
mainでの自動変数のデストラクタより、atexitに登録した関数でmainでの自動変数の
デストラクタのほうが先に走るのは当たり前だから。
78:デフォルトの名無しさん
09/10/22 13:42:35
「よく分からない」
の使い方が変じゃないか?
>>10はそれを勘違いしてたのだろうか
>>73はスタックが保持されることを知らなかったのだろうか
とかでよくね
79:デフォルトの名無しさん
09/10/22 13:43:51
×>>73の指摘の意味がよく分からない
○>>73は俺と同じく、スタックが保持されることが確実であることを知らない人だったのかな
80:デフォルトの名無しさん
09/10/22 13:45:11
exitを呼び出した時点で自動変数のデストラクタを呼び出さないまま、その記憶域だけが
解放されてしまう可能性があると考えていたんだろう。で、実はその心配はないという話。
81:デフォルトの名無しさん
09/10/22 13:45:37
>>75の最終行の通りだと思う。
82:デフォルトの名無しさん
09/10/22 13:49:36
>>78
変ではないと思うよ。
>>79
まあ、そういうことだね。
>>81
不可能ではないよ。実際やったので。
83:デフォルトの名無しさん
09/10/22 14:01:07
つーかそんな怪しいことするくらいなら例外投げればいいのに
84:デフォルトの名無しさん
09/10/22 14:03:27
>>83
>>76の最終行だね。
で、この話は前スレから続いてて、>>3に>>8が突っ込んで、>>9で冗談めかして書いた
という流れ。
85:デフォルトの名無しさん
09/10/22 14:04:53
>>82
だから、間違いなくatexit()で呼び出されるように登録することは難しいといいたいのだろ。
少なくとも、exit()を使わないと言う同程度で済むもっとスマートな方法があるのだから。
86:デフォルトの名無しさん
09/10/22 14:07:33
>>85
>>76
> atexitに登録した関数ではグローバル変数のポインタにmainでの自動変数のアドレスを代入して行った。
これでは駄目か?
> 少なくとも、exit()を使わないと言う同程度で済むもっとスマートな方法があるのだから。
例えば? 例外は話題にあったけど、それはパフォーマンスコストが高くなる可能性があると
いう意見があった。だが、例外でってこと?
87:デフォルトの名無しさん
09/10/22 14:09:39
分かりづらいかな。
つまり、main内で自動変数のオブジェクトのアドレスをグローバル変数のポインタに
代入し、atexitに登録した関数内でそのグローバル変数のポインタから逆参照して
デストラクタを実行する処理を書いたということ。
88:デフォルトの名無しさん
09/10/22 14:17:27
ぶっちゃけatexitでどうにかしようとする方が遙かにコストは高いだろ
つーか例外コストを異常に高く考えすぎ
89:デフォルトの名無しさん
09/10/22 14:23:31
>>86
正常系なら main まで return してくるのが望ましい。
異常系なら例外でおk。
90:デフォルトの名無しさん
09/10/22 14:24:55
>>87
そんな方法、ふつうにいくつか関数呼び出してそれぞれに自動変数があるってだけで破綻するだろ。
91:デフォルトの名無しさん
09/10/22 15:39:42
>>88 >>90
atexitで何とかするってのは元々ネタで、それが駄目とか言われたからやってみたって
流れなんじゃないの。
>>89
mainまでreturnしてくるってのは正しい手法ではあるが、普通であって、スマートではないな。
実際面倒だし。
92:デフォルトの名無しさん
09/10/22 16:38:36
cデータを1件ずつ読んで、商品番号をキーに金額を集計し商品番号が変わったらブレイクして
集計した金額を出力させたいのですがif文での作り方がわかりません。
誰か教えてください。
93:デフォルトの名無しさん
09/10/22 18:33:03
>>92
前の商品番号を記録しておく
94:デフォルトの名無しさん
09/10/22 19:00:24
メインスレッドをサブスレッドから一時休止するためにHANDLEがほしいのですが、
メインスレッドのハンドルを取得する関数ってありますか?
95:デフォルトの名無しさん
09/10/22 19:05:22
>>94
環境依存。まぁ、サブスレッド起動時に渡しておけば?
96:デフォルトの名無しさん
09/10/22 19:59:46
>>91
> それが駄目とか言われたからやってみた
そんで、ほんとに出来たのかなあと思って突っ込んだらだんまりになっちゃったという流れ
97:デフォルトの名無しさん
09/10/22 20:00:58
できるかできないか以前の問題だと思うがな
やれたところで糞設計すぎて全く話にならないのは確定なんだし
98:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/22 21:03:15
>>96
できたのは事実だし、だんまりでもない。スレを読み返せ。
>>97
やりもしないでやった気でいるよりもましだと思うぜ。
100:デフォルトの名無しさん
09/10/22 21:06:16
環境依存のことを実験しても意味ないだろ
101:デフォルトの名無しさん
09/10/22 21:10:01
>>99
>>90とかは?
102:デフォルトの名無しさん
09/10/22 21:13:43
>>100がどこらへんが環境依存なのか説明してくれるらしい。
>>101
実用的でないことは重々承知してやってるんだろ。何を勘違いしてんだ。
103:デフォルトの名無しさん
09/10/22 21:14:39
>>99
> やりもしないでやった気でいるよりもましだと思うぜ。
こんなのは、やらない方がマシの部類。
104:デフォルトの名無しさん
09/10/22 21:14:47
いい加減鬱陶しいのでチラシの裏にでも書いといてくれ
105:デフォルトの名無しさん
09/10/22 21:17:57
そんなバカコードは試す価値そのものが無いことにとっとと気付いて欲しい
106:デフォルトの名無しさん
09/10/22 21:17:59
>>103
それぐらいしか言えないか……。まあ、仕方ないよね。
107:デフォルトの名無しさん
09/10/22 21:18:57
>>105
突っ込んでる側でも勘違いしてるのがいたんだから、それなりに役に立ってるとは思う。
108:デフォルトの名無しさん
09/10/22 21:20:29
明らかに絶対やるべきじゃないに限りなく近いやり方を無駄に実験して
「やらない奴よりまし」は無い。やる奴がおかしいだけ。悪い意味で。
109:デフォルトの名無しさん
09/10/22 21:21:58
>>107
別に勘違いしたままでもいいんじゃね、真人間は一生こんなクソコード書かないだろうし
110:デフォルトの名無しさん
09/10/22 21:23:01
>>108
突っこみが間違ってると思ったからやったんじゃないか。実際間違っていたし。
スレをよく読めよ。思いこみだけで書かないでさ。
111:デフォルトの名無しさん
09/10/22 21:23:53
>>109
exit呼び出し後にスタックが破棄されると勘違いしてた奴にとっては別だろうな。
112:デフォルトの名無しさん
09/10/22 21:25:21
>>111
スタックは破棄されるだろ、デストラクタは走らないが
113:デフォルトの名無しさん
09/10/22 21:26:47
>>112
>>75を読めよ。
> これに加えて 3.7.2 Automatic storage duration p1 から
> > The storage for these objects lasts until the block in which they are created
> > exits.
> ということで、スタックは保持されたままなので atexit() で自動変数のデストラクタを
> 呼びだしても問題ないみたい。
114:デフォルトの名無しさん
09/10/22 21:27:29
>>113
直後じゃなくて最終的な話な
115:デフォルトの名無しさん
09/10/22 21:28:29
__cxa_atexit
116:デフォルトの名無しさん
09/10/22 21:28:36
全く役に立たない話をいつまで続けるの?
117:デフォルトの名無しさん
09/10/22 21:30:10
>>114
プログラム終了時にスタックが破棄されるのは当然だろ。atexitで登録した関数が
呼び出される前にスタックが破棄されるわけではないってことだろ。認識大丈夫?
118:デフォルトの名無しさん
09/10/22 21:32:44
つーか話の流れ的に、atexitでどうにかしようとするのはアホだろ、って話に対して
>>86みたいなアホが粘るから、いい加減にしろ使い物にならねぇから、って話だろ
119:デフォルトの名無しさん
09/10/22 21:37:52
>>102
話が逸れてるな。
実用的じゃないことぐらいみんな理解してる。
出来た出来たと言っているが、関数内からのexit時についても出来たのか、それとも出来なかったのか。
120:デフォルトの名無しさん
09/10/22 21:40:51
>>118
何かずれてるぞ。>>86はatexitを使用するのは無意味だと認識してるだろ。
121:デフォルトの名無しさん
09/10/22 21:42:02
>>117
認識大丈夫?の前に日本語大丈夫?と問いたい。
話の流れで、
> exit呼び出し後にスタックが破棄されると勘違いしてた奴にとっては別だろうな。
exit呼び出し後にはもちろんスタックが破棄されるよ。
>atexitのタイミングでは、必ずしもスタックが保持されないと勘違いしてた奴にとっては別だろうな。
122:デフォルトの名無しさん
09/10/22 21:45:01
めんどくさい人だな全く。
>>75を読んでも、exitしてからatexitに入るまでの間にスタックも静的記憶も
ヒープも決して破壊されない、という保証には見えない上に、そんな細かい
実用的にどうでもいい仕様は、仮に規格で規定されていたとしても処理系が
正しく準拠してくれることはほとんど期待できない。
あくまで仕様のテストとして(程度の低い曲芸だが)割り切るならまだしも、
実用にならないんだろうか、というような話を続けている奴が>>86のように
実際にいるから、いいかげんにしてくれ、って話になる。
123:デフォルトの名無しさん
09/10/22 21:46:08
>>119
できたから書いてるんだろう。そう読めるが。
今自分でもやったらできたよ。
124:デフォルトの名無しさん
09/10/22 21:48:17
・できても無意味だからやるな
・やるべきじゃないからもう実験も要らない
125:デフォルトの名無しさん
09/10/22 21:52:23
>>122
少なくとも自動変数が保持されるのは書いてるように見える。
実用上どうでもいいとまで言いきっちゃうのはどうかと思うが。
自分には>>86が実用にならないんだろうかなどという話をしてるようには読めない。
126:デフォルトの名無しさん
09/10/22 21:53:45
>>124
atexitに登録された関数の実行のタイミングぐらいは知っとけよ。
127:デフォルトの名無しさん
09/10/22 21:54:36
>>125
実用にならないんだろうか
→実用に耐えうる場面もあるのではないだろうか
128:デフォルトの名無しさん
09/10/22 21:56:12
>>122
つまり、ポインタは有効であることが保証されるが、free可能な領域を指していない可能性は大いにあると
129:デフォルトの名無しさん
09/10/22 21:58:46
茶々を入れるようだけどC++でatexit()のタイミング知らなくても何も困らない希ガス
130:デフォルトの名無しさん
09/10/22 21:59:44
Cでも困らな(ry
131:デフォルトの名無しさん
09/10/22 22:06:17
>>127
そんなふうには書いてないだろ。
132:デフォルトの名無しさん
09/10/22 22:11:33
まぁ>>86は、スタックインスタンスへのポインタ?をいちいち全部静的記憶に
登録するというかっこいい超設計より、例外一発でmainまで脱出して終了する
方がコスト高いかもしれないと思ってることになるから、exitの実装より例外の
実装を勉強した方がいいとは思う
133:デフォルトの名無しさん
09/10/22 22:12:03
自分はデキると思ってる人たちの痛いレスだらけになってるよ
いや、実際デキるのかもしれないけど状況はスルー力検定開催中だよ
134:デフォルトの名無しさん
09/10/22 22:15:33
>>132
そこまで誤読できるのもすごいわ。勝手にやってな。
135:デフォルトの名無しさん
09/10/22 22:16:22
勝手にやってなというわりに、
勝手に書き込みをしている人にいちいち噛み付くのはなぜなのかしら〜♪
136:デフォルトの名無しさん
09/10/22 22:17:29
誤読も何もそのまんまじゃん
137:デフォルトの名無しさん
09/10/22 22:18:43
訳:かまってほしいな
138:デフォルトの名無しさん
09/10/22 22:19:35
>>135
>>134の時点でもう相手しても無駄かなと思えたってことだろ。アホですか。
139:デフォルトの名無しさん
09/10/22 22:21:04
>>131
書いてるだろ
140:デフォルトの名無しさん
09/10/22 22:23:38
×相手しても無駄かな
○まともに反論できなくなってきちゃったから降りたいな
141:デフォルトの名無しさん
09/10/22 22:25:00
東方厨はホント低能だな。
142:デフォルトの名無しさん
09/10/22 22:25:38
煽りに完全に転じた人が現れたようです
143:デフォルトの名無しさん
09/10/22 22:28:46
訳:話題を逸らしてごまかしたいな
144:デフォルトの名無しさん
09/10/22 22:29:48
>>86はatexitに登録する手法は無意味だと分かった上で、
>>85
> だから、間違いなくatexit()で呼び出されるように登録することは難しいといいたいのだろ。
間違いなくatexitに登録した関数が実行されるように登録するのは難しくないということを
言ってるんだろ。
145:デフォルトの名無しさん
09/10/22 22:31:17
atexit 厨が東方厨ってことじゃないの?
146:デフォルトの名無しさん
09/10/22 22:32:04
「atexitで実行する関数に破棄すべきスタックインスタンスを登録するのが」難しい
って話だろ
147:デフォルトの名無しさん
09/10/22 22:32:50
例外の件は、正常系は例外を返すべきでないってことでしょ。
148:デフォルトの名無しさん
09/10/22 22:32:58
難しい、という言い方だと揚げ足を取られる可能性あり。
無駄に面倒、という言い方にすべき。
149:デフォルトの名無しさん
09/10/22 22:33:45
>>146
それは、勧められる話ではないが、グローバル変数を使えば難しくないだろ。
150:デフォルトの名無しさん
09/10/22 22:33:51
exitでいきなり終わらせる正常系とか無いだろ
151:デフォルトの名無しさん
09/10/22 22:34:35
うわ、本当に揚げ足取られたw
152:デフォルトの名無しさん
09/10/22 22:34:48
>>148
バトルしてるつもりなの?w
153:デフォルトの名無しさん
09/10/22 22:35:32
>>152
別に。
しかも実際に懸念通りの展開になってしまったようで。
154:デフォルトの名無しさん
09/10/22 22:37:18
>>150
exitは基本的に正常終了のときに使うんだが。
URLリンク(www.linux.or.jp)
> exit() 関数は、プロセスを正常に終了させ、 status & 0377 という値を親プロセスへ返す (wait(2) を参照)。
155:デフォルトの名無しさん
09/10/22 22:38:36
>>153
揚げ足かどうかは認識の違いだな。元々ネタなんだし。
156:デフォルトの名無しさん
09/10/22 22:38:40
>>154
正常系≠正常終了
157:デフォルトの名無しさん
09/10/22 22:39:32
>>156
正常系でもプログラムをさっさと終わらせたいことだってある。
158:デフォルトの名無しさん
09/10/22 22:40:09
>>157
それならば例外を使っても問題は無い
159:デフォルトの名無しさん
09/10/22 22:41:00
正常系じゃなきゃ例外使っちゃいけないという前提がおかしい。
変に乱用しなきゃいいだけ。
160:デフォルトの名無しさん
09/10/22 22:41:41
間違えた。正常系では例外を、だ。
161:デフォルトの名無しさん
09/10/22 22:41:48
>>158
自分もそう思うが、前スレで強く否定する人や正常系で例外を使うべきでないという
正論を言う人がいたりして、今は揺れているというのが実状。
162:デフォルトの名無しさん
09/10/22 22:46:30
>>161
atexitを駆使してまで例外での脱出を避けるのは、goto絶対禁止とかそういう部類を
思い出すが。まぁ例外はコストがわずかに掛かるが。
とは言っても、例外を完全に排除して例外非対応コンパイルでもしない限り、例外
をthrowかcatchしなきゃ(例外仕様は当然書かない)効率は変わらない訳で、実際
のところはやっぱり宗教論争としか。
163:デフォルトの名無しさん
09/10/22 22:52:49
>>162
いい加減何度も書くのもアレなんだが、元々ネタなんだよ。自分が担当者だったら、
C++でatexitなんて絶対使わない。(Cならデストラクタがない分、使えば便利なときも
あるかもしれない)
自分は元々さっさと終わりたいときは正常系で例外投げていたクチなんで、例外時に
予期しない重い処理が走る可能性があるとか、正常系で例外は投げるべきでないとか
言われると、ちょっとな。正論は強い。
自分が書いたコードで、「例外使っていて便利でしょ?」とか見せたとき、そんなことを
言われると、返す言葉もない。
164:デフォルトの名無しさん
09/10/22 22:53:51
そしてスルーされてる質問が
165:デフォルトの名無しさん
09/10/22 22:55:01
>>163
最初はともかく、いつの間にかネタじゃなくなってるようにしか見えない奴がいる
って話だろ
166:デフォルトの名無しさん
09/10/22 22:56:41
グローバル変数に設定されたスタックが有効なままexitされたかどうかの判断って面倒じゃない?
関数を抜けるときに必要分POPしたりすんの?
167:デフォルトの名無しさん
09/10/22 22:57:01
どうせ破棄が気になる時にexitなんか呼ばないんだからどうでもいいじゃんよ・・・
168:デフォルトの名無しさん
09/10/22 22:59:43
どうせやらないからどうでもいいんでそろそろやめろ
↓
何もやらないで文句言う奴よりまし
↓
どうせやらないことをだらだら無駄に実験垂れ流す奴よりまし
↓
取っ組み合い
169:デフォルトの名無しさん
09/10/22 23:01:07
>>167
元々atexitを使ってるプログラムのデバッグをさせられるなんて可能性は十分に
考えられるよ。規格、仕様なら隅々まで知っていて損はない。
170:デフォルトの名無しさん
09/10/22 23:02:41
>>169
そういう範疇の話から逸脱してきてるじゃん>>86は明らかに
171:デフォルトの名無しさん
09/10/22 23:03:45
>>170
そういうふうにしか捉えられなかったとしたらすまなかった。
172:デフォルトの名無しさん
09/10/22 23:09:17
徹底的に粘る人なんだなぁ
こういう人は絶対に「お前の方が馬鹿だ」って態度を曲げないと思うけど、
まだ取っ組み合うの?
173:デフォルトの名無しさん
09/10/22 23:11:44
そのタイプが二人揃うとこうなる訳ですよ
174:デフォルトの名無しさん
09/10/22 23:13:21
>>172
馬鹿にはしてないよ。ちょっと深読みしすぎじゃないか。
175:デフォルトの名無しさん
09/10/22 23:15:48
自分の文章がどう見えるかが分からないタイプでもあるようだ
176:デフォルトの名無しさん
09/10/22 23:17:07
人格攻撃始まりました
177:デフォルトの名無しさん
09/10/22 23:17:32
そんなの受け取りかた次第でしょ。被害妄想かもしれないし。
178:デフォルトの名無しさん
09/10/22 23:20:07
まさに>>172
179:デフォルトの名無しさん
09/10/22 23:33:34
◎◎◎
◎◎◎
◎◎◎
180:デフォルトの名無しさん
09/10/23 00:15:40
windowsでもunixでも、確実にテンポラリファイル作る方法ありますか
DVDから起動したり、読み取りアクセスしかない場合はカレントディレクトリには出来ないのですが。
181:デフォルトの名無しさん
09/10/23 00:22:24
>>180
tmpfile()
が使えるかも知れない
182:デフォルトの名無しさん
09/10/23 00:22:43
>>180
環境変数で設定されているテンポラリフォルダに作る
183:デフォルトの名無しさん
09/10/23 00:39:16
サンクス tmpfile調べてみます
環境変数は、どの環境でも同じやり方で、確実にとれるんですか。
184:デフォルトの名無しさん
09/10/23 00:42:02
tmpfileはファイルのパスが特定できないみたいですね。
そのファイルをリネームしたりしたいんです。
185:デフォルトの名無しさん
09/10/23 00:52:06
思いっきり環境依存の問題を環境に依存せず、とな
ファイルのリネームだって環境依存だろうに
ディレクトリデリミタの問題だってある
せめてgccとかビルド環境を限定しないと答えられんのでは
素直にその手の事を吸収するライブラリを使うか
個別に書いて切り分ける方がいいと思うけど
186:デフォルトの名無しさん
09/10/23 02:03:04
>>183->>184
まさかこんなレスが来るとは予想できなかった
対象とするunixは何?
187:デフォルトの名無しさん
09/10/23 02:34:28
codepad URLリンク(codepad.org)
Hogeクラスのデータメンバdataの型を
Hogeのコンストラクタの引数で決定したいと思っているのですが、
そうるすとdataの宣言の< >内が書けません。
どのようにすれば良いでしょうか?
188:デフォルトの名無しさん
09/10/23 03:08:22
>>187
継承を使うべきところをテンプレートにしてるのが間違いに見える
Dataクラスは不要でHogeではD*を持つように
そしてHogeのコンストラクタでD0/D1をnewするのが普通のやり方かと思う
newの失敗とデストラクタに注意しないといけないとは思うが
class Hoge
{
private:
D* pdata;
public:
Hoge(int flag){
//以下は例外を投げる可能性があるので注意
if(flag==0){
pdata = new D0();
}else{
pdata = new D1;
}
(以下略)
189:デフォルトの名無しさん
09/10/23 04:25:32
>>188
それだと Hoge() を2回呼び出しただけで死ねる。 auto_ptr ぐらい使おうぜ。
190:デフォルトの名無しさん
09/10/23 08:50:58
Hogeはコンストラクタだし
質問にはそこまで含まれてないんだからいいんじゃね
191:デフォルトの名無しさん
09/10/23 14:12:31
入力ファイルをプログラム引数として受け取るってどうゆう事ですか?
192:デフォルトの名無しさん
09/10/23 14:20:38
>>191
FILEポインタを食う関数か、
ファイルネームを食って関数内で展開する関数か、
または実行ファイルの引数で指定するか。
193:デフォルトの名無しさん
09/10/23 15:54:06
変数Aに1を代入
これをwhile(1)などでずっと繰り返しているとメモリがモリモリたまるのですが、
なぜでしょう?
どこかでログを取っているんでしょうか
またこれを防ぐ方法はありますか?
194:デフォルトの名無しさん
09/10/23 15:56:09
そんなことはない
貼り付けてみろ
195:デフォルトの名無しさん
09/10/23 17:23:47
>>194
すいません、なりませんでした。気のせいでした
196:デフォルトの名無しさん
09/10/23 20:26:42
>>192
上二つもプログラム引数って言ったりするもんなの?
197:デフォルトの名無しさん
09/10/23 21:20:38
プログラム引数なんて用語はない
198:デフォルトの名無しさん
09/10/23 22:25:27
ガチスレかと思った。
199:デフォルトの名無しさん
09/10/24 02:12:09
すみません。これらの文字列が
一つでも出現するか調べたいのですが速い方法ありますか。
調べる文字列がおおくなるほど、その個数分時間が増える方法しかわかりません。 = 一つ一つ調べる。
"HTML"
"html"
"?xml"
"?XML"
"<body"
"<BODY"
200:デフォルトの名無しさん
09/10/24 02:15:58
>>199
正規表現(となるべく高速な正規表現エンジン)を使う。
201:デフォルトの名無しさん
09/10/24 02:24:09
正規表現は多機能な分だけ遅い気がしてます。あと、orで繋いだ文字列が長くなりすぎるとバグる、不安定になります、
202:デフォルトの名無しさん
09/10/24 02:27:41
>>199
互いの単語の相関からマップを作って無駄な検索をしないで済むアルゴリズムは存在するけど
名前を思い出せない
203:デフォルトの名無しさん
09/10/24 02:36:40
まともな正規表現エンジンは単純なORだとかなり最適化できるから自分で適当に組むよりは早くなるとおもうよ。
204:デフォルトの名無しさん
09/10/24 02:39:11
>>201
長くなりすぎるとバグる正規表現エンジンってどれ?
205:199
09/10/24 02:39:58
ローリングハッシュ+ブルームフィルタと、鬼車で速度比較してみます。前者を今から作ってみます。
ここで複数同時検索見つけました。 ラビン-カープ文字列検索アルゴリズム - Wikipedia
206:デフォルトの名無しさん
09/10/24 02:41:22
>>204
秀丸と、Regrepに入ってる正規表現dllです。秀丸の場合、最大文字数制限があるんですが。
207:デフォルトの名無しさん
09/10/24 02:59:25
TR1の正規表現でいいだろ。
208:デフォルトの名無しさん
09/10/24 03:25:14
>>199
検索文字列がそれだけなら
適当に作ってみようか?
209:デフォルトの名無しさん
09/10/24 03:35:06
おねがいします
210:デフォルトの名無しさん
09/10/24 04:21:34
>>199 検索文字列が短いのでハッシュに用いる文字数を先頭4文字だけにした。 うーん我ながら酷いコードだ
#include<map>
#include<string>
#include<cstdio>
unsigned long get_hash(const unsigned char *p){
unsigned long hash=0;
for(int i=0;i<4;i++) hash=(hash<<8)|p[i];
return hash;
}
int main(void){
char *wordlist[]={"HTML","html","?XML","?xml","<BODY","<body",NULL};
unsigned long hash=0;
std::map<unsigned long, std::string> wordmap;
std::map<unsigned long, std::string>::iterator it;
FILE *fp;
if((fp=fopen("hoge.txt", "rb"))==NULL) return 1;
for(int i=0;wordlist[i];i++) wordmap[get_hash((unsigned char*)wordlist[i])]=wordlist[i];
fseek(fp, 0, SEEK_END);
size_t filesize=ftell(fp), pos=0;
fseek(fp, 0, SEEK_SET);
char buf[filesize+1];
fread(buf, 1, filesize, fp);
buf[filesize]='\0';
for(int i=0;i<filesize;i++){
hash=(hash<<8)|(unsigned char)(buf[i]);
if((it=wordmap.find(hash))!=wordmap.end()){
if(strncmp(buf+i-(4-1), it->second.c_str(), it->second.length())==0)
printf("%s found at pos %d.\n", it->second.c_str(), i-(4-1));
}
}
fclose(fp);
return 0;}
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5009日前に更新/254 KB
担当:undef