ふらっと C#,C♯,C# ..
[2ch|▼Menu]
2:デフォルトの名無しさん
14/12/25 22:07:11.73 FliVA0aI
>>1

3:デフォルトの名無しさん
14/12/25 22:37:54.34 aK/woPpc
記念Suica

4:デフォルトの名無しさん
14/12/26 09:36:19.64 PUSaAK8w
雑談スレかな?


5:デフォルトの名無しさん
14/12/26 16:49:55.14 O5hdQAyp
以下にある
- '0'
とはどういう意味なのでしょうか?文字(列)をint型に変換する方法はint.Parse()以外にもあるってことですか?


// 文字→整数
static int CharToInt(char c)
{
return c - '0';
}

6:デフォルトの名無しさん
14/12/26 16:52:59.92 xbXz+yuK
半角数字の文字コードは0から9まで1ずつ増加していくから
'9' - '0' のようにやれば9になる

charが半角数字だと分かっているなら'0'を引けばその数値が出るってこっちゃ

7:デフォルトの名無しさん
14/12/26 17:08:23.50 O5hdQAyp
>>6
ありがとうございます。うーんまだよく理解できないので次の2つの質問もよろしくお願いします。

・CharToInt()は戻り値がintなのに
return c - '0';
でchar型を返してもエラーにならないのはなぜか

・if('0' <= c && c <= '9') 
にあるようにchar型の大小比較を出来るのはなぜか

8:デフォルトの名無しさん
14/12/26 17:11:32.94 xbXz+yuK
>>7
charは2バイトの数値だから足したり引いたりintにしたり比較したり出来る
ユニコードの文字コードとして解釈すれば文字として使える

9:デフォルトの名無しさん
14/12/26 17:28:02.32 O5hdQAyp
>>8
ありがとうございます。ということは四則演算や大小比較の演算子の引数にchar型変数を渡すと
コンパイラ(?)の方で勝手にその文字に割り当てられている数値をint型に直して計算してくれるということでしょうか?
これってString型でも同じなんでしょうか?

10:デフォルトの名無しさん
14/12/26 18:01:42.94 S+6Wj5Hd
この場合、'0'を数値にしたら48になる
文字一個一個が↓の数値と対応している
URLリンク(www.tamasoft.co.jp)

11:デフォルトの名無しさん
14/12/26 18:05:13.87 TqBRiW7q
>>9
考え方が逆だな。
コンピュータって結局は、全ての情報を数値で扱っているんだよ。
char型も単に数値を格納しているだけ。なので、
c = '0'
というのは、実は、
c = 48
と書いたのと全く同じ処理が行われる。
で、その48という値を表示ルーチンに渡すと、対応する0という文字の絵を描いてくれるだけ。

12:デフォルトの名無しさん
14/12/26 18:08:56.52 TqBRiW7q
String型はちょっと事情が違っていて。
"123"と書くと、実はどこかのメモリに'1','2','3'の順番で一つずつ文字コードが格納されていて、
そのハンドルというか場所を示す値が、例えばこんな感じで格納されているようなもの。
s = "123"
s = 0x80567890

表示する時は、sの値から間接的に、その先に格納されている文字コードという値を取り出して
一つずつ表示する仕組み。

13:デフォルトの名無しさん
14/12/26 18:52:26.93 O5hdQAyp
皆さんありがとうございます。
int,char間で色々キャストして確かめてきました。

14:デフォルトの名無しさん
14/12/26 19:19:26.80 O5hdQAyp
すいません、最後にもう一つ質問お願いします。

int i = 'a' - 0;
int j = 'a' - '0';

の値を調べ見たところ
i:97
j:49
になってました。ASCIIコードにおいてaは10進数表記で97になるというのは分かったでんですが
j:49 は何に対応してるのでしょうか?

15:デフォルトの名無しさん
14/12/26 19:24:17.68 xbXz+yuK
'0'が48だってことを表してるんじゃねえの

16:デフォルトの名無しさん
14/12/26 19:25:38.41 lqtBR3a+
'0' ってのも数値。0x0030かな?
'a' ってのも数値

int j = 'a' - '0';
ってのは'a'って数値から'0'って数値を引いた値をjに代入って意味

17:デフォルトの名無しさん
14/12/26 19:30:26.21 O5hdQAyp
う…すごい単純なことでしたね
ありがとうございます。

18:デフォルトの名無しさん
14/12/26 20:00:11.61 wIqS8k7H
charはC#の言語仕様上特に整数型として指定されているので演算時に32/64ビット整数型に変換されるんだよ
だから>>11よりも>>9の方が真実に近い

19:デフォルトの名無しさん
14/12/26 20:14:25.29 9Ic4bu55
えー

20:11
14/12/26 20:32:57.54 TqBRiW7q
>>18
いや、>>9が初心者に有りがちな、文字というものを直接扱っている、と誤解してるので、あえて>>11を書いた。

まず、その誤解を解くことで、実際には文字では無く文字コードという数値で扱っているので、
引き算をしたり大小比較がなぜ出来るのかを理解して貰おうとした。

21:デフォルトの名無しさん
14/12/27 23:42:06.10 fGQ1PcvN
言い訳見苦しい

22:デフォルトの名無しさん
14/12/28 00:46:07.43 zsT2zdJj
>9と>11は矛盾してないだろ。どちらも正しい。
言語仕様7.3.6.2 Binary numeric promotions により
char同士の2項演算はintに変換されてから行われる。
そのchar→intの変換ルールは>11の通り。

23:デフォルトの名無しさん
14/12/28 01:08:02.99 Lh7uqEy1
もうわかったから

24:デフォルトの名無しさん
14/12/28 07:45:42.49 1AHF9F74
>>11が間違っている」じゃなくて「>>9の方が正確」と言われているんだよなあ

25:デフォルトの名無しさん
14/12/28 08:05:48.78 cwT7VysE
もうほんとわかったから

26:11
14/12/28 08:25:51.07 Rak+IxlV
レベルの違う話が混じって混乱しているんだな。
初心者が分かる説明の仕方と、実際の厳密な言語仕様の話と。

初心者の頃に自分もそうだったし、時々ム板でも数字と数値の違いが分かってない質問者が居るんで、
だから、型の話は置いといて、教科書の1, 2ページレベルの説明をまず行った >>11, >>12

27:デフォルトの名無しさん
14/12/28 09:10:43.54 XH4/KAur
>>7
>>6
>ありがとうございます。うーんまだよく理解できないので次の2つの質問もよろしくお願いします。

>・CharToInt()は戻り値がintなのに
>return c - '0';
>でchar型を返してもエラーにならないのはなぜか
int = char c - '0'は右辺が左辺の型に変換されるから

28:デフォルトの名無しさん
14/12/28 09:17:14.71 E59H8eun
↑嘘

29:デフォルトの名無しさん
14/12/28 09:27:03.40 fKzSeI49
char同士の引き算の結果はもともとint型なので変換不要

30:デフォルトの名無しさん
14/12/28 09:28:18.00 1AHF9F74
30もないんだから全部読んでからレスしようよ

31:デフォルトの名無しさん
14/12/28 11:39:00.10 Pa7xhT3W
指定したディレクトリ下にあるJPEGファイル以外を削除したいのですが
どう指定したらいいのかわかりません
RegExp使って指定しないとだめですか?

string[] delfiles = Directory.GetFiles(@指定ディレクトリ,"*.(?!jpg$)");
for (i=0; …
{ System.IO.File.Delete(@delfiles[i]); }

とかやってみたのですがdelfilesに何も入りません
初心者で本当にすみません
どうか教えてください。お願いします

32:デフォルトの名無しさん
14/12/28 11:42:40.80 1AHF9F74
"*.jpg"じゃないの
複数は出来ないはずなので最悪EnumerateFilesでLINQを使う

33:デフォルトの名無しさん
14/12/28 11:48:27.37 1AHF9F74
あ、以外ならEnumerateFilesするしかないね

34:デフォルトの名無しさん
14/12/28 12:17:05.24 XH4/KAur
>>29
左辺がlongだと?

35:デフォルトの名無しさん
14/12/28 12:59:20.40 fKzSeI49
左辺がlongだとint→longの暗黙変換
charは全く関係ない

36:デフォルトの名無しさん
14/12/28 13:01:28.67 mHcU474O
>>34
言語仕様7.3.6.2 Binary numeric promotionsによりintに変換されて引き算された後
言語仕様6.1.2 Implicit numeric conversionsによりlongに自動変換される

わかったらもう来るな
わからなくてももう来るな

37:デフォルトの名無しさん
14/12/28 13:02:16.27 1AHF9F74
>>35
違う。long operator-(long, long)が採用されてlongになる
全く関係ないのはint

38:デフォルトの名無しさん
14/12/28 13:02:20.63 oe5wWv8z
>>36
>>1を読み直せよカス

39:デフォルトの名無しさん
14/12/28 13:06:52.07 fKzSeI49
>>37
=より-の方が優先順位高いから先にchar-charとして解釈される
型推論の余地はない

40:デフォルトの名無しさん
14/12/28 13:08:07.94 oe5wWv8z
なんでこんな紛糾してるんだよ

41:デフォルトの名無しさん
14/12/28 13:11:00.88 1AHF9F74
「左辺」がどの演算子の左辺かに認識の相違があるな

42:デフォルトの名無しさん
14/12/28 13:13:44.65 fKzSeI49
>>41
ああそういうことか
でも結果の型はintが求められてるから=の右辺がlongだとコンパイルエラーになるはず

43:デフォルトの名無しさん
14/12/28 13:23:34.18 lr8z5sQQ
>>40
>なんでこんな紛糾してるんだよ
それは>>34の質問の仕方が不適切だったから

>int = char c - '0'は右辺が左辺の型に変換される
 ↓
>char同士の引き算の結果はもともとint型なので
 ↓
>左辺がlongだと? ←★

44:デフォルトの名無しさん
14/12/28 13:25:31.30 Pa7xhT3W
>>31です
>>33
ありがとうございました

45:デフォルトの名無しさん
14/12/29 11:00:41.90 urbNhfxY
2つ以上のスレッドで一つの変数や配列を扱うときに
誰かがアクセスしてるときにガードしたり
書き込める状態を待って書き込んだり
読み込める状態を待って読み込んだり
できるようにするにはどうしたらいいのでしょうか?
.netframework2.0と3.0以降に対応する必要があります。

46:デフォルトの名無しさん
14/12/29 11:04:26.78 QPHjbNzt
lock(this)って感じでlockステートメントに適当なオブジェクトを渡すと
同じオブジェクトを参照しているブロックは同時実行されない

それ以上に高度な制御はSystem.Threadingにいろんなクラスがあるから適当に使う

47:デフォルトの名無しさん
14/12/29 11:14:23.31 urbNhfxY
>lock(this)って感じでlockステートメントに適当なオブジェクトを渡すと
>同じオブジェクトを参照しているブロックは同時実行されない
レスありがとうございます
しかし、わからないケースがあります。
対象の変数がアクセス不可状態でlockを実行したときは
どうなるのでしょうか?

と、いうのは後だしでもうしわけないのですが
待ちが発生してしまうとまずいスレッドがあります。

アクセス可能をまって実行してくれるようなキューみたいな
処理が必要なのですが・・・

48:デフォルトの名無しさん
14/12/29 11:20:12.93 QPHjbNzt
2.0でその要件だと自分でスレッド立てて管理するしかないんじゃないかなあ

49:デフォルトの名無しさん
14/12/29 11:24:10.50 tirsBVZi
>>47
そんなキューがあったとして、どうやって使うつもり?
queue.Add(resource1, res1 => アクセス(res1)); //resource1がアクセス可になれば実行
queue.Execute(); // 同じスレッドでアクセス(res)を実行するなら結局ここでブロックされる

アクセス(res)を実行するのが別のスレッドでいいんならproducer-consumerでも使えばいい

50:デフォルトの名無しさん
14/12/29 11:41:32.14 urbNhfxY
>>48,49
待てないスレッドでは別スレッドを立ててしまえばいいのですね
んでその先でlockで待たせて書き込みさせるといいわけですね
ありがとうございます

51:デフォルトの名無しさん
14/12/29 11:48:09.08 tirsBVZi
>>50
先で待たせる必要はないけどな
どうせ同一のリソースを待ってる処理は同時に一つしか実行できないんだから、
一つのconsumerスレッドがキューに溜まった処理を順番に実行すればおk
.NET2.0だと余計に面倒かもしれないけど、consumerがマルチスレッドじゃなくなるので気が楽

52:デフォルトの名無しさん
14/12/29 11:55:52.18 QPHjbNzt
>>48も2スレッド構成を意図していたけど、負荷次第では多並列もありうる
でもその場合にThreadクラスを使うのはやめた方が良い

53:デフォルトの名無しさん
14/12/29 15:10:03.11 4sJ6Y8GP
スレリンク(linux板:782-番)
環境がLinuxなのでLinux板で聞いた所こちらの板に移動するように言われたのでよろしくお願いします。

プログラミングの勉強でlibarchiveを使ってみようと思い、超初心者なので数行づつ書いてはエラーなく実行できるか試しているレベルなんですが、次のコードをコンパイルして実行した所Segmentation faultが起きてしまいました。
URLリンク(codepad.org)

理由を考えてみたんですが分からず色々試してみた所
1. 「a = archive_read_new() ;」をコメントアウトする
2. 「struct stat* st ;」を「struct stat st ;」にして関係する部分を適切に書き換える(fstatの引数に渡すときに&amp;をつけて、->を.にする)
のどちらか一方をすると回避できることがわかりました。

スレリンク(linux板:784番)
にも書いたのですが、stをポインタにしても実体?にしても、ファイルサイズやinode番号などの情報は取得できたので問題ないかと思ったのですが、ポインタにするとなぜかa = archive_read_new()でSegmentation faultが起きてしまいます。
何故このような結果になるのでしょうか?

また、先のスレで「おまえの書いたプログラムってバッファーオーバーフロー攻撃と同じ事やってるんだけど自覚ある?」と言われてしまったんですがそれすらどの辺がいけないのかさえわかりません。
そちらも「ここがこうじゃ駄目」的な指摘をいただけると助かります。
長文ですいませんが、よろしくお願いします。

54:デフォルトの名無しさん
14/12/29 15:14:12.22 Kwqkco7T
メモリ確保きちんとしろ。そしてここはc++のスレじゃなくてc#のスレ。聞きたいなら知恵遅れ行け

55:デフォルトの名無しさん
14/12/29 15:17:41.29 4sJ6Y8GP
>c#のスレ
うわ、ほんとだ…
申し訳ない、ちょっと頭冷やして後日適切なスレで質問します
ほんとうに失礼しました。

56:デフォルトの名無しさん
14/12/29 21:00:59.47 /ysTeZx0
applicationsettingでアプリの設定値を保存できるようになったのですが、ビルドしたあと、exeファイルのみでも設定を保持します。設定値を保存しているファイルはどこにあるんですか?

57:デフォルトの名無しさん
14/12/29 21:11:15.85 QPHjbNzt
userSettingsはAppData内のuser.configなるファイルに保存される
applicationSettingsは知らん

58:デフォルトの名無しさん
14/12/29 21:34:35.27 p2rxLzbq
applicationの方はsaveの対象外よ

59:デフォルトの名無しさん
14/12/29 21:37:53.92 p2rxLzbq
って、.configが無いときの既定値の話か
settings.designer.csで定義されてるクラスに属性として記述されてるよ

60:デフォルトの名無しさん
14/12/29 23:33:30.05 /ysTeZx0
>>57-59
AppData/Localの中にフォルダーが作成されて、user.configができていました。

61:デフォルトの名無しさん
14/12/30 07:49:07.34 3uUPUGLX
ツイッタークライアントを作ろうと考えているのですが
テキストボックスやボタンが複数あるユーザーコントロールを
リストビューの様に一列表示するにはどうしたらよいのでしょうか。

DataGridViewCellの派生クラスを作る処理を調べたのですが
画像として描画する手段しか見つかりませんでした。

テキストボックスやボタンをユーザーコントロールで指定したまま動かしたいので
画像化せずに、ボタンはボタン テキストボックスはテキストボックスのままレイアウトして欲しいのですが
メソッド名、もしくはサンプルコードがありましたら教えて頂けますでしょうか。

62:デフォルトの名無しさん
14/12/30 08:02:22.31 WfP/XooQ
DataGridViewColumn+DataGridViewCellの派生でやるのも出来ると思うけど、WPFもしくは手動レイアウトを勧めるよ

63:デフォルトの名無しさん
14/12/30 08:27:38.18 3uUPUGLX
ありがとうございます。

androidのAdapterの様に、表示されていないコントロールを使いまわして
数千件あるTwitterのタイムラインを一つのリストに表示してもメモリをそれほど圧迫しないという仕組みは、dataGridViewやWPFには有りますでしょうか?

androidのアダプタ(listviewをコントロールする仕組み)のビュー(コントロール)を再利用する仕組みはこんな感じです
URLリンク(blogand.stack3.net)
URLリンク(blogand.stack3.net)
>ListViewは場合によってはたくさんの行を扱う必要があります。Viewオブジェクトは通常のオブジェクトに比べてサイズが大きいです。
>1000行あって1000個Viewを作っていたらメモリを圧迫します。たとえば1000行あるが画面上では10行しか表示しないなら
>10行+α分のViewだけ生成して、スクロールアウトしたものは次にスクロールインする行に使いまわすようにするとメモリを圧迫せずに済みます。

64:デフォルトの名無しさん
14/12/30 08:33:50.11 WfP/XooQ
それは.NET界隈だと「仮想化(Virtualization)」って奴でリスト系コントロールなら大抵サポートしている

65:デフォルトの名無しさん
14/12/30 08:58:30.32 4oGPFvlj
ItemsPanelにVirtualizingStackPanelでないStackPanel使ったら仮想化されないから注意ね
まあデフォルトがVirtualizingStackPanelだから、自分で設定しない限り大丈夫だと思うが

66:デフォルトの名無しさん
14/12/30 10:59:16.36 3uUPUGLX
ありがとうございます。

67:デフォルトの名無しさん
14/12/30 13:42:30.88 N20A9NEN
すみません、行き詰ってしまったので教えてください。
テキストボックス1にコピペで貼り付けたHTMLファイルの中から
<textarea id="abc">文章1</textarea>を検索して
文章1を取り出し、テキストボックス2に書き出したいのですが上手くいきません。
URLリンク(blogs.wankuma.com)
↑を参考にして
Regex reg1 = new Regex("<textarea id=\"abc\".*>(?<bun>.*)</textarea>");
string html = textBox1.Text;
if (!reg1.IsMatch(html))
{
return;
}
Match match = reg1.Match(html);
textBox2.Text = match.Groups["bun"].Value;
こうやったのですが、nullで検索にマッチしませんでした。
(HTMLの中には確実にそのIDのテキストエリアがあるのに)
どうかお願いします。

68:デフォルトの名無しさん
14/12/30 13:48:49.87 dxBK7ujR
スクレイピングに正規表現使うのが許されるのはリンク抽出まで
Html Agility Packとか使え

69:デフォルトの名無しさん
14/12/30 13:51:22.47 WfP/XooQ
その引数じゃ再現しない
id=の前に何か入っているとかそういうつまらん理由じゃないの

70:デフォルトの名無しさん
14/12/30 13:56:06.53 N20A9NEN
>>68
ごめんなさい、言ってる意味が分からないです。
本当に初心者なんです。
ただ、HTMLの要素として取得しようとしているのではないのです。
あくまで文章が欲しいだけなのです。

>>69
textareaのすぐ後ろにidがあります。間違いありません。
ただ、idの後ろにstyleがごちゃごちゃ入ってます。
<textarea id="abc" style="width:40em@important;">文章1(改行付き)</textarea>
という感じです。

71:デフォルトの名無しさん
14/12/30 13:58:25.05 WfP/XooQ
>>70
そりゃ改行のせいだ
(?<bun>[^>]*)とかに変えてみたら

72:デフォルトの名無しさん
14/12/30 13:59:06.22 w+AR/+6R
俺ならDOMで取り出す

73:デフォルトの名無しさん
14/12/30 14:02:00.64 i/f4ZUzi
RegexOptions.Singleline

74:デフォルトの名無しさん
14/12/30 14:03:10.98 dxBK7ujR
>>70
Webページから情報を抜くのには大きく分けて2つの方法がある
・HTMLソースをプレーンな文字列として扱い、正規表現などで必要なデータを抜く方法
・HTMLの構造(DOM)を論理的に解析してXPathなどで必要なデータを抜く方法
複雑になってくると前者じゃ対応できなくなるので後者を使う
後者なら>>68で言ったようなライブラリを利用してHTMLの解析を行う必要が有る

75:デフォルトの名無しさん
14/12/30 14:10:16.02 w+AR/+6R
仕様変更に強くすることを考えないようじゃ
いつまでたっても初心者

76:74
14/12/30 14:11:32.01 dxBK7ujR
ちなみに、後者のやり方さえ知ってれば単純な場合でも大抵後者の方が早いよ
正規表現が有効なのは、HTMLの構造とは無関係にURLとか時刻とか特定のパターンを抜き出す場合かな

77:デフォルトの名無しさん
14/12/30 14:13:27.86 N20A9NEN
>>71,73
どちらもやってみたのですが駄目でした。やっぱりnullになります。

>>74
ありがとうございます。
私は前者です。

78:デフォルトの名無しさん
14/12/30 14:20:17.29 N20A9NEN
すみません。俄然Html Agility Packに興味が出てきました。
謎を放置するのはよくないとは思うのですが、
Html Agility Packをちょっと調べてみます。
ありがとうございました。
>>ID:WfP/XooQさん本当にありがとうございます。

79:デフォルトの名無しさん
14/12/30 16:15:56.86 N20A9NEN
何度もすみません。
おかげさまでHtml Agility Packであっさり取れました。ありがとうございました。

ところで今回、初めて外部からdllを参照したのですが、
Releaseして作ったexeファイルをよそのPCで使うとき、このdllもそのPCにコピーする
必要があるのでしょうか。

80:デフォルトの名無しさん
14/12/30 23:26:44.33 RTKUjPuf
演算子のオーバーロードって何に使うんですか!?

81:デフォルトの名無しさん
14/12/30 23:57:20.34 8ULPcfoj
1+1=3だと言いはるため

82:デフォルトの名無しさん
14/12/31 00:00:46.64 TRuhXuQQ
>>81
それってオーバーライドじゃね?

83:デフォルトの名無しさん
14/12/31 00:05:40.58 OSM3Gjj+
+より*が優先される
みたいなインチキは普通のメソッドでは出来ないっしょ

84:デフォルトの名無しさん
14/12/31 00:07:33.18 JGm7gXmH
何って、例えば文字列に + が無かったら不便だろ?
"abc" + "def" を
"abc".Append("def") みたいに書かないといけなくなる。
表現したい対象が記号的に書かれているときに
なるべくそれに近い形で記述できるようにするため。数学の行列とかな

85:デフォルトの名無しさん
14/12/31 07:01:52.14 eL28qisr
>>80
たとえば、longなら足せるのにintだと足せないと不便だろ
あるいはクラス同士を+で計算させたいときとか
そう言うときに+演算子をオーバーロードする

86:デフォルトの名無しさん
14/12/31 07:03:24.58 EgsEk8JH
できない言語使ってみればありがたみが分かるよ

87:デフォルトの名無しさん
14/12/31 07:13:24.12 EgsEk8JH
>>79
必要ある
自分のPCで使うとか、仲間内で使うならどうでもいいが
一般に配布するならライブラリのライセンスを必ず読むように
MS-PLだからHtml Agility PackのReadmeをコピーしとくだけでいいと思うが


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

3459日前に更新/25 KB
担当:undef