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.