C#の疑問がいっぱい

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

C#の疑問がいっぱい

#1

投稿記事 by ちゃん太 » 1年前

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

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

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

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

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

metaphor

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

#2

投稿記事 by metaphor » 1年前

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

② MSDNのSample---いまVS2008で確認した。
  ・MemoryStreamの使い方:MSDNのSample
  ・用途:バッキング ストアとしてメモリを使用する

コード: 全て選択

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を愛用してるから①の問題は起きない。

ちゃん太

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

#3

投稿記事 by ちゃん太 » 1年前

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

YuO
記事: 908
登録日時: 7年前
住所: 東京都世田谷区

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

#4

投稿記事 by YuO » 1年前

ちゃん太 さんが書きました:①これは、都合上の問題なんですが、コマンドプロンプトが実行時すぐ閉じてしまいますよね?これを閉じないようにする方法を教えて下さい。
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メソッドを呼び出すとよいでしょう。
オフトピック
IDisposableでDisposeを呼び出す必要があるのかを毎回確認するのは面倒なので常にusingに入れる,等の考え方も当然あり得ます (実は私はこちら派)。
なお,Disposeの呼び出しは, の順で呼ばれ,CloseでDispose(true)した後にファイナライザの呼び出しが抑制されます。

metaphor

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

#5

投稿記事 by metaphor » 1年前

>いきなり膨大な量のコード書かれても理解できません
>すいません、ここで聞くより初心者サイトから勉強したほうがいいですか…
すいません。質問が高度な内容に見えたから解ると思ってました。一度フォーラムルールをお読み下さいますようお願い申し上げます。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 で進めましょう。

ちゃん太

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

#6

投稿記事 by ちゃん太 » 1年前

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

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

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

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

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

ちゃん太

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

#7

投稿記事 by ちゃん太 » 1年前

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

です。

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

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

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

metaphor

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

#8

投稿記事 by metaphor » 1年前

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

YuO
記事: 908
登録日時: 7年前
住所: 東京都世田谷区

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

#9

投稿記事 by YuO » 1年前

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

世の中にはバイナリデータを処理する場合に,引数としてbyte[]やIEnumerable<byte>などを受け付けず,Streamしか引数としてとらないAPIが存在します。
別途得られたbyte[]データをそのようなAPIに渡す時などに,MemoryStreamでラップします。
e.g.) XmlReader.Create メソッド
オフトピック
そもそも,Dataobjectというクラス・メソッド・プロパティ等は.NET Frameworkクラスライブラリには存在しません。
System.Windows.FormsにDataObjectという,Oが大文字のクラスなら存在しますが,C#は大文字と小文字を区別する言語ですから別物なのでしょう。
ちゃん太 さんが書きました:・FileStreamからデータを読み込んだ場合、そのファイルを操作するのは不可能ってことですか?
操作,というか入出力は,むしろFileStreamで行います。
ただし,FileStreamが開いている間,他のプロセスはそのファイルに対してのアクセスが禁止されたり,書き込みできなかったり,といった状況になります。


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

ちゃん太

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

#10

投稿記事 by ちゃん太 » 1年前

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

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

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

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

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

アバター
みけCAT
記事: 6003
登録日時: 7年前
住所: 千葉県
連絡を取る:

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

#11

投稿記事 by みけCAT » 1年前

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

またpほt

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

#12

投稿記事 by またpほt » 1年前

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

metaphor

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

#13

投稿記事 by metaphor » 1年前

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

metaphor

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

#14

投稿記事 by metaphor » 1年前

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

ちゃん太

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

#15

投稿記事 by ちゃん太 » 1年前

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

Bitmapの読み込みは

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

metaphor

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

#16

投稿記事 by metaphor » 1年前

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

ちゃん太

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

#17

投稿記事 by ちゃん太 » 1年前

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

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

metaphor

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

#18

投稿記事 by metaphor » 1年前

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

ちゃん太

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

#19

投稿記事 by ちゃん太 » 1年前

Bitmap img;
ですよね?

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

metaphor

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

#20

投稿記事 by metaphor » 1年前

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

metaphor

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

#21

投稿記事 by metaphor » 1年前

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

ちゃん太

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

#22

投稿記事 by ちゃん太 » 1年前

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

参考ページのですが

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 + 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);

metaphor

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

#23

投稿記事 by metaphor » 1年前

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

metaphor

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

#24

投稿記事 by metaphor » 1年前

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

metaphor

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

#25

投稿記事 by metaphor » 1年前

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

metaphor

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

#26

投稿記事 by metaphor » 1年前

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

metaphor

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

#27

投稿記事 by metaphor » 1年前

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

ちゃん太

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

#28

投稿記事 by ちゃん太 » 1年前

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

metaphor

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

#29

投稿記事 by metaphor » 1年前

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

metaphor

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

#30

投稿記事 by metaphor » 1年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る