Download numpy/arrayobject.h ở đâu?

#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 :thinking:?

3 Likes

sao ko xài python luôn =]

4 Likes

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

1 Like

` chứ không phải là ’ nha em
https://daynhauhoc.com/t/cach-post-code-dung-markdown-trong-category-programming/

2 Likes

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 đã =]]

3 Likes

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

https://pybind11.readthedocs.io/en/stable/

4 Likes

em không có file vcpkg ạ :star_struck: :star_struck: :star_struck: :star_struck: :star_struck:

em clone được thư mục vcpkg chưa :V

2 Likes

không có file nào tên vcpkg ạ :innocent: :innocent: :innocent: :innocent: :innocent: :innocent:

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?

5 Likes

Chắc là em nó không biết git là gì :V. Mà khoan…

Hình như thế này mới đúng :thinking:

git clone https://github.com/Microsoft/vcpkg.git
4 Likes

em cài 2 thứ đó rồi

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.

1 Like

ko có .git cũng ko sao mà :joy: 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
image
doc ghi thế, gặp thêm dân làm biếng thì khỏi cần :innocent:

3 Likes

Ừ đúng thật :rofl:. Mới vừa thử xong :rofl:


anh ơi lỗi nữa nè

VS của em là năm mấy 2013 hay 2019 :V

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?