arrays - Zig编译器是否将具有comptime可变长度的数组视为可能的零长度数组?

标签 arrays compiler-errors zig

我正在Zig中试验n维数组。

const expectEqual = std.testing.expectEqual;

fn NdArray(comptime n: comptime_int, comptime shape: [n]comptime_int) type {
    if (shape.len == 0) {
        // zero dimensional array, return the scalar type
        return u8;
    } else {
        return struct {
            // positive dimensional array, return an array of arrays one dimension lower
            data: [shape[0]]NdArray(n - 1, shape[1..].*)
        };
    }
}

test "NdArray test" {
    const expected = struct {
        data: [2]struct {
            data: [6]struct {
                data: [9]struct {
                    data: u8
                }
            }
        }
    };
    expectEqual(NdArray(3, [3]comptime_int{ 2, 6, 9 }), expected);
}
但是我得到一个编译错误:
11:25: error: accessing a zero length array is not allowed
            data: [shape[0]]NdArray(n - 1, shape[1..].*)
                        ^
shape的长度为零时,我看不到编译器到达第11行的任何方式。编译器是否只禁止索引shape,因为它没有用整数文字表示的长度?

最佳答案

我认为,更多的是扩展注释而不是答案,正如tuket所说,这似乎与编译器有关。我期待比我要给的更好的解释= D
看起来struct子作用域(如果在此处适用这种情况)是在外部作用域之前求值的。如果将shape[0]引用移至父范围,则似乎可行:

fn NdArray(comptime n: comptime_int, comptime shape: [n]comptime_int) type {
    if (shape.len == 0) {
        // zero dimensional array, return the scalar type
        return u8;
    } else {
        var foo = shape[0];
        return struct {
        // positive dimensional array, return an array of arrays one dimension lower
            data: [foo]NdArray(n - 1, shape[1..].*)
        };
    }
}
由于您的错误将来自此递归的最后一次传递,因此另一种选择是以非递归的方式重写它。

关于arrays - Zig编译器是否将具有comptime可变长度的数组视为可能的零长度数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64009669/

相关文章:

javascript - 在javascript中将坐标存储在数组中

arrays - 将数组参数直接解压为参数?

python - np.isnan 用于 Python 中的数组

c - 如何在c中创建没有数据库的多变量数组

java - “Cannot find symbol”或 “Cannot resolve symbol”错误是什么意思?

c++ - Count.h :10:5: error: ISO C++ forbids declaration of 'T' with no type [-fpermissive] T(); ^

php - phpurple编译错误-php 5.3

zig - 如何动态导入 zig 模块?

具有多个 exe 和 lib 的 zig 项目

之字号 `Segmentation fault at address`