Отправляет email-рассылки с помощью сервиса Sendsay

Программирование и др.

  Все выпуски  

Программирование в Linux с нуля - Выпуск 5


Информационный Канал Subscribe.Ru

Рассылка проекта Lindevel.Ru

Программирование в Linux с нуля. Выпуск 5.

1. Предисловие

Здравствуйте, уважаемые подписчики. Рад сообщить вам об открытии сайта проекта. Сам проект называется Lindevel.Ru, а сайт проекта находится по адресу http://lindevel.ru. Оформление требует больших доработок, содержимого мало, однако все это решится со временем. Группа помощников сейчас работает над движком сайта и реализацией концепции коллективной разработки программного обеспечения.

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

2. Программа

2.1. Описание

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

Для удобства разместим файлы проекта в разные каталоги. Назовем эти каталоги bin include и src. Каталог bin будет содержать исполняемые и объектные файлы. В каталоге include будут находиться заголовочные файлы, а каталог src предназначен для исходных файлов и для Makefile в частности.

2.2. Файлы

include/changer.h
/* changer.h */

#ifdef __cplusplus
extern "C" {
#endif

extern int changer (char chi, char cho, char* fn);

#ifdef __cplusplus
}
#endif


include/printstat.h
/* printstat.h */

void printstat (int a);


src/main.c
/* main.c */

#define BAD_ARGS 1
#define NO_FILE 2;

#include <stdio.h>
#include "changer.h"
#include "printstat.h"

int main (int argc, char** argv)
{
 int sval;
  
 if (argc != 4) {
  printf ("Use:\n");
  printf ("changer <input char.> <output char.> <filename>\n");
  return BAD_ARGS;
 }

 sval = changer (argv[1][0], argv[2][0], argv[3]);

 if (sval < 0) {
  printf ("%s", argv[3]);
  printf (": There is no such file\n");
  return NO_FILE;         
 }
 
 printstat (sval);

 return 0;
}


src/changer.cpp
/* changer.cpp */

#include <fstream>
using namespace std;

#include "changer.h"

int changer (char chi, char cho, char* fn)
{ 
 char ch;
 int i = 0;
 
 ifstream inf (fn);
 if (!inf) { return -1; }
 
 ofstream outf ("result.out");
 if (!outf) { return -2; }

 inf.unsetf (ios::skipws); //Не пропускаем пробелы

 while (!inf.eof ()) {
  inf >> ch;
  if (ch == chi) { 
   ch = cho;
   i++;
  }
  if (!inf.eof ()) { outf << ch; }
 };

 inf.close ();
 outf.close ();
 
 return i; 
}


src/printstat.c
/* printstat.c */

#include <stdio.h>

void printstat (int a)
{
 printf ("%s%i\n", "Changes: ", a);
}


src/Makefile
# Makefile for changer project

BIN_DIR = ./bin
INC_DIR = ./include
BIN_NAME = changer

BINARY_FILE = $(BIN_DIR)/$(BIN_NAME)


changer: main.o changer.o printstat.o
[tab] g++ -o $(BINARY_FILE) $(BIN_DIR)/main.o \
[tab] $(BIN_DIR)/changer.o $(BIN_DIR)/printstat.o

main.o: main.c $(INC_DIR)/changer.h $(INC_DIR)/printstat.h
[tab] gcc -c -o $(BIN_DIR)/main.o -I $(INC_DIR) main.c 

changer.o: changer.cpp $(INC_DIR)/changer.h
[tab] g++ -c -o $(BIN_DIR)/changer.o changer.cpp -I $(INC_DIR)

printstat.o: printstat.c $(INC_DIR)/printstat.h
[tab] gcc -c -o $(BIN_DIR)/printstat.o printstat.c -I $(INC_DIR)

clean:
[tab] rm -f $(BIN_DIR)/*.o $(BINARY_FILE)


2.3. Компиляция и запуск

Заходим в каталог src и действуем по "накатанному сценарию":

$ make
gcc -c -o ./bin/main.o -I ./include main.c
g++ -c -o ./bin/changer.o changer.cpp -I ./include
gcc -c -o ./bin/printstat.o printstat.c -I ./include
g++ -o ./bin/changer ./bin/main.o \
 ./bin/changer.o ./bin/printstat.o
$


Команда make вывела список выполненных действий. Теперь программу надо запустить. Для этого подготовим какой-нибудь файл, наподобие этого:

bin/input_file
"Work is the curse of the drinking classes."
Oscar Wilde.


Теперь переходим в каталог bin и запускаем программу:
$ ./changer e + input_file
Changes: 5
$ cat result.out
"Work is th+ curs+ of th+ drinking class+s."
Oscar Wild+.
$


3. Теория

3.1. Константы в Makefile

Вы конечно же заметили это нововведение. Для чего нужны такие константы - сами видите. Синтаксис констант Makefile простой:


Инициализация: ИМЯ = ЗНАЧЕНИЕ
Использование: 
Если ИМЯ состоит из одного символа (A, B, C, ...), то в нужном месте пишется просто ИМЯ
Если ИМЯ состоит из двух и более символов (ABRA, KADABRA, ...), то в нужном месте пишется $(ИМЯ)


3.2. Использование разных языков программирования

Как видите, для написания программы мы воспользовались языками C и C++. Не обошлось дело и без ключевого слова extern. Если не помните (или не знаете), ключевое слово extern заставляет компилятор сгенерировать функцию или переменную другого языка: в общем см. справочники по C/C++. Отмечу лишь следующее: если все объектные файлы проекта получены из файлов на языке C (.c), то для компоновки вызывается gcc; если проект содержит хотя бы один исходный файл C++ (.cpp), то для компоновки объектных модулей используется g++.

3.3. Опция GCC -I

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

Заключение

В следующем выпуске мы начнем создавать свои библиотеки. Если возникнут вопросы - пишите, спрашивайте. Мой e-mail: nnivanov@mail.ru.
Всегда ваш, Николай.

P.S. Сайт Lindevel.Ru постоянно пополняется. Руководства и документация постоянно исправляются. Если вы заметили ошибку или опечатку, сообщайте мне пожалуйста.
Рассылки Subscribe.Ru
*nix project - новости из мира unix-систем! (ежедневная)

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.linuxp
Отписаться

В избранное