DonNews #11
21 апреля 2000
  Софт  

Софт - Описание компилятора С для спектрума.

<b>Софт</b> - Описание компилятора С для спектрума.
──────────────────────────────────────────
Disabler/DPL


      Несколько слов о приложении...

  Сегодня у  нас  в  приложении: Hisoft  C
compiler или говоря по русски - компилятор
для хайсофтовского C. Просьба  не  кричать
типа: да  зае..ли  этим  отстоем!  Но   вы
будете не  правы. Данная  версия  является
наиболее   рабочей   из   тех,  что    мне
попадались, к  тому  же  я  взял  на  себя
смелость  немного  заREMIXить  его.  Итак,
грузим его и видим - ZX-IBM  Text  Editor!
Но не всё  так  просто! Он  переделан  для
работы  с  текстами  Hisoft  C, и  ещё,  я
поменял местами PgUp и PgDown, так удобнее
листать. А  где-же  Це  минус  минус??? Ну
чтож,  вопрос   закономерный!   Попробуйте
выбрать Quit в меню File и вы его найдёте.
Да, ежели вы возжелаете вернуться назад  в
редактор выйдите из компилера (Edit, B).
  А теперь немного описания самого языка и
команд компилятора:

  Выходим в компилятор и набираем:

main()
{
 printf("nHello Everybody!n");
}

нажимаем SS+I (для компиляции) и, если  вы
не  ошиблись  появится: "Type  Y  to  run"
(нажми Y для запуска). Нажимаем и видим:

Hello Everybody!

Type Y to run

Понажимав Y несколько раз вы  устанете, но
это  только  начало! Такой  ввод  программ
годится  для  маленьких  програмок,  более
серьёзные  надо  набирать  в  редакторе, в
который можно попасть нажав  Edit  (CS+1).
Редактор здесь описываться не будет, т. к.
он полный  MustDie  (Если  кто  работал  в
Gens'е  меня   поймут).  Вам   понадобятся
только две команды редактора: "B"  и  "C".
Команда "B"  (Back, Basic, Bye, Bitch :) )
поможет вернуться в  нормальный  редактор.
Команда "C" (Compiler) вернёт вас в  режим
компилятора.


      Основные команды компилятора.

  Все команды компилера начинаются с диеза
(#). Всего их три штуки:

            Командя "#include"

    #include (без параметров)

  Вставка  текста  из  буфера   редактора.
Впринципе данный вид этой команды  вам  не
понадобится (надеюсь, что никогда!).

    #include 1:filename

  Вставка  текста  с  диска. Цифра - номер
диска, после   двуеточия   идёт   название
исходняка.

    #include 1:?filename?

  Подключение  из  библиотеки  только  тех
функций, которые  используются   в   вашей
программе.

             Команда "#list"

    #list-

  Данная команда  запрещает  вывод  текста
программы   при   компиляции.  На   стадии
отладки изпользовать не рекомендуется.

    #list+

  Команда обратная "#list-"

           Команда "#translate"

    #translate 1:filename

  Используется для  компиляции  программы.
Работает совместно с #include. Например:

#translate 1:compile
#include 1:coolprog

После компиляции программы и нажатия  SS+I
вы  получите  на  диске  файл  под  именем
compile, который можно запустить набрав  в
Basic'е следующее:

Rand Usr 15619: Rem: Load "compile" Code
Rand Usr 25200



            Структура программ

  Для C любая  программа  это  функция  со
стандартным именем  main(). Все  остальный
функции в  программе  могут  находиться  в
любом её  месте, т. е. имеется  ввиду, что
нет  разницы, где  находятся  функции,  до
main() или после.

  В  "С"  нет  разделения  на  функции   и
операторы, они равноправны. Т. е. оператор
может  возвращать   значение,  а   функция
может не возвращать. И операторы и функции
должны иметь  параметры. Если  их  нет, то
после имени должны стоять пустые скобки.

  Простейшая программа на С имеет вид:

  main();

  В любой функции С можно выполнить только
один оператор. Если  необходимо  выполнить
более одного, прибегают к такой  вещи, как
составной оператор. Он начинается со знака
"{" и заканчивается знаком  "}". Операторы
внутри составного разделяются ";",  каждый
оператор заканчивается ";". Например  если
надо выполнить два оператора печати -  это
будет иметь вид:

  { printf("Hi "); printf("All!"); }

  Таким  образом, программа, которая   это
делает будет выглядеть следующим образом:

  main()
   {
    printf("Hi ");
    prinft("All");
   }


             Типы переменных

  Для   С   несколько    типов    являются
стандартными, все они целые, это:

┌─ Тип ────┬─ Значение ──────────────────┐
│ char     │ беззнаковый однобайтный     │
│          │ 0..255 (любой символ)       │
│ int      │ знаковый двубайтный         │
│          │ -32768..+32767              │
│ unsigned │ беззнаковый двубайтовый     │
│          │ 0..65535                    │
└──────────┴─────────────────────────────┘

  Так-же можно определить любой  свой  тип
командой  typedef,  например,  определение
файлового типа:

typedef int file;


          Объявление переменных

  Каждая переменная  перед  использованием
должна быть объявлена  и  ей  должен  быть
присвоен один  из  типов, заданных  ранее,
при этом переменной можно задать начальное
значение. Например, нам для двух вложенных
циклов  нужно  объявить   три   переменных
целого типа, при этом  двум  из  них  надо
задать начальное значение:

int i=0, sum=0;
main()
{
 int j;
 for(;i<=10;i++)
  for(j=0;j<11;j++)
   sum+=i+j;
}

В примере вам встретились три команды, о
которых вы (наверное) ничего не знаете:

  "sum+=i+j" -  логика  комады  проста  до
безобразия.   Она    является     аналогом
"sum=sum+i+j", т. е. sum+=1  и   sum=sum+1
являются    обсолютно    одинаковыми.   По
аналогии строятся команды -=, *=, и т.д.
  "i++" -  постфиксная  форма  инкремента.
Работает   следующим    образом:   берётся
переменная i, используется для вычислений,
после  чего  увеличивается   на   единицу,
например:

Имеем: a=10, b=25
Вычисляем: a+=(b++) /* Постфиксный
                        инкремент */
Получаем: a=35, b=26

Имеем: a=10, b=25
Вычисляем: a+=(++b) /* Префиксный
                        инкремент */
Получаем: a=36, b=26

Имеем: a=10, b=25
Вычисляем: a+=(b--) /* Постфиксный
                        декремент */
Получаем: a=35, b=24

Имеем: a=10, b=25
Вычисляем: a+=(--b) /* Префиксный
                        декремент */
Получаем: a=34, b=24

PS: Просьба не путать  с  экскрементами:),
    это совершенно резные вещи!!!

Можно также просто написать b++

  И  последняя  команда: for.  Eё   формат
такой:

for(<выр.1>;<выр.2>;<выр.3>) оператор;
где:
выр.1 - любое  выражение   для   установки
        начальных значений цикла.
выр.2 - выражение,   проверяющее     конец
        цикла, т. е. for   работает   пока
        выр.2 истина.
выр.3 - изменение параметров цикла.

Если  вам  не  понятно, как  он   работает
приведу пример на Basic и на C:

Rem Basic prog.
Let a = 0
For i=1 to 14 Step 2
 Print i; " - "; i^2
 a = a + i
Next i
Print a

/* C prog. */
Int a = 0;
Main()
{
 Int i;
 For(i=1; i<=14; i+=2)
  {
   Printf("n%d - %d",i,i*i);
   a+=i;
  }
 Printf("n%d",a);
}

Тут у нас встретилась команда  "Printf"  с
каким  то   набором   символов.  Как   вы,
наверно, догадались - это оператор печати,
но  не  простой! Он  работает  ТОЛЬКО   по
формату  печати, а  формат  такой: вначале
оператора в кавычках  пишется  управляющая
строка,   а    потом     через     запятую
перечисляется    то,    что     необходимо
напечатать. Управляющие символы начинаются
со знака  ""  (обратный  слэш), а  формат
данных со  знака  "%"  (процент). Всё, что
неподходит под формат управляющей строки -
напямую посыляется на  печать. Если  после
знака   ""    стоит    число,   то    оно
воспринимается как код символа для печати,
например кавычку можно напечатать так:

     Printf("34"); /* 34 - код " */

Кроме   того   определены   ряд    знаков,
воспринимаемых после "" как управляющие:

n - перевод строки
 - печать символа 
' - печать символа '
" - печать символа "

             Форматы печати:

%d - печать десятичного числа
%o - ... восьмеричного ...
%x - ... шестнадцатиричного ...
%u - ... беззнакового ...
%c - ... одного символа
%s - ... печать строки


                Указатели

  Довольно  интересная   штука.  Если   вы
юзаете пц, то неумелое  обращение  с  ними
может подпортить его, что я  собственно  и
сделал  при  написании   маааленького,  но
коварного вируса, но это другая тема.
  Итак,   что    такое    указатель?   Это
переменная, которая  в   качестве   своего
значения    использует    адрес     другой
переменной, или, говоря проще, это  ссылка
на переменную. Указатели в  С  применяются
довольно активно, например  для  записи  в
память байта, или его выборки, а так же  в
функциях  с   неопределённым   количеством
параметров, например в  операторе  printf,
мы задаём управляющую  строку, по  которой
он  выбирает  из  памяти  переменные   для
печати.
  Объявить указатель на переменную можно
так:

  typedef char *ukaz;

  В данном случае будет объявлен указатель
на переменную типа char. Знак  "*"  служит
для определения того, что  это  указатель.
Существует  ещё  один  знак, это  "&".  Он
позволяет раз'адресовать переменную, т. е.
обратиться к её адресу. Пример:

 typedef char *ukazat;
 main()
  {
   char litter;
   ukazat=&litter;
   printf("nAdr is %u",*ukazat);
  }

  В примере объявляется  указатель  ukazat
на тип char и переменная litter типа char,
после   чего    указателю    присваивается
значение адреса переменной и выводится  на
экран. Я  думаю  это  понятно. Если   нет,
приведу ещё один примерчик:

  poke(addr, data);
  unsigned addr;
  char data;
  {
   typedef char *ukazat;
   *cast(ukazat)addr=data;
  }

  Я думаю, по  названию  вы  догадались  о
том, что эта  функция  делает. Это  аналог
команды poke на  basic'е. Она  ложит  байт
"data" по адресу "addr". Вас  должна  была
смутить строка: *cast(ukazat)addr=data, но
это закономерно. Оператор "(ukazat)" - это
приведение     к      типу,     а      вся
последовательность делает следующее: берёт
переменную  addr, приводит   её   к   типу
указателя на переменную  типа  char, после
чего помещает по этому  адресу  переменную
data, типа char.


                Заключение

  В следующем номере, если  будут  отзывы,
вы сможете прочитать дальнейшую информацию
по  языку   C.  Если   возникли   вопросы,
пожелания, предложения - пишите.
  Если вас заинтересовали языки я  приведу
маленький список  тех, о  которых  я  могу
поведать: Basic (ZX/PC), Quick Basic (PC),
Visual Basic (PC), Mega Basic  (ZX), Laser
Basic (ZX), Beta Basic (ZX), Hisoft Pascal
(ZX), Borland Turbo Pascal (PC), Hisoft  C
(ZX), Borland C++ (PC), C++ Builder  (PC),
FoxPro   (PC)   -    Система    Управления
Реляционными Базами Данных, Auto Lisp (PC)
- язык  обработки  графических  приложений
AutoCad,  SQL   (PC)  -   язык   запросов,
Assembler (ZX).

  И напоследок, если у вас есть какие либо
языки для speccy  -  убедительная  просьба
выслать и в качестве bonus'а  вы  получите
диск со всеми языками, которые когда  либо
были созданны на speccy, от модификаций  и
компиляторов    Basic,   Pascal,   C    до
ассемблеров (все последние версии).

  Да, ещё, собирается колекция командеров!
Если у вас есть командер, не  указанный  в
списке   или   поновее   версия,  то   plz
вышлите. Bonus  -  как  и   в   предыдущей
прозьбе!

          Honey Comm. 4.00 (атм)
       Honey Comm. 4.512 (pentagon)
               MOA Service
     Luxe Copy 512 (pent) + protector
             Quick Comm. 2.3
             Global Comm. 1.1
             Smash Comm. 2.0
            Conver Comm. 4.61
            Perfect Comm. 1.5
            Consul Comm. 3.33
             Total Comm. 1.4
               F Comm. 4.01
             Max Petrov Comm.
             Rst#7 Comm. 2.0
         E-mage Work Station 1.00
              Real Comm. 1.9
            Direct Comm. 3.04R
         Neos Comm. (alpha ver.)

  Последняя прозьба: собирается  коллекция
boot'ов   (сейчас   около    ста    штук).
Принимаются в четырёх наминациях:
Hidden boot - распологаетса нулевом треке;
System boot - быстрый boot  для  системных
дисков, главное - много файлов видно сразу
и можно быстро запустить любой из них;
Protect  boot  -   boot   с   защитой   от
копирования  (фирменные   boot'ы)  и   для
защиты от копирования;
Demo boot  - красивый  boot, желательно  с
музыкой.



Другие статьи номера:

От авторов - Причины задержки номера.

Новости - Состояние дел у Ростовских спектрумистов: Disabler, Klim, Wild, Dimon, The Rom.

Paradox 2k - Информация о ростовской demo-party: paradox 2k

Millennium party - Информация о проведении Минского демопати.

Forever 2E3 results - Финальные результаты.

Софт - Описание компилятора С для спектрума.

Софт - небольшой обзор системного софта: UltraSonic version 2.,Shuffle Commander v1.0, Elastic Copy v1.0, Strange Player v3.0, Screen Mixer v1.0, ZX C++, Smagly 3, Quick Commander 2.4.

Программирование - Алгоритм защиты диска от копирования.

Кодинг - Заливка замкнутой области на экране.

кодинг - Алгоритм спектрального анализа звука в реальном времени.


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

Похожие статьи:
Розыск - Розыскивается: DARKMAN.
Авторы - Над номером работали...
О разном - Через несколько лет наступят времена "революции домашних компьютеров".
От редакции - мы взваливаем на себя нелегкую ношу производства качественного и интересного спектрумовского журнала.
Программы - Презентация проигрывателя мелодий X-Player v7.0 и теста конфигурации компьютера Test Machine v5.03

В этот день...   21 ноября