On Wed, Mar 9, 2016 at 5:21 PM, Jeffrey Sarnoff <[email protected]> wrote: > In both version 0.4 and 0.5-dev everything is as you show until: > pointer_to_array(Ptr{UInt8}(ptr[]), sz[], true) > then > julia> pointer_to_array(Ptr{UInt8}(ptr[]), sz[], true) > 140685948747867-element Array{UInt8,1}:
What I see is that `sz` is not updated until the stream is flushed/closed. Calling `fclose` here does the job you can try to add a call to `fflush` to see if it helps. > > signal (11): Segmentation fault > while loading no file, in expression starting on line 0 > alignment at ./show.jl:1104 > unknown function (ip: 0x7ff401d4117f) > [inline] at > /home/centos/buildbot/slave/package_tarball64/build/src/julia_internal.h:63 > jl_call_method_internal at > /home/centos/buildbot/slave/package_tarball64/build/src/gf.c:1914 > ... > jl_apply_generic at > /home/centos/buildbot/slave/package_tarball64/build/src/gf.c:1917 > run_frontend at ./REPL.jl:860 > run_repl at ./REPL.jl:168 > unknown function (ip: 0x7ff4023431e3) > [inline] at > /home/centos/buildbot/slave/package_tarball64/build/src/julia_internal.h:63 > jl_call_method_internal at > /home/centos/buildbot/slave/package_tarball64/build/src/gf.c:1914 > _start at ./client.jl:342 > unknown function (ip: 0x7ff6042f0199) > jl_apply_generic at > /home/centos/buildbot/slave/package_tarball64/build/src/gf.c:1917 > unknown function (ip: 0x401c64) > unknown function (ip: 0x40181f) > __libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line) > unknown function (ip: 0x401865) > /home/jas/Desktop/Juliav05: line 2: 4104 Segmentation fault > /usr/bin/julia > _ > (generic Linux version of julia) > > On Wednesday, March 9, 2016 at 2:55:31 PM UTC-5, Jeffrey Sarnoff wrote: >> >> Thank you, much appreciated. >> >> On Wednesday, March 9, 2016 at 2:52:01 PM UTC-5, Yichao Yu wrote: >>> >>> On Wed, Mar 9, 2016 at 1:05 PM, Jeffrey Sarnoff >>> <[email protected]> wrote: >>> > I am bound to the api, at least for calling into the application. I >>> > don't >>> > know how to do either of the things you recommend. Could you point me >>> > to an >>> > example? >>> >>> See below. Note that the `open_memstream` API may not be widely >>> available on non-Linux. (Apparently it's aded to POSIX though...) >>> The reason you have to deal directly with C FILE* is that the C FILE* >>> API is not designed to be extensible (or at least there's no portable >>> API to do so). Therefore, you can't convert a opaque julia IO object >>> to a C FILE* and let C libraries write through it instead... >>> >>> ``` >>> julia> p_cstdout = unsafe_load(cglobal(:stdout, Ptr{Void})) >>> Ptr{Void} @0x00007f6dcb81f600 >>> >>> julia> ccall(:fwrite, Csize_t, (Cstring, Csize_t, Csize_t, Ptr{Void}), >>> "aaa\n", 4, 1, p_cstdout) >>> aaa >>> 0x0000000000000001 >>> >>> julia> ptr = Ref{Ptr{Void}}() >>> Base.RefValue{Ptr{Void}}(Ptr{Void} @0x000000000000000e) >>> >>> julia> sz = Ref{Csize_t}() >>> Base.RefValue{UInt64}(0x00007f6bc942f5f0) >>> >>> julia> strstm = ccall(:open_memstream, Ptr{Void}, (Ptr{Ptr{Void}}, >>> Ptr{Csize_t}), ptr, sz) >>> Ptr{Void} @0x0000000002638f70 >>> >>> julia> ccall(:fwrite, Csize_t, (Cstring, Csize_t, Csize_t, Ptr{Void}), >>> "aaa\n", 4, 1, strstm) >>> 0x0000000000000001 >>> >>> julia> ccall(:fwrite, Csize_t, (Cstring, Csize_t, Csize_t, Ptr{Void}), >>> "aaa\n", 4, 1, strstm) >>> 0x0000000000000001 >>> >>> julia> sz[] >>> 0x00007f6bc942f5f0 >>> >>> julia> ccall(:fclose, Cint, (Ptr{Void},), strstm) >>> 0 >>> >>> julia> sz[] >>> 0x0000000000000008 >>> >>> julia> pointer_to_array(Ptr{UInt8}(ptr[]), sz[], true) >>> 8-element Array{UInt8,1}: >>> 0x61 >>> 0x61 >>> 0x61 >>> 0x0a >>> 0x61 >>> 0x61 >>> 0x61 >>> 0x0a >>> >>> julia> ary = ans >>> 8-element Array{UInt8,1}: >>> 0x61 >>> 0x61 >>> 0x61 >>> 0x0a >>> 0x61 >>> 0x61 >>> 0x61 >>> 0x0a >>> >>> julia> bytestring(ary) >>> "aaa\naaa\n" >>> ``` >>> >>> > >>> > On Wednesday, March 9, 2016 at 12:58:20 PM UTC-5, Yichao Yu wrote: >>> >> >>> >> >>> >> On Mar 9, 2016 12:38 PM, "Jeffrey Sarnoff" <[email protected]> >>> >> wrote: >>> >> > >>> >> > I am trying to wrap this so it will (a) print to STDOUT (b) (if >>> >> > possible) print to a string: >>> >> > void arf_fprint(FILE * file, const arf_t x)ΒΆ >>> >> > >>> >> > Prints x as an integer mantissa and exponent to the stream file. >>> >> > >>> >> > >>> >> > arf_t is made with arf(x), that works. >>> >> > >>> >> > >>> >> > this: >>> >> > >>> >> > function arf_fprint(x::arb) >>> >> > >>> >> > a = arf(x); s=STDOUT >>> >> > >>> >> > ccall((:arf_fprint, :libarb), Void, (Ptr{s}, >>> >> > Ptr{arf_struct},), &s, &a) >>> >> >>> >> Julia does not use c FILE*, if you are bound to this api, you should >>> >> probably fetch the c stream with cglobal or construct a string stream >>> >> with >>> >> platform dependent api. >>> >> >>> >> > >>> >> > end >>> >> > >>> >> > does this: >>> >> > ERROR: TypeError: Ptr: in parameter, expected Type{T}, got Base.TTY >>> >> > in arf_fprint at none:3 >>> >> >
