본문 바로가기

Zig

(3)
tag union으로 타입마다 함수 호출하기 pub const SCENE = union(enum) { TITLE: title, SELECT_GAME_MODE: select_game_mode,};pub var scene = SCENE.TITLE;const tags = comptime std.meta.tags(SCENE);inline for (tags.*) |t| {//모든 씬마다 업데이트 호출 std.meta.TagPayload(SCENE, t).update();}//title.update();//select_game_mode.update();위 코드와 같이 장면들의 각 타입을 기입해서 union을 만들어서 tags 함수로 해당 union 모든 태그를 가져온후 루프를 돌려서 그 태그의 해당하는 타입을 TagPayload로 가져와서 u..
zig에서 C 문자열 다루기 const zigString: []const u8 = std.mem.span(c_string);const c_string: [:0]u8 = try allocator.dupeZ(u8, zigString);std.mem.span 함수는 c 문자열에서 c문자열이 0으로 끝나는 지점(길이) 까지 문자열 slice로 변환해줍니다. 이때 같은 메모리 공간을 사용하므로 추가적인 할당은 없습니다.(결과 slice에는 0이 포함되지 않음.) allocator.dupeZ 함수는 zig string(위에 말했던 slice 문자열)을 0으로 끝나는 c_string으로 변환해줍니다. 이때는 뒤에 0이 들어갈 공간이 있어야 하기 때문에 길이+1만큼 메모리를 할당해서 복사해서 줍니다.
임의의 크기 행렬 구현 const std = @import("std");pub const matrix4x4 = matrix(f32, 4, 4);pub const matrix3x3 = matrix(f32, 3, 3);pub const matrix_error = error{not_exist_inverse_matrix};/// row ↕, col ↔pub fn matrix(comptime T: type, row: comptime_int, col: comptime_int) type { switch (@typeInfo(T)) { .Int, .Float, .ComptimeInt, .ComptimeFloat => {}, else => { @compileError("not a number ..