DLL:
先看百度词条对DLL的解释
动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库。例如,在 Windows 操作系统中,Comdlg32.dll 执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于避免代码重用和促进内存的有效使用。 通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计账程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。
https://baike.baidu.com/item/.dll/2133451?fr=aladdin
好了,废话不多说直接看图建工程实战:
然后放到合适的位置(注:能不要有中文路径就不要有中文路径,工程的一切除注释外尽量都是英文字符,避免不必要的麻烦。)
工程建立完如下:
你可以直接删掉源文件和头文件的文件(不过得自己把属性页预编译头使用给取消掉)
这里先暂时不做属性页面的修改.暂时先跳过上图页面修改的两个步骤。
先在pch.h中添加以下的代码。
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
#define IMPORT_DLL _declspec(dllimport) //指的是允许将其给外部调用
#define IMPORT_DLL_C extern "C"_declspec(dllimport)
IMPORT_DLL int m_findMax(int*, int); //查找数组中的最大值
IMPORT_DLL int m_findMin(int*, int); //查找数组中的最小值
IMPORT_DLL void m_Bubble_sort(int*, int); //冒泡排序
IMPORT_DLL void m_Bubble_sort(int* a, int length, int mode); //冒泡排序mode控制
IMPORT_DLL void m_Selection_sort(int*, int); //选择排序
IMPORT_DLL void m_Selection_sort(int*, int, int); //选择排序
IMPORT_DLL void m_Quick_sort(int arr[], int low, int high); //快速排序
IMPORT_DLL int binaryfind(int*, int, int, int, int); //二分法查找,需要升序排列后,且无法检测重复数据
//查找数为尾部数据无法查询到
IMPORT_DLL int m_Fibonacci(int, int); //斐波那契数列
IMPORT_DLL void m_print(int*, int); //打印数组
#endif //PCH_H
再在相应的pch.cpp中添加以下内容
/*
创建者 : XTT
功能 : Sort算法
时间 : 2020/01/14
*/
// pch.cpp: 与预编译标头对应的源文件
#include "pch.h"
// 当使用预编译的头时,需要使用此源文件,编译才能成功。
#include
using namespace std;
/*
功能: - 查找数组中最大值
@int* a : 目标数组
@int length : 数组长度
@param
@return : 最大值
描述 :
示例 : m_findMax(a, 5);
*/
int m_findMax(int* a, int length)
{
int* temp = a;
int MaxIndex = 0;
int max = temp[0];
for (int i = 1; i < length; i++)
{
if (temp[i] > max)
{
max = temp[i];
MaxIndex = i;
}
}
//cout << "最大值" << max << endl;
//cout << "索引" << MaxIndex << endl;
//return MaxIndex;
return max;
}
/*
功能: - 查找数组中最小值
@int* a : 目标数组
@int length : 数组长度
@param
@return : 最小值
描述 :
示例 : m_findMin(a, 5);
*/
int m_findMin(int* a, int length)
{
int* temp = a;
int MinIndex = 0;
int min = temp[0];
for (int i = 1; i < length; i++)
{
if (temp[i] < min)
{
min = temp[i];
MinIndex = i;
}
}
//cout << "最小值" << min << endl;
//cout << "索引" << MinIndex << endl;
//return MinIndex;
return min;
}
/*
功能: - 冒泡排序:默认降序
@int* a : 目标数组
@int length : 数组长度
@param
@return : 无
描述 :
示例 : m_Bubble_sort(a, 5);
*/
void m_Bubble_sort(int* a, int length)
{
int temp;
for (int i = 0; i < length - 1; i++)
{
for (int j = 0; j < length - 1 - i; j++)
{
if (a[j] < a[j + 1]) // >:升序
// <:降序
{
//交换
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
/*
功能: - 冒泡排序:
@int* a : 目标数组
@int length : 数组长度
@int mode : 0 :降序
1 :升序
@return : 无
描述 :
示例 : m_Bubble_sort(a, 5, 1);
*/
void m_Bubble_sort(int* a, int length, int mode)
{
int temp;
for (int i = 0; i < length - 1; i++)
{
for (int j = 0; j < length - 1 - i; j++)
{
switch (mode)
{
case 0:
if (a[j] < a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
break;
case 1:
if (a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
break;
default:
cout << "mode_error" << endl;
return;
}
}
}
}
/*
功能: - 选择排序:默认升序
@int* a : 目标数组
@int length : 数组长度
@param
@return : 无
描述 :
示例 : m_Selection_sort(a, 5);
*/
void m_Selection_sort(int* a, int length)
{
int temp;
int min = 0; //假设最小值是数组的第一个元素
int minIndex = 0; //最小值的初始下标为0
for (int i = 0; i < length - 1; i++)
{
min = a[i]; //假设第i个元素是最小值
minIndex = i;
for (int j = i + 1; j < length; j++)
{
if (a[j] < min)
{
min = a[j];
minIndex = j;
}
}
//交换
if (minIndex > i)
{
temp = a[minIndex];
a[minIndex] = a[i];
a[i] = temp;
}
}
}
/*
功能: - 选择排序:
@int* a : 目标数组
@int length : 数组长度
@int mode : 0:降序
1:升序
@return : 无
描述 :
示例 : m_Selection_sort(a, 5);
*/
void m_Selection_sort(int* a, int length, int mode)
{
int temp;
int min = 0; //假设最小值是数组的第一个元素
int minIndex = 0; //最小值的初始下标为0
for (int i = 0; i < length - 1; i++)
{
min = a[i]; //假设第i个元素是最小值
minIndex = i;
for (int j = i + 1; j < length; j++)
{
switch (mode)
{
case 0:
if (a[j] > min)
{
min = a[j];
minIndex = j;
}
break;
case 1:
if (a[j] < min)
{
min = a[j];
minIndex = j;
}
break;
default:
cout << "mode_error" << endl;
return;
}
}
//交换
if (minIndex > i)
{
temp = a[minIndex];
a[minIndex] = a[i];
a[i] = temp;
}
}
}
/*
功能: - 二分法查找
@unsigned int* a : 源数组
@int length : 数组长度
@int low : 起始位置
@int high : 结束位置
@int x : 查找数字
描述 : binaryfind(a, 5, 0, 5, 3);
*/
int binaryfind(int* a, int length, int low, int high, int x)
{
int* temp = a;
int min = low;
int max = high;
int mid = (min + max) / 2;
//若区间大小已经为0,则不存在查找的空间中
if (mid == 0)
{
cout << "error" << endl;
return NULL;
}
if (temp[mid] > x)
{
min = min;
max = max - (max + min) / 2;
if (max < 0)
{
cout << "error" << endl;
return NULL;
}
binaryfind(temp, mid, min, max, x);
}
else if (temp[mid] < x)
{
min = min + (max + min) / 2;
max = max;
if (min > max)
{
cout << "error" << endl;
return NULL;
}
binaryfind(temp, mid, min, max, x);
}
else if (x == temp[mid])
{
cout << "查找到的数值为" << x << endl;
cout << "为数组第" << mid << endl;
}
return mid;
}
/*
功能: - 斐波那契
@ int n : 数列序号
@ int mode : 0 :递归
1 :分治法
描述 :
*/
int m_Fibonacci(int n, int mode)
{
if (n == 0)
return 0;
if (n <= 2)
return 1;
else
{
switch (mode)
{
case 0:
{
return (m_Fibonacci(n - 1, 0) + m_Fibonacci(n - 2, 0));
}
case 1:
{
int first = 0;
int second = 1;
while (0 < n--)
{
second += first;
first = second - first;
}
return (first + second);
}
default:
{
cout << "" << endl;
return NULL;
}
}
}
}
void m_print(int* a, int length)
{
for (int i = 0; i < length; i++)
{
cout << a[i] << "\t";
}
cout << endl;
}
/*
功能: - 快速排序
@ int arr[] : 目标数组
@ int low :
@ int high :
描述 :
*/
void m_Quick_sort(int* a, int left, int right)
{
if (left >= right)
{
return;
}
int i = left;
int key = a[right];
int j = right + 1;
while (true)
{
while (a[++i] < key)
{
if (i == right)
{
break;
}
}
while (a[--j] > key)
{
if (j == left)
{
break;
}
}
if (i >= j)break;
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
//交换key值
int temp = a[left];
a[left] = a[j];
a[j] = temp;
m_Quick_sort(a, left, j - 1);
m_Quick_sort(a, j + 1, right);
}
然后选择相应的系统和版本直接运行(可以去生成解决方案,一样的道理)(x86,x64随便)
然后报错,忽略警告和报错。
在自己debug文件夹中找到对应的dll文件和lib文件(x64运行结果在x64文件夹下debug)
创建一个新的空项目
将对应的.dll文件和.lib文件复制到新工程目录下
在新工程内添加一个main.cpp文件和一个头文件.
.lib .dll文件名可以修改,但是你需要修改如下内容
#pragma comment(lib,"Dll2.lib")
头文件内容为下:(其实就是删除掉之前的宏,并添加了运行lib的命令)(这是一种静态链接)
/*
创建者 : XTT
功能 : Sort算法
时间 : 2020/01/14
*/
#ifndef __M_SORT_H
#define __M_SORT_H
#pragma comment(lib,"Dll2.lib")
int m_findMax(int*, int); //查找数组中的最大值
int m_findMin(int*, int); //查找数组中的最小值
void m_Bubble_sort(int*, int); //冒泡排序
void m_Bubble_sort(int* a, int length, int mode); //冒泡排序mode控制
void m_Selection_sort(int*, int); //选择排序
void m_Selection_sort(int*, int, int); //选择排序
void m_Quick_sort(int arr[], int low, int high); //快速排序
int binaryfind(int*, int, int, int, int); //二分法查找,需要升序排列后,且无法检测重复数据
//查找数为尾部数据无法查询到
int m_Fibonacci(int, int); //斐波那契数列
void m_print(int*, int); //打印数组
#endif // !__M_SORT_H
添加运行main.cpp文件内容如下:
/*
创建者 : XTT
功能 :
时间 : 2020/01/14
*/
#define CRTDBG_MAP_ALLOC
#include
#include
#include
#include
#include "m_sort.h"
using namespace std;
void test1();
void test2();
void test3();
void test4();
void test5();
int main()
{
test1();
test2();
test3();
test4();
test5();
cout << "time = " << (double)(clock()) / CLOCKS_PER_SEC << "s" << endl;
_CrtDumpMemoryLeaks();
system("pause");
return 0;
}
void test1()
{
int* a = new int[5];
srand((unsigned)time(NULL));
for (int i = 0; i < 5; i++)
{
a[i] = rand() % 100;
}
for (int i = 0; i < 5; i++)
{
cout << a[i] << "\t";
}
cout << endl;
cout << "最大值" << m_findMax(a, 5) << endl;
cout << "最小值" << m_findMin(a, 5) << endl;
m_Selection_sort(a, 5, 1);
for (int i = 0; i < 5; i++)
{
cout << a[i] << "\t";
}
delete[] a;
}
void test2()
{
int* a = new int[5];
srand((unsigned)time(NULL));
for (int i = 0; i < 5; i++)
{
a[i] = rand() % 6;
}
m_print(a, 5);
m_Selection_sort(a, 5, 1);
m_print(a, 5);
binaryfind(a, 5, 0, 5, 3);
delete[] a;
}
void test3()
{
//for (int i = 0; i < 10; i++)
//{
// cout << m_Fibonacci(i, 0) << "\t";
//}
for (int i = 0; i < 10; i++)
{
cout << m_Fibonacci(i, 1) << "\t";
}
}
void test4()
{
int a[] = { 57, 68, 59, 52, 72, 28, 96, 33, 24 };
int len = sizeof(a) / sizeof(int);
cout << "len = " << len << endl;
m_Quick_sort(a, 0, len - 1);
m_print(a, len);
}
void test5()
{
const int len = 55000;
int* a = new int[len];
srand((unsigned)time(NULL));
for (int i = 0; i < len; i++)
{
a[i] = rand() % len;
}
// m_Bubble_sort(a,len);
// m_Quick_sort(a,0, len-1);
m_Selection_sort(a, len);
m_print(a, len);
delete[] a;
}