日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

使用数值计算库Zero - VC6调用失败、cfree调用成功

發布時間:2025/4/14 c/c++ 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用数值计算库Zero - VC6调用失败、cfree调用成功 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Zero是一個功能豐富的C++數值計算庫,具有復數、向量、矩陣等類,具備求根,擬合,插值,積分,隨機數,統計,全局和局部的約束以及無約束優化,常微分方程求解等多項功能。

先下載一份Zero;看一下,有dll,手冊,還有libZero.dll.a文件;有gcc的庫文件,沒有VC++的庫文件(lib);

先用VC6調用一下;

先下載一個由DLL生成lib文件的工具,生成lib文件看一下;

? ? 生成一個lib文件;

生成一個單文檔工程;項目做如下設置;先拷貝lib文件到項目;

Zero.dll拷貝到exe目錄;項目要包含zero提供的頭文件,下載來就有;

OnDraw函數代碼如下;

void CTestzeroView::OnDraw(CDC* pDC) {CTestzeroDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;Complex a1,a2,a3;a1.setReal(10.0);a1.setImag(5.0); //虛數,imaginary numbera2.setReal(6.0);a2.setImag(2.0);a3 = a1-a2;str1.Format("a3 is: %f + %f", a3.getReal(), a3.getImag());pDC->TextOut(50,50,str1); }

然后構建;總是出這個錯誤;

? ??error LNK2001: unresolved external symbol "public: virtual __thiscall Complex::~Complex(void)" (??1Complex@@UAE@XZ)

可能是沒有找到lib文件;? ??

使用代碼導入lib文件;

? ? #pragma comment(lib, "Zero.lib")

還是一樣報LNK2001錯誤;

代碼中應該找到了lib文件;因為如果隨意改個不存在的lib文件名字,如: #pragma comment(lib, "Zerodddd.lib")

?則提示:? ? LINK : fatal error LNK1104: cannot open file "Zerodddd.lib"

那么到此有可能是,用工具生成的lib文件有問題;zero本身不提供lib文件;

如果采用動態調用dll方式,則比較麻煩;動態裝入DLL,獲取函數地址,然后調用的方式;因為zero的dll提供的是類;

下面用CFree看一下;主文件代碼如下;要把它的頭文件包含進來;

#include <windows.h> #include <stdio.h> #include "resource.h" #include "zero.h"LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);HINSTANCE hInst; TCHAR szClassName[] = TEXT("zeroDemo");Complex a1,a2,a3;int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil) {HWND hwnd;MSG messages;WNDCLASSEX wincl;hInst = hThisInstance;wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProcedure;wincl.style = CS_DBLCLKS;wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);wincl.hCursor = LoadCursor (NULL, IDC_ARROW);wincl.lpszMenuName = MAKEINTRESOURCE (IDC_TESTZERO2);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("zero示例"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,400,HWND_DESKTOP,NULL,hThisInstance,NULL);ShowWindow (hwnd, nFunsterStil);while (GetMessage (&messages, NULL, 0, 0)){TranslateMessage(&messages);DispatchMessage(&messages);}return messages.wParam; }LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {PAINTSTRUCT ps;HDC hdc;RECT rt; char szBuffer[100]; switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_zero: hdc=GetDC(hwnd);a1.setReal(10.0);a1.setImag(5.0); //虛數,imaginary numbera2.setReal(6.0);a2.setImag(2.0);a3 = a1-a2;//wsprintf(szBuffer, "%d",a1.getReal());sprintf(szBuffer,"a1: %lf + %lf",a1.getReal(),a1.getImag());TextOut(hdc,10,10,szBuffer,lstrlen(szBuffer));sprintf(szBuffer,"a2: %lf + %lf",a2.getReal(),a2.getImag());TextOut(hdc,10,40,szBuffer,lstrlen(szBuffer));sprintf(szBuffer,"a3=a1-a2: %lf + %lf",a3.getReal(),a3.getImag());TextOut(hdc,10,70,szBuffer,lstrlen(szBuffer));break;case IDM_ABOUT:MessageBox (hwnd, TEXT ("zeroDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("zeroDemo"), MB_OK | MB_ICONINFORMATION);break;case IDM_EXIT:DestroyWindow(hwnd);break;default:return DefWindowProc(hwnd, message, wParam, lParam); }break;case WM_CREATE:break;case WM_PAINT:hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rt); EndPaint(hwnd, &ps);break;case WM_DESTROY:PostQuitMessage (0);break;default:return DefWindowProc (hwnd, message, wParam, lParam);}return 0; }

如果做如下的設置;libZero.dll.a拷貝到exe目錄,拷貝到CFree的庫文件目錄;dll拷貝到exe目錄;

則一直提示連接錯誤;

正在連接...
[Error] C:\PROGRA~2\C-FREE~1\mingw\bin\ld.exe: cannot find -llibZero.dll.a

配置為如下,則構建成功;

然后運行程序,結果如下;

?代碼只是簡單的調用一下它的復數類;定義2個復數并賦值實部和虛部;再計算復數相減的結果;它的復數類是可用的;

其他更多功能自己探索;

wsprintf不支持格式化浮點類型,改用sprintf,sprintf需要包含#include <stdio.h>;

#include "resource.h" #include <windows.h>/ // // Menu //IDC_TESTZERO2 MENU BEGINPOPUP "&File"BEGINMENUITEM "ZERO", IDM_zeroMENUITEM "E&xit", IDM_EXITENDPOPUP "&Help"BEGINMENUITEM "&About ...", IDM_ABOUTEND END #define IDM_EXIT 10001 #define IDM_ABOUT 10002#define IDC_TESTZERO2 10101 #define IDD_ABOUTBOX 10102 #define IDM_zero 40001

?

總結

以上是生活随笔為你收集整理的使用数值计算库Zero - VC6调用失败、cfree调用成功的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。