Un peu sur le projet
Pour me familiariser avec le langage avec, j'ai décidé d'écrire une petite application chrome dino, qui est un clone infructueux du dinosaure chromé familier. En raison du manque de classes en C, j'ai décidé de réinventer ma roue: j'ai placé les champs et les méthodes de la classe dans une structure, le constructeur était une fonction qui retourne cette structure. Les champs et méthodes internes sont masqués en les précédant de static. (Il y a plusieurs articles à ce sujet)
...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 — .
, —
, , . .
, , .. .
Pour itérer sur une série de données (tableau unidimensionnel), l'adresse du premier élément est prise, puis dans une boucle (avec un pas = taille du type de données), une transition est effectuée vers l'adresse suivante.
int n = 10;
int step = sizeof(Barrier);
Barrier* barrier = malloc(step * n);
for (int i = 0; i < n; i += step) {
*(barrier + i) = data;
}
Il devient plus difficile de mettre en œuvre la recherche d'un élément dans un tableau à deux dimensions, car le tableau entier est écrit dans des cellules séquentielles et la recherche doit être effectuée par une ligne, pas une matrice. Pour rechercher un élément de matrice dans une ligne, vous pouvez utiliser la formule:
où A est un tableau à deux dimensions,
i est l'index de ligne,
j est l'index de colonne,
w est la longueur du tableau imbriqué A (largeur du tableau)
Il est encore plus difficile de trouver un élément d'un tableau en trois dimensions; pour le trouver, vous devez utiliser la formule:
où B est une matrice tridimensionnelle,
k est l'indice d'une série de matrices bidimensionnelles,
h est la longueur du tableau imbriqué B (la hauteur de la matrice).
Il est clair que pour implémenter le travail avec plus d'imbrication de tableaux, un algorithme de recherche unifié pour son élément est nécessaire:
où C est un tableau à
n dimensions, n est une imbrication,
Si nous prenons le nombre d'opérations informatiques comme axe des ordonnées et l'imbrication comme axe des abscisses, alors nous pouvons voir comment le nombre d'opérations pour calculer un élément de tableau augmente avec l'imbrication croissante. (La somme et la multiplication sont prises en une seule opération).
Souviens-toi de la mémoire
. : , . .
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), .
Pas un primitif primitif
Dans les langages de haut niveau, il existe à la fois des types de données passés par référence et des données transmises par valeur. Mais pour passer des données par valeur, vous devez avoir une référence à la variable, c'est-à-dire le type primitif n'est-il pas si primitif? Dans l'assembleur, toute variable stocke à la fois une référence à un emplacement mémoire et la valeur qui y est stockée. Chaque variable stocke son adresse de cellule et sa valeur (la valeur peut également être l'adresse d'une autre cellule). Mais où sont stockées les références aux adresses des cellules mémoire? Il s'avère que lorsque le compilateur génère du code machine, il remplace automatiquement tous les noms de variables par leurs décalages. Cela signifie que chaque variable peut être transmise par référence, mais dans les langages de haut niveau, cette fonctionnalité est masquée pour le développeur.
Vous pouvez voir le projet ici .