Язык Си в примерах/Библиотека complex

Язык Си в примерах


  1. Компиляция программ
  2. Простейшая программа «Hello World»
  3. Учимся складывать
  4. Максимум
  5. Таблица умножения
  6. ASCII-коды символов
  7. Верхний регистр
  8. Скобочки
  9. Факториал
  10. Степень числа
  11. Треугольник Паскаля
  12. Корень уравнения
  13. Система счисления
  14. Сортировка
  15. Сортировка на основе qsort
  16. RPN-калькулятор
  17. RPN-калькулятор на Bison
  18. Простая грамматика
  19. Задача «Расчёт сопротивления схемы»
  20. Простая реализация конечного автомата
  21. Использование аргументов командной строки
  22. Чтение и печать без использования stdio
  23. Декодирование звукозаписи в формате ADX
  24. Другие примеры
  25. XCC C

Создание библиотек. Библиотека для работы с комплексными числами.

Создание библиотеки

Библиотека у нас будет иметь два исходных файла: complex.h и complex.c

/*
   complex.h
 */
 typedef struct 
    {
     double a,b;
    } complex_t;
 complex_t mul(complex_t x, complex_t y);
 /*
    complex.c
 */
 #include "complex.h"
 complex_t mul(complex_t x, complex_t y)
 {
     complex_t t;
     t.a = x.a * y.a - x.b * y.b;
     t.b = x.a * y.b + x.b * y.a; 
     return t;
 }

Пример использования библиотеки

Теперь несложно использовать эту библиотеку.

Для этого нужно:

  • добавить в заголовок c/cpp-файла строчку #include "complex.h" ;
  • сделать так, чтобы компилятор находил complex.h ;
  • сделать так, чтобы сборщик (linker) находил файл библиотеки complex .
 /*
    test_complex.c
 */
 #include <stdio.h>
 #include "complex.h"
 int main()
 {
     complex_t x = {1,2};
     complex_t y = {3,4};
     complex_t z = mul(x,y);
     printf ("z = (%lf, %lf)\n", z.a, z.b );
     return 0;
 }

Создание и использование библиотек в GNU C

Подключение библиотеки в виде исходников

Есть простой способ подключения библиотеки функций прямо в виде исходников:

$ gcc test_complex.c complex.c -o test_complex   


В итоге получается запускаемый файл test_complex.


Подключение библиотеки в виде динамически загружаемой библиотеки

$ gcc -shared complex.c -o libcomplex.so           # создание динамически загружаемой библиотеки  
$ gcc test_complex.c -L. -lcomplex -o test_complex # компиляция тестовой программы
$ export LD_LIBRARY_PATH=.; ./test_complex         # запуск тестовой программы


  • Есть ряд стандартных путей (), где система ищет динамически загружаемые библиотеки. Текущая директория по умолчанию не является таким местом, поэтому мы явно указываем, что библиотеки могут лежать также и в текущей директории.
    Переменная LD_LIBRARY_PATH содержит дополнительный список путей (разделённых двоеточием), где система будет искать библиотеки.
  • Расширение .so соответствует shared objects, то есть библиотека объектов общего доступа.

Подключение библиотеки в виде статически загружаемой библиотеки

Для компилятора Gnu C команды создания статически подключаемой библиотеки и подключения её к проекту выглядят следующим образом


$ gcc -с complex.c -o libcomplex.a                 # создание статически подключаемой библиотеки  
$ gcc test_complex.c -L. -lcomplex -o test_complex # компиляция тестовой программы
$ ./test_complex                                   # запуск тестовой программы

Задачи

  • Напишите расширенную версию библиотеки функций для работы с комплексными числами. Реализуйте операции сложения, вычитания, умножения и деления, а также функции, вычисляющие аргумент и модуль комплексного числа. Реализуйте функции комплексного аргумента sinc, cosc, expc, logc, asinc , acosc. Чему равен арккосинус двух (acosc(2) = ?) ? Напишите программу, тестирующую вашу библиотеку.
  • Напишите библиотеку функций по теме "аналитическая геометрия"
    • Решать задачи на плоскости
      • вычислять расстояние для пар (точка, точка), (точка, прямая)
      • находить площадь многоугольника
      • проверять, пересекаются ли две прямые и находить точку их пересечения
      • проверять, пересекаются ли два отрезка и находить точку их пересечения
    • Решать задачи в пространстве
      • вычислять расстояние для пар (точка, точка), (точка, прямая), (прямая, прямая), (точка, плоскость)
      • находить точку пересечения трёх попарно непараллельных плоскостей
      • находить объем тетраэдра