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


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

C#, C♯, C#相談室 Part42



1 名前:デフォルトの名無しさん [2007/08/26(日) 12:42:25 ]
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

前スレ
C#, C♯, C#相談室 Part41
pc11.2ch.net/test/read.cgi/tech/1184840053/

過去スレは>>2-5あたり。

288 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:26:40 ]
>>271
あるいは逆にコレクションに変更を加えようとしてミスるプログラマが出るのを予防するためだな。

D言語ではforeachの制御変数には明示的にrefキーワードをつけないと、代入できないようになってる。

289 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:30:55 ]
それどんな感じで列挙子を実装するの?

290 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:33:54 ]
>>288
そんなアホグラマは正直無視でいい・・・
と思うのは俺だけ?

だってそんなこといったら仮引数だって変更不可にするべきじゃん

291 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:42:45 ]
>>289
int opApply(int delegate(ref T));というメンバ関数を実装する。
www.kmonos.net/alang/d/statement.html#ForeachStatement

>>290
Dでは仮引数にinキーワード(あるいは、finalキーワード)を追加することによって、仮引数への代入が制限されますよ。

要するに、最近は酔っ払いでも使えるような言語設計が流行っているのだ。

292 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:50:44 ]
フェイルセーフがあるのは結構な事じゃないか

293 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 21:01:28 ]
いつも酔っぱらってこーでぃんぐしてるからありがたい

294 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 21:45:38 ]
参照型の場合
foreach (Hoge h in Hoges) {
  h = new Hoge(); // はダメでも
  h.Member = 123; // は全然OKだから
あまりガードにはなってないよね。

295 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 21:55:27 ]
…なんか勘違いしてないか?

296 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:11:00 ]
>>295
なんかって何?一言主さん



297 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:13:01 ]
フェイルセーフがいいならC++のconstなんか真っ先に導入しなきゃダメだろ
キャッチしなきゃいけない例外も必要だろ
C#はそういうのが意図的に外されてるんだな
意味ないから

298 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:15:50 ]
VC++(2005)のMS拡張構文ではconstのあるなしで調整できるようだ。
// cl /EHsc
#include <vector>
#include <iostream>
int main() {
  std::vector<int> v;
  v.push_back(1); v.push_back(3); v.push_back(5);
  for each(int r in v) {
    r++; // OK
    std::cout << r << std::endl;    
  }
  for each(const int r in v) {
    r++; // Error
    std::cout << r << std::endl;    
  }
}

299 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:18:01 ]
>>297
いや、チェック済み例外は明らかに設計ミス。

300 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:21:40 ]
しかしネットワークなんかだと、
絶対に間違いが起きる可能性がある処理はあるわけじゃない
そういうのをどうやって実装すればいいの

301 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:27:25 ]
そんなのインテリセンスなりナンチャラペットの水準でサポートすれば
済むことじゃないの?

まあ、それ以前にドキュメントをちゃんとして欲しいよねw

302 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:09:05 ]
constもチェック済み例外も問題の根は同じ。不必要に実装に結び付く(透けて
見せる)シグニチャである点。


303 名前:デフォルトの名無しさん [2007/09/03(月) 23:15:15 ]
>>277

あんた、単なる素朴な疑問かと思ってたけど
真正のあほだな

304 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:16:10 ]
VC# ExpressEditionダウンロードしたんだけど
オフラインでMSDN見ることってできないんですか?

305 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:21:54 ]
ふらっとに行くべき

306 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:31:16 ]
>>302
意味がよくわからないから詳しく説明してくれ



307 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 01:41:01 ]
>>290に同意。費用対効果の低いフェースセーフ要らないぽ
constだので縛ってもバグは斜め上からやってくるね。
sealedつけてたのにsealed外されるとか。

foreachといえば、配列に関してはfor文と同等の速度が出ますが、こういう情報はどこにあるのでしょうか?
パフォーマンスガイドラインに重いループではforeachよりforって書いてあったので
わざわざ変えたのに・・悲しい。

308 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:21:04 ]
英語だけどパフォーマンスの話題はここが詳しいかな
msdn2.microsoft.com/en-us/library/ms998547.aspx
1.1に基づいてるからまだforが速いって書かれてはいるが・・・

msdn2.microsoft.com/en-us/library/aa137140.aspx
ここにもパフォーマンスの記事が結構たくさんあるね
特にKnow What Things Costは命令ごとのコスト表が載ってて面白いかも

309 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 02:52:52 ]
>>307
2.0だとforeachのほうが若干早くなってますね。
foreach (int v in ar) csum += v;
for (int i=0; i < 10000; i++) csum += ar[i];

これを下のように書くとforeachと同じスピードになるからそういう最適化をしてるのでしょう。
fixed (int *sp = &ar[0]) {
 int *ep = sp + 10000;
 for (int *p = sp; p < ep; p++) csum += *p + j;
}

ただ、foreachの制御変数が読み取り専用なのは、フェイルセーフのためなのか、
最適化のためなのかは判断がつきません。

310 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 07:54:38 ]
アンセーーーーーフ!!
なるほど、「処理を直接記述されると最適化できないが
抽象度を高くすると最適化しやすい」というやつか
forよりforeachの方が早い
LINQも早くなるという

しかしループ変数への代入を許すとこの最適化が出来なくなるわけか

311 名前:デフォルトの名無しさん [2007/09/04(火) 09:28:17 ]
アンマネージドのコードと同期をとりたく、
EventWaitHandle.Handle プロパティで
ネイティブのハンドルを取得しようと思ったのですが、
「古い形式です」と起こられてしまいます(警告)。
新しい形式ではどのように書くのでしょうか?




312 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 09:37:04 ]
>>311
MSDNにずばり書いてあるから、まず自分で調べるくせをつけろ。

313 名前:デフォルトの名無しさん [2007/09/04(火) 09:37:06 ]
あ、
EventWaitHandle.SafeWaitHandle.DangerousGetHandle()
でいいみたい。
Safeなんだか、Dangerousなんだか。


314 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 10:15:09 ]
>>313
DangerousGetHandle()は必要?
MSDNでは、
>このクラスを使用すると、派生クラスのインスタンスでラップされたアンマネージ リソースを
>識別するハンドル (オペレーティング システム ハンドルなど) をアンマネージ コードに
>渡すことができます。
となってるし、使用例にあるWindowsAPIの呼び出しサンプル見ても、IntPtrの代わりに使ってる。
というか従来のIntPtrの代わりに使うべきもののように見える。
DangerousGetHandle()はデバッグのためにハンドル値を16進でダンプしたいとかの特殊用途のために
残してあるんじゃないか。

315 名前:デフォルトの名無しさん [2007/09/04(火) 11:08:29 ]
>>314
なるほど。ほんとだ。

ハンドルは、PVOIDだろ、と、
[DllImport("native.dll")]
public static extern void NativeFunc(System.IntPtr hHandle);
して、Handleプロパティから渡していたので、、
替わりにSafeWaitHandle使えと言われても、型が違ってこまってました。

[DllImport("native.dll")]
public static extern void NativeFunc(SafeWaitHandle hHandle);
こうすればいいんですね。


316 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 12:42:53 ]
デンジャラスなんてついてるメソッド使いたくないお



317 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 13:35:00 ]
IntPtrで問題が発生したら泣き寝入りするお

318 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 18:41:40 ]
>>316-317
正直、「ボキュはキモヲタだお」って言ってるようにしか聞こえない。
そういうの気色悪いと思わない自分を気色わるいと感じるべきだ。

319 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 18:48:43 ]
どうか、次のVBをC#に直して下さい。

Label1.Text = Replace(Session("body"), vbCrLf, "<br />")

-----------------------------------------------
VBの本の中にソースが載っていたのですが、
この1文が、どうにもわかりません。

そのコード意味は、どうやらセッションというデーター内の改行を
HTMLの改行に変換するっぽいのですが・・・。(推測)

ちなみに、他の行は自力で調べましたが肝心のこのコードが分りませんし、
C#でどう書けば良いのか分りません。

賢者の方々、どうか愚者の私にご指導をお願い申し上げます

320 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 18:54:20 ]
>>319
少しはググるとか努力しろよ

VB.NET固有の関数をC#で使用するには?
www.atmarkit.co.jp/fdotnet/dotnettips/254vbfunc/vbfunc.html

でも、それただの部分文字列の置換でしょ?
String.Replaceか正規表現で代用できるでしょ。

321 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 18:54:33 ]
>>319
zoosir.hp.infoseek.co.jp/tips/string/string03.htm
C#だと省略可能引数(Optional)が無いから、全部書く必要があるらしい。

322 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:35:51 ]
>304
MSDNも普通にフリーとして公開されてなかったか?

323 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:54:39 ]
csc.exeやvbc.exeって開発環境がなくてもインストールされるものなんですか?
C:\windows\Microsoft.NET\framework\以下にあるのでそんな気がしますが。

324 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 21:57:13 ]
はい。実行時に使用する場合もあるので、全ての環境に含まれています

325 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 22:03:35 ]
>>324
おお、そうだったんですか。
これで安心してCodeDomが使えます。

326 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 22:17:14 ]
標準添付はcsc/vbc/jscの三つ、だったかな確か clは非標準だよね
標準なのにドマイナーなのがひとつ



327 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:09:57 ]
Control.Invoke系のメソッド呼ぶとどっかで内部的にファイナライザが必要になるっぽいな。
ループの中から呼んだりして大丈夫なんだろうか。
何千何万って呼んだらなんか嫌なことになりそうな気がする。

328 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:15:47 ]
ここは散文を書くところではない。
説明調の、他人に意味がちゃんと通じる文章書けよ

329 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:23:22 ]
え、ファイナライザのコストが高いことを説明しろってこと?
それは説明するまでもないと思ったけど。

何が通じてないのかわからん。
Invoke系のメソッドってのはInvoke、BeginInvokeのことだよ
それらを呼んだら内部的に生成されるオブジェクトでファイナライザが呼ばれるっぽいんで嫌だなって話。

330 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:37:10 ]
何をみてそう思ったの?


331 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:38:28 ]
>何が通じてないのかわからん。
読む側の立場に立って自分の文章推敲できない人間はたいていそうだ。

ついでに、ファイナライザのコスト?
意味がわからない。
デリゲートを処分するコストがそんなかかるのかね?

仮にかかるとして、コストとは「時間当たりのCPUの使用量」のことだと思うが、
どのみちmsのオーダーでInvokeとか不可能だから意味がないだろう。

332 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:39:31 ]
>それは説明するまでもないと思ったけど。
いったいどんな頻度でControl.Invokeなんかを実行する気だ?


333 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:44:23 ]
>>327
再描画を伴わないControl.Invokeの使い道って
あんまり思いつかないんだけどどうだろ?

経験上、何千何万って単位でControl.Invokeを呼ぶと
再描画コストが恐ろしいことになる。

WinFormsなら1秒間に10回ぐらいの更新でいいんじゃないかね?
まあそれ言い出すとTimerでいいじゃんて話も多いんだけど。

334 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:44:31 ]
>>330
CLR Profilerで見れるよ。

>>331
msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdndotnet/htm/dotnetgcbasics.asp
この辺でも読んでくれ。
なんでデリゲートが出てくるのかわからんが・・・

>>332
別スレッドでなんかの処理中にUIを更新するために呼んだりしない?
まあ何万は言いすぎかも。

335 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:04:23 ]
>>322
ヘルプから見れるキーワードとか目次がMSDNなんですか?

336 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:05:13 ]
>>334
読んでくれって、どこにもお前さんが主張しているような類のことは書いてないだろw



337 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:10:27 ]
>334 CLR Profilerで見れるよ。
Control.Invokeを使ったらファイナライザが実行されたってこと?EndInvokeしてても?


338 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:13:32 ]
ファイナライザのコストが高い(高くなりうる)ということ自体はわかるが、
Control.Invokeで実行されるというファイナライザを持つオブジェクトが内包するオブジェクトとか。
Control.Invokeを実行する通常の頻度とかから考えて、それが問題になるほどコストが高いとは思えん
ということだよ。

「ファイナライザのコストが高い」という表現自体をそのまま疑ってるんじゃない。
ついでにEndInvokeしたらファイナライザは実行されないんじゃないの?普通に考えて。
と思っただけで、まあこれはプロファイラで確認してそうなってるってんならそうなのかもしれん。


339 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:17:46 ]
>>335
VS2005 Expressのヘルプに標準で何が入っているかは知らないが、MSDNライブラリはこれ。
ttp://www.microsoft.com/downloads/details.aspx?FamilyID=b8704100-0127-4d88-9b5d-896b9b388313&DisplayLang=ja

2.5Gバイトほどあるから注意してくれ。

340 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:22:22 ]
ファイナライザはそれを行わなければならないものが一つでもあると
GCを二回行わなければならず単純計算でGCにかかる時間が倍になるんじゃなかったか

341 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:27:36 ]
>>337
>>338
EndInvokeしても呼ばれるみたい。
やっぱgen0でちゃちゃっと回収されるから問題が少ないってことなのかな?
具体的にはControl.ThreadMethodEntryってオブジェクトだけど
ファイナライザの処理自体はシンプルだけど他のオブジェクトへの参照は割とごっそり保持してるみたいだな。

まあ他に代替手段があるわけじゃなしどうこういっても仕方ないんだけどね。

342 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:42:58 ]
おお?なんだこの意味なしFinalizeはw
いらねーじゃねーかよ。


343 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:48:44 ]
>他のオブジェクトへの参照は割とごっそり保持してるみたいだな。
そんなに困らないオブジェクトが多いけどな。
まあ引数とか戻り値はクリアしてほしいところだが


344 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:58:26 ]
だいたい、GEN1までで回収できたら、負荷的にはまあそんなに大きくはならないようだな。
GUIアプリだし、特にControl.Invokeなんて同期実行なんだから、まあ普通はまずGEN1ですべて回収できるだろう。


345 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 02:05:06 ]
SuppressFinalizeを書き忘れてるんじゃないか

346 名前:319 mailto:sage [2007/09/05(水) 11:20:12 ]
>>321賢者
一応、下記ソースに変更出来ました。
的確な助言、ありがとうございました。

if ((string)(Session["Body"]) == null)
{
  Label1.Text = "<br />";
} else {
  Label1.Text = ((string)(Session["Body"])).Replace("\r\n", "<br />");
}




347 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 11:24:43 ]
暇があったら as 演算子を調べとくといいよ

348 名前:319 mailto:sage [2007/09/05(水) 11:45:52 ]
>>347 神へ

ご助言の通り、as演算子をしらべました。
お陰でたまに出るエラーがなくなりました。
さすがは神ですね。
即レスにも関わらず、100%的中でした。

なぜ、私がたまに出る意味が理解できないエラーで苦労している所を
お察し出来たのか愚民にはわかりませんが、
貴方の英知で、救われました。
再びお礼を申し上げます。

string s = (string)(Session["Body"]) as string;
if (s == null)
{
  Label1.Text = "<br />";
} else {
  Label1.Text = ((string)(Session["Body"])).Replace("\r\n", "<br />");
}


349 名前:319 mailto:sage [2007/09/05(水) 12:08:38 ]
※すみません。下記に訂正しました。

string s = (string)(Session["Body"]) as string;
if (s == null)
{
  LabelBody.Text = "<br />";
} else {
  LabelBody.Text = s.Replace("\r\n", "<br />") + "<br />";
}


350 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 12:18:23 ]
まだキャストしてんじゃん。

string s = Session["Body"] as string;

じゃないとエラーでるっしょ

351 名前:319 mailto:sage [2007/09/05(水) 12:22:14 ]
>>350
いいえ。
今の所、何もエラーがでませんが?

でも、助言ありがとう。

352 名前:デフォルトの名無しさん [2007/09/05(水) 12:39:14 ]
>351
エラーは出ないけど
string m = ((string)"Hello")

とはやらないだろって事じゃない?

353 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 12:59:04 ]
>>352
うん。私もそう思ったので、助言どおりに直しました。
だから、「助言ありがとう」とカキコしたよ。(^^

354 名前:デフォルトの名無しさん [2007/09/05(水) 13:34:37 ]
foreachを書き込みしたいっていう人は具体的に何をしたいの?
1. foreachのループの中でコレクションの書き換えをしたい。
2. foreachのループ変数を書き換えることによって、ループの制御をしたい

1.なら foreachのループ変数はコレクションの要素とは無関係な場合もある。
そもそも、IEnumerableには「要素」の概念はないし、arrayみたいにIListを実装した
インデックスを通じて要素にアクセスできるコレクションとは限らない。

2なら、ループのカウンタはIEnumerableの内部でループ変数とは別に
管理されているから、無駄(というか、おそらく何も起きない)。

だと思うんだけれど、ほかに何か書き込み許容するといいことってありますかね?

355 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 13:54:18 ]
今更その話か
ちゃんと読めとしか言いようがないが、1でも2でもない(つーか2は意味がわからんが)

あえて例を出すならこんなことがしたいんでしょ
foreach (string str in input)
{
str = str.Trim().ToLower();
if (str.Length == 0) throw new exception("Invalid");
Console.WriteLine(str);
}

356 名前:デフォルトの名無しさん [2007/09/05(水) 14:15:34 ]
>>355

なるほど、そういうことか。全然議論が見えてなかった。
Console.WriteLine(str.Trim().ToLower());
でも書き込み禁止だとエラー出るのかな???

355さんの例みたいに条件分岐したいような場合は
たとえ書き込み禁止じゃなくても、可読性のために仮変数おいたほうが
いいとおもうけど…。



357 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 14:15:34 ]
>>353
object o = 1;
string s = (string)o as string;

358 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 14:29:43 ]
えーっとだな…

それはなんだ?


359 名前:デフォルトの名無しさん [2007/09/05(水) 15:28:55 ]
C#からC++のクラスライブラリを利用するには、
ttp://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_03.html
のように、publicメンバすべてをラップしか、方法ありませんか?


360 名前:デフォルトの名無しさん mailto:age [2007/09/05(水) 15:30:10 ]
dt=$.split(' \n');dt[dt.length]='';for(i=0;undefined!=dt[i];i+=2){write(dt[i-i%2+1].replace('jp.','').replace('www.',''));br();write(dt[i-i%2]);br();}


361 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:36:46 ]
>>359
使うメンバだけラップすれば良いよ。
COM 化するって手もある。

362 名前:359 [2007/09/05(水) 15:53:00 ]
>>361
なるほどCOMって手も。。

説明まちがえた。
すべてのメンバか使うメンバだけって、ところが問題じゃなく、
いちどC++/CLIでラップしなければいけないのかどうか、知りたかった。

ラップするのはここではC++/CLIだが、
直接C#でラッパを書いて、マネージドのクラスライブラリを作ることは
可能ですか?


363 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 16:01:12 ]
>>362
C++/CLI でラッパを書く、C++ で COM 化するのいずれも避けるには?ってことですか。

ヘッダファイルとオブジェクトファイル(あるいはソースコード)で供給されるような普通の
良くあるクラスライブラリの場合、そもそもライブラリ側のコードを呼び出す手段が無い
ですよね。

dllexport されているクラスなら MSVC の ABI に従って呼び出してあげれば動くでしょうけど、
そういうライブラリはあまりないし、割に合わないような気がする。


364 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 16:34:36 ]
今ハードウェアとやりとりをしなければならないので、PInvoke を使って DLL にアクセスしています。
この DLL の Open 関数を構造体を引数として呼んであげると、この構造体の中にデータが入って
返ってくるというものです。
で問題はこの構造体のメンバに構造体の配列が入っており、この構造体の配列を取得することが
できません。( 構造体の他の int のメンバは取得できています。以下でいうところの ID )
このような構造体下の構造体を取得することはできないのでしょうか。

struct Parent
{
public int ID;
public Data[];
}

struct Data
{
public int RawData;
public int Length;
}


365 名前:359 [2007/09/05(水) 16:38:33 ]
>>363
すみません、最後の、
dllexport されているクラスなら(snip)動くでしょうけど、
について、もすこし教えてください。dllexportすれば、
C#から直接呼べますか?


366 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 16:59:15 ]
>>365
exportする側は
msdn2.microsoft.com/ja-jp/library/a90k134d(VS.80).aspx
あたりを参照

メンバ関数がどういう名前でexportされるかはコンパイラ依存。
dll 生成時の出来る lib を見て自分で調べる。
仮想メンバ関数は vtbl 経由でアドレスを取得。

MSVC の 呼び出し規約は基本 __cdecl ですが this を ecx に入れて呼ばなきゃないので、
そこだけは C++ というかアセンブラの補助が必要ですね・・・



367 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 17:00:01 ]
あなたがCでDLLExportされたC++クラスのコンストラクタを起動し、
vtblに格納されているか少なくとも名前マングリングされたthisコールの
メンバ関数を起動し、スローされた例外を上手いこと取り扱い、最後に
デストラクタを起動して破棄できるのなら、C#でもきっと出来るだろう。

368 名前:デフォルトの名無しさん [2007/09/05(水) 18:36:48 ]
大人しくEXEキックしてコンソールで取り込めば?

369 名前:359 [2007/09/05(水) 19:13:34 ]
>>366 367 368
みなさん。ありがとうなんとなく理解した。

[DllImport("native.dll")] extern static void Hoge()で、
C#から、Cの関数は呼べる仕組みがあるし(マーシャリングもあるし)、
マネージドであるC++/CLIからは、C++/Native のオブジェクトをnewできるし、
なので、C#からC++/Nativeにアクセスできる方法も実はあるんじゃないかと、
ちょっと期待して質問してました。


370 名前:デフォルトの名無しさん [2007/09/05(水) 21:11:06 ]
>369
これはマジレス
キャストやアンマネージDLLを使うならVB.NETがいい。

VBFixedArrayにDECLAREで処理するDLLをC#で呼ぶ。
アンマネージVBが噛むと処理が激重だから、処理が軽いもの限定だけど。

FORTRAN
C
C++
で構造体処理するDLLも一発でいくよ

371 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 21:12:58 ]
VB 使うくらいなら俺は C++/CLI を選ぶぜ

372 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 21:29:01 ]
エクセルとか操るならVBの方がずっと楽だと思うけど、
アンマネージdllの関数呼ぶ手間はあんまり変わらないんじゃない?

373 名前:デフォルトの名無しさん [2007/09/05(水) 21:32:03 ]
>371
C++/CLIでやるのもありだな。2003ですまない

374 名前:デフォルトの名無しさん [2007/09/05(水) 21:34:15 ]
>372
それはVB.NETじゃなくないか?

375 名前:359 [2007/09/05(水) 21:38:27 ]
>>370
ラッパをVBで書く?
>>371
私もなんとなく同意。

やりたいことは、ネイティブなC++クラスライブラリを、
マネージド(C#)から使えるクラスライブラリにしたい。です。

結局C++/CLIでくるむ方法を取ることになりそうで検討中ですが、、
publicなクラス → ラッパクラス
interface → ??
publicなメンバ関数 → 全部ラッパ
publicなメンバ変数 → プロパティ
#define定数 → static const な定数
struct → ??
enum → ??

どのように書き換えたらいいか、わからないとこ満載だ。
どなたか、??のところを教えてください。



376 名前:デフォルトの名無しさん [2007/09/05(水) 21:41:15 ]
バイナリーを読む場合ポインタTOストラクチャを使うC#に対してVBは一発で入るよ?

同じかな?



377 名前:デフォルトの名無しさん [2007/09/05(水) 21:43:47 ]
>375
それなら2005を買ってみな。
ヘッダ読めばそのまま動く

378 名前:デフォルトの名無しさん [2007/09/05(水) 21:48:34 ]
すまない、ちょっと言葉が足りなかった
使いたいライブラリをC++でインクルード

コンパイル

C#で参照設定
.NETプロジェクト

これで全部使える

379 名前:デフォルトの名無しさん [2007/09/05(水) 21:52:49 ]
VB.NETでラッピングする場合は、DECLAREで定義。引数は全てVARIANTのFIXEDARRAY
(OBJECTだと通らないから注意)
で、きちんとした型をCTYPEで渡せば動作する

楽じゃないか?

380 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 21:56:22 ]
>>375
>マネージドであるC++/CLIからは、C++/Native のオブジェクトをnewできるし、

ネイティブのライブラリは実はCのランタイムライブラリが裏で色々サポートしているので
newの部分だけ見てても混乱するよ。

内部でCRTヒープ使ってるかもしれないし、
atexitみたいなコールバックに依存しているかもしれない。

一般論として、Cのライブラリは静的リンクなり動的リンクなりのCRTを必要とする。
そのCRTとの連携無しに、C#から
直接Cのコード使おうってのはちょっと無謀じゃないかな。

相手がDLLの場合、LoadLibraryされたときに自分でCRTの初期化やるから
その辺気にする必要はないんだけど。

381 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:44:08 ]
んん? そのためのC++/CLIなんだから、CRTのルールを守らず
アセンブリをロードするとは思えんけど。

msdn2.microsoft.com/ja-jp/library/ms173266(VS.80).aspx

382 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:50:54 ]
>>381
C++/CLIはそれでOK。そこは同意。

よく分からないのは359が言うところのクラスライブラリが
どんなファイル形式なのかかな?

1) *.h 単体 (テンプレートライブラリ)
2) *.h+*.lib
3) *.h+*.obj
4) *.h+*.dll
5) *.h+*.cpp

>>>359
>いちどC++/CLIでラップしなければいけないのかどうか、知りたかった。
とか書いている割に、どんな形態で配布されているライブラリなのか
未だに明かしていないみたいだけど。

383 名前:359 [2007/09/06(木) 01:46:34 ]
>>382
わかりにくくてすんません。一番最初にあげたurlの記事の内容そのまんまで、
WIN32で書いてあるスタティックのライブラリ。
2) *.h+*.lib
ってことになります。
ttp://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_03.html
で、このとおりやってみようと思ったのだが、
>>375
で書いたとおり、メンバ関数をラップするだけじゃ足りなくて、
その他もろもろ細かいところすべて書き換えなきゃならなくなって。。。
ホントにこれが普通の方法なのか?もっとエレガントな方法があるのでは。
と、思ったのでした。
ちなみに、すべてではないですが、
4) *.h+*.dll
の形にしたものもあります。
MFC,ATL,stlは使っていなく、CRTは使っているものとそうでないものが。

>>380 >>381
Nativeと.NET、両方が扱える言語は、C++/CLIだけで、
っていうか、C++/CLIはそのために存在している。ので、いまこそ使うときだ。
ってことですかね。


384 名前:359 [2007/09/06(木) 02:01:14 ]
>>370 >>379
VB.NETはまったく未開の地だ。ちょっとみてみる。ありがとう。

>>377 >>378
ん。COMの話?


385 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 11:42:05 ]
どうもデリゲートの使いどころがわからないんですが
イベントのメソッドはわかるんですが
おーデリゲートってすげー!!!
っというような使用法ってどういうのですかね


386 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 11:48:38 ]
//List<int> list;
list.Sort(delegate(int x, int y){return y.CompareTo(x);});//逆順ソート



387 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:18:08 ]
>>385
そもそもイベントはdelegateのシンタックスシュガー似すぎな一ツーの

388 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:40:05 ]
>>386
それって匿名メソッドスゲーの例じゃないの。

389 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:46:03 ]
C#2.0になってジェネリックや暗黙のインスタンス作成や匿名メソッドが付いて
デリゲートが使いやすくなったけど、その前は単体ではあんまり積極的に使われなかったような

390 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:00:11 ]
イベントとか意味わかんねえ
+=と-=しかできないし
なんに使うんだよ

391 名前:デフォルトの名無しさん [2007/09/06(木) 13:01:53 ]
>>390
イベントのハンドリングだとおもう。


392 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:04:04 ]
普通にdelegate使った方が入れ替えられて便利じゃん
無駄なフェイルセーフだぜ

393 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:08:04 ]
一応プロパティと同じように実装の変更もできる

394 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:08:20 ]
>>390
IDEによるポトペタ

395 名前:385 mailto:sage [2007/09/06(木) 13:17:22 ]
>>386>>388
そうですね匿名メソッドですね
>>387
そうですか…なんかイベントの話になってきてますね
んーデリゲートでこんな風にしたらすっごい便利!
とかいう話ないですかね

396 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:45:38 ]
void Hoge() { list.ForEach(Print); }
void Print(int x){ Console.WriteLine(x); }
コレクション関係以外にないかなあ



397 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 13:58:02 ]
>>395 処理のインジェクションしたいところにはdelegateばんばん使ってます。
クラスの生成時とかにそのシチュエーションに併せて動作を変えたいとき便利。

398 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 14:00:41 ]
インターフェースを実装したクラスを作るよりも楽>delegate

399 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 14:55:19 ]
Action<T>は

interface IHoge<T>
{
 void Method(T arg);
}

とだいたい同等で
class A
{
public Action<Foo> Action;
}
class A
{
public IHoge<Foo> Action;
}
これもだいたい同等
a.Action = delegate(Foo foo){
 ....
};
これと
class FooHoge : IHoge<Foo>{ ... }
a.Action = new FooHoge(...);
これも大体同等

匿名メソッドなら直接かけるから一々定義したクラスを読まなくてすむので見やすい
ラムダ式になるともっと便利になる

匿名メソッド使わなくても、引数さえ合えばどんなメソッドでもはまるから、
いちいちinterface実装したクラスを作らなくて済む分楽
でもやっぱり真価は匿名メソッドで出てくる

400 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 15:04:40 ]
interfaceでは大げさすぎる場合も多いし、例えばイベントハンドラを
インタフェースとして実装した場合、同じWidgetを複数個持とうとするとに
インタフェースが衝突する、といった問題が生じる。Javaではこれを解決
するのに一々ゴテゴテと無名クラスを記述する羽目になり、実に馬鹿馬鹿しい限りだ。

ラムダ式が無くとも、delegateであれば上記の問題は普通に解決することが
出来る。

まあ、処理を汎用化したり(例えば描画ルーチンに、PixelをPutする
ルーチンだけdelegateとして与えられるようにすれば、汎用になる)、
テーブルジャンプっぽく使ったり(メニュー等のindexとdelegateの配列を
結びつけたりする)、意思決定と実行のタイミングが分かれている場合に、
意思決定→delegate変数に保存→delegateを用いて実行といったことをやったり
(実行が何度も行われる際に、無駄な条件分岐を完全に取り除くことが出来る)、
色々と応用範囲は多い。


401 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 15:17:17 ]
delegate使うとエディットコンティニューでやり直しになるのがデメリット

402 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 17:37:05 ]
久々にThreadPool.GetMaxThreads()を実行してみたらワーカースレッドが500、I/Oスレッドが1000になってた。
前はもっと少なかった気がするんだけど・・・なぜでしょうか?

403 名前:385 mailto:sage [2007/09/06(木) 19:32:29 ]
なるほどーみなさんいろいろ使ってますね
デリゲート道、精進します
ありがとうございました

404 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:04:16 ]
>402
前は少なすぎたせいでスレッドプールが一杯になって例外が起きるケースがあったのでので.NET2.0から事実上無制限といえる値に増やされた。
なにげに呼んだクラスが内部でスレッドプールを使っててスレッドプールの上限で例外吐かれたりしても対処しようがないじゃん。

405 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:10:45 ]
ClassAのイベントにメソッドを紐付けしてるClassBがシリアル化可能じゃないと
ClassAまでシリアル化できなくなっちゃうけど、これって何か回避方法ないかな?

あと、デリゲートにインスタンスメソッド登録するということは、
デリゲートに参照を持たれる(つまりGCが働かない)こととやっぱり等価になるの?

406 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:20:37 ]
当たり前
っていうかイベント結びつけたままシリアライズしたいって
いったいどんなときなの?



407 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:22:28 ]
ああひょっとしてシリアライズさせない方法が分からないってことか?
メンバにつける属性で制御できるよ

408 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:43:28 ]
でもNonSerializedAttributeってイベントには付けられないと思うんですが。。

409 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:56:27 ]
>>405
デリゲートを明示的に宣言してそのデリゲートにNonSerializedつければいいらしい。
↓参照
www.thescripts.com/forum/thread245864.html

410 名前:409 mailto:sage [2007/09/06(木) 21:01:10 ]
[field: NonSerialized]でもできるみたいだな
こっちのほうがスマートか。

411 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:09:45 ]
>>409-410
ありがと。
しかし、そんなマンマの回答よく短時間に見つけられるもんだね関心しちゃうよ

412 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:44:51 ]
部下にほしいね。






すみません師匠にほしいです。


413 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 21:56:13 ]
このスレには結構、神クラスのスキルのひとがいるいよね。
どんな立場の人なのかきになるわ。マイクロソフト直々のサポート部隊が
書き込んでいるんじゃないかと思ってしまうくらいだ。

414 名前:デフォルトの名無しさん [2007/09/06(木) 21:59:52 ]
やまだはぷろぐらむの天才だ。
きょうもすごいぷろぐらむをつくる。

int i = new int()

あれ、なにかへんだぞ。

intはたしか・・・

Int16

やまだくんはまだ満足しない。

iというなまえはかぶるかもしれないからあんぜんじゃない!

Int16 _USER_OBJECT_YAMADA_WRITE_200709062156_FOR_COUNTER

完璧なソースコードの誕生だ!



415 名前:デフォルトの名無しさん [2007/09/06(木) 22:02:31 ]
>>413

そのクラスの人間なんて見たときねーよ

416 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:02:47 ]
すみません。どれが自作自演でしょうか?



417 名前:デフォルトの名無しさん [2007/09/06(木) 22:03:48 ]
やまだだけどなんでもそうだんにのるよ!!

418 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:05:47 ]
>>414
jが必要になったらどうする。

419 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:06:12 ]
やまだくんはネームスペースをだな

420 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:06:28 ]
田中は山田のイヂワルな上司だ。
今日も嫌がらせを部下達にして楽しむ。

「iというなまえはかぶるかもしれないからあんぜんじゃない!
「Int16 _USER_OBJECT_YAMADA_WRITE_200709062156_FOR_COUNTER
「完璧なソースコードの誕生だ!

あれ、山田が何か楽しそうだぞ。
イヂワルしてやれ!
「山田君、このメソッドの名前は[_USER_OBJECT_YAMADA_WRITE_200709062156_FOR_COUNTER]にしてくれ
 会議で決まったのだ!

421 名前:デフォルトの名無しさん [2007/09/06(木) 22:06:31 ]
>416
じえんはないけどえいえんはあるよ!

422 名前:デフォルトの名無しさん [2007/09/06(木) 22:12:35 ]
たなかさんめそっどめいのせんすないからきらいだ!

そうだ。こういうときは・・・おーばーろーどがあるじゃないか!

やまだはそっとたなかのめそっど名のぷれふぃっくすに
OVERROAD_
をつけたした。
これでなまえがかぶることはない。

423 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:15:09 ]
スレが壊れだした

424 名前:デフォルトの名無しさん [2007/09/06(木) 22:15:21 ]
>418
よくじつにまわすか、ぷれふぃっくすにSTATIC_とかつければかいけつだよ(^^)

425 名前:デフォルトの名無しさん [2007/09/06(木) 22:17:18 ]
>423
すまない。ガチでこんなコードの修正依頼にイラついて書いてしまった。
後悔はしていない

426 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:19:11 ]
マでやれ



427 名前:デフォルトの名無しさん [2007/09/06(木) 22:22:43 ]
for(LOOPCOUNTER_[LOOPCOUNTER_1,LOOPCOUNTER_2]=58;END==TRUE;LOOPCOUNTER_1**)
{
}

やまだすごくね?

428 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:23:33 ]
名前空間の無い言語はきついな

429 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:24:51 ]
END==TRUEってなんぞ

430 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:25:40 ]
>>428
どちらかというとセンスのないプロ…

431 名前:デフォルトの名無しさん [2007/09/06(木) 22:33:45 ]
ちなみに言語はC#だぜW

432 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:35:04 ]
ENDがTRUEの間ループをまわすの?
普通に発狂するわ

433 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:39:10 ]
もっとやまだのコードがみたい

434 名前:デフォルトの名無しさん [2007/09/06(木) 22:39:56 ]
ディフォルトTRUE
スイッチFALSEとコメントある。
わからない事もない

435 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:44:32 ]
ディフォルトって何?

436 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:45:54 ]
マでやれ



437 名前:デフォルトの名無しさん [2007/09/06(木) 22:48:14 ]
やまだソース今度ZIPであげるわ

438 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:48:38 ]
なんで大文字なんだろ

439 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 22:49:42 ]
小文字だと予約語などにぶち当たるからだろ。
それかOLD BASICの名残。

440 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 23:08:58 ]
まだLOOP==TRUEの方が理解できる

441 名前:デフォルトの名無しさん [2007/09/06(木) 23:56:29 ]
ブレークポイント設定してもデバッグができなくなる現象が突然でました。
どの辺確認すればいいのでしょう?構成はDebugでやってますが

442 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:01:03 ]
ブレークポイントまでいってない説

443 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:08:40 ]
リビルドすれば治る説

444 名前:デフォルトの名無しさん [2007/09/07(金) 00:10:56 ]
ブレークポイントはForm_Load内なので、到達してるんです。
性格にはブレークポイントに到達して、デバッグモードになるのに凄い時間がかかって
デバッグモード後はF10で1ステップ進ませると、デバッグモード解除されてしまいます


445 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:21:14 ]
Form_Loadのブレークポイントの後に続く文があるのに
デバッグモード解除されるんだったら、
多分VSがぶっ壊れてるんだと思うよ
再インスコじゃね

446 名前:デフォルトの名無しさん [2007/09/07(金) 00:31:52 ]
不思議なことに、あるプロジェクトでしか現象出ないんだけど、
とりあえず朝一で再インストールしてみます



447 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 00:37:35 ]
>444
デバッグのオプションのネイティブのチェックを外して.NETのみをデバッグするようにしたらどうなる?

448 名前:デフォルトの名無しさん [2007/09/07(金) 00:40:18 ]
>>447
すんません。ソースが会社なんで、明日やってみます。thx

449 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 01:27:48 ]
「〜〜〜は開始されませんでした」みたいなエラーメッセージがでて
デバッグ開始が異常に遅くなるときあるよね。

450 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 13:13:13 ]
>>378
kwsk

451 名前:デフォルトの名無しさん [2007/09/07(金) 15:01:14 ]
ソリューションのクリーンとか試してみた?

452 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 16:39:10 ]
怪しいアプリに邪魔されてた事とかあるな

453 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 19:05:00 ]
質問です。

TextBoxコントロールの枠線の色は変更できますか?
できそうにない感じなのですが、そうすると自分で線を描くしかないかと
思うのですが、

Graphics g = this.CreateGraphics();

と取得してコレに対してDrawLineをしてみているのですが、
線が表示されません。

アプローチが間違っているのか、足りないおまじないがあるのか…。

どなたかお知恵をお貸しいただければ幸いです。

454 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 19:49:42 ]
>453
まずその描画はOnPaintでやるべき。

なんとなく、Panelとかの上にTextBoxを載っけてPanelとかに枠線描いた方が楽じゃない?


455 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 19:59:40 ]
>>453
いわゆるオーナードローっぽいことがやりたいのならControlPaintを使うようだから
詳細はMSDNを見るといい

が、>>454に同意だな

456 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 20:19:15 ]
>>454
> まずその描画はOnPaintでやるべき。
TextBoxBase 以下は OnPaint が無視されたような気がする。



457 名前:デフォルトの名無しさん [2007/09/07(金) 20:52:07 ]
>450
2003までのCPPはマネージとアンマネージはクラス分けされ、同一コード内にはかけても、そこからメモリへの受け渡しが辛かった。
2005はマネージとアンマネージを並べてかける。
つまり

int A=42
printf(A.Tostring());
みたいな事ができる。


458 名前:デフォルトの名無しさん [2007/09/07(金) 20:56:41 ]
何かしょぼいが解る人にはマジで!と叫ぶようなコード。

459 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 21:15:38 ]
>>453
やってみると意外と面倒だね。

枠の幅が1でよければ、BorderStyle =BorderStyle.FixedSingleにしておいて
WM_PAINT捕まえてそこで枠を描画すればできる。

460 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 21:44:08 ]
public string フィールドしかないクラスから、全フィールドを連結した
文字列をこさえたい。リフレクション使えばできるかと思ったら、
Type.GetFileds() はフィールドの宣言順を保証しないと言う。
どうすればできる? あきらめるしかない?

461 名前:デフォルトの名無しさん [2007/09/07(金) 21:44:35 ]
>453
ピクチャボックスに色を塗る。
テキストをフラット枠線無しにしてピクチャの上に載せる

これが一番時間がかからない。

グラフィックで書くのも良いけど、速度は体感できない程度しか変わらない

462 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 21:47:44 ]
>>460
そもそもCILにコンパイルされた時点で宣言順なんて保証されないと思うが。
まああきらめた方がいいと思うよ(仮にできたとしても)。

463 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 21:50:44 ]
>>461
ぴったり1ピクセル分ずらすのって、むずかしくない?


464 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 21:55:20 ]
>>460
Order属性とか自分で定義して全部のフィールドに[Order(2)]みたいに付けといて
その順番で連結すれば?
それなら余計なメンバを増やしたり動作をいじったりせずにリフレクションだけでできるよ

465 名前:デフォルトの名無しさん [2007/09/07(金) 21:58:07 ]
>463
サイズプロパティに打つんだよ。
マウスだとちょっとズレるかもだから

466 名前:デフォルトの名無しさん [2007/09/07(金) 22:01:35 ]
>460

ヒント
IList
delegate



467 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 22:07:41 ]
>>466
そんなめんどくさいことするくらいなら初めから連結メソッドを定義するだろw

468 名前:460 mailto:sage [2007/09/07(金) 22:10:44 ]
>>464
カスタム属性か。まあ今も Excel から自動生成してるクラスなんで、
それならできそうです。

>>466
plz one more.

469 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 22:12:06 ]
>462
確かに宣言順は保証されないんだが、
宣言順に初期化されるという保証があるので事実上宣言順に並んしまうという状態。
それを利用してリフレクションを使って順番通りに文字列をなんかするなんてソースが会社に大量にあって動いている困った状態。

どうにかして宣言順に並んでいないケースって意図的に作れないかな?
順番は保証されてないから動かない可能性があるって言っても動いてるからって理由で修正を拒まれて困ってる。

470 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 22:14:45 ]
>468
自動生成クラスなら文字列連結メソッドも自動生成した方がいい。

自動生成クラスが何かのケースで実際に動かして動かないことが発覚するリフレクションより
コンパイル時に動かないコードになってることが分かる方がいいよ。

471 名前:460 mailto:sage [2007/09/07(金) 22:56:31 ]
>>470
んんん。良くわからんのだが、リフレクションは信用ならないということ?
連結メソッドにしろリフレクションしろ、コンパイルを通した上で、テスト
ケースもこなすと思うのだが。

472 名前:453 mailto:sage [2007/09/07(金) 23:33:24 ]
>>454
やっぱり重ねるのが楽でしょうか…。
ありがとうございました^^

>>455
了解しました、MSDN見てみます。
ありがとうございました^^

>>456
な!?
マジですか!?
処理追ってみます。

>>459
おお、その方法よさそうですね、試してみます^^
ありがとうございました^^

>>461
やはり載せる案多数ですね…。
ありがとうございます^^

とりあえず今日は退勤してまいりましたので、明日にでもいろいろやってみようかと思います。
みなさんありがとうございました^^

473 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:36:50 ]
リフレクションは保障されてない
メソッドは保障されてるってことだろ?

わざわざリフレクション使う内容かどうかわからないし。

474 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 23:47:59 ]
でもこの場合属性を連番で付けるだけなら失敗のしようがないだろ

475 名前:デフォルトの名無しさん [2007/09/08(土) 00:00:35 ]
このスレ見てるとC#おもしろそうですね。
アセンブリしかできませんが、挑戦してみようかな

476 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 00:03:32 ]
君見る目があるね



477 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 00:05:03 ]
>>475
今の流れはどちらかと言うと不毛な話ばっかりだと思ったが。
どこらへんが面白かったか教えてちょ!


正直c#は面白い。

478 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 00:08:33 ]
F#はもっと面白いよ(´・ω・`)

479 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 00:42:40 ]
>471
ある日、誰かがメンテをしてそのクラスを手でちょっとだけ修正を入れて
何気なくフィールドを追加しただけなのに挙動が変わったなんてことが起きるかもしれない。
せっかくの連番の属性も意味もわからないままコピペされて番号が重複したりするかもしれない。
そういうときに限ってテストケースの存在も無視される。
普通のメソッドになってれば少なくともそのメソッドの挙動は直接メソッド自体を書き換えられないと変わらないだろ。

マクロで普通のコードを生成できるのに、
リフレクションで処理しやすいようなクラスを用意するってのは本末転倒だろ。
C#のリフレクションはJavaなんかより割と速いけど普通にメソッドを叩くよりかは明らかに遅くなるだろうし。

480 名前:デフォルトの名無しさん [2007/09/08(土) 01:09:54 ]
DataGridVewに行を追加したいのですがどうすればいいのでしょうか?

481 名前:デフォルトの名無しさん [2007/09/08(土) 01:46:22 ]
asciiファイルからshift-jisで読み込んで、dataGridViewに表示させてるんですが、
この表示された値(2バイト文字)をコピーしてエクセルに貼り付けると文字化けしています。
(テキストファイルなどへのコピーは平気)
エクセルへのコピーも問題なく行うにはどうればいいのでしょう?

482 名前:480 [2007/09/08(土) 02:55:09 ]
自己解決しました

483 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 03:42:07 ]
そのくらい自己解決してもらわないと困る

484 名前:460 mailto:sage [2007/09/08(土) 08:26:15 ]
>>479
自動生成クラスを手でいじったり NUnit かけずに済ます文化がこちらには
ないんだが、言わんとしてることはわかった。ありがとう。

485 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 10:06:40 ]
dictionaryのキーとして専用の構造体を使うとき、
等値比較演算子を自分で実装しないといけないの?
試してみたら自動でやってくれてるみたいだけど

486 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 10:59:15 ]
リフレクション使うのでかなり遅いけど、それでもいいのなら



487 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 13:14:24 ]
構造体なら値比較?

488 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 13:37:18 ]
>>487
デフォルトだとValueType.Equalsが使われる。

ValueType.Equalsだが、プリミティブ型のみから構成される構造体なら
ビット比較を使うっぽい。

参照型を含んでいたりするとリフレクションでメンバごとに再帰比較してる模様。
これが遅いと言われている。

pc11.2ch.net/test/read.cgi/tech/1173763436/161-185


489 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 13:41:43 ]
>>488
>参照型を含んでいたりするとリフレクションでメンバごとに再帰比較してる模様。

いまのCLRならその部分をLCGで実行時生成して
キャッシュしておくこともできそうだな。

キャッシュの寿命管理が面倒そうだけど、
直近の16エントリぐらい保持しておけばそこそこヒットしそうだ。

490 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 14:01:32 ]
素直に IEqualityComparer 実装しようよ

491 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 14:09:10 ]
自作の構造体なら、わざわざDictionaryなんかに頼らなくても
自分とペアになるオブジェクトをプロパティで持たせた方が簡単で早いじゃん。


・・・・・・と俺は思っちゃうんだが、これってやっぱり単細胞過ぎる発想かな。

492 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 14:10:11 ]
>>491
肝心のハッシュテーブルはどうするんだw

493 名前:492 mailto:sage [2007/09/08(土) 14:12:39 ]
ああ、ごめん無視して
俺のほうが単細胞だったようだorz

494 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 18:57:52 ]
>>488
ValueType.Equalsを使うならボクシングが発生するよね
それならプリミティブ型のみでもやっぱり自分で比較した方が速いのかな

495 名前:デフォルトの名無しさん [2007/09/08(土) 23:48:32 ]
comboboxにあるクラスのインスタンスを設定したいのですがどうすればいい?




496 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 23:51:32 ]
ComboBox.Tag を使いなはれ



497 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 23:51:33 ]
ValueTypeにそのクラスを設定すればいいだけじゃん

その程度のこともしらない人がつくったアプリなんて使いたくも無いw

498 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:41:29 ]
>>494
JITでボクシングの部分はたいてい取り除かれているらしい。
さらにインラインかもありえるらしい。
ただJITの結果は調べられないからほんとかどうかは知らない。

499 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:59:44 ]
>>498
>ただJITの結果は調べられないからほんとかどうかは知らない。

ボクシングが起きてるかどうかはCLR Profilerで分かるんじゃない?
GCヒープにその値型が確保されてればどっかでボクシングは起きてるてことで。

500 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:10:22 ]
デバッガでアタッチしたら見えるんじゃねーの。
ってか取り除かれるのはかなり限定された状況だけじゃない?


501 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 05:03:43 ]
>>469
問題が起きたら直すでおk
世の中そんなもんだ。

502 名前:デフォルトの名無しさん [2007/09/09(日) 11:42:40 ]
文字列に記述したプログラムを解析して結果を返したいけどいい方法はない?
jscript.netのevalはNGです。
自分で書いた独自のメソッドを呼べないので。。
public string myMethod(string s)
{
return "hoge";
}
文字列に
if(myMethod("hoge")=="hoge") "あ","い")
としておき
結果の
"あ"
を返す方法
文字列中にmyMethodがいつ来るかはわからないです。


503 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 12:23:16 ]
まあやっぱりJScript.NETのevalだな
myMethodは静的にすれば元アセンブリ参照で呼べるだろ

504 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 12:36:05 ]
>>502
IronPython

505 名前:デフォルトの名無しさん [2007/09/09(日) 12:37:51 ]
教えてください。
ArrayList で foreach を使う事について
ループ内部でIndexof を使用してIndexを求める場合、
foreach を使用せずに最初からインデックスを指定して回すやり方が普通なのかどうか
常識的に考えると後者が普通だと思うのですが
foreach を使用したほうが、コードが若干短くなるし、
コード上では多少効率が割るそうですが、オプティマイズされたCLRが吐かれるような気もしますし


506 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 12:45:06 ]
ArrayListの中身を変更したいんならindexで回す
参照オンリーならforeachでいいんじゃないのか

Array<T>やList<T>ならForEachメソッドなんてのもある



507 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:05:00 ]
>>506
ありがとうございます
ところで、2003 にはList<T>は無いみたいです...

508 名前:デフォルトの名無しさん [2007/09/09(日) 13:08:21 ]
ペイント系のアプリを書こうと思ってとりあえずPaint.NETを
使ってみたが、とてもじゃないが金を取れるソフトではありませんね

やはり、商用だとC/C++がいいのですかね

509 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:18:51 ]
そりゃ金とってないソフトだ品

510 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:35:56 ]
>>508
おまいさんは金を取ることの意味を勘違いしてるな。
The Old New Thingsでも立ち読みしてこい。
ttp://www.amazon.co.jp/dp/4756150004

511 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:57:37 ]
>>508
みたソフトが悪い

あれはMITのヲタク学生が書いた駄作だよ


512 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:05:24 ]
またまたArrayListについて教えてください
ArrayListにオブジェクトをセットして
セットするオブジェクト: int Key, string Name1, string Name2, ...
そのArrayListに対して、例えば、Key = 3 は何番目なのかを
メソッドだけで、処理できますか?
Contain と IndesOf と、比較用のメソッドをオーバーライド?すればできそうな気もしていますが
良くわかりません

513 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:26:55 ]
なにを言っているんのかよく分からんが
IndexOfでとれるだろ。。unboxingされて値が同じなやつが返るだろうけど


514 名前:512 mailto:sage [2007/09/09(日) 14:29:21 ]
>>513
比較の際に、同一オブジェクトではなく、プロパティのKeyのみで比較したいのです

515 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:33:23 ]
>>512
EqualsとGetHashCodeをoverrideする。またはHashtableでも使え。
それがいやならC#2.0のList<T>にはFindメソッドとかあるぞ。

516 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:35:30 ]
ますます何を言ってるのかわからん
intなら値で比較されるだろ

もしかして
key1, string1_1, string1_2,
key2, string2_1, string2_2,
...
みたいな構造をArrayListで作ろうとしてるの?

HashTable使えよ。。。



517 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:42:57 ]
>>512
こういうことがしたいの?

public class Item
{
 public int Key;
 public string Name1;
 public string Name2;
 public string Name3;
}

ArrayList al = new ArrayList();

// 入力

int index = 0;
foreach (Item item in al)
{
  if( item.Key == 3 ) break;
  ++index;
}

if (index == al.Count)
  Console.WriteLine("みつかりませんでした");
else
  Console.WriteLine("{0}番目", index);

518 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:44:43 ]
孔子は言った。
考えるだけで学ぶことをしようとしない人間は間違いを犯しやすい。

519 名前:512 [2007/09/09(日) 14:58:56 ]
ちょっとだけ違います。

ArrayList al = new ArrayList(); // 入力

Item addOrReplaeceItem = new Item(); // 追加または、更新しようとする要素(オブジェクト)
addOrReplaceItem.Key = 2;
addOrReplaceItem.Name1 = "new name1";

int index = 0;
foreach (Item item in al)
{
  if( item.Key == addOrReplaceItem.Key ) ;
{
((Item)al[index]).Name1 = addOrReplaceItem.Name1; // あれば、入れ替え
break;
}
  ++index;
}

if (index == al.Count)
{
  Console.WriteLine("みつかりませんでした");
al.Add (addOrReplaceItem); // 無ければ、追加
}
こんな感じです。
宜しくお願いします。

520 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:59:19 ]
>>505
あほなこと言ってないで素直にインデックスで回すか、
自前でインデックスカウントしとけ。

同じ値とか複数あったらどうすんだ?
無いとしても効率悪くなるだけ。
そんな器用な最適化ができるわけなかろう。


521 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:01:13 ]
いっそDataSet/DataTableを使ったらどうだ。

522 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:01:30 ]
ふらっと逝け

523 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:22:45 ]
>>519
「メソッドだけで」とか難しいこと考えずに
全部書くか自分でメソッド作ることをおすすめする。

どうせList<T>使えるようになったら組み直しなんだし。
難しいことやるのは慣れてからでいいよ。

524 名前:512 [2007/09/09(日) 16:11:52 ]
ありがとうございます。

525 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:22:48 ]
DataGridViewでコントロール+Cを押したときのクリップボードに
値を渡すのを防ぎたいんですがどうすればいいでしょう?


526 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:24:53 ]
clipboardcopymode = Disable
でできました。。どうもです。



527 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 03:46:34 ]
SDJEditorを使ってみた

やはり、.NETではこの程度が限界か?

528 名前:デフォルトの名無しさん [2007/09/10(月) 06:36:45 ]
>>503
すみません
この発言読み飛ばしてました。
静的にすればアセンブリ参照で呼べるというのを解釈すると
new をしないようなstaticなメソッドにしてDLLとして作成。
呼び出し元プログラム側で、参照の設定をしてあげるという
のでしょうか?
この静的にするということは、タイプセーフではないという
ことになりますか?今回ASP.NETで作成したいのですが。。

>>509
IronPaython
は動的言語ということで私も考えたのですが
具体的にどうすればよいのかが浮かびませんでした。
それにC#から呼び出したいのでオーバヘッドが発生する気がします。


529 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 08:55:33 ]
組み込みスクリプト感覚で使うつもり?
それ危なくない?

530 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 12:46:34 ]
> 静的にするということは、タイプセーフではないということになりますか?
なんで?

> C#から呼び出したいのでオーバヘッドが発生する気がします。
eval とか言ってるのにオーバーヘッドw

まあ全体に ASP.NET でやるには怖すぎる処理だわな

531 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 13:01:49 ]
限定された構文でよかったら自分でインタープリタを作る手もあるし、
その手のライブラリもあるだろう。
evalと同等とかC#の関数で出来ることを全部やりたいなら、
CodeDOMやらそれなりに危険なことをしないと無理。

話はそれるがC#3.0のExpression<Func<>>の仕組みをつかって、
eval的なことが出来そうな気がする。
いまのところDLinq用だが、どう見てもLispのクォートを狙ってるとしか思えない。

532 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 18:43:40 ]
>>531
本題とはずれるけど、C# 3.0 のラムダ式の話、
C# 3.0 は F# からいろいろ輸入したって話らしいから、
F# の(大元をたどればもちろん LISP の) quote 由来だろうね。

LISP だと、データとプログラムを区別しないってのを、
.NET Framework だと、ラムダ式を
デリゲートに代入したときはプログラムとして、
Expression 型に代入したときはデータとして扱う
というコンセプトみたい。

533 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 18:49:29 ]
>>532
DLRも見てみると面白いよ。
ASTからILへの汎用変換エンジンになりつある。
CodeDOMは死相が出ちゃったけど
DLRはRubyとPythonという目標がある以上、
ある程度のところまで作り込むんじゃないかな。

ちなみにExpression Treeの裏話。
ttp://d.hatena.ne.jp/siokoshou/20070709

ま た D o n B o x か !



534 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 23:55:38 ]
すんません。
HTML中で16進形式(5桁:ex."&#x20B9F;")で指定されたサロゲートペア文字を
正しく変換する楽な方法ってないですか?

HttpUtility.HtmlDecodeだと、下位4桁までしか認識しないようで、困っております。

string s = HttpUtility.HtmlDecode("&#x20B9F;");
foreach (char c in s)
  Console.WriteLine(string.Format("{0:X4}",(int)c));

--出力(こんな値が入ってて欲しい)--
D842
DF9F
--出力(でもこうなっちゃってる orz)--
0B9F

535 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 00:07:19 ]
正規表現使えば

536 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 00:19:54 ]
ども。"&amp;"とかも"&"として取得したいんで、
できればメソッド一発でできたらなぁ、と思ったんですが、
やっぱそこだけ別に処理するしかないスかね。



537 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 00:29:04 ]
数値文字参照だけ置換してあとはHttpUtilityに任せる
というのをひとつのメソッドにすればメソッド一発だよ

538 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 00:54:18 ]
気になったのでざっと調べた感じ、HTML4.01の扱える文字集合はISO/IEC 10646-1らしい。
いわゆるUCS-4なんだが、-1はBMPしか扱わないそうな。-2がそれ以外の文字。

539 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 01:32:11 ]
BitmapオブジェクトがDispose()されたことをBitmapオブジェクトの外部から知ることはできるでしょうか。
ローカルメモリオブジェクト内のDIBをもとに作成したBitmapオブジェクトが破棄されるまではローカルメモリオブジェクトを解放せずにおき、Bitmapオブジェクトが破棄された段階でローカルメモリオブジェクトを解放するようにしたいのです。
DIBをマネージメモリにコピーしてからImage.FromStream()でImageオブジェクトを生成し、すぐさまローカルメモリオブジェクトを解放する、という方法なら安全確実なのですが、いかんせん遅いのです。

540 名前:デフォルトの名無しさん [2007/09/11(火) 05:44:01 ]
>>503
>まあやっぱりJScript.NETのevalだな
>myMethodは静的にすれば元アセンブリ参照で呼べるだろ

やってみたけど無理でしたよ!
やっぱりできないのでは?

DLL側に
public class MultiplyClass
{
public static long Multiply(long x, long y)
{
return (x * y);
}
}

としてコンパイル、それを呼び出し側で参照の追加。

string exp = "MultiplyClass.Multiply(10, 5)";
Microsoft.JScript.Vsa.VsaEngine ve =
Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
long result =
(long)Microsoft.JScript.Eval.JScriptEvaluate(
exp, ve);

そうすると
変数 'MultiplyClass' が宣言されていません。
結局、作成したクラスはスコープの範囲外でした。


541 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 07:22:54 ]
>>538
なるほど。HttpUtility.HtmlDecodeのバグというわけではないわけですね。
わざわざありがとうございます。






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

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

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