Pointers to Dynamic Arrays

Nicholas Wilson via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Aug 16 20:04:51 PDT 2015


On Monday, 17 August 2015 at 02:45:22 UTC, Brandon Ragland wrote:
> Howdy,
>
> Since Dynamic Arrays / Slices are a D feature, using pointers 
> to these has me a bit confused...
>
> Consider:
>

> Now what is especially confusing about this, is that the above 
> seems to works fine, while this does not:
>
> if(file[(*pos + i)] == '}'){
> 	*pos += i;
> 	return;
> }
>
> This fails with this error:
> Error: incompatible types for ((file[cast(ulong)(*pos + i)]) == 
> ('}')): 'char[]' and 'char'
>
This is wrong. what you want is (*file)[(*pos + i)] == '}'
file is a pointer. deref it you get a char array. index that you 
get a char.
> Now what I do not understand, is if the above works, by 
> appending come chars gathered from the dynamic array via 
> pointer to me new dynamic array named "s", and the below does 
> not seem to work on comparison of two chars, what is really 
> going on?
>
> I can no longer assume that using the dynamic array pointer 
> works anything like a standard pointer to an array,

It is. arr.ptr[n] is the same as arr[n] (modulo bounds checking)

> or a pointer to a dynamic array.
>
> Is there something I'm missing?
>
> Remember, that de-referencing a dynamic array was deprecated. 
> So what I would normally have done: &dynamic_array_pntr does 
> not work any longer, and there is no new spec on what to do...
>
> -Brandon

> string c2s(int* pos, char[]* file, int l){
> 	char[] s;
> 	for(int i = 0; i < l; i++){
> 		s ~= file[(*pos + i)];
> 	}
> 	return s.dup;
> }
>

would more idiomatically be written as
string c2s(int* pos, char[]* file, int k)
{
     char* p = *file.ptr+*pos;
     return  p[0 .. k].dup
}

or changing the signature
string c2s(char[] file, size_t offset,size_t length)
{
     return file[offset .. offset + length].dup;
}


More information about the Digitalmars-d-learn mailing list