Home All Groups Group Topic Archive Search About

umanaged code - array error

Author
8 May 2006 2:51 PM
Patrick Sullivan
dim s_err as stringbuilder
dim xx(6) as double
dim ret_flag as integer

' This is a function to call an unmanaged C-style library function.
' The lib function fills an array of 6 doubles or error string.

Declare Auto Function calc Lib "calc32.dll" Alias "calc32.dll"( ByRef xx()
As Double, ByVal serr As System.Text.StringBuilder) As Integer

' Using the unmanaged function:

ret_flag = swe_calc(tjd_et, planet, iflag, xx(6), serr)

If I take out the 6 in the above line, I get error "number of indices is
less than the number of dimensions in the indexed array."

If I put it in, or put a zero in, like xx(0) or xx(6), I get the error
"value of type double cannot be converted to '1 dimensional array of
double'"

What is wrong here? TIA



--

Patrick Sullivan, AA-BA, BA-IT

Author
8 May 2006 2:53 PM
Patrick Sullivan
dim s_err as stringbuilder
dim xx(6) as double
dim ret_flag as integer

' This is a function to call an unmanaged C-style library function.
' The lib function fills an array of 6 doubles or error string.

Declare Auto Function calc Lib "calc32.dll" Alias "calc32.dll"( ByRef xx()
As Double, ByVal serr As System.Text.StringBuilder) As Integer

' Using the unmanaged function:

ret_flag = swe_calc(xx(6), serr)

If I take out the 6 in the above line, I get error "number of indices is
less than the number of dimensions in the indexed array."

If I put it in, or put a zero in, like xx(0) or xx(6), I get the error
"value of type double cannot be converted to '1 dimensional array of
double'"

What is wrong here? TIA
Author
8 May 2006 3:18 PM
Larry Lard
Patrick Sullivan wrote:
> dim s_err as stringbuilder
> dim xx(6) as double
> dim ret_flag as integer
>
> ' This is a function to call an unmanaged C-style library function.
> ' The lib function fills an array of 6 doubles or error string.
>
> Declare Auto Function calc Lib "calc32.dll" Alias "calc32.dll"( ByRef xx()
> As Double, ByVal serr As System.Text.StringBuilder) As Integer
>
> ' Using the unmanaged function:
>
> ret_flag = swe_calc(xx(6), serr)

Copy-and-pasting code is a much more reliable way of showing us your
code. Note that the Declare calls the function 'calc' but you call it
as 'swe_calc'. If we have to guess what you mean, it will take us
longer to help you.

>
> If I take out the 6 in the above line, I get error "number of indices is
> less than the number of dimensions in the indexed array."
>
> If I put it in, or put a zero in, like xx(0) or xx(6), I get the error
> "value of type double cannot be converted to '1 dimensional array of
> double'"

Try

        ret_flag = calc(xx, serr)

The function wants an array: it is xx - not xx(0) or xx(6) or xx() -
that is an array.

Also, xx should be initialised to an empty array before calling the
DLL, otherwise there will be nowehere to put the results:

        xx = New Double(6) {}

Also also, all I have fixed is the syntax: I don't know enough about
calling unmanaged code to be able to say that this will definitely do
what you want.

--
Larry Lard
Replies to group please
Author
8 May 2006 3:34 PM
Patrick Sullivan
Thanks Larry. You figured out what I wanted to know, I think. Interop is
kind of confusing. It took me quite a while to get the s_err to pass
compiling.

--

Patrick Sullivan, AA-BA, BA-IT

Show quoteHide quote
"Larry Lard" <larryl***@hotmail.com> wrote in message
news:1147101511.983180.21800@g10g2000cwb.googlegroups.com...
>
> Patrick Sullivan wrote:
> > dim s_err as stringbuilder
> > dim xx(6) as double
> > dim ret_flag as integer
> >
> > ' This is a function to call an unmanaged C-style library function.
> > ' The lib function fills an array of 6 doubles or error string.
> >
> > Declare Auto Function calc Lib "calc32.dll" Alias "calc32.dll"( ByRef
xx()
> > As Double, ByVal serr As System.Text.StringBuilder) As Integer
> >
> > ' Using the unmanaged function:
> >
> > ret_flag = swe_calc(xx(6), serr)
>
> Copy-and-pasting code is a much more reliable way of showing us your
> code. Note that the Declare calls the function 'calc' but you call it
> as 'swe_calc'. If we have to guess what you mean, it will take us
> longer to help you.
>
> >
> > If I take out the 6 in the above line, I get error "number of indices is
> > less than the number of dimensions in the indexed array."
> >
> > If I put it in, or put a zero in, like xx(0) or xx(6), I get the error
> > "value of type double cannot be converted to '1 dimensional array of
> > double'"
>
> Try
>
>         ret_flag = calc(xx, serr)
>
> The function wants an array: it is xx - not xx(0) or xx(6) or xx() -
> that is an array.
>
> Also, xx should be initialised to an empty array before calling the
> DLL, otherwise there will be nowehere to put the results:
>
>         xx = New Double(6) {}
>
> Also also, all I have fixed is the syntax: I don't know enough about
> calling unmanaged code to be able to say that this will definitely do
> what you want.
>
> --
> Larry Lard
> Replies to group please
>
Author
9 May 2006 1:19 PM
Göran_Andersson
You are declaring an array of 7 doubles. To declare an array of 6
doubles, you have to do like this:

dim xx(5) as double

Patrick Sullivan wrote:
Show quoteHide quote
> dim s_err as stringbuilder
> dim xx(6) as double
> dim ret_flag as integer
>
> ' This is a function to call an unmanaged C-style library function.
> ' The lib function fills an array of 6 doubles or error string.
>
> Declare Auto Function calc Lib "calc32.dll" Alias "calc32.dll"( ByRef xx()
> As Double, ByVal serr As System.Text.StringBuilder) As Integer
>
> ' Using the unmanaged function:
>
> ret_flag = swe_calc(xx(6), serr)
>
> If I take out the 6 in the above line, I get error "number of indices is
> less than the number of dimensions in the indexed array."
>
> If I put it in, or put a zero in, like xx(0) or xx(6), I get the error
> "value of type double cannot be converted to '1 dimensional array of
> double'"
>
> What is wrong here? TIA
>