summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--build.zig7
-rw-r--r--exercises/093_hello_c.zig2
-rw-r--r--exercises/094_c_math.zig33
-rw-r--r--patches/patches/094_c_math.patch4
4 files changed, 44 insertions, 2 deletions
diff --git a/build.zig b/build.zig
index 1abe5c7..785cceb 100644
--- a/build.zig
+++ b/build.zig
@@ -471,7 +471,12 @@ const exercises = [_]Exercise{
},
.{
.main_file = "093_hello_c.zig",
- .output = "Hello C from Zig! - C result ist 17 chars",
+ .output = "Hello C from Zig! - C result ist 17 chars written.",
+ .C = true,
+ },
+ .{
+ .main_file = "094_c_math.zig",
+ .output = "The normalized angle of 765.2 degrees is 45.2 degrees.",
.C = true,
},
.{
diff --git a/exercises/093_hello_c.zig b/exercises/093_hello_c.zig
index b294f38..368a918 100644
--- a/exercises/093_hello_c.zig
+++ b/exercises/093_hello_c.zig
@@ -57,7 +57,7 @@ pub fn main() void {
const c_res = write(2, "Hello C from Zig!", 17);
// let's see what the result from C is:
- std.debug.print(" - C result ist {d} chars\n", .{c_res});
+ std.debug.print(" - C result ist {d} chars written.\n", .{c_res});
}
//
// Something must be considered when compiling with C functions.
diff --git a/exercises/094_c_math.zig b/exercises/094_c_math.zig
new file mode 100644
index 0000000..a8596b7
--- /dev/null
+++ b/exercises/094_c_math.zig
@@ -0,0 +1,33 @@
+//
+// Often C functions are used where no equivalent Zig function exists
+// yet. Since the integration of a C function is very simple as already
+// seen in the last exercise, it naturally offers itself to use the
+// very large variety of C functions for the own programs.
+// In addition immediately an example:
+//
+// Let's say we have a given angle of 765.2 degrees. If we want to
+// normalize that, it means that we have to subtract X * 360 degrees
+// to get the correct angle. How could we do that? A good method is
+// to use the modulo function. But if we write "765.2 % 360", it won't
+// work, because the standard modulo function works only with integer
+// values. In the C library "math" there is a function called "fmod".
+// The "f" stands for floating and means that we can solve modulo for
+// real numbers. With this function it should be possible to normalize
+// our angel. Let's go.
+
+const std = @import("std");
+
+const c = @cImport({
+ // What do wee need here?
+ ???
+});
+
+pub fn main() !void {
+ const angel = 765.2;
+ const circle = 360;
+
+ // Here we call the C function 'fmod' to get our normalized angel.
+ const result = c.fmod(angel, circle);
+
+ std.debug.print("The normalized angle of {d: >3.1} degrees is {d: >3.1} degrees.\n", .{ angel, result });
+}
diff --git a/patches/patches/094_c_math.patch b/patches/patches/094_c_math.patch
new file mode 100644
index 0000000..4b7d474
--- /dev/null
+++ b/patches/patches/094_c_math.patch
@@ -0,0 +1,4 @@
+22c22
+< ???
+---
+> @cInclude("math.h");