ex0: theory document

This commit is contained in:
2025-08-26 16:59:37 +02:00
parent 6b5adb7f37
commit c056e12b7f
3 changed files with 130 additions and 0 deletions

1
.gitignore vendored
View File

@@ -54,3 +54,4 @@ dkms.conf
*.zip
*.pdf
*.png

View File

@@ -8,3 +8,6 @@ run:
show:
make run
feh after.bmp
convert:
magick after.bmp after.png # for showing image in pdf

126
exercise0/main.typ Normal file
View File

@@ -0,0 +1,126 @@
#import "@preview/cetz:0.3.2";
#import "@preview/cetz-plot:0.1.1": plot
#import "@preview/physica:0.9.4": *
#import "@preview/plotsy-3d:0.1.0": plot-3d-parametric-surface
#import "@preview/fletcher:0.5.4" as fletcher: diagram, edge, node
#set page(paper: "a4", margin: (x: 2.6cm, y: 2.8cm), numbering: "1 : 1")
#set par(justify: true, leading: 0.52em)
#let FONT_SIZE = 18pt;
#set text(font: "FreeSerif", size: FONT_SIZE, lang: "us")
#show math.equation: set text(font: "Euler Math", size: (FONT_SIZE * 1.0), lang: "en")
#set heading(numbering: none)
#show heading.where(level: 1): it => {
rect(inset: FONT_SIZE / 2)[#it]
}
// Dracula palette
#let bg = rgb("#282a36")
#let fg = rgb("#f8f8f2")
#let sec = rgb("#44475a")
// Inline (aligned to surrounding text)
#show raw.where(block: false): it => box(
fill: sec,
inset: (x: 5pt, y: 3pt, top: 3pt), // extra top inset
baseline: 2.75pt, // lowers box
radius: 2.5pt,
text(fill: fg, size: 0.88em, it),
)
// Block (unchanged)
#show raw.where(block: true): it => block(
fill: bg,
inset: 10pt,
radius: 4pt,
text(fill: fg, font: "Fira Code", it),
)
#align(center)[
#text(size: FONT_SIZE * 2, weight: "bold")[#underline[exercise 0]]
]
these are my solutions to the first (optional) exercise set of TDT4200.
i recommend using a PDF-reader like
#link("https://wiki.archlinux.org/title/Zathura")[#text(blue.darken(5%))[zathura]],
for no particular reason other than that it is cool.
this document was created using
#link("https://typst.app/")[#text(blue.darken(5%))[typst]].
#v(42pt)
#outline(title: none)
#v(42pt)
= how to run my code
the project utilizes
#link("https://nixos.org/")[#text(blue.darken(5%))[nix]]
to manage dependencies.
with it (and with
#link("https://wiki.nixos.org/wiki/Flakes")[#text(blue.darken(5%))[flakes]]
enabled), you can simply run `nix develop` to enter a development shell with the
necessary dependencies, as specified in `flake.nix` and `flake.lock`. in this
shell you can build the bmp-image using `make run` or to see it immediately,
using
#link("https://wiki.archlinux.org/title/Feh")[#text(blue.darken(5%))[feh]],
you can run `make show`.
#v(100%)
= theory
== 1) what is the purpose of a Makefile?
a Makefile is like a shell-script that performs some pre-defined tasks. it is
particularly useful as a *build tool* for complex compilation pipelines in
development environments relying on such compiled languages like C.
`make show` is an example of a neat short-hand to compile and run my program,
but also finally displaying the image result to me using the lightweight CLI
feh.
== 2) what is a pointer in C?
a *pointer* in C is a memory address equipped with a primitive type, determining
the semantics of *pointer arithmetic*, i.e. when you increment the pointer. for
example, if you increment a pointer with a type of size 8 bytes, it will jump to
the memory address 8 bytes forward. a *void pointer* is a true wildcard pointer,
having 'no type', thus being able to point to any memory, disregarding
alignment.
== 3) what does the compile flag `-O3` do?
GCC, like most compilers, have lots of flags that alter their behavior. given
the age of C and the amount of clever people in the world that have dedicated
time to crafting a perfect compiler, GCC is capable of analyzing the
code to perform optimizations. `gcc -O3 source.c` means to compile a source file
with *aggressive optimizations*. examples of this could be unrolling loops,
recognizing patterns or using more specialized (and faster) instructions (if
available).
note that there have been examples of compiler optimizations introducing weird
bugs (i think), due to slight alterings of internal semantics.
== 4) how do you pass a value by reference?
passing a value by reference is the preferred way of handling data transfer in
C, as opposed to other languages, where data may be passed to a function as
a *pure copy*. copying memory is expensive, both time-wise and space-wise. it
scales linearly, so thus if you have millions of data points, and you wish to
pass it around lots, copying it each time could be considered unoptimal. that's
why you wish to refer to your data using pointers, also known as *references*.
= じゃああ、またね。
#align(center)[
#image("after.png", width: 80%)
]