Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Ключи к здоровью" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Декабрь 2003 → | ||||||
1
|
2
|
3
|
4
|
5
|
6
|
7
|
---|---|---|---|---|---|---|
9
|
10
|
11
|
12
|
13
|
14
|
|
16
|
17
|
19
|
20
|
21
|
||
22
|
23
|
24
|
25
|
26
|
27
|
28
|
30
|
31
|
Автор
Статистика
4.317 подписчиков
-2 за неделю
-2 за неделю
Программирование в Linux с нуля. Выпуск 4.
Информационный Канал Subscribe.Ru |
Программирование
в Linux с нуля. Выпуск 4. |
||
|
1. Авторское предисловие
Здравствуйте, уважаемые подписчики. Приношу глубокие извинения за небольшую задержку.У меня есть для вас две новости:
1) Сайт LinuxProgrammer Site наконец-то заработал. В нем еще много недоделок, но это вопрос времени. Надеюсь вы будете принимать участие в его создании
2) Сайт переехал с boom.ru на by.ru. Теперь у него адрес http://linuxprogrammer.by.ru
Скорее всего это последний выпуск в 2003 году, поэтому поздравляю вам с наступающим. Желаю вам добра и счастья.
Тем, кто недавно подписался советую прочитать раздел 2 "Информация для подписавшихся".
Начиная с этого выпуска, изменилась нумерация листингов, домашних заданий и вопрсов.
2. Информация для подписавшихся
В этом разделе содержится информация о рассылке, которую необходимо прочитать всем свежеподписавшимся.Меня зовут Николай. Я программист, занимающийся разработкой приложений для ОС Linux, а также модификацией ее ядра. Живу и работаю в Великом Новгороде. Женат. Если вам интересно что-то, что касается непосредственно моей личности, пишите.
Рассылка предназначена практически для всех групп программистов в Linux (в том числе и для кандидатов в программисты). Единственное, чего я не буду касаться - это кроссплатформенные приложения Linux+Windows. Я не противник Windows, просто я не использую эту операционную систему уже лет пять. Узнав все хитрости Linux, пропал смысл использовать Windows. Извините, но я не знаю ничего, что связано с Windows.
Рассылка сопровождается публикацией сайта "LinuxProgrammer Site", который в настоящее время находится на стадии разработки. На нем вы сможете найти много полезного.
Ниже представлены разделы, которые будут выходить в рассылке. Если вам что-то не нравится, пишите, я постараюсь учесть все предложения.
1. Авторское предисловие:
Здесь я буду рассказывать о новостях, связанных с рассылкой, отвечать на вопросы подписчиков и т. д.
2. Информация для подписавшихся:
Здесь будет процитирован настоящий текст, который поможет новым подписчикам быстро влиться в коллектив.
3. Программирование в Linux:
Здесь я буду писать учебный материал собственного изложения. Особенная ценность этого раздела состоит в том, что такой информации (в полном и доступном изложении) нигде нет! Все это - результаты моих бесчисленных опытов. К счастью вам не придется повторять все то, на чем я обжигался.
4. Вопросы и ответы:
Это форум, в котором кто-то задает вопросы, а кто-то на них отвечает. Чтобы прислать вопрос в данную рубрику необходимо написать мне письмо, указав в качестве темы “Question_Linuxp”. Вопрос будет опубликован в ближайшем выпуске. Чтобы прислать ответ на вопрос, следует написать мне письмо с ответом, составив тему следующим образом:
Answer_Linuxp_номер_выпуск
номер – это номер вопроса, опубликованного в выпуске под номером выпуск
Все материалы из рубрики "Вопросы и ответы" автоматически попадают в раздел "FAQ" сайта "LinuxProgrammer Site". Если вы по какой-нибудь причине не желаете, чтобы ваш вопрос или ответ был опубликован на сайте, укажите об этом в письме. То же самое касается публикации вашего адреса.
Рассылка только начинает работать и поэтому в ней много недоделок. Надеюсь, что ваши пожелания помогут сделать ее лучше.
Все материалы, находящиеся на страницах рассылки вы можете цитировать и распространять полностью или частично без уведомления или разрешения с моей стороны.
3. Программирование в Linux
3.1. Разбор домашнего заданияДомашнее задание 3.1: Узнайте, что такое библиотека. Чем статическая библиотека отличается от динамической? Почему динамические библиотеки называют совместно используемыми?
Разбор домашнего задания:
Итак, библиотека с точки зрения программиста - это один или несколько объектных файлов, объединенных воедино особым образом. Библиотеки предназначены для использования одних и тех же механизмов в разных программах. Использование библиотек позволяет во многом избавиться от изобретения велосипедов.
Как и обычные объектные файлы, библиотеки подключаются к программе на стадии компоновки (линковки). В этом случае говорят, что "программа компонуется с такой-то библиотекой".
Библиотеки бывают статические и динамические (совместно используемые).
Статические библиотеки при компоновке включают часть своего кода (или всеь код) в исполняемый файл программы. Таким образом, программа, скомпонованая со статической библиотекой несет последнюю "в себе".
Код, находящийся в динамической библиотеке во время линковки не включается в программу. В этом случае в исполняемом файле находится лишь ссылка на библиотеку. Здесь предполагается, что пользователь, запуская программу, уже имеет нужную динамическую библиотеку.
К достоинствам статических библиотек относятся:
1) Переносимость
Программа, скомпонованная со статической библиотекой самодостаточна, то есть нужный код из библиотеки уже в ней. При таком раскладе больше гарантий, что исполняемый файл успешно запустится у некоторого пользователя.
2) Независимость к версиям
Программа, скомпонованная со статической библиотекой не зависит от версии библиотеки.
К недостаткам статических библиотек следует отнести:
1) Значительное увеличение размера исполняемого файла программы за счет включения в него кода из статической библиотеки.
2) Усложнение модернизации программы
Рассмотрим достоинства динамических (совместно используемых библиотек):
1) Исполняемый файл не содержит "лишнего кода" из библиотеки, поэтому размер файла значительно меньше.
2) Несколько программ могут одновременно использовать одну и ту же динамическую библиотеку (оттого динамические библиотеки и называют совместно используемыми (shared)).
3) Программа, скомпонованная с динамической библиотекой легко модернизируется. Если, например, в новой версии некоторой совместно используемой библиотеки произвести оптимизацию, то эта оптимизация отразится на работе всех программ, работающих с данной библиотекой.
Совместно используемые библиотеки имеют свои недостатки:
1) Если пользователь не имеет нужной библиотеки, то программа не запустится
2) Используя динамические библиотеки усложняется процесс контроля за новыми версиями
3) Программа, скомпонованная с динамической библиотекой зависит от нее и поэтому не является самодостаточной
При разработке программного обеспечения программист использует те или иные виды библиотек исходя из конкретной ситуации. Поэтому говорить о том, что лучше, а что хуже - бессмысленно.
Домашнее задание 3.2: Что такое препроцессор и препроцессорная обработка при компиляции? Что вы знаете про ключевое слово extern языков C/C++.
Разбор домашнего задания:
При разработке программ на языках C и C++ процесс компиляции можно в некоторой степени корректировать еще на стадии написания исходных текстов. Для этого используются специальные ключевые слова, которые называют директивами препроцессора. Одной из самых распространенных директив является всем знакомое ключевое слово #include, которое требует от компилятора включения содержимого некоторого файла в основной текст программы. Существует также директива #define, которая заставляет сопоставить некоторому идентификатору (имени) константу или макрос. Существуют и другие директивы. Использование директив препроцессора в программе называют условной компиляцией. Итак, прежде чем начать основной цикл компиляции, программа обрабатывается модулем, который называется препроцессором. Сам процесс такой обработки называется препроцессорной обработкой. После препроцессорной обработки исходный текст программы приводится в понятный компилятору вид. Рассмотрим пример:
Пусть имеется файл my_header.h со следующим содержимым:
----------------
int my_func (int a, int b);
void is_hex (char c);
----------------
Листинг 4.1
Пусть также имеется файл main.cpp со следующим содержимым:
----------------
#include "my_header.h"
#define TEN 10
int main (int argc, char** argv)
{
int a = my_func (TEN, TEN+1);
return 0;
}
----------------
Листинг 4.2
После препроцессорной обработки файл main.cpp будет иметь примерно следующий вид:
----------------
int my_func (int a, int b);
void is_hex (char c);
int main (int argc, char** argv)
{
int a = my_func (10, 10+1);
return 0;
}
----------------
Листинг 4.3
В дальнейшем мы будем неоднократно обращаться к теме условной компиляции, где рассмотрим все тонкости этого процесса.
Ключевое слово extern предназначено для условной компоновки. Чаще всего оно используется тогда, когда требуется компоновка программ, написанных на разных языках, когда надо обозначить какую-то функцию, как функцию другого языка. В последующих выпусках рассылки мы коснемся этого ключевого слова более подробно.
3.2. Компоновка нескольких объектных файлов
Создадим программу для нахождения среднего арифметического квадратов двух чисел. Для этого реализуем функцию возведения в квадрат и функцию нахождения среднего арифметического. Чтобы не запутаться, расчленим программу на модули :-)
Начнем с серверов (вспоминаем предыдущий выпуск). Один сервер будет предоставлять услуги возведения в квадрат, другой - нахождение среднего арифметического. Создадим также клиент, который будет пользоваться услугами серверов. Также нам понадобится интерфейс, который будет связывать серверы с клиентом.
1) Сервер 1
Реализуем функцию возведения в квадрат в файле sqr.cpp:
----------------
/* sqr.cpp */
double Sqr (double a)
{
return a*a;
}
----------------
Листинг 4.4
2) Сервер 2
Функцию нахождения среднего арифметического занесем в файл mid.cpp:
----------------
/* mid.cpp */
double Mid (double a, double b)
{
return (a+b)/2;
}
----------------
Листинг 4.5
3) Интерфейс
Интерфейсом будет служить заголовочный файл head.h
----------------
/* head.h */
double Sqr (double);
double Mid (double, double);
----------------
Листинг 4.6
4) Клиент
В качестве клиента возьмем файл main.cpp:
----------------
/* main.cpp */
#include <iostream>
using namespace std;
#include "head.h"
int main (int argc, char** argv)
{
double a, b;
cin >> a >> b;
cout << Mid (Sqr (a), Sqr (b)) << endl;
return 0;
}
----------------
Листинг 4.7
Теперь выполним следующие команды:
|$ g++ -c sqr.cpp
|$ g++ -c mid.cpp
|$ g++ -c main.cpp
|$ g++ -o main main.o sqr.o mid.o
В результате получится исполняемый файл.
Внимательно просмотрите и выполните рассмотренный выше пример. В следующем выпуске рассылки я расскажу вам, как можно автоматизировать процесс компиляции с помощью GNU-утилиты make. А в шестом выпуске мы создадим свою первую библиотеку.
-----------------
Что в языке C++ делает функцию уникальной? Варианты ответов:
1) Только имя
2) Имя и тип аргументов
3) Имя, тип аргументов и количество аргументов
4) Имя, тип аргументов, количество аргументов и порядок следования типов аргументов
5) Имя, тип аргументов, количество аргументов, порядок следования типов аргументов, тип возвращаемого значения
Является ли выбранный вами ответ правильным для языка C?
----------------
Домашнее задание 4.1
4. Вопросы и ответы
Спасибо огромное тем, кто ответил на представленные вопросы. Новых вопросов пока не поступило.4.1. Ответы на вопросы
Вопрос 3.1
Прислал: Rust (rust@voliacable.com)
Здравстуйте.
Есть несколько вопросов, которые мне некому задать, а узнать ответы хочется.
1. Есть ли в glibc процедура удаление подстроки наподобие delete в
Паскале? В манах я ничего, к сожалению, не нашел. Может просто галза
кривые.
Ответ 1.
Прислал: Arsen Zahray (arsen13@list.ru)
В string.h -
void Delete(char *string,unsigned int start,unsigned int finish)
{
strcpy(string+start,string+finish);
}
Вот как ето делаеться на С.
Вопрос 3.2
Прислал: panfilow (panfiloff@yandex.ru)
У меня есть вопрос.
Можно ли под Linux-ом смонтировать в одну точку два винчестера или логических раздела?
И как это можно сделать.
Ответ 1.
Прислал: Oleg V. Poplavsky (helgi@ua.fm)
Вряд ли. При монтировании устройства в каталог, все данные из этого
каталога становятся недоступны. При размонтировании устройства, они
опять появляются.
Ответ 2.
Прислал: E$h (bbroth@pochta.ru)
ИМХО нельзя
Вопрос 3.3
Прислал: Igor (ebeb@front.ru)
Здравствуйте!
Хотелось бы хорошего описания (с примерами 8)) функций printf и scanf или как
там её 8)
Ответ 1.
Прислал: E$h (bbroth@pochta.ru)
На эти функции есть хорошие маны (man printf)
А вообще там просто надо запомнить управляющие макросы типа:
%d - десятичное число, %s - строка, %x - 16-ричное число
Пример:
int var = 10;
char *str = malloc(sizeof(char*));
str = "This is text string!";
printf("%d\n", var);
printf("%x\n", var);
printf("%s\n", str);
--------------------------
Выводит:
10
а
This is text string!
_______________________
Escape-символ \n означает перевод строки (еще есть \t - табуляция и
несколько других)
Для scanf то же самое, но только в обратную сторону, т.е. принимаем из
stdin данные и засовываем их в переменные.
С уважением, E$h (http://plg.lrn.ru)
Ответ 2.
Прислал: crond (3-1415@rambler.ru)
???...А чего ты паришься?
Прикрути себе KDevelop. Во-первых, очень удобная IDE, во всяком случае
лучшего под Linux я не встречал. Во вторых там в меню HELP есть
хорошее описалово практически всех основных функций стандарта ANSI и
POSIX с примерами, включая printf, sprintf, snprintf и пр.
Ответ 3.
Прислал: Mihail Zhuravlev
(m_zhuravlev@mail.ru)
man 3 printf
man 3 scanf
man 3 printf
man 3 scanf
Спасибо за внимание и за ответы. До новых встреч.
Nikolay.
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||