How ptr arithmitic works??? It doesn't make any sense....
    Salih Dincer 
    salihdb at hotmail.com
       
    Mon Dec  5 22:21:06 UTC 2022
    
    
  
On Monday, 5 December 2022 at 18:01:47 UTC, ag0aep6g wrote:
> You can use bracket notation with pointers. You just need to 
> move your closing parenthesis a bit.
>
> Assuming that `ptr` is a `void*`, these are all equivalent...
Yeah, there is such a thing!  I'm sure you'll all like this 
example:
```d
struct AAish(K, V, size_t s)
{
   K key;
   V[s] value; // 5 + 1(\0)
   string toString() {
     import std.format : format;
     import core.stdc.string : strlen;
     auto result = value[0..strlen(value.ptr)];
     return format("%s: %s", key, result);
   }
}
void stringCopy(C)(ref C src, string str) {
   import std.algorithm : min;
   auto len = min(src.length - 1,
                  str.length);
   src[0 .. len] = str[0 .. len];
   src[len] = '\0';
}
enum n = 9;
alias AA = AAish!(int, char, n);
void main()
{
   // First, we malloc for multiple AA()
   import core.stdc.stdlib;
   auto v = malloc(n * AA.sizeof);
   static assert(
     is (typeof(v) == void*)
   );
   // Cast to use memory space for AA()'s
   auto ptr = cast(AA*)v;
   static assert(
     is (typeof(ptr) == AA*)
   );
   // init AA()'s:
   foreach(i; 0..n)
   {
     ptr[i] = AA(i);
   }
   import std.stdio;
   ptr[0].value.stringCopy = "zero";
   ptr[0].writeln;
   ptr[1].value.stringCopy = "one";
   ptr[1].writeln;
   ptr[2].value.stringCopy = "two";
   ptr[2].writeln;
   ptr[3].value.stringCopy = "three";
   ptr[3].writeln;
   "...".writeln; //...
   ptr[8].value.stringCopy = "eight";
   ptr[8].writeln;
   ptr[0..n/2].writeln;
}
/* Prints:
0: zero
1: one
2: two
3: three
...
8: eight
[0: zero, 1: one, 2: two, 3: three]
*/
```
SDB at 79
    
    
More information about the Digitalmars-d-learn
mailing list