قليلا عن المشروع
للتعرف على اللغة ، قررت كتابة تطبيق صغير chrome dino ، وهو استنساخ غير ناجح لديناصور الكروم المألوف. نظرًا لعدم وجود فئات في لغة 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 — .
, —
, , . .
, , .. .
للتكرار عبر سلسلة من البيانات (مصفوفة أحادية البعد) ، يتم أخذ عنوان العنصر الأول ، ثم في حلقة (بخطوة = حجم نوع البيانات) ، يتم نقل العنوان التالي.
int n = 10;
int step = sizeof(Barrier);
Barrier* barrier = malloc(step * n);
for (int i = 0; i < n; i += step) {
*(barrier + i) = data;
}
يصبح تنفيذ البحث عن عنصر في مصفوفة ثنائية الأبعاد أكثر صعوبة ، لأن المصفوفة بأكملها مكتوبة على خلايا متسلسلة ويجب إجراء البحث بواسطة صف وليس مصفوفة. للبحث عن عنصر مصفوفة في صف ، يمكنك استخدام الصيغة:
حيث A عبارة عن صفيف ثنائي الأبعاد ، و
i هو فهرس الصف ، و
j هو فهرس العمود ، و
w هو طول المصفوفة المتداخلة A (عرض المصفوفة)
من الصعب العثور على عنصر في صفيف ثلاثي الأبعاد ؛ للعثور عليه ، تحتاج إلى استخدام الصيغة:
حيث B عبارة عن مصفوفة ثلاثية الأبعاد ، و
k هو فهرس سلسلة من المصفوفات ثنائية الأبعاد ، و
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), .
ليست بدائية
في اللغات عالية المستوى ، يوجد كلا من أنواع البيانات التي تم تمريرها حسب المرجع والبيانات التي تم تمريرها حسب القيمة. ولكن لتمرير البيانات حسب القيمة ، يجب أن يكون لديك مرجع إلى المتغير ، أي أليس النوع البدائي بتلك البدائية؟ في المجمع ، يخزن أي متغير كلاً من إشارة إلى موقع الذاكرة والقيمة المخزنة فيه. يخزن كل متغير عنوان الخلية وقيمتها (يمكن أن تكون القيمة أيضًا عنوان خلية أخرى). ولكن أين هي الإشارات إلى عناوين خلايا الذاكرة المخزنة؟ اتضح أنه عندما يقوم المترجم بإنشاء رمز الآلة ، فإنه يستبدل تلقائيًا جميع أسماء المتغيرات بإزاحاتها. هذا يعني أنه يمكن تمرير كل متغير عن طريق المرجع ، ولكن في اللغات عالية المستوى هذه الميزة مخفية للمطور.
يمكنك رؤية المشروع هنا .