On Monday, 24 November 2025 at 14:37:22 UTC, Jabba Laci wrote:
Another question: for `process_line()`, I pass the dictioary by reference, since I want to modify the dictionary inside this procedure. Without `ref`, the original `d` in `main()` remained empty. However, I've already written programs when I passed a dictionary without `ref` and the changes to the dictionary were visible outside of the procedure. What's the rule here?
When you declare an associative array (dictionary) variable in D, what's stored in the variable is a pointer. By default, that pointer is `null`. When you pass an AA to a function by value (without using `ref`), the function receives a copy of the pointer.
Normally, you might expect that attempting to insert a value into a `null` AA would result in an error or exception. However, the D runtime has a special feature to prevent this: when inserting a value into an AA, if the pointer to the AA is `null`, the runtime allocates a new AA automatically before performing the insertion, and updates the `null` pointer to point to it.
So what's happening is, you're passing a copy of your `null` AA pointer to your function, that function is allocating a new AA, and then when the function returns, your original pointer is still `null`.
The simplest way to work around this is to initialize your AA variable to a non-`null` value. For example:
```d int[Pair] d = new int[Pair]; ```
