Wednesday, November 4, 2009

Гарчиггүй

С хэлэнд бичигдээгүй ч програм зохиогчийн ашиглаж болох энгийн хэдэн дүрэм бий билээ.
Жишээлбэл: Хувьсагчийн зарлагааг нэрлэхдээ жава дээр myExampleData гэж нэрлэдэг бол
С дээр my_example_data буюу хувьсагч хооронд доогуур зураас ашигладаг.
Мэдээж анги (class) г нэрлэхдээ том үсгээр эхлэнэ гэсэн дүрэм бий. С# дээр харин функцууд том үсгээр эхэлдэг талтай. Дээрхи бичигдээгүй дүрмийг баримталснаар сүүлд ангийн жишээ коде үзэж байх явцад энэ с дээр бичсэн коде, энэ жава дээр бичсэн коде гэж таньхад хөгжүүлхэд амар болдог талтай.
Мөн С дээр prototype буюу функцийг зарлахдаа урдьчилан зарлагаа хийж өгдөг.
Ингэснээр үндсэн main функцийн дээр баахан сунжирсан коде жирэлзэж кодыг ойлгомжгүй болгохоос сэргийлж эмх цэгцтэй харагдуулдаг. Нөгөө талаас Программын загварыг гаргахад хэрэгтэй гэхүүдээ.
Мэдээж нэгэнт Системийн програмчлал үзэж байгаагийн хувьд ямар ч функц, процедур дууссан ядаж яаж дууссанаа мэдэгдэж алдаагүй ажиллагаагаа хангах ёстой. Тиймээс ямар нэг void функц байх нь төдийлөн сайн биш гэж үздэг.
За тэгээд түрүү жил өөрийн яаж хийж байсан кодыг доор тавьлаа. Буруу алдаатай бичсэн байх аваас comment үдээгээрэй.

#include < stdio.h>
#include < stdlib.h>
/* zaagchaar ni neg hemjeest massiv erembleh functiinn zarlagaa buyu zagvar*/
void sort_array(int *, int, int (*compare_ptr)(int, int));
/* ogson 2 toonii zaagchaar ni utgii ni solih swap fuctiin zarlagaa hiigdej baina*/  
void swap(int *a, int *b);
/* 2 toog haritsuuldag boolean functiin zarlagaa */  
int compare(int a, int b);
/* 2 toog haritsuulaad suuliinh ni ih bol true utga butsaadag functiin zarlagaa */  
int reverse_compare(int a, int b);
/* ogogdsonn zaagch hemjeegeer ni yamar neg massiviig delgetsennd hevleh fuctiin zarlagaa */
void print_array(int *, int);


int main(int argc, char *argv[]){
const int ARRAY_SIZE = 10, MAX_NUMBER = 100;
int array[ARRAY_SIZE];
int i;
for(i = 0; i < ARRAY_SIZE; i++){
array[i] = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
}
printf("Before sort\n");
print_array(array, ARRAY_SIZE);
sort_array(array, ARRAY_SIZE, &compare);
printf("After sorting with regular compare\n");
print_array(array, ARRAY_SIZE);
sort_array(array, ARRAY_SIZE, &reverse_compare);
printf("After sorting with reverse compare\n");
print_array(array, ARRAY_SIZE);
return 0;
}
/* Gants hemjeest Massiv erembleh func*/  
void sort_array(int *a, int size, int (*compare_ptr)(int,int)){//eremblegdeh massiv, hemjee, duudagdah functiin zarlagaa 
int i, j;
for(i = 0; i < size - 1; i++){
for(j = i + 1; j < size; j++){
if(compare_ptr(a[i], a[j])){
swap(a+i, &a[j]);//massiv ooroo zaagch uchir swap(&a[i],&a[j]) tai ijil
}
}
}
}
/* hoer toonii utgiig zaagchaar ni damjuulj solij baina */  
void swap(int *a, int *b){
int tmp = *b;
*b = *a;
*a = tmp;
}
void print_array(int *a, int size){
int i;
for(i = 0; i < size; i++){
printf("%d ", a[i]);
}
printf("\n");
}
/*Nohtsol shalgaad boolean utga butsaaj baina*/
int compare(int a, int b) { if ( a > b ) return 1; else return 0; }
int reverse_compare(int a, int b) { if ( a < b ) return 1; else return 0; }


Дээрхи хэсгийн html кодыг найзыхаа зөвлөснөөр Хамгаалалттай хуудаснаас firefox -н firebug ашиглан авсан.
firebug -н хуьд өөрийн хийж буй web -г debug хийж эсвэл хүний web -г тэр дор нь жижигхэн газар нь өөрчлөн харж болох зэрэг өргөн боломжууттай гайхалтай багаж байгаа юм.
Бие даалтан дээрээ хэрэглэвэл сайн гэж зөвлмөөр байна.

#include   < stdio.h>

#include   < stdlib.h>
#include   < string.h>
/* student ogogdliin torol todorhoilj baina */
struct student {
  char name[80];
  char id[10];
};

/* MACRO todorhoilolt buyu STUDENT_COUNT togmoliig 4 utgataigaar zarlaj baina.
Ene ni huvisagch bich bogood sanah oid zai nootsoldoggui  */ 

#define STUDENT_COUNT 4  
/* student toroltoi ogogdliin zaagch orch irhed tooniig delgetsenn haruulah functiin zarlagaa */  
void print_list(struct student *);
char *orders[] = {"th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th"};
char students[4][2][10] = { {"Dorj", "SW99D999"},
                           {"Dondog", "SW99D998"},
                           {"Bat", "SW99D997"},
                           {"Dulmaa", "SW99D996"}};
int main(void){
  int i;
  /* student toroltoii sw302_students torliin 4 urttai massiv zarlaj baina */ 
  struct student *sw302_students;
  sw302_students = malloc(sizeof(struct student) * STUDENT_COUNT);
  for(i = 0; i < STUDENT_COUNT; i++){
    /* students temdeg moriin massiviin Oyutnii ner kodiig
  * temdegt moriin togsgoliig oroltsuulan 
  * sw302_students[i] massiviin talbar tus burt huulj baina
  */  
    strcpy(sw302_students[i].name, students[i][0]);
    strcpy(sw302_students[i].id, students[i][1]);
  }
/* student toroltoi ogogdliin zaagch orch irhed tooniig delgetsenn haruulah functiin eh bie */
  print_list(sw302_students);
  return 0;
}
/* student toroltoi ogogdliin zaagch orch irhed tooniig delgetsenn haruulah functiin eh bie */
void print_list(struct student *list){
  int i;
  printf("Printing students:\n");
  for(i = 0; i < STUDENT_COUNT; i++){
    printf("%d%s students\n\t\tname: %s\n\t\tid:%s\n", i+1, orders[(i+1)%10], list[i].name, list[i].id);
  }
  printf("Done\n");
}

Аан нэг зүйл нэмж хэлхэд. С дээр нөхцөл шалгахдаа 0 бол үнэн бусад тохиолдолд худал үр дүнд хүрдэг.
жишээлбэл:
#define TRUE 0
#define FALSE 1
гэж орлуулдаг. preprocessor буюу хөрвүүлхээсээ өмнө дээрхи define зэрэг preprocessor-н үйлдлүүдийг хийж тааралдсан газар нь TRUE гэж бичигдсэн газар бүр 0 (zero) тавьна гэсэн үг л дээ. Тэгээд header файл буюу толгой файл оруулж ирснийг мөн хөрвүүлэлтийн явцад хоёр файлыг залгаад л хөрвүүлчихдэг. Заагч заалтыг илээр их хэрэглэдэг нь аюулгүй байдал зэргийг дан ганц програм зохиогч нуруун дээр хариуцан явуулдаг зэрэг дутагдал бий.
Мөн хувьсагч зарлахад тухайн үүрэнд байгаа хувьсагчийн утгыг систем яг ямар байдалтай чөлөөлсөн тэр хэвээр нь өгчихдаг талтай. Харин жава дээр тийм биш. Заавал null утгаар дүүргэж өгдөг.
Үүнийг ашиглан кракрууд хүний програмыг ачаалаад дуусангууд Үргэлжлүүлээд өөрийн программыг ачаалан цэвэрлэгдэгүй хувьсагч коде-г уншиж аван анализ хийн нууцлал хамгаалалт зэргийг нь эвддэг талтай. Мөн заагч нь юу луу хандаад байгааг систем хянах чадваргүй тул өөр бусад зүйлүүдэд сайнаар ашиглавал сайн муугаар ашиглавал асар их хохирол тарих зүйлүүдийг хийж болно.

No comments:

Post a Comment