トップページ⇒tech
1001コメント308KB

C++相談室 part56

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/07/26(木) 00:33:07
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>2-15 付近参照

前スレ
class C++相談室lt;part56gt;
http://pc11.2ch.net/test/read.cgi/tech/1170343752/l50

0153デフォルトの名無しさん2007/07/30(月) 02:37:35
>>152
ロケールは貨幣や数値、時刻の形式なども扱うが、この場合は
LC_CTYPEというカテゴリを指定してやることで、
文字エンコーディング(SJISだのEUC-JPだの)をCランタイムに
教えてやっている。「""」は、「実行環境に応じて良きにはからえ」という
意味だ。Cランタイムはそれに応じてワイド文字とマルチバイト文字の
変換を行う。
01541302007/07/30(月) 03:02:24
>>153

なるほど、だからロケールを設定してないときの読み込み方がおかしかったんですね

わかりやすく教えていただきありがとうございました!
0155デフォルトの名無しさん2007/07/30(月) 08:17:11
型Tから型Uへの変換が存在するかどうかを調べるtemplateの手法ってありますか?
具体的には次のようなことをやりたいのですが…

template<typename T>
struct PtrWrapper { T* p; };

class A {...};
class B : public A {...};

PtrWrapper<A> a;
PtrWrapper<B> b;

a = b; // 可能
b = a; // 不可能
0156デフォルトの名無しさん2007/07/30(月) 11:44:19
template <typename T, typename U>
class Conversion
{
typedef char Small;
class Big { char dummy[2]; };
static Small Test(U);
static Big Test(...);
static T MakeT();
public:
enum { exists = sizeof(Test(MakeT())) == sizeof(Small) };
};

int main() {
using namespace std;
cout
<< Conversion<double, int>::exists << endl
<< Conversion<char, char*>::exists << endl
<< Conversion<size_t, vector<int> >::exists << endl
<< Conversion<A*, B*>::exists << endl
<< Conversion<B*, A*>::exists << endl;
}

詳しくは Modern C++ Design 参照。
0157デフォルトの名無しさん2007/07/30(月) 16:10:51
iGoogleで複数のコンテンツを追加してみると、
追加したコンテンツをドラッグ&ドロップで移動できるのですが、
そのUIを、WinXPSP2上のVS2005 C++ Windowsフォームにて実装してみたくて調査中なのですが、
技術的に停滞中です。

フォームにPanelを配置し、そのパネルをドラッグ&ドロップすればよいのかと思うのですが、
パネルのドラッグ&ドロップが出来ません。。

何かサンプルありませんか?
0158デフォルトの名無しさん2007/07/30(月) 16:26:33
MFCのCOleDropTargetクラスあたりかなぁ?
0159デフォルトの名無しさん2007/07/30(月) 17:46:58
ありがとうございます。
COleDropTargetですか。ちょっとみてみましたが、
楽チンポンとは行かないみたいですね。
ちょっと勉強にいそしみます。
0160デフォルトの名無しさん2007/07/31(火) 00:30:10
>>156
ありがとう!
ていうか解説読んで感動しました…
0161デフォルトの名無しさん2007/07/31(火) 09:22:22
>160
どうせ中では同じようなことをやってるはずだけど、使えるなら Boost TypeTraits を使うのが楽。この場合は is_convertible
0162デフォルトの名無しさん2007/08/01(水) 05:03:00
placement delete は
対応する placement new の実行中に例外が発生した場合に呼ばれるからという
ただそれだけのために存在する、という認識で問題ありませんか?
0163デフォルトの名無しさん2007/08/01(水) 06:18:29
え
0164デフォルトの名無しさん2007/08/01(水) 06:24:12
struct s{ s(){puts("s");} };
と定義して
struct s s_obj();
としてもコンストラクタが呼ばれないんですが、
俺何か間違ってるんでしょうか?
0165デフォルトの名無しさん2007/08/01(水) 06:31:42
それは「struct sを返す関数」の宣言
0166デフォルトの名無しさん2007/08/01(水) 11:23:21
struct s s_obj; としないといけない。
もっとも、s s_obj; で十分だが。
0167デフォルトの名無しさん2007/08/01(水) 12:24:54
>>162
どうせ君は使わないだろうから問題ないよ。
人と話すときにはその話題避けてればいいんだし。
0168デフォルトの名無しさん2007/08/01(水) 12:32:58
>>162
違う。正しくは
対応する placement new が成功した後のコンストラクタで例外が発生した場合に以下同文。
0169デフォルトの名無しさん2007/08/01(水) 13:11:18
placement new というと、規格を見ると new の構文は

new-expression:
 ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
new-placement:
 ( expression-list )

と書いてあって、new-placement ってのはあらゆる引数リストを指す要素のようだけど、
引数つきの new は何でも placement new と呼ぶのか?
0170デフォルトの名無しさん2007/08/01(水) 13:13:10
そういうこと。
最初に想定されたのが配置に関する制御だったので、
placement newと名付けられたが、
使ってみたら色々使い道があったというわけ。
0171デフォルトの名無しさん2007/08/01(水) 13:17:43
Ruby のイテレータみたいなもんか。繰り返さなくてもイテレータ。
っつーことは、「いつもの placement delete」 には特に呼ぶ価値ないけど、
それ以外の placement delete には十分価値があるかもしれんっつーことか。
0172デフォルトの名無しさん2007/08/01(水) 21:46:24
RUBYYYYYYYYYYYYYYYYYYYYYYYY
0173デフォルトの名無しさん2007/08/01(水) 21:53:00
pythonでおk
0174デフォルトの名無しさん2007/08/01(水) 22:31:34
AnsiString GetReg(AnsiString Key, AnsiString Name, HKEY RootKey)
{
AnsiString Value;
TRegistry *Reg = new TRegistry();
Reg->RootKey = RootKey;
if(Reg->OpenKey(Key,false)){
if(Reg->ValueExists(Name))
Value = Reg->ReadString(Name);
Reg->CloseKey();
}
Reg->Free();
return Value;
}
0175デフォルトの名無しさん2007/08/02(木) 00:53:06
テラBCB
01761742007/08/02(木) 00:57:40
書き込みが途中までしか出来てませんでした。
↓続き
関連する項目をググって、上記ソースを見つけたのは良いのですが、
得た値"Value"をstrcpy(a,b)のbで使おうとすると、
AnsiString型からキャストできず、エラーとなります。
AnsiString型をキャストすること自体がよろしくないようなのですが、
キャストか、他に良い方法がありましたら教えてください。

長文すみません。よろしくお願いします
0177デフォルトの名無しさん2007/08/02(木) 01:01:43
strcpy(dst, AnsiString("あひゃ").c_str());
0178デフォルトの名無しさん2007/08/02(木) 01:13:55
>>177は
Value.c_str()でやれということ
01791742007/08/02(木) 07:30:49
>>177=>>178さん
どうもありがとうございます。
助かります。
0180デフォルトの名無しさん2007/08/02(木) 22:26:11
プログラム中から現在のCPUのクロック数を測定したいのですが
どうすればいいでしょうか?
0181デフォルトの名無しさん2007/08/02(木) 22:29:12
>>180
Win32APIのQueryPerformanceFrequencyは?
0182デフォルトの名無しさん2007/08/02(木) 22:32:00
あれはかなりいい
しかしモバイル用CPUとか動的にクロックが変化するCPUだとちょっと困る
0183デフォルトの名無しさん2007/08/02(木) 22:42:28
すいません>>182の理由により別の方法をおねがします
もしかして不可能?
0184デフォルトの名無しさん2007/08/02(木) 22:45:00
条件があったのなら初めに言えよ
0185デフォルトの名無しさん2007/08/02(木) 22:46:46
cpuid命令を呼ぶ
レジスタに信用なら無いモデルナンバーが返って来る
メーカーの資料と照らし合わせる
周波数を知る
0186デフォルトの名無しさん2007/08/02(木) 22:51:17
CPUとは違う固定周波もってるハードに割り込みかけてもらうぐらいしか思いつかん……
0187デフォルトの名無しさん2007/08/02(木) 22:56:08
>現在のCPUのクロック数を測定
だから>>181でFA
0188デフォルトの名無しさん2007/08/02(木) 23:08:53
>>185
ああ、その方法もありますね。しんどいけど。
どこかに cpuid --> cpu clock 変換表みたいなのありませんか?

クロック自体はrdtscで読めるんですが、
最近のCPUは省電力モードとかで
クロック自体が落ちてることもあって
正確なクロックが取得できないんです
0189デフォルトの名無しさん2007/08/02(木) 23:15:32
CPU毎の定格周波数が知りたかったのか?
0190デフォルトの名無しさん2007/08/02(木) 23:24:10
CPU に意図的に負荷かけてから測定するとか。
0191デフォルトの名無しさん2007/08/02(木) 23:40:09
asmでおk
0192デフォルトの名無しさん2007/08/03(金) 16:33:06
可変長のメンバ配列変数は C99 で規格合致になったけど、
C++ だと 9.2p8 を見る限り対応されてなさそうな雰囲気を感じる。
これは、非静的メンバ配列変数のサイズは必ず指定する必要があるという記述だから
ここだけじゃ実際のところはっきりとは分からんけど。

でも、次期 C++ ドラフトを見るとこの記述が削られてる。
これは C99 と同様に可変長のメンバ配列変数に対応された現れだと見ているけど、
そのことが書いてある箇所が見つからない。

C++ での可変長のメンバ配列変数への対応具合の状況はどんな感じなんじゃろか。
0193デフォルトの名無しさん2007/08/03(金) 20:55:47
可変長配列がないならvector使えばいいじゃない(マリー
0194デフォルトの名無しさん2007/08/03(金) 21:23:30
それなら C でも malloc 使えるしー。
でも、本気でそれでも問題ないと思うんだよな。
正直可変長メンバってどのくらい意味があるのか分かんないな。
Windows API とか可変長メンバを要求するところがあるから
しゃーなしで使わんといかんこともあるんだが。
0195デフォルトの名無しさん2007/08/03(金) 21:33:07
ポインタ使うかわりに可変長メンバ使うとメモリ上のレイアウトがフラットに
なるから、そのままファイルに読み書きしたりできて便利な場合もあるでそ
0196デフォルトの名無しさん2007/08/03(金) 22:04:00
stlのアロケータってrealloc操作がないのな。
vectorやstringのサイズ増加時にコピーが走りまくって参った。
0197デフォルトの名無しさん2007/08/03(金) 22:16:19
reserveとかあるだろ
そういうハナシじゃない?
0198デフォルトの名無しさん2007/08/03(金) 22:19:34
ふつうdeque
0199デフォルトの名無しさん2007/08/03(金) 22:25:23
>>195
書き込みは一発だけど、
読み込む時は一旦サイズを読み出さないといかんのだよな。
状況によってサイズが分かる場合もあるけどさ。
そこまでの利点には思えんのよなあ。
昔だとその僅かな差も重要だったんだろうか。
0200デフォルトの名無しさん2007/08/03(金) 22:27:52
>>196
<cstdlib>のreallocも、その場で拡張できなければ、
新しい領域を確保して、そこへ元の記憶域の内容をコピーすることになっている。
クラスインスタンス相手にコピーコンストラクタを使わず複写なんて
やるわけには行かないから、アロケータにrealloc相当の操作がないのも妥当な判断。

仮にやるとしたら、その場で拡張できるときだけ成功するrealloc操作
なんてことになるんだろうな。

0201デフォルトの名無しさん2007/08/03(金) 22:33:47
>>199
malloc()/free()一発で確保・解放できるのも「Cでは」便利
で、特にデメリットも無いわけで
まあ可変長に出来るのは最後のメンバだけ、という制限があるけどな

ま、基本的に言語サポートが貧弱なCで特に生きるテクニックという気がする
0202デフォルトの名無しさん2007/08/03(金) 22:35:49
記憶域の内容がコピーされても、
その後にちゃんとコピーコンストラクタを placement new で呼べば一応正常に動作する。

問題は二度手間になることと、
realloc による管理は C++ っぽくないってところだな。
0203デフォルトの名無しさん2007/08/03(金) 22:36:31
PODのときはrealloc or memcpyするぐらいの配慮が欲しかったなあ
パフォーマンスに関わるんで結局手書きしちゃったよ
無駄にT()でfillするし・・・
0204デフォルトの名無しさん2007/08/03(金) 22:37:30
>>201
どっちゃにしろ動的に確保する場合は
確かに一発で済むから便利か。なるほど。
0205デフォルトの名無しさん2007/08/03(金) 22:40:24
でもまあバッファを拡大するときも、必要な量ぎりぎりではなく、
例えば倍々に増やしていったりする実装の存在なんかを考えれば、
やっぱりコンテナがrealloc相当のことをやっているんだよなと思う。
0206デフォルトの名無しさん2007/08/03(金) 22:42:15
なんでC++にnew/deleteがあってrealloc()相当物が無いのかってのは
Stroustrupが説明してた気がするが、忘れた
0207デフォルトの名無しさん2007/08/03(金) 22:45:50
placement new でコピーコンストラクタ使ってオブジェクト作ってるよ。
0208デフォルトの名無しさん2007/08/03(金) 22:49:31
Win32 APIのVirtual Allocみたいなの使ってアドレス空間だけ予約しとけ
0209デフォルトの名無しさん2007/08/05(日) 02:02:59
シグナルって何に使えばいいの?
中で特別な関数以外の関数呼んだら未定義とか規格に書いてるんだけど。
0210デフォルトの名無しさん2007/08/05(日) 02:04:27
ぶっちゃけsignalがCの標準に含まれているのはどうかと思う
0211デフォルトの名無しさん2007/08/05(日) 02:04:59
マジ?あの欠陥品が?
0212デフォルトの名無しさん2007/08/05(日) 02:05:32
>>209 Unixの規格を読むんだ
0213デフォルトの名無しさん2007/08/05(日) 02:09:07
Posix的にはsignal()は推奨されないでしょ
sigaction()を使うべき

Windowsのコンパイラが提供するsignal()は、規格を満たすためだけの紛い物で
何の役にも立たない

つまりsignal()なんて要らない子
0214デフォルトの名無しさん2007/08/05(日) 02:10:34
いやシグナルという仕組み自体が正直勘弁だ
0215デフォルトの名無しさん2007/08/05(日) 02:11:28
まあスレッド登場前の化石だよな
0216デフォルトの名無しさん2007/08/05(日) 02:14:57
signal handlerからlongjmpがunixの作法ですが何か?
0217デフォルトの名無しさん2007/08/05(日) 02:15:53
おk。大体分かった。
0218デフォルトの名無しさん2007/08/05(日) 02:17:24
それが今となっては最悪の作法だよねって話でしょ
スレッドと相性が非常に悪いし
それでなくとも
シグナルハンドラが再インストールされるかどうかとか
システムコールが再送されるかどうかとか
シグナルハンドラ内であれをやってよいこれはよくないとか
バッドノウハウのすくつやん
0219デフォルトの名無しさん2007/08/05(日) 02:23:03
write一つとっても、linux/*bsd/solaris/hp(dec)でそれぞれ挙動が違うからねえ
posixもM$がサーバ戦略に本腰いれて慌てて始めたもんだしなあ
0220デフォルトの名無しさん2007/08/05(日) 03:22:10
set_terminate ってどういう場合に使う?
main で全ての例外補足してから異常終了した方が
ローカル変数のデストラクタが呼ばれていいと思うんだけど。
0221デフォルトの名無しさん2007/08/05(日) 03:24:59
そういうまともな例外処理が出来ないときのためにあるのでは

例外処理中に例外が出たとか
0222デフォルトの名無しさん2007/08/05(日) 03:27:03
>>220
2行目以降の意味がわからん。 set_terminate() 関係ないだろ。
0223デフォルトの名無しさん2007/08/05(日) 03:36:23
>>221
ああ、二重例外に対応する場合か。なるほど。
0224デフォルトの名無しさん2007/08/05(日) 12:41:24
VS2005 MFCなんだけど、アクセスバイオレーションの例外処理を
捕らえたいんだけど、
try{}
catch( ... ){}
この構文では捕えられないんだけど、どうしたらいい?
0225デフォルトの名無しさん2007/08/05(日) 12:44:09
アクセスバイオレーションて単純にソフトウェアのバグじゃないか?w
0226デフォルトの名無しさん2007/08/05(日) 12:54:51
/EHaとか/EHcがらみじゃないの?

でもデフォルトから変更した場合、
ミドルウェアとか依存するライブラリ絡みの整合性が心配だな。
0227デフォルトの名無しさん2007/08/05(日) 15:14:37
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdndeepc/htm/deep060399.asp
まあC++の範疇じゃないな。
0228デフォルトの名無しさん2007/08/06(月) 06:55:48
構造化例外で捕まえた方が良いと思うヨ。
0229デフォルトの名無しさん2007/08/06(月) 18:19:11
_set_se_translatorという手もある。
いずれにせよVC++くらいしか使えるものがないというのに変わりはないけどな。
0230デフォルトの名無しさん2007/08/06(月) 21:25:46

スレ違いだったらすいません。

アプリ開発の依頼スレが見つからなかったのでこちらに書かせて頂きました。
当方所有のウェブアプリケーションソフト
(以前プログラマに依頼して作ってもらったものですが今は連絡が取れません)
がURL先の変更?で突然使えなくなってしまいました。

そこで、緊急で本日中に改変が出来そうな方是非お願いできないでしょうか?
当方、全くの知識不足で言語が C++ということ以外分かりません。
ソースファイルは持っております。料金は2万円でお願いします!

[email protected]
0231デフォルトの名無しさん2007/08/06(月) 21:29:58
マルチはよくないな
0232デフォルトの名無しさん2007/08/06(月) 21:47:57
やすっ
0233デフォルトの名無しさん2007/08/06(月) 23:11:47
>>230
ソースがあるならソースを晒せよ。ロハでできるぞ。
ソースを晒せないから有料でということなら、2万円なんて人を見下したようなことをするもんじゃない。
0234デフォルトの名無しさん2007/08/07(火) 06:33:04
void foo(char *p, size_t len)
{

}
0235デフォルトの名無しさん2007/08/07(火) 06:34:28
すみません途中で送信してしまいました。

void foo(char *p, size_t len)
{
// ここでpとlenからistreamを作りたい
}

実際には、basic_istreamの派生クラスを作るしかないのでしょうか?
02362352007/08/07(火) 06:44:00
最初は、std::istringstreamを使って実装していたのですが、バイナリを扱う必要があるので、見送りました。
0237デフォルトの名無しさん2007/08/07(火) 07:39:56
俺判定

↓エスパー1級
0238デフォルトの名無しさん2007/08/07(火) 07:48:18
>>236
ファイルストリーム以外でバイナリとテキストの問題なんて起こらないだろ?
istringstream でいいと思うよ。
0239デフォルトの名無しさん2007/08/07(火) 07:50:42
>>236
なんでバイナリを扱う必要があったら istringstream を見送るの?
0240デフォルトの名無しさん2007/08/07(火) 09:01:36
stringという名前が付いてるからバイナリは扱えないと思っているんだろうな
0241デフォルトの名無しさん2007/08/08(水) 20:13:23
義務教育もしっかり受けてるのに
x = x +1
が疑問でもなんでもない俺は負け組
0242デフォルトの名無しさん2007/08/08(水) 20:15:25
柔軟な思考は大事
固定観念はよくない
0243デフォルトの名無しさん2007/08/08(水) 21:16:13
もう疑問を持ったかどうかすら覚えてないわ
0244デフォルトの名無しさん2007/08/08(水) 21:57:28
>>241
x = x * x + Cならマンデルブロ集合なんだけどね。
0245デフォルトの名無しさん2007/08/09(木) 10:46:54
>>241
むしろそのへんの切り替えが高速にできない子は算数のできない子
0246デフォルトの名無しさん2007/08/09(木) 19:51:16
リアル演算子オーバーロードだよな。
0247デフォルトの名無しさん2007/08/09(木) 19:59:43
要は「今まで習った常識・ルール」に囚われてしまっていて、
新しいルール、新しい前提の上でのゲームには一歩も踏み出せないってことだからな

その程度の頭の柔軟性が無いのでは算数やプログラミングに限らず
何やってもだめ
0248デフォルトの名無しさん2007/08/10(金) 09:40:31
何でも受け入れるのもあれだけどな。
そこに疑問を持ち、考察し、納得する、というプロセスをだな・・・
0249身の程知らず2007/08/10(金) 12:01:33
C++の文法に疑問を持つのは、よほどの天才か身の程知らずのどちらかだろ。
もちろんもっと人間にもコンパイラにも分かりやすくて、すばらしい文法は作れただろうが、
今のような位置を占めているかどうかは疑問だ。


以下、俺様演算子を定義できる機能とか、
Cのプリプロセッサなんかより、もっとプログラマブルで、文法を考慮するマクロとか、
↓禿のお気に入りだったマルチメソッドなどについて語ろう↓
0250デフォルトの名無しさん2007/08/10(金) 12:04:48
>以下、俺様演算子を定義できる機能とか、
演算子オーバロードではお気に召しませんか?

>Cのプリプロセッサなんかより、もっとプログラマブルで、文法を考慮するマクロとか、
C99のプリプロセッサではお気に召しませんか?

それならDをどうぞ。
0251デフォルトの名無しさん2007/08/10(金) 12:06:05
Lispじゃねぇの
0252デフォルトの名無しさん2007/08/10(金) 12:10:18
開発当時はのんびり言語仕様考えるヒマなかったんだろう。
シェア争いを制するために時間を惜しんだんだろ
結局当時は高級言語に負けたが。
■ このスレッドは過去ログ倉庫に格納されています