TX Library Help – Version: 00173a, Revision: 105
 ALL  Windows graphics in a sandbox

Пример: Простейший


Простейшая программа

Простейшая программа на С (или С++) состоит из двух частей: раздела подключения библиотек и главной функции программы. Рассмотрим пример, в котором рисуется на экране простой рисунок.


Раздел подключения библиотек

Директивы (команды) подключения библиотек находятся обычно в начале файла программы и выглядят обычно так:

    #include <stdlib.h>
    #include "TXLib.h"

Stdlib.h и TXLib.h - файлы библиотек, которые подключаются к вашей программе. После этого вы можете использовать команды, функции и переменные, объявленные в этих файлах. Больше, чем нужно, библиотек подключать не стоит, хотя это и не вредно. Когда используется много библиотек, раздел может быть очень большим.


Главная функция программы

Программа на С (С++) состоит из функций. Функция - это описание каких-либо действий с заданным именем (названием).

Например,

    int main()
        {
        txCreateWindow (800, 600);
        txLine (320, 290, 320, 220);
        return 0;
        }

Главная функция - это функция, с которой начинается исполнение программы. Ее имя - main(). Скобки показывают, что речь идет именно о функции, т.е., об описании каких-то действий. Для того, чтобы функция начала работу, ее нужно вызвать. Функцию main() вызывает сама операционная система компьютера. Слово int означает, что main() в конце работы передаст тому, кто ее вызывал (операционной системе), некое целое число. Это число для функции main() означает код завершения нашей программы. Если он равен 0, то работа программы считается успешной.

Действия, записанные в функции, заключаются в фигурные скобки { и }. Они обозначают начало и конец функции.

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

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

Пример плохо написанной программы:

    #include "TXLib.h"
    int   main(){
    txCreateWindow(800,600);  // По-моему, про зрение все ясно. :)
    txLine(320,290,320,220);
     txLine (320, 290,280,350);
      txLine(320, 290,360,350);
     txLine(320,230,270,275);
    txLine(320,230, 400,220);
    txCircle(320,190,30);
      txSelectFont( "Times",60);
    txTextOut(240,400,"Hello, world!");
              return        0;
    }

Для задания положения рисуемых фигур используется координатная система, у которой начало координат расположено слева-вверху, а ось OY смотрит вниз. Это несколько непривычно, но деваться некуда. :) Например, команда

    txLine (320, 290, 320, 220);

проводит линию из точки x=320 и у=290 в точку с x=320 и y=220.

Каждая команда заканчивается точкой с запятой. Это - аналог точки в русском языке. Точка с запятой ставится в конце каждого законченного действия или объявления. Например, в строке с txCreateWindow (800, 600) точка с запятой ставится, т.к. в этой строке "закончена мысль" о том, что надо создать окно для рисования. В строке с int main() - не ставится, т.к. описание функции main() не закончено (на самом деле, оно там только начато).

Если в программе используются строки, они заключаются в двойные кавычки, например:

    txTextOut (240, 400, "Hello, world!");

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


Распространенные ошибки и борьба с ними

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

Второе правило: будьте внимательны. Об этом см. ниже.

Третье правило   волшебника:   ищите ошибку вначале у себя, а только потом в библиотеках. Библиотеки достаточно долго тестировались, поэтому вероятность ошибки в них очень мала.

Ошибки, не связанные с текстом программы
  • Вначале убедитесь, что файл с программой имеет правильное расширение ".CPP", а не расширение ".C". Если расширение (тип) файла неправильное, то в списке ошибок одной из первых будет сообщение "TXLib.h: Must use C++ to compile TXLib.h". Это потому, что для библиотеки требуется компилятор C++, а он транслирует файлы с расширением ".CPP". Файлы ".C" транслирует компилятор Cи, а не C++.
    Чтобы сменить расширение файла, выберите в главном меню [File], [Save As] и дайте программе имя с расширением ".CPP". Лучше не использовать ни русских букв, ни пробелов в имени файла.
  • Если файл библиотека TXLib установилась неверно, то файл TXLib.h может быть не найден. Сообщение об ошибке зависит от компилятора, но будет содержать фразу, подобную "TXLib.h file not found". В этом случае выйдите из среды программирования и переустановите TXLib. Если это не помогает, то просто скопируйте файл TXLib.h из папки TX в папку с примерами или в папку с вашей программой.
Ошибки, связанные с текстом программы

В простых программах ошибки бывают двух видов:

  • Ошибки записи (орфография, пунктуация) - их называют синтаксическими ошибками (syntax error). Они происходят до запуска программы, на стадии перевода программы в машинный код (стадии компиляции). Поэтому их называют ошибками времени компиляции (compile-time errors). Исполняемый файл при этом не создается и программа не запускается.
  • Логические ошибки - они происходят после запуска программы, при этом при компиляции ошибок нет (иногда имеются предупреждения, warnings, которые полезно исправлять, а лучше не допускать их появления). Их называют ошибками времени исполнения (runtime errors).
Ошибки времени компиляции

Практически все синтаксические ошибки на этой стадии происходят из-за невнимательности. Распространенные синтаксические ошибки:

  • Путают ключевые слова, названия библиотек и команд:
          #iclude "TX lib.h"                // Правильно: #include "TXLib.h"
          in maim()                         // Правильно: int main()
          tx Line (10, 10, 20, 20)          // Правильно: txLine (10, 10, 20, 20);
    
  • Путают большие и маленькие буквы:
          txcircle (100, 100, 10)           // Правильно: txCircle
    
  • Не ставят скобки:
          int main                          // Правильно: int main()
    
  • Забывают запятые или путают их с другими знаками:
          txСircle (100  100  10)           // Правильно: txCircle (100, 100, 10);
          txСircle (200; 200; 20)           // Правильно: txCircle (200, 200, 20);
    
  • Забывают точки с запятой:
          txSelectFont ("Times", 60)        // Правильно: txSelectFont ("Times", 60);
    
  • Забывают или путают кавычки:
          txSelectFont (Times, 60)          // Правильно: txSelectFont ("Times", 60);
          txSelectFont ('Arial', 20)        // Правильно: txSelectFont ("Arial", 20);
    
  • Ставят лишние точки с запятой там, где "мысль не закончена":
          int main();                       // Правильно: int main()
    
  • Указвают дробную часть числа не через точку, а через запятую:
          3,1415                            // Правильно: 3.1415
    
  • Забывают фигурные скобки:
                                            // Правильно: int main()
          int main()                        //            {
          txCreateWindow (800, 600);        //            txCreateWindow (800, 600);
          txLine (320, 290, 320, 220);      //            txLine (320, 290, 320, 220);
          return 0;                         //            return 0;
                                            //            }
    
  • Забывают писать открывающие или закрывающие скобки, или пишут лишние, отчего появляются непарные скобки, или путают виды скобок:
          int main()
              {
              txCreateWindow (800, 600);
    
              txLine (320, 290, 320, 220;   // Не закрыта круглая скобка
              return 0;
              }
    
          int main()
          {
          txCreateWindow {800, 600};        // Фигурные скобки вместо круглых
          return 0;
          }
    
          txLine (320, 290, 320, 220;       // Команда за пределами функции main()
          }                                 // Лишняя скобка
    
  • Помещают команды за пределы фигурных скобок
          int main()
          {
          txCreateWindow (800, 600);
          return 0;
          }
    
          txLine (320, 290, 320, 220);      // Команда за пределами функции main()
    
  • Указывают лишние данные в командах или указывают меньше данных (аргументов), чем нужно.

    При таком несоответствии количества параметров (too few arguments... - слишком мало агрументов, или too many arguments... - слишком много) среда программирования часто указывает на правильное определение той команды, которая была неверно вызвана. Это нужно для того, чтобы вы посмотрели на это определение и вспомнили, сколько данных надо передавать. Это совсем не означает "ошибки в библиотеке" или "ошибки в стандартной команде". Настоящее место ошибки там, где команда вызвана. В это место легко попасть, если кликнуть мышкой 2 раза на строку с надписью "...at this point in file" в списке ошибок, в нижней части окна среды программирования.

    Примеры таких ошибок:
          txСircle (100, 100);              // Здесь не указан радиус
          txСircle (200, 200, 20, 30);      // Здесь лишнее число -- txCircle() принимает всего 3 аргумента
    
Ошибки времени исполнения

Бывают и логические ошибки, или ошибки времени выполнения (runtime errors). Например, мы не выбрали нужный цвет рисования (по умолчанию он белый), или цвет совпал с фоном и поэтому не виден. Или мы нарисовали одну фигуру поверх другой, и она закрыла предыдущую, или задали неверные координаты. Эти ошибки появляются после запуска программы. Их легко понять, если выполнить на листе бумаги все команды одну за другой, в том порядке, в котором они заданы в программе. При этом не надо стараться выполнять "так, как лучше", или "как хочется, чтобы получилось". Выполняйте так, как будто это не ваша, а совсем чужая работа, и вам не интересен ее результат. В тот момент, когда результат разойдется с вашим желанием и вы получите странную фигуру, станет понятно место ошибки.

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

Ошибки и стиль программирования

Правильное оформление кода (стиль программирования) помогает перевести ошибки стадии выполнения на стадию набора текста, и находить их даже до компиляции. Например, неверные координаты очень сложно проследить в "примере плохо написанной программы" (см. выше). Сделать это гораздо легче в "законченном примере" (см. ниже), где все числа, операторы и команды аккуратно выровнены. Если программа длиннее нескольких строк, то между ее логическими частями ставят пустые строки (вместо "красных строк" в русском языке), это позволяет не напрягать логическое мышление зазря, а концентрироваться на творчестве и на развитии программы.

Оформлять код "красиво" уже после того, как программа написана и отлажена, достаточно бессмысленно -- хороший стиль облегчает написание и отладку, а ведь программа уже готова. :) Поэтому ставить пробелы, пустые строки и выравнивать текст нужно сразу, при наборе, и приучиться это делать автоматически, как (хочется надеяться) вы автоматически моете руки перед едой. :)

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

См. также предупреждение.


Законченный пример

//{=========================================================================== 
//              $Copyright: (C) Ded (Ilya Dedinsky, http://txlib.ru) <mail@txlib.ru> $
//}===========================================================================

#include "TXLib.h"                         // Подключение библиотеки рисования

int main()                                 // Заголовок главной функции
    {                                      // Начало функции
    txCreateWindow (800, 600);             // Открытие окна 800 на 600 пикселей

    txLine   (320, 290, 320, 220);         // Проводится линия из точки x=320 и у=290 в точку с x=320 и y=220
    txLine   (320, 290, 280, 350);         // Проводятся другие линии,    
    txLine   (320, 290, 360, 350);         //     в результате чего
    txLine   (320, 230, 270, 275);         //     на экране 
    txLine   (320, 230, 400, 220);         //     появляется рисунок
    txCircle (320, 190, 30);               // Рисуется окружность с центром x=320 y=190 и радиусом 30
                                           
    txSelectFont ("Times New Roman", 60);  // Выбирается шрифт "Times" размера 60
    txTextOut (240, 400, "Hello, world!"); // Печатается текст "Hello, world!" в точке x=240 y=400

    return 0;                              // Возврат успешного кода завершения
    }                                      // Конец функции