Post

Exemplos Diversos em C/C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void test_color()
{
    printf("0x11ff2233 >> 8 == %x\n", 0x11ff2233 >> 8);
    printf("0xff223300 >> 8 == %x\n", 0xff223300 >> 8);

    printf("%d\n", 0x0011ff22 == (0x11ff2233 >> 8));
    printf("%d\n", 0xff223300 == (0x11ff2233 << 8));
    
    // 0xFF = 255
    // rbga = 4 bytes
    // para mover para o proximo canal podemos usar o >> 8 ou << 8 para mover 8 bits
    // (1111 1111) = 255 = 0xFF

    // big endian (rgba)
    int rmask = 0xff000000;
    int gmask = 0x00ff0000;
    int bmask = 0x0000ff00;
    int amask = 0x000000ff;

    // little endian (abgr)
    int lrmask = 0x000000ff;
    int lgmask = 0x0000ff00;
    int lbmask = 0x00ff0000;
    int lamask = 0xff000000;

    printf("%d\n", 0b0001 & 0b1111);
}

math.h

1
2
3
4
5
6
7
8
9
10
11
#include <math.h>

void test_floor_and_ceil()
{
    float x = 1.1f;
    // floor arredonda pra baixo 'piso'
    printf("floor is %f\n", floor(x));

    // ceil arredonda pra cima 'teto'
    printf("ceil is %f\n", ceil(x));
}

PNG to char

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
void print_ascii_table()
{
    for(int i = 0; i < 128; ++i) {
        printf("%d - %c\n", i, (char) i);
    }
}

void print_array_ascii_table_as_matrix(int cols, int rows)
{
    for(int y = 0; y < rows; ++y) {
        for(int x = 0; x < cols; ++x) {
            printf("%c  ", (char) ((x + y * cols) + 97));
        }
        printf("\n");
    }

    printf("----------\n");
}

/* a = 97
   0 1 2 3 4 5
   -----------
   a b c d e f
   g h i j k l
   m n o p q r
   s t u v w x
   y z

*/
void print_png_to_char()
{
    int font_cols = 6;          // default column
    int font_rows = 5;          // default row

    int start = 'a';            // = 97
    int end = start + 26;       // mark from a-z

    // percorre todas as letras para conseguir encontrar a sua posição baseada
    // na matrix acima.
    // index % font_cols descobre a linha corrente (x) com o recurso de mod
    // index / font_cols descobre a coluna corrent (y) a partir do pitch, isto é,
    // até quando cabe aquele index na coluna.

    // 0  / 6 = 0
    // 6  / 6 = 1
    // 12 / 6 = 2
    // ....
    
    for(int i=start; i < end; i++) {
        char c = i;

        int index = c - 97;
        int x = index % font_cols;
        int y = index / font_cols;
        printf("%c : {x=%d, y=%d}\n", c, x, y);
    }
}

typedef struct {
    int x;
    int y;
} Vec2;


Vec2 find_char_position(char c)
{
    int font_cols = 6;          // default column
    int font_rows = 5;          // default row
    int index = c - 97;

    int x = index % font_cols;
    int y = index / font_cols;

    return (Vec2) {x, y};
}

void test_png_to_char()
{
    print_ascii_table();

    //
    // converte uma matrix (como um PNG ascii) em um array mapeado
    // para cada caracter
    //
    print_png_to_char();

    char c = 'v';
    Vec2 pos = find_char_position(c);
    printf("Char %c in x=%d, y=%d\n", c, pos.x, pos.y);

    //
    // converte um array [a, b, c, d, ...] para matrix
    // [a, b]
    // [c, d]
    // [....]
    //
    print_array_ascii_table_as_matrix(6, 5);
    print_array_ascii_table_as_matrix(2, 14);
    print_array_ascii_table_as_matrix(13, 2);
    print_array_ascii_table_as_matrix(10, 3);
}

Structs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// em C, precisamos de typedef,
typedef struct {
    int x, y;
} Vec2f;

// em C++:
struct Vec2f {
    int x, y;
};

Vec2f test_struct()
{
    // inicializacao somente permitida em C++
    // Vec2f vec = {};
    Vec2f vec;
    vec.x = 10;
    vec.y = 20;
	
    // Em C, ao tentar inicializar uma struct com todas as propriedades zeradas precisamos
    // passar o zero.
    Vec2f vec = {0};
    // O trecho acima iráiniciar a primeira e as demais propriedades com zero.
    // Agora, em C++, podemos fazer o mesmo da seguinte forma:
    // Vec2f vec = {};

    //
    // outras maneiras de iniciar uma struct em C
    //
    Vec2f vec2 = {22, 33};
    Vec2f vec3 = {.y = 22, .x = 33}; // inicializacao parametrizada (só funciona em C99)


    // em C, uma struct PURA é definida dessa maneira e para nomearmos ela como no C++,
    // precisamos do typedef (ver "example_struct.h")
    // OBS.: Nao usamos assim. Isto é para fins didaticos!!!
    struct {int x, y;} z;
    z.x = 30;
    z.y = 40;

    printf("x is %d, y is %d\n", z.x, z.y);
    printf("x is %d, y is %d\n", vec2.x, vec2.y);
    printf("x is %d, y is %d\n", vec3.x, vec3.y);

    // Maneira enxuta de iniciar um bloco struct, com parametros nomeados e já retorná-los
    return (Vec2f) {
        .x = vec3.x,
        .y = vec3.y
    };

}
Esta postagem está licenciada sob CC BY 4.0 pelo autor.