Que novo computador eu aprendi quando decidi escrever Chrome Dino em C





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:



UMA[Eu][j]=EuW+j





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:



B[Eu][j][k]=EuWh+jW+k





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:



C[uma1][uma2].........[uman]=Eu=1numaEueuEu-1.........eu1



onde C é uma matriz n-dimensional,

      n é aninhamento,

      umaEu - índice da i-ésima matriz,

      euEu - o comprimento da matriz i.



, — , , . ( ).









. : , . .



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 .



All Articles