İki Boyutlu Dizi Döndürme
-
Hocalar, C++ Cli diye geçiyor sanırım, buradaki fonksiyonlardan dll oluşturup sonra tlb dosyasına çevirip delphi' de kullanıyorum. Fakat parametre tipleri array olanları delphi de TSafeArray diye birşeye çeviriyor. Bazı fonksiyonlarda aldığı parametreleri pointer ile dolduruyor. Burda cli::array ^_is_complete bunda yaptığı gibi. Ama delphi' den gönderdiğim TSafeArray' i sanırım memory' de kopyalıyor. Bu yüzden de benim yolladığım içerik değişmeden geri geliyor.
Buna çözüm olarak dll içindeki fonksiyonlara geri dönüş tipi ekleyerek, yolladığım dizileri geri döndürüyordum.
Fakat bu verdiğim fonksiyonda geri dönüş tipi zaten var Int32 olarak. Ben buna ek olarak cli::array ^_is_complete bunu da döndürmek istiyorum. Bu yüzden de çift boyutlu dizi yapiyim dedim.
Fakat bunu nasıl döndürebilirim bulamadım. Yardımcı olabilecek var mıdır acaba?
Int32 Ckdu_cache::get_databin_length(Int32 _databin_class, Int64 _codestream_id, Int64 _databin_id, cli::array ^_is_complete) { int databin_class = (int) _databin_class; kdu_long codestream_id = (kdu_long) _codestream_id; kdu_long databin_id = (kdu_long) _databin_id; bool *is_complete = NULL; if (_is_complete != nullptr) { int _len_ = _is_complete->Length; is_complete = new bool[_len_]; for (int _n_=0; _n_ < _len_; _n_++) is_complete[_n_] = (bool) _is_complete[_n_]; } int Result; try { // So we can clean up temporary arrays Result = _get_kref()->get_databin_length(databin_class,codestream_id,databin_id,is_complete); } catch (...) { if (is_complete != NULL) delete[] is_complete; throw; } if (_is_complete != nullptr) { int _len_ = _is_complete->Length; for (int _n_=0; _n_ < _len_; _n_++) _is_complete[_n_] = (Boolean) is_complete[_n_]; } Int32 _Result = Result; if (is_complete != NULL) delete[] is_complete; return _Result; } Int32 Ckdu_cache::get_databin_length(Int32 _databin_class, Int64 _codestream_id, Int64 _databin_id) { cli::array ^_is_complete = nullptr; return get_databin_length(_databin_class,_codestream_id,_databin_id,_is_complete); }
virtual Int32 get_databin_length(Int32 databin_class, Int64 codestream_id, Int64 databin_id, cli::array<Boolean> ^is_complete); Int32 get_databin_length(Int32 databin_class, Int64 codestream_id, Int64 databin_id);
-
Düzelttim de şunun geri dönüş tipi ne olacak?
int* Ckdu_cache::get_databin_length(Int32 _databin_class, Int64 _codestream_id, Int64 _databin_id, cli::array<Boolean> ^_is_complete) { int databin_class = (int) _databin_class; kdu_long codestream_id = (kdu_long) _codestream_id; kdu_long databin_id = (kdu_long) _databin_id; bool *is_complete = NULL; if (_is_complete != nullptr) { int _len_ = _is_complete->Length; is_complete = new bool[_len_]; for (int _n_=0; _n_ < _len_; _n_++) is_complete[_n_] = (bool) _is_complete[_n_]; } int Result; try { // So we can clean up temporary arrays Result = _get_kref()->get_databin_length(databin_class,codestream_id,databin_id,is_complete); } catch (...) { if (is_complete != NULL) delete[] is_complete; throw; } if (_is_complete != nullptr) { int _len_ = _is_complete->Length; for (int _n_=0; _n_ < _len_; _n_++) _is_complete[_n_] = (Boolean) is_complete[_n_]; } Int32 _Result = Result; if (is_complete != NULL) delete[] is_complete; cli::array<int, 2> ^res = gcnew cli::array<int, 2>(2, 1); res[0,0] = _is_complete[0]; res[1,0] = _Result; return res; }
-
array<int, 2> bu şekil olmuyor mu?
https://msdn.microsoft.com/en-us/library/dtbydz1t.aspx
The next sample shows how to perform aggregate initialization on single-dimension managed arrays.
bu yazının altındaki örneğe ve output a bak,..
unbalanced tarafından 08/May/15 13:46 tarihinde düzenlenmiştir -
unbalanced bunu yazdı
array<int, 2> bu şekil olmuyor mu?
https://msdn.microsoft.com/en-us/library/dtbydz1t.aspx
The next sample shows how to perform aggregate initialization on single-dimension managed arrays.
bu yazının altındaki örneğe ve output a bak,..
öyle denedim de, array<int, 2>^ -> şu işareti eklemek lazımmış, sağol hocam