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

C♯相談室 Part27

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名無しさん♯2005/11/09(水) 22:55:41

(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。


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


関連リンク
http://onigiri.s3.xrea.com:8080/csharp/index.php?%5B%5B%A5%EA%A5%F3%A5%AF%5D%5D
0809デフォルトの名無しさん2005/12/09(金) 16:07:14
まずはCreateGraphicsでググるんだ。
0810デフォルトの名無しさん2005/12/09(金) 17:09:06
>>808
何がやりたいのかよくわからんけど、
カレンダーの独自コントロールを作りたいならPanelあたりのクラスを拡張した方がいいんじゃないか?
0811デフォルトの名無しさん2005/12/09(金) 20:06:12
>>801
あ、SharpDevelopでも1.xは日本語で強調表示するとバグでキャレットが
ズレるから気を付けてね。パッチを出している有志がいらっしゃるけど。
0812デフォルトの名無しさん2005/12/09(金) 20:21:52
Scintillaはどう? http://www.scintilla.org/
.netにもポーティングされてた気がする。
0813デフォルトの名無しさん2005/12/09(金) 22:10:42
C# のプログラムから Java のプラグラムを起動するにはどうしたら良いですか?
Process.Start() を使えば良いのでしょうか?
良い場合はどのように使えばよいのでしょうか?
できれば javaw の方で起動したいのですが・・・
0814デフォルトの名無しさん2005/12/09(金) 22:20:56
javaw のプロセスを開始させるのに Process.Start 以外の何を使えというんだ。
0815デフォルトの名無しさん2005/12/09(金) 23:04:28
ListViewコントロールに文字列全体が表示されるように列の幅を調節してくれる機能はありますか?
0816デフォルトの名無しさん2005/12/09(金) 23:37:31
Process.Start(@"C:\Java\jdk1.5.0_05\bin\javaw.exe", @"クラスファイルのパス");

これでやってみましたが、なぜか起動できませんでした。
main class が見つからないとかメッセージが出てそれでおしまい。
コマンドプロンプトからは正常に起動できるのに・・・
0817デフォルトの名無しさん2005/12/09(金) 23:39:20
作業フォルダかな?
0818デフォルトの名無しさん2005/12/09(金) 23:49:18
javaw は知らんが java はクラスファイル名じゃなくてクラス名を引数に取ったはずじゃ
0819デフォルトの名無しさん2005/12/09(金) 23:56:46
Java の場合、クラスファイル名=クラス名なので問題ないはずなのですが・・・
0820デフォルトの名無しさん2005/12/10(土) 00:03:42
>>819
いいや。ちがうね。『 class Sample 』 のファイル名は 『 Sample.class 』 だよ。
0821デフォルトの名無しさん2005/12/10(土) 00:42:09
Process.Start の直前でクラスファイルのあるフォルダのパスを
カレントディレクトリにすることで起動に成功しました。
つまり、

Environment.CurrentDirectory = @"クラスファイルのあるフォルダのパス";
Process.Start(@"省略\javaw.exe", "クラス名");

です。
ありがとうございました。
0822デフォルトの名無しさん2005/12/10(土) 00:43:34
>>808
PictureBoxを継承してOnPaintオーバライドするとか
PictureBox pictBox.Paint += PaintText;
private void PaintText(object sender, PaintEventArgs e){
e.Graphics.DrawString("1",10,10);
}
みたいな感じで上書きできないかな

ラベルの高さを10未満にしたいのですがデザイナが許してくれません。
どのあたりをいじればよいのでしょうか?
デザイナ上でスマートタグの定義を追加したいのですが。参考となるサイトがあれば教えてください。
vs2005b2を使用しています。
0823デフォルトの名無しさん2005/12/10(土) 00:47:16
オーバライドってなんですか?
0824デフォルトの名無しさん2005/12/10(土) 00:51:09
それはさすがにググろうよ
0825デフォルトの名無しさん2005/12/10(土) 00:51:55
>>823
とりあえずどうぞ
ttp://2next.net/swf/R3_temp.swf?inputStr=%83I%81%5B%83o%83%89%83C%83h%82%C1%82%C4%82%C8%82%F1%82%C5%82%B7%82%A9%81H
0826デフォルトの名無しさん2005/12/10(土) 01:00:34
SystemInformation.Networkで自分で見に行くことはできるのですが
Networkが使用不可能になったというイベントって取得できますか?
0827デフォルトの名無しさん2005/12/10(土) 01:13:17
ダブルバッファーでちょっとスクロールしたいんだが。サイズ100,100のウィンドウで5だけ下にスクロールすると思いねぇ。
ダブルバッファー用のbmp(1), その更にバッファー(2),Form(3)とあるとして、
1からずらして2に転送2から3,1に転送して計3回ビットマップ転送してるんですが、おそす。
もちっとナイスな方法内でしょうか・・・
0828デフォルトの名無しさん2005/12/10(土) 01:19:34
ダブルバッファOnなパネルに描画してずらす
0829デフォルトの名無しさん2005/12/10(土) 01:21:12
うっぁ。俺今までSDK使ってなかった…
0830デフォルトの名無しさん2005/12/10(土) 01:25:33
>>828
ダブルなバッファーにはどこから描画するの?パネルから?
0831デフォルトの名無しさん2005/12/10(土) 02:01:13
ダブルバッファって、一方を転送しつつ、他方を描画するから高速なんでねーの?
0832デフォルトの名無しさん2005/12/10(土) 02:19:30
パネルから
パネルを継承してOnPaint
コンストラクタではDoubleBuffered = true;@2.0
08337782005/12/10(土) 02:31:21
>>784,807
プロジェクト名�dクス〜〜、もう消えてたんですね。(;;
道は遠いけど、自作進めてます。
IMEもUndo/Redoもまだ無理ですけど、ASCII文字ならとりあえずエディタとして
最低限動くようになりまちた。

>>811
キャレットずれますね。全角と半角の空白文字(スペース)が同じ行に
混在するとダメみたいです。#develop Wiki の日本語対応版上書きした
#dev本体のエディタで再現してるので今後に期待??

>>812
ありがとうございます。とりあえず見てみましたが .Net port は
今のところ発見できず。

探しながら開発続けていってみます。
壁は IME からの文字入力、 Undo/Redo、選択処理の実装、折り返し処理
あたりか??


0834デフォルトの名無しさん2005/12/10(土) 02:40:24
>>826
.NET2.0のMicrosoft.VisualBasic.Devices.NetworkにNetworkAvailabilityChangedイベントがある。
そのまま使うのがいや/使えないなら、これをildasmで調べてみたら
0835デフォルトの名無しさん2005/12/10(土) 03:43:10
動的なメニューの作成をしたいと思っています。
現在は、
MenuItem menuItem = menu.MenuItems.Add("");
menuItem.Tag = (object)"dummy_item";
menu.Popup += new EventHandler(FillDummyMenu);
のようにダミー項目を追加し、FillDummyMenuで
ダミー項目の位置にいろいろ追加するようにしているんですが、
そうするとメニューそのものが恒久的に変更されてしまうため
二回目以降にメニューを表示したときにうまく動作しません。
どなたか解決策をお教え願います。
0836デフォルトの名無しさん2005/12/10(土) 04:26:45
スレッドをSuspendして
そのままAbortすると
うまく殺してくれないみたいなんです

自分のコードが悪いのか
そういう仕様なのかがわかりません

だれかご教示お願いします
0837デフォルトの名無しさん2005/12/10(土) 11:08:47
メニューアイテムをクローンする
0838デフォルトの名無しさん2005/12/10(土) 12:01:44
C# でコントロール配列を実現したい場合、

this.buttons[0] = this.button1;
this.buttons[1] = this.button2;
this.buttons[2] = this.button3;
for(int i = 0; i < this.buttons.length; I++)
{
  this.buttons[i].Tag = i;
}
(中略)
private void buttons_Click(Object sender, EventArgs e)
{

}
0839デフォルトの名無しさん2005/12/10(土) 12:04:47
間違えて途中で送ってしまいました。

private void buttons_Click(Object sender, EventArgs e)
{
  switch(Convert.ToInt32(((Button)sender).Tag))

}
0840デフォルトの名無しさん2005/12/10(土) 12:08:12
なぜか途中で送信されるのですが・・・
専ブラの問題かな?・・・

switch(Convert.ToInt32(((Button)sender).Tag))
{
  case 0:
    //button1 の処理
    break;
  case 1:
    //button2 の処理
    break;
  case 2:
    //button3 の処理
    break;
  default:
    break;
}


というふうにしているのですが、
結構面倒なので、他に効率的な方法はありませんか?
0841デフォルトの名無しさん2005/12/10(土) 12:25:06
>>840
効率的かどうかはともかく、俺なら
Control[] buttons = new Control[] { // 略};

private void buttons_Click(Object sender, EventArgs e) {
int index = Array.IndexOf(buttons, sender, 0, buttons,Length);
switch(index)
{
case 0:
break;
case 1:
break;
case 2:
break;
default:
break;
}

みたいに書くかな・・・
senderにイベントを起こしたオブジェクトが入っている保証なんかどこにもないからお勧めは出来ないけどね
0842デフォルトの名無しさん2005/12/10(土) 13:11:27
ありがとうございます。
参考にさせていただきます。
0843デフォルトの名無しさん2005/12/10(土) 15:34:09
>>841
>senderにイベントを起こしたオブジェクトが入っている保証なんかどこにもない
そうなんですか?
そのことについて書かれたドキュメントとかあったら教えてもらえませんか?
0844デフォルトの名無しさん2005/12/10(土) 15:38:30
841じゃないけど
buttons_Click(null, null);
で呼べばええのちがうか
0845デフォルトの名無しさん2005/12/10(土) 17:08:52
PictureBoxのImageプロパティにセットした画像の再描画を
禁止したいのですが、何か方法ありますか?
Image=nullにすると、今度は背景色で再描画され、やはり困ってます。
0846デフォルトの名無しさん2005/12/10(土) 18:57:34
>>845
頑張ってください!
0847デフォルトの名無しさん2005/12/10(土) 21:31:55
C♯の型にulongとかushortとかありますが、なんでbyteだけubyteじゃなくて
sbyteなんですか?
0848デフォルトの名無しさん2005/12/10(土) 21:38:12
慣習
0849デフォルトの名無しさん2005/12/10(土) 22:16:52
ushortはunsigned shortの事で、符号なし。
sbyteはsigned byteの事で、符号あり。
byteは符号なし変数。
0850デフォルトの名無しさん2005/12/10(土) 22:33:45
C/C++ではgotoに同一関数内での
ブロックのスコープは存在しなかったように思うのですが、

class GotoTest {
 static void Main() {
  goto cs_err;
  {
   cs_err:
   System.Console.Write("error");
  }
 }
}

このブロックの外からは見えないという規約、どこら辺が役に立っているの
でしょうか? 詳しくわからない僕には、あまり意味のあるものと思えないです。
0851デフォルトの名無しさん2005/12/10(土) 22:36:59
規約じゃなくて、仮想マシンで動作する上での制約のような希ガス
0852デフォルトの名無しさん2005/12/10(土) 22:37:56
ついでに言うけど、スタックの深い方へ goto するのって、そんなに価値のあるものだとは思えない。
0853デフォルトの名無しさん2005/12/11(日) 00:25:35
>>851
その根拠をもう少し詳しくお教え願えないでしょうか?
ttp://wisdom.sakura.ne.jp/programming/cs/cs13.html
に規約と記述してあったのですが、制約となるとそうせざるを得ない理由が存在
するんですよね…

また、>>852では、「スタックの深い方へ」とあるのですが、これはどういう事ですか?
スタックの深い方とかで検索をかけてみたのですがよくわかりませんでした。
もしかして、プログラムコードの一行一行を指しているのですか
0854デフォルトの名無しさん2005/12/11(日) 00:54:21
んげ、悪い。適当言ってた。

……コードブロック、コンパイル後はスコープとか全然関係ないやん。
コードブロック内に goto 出来ないのは、VM じゃなくて C# 側の制約……っていうか規約な罠 orz
0855デフォルトの名無しさん2005/12/11(日) 01:18:21
大体、そんなのが可能なのなら
goto inner;
for (int i = 0; i < 3; i++) {
  inner:
   Console.WriteLine(i);
}
さあどうする。
0856デフォルトの名無しさん2005/12/11(日) 01:48:46
>>854
そうなのですか。レスありがとうございました!
>>855
なるほど! それはエラーにすべきですね。C++の方でもエラーになったです。気付かなかった。
わかりやすい例題サンクスです!
0857デフォルトの名無しさん2005/12/11(日) 02:57:19
C#で、Webアプリケーションを開発しています。
ボタン押下後に、CSVファイルを作成し、そのファイルをダウンロードさせます。
しかし、Response.Close()後、どのボタンを押下してもサーバー処理を行いません。(submitされません。)
Javaの場合はボタン押下時J、avaバッチを起動してダウンロードさせますが、C#の場合はどうすればよろしいでしょうか?
0858デフォルトの名無しさん2005/12/11(日) 03:56:19
どなたか >>835 がわかる方いませんか?
0859デフォルトの名無しさん2005/12/11(日) 04:21:42
>>858
835がどんなのを意図してるのか分からん
そもそも何故ダミーを作るんだ? 直接新しいアイテムを作ってAddしちゃいかんのか?
0860デフォルトの名無しさん2005/12/11(日) 04:49:46
>>859
そうでしたか、すみません。
簡単にいうと「お気に入り」とか「最近使ったファイル」みたいなのを
イメージしてもらえるとわかりやすいと思うんですが、
つまりメニューの外枠はアプリケーションの初期化時に作って、
メニューの内容を表示しなければいけない時に中身を追加する、
という感じにしたいと思っています。

0861デフォルトの名無しさん2005/12/11(日) 04:56:30
外枠って何? それを作るとどうなるの? 作らないとどう問題があるの?
0862デフォルトの名無しさん2005/12/11(日) 05:07:08
ダミーのメニュー項目を目印に置き換えるつもりが
一度置き換えると目印を見失ってしまって追加できないので困る、ってことだろうか。

もう少しわかりやすく。
でも俺はもう寝る。
0863デフォルトの名無しさん2005/12/11(日) 05:28:12
>>862
そういうことです。
説明が下手ですみません。

具体例で説明すると、初期化時に
 [ファイル]
 [編集]
 [お気に入り]          // menu
   [お気に入りに追加...]   // menuItem
   [-]              // セパレータ
   [dummy_item]       // menuItem

っていう感じに作っておいて、

[お気に入り] の Popup イベントを捕獲して、そこで子アイテムの中から [dummy_item] を探し出し、
[dummy_item] を削除してからその位置にお気に入りのアイテムを追加していくという感じです。
ところがこれではご指摘のように [dummy_item] を削除する必要があるので、
2度目以降うまく動作しません。
0864デフォルトの名無しさん2005/12/11(日) 06:46:06
>>863
なんでダミーがいるのかさっぱりわからんのだが。
セパレータ探してその後ろを毎回入れ替えたらすむんじゃないの?
つか、固定の部分もあわせて作り直したらいい気がする。
0865デフォルトの名無しさん2005/12/11(日) 12:25:39
パフォーマンス重視のソフトを作ってて、いろいろ実験してるんですが
あるメソッドの実行時間を測りたくて、次のような感じでやってます。

DateTime before = DateTime.Now;
HogeMethod();//計測したいメソッド
DateTime after = DateTime.Now;
TimeSpan time = after - before;
Console.WriteLine(time.TotalMilliseconds.ToString());

ところが、いろんなメソッドに何回かやってみても、全く同じ値になったり、
キリがいい数字になったりと、ちょっと変な気がします。
なにか間違っているのでしょうか?

以下、取得できた時間です
[46.875ms]
[62.5ms]
[156.25ms]
[203.125ms]
[656.25ms]
[671.875ms]
[31.25ms]
[15.625ms]
[31.25ms]
[78.125ms]
[171.875ms]
[375ms]
[359.375ms]
[109.375ms]
[171.875ms]
[93.75ms]
[171.875ms]
0866デフォルトの名無しさん2005/12/11(日) 12:52:56
分解能の限界。
高性能にやるならWin32APIのQueryPerformanceCounter使う。
0867デフォルトの名無しさん2005/12/11(日) 15:36:20
ここって、webアプリ作ってる人間少ないのね
0868デフォルトの名無しさん2005/12/11(日) 15:54:57
>>864
なるべく柔軟な作りにしたいと思ってるので、例えば
[お気に入り]
   [お気に入りに追加...]
   [-]
   [お気に入りをすべて削除]
   [-]
   [以下をすべてタブで開く]
   [dummy_item]
のような構造に対応するために、ダミーは必要です。
しかしどちらにしろ入れ替えは必要なので、根本的な問題ではないです。

と書いてるうちに自己解決しました。
MenuItem に Visible プロパティがあったので、
[お気に入り]
   [お気に入りに追加...]
   [-]
   [お気に入りをすべて削除]
   [-]
   [以下をすべてタブで開く]
   [dummy_item_begin]
   [dummy_item_end]
としたうえでダミーの Visible を false にし、毎回その間の項目を入れ替えるということをしたら
うまくいきました。
お騒がせしてすみません。どうもありがとうございました。
0869デフォルトの名無しさん2005/12/11(日) 15:58:43
>>867
根拠は?
0870デフォルトの名無しさん2005/12/11(日) 16:00:12
ログを読む限りwebに関する質問に答えられる人が少ない気がする。
windowsアプリなら食いつきいいのに。
0871デフォルトの名無しさん2005/12/11(日) 16:23:53
http://pc8.2ch.net/test/read.cgi/php/1111480331/l50
0872デフォルトの名無しさん2005/12/11(日) 16:50:43
C#でフルスクリーンのゲームを作りたい場合はどうしたらいいですか?
0873デフォルトの名無しさん2005/12/11(日) 16:56:49
>>868
それって柔軟?いびつに見えるんだけど。
ダミー以外の部分は固定なんでしょ?この固定部分を入れ替えられるようなつくりにすればいいんじゃないの?

お気に入り以下に追加するMenuItemの並びをテンプレートから作れるようにしたいんだよね?
テンプレート部分をMenuItemツリー構造に頼るのって変な感じ。
0874デフォルトの名無しさん2005/12/11(日) 17:26:08
>>873
すいません、固定部分を入れ替えるっていうのがどういう意味かわからないです。

テンプレートというのは固定部分の意味ですよね。
>>835 では固定部分も動的に作っていますが、ダミーを使った方法なら
固定部分はリソースで定義して必要な部分だけ動的に作るということも可能だと思います。
将来的にはそうするつもりです。
0875デフォルトの名無しさん2005/12/11(日) 17:43:52
はい。
0876デフォルトの名無しさん2005/12/11(日) 17:56:07
なんでダミー項目を作ることに拘るんだろう。
08778732005/12/11(日) 17:57:13
言葉足らず過ぎてすまん。

>>874
>テンプレートというのは固定部分の意味ですよね。
違う。固定部分と、可変部分の位置をセットでテンプレートと言ってるつもりだった。
>>863の絵そのもの。これを適当な形で保持する。

で、それをMenuItemなんて実装側に依存した形にしたら、固定部分に動的な部分を
作らなきゃいけなくなったら困りそうじゃない?って思ったわけ。

もともとの>>863の絵を上の行から読んで対応するMenuItemを追加するような
つくりにしたほうがよさそうじゃない?
これなら固定部分は>>863の絵を書き換えるだけで入れ替えられるし。

また言葉が足りてない気もするが、わかんなかったら読み飛ばしておいておくれ。
0878デフォルトの名無しさん2005/12/11(日) 19:14:53
>>40
これならどうだ?

#
&#35;
0879デフォルトの名無しさん2005/12/11(日) 19:56:20
>>872
悪いことは言わん
絶対止めとけ。
書けないことはないが、絶対にC++で書いときゃよかったって思うぞ
0880デフォルトの名無しさん2005/12/11(日) 21:03:02
hashtableに複数のキーa,bを持たせたいと考えています。
文字列であればa+区切り文字+bのように連結してひとつのキーとして
扱えば楽だと思ったのですが、このような実装は好ましくないでしょうか?
同じことやったこと人いますか。
0881デフォルトの名無しさん2005/12/11(日) 21:04:50
俺なら素直にハッシュテーブルにハッシュテーブル入れるぞ
0882デフォルトの名無しさん2005/12/11(日) 21:10:19
>>880
その「キー」なるものを、他でもユニークなID(識別子)として
使いまわす気ならそれでも良いと思う。

単に疎でない二次元の連想配列が使いたいだけなら、
ハッシュのハッシュの方が良いと思うけど。
0883デフォルトの名無しさん2005/12/11(日) 21:18:04
ハッシュのハッシュのほうが文字列以外にも対応できるしよさそうですね。
感謝です。
0884デフォルトの名無しさん2005/12/11(日) 21:27:57
ディクショナリのZetaOSとかZetaOSのリストとかよく作るんだが、
毎回
if(!_dic.TryGetValue(key,out value){
List<Hoge> list=new List<Hoge>();
_dic.Add(key,list);
}
とかやってるんでヌルポです。微妙にメソッド違うんでGenerics化もできず。もっとエレガントな方法ないでしょうか?
0885デフォルトの名無しさん2005/12/11(日) 21:28:55
なんか知らんが誤変換してる・・・orz
一行目:ディショナリのディクショナリとかディクショナリのリストとかよく作るんだが
0886デフォルトの名無しさん2005/12/11(日) 21:34:02
どんな誤変換だそれは。
0887デフォルトの名無しさん2005/12/11(日) 21:47:19
>>844
キー⇒リストっていうコレクションなら、
C++でいうところのMultiMap で代用できないだろうか。
C# でどう MultiMap を実装するかはまた別の話として。
0888デフォルトの名無しさん2005/12/11(日) 21:51:17
MultiMapないんで
C#では
Dictionary<object, ICollection>使ってればいいんじゃないの?
0889デフォルトの名無しさん2005/12/11(日) 22:41:41
>>870
Webアプリ作ろうとするとIIS使わざるを得ないからなぁ
ライセンスやら何やらで意外に敷居が高いと思う
個人的にはmono+apacheに期待してるけど、こっちは技術面で敷居が高い・・・
0890デフォルトの名無しさん2005/12/11(日) 22:46:10
>>879
C#使おうがC++使おうがAPIだけでやるなら、どっちにしても後悔しそうな悪寒
おとなしくDirectX使った方が幸せになれるはず
0891デフォルトの名無しさん2005/12/11(日) 22:53:13
すくなくともC#がC++より有利ではないことに疑問を挟む余地はない
0892デフォルトの名無しさん2005/12/11(日) 23:11:23
つ 生産性
0893デフォルトの名無しさん2005/12/11(日) 23:26:08
using System;
using System.Security.Cryptography;

class Class1 {

    const int dataLength = 400*1024*1024;
    [STAThread]
    static void Main(string[] args){
        byte[] inputData = new byte[dataLength];
        HashAlgorithm provider1 = new MD5CryptoServiceProvider();

        Console.WriteLine("data is null? {0}", inputData == null);

        try{ provider1.ComputeHash(inputData);}
        catch(NullReferenceException ex){ Console.WriteLine(ex); }
        Console.WriteLine("メソッド終了1");
        provider1.Clear();

        HashAlgorithm provider2 = new FastHash.MD5FastHash();

        Console.WriteLine("メソッド終了2");
    }
}

こんな単純なプログラムなんですが、
なぜか provider1.ComputeHash(inputData); の内部でNullReferenceExceptionが投げられます。
08948932005/12/11(日) 23:26:17

スタックトレース
at System.Security.Cryptography.MD5CryptoServiceProvider._HashData(IntPtr hHash, Byte[] rgbData, Int32 ibStart, Int32 cbSize)
at System.Security.Cryptography.MD5CryptoServiceProvider.HashCore(Byte[] rgb, Int32 ibStart, Int32 cbSize)
at System.Security.Cryptography.HashAlgorithm.ComputeHash(Byte[] buffer)
at FastHash.Test.Class2.Main(String[] args) in D:\●●●●\class2.cs:line 14


HashAlgorithm provider1 = new MD5CryptoServiceProvider(); を
HashAlgorithm provider1 = new SHA1CryptoServiceProvider(); にしてもなりますが、
HashAlgorithm provider1 = new SHA1Managed(); にしても発生しません。


dataLengthを800MBとかにすると、当然OutOfmemoryExceptionが発生します。
dataLengthを10MBとかにすると例外が発生しません。

そして一番不思議なのは、
HashAlgorithm provider2 = new FastHash.MD5FastHash(); をコメントアウトすると例外が発生しません。

FastHash.MD5FastHashクラスは、自分が作った、fasthash.dll(http://hp.vector.co.jp/authors/VA033110/fasthashdll.htm)
を使用してMD5を計算するクラスです。

質問なんですが、一見全然関係ないように見える HashAlgorithm provider2 = new FastHash.MD5FastHash(); という文の有り無しで、なぜその前の byte[]配列がnullになってしまうんでしょうか?
0895デフォルトの名無しさん2005/12/11(日) 23:32:19
とりあえず、

>dataLengthを800MBとかにすると、当然OutOfmemoryExceptionが発生します。 
>dataLengthを10MBとかにすると例外が発生しません。

に気付け。『メモリが足りませんよ例外』 が出ているんだ。
0896デフォルトの名無しさん2005/12/11(日) 23:32:51
って悪い。『当然』 の2文字が目に入ってなかったなアハハハハ。
0897デフォルトの名無しさん2005/12/12(月) 00:10:55
ILのレベルで何か違いはあるのかな
0898デフォルトの名無しさん2005/12/12(月) 00:11:46
ぬるれはP/Invokeに失敗した時全てに発生するよ
バッファがnullだったから例外が起きたんじゃ無いと思う
***CryptoServiceProviderクラスはWindowsの暗号化機能に依存しているから、Windows内部で何らかの例外が起きたんだと
fasthash.dllと競合するような部分があったんじゃ?
0899デフォルトの名無しさん2005/12/12(月) 00:14:06
893がFastHash.MD5FastHashの中身を教えてくれないから適当に自分で実装してみたけど再現しない
0900デフォルトの名無しさん2005/12/12(月) 00:18:00
で、800MBでぬるりが投げられた
これはFastHashの記述の有無に無関係に発生
09018932005/12/12(月) 00:20:20
>>897
ILレベルですか…何と何の違いを調べればいいですか?

>>898
なるほど
すると、fasthash.dllを利用する限りどうしようもないんですかねえ?
それとも fasthash.dllの利用の仕方次第でなんとかなるんですかね

>>899
すみません、
「なぜ呼び出されていないコードに存在で、別のコードに例外が発生するのか」を、とりあえず考えていたのと、
ちょっと長くなってしまうんで省略しました。
09028932005/12/12(月) 00:21:46
>>900
そうですか…
自分の環境だと、 FastHashの記述無しだと先にOutOfMemoryExceptionが発生してしまうんで
分からなかったです
0903デフォルトの名無しさん2005/12/12(月) 00:28:40
先にFastHash.MD5FastHashを呼んだりComputeHashさせたりしたらどうなるんだ?
0904デフォルトの名無しさん2005/12/12(月) 00:34:24
>>901
>「なぜ呼び出されていないコードに存在で、別のコードに例外が発生するのか」

呼び出す前にもメモリ上に何かがロードされて、
それで状況が変わるんじゃない?
09058932005/12/12(月) 00:41:55
情報を小出しにしてしまった感じで申し訳ありません。

ちょっと気になって、常駐アプリなどを切りまくって、メモリを開けたところ、
FastHash.MD5FastHashの記述なしでもdataLengthが700MBぐらいで、ComputeHashでNullReferenceExceptionが発生するようになりました。
FastHashは関係ないようですね・・・
new FastHash.MD5FastHash() の有無で、300MBぐらい差が出るんですが、 FastHash.MD5FastHashクラスを使わないで、
このコードで直接fasthash.dllの関数を呼び出すと、200MBの差は出ないようです。

ということは、自分が作ったFastHash.MD5FastHashクラスが原因で300MBの差が起きているようです。



>>903
先に new FastHash.MD5FastHash(); を呼んだところ、結果は同じでした。

>>904
そうなんですかねえ。ううむ。




FastHash.MD5FastHashクラスを収めたソースファイルです
http://kashiwazaki.dyndns.ws/files/ppfx00005.zip
0906デフォルトの名無しさん2005/12/12(月) 00:45:24
800Mとか、巨大データなら分割してチビチビ計算させるのが普通ではないの?

09078932005/12/12(月) 01:00:01
>>906
それはもちろんです。

.NETのライブラリのメソッドに、nullでない引数を渡してNullReferenceExceptionが発生するなんて初めての経験でして、
気になってしまったです。
0908デフォルトの名無しさん2005/12/12(月) 01:20:55
>>907
.Net のライブラリの中にはWin32のAPIを簡単にラップしただけのモノが結構有ります。
ネイティブ側でWindowsの0xc0000005例外が投げられるとNullReferenceExceptionになります。
他の例としては例えばGDI+をラップしたGraphicsで多く発生します。

他のどんな例外がどんなExceptionにマッピングされてるのかは知りません。
どこかに資料あるのかな。
レス数が900を超えています。1000を超えると表示できなくなるよ。