Move the articles inside the <div id="cinera">

This commit is contained in:
Matt Mascarenhas 2018-01-15 22:23:46 +00:00
parent 3a875117b1
commit 3b1514fea1
12 changed files with 355 additions and 367 deletions

View File

@ -6,13 +6,12 @@
<div id="cinera"> <div id="cinera">
<!-- __CINERA_MENUS__ --> <!-- __CINERA_MENUS__ -->
<!-- __CINERA_PLAYER__ --> <!-- __CINERA_PLAYER__ -->
</div>
<!-- __CINERA_SCRIPT__ -->
<article id="video-notes"> <article id="video-notes">
<h1><!-- __CINERA_TITLE__ --></h1> <h1><!-- __CINERA_TITLE__ --></h1>
<p><a href="https://drive.google.com/file/d/0B6DxtsjMnvF8R2Mzckc1R3dhbzQ/view?usp=sharing">Handmade Hero Day 001 - Setting Up the Windows Build</a> - by <a href="https://twitter.com/Mannilie">Emmanuel Vaccaro</a></p> <p><a href="https://drive.google.com/file/d/0B6DxtsjMnvF8R2Mzckc1R3dhbzQ/view?usp=sharing">Handmade Hero Day 001 - Setting Up the Windows Build</a> - by <a href="https://twitter.com/Mannilie">Emmanuel Vaccaro</a></p>
</article> </article>
</div>
<!-- __CINERA_SCRIPT__ -->
</body> </body>
</html> </html>

View File

@ -1,18 +1,17 @@
<html> <html>
<head> <head>
<!-- __CINERA_INCLUDES__ --> <!-- __CINERA_INCLUDES__ -->
</head> </head>
<body> <body>
<div id="cinera"> <div id="cinera">
<!-- __CINERA_MENUS__ --> <!-- __CINERA_MENUS__ -->
<!-- __CINERA_PLAYER__ --> <!-- __CINERA_PLAYER__ -->
</div>
<!-- __CINERA_SCRIPT__ -->
<article id="video-notes"> <article id="video-notes">
<h1><!-- __CINERA_TITLE__ --></h1> <h1><!-- __CINERA_TITLE__ --></h1>
<p><a href="https://drive.google.com/open?id=0B6DxtsjMnvF8MjN1eER5NW8xV3M&amp;authuser=0">Handmade Hero Day 002 - Opening a Win32 Window</a> - by <a href="https://twitter.com/Mannilie">Emmanuel Vaccaro</a></p> <p><a href="https://drive.google.com/open?id=0B6DxtsjMnvF8MjN1eER5NW8xV3M&amp;authuser=0">Handmade Hero Day 002 - Opening a Win32 Window</a> - by <a href="https://twitter.com/Mannilie">Emmanuel Vaccaro</a></p>
</article> </article>
</div>
<!-- __CINERA_SCRIPT__ -->
</body> </body>
</html> </html>

View File

@ -1,18 +1,17 @@
<html> <html>
<head> <head>
<!-- __CINERA_INCLUDES__ --> <!-- __CINERA_INCLUDES__ -->
</head> </head>
<body> <body>
<div id="cinera"> <div id="cinera">
<!-- __CINERA_MENUS__ --> <!-- __CINERA_MENUS__ -->
<!-- __CINERA_PLAYER__ --> <!-- __CINERA_PLAYER__ -->
</div>
<!-- __CINERA_SCRIPT__ -->
<article id="video-notes"> <article id="video-notes">
<h1><!-- __CINERA_TITLE__ --></h1> <h1><!-- __CINERA_TITLE__ --></h1>
<p><a href="https://drive.google.com/open?id=0B6DxtsjMnvF8VXF0d2F0ZjNzUE0&amp;authuser=0">Handmade Hero Day 003 - Allocating a Back Buffer</a> - by <a href="https://twitter.com/Mannilie">Emmanuel Vaccaro</a></p> <p><a href="https://drive.google.com/open?id=0B6DxtsjMnvF8VXF0d2F0ZjNzUE0&amp;authuser=0">Handmade Hero Day 003 - Allocating a Back Buffer</a> - by <a href="https://twitter.com/Mannilie">Emmanuel Vaccaro</a></p>
</article> </article>
</div>
<!-- __CINERA_SCRIPT__ -->
</body> </body>
</html> </html>

View File

@ -1,90 +1,89 @@
<html> <html>
<head> <head>
<!-- __CINERA_INCLUDES__ --> <!-- __CINERA_INCLUDES__ -->
</head> </head>
<body> <body>
<div id="cinera"> <div id="cinera">
<!-- __CINERA_MENUS__ --> <!-- __CINERA_MENUS__ -->
<!-- __CINERA_PLAYER__ --> <!-- __CINERA_PLAYER__ -->
</div>
<!-- __CINERA_SCRIPT__ -->
<article id="video-notes"> <article id="video-notes">
<h1><!-- __CINERA_TITLE__ --></h1> <h1><!-- __CINERA_TITLE__ --></h1>
<h3 id="so-what-s-with-all-that-define-and-typedef-mumbo-jumbo-there-">So what&#39;s with all that &quot;#define&quot; and &quot;typedef&quot; mumbo-jumbo there?</h3> <h3 id="so-what-s-with-all-that-define-and-typedef-mumbo-jumbo-there-">So what&#39;s with all that &quot;#define&quot; and &quot;typedef&quot; mumbo-jumbo there?</h3>
<p>You may have found yourself confused when looking at this code:</p> <p>You may have found yourself confused when looking at this code:</p>
<pre><code>#define X_INPUT_GET_STATE(name) DWORD WINAPI name(DWORD dwUserIndex, XINPUT_STATE *pState) <pre><code>#define X_INPUT_GET_STATE(name) DWORD WINAPI name(DWORD dwUserIndex, XINPUT_STATE *pState)
typedef X_INPUT_GET_STATE(x_input_get_state); typedef X_INPUT_GET_STATE(x_input_get_state);
X_INPUT_GET_STATE(XInputGetStateStub) X_INPUT_GET_STATE(XInputGetStateStub)
{ {
return(0); return(0);
} }
global_variable x_input_get_state *XInputGetState_ = XInputGetStateStub; global_variable x_input_get_state *XInputGetState_ = XInputGetStateStub;
#define XInputGetState XInputGetState_ #define XInputGetState XInputGetState_
</code></pre><p>What on God&#39;s green earth is happening here? Well, don&#39;t despair. It&#39;s really quite simple, we just need to unwrap a few things and break it down line by line.</p> </code></pre><p>What on God&#39;s green earth is happening here? Well, don&#39;t despair. It&#39;s really quite simple, we just need to unwrap a few things and break it down line by line.</p>
<pre><code>#define X_INPUT_GET_STATE(name) DWORD WINAPI name(DWORD dwUserIndex, XINPUT_STATE *pState) <pre><code>#define X_INPUT_GET_STATE(name) DWORD WINAPI name(DWORD dwUserIndex, XINPUT_STATE *pState)
</code></pre><p>In C (as well as C++ and Objective C), the first step of the compilation process is a code transformation pass by the preprocessor. As we have covered previously in the series, any command which begins with a &quot;#&quot; is what is known as a preprocessor directive. This is just a command which will tell the preprocessor to do something, such as #include a file. In this case, &quot;#define&quot; is a directive which creates a macro. A macro can be thought of as a code substitution, anytime the processor finds the macro used in your code, it will swap it out for whatever you defined.</p> </code></pre><p>In C (as well as C++ and Objective C), the first step of the compilation process is a code transformation pass by the preprocessor. As we have covered previously in the series, any command which begins with a &quot;#&quot; is what is known as a preprocessor directive. This is just a command which will tell the preprocessor to do something, such as #include a file. In this case, &quot;#define&quot; is a directive which creates a macro. A macro can be thought of as a code substitution, anytime the processor finds the macro used in your code, it will swap it out for whatever you defined.</p>
<h2 id="the-two-types-of-macros">The two types of macros</h2> <h2 id="the-two-types-of-macros">The two types of macros</h2>
<p>There are two types of macros, the first type is very simple and defines a constant value:</p> <p>There are two types of macros, the first type is very simple and defines a constant value:</p>
<pre><code>#define PI 3.14159265359 <pre><code>#define PI 3.14159265359
</code></pre><p>This macro will cause the preprocessor to convert any instances of &quot;PI&quot; in the code directly into &quot;3.14159265359&quot;. If we break it down a bit, on the left hand side we have what is called the identifier (&quot;PI&quot;), and on the right hand side we have what is known as the token string (&quot;3.14159265359&quot;). The preprocessor searches the code for the identifier, and replaces it with the token string. This means that the literal text &quot;PI&quot; will no longer appear in our code, having been replaced with &quot;3.14159265359&quot;. This can be useful for constant values that we may want to use repeatedly, but not type in full all the time. Note that the preprocessor will not convert PI if it appears in a comment or as part of a longer identifier such as &quot;PieceOfPI&quot;.</p> </code></pre><p>This macro will cause the preprocessor to convert any instances of &quot;PI&quot; in the code directly into &quot;3.14159265359&quot;. If we break it down a bit, on the left hand side we have what is called the identifier (&quot;PI&quot;), and on the right hand side we have what is known as the token string (&quot;3.14159265359&quot;). The preprocessor searches the code for the identifier, and replaces it with the token string. This means that the literal text &quot;PI&quot; will no longer appear in our code, having been replaced with &quot;3.14159265359&quot;. This can be useful for constant values that we may want to use repeatedly, but not type in full all the time. Note that the preprocessor will not convert PI if it appears in a comment or as part of a longer identifier such as &quot;PieceOfPI&quot;.</p>
<p>So let&#39;s go back to the macro we were looking at earlier. </p> <p>So let&#39;s go back to the macro we were looking at earlier. </p>
<pre><code>#define X_INPUT_GET_STATE(name) DWORD WINAPI name(DWORD dwUserIndex, XINPUT_STATE *pState) <pre><code>#define X_INPUT_GET_STATE(name) DWORD WINAPI name(DWORD dwUserIndex, XINPUT_STATE *pState)
</code></pre><p>It is somewhat more complex and appears to have a function definition on the right for a function called &quot;name&quot;. This is the second type of macro, which uses a token string as part of it&#39;s definition. </code></pre><p>It is somewhat more complex and appears to have a function definition on the right for a function called &quot;name&quot;. This is the second type of macro, which uses a token string as part of it&#39;s definition.
As a simpler, but somewhat different example:</p> As a simpler, but somewhat different example:</p>
<pre><code>#define ADD(argument1, argument2) argument1 + argument2 <pre><code>#define ADD(argument1, argument2) argument1 + argument2
</code></pre><p>Looking at this, we can see that it can be broken down into two parts just the same as the previous macro. First, on the left side we have the identifier &quot;ADD(argument1, argument2)&quot;. This works similarly to the first kind of macro, but because we have written it like a function, the preprocessor will save whatever it finds in place of &quot;argument1&quot; and &quot;argument2&quot;, and then plug those in for where they were found in the token string.</p> </code></pre><p>Looking at this, we can see that it can be broken down into two parts just the same as the previous macro. First, on the left side we have the identifier &quot;ADD(argument1, argument2)&quot;. This works similarly to the first kind of macro, but because we have written it like a function, the preprocessor will save whatever it finds in place of &quot;argument1&quot; and &quot;argument2&quot;, and then plug those in for where they were found in the token string.</p>
<p>For example, if later on in the code we were to type:</p> <p>For example, if later on in the code we were to type:</p>
<pre><code>int c = ADD(a,b); <pre><code>int c = ADD(a,b);
</code></pre><p>Our macro would expand this out to:</p> </code></pre><p>Our macro would expand this out to:</p>
<pre><code>int c = a + b; <pre><code>int c = a + b;
</code></pre><p>So, again we will go back to our original macro, but this time we are going to pair it with its first use:</p> </code></pre><p>So, again we will go back to our original macro, but this time we are going to pair it with its first use:</p>
<pre><code>#define X_INPUT_GET_STATE(name) DWORD WINAPI name(DWORD dwUserIndex, XINPUT_STATE *pState) <pre><code>#define X_INPUT_GET_STATE(name) DWORD WINAPI name(DWORD dwUserIndex, XINPUT_STATE *pState)
typedef X_INPUT_GET_STATE(x_input_get_state); typedef X_INPUT_GET_STATE(x_input_get_state);
</code></pre><p>Based on what we learned earlier we can see that the second line will expand out into the following:</p> </code></pre><p>Based on what we learned earlier we can see that the second line will expand out into the following:</p>
<pre><code>typedef DWORD WINAPI x_input_get_state(DWORD dwUserIndex, XINPUT_STATE *pState); <pre><code>typedef DWORD WINAPI x_input_get_state(DWORD dwUserIndex, XINPUT_STATE *pState);
</code></pre><h2 id="what-s-a-typedef-">What&#39;s a typedef?</h2> </code></pre><h2 id="what-s-a-typedef-">What&#39;s a typedef?</h2>
<p>So that&#39;s easy enough to see, but what does &#39;typedef&#39; mean?</p> <p>So that&#39;s easy enough to see, but what does &#39;typedef&#39; mean?</p>
<p>In C, typedef declares a different name for a type. This can almost be thought of as similar to #define, but it is limited to type names only and is performed by the compiler instead of the preprocessor.</p> <p>In C, typedef declares a different name for a type. This can almost be thought of as similar to #define, but it is limited to type names only and is performed by the compiler instead of the preprocessor.</p>
<p>As a basic example, if we were to look at the following code:</p> <p>As a basic example, if we were to look at the following code:</p>
<pre><code>typedef char CHARACTER; <pre><code>typedef char CHARACTER;
CHARACTER x; CHARACTER x;
</code></pre><p>The compiler will treat the type of x as though it were &#39;char.&#39; Why would we want to do this? Well, because declaring our own types allows us to make use of the compilers strict type checking. This means that if we were to declare a function which took a CHARACTER as the type of one of it&#39;s arguments then we would not be able to pass it a char without the compiler warning us about it, even though a CHARACTER was defined as a char and they are both signed one byte values.</p> </code></pre><p>The compiler will treat the type of x as though it were &#39;char.&#39; Why would we want to do this? Well, because declaring our own types allows us to make use of the compilers strict type checking. This means that if we were to declare a function which took a CHARACTER as the type of one of it&#39;s arguments then we would not be able to pass it a char without the compiler warning us about it, even though a CHARACTER was defined as a char and they are both signed one byte values.</p>
<pre><code>typedef DWORD WINAPI x_input_get_state(DWORD dwUserIndex, XINPUT_STATE *pState); <pre><code>typedef DWORD WINAPI x_input_get_state(DWORD dwUserIndex, XINPUT_STATE *pState);
</code></pre><p>But in the Handmade Hero code, we are using typedef with a function declaration. This declares a function signature as a type. It is important to understand that although we can use that type to declare a function like this:</p> </code></pre><p>But in the Handmade Hero code, we are using typedef with a function declaration. This declares a function signature as a type. It is important to understand that although we can use that type to declare a function like this:</p>
<pre><code>x_input_get_state _XInputGetState() <pre><code>x_input_get_state _XInputGetState()
</code></pre><p>Due to the rules of C, we are not allowed to then go on to define the function as follows:</p> </code></pre><p>Due to the rules of C, we are not allowed to then go on to define the function as follows:</p>
<pre><code>//INVALID C CODE FOLLOWS <pre><code>//INVALID C CODE FOLLOWS
x_input_get_state _XInputGetState() x_input_get_state _XInputGetState()
{ {
//Do some things. //Do some things.
} }
</code></pre><p>We can define a function using our typedef and also declare the same function by using the original function type information, however, this makes the typedef itself unnecessary.</p> </code></pre><p>We can define a function using our typedef and also declare the same function by using the original function type information, however, this makes the typedef itself unnecessary.</p>
<h2 id="using-typedef-for-function-pointers">Using typedef for function pointers</h2> <h2 id="using-typedef-for-function-pointers">Using typedef for function pointers</h2>
<p>So why are we using a typedef with a function declaration here? Because we are planning on using it to create a function pointer. A function pointer is just what it sounds like, a pointer to a function. The main benefit of function pointers is that they can be treated like variables, that is, they can be reassigned or passed as arguments.</p> <p>So why are we using a typedef with a function declaration here? Because we are planning on using it to create a function pointer. A function pointer is just what it sounds like, a pointer to a function. The main benefit of function pointers is that they can be treated like variables, that is, they can be reassigned or passed as arguments.</p>
<p>So this is how we would use our &quot;x_input_get_state&quot; typedef to declare a function pointer:</p> <p>So this is how we would use our &quot;x_input_get_state&quot; typedef to declare a function pointer:</p>
<pre><code>x_input_get_state *PointerToXInputGetStateFunction; <pre><code>x_input_get_state *PointerToXInputGetStateFunction;
</code></pre><p>We can then assign that pointer to any function which matches the signature of x_input_get_state:</p> </code></pre><p>We can then assign that pointer to any function which matches the signature of x_input_get_state:</p>
<pre><code>typedef DWORD WINAPI x_input_get_state(DWORD dwUserIndex, XINPUT_STATE *pState); <pre><code>typedef DWORD WINAPI x_input_get_state(DWORD dwUserIndex, XINPUT_STATE *pState);
DWORD XInputGetStateStub(DWORD dwUserIndex, XINPUT_STATE *pState); DWORD XInputGetStateStub(DWORD dwUserIndex, XINPUT_STATE *pState);
XInputGetStateStub XInputGetStateStub
{ {
return(0); return(0);
} }
global_variable x_input_get_state *XInputGetState_ = XInputGetStateStub; global_variable x_input_get_state *XInputGetState_ = XInputGetStateStub;
</code></pre><p>Which if we were to unwrap our macros from the original code, is almost exactly what we would have:</p> </code></pre><p>Which if we were to unwrap our macros from the original code, is almost exactly what we would have:</p>
<pre><code>#define X_INPUT_GET_STATE(name) DWORD WINAPI name(DWORD dwUserIndex, XINPUT_STATE *pState) <pre><code>#define X_INPUT_GET_STATE(name) DWORD WINAPI name(DWORD dwUserIndex, XINPUT_STATE *pState)
typedef X_INPUT_GET_STATE(x_input_get_state); typedef X_INPUT_GET_STATE(x_input_get_state);
X_INPUT_GET_STATE(XInputGetStateStub) X_INPUT_GET_STATE(XInputGetStateStub)
{ {
return(0); return(0);
} }
global_variable x_input_get_state *XInputGetState_ = XInputGetStateStub; global_variable x_input_get_state *XInputGetState_ = XInputGetStateStub;
</code></pre><p>Now all we have left is the last line:</p> </code></pre><p>Now all we have left is the last line:</p>
<pre><code>#define XInputGetState XInputGetState_ <pre><code>#define XInputGetState XInputGetState_
</code></pre><p>This is another simple macro which will substitute &quot;XInputGetState_&quot; for &quot;XInputGetState&quot; any time we use it in the code. We do this because XInputGetState is a function that has already been declared in xinput.h, and C does not allow us to declare functions multiple times. However, by using the preprocessor, we can type out our code as though we were just using XInputGetState we are actually using a function pointer which will either point to &#39;XInputGetStateStub&#39; in the case that we are unable to dynamically load in the XInput library, or will point to the correct &#39;XInputGetState&#39; function as defined by Microsoft in the case that we can load it.</p> </code></pre><p>This is another simple macro which will substitute &quot;XInputGetState_&quot; for &quot;XInputGetState&quot; any time we use it in the code. We do this because XInputGetState is a function that has already been declared in xinput.h, and C does not allow us to declare functions multiple times. However, by using the preprocessor, we can type out our code as though we were just using XInputGetState we are actually using a function pointer which will either point to &#39;XInputGetStateStub&#39; in the case that we are unable to dynamically load in the XInput library, or will point to the correct &#39;XInputGetState&#39; function as defined by Microsoft in the case that we can load it.</p>
<p>Hope that&#39;s helped clear some things up for you. Happy Heroing!</p> <p>Hope that&#39;s helped clear some things up for you. Happy Heroing!</p>
</article> </article>
</div>
<!-- __CINERA_SCRIPT__ -->
</body> </body>
</html> </html>

View File

@ -1,13 +1,11 @@
<html> <html>
<head> <head>
<!-- __CINERA_INCLUDES__ --> <!-- __CINERA_INCLUDES__ -->
</head> </head>
<body> <body>
<div id="cinera"> <div id="cinera">
<!-- __CINERA_MENUS__ --> <!-- __CINERA_MENUS__ -->
<!-- __CINERA_PLAYER__ --> <!-- __CINERA_PLAYER__ -->
</div>
<!-- __CINERA_SCRIPT__ -->
<article id="video-notes"> <article id="video-notes">
<h1><!-- __CINERA_TITLE__ --></h1> <h1><!-- __CINERA_TITLE__ --></h1>
@ -39,6 +37,7 @@
</ol> </ol>
<p>In the next episode we will look closely at how to fill this buffer and implement it in the game loop.</p> <p>In the next episode we will look closely at how to fill this buffer and implement it in the game loop.</p>
</article> </article>
</div>
<!-- __CINERA_SCRIPT__ -->
</body> </body>
</html> </html>

View File

@ -1,13 +1,11 @@
<html> <html>
<head> <head>
<!-- __CINERA_INCLUDES__ --> <!-- __CINERA_INCLUDES__ -->
</head> </head>
<body> <body>
<div id="cinera"> <div id="cinera">
<!-- __CINERA_MENUS__ --> <!-- __CINERA_MENUS__ -->
<!-- __CINERA_PLAYER__ --> <!-- __CINERA_PLAYER__ -->
</div>
<!-- __CINERA_SCRIPT__ -->
<article id="video-notes"> <article id="video-notes">
<h1><!-- __CINERA_TITLE__ --></h1> <h1><!-- __CINERA_TITLE__ --></h1>
@ -55,6 +53,7 @@
On most platforms, it is very difficult to ascertain the proper amount of latency. It&#39;s an unsolved problem, and games On most platforms, it is very difficult to ascertain the proper amount of latency. It&#39;s an unsolved problem, and games
with need precise AV sync (like Guitar Hero) go to some lengths to achieve it.</p> with need precise AV sync (like Guitar Hero) go to some lengths to achieve it.</p>
</article> </article>
</div>
<!-- __CINERA_SCRIPT__ -->
</body> </body>
</html> </html>

View File

@ -1,13 +1,11 @@
<html> <html>
<head> <head>
<!-- __CINERA_INCLUDES__ --> <!-- __CINERA_INCLUDES__ -->
</head> </head>
<body> <body>
<div id="cinera"> <div id="cinera">
<!-- __CINERA_MENUS__ --> <!-- __CINERA_MENUS__ -->
<!-- __CINERA_PLAYER__ --> <!-- __CINERA_PLAYER__ -->
</div>
<!-- __CINERA_SCRIPT__ -->
<article id="video-notes"> <article id="video-notes">
<h1><!-- __CINERA_TITLE__ --></h1> <h1><!-- __CINERA_TITLE__ --></h1>
@ -65,6 +63,7 @@
<li>Bitshifting to divide will give you unexpected results for negative numbers. Use actual divide instead.</li> <li>Bitshifting to divide will give you unexpected results for negative numbers. Use actual divide instead.</li>
</ul> </ul>
</article> </article>
</div>
<!-- __CINERA_SCRIPT__ -->
</body> </body>
</html> </html>

View File

@ -1,13 +1,11 @@
<html> <html>
<head> <head>
<!-- __CINERA_INCLUDES__ --> <!-- __CINERA_INCLUDES__ -->
</head> </head>
<body> <body>
<div id="cinera"> <div id="cinera">
<!-- __CINERA_MENUS__ --> <!-- __CINERA_MENUS__ -->
<!-- __CINERA_PLAYER__ --> <!-- __CINERA_PLAYER__ -->
</div>
<!-- __CINERA_SCRIPT__ -->
<article id="video-notes"> <article id="video-notes">
<h1><!-- __CINERA_TITLE__ --></h1> <h1><!-- __CINERA_TITLE__ --></h1>
@ -63,6 +61,7 @@
invocation of some processor instruction. They generally need to be extensions to the compiler so they can avoid all invocation of some processor instruction. They generally need to be extensions to the compiler so they can avoid all
the expensive niceties compilers have to afford functions.</p> the expensive niceties compilers have to afford functions.</p>
</article> </article>
</div>
<!-- __CINERA_SCRIPT__ -->
</body> </body>
</html> </html>

View File

@ -1,13 +1,11 @@
<html> <html>
<head> <head>
<!-- __CINERA_INCLUDES__ --> <!-- __CINERA_INCLUDES__ -->
</head> </head>
<body> <body>
<div id="cinera"> <div id="cinera">
<!-- __CINERA_MENUS__ --> <!-- __CINERA_MENUS__ -->
<!-- __CINERA_PLAYER__ --> <!-- __CINERA_PLAYER__ -->
</div>
<!-- __CINERA_SCRIPT__ -->
<article id="video-notes"> <article id="video-notes">
<h1><!-- __CINERA_TITLE__ --></h1> <h1><!-- __CINERA_TITLE__ --></h1>
@ -24,6 +22,7 @@
<p><code>alloca</code> is a compiler feature that allows for dynamic allocation <em>on the stack</em>. Much was learned and discussed, but <p><code>alloca</code> is a compiler feature that allows for dynamic allocation <em>on the stack</em>. Much was learned and discussed, but
it should be noted that the function is deprecated and probably shouldn&#39;t be used in shipping code.</p> it should be noted that the function is deprecated and probably shouldn&#39;t be used in shipping code.</p>
</article> </article>
</div>
<!-- __CINERA_SCRIPT__ -->
</body> </body>
</html> </html>

View File

@ -1,19 +1,18 @@
<html> <html>
<head> <head>
<!-- __CINERA_INCLUDES__ --> <!-- __CINERA_INCLUDES__ -->
</head> </head>
<body> <body>
<div id="cinera"> <div id="cinera">
<!-- __CINERA_MENUS__ --> <!-- __CINERA_MENUS__ -->
<!-- __CINERA_PLAYER__ --> <!-- __CINERA_PLAYER__ -->
</div>
<!-- __CINERA_SCRIPT__ -->
<article id="video-notes"> <article id="video-notes">
<h1><!-- __CINERA_TITLE__ --></h1> <h1><!-- __CINERA_TITLE__ --></h1>
<h2 id="notes-">Notes:</h2> <h2 id="notes-">Notes:</h2>
<p>Continuation on how dll uses memory: <a href="https://hero.handmadedev.org/forum/code-discussion/99-day-21-s-statement-about-msvcrt-is-correct">https://hero.handmadedev.org/forum/code-discussion/99-day-21-s-statement-about-msvcrt-is-correct</a></p> <p>Continuation on how dll uses memory: <a href="https://hero.handmadedev.org/forum/code-discussion/99-day-21-s-statement-about-msvcrt-is-correct">https://hero.handmadedev.org/forum/code-discussion/99-day-21-s-statement-about-msvcrt-is-correct</a></p>
</article> </article>
</div>
<!-- __CINERA_SCRIPT__ -->
</body> </body>
</html> </html>

View File

@ -1,13 +1,11 @@
<html> <html>
<head> <head>
<!-- __CINERA_INCLUDES__ --> <!-- __CINERA_INCLUDES__ -->
</head> </head>
<body> <body>
<div id="cinera"> <div id="cinera">
<!-- __CINERA_MENUS__ --> <!-- __CINERA_MENUS__ -->
<!-- __CINERA_PLAYER__ --> <!-- __CINERA_PLAYER__ -->
</div>
<!-- __CINERA_SCRIPT__ -->
<article id="video-notes"> <article id="video-notes">
<h1><!-- __CINERA_TITLE__ --></h1> <h1><!-- __CINERA_TITLE__ --></h1>
@ -32,6 +30,7 @@
two sets of values overlap are set to 0s in one of them, the data will effectively just be copied from one onto the two sets of values overlap are set to 0s in one of them, the data will effectively just be copied from one onto the
other with no interference.</p> other with no interference.</p>
</article> </article>
</div>
<!-- __CINERA_SCRIPT__ -->
</body> </body>
</html> </html>

View File

@ -1,13 +1,11 @@
<html> <html>
<head> <head>
<!-- __CINERA_INCLUDES__ --> <!-- __CINERA_INCLUDES__ -->
</head> </head>
<body> <body>
<div id="cinera"> <div id="cinera">
<!-- __CINERA_MENUS__ --> <!-- __CINERA_MENUS__ -->
<!-- __CINERA_PLAYER__ --> <!-- __CINERA_PLAYER__ -->
</div>
<!-- __CINERA_SCRIPT__ -->
<article id="video-notes"> <article id="video-notes">
<h1><!-- __CINERA_TITLE__ --></h1> <h1><!-- __CINERA_TITLE__ --></h1>
@ -24,6 +22,7 @@
individually. As long as each one is waiting on the same semaphore object, they&#39;ll all know when there&#39;s more work to be individually. As long as each one is waiting on the same semaphore object, they&#39;ll all know when there&#39;s more work to be
done.</p> done.</p>
</article> </article>
</div>
<!-- __CINERA_SCRIPT__ -->
</body> </body>
</html> </html>