如何创建任意大小的多维数组?

问题描述

我正在Zig中编写一个函数,该函数应接受任意大小的多维数组。可能会有限制,但我无法提前对尺寸进行硬编码。

这里是一个例子:

const warn = @import("std").debug.warn;

fn printMap(map: []const [4]bool) void {
    for (map) |row| {
        for (row) |tile| {
            warn("{}\t",.{tile});
        }
        warn("\n",.{});
    }
}

pub fn main() !void {
    const map = [_][4]bool{
        [_]bool{ false,false,false },[_]bool{ false,true,};
    printMap(map[0..]);
}

这会编译并运行,但是如果我将函数签名更改为

fn printMap(map: []const []bool) void

我收到错误消息

expected type '[]const []bool',found '[]const [4]bool'

有可能用Zig表达吗?

解决方法

您的map被声明为多维数组[4][4]bool,并且数组的长度是编译时间类型的一部分(基于我对https://ziglang.org/documentation/master/#Slices的理解)。

如您从printMap所了解的那样,如果要在运行时定义这些大小,则必须使用切片(带有指针和长度的类型),例如[][]bool

要使用签名printMap(map: []const []bool)使示例工作,可以执行以下操作:

var a = [_]bool{ false,false,true };
var b = [_]bool{ false,true,false };

const map = [_][]bool{
    a[0..],// Make it a slice using slice syntax
    &b,// Or make it a slice by coercing *[N]T to []T
};

var c: []const []bool = map[0..]; // Pass it as a slice of slices
printMap(c);

要创建任意大小的多维切片数组,您需要有一些缓冲区来存储数据。 您可以使用一些静态内存,也可以根据需要分配一些内存,一种方法可能是:

fn buildMap(x: u8,y: u8,allocator: *std.mem.Allocator) ![][]bool {
    var map: [][]bool = undefined;
    map = try allocator.alloc([]bool,x);
    for (map) |*row| {
        row.* = try allocator.alloc(bool,y);
    }
    return map;
}

应该与printMap(map: []const []bool)一起使用。

另一种方法是使用一维数组/缓冲区,并适当地对其进行索引,但这并不能完全回答您的问题。我是该语言的新手,所以可能会错过一些微妙之处。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...