Вы находитесь на странице: 1из 10

Министерство науки и высшего образования Российской Федерации

федеральное государственное бюджетное образовательное учреждение


высшего образования
«Балтийский государственный технический университет «ВОЕНМЕХ» им. Д.Ф. Устинова»
(БГТУ «ВОЕНМЕХ» им. Д.Ф. Устинова»)
БГТУ.СМК-Ф-4.2-К5-01

Факультет О Естественнонаучный
шифр Наименование
Информационные системы и программная
Кафедра О7 инженерия
шифр Наименование
Дисциплина Компьютерный практикум

Лабораторная работа № 3
на тему:
«Создание динамических библиотек при помощи набора компиляторов
и утилит GCC и их применение»
Вариант 7

Выполнил студент группы О715Б


Векслер А.Ю.
Фамилия И.О.

ПРЕПОДАВАТЕЛЬ
Садырова А. К.
Фамилия И.О. Подпись

Оценка
«_____» 2022 г.

Санкт-Петербург
2022 г.
Задание к лабораторной работе
1. Написать программу в соответствии с вариантом.

2. Массив и матрицу заполнять случайными числами от -50 до 50.

3. Функции для работы с массивами и матрицами поместить в две


отдельные динамические библиотеки.

4. При запуске программы пользователь должен увидеть меню, в


котором можно выбрать, с чем будет проходить работа: с матрицей или с
массивом.

5. В зависимости от выбора пользователя загружается одна или другая


динамическая библиотека.

6. Библиотеки должны быть скомпилированы с учетом возможного


использования в ОС семейств Linux или Windows.

Подсчитать число элементов матрицы Q (5х7) и массива R(57), кратных


трем.
Исходный код из файла «main.c»
#include <stdio.h>
#include <stdlib.h>

#ifdef WIN32
#include <windows.h>
#elif __linux
#include <dlfcn.h>
#endif

typedef void (* funcMatrix) (int[5][7]); //указатель на функцию матрицы


typedef void (* funcArray) (int[57]); //указатель на функцию массива
void matrix_test(void * lib);
void array_test(void * lib);

int main()
{
int array[64];
void * lib;

int choose = 0, breakpoint = 1;

do
{
printf("\nChoose the struct for work:\n"
"1. Work with matrix.\n"
"2. Work with array.\n"
"3. Exit.\n");

scanf("%d", &choose);

switch(choose){
case 1:{
#ifdef WIN32
lib = LoadLibrary("libMatrix.dll");
if(!lib)
{
printf("Cant open library libMatrix.dll\n");
}
matrix_test(lib);
FreeLibrary(lib);
#endif

#ifdef __linux
lib = dlopen("libMatrix.so", RTLD_LAZY);
if(!lib)
{
printf("Cant open library libMatrix.so\n");
}
matrix_test(lib);
dlclose(lib);
#endif
} break;
case 2:
{
lib = LoadLibrary("libArray.dll");
if(!lib)
{
printf("Cant open library libArray.dll\n");
}
array_test(lib);
FreeLibrary(lib);
} break;
case 3: breakpoint = 0; break;
}
} while(breakpoint);

return 0;
}

void matrix_test(void * lib)


{
int matrix[5][7];

funcMatrix funCreateM;
funcMatrix funPrintM;
funcMatrix funChangeM;

#ifdef WIN32
funCreateM = (funcMatrix)GetProcAddress((HINSTANCE)lib,
"CreateMatrix");
if(funCreateM == NULL)
{
printf("Cant load function CreateMatrix");
}
funCreateM(matrix);

printf("\n\nCreated matrix:\n");

funPrintM = (funcMatrix)GetProcAddress((HINSTANCE)lib, "PrintMatrix");


if(funPrintM == NULL)
{
printf("Cant load function PrintMatrix");
}
funPrintM(matrix);

funChangeM = (funcMatrix)GetProcAddress((HINSTANCE)lib,
"ChangeMatrix");
if(funChangeM == NULL)
{
printf("Cant load function ChangeMatrix");
}
funChangeM(matrix);
#endif

#ifdef __linux
funCreateM = (funcMatrix)dlsym(lib, "CreateMatrix");
if(funCreateM == NULL)
{
printf("Cant load function CreateMatrix");
}
funCreateM(matrix);

printf("\n\nGenerated matrix:\n");

funPrintM = (funcMatrix)dlsym(lib, "PrintMatrix");


if(funPrintM == NULL)
{
printf("Cant load function PrintMatrix");
}
funPrintM(matrix);

funChangeM = (MatrixFun)dlsym(lib, "ChangeMatrix");


if(funChangeM == NULL)
{
printf("Cant load function ChangeMatrix");
}
funChangeM(matrix);
#endif
}
void array_test(void * lib)
{
int array[57];
funcArray funCreateA;
funcArray funPrintA;
funcArray funChangeA;

#ifdef WIN32
funCreateA = (funcArray)GetProcAddress((HINSTANCE)lib, "CreateArray");
if(funCreateA == NULL)
{
printf("Cant load function GenArray");
}
funCreateA(array);
printf("\n\nCreated array:\n");
funPrintA = (funcArray)GetProcAddress((HINSTANCE)lib, "PrintArray");
if(funPrintA == NULL)
{
printf("Cant load function PrintArray");
}
funPrintA(array);

funChangeA = (funcArray)GetProcAddress((HINSTANCE)lib, "ChangeArray");


if(funChangeA == NULL)
{
printf("Cant load function ProcesArray");
}
funChangeA(array);
#endif

#ifdef __linux
funCreateA = (funcArray)dlsym(lib, "CreateArray");
if(funCreateA == NULL)
{
printf("Cant load function CreateArray");
}
funCreateA(array);
printf("\n\nCreated array:\n");
funPrintA = (funcArray)dlsym(lib, "PrintArray");
if(funPrintA == NULL)
{
printf("Cant load function PrintArray");
}
funPrintA(matrix);
funChangeA = (funcArray)dlsym(lib, "ChangeArray");
if(funChangeA == NULL)
{
printf("Cant load function ChangeArray");
}
funChangeA(array);

#endif
}

Исходный код из файла «Array.c»


#include <stdio.h>
#include <stdlib.h>

void CreateArray(int R[57])


{
int k;
for (k = 0; k < 57; k++)
R[k] = rand() % 101 -50;
}

void PrintArray(int R[57])


{
int k;
for (k = 0; k < 57; k++)
printf("%d\t", R[k]);
}
void ChangeArray(int R[57])
{
int k, count1 = 0;
for (k = 0; k < 64; k++)
{
if (R[k]%3==0)
count1++;
}
printf("\nAmount of numbers in Array: %d", count1);
}

Исходный код из файла «Matrix.c»


#include <stdio.h>
#include <stdlib.h>

void CreateMatrix(int Q[5][7])


{
int i, j;
for (i = 0; i < 5; i++)
for (j = 0; j < 7; j++)
Q[i][j] = rand() % 101 - 50;
}

void PrintMatrix(int Q[5][7])


{
int i, j;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 7; j++)
printf("%d\t", Q[i][j]);
printf("\n");
}
}

void ChangeMatrix(int Q[5][7])


{
int i, j;
int count =0;
for (i = 0; i < 5; i++)
for (j = 0; j < 7; j++)
if (Q[i][j] %3==0) count++;
printf("Amount of numbers Matrix: %d", count);
}

Компиляция программы

С помощью команд на рис.1 компилируем файлы с добавлением в файл


отладочной информации, а опция -fPIC требует от компилятора при создании
объектных файлов порождать позиционно-независимый код. Дальше
происходит создание динамических библиотек с помощью опции -shared ‒,
которая указывает gcc, что в результате должен быть собран не исполняемый
файл, а разделяемый объект – динамическая библиотека. И в конце
происходит компиляция программы

Рисунок 1 – Ввод в командную строку

При запуске программы открывается меню:

Рисунок 2 – Меню

Результат работы программы с матрицей:

Рисунок 3 – Результат работы программы

Результат работы программы с массивом:


Рисунок 4 – Результат работы программы

Вам также может понравиться