Skip to content

[Julia API] Initialize output variables

Fredrik Ekre requested to merge fe/jl_initialize_arg into master

In the Julia API output int, double and string were not initialized and, hence, we passed undefined variables to ccall in a couple of places. This PR includes the following:

  • First commit initializes ints with Ref{Cint}() and returns the referenced value. Example diff:

     function getElement(elementTag)
    +    api_elementType_ = Ref{Cint}()
         api_nodeTags_ = Vector{Ptr{Cint}}(1)
         api_nodeTags_n_ = Vector{Csize_t}(1)
         ierr = Ref{Cint}()
         ccall((:gmshModelMeshGetElement, gmsh.clib), Void,
               (Cint, Ptr{Cint}, Ptr{Ptr{Cint}}, Ptr{Csize_t}, Ptr{Cint}),
    -          elementTag, elementType, api_nodeTags_, api_nodeTags_n_, ierr)
    +          elementTag, api_elementType_, api_nodeTags_, api_nodeTags_n_, ierr)
         nodeTags = unsafe_wrap(Array, api_nodeTags_[1], api_nodeTags_n_[1], true)
         ierr[] != 0 && error("gmshModelMeshGetElement returned non-zero error code: $(ierr[])")
    -    return elementType, nodeTags
    +    return api_elementType_[], nodeTags
     end
  • Second commit initializes output double with Ref{Cdouble}() and returns the referenced value. Example diff:

     function getNumber(name)
    +    api_value_ = Ref{Cdouble}()
         ierr = Ref{Cint}()
         ccall((:gmshOptionGetNumber, gmsh.clib), Void,
               (Ptr{Cchar}, Ptr{Cdouble}, Ptr{Cint}),
    -          name, value, ierr)
    +          name, api_value_, ierr)
         ierr[] != 0 && error("gmshOptionGetNumber returned non-zero error code: $(ierr[])")
    -    return value
    +    return api_value_[]
     end
  • Third commit initialized output string with Ref{Ptr{Cchar}} and returns the referenced pointer as a Julia String. Example diff:

     function getPhysicalName(dim, tag)
    +    api_name_ = Ref{Ptr{Cchar}}()
         ierr = Ref{Cint}()
         ccall((:gmshModelGetPhysicalName, gmsh.clib), Void,
               (Cint, Cint, Ptr{Ptr{Cchar}}, Ptr{Cint}),
    -          dim, tag, name, ierr)
    +          dim, tag, api_name_, ierr)
    +    name = unsafe_string(api_name_[])
         ierr[] != 0 && error("gmshModelGetPhysicalName returned non-zero error code: $(ierr[])")
         return name
     end

Merge request reports