You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Zig语言如何将数组成员设为变量?编译报错无法赋值给常量

解决Zig编译错误:cannot assign to constant

你的问题核心是循环中拿到的是数组元素的拷贝而非引用,所以无法修改原board数组里的元素。你之前只改了内层循环的&row,但外层循环还是值传递,导致内层的row依然是拷贝,自然没法修改field。

具体修改步骤:

  1. 外层循环遍历&board,获取指向每一行的指针(*[SIZE]u8),这样操作的是原数组的行,而非拷贝:
    for (&board, 0..) |*row, r| {
    
  2. 内层循环遍历&row.*(解引用行指针后取地址),获取指向每个元素的指针(*u8):
    for (&row.*, 0..) |*field, c| {
    
  3. 赋值时需要解引用field指针,修改原数组元素:
    field.* = parse_input;
    

修改后的完整代码:

const std = @import("std");

const SIZE: u8 = 9;

fn create_board() [SIZE][SIZE]u8 {
    var board: [SIZE][SIZE]u8 = undefined;
    for (&board) |*row| {
        row.* = [_]u8{0} ** 9;
    }
    return board;
}

pub fn main() !void {
    const halloc = std.heap.page_allocator;
    var board = create_board();

    for (&board, 0..) |*row, r| {
        for (&row.*, 0..) |*field, c| {
            while (true) {
                std.io.getStdOut().writer().print("Enter number for row {}, column {} - '0' if empty: ", .{r, c}) catch @panic("Output error!");
                const field_input = std.io.getStdIn().reader().readUntilDelimiterAlloc(halloc, '\n', 4) catch @panic("Input error!");
                defer halloc.free(field_input);
                const parse_input = std.fmt.parseInt(u8, field_input, 10) catch {
                    std.io.getStdOut().writer().print("\nInvalid integer, try again.\n", .{}) catch @panic("Output error!");
                    continue;
                };
                if (parse_input <= SIZE) {
                    field.* = parse_input;
                    break;
                } else {
                    std.io.getStdOut().writer().print("\nValue too large, try again.\n", .{}) catch @panic("Output error!");
                    continue;
                }
            }
        }
    }
}

Zig的for循环默认是值传递,如果你要修改原数组的元素,必须通过指针获取引用。外层循环拿&board的元素是行指针,内层循环再拿行的地址得到元素指针,这样解引用后赋值才能真正修改原board里的数值。

内容的提问来源于stack exchange,提问作者3vilRat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:35:19