Debug help - Programming in D - extending tail slice terminates sharing unexpectedly. Page 69, 70
Brother Bill
brotherbill at mail.com
Sun Oct 19 21:20:17 UTC 2025
On Sunday, 19 October 2025 at 21:01:06 UTC, monkyyy wrote:
>
> Appending one slice sets the capacity to zero on other related
> slices; its best to treat slices as dynamic arrays or slices,
> not both. It will just be spooki action at a distance.
I'm missing something.
Step 1 was create a dynamic array named slice with initial values.
At this point, slice does not have slice semantics.
Step 2 was to append a new element.
Does this convert slice into an actual slice, and if so, why?
I simplified the program, removing the part of extending slice.
It still breaks slice sharing...
```
void main()
{
int[] slice = [1, 3, 5, 7, 9, 11, 13, 15];
writeln("slice: ", slice, " length: ", slice.length, " capacity:
", slice.capacity);
writeln();
int[] tailSlice = slice[$ / 2 .. $];
writeln("slice: ", slice, " length: ", slice.length, " capacity:
", slice.capacity);
writeln("tailSlice: ", tailSlice, " length: ", tailSlice.length,
" capacity: ", tailSlice.capacity, " &tailSlice[0]: ",
&tailSlice[0]);
tailSlice.length += 1; // fails here
// tailSlice ~= 0; // also fails
writeln("tailSlice after incrementing length by 1: ", tailSlice,
" length: ", tailSlice.length, " capacity: ", tailSlice.capacity,
" &tailSlice[0]: ", &tailSlice[0]);
tailSlice[0] = 888;
writeln("After tail slice length increase and changing
tailSlice[0] to 888. ", " length: ", tailSlice.length, "
capacity: ", tailSlice.capacity);
writeln("tailSlice: ", tailSlice);
writeln("slice : ", slice);
}
```
Console output:
```
slice: [1, 3, 5, 7, 9, 11, 13, 15] length: 8 capacity: 11
slice: [1, 3, 5, 7, 9, 11, 13, 15] length: 8 capacity: 11
tailSlice: [9, 11, 13, 15] length: 4 capacity: 7 &tailSlice[0]:
1E9ECD71010
tailSlice after incrementing length by 1: [9, 11, 13, 15, 0]
length: 5 capacity: 7 &tailSlice[0]: 1E9ECD70020
After tail slice length increase and changing tailSlice[0] to
888. length: 5 capacity: 7
tailSlice: [888, 11, 13, 15, 0]
slice : [1, 3, 5, 7, 9, 11, 13, 15]
```
More information about the Digitalmars-d-learn
mailing list