On 03/14/2018 11:23 PM, Cecil Ward wrote:
say in C I have a function with a pointer argument
     foo( const sometype_t * p )

I have asked about this D nightmare before. Using the same pattern in D or the in argument qualifier as far as I can see the value of the pointer is then itself effectively locked made constant. Without dangerous and ugly casts you are stuck.

q1. If you want a pointer to memory that is not to be modified then you can't walk the pointer through that memory.  So what are my options? I need a pointer that I can increment. (I could avoid the whole issue by using an index instead, but that seems to be giving in to madness.)

I think you're looking for this: `const(sometype_t)* p`. Here, the pointer itself is mutable.

[...]
q2. If you want a pointer to modifiable memory but wish to ensure that the value of that address stays fixed, stays where it's put, then what on earth do you do. What are my options?

Can't be done directly with type qualifiers. You could maybe write a wrapper struct that acts like a pointer while disallowing modification of the pointer itself. I don't know how feasible this could be. I've never felt a need for it.

[...]
q3. The in keyword seems to be mixed up concerning the distinction between modifiable arguments and modifiable memory. Is there any way of making in usable for the purposes of documenting the calling convention, showin which arguments are inputs only, which are outputs and which are modified - read-modified-returned?

`in` was meant to mean `scope const`. But I think it's effectively just `const` at the moment. Redefining `in` to something more useful probably means it has to be deprecated and removed first. Then brought back later with a new meaning. If that happens, it's going to take years.

[...]
q4. If my understanding is correct, it seems difficult to create a non const copy of (an address that is fixed) either; that is, making a modifiable copy of an address, one which can be incremented, moved upwards starting from a locked base address.

You can easily make a mutable pointer from a const one:

    const int* c;
    const(int)* m = c; /* no problem */

The target of the pointer just has to remain `const`.

[...]
There probably is a tool somewhere to safely create a modifiable object based on a const object but I'm not sure where to look.

Generally, that means a deep copy, right? I don't think that's in the standard library.

For arrays, there's `.dup`:

    const int[] c = [1, 2, 3];
    int[] m = c.dup;

Reply via email to