【初心者歓迎】C/C++室 Ver.77【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.77【環境依存OK】 - 暇つぶし2ch379:デフォルトの名無しさん
12/01/09 10:22:44.32
Visual Studio 2010 です
C++では、クラスのメンバ変数に文字列の定数は宣言できない仕様、ですが
自分は、良くない仕様だと思うのですが、みなさんはどう思われますか?
また。文字列の定数をクラスのメンバ変数で宣言する、裏技はありませんか?

380:デフォルトの名無しさん
12/01/09 10:36:28.86
const char* str;とか宣言しといてコンストラクタで : str("aaa")とかすればいいんじゃないの?

381:デフォルトの名無しさん
12/01/09 11:31:27.24
>>380
ありがとう。コンストラクタでは、宣言できるんですね。

382:デフォルトの名無しさん
12/01/09 11:37:15.29
static char const str[]; でいけるでしょ。定義はクラス外に分けないといけないけど。

383:デフォルトの名無しさん
12/01/10 12:27:22.64
const char * str() const {return "foo";}

384:デフォルトの名無しさん
12/01/10 15:38:40.14
std::listで後ろの方の要素を前に持ってきたいときはどうすればいいですか?
例えばこんな感じです。

std::list<int> ls;
ls.push_back(1);
ls.push_back(2);
ls.push_back(3);
ls.push_back(4);
ls.push_back(5); 先頭(1)-(2)-(3)-(4)-(5)終わり
となってるところで、先頭(1)-(4)-(2)-(3)-(5)終わり、とやりたいです。
単純にリンクの張替えで出来ると思ったのですが、やり方がわかりません。



385:デフォルトの名無しさん
12/01/10 15:49:05.46
std::list<int>::iterator pos2 = std::find(ls.begin(), ls.end(), 2);
std::list<int>::iterator pos4 = std::find(ls.begin(), ls.end(), 4);
assert(pos4 != ls.end());
ls.splice(pos2, ls, pos4);

386:デフォルトの名無しさん
12/01/10 15:55:28.13
すげえ。。
ありがとうございました。


387:デフォルトの名無しさん
12/01/10 23:39:37.95
リンクの付け替えとはとても思えないインターフェイス
これは洗練されているというべきなのか。

388:デフォルトの名無しさん
12/01/11 03:53:25.45
corutineの実装がいろいろあるけど
(Hamigakiとか)
GPUを使うOpenCVとかと混ぜたらうまく動かないってことでいいのでしょうか


389:デフォルトの名無しさん
12/01/11 06:58:34.14
コルーチンってC#のyield returnみたいな構文が必要じゃね

390:デフォルトの名無しさん
12/01/12 09:26:37.71
非同期のMessageBoxを作って、タイムアウトしたら自動で閉じるなどの機能を実装しようと思っています。
自分で作ったウィンドウではなく、MessageBox関数を利用します。

そこでMessageBoxのウィンドウハンドルを取得したいのですが

1 CreateThreadで別スレッドを作成
2 別スレッドがMessageBox呼び出し
3 メインスレッドがEnumThreadWindowsで別スレッドのウィンドウを列挙
4 GetWindowTextでタイトル照合
 タイトルが一致するウィンドウがなければ3に戻る
5 取得したウィンドウハンドルは、タイムアウトしたらWM_CLOSEを送るなどに使用

CreateThreadで作成されたスレッドは
IMEが作ったウィンドウや、タイトルのないウィンドウが
あらかじめ作られているようで
タイトルによってはそれらと一致してしまうので
この手段が不確実です。

ウィンドウを列挙したり、文字列を比較するというのも
かなり無駄が多いです。

このような原始的な方法しか思いつかないのですが
他になにか良い方法はないでしょうか。

391:デフォルトの名無しさん
12/01/12 09:42:36.84
タイトルを比較するのではなくウィンドウクラス名を調べればいい
メッセージボックスのウィンドウクラス名は #32770 になってるから1発でわかる
クラス名はGetClassNameで取れる

392:デフォルトの名無しさん
12/01/12 09:47:09.02
MessageBoxTimeoutというUndocumented APIが存在するから困る

393:デフォルトの名無しさん
12/01/12 09:50:24.76
MessageBoxを使うタイムアウト付きメッセージボックスのコードはMSが公開していたりする
URLリンク(support.microsoft.com)

394:デフォルトの名無しさん
12/01/12 10:33:38.43
void *に変換したら配置されてるメモリの先頭アドレスになるって保証ある?

395:デフォルトの名無しさん
12/01/12 10:38:49.79
>>394
何を言っているのかわからない。
int*をvoid*に変換したとき、intの2バイト目や3バイト目じゃなく
先頭を指すアドレスが得られるのか?ということか?

396:390
12/01/12 12:02:26.01
>>391 この方法を試してみたいと思います
>>392 MessageBoxTimeoutはどのような動作をするのですか?
>>393 この方法では非同期が実現できなそうです

397:デフォルトの名無しさん
12/01/12 12:10:32.89
CSub* sub = new CSub;
CBase* base = sub;
void* p = (void*)base;
としたときに sub == pになるかってことじゃね

398:デフォルトの名無しさん
12/01/12 12:13:01.75
>>396
MessageBox を非同期化するのと同じ手法が使えないの?

399:390
12/01/12 12:39:24.61
>>398 393とCreateThreadを組み合わせるということですか?
とりあえず、393は制限時間が未定の場合に対応できなそうです。

例えば次のような状況です。

1 ファイルのコピーを開始
2 ユーザーがキャンセルを押す
3 キャンセルしますか? の非同期メッセージボックスを表示
4 ユーザーが押す前にコピーが終わってしまった
5 キャンセルしますか? を自動で閉じて、コピーが終了しましたと表示

400:デフォルトの名無しさん
12/01/12 12:51:46.50
>>399
タイムアウト型 (開く前に時間を決めておいて 経過時間が過ぎたら勝手に閉じる)
と別イベント型 (入力操作とは別になんらかのイベントを受けて閉じる)

両方が機能できるような MessageBox が欲しいということですかい?

401:390
12/01/12 13:15:06.61
まずはメッセージボックスを閉じるclose()というようなメソッドを実装しようとしています。
タイムアウト型もイベント型もこれを呼び出すことで実装したいです。

402:390
12/01/12 13:38:21.79
>>391 この方法で、ウィンドウの判別ができました。
自分が作成したスレッドで、他にメッセージボックスがないことは確実なので
誤認することはなさそうです。
ありがとうございました。

しかし、依然としてウィンドウの列挙と文字列比較には変わりありません。

問題を整理してみます。

A 非同期でメッセージボックスを表示する
→CreateThreadで作成したスレッドからMessageBoxを呼ぶ

B タイムアウト、外部イベント、またはプログラム内から能動的にMessageBoxを閉じる
→MessageBoxを閉じるメソッドの実装

C MessageBoxを閉じるメソッドの実装
→ハンドルを取得して、WM_CLOSEを送る

D ハンドルの取得方法
→スレッドウィンドウを列挙して、クラス名を比較する

Aに問題はなさそうです。

BとC自体に問題はないと思いますが、Dに無駄が多いので、
ハンドルを取得せずに、MessageBoxをメインスレッド閉じる方法があれば知りたいです。

または、Dのハンドル取得方法でもっとスマートなものがあればと思います。

403:デフォルトの名無しさん
12/01/12 14:04:01.96
SetWindowsHookEx(WH_CALLWNDPROCRET, CallWndRetProc,
でフック仕掛けて
CallWndRetProcでWM_INITDIALOGを監視する

404:デフォルトの名無しさん
12/01/12 14:50:20.44
Cのsscanfって、大文字小文字を無視する設定ってできないんでしたっけ?
sscanf(str, "ID%d", &id");
などとするとき、"ID100"からも"Id100"からも100を取り出したいのですが。

405:デフォルトの名無しさん
12/01/12 15:09:48.77
id = atoi(&str[2]);

406:デフォルトの名無しさん
12/01/12 15:20:32.89
条件分枝構文って
if else
swich
しかないのでしょうか
boostやstlでもっと複雑なことのできる条件分枝はないのでしょうか

407:デフォルトの名無しさん
12/01/12 15:25:24.11
どんな複雑なことがやりたいんだ

408:デフォルトの名無しさん
12/01/12 15:26:08.52
あるよ
関数のオーバーロードやtemplate特化も条件分岐構文の一種
boostはこれらの条件分岐を駆使してとても複雑

409:デフォルトの名無しさん
12/01/12 16:11:47.59


2chやニコニコ動画に民主党から反日工作費が流れていることが知られるようになってきた。
民主党が用意した資金で工作員が2chを荒らしていることもだんだんと知られるようになってきた


410:デフォルトの名無しさん
12/01/12 20:26:40.40
質問です。
同じ名前で引数が異なるローカル関数って作れますか?

hoge(enum hoge);
hoge(int hoge);

411:デフォルトの名無しさん
12/01/12 20:38:01.35
ローカル関数とは何のことを指しているのか
Cでの話なのかC++での話なのか
はっきりしてくれ

412:デフォルトの名無しさん
12/01/12 20:38:54.87
そこで出てくるのがintとenumとか、分かってて聞いてる気がしてならない

413:デフォルトの名無しさん
12/01/12 22:11:17.80
ローカル関数てなんだ?
関数のオーバーロードなら
C++で普通に出来ます。

414:デフォルトの名無しさん
12/01/13 06:53:45.81
ローカル関数:関数内関数のこと。C++では作れない。

URLリンク(c-production.com)
プロトタイプ宣言:
グローバル領域で宣言すればグローバル関数となりどこからも呼出し可能
ほかの関数内で宣言すればローカル関数となりその関数内でのみ呼出しができる

↑みたいに書いてあるサイトがあるけど規格票にそんなことかいてあったっけ?

415:デフォルトの名無しさん
12/01/13 08:25:23.68
gcc拡張切ってから喋れボケ

416:デフォルトの名無しさん
12/01/13 08:39:22.53
void func(void) {
struct { void operator () (void) {} } local ;
local();
}

417:デフォルトの名無しさん
12/01/13 10:05:20.06
うげ gcc拡張だったとわ。
知らんかった。

418:デフォルトの名無しさん
12/01/13 11:37:09.75
>>414
グローバルな宣言がなくローカルに宣言した関数は、その関数からしか
#ifdef __cplusplus
呼べない。
#else
プロトタイプの適用が行なわれない。
#endif

419:デフォルトの名無しさん
12/01/13 11:56:02.25
C++はもともとローカル関数は作れないし
C言語はプロトタイプ宣言不要だよ?
ローカル関数なんて言葉もなかったような…

420:デフォルトの名無しさん
12/01/13 12:15:05.78
完全にnothrowでSTLの代替になって著作権にうるさくないC++ライブラリってありますか?

421:デフォルトの名無しさん
12/01/13 13:36:42.82
>>419
規格には記載ないな
きっと local function definitions are illegal を ローカル関数の定義が正しくありません。 と訳したVC++の所為

422:デフォルトの名無しさん
12/01/13 19:25:41.78
どうしたらこのスレに書かれてることを理解できるレベルに到達できますか?
初心者向けの本は勉強したけど、全然わかりません。
やさしいC++をひと通りコード書いて理解しました。

int main(void)

とか、int main の中に何か入ってるものは何を意味してるのか分からないし
operator関数も難しいです。

423:デフォルトの名無しさん
12/01/13 19:48:10.47
他人が書いたソースを読むことだな
とりあえず自分が興味ある分野のソースを見てみたらいい

424:デフォルトの名無しさん
12/01/13 21:01:01.85
>>423
いや、voidの意味から分からん言ってるなら、ロベールが先だろ


425:デフォルトの名無しさん
12/01/14 00:13:21.94
>>420
g++ で -fno-exceptions をつけるとかじゃダメなの?

426:デフォルトの名無しさん
12/01/14 01:06:12.81
野田改造内閣に早速疑惑浮上

@aritayoshifu 有田芳生
捜査当局が内偵を続けている農水疑惑。詳細な怪文書まで出回っている。3億円の
行方はどこに?

@minorucchu ジャーナリスト 田中稔
野田改造内閣を揺るがす、農水省3億円スキャンダルの怪文書。二人の議員名が浮上。
34分前 webから
URLリンク(twitter.com)

鹿野と筒井らしい
自公は問責も視野に調査開始だって

427:デフォルトの名無しさん
12/01/14 01:08:50.29
std::cout << "ほげ";
std::wcout << L"ほげ";
JavaからJNI(Java Native Interface)でc++のコードを使っていて、
デバッグ用にcoutを使ったら文字化けしてしまいました。

もしかしてコーディングが違うのでは?とか思いました。
調べてもよくわからないのですけど、おそらくJavaが用意したコンソールは、UTF16のビッグエンディアンなんじゃないかなと思いました。
なので、L"ほげ"というのをBigエンディアンに出来ないでしょうか?

LってのがLittleだったら、神がかってるなと思って、B"ほげ"にしてみたらやっぱだめでした。
Localeなのかな。
std::wcout.imbue()付近で調べればわかりますかね?

428:デフォルトの名無しさん
12/01/14 01:22:56.59
>>427
エスパースレで聞いたほうがいい

429:デフォルトの名無しさん
12/01/14 03:08:09.92
LはLongだろ

430:デフォルトの名無しさん
12/01/14 14:00:04.10
どこのC++かは知らんが、VC++を使っているなら、
ShiftJIS(を独自拡張したCP932)しか使えないから。
文字列としてUTF16LEを受け入れたり内部で取り扱ったりすることはできるけど
localeを経由すると必ずCP932になる。wchar_tに格納していてもCP932になる。
なぜならlocaleがunicode出力を受け付けないから(仕様)。ハゲワラ。

431:デフォルトの名無しさん
12/01/14 14:01:54.22
ごめん、UTF16LEじゃなくてUTF-16BEだったなw ま、これがUTF-32でもUTF-8でもいっしょだ。
localeを経由しないAPIかcharを使ってバイナリでごりごり出力するかどっちかだ。
あと、コンソールもUnicodeモードにしないとだめだぞ。

432:デフォルトの名無しさん
12/01/14 14:05:30.65
windowsの問題というよりwindows日本語版の問題な。


433:デフォルトの名無しさん
12/01/14 14:13:22.67
>ShiftJIS(を独自拡張したCP932)しか使えないから。

馬鹿は休み休み言え

434:デフォルトの名無しさん
12/01/14 14:14:23.39
>>427
L は Letteral

435:デフォルトの名無しさん
12/01/14 14:32:16.79
休み 休み 言って見ましたw

436:デフォルトの名無しさん
12/01/14 14:35:08.33
>>432
Windows日本語版の問題?
うんにゃ。localeライブラリを自力で記述すればちゃんと動くよ。
VC++のlocaleがUnicodeを受け付けないのが問題なだけ

437:デフォルトの名無しさん
12/01/14 16:03:26.59
>>423
他人が書いたソースが読めない場合は…
まだ基礎力が足りていないんだと思うけど、一応初心者用の本をひと通り勉強したから
ここからステップアップするには何が必要なんだろうかなと
他人が書いた"易しめ”のソースが、どこかで見られたら良いなと思うんですけど
そういう場所や参考書は無いですか?

438:デフォルトの名無しさん
12/01/14 16:22:39.21
まずはアンカーの付け方とsage方を勉強しなさい

439:デフォルトの名無しさん
12/01/14 17:25:57.60
>>437
初心者用の本を読み終われば、他人のコードも読めるようになっているはず。
まだならば、読み切れていない。

知らない単語・関数があるのならば、リファレンス本(or Web)を使え。

440:デフォルトの名無しさん
12/01/14 17:42:18.61
>>439
リファレンス読んでみます。
オススメの初心者用の本を教えて下さい


441:デフォルトの名無しさん
12/01/14 18:48:59.22
URLリンク(codepad.org)
8行目が4,3,2,1,0,になって欲しいんだけどなんでこうなっちゃうか教えて欲しい
コピーコンストラクタが悪いんだろうけど何がおかしいのかわからなくて困ってる

442:441
12/01/14 19:00:36.48
>>441は解決しました
スレ汚しすみませんでした

443:デフォルトの名無しさん
12/01/14 20:32:10.91
class Interface {
public:
virtual void Release(void) = 0;
};

class Hoge : public Interface {
public:
void Release(void) { delete this; }
};

extern "C" __declspec(dllexport) IHoge * __stdcall Create(void) {
return new (std::nothrow) IHoge;
}

---------------

extern "C" __declspec(dllimport) IHoge * __stdcall Create(void) ;


これってDLLとEXEでvtableの構成が変わっちゃうかも、とか気にしなくていいの?

444:デフォルトの名無しさん
12/01/14 20:32:43.86
×Interface
○IHoge


445:デフォルトの名無しさん
12/01/14 21:31:49.20
>>443
vtblのレイアウトはWindowsでは決まっている(そうじゃないとCOMが動かない)

446:デフォルトの名無しさん
12/01/14 21:49:50.45
>>445
なるほど
VC++やOSのバージョンは特に気にしなくていいということですかね
安心しました

447:デフォルトの名無しさん
12/01/14 23:20:13.66
#ifdef HAVE_CPP11
とか
#ifdef HAVE_CPP0X
みたいなことってできないの?

448:デフォルトの名無しさん
12/01/14 23:26:58.33
URLリンク(www.google.co.jp)
かな

449:デフォルトの名無しさん
12/01/15 01:25:48.99
VisualStudio2010みたいな中途半端なc++11の為に
HAVE_LAMBDAとかHAVE_DECLETYPEとかほしいな

450:デフォルトの名無しさん
12/01/15 02:02:08.21
コンパイルエラーを捕まえて処理できる構文とかあればいいのにね

template <class X> void my_swap(X & a, X & b) {
STATIC_TRY { a.swap(b); }
STATIC_CATCH { std::swap(a, b); }
}
// a.swap(b)がコンパイルエラーならstd::swap(a, b)でも試す

こんな感じで
めんどくさいメタプログラミング、とかマクロで実装状況を調べて、とか正直めんどくさい

451:デフォルトの名無しさん
12/01/15 03:31:12.67
一応SFINAEがそういうものなんだけど実装状態がいまいち

452:デフォルトの名無しさん
12/01/15 14:45:54.75
intrusive_weak_ptrはなぜないんだろう
なんか作るのに難しい所があるのかな

453:デフォルトの名無しさん
12/01/15 15:33:08.96
簡単だと思うんならやってみればいいんじゃね?

454:デフォルトの名無しさん
12/01/15 16:36:26.76
クラスの静的メンバ関数って静的メンバ以外を引数にするのはNGですか?

455:デフォルトの名無しさん
12/01/15 16:41:25.59
>>454
問題無いですよ。


456:デフォルトの名無しさん
12/01/15 17:50:14.19
>>452
weak_ptr機能を導入すると実行コストがshared_ptrと大差なくなると思われ

457:デフォルトの名無しさん
12/01/15 19:49:04.54
VTableのサイズをするにはどうすれば?

458:デフォルトの名無しさん
12/01/15 21:12:22.34
サイズをする?

459:デフォルトの名無しさん
12/01/15 21:15:33.66
知るですすいません

460:デフォルトの名無しさん
12/01/15 22:39:15.44
2ちゃんとかでよくみるAAをprintfで表示したいのですがどうすればいいでしょうか?
メールで提出するので何かをダウンロードしたりしないでプログラムの中だけでやりたいです。

461:デフォルトの名無しさん
12/01/15 22:40:25.34
>>460
すみません、フォントをMS Pゴシックに変える方法が知りたいです。

462:デフォルトの名無しさん
12/01/15 22:43:00.46
windows コンソール フォント

463:デフォルトの名無しさん
12/01/16 00:35:53.28
vba用のdllをつくっています。C初心者です。
値をdllに渡して処理したあと、グローバル変数に値を入れておいて、
vbaから読み込みのフラグが立ったらその変数を戻すようにしているのですが、
グローバル変数は呼び出し速度が遅い等ネットで見かけます。

グローバル変数を回避して、ローカル変数のみで同様のことをするには
ざっくりどんなことをすればいいのでしょうか


464:デフォルトの名無しさん
12/01/16 00:38:14.88
グローバル変数が遅いなんて初めて聞いたぞ
どこだその糞サイトは

465:デフォルトの名無しさん
12/01/16 01:50:55.97
>>463
> グローバル変数は呼び出し速度が遅い等ネットで見かけます。

どういう理由で何の処理が遅くなるのかがあやふやなので、
まずはそのことがどこに書かれているか教えてください。

466:デフォルトの名無しさん
12/01/16 02:05:19.02
class window
{

467:デフォルトの名無しさん
12/01/16 02:05:50.03
すいません誤爆しました

468:デフォルトの名無しさん
12/01/16 02:08:26.73
class window
{

469:デフォルトの名無しさん
12/01/16 02:12:55.51
};};

class window’ has the same name as the class in which it is declared


470:デフォルトの名無しさん
12/01/16 10:44:06.68
>>464
排他処理のこと言ってるんじゃね?

471:デフォルトの名無しさん
12/01/16 11:25:02.57
テンプレート関数について教えてください。
テンプレート関数に部分特殊化はないと思っていたのですが
以下のように書いたらよくわからなくなってきました。

//上になにもテンプレート宣言がないときは<>が構文エラー
//template<typename T, typename U, typename V> void f<>(T, U, V){}

//通常のテンプレート関数
template<typename T, typename U> void f(T, U){}

//テンプレートの特殊化は問題なし?
template<> void f<>(int, int){}

//この構文は何? 既に本体を持っています。上のがなければok
//void f<>(int, int){}

//同じ引数の別のオーバーロードは問題なし?
void f(int, int){}

//テンプレートの部分特殊化のつもりの文
template<typename T, typename U> void f<>(T*, U){}

//同じ引数の別のオーバーロードのつもりの文。関数テンプレートは既に定義されています
//template<typename T, typename U> void f(T*, U){}

//別のオーバーロードなのにtemplateの部分特殊化のように書ける?
template<typename T> void f<>(T*){}

上の文のおかしなところをご指摘いただけないでしょうか。
VC2010です。

472:デフォルトの名無しさん
12/01/16 11:25:36.02
そもそもそのグローバル変数は何のために使っているんだろう。

473:デフォルトの名無しさん
12/01/16 11:47:37.53
>>471
> //テンプレートの部分特殊化のつもりの文
> template<typename T, typename U> void f<>(T*, U){}

いいえ、それは部分特殊化ではありません。


474:471
12/01/16 12:30:28.34
やはりそうですか。
だとすると<>があるとないとでは、どのように違うのですか?

475:デフォルトの名無しさん
12/01/16 13:05:46.91
>>474
無意味で違いがない

476:デフォルトの名無しさん
12/01/16 13:35:20.11
ありがとうございました。

477:デフォルトの名無しさん
12/01/16 16:00:34.59
math.hのsin()を使う場合と、
float fsin = 0;
_asm{FLD DWORD PTR DS:[fsin]
FSIN
FSTP DWORD PTR DS:[fsin]}
を使う場合では、どちらが高速ですか?

478:デフォルトの名無しさん
12/01/16 17:18:33.69
レスを待つ時間あるなら、自分で計測すりゃいいだろ

479:デフォルトの名無しさん
12/01/16 18:46:29.15
自分で計測したとして
その結果は他の環境でも
当てはまりますか?

480:デフォルトの名無しさん
12/01/16 18:48:54.93
>>477
ライブラリのバージョンだとかCPUやチップセットの種類だとか様々な環境の違いで変わること。

481:デフォルトの名無しさん
12/01/16 18:49:12.23
そういう速度議論なんかはlibc開発者達の間でとっくに終わってる事なんだよね
一人の浅知恵が勝てるわけがない

482:デフォルトの名無しさん
12/01/16 18:54:55.30
>>481
いや、勝てる。
libcはいかなる環境のいかなる使い方でも最悪の速度が悪化しないことが求められる。
自作は勝手に条件絞ってその条件の範囲内でのベンチマーク最速を目指せる。

483:デフォルトの名無しさん
12/01/16 18:55:58.80
だからといってfsinでは勝てんがな

484:デフォルトの名無しさん
12/01/16 18:58:18.15
>>482
こういうことを言う奴に限ってクソみたいなもんを作る

485:デフォルトの名無しさん
12/01/16 19:01:54.85
数学関数の作り直しで勝つとしたら、周辺処理との絡み方を良くして
ループ展開、call削減、分岐削減、キャッシュヒット向上とか

486:デフォルトの名無しさん
12/01/16 19:04:20.74
>>484
ベンチマーク最速を目指すために書きまくる人vs理論で必死に否定する人

487:デフォルトの名無しさん
12/01/16 19:08:00.77
複数の方法を用意してベンチマークを比べて速い方を選ぶ。それを幾度も繰り返し。
速度問題で勝ちたきゃそれしかねーよ。

488:デフォルトの名無しさん
12/01/16 21:18:11.99
>>477
これはsqrtの例だけど、こんな感じで検証して、できれば記事を投稿しろ。
URLリンク(www.codeproject.com)

489:デフォルトの名無しさん
12/01/16 21:19:55.69
あと、SSEが使える環境なら、FPU命令を使うよりSSEで関数を組んだほうが速い。
URLリンク(gruntthepeon.free.fr)

490:デフォルトの名無しさん
12/01/17 00:25:56.78
zebra, john, gmpのソースを見て思った。
最高の速度を追求するときは標準関数には頼らない。

491:デフォルトの名無しさん
12/01/18 23:14:30.29
class Hoge
{
int mHoge;
virtual void hoge(void) = 0;

void test(int Num) {
mHoge = Num;

}
};

みたいな抽象クラスを継承するHugaというクラスのインスタンスを作った時、

関数testの実体はインスタンスの数だけ存在するのでしょうか?

492:デフォルトの名無しさん
12/01/18 23:16:15.94
しません

493:デフォルトの名無しさん
12/01/18 23:19:11.75
しない

494:デフォルトの名無しさん
12/01/18 23:20:15.86
そうなんですね。意外ですmHogeはインスタンスの数だけあるのでしょうか?

495:デフォルトの名無しさん
12/01/18 23:20:17.72
関数は常に一つ!

496:デフォルトの名無しさん
12/01/18 23:24:32.80
クラスってそういうもんなんですね。

497:デフォルトの名無しさん
12/01/18 23:24:33.44
491さんではないですが、知らなかった
一つにするときはstaticを使うもんだと思ってました

498:デフォルトの名無しさん
12/01/18 23:24:33.96
>>494
なかったら困るだろ

499:デフォルトの名無しさん
12/01/19 13:42:53.62
IEのインターネット一時ファイルを弄ろうとしているのですが、
普通の方法(↓)ではアクセスできないみたいなんです。
fopen( "C:/.../Temporary Internet Files/sample.jpg", "r" )
戻り値:null
何か特別な処理が必要なんでしょうか?

500:デフォルトの名無しさん
12/01/19 13:52:28.98
馬鹿には無理

501:デフォルトの名無しさん
12/01/19 14:07:00.59
IEのキャッシュを扱うには専用のAPIを使う必要がある。
GetUrlCacheEntryInfoEx とか。

502:499
12/01/19 14:17:04.90
すみません。自己解決しました。
IEのインターネット一時ファイルの実体(?)って
"/Temporary Internet Files/Content.IE5/"の更に下にあるんですね。
エクスプローラーではTemporary Internet Filesの直下にファイルがあるように見えたんですが、
コマンドプロンプトで見て気づきました。

503:499
12/01/19 14:19:27.28
>>501さん
情報ありがとうございます。
GetUrlCacheEntryInfoExで調べてみます!

504:デフォルトの名無しさん
12/01/20 01:56:49.32
char hoge[10];
int len = strlen(hoge);
これってlenに9が返ってくるとは思わないほうがいいですか?
帰ってこないとしたらどう初期化すべきですか?

505:デフォルトの名無しさん
12/01/20 02:00:01.82
int len = (sizeof(hoge) / sizeof(hoge[0])) - 1;

506:デフォルトの名無しさん
12/01/20 02:40:25.88
9がほしいなら
char hoge[10];
int len = sizeof(hoge)-1;
でおk

507:デフォルトの名無しさん
12/01/20 02:50:14.66
特に決まった初期化の方法はない感じですかね?
ともあれレスありがとうございます

508:デフォルトの名無しさん
12/01/20 07:56:40.51
>>504
初期化したいのなら、hoge[0] = '\0';で。

509:デフォルトの名無しさん
12/01/20 08:09:46.09
>>504
char hoge[10] = {}; で。

510:デフォルトの名無しさん
12/01/20 09:55:24.58
hoge[0] = '\0'ってヌル文字でしたっけ
するとstrlen(hoge) で0になっちゃいませんか?

>>509
これはどういう動作になるんでしょうか?
strlen(hoge)が9に約束されます?

511:デフォルトの名無しさん
12/01/20 10:12:30.97

template <unsigned int N> void init(char (&)[N]) {
for(unsigned int i = 0 ; i < N - 1 ; ++i) a[i] = 1;
a[N - 1] = 0 ;
}

char a[10] ;
init(a) ;

cout << strlen(a) << endl ;

512:デフォルトの名無しさん
12/01/20 10:24:30.57
>>510
???
hogeに何が入っているかに因るから
strlen(hoge)が保証される分けない。

strcpy(hoge, "a");
ってやった後に
strlen(hoge);
ってすればstrlen(hoge);は1であることが保証されるけど、

strcpy(hoge, "abcdefghi");
の後に
strlen(hoge);ならstrlen(hoge);が9であることが保証される。

hogeの定義により確保したmemoryの大きさを保証したいのなら
>>506の言うとおりsizeof(hoge)とする以外にないよ。

513:デフォルトの名無しさん
12/01/20 10:53:05.54
やはりそういういうことですよね
>>511参考にさせて頂きます

514:デフォルトの名無しさん
12/01/20 12:07:59.47
配列の長さと文字列の長さを混同しないようにな。
strlenはたんに'\0'の前までの数を数えているだけなのだから。

515:デフォルトの名無しさん
12/01/20 12:09:49.37
配列に格納できる最大長が欲しいのか。
それならそうと最初からそう言えと。

516:デフォルトの名無しさん
12/01/20 12:10:16.96
char hoge[] = "123456789";

517:デフォルトの名無しさん
12/01/20 13:00:26.21
コンパイル時に決定される配列の大きさを実行時に求めたいという要求が理解出来ない

518:デフォルトの名無しさん
12/01/21 10:41:15.47
コンパイル時に決定されるかどうかは関係なく、
ポインタから配列の大きさを求めることは出来るのか?という疑問です
もっと言えば、関数にポインタだけ渡しておけば、あとは勝手にサイズも見てもらって処理するような処理は可能か?ということです
上では一応sizeof使えとのことでしたが、ポインタの渡し方によっては
ポインタそのもののサイズを返したりするので、結局素直に初期化する関数を作るべきかなあ

519:デフォルトの名無しさん
12/01/21 11:05:15.29
>>518
vector使えでFA

520:デフォルトの名無しさん
12/01/21 11:05:33.02
vector渡せばいい

521:デフォルトの名無しさん
12/01/21 11:10:22.47
サイズ付きの構造体、クラスでPK

522:デフォルトの名無しさん
12/01/21 11:42:01.82
> ポインタから配列の大きさを求めることは出来るのか?という疑問です
これを書こうよ。。。
答え:できない

523:デフォルトの名無しさん
12/01/21 11:45:38.89
すいません、疑問がうまく文章になるまで時間がかかりまして。
vector考えてみます

524:デフォルトの名無しさん
12/01/21 12:59:38.80
// func.cpp
namespace {
template <unsigned int R> inline BigInt Factor(BigInt const & n) { return n == 0 ? 1 : n * Factor<R - 1>(n - 1); }
template <> inline BigInt Factor<0>(BigInt const & n) { return n == 0 ? 1 : n * Factor<256>(n - 1); }
}
BigInt factor(BigInt const & n) { return Factor<256>(n) ; }

// func.hpp
BigInt factor(BigInt const & n);


こんな感じのコードを見かけたんですけどこのテンプレートになにか意味あるんですか?

525:デフォルトの名無しさん
12/01/21 13:14:48.03
>>524
どこら辺を意味がないと思ったの。

526:デフォルトの名無しさん
12/01/21 13:49:19.71
>>525
なんで普通に再帰しないのかなーって

527:デフォルトの名無しさん
12/01/21 13:51:40.62
>>526
再帰の限界の数の回避とかなのかね。

528:デフォルトの名無しさん
12/01/23 12:18:57.37
こんなならループのほうがよさそうに思えるが

529:デフォルトの名無しさん
12/01/23 12:49:56.34
test

530:デフォルトの名無しさん
12/01/23 16:48:29.11
>>528
テンプレートでコンパイル時に計算させようとすると再起しかないんじゃないの。


531:デフォルトの名無しさん
12/01/23 17:21:33.84
>>530
そういう意味じゃないとおもう

532:デフォルトの名無しさん
12/01/23 17:53:13.43
テンプレート関数を特殊化したり、
テンプレート引数の代わりに関数引数で再帰している
よくわからないコード

533:デフォルトの名無しさん
12/01/23 17:53:29.35
>>528
コンパイル時定数として階乗の結果が欲しいのをループじゃ対応できないのでは?

534:デフォルトの名無しさん
12/01/23 18:03:02.90
問題は、100やそこらの再帰じゃ済まない階乗の値をBigIntで持つ必要が本当にあるのかどうか。

535:デフォルトの名無しさん
12/01/23 18:26:06.14
inline展開されてオーバーヘッドが無くなるというメリットはありそうだがこのサンプルでは無意味だろうな

536:デフォルトの名無しさん
12/01/23 20:12:08.33
>>535
コンパイル時に計算されるからインラインに展開してオーバーヘッドがなくなるとか関係ないのでは?

537:デフォルトの名無しさん
12/01/23 21:30:45.28
>>530,533,536

それはもしかしてこんなコードじゃないのかい
URLリンク(codepad.org)

538:デフォルトの名無しさん
12/01/24 10:01:51.79
質問です。

template <typename T = char>
class Hoge
{
};


void test(void)
{
  Hoge h;
}

テンプレート引数 T に対して char を与えてやってるので、
Hoge を使用する際、テンプレート引数を与えなくてもよさそうなのに、

error C2955: 'Hoge' : クラス テンプレート を使用するには テンプレート 引数リストが必要です

となります。どうしてですか?

どうぞよろしくお願いします。


VS2008 pro
Win7 pro x64


539:デフォルトの名無しさん
12/01/24 10:03:11.96
Hoge<> hoge;

540:デフォルトの名無しさん
12/01/24 11:31:02.17
つまり、class Hogeとtemplate<>class Hogeの区別がつかないんだな。

541:デフォルトの名無しさん
12/01/24 11:49:44.40
GPU計算に興味が有るんだけど、C++だとOpenCLってやつが一般的?
C++で使えて入門に向いてるのって何があるかな?

542:デフォルトの名無しさん
12/01/24 11:53:37.64
下記関数は5ms周期で実行されています。
CTMAXが200を超えたとき、例えば201に
なったとき、10ms周期の処理が5ms後に実行
されるという現象がおきます。
下記のように毎回実行される5msの処理は仕方
ありませんが、10ms以降の処理は実行タイミング
がかぶらないようになっています。この状態でさ
らに実行タイミングがずれないような処理を作りた
いのですが、思いつきません。できるものでしょうか?
void time(void){ #define CTMAX 200 static int ct;
if(++ct > CTMAX) ct = 0;
func5ms();/* 5ms処理 */
if(ct & 0x01) == 0)
func10ms();
else{ if(ct & 0x02) != 0) func20ms();
else{ switch (ct){
case 1: case 21: case 41: case 61: case 81:
case 101: case 121: case 141: case 161: case 181:
func100ms(); break;
case 13: case 53: case 93: case 133: case 173:
func200ms(); break;
case 5: case 105:
func500ms(); break;
case 9:
func1s(); break;
}}}}

543:デフォルトの名無しさん
12/01/24 12:12:36.72
よく分からんけど、

s = milisecond();
do_something();
e = milisecond();

if(e-s<200))
sleep_milisecond(200-(e-s));

ぐらい?

544:デフォルトの名無しさん
12/01/24 12:24:07.29
とりあえずこういうこと?
ctって0~200までの値、つまり
201個の値を取ることになっていたんだけど、
そこがまず問題だよね。
1005ms が 1000ms と等しいよ。

本当ならば、>= としなければならないよね?
// if(++ct >= CTMAX) ct = 0;
or
ct++;
ct %= CTMAX;


545:デフォルトの名無しさん
12/01/24 12:34:49.47
void time(void)
{
#define CTMAX 200
static int ct = 0;

// 0 <= ct <= 199
ct %= CTMAX;

mod_10 = ct % 10;
mod_100 = ct % 100;
mod_200 = ct % 200;
mod_500 = ct % 500;

if(!mod_500)
func500ms();
if(!mod_200)
func200ms();
if(!mod_100)
func100ms();
if(!mod_10)
func10ms();

ct++;
}


546:デフォルトの名無しさん
12/01/24 13:52:36.91
素直に書いた方がoptimize有利なんだから
ct = (ct + 1) % CT_MAX;


547:デフォルトの名無しさん
12/01/24 14:01:39.16
time()を初めて実行した時に困るでしょ。
ct = 1;で実行することになって起動後9ms, 19ms, 29ms, ...
で実行することになるよ。
人が書いたコードにbug入れる奴っているんだよな
迷惑なんだよな

548:デフォルトの名無しさん
12/01/24 14:06:09.81
そもそも標準関数と同じ名前の関数を作るな間抜け。

549:デフォルトの名無しさん
12/01/24 14:10:55.35
これって組み込みだから問題ないと思って特に指摘しなかったよ。
time.hなんて高尚なヘッダは存在しないんじゃないの?

550:538
12/01/24 16:33:33.09
>>539
ありがとうございます。助かりました。

551:デフォルトの名無しさん
12/01/25 07:51:50.37
結局>>542はどうなった?
自分は解決したから後はシーラないってか?

552:デフォルトの名無しさん
12/01/25 09:36:12.44
>>544
さんのいうとおり++ct >= CTMAXとしただけでとりあえず
自分の作ったやつでも正常に動くっぽいですね。

ちなみに関数名にtimeなんて使ってません。書き込むとき
面倒なんで簡単な名前に変更しただけです。

>>545
のプログラムはわかりやすいですが、0のとき全部実行され
てしまうのが難ですね。
それからmod_10で考えると10回に1回しか起動しないので、
それだと10msじゃなくて50ms周期になってしまいます。

553:デフォルトの名無しさん
12/01/25 09:43:21.64
>>552
> ちなみに関数名にtimeなんて使ってません。書き込むとき
> 面倒なんで簡単な名前に変更しただけです。

それにしても標準関数と名前がかぶるってねーだろ

554:デフォルトの名無しさん
12/01/25 09:51:57.71
まぁ549さんの言うとおり、組み込みなんでtime.hなんて
使いませんし。

555:デフォルトの名無しさん
12/01/25 10:14:03.52
>>552
bug指摘されちゃった。
static int ct = 0;
if(ct == 0){
ct = 1;
return;
}
投稿した後に、これでうまくいくって気づいてはいたんだけどね。。。
この後はctが0になることはなくて、
0と等価な200がctの値としてくるから問題ないよね。
これくらい思いついてよ。。。

> それからmod_10で考えると10回に1回しか起動しないので、
> それだと10msじゃなくて50ms周期になってしまいます。

こっちは気づかなかった。きちんとdebugしてうまい具合にしてよ。

556:デフォルトの名無しさん
12/01/25 10:19:00.51
実際に問題になるかどうかじゃなくて、そういう紛らわしいことはするなってこった。

557:デフォルトの名無しさん
12/01/25 10:24:21.70
ct += 5とするか、
time()を1ms毎に実行するようにするかして修正すれば良さそうだね。
後は任せた。

void time(void)
{
#define CTMAX 200
#define POLLING 5
static int ct = 0;
if(ct == 0){
ct = POLLING;
return;
}
// 0 <= ct <= 199
ct %= CTMAX;

mod_10 = ct % 10;
mod_100 = ct % 100;
mod_200 = ct % 200;
mod_500 = ct % 500;

if(!mod_500)
func500ms();
if(!mod_200)
func200ms();
if(!mod_100)
func100ms();
if(!mod_10)
func10ms();

ct += POLLING;
}

558:549
12/01/25 10:29:57.73
自分で実装する時はtime.hがないからっていって、
time()やらtime.hに含む関数名を使ったりしないよ。
本当は、time()なんて関数を自作するのはまずいし、
他人に披露する時に借りの名前とするのも、
あらぬ誤解を招きかねないのでまずいんだけど、
でも、2chに書き込まれるような関数名に意見するのも面倒だし、
組み込みで使っている関数だって事は一見して明らかだったので、
time.hを使うことはまずないだろうって事であえて指摘しなかったんです。

まあ、本当は>>549がおかしいんだよ。
一々指摘するのも嫌だから指摘しなかっただけでさ。

私が名付けるとすれば、polling()かなぁ

559:549
12/01/25 10:31:25.79
>>558
まあ、本当は>>549がおかしいんだよ。
は間違いで、
まあ、本当は>>542がおかしいんだよ。
が正しい。

560:デフォルトの名無しさん
12/01/25 10:47:03.80
>>542
コードを書く前にまずは何をしたいのかを正しい日本語で人に説明する訓練をしなさい

561:デフォルトの名無しさん
12/01/26 21:39:52.68
てすと

562:デフォルトの名無しさん
12/01/27 13:12:52.00
class Hogeを事前に宣言しておいて、
あとから定義したいと思うのですが、うまくできません。
何か解決方法はありますか?


// 宣言
class Hoge;
Hoge func( );


int main( )
{
Hoge h = func( );

return 0;
}


// 定義
class Hoge
{
public:
};

Hoge func( ){ return Hoge(); }

563:デフォルトの名無しさん
12/01/27 13:19:17.13
//hoge.h///////////////
// 宣言
class Hoge;
Hoge func( );
///////////////////////

//hoge.cpp/////////////
#include "hoge.h"

int main( )
{
Hoge h = func( );

return 0;
}


// hoge定義
class Hoge
{
public:
};

Hoge func( ){ return Hoge(); }
/////////////////////////////
ってことなら無理
Hoge h = func( );この時点でHogeの定義が見えてないとダメ
int main()の前に hoge定義を持ってこないと

564:デフォルトの名無しさん
12/01/27 13:21:27.99
func()がHogeではなくHoge*(またはスマートポインタ)を返すようにすれば大丈夫なはずだが、
設計を見直したほうがいいような気がする。

565:デフォルトの名無しさん
12/01/28 00:37:44.02
std::map<boost::shared_ptr<Hoge>, value_t>から要素を生ポインタで検索したいという状況に陥ったのだけど、何かいい手はないですか?
とりあえず動くコードとして、
mapの要素を巡回してshared_ptr<Hoge>::getの返り値と検索キーを比較
一致していたらそのイテレーターの指す要素をmから削除
としているのですが、これではO(N)になってしまいmapの利点を生かせません


566:デフォルトの名無しさん
12/01/28 00:44:01.91
生ポインタをキーにする。

567:デフォルトの名無しさん
12/01/28 01:03:22.81
スマポをキーにしようという発想が理解できない

568:デフォルトの名無しさん
12/01/28 01:44:20.83
検索キーになるポインタをshared_ptrに放り込む。
カスタムデリータに何もしない関数を指定してdeleteを防ぐ。
でも危険度は生ポインタをキーにするのとかわらないな。

569:デフォルトの名無しさん
12/01/28 09:47:26.46
>>568
それって別ポインタとみなされて比較うまくいかないと思うけど

570:デフォルトの名無しさん
12/01/28 14:08:13.74
コードが長くなってきたので、クラスの宣言と定義を、hとcppに分けたいのですが
下記のような場合、どう分ければいいでしょうか?

class Hoge {
private:
 const int m_x;
public:
 Hoge(int x = 3) throw() : m_x(x) {
  //do something 1
 }
 void func(int a = 5) {
  //do something 2
 }
};

571:デフォルトの名無しさん
12/01/28 14:31:36.35
// Hoge.h
struct Hoge {
Hoge(int x = 3);
void func(int a = 5);
private:
const int m_x ;
};

//Hoge.cpp
#include "Hoge.h"
Hoge(int x) : m_x(x) { do_something_1(); }
void Hoge::func(int a) { do_something_2(); }


572:デフォルトの名無しさん
12/01/28 14:46:52.59
>>571
ありがとうございます
理解できました

573:デフォルトの名無しさん
12/01/29 16:27:31.12
Cを独学で学んでいる入門者です
コンパイル→実行について教えてください

PCは富士通のノートパソコンで
OSはvista home premium
エディタはemacs
コンパイラはMinGW
です

ソースファイルをコンパイルして実行する際、
M-x compile
だと上手くいかないので、

M-x shell
から
>gcc -std=c99 ファイル.c
でコンパイルしています

ただ、毎回gcc -std=c99を書き込むのは煩わしいし、複数のソースファイルをコンパイルして実行する方法がわかりません。

Emacsで複数のソースファイルをC99で?コンパイルして、実行する効率的なやり方が知りたいです

574:デフォルトの名無しさん
12/01/29 16:40:29.72
IDE(統合開発環境) vs emacs(テキストエディタ)
スレリンク(prog板)

575:デフォルトの名無しさん
12/01/30 07:41:57.55
>>573
make
もしくはbatかシェルスクリプト

576:デフォルトの名無しさん
12/01/30 07:46:48.53
ふつうmakeだろ

577:デフォルトの名無しさん
12/01/30 08:57:23.22
GetOpenFileName/GetSaveFileNameで
lpstrFileに確保するバッファの大きさを決めるにあたって
あらかじめ受け取るファイル名の長さを取得できないでしょうか。

長さが足りない場合再起不能だし、かといって使われないのに数キロも確保したくないし
それでも足りない場合だってあるだろうし。

GetWindowTextに対するGetWindowTextLengthのような
関数があればよいのですが、この場合ユーザーからの入力なので
どうしたものやら。

578:573
12/01/30 09:04:33.22
ありがとうございます。

Makeの使い方を調べてみます。

579:デフォルトの名無しさん
12/01/30 10:32:00.09
>>577
MAX_PATH分確保しとけばいいだろ

580:デフォルトの名無しさん
12/01/30 10:36:18.61
大きなバッファを用意しても、260文字以上は格納されないんですか?

581:デフォルトの名無しさん
12/01/30 11:04:06.02
WinAPIならファイル名読むタイプのAPIは大抵バッファに読み込んだ文字数返るから
その文字数とバッファ長比べてバッファが足りてないと判断したら失敗とみなしてバッファを伸ばしてリトライすればいいよ

582:デフォルトの名無しさん
12/01/30 11:12:39.59
つーか、そもそもCommonDialogで256文字以上返せるのか?
そうでないなら260どころか、257で充分だ。

583:デフォルトの名無しさん
12/01/30 11:22:41.08
URLリンク(msdn.microsoft.com)(VS.85).aspx

584:デフォルトの名無しさん
12/01/30 21:01:42.03
仮想関数の戻り値が、継承先の型でもOK、っていうルールの名前を何ていったっけ?

585:デフォルトの名無しさん
12/01/30 21:11:23.37
共変性かな

586:584
12/01/31 07:55:25.34
>>585
それだ!ありがとー!

587:577
12/01/31 16:47:56.33
おお、ディレクトリ含めて260文字とかいれたら、無効ですって言われた・・・
ってことは、260文字以上入れたかったら、自分でダイアログ作れってことか・・・

588:デフォルトの名無しさん
12/01/31 17:03:36.11
32ビットWindowsなんだけど
アクセスして良いポインタかどうかを判定しようとしていて

ぬるぽ 0
初期化されてない有効なヒープ 0xcdcdcdcd
解放されたヒープ 0xfeeefeee

この他に、一見してアクセスできなそうなポインタって何かあるかな。

589:デフォルトの名無しさん
12/01/31 17:06:29.89
そんなんで判断するなよ

590:デフォルトの名無しさん
12/01/31 17:07:41.88
0xdeafbeef
0xdeaddead
0xbeaffeed

591:デフォルトの名無しさん
12/01/31 18:05:29.85
自分で確保してない領域にアクセスすんな。

592:デフォルトの名無しさん
12/01/31 19:51:41.31
外部から渡される未知のポインタなんよ

593:デフォルトの名無しさん
12/01/31 20:47:10.19
なにそれ怖い

594:デフォルトの名無しさん
12/01/31 20:50:48.03
悪魔召喚ポインタ

595:デフォルトの名無しさん
12/01/31 21:17:34.81
絶対に逆参照してはいけな

596:デフォルトの名無しさん
12/01/31 21:23:31.08
書き込んだ名前の人間は必ず死ぬという死神のポインタ


597:デフォルトの名無しさん
12/01/31 21:26:01.82
C系列って恐ろしい言語だったんだな

598:デフォルトの名無しさん
12/01/31 21:29:14.36
しょうもないネタには食いついてやがんの


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch