-1

私の c++ 名前空間の最初のものは

      public struct channel_vars {
      int fetch_data;    /* Boolean flag */
      void * data;       /* (malloc'd) address of data */
      unsigned int lines;    /* Number of lines returned */
}

管理されたときに void* がどうなるかわかりません

二つ目は

public struct hdf_call_vars_t {
 struct channel_vars p_vars;
   struct channel_vars s_vars; 
  enum FILE_VERSION file_vers;   /* Set in top level sub. used in lower */
  int fetch_n;    /* Boolean flag */
  s_line_header_t * n_addr; /* malloc'd address of ndata */
  unsigned int n_lines;
  csdt_file_header_t hdr;   
};

上の例では、s_line_header_t 自体が double と int で構成される構造体であり、int などの基本型で構成される別の構造体でもあります。

マネージド コードではポインターが許可されていないため、これらの構造をマネージド型に変換するにはどうすればよいですか? このコードはすべて私の c++ -cli プロジェクトにあります。ありがとう、sb

4

2 に答える 2

0

マネージ コードで IntPtr クラスを使用して、ポインターを使用するフィールドを unmaged コードにマップできます。

于 2013-02-14T19:49:36.093 に答える
0

C# に移行する場合 すべてのクラスは機能的にポインターと同じです。これらは、クラスを指すか、または であるという点で、ほぼ同じように動作しますnull

void*はもう少しトリッキーです。これは何でも指すことができます。C# では、すべてのオブジェクトが基本objectクラスから継承されます。void* とオブジェクトの両方から戻るにはキャストが必要になるため、 allvoid*を次のように置き換えれば問題ありません。object

public struct ChannelVars {
      public bool FetchData; 
      public object Data;   
      public uint Lines;    
}

public struct HDFCallVarsT {
      public ChannelVars PVars;
      public ChannelVars SVars; 
      //enum FILE_VERSION file_vers;  //you will need to get the enum set here correctly
      public bool FetchN;
      public SLineHeaderT NAddr; //SLineHeaderT must be a class somewhere
      public uint NLines;
      public CSDTFileHeaderT HDR; //CSDTFileHeaderT must be a class somewhere   
};
于 2013-02-14T19:50:24.837 に答える