亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Jadual Kandungan
Analisis Mekanisme Lulus Rujukan Pybind11 dan C
1. Tingkah laku lulus rujukan objek tunggal
2. Perangkap objek lulus dengan rujukan
3. Penyelesaian: Gunakan senarai penunjuk lulus
Nota dan ringkasan
Rumah pembangunan bahagian belakang Tutorial Python Penyelesaian kepada Masalah yang C LENGKAP RUJUKAN SENARAI PENGENDALI

Penyelesaian kepada Masalah yang C LENGKAP RUJUKAN SENARAI PENGENDALI

Oct 15, 2025 pm 03:18 PM

Penyelesaian kepada Masalah yang C LENGKAP RUJUKAN SENARAI PENGENDALI

Artikel ini meneroka tingkah laku pybind11 apabila mengendalikan pemindahan rujukan C, terutamanya masalah yang apabila fungsi C menerima STD :: vektor sebagai parameter rujukan dan mengubah unsur -unsur dalamannya, pengubahsuaian objek sampingan Python tidak berkuatkuasa. Artikel ini menghuraikan perbezaan antara lulus rujukan objek tunggal dan senarai rujukan objek lulus, dan mencadangkan penyelesaian menggunakan STD :: vektor sebagai parameter untuk memastikan pengubahsuaian elemen senarai oleh fungsi C dapat dicerminkan dengan betul pada sisi python, dan menyediakan contoh dan langkah -langkah yang sesuai.

Analisis Mekanisme Lulus Rujukan Pybind11 dan C

Apabila menggunakan Pybind11 untuk mendedahkan kod C ke Python, adalah penting untuk memahami bagaimana parameter yang dilalui dalam C (mengikut nilai, dengan rujukan, dengan penunjuk) peta untuk membantah tingkah laku dalam Python. Kekeliruan yang sama adalah sama ada bahagian Python dapat mengesan perubahan ini apabila fungsi C mengubah objek dengan rujukan.

1. Tingkah laku lulus rujukan objek tunggal

Pertama, mari kita lihat kelas asas C dan fungsi yang mengubah kandungannya.

Contoh kod C:

 // mymodule.cpp
#include <pybind11>
#include <vector>

ruang nama py = pybind11;

// Tentukan kelas C yang sederhana a
Kelas A {
awam:
    int n = 0;
    double val = 0.0;
    A () = lalai; // pembina lalai};

// Fungsi b: Lulus objek dengan nilai sebaris void b_by_value (a) {
    an = 1;
    A.VAL = 0.1;
}

// Fungsi b: Lulus objek A dengan rujukan inline void b_by_reference (a & a) {
    AN = 2;
    A.Val = 0.2;
}

// pybind11 mengikat kod pybind11_module (mymodule, m) {
    m.doc () = "Pybind11 Contoh untuk lulus rujukan";

    py :: class_ <a> (m, "a")
        .def (py :: init  ())
        .def_readWrite ("n", & a :: n)
        .def_readWrite ("val", & a :: val);

    m.def ("b_by_value", & b_by_value, "mengubah nilai dengan nilai (tiada perubahan dalam python)");
    m.def ("b_by_reference", & b_by_reference, "mengubah suai dengan rujukan (perubahan yang dicerminkan dalam python)");
}</a></vector></pybind11>

Contoh Interaktif Python:

 import mymodule

# 1. Lulus a_val dengan nilai = myModule.a ()
cetak (f "sebelum b_by_value: a_val.n = {a_val.n}, a_val.val = {a_val.val}")
mymodule.b_by_value (a_val)
cetak (f "selepas b_by_value: a_val.n = {a_val.n}, a_val.val = {a_val.val}")
# Hasil: a_val belum diubah suai # 2. Pass a_ref dengan rujukan = myModule.a ()
cetak (f "sebelum b_by_reference: a_ref.n = {a_ref.n}, a_ref.val = {a_ref.val}")
mymodule.b_by_reference (a_ref)
cetak (f "selepas b_by_reference: a_ref.n = {a_ref.n}, a_ref.val = {a_ref.val}")
# Hasil: A_REF berjaya diubah suai

Seperti yang dapat dilihat dari contoh di atas, apabila fungsi C menerima objek tunggal melalui rujukan tidak konsisten, PYBIND11 dapat memetakan objek Python dengan betul ke rujukan C, yang membolehkan pengubahsuaian di sisi C dapat dicerminkan pada sisi python.

2. Perangkap objek lulus dengan rujukan

Walau bagaimanapun, keadaan menjadi rumit apabila fungsi C perlu mengubah suai senarai yang mengandungi pelbagai objek (seperti STD :: vektor ). Jika fungsi C menerima std :: vektor & sebagai parameter dan mengubah elemen dalamannya, pengubahsuaian ini mungkin tidak dapat dilihat dalam objek senarai yang sepadan di sisi python.

Contoh kod C (Versi Masalah):

 // kemudian mymodule.cpp di atas
// ... (kod mengikat antara kelas A dan py :: class_ <a> kekal tidak berubah)

// Fungsi C: Lulus senarai objek dengan rujukan sebaris void c_list_by_reference (std :: vector </a><a> & alist) {
    untuk (auto & a: alist) {
        an = 3;
        A.VAL = 0.3;
    }
}

// pybind11 mengikat kod pybind11_module (mymodule, m) {
    // ... (mengikat antara Kelas A dan B_By_Value, b_by_reference kekal tidak berubah)
    m.def ("c_list_by_reference", & c_list_by_reference, "mengubah senarai dengan rujukan (elemen mungkin tidak dikemas kini dalam python)");
}</a>

Contoh interaktif Python (pembiakan masalah):

 import mymodule

# Buat senarai python yang mengandungi objek list_a = [myModule.a (), myModule.a ()]
cetak (f "sebelum c_list_by_reference:")
Untuk saya, OBJ dalam Enumerate (list_a):
    cetak (f "list_a [{i}]: n = {obj.n}, val = {obj.val}")

mymodule.c_list_by_reference (list_a)

cetak (f "selepas c_list_by_reference:")
Untuk saya, OBJ dalam Enumerate (list_a):
    cetak (f "list_a [{i}]: n = {obj.n}, val = {obj.val}")
# Hasil: unsur -unsur dalam list_a belum diubah suai

Walaupun fungsi C c_list_by_reference secara dalaman mengubah setiap objek dalam std :: vektor Dengan rujukan, pengubahsuaian ini tidak dapat dilihat pada objek A dalam list_a python. Ini biasanya kerana pybind11, apabila menukar senarai python ke std :: vektor &, mungkin telah membuat salinan objek A, atau mekanisme dalamannya, walaupun ia adalah rujukan, gagal memetakan perubahan kepada unsur -unsur dalam vektor C kembali ke unsur -unsur asal senarai Python.

3. Penyelesaian: Gunakan senarai penunjuk lulus

Untuk menyelesaikan masalah std :: vektor & pengubahsuaian tidak berkuatkuasa, kunci adalah untuk memastikan bahawa fungsi C beroperasi pada contoh objek C yang sama yang dirujuk oleh objek Python. Ini boleh dicapai dengan lulus std :: vektor (iaitu senarai petunjuk kepada objek).

Contoh kod C (penyelesaian):

 // kemudian mymodule.cpp di atas
// ... (kod mengikat antara kelas A dan py :: class_ <a> kekal tidak berubah)

// Fungsi D: Lulus senarai penunjuk objek dengan rujukan inline void d_list_by_pointer_reference (std :: vector </a><a> & alist_ptrs) {
    untuk (a* a_ptr: alist_ptrs) {
        jika (a_ptr) {// semak jika penunjuk itu kosong a_ptr-> n = 4;
            a_ptr-> val = 0.4;
        }
    }
}

// pybind11 mengikat kod pybind11_module (mymodule, m) {
    // ... (mengikat antara kelas A dan B_By_Value, b_by_reference, c_list_by_reference kekal tidak berubah)
    m.def ("d_list_by_pointer_reference", & d_list_by_pointer_reference, "Mengubah senarai menggunakan petunjuk (perubahan yang ditunjukkan dalam python)");
}</a>

Contoh Interaktif Python (Penyelesaian Pengesahan):

 import mymodule

# Buat senarai python yang mengandungi objek list_a_solution = [myModule.a (), myModule.a ()]
cetak (f "sebelum d_list_by_pointer_reference:")
Untuk saya, OBJ dalam Enumerate (list_a_solution):
    cetak (f "list_a_solution [{i}]: n = {obj.n}, val = {obj.val}")

mymodule.d_list_by_pointer_reference (list_a_solution) # pybind11 secara automatik akan menukar objek dalam senarai python ke*

cetak (f "selepas d_list_by_pointer_reference:")
Untuk saya, OBJ dalam Enumerate (list_a_solution):
    cetak (f "list_a_solution [{i}]: n = {obj.n}, val = {obj.val}")
# Hasil: unsur -unsur dalam list_a_solution berjaya diubah suai

Apabila fungsi C menerima std :: vektor , pybind11 melangkah melalui senarai python, mendapat penunjuk kepada contoh asas C setiap objek A, dan membina std :: vektor untuk lulus ke fungsi c. Fungsi C secara langsung mengubah objek asal C melalui petunjuk ini, dan pengubahsuaian ini secara semulajadi dapat dilihat dalam objek yang sepadan di sisi python.

Nota dan ringkasan

  1. Pemilihan Jenis Parameter:
    • Untuk objek tunggal, adalah sah untuk menggunakan T & sebagai jenis parameter jika fungsi C perlu mengubahnya.
    • Untuk bekas yang mengandungi pelbagai objek (seperti std :: vektor ), jika fungsi C perlu mengubahsuai unsur -unsur dalam bekas, std :: vektor harus digunakan sebagai jenis parameter. Jika fungsi C hanya mengubah bekas itu sendiri (seperti menambahkan atau mengeluarkan unsur -unsur), maka STD :: vektor & boleh berfungsi, tetapi menyedari masalah kitaran hayat dan penyegerakan senarai Python.
  2. Pemeriksaan penunjuk null: Apabila mengendalikan std :: vektor Dalam fungsi C, ia sentiasa disyorkan untuk melakukan pemeriksaan penunjuk null (jika (a_ptr)) untuk mengelakkan kesilapan runtime yang berpotensi.
  3. Pengurusan Pemilikan: Dalam senario tutorial ini, objek dalam senarai Python mempunyai kitaran hayatnya yang diuruskan oleh Python. F Fungsi hanya mengakses dan mengubahsuai objek sedia ada ini melalui petunjuk, dan tidak melibatkan peruntukan memori atau pelepasan, jadi tidak perlu bimbang tentang isu pemilikan memori di sisi C. Tetapi dalam senario yang lebih kompleks, jika fungsi C perlu membuat objek baru dan mengembalikannya atau menguruskan kitaran hayatnya, anda perlu berhati -hati mempertimbangkan dasar pemilikan pybind11 (py :: Keep_alive, py :: return_value_policy, dll.).
  4. Kejelasan dan kebolehbacaan: Walaupun menggunakan senarai petunjuk menyelesaikan masalah, ia juga memperkenalkan konsep petunjuk, yang mungkin sedikit rumit untuk pemaju Python yang tidak biasa dengan C. Apabila merancang API, anda harus menimbang prestasi, keperluan berfungsi, dan kemudahan penggunaan API.

Dengan memahami tingkah laku pybind11 apabila berurusan dengan jenis parameter C yang berbeza, terutamanya untuk senario di mana unsur -unsur dalam bekas diubahsuai, kita boleh memilih jenis parameter C yang betul (seperti STD :: vektor ) untuk memastikan tingkah laku yang dijangkakan penyegerakan data antara python dan C.

Atas ialah kandungan terperinci Penyelesaian kepada Masalah yang C LENGKAP RUJUKAN SENARAI PENGENDALI. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Stock Market GPT

Stock Market GPT

Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Strategi penggabungan yang cekap bagi penyesuai dan model asas PEFT Lora Strategi penggabungan yang cekap bagi penyesuai dan model asas PEFT Lora Sep 19, 2025 pm 05:12 PM

Tutorial ini memperincikan bagaimana untuk menggabungkan penyesuai LORA PEFT dengan model asas untuk menghasilkan model yang sepenuhnya bebas. Artikel ini menunjukkan bahawa adalah salah untuk menggunakan transformer.automodel secara langsung untuk memuatkan penyesuai dan menggabungkan berat secara manual, dan menyediakan proses yang betul untuk menggunakan kaedah Merge_and_unload di perpustakaan PEFT. Di samping itu, tutorial juga menekankan pentingnya menangani segmen perkataan dan membincangkan isu dan penyelesaian keserasian versi PEFT.

Cara memasang pakej dari fail keperluan.txt di python Cara memasang pakej dari fail keperluan.txt di python Sep 18, 2025 am 04:24 AM

Jalankan pipinstall-rrequirements.txt untuk memasang pakej ketergantungan. Adalah disyorkan untuk mencipta dan mengaktifkan persekitaran maya terlebih dahulu untuk mengelakkan konflik, memastikan bahawa laluan fail adalah betul dan PIP telah dikemas kini, dan menggunakan pilihan seperti-tidak-deps atau-pengguna untuk menyesuaikan tingkah laku pemasangan jika perlu.

Cara Menguji Kod Python dengan Pytest Cara Menguji Kod Python dengan Pytest Sep 20, 2025 am 12:35 AM

Python adalah alat ujian yang mudah dan berkuasa di Python. Selepas pemasangan, fail ujian ditemui secara automatik mengikut peraturan penamaan. Tulis fungsi bermula dengan ujian untuk ujian pernyataan, gunakan @pytest.fixture untuk membuat data ujian yang boleh diguna semula, mengesahkan pengecualian melalui pytest.raises, menyokong menjalankan ujian tertentu dan pelbagai pilihan baris arahan, dan meningkatkan kecekapan ujian.

Cara Mengendalikan Argumen Barisan Perintah di Python Cara Mengendalikan Argumen Barisan Perintah di Python Sep 21, 2025 am 03:49 AM

TheargParsemoduleisThereMendingWayOhandLecommand-lineargumentsinpython, menyediakan robrobustparsing, typevalidation, helpmessages, anderrorhandling; usesy.argvforsimplecasesrequiringminiminalsetup.

Masalah Ketepatan Nombor Titik Terapung di Python dan Skim Pengiraan Ketepatan Tinggi Masalah Ketepatan Nombor Titik Terapung di Python dan Skim Pengiraan Ketepatan Tinggi Sep 19, 2025 pm 05:57 PM

Artikel ini bertujuan untuk meneroka masalah biasa ketepatan pengiraan yang tidak mencukupi bagi nombor titik terapung di Python dan Numpy, dan menjelaskan bahawa punca akarnya terletak pada batasan perwakilan nombor terapung 64-bit standard. Untuk senario pengkomputeran yang memerlukan ketepatan yang lebih tinggi, artikel itu akan memperkenalkan dan membandingkan kaedah penggunaan, ciri-ciri dan senario yang berkenaan dengan perpustakaan matematik ketepatan tinggi seperti MPMATH, SYMPY dan GMPY untuk membantu pembaca memilih alat yang tepat untuk menyelesaikan keperluan ketepatan yang rumit.

Cara menggabungkan penyesuai lora dengan betul dengan model asas Cara menggabungkan penyesuai lora dengan betul dengan model asas Sep 17, 2025 pm 02:51 PM

Artikel ini memperincikan cara menggunakan fungsi Merge_and_unload Perpustakaan PEFT untuk menggabungkan penyesuai LORA secara efisien dan tepat ke dalam model bahasa asas yang besar, dengan itu mewujudkan model baru dengan pengetahuan penalaan yang bersepadu. Artikel ini membetulkan kesalahpahaman umum tentang memuatkan penyesuai dan menggabungkan berat model secara manual melalui transformer.automodel, dan menyediakan contoh kod lengkap termasuk penggabungan model, pemprosesan segmen perkataan, dan panduan profesional untuk menyelesaikan masalah keserasian versi berpotensi untuk memastikan proses penggabungan yang lancar.

Cara bekerja dengan fail pdf di python Cara bekerja dengan fail pdf di python Sep 20, 2025 am 04:44 AM

PYPDF2, PDFPlumber dan FPDF adalah perpustakaan teras untuk Python untuk memproses PDF. Gunakan pypdf2 untuk melakukan pengekstrakan teks, penggabungan, pemisahan dan penyulitan, seperti membaca halaman melalui pdfreader dan memanggil extract_text () untuk mendapatkan kandungan; PDFplumber lebih sesuai untuk mengekalkan pengekstrakan teks susun atur dan pengiktirafan jadual, dan menyokong extract_tables () untuk menangkap data jadual dengan tepat; FPDF (disyorkan FPDF2) digunakan untuk menjana PDF, dan dokumen dibina dan dikeluarkan melalui add_page (), set_font () dan sel (). Apabila menggabungkan PDF, kaedah tambahan PDFWriter () dapat mengintegrasikan pelbagai fail

Bagaimanakah anda boleh membuat pengurus konteks menggunakan penghias @ContextManager di Python? Bagaimanakah anda boleh membuat pengurus konteks menggunakan penghias @ContextManager di Python? Sep 20, 2025 am 04:50 AM

Import@contextManagerFromContextLibandDefineageneratorfunctionThatTyieldSexactlyonce, whereCodeBeforeyieldActSasenterandCodeAfteryield (PreferitlySinfinal) actsas __

See all articles