How would the equivalent C type be in D?
rempas
rempas at tutanota.com
Wed Mar 1 09:37:48 UTC 2023
On Wednesday, 1 March 2023 at 08:26:07 UTC, FeepingCreature wrote:
>
> 11 is SIGSEGV. A segfault, or access violation, happens when
> you try to access unallocated memory. In this case, let me
> annotate your code so it's easier to see what's happening:
>
> ```d
> // null is the default value for a pointer
> uint* value = null;
> // because `value` is null, the first index also lies at null.
> assert(&value[0] is null);
> // So we try to store screen.black_pixel at memory address
> null, which is unallocated.
> value[0] = screen.black_pixel;
> xcb_create_gc(connection, black, win, mask, value);
> ```
>
> As there is no memory segment allocated at address null, the
> CPU indicates a segmentation fault, which terminates the
> program.
>
> So yes, `xcb_create_gc` wants a `uint*` parameter, but not just
> any `uint*` will do: it has to point to valid memory. Going
> back to the first snippet, what's happening here is that in C,
> arrays implicitly convert to pointers, because C doesn't have a
> notion of array types as distinct from pointer types. So you
> can have a variable declared as `uint[1]`, but pass it to a
> parameter that expects `uint*`, and the value that is passed
> will just be the address of the first field of the array.
> However, even in C, if you try to define `value` as `uint*`, it
> will segfault in the same way. Instead, in D, you need to tell
> the compiler to define an array of size 1, and then pass a
> pointer to the array's first member explicitly:
>
> ```d
> uint32_t[1] value;
> value[0] = screen.black_pixel;
> // this is what C does under the hood
> xcb_create_gc(connection, black, win, mask, &value[0]);
> ```
>
> Or shorter, but with the same effect:
>
> ```d
> uint32_t[1] value;
> value[0] = screen.black_pixel;
> xcb_create_gc(connection, black, win, mask, value.ptr);
> ```
Thank you! You are amazing for explaining it! I was so focused on
thinking that I'm doing something wrong with the type that I
didn't noticed that the pointers, points to nowhere so the
function obviously has nowhere to write to. Like... OMG! And I
want to make a fully fledged compiler when making stupid mistakes
like that. Btw, When I executed the program, I got "Error Program
exited with code -11". You said that the code was "11". What
about that dash? If it is not a "minus" and it's just the dash
symbol, then what's the idea?
More information about the Digitalmars-d-learn
mailing list