مدیریت خطا CXX: مثال QR

تولید کد QR نمونه‌ای است که در آن بولی برای ارتباط موفقیت در مق‌بل شکست و جایی که نتیجه موفقیت آمیز را می‌توان از مرز FFI عبور داد استفاده می شود:

#[cxx::bridge(namespace = "qr_code_generator")] mod ffi { extern "Rust" { fn generate_qr_code_using_rust( data: &[u8], min_version: i16, out_pixels: Pin<&mut CxxVector<u8>>, out_qr_size: &mut usize, ) -> bool; } }

Speaker Notes

دانش آموزان ممکن است در مورد معنایی خروجی out_qr_size کنجکاو باشند. این اندازه بردار نیست بلکه اندازه کد QR است (و مسلماً کمی اضافی است - درواقع این جذر اندازه بردار است).

شاید لازم باشد قبل از فراخوانی تابع Rust به اهمیت مقداردهی اولیه out_qr_size اشاره کنیم. ایجاد یک مرجع Rust که به حافظه اولیه اشاره می‌کند، منجر به رفتار نامشخص می‌شود (برخلاف ++C، زمانی که تنها عمل عدم ارجاع چنین حافظه‌ای منجر به UB می‌شود).

اگر دانش‌آموزان درباره Pin سؤال می‌کنند، توضیح دهید که چرا CXX برای ارجاع‌های قابل تغییر به داده‌های ++C به آن نیاز دارد: پاسخ این است که داده‌های++C را نمی‌توان مانند داده‌های Rust جابه‌جا کرد، زیرا ممکن است حاوی نشانگرهای خودارجاعی (self-referential pointers) باشد.