Rust kodundan derlenen bir yerel kitaplığa erişmek için Fiddle kullanmak istiyorum.Bir yapının yerel koda geçirilmesi veya geri gönderilmesi için Fiddle kullanmak mümkün mü?
typedef struct {
char *data;
size_t len;
} my_thing_t;
// Example function that somehow accepts a struct
void accepts_a_struct(my_thing_t thing);
// Example function that somehow returns a struct
my_thing_t returns_a_struct(void);
Ancak, tüm örnekler kabul ederim veya yapılar için işaretçi göndermektedir bulabilir ve değil yapılar kendilerini: yapının C gösterimi sadece bir işaretçi ve bir uzunluk, çok basittir. Mümkünse çift indirmeden kaçınmak istiyorum.
Fiddle::Importer
documentation'dan bir örnek ödünç aldım. Ancak, ben düzgün bir yapıya bir işaretçi yerine bir yapıyla extern
yöntemini çağırmak nasıl görmüyorum:
Fiddle değilFFI gem aynıdır
require 'fiddle'
require 'fiddle/import'
module LibSum
extend Fiddle::Importer
dlload './libsum.so'
extern 'double sum(double*, int)'
extern 'double split(double)'
end
Not. Fiddle, Ruby standart kütüphanesinin bir bileşenidir ve ayrı bir mücevher olarak sağlanmamıştır. Bunlar ilgili sorular FFI taş bakın ve keman: Ben Keman belgelerine yoluyla ve bunu gördüğünüz gibi gittin
- How to wrap function in Ruby FFI method that takes struct as argument?
- How do I specify a struct as the return value of a function in RubyFFI?
İlginç bir soru, ancak FFI (bunun için Fiddle bir sarıcıdır) doğrudan yapıları desteklemiyor gibi göründüğünden şüphe duyuyorum, [bu dokümanın] "İşlev argümanları ve dönüş değerleri" bölümüne bakın (http: // fistfvck .sakura.ne.jp/ruby / rurima-2.1.0/library/fiddle.html) (japonca, google'ın çevirisini okuyordum) ve eğer bazı performans artışlarını beklerseniz, çok da önemli olmayan bir şey elde edersiniz - Ruby değişkenleri Bir veri ('RBasic' ve alt sınıflar) ile yapı, ya da oradan fiili veriler için başka bir işaretçi. –
Ayrıca, işlev imzalarındaki desteklenen türlerin listesi de ['parse_ctype'] 'den alınabilir (https://github.com/ruby/ruby/blob/c8b3f1b470e343e7408ab5883f046b1056d94ccc/ext/fiddle/lib/fiddle/cparser.rb#L120) işlevi. –