Язык С




Область действия - часть 2


в файле 1: ----------

INT SP = 0; /* STACK POINTER */ DOUBLE VAL[MAXVAL]; /* VALUE STACK */

в файле 2: ----------

EXTERN INT SP; EXTERN DOUBLE VAL[];

DOUBLE PUSH(F) {...}

DOUBLE POP() {...}

CLEAR() {...}

так как описания EXTERN 'в файле 1' находятся выше и вне трех указанных функций, они относятся ко всем ним; одного набора описаний достаточно для всего 'файла 2'.

Для программ большого размера обсуждаемая позже в этой главе возможность включения файлов, #INCLUDE, позволяет иметь во всей программе только одну копию описаний EXTERN и вставлять ее в каждый исходный файл во время его компиляции. Обратимся теперь к функции GETOP, выбирающей из файла ввода следующую операцию или операнд. Основная задача прос- та: пропустить пробелы, знаки табуляции и новые строки. Если следующий символ отличен от цифры и десятичной точки, то возвратить его. В противном случае собрать строку цифр /она может включать десятичную точку/ и возвратить NUMBER как сигнал о том, что выбрано число. Процедура существенно усложняется, если стремиться пра- вильно обрабатывать ситуацию, когда вводимое число оказыва- ется слишком длинным. Функция GETOP считывает цифры подряд /возможно с десятичной точкой/ и запоминает их, пока после- довательность не прерывается. Если при этом не происходит переполнения, то функция возвращает NUMBER и строку цифр. Если же число оказывается слишком длинным, то GETOP отбрасы- вает остальную часть строки из файла ввода, так что пользо- ватель может просто перепечатать эту строку с места ошибки; функция возвращает TOOBIG как сигнал о переполнении.

GETOP(S, LIM) /* GET NEXT OPRERATOR OR OPERAND */ CHAR S[]; INT LIM; { INT I, C;

WHILE((C=GETCH())==' '\!\! C=='\T' \!\! C=='\N') ; IF (C != '.' && (C < '0' \!\! C > '9')) RETURN(C); S[0] = C; FOR(I=1; (C=GETCHAR()) >='0' && C <= '9'; I++) IF (I < LIM)

S[I] = C; IF (C == '.') { /* COLLECT FRACTION */ IF (I < LIM) S[I] = C; FOR(I++;(C=GETCHAR()) >='0' && C<='9';I++) IF (I < LIM) S[I] =C; } IF (I < LIM) { /* NUMBER IS OK */ UNGETCH(C); S[I] = '\0'; RETURN (NUMBER);




Содержание  Назад  Вперед