cái matplotlibcpp.h dùng để giải đồ thị ạ,em tìm tài liệu các trường đại học trên cửu dương thần công ạ,đoạn code chính nằm ở học thử.cpp ạ,tại em thấy bản vs từ 2012 nó có hỗ trợ có dấu nên em đặt luôn ạ
Download numpy/arrayobject.h ở đâu?
Đăng code trong file học thử.cpp
lên đây đi em.
#include<Python.h>
#include<matplotlibcpp.h>
#include<iostream>
#include<python.hpp>
#include<cmath>
#include<stdio.h>
#include<conio.h>
#include<iomanip>
#include<string>
#include<ctype.h>
#include<ctime>
#include<fstream>
#include<functional>
#include<iosfwd>
#include<amp_graphics.h>
//#include<boost/python.hpp>
//namespace python = boost::python;
//namespace plt = matplotlibcpp;
using namespace std;
//namespace python = boost::python;
namespace python = boost::python;
namespace plt = matplotlibcpp;
int doc_so_nguyen();
int tong_so_nguyen(int,int);
void viet_ket_qua(int a, int b, int kq);
int SumInt(int *p, int N) {
int* p2 = p + N, k = 0;
while (p < p2)
k += *p++;
return k;
}
static int values[] =
{
0, 0, 2,3*3-3,4*4-4,5*5-5,6*6-6,7*7-7,8*8-8, 9*9- 9
};
int f(int i) {
if (i < 10 && i >= 0)
return values[i];
return 0; }
int main() {
#if 1
//int a, b;
char c,str[50]="hoanganhkiet";
int len = strlen(str),a,b;
int x=5,y=5;
#if 0
if (a > sqrt(b))
{
x = a*a + 3*a + 2;
}
#endif
#if 0
int a;
cout<<"nhap gia tri cho a : ";
cin>>a;
cout<<"\n";
#endif
#endif
#if 0
do
{
}
until();
#endif
do {
#if 0
cout << "nhap vao so nguyen dau tien: ";
cin >> a;
cout<<"\n";
cout << "nhap vao so nguyen sau cung: ";
cin >> b;
cout<<"\n";
#endif
#if 0
int a = doc_so_nguyen();
int b = doc_so_nguyen();
int T = tong_so_nguyen(a,b);
viet_ket_qua(a,b,T);
#endif
#if 0
int tong=0;
int a[] = {1, 2, 3, 4,5};
int k = SumInt(a,4);
cout<<"\t"<<k<<"\t\n";
#endif
#if 0
int Total = 0;
for (int i = a; i <= b; ++i)
Total += i;
cout << "Tong tu " << a << " den " << b
<< " la : " << Total << "\n\n";
#endif
#if 0
cout<<f(a)<<"\n";
#endif
#if 0
for (int i = 1; i<=5;i++)
{
x =x + len;
y = y + len + 1;
}
cout<<x<<"\n\n";
cout<<y<<"\n\n";
#endif
#if 0
cout<<"\n";
#endif
#if 0
cout<<"nhap a : ";
cin>>a;
cout<<"\n";
cout<<"nhap b : ";
cin>>b;
cout<<"\n";
#endif
#if 0
char s[100]="hoanganhkiet";
char searchValue[2]="a";
int pos,tim, size ;
size = strlen(s);
pos = 0;
#endif
#if 0
while ((pos < size) && (s[pos] != searchValue[0]))
{
pos++;
}
if (pos >= size)
{
tim =0;
}
else
{
tim = 1;
}
#endif
#if 0
size = strlen(s);
strcat(s, searchValue);
pos = 0;
while ( s[pos] != searchValue[0])
pos++;
if (pos >= size)
{
tim =0;
}
else
{
tim = 1;
}
cout<<tim<<"\n\n";
//cout<<pos<<"\n\n";
cout<<size<<"\n\n";
//cout<<s[pos];
cout<<s<<"\n\n";
#endif
float d;
cout<<"nhap d : ";
cin>>d;
float M = sin(d);
for (int i =0; i<100;i++)
{
plt::plot(i, i*M);
}
cout << "ban co muon tiep tuc khong , neu khong thi nhap c = nhan ESC"<<"\n\n";
cout<<"nhap c : ";
c=getch();
cout<<"\n\n";
} while (c != 27);
system("pause");
return 0;
}
int doc_so_nguyen() {
cout << "nhap vao 1 so nguyen : ";
int N;
cin >> N;
cout<<"\n";
return N;
}
int tong_so_nguyen(int a, int b) {
int Total = 0;
for (int i = a; i <= b; ++i)
Total += i;
return Total;
}
void viet_ket_qua(int a, int b ,int kq) {
cout << "Tong tu " << "a" << " den " << "b"
<< " la : " << tong_so_nguyen(a,b) << endl;
}
Đặt code trong cặp 3 dấu huyền ``` nha em, cái này là nguyên tắc cơ bản khi đăng code lên DNH rồi. Mà tại sao có vài lại include không có thư viện nào vậy ?
sao ko xài python luôn =]
em học kĩ thuật lập trình dùng c++ có thư viện python ạ
có cho xài pybind11 ko hay chỉ cho xài boost.python thôi? :V
` chứ không phải là ’ nha em
https://daynhauhoc.com/t/cach-post-code-dung-markdown-trong-category-programming/
pybind11 là gì anh,vâng em chỉ sài boost.python thôi ạ
Em cài git, cmake (3.18), python (3.8) rồi clone vcpkg về: mở cmd lên, gõ:
cd C:
git clone https://github.com/Microsoft/vcpkg
rồi gõ tiếp (nhớ đuôi .bat)
cd vcpkg
bootstrap-vcpkg.bat
đợi nó build xong rồi install tiếp pybind11:
vcpkg install pybind11
rồi tạo 1 thư mục cho project C++ mới ở đâu đó :V Anh thích xài CMake cho dễ:
ví dụ thư mục project là C:\Users\tri\Source\Repos\test
em tạo 1 file có tên CMakeLists.txt
có nội dung là:
cmake_minimum_required(VERSION 3.10)
project("test" LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(pybind11 REQUIRED)
add_executable(${PROJECT_NAME} src/main.cpp)
target_link_libraries(${PROJECT_NAME} PRIVATE pybind11::pybind11 pybind11::embed)
rồi em tạo tiếp thư mục src
trong đó, tạo 1 file main.cpp
trong src
có nội dung
#include <pybind11/embed.h>
namespace py = pybind11;
int main() {
py::scoped_interpreter guard{};
py::print("Hello, World!");
}
rồi ra lại cmd, cd tới thư mục chứa file CMakeLists.txt
, gõ
md build && cd build
cmake .. -G"Visual Studio 16 2019" -A x64 "-DCMAKE_TOOLCHAIN_FILE=C:\vcpkg\scripts\buildsystems\vcpkg.cmake" -DCMAKE_BUILD_TYPE=Release
chờ nó config xong là em có thể vô thư mục build
trong đó rồi mở file .sln
bằng VS lên là được :V Còn em chưa muốn mở thì gõ tiếp:
cmake --build . --config Release
để build ra file exe rồi chạy thử:
Release\test
nó in ra Hello, World!
là em xong bước 1 =]] Chờ bước 2 để xài matplotlib mà được bước 1 cái đã =]]
bước 2 enable matplotlib =]
em install virtualenvwrapper
cho Python. Hình như nó có sẵn :V nếu chưa có thì em gõ pip install virtualenvwrapper-win
để install nó, rồi chạy
mkvirtualenv test
chờ nó tạo 1 môi trường ảo mới xong rồi em xem nó install ở đâu =] ví dụ của anh nó in ra dòng
New python executable in C:\Users\tri\Envs\test\Scripts\python.exe
tức là môi trường ảo nằm ở C:\Users\tri\Envs\test
. Em có thể vào C:\Users\tri\Envs\test\Lib\site-packages
chụp 1 cái hình xem ban đầu nó gồm những thư mục nào :V
trở lại màn hình cmd, nếu nó chưa hiện (test)
thì em có thể gõ workon test
để vào môi trường ảo mới tạo, rồi install matplotlib:
pip install matplotlib
quay trở lại project c++ :V Sửa file main.cpp lại thành:
#include <pybind11/embed.h>
namespace py = pybind11;
int main(int argc, char** argv) {
py::scoped_interpreter guard{};
py::module::import("sys").attr("argv").attr("append")(argv[0]); // needed for matplotlib gui
py::exec(R"(
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
# Data for plotting
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
fig, ax = plt.subplots()
ax.plot(t, s)
ax.set(xlabel='time (s)', ylabel='voltage (mV)',
title='About as simple as it gets, folks')
ax.grid()
fig.savefig("test.png")
plt.show()
)");
}
rồi build lại: (nhớ cd vào thư mục build)
cmake --build . --config Release
và chạy thử:
Release\test
con trỏ chuột nó quay vòng vòng rồi ngủm, là vì file test.exe ko biết đường dẫn tới thư viện python ở đâu. Em có thể set nó trong cmd rồi chạy lại:
set PYTHONPATH=C:\Users\tri\Envs\test\Lib\site-packages
Release\test
nó hiện ra hình này là ngon lành :V
nếu xài VS để build rồi chạy, ko set pythonpath được như trong cmd, em có thể xài Boost.Process
để set :V
Install qua vcpkg:
vcpkg install boost-process
rồi sửa file CMakeLists.txt
lại:
cmake_minimum_required(VERSION 3.10)
project("test" LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(pybind11 REQUIRED)
find_package(Boost 1.73 REQUIRED)
add_executable(${PROJECT_NAME} src/main.cpp)
target_link_libraries(${PROJECT_NAME} PRIVATE
pybind11::pybind11 pybind11::embed
${Boost_LIBRARIES})
và file main.cpp
:
#include <pybind11/embed.h>
namespace py = pybind11;
#include <boost/process/environment.hpp>
int main(int argc, char** argv) {
auto env = boost::this_process::environment();
env["PYTHONPATH"] = "C:\\Users\\tri\\Envs\\test\\Lib\\site-packages"; // must set before `py::scoped_interpreter`
py::scoped_interpreter guard{};
py::module::import("sys").attr("argv").attr("append")(argv[0]);
py::exec(R"(
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
# Data for plotting
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
fig, ax = plt.subplots()
ax.plot(t, s)
ax.set(xlabel='time (s)', ylabel='voltage (mV)',
title='About as simple as it gets, folks')
ax.grid()
fig.savefig("test.png")
plt.show()
)");
}
rồi chạy thử, (nhớ xóa bỏ pythonpath ra khỏi cmd hiện tại set PYTHONPATH=
nếu có set pythonpath trước đó)
Release\test
chạy ngon lành :V
làm xong nếu em muốn distribute qua máy khác thì có thể vào site-packages
hồi nãy, xem có thư mục nào mới copy hết vào thư mục Release chứa test.exe
là được (hình như có khoảng 10 thư mục gì đó). Copy hết kiểu này thì ko cần set pythonpath bằng boost.process nữa. Nhớ copy thêm python38.dll
gì ở trong thư mục Python nữa :V (ko cần copy python.exe).
Chi tiết cách xài pybind11::embed https://pybind11.readthedocs.io/en/stable/advanced/embedding.html đừng có chơi 1 câu py::exec
thế kia :V
em không có file vcpkg ạ
em clone được thư mục vcpkg chưa :V
không có file nào tên vcpkg ạ
em bật cmd.exe lên gõ
cd C:
git clone https://github.com/Microsoft/vcpkg
chưa? :V Sau đó vào C:\vcpkg
rồi gõ tiếp boootstrap-vcpkg
là có
em đã làm được gì rồi? Install git và cmake chưa?
Chắc là em nó không biết git là gì :V. Mà khoan…
Hình như thế này mới đúng
git clone https://github.com/Microsoft/vcpkg.git
Mở cmd ra rồi chạy mấy lệnh đó thôi. Nói thật luôn chứ git là thứ mà mọi lập trình viên phải biết, ít nhất là ở hiện tại và tương lai gẫn.
ko có .git cũng ko sao mà chắc lúc build vcpkg.exe bị lỗi gì đó :V
https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository
doc ghi thế, gặp thêm dân làm biếng thì khỏi cần