今日は凄いくだらない事にメチャクチャ腹が立ったので、 懺悔の心でココに書くよ。 "C# bmp LockBits "でグーグル検索するとLockBits()メソッドの1つめの引数rectに Rectangle rect = new Rectangle(0,0,bmp.Width,bmp.Height); を指定するブログやら、Tipsサイトが大量に出てくるよね。 初心者向けとか言って、ご丁寧に赤と緑を入れ替えた画像とか貼ったりしてさー。 LockBits()はRectangle型のxとyしか見ない、あからさまなバグ入り関数なんだよね。 あそこは new Rectangle(0,0,1,1)で十分。 っていうか、大きな画像の一部のIntPtrを取り出したいときは、また別途Bitmapインスタンスが必要なぐらい使えない関数ww。 そっちの方がTipsとして必要だろうがwww。 10も20も「自称」プログラマのブログがあって、MSが作ったバグには一つも触れ無いんだよwwww。 おまえらは、MSの糞が食卓に並んでても気にならない本物のブタ共だよwww。 自分のブログで晒し上げにしようかと思っちゃったよww。
まあ208が「懺悔」の意味を勘違いしていることはよくわかった。
今日は凄いくだらない事にメチャクチャ腹が立ったのでやつあたりしている。 が正しいな。
「これはひどい」 「突っ込み所満載」
>>208 普通にRectangleで指定した範囲だけロックされるぞ
(0,0,1,1)の範囲を指定したのにその外を触ろうとしたらAccessViolationExceptionが出る
八つ当たりする先に困ってココに書いてるんだけどね。 >208 釣れた!! ソースはってみろよ。
>212だ 自分が釣られてどうする。
おら 奇跡は起きたか豚! tmp.Save(@"c:\tmpA.Png", ImageFormat.Png); //tmpがBitmap型な。 BitmapData bmpData = tmp.LockBits(new Rectangle(0,0,1,1), ImageLockMode.ReadOnly, tmp.PixelFormat); int bytes = (tmp.Width) * (tmp.Height) * 4; byte[] rgbValues = new byte[bytes]; IntPtr ptr = bmpData.Scan0; int a = bmpData.Height; int b = bmpData.Width; Console.WriteLine(a.ToString()+"+"+b.ToString()); //1+1 Marshal.Copy(ptr, rgbValues, 0, bytes); for (int d = 0; d < bytes; d++) { rgbValues[d] = 0xff; } Marshal.Copy(rgbValues, 0, ptr, bytes); tmp.UnlockBits(bmpData); tmp.Save(@"c:\tmpB.Png", ImageFormat.Png);
むしろブログでやってくれたほうが愉快だったのに、と思ってしまう。
おまえら反応無いなと思ったら。
>208>213>215 は全部俺>208だ。
ttp://hey.chu.jp/up/source3/No_13803.zip 今日は気分が良いからアプロダにサンプルまで置いてしまうぞ。
最後に俺のTipsを付けておく。
bmpData = tmp.LockBits(new Rectangle(0, 0, 1, 1), ImageLockMode.ReadOnly,
tmp.PixelFormat);
ptr = bmpData.Scan0;
Marshal.Copy(ptr, rgbValues, 0, bytes);
Rectangle rect = new Rectangle(64,64,256,128);//目的範囲をrectとすると。
for (int i= rect.X;i<rect.X + rect.Width;i++)
for (int j = rect.Y; j<rect.Y+ rect.Height;j++)
{
int d = j*tmp.Width+i;
swap = rgbValues[d * 4 + 1];
rgbValues[d * 4 + 1] = rgbValues[d * 4 + 2];
rgbValues[d * 4 + 2] = swap;
}
>216 っていうか、 MSのフォーラムに行け。
219 :
208 :2008/02/14(木) 21:19:43
>218も俺。 って。 >216はVSインストールした事も無いのに書き込んで居るんだね。
220 :
208 :2008/02/14(木) 21:48:05
どうしたのですか? ゲイツのうんこ大好きなスカトロ豚さん? 31行目か60行目を Marshal.Copy(ptr, rgbValues, 0, bytes+1); // +1(・∀・) イイ って変更すると、多分お探しのエラーコードがでまちゅよ。
221 :
216 :2008/02/14(木) 21:57:35
215で例外になるじゃんと思いつつも、217やったらたしかに動くね。 違いと言えば、215のコードを動かしたときは tmpのインスタンスを作るときにファイルから読み込むBitmapのコンストラクタを使ったということくらい。 あと、217でtmpの中身を作るときのPixelFormatをFormat16bppRgb565にしつつ、 LockBitsに渡すPixelFormatをFormat32bppArgbにしても、探してた例外になったよ。
えっと・・・何?こいつ
223 :
208 :2008/02/14(木) 22:02:30
>216 あんまり頑張るなよ。 自分でも苦しい言い訳だと思わない? >int bytes = (tmp.Width) * (tmp.Height) * 4; の"4"の意味が解らないなんて無理があるだろ。 けど、とりあえず反応してくれて、 あ り が と 。 ちなみに実行した環境とかも教えてくれちゃうと嬉しいな。
224 :
208 :2008/02/14(木) 22:05:12
>222 良いTipsを思いついたからブログに書こうと思ったら、 世間の奴らのブタ過ぎに書くに書けなくなった。
>>223 いやそういうことではなさそう
PixelFormat.Format32bppArgbで作ってPixelFormat32bppRgbでロックしても例外出る
ビットマップのPixelFormatと違うフォーマットでロックしたらRectangleの中だけロックされるみたいだ
>225 そうだろうな。 そして人は Format32bppArgbなら、Format32bppArgbでLockBitする。 Format32bppPArgbなら、Format32bppPArgbでLockBitする。 Format32bppRgbなら、Format32bppRgbでLockBitする。 そうでない時エラーになるのは人として当然。 そして >225はnew Rectangle(0, 0, tmp.Width, tmp.Height)の時どう動いて欲しいのかな? >ビットマップのPixelFormatと違うフォーマットでロックしたらRectangleの中だけロックされるみたいだ (・∀・)ニヤ ぶっちゃけ書くけど、2008まだインストールして居ないんだ。俺。
>>223 ペイントで24ビットビットマップとして保存して、
Bitmap tmp = new Bitmap(@"h:\P1000220.bmp");のようにした。
.NET Framework 1.1 SP1と2.0 SP1 (3.5)、
VC#コンパイラ.NET 2003, 2005, 2008の3つで試した。
32ビットビットマップでやるとtmp.PixelFormatがFormat32bppArgbになってうまくいくね。
(217からGraphics作ってる部分だけ抜き出して、tmp.Saveで作った)
>>226 違うフォーマットでロックすることは可能
これでお前の期待する結果になる
こういう仕様のようにも見える
Rectangle rect = new Rectangle(0, 0, 10, 10);
BitmapData bmpdata = tmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
for (int i = 0; i < rect.Width * rect.Height; i++) ((uint*)(void*)bmpdata.Scan0)[i] = 0xfffffff;
tmp.UnlockBits(bmpdata);
229 :
208 :2008/02/14(木) 22:43:13
>227 良く嘘をつく奴だな程度に思っていたけど、只の低脳なのか? Bitmap tmp = new Bitmap(@"h:\P1000220.bmp"); //この次の行に書け。 Console.WriteLine("tmp.PixelFormat =" + tmp.PixelFormat.ToString()); //何が見える? ペイントで24ビットビットマップとして保存して居る奴に必要なコード変更はこういう事だ。 //int bytes = (tmp.Width) * (tmp.Height) * 4; int bytes = (tmp.Width) * (tmp.Height) * 3;
230 :
228 :2008/02/14(木) 22:45:30
補足 tmpのPixelFormatはFormat32bppArgb
>>229 嘘付きと低脳だったら嘘付きがいいな。
すまん、LockBitsするときにはPixelFormat.Format32bppArgbを
指定するよう書き換えていたことをさっきからずっと忘れていた。
232 :
208 :2008/02/14(木) 23:03:53
>228 面白い。 >225は間違って無かったんだな。 Bitmap tmp = new Bitmap(412, 256, PixelFormat.Format32bppRgb); で作って。 BitmapData bmpdata = tmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);//つまり同じ。 for (int i = 0; i < rect.Width * rect.Height; i++) ((uint*)(void*)bmpdata.Scan0)[i] = 0xfffffff; tmp.UnlockBits(bmpdata); した場合は元のもくあみに戻るのな。 念のため for (int i = 0; i < (rect.Width * rect.Height)+200; i++) ((uint*)(void*)bmpdata.Scan0)[i] = 0xfffffff; として見たが、むなしくなった。 結果は白線がのびる。 exception無し。 こちらの環境は 2005 .NET 2.0 オンリ 夜も更けて来たので哲学入ります。 俺がやってることは、世間の奴らが見向きもしないで触らずにいた汚い糞を、 わざわざどけてやってるだけなんだよな。 結果、一番得得してるのは、糞を垂れ流してる張本人って事ないか?
>231 わるかった。 君が板から>228なんて案も出たんだ。
たぶんLockBitsは指定されたPixelFormatと内部の形式が同じだったら、 コピーしないで中のメモリを直接ロックかける、 違ったら新しくメモリを用意し、そこに指定された領域を指定された形式に変換したものを 書き込んでいるという風になっている予感。 ソース見たら一発でわかるだろうな、誰かExpressではないVS 2008持っている奴いないのか? デバッグ時は厳密にチェックするルーチンを使用し、 リリースでは速度重視って切替ができたら今より良かったと思う。
NetMassDownloader使えばVS持ってなくてもソース落とせるよ ただ,ネイティブGDI+の関数を呼んでるだけという罠
>235 OSの環境に依存か。 unsafeかつ、フォーマットの変更が有って初めてLockBit()は仕様通り動くのな。 >228 >208がrect=(0,0,1,1)に拘ってたけど、rect=(80,64,1,1)とかは動作に影響があるな。 ソースにはラマーの意図を明確にする様に書けって話に戻るんじゃない? せいぜい他人が>217みたいなソースを書いてきたとき、頭を捻るって感じ。 そんな場面は限りなく少ないから、ググっても仕方ないで、 Q.E.D. ちなみに、俺が>208って言ったら信じる? グチっぽくならないコメントを考えるよw。
(´・ω・`)しらんがな
>>236 VistaだとGDI+ 1.1になっているから何か変更があるのかもしれない。
> rect=(80,64,1,1)とか
そういうときのためのBitmapData.Stride。
>>236 > unsafeかつ、フォーマットの変更が有って初めてLockBit()は仕様通り動くのな。 >228
その条件を満たさないとき、ドキュメントにあるどの仕様に反してるんだ?
一部だけを切りだして Stride も小さくしてくれるとか、領域外をアクセスすると
違反になるとかは 208の脳内仕様じゃないいのか?
LockBits は指定された領域を指定された様にアクセスできる情報を取得する
ためのメソッドであって、指定領域外へのアクセスがどうなろうが別にバグでも
なんでもない。ちゃんと当該領域は移動されないようロックされ、BitmapDataに
アクセスするための情報も返される。
で、結局アホは誰だったの? 俺の他に
コピペ君って馬鹿だな、まで読んだ。
コピペ君って馬鹿だな、まで読んだ。
Drawing::BitmapからGDI+のCachedBitmapを作成したいのですが、 Drawing::BitmapからGDI+のBitmapを取得するにはどうすればよい?
え? 早口言葉?
うわぁ・・・
bmp.GetHbitmap()ってことじゃなくて?
「コピ」−アンド「ペ」−スト
>240 ラマー板に良くいる。プログラミングが出来ないラマーが釣れましたね。 static void Main(string[] args) { Bitmap src = new Bitmap(64, 64, PixelFormat.Format32bppRgb); Graphics.FromImage(src).Clear(Color.Black); Rectangle rect = new Rectangle(32, 32, 20, 20); unsafe { BitmapData bmpdata = src.LockBits(rect, ImageLockMode.ReadWrite, src.PixelFormat);//見える? for (int i = 0; i < (rect.Width * rect.Height); i++) ((uint*)(void*)bmpdata.Scan0)[i] = 0xfffffff; src.UnlockBits(bmpdata); src.Save(@"same.Png", ImageFormat.Png); Graphics.FromImage(src).Clear(Color.Black); bmpdata = src.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); //見える? for (int i = 0; i < (rect.Width * rect.Height); i++) ((uint*)(void*)bmpdata.Scan0)[i] = 0xfffffff; src.UnlockBits(bmpdata); src.Save(@"different.Png", ImageFormat.Png); } } チマチマソース書くより、ファビョる豚の方が案外気分が良いのかもな。 ラマー板に行けば解るよ。 頭の善し悪しより声の大きさが重要ってさ。
>239の言葉を借りれば、 LockBits()と言う変幻自在なMS仕様を >208如きには追えなかったってことさ。 これからも、MSがカラスが白いと言ったら、絶対に黒いっていうなよw。
>208が見てきたサイトも解った。 >特別の事情がない限り、このコードのように全領域をロックする。 この発案者は、きっと毎日 MSを尊敬の目で見てきた善行によって得られたノウハウだと思ったのだろうな。 だけど書いてる本人か(もしくは彼に教えた人)も「特別の事情」がさっぱり解らない。 そして「どうして?」とか「事情とは何か?」って考えはとても背徳的で、>239の様に酷い罵声を浴びせられるんだ。
blogに書くなりMSにフィードバックするなり文句言うなりして終了だろ 何を粘ってるんだよ
>239みたいな奴が居なければ、>208はココに書き込まなかった って案に、個人的に酔ってみたんだ。 ラマー板で適当なスレを探そうかしら。
ラマー板って何かと思ったよ。初めて聞いた。 妊婦用の板かと。
>>255 が初めて触れた事を考えるとお前らなかなか大人だなw
マ板でやれ。
ここはラム板だっちゃ。
混み合う電車の車内、その男は熱く堅いマラを私の後ろから押しつけてきた
263 :
デフォルトの名無しさん :2008/02/17(日) 04:44:40
>265 C#だとunsafeじゃないと動かないんだよね。それ。 一年前にVB厨が見つけたけど、(2007/01/04) Microsoft様は「それは、俺たちが一年前(2006/05/18)にすでに通過した地点だ」と宣ったわけだw。
>208がVB厨より一年遅れともとれる。 所詮「MS」フィードバックともとれる。 MSがvistaと言ったら、XPのbugfixだなんて恐れ多くて言えない。
268 :
208 :2008/02/17(日) 11:39:39
ソースを一行も読めない>239は >236までして必死になって人格攻撃をしましたが 毎日 MSを神と崇めるだけの仕事をしてきた彼には、>250のソースからFormat32bppArgbなどの単語を 得てやっとの思いで >265のログを見つけ出すのがやっとでした。 それに対して、私は>217を new Rectangle(0, 0, tmp.Width, tmp.Height)に改め、フォーマットの 変更や限定無しに、現行xpでもvistaでも正常に動作するソースを手に入れました。 更に上司にunsafeを使った高速化を提案し、「うちはそこまでしなくてもいいよ。だけど勉強熱心だね。」と褒められました。 アンチ信者は、「アンチ」の信者と言ったのはよく言った物で、正直私は「ご利益w」の様な物を感じました。
訂正 >236 => >263
誰もMS信者なんて居ないのに独りで正義気取り カワイソス
271 :
208 :2008/02/17(日) 11:50:23
ソースや文章には多くの目が加わるとより良くなるとは、 多くのプログラマやリファクタの心がける事とおもいます。 >270 ご指摘ありがとうございます。 正義では無く、私自信もひとつの「信者」と自嘲の意味を込めて書かせて頂きました。
272 :
デフォルトの名無しさん :2008/02/17(日) 11:56:12
C#の質問じゃなくて.Net Frameworkの質問になっちゃうかもしれないけど PixelFormt.*のフォーマットの定義 (PixelFormat.Format24bppRgbだったらB->G->Rの順で並んでいるbyte[]とか) ってどこにあるの。 教えてください。 あと、bmp.Dispose()とか必要なん? ガベコレがよきにはからってくれないの ?
うむ これからも懺悔の心を忘れるなよwww
ソースを一行も読めない>239、とか 毎日 MSを神と崇めるだけの仕事をしてきた彼、とか 頭大丈夫か?少し休んだほうがいいぞ
>>272 無いんじゃね
WPFにはあるんだけど
放置しててもそのうちファイナライザがGCに呼ばれてそこで解放されるけどあくまでフェイルセーフ
>>268 お前の成功物語は239が居なくても成立したように見える。
どこで239から利益を得たのかわからない。
265 = 239 だからじゃね? >265は役に立ってる。 (0,0,1,1)のままだとvistaで転けるからw。 . .. ... (0,0,1,1)なんて発想の方がでねーだろw。
コピペ君って馬鹿だな、まで読んだ。
>>278 コピペしてるお前が馬鹿だということが、よくわかった。
>>266 >Microsoft様は「それは、俺たちが一年前(2006/05/18)にすでに通過した地点だ」と宣ったわけだw。
宣ってない宣ってない。
2006/05/18のblogに載ってるのは、
「Orcasでは互換性を重視してるよ。そのためにRed and Greenモデルってのを入れたんだ」
って話で、Lockbitsの話はカケラも出ていない。
コピペ君って馬鹿だな、まで読んだ。
コピペ君って馬鹿だな、まで読んだ。
コピペ君って馬鹿だな、まで読んだ。
>272 が自分にも入り要な事に気づいたので、2匹目のドジョウを狙うぜ。 だけど24,32bit系しかカバーできなんだ。orz static void Main(string[] args) { Rectangle rect = new Rectangle(0, 0, 8, 8); PixelFormat[] PFlist = new PixelFormat[] { PixelFormat.Format32bppArgb,PixelFormat.Format32bppArgb,PixelFormat.Format32bppPArgb,PixelFormat.Format32bppRgb, PixelFormat.Format24bppRgb};//ゴメン 24,32bit系しかカバーできなんだ。 Color[] colors = new Color[] { Color.FromArgb(255, 0, 0),Color.FromArgb(0,255, 0),Color.FromArgb(0,0, 255), Color.FromArgb(64, 0, 0, 0)}; //用途に応じてココは増やした方が良いな。 foreach(PixelFormat pf in PFlist) { Bitmap src = new Bitmap(rect.Width, rect.Height, pf); foreach(Color cl in colors){ Graphics.FromImage(src).Clear(cl); Console.Write("{0}|{1,5}\t",pf.ToString(),cl.ToString()); unsafe{ BitmapData bmpdata = src.LockBits(rect, ImageLockMode.ReadOnly, src.PixelFormat); int pixwidth = bmpdata.Stride/bmpdata.Width; for (int i=0;i<pixwidth;i++) Console.Write("[{0,3}]", ((byte*)(void*)bmpdata.Scan0)[i].ToString()); src.UnlockBits(bmpdata); } Console.WriteLine(""); } Console.WriteLine("-----------------------------------"); } } 更に>275が書いた事が間違ってたら、 真にうけた俺は、更にバカだな。
286 :
285 :2008/02/17(日) 15:20:54
あれ? コレじゃ俺がコピペ君みたいじゃないか。 えっと。 すまない。本当にコピペなんだ。orz
287 :
285 :2008/02/17(日) 15:26:27
っていうか、コレ全然役にたたね。 実行しなくて良いです。 スレ汚し失礼しました。
272じゃないんだけど Dispose()は単なるメソッドで、GCとは関係なく GCはいつ回収しにくるかわからないので、明示的に解放処理をしたい場合 IDisposableインターフェイスを実装してDispose()する という解釈で合ってるのかな?
290 :
デフォルトの名無しさん :2008/02/17(日) 19:28:52
サテライトアセンブリを学んでいるところです。 そこで使われている Assembly Linker の al.exe はどこの場所に インストールされているものでしょうか。 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin (Resgen.exe、Winres.exe はここにありました) を見たり検索したりしてみたのですが見つかりませんでした。 すみませんがこれについて教えてください。
291 :
290 :2008/02/17(日) 20:17:21
確かにal.exeは見つからないままでしたが、少なくともVS2005で作成する 場合は、コード内で、現在のスレッドのカルチャ CurrentThread.CurrentUICulture にカルチャ情報 CultureInfo() を指定するだけで該当のリソースが使われる ようでした。al.exe は無くてもVSがやってくれるので問題ないのですね。
>>289 うん
直接アンマネージリソースを扱ってたりして特別な解放処理が必要なクラスなら
もしDispose呼び忘れても死亡しないようにファイナライザも実装する
ResourceHoge.resx ResourceHoge.ja.resx ResourceHoge.en.resx ... 等とするとVSが作ってくれて、実行時に選択してくれるのな
>>291 C:\Windows\Microsoft.NET\Framework\v2.0.50727\al.exe
なんでC++でなくて、C#を使ってるんですか?
296 :
290 :2008/02/17(日) 23:58:52
>>293 どうもそのようです。
>>294 ありがとうございました、そこにあることを確認しました!!
(Program Files の中しか探していませんでした。。。)
またよろしくお願いします。
297 :
デフォルトの名無しさん :2008/02/18(月) 01:14:00
>>272 憶えていないけど、どこかで見た記憶が有る、ヘルプのすごい変なところ
>>272 アンマネージドのラッパになっているクラスは大抵付いていてやらないとむやみに長期に渡って残るよ
アプリ落とす段階で適当にコレクトされるみたいですけど。
理由は、Comインターフェイスは手動リファレンスカウンタで管理しているので、ガベコレと直接関連してくれないから。(いずれ死ぬけど)
ファイル周りのDisopseは必ずやっておく事、ファイルが長時間に渡ってロックしっ放しになって
他のアプリからアクセスできなくなる。
それとスレッドを持っていてバックグラウンドで仕事をしているようなタイプのオブジェクトも
これは、アプリのプロセスインスタンスが死ななくなって都合が悪い、
特にデバッグ時に停止してもなかなかIDEに制御が戻らなくなってデバッグに不便になります。
299 :
272 :2008/02/18(月) 01:36:04
みなさんありがとう。 Dispose関係は結構複雑なのですね。 忘れないようにしたいと思います。
WPFでどうしてDisposeがほとんどいらなくなったのか理解できない ほとんどのオブジェクトは相変わらずアンマネージリソース持ってるのに
コピペ君って馬鹿だな、まで読んだ。
ゆりしー(´;ω;`)かわいそうです みなとらじお 君が主で執事が俺で 02
http://www.nicovideo.jp/watch/sm2336941 伊藤静「じゃあ、次もwww」
後藤邑子「斬ったほうがいい?www」
伊藤「次は斬る?www」
後藤「どうするww」
伊藤「ペンネーム『心が綺麗な天使』から頂きましったww(フンッwww) 私はこの日本に住むのにはピュアすぎます。どのようにしたら天使のような私がこの今の日本に馴染めるのでしょうか?」
後藤「.........ウザい」
二人「キャッハハハハハwwwww」
伊藤「ちょほんとさあ、大丈夫?www」
後藤「おい天使、おいおい自称天使ww」
伊藤「自分が天使だと思ってること自体がちょっと間違ってんじゃないの?っていうねwww」
後藤「うん。ね。ちょっと軽く(精神病院に)通院してみたほうがいいんじゃないの?www もしくは、今の日本に馴染めるようにちょっと汚れちゃえよwwww」
伊藤「それかもう日本出て行ったらいいんじゃないの?www」
後藤「天使が住める国にwwwwwww なんかエルフの国とかに行ったらいいんじゃないの?wwww」
伊藤「妄想の中とかに(プフッww)行っちゃえばいいんじゃないのwww」
後藤「コワイヨーwwwコワイヨーwwwww」
二人「クックックックwwww」
>>300 >ほとんどのオブジェクトは相変わらずアンマネージリソース持ってるのに
それはXAMLのエレメントを表現したオブジェクトのツリー
アンマネージドリソースは持ってない。
ニコ厨氏ね
おまえら、木曜日から酷い有様だな。ちょろ過ぎる。 >208、>250なんてさ >ソースには(プログ)ラマーの意図を明確にする様に書けって話 (引用 ケントベック) > この発案者は、きっと毎日 MSを尊敬の目で見てきた善行によって得られたノウハウだと思ったのだろうな。 > だけど書いてる本人か(もしくは彼に教えた人)も「特別の事情」がさっぱり解らない。 >そして「どうして?」とか「事情とは何か?」って考えはとても背徳的 (読んだことあるけど失念。トム・デマルコ風?) > ソースや文章には多くの目が加わるとより良くなるとは、(出典 Refactoring to Patterns) これ引用ばかりww。 それどころか、ぜんぜんランクの低いそれらをやたら勧める「アジャイルw」の口伝だろw。 >208はどう見ても真っ赤な信者です。本当にありがとうございました。 本読んでばかりで人と話しが合わない。信者っぷりが凄くて会社のお荷物系wwwww。 それなのに、オマエらチャンスボール多すぎ。常識的に>227なんてありえないし。 >270>271繋がりはなんだ?便利すぐる。 執拗に人格攻撃してるのは、>239に過剰反応したコピペ君の>250なのが事実。 最後に、自分からの信者宣言まで許すし。...もう訳がわからん。 こんなの>208への接待プレーか、>250は>208の素敵な自作自演ですと思われても仕方ねーだろうよ。JK 本当にちょろ過ぎる!!! そりゃ便乗して論破狙いに「C#ってなに?」な奴も湧くよwwww。 NetMassDownloader片手にさww。 そういう本を読んで、頭良いと勘違いする只のガキは五万といるんだからな。 覚悟しとけ。 !!! 俺 も 含 め て 5 万 + 1 wwww !!!
306 :
239 :2008/02/18(月) 11:46:43
想像したり実験したりしながら「動けばいいや」とコードを書き、 仕様が想像と異なっていたらAPIのバグだと主張するという素敵な スタイルを否定した漏れも悪かった。
コピペ君って馬鹿だな、まで読んだ。
>>308 何かお探しですか?
入力したURLが当サイトのページと一致しません
といわれました
主張するっていうか、発見したとした方が嫌みが無いよ。
313 :
305 :2008/02/18(月) 12:22:37
MSは、VS2005あたりからユーザーのニーズに応えて「テスト」って機能を付けたけど。 自社製品では「テスト」しないんだね。 みんなでerrorを見つけてbugfixしようよ。 みんな幸せになろう。 って書くと、もうアンチ信者なのか? orz
314 :
305 :2008/02/18(月) 12:35:48
自校紹介 >305 >本読んでばかりで人と話しが合わない。信者っぷりが凄くて会社のお荷物系wwwww。
317 :
305 :2008/02/18(月) 13:17:03
俺の希望を言わせてもらえば、 誰でも良いから。 239を語って 「208はマジで行き当たりバッタリで、TDD風味なのは最悪コピペ野郎の250!! なんだよ、どっちも糞じゃねーか!!」 ぐらいの線だったんだけどな。
>>313 いやいや、テストしないとかありえないだろ。
MS はテストだけで部署が1つある。
319 :
305 :2008/02/18(月) 14:31:04
>265 ループかよ。 俺もうこのクソコテいらねーよ。 気分はアレだ。せっせっと地雷埋めて、味方が乗ってるときに起爆しちゃったぐらい。 俺、208みたいに全レスとかしないから。 テストってなんの事かなさっぱりわからないや。 208にでも言わせろ。
おまえらさ・・・本当にC#の質問したい奴ができない雰囲気になってるからやめとけよ
>>303 BitmapSourceとかGeometryとか描画の低レベルなところはアンマネージリソース持ってるよ
トータルで見るとGCって不便だし、余計に頭を使う。
System.InvalidCastException: 型 'System.DBNull' のオブジェクトを型 'System.String' にキャストできません。 SqlServerからSelectしてきたDataRowを表示したいのですが、上記のエラーが出ます。 下記のように書いても、'System.DBNull' は '型' ですが、'変数' のように使用されています。 ということでビルドできません。typeofとか使っても駄目です。 VBだとIsDBNullってあるようですが、C#ではどうしたら良いのでしょうか? if (row.Name != DBNull) Console.WriteLine("Name: {0}", row.Name);
知らんけど if( !(row.Name is DBNull) )
rowにIsNameNullみたいなメソッドがあったはず
みなさま、どうも有り難うございます。
>>325 その説明がまた難しかったです‥‥。
row.Name != DBNull.Valueでも同じエラーでビルドできませんでした。
>>325 is演算子なんて、初めて使いました‥‥。
結果は同じだったんですけれど。
>>327 なんと、確かに勝手に作られました!!
カラム分のrow.Is○○Nullが生成されるようです。
気付かず、申し訳ありませんでした。
皆様、どうも有り難うございました。
>>324 if(row.Name != DBNull.Value)
でどうか。
>>329 俺レス遅すぎorz。
つーか、よく考えたらコンパイル通らんな…。
ぶっちゃけ、自動生成されるプロパティ public string Name { get { }} のなかが、if( row.Name.type == DBNull ) throw Exceptionみたいな インプリになってるから、Nameを触った時点で終冬 StringならプロパティでNULL時に代替する値を設定できるけど、 Nullable型はどこへ行ったの、って感じ。
ちゃんとDBのスキーマでNot NullにしたカラムではIs○○Nullが作られないんですね。
ある指定されたファイルの先頭と最後に固定データを付加して、別ファイルに保存する方法が分かりません。 先頭の固定データを設定したByte配列に、元ファイルを読み込んだByte配列をコピーするような方法しかないものでしょうか?
先頭に固定データを書きこんだ後に続けて 元のファイルの内容を順次書き込めばいいだろ
StreamをUriとして扱ういい方法しりませんか? やりたいのがzipで圧縮されたMP3をメモリ上に解凍したものを MediaPlayerで扱いたいとか HTMLが含まれたメールのHTML部をメモリに抽出したものをwebbrowserで開きたいのですが メモリ=>Uriとして扱うために、一旦ファイルに落とせば出来るのですが、 ファイルに落とさずに行いたいです。
ウェブサーバ機能も搭載してしまうとか。
>>336 >ウェブサーバ機能も搭載してしまうとか。
すいませんが、知識がありません。
もうちょっと、ヒントを
あんまり、大がかりにはしたくないのですが、
WCFでちょちょいと出来そうなら、
チャンスなので、WCFとかの勉強をしてもいいかなとも思ってますが。
さくっと見てみた限りでは、ちょっと違うかなぁと
(出来るかもしれないし、出来ないかもしれない)
今は、飛び込むのに迷ってはいるのですが。
>>338 回答ありがとうございました。
MSDNにあるサンプルで試したところ、
簡単にできそうですね(さしあたり、HTMLメールの方は出来そうなことを確認)。
ながいこと方法を探していたので、本当に感謝致します。m(_ _)m
340 :
デフォルトの名無しさん :2008/02/19(火) 21:36:35
ReSharperを購入したことのある方いらっしゃいますか? ReSharperを購入しようと思い、JetBrainのサイトからクレジットカード(Visa)での購入手続きを行ったのですが 数時間後にメールが支払い手続き失敗のメールがきてしまいます。 このカードで他の買い物はできているのでカードが使用不能になっているわけではないと思うのですが・・・
ドル決済ができないとか、海外利用に制限かけてあったりとかじゃないの
あれ、List<T>にIsReadOnlyは無いの?
>>342 ICollection<T>にはある。もちろんList<T>も実装している。
なんでList<T>をICollection<T>にキャストか何かしないと使えないの? List<T>のまま直接IsReadOnlyを参照できればいいのに
List<T>は絶対読み取り専用じゃないから無意味
んー、インターフェースのメソッドやプロパティを一部隠せる構文ってあったの?
明示的な実装
なるほど いろいろとサンクス
exe形式のCOMサーバー作るのもやり方がわからず困ってます。 ATLのhoge.exe /regserverのような自己登録型のCOMサーバーのことです。 単にCOMインタフェースを持ったexeを作って、regasmやgacutilでCOM登録はできるけど、 これだと単にDLLサーバーと同じ働きしかしない。 つまり、アプリ側でそのexeを参照してCOMが使えるけど、アプリごとにロードされる。 COMは1つだけロードされて情報を共有したいのですが・・・ こういうのってC#だとCOM+(コンポーネントサービス)で実現すべきですかね? C#でCOM+作ってregsvcsで登録、複数アプリでの情報共有はできることは確認できたのですが。
RegistrationServices.RegisterTypeForComClients でなんとかできるのかもしれない
351 :
349 :2008/02/20(水) 11:14:51
んー、これは、プログラムからCOM登録するというだけではないですか? 自分はCOMがマシンでシングルトン的に動く事を期待しているので。 それで複数のアプリがそこへCOMインタフェースを介してアクセス。
RegistrationConnectionType 指定できるじゃん?
353 :
340 :2008/02/20(水) 12:03:31
>>341 フォームからは日本円も選べるので
日本からの購入も可能なのかと思ったんですが…
354 :
349 :2008/02/20(水) 12:03:35
>>353 >>341 が言ってるのは、カードの設定のことじゃないのか。
まあ、クレカ関連のトラブルはカード会社に電話するのが一番手っ取り早いと思うよ。
356 :
340 :2008/02/20(水) 12:38:52
>>355 ありがとうございます。
問い合わせてみます。
期限の年月を逆にかいてないか?
買い物したことあるみたいだから、それは無いと思うが、、、たまたまあってたのかもしれんしな。 2012年を過ぎればこんな心配も無くなるなw
偶然08/08だったので気づかなかったりw
JAVAとC#どっちがリバースエンジニアリングに強い? どっちも変わらない?
変わらないと思う。
実際のところ難読歌どうなんだろうね。 すんごいクラス細かく分けてあって、名前がa1とかだったらそれなりに調べるのに時間かかるとは思うんだけど。 一メソッドの中のロジックはともかく、複数のクラスの相互関係とかは結構追いにくくなりそうだけど。 もちろんバイナリのほうがいいのはいうまでもないが。
リフレクションしてたら死ぬからできればやめといた方が無難
バイ…ナ…リ…?
意図せずリフレクションが使われてることはよくある。 Enum.Parseとかも駄目。 そういう副作用があるので難読化後に全テストし直しが必要なのできついよ。 駄目なクラスなどだけ難読化の対象から外すのはできるけどそれを確認するのも手間がかかる。 難読化してもメソッド内のロジックとかで見ると何も変わらないのであんまり意味がない。 ほんのちょっと読みづらいだけだよ。
>>365 そのまま、ネイティブバイナリの意味ですが?普通に読めば.NET ILコードとネィテブバイナリを比較して行ってると思ったんだけど・・・
>>366 >意図せずリフレクションが使われてることはよくある。
>Enum.Parseとかも駄目。
>そういう副作用があるので難読化後に全テストし直しが必要なのできついよ。
それはめんどくさそうですね。
>駄目なクラスなどだけ難読化の対象から外すのはできるけどそれを確認するのも手間がかかる。
>難読化してもメソッド内のロジックとかで見ると何も変わらないのであんまり意味がない。
ので全部のクラスに難読化かけたときは全体の構造追いにくくなるのである程度は意味ないかと思ったんですけどね・・・
じぶんならかなり見る気がうせるし、追ってくのにも時間かかるだろうから、それなりに障壁にはなるかと。
↑グロ注意
Console.ReadKey を使ってそれなりにリッチなコンソール インターフェイスを 構築しようとしているのですが、(Console IME は使えなかったのでテストして いませんが) 非 ASCII 文字をペーストすると変に分解? されてしまうようなの ですが、何か対策は無いものでしょうか。どうかご教示願います。 /* コード */ char c; while (true) Console.WriteLine("{0} ({1})", c = Console.ReadKey(true).KeyChar, Convert.ToInt32(c)); /* 結果: (入力orペースト -> 出力) a -> a (97) A -> A (65) あ -> ? (130)\n? (12448) い -> ? (130)\nア (12450) ア -> ? (131)\nぁ (12353)
371 :
デフォルトの名無しさん :2008/02/24(日) 22:12:17
TextBox textBox; textBox.AppendText("1\n"); textBox.AppendText("2\n"); textBox.AppendText("3\n"); textBox.AppendText("4\n"); textBox.AppendText(textBoxLog.Text); とすると、 1 2 3 4 1234 ってなるんだけど、最後の行で改行が消えるのは何故? 改行を保存するにはどうすればいいの?
正しい改行は\r\nだぜ
373 :
デフォルトの名無しさん :2008/02/24(日) 22:20:04
ちょっと質問の仕方を変える。 TextBox textBox; textBox.AppendText("1\n"); textBox.AppendText("2\n"); textBox.AppendText("3\n"); textBox.AppendText("4\n"); textBox.AppendText(textBoxLog.Text); とすると、 1 2 3 4 1234 ってなるんだけど、初めの4文字は改行されて、最後の4文字は改行されないは何故?
>>373 Dock=FillとかにしてTextBoxのサイズがウインドウサイズに連動して変わるようにして、
表示した後にサイズを変えてみ。
\nじゃだめなことがわかるから
逆に、なぜ\nでも一見改行されているように見えるのかと聞いているのかもしれない。 それなら、俺も聞きたいところだ。
376 :
デフォルトの名無しさん :2008/02/24(日) 22:46:38
x.SelectionStart = x.TextLength ってやると末尾に\nが来た場合次の行にカーソルが行くから、かね
最善策: Environment.NewLine
379 :
デフォルトの名無しさん :2008/02/24(日) 23:41:20
昨日プログラムを始めたばかりなのですが、本にintは数値を入れる箱と書いてあったのですが どういう箱なのでしょうか?いまいち解らなくて・・・
>>373 textBox.AppendText(textBoxLog.Text + "\n");
で解決とか言う問題ではないのよね?
381 :
デフォルトの名無しさん :2008/02/25(月) 00:03:56
____ /...... .. .../ ||::: ∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ̄\ ( ゚Д゚)< こういう箱。 | |: ̄U U ̄:|\_______ | |: int :|  ̄ ̄ ̄ ̄ ̄ ̄
intはどっちかというと箱の形だと思う
型の話をするとなっがーくなるぞ
>>379 ふらっと池
諸先輩方の仰る通り、とりあえず変数は一通りその存在に慣れて、その後に
詳細を理解した方が良い。
>>383 それはむしろ object @int = new Giko("こういう箱。"); じゃw
>>379 メモリにも、処理可能な量にも限界がある(有限)ため、資源を区切って使う必要がある。
どんな箱かと言われたら、一般的な段ボール箱かな?
詳しいことは知らないので適当に書くが、 半導体が帯電しているかしていないかで0,1をあらわす それを32個組み合わせたものがintで、 intは2の32乗の状態をもつことが出来る。 一つ一つの状態は整数の値に対応し、四則演算などを行うことが出来る つまり整数を入れるのがint
適当すぎてワロタ
>>379 英語の文法を意識して話してるうちは英語が話せないのといっしょ。
でも、たとえも良くないな。
数学の変数と同じと思う方がいい。
よく使われるけど「箱」って絶対分かりにくいと思う。 数学の x や y と同じで、ただ代入できる数値に制限があるってだけで 中学生以上なら誰でも理解できると思うんだけど…
代入演算子が "=" なのがそもそもオカシイ もう慣れちまって違和感無いけど
代入が「演算」かどうかという点からして微妙なんだがな
そうですか
396 :
391 :2008/02/25(月) 11:39:35
>>392 Cの時代はポインタの理解の布石として箱で理解する必要はあるかもしれないけどね。
今時の開発で初心者が箱で理解する意味なし。
Cの場合、ポインタで直接中身をいじる感覚を把握するために、 箱モデルの必要性があった。 現代的な言語、たとえばJavaなら、プリミティブ値かオブジェクトに付ける名前、 あるいは名札、という概念で把握できるから箱モデルいらね。
というかC♯スレだっけ、ということで、 s/Java/C♯/
保存媒体のケース カセットテープのケースにはカセットテープが入る MDのケースにはMDが入る 形が似てるものは互換性があったり(あるように見えたり)する 何でも入れられるケースもあるけどな
その文脈で何でも入れられるケースが出てくるのはおかしい 箱で考えるとその辺で悩む奴がいる
ヒープとスタックくらいは構造意識してプログラミングしようよ。
今ある言語の「型」は性質によって定義されるのであってメモリ構造とかは付随的なものだから 記憶構造とか意味が無いよ むしろ「自然数」という型を数学的に定義しているペアノの公理とかの方に引っ張っていくべき
行き過ぎた抽象化や比喩は弊害になるいい例なんだと思う 自分の指示がコンピュータのどの資源をどのように確保したかを理解せずまともなプログラムが出来るなんて 現実感の足りない偉い学者の夢想物語で未来永劫そんな理想環境が訪れることは無いんじゃないかな ペアノとやらでメモリの話を避けてintの定義と機能を説明できる?
初心者は型の無いシンプルな言語から始めたほうがいいのじゃないだろうか。
型があったほうがコンパイル時にエラーで教えてくれて親切だと思うんだけどなぁ
型無し言語ほど恐ろしいものはないわ
箱とか数学よりも擬人化したほうがいいだろjk
C#で多倍長整数を構造体で定義することを考えてみ メモリ云々よりも性質から攻めていった方が楽だろ? 型っていうのは性質によって定義されるものなんだろjk
型宣言省いて上手く動かず 全部intで処理して挙動不審 floatで期待した結果を得られず ホビープログラムで経験して理解した者が這い上がってくるって事で良いんじゃないだろうか 別の山道ももちろん在るけど
implicit operator実装しまくればVariant型を作れるかな
412 :
デフォルトの名無しさん :2008/02/25(月) 17:34:41
C#で、グラフ構造を表示するのに便利なライブラリーってありません?
ListViewの詳細表示で、他のコントロールを貼り付けるにはどうしたらいいですか?
>>413 ListViewを使うのは諦めた方がいい。
DataGridViewとか使ったら?
WPFなら融通利くかな・・・。
>>413 貼り付けるだけなら
control.Parent = listview;
サイズはListViewItem.BoundsとかListViewItem.ListViewSubItem.Boundsとかで拾う
制御するにはイベントだけじゃ無理でWndProcをオーバーライドして適宜メッセージ処理する必要あり
417 :
デフォルトの名無しさん :2008/02/25(月) 23:52:39
ArrayListにString配列をAdd()で格納*n回繰り返す → それぞれのStringデータに1バイトずつbyte型のデータを 付加して、String配列を一つのStringデータにする。 やり方をどなたか分かる方おりませんか? StringBuilderでStringをアペンドすることは出来るのですが、 byte型のデータをアペンドするときに0x12が0x3132になってしまいます。。
要するに、そのbyte型データ(bとして)がstringになればいいんでそ。 System.Text.ASCIEncoding.GetString( new byte[] { b } ) でも使って変換すれば。
419 :
417 :2008/02/26(火) 00:07:35
>>418 さん
ありがとうございます!!!
大変助かりましたし、勉強になりました。
本当にありがとうございます。
もち、ASCIIの範囲超えたら例外だかんね。 文字列はUnicodeとして合法な並びにしかならないから。 それが嫌なら、全部バイト配列でやるこったね。
421 :
417 :2008/02/26(火) 00:30:42
文字列で処理する方法を諦めかけていたとき、 byte配列で処理することも考えていました。 データ長が可変なこともあってArrayListで 処理していたのですが、 ArrayList = new ArrayList(); arylst.add( b ); //byte型で0x12を格納したデータ arylst.add(bytes); //文字列をbyte配列に変換したもので0x35363738(5,6,7,8)を格納したデータ byte[] = (byte[])arylst.ToArray(typeof(byte)); と処理すると、ToArrayの箇所で必ず、『キャストできませんでした』という 例外になってしまっていました。 もしよろしければ、上記のbyte配列で処理する手順で 例外にならないようにbyte配列を生成する方法を 併せてご教授いただけませんでしょうか?
その文字列を、どのエンコーディング使ってByte配列にしたいかによって話も変わってくるけど、 List<byte> bytelist = new List<byte>(); bytelist.Add( b ); bytelist.AddRange( System.Text.UTF8.GetBytes( "abcdefgh...") ); みたいにして、最後にbytelist.ToArray();とでもすればいいんじゃないの。
417-418を見て思ったんだけど、(char)bってできなかったっけ?
出来ますが、文字コードに変換されてしまいますよ
>>421 arylstの中身は { b, bytes }
bytesがbyte[]型ならbyte型にキャスト出来ないのは自明
配列をばらして追加したいならAddRange()
>>423 >>424 ASCIIの範囲なら問題ないんじゃないか?
0x30を"30"ではなくて'\x30'に変換したいだけだと思ってたんだが違うのか
あ、"30"じゃなくて"48"か
>>417 につられて間違えた
process.start(exe, arg)でargが2056文字だと正常に動作するけど 2057文字だとエラーになります. なぜだか原因,仕様等知っている人いたら教えてください.
コマンドラインのバッファ制限
429 :
デフォルトの名無しさん :2008/02/26(火) 09:06:18
グラフ構造を見やすく表示するようなコントロールって どこかから発売されているのでしょうか?2Dでも3Dでも かまいません。.NET で使えるものを探しています。
430 :
391 :2008/02/26(火) 10:02:48
>>409 同意。
Marshalとか使い出さない限りは問題ない。
数学Iができてればプログラムは問題ない。
II以降の偏差値50切ってる俺ですらできてるからな。
問題ないと思っているのは本人だけ。 そもそも優秀な管理者は部下にぎりぎり問題の無い仕事を与える。
432 :
デフォルトの名無しさん :2008/02/26(火) 11:16:40
ちょっと質問なんですが、 // IE オブジェクトを作る Type typ = Type.GetTypeFromProgID("InternetExplorer.application"); object ie = Activator.CreateInstance(typ); これで新しいIeのインスタンスが出来るんですが、 既に起動しているIeのハンドルからobject ie を設定する方法ってのは ないものでしょうか。よろしくお願いします。
ShellオブジェクトのWindowsメソッドで列挙してHWNDプロパティ見てけば
434 :
417 :2008/02/26(火) 12:40:48
435 :
デフォルトの名無しさん :2008/02/26(火) 13:35:30
ArrayListにAddした複数のbyte配列を、ToArray等で ひとつのbyte配列にはできないのでしょうか?
byte[] array = list.OfType<byte[]>().SelectMany(a=>a).ToArray();
437 :
デフォルトの名無しさん :2008/02/26(火) 14:33:53
説明が足りませんでした。 開発環境はVS2005です。
というかまだ ArrayList 利用者っているの?
1.1 に縛られてるなら仕方ないが、そうだと
>>436 使えんし
439 :
432 :2008/02/26(火) 16:36:13
>433 Shellですか。(^^; Shell = CreateObject("Shell.Application"); foreach (object Obj in Shell) こうやってもobject型がGetEnumeratorを含んでいない為 列挙が出来ません。 何か良い方法があるのでしょうか。
Shell.Windows
442 :
デフォルトの名無しさん :2008/02/26(火) 22:07:29
リモートデバッグの仕方がわかりません。 プロセスにアタッチはできるのだがブレークポイントが有効にならない。 なんで? VisualStudio2005 C#
目的のプロセスがデバッグ情報ないのでは。
どういうプログラムをデバッグをしたいのかとか、 実行した手順を書かないとエスパーでないと答えられん
フォームのタイトルってTitleで何度も書き換える事はできないのでしょうか?
Form.Text
447 :
445 :2008/02/27(水) 19:22:13
>>446 それが反映されないのです。
form2.Show();したものですからかね?
form2.Text
Application
別スレッドから書き換えてたりしないだろうな
たぶん違うインスタンスのプロパティいじってるとエスパー
452 :
デフォルトの名無しさん :2008/02/28(木) 20:42:52
C♯[windowsプログラミング]の問題集を買ったんですがどうしてもわからない問題があったので教えてください 問題:以下の説明に該当するイベントを答えなさい @ボタンをクリックしたときに発生する Aラジオボタンの選択された時発生する Bテキストボタンの値が変わった時発生する Cフォームが閉じる時発生する Dタイマーが有効になった時に一定時間間隔で発生する
VC# 起動してフォームにそれぞれ配置して プロパティのイベント見れ 親切に説明書いてあるから
分からなくても全然OK。IDEが助けてくれるから。
そんな名前なんてほとんど役に立たない知識だと思うけど。 糞問題集だな
発生することの名前の前に「On」を付けろ。
よーし!パパ、役に立たない豆知識を問題集にしちゃうぞー!
問題集を見ただけで本全体が糞であると予想できる。 今すぐゴミ箱に捨ててプログラミング.NET Frameworkを買うんだ。
459 :
デフォルトの名無しさん :2008/02/28(木) 22:21:41
数年前、C#をかじった程度で久しぶりに他人の書いたソフトを見ていて 驚愕した。アンマネージDLLの関数をコールする際の話なのだが、 文字列を渡すためにcharポインタを渡すところでいきなりC#からstringを渡している!? それでちゃんと動いている・・ また、普通に配列を渡したりもしている・・配列の「参照」ってポインタなの? stackallocとか使ってポインタを使わないとダメだと信じてたのに・・
つ 相互運用マーシャリング つかこの辺参照しないでよくP/Invokeやってたな
>>452 は釣りだろ?
まさかそんな問題集が存在するとは思えない
462 :
980の続き :2008/02/28(木) 23:58:32
461>学校のほうで販売されていた問題集なんです
恐らく、問題集が問題なのではなく、
>>452 の書き方が問題。
DBに登録済みの、あるテーブルのスキーマから空のDataTableを作成したいんですが、 方法ありますか?列をちまちま追加するより簡単に
>>466 普通に、空のDataSetをVS上で作って、
(newするのじゃないよ)
Adapterでつなげばいいんじゃね?
DataAdapter.FillSchema
469 :
466 :2008/02/29(金) 15:17:53
コマンドプロンプトを使って、NetUseコマンドにてドライブを作成したいのですが、 接続対象のパスに空白が含まれている場合はどのように入力したらいいでしょうか?
"
"
"なぜ ここで聞くんだ?"
相談室だから。
もし学生さんなら是非、進路指導室に喧嘩の指導をお願いしに行ってみて欲しい
子供相談室に包茎の悩みを聞いてもらっておk?
477 :
デフォルトの名無しさん :2008/03/01(土) 19:53:06
DrawEllipseって何でこんなに使いづらいんですか? 中心点、半径を引数に与えれば円を書いてくれるような関数にすればよかったのに。
それは楕円の特殊なケースだからなぁ ラップすればいいんじゃね
楕円でも短径と長径を・・・ってのはいいとして、 表示したい範囲がはっきりするので この仕様の方が便利な事もまああるし、 幅が偶数ピクセルだと 「中心」 が上手く定まらないので、 最も汎用的な関数としてはこうせざるを得なかったんだろう。 ラッパ関数くらい用意して欲しかった所ではあるけど。
ラッパラッパってポリモーフィズムくらい使えよ。
ポリモーフィズム関係ないだろ
間違ったポリモーフィズムの代表例じゃないかw
>>479 > 楕円でも短径と長径を・・・
定義通りにするなら、焦点2つと距離の和(=長径)
でも、GDI使うような場面では使い難いと思うが
つか拡張メソッド
中心の座標と半径でって未だにそんな大昔のMS BASICみたいな発想をする人がいたことにむしろ驚きw どう考えてもそんなの使いにくいだろう
質問です。 static int deg = 90; const double rad = 0.0174532925; const int r = 200; private void button1_Click(object sender, EventArgs e) { int r = 200; int x, y; Graphics g = pictureBox1.CreateGraphics(); g.FillEllipse(fillbrush, 250, 20, 400, 400); x = (int)(r * Math.Cos(deg * rad) + 450); y = (int)(-r * Math.Sin(deg * rad) + 220); g.DrawLine(mypen, 450, 220, x, y); timer1.Enabled = true; } private void timer1_Tick(object sender, EventArgs e) { Graphics g = pictureBox1.CreateGraphics(); deg = deg - 12; if (deg >= -270){ int x1 = (int)(r * Math.Cos(deg * rad) + 450); int y1 = (int)(-r * Math.Sin(deg * rad) + 220); g.DrawLine(mypen, 450, 220, x1, y1); } if (deg == -270) timer1.Enabled = false; } のような感じで30秒で一周するタイマーを作ったのですが、 コレを線でなく扇型でぬりつぶしていく良い方法は無いでしょうか?
Arc
488 :
デフォルトの名無しさん :2008/03/02(日) 00:14:00
>>486 しかし酷いコードだな。
「プログラム診断室」に出てくる悪いコードの見本みたいだ
>>488 ハァ?
じゃぁ、良いコードの見本書いてみろよ。
例えば、 >const double rad = 0.0174532925; ↓ const double rad = PI/180; くらいはしてほしい。。
450とか220とかを変数にできないものか。 あと、12じゃなくて、360/30って書いてよ。
private void button1_Click(object sender, EventArgs e) と private void timer1_Tick(object sender, EventArgs e) に共通部分が多いことに違和感を感じないのだろうか。
>>492 すいません。
オブジェクト指向というか、スコープを良く分かってないんです。
if (deg == -270) も危険な感じがする。12度間隔じゃなかったら270丁度にならないよ。 if (deg <= -270) にした方が良いかと。
質問に対する回答以外のつっこみを排除しようとするなら2ちゃんなんかに書き込まないほうが精神衛生上いい
ちょ、変数rがwwwwwwwwwww
で、>486の質問への回答としてはg.FillPie()を使えという事でいいんかいな
今までだと WebBrowser にフラッシュを表示させると クリックしてもフラッシュにクリックが伝わらなかったけれども いつの間にか正常にクリックできるようになってるじゃん
x = (int)(r * Math.Cos(deg * rad) + 450); y = (int)(-r * Math.Sin(deg * rad) + 220); はPositionFromDegreeとかにまとめとけ
しかしregionでまとめれば大して差は無い
CreateGraphicsでつくったGraphicsはDispose推奨
自作のアプリケーションの更新があった場合ネットワーク経由で自動的に通知できる様にしようとしています Jane Doeをイメージしていただけるとありがたいです… こういった場合の一般的なアプローチの方法を教えていただきたいです。 今のところ、バージョンを管理するテキストファイルをウェブ上にアップしておきそれをDL、読み込みすることで判定する、といった方法を考えているのですが いまいち遠回りでスマートでないような気がします。 また、確認のついでに使用しているバージョンなどのログが取れたらと思うのですが こういったものは普通CGI等を利用して実装するのでしょうか?
>>504 前者は、逆にそれ以外の方法があるのかと思う。
サーバー側から配信するってことだと思うけど、宛先がわからない。
初回に登録させるのは多分いやがるだろうし、登録したって変わる可能性が高すぎる。
おまけに配信作業がプログラムを書くにしても手作業でやるにしてもめんどくさすぎる。
最新情報を書いておくのはテキストでいいのか、XMLがいいのかって問題はあると思うけど
そのURLをずっと固定で維持する必要があるのが唯一の難点なだけで、
それしかないと思うけど。
後者はUserAgentに書いておけば、アクセス解析させるだけで出来そうな気もする。
ってこれも一応CGIか。
>>505 なるほど!UserAgentは思いつかなかったです。ありがとうございます。
CGIとかさっぱりだったので困り果ててたのですがさすがにアクセス解析ならなんとかなると思います。
自動更新は苦肉の策のつもりだったのですが
やはり他の方法は考えにくいですよね…。
サーバーダウン等で接続できない時はその旨を出すようにしてましたが
そもそも、サイトが移転した状況を考えていませんでした。
人為的な問題なのでヘルプにサイトを記述したり、移転前に告知することで対策することにします
ところで、テキストで書く以外考慮していなかったのですが
バージョン管理をXMLで記述するメリットというのはどういったものなのでしょうか?
>>506 ああ、ClickOnce忘れてました…!
これは限りなく正解に近いです。ありがとうございます。
ただ、まだあまり使われてるところを見かけないのが少し心配ですが
とりあえず
>>504 の方法と両方試してユーザーと相談してみることにします。
みなさま本当にありがとうございました。
>500 IEの仕様変更。 特許の期限切れで以前の動作に戻ったんだよ。
>>509 そのパッチってまだ出てないでしょ
サイトによっては
クリックするとこのコントロールをアクティブにして使用します
ってのが出るし
確かJavaScriptで逃げてるはず
Eolas問題に関してはスクリプトで回避できるけれども
>>500 の件はスクリプトを使っていようがいまいが
WebBrowser 内の Flash はまともに動いていなかった
513 :
デフォルトの名無しさん :2008/03/03(月) 03:29:05
ボタンコントロールのImageプロパティに ビットマップを設定しています。 クリック時やマウスオーバー時の 画像を変更したいのですが、よい方法はありますでしょうか? 現状ではMouseEnter、MouseLeaveイベントを処理して Imageをその都度入れ替えています
良い方法っていうのは効率の良い方法って意味だよね? EnterとLeaveで2枚しか使わないなら、2枚を一々変えずにメモリ確保とかその程度じゃない?
imagelistでも使えば
おはうー
bmpはでかいからjpgやpngにするとか? もしくは16色bmp
どうしたいのかわからないぞ 処理を軽くしたいとかか?
一般的あるいはスマートな方法があるのか知りたいだけじゃないのか?
都度入れ替えているが切り替えスピードが遅く困っている、とエスパー予備軍の俺が予想
まあ、本人も消えてるしどうでもいいか。
以下のコードを実行すると、FileLoadException が発生します。 コード (抜粋): static void Main(string[] args) { var source = @"using System; public class Test { public static void Main() { Console.WriteLine(Console.ReadLine()); } }"; var result = CodeDomProvider.CreateProvider("cs").CompileAssemblyFromSource( new CompilerParameters() { GenerateExecutable = true, GenerateInMemory = true, }, source); var domain = AppDomain.CreateDomain("test"); domain.Load(result.CompiledAssembly.GetName()); } 例外: ファイルまたはアセンブリ 'System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'、 またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ 参照に一致しません。 (HRESULT からの例外: 0x80131040) GenerateInMemory を false にして OutputAssembly を与えてやるとうまく動作するようなの ですが、メモリ内で生成した上で動作させるためにはどうすればよいのでしょうか。 どなたかご教示いただけませんでしょうか。よろしくお願いいたします。
523 :
デフォルトの名無しさん :2008/03/04(火) 06:12:47
PictureBox自体を回転させる方法は無いでしょうか? もしくはPictureBoxに書いた画像を回転させる方法は無いでしょうか? Graphics g = pictureBox1.CreateGraphics(); g.DrawPie(mypen, 20, 20, 400, 400, 0, 18); pictureBox1.Image.RotateFlip(RotateFlipType.RotateNoneFlipY); としたのですが、出来ませんでした。
CodeDomに参照アセンブリを設定してやる必要があるんじゃなかったかな
最初からRotateさせてPieかいたら?
だいたいdomain.Loadはあまりやらない方がいいぞ。
>>523 DrawPieの前にg.RotateTransform
>>523 pictureBox1.CreateGraphics()で取得したGraphicsに描画しても
pictureBox1.Imageの方はなんら変わらないから、どちらか一方に統一しろ
Image使うならpictureBox1.ImageからGraphics作ってそっちに描画
俺はよくバッファ代わりに使ってる
メソッド内でNewしたコンボボックスにDataSource設定してもItems.Countが更新されないみたいなんだけどそういうもん?
なんのことやら
こんな感じ private void Form1_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Add("Key", typeof(int)); dt.Columns.Add("Value", typeof(string)); DataRow r = dt.NewRow(); dt.Rows.Add(new object[] { 1, "h" }); dt.Rows.Add(new object[] { 2, "o" }); dt.Rows.Add(new object[] { 3, "g" }); dt.Rows.Add(new object[] { 4, "e" }); //画面に張り付いてるオブジェクト comboBox1.DataSource = dt; comboBox1.ValueMember = "Key"; comboBox1.DisplayMember = "Value"; MessageBox.Show(comboBox1.Items.Count.ToString()); //メソッド内で宣言したオブジェクト ComboBox zzz = new ComboBox(); zzz.DataSource = dt; zzz.ValueMember = "Key"; zzz.DisplayMember = "Value"; MessageBox.Show(zzz.Items.Count.ToString()); }
Itemsに反映されるのはハンドルが作られてから。
Debug.Print(zzz.Handle.ToString()); でハンドル作って?みたけどやっぱりCountは0のままっぽい やり方が間違ってるのかな・・・orz
ウィンドウハンドルだろjk というか一旦ウィンドウが表示されてからメッセージボックスで出力すればいいんでないか?
Handleプロパティにアクセスすると作成されたと思うけど。 RefreshItems();でもしてみれば?
長いパスを扱うときのファイル名の頭に\\?\を付けると例外が起きます。 そのまま長いパスをFileStreamとかに渡しても駄目です。 .NETだけだと長いパスは扱えなかったりします?
逆に.NET以外だと扱えたりします? んなことないと思うけど。
前に掲示板で見かけたような気がするが見つけられん。 まあ結論として.NETじゃ扱えない、だったはず。 やりたいならCreateFileでハンドル取ってきて、かね。
datagridの列幅ではまって早二日・・・・
検索してもうまい解決方法がみつからない、誰か教えてくれ
やりたいのは、csvを読んでdatagridに表示すること。
ttp://www.ailight.jp/Grid_CSV.aspx ここで紹介されているコードを参考にして、csvファイルをdatagridに読み込ませたのだが、
列幅が設定できない。
各所で紹介・解説されている列幅設定だと、tablestyleを設定して云々とあるが、俺にはそこらへんの処理の仕組みがさっぱりわからない。
上に引用したコードを元に、うまいこと列幅を任意の長さに設定する方法ないかな?
DataGridTableStyle でぐぐれ
>>541 既に昨日ぐぐった。でもわからん。
各所で解説されている列幅設定のコードを参考にしてdatagridに一回読ませるのはできるが、
その後に別のcsvをdatagridに読ませようとすると、
追加情報 : このデータ グリッドのテーブル スタイル コレクションには 既に同じマップ名のテーブル スタイルが含まれています。
ってエラーでストップする。
エラーメッセージ見れば一目瞭然だと思うんだが… 以前のDataGridTableStyleをDataGrid.TableStylesからRemoveするなり 追加済みDataGridTableStyleを直接いじるなり テーブル名変えるなり
>>543 removeか、そんなのがあるのか、しらんかった。試してみる。
>>544 そこは一番最初に見た、理解できんかった。
とりあえずボタンを押すとそこに書いてあるコードを実行するform作ってビルドしたら、
一回目のボタンは正常に動くけど、2回目で追加情報〜含まれていますで止まるんだよね。
removeか・・・なんか行けそうな予感がしてきた。
明日やってみる。
>539 やっぱそうですか。無理そうな気はしてました。 なぜかIISから上がるASP.NETのプロセスが\\?\が付いたパスで実行されてることがあるので気になったので。 \\?\から始まるパスでexeを叩いてアプリを起動するとApplication.StartupPathなんかが例外しか返らなくなる。 そうなると他にも危ないプロパティやメソッドが出てきてそれなら正しく扱う手段が知りたくて。本当に深いパスを扱うことはあんまり無いです。 パスっぽい文字列が出てきたら\\?\で始まってたら削る不毛な処理をひたすら入れておきます。 Application.StartupPathみたいに即座に例外が返るものはちょっとどうしようもないので、 .NETのクラスライブラリ内のメソッドとかで危ないものは 自分用にObsolete付けて迂闊に使ったら警告を出せるようにする手段はないかなぁとか思う。
FxCopのカスタムルールで検出させるとか?
FxCop で vb だけで絞りこんで表示させることってできない? ちなみに当方 FxCop 1.36 Beta 2。
パターン指向リファクタリング入門 P359 「コンストラクタの連鎖」を C# で試してみました。 すると「this」で、「メソッド名が必要です」と怒られます。 C# でコンストラタの連鎖を問題なく行うにはどうしたらよいでしょうか? class Loan { public Loan(float notional, float outstanding, int rating, DateTime expiry) { this(new TeamROC(), notional, outstanding, rating, expiry, null); } public Loan(float notional, float outstanding, int rating, DateTime expiry, DateTime maturity) { this(new RevolvingTeamROC(), notional, outstanding, rating, expiry, maturity); } public Loan (CapitalStrategy strategy, float notional, float outstanding, int rating, DateTime expiry, DateTime maturity) { m_strategy = strategy; m_notional = notional; m_outstanding = outstanding; m_rating = rating; m_expiry = expiry; m_maturity = maturity; } }
public Loan(float notional, float outstanding, int rating, DateTime expiry) : this(new TeamROC(), notional, outstanding, rating, expiry, null) { }
javaかよ。
Silverlight2Beta来たね
554 :
デフォルトの名無しさん :2008/03/07(金) 14:53:00
struct A { ... } A[] a = new A[10]; としたとき、a[3]のようにアクセスするときって、C++のメモリのようにa+sizeof(A)*3というようにCPUで乗算処理が発生しているんでしょうか? だとしたら速度が必要なな部分では配列アクセスにするよりクラス参照のリストのようなかたちにしたほうがいいのでしょうか?
555 :
デフォルトの名無しさん :2008/03/07(金) 15:10:33
ここで聞いていいのかどうか分かりませんが、 3次元が固定、2時限目が動的、1次元が固定の配列を 作るにはどうしたらいいのでしょうか? float[][,] farray=new [14][,4]; とやってもうまくいきません。 掲示板では見にくいのですが、 4の前には「 ,」カンマが入っています。
>>554 プログラミングガイドの配列のところにはこう書いてある。
>配列型は、抽象基本型 Array から派生した参照型です。
>この型は IEnumerable と IEnumerable<(Of <(T>)>) を実装するので、C# のすべての配列で foreach 反復処理を使用できます。
だから気にしていることに限ってはどっちにしても変わらない。
と予想してみる。
デリゲートに追加した匿名メソッドを指定して取り除く事って出来るかな?
速さが必要ならそんなことよりもっとほかにやるべきことは沢山あるはずだし、
それをやり尽くした上で554のようなことまで気になるというのなら、
C#ではなく、アセンブリ言語とC++でどうにかすることを考えるべき段階。
故に
>>554 そんなこと気にするな。
>>554 こういう文もあった。
>C# の配列はオブジェクトそのものであり、C や C++ の場合のように、単なるアドレス指定可能な連続メモリ領域ではありません。
>>555 次元に関係なく、要素を動的に変える配列は作れないよ。
List<>とかと組み合わせたりしないと。
×次元に関係なく、要素を動的に変える配列は作れないよ。 ○次元に関係なく、要素数を動的に変えられる配列は作れないよ。
unsafeとfixedでCみたいな配列としても扱えるよ
>>560 動的/静的は配列に対して使い方が難しいので可変長と言うべきだな
563 :
デフォルトの名無しさん :2008/03/07(金) 16:19:34
こんな形で使うのは初めてなので聞いてみたのですが、 思ったより難しいのですね。 C++ならそこまで難しくないと思ったのですが。
C++で可変長配列とか、泥沼だろ。
565 :
デフォルトの名無しさん :2008/03/07(金) 16:58:28
float[] oned=new float[4]; oned[] twod; twod[] threed=new float[14]; 自分で考えてここまでやってのですがこれで正しく動作するか わかりませんし処理効率がどうなるかは分かりません。 <vecto>とかboostみたいに上手いことできないでしょうか?
>>565 おまいは自分で考えてここまで何をやってきたんだ
567 :
デフォルトの名無しさん :2008/03/07(金) 17:15:16
めんどくさいので float[][][] threed=new float[14][][]; だけで後は自動に任せることにしました。 ありがとうございました。
568 :
デフォルトの名無しさん :2008/03/07(金) 18:19:46
と思ったのですが、Listのほうが用途に 合っていそうなので、そちらを使ってみることにします。
先ずC#で何ができるか調べたほうがいい
>>568 それは最初から「vector 相当のものはありますか?」と聞くべきだった。
571 :
デフォルトの名無しさん :2008/03/07(金) 21:16:35
>570 すいませんでした<(_ _)>
ありがとうございます!
573 :
デフォルトの名無しさん :2008/03/08(土) 14:14:48
こうだくみこのおまんこにセロリいれたいな みんなはなにいれたい?
574 :
デフォルトの名無しさん :2008/03/08(土) 14:23:43
コピペ君って馬鹿だな、まで読んだ。
コピペ君って馬鹿だな、まで読んだ。
Dってまだ生きてたんだ C#があればいらないのにね まったく、無駄なことしてるよな
579 :
デフォルトの名無しさん :2008/03/08(土) 15:03:23
同感 早くバージョンが安定してVSに匹敵するIDEが出たら使ってやってもいいが 何年更新してるんだよ?
まあVSのないC#なんか誰も使わないよな ネイティブコードなんかよりはるかにそっちの方が重要
581 :
デフォルトの名無しさん :2008/03/08(土) 15:27:34
>555です。 しつこいですがリストを使ってもうまくいかなかったので こうしてみました。 ArrayList data = new ArrayList(14); data.Add(new ArrayList()); ((ArrayList)data[0]).Add(new ArrayList()); ((ArrayList)((ArrayList)data[0])[0]).Add(new float[4]); ((ArrayList)((ArrayList)data[0])[0])[0] = 1; MessageBox.Show(((ArrayList)((ArrayList)data[0])[0])[0].ToString()); 後は変数を使ってネストすればいいだけだと思います。 こうすれば何とかなるようです。 しかし、コードが長いのでなんとか短くしたいです。 typedefもないし、usingを使ってもうまくいきませんでした。 ArrayList以外にいい方法があれば教えてください。、 また、もっとコードを短くする方法があれば聞きたいです。
ジェネリックのList<float>を使え
>>581 var farray = new[] {
new List<float[]>{new[]{1f,2f}},
new List<float[]>{new[]{3f},new[]{4f}}
};
List<T>
585 :
デフォルトの名無しさん :2008/03/08(土) 16:05:20
List<float[]>[] data = new List<float[]>[14]; for (int i = 0; i < data.Length; i++) data[i] = new List<float[]>(new float[][] { new float[4] }); C#2.0でもいけるはず
List<float[]>[]とか設計間違ってるとしか思えんw
数値計算ならアリ 業務アプリならナシ
589 :
デフォルトの名無しさん :2008/03/08(土) 19:03:35
>586 ありがとうございます。 その通りのことがしたかったんです。 >587 確かに2次元だけ動的って見たことないので こういう設計でいいのか自信がありません。
>585 2005はだめ。型推論してくれるだけなのでまじめに全部型を書けばいいんだよ。 varってコンパイラが何とかしてコンパイル後は対応した型になってるだけだと思ってる。 2008で.NETFramework2.0をターゲットにしてても普通に使えてるし。
591 :
デフォルトの名無しさん :2008/03/08(土) 21:10:07
>590 C#でメモリ管理にいきなりつまずき困っていたところ 助けていただいてありがとうございます。 またお世話になるかも知れませんのでその時は またお願いします。
>>589 計算なら仕方ない所だと思うぞ。
なんかいい形があるなら俺も知りたい。
float[]のところはインデクサ付けたフィールド4つの型を定義して使うようにすれば 要素数が4のもの以外入れられなくできるしちょっと見通しも良くなるかな パフォーマンスは劣るだろうけど
594 :
デフォルトの名無しさん :2008/03/08(土) 22:20:28
>593 人に見せるならそう書くかも知れませんね。 個人でパフォーマンスをちょっと追求してみたかったので 実験で試そうと思いした。
595 :
デフォルトの名無しさん :2008/03/08(土) 22:20:50
>594 思いました。
実験で試そうと思いしたと思ったわけだな?
ISOイメージファイルの中身をWinRARのように表示するプログラムを作りたいのですが、 中身のフォルダ構造を取得する方法がわかりません。 どのようにしたらフォルダ構造の表示を実現できるのでしょうか? ご教示よろしくお願いします。
iso9660の仕様を探して、それに従ってイメージファイルを解析
599 :
デフォルトの名無しさん :2008/03/09(日) 13:04:14
>596 そう思いした^^
>>598 やはり解析するしかありませんか・・・。
ありがとうございました。地道に解析することにします。
601 :
デフォルトの名無しさん :2008/03/09(日) 13:26:21
解析って、仕様どおりに読み込むだけじゃん。
603 :
デフォルトの名無しさん :2008/03/09(日) 13:44:26
>>602 仕様に基づいて読み込むって、それを解析っていうんでねーの?
仕様を独自に解析するとはだれもいっていないと思うが。
あまり滅茶苦茶な日本語の使い方するなよ。
>仕様に基づいて読み込むって、それを解析っていうんでねーの? 言わないだろ普通
解析ってのは仕様書等がない状況でデータやプログラムそのものを調べることを指すんじゃないのか?
一定間隔でSS取って保存するキャプチャソフト作ってみたんですが CPU使用率が99%になるのは無限ループのせいですか? 一応スリープ入れてるんですが
一定間隔ならループじゃなくてタイマ使え
タイマでもCPU99%になるのは、、
何ミリ秒おきのタイマだ?
設計が悪いだけだろ屑
1000
キャプチャとって保存する部分が糞すぎるんじゃね タイマを10秒おきとか100秒おきでやってもCPU99%になる?
10秒とか100秒ならなりません
615 :
598 :2008/03/09(日) 19:46:53
>>602-606 まさかこういう流れになるとは思わなかった
特に深い意味は無かった
>>597 にはその方が伝わると思った
不用意に誤用したことを、今は反省している
sleepの引数にミリ秒単位じゃなくて秒単位のつもりの値渡してるとか?
普通にSSとって保存する部分が思いだけだろjk
すごい勢いで何百枚もSS保存してそう。同じファイルに
自己解決しました あるアプリケーションのSSを撮ってたんですが そのアプリに問題があったみたいで メモ帳なんかのSSで試してみたら普通にほぼ消費なく出来ました
>そのアプリに問題があったみたいで いやいやいや
そのアプリがメモリを消費してたってことだろ
メモリを消費・・・?
いえ、有るゲームのSS撮るプログラムなんですが プロセスにアクセスしたらなんかCPUを無駄に使うプロテクトみたいなのが有るみたいです
wwwwwwwwww
草生やしてないで人語で喋れよ。 猿じゃあるまい
そんなのねえよw
猿は草を生やせないと思うんだ
何wwwwをwwwwいwwwwまwwwwさwwwらwwwwwwww 2chに何を求めてるんだか
ウキー
ウキー
ウキー
アホかwwwww
否!
こんなんじあC%#のほうが言い悪いか抜きにして初心者用と相談室のスレ2個あるから発展はあるな。VBなんか終わってるかんじ。 みなで盛り上がろうぜって漢字がまたくない
日本語でおk
VIPでやれ ニコ厨氏ね 使い古されたセリフだが、真実である。
ふらっとがあればこのスレも不要だな
コンボボックスに 見た目 値 01:a 1 02:b 2 03:c 3 と入っているときに、 値が2の時に、02:bを選択状態にするにはどうすればいいでしょうか? FindStringで02を指定しても見つからず、combobox.itemsをforeachで 回しても、object型から何にキャストすればよいか分からずでした・・・
Value とかじゃなかったっけ
自分で値入れてるのに何にキャストしていいかわからないってどういうこと?
642 :
639 :2008/03/14(金) 10:08:04
コンボボックスへのデータバインドは、VSのウィザードでTableAdapter任せで作って ロジック部分のデータ操作はコードで書いてました。 型はToStringを試してみて、DataGridViewが入ってるのは分かったんですが・・・ 値が取れません><
>>639 ヒント
enum testEnum { あああ = 1, ししし = 2, つつつ = 3 }
comboBox1.Items.Add(testEnum.あああ);
comboBox1.Items.Add(testEnum.ししし);
comboBox1.Items.Add(testEnum.つつつ);
任意の値に設定するとき
comboBox1.SelectedItem = (testEnum)2;
>>642 デバッガでcomboBox1.Items[0].GetType()を見てみれば?
SelectedValueに2を設定すればOK.
>>645 のやり方でいけました!ありがとうございます
>>643 enum型は一度も使ったことがないので勉強してみます
>>644 GetTypeでは取れませんでしたが、ToStringで取得してみたら
謎ですが
>>639 の型が入ってました
ふらっと池
そのうち、フラットで話すべき話題と、このすれですべき話題をテンプレにでも書いといたほうがいいのかもしれない 「ふらっと」 PictureBoxを透過表示することってできますか? 「このすれ」 ExpressionTree、CodeDOM、DLRのASTでできることはどういう風に違うんですか?
内容よりC#わかってるかどうかだろ
Java上がりでC#やってる人に聞きたいんだけど、 C#やってたら、コード読んで流れ掴むくらいならできそうでしょうか?
意味が分からん
余程の馬鹿でなければ
C#3.0は結構化けるけど
javaの文法知らなくても流れくらい分かるだろ
655 :
デフォルトの名無しさん :2008/03/15(土) 22:51:50
C#2005のメニューから プロジェクト->Windowsフォームの追加で 「MID親」 を選んで、MainでRunしています。 起動時に子フォームを勝手に起動しますがいったい どこでやっているのでしょうか? InitializeComponet()で勝手にShowNewFormを やっているのだとは思いますがどのあたりなのか さっぱり分かりません。 新しく追加で子フォームを作成したら自動でずらす処理も 邪魔なのでどこでやっているのか知りたいです。 ご存じの方、どうか教えてください。 新しく普通にフォームから作ったほうが早いというのは無しで。
656 :
デフォルトの名無しさん :2008/03/15(土) 22:55:48
すいません、起動時に勝手に子フォームが起動するのは、 こちらのミスでした。 勝手にずらす処理をやめさせる方法だけ教えてもらえない でしょうか?
>>650 わからなければjava上がりとはいえない
658 :
デフォルトの名無しさん :2008/03/15(土) 23:50:35
このスレの住人なら知っていますね、あの糞開発ツールのことを ・自分のプログラムのバグなのかコンパイラのバグなのかわからない ・他の仕事に応用できない糞開発ツールの独自世界を必死に学習している ・テキストエディタで書いたほうが効率的なのに糞UIツールを懸命に使っている 糞だけど、政治的な理由で無理やり使わされているんですよね もういい加減、我慢するのはやめませんか? ・糞開発ツールを部下に押し付ける上司の命令は無視しましょう。 上司は糞開発ツールが使われる実績を作ることであの会社のごきげんをとっているのです。 ・あの糞開発ツール提供会社には「おたくの糞開発ツールは話にならない」と突き放しましょう。 バグレポートなどしてはいけません。改善要求などもってのほかです。 あの会社はあなたたちのことをテスター/モルモットとしか思っていません。 ・あの会議で「糞開発ツールを使ったら生産性がxx%アップしました」 なんて話が出たら力強く机を叩き、会議室を出ましょう。 あの人たちは糞開発ツールをマンセーすることで立場を確保しているのです。 糞な開発ツールを糞だと言える、そんな当たり前の環境をみんなの力で取り戻しましょう。
コピペ君って馬鹿だな、まで読んだ。
オーバーフローチェックコンテキスト(checked/unchecked)の状態で 処理を分岐させる方法を知ってる人いたら教えて 検証するタイミングはコンパイル時、実行時のどちらでもおk
例外を捕捉すればいいんじゃないの
それだと、例外が発生しない場合、checkedでオーバーフローがおきてないのか、 単にuncheckedなのか判断できなくね
bool IsChecked { get { try { Convert.ToByte(0xffff); return false; } catch { return true; } } } 馬鹿プロパティw
わざとオーバーフローさせるぐらいしか思いつかんな。
自分でchecked{}で括ってしまえばいい
667 :
661 :2008/03/16(日) 17:17:46
>>662-665 thx!
やはりオーバーフローさせてみるしかないのか
>>666 ILの生成をコンパイラ任せにするならそれでいいが
動的に生成しようとするとOPコード自体が違うので
なんか適切じゃない場所で質問しちゃった気がするのでこっちでも PerlとかRubyでゆーWWW::MechanizeみたいなスクレイパってC#に存在する? それとDB使ったツールを作って配布したいんだけど、PerlとかRubyだと一般ユーザに使ってもらえないので… Rubyで一旦全部書いたんだけどexerbとかrubyscript2exeとか使ってもうまく纏められないのでC#(or その他普通にネイティブコンパイルする言語)で書き直したいんだけど…
泥臭いのに変わりはないが、適当な関数のIL覗けばいいんじゃね?
670 :
661 :2008/03/16(日) 18:22:19
IL見てみたが、コンパイラがコンパイル時に数値式のOPコードを切り替えてるだけで
checked/uncheckedブロック、演算子内に直接書いた式にのみ適用されるみたい
だから、
>>664 みたいなプロパティを作るとコンパイルされた時点で出力が確定してしまう
結論としては、checked/uncheckedはコンパイラに指示するためだけのもので
プログラムで利用しようなどと考えてはいけないということか
そもそもchecked/uncheckedはコンパイル時に静的に決まるものだろ
#if CHECKED なんとか #else ができればいいんだろ
コード中で分岐することに意味があるのはコンパイラのオプションで指定した場合のみってことか checkedのときはプリプロセッサシンボル定義するだけでよくね?
プリプロセッサとchecked/uncheckedの処理段階が違うのは気持ちが悪いけどな
675 :
デフォルトの名無しさん :2008/03/16(日) 19:38:38
印刷を監視して、何かのプログラムで印刷実行されたらジョブをプリンタに投げる前に 自分で作った処理を行って、それが終了してから 印刷ジョブを投げるプログラム作成したいんですけど 印刷監視とジョブ投げるのにwaitかけるのってどうすればいいんですか?
仮想プリンタを作って間に挟むのが まっとうじゃないかな。
677 :
デフォルトの名無しさん :2008/03/16(日) 21:07:31
iPhoneのタイマーみたいな慣性で回るドラムを2個まわして 数値を出力させるにはどう考えたらいい? WM6pro用で教えてください。
そういう風に作る WM6proがどう関係あるんだろう
WebBrowserコントロールの設定は、現在のIEと同じ設定になるっぽいけど、 独立して管理することは可能っすか?
俺なら可能
オマイラってそんなにIL覗いて挙動確認したりしてんの? 俺全然やってないんだが
ILの日本語の資料ってネットで見れるの?
別に日本語である必要性はないと思うのだが
必要性はなくても、日本語の方が望ましい
共通言語基盤の規格はJISにもなってるからネットで読めるんじゃね? 調べたことないけど
IL見るのになぜ日本語が必要になるのやら
日本語を主として使っている民族とっては、ILの説明が日本語でされていた方が他の言語でされているよりも理解しやすいから。
ILは流れを読むのだから英語でいいでしょう
個々のILのニーモニックの説明は英語より日本語の方が日本人には理解しやすいだろう。
ニーモニック(記憶しやすい)を記憶しやすいのは その命名元となった英語という気もする。
記憶する以前に理解するには、日本人にとっては英語よりも日本語の方が理解しやすい。
何この流れ・・・
ニーモニックの説明で日本語お望みなら System.Reflection.Emit.OpCodes あたりでもどうぞ。JIS の CLI は有料でしょ確か
JIS規格はjiscのサイトでみれる
そいや、ILはVSで対応してないのはいいにしてもMSBuildのタスクも ないのはどうよと思ったなあ前
>>683 英語読めないから、日本語のが必要なんです。
ふらっとでレスが付かなかったので、教えてください。 SQLServerからsmallint型のレコードを取得してC#でint型の変数に入れたいのですが キャストで失敗します。smallint型はshortと同じじゃないのでしょうか?
実際shortなんだったら一旦shortにキャストしてからintにキャスト
会社にしか環境が無いので、エラーの詳細記録してなかったのですが、 型変換できませんでした。的なエラーでした。 もちろん(short)してから(int)でいけますが、アップキャストでなぜ失敗するのか・・・が知りたいと思いました
正確な方は SqlInt16、 short へのキャスト演算子の定義はあるけど、int へのキャストは定義されてない とかではなかろうか。
702 :
697 :2008/03/18(火) 00:02:58
>>701 MSDN参照してもよく分からないのですが、おそらくそのように思えますので、
そういうものだと、納得しておきますf^^
703 :
デフォルトの名無しさん :2008/03/18(火) 00:03:27
PrintDocumentクラスのPrintメソッドで 印刷処理を作っています。 しかし、印刷を実行するとVB6やDelphiで作成した 印刷処理よりも異常に遅いのが気になりました。 描画を一切行わず、白紙を1ページ印刷した場合 VB6では一瞬で印刷を開始しますが、C#では5秒以上待たされます。 100ページ以上の印刷を行いたいので、この速度では ちょっと使い物にならないので困っております。 速度改善の情報ありましたら教えていただけませんでしょうか。。
704 :
デフォルトの名無しさん :2008/03/18(火) 00:19:22
突然怪しいURLを貼るなwww
なんじゃこりゃww量すごすぎww
>>703 軽く調べたけど、解決策は見つからなかった。そもそも再現性が(ry
とりあえずプロファイルして何が遅いか見極めてくれ。
708 :
703 :2008/03/18(火) 00:46:13
>>707 ありがとうございます。
プロファイルのやり方がわからないのですが
調べてやってみようと思います。
今、調べられる範囲でわかったことは
プリンタの解像度を下げることである程度
体感速度が速くなる、逆に解像度を上げるとさらに遅くなることです。
ちょっとすみません。mlang.idl を midl しようとしたんですが、途中で midl\oleaut32.dll : error MIDL2020 : error generating type library : SaveAllChanges Failed : .\mlang.tlb (0x80070005) と出て終了します。原因わかるかたいらっしゃいますか?
しまった UAC だー! 自己解決すみませぬ。
すみません。続けてもうひとつ。マーシャリングの質問なのですが、 void DetectInputCodepage( uint dwFlag, uint dwPrefWinCodePage, ref sbyte pSrcStr, // ここと ref int pcSrcSize, ref tagDetectEncodingInfo lpEncoding, // ここに ref int pnScores ); どうやって short[] と tagDetectEncodingInfo[] を突っ込んだらいいのか、だれか教えてください。
>>712 それそのままコピペしてるんだけどね、
ref sbyts[0]
ここで引っかかる。
ん? 通った。なぜだ。
配列そのまま仮引数に定義するのお勧め
ListやStackの中身をusingでdisposeさせるにはどうすればいいの?
継承してIDisposeableを実装すればいいんじゃねえの
ListとIDisposableを継承して、Disposeで要素を全部Disposeするクラスを作る。
using使いたいだけならIEnumerable<T> (where T : IDisposable) をラップするクラスを作って using (DisposableCollection<Bitmap> a = new DisposableCollection<Bitmap>(list))とか
static void Using<T>(T collection, Action<T> action) where T : IEnumerable { try { action(collection); } finally { foreach (var item in collection) { IDisposable disposable = item as IDisposable; if (disposable != null) { disposable.Dispose(); } } } } usingの代わりにこんなの使えばいいんじゃね
どうもやってみます。
.net 3.5(たぶん下位でも発生?) コンソールアプリで sysem.drawing.bitmap をストリームにシリアライズするときに GDI+の一般エラー(General error?)が発生する 同様の現象にブチあたった経験者はおらぬか?
Bitmapはネイティブなオブジェクトがあるからシリアライズ不可能じゃないかな
いや,これまでは出来たんだ きっとこれからも出来ると信じたい そしてなんとなく原因発見 BinaryFormatter bf = new BinaryFormatter(); FileStream fs = new FileStream(@"C:\WINDOWS\迴育栖繧ォ繝?繝?.bmp", FileMode.Open); MemoryStream ms1 = new MemoryStream(), ms2 = new MemoryStream(); Image img = Image.FromStream(fs); bf.Serialize(ms1, img); // 成功(例外なし) fs.Close(); bf.Serialize(ms2, img); // 失敗(ExternalError: GDI+ で汎用エラーが発生しました。) どうもImageの元のリソースが,シリアライズするときに利用できなくなっていると失敗するみたい? なんか非常にモヤっとするなぁ 引き続き情報求む
よくみる where T ってのはLINQってやつかい?
ただのジェネリック引数の制約だよ。
where T つかうと他クラスの継承できなくなる?方法ない?
なにゆってんの?
よく意味が分からんけど where T はTに対して特定の型に依存した操作を可能にするために使うんだよ
where Tを使ったクラスを継承したいなら その制約を継承先のクラスにも付ける class Base<T> where T : string{} class Derived<T> : Base<T> where T : string{}
まったくどうでもいいがstringで制約したらもはやジェネリックの意味なくね?
>>724 Bitmapはそのままだとアンマネージドリソースを含むのでシリアライズできない
だがStreamから作ったBitmapならそれを使ってシリアライズすることで目的を達成できる
しかしそのStreamが閉じてればもうシリアライズできない
>>724 var stream = new FileStream("foo.jpg", FileMode.Open);
var image = Image.FromStream(stream);
image.Save("bar1.png");
stream.Close();
image.Save("bar2.png"); // die
>>732 すごく,わかりました.
>>733 試したためした,そしてその通り
ひとまずbyte[]にシリアル化したものを記憶しておくことにした
クラスのメンバ関数のようなスコープがはっきりしないものをusingで解放するにはどうすればいいの?
メンバ関数じゃなくてインスタンス変数だと仮定して 自分のクラスにIDisposableを実装する usingはそのクラスを外から使う人が使うもの
DictionaryBaseのGeneric版って何?
例外は受け取ったらいけないの?
処理できる例外は捕まえて処理する そうでなければスルー
受け取ってメッセージボックス出して終わるくらいなら 標準の例外ダイアログがましだけどねw
製品にするならそうもいってられないけどな
>>737 無い
KeyedDictionary<TKey, TValue>が使えそうなら使う
使えないなら自分で作る
KeyedCollection<TKey, TItem>の間違い
ListViewの詳細表示で、棒グラフを表示したくて 直接セルに描画していたんですけど、汎用性を持たせたくて Panelに描画してそのPanelを表示したいと思ったんですが ListViewにPanelを挿入する方法が分かりません SubItems.Addで追加できるのは文字列だけですし どのようにすればPanelなどのコントロールをListViewに 挿入することができるでしょうか?
どのようにしてもできまへん。 っていうか、Panelに描画する(そしてそれをListViewに突っ込む)のが 汎用的って発想がよくわからない。 汎用的にしたいのならListViewの項目を描画する機能をクラス化するか、 またはListView自体を継承して拡張するとか、そっちの方向じゃないの?
CodeProjectにそういうのある。 一からListView作ってた。
C#のListViewの使えなさはガチ Swingにも劣るヘボさだからなぁ 項目ごとの文字色を変える程度のことさえ面倒 いったいどういう用途を想定してこんなクソ仕様にしたのか
コモンコントロールそのものだもの
WPFのListViewは何でもありのアホみたいに柔軟なコントロールになってるよ
>>745 やっぱり駄目ですか
でもよく見かけるプログレスバーが表示されたListViewは
どうやって実装してるんでしょう
何か出来る方法がありそうな気もしますが
>>746 一から作るのはちょっと厳しいですね・・・
>>747 >項目ごとの文字色を変える程度のことさえ面倒
簡単だと思うけど…
どうやってやってるの?
>>750 ListViewだとしたらOwnerDrawなんじゃない。
超汎用的なリストコントロール作った。
めんどくさかった(´・ω・`)
でもこれで10万行ぐらいあっても、どんな描画だとしても表示できるようになったお。
俺も752と同意見だったけど、MFC知らないからMFCだともっと楽なのかなあと思って何も言わなかった ListViewItem.UseItemStyleForSubItems ListViewItem.ForeColor ListViewItem.SubItems[index].ForeColor UseItemStyleForSubItems をtrueにすると、 全てのSubItems.ForeColorを設定する必要があったような気がするから それが面倒といえば面倒だったけど。
C#でSafariみたいにきれいに文字を表示するのってどうしたらいいんだしょ。 アンチエイリアスかければきれいになるとですか?
言語とは無関係だと思うけど WPF使えば良いよ
Formでお願いします。
>>752 でもListViewって特定環境で色が消えたりする類のバグが満載だから
そのままでは使い物にならないと思った記憶がある。
そもそもWPFだろうがFormだろうがクラス名だけ置換して同じコード書けば 内部で使うAPIだけひっそり入れ替わるのがクラスライブラリ設計として当然じゃないのか? 何回も作っては捨て繰り返して作った奴は馬鹿なのか?
>>755 フォントをClearTypeが効くものに変えるとか
実際より大きく描画して縮小するとか
すごーく正論では
763 :
デフォルトの名無しさん :2008/03/27(木) 19:06:23
再利用可能なコードなんか幻想だろw
インターフェースがクソだったら書き直すしかないだろ
VB SQL ODBC Direct OLE DB DAO RDO ADO ADO+ WindowsDNA MSDE ADO.NET 1.0 ADO.NET 1.1 ADO.NET 2.0 LINQ
>>750 リストビューの子としてプログレスバー作るとか。
英語だと C sharp って読むの?
yes
VS9.0インスコした人に確認してもらいたい ↓のファイルのコメントが前衛的なことになってるんだけど、どうなってる? C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\ ProjectTemplatesCache\CSharp\Reporting\1041\ReportApplication.zip\Form1.Designer.cs 因みに、手元の環境のエディションはPro.
見たけど特に何も思わなかったが
特にどうということもないな
そんなばすはないだろう。
ローカルのハードディスクにあるファイルをUSBメモリにコピーしておのおののファイルについてGetLastWriteTimeを見ると2秒ほどずれてるんですが、なぜなんでしょう? エクスプローラでファイルのプロパティで更新日時を見てもやはり2秒ほどずれています。おそらく同じ値を見ていると思います。 ローカルからローカルにコピーした場合は発生しません。
NTFSとFATとかじゃね
USBメモリで使ってるFATって更新時間の最小単位が2秒なんだったっけ?
そう。2秒。
778 :
774 :2008/03/31(月) 20:47:38
ローカルはNTFS、USBはFAT32ですが、上に上がってるのでビンゴくさそうすかね・・・
自分で OnPaint メソッドをオーバーライドしたコントロールを作ってるのですが、質問です。 OnPaint メソッドの中で線の太さを指定して引いているのですが、AutoScaleMode でサイズが変わった場合 線の太さはどういう風に決めたら良いと思いますか? 今は決め打ちで 2 にしていますが、線の太さも自動でスケーリングしたいのので 自動スケーリングの倍率を取得する AutoScaleSize みたいなプロパティってないですかね。
>>779 自己レス。解決しました。
AutoScaleMode プロパティが変更されると、ScaleControl メソッドが呼ばれる。
ScaleControl メソッドをオーバーライドすると factor が来るので、これが倍率。
共有メモリの話題になりますが、 MapViewOfFileで得たIntPtrをStreamにアダプトする方法はありませんか? byte*にキャストしてよいみたいですが、そこからが分かりません。
UnmanagedMemoryStream
>>782 これは、これ以外にないといえるようなStreamですね。
明日さっそく試したいと思います。ありがとうございました。
784 :
デフォルトの名無しさん :2008/04/04(金) 10:08:31
質問です。 各テーブルごとにテーブルクラスを作成し、 データの受け渡し受け取りには、テーブルクラス.レコードを定義して使用しています。 各テーブルクラスの違いは、 レコードクラスの違いくらいなので、 (実際には、レコードクラスの違いにより処理内部にも違いは出ているのですが、 ロジックは同じということです。) 同じ処理を書いて、あまりステップ数を膨らませるのは嫌なのですが、 何かよい方法はないでしょうか?
データセットデザイナを使う
DB関連のクラス分けについてなんですけど namespace foo.bar.Data.Modelに AccountModelなど テーブル・ビューの1レコードを表すクラスを定義して namespace foo.bar.Dataに AccountAccessorなど テーブル・ビューごとにSelectやUpdateを行うクラスを定義して namespace foo.bar.Accountに Accountなど ビジネスロジックとしての役割のクラスを定義して この中からAccountAccessorを使用してModelオブジェクトを 取得したり登録したりしています。 このビジネスロジックが「データベースについて知っていなければならない」という のが違和感があったりしてます。 みなさんなら中間に別の役割のクラスを作ったりしていますか? と、ここまでかいてC#の質問じゃないことに気付いた・・・よかったら教えてください。
railsを発端にして、最近はModelにfindXXXX()とか作って中でDBアクセスがスマートかも。 結局ほとんどの場合Modelとテーブルは一対一だからね。
すみません、質問させてください。 C#(3.5)でWindows Mobile向けアプリを作成していて、リフレクションで 自作したクラスのインスタンスを生成しようとしています。 Type.GetType(クラス名)でクラスを取得しようとしたらnullが戻るので、 AppDomain.CurrentDomain.GetAssemblies()で取得したアセンブリから GetTypeでクラスを取得しようとしたら、.NET Compact Frameworkには GetAssemblies()がありませんでした。 .NET Compact Frameworkでリフレクションを使って自作クラスをリフレクションで 生成するにはどのようなコードを書いたら良いのでしょうか?
GetAssemblies使えるってことはLoad済みなんだろ? Load時にAssemblyオブジェクトが手に入ってるじゃん。
792 :
790 :2008/04/08(火) 17:20:07
>GetAssemblies使えるってことはLoad済みなんだろ? AppDomain#GetAssemlies()メソッド自体が存在しないんで使えないんですが (何か勘違いしてたらすみません)、Assemby#Loadで直接アセンブリを ロードして、そこからGetTypeでクラスを取得するようにしたらうまく行きました。 JavaのClass#forNameみたいにクラスパス全部からクラスを引っ張ってきて くれる訳じゃないんで難しいですね・・・
793 :
げげ :2008/04/11(金) 18:11:02
皆さんの状況を教えてください。 VS2005 C# を Virtual PC 2007 上の WindowXP で動かしています。 float f = 426; int d = (int)f / 63; 以下のコードを実行すると、d が 0 になるんですが、 皆さんはどうなりますか? 会社のマシンでは4台中3台が0なるという奇妙な状況です
>>793 426 と間違えて 42.6 になってるとか?
再現可能なコードをポストしないのは何をかいわんや、だろw
796 :
げげ :2008/04/11(金) 20:45:53
レスありがとうございます。
>>794 426 です。
>>795 再現するコードが上記のコードなんですよ
私自信が信じられないので、お伺いしたのですが、
一応前ソースコードを以下に書きます。
namespace casttest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
float f = 426;
int d = ((int)f) / 63;
d = Convert.ToInt32(f) / 63; << こっちはオッケー
}
}
}
>>796 using System;
class Hoge{
static void Main(){
float f = 426;
int d = (int)f / 63;
Console.WriteLine(d);
}
}
=> 6
試してみたがちゃんと計算されるぞ
アホか。 「再現するコード」といっている。 お前さんそのコードのdの値をどうやって見ろっての。 ひょっとしてデバッガで巣頓狂なところで止めてそういう寝ぼけたこと言ってるんじゃないの?
799 :
げげ :2008/04/11(金) 21:32:29
レスありがとうございます。
>>798 ヒントをありがとうございます。
MessageBox を追加した以下のコードで不思議なことが起こりました
−−−−−
float f = 426;
int d = (int)f / 63;
MessageBox.Show(d.ToString());
−−−−−
MessageBox のところで、Break すると、値が0になり、
メッセージボックスに0と出ます。
一方 Break しないと、6とでました。
デバッグ中の値のチェックの際に発生した事象だったので
ツールチップの値が6なのに、ステップ実行したら0が
格納されて進んでいたので、おかしいなと思って質問
したのでした・・・。
C# でブレークをかけた場合に、このような現象になるのは
仕様なんでしょうかね・・・
仮想PCに問題があるように思う。
コンパイラかJITが最適化してるんじゃね? たとえばその変数 d をその行以降使ってない(スコープ内に出てこない)とか?
d.ToStringで使ってるだろ
box化?
ここ2週間ほど地味にさわってるけど、やっとC#に慣れてきたわ。 慣れてくると便利なもんだな。でもキーボードショートカットが 使いにくい。いまだに補完でCtrl-Pとか押しちゃう!
好きなように変更すればいいじゃん
またまたご冗談を
俺とお前の脳がbreakしてるだけじゃね?
>>759 少しでもダメな仕様だと思うなら、修正すべきだよ
ほっておいたまま拡張を続けるとMFCやらATLみたいになってしまうぞ
負の遺産こそが最大の敵だ
コピペ君って馬鹿だな、まで読んだ。
Magic dockingって商用もフリー?
ライセンス関係はこういうとこで聞かれても困る
813 :
デフォルトの名無しさん :2008/04/15(火) 11:51:32
ファイルの読み込みに関して質問させてください。 C#ってC++みたいに int n Stream >> n って感じでintを読み込めないんですか? わざわざ↓の様に string line = r.ReadLine() int n = System.Convert.ToInt32(line); 自分で型変換を書かないといけないのでしょうか?
binaryReaderでできるし。
StreamReader 使うってことは数字文字列が書かれてるのか?
>>814-815 いえ、ありがとうございます
BinaryReaderを使ってできました。
>>813 BinaryReader に加えて補足。
その >> 演算子の使い方は、演算子オーバーロードの乱用・悪用と言われてる。
作った当時は斬新でかっこよく見えたけど、
今となっては read_line の方がよかったと。
なので、C# ではそんなやり方しない。
あと、入力書式に凝らないといけないときには、
C++でも結局>>なんて使わず、
1行丸ごと文字列として読んで、正規表現とか自前のパーサとかで解析する罠。
だから、C#で
>>813 のような場合で
ReadLineくらいしか無いのも、俺は別に不便とは思わない。
819 :
デフォルトの名無しさん :2008/04/16(水) 14:07:00
フォームに実装されているAutoScrollのような事を、自前でやりたいのですが、 フォームのクライアント領域を、同じフォームのクライアント領域にずらして描画するには どうやったらよいのでしょうか? DrawImageなどのメソッドは見つかるのですが、Graphics同士を描画するメソッドなどはないのでしょうかね。
日記なら余所でどうぞ
>>819 何がしたいのかがいまいち分かりにくい
せめて、ゴールとアプローチくらいは分けてくれ
(単に分けて書くのではなく、分けて考える)
よく分からなければ、代替可能かどうか考えてみるといい
ゴール = 代替不可能
アプローチ = 代替可能
>>819 言いたいことはだいたい分かるからいいけど。
GDIでやるならPanelを1つかませばいい。
無限ページのスクロールとかはそれでやった。
823 :
819 :2008/04/16(水) 19:14:17
説明がわかり難かったみたいですね、すみません。 1からテキストエディタを作っていて、クライアント領域に描画してあるテキストを、 スクロールバーを用いてスクロールする処理を行いたいのですが、 その際に既に描画してある領域をずらいたいんです。 C++なら hdc = GetDC(hWnd); BitBlt(hdc, 0, -1, width, height, hdc, 0, 0, SRCCOPY); ReleaseDC(hdc, hWnd); こんな感じになると思うのですが、これと同様に、クライアント領域の描画コンテキスト同士で 描画をする方法がわからず、質問した次第です。
GDI+には描画コンテキストのビットマップを取得するメソッドが用意されてないんだよねなぜか。 面倒だけどWin32のBitBlt使うしかないと思う。 でもBitBlt使うとなんか画面の色数が16bitになっていると ちょっと描画が変になる問題が発生するような記憶があるけど。
823のやりたいことがサッパリ分らないw
C#にはそんなものないが結論では? 蛇足だけど、C++ (Windows API)ではScrollWindowExのほうが普通だと思う。
スクロールバーを実装するのってわりと難しいってはなし?
まぁその用途なら任意の大きさのクライアント領域を Panelでホストすれば良いでっしゃろ。
>>823 そういう事せずに、毎回テキスト書き直すほうがいい
830 :
823 :2008/04/17(木) 05:51:23
>>824 >GDI+には描画コンテキストのビットマップを取得するメソッドが用意されてないんだよねなぜか。
やっぱりそうなんですか。
Formに実装されているAutoScroll(自動でスクロールバーを出し、スクロールのサポートを行う)も、
>>823 と同様な事を行い、スクロールによって現れる新しい行は無効領域に設定して、
ユーザにOnPaintで処理してもらうような感じだと思ったので、比較的簡単に出来ると思ったんですが、
実際のスクロール処理はBitBltなどを呼び出してるのでしょうね。
>>826 >C#にはそんなものないが結論では?
そんな感じですね。Win32APIでの実装を考えてみます。
ScrollWindowExなんてAPIがあったんですね。
参考にさせてもらいます。
>>827 スクロールバーを表示して、クライアント領域を自前でスクロールさせる話です。
831 :
823 :2008/04/17(木) 06:01:01
>>828 Panelに描画してもらって、Panel自体を移動するって事ですか?
>>829 全部書き直す方が実装は楽ですけどね・・・。
実際、世に出回ってるテキストエディタが全部書き直してると思えないんですが、
どうなんですかね。
サクラエディタなどのソースを公開しているものを見て検討してみます。
Formのクライアント領域より大きいPanel載せるだけ
Win32でもそんな実装しないからな。
テキストが長くなったら無限にPanelが大きくなるのか? それはないだろう
ダブルバッファかその都度描画だろう。あとは要件次第。
その都度描画する以外ないと思うがなあ 無限にでかくなるビットマップなんてぞっとする
4年ぐらい前の話だが、 その都度描画では微妙にスクロールの操作性が悪かったので ScrollWindowExを使って改善させたことがある 今のPC性能なら必要ないかもしれないね
838 :
823 :2008/04/17(木) 18:45:00
Panelを使う方法は限られた行数なら簡単でいいと思うんですが、
10万行とか行数が多い場合に、ちょっとぞっとしますね。
ゆくゆくは構文の強調表示や画像なども貼り付けられるようにしたいので、
その都度、全部描画するのはパフォーマンス的に疑問が残ります。
そう考えると、
>>835 氏のダブルバッファを使う方法はなかなかいいかと思いました。
ScrollWindowExでクライアント領域をスクロールする場合と、裏画面からクライアント領域に、
画像を描画するのはコスト的にも同等かなと思うし。
OnPaintで無効領域の描画をする場合でも、裏画面から該当箇所を描画するだけで済みそうです。
>>838 パフォーマンスが問題であるなら、今ならWPFがお勧め。
まだ自分も十分に使い込んでいないけれども、ものすごくパフォーマンスが高いうえに
Paintイベント処理といった概念がないのですっきりする。
ドキュメントがろくすっぽ揃っていないのがちょっと辛いけど・・・
自分は、これで巨大なグラフを描画している。
ホストコントロールでビットマップも簡単に作れるので印刷も簡単。
ちなみにパフォーマンスは画面の100倍ぐらいの図形要素をセットして、全部描画した状態で平気でなめらかなスクロールをします。 描画要素のセットアップで余計な時間を取られるので、無節操に大きいのは都合悪いですけど、一旦セットアップが終わった後の描画は圧巻です。
WPFの移行するときって既存の大量のコードはどうなるの? 移植作業とか必要?
移植ならあるていど覚悟しておいたほうがいいです、全然描画のアーキテクチャが違いますので。 ただし移植後のコードは非常にシンプルになります。
FormとWPFは全く互換性ないな
スクロールどころかグルグル回転とかも平気だしね。
845 :
832 :2008/04/17(木) 20:15:03
勘違いしてるやつが多いみたいだから補足。 まず、Panelはビットマップ/バッファを持っていない。 つまり、メモリサイズは、Panelサイズに比例しない。 それどころか、メモリサイズは、Panelサイズに依らない。 (Panelサイズを大きくしてもメモリ増加はほぼ0) 次に、描画は基本的に、 PanelのOnPaintメソッドかPaintイベントで *全部* 再描画する。 e.Graphicsを使えば描画領域は既に設定されているので、 描画しなくてよい部分に対する描画処理は無視される。 (メソッド呼び出しのオーバヘッドは有る) また、スクロールされたときは、 Form(ScrollableControl)が勝手に転送してくれる。 (多分、内部でBitBlt呼んでるものと思われる) 余談 PanelじゃなくてControlでもいいけどツールボックスに無いので。 描画部分をカスタムコントロールにするのが良い方法だと思う。
846 :
822 :2008/04/17(木) 20:58:28
だからオレは無限スクロールをPanelで既にやってると
言おうとして
>>845 が全部言ってくれた件。
>>838 > ScrollWindowExでクライアント領域をスクロールする場合と、裏画面からクライアント領域に、
> 画像を描画するのはコスト的にも同等かなと思うし。
Vistaより前のOSだと
裏画面からウィンドウへの画像転送は
ScrollWindowExやBitBltによるウィンドウからウィンドウへの画像転送に比べ、
非常に遅くなったりするよ。
場合によっては、全画面再描画と変わらないくらいに。
これからWPFだよ、GPU内で完結する描画のパフォーマンスにはどんな方法も太刀打ちでいないって
それゆえの欠点もあるけどね ・複雑なUIでも重くなりにくいが、シンプルなUIでも軽くならない ・GPUがしょぼいと性能低下 ・図形のセットアップにコストがかかる (ただし、Freezableオブジェクトなら別スレッドで初期化できるので、工夫すれば高層化できる) ただ、WinFromsと違って、WindowsAPIの制限をそのまま受け継ぎましたって感じの へんな制限も無いので、慣れると使いやすい事は確か
850 :
819 :2008/04/17(木) 21:58:21
みなさん色々なアドバイスありがとうございます。 ところで、今現在リリースされているテキストエディタで、特に描画周りで「重い」と感じる事はありますか? 自分は昔からテキストエディタで重いと感じる事は無かったのですが、 それらのエディタでPanelを使用していたり、WPFを使用している訳ではないですよね。 旧来からの手法で軽く動作させる方法があると思うのですが、 そのような手法を模索しています。 WPFは興味ありますが、機種依存の問題や.net framework 3.0以上が必要と、 テキストエディタにはユーザに要求する仕様が高すぎるかな、と思いました。 やはり、既に描画済みの部分は「ずらすだけ」で新たな部分のみを描画する、 又は、ダブルバッファなどの手法が妥当だと思いますが、どうでしょうか?
つかGDI+使ってるテキストエディタってあるのか?
852 :
819 :2008/04/17(木) 22:17:32
Paneについてですが、 Panel.Textにテキストを設定すると、テキストのコピーがPanel内に保持されると思うので、 その分のメモリは消費しますよね。 内部で保持しているテキストはPeaceTableなどの形式で保持している(したい)ので、 Panelに設定したテキストは表示専用のメモリとして余分に掛かってしまいます。 また、キャレットや選択範囲の描画などを行う場合、 OnPaintなどのタイミングで自前で描画する必要があるので、 そこらへんも適応するかどうか疑問ではあります。
853 :
819 :2008/04/17(木) 22:21:15
>>851 たぶん、あまりないでしょうね・・・。
自分はC++の方が長いので、C++&Win32APIで実装した方が楽かと思いますが、
これからの将来性や移植性をなどを考え、C#で実装したいなと思ってます。
GDI+に将来性移植性?
855 :
819 :2008/04/17(木) 22:24:46
>>852 ×PeaceTable
○PieceTable
駄目だこりゃ。予想以上の初心者だったか。 >Panel.Textにテキストを設定すると 誰もPanel自体にテキスト表示させろなんて言ってないよ。 世のテキストエディタはWindowsのエディットコントロールなんて使わずに 頭を悩ませながら自前でテキストバッファを管理しつつ、文字を表示する位置も自分で計算してるの。 ちなみにPanel.Textは無効なプロパティね。反論だけはする癖に一行もコード書いてないでしょ?
>>839 この間、WPFでEllipseGepmetoryを一万個ランダムで作ってDrawBrushに渡して描画するのと、FormsでOnPaintで一万個描画するのを試してFormsのほうが二倍ぐらい速かったんだが、Geometory系はあまりGPUの恩恵を受けられないのかね?
WPFだとこういう風にした方がアーキテクチャ上の恩恵を受けやすいというのがあれば是非お願いします。
858 :
819 :2008/04/17(木) 23:00:53
>>856 ええ、C#は触り始めたばかりです。
>頭を悩ませながら自前でテキストバッファを管理しつつ、文字を表示する位置も自分で計算してるの。
そういう方向で実装しています。
だからこそ、既に描画済みの領域をずらす方法などを質問している訳です。
Panelに関しては憶測で書いていたので、不適切だったかと思います。
delphiもやるので、Panel.Captionのような所にテキストを設定するのかと思ってました。
>>857 WPFのOnRenderはOnPaintとは違って,描画してもらうものを登録する場所だろ
素直にコントロール使って描画した方が速い
Geometryの作成にかかる時間も勘定に入れてるんだったら
Geometryは描画リソースなんだから毎回作ったら遅くなるのは当たり前じゃね
>>857 ローレベルがDirectXであるという点について考察を入れてみれば高速な方法は見えるよ。
一般にGPU⇔CPU間の速度が非常に低速、描画リストを作って位置の移動・変型といった使い方が有利。
描画内容を毎回メインメモリーからGPUに送りつけるようなコードをさければいい。
861 :
857 :2008/04/18(金) 00:37:52
>>859 Geometryは初期化時に生成してDrawBrushにしてFillに渡して後は勝手に描画してもらうようにしていました。
こうすることは、描画してもらうものを登録することにはならないんですかね?
WPFEssenntialにGeometoryが一番プリミティブで軽いと書かれていたので試してみたんですが・・・
Shapeなどはまだ試してません。
>>860 DirectXはちらっとしかさわってないのですが、そのときはおおざっぱにポリゴンやテクスチャをGPU?に渡して後は任せるぐらいにしか理解していません。
DrawGeometoryなどは描画ツリーにセットしておいて必要に応じて移動・変形するといったものにはあたらないんでしょうか。
>描画ツリーにセットしておいて必要に応じて移動・変形するといったものにはあたらないんでしょうか。 それでいいよ、変形情報だけならサイズはしれているから。 頂点を毎回CPUで作って、毎回一万もGPUに送るとそれだけで帯域全部食らいつくしてしまいます。 CPUに対してメモリーやPCIインターフェイスの速度は超低速です、いまやCPUが数ギガヘルツの時代になっても十年前からほとんど速度向上していません。
863 :
857 :2008/04/18(金) 00:55:59
EllipseGeometryを最初に一万個生成しての描画で、1000×800ぐらいになるようにサイズ変更した時に全て描画終わるまでに3,4秒ほどかかってますがこんなものでしょうか? 環境はVista、T9300 、オンボードグラフィック(フリップ3Dは楽に動くぐらい)、4Gメモリです。
自分も試してみた、最新ミドルレンジクラスのグラボでGeFoce9600GT ただのEllipseでチョイ書きしてみた 1000×800 一万個で、拡大縮小、0.2フレーム程度 Ellipseは一つ頭でも結構情報量大きいね 100 ポリゴン以上はありそうな感じだ。 しかも2Dのデザイン重視描画だし、アンチエィリアスとかも細かいし。 全部で10000x100 = 100万ポリゴンなら、まぁこんな物かな。
間違い 0.2フレーム程度 → 0.2秒間隔程度で更新
具ラボ切り替えて GeForce 8400M GS 64MBで試してみた。ちなみに切り替え前はIntel GMA X3100 0MB。 切り替えたら同じように0.2〜3秒で更新するようになったw サーセン。 でも同じようなものをFillEllipse,DrawEllipseでFormで描画してみたら、やはりFormのほうが早そうだ。 ものにもよると思うけれど、コントロールの組み合わせじゃないもの、たとえばエクセルのようなグラフ(それの複雑なもの)を書くとしたら、 GDI+でビットマップに描画してそれをWPFでレンダリングするような形にしたほうが早くなったりもするのだろうか?実装の手間とかエレガントさは除いたとして。
>>866 >でも同じようなものをFillEllipse,DrawEllipseでFormで描画してみたら、やはりFormのほうが早そうだ。
そうですか、こっちは、Formで描画したら更新に4秒以上かかってます。
あとPaintを使って重い描画すると、その間Windowsが固まって反応しなくなってしまうのが嫌ですね。
コードの問題なんじゃね?
870 :
857 :2008/04/18(金) 09:19:36
Formのほうは正確にはOnPaintで描画するのではなくBufferedGraphicsに描いてから転送してます。 具ラボ切り替える前、WPFで描画に3,4秒架かってたときはサイズ変更時に固まるような感じでしたね。 自分の書き方だとWPFに余計な負荷かけてるのかもしれません。後でできればコードアップしてみます。 WPFはなにぶん初心者なのでたぶんもっといい書き方ありそうな。
StreamGeometry使ったら速くなるかも
お尻まで入ると頭に戻る配列はどうするの?
自分でIList<T>実装して作りましょう
>>872 Queue のこと?
それか、ある配列を与えて、それを永久ループさせるようなものってこと?
前者なら System.Collections.Generic.Queue
後者なら、
>>873 あるいは、
IEnumerable<T> Loop(IEnumerable<T> e)
{
for(;;) foreach(var x in e) yield return x;
}
リンゴバッファじゃね
>>869 マルチスレッド非対応のWin32APIだから、その上に乗っているFormも当然非対応になっている
だから WM_PAINT とその他イベント処理を並列化することは叶わないよ。
APIを直接使うなら動作するけれど、当然その結果は保証されない。
.NET では 2.0 以降やったらアサートがかかるようになった。
このあたりの問題もWPFではいろいろ考えられていて便利になっている。
この問題を解決するとするなら細切れにして描画などというトチ狂ったようなコードが必要になる。
一般的なフォームアプリを作っていますが、VISTAでは使えない(使うべきでない)メソッドとかってありますかね? 動かないと報告が出てもVISTA環境がないのでさっぱり原因が分からないのです。
ファイルパスとかじゃね。
>>874 ちょっ、そのコード、ちょっと衝撃だ(笑)
叶うならラムダで書きたいね
[DefaultValue(...)] を使って System.Font 型にデフォルト値を与えるには どうすればいいかわかる人います?
>>879 クロージャ内で yield 書けないのは、MS 的にも失敗だったと思ってるらしいんで、
ひょっとすると将来的に書けるようになるかもね。
あと、個人的には、foreach(var x in e) yield return x; の部分を、
○○ e; だけで同様の結果が得られるような構文糖衣欲しいんだけど。
イテレータをマイクロスレッド的に使うときに、そういう構文がすごく欲しい。
>>880 ShouldSerialize[Property]使う。
>>881 yield foreach e; とか?まあイテレータは何か「中の人」向け機能
なんでシュガーなだけの機能入れるのはどうだろう?
>>883 そうそう、そんなの<yield foreach。
俺は yield expand とかを思い浮かべてたけど、
yield foreach ならキーワード増えないのもいいかもね。
881 でも書いてるけど、スクリプト言語の fiber/microthread 的な使い方しようと思うと、
案外、その構文欲しいのよ。
「a, b, c の後に N 個 null を返す」とかを、
yield return a;
yield return b;
yield return c;
yield Repeat(null, N);
みたいに書きたい。
885 :
880 :2008/04/18(金) 16:52:53
サンクス、GotDotNetで、もっと手っ取り早い方法も見つけたので紹介しておきます。 [DefaultValue(typeof(Font), "フォントプロパティーの値")] これでいいみたいです。 >for(;;) foreach(var x in e) yield return x; yieldを使い元データを作って、LINQでそれを加工して出力というある種のパターンが見えてきます なんというか、IEnumerable,yield に始まってLINQで終わるというか、強烈に爽快なコードですね。 自分は全然使い込み不足だ、やりこまないといけないです
C#に後から追加された機能は、どうも一貫性がないというか、 妙な制限が多い気がするな クロージャ内でのyieldもそうだが、 インナークラスで拡張メソッドが定義できないのもどうかと思う 拡張メソッドは利用可能範囲を最小限に抑えたい機能の代表格なのに、 インナークラスで使えないが故にそれができない
どこかのタイミングでガッツリ整理してメジャーバージョンアップして欲しいですね Javaコピーだったのが、ここに来てやっとC#らしさというのが出てきたという感じですし。
拡張メソッドを使いまくりたいという欲望を抑えるためにやってるんだろ
自分も拡張メソッドに関してはちと反対なんだよな 逆にメソッドも namespace が欲しい、インテリセンスが効率よく使えるためには 名前一覧で出てくるメソッドの数は少ないほうがいいので。 もし拡張メソッドをするなら seq.Sum() ; ではなく seq.extensions.Sum() ; のような感じになってくれた方が有難い、単に便利文法を考えるのではなくてIDEがある前提での高機能化を目指してほしい
>>889 それは感じるが、むしろ IDE 側で特定のキーバインドで
拡張メソッドの表示をトグルできたらと思ってる
つか、拡張メソッドのツールチップに「拡張子」って出るのは どういうローカライズチームだよ
>>879 ファイルパスって具体的にどの事ですか?
getcurrentdirectory()から下の階層しか使ってないんですけども
VISTAはセキュリティー周りが強化されているから、それを調べてみるといい たとえば、"Program Files" 以下は、ユーザーから操作できない、手抜きをしてここにデータを置いたりすると問題が起こる。 Windows に標準的な作り方をしているなら問題は起こらないはず。
XPで作るなら、User権限のアカウントを作って、それで動くかどうか試せば Vistaでもトラブルは少ないかと思われ
static class IntExtention { public static int Sum( this int obj , int value ) { return obj + value; } public static int Sum( int val1 , int val2 ) { return val1 + val2; } } 拡張メソッドって、こういうオーバーロードは無理なのな。(全く意味無いけどw) thisがついていても、普通に呼べると。
>>881 それだったら return e;でコンパイル通るだろ。
>>886 拡張メソッドの目的は名目上「変更できない既存の型にメソッドを追加すること」だから
その意味では内部クラスに使うのはおかしいんだろう
>>897 ×内部クラスに使う
○内部クラスで既存の型にメソッドを追加する定義をする
>>896 よく見て。
yield return a; return e; (yield return と return の混在)
はできないよ。
やりたいのは、IEnumerable の中身の展開。
yield e1; yield e2; で、return Concatenate(e1, e2); 相当の結果を得たい。
シンタックスシュガー的なメソッド、たとえば複数の関連するプロパティをまとめてセットするようなものは、あまりもとのクラスにつけたしたくないため拡張メソッドにすることあるなぁ。 usingでうまく使い分ければいいんだろうけれど、複数人での開発時は規約を決めないと後で困りそう。 でも自分は拡張メソッド大好き。
というか色々厳しいにしろインターフェイスに足せるのがやっぱり 拡張メソッドは良かろうみたいな
>>901 素直にインターフェイスのアダプタとして設計して欲しいな
使う場所でいろいろ使いたいアダプタは変わるわけで、using とか勘弁って感じ。
それにしても、yield を考えたやつは天才だと思うわ。
yield の核心部分は、プログラムによるデータの定義だと思う データ構造にはシーケンス以外にも、ツリー、双方向リストその他色々あるので考えていけばまだまだ広がりそうな気がするよ。 次の要素を拾うときに引数を利用するだけでも激変すると思う、これだけなら実際には今でもできるんだけどね、やるとちょっとキモイので。
やっぱり、delegateのなかでyieldが使えないのが困るなぁ・・・ それ使えればかなりすっきりするのかけるのに。
yieldとか多用すんなって 普通に書こうや
コード規約でyield禁止とか言われたら会社辞めるわ
普通にプログラムかいててyieldが必要になることなんてほとんどないだろ 普通のプログラムにyieldがしょっちゅう出てくるとしたらなんかの病気だよ
そりゃ
>>874 のコードは頻繁に必要になるものではないけど。
コレクションとかLINQ周りのコード書いてると普通に必要だろ、yield。
普通普通ってなんの根拠も示さず喚かれてもねぇ。 例えばyieldの無いC++/CLIでシステム情報のコレクションを書くたびに泣きたくなるぞ俺は。
Queueに入る個数を決め打ちして溢れたら一番最初のを消せますか?
IEnumerable<T>を自作する時にはyieldはいいものだが IEnumerable<T>を自作することがほとんどないだろ yield return a; yield return b; なんてのは new[]{ a, b } で事足りる
DrawListViewSubItemEventArgs.DrawTextが激しく使えないんだが。 仮想モードだからかもしれないけどフォントが違うし 描画位置をピクセル単位で微調整せず、無条件で最初に空白を表示するから DrawDefaultをtrueにした行と同じにならない。 結局自前で全部描画した。
そっか。
>>912 そうかッ! どんだけの量が返されるかわからないデータベースからのフェッチも
あらかじめ馬鹿デカイ配列として保持しておけばIEnumeratorを実装する必要なんて無いのかッ
お前チョー頭良いなッ
お前の頭が悪いだけ
LINQのおかげでyieldの出番は減ったが、yieldの有用度は逆に増えたな
毎日一回はたぶんyield書いてますが何か?LINQみたいにIEnumerableに対しての制御構造化至りとかいろいろ使い道あろうが。
そもそもなんでもLINQで書こうとすること自体が頭悪いな
>>902 誰でも考えるけどお固い言語では今まで怖くてやらなかっただけ
実装するという決断が評価される
最初の考案者が、ということでは
処理の流れを根本から変えるからな ラムダ式やLINQなんかとは比べ物にならないようなとんでもない決断
yield 反対者は、たとえばツリー構造の全子要素列挙とかどうするんだろうな、 かなり頭の悪いコードを書くに違いないと容易に予想にできるが・・・
たとえば単純なコンテナであっても読み出し方は前から順以外にもいろいろな読み方が要求される このときあり物のアルゴリズムが使えない時新規にどうする? 手動で全部実装か?それとも新規配列を馬鹿みたいに作成して新たなコンテナでも作るか? 馬鹿馬鹿しすぎるよ
>>920 そんな単純な話じゃないと思うよ、常識的にスタックは一本あればサブルーチン(=メソッド)を実装できるが
yieldをもつと、スタックがツリー構造の様相になるから、わずかな機能追加しかないコード見てくれとは裏腹に内部構造は激変しているハズ
C#のyieldは途中の状態を保持したクラスを自動的に作ってくれるだけだぜ
>>927 スタックがツリー?
俺とは脳内イメージがかなり違うようだな。
俺にとってはyieldは関数風の書き方でIEnumerableを実装できる糖衣構文に過ぎん。
ローカル変数がメンバフィールドに置き換わるって所は、目から鱗が落ちたがな。
>>927 逆コンパイルして見てみたらいいよ
すっごく単純なcscのトリック
>>929 ちょっと違う話だが、照りゲートも内部暮らすとして実装されてるせいで、デバッグのときに見れるローカル変数とそうでないのがあるときには何でだろうと思ふ(´・ω・`)
別にyieldに反対なわけじゃない GetEnumeratorを実装したけりゃyieldすればいい しかしyieldはそうしょっちゅうでてくるもんでもないし たいして重要な機能でもない yieldを中心にすえてLINQでなんでもかんでも処理しようというような考え方は まずいだろうと思っている
知っていればすごく便利な時がある。 知らない人はいつまでもどんくさい書き方をする。 別にyieldに限ったことではないではないか。
>>931 匿名デリゲート/ラムダ式の話しか?
具体的なコード書けば、誰かに何か教えてもらえるかもしれない
LINQ はデータ操作における、ある種のデザインパターンだから、知らないと放置するのは良くない 学校でもちゃんと教えるべき、知らない人は勉強するべきだ。 大事な事は LINQ の書き方ではなくデータ操作におけるコードのパターンだ。
>>934 んだ。
あれ確か、ラムダ式の中で使ってるローカル変数は見れたけど使ってない者はウオッチ出来ないよね?
LINQのかき方(とか.Whereをつなげてく書き方)のほうがきれいにかけるけれど、実行速度遅そうというか遅いんだよね
「インデクサで要素を取得できる」だけのインターフェイスが欲しい やっぱりデリゲートかなあ
配列がデフォルトで書き換え可能である必要なんかないよな
>>929 Win32ならファイバ、一般的にはマイクロスレッド、コルーチンあたり
の単語使うものが根底にあるから調べてみれ。中断とスタック保存が基本。
しかしC#のyieldは列挙に特化してるので直接的では確かにない。
そのようにも使えるけど。この辺考慮するとC#のyieldは再帰やツリーの
ならしには確かに向いてる。foreachのDispose機能もあるしな(IEnumerator<T>の
この仕様はスバラシス)。
>マイクロスレッド yield はマイクロスレッドに対応し始めたらパフォーマンス方面についてもかなり期待できる物になるかもしれんね 今後CPU並列化とともに期待できる機能になると思う、ただしその前に少し再検討してほしい内容もちらほらあるけど。 これ以外にも今回のVisualStudio2008で強化された機能には、WPFといいマルチコア時代につながる技術が盛り沢山なので割と楽しい。
おっと yield は2.0で実装だったな、でもLINQで初めての本格活用なんで3.0が実質本番だな。
>>938 前に俺が書いたIList,IDictionary用のラッパーインデクサ
ふらっとの方に貼ったけど、dat落ちしてるみたいなのでもう一度
public static class Indexer {
public static DictionaryIndexer<TKey, TValue> GetIndexer<TKey, TValue>(this IDictionary<TKey, TValue> dict) { return new DictionaryIndexer<TKey, TValue>(dict); }
public static ListIndexer<T> GetIndexer<T>(this IList<T> list) { return new ListIndexer<T>(list); }
}
public sealed class DictionaryIndexer<TKey, TValue> {
private IDictionary<TKey, TValue> dict;
internal DictionaryIndexer(IDictionary<TKey, TValue> dict) { this.dict = dict; }
public TValue this[TKey key] { get { return dict[key]; } set { dict[key] = value; } }
}
public sealed class ListIndexer<T> {
private IList<T> list;
internal ListIndexer(IList<T> list) { this.list = list; }
public T this[int index] { get { return list[index]; } set { list[index] = value; } }
}
普通のインデクサにはsetがあるからイカン
制限したいわけじゃなくて, void Hoge(IIndexer<int, string> a) { Console.WriteLine(a[0]); } みたいに統一したインターフェイスで扱いたいんだよね void Hoge(Func<int, string> a) { Console.WriteLine(a(0)); } //Hoge(i => array[i]); まあこれからはこういうのが主流になるんだろうけど
yield反対な訳じゃない、ただ・・・豚に真珠だと思うんだ。
>>937 そう思うのは多分スケーラビリティが見えてない。LINQ to SQL が
片鱗を見せているけれど。対象がギガだろうがテラだろうが同じ
構文でクエれるのが LINQ のいいところ。
自分が豚だからってそんなに真珠を嫌わなくても。
>>948 PallrelLINQ(スペル自信なし)はいいと思うんだけど、普通のオブジェクトLINQとかの話。
>>950 マルチスレッドの向上率なんて現状知れてる。
まあそれは別としてパフォーマンスがそこで問題になるほどなら、インメモリな
Queryable つくってみりゃいい。そこでだけ Unsafe コードっつーのもOKやしな。
だれかつくんねーかな
>>951 一度マルチスレッド対応したコードを作ってみるといい
それなりに負荷のあるコードで Core 2 Quad あたりで動かすと激変するから。
unsafe とか馬鹿馬鹿しくなるよ
興味があるのでサンプルソースうp
脳なしは死ね
>>952 いやぶっちゃけ4コアでも最大4倍だろ。
一桁二桁変わるような世界じゃない。そしてそういう部分も
普通は多かったりする
なら unsafe で作り続けていればいいかと ネットワーク環境基本の時世にしてセキュリティー設定次第で使えない、設置・配置できない不便なアプリになるといいかと。
>>956 んなところにはそれこそunsafeなんて使わんが?
とはいえそうだな、確かにまずコード書けだな。 とりあえず IndexAttribute でインデックスを指定すると Index Search(Dictionayつかって) してくれる Queryable 返す Table<T> みたいなの作ってみよ
ブラックボックス化されたコードよりアルゴリズムの計算量で比較したほうがいいんじゃないか? O(n^2)とO(logn)ではスレッド化の結果恩恵がどれくらい得られるかが違ってくるし
コードうpも実測もせずに速いとか アホとしか言えない
そんなモンすぐできるだろって意味だよ、バカか
だからやってみろって
質問です。 C#のSystem.IO.BinaryWriter で Write()して作ったバイナリファイルを C++のstd::ifstream fin でopen(filename, ios::binary) して 例えばint n; fin >>n; しても読み込めないですけど、 ・・・つまるところC#で作ったバイナリファイルとC++で作ったバイナリファイルは 互換性がないんですか?
馬鹿すぎる、あまりに馬鹿すぎる、それでC++なんかヤルナぁぁぁ
fin >> n; は数字を数値に変換して読み込むもんで、テキストを対象にするもんだぞ。
C++の超初歩的な質問はC++スレでやれと
最近ネイティブコード系を超え高々に訴えるが、基本中の基本も分かっていないのは如何なものか、自重しろっつの。
>>963 単にC++とC#のバイナリモードの意味が違うだけ。
C++のほうをバイナリモードで開いて、
fin.read(reinterpret_cast<char*>(&i), sizeof i)
とでもすれば、C#でのi = BinaryReader.ReadInt32()に相当する。
>単にC++とC#のバイナリモードの意味が違うだけ。 そこまで説明するなら、Cのバイナリーモードの意味を教えてやってくれよ・・・ 頭変になりそうだ
待て!今、このスレのスル−カが試されてるぞ!
スルーカ スルー力 カタカナと漢字で書いてみたんだが、どっちが正しいのかわからんw
こうしてまた新たなバグトラックが発生するのであった
>>965 >>968 バイナリオープン指定しても
ifstream >> とか ofstream << はあくまでテキスト対象!?
抽象化歌ってえばってるくせに使えねぇなストラウストラップ。
・・・ともかくバイナリファイルは他の関数でキャラとして読んでその都度変換する
しかないということですね? ありがとうございました。
sin90°が1.0にならないよドラえも〜ん。 Math.Sin()の引数はラジアンなので、sin90°を求めるために、次のように度からラジアンに変換して渡すのですが、 double s = Math.Sin(90 * Math.PI / 180); 結果は1.0にはなりません。きっと、丸め誤差のせいです。 度を引数にとる三角関数ライブラリでもあればいいんですがね。
>>975 寝ぼけたこと言ってるなあw
それは君が実数値の取り扱い方法を知らないだけだろ。
というか逆に考えるんだ。 ほとんどの場合正確な値が返って来ないのに90度だけ返って来るほうがキモいだろう
>抽象化歌ってえばってるくせに使えねぇなストラウストラップ。 とりあえずとんでもない勘違いをしているから正しておけ。
浮動小数点に関して 「1.0 になってる」 と言われても、 確認の方法が悪い可能性があるから信用ならん。 どう確認したかを書かなきゃ。
適当なプロジェクトでステップオーバーだけ押してデバッガ起動して イミディエイトウインドウで (Math.Sin(90 * Math.PI / 180) == 1) ってやるとtrueが返ってくるが?
自分で確認もせずいちゃもんばかり人って何なの?
最適化まで考慮してチェックしてんのか?
こんなんでどうですか。 using System; using System.Text; using System.Runtime.InteropServices; class F { [DllImport("msvcr90.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] static extern int swprintf_s( [Out] StringBuilder buffer, UIntPtr sizeOfBuffer, string format, double d); static void Main() { double s = Math.Sin(90 * Math.PI / 180); Console.WriteLine("{0:r}", s); Console.WriteLine("{0:e17}", s); var buf = new StringBuilder(); buf.Length = 32; swprintf_s(buf, (UIntPtr)buf.Length, "%.13a", s); Console.WriteLine(buf); } }
誤差を気にするなら 1.0 と比較すれ。 チェックにおいて一切誤差が入らない。
>>974 文字列書式化関数でバイナリ読み書きなんて勘弁してくれ。
上のほうで話題になっていたスレッドとLINQの話をみて、 LINQの遅延評価とスレッドの結果が遅れてできるという、どことなく似た性質が興味深くて、ちょっとマルチCPU向けコード作ってみた。 関数型言語の様に、値=関数という概念を持ち込んでみたよ。 LambdaPool.BeginLambda が、結果を得る関数を引数に、結果を得る関数を返す、ただし計算はすぐ開始という仕組みです。 ためしにやってみた計算は二重積分 ∬sin(x)*cos(y)dxdy です。
public class LambdaPool : IDisposable { List<EventWaitHandle> eventList = new List<EventWaitHandle>(); List<Thread> threadList = new List<Thread>(); Queue<ThreadStart> queue = new Queue<ThreadStart>(); public void Dispose() { foreach (var item in threadList) if (item.IsAlive) item.Abort(); } public LambdaPool() { for (int i = 0; i < Environment.ProcessorCount; ++i) { var index = i; eventList.Add(new EventWaitHandle(false, EventResetMode.AutoReset)); threadList.Add(new Thread(() => { while (true) { ThreadStart item = null; lock (queue) if (queue.Count != 0) item = queue.Dequeue(); if (item != null) item(); lock (queue) if (queue.Count != 0) continue; eventList[index].WaitOne(); } })); threadList[index].Start(); } } public Func<T> BeginLambda<T>(Func<T> lambda) { object result = null; EventWaitHandle eventWait = new EventWaitHandle(false, EventResetMode.ManualReset); lock (queue) queue.Enqueue(() => { result = lambda(); eventWait.Set(); }); foreach (var item in eventList) item.Set(); return () => { eventWait.WaitOne(); return (T)result; }; } }
//マルチCPU LambdaPool lambdaPool = new LambdaPool(); private void button1_Click(object sender, EventArgs e) { System.DateTime start = System.DateTime.Now; List<Func<double>> result = new List<Func<double>>(); double delta = 0.0001; for (double gy = 0; gy <= Math.PI * 2; gy += delta) { var y = gy; result.Add(lambdaPool.BeginLambda(() => { double sum0 = 0.0; for (double x = 0; x <= Math.PI * 2; x += delta) { sum0 += Math.Sin(x) * Math.Cos(y) * delta * delta; } return sum0; })); } var sum1 = lambdaPool.BeginLambda(() => result.Sum((a0) => a0()))(); System.DateTime end = System.DateTime.Now; System.Console.WriteLine("開始={0},終了={1},所要時間={2}", start, end, end - start); System.Console.WriteLine(sum1); }
//シングルCPU private void button1_Click(object sender, EventArgs e) { System.DateTime start = System.DateTime.Now; double delta = 0.0001; double sum1 = 0.0; for (double y = 0; y <= Math.PI * 2; y += delta) { double sum0 = 0.0; for (double x = 0; x <= Math.PI * 2; x += delta) { sum0 += Math.Sin(x) * Math.Cos(y) * delta * delta; } sum1 += sum0; } System.DateTime end = System.DateTime.Now; System.Console.WriteLine("開始={0},終了={1},所要時間={2}", start, end, end - start); System.Console.WriteLine(sum1); }
結果です、Core2Quad QX9650 3.0GHz での結果です。 マルチCPU 開始=2008/04/21 3:26:58,終了=2008/04/21 3:28:15,所要時間=00:01:16.4980000 -9.26313842296857E-15 シングルCPU 開始=2008/04/21 3:31:27,終了=2008/04/21 3:35:57,所要時間=00:04:30.6180000 -9.26313842296857E-15 非スレッド270秒 マルチスレッド76秒 速度非 3.55倍 コードが超圧縮なのは、掲示板という事で勘弁してください。 270秒 ⇒ 76秒です、言語サポートがあると結構面白いことになりそうです。
"PROLOG Programming for Artificial Intelligence" 邦訳名「AIプログラミング」 レベルのサンプルプログラムがあるC#のサイトがあったら、教えてください。
>>990-992 非同期デリゲート呼出でやってみたんだけどどう?
static Func<double> future(Func<double> f)
{
var r = f.BeginInvoke(null, null);
return () => f.EndInvoke(r);
}
static void Main()
{
var start = DateTime.Now;
var result = new List<Func<double>>();
double delta = 0.0001;
for (double gy = 0; gy <= Math.PI * 2; gy += delta)
{
var y = gy;
result.Add(future(() =>
{
double sum0 = 0.0;
for (double x = 0; x <= Math.PI * 2; x += delta)
sum0 += Math.Sin(x) * Math.Cos(y) * delta * delta;
return sum0;
}));
}
double sum1 = future(() => result.Sum((a0) => a0()))();
var end = DateTime.Now;
Console.WriteLine("開始={0},終了={1},所要時間={2}", start, end, end - start);
Console.WriteLine(sum1);
}
このLambdaPoolは手抜きなんで、デッドロックはするし、CPUの処理を食いつぶして他のアプリを不安定にします。 本気で書いたら、掲示板に収まらないのでこの程度にしてありますが・・・・ マルチコアCPUをもっているなら、このコードとIEと同時に使ってみてください、シングルコアPCなみに反応が悪くなります。 で、非同期デレゲートですが、これはThreadPoolを使います、これはもっとヤバイです、 これは高優先順位でI/Oの同期をとることを目的に作られています、 とりあえず、安易な非同期デレゲートはどういう使い方であれお勧めできないかもしれない。 本当はこういうコードを実行してCPUを占領したらOSが強権発動で優先順位の強制変更をしてくれるといいんですけどね。
あっ、上のサンプルのコードではテッドロックはしません、そういう風に作ったので・・・
自分もラムダ式というかデリゲートを渡して処理分散させるコード書いてる。 多用するとデバッグ時にいじるたびにやり直しになるのが困りもの(´・ω・`)
ハイレベルすぎて何の意味があるのかわかりません
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。