C#の疑問がいっぱい

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

Name: ちゃん太
[URL]
Date: 2016年12月29日(木) 22:42
No: 1
(OFFLINE)

 C#の疑問がいっぱい

C#を組んでいて分からないことがいっぱいあるので教えて下さい。

①これは、都合上の問題なんですが、コマンドプロンプトが実行時すぐ閉じてしまいますよね?これを閉じないようにする方法を教えて下さい。
for(i=1; i<=1000000 i++){}を行の最後に入れるみたいな力業はなしでお願いします。待機してるみたいな感じのコードを追加できませんか?

②MemoryStreamの使い方、用途が分かりません。
テキストファイルなどを一時的にMemoryStream型の変数に格納してDataobject型に渡すやり方があるそうですが、わざわざそんなことする意味ってあるんですか?テキスト→Dataobjectではダメなのですか?

③MemoryStreamの閉じ方を教えて下さい。これってDisposeしなきゃダメですよね?
MemoryStream ms;
を使うとmsのDIsposeっていつすればいいんですか?

環境ですが
Visual C# 2010 Expressです。

Name: metaphor
[URL]
Date: 2016年12月30日(金) 00:42
No: 2
(OFFLINE)

 Re: C#の疑問がいっぱい

① Console.ReadKey();コードを追加。

② MSDNのSample---いまVS2008で確認した。
  ・MemoryStreamの使い方:MSDNのSample
  ・用途:バッキング ストアとしてメモリを使用する
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using System.IO;
using System.Text;
 
class MemStream
{
    static void Main()
    {
        int count;
        byte[] byteArray;
        char[] charArray;
        UnicodeEncoding uniEncoding = new UnicodeEncoding();
 
        // Create the data to write to the stream.
        byte[] firstString = uniEncoding.GetBytes(
            "Invalid file path characters are: ");
        byte[] secondString = uniEncoding.GetBytes(
            Path.GetInvalidPathChars());
 
        using (MemoryStream memStream = new MemoryStream(100))
        {
            // Write the first string to the stream.
            memStream.Write(firstString, 0, firstString.Length);
 
            // Write the second string to the stream, byte by byte.
            count = 0;
            while (count < secondString.Length)
            {
                memStream.WriteByte(secondString[count++]);
            }
 
            // Write the stream properties to the console.
            Console.WriteLine(
                "Capacity = {0}, Length = {1}, Position = {2}\n",
                memStream.Capacity.ToString(),
                memStream.Length.ToString(),
                memStream.Position.ToString());
 
            // Set the position to the beginning of the stream.
            memStream.Seek(0, SeekOrigin.Begin);
 
            // Read the first 20 bytes from the stream.
            byteArray = new byte[memStream.Length];
            count = memStream.Read(byteArray, 0, 20);
 
            // Read the remaining bytes, byte by byte.
            while (count < memStream.Length)
            {
                byteArray[count++] =
                    Convert.ToByte(memStream.ReadByte());
            }
 
            // Decode the byte array into a char array
            // and write it to the console.
            charArray = new char[uniEncoding.GetCharCount(
                byteArray, 0, count)];
            uniEncoding.GetDecoder().GetChars(
                byteArray, 0, count, charArray, 0);
            Console.WriteLine(charArray);
        }
    }
}


③ usingステートメントを使えば「Disposeメソッド」が呼び出されることを保障します。

「MSDN の Sample 通り


・”誰から””どんな時”に聞きましたか?(Time(時間)、Place(場所)、Occasion(場合)を詳しく。
「テキストファイルなどを一時的にMemoryStream型の変数に格納してDataobject型に渡すやり方があるそうですが、わざわざそんなことする意味ってあるんですか?テキスト→Dataobjectではダメなのですか?」
---
私はPowerShell_iseを愛用してるから①の問題は起きない。

Name: ちゃん太
[URL]
Date: 2016年12月30日(金) 11:49
No: 3
(OFFLINE)

 Re: C#の疑問がいっぱい

いきなり膨大な量のコード書かれても理解できません
すいません、ここで聞くより初心者サイトから勉強したほうがいいですか…

Name: YuO
[URL]
ハッカー(144,289 ポイント)
Date: 2016年12月30日(金) 12:09
No: 4
(OFFLINE)

 Re: C#の疑問がいっぱい

ちゃん太 さんが書きました:①これは、都合上の問題なんですが、コマンドプロンプトが実行時すぐ閉じてしまいますよね?これを閉じないようにする方法を教えて下さい。
for(i=1; i<=1000000 i++){}を行の最後に入れるみたいな力業はなしでお願いします。待機してるみたいな感じのコードを追加できませんか?

  • リリース版での話であれば,コマンドプロンプトを起動して実行することで結果が残ります。
    エクスプローラーからの起動で終了するのは,上記を優先した結果の仕様としか言い様がないです。
  • デバッグ版をVisual Studioから起動した場合の話であれば,metaphorさんの書かれているようなConsoleの読み込み系のコードを追加しておくか,Mainメソッドの末尾にブレークポイントを仕込むことで対処ができます。

ちゃん太 さんが書きました:②MemoryStreamの使い方、用途が分かりません。
テキストファイルなどを一時的にMemoryStream型の変数に格納してDataobject型に渡すやり方があるそうですが、わざわざそんなことする意味ってあるんですか?テキスト→Dataobjectではダメなのですか?

入出力がStreamでしかできないAPIに,メモリで構築したものを使う,などの利用方法があります。
データのデシリアライズ用途であれば,Streamは読み込む時間だけ保持すればよいため,FileStreamを直接渡しても問題ないですが,
Streamを保持したまま長い時間処理するような場合は,MemoryStreamにコピーする事でファイルやネットワークなどを解放することができます。

実際問題としては,こういうものがあると知っていることが重要で,使い方がわからないのは現時点では不要だからかと思います。

ちゃん太 さんが書きました:③MemoryStreamの閉じ方を教えて下さい。これってDisposeしなきゃダメですよね?
MemoryStream ms;
を使うとmsのDIsposeっていつすればいいんですか?

MemoryStreamに限って書くなら,呼び出し不要です。

MemoryStreamは内部にbyteの配列を持ったStreamなので,CLRが面倒を見ないリソースを抱えていません。
このため,Disposeを呼び出さなくてもリソースのリークは発生しません。

ただし,MemoryStreamクラスのベースクラスであるStreamクラスはファイナライザ (C#的にはデストラクタ) を実装しています。
この影響で,MemoryStreamはGCが2段階で行われます。
CloseメソッドまたはDisposeメソッドを呼ぶと,ファイナライザの呼び出しが抑制されるため,GCが1回で済むようになります。
GCの呼び出しを最低限に抑えたいならば,CloseまたはDisposeメソッドを呼び出すとよいでしょう。
Offtopic :
IDisposableでDisposeを呼び出す必要があるのかを毎回確認するのは面倒なので常にusingに入れる,等の考え方も当然あり得ます (実は私はこちら派)。
なお,Disposeの呼び出しは,
の順で呼ばれ,CloseでDispose(true)した後にファイナライザの呼び出しが抑制されます。

Name: metaphor
[URL]
Date: 2016年12月30日(金) 14:37
No: 5
(OFFLINE)

 Re: C#の疑問がいっぱい

>いきなり膨大な量のコード書かれても理解できません
>すいません、ここで聞くより初心者サイトから勉強したほうがいいですか…
すいません。質問が高度な内容に見えたから解ると思ってました。一度フォーラムルールをお読み下さいますようお願い申し上げます。http://dixq.net/board/board.html
[1] 質問文
 [1.1] 自分が今行いたい事は何か
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
 [1.4] 今何がわからないのか、知りたいのか

[2] 環境  
 [2.1] OS : Windows, Linux等々
 [2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
[3] その他
 ・どの程度C言語を理解しているか
 ・ライブラリを使っている場合は何を使っているか

のように記述下さい。Step by Step で進めましょう。

Name: ちゃん太
[URL]
Date: 2016年12月30日(金) 17:59
No: 6
(OFFLINE)

 Re: C#の疑問がいっぱい

metaphorさんありがとうございます。
本当にC#の文法しか知らない初心者です。

したいことは以下です。
memorystreamにbitmap画像を代入、画像のRBG値を見たい。
本当に分かりやすいように、画像データは4ピクセル(縦2×横2)赤、青、黄、緑の超シンプルな画像を読み込んで
値を取得したいです。

順番
①Bitmapで配列を読み込み
②memorystreamに画像データ挿入
③memorystreamのデータを取得する(4つのRGB値) 
④Dataobjectにmemorystreamからデータを取得 ちなみにDataobject型なのかIODataobject型にするかどっちか分からない。
⑤Dataobjectのデータを取得(4つのRGB値)

したいことは以上となります。
私が持ってる参考書はC#の文法しか書いておらず、memorystreamやdataobjectなど画像関係の関数は全く掲載されていませんでした。

10行くらいの簡単なコードでご教授くださいませんか?

Name: ちゃん太
[URL]
Date: 2016年12月30日(金) 18:13
No: 7
(OFFLINE)

 Re: C#の疑問がいっぱい

OS : windows10
環境 :Visual C#
テンプレート: Windowsコンソールアプリケーション

です。

YuOさん
>入出力がStreamでしかできないAPIに,メモリで構築したものを使う,などの利用方法があります。
>データのデシリアライズ用途であれば,Streamは読み込む時間だけ保持すればよいため,FileStreamを直接渡しても問題ないですが,
>Streamを保持したまま長い時間処理するような場合は,MemoryStreamにコピーする事でファイルやネットワークなどを解放することができます。

この文章があまりにも難しくて僕には理解できないのですが…

・入出力がStreamでしかできないAPIってDataobjectの事ですか?
・FileStreamからデータを読み込んだ場合、そのファイルを操作するのは不可能ってことですか?

Name: metaphor
[URL]
Date: 2016年12月30日(金) 18:37
No: 8
(OFFLINE)

 Re: C#の疑問がいっぱい

了解しました。いまマシンを他の事で使っているので空いたら作ってみます。
[確認]
①Bitmapデータを配列に読み込み
②memorystreamに画像データ挿入
③memorystreamのデータを取得する(4つのRGB値) 
④Dataobjectにmemorystreamからデータを取得 ちなみにDataobject型なのかIODataobject型にするかどっちか分からない。
⑤Dataobjectのデータを取得(4つのRGB値)

Name: YuO
[URL]
ハッカー(144,289 ポイント)
Date: 2016年12月30日(金) 18:56
No: 9
(OFFLINE)

 Re: C#の疑問がいっぱい

ちゃん太 さんが書きました:・入出力がStreamでしかできないAPIってDataobjectの事ですか?

いいえ。

世の中にはバイナリデータを処理する場合に,引数としてbyte[]やIEnumerable<byte>などを受け付けず,Streamしか引数としてとらないAPIが存在します。
別途得られたbyte[]データをそのようなAPIに渡す時などに,MemoryStreamでラップします。
e.g.) XmlReader.Create メソッド
Offtopic :
そもそも,Dataobjectというクラス・メソッド・プロパティ等は.NET Frameworkクラスライブラリには存在しません。
System.Windows.FormsにDataObjectという,Oが大文字のクラスなら存在しますが,C#は大文字と小文字を区別する言語ですから別物なのでしょう。


ちゃん太 さんが書きました:・FileStreamからデータを読み込んだ場合、そのファイルを操作するのは不可能ってことですか?

操作,というか入出力は,むしろFileStreamで行います。
ただし,FileStreamが開いている間,他のプロセスはそのファイルに対してのアクセスが禁止されたり,書き込みできなかったり,といった状況になります。


そもそも,やりたいことは何ですか。
ちゃん太 さんが書きました:memorystreamにbitmap画像を代入、画像のRBG値を見たい。
本当に分かりやすいように、画像データは4ピクセル(縦2×横2)赤、青、黄、緑の超シンプルな画像を読み込んで
値を取得したいです。

とは書いていますが,それは本当にやりたいことですか。
画像の各ピクセルのR/G/Bの値を取得したいのが本来のやりたいことで,MemoryStreamはやりたいこと自体とは関係しないのではないでしょうか。

Name: ちゃん太
[URL]
Date: 2016年12月30日(金) 19:31
No: 10
(OFFLINE)

 Re: C#の疑問がいっぱい

画像加工のプログラミングがしたいのです。
そのためにRGB値を取得したいです。
それに関連するクラスとか全部マスターしたいのです。

memorystream以外にもわからないことが今日出てきました。
Bitmap.LockBits メソッドですが使い方が分かりません。
どうやらgetpixelの上位互換らしいですが。

直接memorystreamが画像と関係するか分かりませんが、参考にするコードでmemorstreamが出てくる事が多いので気になりました。

疑問がいっぱいありますがお答えいただけると嬉しいです。

最終的にしたいことは、お絵かきソフトの作成なんで、それはさすがに現状あまりにも無理があるので基本的なことからつぶしていきたいのです。

Name: みけCAT
[URL]
伝説なるハッカー(626,695 ポイント)
Date: 2016年12月30日(金) 20:07
No: 11
(OFFLINE)

 Re: C#の疑問がいっぱい

ちゃん太 さんが書きました:それに関連するクラスとか全部マスターしたいのです。

関連するクラスを全部マスターしたいというのは無茶ではないですか?
のちのち「関連するクラス」を全部マスターする!という野望を持つにしても、とりあえず作りたいプログラムに必要、もしくは使うとよさそうなAPIだけを調べながらプログラムを完成させることを目標にした方がよくないですか?
もちろん、プログラムを書くのは目的ではなく手段でありできなくてもいい、とにかく「関連するクラス」を全部マスターしたいんだ!というのなら、おすすめはしませんが否定もしません。勝手にどうぞ。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: またpほt
[URL]
Date: 2016年12月30日(金) 21:03
No: 12
(OFFLINE)

 Re: C#の疑問がいっぱい

ようやく手が空いたのでやりましょう。まずWindowsコンソールアプリケーションでBMP(画像)は読み込んでありますか?

Name: metaphor
[URL]
Date: 2016年12月30日(金) 21:07
No: 13
(OFFLINE)

 Re: C#の疑問がいっぱい

ごめん。部屋がちらかっててひっかかった。

Name: metaphor
[URL]
Date: 2016年12月30日(金) 21:14
No: 14
(OFFLINE)

 Re: C#の疑問がいっぱい

>画像加工のプログラミングがしたいのです。
画像処理の学校とかお仕事ですか?

Name: ちゃん太
[URL]
Date: 2016年12月30日(金) 21:18
No: 15
(OFFLINE)

 Re: C#の疑問がいっぱい

metaphorさんご親切にありがとうございます。

Bitmapの読み込みは

Bitmap img = new Bitmap(filepath);で超簡単なので出来ます。
そこから何をしていいやら…

Name: metaphor
[URL]
Date: 2016年12月30日(金) 21:21
No: 16
(OFFLINE)

 Re: C#の疑問がいっぱい

そこまでのコードを提示して下さいませんか。

Name: ちゃん太
[URL]
Date: 2016年12月30日(金) 21:23
No: 17
(OFFLINE)

 Re: C#の疑問がいっぱい

学校は専門です。
Photoshopみたいなソフトが作りたくて勉強中です。

metaphorさん、逆に課題を頂けませんか?
以降のコードはgetpixelなどありきありなコードしかありません。

Name: metaphor
[URL]
Date: 2016年12月30日(金) 21:33
No: 18
(OFFLINE)

 Re: C#の疑問がいっぱい

それでいいですよ。まずクラスが用意できるかたいだけです、配列の宣言はしてあますか?
>画像データは4ピクセル(縦2×横2)赤、青、黄、緑の超シンプルな画像を
は間違いでAlpha,R,G,Bです。
(投稿がふえると2頁になるので気をつけて下さい)

Name: ちゃん太
[URL]
Date: 2016年12月30日(金) 21:39
No: 19
(OFFLINE)

 Re: C#の疑問がいっぱい

Bitmap img;
ですよね?

getpixelで取得するのは遅いということで、早い方法がbitmaplockらしいですが
それらしいコードが見つかりません。

Name: metaphor
[URL]
Date: 2016年12月30日(金) 21:45
No: 20
(OFFLINE)

 Re: C#の疑問がいっぱい

そうです。まずいまのコード全体を見せて下さい。

Name: metaphor
[URL]
Date: 2016年12月30日(金) 22:08
No: 21
(OFFLINE)

 Re: C#の疑問がいっぱい

>Photoshopみたいなソフトが作りたくて勉強中です。
(有限要素法に近いくらいの)数学知識がいると思いますよ。

Name: ちゃん太
[URL]
Date: 2016年12月30日(金) 22:13
No: 22
(OFFLINE)

 Re: C#の疑問がいっぱい

端くれプログラマの備忘録っていうサイトの

参考ページのですが

Bitmap bitmap = new Bitmap("C:\\Temp\\lena.jpg");
BitmapData data = bitmap.LockBits(
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadWrite,
PixelFormat.Format32bppArgb);
byte[] buf = new byte[bitmap.Width * bitmap.Height * 4];
Marshal.Copy(data.Scan0, buf, 0, buf.Length);
for (int i = 0; i < buf.Length; )
{
byte grey = (byte)(0.299 * buf[i] + 0.587 * buf[i+1] + 0.114 * buf[i+2]);
buf[i++] = grey;
buf[i++] = grey;
buf[i++] = grey;
i++;
}
Marshal.Copy(buf, 0, data.Scan0, buf.Length);
bitmap.UnlockBits(data);

Name: metaphor
[URL]
Date: 2016年12月30日(金) 22:19
No: 23
(OFFLINE)

 Re: C#の疑問がいっぱい

そうではなくVisualStudioの設定がみたいのです。実際の動くものです。

Name: metaphor
[URL]
Date: 2016年12月30日(金) 22:23
No: 24
(OFFLINE)

 Re: C#の疑問がいっぱい

コードはさっきの説明をよく読んで正しく送ってください。

Name: metaphor
[URL]
Date: 2016年12月30日(金) 22:30
No: 25
(OFFLINE)

 Re: C#の疑問がいっぱい

VisualStudioを使っているならこう言う説明を見なくても自動補完してくれるはず。(私はPowerShellを使うけどVisualStudioより便利です)

Name: metaphor
[URL]
Date: 2016年12月30日(金) 22:37
No: 26
(OFFLINE)

 Re: C#の疑問がいっぱい

using の部分がみたいのでCtrl+A,Ctrl+C,Ctrl+Vでコピペすればいいはず。

Name: metaphor
[URL]
Date: 2016年12月30日(金) 23:18
No: 27
(OFFLINE)

 Re: C#の疑問がいっぱい

>C#を組んでいて分からないことがいっぱいあるので教えて下さい。
C#の勉強はC/C++みたいにメモリー管理しなくていいからすぐ覚えて使えるはず。VisualStudioの使い方は友達に聞くかひとのやってるのをみて覚えないと自分だけでは難しいですよ。さっきのサンプルは全然まとはずれです。

Name: ちゃん太
[URL]
Date: 2016年12月30日(金) 23:31
No: 28
(OFFLINE)

 Re: C#の疑問がいっぱい

Marshalが何なのかわかりません。
これはメソッドですか?

Name: metaphor
[URL]
Date: 2016年12月30日(金) 23:34
No: 29
(OFFLINE)

 Re: C#の疑問がいっぱい

マーシャリングで調べれば解るはずです。

Name: metaphor
[URL]
Date: 2016年12月30日(金) 23:41
No: 30
(OFFLINE)

 Re: C#の疑問がいっぱい

そんなことよりプログラムなしでいいからC#のusingとMainさえあれば説明するからおくれないですか。
私が送ったように。

次へ

Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[4人]