🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

2回答

9017閲覧

【C#】構造体の中の配列サイズ(長さではない)取得をしたい

hachimitu

総合スコア36

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/12/06 09:10

#やりたいこと
以下のように定義した構造体の中の配列サイズ(長さではない)取得をしたいです。

C#

1public struct Master_Dataframe_struct 2{ 3 public Struct_Header Header; 4 public Int16[] learn_buffer; 5}

#現状
サイズ取得方法にMarshal.SizeOfを使ってみたのですが、アンマネージ構造体だからマーシャリングできません?エラーがでてしまいました。

new Int16[10];と定義しているのにそういう話ではない?

C#

1 2 Master_Dataframe_struct st_Pc_dataframe = new Master_Dataframe_struct(); 3private void Transfer_motor_learn_Click(object sender, EventArgs e) 4{ 5 st_Pc_dataframe.learn_buffer = new Int16[10]; 6 Int32 size = Marshal.SizeOf(st_Pc_dataframe.Payload.st_learn.learn_buffer); 7}

イメージ説明

#質問
構造体の中の配列サイズ(長さではない)取得をしたい場合のお勧めの方法ありましたらご教示いただけますでしょうか、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

要は構造体定義の時点で配列のサイズを指定していないので、コンパイラが構造体のサイズを特定出来ないって事です。やりたい事の例だと、こんな感じで指定します。(Struct_Headerの定義が判らないのでInt32で代用しています)

C#

1using System; 2using System.Runtime.InteropServices; 3 4namespace ConsoleNetApp1 5{ 6 class Program 7 { 8 [StructLayout(LayoutKind.Sequential, Pack = 2)] 9 public struct Master_Dataframe_struct 10 { 11 public Int32 Header; 12 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] 13 public Int16[] learn_buffer; 14 } 15 16 [StructLayout(LayoutKind.Sequential, Pack = 2)] 17 public unsafe struct Master_Dataframe_struct_Unsafe 18 { 19 public Int32 Header; 20 public fixed Int16 learn_buffer[10]; 21 } 22 23 static void Main(string[] args) 24 { 25 var st = new Master_Dataframe_struct(); 26 var st_unsafe = new Master_Dataframe_struct_Unsafe(); 27 Console.WriteLine($"Size(st):{Marshal.SizeOf(st)}"); 28 Console.WriteLine($"Size(st_unsafe):{Marshal.SizeOf(st_unsafe)}"); 29 30 Console.ReadLine(); 31 } 32 } 33} 34 35(実行結果) 36Size(st):24 37Size(st_unsafe):24

unsafe structを使用する場合は、アンセーフコードの許可が必要です。
unsafe有り無しどちらの構造体を使用した方が良いのか?となると用途によりますが、今回は用途が不明なので答えられません。
StructLayout、MarshalAsの指定が何を意味しているかは、公式のリファレンスで確認してみてください。
StructLayoutAttribute クラス
MarshalAsAttribute クラス

投稿2020/12/07 01:09

編集2020/12/07 01:10
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

st_Pc_dataframe.learn_buffer.length ではダメなんでしょうか

投稿2020/12/06 09:21

y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問