summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--exercises/076a_memory_allocation.zig43
1 files changed, 24 insertions, 19 deletions
diff --git a/exercises/076a_memory_allocation.zig b/exercises/076a_memory_allocation.zig
index b098773..ff54edf 100644
--- a/exercises/076a_memory_allocation.zig
+++ b/exercises/076a_memory_allocation.zig
@@ -1,22 +1,22 @@
-// 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:
+// 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.
+// 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.
+// You'll need to request memory for your 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:
+// 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
+// // memory allocation can fail, so the return type is !void
// pub fn main() !void {
-//
+//
// var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
// defer arena.deinit();
//
@@ -25,17 +25,21 @@
// const ptr = try allocator.create(i32);
// std.debug.print("ptr={*}\n", .{ptr});
//
-// const slice_ptr = try allocator.create(i32);
+// const slice_ptr = try allocator.create(f64, 5);
// 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
+// Instead of an simple integer or a constant sized slice, 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
+// Given a series of numbers, take the running average. In other
+// words, each item N should contain the average of the last N
+// elements.
const std = @import("std");
-fn runningAverage(arr: []const f64, avg: [] f64) void {
+fn runningAverage(arr: []const f64, avg: []f64) void {
var sum: f64 = 0;
for (0.., arr) |index, val| {
@@ -54,11 +58,11 @@ pub fn main() !void {
// free the memory on exit
defer arena.deinit();
- // initialize the allocator (TODO: replace this with ???)
+ // initialize the allocator
const allocator = arena.allocator();
- // TODO: replace this whole line with ???
- var avg = try allocator.alloc(f64, arr.len);
+ // allocate memory for this array instead of empty initialization
+ var avg: []f64 = {};
runningAverage(arr, avg);
std.debug.print("Running Average: ", .{});
@@ -67,4 +71,5 @@ pub fn main() !void {
}
}
-// For more details on memory allocation and the different types of memory allocators, see https://www.youtube.com/watch?v=vHWiDx_l4V0
+// For more details on memory allocation and the different types of
+// memory allocators, see https://www.youtube.com/watch?v=vHWiDx_l4V0