As I tried to explain before, Aptrs corresponds to a Ptr{Ptr{T}} *no matter how many dimensions you have*. But showing the C code you want to use makes your problem vastly clearer: now I know you want a `Ptr{Ptr{Ptr{Ptr{T}}}}` for 4 dimensions.
I think you want a recursive solution, something like ``` ptr1d(A::AbstractVector) = pointer(A) function ptr1d(A::AbstractArray) colons = fill(:, ndims(A) - 1) ptr1 = ptr1d(view(A, colons..., 1)) # get 1 pointer so we know the type Aptr = Array{typeof(ptr1)}(size(A)[end]) Aptr[1] = ptr1 for i = 2:size(A)[end] Aptr[i] = ptr1d(view(A, colons..., i)) end Aptr end ``` Then just pass `ptr1d(A)` as the last argument of your ccall. Best, --Tim On Fri, Nov 4, 2016 at 10:07 AM, Alexander Lyapin < lyapinaalexan...@gmail.com> wrote: > Tim, thank you for reply! > > Everything was fine when I tried simple 2D array. Then I moved to real > problem and got some errors... please check: > > -----test.c----- > #include <stdio.h> > double test(double ****param) { > return param[1][1][1][1]; > } > > > ----Julia----- > # ar is Array{Float64,4} > > sz = size(ar)[1:end] > Aptrs = Array{Ptr{eltype(ar)}}(sz) > for I in CartesianRange(sz) > Aptrs[I] = pointer(ar, sub2ind(size(ar), 1, I.I...)) > end > println(ccall(("test","test"),Float64,(Ptr{Ptr{Ptr{Ptr{Float64}}}},), > Aptrs)) > > > something is wrong here... > > > пятница, 4 ноября 2016 г., 17:19:17 UTC+3 пользователь Tim Holy написал: >> >> ccall(sym, Void, (Ptr{Ptr{T}},), Aptrs) >> >> When you pass an array via `ccall`, it takes the pointer of the data, >> which is why this produces a Ptr{Ptr{T}} from an Array{Ptr{T}}. >> >> Best, >> --Tim >> >> On Fri, Nov 4, 2016 at 9:14 AM, Alexander Lyapin <lyapinaa...@gmail.com> >> wrote: >> >>> but in C i have **double, wich is pointer pointer to array. >>> Also in link that I gave, there an example for 2D where it is >>> Ptr{Ptr{Float64}} >>> >>> But anyway, could you give an example for ccall in your case??? >>> >>> пятница, 4 ноября 2016 г., 17:05:57 UTC+3 пользователь Yichao Yu написал: >>>> >>>> On Fri, Nov 4, 2016 at 9:22 AM, Alexander Lyapin >>>> <lyapinaa...@gmail.com> wrote: >>>> > There is a topic: >>>> > https://groups.google.com/d/msg/julia-users/EK9oNzzaoAk/kJqagPL0Ku0J >>>> > >>>> > However could some one give an example how to pass 3-d or 4-d array >>>> to C >>>> > function. >>>> > >>>> > I have Array{Float64, 4} and for ccall I use >>>> Ptr{Ptr{Ptr{Ptr{Float64}}}} as >>>> > Type of parameter. Is there some way to make it more common for >>>> > Array{Float64, N}??? Thank you >>>> >>>> No matter what the dimension is,it's always a `Ptr{eltype(array)}` in >>>> C (`Ptr{Float64}` in thiscase) and since it's just a normalpointer, >>>> you always need topass the dimensions explicitlyto C in another >>>> argumetns. >>>> >>> >>