In one way or another, u'll always need to "construct" the structure,
so the ctor with a dummy parameter doesn't seams too bad.... :/

On the other hand, once b and c are ushort[], its bounds are implicitly
checked.... If u need to ensure that b and c aren't changed (e.g.
mystruct.b = null;), the u can make them private and add a new property
like:

public ushort[] B{ get{ return b; } };

In fact, to use this code u only need to:

MyStruct s = new Mystruct( 0 /* dummy parameter - assume it to be int */);

s.B[ 2 ] = 10; // will assign 10 to b[2]!
s.B[ 4 ] = 10; // will throw an IndexOutOfRangeException!!!!

calling the C function foo( MyStruct * ), will be as ez as: foo( s );

jmn

On Fri, 7 Jun 2002 13:00:25 +0200, Pierre Greborio
<[EMAIL PROTECTED]> wrote:

>OK, but I need to call Initialize method first. Then I could create a
>new constructor passing an unused parameter and then call it. I would do
>it without calling any constructor or method.
>
>Pierre
>
>-----------------------------------------------
>Pierre Greborio
>[EMAIL PROTECTED]
>http://www.pierregreborio.it
>-----------------------------------------------
>
>
>
>-----Original Message-----
>From: The DOTNET list will be retired 7/1/02
>[mailto:[EMAIL PROTECTED]] On Behalf Of Jose M. Nobre
>Sent: Friday, June 07, 2002 10:55 AM
>To: [EMAIL PROTECTED]
>Subject: Re: [DOTNET] Array on struct
>
>
>A simple way of doing it is:
>
>[ StructLayout( LayoutKind.Sequential ) ]
>public struct MyStruct
>{
>  public Initialize( ) // can't have a def. ctor... :(
>  {
>    b = new ushort[ 4 ];
>    c = new ushort[ 10 ];
>  }
>
>  public ushort   a;
>
>  [ MarshalAs( UnmanagedType.ByValArray
>             , SizeConst = 4
>             , ArraySubType = UnmanagedType.U2 ) ]
>  public ushort[] b;
>
>  [ MarshalAs( UnmanagedType.ByValArray
>             , SizeConst = 10
>             , ArraySubType = UnmanagedType.U2 ) ]
>  public ushort[] c;
>}
>
>hope it helps...
>jmn
>
>On Thu, 6 Jun 2002 11:21:20 +0200, Pierre <[EMAIL PROTECTED]>
>wrote:
>
>>Hi,
>>I have a structure than contains two arrays with the same value type
>>but different lenght. Looking on past messages I got some interesting
>>tips. The
>>C++ structure is:
>>
>>struct MyStruct
>>{
>> ushort a;
>> ushort[4] b;
>> ushort[10] c;
>>}
>>
>>In C# I translated as:
>>
>>[StructLayout(LayoutKind.Sequential)]
>>struct MyStruct
>>{
>> ushort a;
>> public ushort_vector_4 b;
>> public ushort_vector_10 c;
>>
>> [StructLayout(LayoutKind.Explicit)]
>> public struct ushort_vector_4
>> {
>>   public const int DataLength = 4;
>>   [FieldOffset(0)]private ushort Header;
>>   [FieldOffset((DataLength - 1) * 2)]private ushort Footer;
>>   public int Length { get { return DataLength; } }
>>   public unsafe ushort this[int index]
>>   {
>>     get
>>     {
>>        if ( (index < 0) || (index >= DataLength) )
>>        {
>>          throw new IndexOutOfRangeException();
>>        }
>>        fixed (ushort *head = &Header)
>>          return *(head+index);
>>     }
>>     set
>>     {
>>        if ( (index < 0) || (index >= DataLength) )
>>        {
>>          throw new IndexOutOfRangeException();
>>        }
>>        fixed (ushort *head = &Header)
>>          *(head +index) = value;
>>     }
>>   }
>> }
>>
>> [StructLayout(LayoutKind.Explicit)]
>> public struct ushort_vector_10
>> {
>>   public const int DataLength = 10;
>>   [FieldOffset(0)]private ushort Header;
>>   [FieldOffset((DataLength - 1) * 2)]private ushort Footer;
>>   public int Length { get { return DataLength; } }
>>   public unsafe ushort this[int index]
>>   {
>>     get
>>     {
>>        if ( (index < 0) || (index >= DataLength) )
>>        {
>>          throw new IndexOutOfRangeException();
>>        }
>>        fixed (ushort *head = &Header)
>>          return *(head+index);
>>     }
>>     set
>>     {
>>        if ( (index < 0) || (index >= DataLength) )
>>        {
>>          throw new IndexOutOfRangeException();
>>        }
>>        fixed (ushort *head = &Header)
>>          *(head +index) = value;
>>     }
>>   }
>> }
>>}
>>
>>There is an high level of redundancy of the code. Is it possibile to
>>use only one internal struct defining the size externally ?
>>
>>Thank you
>>Pierre
>>
>>You can read messages from the DOTNET archive, unsubscribe from DOTNET,
>
>>or subscribe to other DevelopMentor lists at
>>http://discuss.develop.com.
>
>You can read messages from the DOTNET archive, unsubscribe from DOTNET,
>or subscribe to other DevelopMentor lists at http://discuss.develop.com.
>
>You can read messages from the DOTNET archive, unsubscribe from DOTNET, or
>subscribe to other DevelopMentor lists at http://discuss.develop.com.

You can read messages from the DOTNET archive, unsubscribe from DOTNET, or
subscribe to other DevelopMentor lists at http://discuss.develop.com.

Reply via email to