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