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

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

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

Re[2]: C#で構造体の配列について


(過去ログ 156 を表示中)

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

■90706 / inTopicNo.1)  C#で構造体の配列について
  
□投稿者/ つけぺん (1回)-(2019/04/11(Thu) 11:30:08)

分類:[C#] 

2019/04/11(Thu) 11:31:17 編集(投稿者)
2019/04/11(Thu) 11:30:58 編集(投稿者)

はじめまして。
C言語で以下のような構造体の配列になっているコードがありまして、それをC#に移植したいと考えているのですが、実現可能でしょうか。
アドバイス等いただけると幸いです。

  static struct {
    uint16 code;
    byte (*func)(void);
  } table[] = {
    { 0x0001, test1 },
    { 0x0002, test2 }
  };


よろしくお願いいたします。

引用返信 編集キー/
■90707 / inTopicNo.2)  Re[1]: C#で構造体の配列について
□投稿者/ 774RR (678回)-(2019/04/11(Thu) 12:37:03)
可能っちゃ可能だけど、
・呼ばれる側の関数を C# でどう実装するのか (static? non-static?)
・どう呼びたいのか
・そもそも C# の配列って結構面倒だし
ってあたりで C の書き方とは似ても似つかないものになる可能性が高いっす。

C の関数ポインタに相当するのは delegate なので
public delegate byte FuncPtrType();
と書けば関数ポインタに相当するものは作れる(けど non-static メンバ相当)

namespace WankumaSpace {
public delegate byte FuncPtrType();
public struct delegate_test_type
{
UInt16 Code;
FuncPtrType Func;
public delegate_test_type(UInt16 code, FuncPtrType f)
{
Code = code;
Func = f;
}
}
とでもしておいて
delegate_test_type test = new delegate_test_type[] { new delegate_test_type(1, Test1) };
みたいなことはできる。

できるが static/non-static をどうすんのとかそっちの話が結構厄介っす。最終的にどうしたいのかで話は違ってきそう。

引用返信 編集キー/
■90708 / inTopicNo.3)  Re[1]: C#で構造体の配列について
□投稿者/ とっちゃん (585回)-(2019/04/11(Thu) 12:43:43)
No90706 (つけぺん さん) に返信
> C言語で以下のような構造体の配列になっているコードがありまして、それをC#に移植したいと考えているのですが、実現可能でしょうか。
> アドバイス等いただけると幸いです。
> 
>   static struct {
>     uint16 code;
>     byte (*func)(void);
>   } table[] = {
>     { 0x0001, test1 },
>     { 0x0002, test2 }
>   };
> 


table 内の code に一致した func を呼び出すという形にするなら、
Dictionary<ushort,Func<byte>> table;
でいいと思いますよ。

利用個所も下記のようにごくごくすっきりと書けます。

if( table.TryGetValue( search, out var func ) )
{
  var result = func();
  //...
}

引用返信 編集キー/
■90709 / inTopicNo.4)  Re[2]: C#で構造体の配列について
□投稿者/ とっちゃん (586回)-(2019/04/11(Thu) 12:53:24)
どうしても配列的に扱いたいという場合は、

foreach( var pair in table )
{
  if( pair.Key == search )
  {
    byte result = pair.Value();
    // いろいろ。。。
    break;
  }
}
という感じでの操作も可能です。

ただ、実際の構造体はもっと大きいとか、
書いてないことがあるとなると、話は変わってきますけど。

引用返信 編集キー/
■90710 / inTopicNo.5)  Re[2]: C#で構造体の配列について
□投稿者/ ?????? (1回)-(2019/04/11(Thu) 13:04:03)
No90707 (774RR さん) に返信
> 可能っちゃ可能だけど、
> ・呼ばれる側の関数を C# でどう実装するのか (static? non-static?)
> ・どう呼びたいのか
> ・そもそも C# の配列って結構面倒だし
> ってあたりで C の書き方とは似ても似つかないものになる可能性が高いっす。
>
> C の関数ポインタに相当するのは delegate なので
> public delegate byte FuncPtrType();
> と書けば関数ポインタに相当するものは作れる(けど non-static メンバ相当)
>
> namespace WankumaSpace {
> public delegate byte FuncPtrType();
> public struct delegate_test_type
> {
> UInt16 Code;
> FuncPtrType Func;
> public delegate_test_type(UInt16 code, FuncPtrType f)
> {
> Code = code;
> Func = f;
> }
> }
> とでもしておいて
> delegate_test_type test = new delegate_test_type[] { new delegate_test_type(1, Test1) };
> みたいなことはできる。
>
> できるが static/non-static をどうすんのとかそっちの話が結構厄介っす。最終的にどうしたいのかで話は違ってきそう。
>

774RR さん
早速の返信ありがとうございます。
なるほど、C#の配列はなかなか大変なのですね。
また、関数のポインタの書き方、勉強になりました。
ありがとうございます。
引用返信 編集キー/
■90711 / inTopicNo.6)  Re[2]: C#で構造体の配列について
□投稿者/ ?????? (2回)-(2019/04/11(Thu) 13:05:34)
とっちゃん さん

早速のコメントありがとうございます。
まさに、codeに一致したfuncを呼び出したいと思っていました。
送っていただいたDictinalyという方法があったのですね。
ありがとうございます。
この方法で実装してみます。

大変助かりました。

No90708 (とっちゃん さん) に返信
> ■No90706 (つけぺん さん) に返信
>>C言語で以下のような構造体の配列になっているコードがありまして、それをC#に移植したいと考えているのですが、実現可能でしょうか。
>>アドバイス等いただけると幸いです。
>>
>> static struct {
>> uint16 code;
>> byte (*func)(void);
>> } table[] = {
>> { 0x0001, test1 },
>> { 0x0002, test2 }
>> };
>>
>
>
> table 内の code に一致した func を呼び出すという形にするなら、
> Dictionary<ushort,Func<byte>> table;
> でいいと思いますよ。
>
> 利用個所も下記のようにごくごくすっきりと書けます。
>
> if( table.TryGetValue( search, out var func ) )
> {
> var result = func();
> //...
> }
>
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -