mirror of
https://codeberg.org/andyscott/ziglings.git
synced 2024-11-08 19:20:47 -05:00
71 lines
2.4 KiB
Zig
71 lines
2.4 KiB
Zig
|
// In most of the examples so far, the inputs are known at compile time, thus
|
||
|
// the amount of memory used by the program is fixed and is requested. However, if responding to
|
||
|
// input whose size is not known at compile time, such as:
|
||
|
// - user input via command-line arguments
|
||
|
// - inputs from another program
|
||
|
//
|
||
|
// You'll need to request memory for you program to be allocated by your
|
||
|
// operating system at runtime.
|
||
|
//
|
||
|
// Zig provides several different allocators. In the Zig documentation, it
|
||
|
// recommends the Arena allocator for simple programs which allocate once and
|
||
|
// then exit:
|
||
|
//
|
||
|
// const std = @import("std");
|
||
|
//
|
||
|
// // memory allocation can fail because your computer is out of memory, so
|
||
|
// // the return type is !void
|
||
|
// pub fn main() !void {
|
||
|
//
|
||
|
// var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
||
|
// defer arena.deinit();
|
||
|
//
|
||
|
// const allocator = arena.allocator();
|
||
|
//
|
||
|
// const ptr = try allocator.create(i32);
|
||
|
// std.debug.print("ptr={*}\n", .{ptr});
|
||
|
//
|
||
|
// const slice_ptr = try allocator.create(i32);
|
||
|
// std.debug.print("ptr={*}\n", .{ptr});
|
||
|
// }
|
||
|
|
||
|
// Instead of a simple integer, this program requires a slice to be allocated that is the same size as an input array
|
||
|
|
||
|
// Given a series of numbers, take the running average. In other words, the running average of the last N elements
|
||
|
|
||
|
const std = @import("std");
|
||
|
|
||
|
fn runningAverage(arr: []const f64, avg: [] f64) void {
|
||
|
var sum: f64 = 0;
|
||
|
|
||
|
for (0.., arr) |index, val| {
|
||
|
sum += val;
|
||
|
avg[index] = sum / @intToFloat(f64, index + 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pub fn main() !void {
|
||
|
// pretend this was defined by reading in user input
|
||
|
var arr: []const f64 = &[_]f64{ 0.3, 0.2, 0.1, 0.1, 0.4 };
|
||
|
|
||
|
// initialize the allocator
|
||
|
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
||
|
|
||
|
// free the memory on exit
|
||
|
defer arena.deinit();
|
||
|
|
||
|
// initialize the allocator (TODO: replace this with ???)
|
||
|
const allocator = arena.allocator();
|
||
|
|
||
|
// TODO: replace this whole line with ???
|
||
|
var avg = try allocator.alloc(f64, arr.len);
|
||
|
|
||
|
runningAverage(arr, avg);
|
||
|
std.debug.print("Running Average: ", .{});
|
||
|
for (avg) |val| {
|
||
|
std.debug.print("{d:.2} ", .{val});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// For more details on memory allocation and the different types of memory allocators, see https://www.youtube.com/watch?v=vHWiDx_l4V0
|