C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.51645 の関連記事表示

<< 0 >>
■51645  C#でのmemset
□投稿者/ sato -(2010/07/13(Tue) 14:49:26)

    分類:[C#] 

    C言語のmemsetの機能をC#でできますでしょうか?

    struct _test
    {
    int aaa;
    int bbb;
    int ccc;
    }
    struct _test Test;
    memset(&Test, 0, sizeof(Test));

    上記の様な事をC#でもできますか?
親記事 /過去ログ87より / 関連記事表示
削除チェック/

■51648  Re[1]: C#でのmemset
□投稿者/ 魔界の仮面弁士 -(2010/07/13(Tue) 15:51:47)
    No51645 (sato さん) に返信
    > memset(&Test, 0, sizeof(Test));
    > 上記の様な事をC#でもできますか?
    
    memset ではなく memcpy の動作であれば、Marshal.Copy 等で代用できなくも無いですが、
    目的が 0 クリアするという事だけであれば、default または new で割り当てる事ができます。
    そもそも int 型の初期値は 0 と定義されていますし。
    http://msdn.microsoft.com/ja-jp/library/aa664475%28VS.71%29.aspx
    http://msdn.microsoft.com/ja-jp/library/83fhsxwc%28VS.80%29.aspx
    
    using System;
    #pragma warning disable 649
    
    struct _test {
      public int aaa;
      public int bbb;
      public int ccc;
    }
    class P {
      static void Main() {
        //_test Test = new _test();
        _test Test = default(_test);
    
        Console.WriteLine(Test.aaa);
        Console.WriteLine(Test.bbb);
        Console.WriteLine(Test.ccc);
      }
    }
    
    とはいえ、メンバーに初期値を設定したいという意味であれば、
    _test 構造体側にコンストラクタを用意した方が良いと思いますよ。
記事No.51645 のレス /過去ログ87より / 関連記事表示
削除チェック/

■51661  Re[2]: C#でのmemset
□投稿者/ sato -(2010/07/13(Tue) 19:09:18)
    No51648 (魔界の仮面弁士 さん) に返信
    > ■No51645 (sato さん) に返信
    >>memset(&Test, 0, sizeof(Test));
    >>上記の様な事をC#でもできますか?
    >
    > memset ではなく memcpy の動作であれば、Marshal.Copy 等で代用できなくも無いですが、
    > 目的が 0 クリアするという事だけであれば、default または new で割り当てる事ができます。
    > そもそも int 型の初期値は 0 と定義されていますし。
    > http://msdn.microsoft.com/ja-jp/library/aa664475%28VS.71%29.aspx
    > http://msdn.microsoft.com/ja-jp/library/83fhsxwc%28VS.80%29.aspx
    >
    > using System;
    > #pragma warning disable 649
    >
    > struct _test {
    > public int aaa;
    > public int bbb;
    > public int ccc;
    > }
    > class P {
    > static void Main() {
    > //_test Test = new _test();
    > _test Test = default(_test);
    >
    > Console.WriteLine(Test.aaa);
    > Console.WriteLine(Test.bbb);
    > Console.WriteLine(Test.ccc);
    > }
    > }
    >
    > とはいえ、メンバーに初期値を設定したいという意味であれば、
    > _test 構造体側にコンストラクタを用意した方が良いと思いますよ。

    ありがとうございます。
    ずっとC言語をやってきまして最近C#の勉強を始めましてC#でもmemsetがあるのか興味があり聞いてみました。
    いろいろ勉強したいと思います。

記事No.51645 のレス /過去ログ87より / 関連記事表示
削除チェック/

■51667  Re[2]: C#でのmemset
□投稿者/ sato -(2010/07/13(Tue) 20:42:00)
    No51648 (魔界の仮面弁士 さん) に返信
    > ■No51645 (sato さん) に返信
    >>memset(&Test, 0, sizeof(Test));
    >>上記の様な事をC#でもできますか?
    >
    > memset ではなく memcpy の動作であれば、Marshal.Copy 等で代用できなくも無いですが、
    > 目的が 0 クリアするという事だけであれば、default または new で割り当てる事ができます。
    > そもそも int 型の初期値は 0 と定義されていますし。
    > http://msdn.microsoft.com/ja-jp/library/aa664475%28VS.71%29.aspx
    > http://msdn.microsoft.com/ja-jp/library/83fhsxwc%28VS.80%29.aspx
    >
    > using System;
    > #pragma warning disable 649
    >
    > struct _test {
    > public int aaa;
    > public int bbb;
    > public int ccc;
    > }
    > class P {
    > static void Main() {
    > //_test Test = new _test();
    > _test Test = default(_test);
    >
    > Console.WriteLine(Test.aaa);
    > Console.WriteLine(Test.bbb);
    > Console.WriteLine(Test.ccc);
    > }
    > }
    >
    > とはいえ、メンバーに初期値を設定したいという意味であれば、
    > _test 構造体側にコンストラクタを用意した方が良いと思いますよ。

    魔界の仮面弁士 さま

    たとえば構造体が同じ型をもつ構造体で、
    指定した値に初期化するというのはできますでしょうか?
    struct _test
    {
    public Byte aaa;
    public Byte bbb;
    public Byte ccc;
    }

    _test Test = new _test();

    このときTestの中身を0x31で初期化したい
    宜しくお願いします。
記事No.51645 のレス /過去ログ87より / 関連記事表示
削除チェック/

■51671  Re[3]: C#でのmemset
□投稿者/ やじゅ -(2010/07/13(Tue) 21:30:06)
>
    2010/07/13(Tue) 22:04:55 編集(投稿者)

    No51667 (sato さん) に返信
    > たとえば構造体が同じ型をもつ構造体で、
    > 指定した値に初期化するというのはできますでしょうか?
    > このときTestの中身を0x31で初期化したい

    struct _test {
    public byte aaa;
    public byte bbb;
    public byte ccc;
    public void init(byte i){
    aaa = bbb = ccc = i;
    }
    }

    //_test Test = new _test();
    _test Test = default(_test);
    Test.init(0x31);

    .NETでは、memsetのように型を意識しないバイトアクセスは、安全性が保証できないこともあり
    基本的に認められません。

    追記:
    initを使わず、魔界の仮面弁士さん書かれたように _testで定義すればいいですね。
    public _test(byte i) { aaa = bbb = ccc = i; }
    _test Test = new _test(0x31);
記事No.51645 のレス /過去ログ87より / 関連記事表示
削除チェック/

■51673  Re[3]: C#でのmemset
□投稿者/ .SHO -(2010/07/13(Tue) 21:33:12)
    No51667 (sato さん) に返信

    >>とはいえ、メンバーに初期値を設定したいという意味であれば、
    >>_test 構造体側にコンストラクタを用意した方が良いと思いますよ。
    >
    > 魔界の仮面弁士 さま
    >
    > たとえば構造体が同じ型をもつ構造体で、
    > 指定した値に初期化するというのはできますでしょうか?
    > struct _test
    > {
    > public Byte aaa;
    > public Byte bbb;
    > public Byte ccc;
    > }
    >
    > _test Test = new _test();
    >
    > このときTestの中身を0x31で初期化したい
    > 宜しくお願いします。

    上に「コンストラクタを用意した方が良い」と書いてあります。
    それを勉強しましょう。
記事No.51645 のレス /過去ログ87より / 関連記事表示
削除チェック/

■51678  Re[3]: C#でのmemset
□投稿者/ 魔界の仮面弁士 -(2010/07/13(Tue) 22:10:43)
    No51667 (sato さん) に返信
    > このときTestの中身を0x31で初期化したい
    No51648 に書いたと思いますが、そういう時は構造体側にコンストラクタを用意しましょう。
      struct _test {
        public int aaa;
        public int bbb;
        public int ccc;
        public _test(int i) { aaa = bbb = ccc = i; }
      }
    こうしておけば、
      _test Test = new _test(0x31);
    のようにして初期化できます。
    
    
    構造体側に手を加えたくないのであれば、呼び出し側で
      Test.aaa = Test.bbb = Test.ccc = 0x31;
    のようにするのが手軽でしょう。
    
    
    
    どうしてもメモリコピーを行いたいのであれば、0x31 データに対する固定ポインタを得た上で、
    それを System.Runtime.InteropServices.Marshal クラスの PtrToStructure メソッドで
    マーシャリングするという事も一応はできますが、止めておいた方が良いでしょう。
    
        // アンセーフコードによる実装例
        _test Test;
        unsafe { fixed (int* p = new int[] {0x31, 0x31, 0x31}) {
          Test = (_test)Marshal.PtrToStructure((IntPtr)p, typeof(_test)); 
        }}
    
        // Pinned ハンドルによる実装例
        _test Test;
        GCHandle h = GCHandle.Alloc(new int[] {0x31, 0x31, 0x31}, GCHandleType.Pinned);
        Test = (_test)Marshal.PtrToStructure(h.AddrOfPinnedObject(), typeof(_test)); 
        h.Free();
記事No.51645 のレス /過去ログ87より / 関連記事表示
削除チェック/

■51687  Re[4]: C#でのmemset
□投稿者/ sato -(2010/07/14(Wed) 08:55:40)
    No51678 (魔界の仮面弁士 さん) に返信
    > ■No51667 (sato さん) に返信
    >>このときTestの中身を0x31で初期化したい
    > No51648 に書いたと思いますが、そういう時は構造体側にコンストラクタを用意しましょう。
    > struct _test {
    > public int aaa;
    > public int bbb;
    > public int ccc;
    > public _test(int i) { aaa = bbb = ccc = i; }
    > }
    > こうしておけば、
    > _test Test = new _test(0x31);
    > のようにして初期化できます。
    >
    >
    > 構造体側に手を加えたくないのであれば、呼び出し側で
    > Test.aaa = Test.bbb = Test.ccc = 0x31;
    > のようにするのが手軽でしょう。
    >
    >
    >
    > どうしてもメモリコピーを行いたいのであれば、0x31 データに対する固定ポインタを得た上で、
    > それを System.Runtime.InteropServices.Marshal クラスの PtrToStructure メソッドで
    > マーシャリングするという事も一応はできますが、止めておいた方が良いでしょう。
    >
    > // アンセーフコードによる実装例
    > _test Test;
    > unsafe { fixed (int* p = new int[] {0x31, 0x31, 0x31}) {
    > Test = (_test)Marshal.PtrToStructure((IntPtr)p, typeof(_test));
    > }}
    >
    > // Pinned ハンドルによる実装例
    > _test Test;
    > GCHandle h = GCHandle.Alloc(new int[] {0x31, 0x31, 0x31}, GCHandleType.Pinned);
    > Test = (_test)Marshal.PtrToStructure(h.AddrOfPinnedObject(), typeof(_test));
    > h.Free();

    いろいろありがとうございます。
    しっかり勉強したいと思います。
記事No.51645 のレス / END /過去ログ87より / 関連記事表示
削除チェック/

■51646  Re[1]: C#でのmemset
□投稿者/ ケント -(2010/07/13(Tue) 15:36:09)
記事No.51645 のレス /過去ログ87より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -