diff --git a/div/FourOperator/.vs/FourOperator/v16/.suo b/div/FourOperator/.vs/FourOperator/v16/.suo new file mode 100644 index 0000000..cbb3f55 Binary files /dev/null and b/div/FourOperator/.vs/FourOperator/v16/.suo differ diff --git a/div/FourOperator/FourOperator.sln b/div/FourOperator/FourOperator.sln new file mode 100644 index 0000000..cab817b --- /dev/null +++ b/div/FourOperator/FourOperator.sln @@ -0,0 +1,41 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30804.86 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FourOperator", "FourOperator\FourOperator.vcxproj", "{84D3E0B3-C22A-4F07-9329-8220A2F2EABD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTest1", "UnitTest1\UnitTest1.vcxproj", "{B68018EC-3312-470A-898A-89F46F36C582}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {84D3E0B3-C22A-4F07-9329-8220A2F2EABD}.Debug|x64.ActiveCfg = Debug|x64 + {84D3E0B3-C22A-4F07-9329-8220A2F2EABD}.Debug|x64.Build.0 = Debug|x64 + {84D3E0B3-C22A-4F07-9329-8220A2F2EABD}.Debug|x86.ActiveCfg = Debug|Win32 + {84D3E0B3-C22A-4F07-9329-8220A2F2EABD}.Debug|x86.Build.0 = Debug|Win32 + {84D3E0B3-C22A-4F07-9329-8220A2F2EABD}.Release|x64.ActiveCfg = Release|x64 + {84D3E0B3-C22A-4F07-9329-8220A2F2EABD}.Release|x64.Build.0 = Release|x64 + {84D3E0B3-C22A-4F07-9329-8220A2F2EABD}.Release|x86.ActiveCfg = Release|Win32 + {84D3E0B3-C22A-4F07-9329-8220A2F2EABD}.Release|x86.Build.0 = Release|Win32 + {B68018EC-3312-470A-898A-89F46F36C582}.Debug|x64.ActiveCfg = Debug|x64 + {B68018EC-3312-470A-898A-89F46F36C582}.Debug|x64.Build.0 = Debug|x64 + {B68018EC-3312-470A-898A-89F46F36C582}.Debug|x86.ActiveCfg = Debug|Win32 + {B68018EC-3312-470A-898A-89F46F36C582}.Debug|x86.Build.0 = Debug|Win32 + {B68018EC-3312-470A-898A-89F46F36C582}.Release|x64.ActiveCfg = Release|x64 + {B68018EC-3312-470A-898A-89F46F36C582}.Release|x64.Build.0 = Release|x64 + {B68018EC-3312-470A-898A-89F46F36C582}.Release|x86.ActiveCfg = Release|Win32 + {B68018EC-3312-470A-898A-89F46F36C582}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D74B31F8-B3E0-4D9E-8BFC-F0959A7F9337} + EndGlobalSection +EndGlobal diff --git a/div/FourOperator/FourOperator/B.dll b/div/FourOperator/FourOperator/B.dll new file mode 100644 index 0000000..53f1a40 Binary files /dev/null and b/div/FourOperator/FourOperator/B.dll differ diff --git a/div/FourOperator/FourOperator/B.lib b/div/FourOperator/FourOperator/B.lib new file mode 100644 index 0000000..ead5fd4 Binary files /dev/null and b/div/FourOperator/FourOperator/B.lib differ diff --git a/div/FourOperator/FourOperator/FourOperator.vcxproj b/div/FourOperator/FourOperator/FourOperator.vcxproj new file mode 100644 index 0000000..4eba2a2 --- /dev/null +++ b/div/FourOperator/FourOperator/FourOperator.vcxproj @@ -0,0 +1,156 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {84d3e0b3-c22a-4f07-9329-8220a2f2eabd} + FourOperator + 10.0 + + + + Application + true + v142 + MultiByte + + + Application + false + v142 + true + Unicode + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + + + false + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + ..\..\add\A\A;%(AdditionalIncludeDirectories) + + + Console + true + ..\..\..\add\A\Debug + A.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/div/FourOperator/FourOperator/FourOperator.vcxproj.filters b/div/FourOperator/FourOperator/FourOperator.vcxproj.filters new file mode 100644 index 0000000..a283846 --- /dev/null +++ b/div/FourOperator/FourOperator/FourOperator.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 头文件 + + + 头文件 + + + + + 源文件 + + + 源文件 + + + 源文件 + + + \ No newline at end of file diff --git a/div/FourOperator/FourOperator/FourOperator.vcxproj.user b/div/FourOperator/FourOperator/FourOperator.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/div/FourOperator/FourOperator/FourOperator.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/div/FourOperator/FourOperator/Opera_api.cpp b/div/FourOperator/FourOperator/Opera_api.cpp new file mode 100644 index 0000000..d0dce44 --- /dev/null +++ b/div/FourOperator/FourOperator/Opera_api.cpp @@ -0,0 +1,35 @@ +#pragma once +#include "Opera_api.h" +#include"../../../add/A/A/add.h" +//װļӷ +long long add_api(int x, int y) +{ + long long res = add(x, y); + printf("%d + %d = %lld\n", x, y, res); + return res; +} +//.װļ +int sub_api(int x, int y) +{ + printf("%d - %d = %d\n", x, y, x - y); + return x - y; +} +//װij˷ +long long mul_api(int x, int y) +{ + long long res; + HMODULE hdll = LoadLibrary("../../../mul/C/Debug/C.dll"); + if (hdll != NULL) + { + MulFunc MUL1 = (MulFunc)GetProcAddress(hdll, (char*)(1)); + if (MUL1 != NULL) + { + res = MUL1(x,y); + return res; + } + FreeLibrary(hdll); + } +} + + + diff --git a/div/FourOperator/FourOperator/Opera_api.h b/div/FourOperator/FourOperator/Opera_api.h new file mode 100644 index 0000000..1ee6a20 --- /dev/null +++ b/div/FourOperator/FourOperator/Opera_api.h @@ -0,0 +1,10 @@ +#pragma once +#include"sub.h" +#include +#include +#pragma comment(lib,"./B.lib") + +typedef int(WINAPI* MulFunc)(int x, int y); +long long mul_api(int x, int y); +int sub_api(int x, int y); +long long add_api(int x, int y); diff --git a/div/FourOperator/FourOperator/dev.cpp b/div/FourOperator/FourOperator/dev.cpp new file mode 100644 index 0000000..c939cd1 --- /dev/null +++ b/div/FourOperator/FourOperator/dev.cpp @@ -0,0 +1,15 @@ +#include "dev.h" +//װij +int dev(int x, int y) +{ + if (y == 0) + { + printf("Ϊ0\n"); + return 0; + } + else + { + printf("%d / %d = %d\n", x, y, x / y); + return x / y; + } +} \ No newline at end of file diff --git a/div/FourOperator/FourOperator/dev.h b/div/FourOperator/FourOperator/dev.h new file mode 100644 index 0000000..0041e13 --- /dev/null +++ b/div/FourOperator/FourOperator/dev.h @@ -0,0 +1,7 @@ +#pragma once +#pragma once +#include"sub.h" +#include +#include + +int dev(int x, int y); \ No newline at end of file diff --git a/div/FourOperator/FourOperator/main.cpp b/div/FourOperator/FourOperator/main.cpp new file mode 100644 index 0000000..6660ca1 --- /dev/null +++ b/div/FourOperator/FourOperator/main.cpp @@ -0,0 +1,13 @@ + +#include "Opera_api.h" +#include "dev.h" +int main() +{ + int a = 2147483647, b = 2; + add_api(a, b);// ӷӿadd_api + sub_api(a, b);// ӿsub_api + mul_api(a, b); // ˷ӿmul_api + dev(a, b);// ӿdev_api + + return 0; +} \ No newline at end of file diff --git a/div/FourOperator/FourOperator/sub.h b/div/FourOperator/FourOperator/sub.h new file mode 100644 index 0000000..67e32fb --- /dev/null +++ b/div/FourOperator/FourOperator/sub.h @@ -0,0 +1,13 @@ +#ifndef _SUB_H_ +#define _SUB_H_ + +#ifdef sub_EXPORTS +#define sub_EXPORTS _declspec(dllexport) +#else +#define sub_EXPORTS _declspec(dllimport) +#endif + +sub_EXPORTS int sub(int x, int y); + +#endif + diff --git a/div/FourOperator/UnitTest1/UnitTest1.cpp b/div/FourOperator/UnitTest1/UnitTest1.cpp new file mode 100644 index 0000000..3f7221a --- /dev/null +++ b/div/FourOperator/UnitTest1/UnitTest1.cpp @@ -0,0 +1,140 @@ +#pragma once +#include "pch.h" +#include "CppUnitTest.h" +#include"../FourOperator/dev.h" +#include +#include +#include + +#define FilePath "..//ex1.ini" +using namespace Microsoft::VisualStudio::CppUnitTestFramework; + +namespace UnitTest1 +{ + TEST_CLASS(UnitTest1) + { + public: + +#if 1 + int j = 0; + char str[50][10] = { 0 };//iniļ ڵ + int count = CalcCount(50, str);//iniļ ڵĸ + unsigned short i; + TEST_METHOD(TestMethode1) + { + int nReal;// + CString na, nb, nExpect; //b治ͬļֵ + for (j = 0; j < count; j++) + { + GetPrivateProfileString(str[j], "na", " ", na.GetBuffer(20), 20, FilePath); + GetPrivateProfileString(str[j], "nb", " ", nb.GetBuffer(20), 20, FilePath); + GetPrivateProfileString(str[j], "nExpect", " ", nExpect.GetBuffer(20), 20, FilePath); + nReal = dev(_ttoi(na), _ttoi(nb)); //_ttoiCStringתΪ + Assert::AreEqual(nReal, _ttoi(nExpect)); + } + + } + + }; +} + +#endif + + + + + + + + + + + + + + + + + + + +#if 0 + TEST_METHOD(a) + { + int nReal; + CString na, nb, nExpect; + //һγ ex1.ini ļд + //WritePrivateProfileString(_T("a"), _T("na"), _T("6"), _T("../ex1.ini")); + //WritePrivateProfileString(_T("a"), _T("nb"), _T("2"), _T("../ex1.ini")); + //WritePrivateProfileString(_T("a"), _T("QExpect"), _T("3"), _T("../ex1.ini")); + //һγǴ ex1.ini ļȡ + GetPrivateProfileString(_T("a"), _T("na"), _T(" "), na.GetBuffer(20), 20, _T(FilePath)); + GetPrivateProfileString(_T("a"), _T("nb"), _T(" "), nb.GetBuffer(20), 20, _T(FilePath)); + GetPrivateProfileString(_T("a"), _T("nExpect"), _T(" "), nExpect.GetBuffer(20), 20, _T(FilePath)); + nReal = dev(_ttoi(na), _ttoi(nb)); + Assert::AreEqual(nReal, _ttoi(nExpect)); + } + TEST_METHOD(b) + { + int nReal; + CString na, nb, nExpect; + + GetPrivateProfileString(_T("b"), _T("na"), _T(" "), na.GetBuffer(20), 20, _T(FilePath)); + GetPrivateProfileString(_T("b"), _T("nb"), _T(" "), nb.GetBuffer(20), 20, _T(FilePath)); + GetPrivateProfileString(_T("b"), _T("nExpect"), _T(" "), nExpect.GetBuffer(20), 20, _T(FilePath)); + nReal = dev(_ttoi(na), _ttoi(nb)); + Assert::AreEqual(nReal, _ttoi(nExpect)); + } + TEST_METHOD(c) + { + int nReal; + CString na, nb, nExpect; + + GetPrivateProfileString(_T("c"), _T("na"), _T(" "), na.GetBuffer(20), 20, _T(FilePath)); + GetPrivateProfileString(_T("c"), _T("nb"), _T(" "), nb.GetBuffer(20), 20, _T(FilePath)); + GetPrivateProfileString(_T("c"), _T("nExpect"), _T(" "), nExpect.GetBuffer(20), 20, _T(FilePath)); + nReal = dev(_ttoi(na), _ttoi(nb)); + Assert::AreEqual(nReal, _ttoi(nExpect)); + } + TEST_METHOD(TestMethod3) + { + int nReal; + CString na, nb, nExpect; + + GetPrivateProfileString("d", "na", " ", na.GetBuffer(20), 20, FilePath); + GetPrivateProfileString("d", "nb", " ", nb.GetBuffer(20), 20, FilePath); + GetPrivateProfileString("d", "nExpect", " ", nExpect.GetBuffer(20), 20, FilePath); + nReal = dev(_ttoi(na), _ttoi(nb)); + Assert::AreEqual(nReal, _ttoi(nExpect)); + } +#endif + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/div/FourOperator/UnitTest1/UnitTest1.vcxproj b/div/FourOperator/UnitTest1/UnitTest1.vcxproj new file mode 100644 index 0000000..f349363 --- /dev/null +++ b/div/FourOperator/UnitTest1/UnitTest1.vcxproj @@ -0,0 +1,174 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + {B68018EC-3312-470A-898A-89F46F36C582} + Win32Proj + UnitTest1 + 10.0 + NativeUnitTestProject + + + + DynamicLibrary + true + v142 + false + MultiByte + + + DynamicLibrary + false + v142 + true + Unicode + false + + + DynamicLibrary + true + v142 + Unicode + false + + + DynamicLibrary + false + v142 + true + Unicode + false + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Use + Level3 + true + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + pch.h + + + Windows + DebugFull + ..\FourOperator\Debug\dev.obj + + + + + Use + Level3 + true + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + pch.h + + + Windows + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) + + + + + Use + Level3 + true + true + true + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;%(PreprocessorDefinitions) + true + pch.h + + + Windows + true + true + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) + + + + + Use + Level3 + true + true + true + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + NDEBUG;%(PreprocessorDefinitions) + true + pch.h + + + Windows + true + true + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) + + + + + Create + Create + Create + Create + + + + + + + + + + \ No newline at end of file diff --git a/div/FourOperator/UnitTest1/UnitTest1.vcxproj.filters b/div/FourOperator/UnitTest1/UnitTest1.vcxproj.filters new file mode 100644 index 0000000..83a287b --- /dev/null +++ b/div/FourOperator/UnitTest1/UnitTest1.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + \ No newline at end of file diff --git a/div/FourOperator/UnitTest1/UnitTest1.vcxproj.user b/div/FourOperator/UnitTest1/UnitTest1.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/div/FourOperator/UnitTest1/UnitTest1.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/div/FourOperator/UnitTest1/pch.cpp b/div/FourOperator/UnitTest1/pch.cpp new file mode 100644 index 0000000..96ad9c7 --- /dev/null +++ b/div/FourOperator/UnitTest1/pch.cpp @@ -0,0 +1,44 @@ +// pch.cpp: 与预编译标头对应的源文件 +#pragma once +#include "pch.h" +int CalcCount(int n, char(*str)[10]) +{ + TCHAR chSectionNames[2048] = { 0 };//定义一个数组,保存读取节的名字 + char* pSectionName; //保存找到的某个节名字符串的首地址 + int i = 0; //i指向数组chSectionNames的某个位置,从0开始,顺序后移 + int j = 0; //j用来保存下一个节名字符串的首地址相对于当前i的位置偏移量 + int k = 0; //临时变量,用于给str数组赋值 + int m = 0; //临时变量,用于给str数组赋值 + int count = 0; //统计节的个数 + GetPrivateProfileSectionNames(chSectionNames, 2048, "..//ex1.ini");//获取文件中的节名,每个节名以"\0"分割,保存在chSectionNames中 + //要加头文件 + for (i = 0; i < 2048; i++, j++)//对chSectionName中保存的内容进行拆分 + { + if (chSectionNames[0] == '\0')//如果第一个字符就是0,则说明ini中一个节也没有, + { + break; + } + if (chSectionNames[i] == '\0') + { + count++; + pSectionName = &chSectionNames[i - j]; //找到一个0,则说明从这个字符往前,减掉j个偏移量, + //就是一个节名的首地址 + j = -1; //找到一个节名后,j的值要还原,以统计下一个节名地址的偏移量 + //赋成-1是因为节名字符串的最后一个字符0是终止符,不能作为节名 + for (m = 0; m <= strlen(pSectionName); m++)//把找到的节名保存到str中 + { + str[k][m] = *(pSectionName + m); + } + //str[k][++m] = '\0';//手动给节名加上\0,表示这个节名结束 + k++;//变量自加,用来保存下一个节名 + //在获取节名的时候可以获取该节中键的值,前提是我们知道该节中有哪些键。 + if (chSectionNames[i + 1] == 0) + { + break; //当两个相邻的字符都是0时,则所有的节名都已找到,循环终止 + } + } + } + return count;//返回节名的个数 +} + +// 当使用预编译的头时,需要使用此源文件,编译才能成功。 diff --git a/div/FourOperator/UnitTest1/pch.h b/div/FourOperator/UnitTest1/pch.h new file mode 100644 index 0000000..f455103 --- /dev/null +++ b/div/FourOperator/UnitTest1/pch.h @@ -0,0 +1,14 @@ +// pch.h: 这是预编译标头文件。 +// 下方列出的文件仅编译一次,提高了将来生成的生成性能。 +// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 +// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 +// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 + +#ifndef PCH_H +#define PCH_H +#include + +#include +// 添加要在此处预编译的标头 +int CalcCount(int n, char(*str)[10]); +#endif //PCH_H diff --git a/div/FourOperator/ex1.ini b/div/FourOperator/ex1.ini new file mode 100644 index 0000000..ad56483 --- /dev/null +++ b/div/FourOperator/ex1.ini @@ -0,0 +1,21 @@ +[a] +na=6 +nb=2 +nExpect=3 +[b] +na=4 +nb=2 +nExpect=2 +[c] +na=3 +nb=0 +nExpect=0 +[d] +na=100 +nb=10 +nExpect=10 +[e] +na=100 +nb=10 +nExpect=10 + diff --git a/div/dev函数及其单元测试说明.md b/div/dev函数及其单元测试说明.md new file mode 100644 index 0000000..9c183fc --- /dev/null +++ b/div/dev函数及其单元测试说明.md @@ -0,0 +1,229 @@ +# dev函数说明文档 +## 一、工程说明 +- 本工程的配置类型是一个exe可执行文件,工程内存在四个函数接口,分别为加、减、乘、除。加法函数接口是调用add静态库实现;减法函数接口是采用在工程中配置加载sub动态库的方式实现;乘法接口以运行时加载动态库mul的方式实现;除法接口调用本身函数的方式实现。 +## 二、工程文件 +1. 除法函数 + - 头文件 dev.h ,放的是dev的声明 + ```C + #pragma once + #include + #include + /* + **函数名: dev + **参数:int ,int + **返回值:int + **函数功能:传入两个int类型的参数,对其进行除法运算并返回两数之商。 + */ + int dev(int x, int y); + ``` + - 源文件 dev.cpp ,放的是dev函数的定义 + ```C + #include "dev.h" + int dev(int x, int y) + { + if (y == 0) + { + printf("除数不能为0!\n"); + return 0; + } + else + { + printf("%d / %d = %d\n", x, y, x / y); + return x / y; + } + } + ``` +2. 加、减、乘、接口 +- 头文件 Oper_api.h ,放的是add_api,sub_api,mul_api接口声明 + ```C + #pragma once + #include"sub.h" + #include + #include + #pragma comment(lib,"./B.lib") + typedef int(WINAPI* MulFunc)(int x, int y); + + /* + **函数名: add_api + **参数:int ,int + **返回值:long long + **函数功能:传入两个int类型的参数,调用静态库add函数的方式实现。 + */ + long long add_api(int x, int y); + + /* + **函数名: sub_api + **参数:int ,int + **返回值:int + **函数功能:传入两个int类型的参数,调用动态库sub函数的方式实现。 + */ + int sub_api(int x, int y); + + /* + **函数名: mul_api + **参数:int ,int + **返回值:long long + **函数功能:传入两个int类型的参数,运行时加载动态库mul,实现乘法运算。 + */ + void mul_api(int x, int y); + ``` +- 源文件 Oper_api.cpp ,放的是add_api,sub_api,mul_api接口定义 + ```C + #pragma once + #include "Opera_api.h" + #include"add.h" + + //函数接口add_api的实现 + long long add_api(int x, int y) + { + long long res = add(x, y); + printf("%d + %d = %lld\n", x, y, res); + return res; + } + + //函数接口sub_api的实现 + int sub_api(int x, int y) + { + printf("%d - %d = %d\n", x, y, x - y); + return x - y; + } + + //函数接口mul_api的实现 + long long mul_api(int x, int y) + { + HMODULE hdll = LoadLibrary("../../C/Debug/C.dll"); + if (hdll != NULL) + { + MulFunc MUL1 = (MulFunc)GetProcAddress(hdll, (char*)(1)); + if (MUL1 != NULL) + { + printf("%d * %d = %lld\n", x, y, MUL1(x, y)); + return MUL1(x, y); + } + FreeLibrary(hdll); + } + } + ``` + 3. 调用函数 main.c ,对接口进行调用 + ```C + #include "Opera_api.h" + #include "dev.h" + int main() + { + int a = 2147483647, b = 2; + add_api(a, b);//调用 加法接口add_api + sub_api(a, b);//调用 减法接口sub_api + mul_api(a, b); //调用 乘法接口mul_api + dev(a, b);//调用 除法接口dev_api + + + return 0; + } + + ``` + 4. 运行结果如下: + ![](./pic/main.jpg) + ## 三、单元测试 + - 手动创建ini文件并添加测试样例,之后在单元测试的源文件里对ini文件进行读取解析 ,完成以后获取单元测试的结果,保证代码覆盖率在80%以上。其中对ini文件的读取另封装了函数,见下面的源码。 +1. ini文件内容 exl.ini + ``` + [TestMethod1] #测试样例1 + na=10 #函数第一个入数 + nb=2 #函数第二个入参 + nExpect=5 #两个入参相除的正确结果 + [TestMethod2] + na=12 + nb=3 + nExpect=4 + [TestMethod3] + na=90 + nb=3 + nExpect=30 + ``` +2. 读取ini文件的函数 int CalcCount(int n, char(*str)[10]) +```C +/* +**函数功能:获取一个ini文件里有多少个节,并通过二维指针数组将节名带出来。 +* 函数名:CalcCount() +* 入参:int n --------节的个数 +* char (*str)[10] --------二维数组指针,10是节名的长度,可以根据需求修改 +*返回值:int --------返回节的个数 +*/ +int CalcCount(int n, char(*str)[10]) +int CalcCount(int n, char(*str)[10]) +{ + TCHAR chSectionNames[2048] = { 0 };//定义一个数组,保存读取节的名字 + char* pSectionName; //保存找到的某个节名字符串的首地址 + int i = 0; //i指向数组chSectionNames的某个位置,从0开始,顺序后移 + int j = 0; //j用来保存下一个节名字符串的首地址相对于当前i的位置偏移量 + int k = 0; //临时变量,用于给str数组赋值 + int m = 0; //临时变量,用于给str数组赋值 + int count = 0; //统计节的个数 + GetPrivateProfileSectionNames(chSectionNames, 2048, "..//ex1.ini");//获取文件中的节名,每个节名以"\0"分割,保存在chSectionNames中 + //要加头文件 + for (i = 0; i < 2048; i++, j++)//对chSectionName中保存的内容进行拆分 + { + if (chSectionNames[0] == '\0')//如果第一个字符就是0,则说明ini中一个节也没有, + { + break; + } + if (chSectionNames[i] == '\0') + { + count++; + pSectionName = &chSectionNames[i - j]; //找到一个0,则说明从这个字符往前,减掉j个偏移量, + //就是一个节名的首地址 + j = -1; //找到一个节名后,j的值要还原,以统计下一个节名地址的偏移量 + //赋成-1是因为节名字符串的最后一个字符0是终止符,不能作为节名 + for (m = 0; m <= strlen(pSectionName); m++)//把找到的节名保存到str中 + { + str[k][m] = *(pSectionName + m); + } + k++;//变量自加,用来保存下一个节名 + //在获取节名的时候可以获取该节中键的值,前提是我们知道该节中有哪些键。 + if (chSectionNames[i + 1] == 0) + { + break; //当两个相邻的字符都是0时,则所有的节名都已找到,循环终止 + } + } + } + return count;//返回节名的个数 +} +``` +3. 单元测试源码 UNITest1.cpp +```C +#include "pch.h" +#include "CppUnitTest.h" +#include +#include +#include"../FourOperator/dev.h" +#define FilePath "../ex1.ini" +using namespace Microsoft::VisualStudio::CppUnitTestFramework; + +namespace UnitTest1 +{ + TEST_CLASS(UnitTest1) + { + public: + int j = 0;//循环变量,用来访问ini文件中的 节 + char str[50][10] = { 0 };//存放ini文件里 节的名字 + int count = CalcCount(50, str);//保存ini文件里 节的个数 + TEST_METHOD(TestMethode1) + { + int nReal;//保存运算结果 + CString na, nb, nExpect; //保存测试样例中的键值 + for (j = 0; j < count; j++)//遍历读取测试样例 + { + GetPrivateProfileString(str[j], "na", " ", na.GetBuffer(20), 20, FilePath);//读取第一个参数,保存在na里 + GetPrivateProfileString(str[j], "nb", " ", nb.GetBuffer(20), 20, FilePath);//读取第二个参数,保存在nb里 + GetPrivateProfileString(str[j], "nExpect", " ", nExpect.GetBuffer(20), 20, FilePath);//读取正确的值,保存在nExpect里 + nReal = dev(_ttoi(na), _ttoi(nb)); //_ttoi是CString转为整型,把运算结果给nReal + Assert::AreEqual(nReal, _ttoi(nExpect));//对比运算结果和正确结果 + } + + } + }; +} +``` +4. 附加测试结果 +![](./pic/dev.jpg) + diff --git a/div/pic/dev.jpg b/div/pic/dev.jpg new file mode 100644 index 0000000..4eaa0bf Binary files /dev/null and b/div/pic/dev.jpg differ diff --git a/div/pic/main.jpg b/div/pic/main.jpg new file mode 100644 index 0000000..ce10fee Binary files /dev/null and b/div/pic/main.jpg differ