/* ===== 进阶数组与切片 ===== * test19_hardarray — 多维数组、多维切片、切片构造、字符串测试 * 难度:4/5 * 验证点:多维数组索引与修改、多维切片、切片字段读写、扁平指针访问、字符串切片 */ fn test_string() i32 { /* ============================ * String test: str is []u8 * ============================ */ var data: *u8 = "hello"; var s: []u8 = { .ptr = data, .len = 5 }; if s.len != 5 { ret 100; } if s[0] != 104 { ret 101; } /* 'h' */ if s[1] != 101 { ret 102; } /* 'e' */ if s[4] != 111 { ret 103; } /* 'o' */ /* Slice the string slice */ var sub: []u8 = s[1..4]; if sub.len != 3 { ret 104; } if sub[0] != 101 { ret 105; } /* 'e' */ if sub[2] != 108 { ret 106; } /* 'l' */ /* Modify through slice → original changes */ s[0] = 72; /* 'H' */ if data[0] != 72 { ret 107; } /* Full slice */ var full: []u8 = s[0..]; if full.len != 5 { ret 108; } if full[0] != 72 { ret 109; } /* Construct slice from pointer via field assignment */ var s2: []u8; s2.ptr = data; s2.len = 3; if s2.len != 3 { ret 110; } if s2[0] != 72 { ret 111; } ret 0; } fn main() i32 { /* ============================ * Part 1: 多维数组(逐元素初始化) * ============================ */ var matrix: [2][3]i32; matrix[0][0] = 1; matrix[0][1] = 2; matrix[0][2] = 3; matrix[1][0] = 4; matrix[1][1] = 5; matrix[1][2] = 6; if matrix[0][0] != 1 { ret 1; } if matrix[0][1] != 2 { ret 2; } if matrix[0][2] != 3 { ret 3; } if matrix[1][0] != 4 { ret 4; } if matrix[1][1] != 5 { ret 5; } if matrix[1][2] != 6 { ret 6; } /* 元素修改 */ matrix[0][0] = 10; matrix[1][2] = 60; if matrix[0][0] != 10 { ret 7; } if matrix[1][2] != 60 { ret 8; } /* ============================ * Part 2: 嵌套循环遍历多维数组 * ============================ */ var big: [3][4]i32; big[0][0] = 1; big[0][1] = 2; big[0][2] = 3; big[0][3] = 4; big[1][0] = 5; big[1][1] = 6; big[1][2] = 7; big[1][3] = 8; big[2][0] = 9; big[2][1] = 10; big[2][2] = 11; big[2][3] = 12; var total: i32 = 0; var i: i32 = 0; while i < 3 { var j: i32 = 0; while j < 4 { total = total + big[i][j]; j = j + 1; } i = i + 1; } if total != 78 { ret 9; } /* ============================ * Part 3: &取地址 + 扁平指针访问 * ============================ */ var flat: *i32 = &matrix[0][0]; if flat[0] != 10 { ret 10; } if flat[1] != 2 { ret 11; } if flat[2] != 3 { ret 12; } if flat[3] != 4 { ret 13; } if flat[4] != 5 { ret 14; } if flat[5] != 60 { ret 15; } /* ============================ * Part 4: 多维数组切片 * ============================ */ var row: []i32 = matrix[0][0..3]; if row.len != 3 { ret 16; } if row[0] != 10 { ret 17; } if row[1] != 2 { ret 18; } if row[2] != 3 { ret 19; } /* 切取第二行 */ var row2: []i32 = matrix[1][0..]; if row2.len != 3 { ret 20; } if row2[0] != 4 { ret 21; } if row2[2] != 60 { ret 22; } /* ============================ * Part 5: 切片的切片 * ============================ */ var sub: []i32 = row[1..3]; if sub.len != 2 { ret 23; } if sub[0] != 2 { ret 24; } if sub[1] != 3 { ret 25; } /* ============================ * Part 6: 切片字段读写 * ============================ */ var arr: [4]i32; arr[0] = 100; arr[1] = 200; arr[2] = 300; arr[3] = 400; var custom: []i32; custom.ptr = &arr[1]; custom.len = 2; if custom.len != 2 { ret 26; } if custom[0] != 200 { ret 27; } if custom[1] != 300 { ret 28; } /* 修改切片长度 */ custom.len = 3; if custom.len != 3 { ret 29; } if custom[2] != 400 { ret 30; } /* ============================ * Part 7: 空范围 / 全切片 * ============================ */ var full: []i32 = arr[0..]; if full.len != 4 { ret 31; } if full[0] != 100 { ret 32; } if full[3] != 400 { ret 33; } /* ============================ * Part 8: 从指针构造切片 * ============================ */ var data: [5]i32; data[0] = 10; data[1] = 20; data[2] = 30; data[3] = 40; data[4] = 50; var p: *i32 = &data[2]; var from_ptr: []i32 = { .ptr = p, .len = 2 }; var from_ptr2: []i32; from_ptr2.ptr = p; from_ptr2.len = 2; if from_ptr.len != 2 { ret 34; } if from_ptr[0] != 30 { ret 35; } if from_ptr[1] != 40 { ret 36; } if from_ptr2.len != 2 { ret 37; } if from_ptr2[0] != 30 { ret 38; } if from_ptr2[1] != 40 { ret 39; } /* ============================ * Part 9: 切片元素修改反映到原始数组 * ============================ */ row2[0] = 99; if matrix[1][0] != 99 { ret 40; } /* ============================ * Part 10: 1D 数组字面量仍然正常 * ============================ */ var literal: [3]i32 = [3]i32{10, 20, 30}; if literal[0] != 10 { ret 41; } if literal[1] != 20 { ret 42; } if literal[2] != 30 { ret 43; } /* ============================ * Part 11: 字符串切片测试 * ============================ */ var r: i32 = test_string(); if r != 0 { ret r; } ret 0; }