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

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

C# と VB.NET の入門サイト

Re[1]: C#でのmemset


(過去ログ 87 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■51645 / inTopicNo.1)  C#でのmemset
  
□投稿者/ sato (1回)-(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#でもできますか?
引用返信 編集キー/
■51646 / inTopicNo.2)  Re[1]: C#でのmemset
□投稿者/ ケント (11回)-(2010/07/13(Tue) 15:36:09)
satoさん こんにちは。

なぜmemsetを行いたいのでしょうか?
intの初期値は0です。
http://msdn.microsoft.com/ja-jp/library/83fhsxwc(v=VS.80).aspx

No51645 (sato さん) に返信
> C言語のmemsetの機能をC#でできますでしょうか?

引用返信 編集キー/
■51648 / inTopicNo.3)  Re[1]: C#でのmemset
□投稿者/ 魔界の仮面弁士 (1701回)-(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 構造体側にコンストラクタを用意した方が良いと思いますよ。

引用返信 編集キー/
■51661 / inTopicNo.4)  Re[2]: C#でのmemset
□投稿者/ sato (2回)-(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があるのか興味があり聞いてみました。
いろいろ勉強したいと思います。


引用返信 編集キー/
■51667 / inTopicNo.5)  Re[2]: C#でのmemset
□投稿者/ sato (4回)-(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で初期化したい
宜しくお願いします。
引用返信 編集キー/
■51671 / inTopicNo.6)  Re[3]: C#でのmemset
□投稿者/ やじゅ (1672回)-(2010/07/13(Tue) 21:30:06)
やじゅ さんの Web サイト
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);

引用返信 編集キー/
■51673 / inTopicNo.7)  Re[3]: C#でのmemset
□投稿者/ .SHO (1363回)-(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で初期化したい
> 宜しくお願いします。

上に「コンストラクタを用意した方が良い」と書いてあります。
それを勉強しましょう。
引用返信 編集キー/
■51678 / inTopicNo.8)  Re[3]: C#でのmemset
□投稿者/ 魔界の仮面弁士 (1703回)-(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();

引用返信 編集キー/
■51687 / inTopicNo.9)  Re[4]: C#でのmemset
□投稿者/ sato (5回)-(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();

いろいろありがとうございます。
しっかり勉強したいと思います。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -