Zig语言如何将数组成员设为变量?编译报错无法赋值给常量
解决Zig编译错误:cannot assign to constant
你的问题核心是循环中拿到的是数组元素的拷贝而非引用,所以无法修改原board数组里的元素。你之前只改了内层循环的&row,但外层循环还是值传递,导致内层的row依然是拷贝,自然没法修改field。
具体修改步骤:
- 外层循环遍历
&board,获取指向每一行的指针(*[SIZE]u8),这样操作的是原数组的行,而非拷贝:for (&board, 0..) |*row, r| { - 内层循环遍历
&row.*(解引用行指针后取地址),获取指向每个元素的指针(*u8):for (&row.*, 0..) |*field, c| { - 赋值时需要解引用
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
相关产品推荐
相关产品推荐

