Zig选择排序代码报错:数组字面量需&转换为[]i8切片类型
Zig选择排序代码错误排查与修复
错误原因
你遇到的编译错误源于Zig的类型系统限制:
[_]i8{ 64, 25, 12, 22, 11 }是固定大小的数组,属于值类型[]i8是动态切片,本质是指向数组的指针加长度,属于引用类型
Zig不允许直接将数组字面量赋值给切片变量,必须通过&运算符将数组转换为切片。
两种修复方案
方案1:直接通过&转换数组字面量
修改错误行代码为:
var arr: []i8 = &[_]i8{ 64, 25, 12, 22, 11 };
方案2:先定义固定数组,再生成切片(可读性更强)
var arr_data = [_]i8{ 64, 25, 12, 22, 11 }; var arr: []i8 = arr_data[0..]; // 从数组第0位到末尾生成切片
完整可运行的选择排序代码
const std = @import("std"); pub fn main() !void { // 初始化数组并转换为切片 var arr_data = [_]i8{ 64, 25, 12, 22, 11 }; var arr: []i8 = arr_data[0..]; // 执行选择排序 selectionSort(arr); // 打印结果 std.debug.print("排序后的数组: {any}\n", .{arr}); } /// 对i8类型的切片执行选择排序 fn selectionSort(arr: []i8) void { const len = arr.len; var i: usize = 0; while (i < len - 1) : (i += 1) { // 寻找未排序区间的最小元素索引 var min_idx = i; var j = i + 1; while (j < len) : (j += 1) { if (arr[j] < arr[min_idx]) { min_idx = j; } } // 交换当前元素与最小元素 const temp = arr[i]; arr[i] = arr[min_idx]; arr[min_idx] = temp; } }
运行验证
执行zig build run,控制台会输出:
排序后的数组: [11, 12, 22, 25, 64]
内容的提问来源于stack exchange,提问作者saswatms
相关产品推荐
相关产品推荐

