
Um pouco sobre o projeto
Para me familiarizar com a linguagem, decidi escrever um pequeno aplicativo chrome dino, que é um clone malsucedido do familiar dinossauro cromo. Devido à falta de classes em C, decidi reinventar minha roda: coloquei os campos e métodos da classe em uma estrutura, o construtor era uma função que retorna essa estrutura. Os campos e métodos internos são ocultados ao precedê-los com estático. (Existem vários artigos sobre isso)
...typedef struct Barrier {
int width, height;
int *picture;
int x0, y0;
} Barrier;
Barrier* new_Barrier() {
Barrier* barrier = NULL;
barrier = malloc(sizeof(Barrier));
return barrier;
}
[0, 1, 2, 3],
.
0 — ,
1 — ,
2 — ,
3 — .
, —
, , . .
, , .. .
Para iterar sobre uma série de dados (matriz unidimensional), o endereço do primeiro elemento é obtido e, em seguida, em um loop (com um passo = tamanho do tipo de dados), uma transição é feita para o próximo endereço.
int n = 10;
int step = sizeof(Barrier);
Barrier* barrier = malloc(step * n);
for (int i = 0; i < n; i += step) {
*(barrier + i) = data;
}
Torna-se mais difícil implementar a busca por um elemento em uma matriz bidimensional, porque a matriz inteira é gravada em células sequenciais e a pesquisa deve ser realizada por uma linha, não por uma matriz. Para pesquisar um elemento da matriz em uma linha, você pode usar a fórmula:
onde A é uma matriz bidimensional,
i é o índice da linha,
j é o índice da coluna,
w é o comprimento da matriz aninhada A (largura da matriz)
É ainda mais difícil encontrar um elemento de uma matriz tridimensional, para encontrá-lo você precisa usar a fórmula:
onde B é uma matriz tridimensional,
k é o índice de uma série de matrizes bidimensionais,
h é o comprimento da matriz aninhada B (a altura da matriz).
É claro que para implementar o trabalho com mais aninhamento de matrizes, é necessário um algoritmo de pesquisa unificada para seu elemento:
onde C é uma matriz n-dimensional,
n é aninhamento,
, — , , . ( ).

. : , . .
c Barrier. , . , ( ). push ( ) ( ) , . .
int n = 10;
int step = sizeof(Barrier);
Barrier* barrier = malloc(step * n);
for (int i = 0; i < n; i += step) {
*(barrier + i) = data;
}
n = 11;
free(barrier);
barrier = malloc(step * n);
for (int i = 0; i < n; i += step) {
*(barrier + i) = data;
}
: , . (, ArrayList java), .
Não é um primitivo primitivo
Em linguagens de alto nível, existem tipos de dados passados por referência e dados passados por valor. Mas para passar dados por valor, você deve ter uma referência à variável, ou seja, O tipo primitivo não é tão primitivo? Em assembler, qualquer variável armazena uma referência a um local de memória e o valor que é armazenado nele. Cada variável armazena seu endereço de célula e valor (o valor também pode ser o endereço de outra célula). Mas onde estão armazenadas as referências a endereços de células de memória? Acontece que, quando o compilador gera código de máquina, ele substitui automaticamente todos os nomes de variáveis por seus deslocamentos. Isso significa que cada variável pode ser passada por referência, mas em linguagens de alto nível, esse recurso fica oculto para o desenvolvedor.
Você pode ver o projeto aqui .