NativeBoost external structure with char[] rather than char*

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

NativeBoost external structure with char[] rather than char*

Guy Hylton
I am looking for some NativeBoost advice on the best way of using a structure with an containing a char array like the following:

int level
int number
char[256] msgText
ulong elapsedTime

Currently I am using an NBExternalAddress returned by NativeBoost>>allocate: because the external library holds onto the address and using byteAt: to see what is going on in the structure while I get used to the external library API.

I can think of a couple of options, create my own NBExternalType subclass which I can use in an NBExternalStructure or subclass NBExternalAddress/Object with methods to extract the appropriate data, or have I missed the simple solution?

Thanks, Guy


Reply | Threaded
Open this post in threaded view
|

Re: NativeBoost external structure with char[] rather than char*

Igor Stasenko
On 31 August 2012 15:03, Guy Hylton <[hidden email]> wrote:

> I am looking for some NativeBoost advice on the best way of using a
> structure with an containing a char array like the following:
>
> int level
> int number
> char[256] msgText
> ulong elapsedTime
>
> Currently I am using an NBExternalAddress returned by NativeBoost>>allocate:
> because the external library holds onto the address and using byteAt: to see
> what is going on in the structure while I get used to the external library
> API.
>
> I can think of a couple of options, create my own NBExternalType subclass
> which I can use in an NBExternalStructure or subclass
> NBExternalAddress/Object with methods to extract the appropriate data, or
> have I missed the simple solution?
>

well, there's no array-types support..
so, what you can do is to place dummy fields instead of array.. i.e.

int level
 int number
 char msgText1
 char msgText2
 ...
 char msgText256

 ulong elapsedTime

which should do the trick.

(of course, not necessary to use chars, you can use ints, so it will
be only 64 dummies instead of 256 ;)


And of course a better way of doing that is to create a special
NBExternalType subclass , lets say NBExternalTypeArray
which takes a basic type and number of elements.
And it should answer correct #instanceSize and other related things,
as well as implement methods for pushing/storing and reading the
values of such type.

I will work on adding that in closest days.
It is not too hard to implement ;)

> Thanks, Guy

--
Best regards,
Igor Stasenko.

Reply | Threaded
Open this post in threaded view
|

Re: NativeBoost external structure with char[] rather than char*

Guy Hylton


On Fri, Aug 31, 2012 at 2:17 PM, Igor Stasenko <[hidden email]> wrote:
On 31 August 2012 15:03, Guy Hylton <[hidden email]> wrote:
> I am looking for some NativeBoost advice on the best way of using a
> structure with an containing a char array like the following:
>
> int level
> int number
> char[256] msgText
> ulong elapsedTime
>
> Currently I am using an NBExternalAddress returned by NativeBoost>>allocate:
> because the external library holds onto the address and using byteAt: to see
> what is going on in the structure while I get used to the external library
> API.
>
> I can think of a couple of options, create my own NBExternalType subclass
> which I can use in an NBExternalStructure or subclass
> NBExternalAddress/Object with methods to extract the appropriate data, or
> have I missed the simple solution?
>

well, there's no array-types support..
so, what you can do is to place dummy fields instead of array.. i.e.

int level
 int number
 char msgText1
 char msgText2
 ...
 char msgText256

 ulong elapsedTime

which should do the trick.

(of course, not necessary to use chars, you can use ints, so it will
be only 64 dummies instead of 256 ;)

And of course a better way of doing that is to create a special
NBExternalType subclass , lets say NBExternalTypeArray
which takes a basic type and number of elements.
And it should answer correct #instanceSize and other related things,
as well as implement methods for pushing/storing and reading the
values of such type.
 
A subclass of NBExternalType looked like the better option when looking through the existing classes for a solution but I wasn't sure that I was ready to start writing assembler.

I already feel like one of the Sorcerers Apprentices just using NativeBoost to interface to an external library, let alone adding some assembler incantations to my own spells :-).


I will work on adding that in closest days.

That would be great!  In the meantime I will have a go at writing my own NBExternalType subclass to handle the specific situation I have come across; NBExternalString>>coerceReturnValue: looks like a good place to start.  Even if I don't get very far it will hopefully help me understand your solution.
 
It is not too hard to implement ;)
 
No, not for a first class wizard :-)


> Thanks, Guy

--
Best regards,
Igor Stasenko.


Reply | Threaded
Open this post in threaded view
|

Re: NativeBoost external structure with char[] rather than char*

Igor Stasenko
On 31 August 2012 16:16, Guy Hylton <[hidden email]> wrote:

>
>
> On Fri, Aug 31, 2012 at 2:17 PM, Igor Stasenko <[hidden email]> wrote:
>>
>> On 31 August 2012 15:03, Guy Hylton <[hidden email]> wrote:
>> > I am looking for some NativeBoost advice on the best way of using a
>> > structure with an containing a char array like the following:
>> >
>> > int level
>> > int number
>> > char[256] msgText
>> > ulong elapsedTime
>> >
>> > Currently I am using an NBExternalAddress returned by
>> > NativeBoost>>allocate:
>> > because the external library holds onto the address and using byteAt: to
>> > see
>> > what is going on in the structure while I get used to the external
>> > library
>> > API.
>> >
>> > I can think of a couple of options, create my own NBExternalType
>> > subclass
>> > which I can use in an NBExternalStructure or subclass
>> > NBExternalAddress/Object with methods to extract the appropriate data,
>> > or
>> > have I missed the simple solution?
>> >
>>
>> well, there's no array-types support..
>> so, what you can do is to place dummy fields instead of array.. i.e.
>>
>> int level
>>  int number
>>  char msgText1
>>  char msgText2
>>  ...
>>  char msgText256
>>
>>  ulong elapsedTime
>>
>> which should do the trick.
>>
>> (of course, not necessary to use chars, you can use ints, so it will
>> be only 64 dummies instead of 256 ;)
>>
>> And of course a better way of doing that is to create a special
>> NBExternalType subclass , lets say NBExternalTypeArray
>> which takes a basic type and number of elements.
>> And it should answer correct #instanceSize and other related things,
>> as well as implement methods for pushing/storing and reading the
>> values of such type.
>
>
> A subclass of NBExternalType looked like the better option when looking
> through the existing classes for a solution but I wasn't sure that I was
> ready to start writing assembler.
>

You can always try and see what you get. Assembler is pretty dumb thing.
Each instruction doing something , so if you put them in right order,
there's little space for faults.
Unlike from C, where you can put things in right order (making compiler happy),
but leave a bugs which can sit there undiscovered for years :)

> I already feel like one of the Sorcerers Apprentices just using NativeBoost
> to interface to an external library, let alone adding some assembler
> incantations to my own spells :-).
>
Hehe.. Well, you cannot avoid some sorcery when using FFI.

>>
>> I will work on adding that in closest days.
>
>
> That would be great!  In the meantime I will have a go at writing my own
> NBExternalType subclass to handle the specific situation I have come across;
> NBExternalString>>coerceReturnValue: looks like a good place to start.  Even
> if I don't get very far it will hopefully help me understand your solution.
>

Also look for NBExternalStructureType, like #pushAsValue: .

>>
>> It is not too hard to implement ;)
>
>
> No, not for a first class wizard :-)
>
sure, i don't expect that you will be able to start hacking assembler
from beginning,
but as soon as you get some basics, you can do the same or even better :)

--
Best regards,
Igor Stasenko.