Transmuting dynamic arrays and corresponding slices

For any future readers, there is a way to do this: subslice the input dynamic array of f64s and then use slice.reinterpret() to iterate over it as x,y structs.

In this case, if you just use transmute(), the length will be messed up, because transmute() does a raw bit cast, and the dynamic array length field will remain at 4 instead of changing to 2. So slice.reinterpret() is nice because it does that length calculation for you.

For example:

	xyDataDynamicArray : [dynamic]f64 = {}
	append_elems(&xyDataDynamicArray, 12.3, 23.4, 34.5, 45.6)

	// Bad code, could segfault
	fmt.println("Iterating dynamic array with transmute (bad - length is messed up - still 4 instead of 2):")
	ptDynamicArray := transmute([dynamic]ptType)xyDataDynamicArray
	for x, i in ptDynamicArray {
		fmt.println(i, "=>", x)
	}

	// Good code
	fmt.println("Iterating dynamic array with subslice and slice.reinterpret() (good):")
	xySlice := xyDataDynamicArray[:]
	ptSlice := slice.reinterpret([]ptType, xySlice)
	for x, i in ptSlice {
		fmt.println(i, "=>", x)
	}
}

output:

Iterating dynamic array with transmute (bad - length is messed up - still 4 instead of 2):
0 => ptType{x = 12.3, y = 23.4}
1 => ptType{x = 34.5, y = 45.6}
2 => ptType{x = 0, y = 0}
3 => ptType{x = 0, y = 0}
Iterating dynamic array with subslice and slice.reinterpret() (good):
0 => ptType{x = 12.3, y = 23.4}
1 => ptType{x = 34.5, y = 45.6}

See also Using transmute to iterate elements of a flattened 2d array with dynamic outer dimension

1 Like