ふらっとC♯(Part5)
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
少しずつC#プログラマを名乗るものが現れました。みなさん一緒に勉強しましょう。
前スレッドはこちら
http://pc2.2ch.net/test/read.cgi/tech/1059028988/l50 (Part4)
http://pc2.2ch.net/test/read.cgi/tech/1047210828/l50 (Part3)
http://pc2.2ch.net/test/read.cgi/tech/1035895873/l50 (Part2)
http://pc2.2ch.net/test/read.cgi/tech/1023766485/l50
0175デフォルトの名無しさん
NGNG有難うございます、助かりました。
0176デフォルトの名無しさん
NGNGでも、実装の仕方としては、class A, B を ICloneable にして Clone() メソッド書くのが普通な気が。
0177デフォルトの名無しさん
NGNGそれでほんとに問題ないのかちゃんと確認した方がいいぞ。
0178デフォルトの名無しさん
NGNGリフレクションの使い方の取っ掛かりが欲しかったので、構わないんです。
コンストラクタ以外にもメソッドを呼び出すときに、もっと複雑なことになるし、この辺りは覚悟していましたし
いずれにしても template が実装されるまでの繋ぎなので。
0179デフォルトの名無しさん
NGNGどうtemplateにからむんでしょう?個人的に興味
0180デフォルトの名無しさん
NGNG0181デフォルトの名無しさん
NGNGC#で簡易telnetを作れという問題です。通信の方法がそもそも分かりません
0182デフォルトの名無しさん
NGNGソケット作れ
0183デフォルトの名無しさん
NGNG0184デフォルトの名無しさん
NGNGTCPで接続してTELNETプロトコル話せばいいだけ
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=telnet+%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB
0185デフォルトの名無しさん
NGNGSystem.Runtime.Serialization.Formatters.Soap.SoapFormatter
で、オブジェクトをXmlにシリアライズする時は ISerializable でカスタマイズできるみたいですが、
System.Xml.Serialization.XmlSerializer
で、オブジェクトをXmlにシリアライズする時でカスタマイズできる方法は無いんでしょうか?
知っている人いますか?
IList を入れていると、XmlSerializerが頑張っちゃって自動的にシリアライズしてしまうみたいで・・・
IListが入っていても普通のクラスのように振舞わせる事はできないのでしょうか?
0186デフォルトの名無しさん
NGNG取りあえず簡単なIListを実装したコレクションを作ったけど普通にシリアライズ・デシリアライズできたぞ。
XmlSerializerは手軽に使えてカスタムしにくいのが特徴なので、まあいろいろ勘案して。
シリアライズ用の別クラスを作るとか。
0187デフォルトの名無しさん
NGNG0188デフォルトの名無しさん
NGNGあぅ、書き損じたんですが、添え字にマイナス値を使えるようにするとアウトなんですよ。
ヘルプを見ると、this[int]インデクサプロパティーを見ているようで、Countとセットで
動作しているみたいなんです。
当然動作するわけも無いのですが、ここでIListを見て勝手に動作されるとちょっと具合が悪いので、
この機能に寝ていてもらいたいのですが、手段が見つからない・・・・
0189デフォルトの名無しさん
NGNGpublic int Add()
{
return 10+10;
}
下のように使うと、Add()の戻り値は変数aに入りますよね。
public void Test()
{
int a = Add();
}
以下の場合だと、Addの戻り値はどこへ格納されるんでしょうか?
publi void Test()
{
Add();
}
0190デフォルトの名無しさん
NGNG0191デフォルトの名無しさん
NGNGint main()
{
10 ;
}
とやっても、文としては正しいと認識されます
と、書こうとして、C#でやったら、意味が無いって怒られました。
さすがにチェックすることにしたみたいですね。
0192デフォルトの名無しさん
NGNG上の場合、publicだから外からどんな値が来るかわかりません。
hogeに値が代入された時に、hogeが正しい値かどうかを調べるにはどうしたらいいんですか
0193デフォルトの名無しさん
NGNGプロパティにしてsetアクセサの中でチェックする。
つかまさにそのためにプロパティがあるんだが。
0194デフォルトの名無しさん
NGNG0195デフォルトの名無しさん
NGNGみたいにすればいいんですね。なるほど
0196デフォルトの名無しさん
NGNG0197デフォルトの名無しさん
NGNGpublic int hoge {
set {
if (1 <= value && value <= 100)
hoge = value;
else
throw new ArgumentOutOfRangeException();
}
}
ちょっと無理っぽいが、通るのか?
0198デフォルトの名無しさん
NGNG0199デフォルトの名無しさん
NGNG自分で作って確かめろ、タコ
0200デフォルトの名無しさん
NGNGなんで?
0201198
NGNGGDIはBitbltで
GDI+はGraphics.DrawImageで
確かめて良いですか?
0202デフォルトの名無しさん
NGNG0203デフォルトの名無しさん
NGNG参考になるHPや良い方法があったら教えてください。
例えば、正規分布関数のクラスが、以下のように存在していて
public class DistributionFunctions
{
public static dobule Normal( double x , double a , double v )
{
return 1.0 / Math.Sqrt( 2 * Math.PI * v ) * Math.Exp( -(x-a)*(x-a)/( 2 * v ) ) ;
}
...
}
やりたい事は、
delegate double DoubleToDoubleDelegate( double x ) ;
public class DistributionDelegates
{
static DoubleToDoubleDelegate MakeNormal( double a , double v )
{
ここに手際よく大量生産できるコード
}
}
使い方は
void hogehogeMethod()
{
DoubleToDoubleDelegate df = MakeNormal( 0.0 , 1.0 ) ;
y = df( 0.0 ) ;// ここで y = Normal( x , 0.0 , 1.0 ) が呼び出される
}
0204デフォルトの名無しさん
NGNGよくわからんけど、こんなこと↓がしたいの?
using System;
public class DistributionFunctions {
double a;
double v;
public DistributionFunctions(double x, double y){
a = x;
v = y;
}
public double Normal( double x )
{
return 1.0 / Math.Sqrt( 2 * Math.PI * v ) * Math.Exp( -(x-a)*(x-a)/( 2 * v ) ) ;
}
}
delegate double DoubleToDoubleDelegate( double x );
class Hoge {
static DoubleToDoubleDelegate MakeNormal( double a , double v ) {
//ここに手際よく大量生産できるコード
DistributionFunctions f = new DistributionFunctions(a, v);
return new DoubleToDoubleDelegate(f.Normal);
}
static void Main() {
DoubleToDoubleDelegate df = MakeNormal( 0.0 , 1.0 ) ;
double y = df( 0.0 ) ;// ここで y = Normal( x , 0.0 , 1.0 ) が呼び出される
Console.WriteLine("y = {0}", y);
}
}
0205204
NGNGの{の前に全角スペースが入ってた。。。鬱
0206デフォルトの名無しさん
NGNG0207デフォルトの名無しさん
NGNG方法は問わないんですが、そうです、そんな感じです。
そこで、関数の引数を確保するクラスを作る必要がありますよね。
関数の数が多くて、これを全部自動生成してしまいたいんです。
0208204
NGNG> そこで、関数の引数を確保するクラスを作る必要がありますよね。
> 関数の数が多くて、これを全部自動生成してしまいたいんです。
204の例を使っても、好きなだけ関数は作れるけど。。。↓こういうことではない?
static void Main()
{
double d1 = 1.0; // 数字は適当
double d2 = 1.0; // 数字は適当
DoubleToDoubleDelegate[,] df = new DoubleToDoubleDelegate[10,10];
for(int i=0; i < 10; i++, d1 += 0.2){
for(int j=0; j < 10; j++, d2 += 0.2){
df[i,j] = MakeNormal( d1, d2);
}
}
for(int i=0; i < 10; i++){
for(int j=0; j < 10; j++){
double y = df[i,j]( 0.0 ) ;
Console.WriteLine("y = {0}", y);
}
}
}
0209デフォルトの名無しさん
NGNGども、お手数掛けてすみません。
対象となる関数は、正規分布関数のようにパラメータ二つだけとは限りませんし、
今後、多変数に対応するにあたって、このまま場当なやり方で行きますとプログラムの保守が危機的になると考え
第一段階として、現在はC#のソースコードを自動生成するプログラムを作って対応しています。
しかし、これも必ずしも良い方法とも言えず、もっと効率的にプログラムできる方法として、
色々探している内にリフレクションという物を使ってみようかと考えていました。
さっそく始めてみたのですが、これがチュートリアルの良いページがなかなか見つからなくて・・・・
ちなみに僕自身、ここに書き込む前に色々考えたのですが、
一般的なC#の構文を使った範囲内ではおそらく良い解決方法はないだろうというのが結論でした。
0210デフォルトの名無しさん
NGNGC#でデータベースに関することを勉強しています。
ボタンを押すとアクセスに「123」というデータを追加するプログラムを書いています。
壁にぶつかりましたので、ご指導していただけませんか。
odbcDataAdapter1などの設定し、以下のボタンの内容を書きました。
odbcConnection1.Open();
odbcDataAdapter1.InsertCommand.Parameters["@ab"].Value="123";
odbcDataAdapter1.InsertCommand.ExecuteNonQuery();
odbcDataAdapter1.Fill(dataSet11);
odbcConnection1.Close();
すると
'System.IndexOutOfRangeException' のハンドルされていない例外が
system.data.dll で発生しました。
0211デフォルトの名無しさん
NGNG> 今後、多変数に対応するにあたって、このまま場当なやり方で行きますとプログラムの保守が危機的になると考え
> 第一段階として、現在はC#のソースコードを自動生成するプログラムを作って対応しています。
これが結構まっとうな方法な気もしますが。。。
もしかして、パラメータが変わるだけではなく、どんな関数を作るかは
あらかじめ決まってない、ってことですか?
C++でいえば、boost::lambdaみたいなことをしたいのかなぁ?
> しかし、これも必ずしも良い方法とも言えず、もっと効率的にプログラムできる方法として、
> 色々探している内にリフレクションという物を使ってみようかと考えていました。
リフレクションで出来るかどうかはわかりませんが、一応参考に。
http://members.jcom.home.ne.jp/1213687801/cs/reflection/reflection4.html
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemreflectionemittypebuilderclasstopic.asp
0212デフォルトの名無しさん
NGNGここにある例が参考になりませんかね。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdatasqlclientsqldataadapterclassinsertcommandtopic.asp
0213デフォルトの名無しさん
NGNG0214デフォルトの名無しさん
NGNG例えば、オセロプログラムを考えるとします。
オセロのマスの部分にButtonから継承したクラスMasuを使います。
Masuを8*8個集めた配列をBoardとします。
オセロゲーム ━━ Board (集約する)━━ Masu という風になっていますが、
Masuがクリックされた時に 隣のマスをひっくり返すかどうか走査するとしても、
Masuからは隣のMasuなんて分かりませんよね?
だからBoardに頼んで調べてもらいたいわけですが
どうやったらそうできるのかがわからないです。どうしたらいいのですか?
0215デフォルトの名無しさん
NGNGO クラスBoard
でした
0216デフォルトの名無しさん
NGNGMasu に必要な機能は、
・そのマスの内容を保持
・画面に描画する
・クリックされたことを、Board に通知する
の3つでいいんじゃない?
ひっくり返すのは、Board でやればいい。
0217デフォルトの名無しさん
NGNGその三番目のboardに通知する方法が分からんですよ。
0218デフォルトの名無しさん
NGNGClickイベント。
0219デフォルトの名無しさん
NGNGboardのメソッドの引数に自分を渡せばいい。
0220デフォルトの名無しさん
NGNGもっと
PlayerとかTurnMasterとかJudgeとかつくれや。Masuはいらん
0221デフォルトの名無しさん
NGNG高度すぎ。質問者をみて答えてやれよ。
0222デフォルトの名無しさん
NGNG書き込んだ後そう思った.すいません。
Masu作るときにボードを引数で渡してそれ使う.それかイベント
0223デフォルトの名無しさん
NGNGvoid Hoge( params object [] arg )
の ref バージョンで
void Hoge( ref object arg0 , ref object arg1 , ref object arg2 ... ) ;
の様な物。
必要個数分オーバーロードするしかないかな?
0224デフォルトの名無しさん
NGNG以下のような Panel を継承したクラスをつくりました。
public class PanelEx : System.Windows.Forms.Panel
{
public PanelEx() { }
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint (e);
Pen p = new Pen(Color.Black, 1);
e.Graphics.DrawRectangle(p, this.ClientRectangle);
p.Dispose();
}
}
この PanelEX クラスのインスタンスを、普通に Form1 の
コンストラクタ内で生成したところ、画面には PanelEx の
左側と上側にしか線がひかれません。
なぜでしょうか?また、どうすればちゃんと矩形が描かれますか?
0225デフォルトの名無しさん
NGNGはみ出て見えないので矩形を小さく、例えば幅と高さを-1にしたりする。
0226224
NGNGええええー。なぜそんな仕様になってるんでしょうか?
0227デフォルトの名無しさん
NGNG厨避けの為。
0228デフォルトの名無しさん
NGNG別におかしくないよ。
http://www.microsoft.com/japan/msdn/library/ja/jpdnprogwincsharp/htm/chapter15.asp?frame=true
0229デフォルトの名無しさん
NGNGウヒャー
220さんの高度な設計だと、どんな風になるんですか?
コードをつけながら説明してほしい・・・
0230デフォルトの名無しさん
NGNG高度
コード
!?
0231デフォルトの名無しさん
NGNGint i = Console.Read();
Console.WriteLine(i);
これでたとえば「2」を入力すると出力が「50」なんてなるんですが、なぜなのでしょうか?
0232デフォルトの名無しさん
NGNGコンピュータの中では、「文字」ってのは一定のルールで数字の列に変換されて扱われてます。
このルールのことをエンコーディング、数字(の列)のことを文字コードと呼んだりします。
んで、文字の "2" に対応するコードが 50 (16進数で 0x32) なわけです。
ファイルやネットワーク等での読み書きは、byte の列を使って行われるのが基本で、
.Net Framework で文字列からこのバイト列に(またはその逆に)変換するには、
Encoding クラス(のインスタンス)を用います。
0233デフォルトの名無しさん
NGNG"2"という文字列から、数字の 2 に変換するには、Int32.Parse() などを使います。
0235デフォルトの名無しさん
NGNG0236デフォルトの名無しさん
NGNGchar c = (char)Console.Read();
とすれば、そのまま表示できまっせ。MSDNだとintを返すことになってるから
まぎわらしいんだけどね。
0237デフォルトの名無しさん
NGNG今画像のサムネイル保存用に複数画像をまとめてひとつの
ファイルにしようとしています。
Aファイルサイズ・Aファイル・Bファイルサイズ・Bファイル・・・
みたいな感じ合成し、インデックスで呼び出そうかと思っています。
で、ふと思ったのですが、そういう複数のファイルをまとめてしまう
クラスって既にあったりするのでしょうか。
よろしければお教えください。よろしくお願いいたします。
0238デフォルトの名無しさん
NGNGBitmap imageB = new Bitmap("B.bmp");
Bitmap imageC = new Bitmap("C.bmp");
Bitmap bmp = new Bitmap(300, 100);
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(imageA, 0, 0);
g.DrawImage(imageB, 100, 0);
g.DrawImage(imageC, 200, 0);
g.Dispose();
bmp.Save("ABC.bmp");
bmp.Dispose();
imageA.Dispose();
imageB.Dispose();
imageC.Dispose();
0239デフォルトの名無しさん
NGNGHash的に名前で簡単にストリームを取り出せるような
仕組みが既存クラスにないかなーとか思っていたのでした。
やはり頑張って自分で実装してみます。
ありがとうございました。
0240デフォルトの名無しさん
NGNG0241デフォルトの名無しさん
NGNGなるほど!
早速やってみます。
ありがとうございました!
0242デフォルトの名無しさん
NGNGVS.NET2003に反映されないのです。
なんでなんでしょう・・・そういう方他にいますか?
0243最凶VB厨房
NGNG0245最凶VB厨房
NGNGまっわからんけど
0246デフォルトの名無しさん
NGNGフィルタか?
0247242
NGNGフィルタもなしになってます。
本来ならVS.NET起動時に「ヘルプを反映中・・」とかでますよね?
0248242
NGNGお騒がせしました。(・∀・)
0249デフォルトの名無しさん
NGNGDirectX9 SDK Summer2004の日本語ドキュメントってもう出てたの?
0250デフォルトの名無しさん
NGNG変な書き方しちゃいましたね。
2004入れてから日本語ドキュメント入れたら〜でした。スマソ
0251デフォルトの名無しさん
NGNGusing HANDLE=System.IntPtr;using LPVOID=System.IntPtr;using SIZE_T=System.UInt32;using DWORD=System.UInt32;
class CMyApp:System.Windows.Forms.Form
{
[System.Runtime.InteropServices.DllImportAttribute("kernel32")]
static extern LPVOID VirtualAllocEx(HANDLE hProcess,LPVOID lpAddress,SIZE_T dwSize,DWORD flAllocationType,DWORD flProtect);
DWORD PAGE_READWRITE=0x04;
DWORD MEM_COMMIT= 0x1000;
static void Main()
{
System.Windows.Forms.Application.Run(new CMyApp());
}
CMyApp()
{
this.Click+=new System.EventHandler(OnClick);
}
void OnClick(object sender,System.EventArgs e)
{
LPVOID 自分側の領域=VirtualAllocEx(System.Diagnostics.Process.GetCurrentProcess().Handle,(LPVOID)0,(DWORD)System.Runtime.InteropServices.Marshal.SizeOf(typeof(System.TimeSpan)),MEM_COMMIT,PAGE_READWRITE);
LPVOID 他人側の領域=new LPVOID();
foreach(System.Diagnostics.Process inc in System.Diagnostics.Process.GetProcesses())
if("Explorer"==inc.ProcessName)
他人側の領域=VirtualAllocEx(inc.Handle,(LPVOID)0,(DWORD)System.Runtime.InteropServices.Marshal.SizeOf(typeof(System.TimeSpan)),MEM_COMMIT,PAGE_READWRITE);
System.Runtime.InteropServices.Marshal.PtrToStructure(自分側の領域,typeof(System.TimeSpan));//自分側の領域では例外は発生しない
System.Windows.Forms.MessageBox.Show("次で例外発生");
System.Runtime.InteropServices.Marshal.PtrToStructure(他人側の領域,typeof(System.TimeSpan));
}
}
0252デフォルトの名無しさん
NGNG非Managedなプロセス空間にManagedな構造体を確保する意味がさっぱりわからないんだが。
ttp://dotnetjunkies.com/WebLog/chris.taylor/archive/2004/05/31/14828.aspx
とりあえず外部プロセスへのちょっかいの参照。
0253251
NGNGこれをやりたい理由は、興味本位で出来るかどうか試したかっただけです。
とりあえず上のURLをよく読んで見ます。
0254デフォルトの名無しさん
NGNGどっち使ってる?
JavaのGUIのリスナーみたいなケースなら、デリゲートの
方が何もしないメソッドまで記述しなくて済むし効率いいかな。
0255デフォルトの名無しさん
NGNG俺は Java 出身だから、ある程度一まとまりの処理をくっつけるならインターフェイス使っている
デリゲートは纏まり間が無くて、単体なら遣いやすいけど微妙
0256デフォルトの名無しさん
NGNG0257デフォルトの名無しさん
NGNGデリゲートにしておくのが無難なのでは。
0258デフォルトの名無しさん
NGNG各ドライブのボリュームラベルを取得するのってどうやるんだべさ?
なんかAPI叩くしかなかったら非常に鬱なので教えてエロイ人!
0259デフォルトの名無しさん
NGNGDriveInfo.VolumeLabel かな。
…… .NET Framework 2.0 だけど。
0260デフォルトの名無しさん
NGNG0261デフォルトの名無しさん
NGNGやっぱ2.0になっちまうのか・・・。
何故こんな基本的なもんが実装されてないんだと小一(ry
0262デフォルトの名無しさん
NGNGextern static bool GetVolumeInformation(
string RootPathName,
StringBuilder VolumeNameBuffer,
int VolumeNameSize,
out uint VolumeSerialNumber,
out uint MaximumComponentLength,
out uint FileSystemFlags,
StringBuilder FileSystemNameBuffer,
int nFileSystemNameSize);
0263デフォルトの名無しさん
NGNGトンクスエロイ人!
やっぱこうやるか・・・。なんだかなぁ・・・
0264デフォルトの名無しさん
NGNGこの64という制限は何によってかかっているでしょうか。
100に変更したりとかできないでしょうか。
0265デフォルトの名無しさん
NGNGMyButtons[,] = new Button[3,5];
のように宣言されていて、forの二重ループの中で初期化して
MyButtons[i,j].Click += new EventHandler(MyButtons_Click);
みたいにしてみましたが、MyButtons_Clickの引数には別に「MyButtonsの何番目か」は渡されません。
どうしたらいいんですか
0266デフォルトの名無しさん
NGNGボタンの番号が固定のものなら、Button.Tag あたりに番号を押し込めておけば良いのでは?
0267デフォルトの名無しさん
NGNGなんとかなりませんかねえ
0268デフォルトの名無しさん
NGNG???
だからTagにint[]{2, 1}とかいれとけばいいんじゃないの?
それがまずいというのならもっとわかりやすく説明してくれないと何がなにやら。
0269デフォルトの名無しさん
NGNGあ、いま意味が分かりましたサンクス
0270デフォルトの名無しさん
NGNG普通に1000とかできるじゃん……と思ったら.NET Framework2.0だった。
1.1の制限のようだ。
0271デフォルトの名無しさん
NGNGOS の制限。WaitForMultipleObjects() できる最大数が64だから。
2.0 で表面的な制限は外れても、64を超えると効率は落ちる気がする。
0272デフォルトの名無しさん
NGNGでも64周辺の境界は見あたらなかった。
ついでに1.0/1.1/2.0bも比較してみた。(スコアは低い方が優秀)
10でスコア 410 / 370 / 250
25でスコア 320 / 300 / 230
40でスコア 325 / 320 / 250
64でスコア 370 / 370 / 300
有意の差があるね。
1.1までとは違う機構を利用してたりするんじゃないかってくらい2.0は早い。
数が少ない時と多い時のスコアの分布とか。
0273デフォルトの名無しさん
NGNGABC | DEF | GHI
JKL | MNO | PQR
STU | VWX | YZA
BCD | EFG | HIJ
こういう表の MNOとVWXだけ範囲指定させるみたいなことはできますか?
0274264
NGNG環境も書き忘れたのに本当にありがとうございます。
しかもWaitForMultipleObjectsとの関連、
ベンチまでしていただいてとても参考になりました。
■ このスレッドは過去ログ倉庫に格納されています