Снова об использовании ТекущаяДата() на клиенте и на сервере и о работе в разных часовых поясах
Можно ли применять ТекущаяДата() вопреки требованиям стандартов 1С? Безопасно ли использование функции ОбщегоНазначенияКлиент.ДатаСеанса() из БСП? Как правильно поступать при работе пользователей в разных часовых поясах?
24.04.2023 4216 0 Alxby 26
40 0 26 4216
Печать в WORD при помощи БСП. Вывод уникальных ссылок в строки таблицы
Пример вывода уникальных ссылок в строку таблицы макета WORD при печати с помощью БСП. Может быть полезна при создании интерактивных прайсов.
03.04.2023 754 0 user1575928 0
17 0 0 754
Многопоточное выполнение процедуры с помощью ДлительныеОперации
В публикации: Приведен шаблон для запуска многопоточной операции для различных вариантов размещения многопоточной операции, в том числе в модуле объекта внешней обработки, встроенной в справочник Дополнительные отчеты и обработки; Представлен вариант корректного отображения прогресса многопоточной операции; Приведены замеры, демонстрирующие целесообразность использования нового механизма для увеличения производительности.
уСРЕДненный XEON [Месяц XEONa] — Бизнесмен Макс №86
26.02.2023 4655 9 egoriy111 24
68 9 24 4655
Пустая форма объекта в расширении? Форма не нужна!
Как в конфигурациях на БСП при создании расширений обойтись без заимствования форм.
19.02.2023 2790 30 ixijixi 22
54 30 22 2790
Пример многопоточной обработки (БСП)
Обработка-шаблон, на основе которой можно делать свои многопоточные обработки данных для конфигураций на БСП.
13.02.2023 6280 5 echo77 8
76 5 8 6280
Использование типовых возможностей 1С и их расширение. Часть 1
Инструкция пользователю системы 1С:Предприятие по способам использования и расширения возможностей типовых конфигураций и их практической реализации.
29.10.2022 5708 0 ixijixi 7
56 0 7 5708
Полезный код для программистов 1С (часть 4). Работа с файловой системой Асинх (аналог общего модуля БСП)
Я хотел бы поговорить с вами о файлах. А точнее о том, как сделать работу с ними приятной.
02.09.2022 4105 16 vandalsvq 9
45 16 9 4105
Шаблон внешней обработки на основе БСП с фоновым выполнением модуля обработки и выводом индикации фонового задания
Шаблон внешней обработки на основе БСП, с фоновым выполнением модуля обработки и выводом индикации фонового задания, как для подключения к подсистеме дополнительные отчеты и обработки, так и без подключения.
31.08.2022 6130 53 VdZMWOnC 6
84 53 6 6130
Почему нельзя использовать ТекущаяДата()
ИТС и ИС не ответили исчерпывающе, поэтому написал данную заметку.
23.08.2022 11178 0 Патриот 58
78 0 58 11178
Система контроля ведения учета [БСП]
В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.
18.07.2022 5581 0 quazare 8
101 0 8 5581
Оценка производительности с помощью БСП
В данной статье будут рассмотрены базовые возможности подсистемы «Оценка производительности» в библиотеке стандартных подсистем.
Шаг 5. Функции стандартной библиотеки
30.06.2022 4795 0 quazare 8
54 0 8 4795
[БСП] Выводим qr-код в печатную форму счета для оплаты в мобильном приложении банка или платежном терминале
Используя БСП выведем qr-код в печатную форму счета.
29.06.2022 4289 0 John_d 7
64 0 7 4289
Разработка конфигурации на основе Библиотеки стандартных подсистем 3.1.6.245
С применением БСП становится возможной быстрая разработка новых конфигураций с уже готовой базовой функциональностью, также БСП позволит достичь большей стандартизации конфигураций. В данной статье кратко разберем внедрение БСП 3.1.6.245 на пустую конфигурацию.
06.06.2022 6201 0 user1432326 5
25 0 5 6201
Асинхронное выполнение длительных операций с помощью фонового задания
Пример использования длительных операций. БСП 3.1.5.
05.06.2022 4148 2 user1432326 5
14 2 5 4148
Как подключить документ расширения к версионированию БСП
Пример расширения, в котором добавлен новый документ и он же подключен к подсистеме версионирования объектов. Важно! Основную конфигурацию нужно переключить в режим совместимости 8.3.20.
27.05.2022 6121 6 EvgeTrofi 9
13 6 9 6121
Подсистема регулярных заданий
Подсистема регулярных заданий предназначена для выполнения произвольных алгоритмов (задач) по заранее сформированным графикам с учетом производственного календаря.
23.05.2022 5390 15 Sirruf 15
14 15 15 5390
Базовые принципы работы с регламентными заданиями подсистем БСП
В очередной публикации рассмотрим некоторые базовые приемы работы с регламентными заданиями в рамках библиотеки стандартных подсистем
22.05.2022 9719 0 quazare 25
54 0 25 9719
Шаблоны сообщений пользователю — подсистема БСП
В данной небольшой статье рассмотрим практические примеры создания шаблонов сообщений пользователю и их отправки с помощью типового функционала библиотеки стандартных подсистем.
15.05.2022 8359 0 quazare 6
103 0 6 8359
Еще раз о дополнительных реквизитах и дополнительных сведениях
Дополнительные реквизиты и сведения существуют давно. Задумка очень хорошая. Суть этих механизмов понятна всем. По этому поводу написано много. Что тут можно сказать нового? Однако бес, как всегда, в деталях.
Как создавали реквизиты в объектах типовых конфигураций, так и продолжаем это делать. Почему это происходит? За всех сказать не могу. Могу рассуждать только на своем примере. Являясь убежденным практиком, одно могу сказать вполне определенно.
Если что-то на практике недостаточно удобно, то останется оно главным образом в теории. Если не приложить немного усилий.
11.05.2022 9449 0 user1374747 19
48 0 19 9449
Модули общего назначения — готовые полезные функции и процедуры конфигураций на БСП
В данной статье я рассматриваю несколько полезных «классических» функций и процедур для работы с данными, которые уже встроены в БСП и готовы к использованию.
25.04.2022 10350 0 quazare 11
130 0 11 10350
Правила регистрации объектов 1С:БСП
Здравствуйте, коллеги! В статье рассмотрим работу с правилами регистрации объектов в библиотеке стандартных подсистем 1С.
20.04.2022 10954 0 Koder_Line 12
33 0 12 10954
Отчет на СКД с использованием форм из БСП. Варианты передачи списка значений в параметр СКД
Показаны способы передачи списка значений в значение по умолчанию параметра СКД типового отчета из БСП, с возможностью последующей модификации пользователем.
20.04.2022 5486 6 eugene-p 8
28 6 8 5486
Раздел меню внешних отчетов и обработок (расширение конфигурации на БСП)
Иногда пользователю доставляет неудобство открывать разрозненно по спискам разных разделов внешние обработки и отчёты, и есть потребность поместить их в одно единственное окно. Данное расширение призвано решить такую задачу.
12.04.2022 5240 31 Obertone 7
22 31 7 5240
Многопоточный режим выполнения процедуры с помощью методов БСП — примеры разработки
В данной статья я рассмотрю примеры использования выполнения функций и процедур в многопоточном режиме, используя возможности Библиотеки стандартных подсистем (БСП).
01.04.2022 7334 0 quazare 14
117 0 14 7334
Получение контактной информации из отбора
Универсальная функция получения контактной информации из отбора компоновки данных. Весь код в статье.
25.03.2022 1869 0 ixijixi 0
12 0 0 1869
Стандартные подсистемы БСП — параметры работы клиента и возможности диалогов
В данной небольшой статье рассмотрим обработку параметров работы клиента и режим диалога (выбора вопроса) модулей «стандартные подсистемы» БСП.
22.03.2022 6093 0 quazare 11
81 0 11 6093
Полезный код для программистов 1С (часть 3). Подготовка печатных форм + подсистема Управление печатью (БСП)
Урок 5. Стандартная библиотека С++ (Часть 1)
Этот урок состоит из трех частей: 1 Математическая библиотека Си/С++;
1.1 Пример — расчет расстояния между точками;
1.2 Пример — применение тригонометрических функций к углу в градусах;
2 Функции стандартного вывода и вывода в Си и С++;
3 Замечания по работе с дробными числами. Также, начиная с этого урока начинаем рассуждать о хорошем стиле программирования (см. примеры). Рекомендую не просто смотреть на исходный код, а пытаться его запускать. Также, очень полезно выполнить мини-задания, указанные в уроке. Свои варианты решения заданий можно выкладывать в комментариях.
1 Математическая библиотека Си/С++
Наиболее часто используемые математические функции стандартной библиотеки приведены в таблице:
double sqrt(x) | возвращает корень из положительного числа x |
double pow(x, y) | $$возвращает quad x^y$$ |
double fabs (double x) и std::abs(x) | вычисляет абсолютное значение числа х |
double fmod (double x, double y) | вычисляет остаток от деления х на y , то есть делает тоже самое, что оператор % , но для дробных чисел |
double ceil (double x) | Возвращает наименьшее целое (представленное как double ), которое не меньше чем х . Читай — округляет число до ближайшего целого «вверх» |
double floor(double x) | По аналогии с ceil , округляет число «вниз» |
double sin(double x) , а также функции cos , tan , acos , atan , asin | Соответствуют тригонометрическим функциям — синус, косинус, тангенс, а также обратным функциями — арксинус, арктангенс, арккосинус. Особенность их использования заключается в том, что углы задаются в радианах, а не градусах. Если у вас в программе используются углы — перед работой с функциями — переведите их в радианы по формуле: $$ frac> <pi>= frac> $$ |
double exp(double x) | $$Вычисляет quad e^x$$ |
double log(double x) и double log10(double x) | Возвращают натуральный и десятичный логарифмы числа x |
1.1 Пример — расчет расстояния между точками
Рассмотрим программу, рассчитывающую расстояние между точками на плоскости:
#include // подключаем математическую библиотеку: #include using namespace std; int main() < double ax, ay, bx, by; cout > ax >> ay >> bx >> by; // рассчитываем расстояние по теореме Пифагора double dx = ax-ay, dy = bx-by; double distance = sqrt(dx*dx + dy*dy); // задаем число знаков дробной части при выводе cout.precision(5); cout
- крайне неэффективно, так как pow имеет очень сложную реализацию, ведь она возводит число не в целую, а в любую дробную степень. Она выполнит массу вычислений, хотя нам нужно лишь одно умножение;
- усложнит код. Что более наглядно x*x + y*y или pow(x,2) + pow(y,2) ?
Вообще, при написании кода стоит больше внимания уделять его простоте и понятности, а не вопросам оптимизации. На эту тему написано достаточно много в книге Мартина [1], как и многих других книгах по рефакторингу кода. Также, «преждевременной оптимизацией» не рекомендуют заниматься Маерс [2] и Саттер [3] — очень авторитетные люди в мире С++. Этот совет касается любых языков программирования, а не только С++. В качестве примера, иллюстрирующего проблему рекомендую посмотреть разбор школьной олимпиадной задачи «Уравнение» [4], обратить внимание на пояснения в конце разбора.
На самом деле, оптимизировать надо когда у вас уже возникли проблемы с производительностью и при этом, выполнять оптимизацию не абы где, а лишь там где реально возникли проблемы — такие места устанавливают с помощью специальных инструментов (профайлеров). Я бы не уделял столько внимания вопросу преждевременной оптимизации, но начинающие программисты (особенно на С++) очень часто допускают эту ошибку.
1.2 Пример — применение тригонометрических функций к углу в градусах
Пример программы, запрашивающей у пользователя угол в градусах, переводящей его в радианы и считающей его синус, косинус и тангенс:
#include #define _USE_MATH_DEFINES #include using namespace std; int main() < double degrees, radians; cout > degrees; radians = (M_PI * degrees) / 180; cout.precision(5); cout
В предыдущем примере уже использовалась функция precision для задания точности выводимых значений, однако, она ограничивает точность «сверху», то есть в данном случае — не более пяти знаков. Нередко хочется выводить данные в колонки одинаковой ширины и всегда выводить одинаковое число знаков у чисел — для этого надо передать в поток вывода (например cout ) функцию fixed , как показано в примере.
Также, в этой программе стоит обратить внимание на вторую строку. Дело в том, что для перевода угла в радианы нам потребуется константа «пи». Мы могли бы использовать вместо нее значение 3.14 , однако, это очень плохая практика, называемая «Магические числа» (Magic numbers) [5]. Наиболее типичным решением проблемы является использование именованных констант, то есть мы могли бы написать:
const double pi = 3.14
Однако, и это является плохим решением. Ведь может потребоваться число «пи» с более высокой точностью, а главное — такая константа (как и многие другие) уже определена в стандартной библиотеке. Чтобы начать их использовать надо добавить макрос #define _USE_MATH_DEFINES перед подключением библиотеки cmath . Именно за счет этой строки мы можем в коде обращаться к константе M_PI .
2 Функции стандартного вывода и вывода в Си и С++
При программировании на языке С++ вам доступны все функции стандартной библиотеки Си. Обойтись можно без них, однако Си гораздо проще чем С++, поэтому удобно начать изучение с функций Си, а потом уже перейти к их более продвинутым аналогам. Например, в предыдущих урока мы уже использовали конструкции типа cout
В Си для вывода данных на экран используется функция printf , а для ввода с клавиатуры — scanf . Рассмотрим работу с ними на примере программы, запрашивающей 2 целых числа и выводящих на экран их сумму:
#include int main()
В итоге формируется строка типа «The program calculated: 3 + 4 = 7» . Видно, что с помощью printf можно вывести на экран строку точно также как с помощью cout . Обратите внимание:
- на тех местах в выводимой строке, где должны быть подставлены значения переменных записано «%d» , а после строки вывода в функцию printf передаются переменные, значения которых надо подставить;
- «%d» можно использовать только для целых чисел. Если в приведенной выше программе в качестве значения a ввести 3.5 то она не запросит второе число, а присвоит ему значение 0 и сразу выведет результат (попробуйте);
- Строка типа «%d» называется «модификатор формата», их существует больше десятка- для ввода чисел разных типов и в разных системах счисления, указателей, строк и т.п. Наиболее часто используются «%f» для дробных чисел, и «%s» — для строк. Есть много нюансов их использования, которые всегда можно посмотреть в документации, например при выводе дробных чисел можно задать точность;
- последовательность «n» соответствует переводу строки, вы можете использовать это вместо endl при выводе с помощью cout ;
- функция getchar() ожидает ввода символа с клавиатуры, решает ту же задачу, что cin.get из первого урока.
Приведенная программа некорректно работала при вводе дробных чисел вместо целых, это связано с тем, что после считывания первого числа в буфере клавиатуры остается последовательность «.5» . Программа пытается считать второе целое число, обнаруживает точку в буфере клавиатуры и завершает ввод. Решить проблему можно изменив типы переменных и модификаторы формата (обратите внимание на «%.2f» :
#include int main()
Теперь программа прекрасно работает с дробными числами, но сработает некорректно при вводе произвольных строк вместо чисел (попробуйте). Часто при некорректном вводе нужно запросить у пользователя данные повторно. Для этого сначала нужно обнаружить проблему — функция scanf возвращает количество переменных, которым были успешно присвоены значения. Если ввод некорректный, то перед новым вводом надо из буфера клавиатуры удалить «мусор» — это можно сделать функцией gets из модуля stdlib.h :
#include #include int main() < float a, b, result; while (2 != scanf(«%f%f», b)) < printf(«wrong input!nEnter a and b: «); char str[255]; gets(str); // gets(str, 255); >result = a+b; printf(«Calculated: %f + %f = %.2fn», a, b, result); getchar(); >
Эта программа просит пользователя ввести значения пока оба числа не окажутся введены корректно. Конструкцию, которая используется в строке 9 мы пока что не изучали, но тут создается буфер из 255 символов, в который считываются данные из буфера клавиатуры. Дело в том, что чтобы удалить данные из буфера клавиатуры — их надо считать. В строке 10 эти данные считываются, при этом в старых компиляторах не требуется указывать размер буфера, а в новых — это необходимо, тут показаны оба варианта.
Выше описаны функции ввода/вывода на языке Си, но можно решить эту задачу и с помощью более знакомых нам конструкций языка С++:
#include using namespace std; int main() < float a, b, result; while (true) < std::cin >> a >> b; if (false == std::cin.fail()) < break; >std::cout ::max(), ‘n’); > result = a+b; std::cout.precision(3); std::cout
Этот пример почти эквивалентен рассмотренному ранее. Все новые используемые в нем функции описаны в статье «Проверка вводимых потоковых данных С++» [6], обратитесь к ней в случае возникновения вопросов.
3 Замечания по работе с дробными числами
Основное замечание формулируется так — дробные числа в компьютере хранятся с некоторой погрешностью. Это не связано со стандартной библиотекой С++ и вообще языком программирования, на Java/C# и любом другом языке вы тоже должны учитывать эту особенность.
Как учитывать? — Дробные числа никогда нельзя сравнивать оператором == , так как 0.5 на самом деле может быть равно чему-то типа 0.49999999999876 или 0.500000000000343 и при сравнении этих чисел вы можете получить неожиданный результат.
Чтобы понять масштаб катастрофы — попробуйте запустить такую программу:
#include #define _USE_MATH_DEFINES #include using namespace std; int main() < for (double degrees = 0; degrees < 180; degrees += 15) < double radians = (M_PI * degrees) / 180; double my_tan = sin(radians)/cos(radians); double std_tan = tan(radians); cout else < cout > >
Она перебирает углы от нуля до 180 , для каждого из них считает тангенс по известной всем формуле и сверяет полученное значение с результатом работы стандартной функции tan . Оказывается, что для ряда углов результаты совпадают, а для других — нет, причем, при запуске этой программы на другом компьютере или при использовании другого компилятора вы можете получить другие результаты.
Вывод — дробные числа всегда надо сравнивать с учетом некоторой погрешности. Иными словами, числа a и b равны при условии:
Наша группа ВКонтакте.
-
Генерация стихов на Prolog опубликовано Elevferii
Источник: pro-prof.com
Библиотеки стандартных и нестандартных функций
Аннотация: В данной лекции рассматриваются библиотеки стандартных и нестандартных функций. Приводятся основные определения и понятия, а также примеры практического использования библиотек.
На разных этапах развития программирования выдвигались различные концепции, которые могли бы обеспечить быстрое создание качественных программ, возможность компоновки больших программных систем из небольших хорошо отработанных модулей, возможность повторного использования ранее разработанных программ. Среди таких подходов можно упомянуть структурное и модульное программирование , объектно-ориентированное программирование . Следует отметить, что универсальных средств, которые бы полностью решали указанные задачи не существует и на сегодняшний день.
Однако определенные технологии получили свое развитие и в программировании, приблизив его к промышленным методам создания программных продуктов.
В этой связи мы должны вспомнить историю развития одного из мощнейших средств автоматизации программирования – разработку библиотек стандартных программ. В нашей стране в начале 60-х годов прошлого столетия на отечественных ЭВМ типа М-20 в Институте Прикладной математики АН СССР им. акад. М.В.
Келдыша была разработана интерпретирующая система ИС-2, которая положила начало созданию библиотек стандартных подпрограмм, а впоследствии и стандартных алгоритмов на алгоритмических языках. Традиция эта была подхвачена журналом Ассоциации вычислительных машин ( Communications of the ACM , США), который на протяжении десятков лет публиковал алгоритмы решения математических задач на языках АЛГОЛ -60 и ФОРТРАН.
Публикация исходных текстов преследовала не только просветительские цели, читатели находили ошибки в опубликованных алгоритмах, предлагали более эффективные решения. Таким способом на протяжении полутора десятков лет отлаживался и накапливался архив типовых методов решения задач линейной алгебры, дифференциального и интегрального исчислений, решения нелинейных уравнений, статистической обработки данных, вычисления математических функций и т.п. Он составил основу пакета научных программ SSP ( Scientific Subroutine Package ) на ФОРТРАНЕ, который был взят на вооружение фирмой IBM и стал доступным для пользователей IBM /360, IBM /370. С появлением в нашей стране IBM — совместимых моделей серии ЕС ЭВМ с этим пакетом познакомились и отечественные программисты.
Современные системы программирования на базе ПК, к сожалению, не оценили вычислительные возможности пакета SSP и его расширений. Конечно, они включили в состав своих системных библиотек наиболее распространенные математические функции. Но основу сегодняшних системных библиотек составляют не методы решения математических задач. Начинка системных библиотек в BC и BCB состоит, в основном, из всякого рода сервисных программ, обеспечивающих поддержку некоторых типов данных (строки, множества , комплексная арифметика, дата и время, преобразования типов данных ), управление дисплеем в текстовом и графическом режимах, обслуживание интерфейса с другими внешними устройствами и др. Те алгоритмы и программы, которые когда-то входили в состав SSP , теперь распространяются в различных коммерческих продуктах типа MathCAD , MatLab, Statistica, Mathematica и т.п.
11.1. Библиотеки системных функций в Borland C++ 3.1
Библиотеки системы BC 3.1 представлены файлами в каталоге BCLIB. Там находится примерно 25 файлов с расширениями .lib , около двух десятков файлов с расширениями .obj и три файла с расширениями .c . Для более детального знакомства с этими файлами напомним терминологию, принятую во многих системах программирования:
- исходный модуль – текстовый файл, содержащий программу на языке программирования. Для систем BC и BCB характерны расширения .c (от названия языка C) и .cpp (от названия языка C-plus-plus);
- объектный модуль – результат обработки исходного модуля компилятором с алгоритмического языка. Для многих систем программирования файлы объектных модулей имеют расширение .obj (от object – объект). Объектный модуль – это заготовка машинной программы, которая нуждается в настройке, т.к. в работе этого модуля могут потребоваться другие модули и внешние данные;
- исполняемый модуль – результат сборки и настройки совместно работающих объектных модулей. Это – готовая к работе машинная программа, обычно имеет расширение .exe (от execute – исполнять);
- библиотечный модуль – совокупность объектных модулей, которая обычно хранится в файле с расширением .lib (от library – библиотека) или .dll (от dynamic-link library – динамически загружаемая библиотека).
Большое количество файлов, находящихся в разделе BCLIB, объясняется тем, что некоторые библиотеки сформированы в нескольких вариантах для разных моделей памяти. В рамках MS-DOS система BC 3.1 могла создавать программы для шести разных моделей памяти – Tiny (крошечная), Small (малая), Medium (средняя), Compact (компактная), Large (большая) и Huge (огромная). Для каждой из этих моделей использовалось свое распределение памяти в пределах выделенного ресурса, использовалась своя адресация , разные типы указателей (ближние и дальние) и т.п. Поэтому ряд библиотек представлен в шести экземплярах.
Библиотека системных функций BC 3.1 условно разбита на 17 разделов, названия которых представлены в табл. 11.1. В общей сложности в этих разделах хранится порядка 600 функций.
Classification routines | 12 | Проверка символов на принадлежность определенной категории |
Conversion routines | 21 | Преобразование типов данных |
Directory control routines | 31 | Работа с дисками и каталогами |
Diagnostic routines | 3 | Программы диагностики |
Graphics routines | 79 | Графические процедуры |
Inline routines | 16 | Встраиваемые функции |
Input/Output routines | 110 | Управление вводом/выводом |
Interface routines | 75 | Обслуживание BIOS |
Math routines | 88 | Математические функции |
Memory routines | 28 | Управление оперативной памятью |
Miscellaneous routines | 7 | Разное (звук, задержка, переходы) |
Process control routines | 24 | Управление процессами и сигналами |
Standard routines | 30 | Стандартные функции |
String and memory routines | 43 | Управление строками и памятью |
Text window display routines | 20 | Управление дисплеем в текстовом режиме |
Time and date routines | 25 | Работа с датой и временем |
Variable argument list routines | 3 | Обслуживание списка аргументов |
Для обслуживания библиотек в состав системы программирования входит утилита tlib.exe . Запускается она из командной строки со следующим списком возможных параметров:
>tlib.exe lib_name [/C][/E][/P][/0] commands,listfile
- lib_name – имя библиотечного файла, расширение .lib можно не писать;
- [/C][/E][/P][/0] – необязательные ключи режимов работы;
- commands – команды по обслуживанию библиотеки;
- listfile – список файлов.
Ключи режимов имеют следующий смысл:
- /C – в библиотеке предусмотрено различать большие и малые буквы, как это предусмотрено и стандартом языка C (по умолчанию в библиотеках большие и малые буквы не различаются);
- /E – в библиотеке будет создан расширенный словарь, который ускорит компоновку программ, использующих объектные модули из библиотеки;
- /Pnnnn – в библиотеке будет использован заданный размер «страницы» (в MS-DOS этот размер фиксирован и равен 200h);
- /0 – из объектных модулей будут удалены записи с комментариями.
Команды, набираемые в строке, состоят из одного или двух символов, вслед за которыми указывается имя объектного модуля. В имени объектного модуля разрешается опускать расширение .obj . Символ (-ы) перед именем модуля определяет действие, которое должно быть выполнено:
- + добавить модуль к содержимому библиотеки;
- – удалить модуль из библиотеки;
- * извлечь модуль из библиотеки, сохранив там его копию;
- –+ (или +– ) заменить прежний модуль в библиотеке новым;
- –* (или *– ) извлечь модуль и удалить его из библиотеки.
С помощью утилиты tlib.exe можно выдать содержимое библиотеки в указанный файл :
>tlib.exe lib_name,1.txt
По этой команде в текстовом файле 1.txt окажется список всех объектных модулей, находящихся в библиотеке lib_name с указанием их длин и меток входа. Выглядит это примерно так:
Publics by module ABS size = 14 _abs ABSREAD size = 292 _absread _abswrite ACCESS size = 55 _access ALLOCA size = 50 _alloca
11.2. Организация пользовательских библиотек
Любую функцию, написанную на языке C или C++ можно автономно откомпилировать и получить объектный модуль , который впоследствии можно присоединять к любому проекту.
Естественно, что объектный модуль может оказаться полезным в последующей разработке программ, если он тщательно отлажен. Чтобы не хранить большое количество отдельных объектных файлов , их можно с помощью утилиты tlib.exe объединить в библиотеку. Любая библиотека может быть присоединена к проекту вновь разрабатываемой программы. Этими возможностями нужно обязательно пользоваться при разработке больших программных систем.
Для создания новой библиотеки достаточно добавить один или несколько объектных модулей к библиотечному файлу. Если такой библиотеки еще не было, то она будет создана. Пусть, например, в текущем каталоге находятся три объектных модуля с именами q1.obj, q2.obj и q3.obj . Для того чтобы создать в этом же каталоге новую библиотеку с именем qqq.lib , выполнить следующую команду:
>tlib qqq +q1 +q2 +q3
Если нам потребуется заменить модуль q1.obj на исправленную версию q1.obj , добавить модуль q4.obj и одновременно удалить из библиотеки модуль q2.obj , то это можно сделать следующим образом:
>tlib qqq -+q1 +q4 -q2
Если количество одновременно подключаемых модулей достаточно велико, то командной строки, ограниченной 127 символами, может не хватить. В этом случае обычно создают текстовый файл из строк вида:
+q1 +q2 +q3 . +q15 +q31 +q32 .
В конце каждой строки записывается символ tlink /k1 /k2 ,q1 q2 ,eq,mq,lib1 lib2
- /k1 /k2.. . – набор ключей, управляющих работой tlink ;
- q1 q2 – список объектных модулей, включая и головную функцию main ;
- eq – имя исполняемого модуля;
- mq – имя модуля, в который записывается «карта» памяти;
- lib1 lib2 – имена подключаемых библиотек.
Перечень ключей программа tlink.exe выдает после запуска без параметров. Их расшифровка приведена в табл. 11.1. Расширения имен файлов, если они стандартные, можно опускать ( .obj – объектные модули, .exe – исполняемый модуль , .map – файл «карты» памяти, .lib – библиотечный файл ). «Карта» памяти или таблица распределения памяти содержит информацию о размещении функций и глобальных переменных в сегментах памяти.
/m | Выдача «карты» памяти со всеми общедоступными именами |
/x | Запрет вывода «карты» памяти |
/i | Инициализация всех сегментов данных |
/l | Подключение номеров строк исходных программ |
/s | Вывод подробной «карты» памяти сегментов |
/n | Отключение библиотек по умолчанию |
/d | Выдача предупреждений о дублировании имен в библиотеках |
/c | Режим различения больших и малых букв |
/3 | Разрешение использовать 32-битные операнды и команды |
/v | Сохранение дополнительной информации для отладки |
/e | Игнорирование расширенных словарей в библиотеках |
/t | Создание com-файла вместо exe-файла |
11.3. Динамически загружаемые библиотеки
В довольно ранних версиях операционных систем наряду со статическими библиотеками объектных модулей появились динамически загружаемые библиотеки с расширением .dll (от Dynamic-link libraries ). Динамически загружаемые библиотеки Windows могут иметь и другие расширения – .exe или .drv .
Основная разница между статическими и динамическими библиотеками заключается в следующем. Если используется статическая библиотека, то на стадии редактирования связей в состав исполняемого модуля включаются все функции, для которых обнаружено обращение из текста исходной программы. В отличие от этого вызов модуля из динамической библиотеки происходит только на стадии выполнения программы. При таком подходе библиотечные функции не включаются в состав исполняемого модуля, его размеры становятся меньше и, тем самым, экономится место , занимаемое исполняемыми файлами на диске.
У каждого из этих подходов есть свои плюсы и минусы. При использовании статических библиотек размер исполняемого модуля возрастает, т.к. к нему подключаются все функции, упомянутые в программе. Однако такой модуль можно выполнить на любом компьютере независимо от того, установлена ли там соответствующая система программирования или нет. При использовании динамически загружаемых библиотек размер исполняемого модуля не так велик, но для его работы требуется присутствие в оперативной памяти динамической библиотеки, из которой в случае необходимости потребуется запустить тот или иной модуль . Поэтому при переносе программы на другой компьютер придется кроме исполняемого модуля захватить и всю цепочку задействованных динамических библиотек. Правда, в разумных системах программирования предусмотрен режим компиляции с включением всех вызываемых функций в состав исполняемого модуля.
Источник: intuit.ru