Komputer baru apa yang saya pelajari ketika saya memutuskan untuk menulis Chrome Dino di C





Sedikit tentang proyeknya



Untuk mengenal bahasanya, saya memutuskan untuk menulis aplikasi kecil chrome dino, yang merupakan tiruan yang tidak berhasil dari dinosaurus chrome yang sudah dikenal. Karena kurangnya kelas di C, saya memutuskan untuk menemukan kembali roda saya: Saya menempatkan bidang dan metode kelas dalam struktur, konstruktor adalah fungsi yang mengembalikan struktur ini. Bidang dan metode internal disembunyikan dengan mengawalinya dengan statis. (Ada beberapa artikel tentang ini)

...



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 β€” .







, β€”



, , . .



, , .. .



Untuk mengulangi serangkaian data (array satu dimensi), alamat elemen pertama diambil, dan kemudian dalam satu lingkaran (dengan langkah = ukuran tipe data), alamat berikutnya dipindahkan.



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

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


Menjadi lebih sulit untuk mengimplementasikan pencarian elemen dalam array dua dimensi, karena seluruh array ditulis ke sel sekuensial dan pencarian harus dilakukan dengan baris, bukan matriks. Untuk mencari elemen matriks dalam satu baris, Anda dapat menggunakan rumus:



SEBUAH[saya][j]=sayaβˆ—w+j





di mana A adalah larik dua dimensi,

      i adalah indeks baris,

      j adalah indeks kolom,

      w adalah panjang larik bersarang A (lebar larik)



Bahkan lebih sulit lagi untuk menemukan elemen dari larik tiga dimensi; untuk menemukannya, Anda perlu menggunakan rumus:



B[saya][j][k]=sayaβˆ—wβˆ—h+jβˆ—w+k





dengan B adalah matriks tiga dimensi,

      k adalah indeks rangkaian matriks dua dimensi,

      h adalah panjang array B bersarang (tinggi matriks).



Jelas bahwa untuk mengimplementasikan pekerjaan dengan lebih banyak penumpukan larik, diperlukan algoritme penelusuran terpadu untuk elemennya:



C[Sebuah1][Sebuah2].........[Sebuahn]=βˆ‘saya=1nSebuahsayaβˆ—Lsaya-1βˆ—.........βˆ—L1



dengan C adalah larik berdimensi

      n , n bersarang,

      Sebuahsaya - indeks larik ke-i,

      Lsaya - panjang larik i.



Jika kita mengambil jumlah operasi komputer sebagai sumbu ordinat, dan bersarang sebagai sumbu absis, maka kita dapat melihat bagaimana jumlah operasi untuk menghitung elemen array bertambah dengan bertambahnya nesting. (Penjumlahan dan perkalian dilakukan dalam satu operasi).







Ingat ingatannya



. : , . .



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





Bukan primitif primitif



Dalam bahasa tingkat tinggi, ada tipe data yang diteruskan oleh referensi dan data yang diteruskan oleh nilai. Tetapi untuk melewatkan data berdasarkan nilai, Anda harus memiliki referensi ke variabel, yaitu. apakah tipe primitif tidak begitu primitif? Di assembler, variabel apa pun menyimpan referensi ke lokasi memori dan nilai yang disimpan di dalamnya. Setiap variabel menyimpan alamat sel dan nilainya (nilainya juga bisa menjadi alamat sel lain). Tetapi di mana referensi ke alamat sel memori disimpan? Ternyata ketika kompilator membuat kode mesin, secara otomatis mengganti semua nama variabel dengan offsetnya. Artinya, setiap variabel dapat diteruskan dengan referensi, tetapi dalam bahasa tingkat tinggi fitur ini disembunyikan untuk pengembang.





Anda dapat melihat proyeknya di sini .



All Articles