Please forgive me if I'm giving too much obvious info; I'm not aware of 
your background and I want to answer this as completely as possible.

This has to do with how Julia stirngs are converted to C strings. C strings 
are just pointers to an array of bytes where the null byte '\0' denotes the 
termination of a string. Julia strings are a wrapper around this structure. 
For a regular String, converting a Julia string to a C string simply 
returns the underlying pointer.

The following is my educated guess:

SubStrings, however, refer to the same area in memory as the String they 
are a section of--they just contain indicators that denote where the start 
and end of the substring should be.

Returning a pointer to the location of the SubString is problematic, as as 
far as C routines are concerned, it ends when the original string ends: at 
the null byte. Not a problem if the SubString is supposed to end at the 
same place, but will not work if it is supposed to end earlier than that. 
So, any call to a C function must create a copy of any SubString that ends 
earlier than the end of the original String (bytestring, ascii, utf8, copy, 
etc. will do this for you). 

On Saturday, 1 February 2014 07:01:50 UTC-6, David van Leeuwen wrote:
>
> Hello, 
>
> I have problems opening a file of which the name is specified as a 
> SubString.  The substring is a result of a readdlm, which is fine by me, 
> but I don't know how to get rid of its substringness.  Well, perhaps 
> ascii() will do the job---but that is not the point of this message. 
>
> The problem is isolated in the following code:
>
> julia> open(match(r"ab", "abc").match, "r") ## should try to open a file 
> called "ab"
> ERROR: a SubString must coincide with the end of the original string to 
> be convertible to pointer 
>  in convert at string.jl:659 
>  in open at io.jl:351 
>  in open at io.jl:363
>
>
> I believe the offending line is in a ccall
>     systemerror("opening file $fname",
>                 ccall(:ios_file, Ptr{Void},
>                       (Ptr{Uint8}, Ptr{Uint8}, Int32, Int32, Int32, Int32
> ),
>                       s.ios, fname, rd, wr, cr, tr) == C_NULL)
>
>
> Cheers, 
>
> ---david
>
>
>

Reply via email to