Описание прог Artist, Art Studio, Gens3-Mons3, Gens4, Hisoft C v1.1, Hisoft Pascal v1.4, Tasword2 и TLW 1969 г.

HISOFT C Compiler V1.1 - описание типов. Построение выражений. Выполнение команд. Вызов функции. Входное преобразование программ. Директива #include. Использование библиотек функций. Выполнение операций ввода/вывода.


                         -Описание типов-

     Объявление (описание, преобразование) типа аналогично определению
переменной за исключением ключевого слова typedef.
         typedef сhar *PTR,
                      VEC [3];
- определяет тип PTR, идентифицирующий указатель данных типа (char) и
и тип VEC, идентифицирующий 3-х элементный массив данных типа (char).
После такого определения типов можно написать:
         PTR Arr[2], ChrPtr;
         VEC *Ref;

     В первой строке объявляется 2-х элементный массив переменных типа
(PTR), а, следовательно, массив указателей данных типа (char), и
переменная ChrPtr, указывающая на такие данные. Во второй - указатель
данных типа VEC, следовательно, указатель 3-х элементных массивов типа
(char).
     Легко заметить, что такое определение равносильно:

         char *Arr[2], ChrPtr;
         char (*Ref)[3];

     Пример:

         typedef struct List {
               int Data;
               struct List *Linck;
               } LIST;

- LIST является именем типа (struct List). Таким образом декларация
       List Str[3], *Ref; аналогична struct List Str[3], *Ref

            4. Построение  выражений

     Основным элементом языка Си являются первичные выражения. Ими
являются:
-идентификатор:  Volume, Fun и др.;
-литерал:    13, "JB", 'n' и др.;
-некоторое выражение в круглых скобках:   (а + в);
-выражение, представляющее функцию, за которой следует список
аргументов в круглых скобках:  Fun (a,b);
-первичное выражение, после которого стоит выражение в квадратных
скобках: Arr[3+i];
-первичное l-выражение (т.е. выражение, которое стоит слева от знака
или символа = ), представляющее собой структуру, сразу после которой
стоит знак . и идентификатор поля структуры:  Str.Chr;
-первичное выражение, представляющее указатель структуры,
непосредственно после которого стоит символ -> и идентификатор поля
структуры: Ptr -> Chr.
  



   Дополнительные правила:
-l-выражением не является запись, представляющая указатель объекта:
&Fix;
-в записи вида:
      первичное-выражение (список-выражений)
первичное выражение должно представлять функцию: Fun(a,b);
-в записи вида:
      первичное-выражение [выражение]
обязательно одно из выражений должно быть указателем на элементы
массива :  2["Jan"].
     Выражением является выражение с предшествующим оператором
конверсии (имя-типа). Если Exp является выражением, представляющим
некоторое данное, то (имя-типа)Exp является выражением, представляющим
данное типа (имя-типа). Именем типа является запись, состоящая из
описания типа и декларатора. Если, к примеру, Exp-выражение типа
(int *), то (char *)Exp представляет данное типа (char *).
     -1UWAGA-0: В системе Hisoft запись (имя-типа), выступающая в
значении оператора конверсии, должна быть упреждена ключевым словом
cast:   cast(char *)Exp.
     Выражением является имя типа в круглых скобках с предшествующим
оператором размера sizeof. Если Nam - имя типа, то sizeof(Nam)
является выражением, представляющим данные, величиной, равной числу
байт, необходимых для хранения в ОЗУ внутреннего данного типа (Nam).
     -1UWAGA-0: В системе Hisoft имя типа должно быть ключевым
словом, означающим тип, к примеру, int или идентификатор типа.
     -1UWAGA-0: В системе Hisoft оператор sizeof не может относиться
к выражениям.
     Выражением является запись вида:
     l-выражение   оператор-присваивания    выражение
Оператор -присваивания - =, *=, |=, %=, +=, -=, <<=, >>=, &=, ^=  и
!=.  Выполнение операции    а@=в, где @ - один из вышеуказанных
символов, равносильно выполнению операции а=а@в.
     Выражением является запись вида:
     выражение? выражение-1: выражение-2
Если выражение имеет значение, отличное от 0, то результатом 3х
аргументной операции ?: является данное, представленное выражением-1,
в противном случае - выражением-2.
     Пример:

         char Arr[2][2] = {'J', 'a', 'n', 'B'},
              * Ptr;
         main ()
         {
           typedef char *ChrPtr;
           Ptr = cast(Chrtr)(Arr+1)+1;
           printf ("%c%c", **Arr, *Ptr);
         }
   



  Конверсия может быть явной и неявной. Явная конверсия является
выражением с предшествующим ключевым словом cast (только в Hisoft).
В Примере применен оператор конверсии к выражению (Arr + 1). При этом
выражение (Arr + 1), представляющее данное типа (char(*)[2]),
преобразуется в выражение, представляющее данное типа (char *), т.е. в
выражение такого же типа, как и Ptr.
     Если данные типа (char) присваиваются переменной типа (int)
или (unsigned), то при этом самый старший  байт этой переменной
заполнится нулями. И, наоборот, если данные типа (int) или (unsigned)
будут присвоены  переменной тип (char), то переменной присвоится
младший байт данного. А если данное типа (int) присвоить переменной
типа (unsigned) и наоборот, то можно потерять данные.
     Неявная конверсия может выполняться и при выполнении
арифметических операций:
- если некоторый аргумент имеет тип (char), то он будет преобразован к
типу (int);
- если только один аргумент 2х-аргументной операции имеет тип
(unsigned), то второй будет преобразован к этому же типу;
- в других случаях оба аргумента должны быть типа (int), таким же
будет и результат.


                         5. Выполнение команд

     В Си имеются команды-выражения; пустые, групповые и начинающиеся
с ключевого слова. Каждой команде, за исключением групповой,
образующей тело функции, может предшествовать метка или группа меток
через двоеточие:
         fin: return a+b;
     Команда-выражение имеет вид:
         exp; - где exp является произвольным выражением.
При выполнении такой команды происходит вычисление данного,
представленного выражением exp, а затем его игнорирование. При
вычислении 2+(а=5) вычисляется данное, равное 7 и это данное затем
игнорируется.  Т.О  2+(а=5) аналогично а=5.




                           6. Вызов функции

     Вызов функции имеет вид:
     fun (arg1, arg2,... argN)

Пример:

         main ()
         {
          int print ();
          output (13, print);
         }
         output (Num, Fun)
             int Num, (*Fun)();
         {
           (*Fun)("%d", Num);
         }
         print (Fmt, Val)
            char *Fmt;
            int Val;
         {
          printf(Fmt, -Val);
         }

- при выполнении примера будет напечатано  -13. Аргумент print неявно
преобразуется на указание функции print, следовательно, *Fun
представляет функцию printf, а команда:
           (*Fun)("%d", Num);
выполняется как команда   printf("%d",Num)

                  7. Входное преобразование программ

     Интегральная часть компилятора  Hisoft образует процессор -
подсистему, осуществляющую входное преобразование программ.
Директивы процессора отличаются от других записей тем, что они
 находятся в отдельных строках, начинающихся с 'решетки' - #.
     Наиболее часто используемой директивой процессора является
определяющая директива. В общем случае:
       #define  идентификатор  последовательность-лексических-единиц
     При  интерпретации этой директивы последовательность-лексических-
единиц связывается с идентификатором и заменяет его в тексте
программы.

         #define   NULL   0
         #define   TRUE   1
         #define   void   int
         main ()
         {
          void out();
          out ("Izabela");
          }




          void
          out (Name)
            char *Name;
          {
            if (Name == NULL)
                return;
             while (TRUE) {
                printf ("%c", *Name);
             if (*Name++ == NULL)
                return;
              }
          }

                         Директива  # include

     При интерпретации директивы без параметров в процессе
компиляции программы текст из буфера редактора включается в место
появления этой директивы .
     Директива #include с параметрами:
          #include "имя" - включение в место появления директивы
текста из файла 'имя'. При использовании магнитофона, сразу после
использования этой директивы необходимо включить магнитофон.
     В том случае, если файл 'имя'  является библиотекой функций,
к которым есть обращения в программе, то для избирательного включения
их в программу необходимо использовать директиву:
          #include ? имя ?
Пример: Если имеем программу:

         main ()
         {
          sub ();
          fun ();
         }
          sub ()
           { printf ("JanB sub n"); }

а в файле LIBRA имеется текст:

          sub ()
           { printf ("Library sub "); }
          fun ()
           { printf ("Library fun"); }

то выполнение в процессе компиляции двух директив:
                #include
                #include ? LIBRA ?
приведет к появлению программы:




         main ()
         {
          sub ();
          fun ();
         }
          sub ()
           { printf ("JanB sub n"); }
          fun ()
           { printf ("Library fun"); }

                       Директива    # translate 'имя'
Директива выполняется перед компиляцией, что приводит к формированию
программного модуля, размещаемого в файле 'имя' и загружаемого из
Basic'а командами:

         LOAD "имя" CODE
         RANDOMIZE USR 25200.


                  8. Использование библиотек функций

     Совместно с компилятором языка фирма Hisoft поставляет два
модуля; stdio.h  и  stdio.lib.  Первый содержит ряд полезных
определений:
         # define NULL  0
         # define FALSE 0
         # define TRUE -1
         # define EOF  -1
         typedef int FILE;
         extern unsigned strlen ()  и др.;
а так же определение двух функций min ()  и  max ().
     При необходимости, все эти определения и декларации можно
включить в программу:

            #include "stdio.h"
            main ()
            {  printf("%d", max('J','B'));  }

или

            #include "stdio.h"
            main ()
            {  printf("%d", strlen("JB"));  }
            #include ? stdio.h ?

     Описание содержимого файлов stdio.h и stdio.lib приведено в
Приложении С. Можно создавать и собственные библиотеки, создав в
редакторе последовательность описаний и выполнив директиву редактора :
p1,9999,JB.LIB.





                 9. Выполнение операций ввода/вывода

     В процессе операций ввода/вывода происходит обмен информации
между массивами данных и оборудованием. Связь файла с массивом или
оборудованием осуществляется с помощью функции fopen(), а прекращение
этой связи - fclose(). Идентификация файла происходит с помощью
файлового указателя, получаемого как результат функции fopen. Этим
указателем является данное типа (FILE *), зависящее от реализации и
определенное в файле stdio.h. В системе Hisoft тип FILE определен с
помощью директивы:
         typedef  int  FILE;  т.е. он не отличается от типа (int)
     Специальным образом трактуются три файла: стандартный файл ввода,
стандартный файл вывода и стандартный файл сообщений об ошибках.
В системе Hisoft стандартный файл ввода связан с клавиатурой, а файлы
вывода и сообщений об ошибках - с верхней частью экрана. При
обмене с клавиатурой, экраном и принтером, следовательно, не требуется
предварительное выполнение функции fopen. Если  тип (STREAM) определен
как:
         typedef  FILE *STREAM;
то установится следующее соответствие:

         Оборудование                      Файловый указатель

          клавиатура                       cast(STREAM) 0
   верхняя часть экрана                    cast(STREAM) 0
   нижняя часть экрана                     cast(STREAM) 1
   верхняя часть экрана                    cast(STREAM) 2
           принтер                         cast(STREAM) 3

     Некоторые функций, неявно связанных со стандартными файлами
(printf и др.), могут быть вызваны без установки файлового указателя.

                    Функция  fopen  (встроенная)
              FILE *fopen (name, mode)
                 char *name, *mode;

     При вызове функции открывается файл, связанный с массивом name, в
режиме, установленным аргументом mode:
                        mode = "r" - файл на ввод;
                        mode = "w" - файл на вывод.

     Результатом функции является файловый указатель, идентифицирующий
открытый файл. Если файл открыть невозможно, то результат - пустой
указатель (NULL)

                    Функция  fclose (встроенная)
                       FILE *ptr;
 



    Выполнение функции fclose приводит к закрытию файла,
идентифицируемого указателем ptr. Если файл был открыт на вывод, то
его закрытие будет сопровождаться знаком 'конец файла' - EOF, которым
в Hisoft является (SS+I) или -1.

         typedef  int  FILE;
         main ()
         {
           FILE *out, *fopen();
           out = fopen("JANB","w");
           putc ('J', out);
           putc ('b', out);
           fclose (out)
         }

- выполнение функции fopen приводит к открытию файла, связанного с
массивом JANB, на вывод. Результатом функции является файловый
указатель, идентифицирующий упомянутый файл. Этот указатель присвоен
файловой переменной out, к которой имеются обращения в функциях putc и
fclose. Таким образом, выполнение этих функций в общем случае
относится к массиву JANB. Выполнение функции fclose приводит к
закрытию файла, дополнив оный EOF.

                    Функция  getc  (встроенная)

                   int getc (inp)
                    FILE *inp

     Вывод очередного знака из файла inp. Результатом функции является
 данное типа (int) величиной, равной коду введенного знака.

                    Функция  ungetc  (встроенная)

                     ungetc (с,inp)
                       char с;
                       FILE *inp

     Возврат в файл inp, символа, представленного с.Возврат заключается
в том, что при последующем выполнении функции getc осуществляется
доступ к возвращенному символу.


                    Функция  putc  (встроенная)

                   int putc (с,out)
                    char c;
                    FILE *out;

     Вывод в файл out знака с. Результатом функции является данное
типа (int) величиной, равной коду введенного знака.




         typedef int FILE;
         typedef FILE *STREAM;
         # define EOF (-1)
         # define monitor cast(STREAM)0
         main ()
         {
           FILE *inp, *fopen ();
           int ch;
           if (inp=fopen("stdio.h","r")) {
              while ((ch=getc(inp))!=EOF)
                 putc (ch,monitor);
              putc ('n', monitor);
              }
         }

- вывод файла stdio.h на монитор.


                    Функция  getchar  (встроенная)

                   int getchar ()

     Ввод одного символа из стандартного файла ввода. Результат
функции - данное типа (int), равное коду введенного символа или EOF.


                    Функция  putchar  (встроенная)

                   int putchar (с)
                        int с;

     Вывод в стандартный файл вывода одного знака с кодом с. Результат
функции - данное типа (int), равное коду выводимого знака.

         # define EOF (-1)
         char flag;
         main ()
         {
           int ch;
           if ((ch = getchar() ) != EOF)
                main ();
           if ( !flag ) {
                flag = 1;
                putchar ('n');
                }
           putchar (ch);
         }

- ввод с клавиатуры последовательности знаков, оканчивающейся EOF, а
затем вывод этой последовательности в обратном порядке.
 




                    Функция  printf (встроенная)

                   printf (fmt, p1, p2, ..., pn)
                     char *fmt;

     Выполнение данной функции приводит к выводу в стандартный файл
вывода под управлением списка форматов fmt данных, представленных p1

... рn. Функция printf может быть вызвана с переменным числом
аргументов; на один больше, чем форматов конверсии, содержащихся в
последовательности fmt. Каждый формат, если он существует, состоит из
последовательности знаков, начинающейся с символа % и заканчивающейся
одной из букв: d, o, х, u, с, s.

     % - начало формата преобразования. Означает, что выводимая
последовательность должна быть выровнена в выходном поле влево;

     d - вывод аргументов в виде десятичных чисел;
     о - вывод аргументов в виде восьмеричных чисел;
     х - вывод аргументов в виде шестнадцатеричных чисел;
     u - вывод аргументов в виде числа без знака;
     с - вывод аргументов в виде одного знака;
     s - вывод последовательности знаков, указанных аргументом.
         printf("Any Text" );  --->   Any Text
         printf("(%-2d)",5); --->     (5)
         printf("(%4.3s)","JanB"); ---> (Jan)
         printf("%c",'B');  --->      B
         printf("%x", -1);  --->      FFFF


                    Функции  fprintf (встроенная)

                   fprintf (out,fmt, p1, p2, ..., pn)     ;
                     FILE *out;
                     char *fmt;

     Вывод в файл, идентифицированный out, в формате fmt переменных p1
- pn. Аналогична printf; может быть вызвана с переменным числом
аргументов.

 



                   Функция  sprintf (встроенная)

                   sprintf (str,fmt, p1, p2, ..., pn)
                     char *str;
                     char *fmt;

     При выполнении этой функции данные p1 - pn размещаются в поле
памяти str под управлением fmt. Функция может быть вызвана с
переменным числом аргументов.

         # include "stdio.h"
         FILE *Inp, *fopen ();
         char Number[7];
         int Ind, Ch, Count;
         main ()
         {
            if (Inp=fopen("Janek","r")) {
               while ((Ch = getc(Inp)) != EOF)
                  Count++;
               sprintf (Number, "%u%c", Count, '');
                 while (Number[Ind] == ' ')
                     Number[Ind++] = '*';
               printf ("Janek zawiera %s znakow", Number);
               }
         }

- подсчет знаков в файле Janek и вывод в виде:
       Janek zawiera **** 13 znakow


                    Функция  scanf (встроенная)

                   int scanf (fmt, p1, p2, ..., pn)
                     char *fmt;

     Выполнение данной функции приводит к вводу из стандартного файла
ввода под управлением форматов fmt установленного числа знаков,
трактовку их как последовательность величин переменных и присвоение
этих величин аргументам p1 ... pn. Функция может быть вызвана с
переменным числом аргументов, зависящим от числа форматов. Каждый
формат, если он имеется, состоит из последовательности знаков,
начинающейся с символа % и кончающейся одной из букв: d, o, x, c, s.
Последовательность знаков, указанных fmt, в общем случае состоит из
пробела, знаков, отличных от пробела, и форматов преобразования. Если
в такой последовательности присутствует пробел, во входном файле ему
должна соответствовать последовательность отступов (пробелы, знаки
табуляции и знаки новой строки). Если в рассматриваемой
последовательности присутствует знак, отличный от пробела, то во
входном файле должен присутствовать такой же знак. Если же имеет место
быть указатель преобразования, то он определяет размер и способ
интерпретации следующего поля входного файла. Такое поле
ограничивается ближайшим отступом, но если в формате указана величина




поля, то поле имеет не больше знаков, чем указано в формате. Если
после знака % стоит знак *, то ближайшее поле входного файла
игнорируется.
     Очень важно, чтобы тип переменных, указываемых аргументами
функции scanf, соответствовал форматам. К примеру, если был
использован формат %d, то переменная, указанная аргументом, может быть
типа (int), но не может быть типа (char).
     Результатом функции scanf является данное типа (int), равное
числу переменных, которым были присвоены данные или EOF.

                    Функция  fscanf (встроенная)

                   int fscanf (inp,fmt, p1, p2, ..., pn)
                     FILE *inp;
                     char *fmt;

     Ввод из файла, указанного inp,  под управлением fmt ....
Аналогично scanf.

                    Функция  sscanf (встроенная)

                   int sscanf (str,fmt, p1, p2, ..., pn)
                     char *str;
                     char *fmt;

     Ввод из поля памяти, указанного str, под управлением fmt
установленной последовательности знаков и т.п. Аналогично scanf.

         int myAge;
         char Sep;
         char myName[20];
         main ()
         {
           sscanf("Age=44 JanB=Janek",
                  "Age=%d%c%*5s%3s",
                  &myAge, &Sep, myName);
           printf ("%sis%dcnow", myName, myAge, Sep);
         }

- печать  Jan is 44 now.

                    Функция  raw (встроенная)
                        raw ()
     ВВод с клавиатуры одного символа без вывода его на экран и без
передвижения курсора. Результат функции - переменная типа (int), равная
коду введенного символа.
 



                   Функция  keyhit (встроенная)
                      int keyhit ()

     Проверка буфера клавиатуры на предмет наличия невведенного
символа. Результат функции - переменная типа (int), имеющая величину
0, если буфер чист и 1 (истина), если в буфере клавиатуры имеется
невведенный символ.



СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Интервью - Сегодня у нас в гостях cyberm00h.
Интервью - интервью организатора группы Power of Sound, Кудрявцева И.В. (Himik ZxZ).
Информбюро - Путеводитель по журналу.
Paradox 2000 - Интервью: Disabler/Disabler Production Laboratory.
Письмо №317 - Вологда

В этот день...   26 апреля