Языки программирования - концепции и принципы

Можно задать для параметра доступ


Можно задать для параметра доступ только для чтения, объявив его константой:

void proc(const Car_Data & d)

{

     d.fuel = 25;                                          // Ошибка, нельзя изменять константу

}

    Объявления const следует использовать возможно шире, как для того, чтобы сделать смысл параметров более прозрачным для читателей программы, так и для того, чтобы отлавливать возможные ошибки.

    Другая проблема, связанная с параметрами в языке С, состоит в том, что массивы не могут быть параметрами. Если нужно передать массив, передает­ся адрес первого элемента массива, а процедура отвечает за правильный до­ступ к массиву. Для удобства имя массива в качестве параметра автоматически рассматривается как указатель на первый элемент:

intb[50];                                           /* Переменная типа массив */                           



C

void proc(int a[ ])                            /* "Параметр-массив" */

{

а[100] = а[200];                             /* Сколько элементов? */

 }

proc(&b[0]);                                 /* Адрес первого элемента */

proc(b);                                         /* Адрес первого элемента */

Программисты, пишущие на С, быстро к этому привыкают, но, все равно, это является источником недоразумений и ошибок. Проблема состоит в том, что, поскольку параметр — это, фактически, указатель на отдельный элемент, то допустим любой указатель на переменную того же типа:

int i;

void proc(int a[ ]);                     /* "Параметр-массив" */

proc(&i);                                   /* Допустим любой указатель на целое число!! */

Наконец, в языке С контроль соответствия типов никак не действует между файлами, поэтому можно в одном файле поместить

 

C

[С] void proc(float f) { ...}                           /* Описание процедуры */    

                        

а в другом файле —

C

void proc(int i);                                           /* Объявление процедуры */                           ргос(100);


Содержание раздела