1
2
3
4
5
6
7
8
9 /* Using C Types */
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3
4
5
6
7
8
9 /* Using C Types */
10
11
12
13 int make_market(int bid, int ask);
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3
4
5
6
7
8
9
10
11
12
13 int make_market(int bid, int ask);
14
15
16 int test(void) {
17 int bid = 1;
18 int ask = 3;
19
20 return make_market(ask, bid);
21
22
23 }
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3
4
5
6
7
8
9
10 typedef int price_t;
11
12
13 int make_market(price_t bid, price_t ask);
14
15
16 int test(void) {
17 price_t bid = 1;
18 price_t ask = 3;
19
20 return make_market(ask, bid);
21
22
23 }
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3
4
5
6
7
8
9
10 typedef int bid_price_t;
11 typedef int ask_price_t;
12
13 int make_market(bid_price_t, ask_price_t);
14
15
16 int test(void) {
17 bid_price_t bid = 1;
18 ask_price_t ask = 3;
19
20 return make_market(ask, bid);
21
22
23 }
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3
4
5
6
7
8
9
10 typedef struct { int v; } bid_price_t;
11 typedef struct { int v; } ask_price_t;
12
13 int make_market(bid_price_t, ask_price_t);
14
15
16 int test(void) {
17 bid_price_t bid = { 1 };
18 ask_price_t ask = { 3 };
19
20 return make_market(ask, bid);
21
22
23 }
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
slide06.c:20:21: error: passing 'ask_price_t' to parameter of incompatible type 'bid_price_t'
return make_market(ask, bid);
^~~
slide06.c:13:28: note: passing argument to parameter here
int make_market(bid_price_t, ask_price_t);
^
1 error generated.
1
2
3
4
5
6
7
8
9
10 typedef struct { int v; } bid_price_t;
11 typedef struct { int v; } ask_price_t;
12
13 int make_market(bid_price_t, ask_price_t);
14
15
16 int test(void) {
17 bid_price_t bid = { 1 };
18 ask_price_t ask = { 3 };
19
20 return make_market(ask, bid);
21
22
23 }
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3
4
5
6
7
8
9
10 typedef struct { int v; } bid_price_t;
11 typedef struct { int v; } ask_price_t;
12
13 int make_market(bid_price_t, ask_price_t);
14
15
16 int test(void) {
17 bid_price_t bid = { 1 };
18 ask_price_t ask = { 3 };
19
20 return make_market(bid, ask);
21
22
23 }
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3
4
5
6
7
8
9
10 typedef struct { int v; } bid_price_t;
11 typedef struct { int v; } ask_price_t;
12
13 int make_market(bid_price_t, ask_price_t);
14
15
16 int test(void) {
17
18 /* requires C99 or newer */
19
20 return make_market(
21 (bid_price_t) { 1 },
22 (ask_price_t) { 3 });
23 }
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3
4
5
6
7
8 int is_crossed(int bid, int ask) {
9
10
11
12 return bid >= ask;
13 }
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3 typedef int price_t;
4
5
6
7
8 int is_crossed(price_t bid, price_t ask) {
9
10
11
12 return bid >= ask;
13 }
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3 typedef int bid_price_t;
4 typedef int ask_price_t;
5
6
7
8 int is_crossed(bid_price_t bid, ask_price_t ask) {
9
10
11
12 return bid >= ask;
13 }
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3 typedef struct { int v; } bid_price_t;
4 typedef struct { int v; } ask_price_t;
5
6
7
8 int is_crossed(bid_price_t bid, ask_price_t ask) {
9
10
11
12 return bid.v >= ask.v;
13 }
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3 typedef struct { int v; } bid_price_t;
4 typedef struct { int v; } ask_price_t;
5
6
7
8 int is_crossed(bid_price_t bid_price, ask_price_t ask_price) {
9 int bid = bid_price.v;
10 int ask = ask_price.v;
11
12 return bid >= ask;
13 }
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3
4
5
6
7
8
9
10
11
12
13 int do_the_thing(int foo_index, int bar_index);
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3 typedef int foo_index_t;
4 typedef int bar_index_t;
5
6
7
8
9
10
11
12
13 int do_the_thing(foo_index_t, bar_index_t);
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3 typedef struct { int v; } foo_index_t;
4 typedef struct { int v; } bar_index_t;
5
6
7
8
9
10
11
12
13 int do_the_thing(foo_index_t, bar_index_t);
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3 typedef struct { int v; } foo_index_t;
4 typedef struct { int v; } bar_index_t;
5
6
7 typedef struct foo_s { /* ... */ } foo_t;
8 typedef struct bar_s { /* ... */ } bar_t;
9
10 foo_t *lookup_foo(foo_index_t, foo_t *);
11 bar_t *lookup_bar(bar_index_t, bar_t *);
12
13 int do_the_thing(foo_index_t, bar_index_t);
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3 typedef struct { int v; } foo_index_t;
4 typedef struct { int v; } bar_index_t;
5 typedef struct { int v; } bid_price_t;
6
7 typedef struct foo_s { /* ... */ } foo_t;
8 typedef struct bar_s { /* ... */ } bar_t;
9
10 foo_t *lookup_foo(foo_index_t, foo_t *);
11 bar_t *lookup_bar(bar_index_t, bar_t *);
12
13 int do_the_thing(foo_index_t, bar_index_t, bid_price_t);
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3
4
5
6
7
8
9 int bar();
10
11 int foo() {
12 return bar();
13 }
14
15
16 int qux() {
17 return bar();
18 }
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3
4
5 typedef struct main_thread_s { /* int unused; */ } main_thread_t;
6 typedef struct other_thread_s { /* int unused; */ } other_thread_t;
7
8
9 int bar(main_thread_t);
10
11 int foo(main_thread_t th) {
12 return bar(th);
13 }
14
15
16 int qux(other_thread_t th) {
17 return bar(th);
18 }
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
slide20.c:17:13: error: passing 'other_thread_t' (aka 'struct other_thread_s') to parameter of incompatible type 'main_thread_t' (aka 'struct main_thread_s')
return bar(th);
^~
slide20.c:9:22: note: passing argument to parameter here
int bar(main_thread_t);
^
1 error generated.
1
2
3
4
5 typedef struct main_thread_s { /* int unused; */ } main_thread_t;
6 typedef struct other_thread_s { /* int unused; */ } other_thread_t;
7
8
9 int bar(main_thread_t);
10
11 int foo(main_thread_t th) {
12 return bar(th);
13 }
14
15
16 int qux(other_thread_t th) {
17 return bar(th);
18 }
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3
4
5 typedef struct main_thread_s { /* int unused; */ } main_thread_t;
6 typedef struct other_thread_s { /* int unused; */ } other_thread_t;
7
8
9 int bar(main_thread_t);
10
11 int foo(main_thread_t th __attribute__((unused))) {
12 return bar(th);
13 }
14
15
16 int qux(other_thread_t th __attribute__((unused))) {
17 return 2;
18 }
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2
3 #define TH(THREAD_NAME) THREAD_NAME##_thread_t th __attribute__((unused))
4
5 typedef struct main_thread_s { /* int unused; */ } main_thread_t;
6 typedef struct other_thread_s { /* int unused; */ } other_thread_t;
7
8
9 int bar(TH(main));
10
11 int foo(TH(main)) {
12 return bar(th);
13 }
14
15
16 int qux(TH(other)) {
17 return 2;
18 }
19
20
21
22
23
24
25
26
27
28 /* David L. L. Thomas, Jan 2018 */
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1
2 #include <SDL.h>
3
4
5 SDL_Texture * volatile texture = NULL;
6
7 int load_image_thread(void *renderer) {
8 SDL_Surface *surface = SDL_LoadBMP("myimage.bmp");
9 texture = SDL_CreateTextureFromSurface(renderer, surface);
10 return 0;
11 }
12
13 void render_image() {
14 SDL_Window *win = SDL_CreateWindow("Hello World!",
15 100, 100, 640, 480, SDL_WINDOW_SHOWN);
16 SDL_Renderer *renderer = SDL_CreateRenderer(win, -1, 0);
17 SDL_CreateThread(load_image_thread, "image loader", renderer);
18
19
20 for(;;) {
21 SDL_Event e;
22 while (SDL_PollEvent(&e)){
23 switch(e.type) {
24 case SDL_QUIT: return;
25 }
26 }
27
28
29
30
31
32
33 SDL_RenderClear(renderer);
34 if(texture) SDL_RenderCopy(renderer, texture, NULL, NULL);
35 SDL_RenderPresent(renderer);
36 SDL_Delay(100);
37 }
38 }
39
40 int main() {
41
42 if(SDL_Init(SDL_INIT_VIDEO) != 0) return EXIT_FAILURE;
43
44 render_image();
45 return EXIT_SUCCESS;
46 }
47
48
1
2
3
4
5
6
7
8
9
10
11 #include <SDL.h>
12
13
14
15
16
17
18
19
20
21
22
23
24 SDL_Window * SDL_CreateWindow(
25
26 const char *title, int x, int y, int w, int h, Uint32 flags);
27
28 int SDL_PollEvent( SDL_Event * event);
29
30 SDL_Texture * SDL_CreateTextureFromSurface(
31 SDL_Renderer * renderer, SDL_Surface * surface);
32
33 SDL_Renderer * SDL_CreateRenderer(
34
35 SDL_Window * window, int index, Uint32 flags);
36
37 int SDL_Init( Uint32 flags);
38
39 void SDL_RenderPresent( SDL_Renderer * renderer);
40
41 int SDL_RenderClear( SDL_Renderer * renderer);
42
43 int SDL_RenderCopy(
44
45 SDL_Renderer * renderer, SDL_Texture * texture,
46 const SDL_Rect * srcrect, const SDL_Rect * dstrect);
47
48
1 /* CheckedSDL.h */
2
3 #define SDL_CreateTextureFromSurface SDL_CreateTextureFromSurface_Nope
4 #define SDL_CreateRenderer SDL_CreateRenderer_Nope
5 #define SDL_CreateWindow SDL_CreateWindow_Nope
6 #define SDL_PollEvent SDL_PollEvent_Nope
7 #define SDL_RenderClear SDL_RenderClear_Nope
8 #define SDL_RenderCopy SDL_RenderCopy_Nope
9 #define SDL_RenderPresent SDL_RenderPresent_Nope
10 #define SDL_Init SDL_Init_Nope
11 #include <SDL.h>
12 #undef SDL_CreateTextureFromSurface
13 #undef SDL_CreateRenderer
14 #undef SDL_CreateWindow
15 #undef SDL_PollEvent
16 #undef SDL_RenderClear
17 #undef SDL_RenderCopy
18 #undef SDL_RenderPresent
19 #undef SDL_Init
20
21 typedef struct main_thread_s { /* int unused; */ } main_thread_t;
22 #define TH(THREAD_NAME) THREAD_NAME##_thread_t th __attribute__((unused))
23
24 SDL_Window * SDL_CreateWindow(
25 TH(main),
26 const char *title, int x, int y, int w, int h, Uint32 flags);
27
28 int SDL_PollEvent(TH(main), SDL_Event * event);
29
30 SDL_Texture * SDL_CreateTextureFromSurface(
31 TH(main), SDL_Renderer * renderer, SDL_Surface * surface);
32
33 SDL_Renderer * SDL_CreateRenderer(
34 TH(main),
35 SDL_Window * window, int index, Uint32 flags);
36
37 int SDL_Init(TH(main), Uint32 flags);
38
39 void SDL_RenderPresent(TH(main), SDL_Renderer * renderer);
40
41 int SDL_RenderClear(TH(main), SDL_Renderer * renderer);
42
43 int SDL_RenderCopy(
44 TH(main),
45 SDL_Renderer * renderer, SDL_Texture * texture,
46 const SDL_Rect * srcrect, const SDL_Rect * dstrect);
47
48
1
2 #include <SDL.h>
3
4
5 SDL_Texture * volatile texture = NULL;
6
7 int load_image_thread(void *renderer) {
8 SDL_Surface *surface = SDL_LoadBMP("myimage.bmp");
9 texture = SDL_CreateTextureFromSurface(renderer, surface);
10 return 0;
11 }
12
13 void render_image() {
14 SDL_Window *win = SDL_CreateWindow("Hello World!",
15 100, 100, 640, 480, SDL_WINDOW_SHOWN);
16 SDL_Renderer *renderer = SDL_CreateRenderer(win, -1, 0);
17 SDL_CreateThread(load_image_thread, "image loader", renderer);
18
19
20 for(;;) {
21 SDL_Event e;
22 while (SDL_PollEvent(&e)){
23 switch(e.type) {
24 case SDL_QUIT: return;
25 }
26 }
27
28
29
30
31
32
33 SDL_RenderClear(renderer);
34 if(texture) SDL_RenderCopy(renderer, texture, NULL, NULL);
35 SDL_RenderPresent(renderer);
36 SDL_Delay(100);
37 }
38 }
39
40 int main() {
41
42 if(SDL_Init(SDL_INIT_VIDEO) != 0) return EXIT_FAILURE;
43
44 render_image();
45 return EXIT_SUCCESS;
46 }
47
48
1
2 #include "CheckedSDL.h"
3
4
5 SDL_Texture * volatile texture = NULL;
6
7 int load_image_thread(void *renderer) {
8 SDL_Surface *surface = SDL_LoadBMP("myimage.bmp");
9 texture = SDL_CreateTextureFromSurface(renderer, surface);
10 return 0;
11 }
12
13 void render_image() {
14 SDL_Window *win = SDL_CreateWindow("Hello World!",
15 100, 100, 640, 480, SDL_WINDOW_SHOWN);
16 SDL_Renderer *renderer = SDL_CreateRenderer(win, -1, 0);
17 SDL_CreateThread(load_image_thread, "image loader", renderer);
18
19
20 for(;;) {
21 SDL_Event e;
22 while (SDL_PollEvent(&e)){
23 switch(e.type) {
24 case SDL_QUIT: return;
25 }
26 }
27
28
29
30
31
32
33 SDL_RenderClear(renderer);
34 if(texture) SDL_RenderCopy(renderer, texture, NULL, NULL);
35 SDL_RenderPresent(renderer);
36 SDL_Delay(100);
37 }
38 }
39
40 int main() {
41
42 if(SDL_Init(SDL_INIT_VIDEO) != 0) return EXIT_FAILURE;
43
44 render_image();
45 return EXIT_SUCCESS;
46 }
47
48
slide27.c:9:58: error: too few arguments to function call, expected 3, have 2
texture = SDL_CreateTextureFromSurface(renderer, surface);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
./CheckedSDL.h:30:1: note: 'SDL_CreateTextureFromSurface' declared here
SDL_Texture * SDL_CreateTextureFromSurface(
^
slide27.c:15:43: error: too few arguments to function call, expected 7, have 6
100, 100, 640, 480, SDL_WINDOW_SHOWN);
^
./CheckedSDL.h:24:1: note: 'SDL_CreateWindow' declared here
SDL_Window * SDL_CreateWindow(
^
slide27.c:16:56: error: too few arguments to function call, expected 4, have 3
SDL_Renderer *renderer = SDL_CreateRenderer(win, -1, 0);
~~~~~~~~~~~~~~~~~~ ^
./CheckedSDL.h:33:1: note: 'SDL_CreateRenderer' declared here
SDL_Renderer * SDL_CreateRenderer(
^
slide27.c:22:26: error: too few arguments to function call, expected 2, have 1
while (SDL_PollEvent(&e)){
~~~~~~~~~~~~~ ^
./CheckedSDL.h:28:1: note: 'SDL_PollEvent' declared here
int SDL_PollEvent(TH(main), SDL_Event * event);
^
slide27.c:33:27: error: too few arguments to function call, expected 2, have 1
SDL_RenderClear(renderer);
~~~~~~~~~~~~~~~ ^
./CheckedSDL.h:41:1: note: 'SDL_RenderClear' declared here
int SDL_RenderClear(TH(main), SDL_Renderer * renderer);
^
slide27.c:34:59: error: too few arguments to function call, expected 5, have 4
if(texture) SDL_RenderCopy(renderer, texture, NULL, NULL);
~~~~~~~~~~~~~~ ^
./CheckedSDL.h:43:1: note: 'SDL_RenderCopy' declared here
int SDL_RenderCopy(
^
slide27.c:35:29: error: too few arguments to function call, expected 2, have 1
SDL_RenderPresent(renderer);
~~~~~~~~~~~~~~~~~ ^
./CheckedSDL.h:39:1: note: 'SDL_RenderPresent' declared here
void SDL_RenderPresent(TH(main), SDL_Renderer * renderer);
^
slide27.c:42:28: error: too few arguments to function call, expected 2, have 1
if(SDL_Init(SDL_INIT_VIDEO) != 0) return EXIT_FAILURE;
~~~~~~~~ ^
./CheckedSDL.h:37:1: note: 'SDL_Init' declared here
int SDL_Init(TH(main), Uint32 flags);
^
8 errors generated.
1
2 #include "CheckedSDL.h"
3
4
5 SDL_Texture * volatile texture = NULL;
6
7 int load_image_thread(void *renderer) {
8 SDL_Surface *surface = SDL_LoadBMP("myimage.bmp");
9 texture = SDL_CreateTextureFromSurface(renderer, surface);
10 return 0;
11 }
12
13 void render_image() {
14 SDL_Window *win = SDL_CreateWindow("Hello World!",
15 100, 100, 640, 480, SDL_WINDOW_SHOWN);
16 SDL_Renderer *renderer = SDL_CreateRenderer(win, -1, 0);
17 SDL_CreateThread(load_image_thread, "image loader", renderer);
18
19
20 for(;;) {
21 SDL_Event e;
22 while (SDL_PollEvent(&e)){
23 switch(e.type) {
24 case SDL_QUIT: return;
25 }
26 }
27
28
29
30
31
32
33 SDL_RenderClear(renderer);
34 if(texture) SDL_RenderCopy(renderer, texture, NULL, NULL);
35 SDL_RenderPresent(renderer);
36 SDL_Delay(100);
37 }
38 }
39
40 int main() {
41
42 if(SDL_Init(SDL_INIT_VIDEO) != 0) return EXIT_FAILURE;
43
44 render_image();
45 return EXIT_SUCCESS;
46 }
47
48
1
2 #include "CheckedSDL.h"
3
4
5 SDL_Texture * volatile texture = NULL;
6
7 int load_image_thread(void *renderer) {
8 SDL_Surface *surface = SDL_LoadBMP("myimage.bmp");
9 texture = SDL_CreateTextureFromSurface(renderer, surface);
10 return 0;
11 }
12
13 void render_image(TH(main)) {
14 SDL_Window *win = SDL_CreateWindow(th, "Hello World!",
15 100, 100, 640, 480, SDL_WINDOW_SHOWN);
16 SDL_Renderer *renderer = SDL_CreateRenderer(th, win, -1, 0);
17 SDL_CreateThread(load_image_thread, "image loader", renderer);
18
19
20 for(;;) {
21 SDL_Event e;
22 while (SDL_PollEvent(th, &e)){
23 switch(e.type) {
24 case SDL_QUIT: return;
25 }
26 }
27
28
29
30
31
32
33 SDL_RenderClear(th, renderer);
34 if(texture) SDL_RenderCopy(th, renderer, texture, NULL, NULL);
35 SDL_RenderPresent(th, renderer);
36 SDL_Delay(100);
37 }
38 }
39
40 int main() {
41 main_thread_t th;
42 if(SDL_Init(th, SDL_INIT_VIDEO) != 0) return EXIT_FAILURE;
43
44 render_image(th);
45 return EXIT_SUCCESS;
46 }
47
48
slide28.c:9:58: error: too few arguments to function call, expected 3, have 2
texture = SDL_CreateTextureFromSurface(renderer, surface);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
./CheckedSDL.h:30:1: note: 'SDL_CreateTextureFromSurface' declared here
SDL_Texture * SDL_CreateTextureFromSurface(
^
1 error generated.
1
2 #include "CheckedSDL.h"
3
4
5 SDL_Texture * volatile texture = NULL;
6
7 int load_image_thread(void *renderer) {
8 SDL_Surface *surface = SDL_LoadBMP("myimage.bmp");
9 texture = SDL_CreateTextureFromSurface(renderer, surface);
10 return 0;
11 }
12
13 void render_image(TH(main)) {
14 SDL_Window *win = SDL_CreateWindow(th, "Hello World!",
15 100, 100, 640, 480, SDL_WINDOW_SHOWN);
16 SDL_Renderer *renderer = SDL_CreateRenderer(th, win, -1, 0);
17 SDL_CreateThread(load_image_thread, "image loader", renderer);
18
19
20 for(;;) {
21 SDL_Event e;
22 while (SDL_PollEvent(th, &e)){
23 switch(e.type) {
24 case SDL_QUIT: return;
25 }
26 }
27
28
29
30
31
32
33 SDL_RenderClear(th, renderer);
34 if(texture) SDL_RenderCopy(th, renderer, texture, NULL, NULL);
35 SDL_RenderPresent(th, renderer);
36 SDL_Delay(100);
37 }
38 }
39
40 int main() {
41 main_thread_t th;
42 if(SDL_Init(th, SDL_INIT_VIDEO) != 0) return EXIT_FAILURE;
43
44 render_image(th);
45 return EXIT_SUCCESS;
46 }
47
48
1
2 #include "CheckedSDL.h"
3
4
5 SDL_Texture * volatile texture = NULL;
6
7 int load_image_thread(void *renderer) {
8 SDL_Surface *surface = SDL_LoadBMP("myimage.bmp");
9 texture = SDL_CreateTextureFromSurface(th, renderer, surface);
10 return 0;
11 }
12
13 void render_image(TH(main)) {
14 SDL_Window *win = SDL_CreateWindow(th, "Hello World!",
15 100, 100, 640, 480, SDL_WINDOW_SHOWN);
16 SDL_Renderer *renderer = SDL_CreateRenderer(th, win, -1, 0);
17 SDL_CreateThread(load_image_thread, "image loader", renderer);
18
19
20 for(;;) {
21 SDL_Event e;
22 while (SDL_PollEvent(th, &e)){
23 switch(e.type) {
24 case SDL_QUIT: return;
25 }
26 }
27
28
29
30
31
32
33 SDL_RenderClear(th, renderer);
34 if(texture) SDL_RenderCopy(th, renderer, texture, NULL, NULL);
35 SDL_RenderPresent(th, renderer);
36 SDL_Delay(100);
37 }
38 }
39
40 int main() {
41 main_thread_t th;
42 if(SDL_Init(th, SDL_INIT_VIDEO) != 0) return EXIT_FAILURE;
43
44 render_image(th);
45 return EXIT_SUCCESS;
46 }
47
48
slide29.c:9:41: error: use of undeclared identifier 'th'
texture = SDL_CreateTextureFromSurface(th, renderer, surface);
^
1 error generated.
1
2 #include "CheckedSDL.h"
3
4
5 SDL_Texture * volatile texture = NULL;
6
7 int load_image_thread(void *renderer) {
8 SDL_Surface *surface = SDL_LoadBMP("myimage.bmp");
9 texture = SDL_CreateTextureFromSurface(th, renderer, surface);
10 return 0;
11 }
12
13 void render_image(TH(main)) {
14 SDL_Window *win = SDL_CreateWindow(th, "Hello World!",
15 100, 100, 640, 480, SDL_WINDOW_SHOWN);
16 SDL_Renderer *renderer = SDL_CreateRenderer(th, win, -1, 0);
17 SDL_CreateThread(load_image_thread, "image loader", renderer);
18
19
20 for(;;) {
21 SDL_Event e;
22 while (SDL_PollEvent(th, &e)){
23 switch(e.type) {
24 case SDL_QUIT: return;
25 }
26 }
27
28
29
30
31
32
33 SDL_RenderClear(th, renderer);
34 if(texture) SDL_RenderCopy(th, renderer, texture, NULL, NULL);
35 SDL_RenderPresent(th, renderer);
36 SDL_Delay(100);
37 }
38 }
39
40 int main() {
41 main_thread_t th;
42 if(SDL_Init(th, SDL_INIT_VIDEO) != 0) return EXIT_FAILURE;
43
44 render_image(th);
45 return EXIT_SUCCESS;
46 }
47
48
1
2 #include "CheckedSDL.h"
3
4
5 SDL_Surface * volatile surface = NULL;
6
7 int load_image_thread(void *renderer) {
8 surface = SDL_LoadBMP("myimage.bmp");
9
10 return 0;
11 }
12
13 void render_image(TH(main)) {
14 SDL_Window *win = SDL_CreateWindow(th, "Hello World!",
15 100, 100, 640, 480, SDL_WINDOW_SHOWN);
16 SDL_Renderer *renderer = SDL_CreateRenderer(th, win, -1, 0);
17 SDL_CreateThread(load_image_thread, "image loader", renderer);
18 SDL_Texture *texture = NULL;
19
20 for(;;) {
21 SDL_Event e;
22 while (SDL_PollEvent(th, &e)){
23 switch(e.type) {
24 case SDL_QUIT: return;
25 }
26 }
27
28 if(surface) {
29 texture = SDL_CreateTextureFromSurface(th, renderer, surface);
30 surface = NULL;
31 }
32
33 SDL_RenderClear(th, renderer);
34 if(texture) SDL_RenderCopy(th, renderer, texture, NULL, NULL);
35 SDL_RenderPresent(th, renderer);
36 SDL_Delay(100);
37 }
38 }
39
40 int main() {
41 main_thread_t th;
42 if(SDL_Init(th, SDL_INIT_VIDEO) != 0) return EXIT_FAILURE;
43
44 render_image(th);
45 return EXIT_SUCCESS;
46 }
47
48