ふらっとC#,C♯,C#( ..
[2ch|▼Menu]
72:デフォルトの名無しさん
09/03/02 12:42:43
>>69,70
あー理解しました、ありがとうございます。
カレントディレクトリとFileDialogが固有に保存するディレクトリ位置をごっちゃにしてました。
ただこうなるとFileDialogが固有の値がどこに保存してるかホントにわかりませんね


73:デフォルトの名無しさん
09/03/02 12:49:05
普通にレジストリだけどな

74:デフォルトの名無しさん
09/03/02 14:03:59
最後に検索したディレクトリ=CurrentDirectoryだろ?
固有の値ってなんじぇすか?

75:デフォルトの名無しさん
09/03/02 14:05:56
いいえ

76:デフォルトの名無しさん
09/03/02 14:48:38
>>56
そんなのがあるんだ。

77:デフォルトの名無しさん
09/03/02 15:21:50
>>74
System.IO.Directory.GetCurrentDirectory()静的メソッドで取得できるのがカレントディレクトリ。通常は起動したアプリの位置。
以下さっき確認した方法をば。

1、WindowsFormAppricationを新規作成
2、フォームデザイナ表示して、ツールボックス>適当にOpenFileDialogを追加。
3、フォームのクライアント領域をフォーカスして、適当にプロパティ>Clickイベントを追加。ハンドラでダイアログをShowDialogる。
4、ShowDialog()の前後をMessageBoxでカレントディレクトリ情報を表示。
5、ダイアログのRestoreDirectoryプロパティがtrueとfalseのときの挙動を見比べる。

78:デフォルトの名無しさん
09/03/02 19:15:08
XMLファイルの暗号・復号で行き詰まってしまいました。
ちょっと長くなるのでテキストファイルにして上げました。
一度見てもらえれば幸いです。よろしくお願いします。
URLリンク(uproda.2ch-library.com)
表示できない場合はしたのURLからお願いします。DLキーはそのまま「1」です。
URLリンク(uproda.2ch-library.com)


79:デフォルトの名無しさん
09/03/02 20:03:39
質問
System.Windows.Forms.WebBrowserコントロールで
Navigate("url string") でHtml表示できますが、
Proxyサーバを経由するときはどうしたらいいのですか?
Proxyプロパティを持っているWebClientを使用して
試しにyahoo.co.jpを
WebClientからDownloadData⇒byte[]をstreamに変換
DocumentStreamにセット
DownloadString⇒DocumentTextにセット
とかやってみたんですがスクリプト関係が読み込めないようです。

80:デフォルトの名無しさん
09/03/02 20:12:31
一番楽なのはインターネットオプションで設定しとくことだが

81:デフォルトの名無しさん
09/03/02 21:05:22
>>78
test1.xml
はどんな出力になっているの?

82:78
09/03/02 21:41:32
>>81
ファイルの中身でしょうか?このようになっています。
※改行規制に引っかかったので適当に改行しました。

ちなみに、暗号化されていると思われる部分は毎回内容が違っています。

<root>
<EncryptedData Id="EncryptedElement1" Type="URLリンク(www.w3.org)
c#Element" xmlns="URLリンク(www.w3.org)"><EncryptionMethod Algorith
m="URLリンク(www.w3.org)" /><CipherData><CipherValue>ZdxQ
9vVJIP9l94JL5p+Y8Wth3TZpgPnn/5Ta48lKRBdhsaL87ywnN8lVPcSZYm5emTnWChPk5IiL2iIqClD
tvxzv84ko/9XsbHtj4cv7yLYLH4MZUmX3ds3AEiDIondHwst9EPk7YK5UUERaIPx8rEksIKcOpc8dJb
vB3celcTw=</CipherValue></CipherData></EncryptedData>
</root>


83:デフォルトの名無しさん
09/03/02 21:54:06
>>82
URLリンク(msdn.microsoft.com)(VS.80).aspx
には、
><EncryptedData> 要素の <EncryptedKey> 要素に格納されたセッション キーを
>復号化します。次に、セッション キーを使用して XML 要素を復号化します。
って書いてあるけれど、<EncryptedKey> 要素がないよね?

暗号化は出来ているようだ、って書いてあったけど、その認識が多分誤り
なんじゃないかな。長いのでチェックしきりれないんだけど、多分間違いが
あるのはEncryptメソッドの方だと思う。

84:デフォルトの名無しさん
09/03/02 22:02:26
AESで暗号化しているのに、非対称キーってどういうことなんだろな→マイクロソフト
初期化ベクタと共通キーで、共有鍵暗号のはずなのに。

85:83
09/03/02 22:07:36
>>84
いや、セッションキーはAESなんだけど、それをRSAで暗号化してXMLに埋め込むって
コードのはずが、上手く行っていないって話のようです。

86:83
09/03/02 22:15:06
なんか、

edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek));

の後に

edElement.KeyInfo = new KeyInfo();

なのって凄くおかしくない?

87:83
09/03/02 22:43:53
// Create a new KeyInfo element.
edElement.KeyInfo = new KeyInfo();
               
// Add the encrypted key to the
// EncryptedData object.
edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek));

この順序にしたら、出力が
<root>
  <EncryptedData Id="EncryptedElement1"  ほにゃらら>
    <EncryptionMethod Algorithm="URLリンク(www.w3.org)" />
    <KeyInfo ほにゃらら>
      <EncryptedKey ほにゃらら>
        <EncryptionMethod Algorithm="URLリンク(www.w3.org)" />
        <KeyInfo ほにゃらら>  
          <KeyName>rsaKey</KeyName>
        </KeyInfo>
        <CipherData><CipherValue>ほにゃらら</CipherValue></CipherData>
        <ReferenceList>
          <DataReference URI="#EncryptedElement1" />
        </ReferenceList>
      </EncryptedKey>
    </KeyInfo>
    <CipherData>
      <CipherValue>ほにゃらら</CipherValue>  
    </CipherData>
  </EncryptedData>
</root>
ってなった。これで、キーが埋め込まれたっぽくない?

88:デフォルトの名無しさん
09/03/02 22:46:15
XMLの要素だけを暗号化してくれるのか
項目を自分で暗号化してxmlに保存するでもいいけど、
一括して暗号化してくれるなら、ライブラリ化しとけば後で便利そうだな

89:デフォルトの名無しさん
09/03/02 22:49:39
まあ、MSDNのサンプルなので間違いも多いってこった。

#MSDNのコードって、何故か、バグはあってもビルドだけはばっちり通るんだよなあ。

90:デフォルトの名無しさん
09/03/02 23:14:48
>>61>>71
そうなのか
C++/CLIでできることをC#では禁止する理由がわからんな

91:78
09/03/02 23:21:43
>>87
ありがとうございます。
お蔭さまで無事解決しました!感謝感謝です!!

それにしても公式のサンプルでも間違いはあるのか。

92:デフォルトの名無しさん
09/03/02 23:24:22
>>90
できたところで全く意味がない
混乱を生むだけ
CILではできるのにC++/CLIではできないことだって当然いくらでもある

93:87
09/03/02 23:32:05
MSDNに関する限り、「公式のサンプル"でも"」という認識は改めるべき。
 
バグがあるとかいう以前にそもそもヘルプに直書きしてテストしていないような
雰囲気のコードが多い。

94:デフォルトの名無しさん
09/03/02 23:35:17
>>90
一言で言うとややこしかったり仕様にあわなかったり意味が
なかったり。

C# 内の制約は何つーかすごい色々な理由が複雑に絡まり
あってさまざまに制限がかけられている。必要のないパターン
だったり、扱えないものだったり、推論上の問題だったり。

例えば、class ([mscorlib] System.ValueType) なんて制約は
実はありでこれはValueType と Enum だけ OK とか
valuetype ([mscorlib]System.ValueType) と
([mscorlib]System.ValueType) だけの違いは Nullable<T> が
入るかどうかとか。

ちなみに >>71 の説明ちょっと変?というか valuetype special
constraint は Nullable<T> 「構造体」の存在が大きい。
この special constraint で大雑把に言って Nullable<T> が
含まれるのか除外されるのかが決まる

95:デフォルトの名無しさん
09/03/02 23:43:06
SQLを発行してその結果をGridViewに突っ込んでBindしてGridを表示しているのですが
SQLの結果で例えばある列に特定の値があった場合は、その行を表示しないという事をやりたいのですが
どのようにしたら良いでしょうか?
rowdataboundイベントで値のチェックをして
e.row.cells[0].remove()とかを全部の列にやっても小さい枠が残っちゃうんですよね。

96:デフォルトの名無しさん
09/03/02 23:44:48
それをSQLのクエリに書くのが普通でしょ
もしくはDataTable.Select("", "");を使う

97:デフォルトの名無しさん
09/03/03 00:04:04
こんな質問していいかわからんのですが
普段windows認証でsql serverにつないでるのですが
今回sql server接続にチャレンジしたのですが、つながりません・・・・
「ユーザーhogeは接続できませんでした。このユーザーはsql serverの信頼関係接続と関連づけられてません」と帰ってくるのですが
hogeに問題があると思うのですが、通常hogeは何なんでしょう?

ぎ・・・ギブ 日本語・・おkだな



98:デフォルトの名無しさん
09/03/03 00:10:01
hogeに接続権限がないとか?

99:デフォルトの名無しさん
09/03/03 00:12:22
>>98
・・・ということは
SQLマネージメントスタジオで設定するんですか?^^;ひー

100:デフォルトの名無しさん
09/03/03 00:14:03
管理ツールで設定すれば大丈夫です。


101:デフォルトの名無しさん
09/03/03 00:19:45
>>100
SQL Server構成マネージャのことですか?
試行錯誤中

102:デフォルトの名無しさん
09/03/03 00:24:42
RuntimeTypeHandleをTypeを通さずにジェネリック型から直接取る方法はないの?
IL1命令だけで取れるはずなのに
ILを直接書くか,
static class RuntimeTypeHandles<T> {
public static readonly RuntimeTypeHandle Value = typeof(T).TypeHandle; }
くらい?

103:78
09/03/03 00:29:39
>>93
了解しました!

ホント思ってもみませんでしたよ…

104:デフォルトの名無しさん
09/03/03 01:00:47
saでいいじゃん

105:デフォルトの名無しさん
09/03/03 01:08:53
Lanの接続テストをしようとして
ヴァーチャルPc越しに下記コネクションを利用して開こうとしたんですけど
つながりません・・・
C:\を\\にしたり
\SQLEXPRESS;を\\SQLEXPRESS;
にしたけどダメでした

C# Express Editionじゃだめなんでしょうか?


connStr = @"
Data Source = .\SQLEXPRESS;
AttachDbFilename = C:\hoge\hoge.mdf;
Integrated Security = True;
User Instance = True;";


using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open(); // コネクションのオープン
}

106:デフォルトの名無しさん
09/03/03 01:16:38
>>105
それじゃ自分自身のインスタンスになってんじゃないの?
バーチャルPCに対してならIPアドレスか、バーチャルPCのドメインとか、
PC名で指定する必要があるんじゃないか?

107:デフォルトの名無しさん
09/03/03 01:24:02
>>106
むむむ
しらべてあす報告します
ありがとうです

108:デフォルトの名無しさん
09/03/03 02:34:16
char c = 'a';

string s = Convert.ToString(c);

string s = c.Tostring();

上ができないのは何でなんだぜ?

109:デフォルトの名無しさん
09/03/03 02:37:56
2回もキャストするの?

110:デフォルトの名無しさん
09/03/03 02:52:00
>>108
エラーになるのは下だけでしょ
Convertには ToString(char) のクラスメソッドがあるけど、
Charには ToString() のインスタンスメソッドがないから


111:デフォルトの名無しさん
09/03/03 02:52:33
鳩山弟の偵蝶はすげえなというか、この情報の確度と有益さは恐ろしい

さすがアルカイダの友達の友達だ

112:108
09/03/03 02:56:20
間違えた

char c = 'a';

↓はできるけど

string s = Convert.ToString(c);

string s = c.Tostring();

↓はできない

string s = (string)c;

113:108
09/03/03 03:00:40
もしかしてstringはキャスト演算子使えない?

114:デフォルトの名無しさん
09/03/03 03:07:38
キャストはコンバートじゃありません
根本的に勘違いしてるんじゃないかなあ

115:デフォルトの名無しさん
09/03/03 03:46:32
>>110
Object.ToString()

116:デフォルトの名無しさん
09/03/03 04:03:43
>>115
ごめん、そりゃそうだ
エラーになると思い込んでたのでorz

117:デフォルトの名無しさん
09/03/03 04:06:18
>>113
ちなみに(int)cは出来る。
といった辺りから考えてみてくださいな。

118:デフォルトの名無しさん
09/03/03 04:27:16
あー、わかった
stringはcharの配列だけどcharは値型、stringは参照型だからキャストできないってこと?
charは16bitのUnicodeだし

119:デフォルトの名無しさん
09/03/03 08:03:13
変換演算子が定義されてないからキャストできないだけで
値型とか幅とか何も関係ない

120:デフォルトの名無しさん
09/03/03 09:25:56
うん
できたからといって別におかしいことはない
できるようにされてないだけ

121:デフォルトの名無しさん
09/03/03 09:58:26
ファイル読み込みについて質問なんですが、
拡張子ではなく中身でテキストファイルかバイナリファイルかを
判別する方法ってありますか?

122:デフォルトの名無しさん
09/03/03 10:01:33
テキストファイルだってバイナリだろ

123:デフォルトの名無しさん
09/03/03 10:04:09
IMultiLanguage2に食わせてみる

124:デフォルトの名無しさん
09/03/03 10:05:02
メソッド名抜けた。DetectInputCodepage

125:デフォルトの名無しさん
09/03/03 13:06:42
このへんかな?
まぁテキストかバイナリかを見分けると言われれば>>122が正しいんだが
ちょっとエスパーしてみた
URLリンク(dobon.net)


126:デフォルトの名無しさん
09/03/03 14:04:57
FindMimeFromData()じゃないの?

127:デフォルトの名無しさん
09/03/03 14:10:53
DBから指定したテーブルのIDフィールドとNAMEフィールドを取得して
NAMEフィールドをコンボボックスに表示したいと思っています。
その時にNAMEフィールドのデータに紐付くIDフィールドも保持して
コンボボックスを操作した際に、IDフィールドも同時に制御するような処理を作りたいのですが
どのように作ればいいのでしょうか?

コンボボックスを2つ用意して片方を非表示にして制御する方法しか思いつきませんでした
宜しくお願い致します

128:デフォルトの名無しさん
09/03/03 14:25:20
>>127
つコレクション

129:デフォルトの名無しさん
09/03/03 14:45:21
DataTable使ってねーの?

130:デフォルトの名無しさん
09/03/03 15:30:30
めんどくさいからバインドしちゃえよw

131:デフォルトの名無しさん
09/03/03 15:30:54
>127
DisplayMemberにName
ValueMemberにID

SelectedChanged(で合ってるのかな)イベントにハンドラ追加して
ComboBox.SelectedValueでIDが取得できるんじゃね?
データバインドのときに限るが。

それかEntityクラス作って ToStringメソッドをオーバーライドして
ToStringでNameを返すようにする。
Entityクラスのオブジェクトをコンボにセットすれば
ToString()したときの文字列がコンボに表示される。
あとはSelectedChangedで(Entity)キャストしてオブジェクトを取り出す。

132:デフォルトの名無しさん
09/03/03 20:07:59
List(要素数は50個)を
List1(0〜25)とList2(25〜50)に分割するにはどうやったらいいのでしょうか?

133:デフォルトの名無しさん
09/03/03 20:16:13
GetRange使えば?

134:デフォルトの名無しさん
09/03/03 20:22:03
ありがとうございます
GetRangeなら出来そうですね
やってみます

135:デフォルトの名無しさん
09/03/03 20:27:14
list.GroupBy(i => i < 25);

136:デフォルトの名無しさん
09/03/03 21:01:10
>>135
それは違うだろ。値じゃなく添え字で分けたいんだから。

137:デフォルトの名無しさん
09/03/03 21:12:14
そういえばGroupByにindexくれるFuncを使えるのが無いのは何でなんだろ

138:デフォルトの名無しさん
09/03/03 21:12:46
>>136
すまん、そのとおりだ。
長くなるけどこっちで。
list.Select((value, index) => new { value, index }).GroupBy(t => t.index <= 25, t => t.value);

139:デフォルトの名無しさん
09/03/03 22:59:25
生年月日と指定した日付を渡すと
指定した日付の時の年齢を返すようなのってどうやりますか?

140:デフォルトの名無しさん
09/03/03 23:00:25
引き算

141:デフォルトの名無しさん
09/03/03 23:08:45
DateTimeクラスなんかで年齢を返すメソッドがあってもいいような・・・
あんま需要ないのか?

142:デフォルトの名無しさん
09/03/03 23:18:03
それは需要があるとしてもTimeSpanか、あるいは年齢専用のクラス(Ageクラス?)
でやるべきじゃないのかな

143:デフォルトの名無しさん
09/03/03 23:18:56
誕生日って閏年とかあったから、単純に引き算だとへんな年齢になることなかったっけ?
正確には月を比較して、同月なら日を比較して、年の差から年齢を求めるが正しい気がする。

144:デフォルトの名無しさん
09/03/03 23:19:31
VB だったらそういうメソッドも普通に定義されてるかもな。

145:デフォルトの名無しさん
09/03/03 23:21:32
日本の法律では、誕生日の前日に年を取る

豆知識

146:デフォルトの名無しさん
09/03/03 23:23:55
>>145
法律的に年利計算は閏年の翌日?前日?

147:デフォルトの名無しさん
09/03/03 23:30:11
>閏年の翌日?前日?


148:デフォルトの名無しさん
09/03/03 23:35:42
TimeSpanに年数を示すプロパティはないんだな。考えてみれば、月数や年数はTicksから
一意に定まるものじゃないものな。
結局場合分けして引き算するしかなさそうだ。
ちなみに、年齢が変わるのは「誕生日の前日の午後12時」なので、誕生日が来たら年齢が変わると考えておk。

// DateTime d1 = 指定日付, d2 = 誕生日
int age;
if (d1 < d2)
{
  // 何かしらエラー処理する
}
else if (d1.Month > d2.Month || (d1.Month == d2.Month && d1.Day >= d2.Day))
{
  age = d1.Year - d2.Year;
}
else
{
  age = d1.Year - d2.Year - 1;
}

149:デフォルトの名無しさん
09/03/03 23:36:04
税金関係は1年=365日で定数だった気が

誕生日の前日に年取るのは閏日生まれの為だし

150:デフォルトの名無しさん
09/03/03 23:42:56
>>106
詳しく!
ヘルプミー
今日で約1週間!俺はアホなのかー♪;;

151:デフォルトの名無しさん
09/03/03 23:48:42
>誕生日の前日に年取る
これじゃ不正確
民法の試験じゃ×になる

152:デフォルトの名無しさん
09/03/03 23:50:26
だからなんだよ。司法関係者にでもなるのか?

153:デフォルトの名無しさん
09/03/03 23:52:06
うん
応援してね

154:デフォルトの名無しさん
09/03/03 23:54:27
                  .∧__,,∧
                 (´・ω・`)
                  (つ夢と)
                  `u―u´

          あなたの後ろに落ちてたこれを、






        ∧__,,∧                         ∧__,,∧
      (`・ω・ ) ミ                   (`・ω・´)
        (     つ  ⌒ヽ               と   ,u、つ
      `u―u'     夢               `u´夢
                YY⌒Y
         こうして、                   こうして、



                    ∧__,,∧
            _     (ω・´ )
         夢 三ニ ☆ __,(    )つ
              ̄    `ー―‐u'

                 こうだ !


155:デフォルトの名無しさん
09/03/04 00:01:14
>>150
Data Source=***.***.***.***,????;Initial Catalog=++++;Persist Security Info=True;User ID=--;Password=\\\\

***.***.***.*** ipaddress
+++ データベース名
-- 接続するユーザ名
\\\\ 接続するユーザ名のパスワード

で接続できた。インスタンスは規定のインスタンスだから指定なし

156:デフォルトの名無しさん
09/03/04 00:02:31
>>151
んでシステム上ではどうするのが正解なんだい

157:デフォルトの名無しさん
09/03/04 00:03:39
すまん
????はポート

158:デフォルトの名無しさん
09/03/04 00:18:44
                  .∧__,,∧
                 (´・ω・`)
                  (つ夢と)
                  `u―u´

                  回収!!


159:デフォルトの名無しさん
09/03/04 00:20:33
ポート・・・?うーん勉強してきます・・・
ありがとう

160:デフォルトの名無しさん
09/03/04 00:20:54
  ∧_∧
  ( ・∀・)
 と    )シュッ
   Y しノ彡    -=ニ三      夢
  ヽ  )



161:デフォルトの名無しさん
09/03/04 00:29:25
                  .∧__,,∧
                 (´・ω・`)
                  (つ夢と)
                  `u―u´

                もう離すものか!!
                だれにも渡さない!



162:デフォルトの名無しさん
09/03/04 00:31:26
      ∧_∧
   ∧_(∀゚ ; )
  ( ・∀・)   つ
  (っ夢⊂≡て ヽ よこせ
  して_)_ノw (_)

  ∧_∧
  ( ・∀・)
 と    )       シュッ
   Y しノ彡    -=ニ三      夢
  ヽ  )



163:デフォルトの名無しさん
09/03/04 00:35:28
いつも思うんだが、お絵かきできてうれしくなっちゃう奴って
精神年齢が幼稚園時代で止まってるのか?

本気で理解できんよ。

164:デフォルトの名無しさん
09/03/04 00:37:57
コピペネタにマジレスかよw

165:デフォルトの名無しさん
09/03/04 00:40:47
                  .∧__,,∧
                 (´・ω・`)
                  (つポート
                  `u―u´
ポートとは何ぞや!

166:デフォルトの名無しさん
09/03/04 00:41:35
コピペだろうが何だろうがマジレスしてもらえるだけありがたいだろ

167:デフォルトの名無しさん
09/03/04 00:42:42
わりい間違えた 
×マジレス
○キチガイレス
だわ

168:デフォルトの名無しさん
09/03/04 00:44:22
>>132
25が重複してるが、当分割と仮定して、

var list1 = list.Take(25).ToList();
var list2 = list.Skip(25).Take(25).ToList();

>>139
int age = target.Year - birth.Year;
if(target < birth.AddYears(age)) age--;

169:デフォルトの名無しさん
09/03/04 00:45:07
>>163
お絵かき楽しいだろ。
素直になれよ。

170:デフォルトの名無しさん
09/03/04 09:49:54
>>159
特別な事情がない限りSQL Serverのポート番号はデフォルトの1433なので省略可能。
ので接続先のマシンがたとえば192.168.1.1でインスタンス名がSQLEXPRESSなら
Data Source=192.168.1.1\SQLEXPRESS
だし、既定のインスタンスに接続するならインスタンス名も省略できて
Data Source=192.168.1.1
で、特別な事情(SQL Server 2000/2005/2008を共存させてるとか)があって別のポート(たとえば11433)を使っているなら
Data Source=192.168.1.1,11433\OTHERINSTANCE
それでもつなげないなら接続先のファイアウォールが邪魔してると思われる。

171:デフォルトの名無しさん
09/03/04 10:12:34
そもそもManageMentStudioExpressとかで繋げてるのかな…・?

172:デフォルトの名無しさん
09/03/04 10:46:18
>>159
>>171も言ってるように、SSMSとかサーバーエクスプローラとかで接続してみるのが先だな。
てか、TCP接続ってデフォルトでOFFじゃなかったか?

それにしても斬新な区切り方だな>>171

173:デフォルトの名無しさん
09/03/04 11:39:32
C#でアッカーマン関数を計算させようとしていますが、スタックオーバーフローが
起きます。C#でスタック領域を広げるにはどうすればいいのですか?

174:デフォルトの名無しさん
09/03/04 11:55:25
多倍長計算させて、それでスタックが足りなくなってるの?
それとも、普通にInt32なりInt64なりを使っていて、再帰が
深くなりすぎてスタックが足りなくなってるの?

後者だとしたら、どうせ計算可能な部分はめちゃめちゃ限られているので、
アッカーマン関数の値を計算していく順序を工夫すべきだと思う。

URLリンク(www.google.co.jp)アッカーマン関数&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
これ見ると分かるけど、m=3以降に関しては、頑張っても報われないよ?


175:デフォルトの名無しさん
09/03/04 11:59:52
>>173
>>174で答えが出てるけど、どうしてもスタック領域を広げたいという話であれば
Threadクラスのコンストラクタで指定できるらしい。試してないけど。
URLリンク(msdn.microsoft.com)


176:デフォルトの名無しさん
09/03/04 12:01:22
>>174
再帰が深くなりすぎます

>>175
具体的にはどのようなコードを書けば良いのでしょうか?さっぱりわかりません

177:デフォルトの名無しさん
09/03/04 12:02:40
例えば大きな配列を確保する時など、後学のためにスタックサイズを
広げる方法を知っておきたいのです。C/C++ならリンカオプションで
簡単に出来るのですがC#では何かよくわかりません

178:デフォルトの名無しさん
09/03/04 12:06:58
Threadクラスの(ThreadStart, Int32)のコンストラクタ

179:デフォルトの名無しさん
09/03/04 12:07:08
.NETの配列はヒープに領域を取るのでスタック関係なし
再帰はスタックサイズの変更よりループに展開することを考えた方がいい

180:デフォルトの名無しさん
09/03/04 12:07:47
>>178
それはヘルプを見て確認していますが、使い方がわからないのです
短いコードで良いので具体的な使い方を教えていただきたいのです

181:デフォルトの名無しさん
09/03/04 12:09:45
別のスレッドを作ってそっちで動かすってこと
C# スレッド でググれ

182:デフォルトの名無しさん
09/03/04 12:10:34
>>181
もちろん既にぐぐっていますがよくわからないのです

183:デフォルトの名無しさん
09/03/04 12:12:09
スレッドが分からないくらいだったら
スタックサイズとか変なこと考える前に基礎をやれとしか

184:デフォルトの名無しさん
09/03/04 12:17:16
using System;
using System.Threading;

class Program
{
static void Main()
{
int maxStackSize = 1 * 1024 * 1024 * 1024;
Thread th = new Thread(DoWork, maxStackSize);
th.Start();
}

static void DoWork()
{
//...
}
}


185:デフォルトの名無しさん
09/03/04 12:27:24
>>184
ありがとうございます
助かりました
これを参考に作り直してみます

186:デフォルトの名無しさん
09/03/04 12:31:13
Stack<T>でも使って引数だけでもヒープに置くようにしたらだいぶマシなんじゃない
>このコンストラクタのオーバーロードを使用しないでください。
だし

187:デフォルトの名無しさん
09/03/04 12:53:12
遅そうだけど素直に展開したらこんな感じか
Stack<long> stack = new Stack<long>();
stack.Push(m); stack.Push(n);
while (1 < stack.Count) {
n = stack.Pop(); m = stack.Pop();
if (m == 0) { stack.Push(n + 1); }
else if (n == 0) { stack.Push(m - 1); stack.Push(1); }
else { stack.Push(m - 1); stack.Push(m); stack.Push(n - 1); }
}
return stack.Pop();

188:デフォルトの名無しさん
09/03/04 14:12:06
>>139-143

20090304 - 19870305 = 219999

これを10000で割った商が年齢になる。
別にうるう年とか全然関係ない。
このスレは算数もできない文系プログラマばっかりなのか?


189:デフォルトの名無しさん
09/03/04 14:20:49
算数や数学の問題じゃないだろうw
ともかくそれで正確な答えが出るんだったら便利だな

190:デフォルトの名無しさん
09/03/04 14:41:44
>>188
すげーw
おまえ天才だなw

191:デフォルトの名無しさん
09/03/04 15:04:33
結局、月を比較して同月なら日を比較してるだけじゃん

192:デフォルトの名無しさん
09/03/04 15:11:11
>>191
何を言っているんだ?

193:デフォルトの名無しさん
09/03/04 15:13:56
さすがC#スレ
レベルが低すぎる
日曜プログラマならぬなんちゃってぷry

194:デフォルトの名無しさん
09/03/04 15:23:20

int ydiff = dt1.Year - dt2.Year;
if (dt1.AddYears(-ydiff).CompareTo(dt2) < 0) { ydiff--; }



195:デフォルトの名無しさん
09/03/04 15:24:52
どうみても算数や数学の問題だろう。
極論を言えば、
1+2+4+8+16+32+.................+1024を求めるときに、
思考を放棄している人間はそのまま足していくか諦める。
思考する人間は、
S=1+2+..........+1024とおいて、
2*S = 2+4+........+2048との差を求めることで和を得る。
これは別に学校で等比級数の公式を習ったかどうかという問題ではない。

>>140で答えが出ているのに、>>143みたいな思考を放棄したプログラマは考えもせずただ

>正確には月を比較して、同月なら日を比較して、年の差から年齢を求めるが正しい気がする。
こんなことを言い出す始末。
これは上の問題で言えばそのまま足していく人間だと言うことだよ。

プログラマだったら便利なメソッドが用意されてなかったら自分で考えて作るくらいのアタマが欲しいところだ。

196:174
09/03/04 15:42:06
アッカーマン関数の話だけど、
・同じ行では左側(nが小さい方)しかか参照しない
・上(mが小さい方)の列程計算可能な行(n)は多い
なので、再帰を使わずに、表の参照と捉えた方が良い。
そうしないと、同じ枡を何度も無駄に計算する事になる。

List<List<int>> Ack = new List<List<int>>();
とか作って、
            const int maxN = 100000;
            int m = 0, n = 0;
            while (true) {
                Ack.Add(new List<int>());
                n = 0;
                while (true) {
                    try {
                        if (n > maxN) throw new Exception();
                        if (m == 0) {
                            Ack[m].Add(n + 1);
                        } else if (n == 0) {
                            Ack[m].Add(Ack[m - 1][1]);
                        } else {
                            Ack[m].Add(Ack[m - 1][Ack[m][n - 1]]);
                        }
                        n++;

197:デフォルトの名無しさん
09/03/04 15:42:47
                    } catch {
                        Console.WriteLine("for m=" + m.ToString("0")+ " calculation is terminated at n=" + n.ToString("0") + ".");
                        break;
                    }
                }
                if (Ack[m].Count == 0) break;
                m++;
            }
ってやれば、再帰は必要ない。再帰ではなく、表の参照だと考えて、
各枡の値を計算するにはどの枡の情報が必要かを考える。

環境によってmaxNを色々変えるとベンチマークにもなるかも。

198:デフォルトの名無しさん
09/03/04 16:06:39
>>192
構造上、比較の優先順構造が桁の上下に投射されているだけだという話だろ

199:デフォルトの名無しさん
09/03/04 16:14:13
ASP.NET でC#使ってます。VS2008。
Default.aspxが呼ばれたときに
それがWebClientからの要求かブラウザからの要求かを
見極める方法はありますか?
WebClientからの要求がTrueでその他はFalseと判断したいです。
ブラウザプロパティを見てみると
WebCleintの場合は"Unknown"と出るんですが、
新しいブラウザが開発されたらUnknownになるかなと思ったんです。
QueryStringによる判断は不可です。
ブラウザで直打ちされたらtrueになるので。
どなたかよろしくお願いします。

200:デフォルトの名無しさん
09/03/04 16:33:00
HTTPリクエストヘッダなんかいくらでも詐称できる

201:デフォルトの名無しさん
09/03/04 16:36:26
>>188
言ってることはわかるし、凄いとも思うんだが、C#のコードで表現すると
さほどシンプルでもないんじゃね。
int age = ((today.Year * 10000 + today.Month * 100 + today.Day)
  - (birthday.Year * 10000 + birthday.Month * 100 + birthday.Day)) / 10000;



202:デフォルトの名無しさん
09/03/04 16:41:10
>>195
「引き算」と書かれてそれを鵜呑みに信じることこそが、真の思考を放棄していないプログラマなんだな。
楽だな。

203:デフォルトの名無しさん
09/03/04 16:44:54
>>201 引き算だってC#で書けるだろ。
>>188はyyyyMMddを引き算すればいいじゃんってことを言っているわけで
わざわざ>>201みたいなコード書く必要ないよ、ってことだよ。
どう考えても>>188がシンプルで >>188の勝ちであることは否めない。
君の負け。

204:デフォルトの名無しさん
09/03/04 16:46:16
>>201
年未満の線形性を切り捨てる代わり、うるう年を考えなくてもいいというのが利点

205:デフォルトの名無しさん
09/03/04 16:48:17
勝ちとか負けとかガキかよw

206:デフォルトの名無しさん
09/03/04 16:48:46
>>203
yyyyMMddをどこから持ってくるかという話でしょ。
intで定義されてるなら>201みたいな操作が必要だし、
Stringでとるならそれでもいいし。

207:デフォルトの名無しさん
09/03/04 16:53:17
>>202
そんな悪態ついてないで素直になれよ。
最も合理的な解決策を見つけるのもプログラマの仕事ってことを言ってるんだろ。
それが積もってパフォーマンスに影響してくるんだからさ。
悔しいのは分かるけど、プライドでプログラムやるもんじゃない。


208:デフォルトの名無しさん
09/03/04 16:57:00
>>206 どこから持ってくるも何も
int.Parse(DateTime.ToString("yyyyMMdd"))
とかでいいじゃん。Convert.ToInt32でもいいよ。


209:デフォルトの名無しさん
09/03/04 16:57:31
>>203
で、コードは?

210:188
09/03/04 16:57:41
>>201
なんだその糞コードは・・・

int nToday = int.Parse(today.ToString("yyyyMMdd"));
int nBirthday = int.Parse(birthday.ToString("yyyyMMdd"));

int age = nToday - nBirthday;

どうみてもシンプルだと思うが。。。
スレ住人のセンスを疑うな・・・

211:デフォルトの名無しさん
09/03/04 16:59:50
日付→文字列→数値と変換するオーバーヘッドを気にする俺は古い人間なのか?

212:デフォルトの名無しさん
09/03/04 16:59:51
>>209
そんなコードも考えられないようなお前の脳みそを疑うよ・・・

213:デフォルトの名無しさん
09/03/04 17:00:21
>>207
「引き算」と言われて何も疑わず信じることが思考停止でなくてなんなんだ?

214:デフォルトの名無しさん
09/03/04 17:01:59
>>210
完全にトドネト脳だな

215:デフォルトの名無しさん
09/03/04 17:02:07
int.Parse(DateTime.ToString("yyyyMMdd"))
これだけの操作の裏で、どれだけ複雑な操作が行われているか想像できない方が
プログラマとして不適格だろ。

216:デフォルトの名無しさん
09/03/04 17:04:18
>>213
必死だなお前w
「引き算」と言われて、>>143みたいに
「引き算だとうるう年とかあるからダメだぜ?分かってねぇなあ。俺みたいにきちんとやるのが正しいんだよ!」
というような、
自分のやり方が一番正しいとして他人の意見をくみ取りもしないことが思考停止って言ってんの。

217:デフォルトの名無しさん
09/03/04 17:06:43
>>207
>正確には月を比較して、同月なら日を比較して、年の差から年齢を求めるが正しい気がする。

>20090304 - 19870305 = 219999
はやり方が違うだけで言ってることは同じ。

下4桁の引き算がif (d1.Month > d2.Month || (d1.Month == d2.Month && d1.Day >= d2.Day)) にあたり、
その結果、単に引くだけか、-1するかの違いだからな。

218:デフォルトの名無しさん
09/03/04 17:07:49
雑談はよそでやれよ

219:デフォルトの名無しさん
09/03/04 17:08:04
>>211
気になったら後でリファクタリングすればいい
まあある程度の規模になるなら、線形性がないという問題を抱え込んだままにしておくのは怖いが。

220:デフォルトの名無しさん
09/03/04 17:08:10
>>213 お前プライドの塊だな。めんどくさいやつだな。

221:デフォルトの名無しさん
09/03/04 17:09:45
>>216
だからその結果が正しいかどうかを疑わず信じろというのは思考停止だろ?
本当にそれで可能かどうか検討もせず受け入れるのが思考停止でなくてなんなんだ?

222:デフォルトの名無しさん
09/03/04 17:11:12
>>216 結果が正しいかどうかはデバッグすればわかるだろ・・・
頭悪すぎるぞこいつ・・・。

223:222
09/03/04 17:12:02
間違えた
×>>216
>>221


224:デフォルトの名無しさん
09/03/04 17:13:12
>>223
>結果が正しいかどうかはデバッグすればわかるだろ・・・
この時点で正しいかどうか疑ってるからデバッグするわけだろ?
思考停止じゃないじゃん。


225:デフォルトの名無しさん
09/03/04 17:14:51
年齢計算で、閏年はどうなるんだ?と考えるのは当然だよな。
盲目的に受け入れるほうがおかしい。

226:デフォルトの名無しさん
09/03/04 17:15:30
>>210
>>194のほうがシンプルじゃないかい?
そのままだと2月29日と2月28日を比較したときに、
2月29日の時刻が比較対象より前だと間違いになるので、
(そもそも時刻成分を考慮する必要がない気がするけど念のため)
ちょっと修正して:

int ydiff = dt1.Year - dt2.Year;
if (dt1.AddYears(-ydiff).Date.CompareTo(dt2.Date) <
0) { ydiff--; }



227:デフォルトの名無しさん
09/03/04 17:18:32
馬鹿にされた文系プログラマがわんさか湧いててワロスwww

>年齢計算で、閏年はどうなるんだ?と考えるのは当然だよな。
うん

>盲目的に受け入れるほうがおかしい。
うん、だから「閏年を考慮したら引き算ではつじつまが合わなくなる」という
自分の意見が正しいという意見を盲目的に信じるのはおかしいよな?

228:デフォルトの名無しさん
09/03/04 17:20:16
Func<DateTime, int> hoge = (x) => int.Parse(x.ToString("yyyyMMdd"));
return (hoge(to) - hoge(from)) / 10000;

Func<DateTime, int> hoge = (x) => x.Year * 1000 + x.Month * 100 + x.Day;
return (hoge(to) - hoge(from)) / 10000;


たいしてかわらん。

229:デフォルトの名無しさん
09/03/04 17:21:18
>>227
そこから検算してああ正しいんだなと理解すれば問題ないじゃんw
言われてはいそうですかじゃアホだろ

230:デフォルトの名無しさん
09/03/04 17:23:29
おいおい、なんでこんな厨臭くなってるんだw
初心者スレで言い合いすんなよガキだな

231:デフォルトの名無しさん
09/03/04 17:24:57
エレガントな解を示したつもりが、あまり賞賛されなかったので拗ねているんです。

232:デフォルトの名無しさん
09/03/04 17:27:15
結局>>217が真理
計算方法が違うだけで意味はどちらも同じ

233:デフォルトの名無しさん
09/03/04 17:34:10
意味がどちらも同じなのはみんな分かってるよ。
今話題になっているのはコードの美しさと可読性だろ?
俺は少なくとも>>148>>228みたいなコードを見比べたら、
>>228の方がデキるプログラマって感じがするけどな。

234:デフォルトの名無しさん
09/03/04 17:36:56
>>233

>>148が文系プログラマ、>>228が理系プログラマですね、わかります。

235:デフォルトの名無しさん
09/03/04 17:38:55
ラムダ式って美しいんですか?(スマートな解という意味で)
美しいなら勉強するよ!

236:228
09/03/04 17:40:31
× x.Year * 1000
○ x.Year * 10000

プギャー(AAry

237:デフォルトの名無しさん
09/03/04 17:46:46
>>235
ぼちぼち美しい

238:デフォルトの名無しさん
09/03/04 17:54:00
動的に処理を差し替えるような必要があればラムダ式は有効だけど
>>228のケースでは意味がないな。違いはメソッドより効率が悪いこと。
長くなるのを避けてるだけだと思う。

239:デフォルトの名無しさん
09/03/04 18:06:02
>>235
まあ>228レベルならC的関数定義の別の書式に等しい。
マ的には現代的関数型言語みたいに、ラムダ計算後にインライン化とか末尾最適化が言語で保障されているなら嬉しいけど。

240:デフォルトの名無しさん
09/03/04 18:18:54
知識はあってもかしこくない
だめだこりゃ
関数がいやならC#やるな

241:デフォルトの名無しさん
09/03/04 18:31:11
どこをどう読んだら誰が関数が嫌なんて言ってるように見えるんだろう

242:デフォルトの名無しさん
09/03/04 18:48:32
ラムダ式は超美しい。

243:デフォルトの名無しさん
09/03/04 18:54:43
どうでもいいよ

244:174
09/03/04 18:56:15
みんなー、アッカーマン関数の話しようぜー。
>>174のコードだと、m=0, n=int.MaxValue-1みたいなケースが計算できない
のが嫌だ。ていうかそもそもの問題は多分アッカーマン関数の表を一気に計算する
コードじゃなくって、与えられたm,nに対してアッカーマン関数の値を計算するコード。

なので、>>187のスタック使ってヒープを使って再帰する方法と、ハッシュ使って
計算済みの値を再利用する方法を組み合わせたアプローチにしてみた。値を再利用
するので、表を生成する用途でも有効。

うちの環境(メモリ1GB)では
m=0でn=int.MaxValue-1まで
m=1でn=10000000くらいまで
m=2でn=5000000くらいまで
m=3でn=20まで
m=4でn=1まで
計算できた。

スレの空気読まずにコードアップするぜ!
        static Dictionary<int, Dictionary<int, int>> Ack
          = new Dictionary<int Dictionary<int, int>>();
        static Stack<int> argM = new Stack<int>();
        static Stack<int> argN = new Stack<int>();
        static int Ackermann(int m, int n)
        {
            argM.Clear();
            argN.Clear();
            argM.Push(m);
            argN.Push(n);
            while (argM.Count>0) {

245:174
09/03/04 18:57:14
                if (!Ack.ContainsKey(argM.Peek())) Ack[argM.Peek()] = new Dictionary<int, int>();
                if (Ack[argM.Peek()].ContainsKey(argN.Peek())) {
                    argM.Pop();
                    argN.Pop();
                    continue;
                } else {
                    int value;
                    if (argM.Peek() == 0) {
                        value = checked(argN.Peek() + 1);
                    } else if (argN.Peek() == 0) {
                        if (Ack.ContainsKey(argM.Peek() - 1) && Ack[argM.Peek() - 1].ContainsKey(1)) {
                            value = Ack[argM.Peek() - 1][1];
                        } else {
                            argM.Push(argM.Peek() - 1);
                            argN.Push(1);
                            continue;
                        }
                    } else {

246:デフォルトの名無しさん
09/03/04 18:58:25
アッカーマン関数なんて使わないし

247:174
09/03/04 19:00:46
                        int n_;
                        if (Ack.ContainsKey(argM.Peek()) && Ack[argM.Peek()].ContainsKey(argN.Peek() - 1)) {
                            n_ = Ack[argM.Peek()][argN.Peek() - 1];
                        } else {
                            argM.Push(argM.Peek());
                            argN.Push(argN.Peek() - 1);
                            continue;
                        }
                        if (Ack.ContainsKey(argM.Peek() - 1) && Ack[argM.Peek() - 1].ContainsKey(n_)) {
                            value = Ack[argM.Peek() - 1][ n_];
                        } else {
                            argM.Push(argM.Peek() - 1);
                            argN.Push(n_);
                            continue;
                        }
                    }

248:デフォルトの名無しさん
09/03/04 19:01:34
                    Ack[argM.Pop()][argN.Pop()] = value;
                    continue;
                }
            }
            return Ack[m][n];
        }
終わり。Ackermann(3,20);あたりで速さが実感できるぜ!。
あと、>>244の「>>174のコード」ってところ、アンカーミスで>>196のコードね。

>>246
>>173を思い出してあげてください。

249:デフォルトの名無しさん
09/03/04 19:08:28
Dictionary<int, Dictionary<int, int>>は効率悪いな
struct Key { public int M; public int N; public override int GetHashCode() { return M ^ N } }
こういうのをキーにしたらDictionary<Key, int>で済むのに

250:デフォルトの名無しさん
09/03/04 19:15:09
>>249
一般にはそうだろうけど、そもそも話題がアッカーマン関数だから、
mはどうせ0から5くらいまでしかとらないんだよね。だから別に
これでかまわないんじゃないかな。

あと、ハッシュ値の衝突って詳しくないんだけど、そういう衝突しまくる
ハッシュ関数って効率はどうなっているの?

251:デフォルトの名無しさん
09/03/04 20:49:39
ファイルを選択して、それを別のコンソールプログラムに読み込ませて
その結果の出力(文字列)を別ウィンドウに表示したいのですが、どうやればいいですか?
ファイル選択まではいいのですが、別のプログラムを起動してそいつに引数を
渡すにはどうすればよいですか?




次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5391日前に更新/246 KB
担当:undef