Welchen neuen Computer habe ich gelernt, als ich mich entschied, Chrome Dino in C zu schreiben





Ein wenig über das Projekt



Um mich mit der Sprache vertraut zu machen, habe ich beschlossen, eine kleine Anwendung Chrome Dino zu schreiben, die ein erfolgloser Klon des bekannten Chromdinosauriers ist. Aufgrund des Fehlens von Klassen in C habe ich beschlossen, mein Rad neu zu erfinden: Ich habe die Felder und Methoden der Klasse in einer Struktur platziert, der Konstruktor war eine Funktion, die diese Struktur zurückgibt. Interne Felder und Methoden werden ausgeblendet, indem statische Felder vorangestellt werden. (Es gibt mehrere Artikel dazu)

...



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 — .







, —



, , . .



, , .. .



Um eine Reihe von Daten (eindimensionales Array) zu durchlaufen, wird die Adresse des ersten Elements genommen und dann in einer Schleife (mit einem Schritt = Größe des Datentyps) die nächste Adresse verschoben.



int n = 10;
int step = sizeof(Barrier);
Barrier* barrier = malloc(step * n);

for (int i = 0; i < n; i += step) {
  *(barrier + i) = data;
}


Es wird schwieriger, die Suche nach einem Element in einem zweidimensionalen Array zu implementieren, da das gesamte Array in sequentielle Zellen geschrieben wird und die Suche von einer Zeile und nicht von einer Matrix durchgeführt werden muss. Um nach einem Matrixelement in einer Zeile zu suchen, können Sie die folgende Formel verwenden:



EIN[ich]][j]]=ichw+j





wobei A ein zweidimensionales Array ist,

      i der Zeilenindex ist,

      j der Spaltenindex ist,

      w die Länge des verschachtelten Arrays A ist (Arraybreite)



Es ist noch schwieriger, ein Element eines dreidimensionalen Arrays zu finden. Um es zu finden, müssen Sie die folgende Formel verwenden:



B.[ich]][j]][k]]=ichwh+jw+k





wobei B eine dreidimensionale Matrix ist,

      k der Index einer Reihe zweidimensionaler Matrizen ist,

      h die Länge des verschachtelten Arrays B (die Höhe der Matrix) ist.



Es ist klar, dass ein einheitlicher Suchalgorithmus für sein Element erforderlich ist, um Arbeiten mit mehr Verschachtelung von Arrays zu implementieren:



C.[ein1]][ein2]].........[einn]]=ich=1neinichL.ich- -1.........L.1



wobei C ein n-dimensionales Array

      ist, verschachtelt n,

      einich - Index des i-ten Arrays,

      L.ich - die Länge des Arrays i.



Wenn wir die Anzahl der Computeroperationen als Ordinatenachse und die Verschachtelung als Abszissenachse verwenden, können wir sehen, wie die Anzahl der Operationen zur Berechnung eines Array-Elements mit zunehmender Verschachtelung zunimmt. (Summe und Multiplikation werden in einer Operation ausgeführt).







Erinnere dich an die Erinnerung



. : , . .



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), .





Kein primitives Primitiv



In Hochsprachen gibt es sowohl Datentypen, die als Referenz übergeben werden, als auch Daten, die als Wert übergeben werden. Um Daten jedoch als Wert zu übergeben, müssen Sie einen Verweis auf die Variable haben, d. H. Ist der primitive Typ nicht so primitiv? In Assembler speichert jede Variable sowohl einen Verweis auf einen Speicherort als auch den darin gespeicherten Wert. Jede Variable speichert ihre Zellenadresse und ihren Wert (der Wert kann auch die Adresse einer anderen Zelle sein). Aber wo werden Verweise auf Adressen von Speicherzellen gespeichert? Es stellt sich heraus, dass der Compiler beim Generieren von Maschinencode automatisch alle Variablennamen durch ihre Offsets ersetzt. Dies bedeutet, dass jede Variable als Referenz übergeben werden kann, aber in höheren Sprachen ist diese Funktion für den Entwickler verborgen.





Sie können das Projekt hier sehen .



All Articles