プロジェクトについて少し
言語に精通するために、私は小さなアプリケーションchrome dinoを作成することにしました。これは、おなじみのchrome恐竜の失敗したクローンです。Cにはクラスがないため、ホイールを再発明することにしました。クラスのフィールドとメソッドを構造に配置しました。コンストラクターは、この構造を返す関数でした。内部フィールドとメソッドは、それらの前にstaticを付けることで非表示になります。(これに関するいくつかの記事があります)
..。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 — .
, —
, , . .
, , .. .
一連のデータ(1次元配列)を反復処理するために、最初の要素のアドレスが取得され、ループ(ステップ=データタイプのサイズ)で次のアドレスが移動されます。
int n = 10;
int step = sizeof(Barrier);
Barrier* barrier = malloc(step * n);
for (int i = 0; i < n; i += step) {
*(barrier + i) = data;
}
配列全体が順次セルに書き込まれ、検索はマトリックスではなく行で実行する必要があるため、2次元配列内の要素の検索を実装することはより困難になります。行のマトリックス要素を検索するには、次の式を使用できます。
ここで、Aは2次元配列、
iは行インデックス、
jは列インデックス、
wはネストされた配列Aの長さ(配列幅)です。
3次元配列の要素を見つけることはさらに困難です。それを見つけるには、次の式を使用する必要があります。
ここで、Bは3次元マトリックス、
kは一連の2次元マトリックスのインデックス、
hはネストされた配列Bの長さ(マトリックスの高さ)です。
より多くの配列のネストを使用して作業を実装するには、その要素の統一された検索アルゴリズムが必要であることは明らかです。
ここで、Cはn次元配列、
nはネスト、
, — , , . ( ).
. : , . .
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), .
プリミティブプリミティブではありません
高レベルの言語には、参照によって渡されるデータタイプと値によって渡されるデータの両方があります。ただし、値でデータを渡すには、変数への参照が必要です。プリミティブタイプはそのプリミティブではありませんか?アセンブラでは、変数はメモリ位置への参照とそこに格納されている値の両方を格納します。各変数は、そのセルのアドレスと値を格納します(値は別のセルのアドレスにすることもできます)。しかし、メモリセルのアドレスへの参照はどこに保存されていますか?コンパイラがマシンコードを生成すると、すべての変数名がそれらのオフセットに自動的に置き換えられることがわかりました。これは、各変数を参照によって渡すことができることを意味しますが、高レベルの言語では、この機能は開発者には隠されています。
ここで プロジェクトを見ることができます。