Страница 21 из 56
файла (имя которого вводится в командной строке) на экран.
Турбо Паскаль Турбо Си
----------------------------------------------------------------
program DumpIt; # include
void swap (float *x, float *y);
Теперь, если вы прокомпилируете вашу программу с оператором
swap(q,r), вы получите ошибку, сообщающую, что вы имеете несоот-
ветствие типов при вызове swap.
Ошибка #3: пропуск скобок при вызове функции.
-----------------------------------------------------------------
В Паскале, процедура, не имеющая параметров, вызывается
просто по имени:
AnyProcedure;
i := AnyFunction;
В Си, название функции, если даже нет параметров, должно
всегда содержать открытые и закрытые скобки. Легко ошибиться так:
AnyFunction; /*Нет никакого действия*/
i = AnyFunction; /*Присвоение i адреса AnyFunction */
когда вы действительно хотели:
AnyFunction(); /*Вызвать AnyFunction*/
- 173,174 -
i = AnyFunction(); /*Вызвать AnyFunction, присвоить
результат i */
Ошибка #4: предупреждающие сообщения.
-----------------------------------------------------------------
В добавление к основным ошибочным сообщениям, Турбо Си также
выдает предостережения о не фатальных ошибках. Используя некор-
ректную функцию вызова из предшествующего примера, Турбо Си может
выдать следующие предостережения:
Warning test.c 5: Code has no effect in function main
(код не исполняется в основной функции)
Warning test.c 6: Non-portable pointer assigment in
function main
(в основной функции присваивается не мобильный
указатель)
Оба оператора действительно законны, и так как ошибки не
имели место, может быть создан файл .OBJ. Остерегайтесь! Эти типы
предупреждений будут всегда при фатальных ошибках. Не относитесь
к предостережениям легкомысленно.
Ошибка #5: индексация в многомерных массивах.
-----------------------------------------------------------------
Предположим, вы имеете двумерный массив, названный matrix, и
хотите сослаться на ячейку памяти (i,j). Как программист на Пас-
кале, вы склоны записать это следующим образом:
x = matrix [i,j];
Это вполне возможно, однако не делайте так.
В Си это означает серию выражений, отделенных запятыми; в
этом случае, полное выражение берет величину из последнего выра-
жения, так предшествующий оператор является эквивалентом
x = matrix[j];
- 175,176 -
Это не то, что вы хотели, но это законченный оператор в Си.
Все, что вы получите, это предостережение, так как Си думает, что
вы пробуете присвоить x адрес matrix [j], то есть j-той строки. В
Си вы должны явно индексировать каждый массив. Так вам надо напи-
сать
x = matrix[i] [j];
Памятка. Для многомерного массива каждый индекс заключается
в отдельные скобки.
Ошибка #6: Забывание о различиях между символьными