Frage

Ich habe einige Anfänger Probleme eine FFI-Struktur in Ruby zu setzen. Was ich tun möchte, ist ein Zeiger auf einen C-String übergeben, indem eine String-Eigenschaft in einer FFI Einstellung :: Struct Objekt:

class SpSessionConfig < FFI::Struct
  layout :api_version,          :int,
           :cache_location,       :string,
           :settings_location,    :string,
           :application_key,      :pointer,
           :application_key_size, :int,
           :user_agent,           :string,
           :sp_session_callbacks, :pointer,
           :user_data,            :pointer 
  end
end


sessionConf = SpotifyLibrary::SpSessionConfig.new() 
puts sessionConf # => '#<SpotifyLibrary::SpSessionConfig:0x9acc00c>'

sessionConf[:api_version] = 1
puts "Api Version: #{sessionConf[:api_version]}"

myTempDir = "tmp"
sessionConf[:cache_location] = myTempDir # !Error!

Aber wenn ich den Code ausführen bekomme ich diesen Fehler:

jukebox.rb:44:in `[]=': Cannot set :string fields (ArgumentError)
from jukebox.rb:44:in `<main>'

Also ich weiß nicht wirklich, wo man von hier geht.

Auch wenn Sie von jeder guten documtation oder Tutorials zu diesem Thema wissen lassen Sie bitte eine Antwort! Bisher habe ich die Wiki-Dokumentation auf Projekt Kenai  sehr nützlich, aber je mehr desto besser!

Danke!

Ich habe versucht, die Zeichenfolge Datenelemente zu erklären, wie [: char, 5] aber, dass ein anderen Fehler gibt:

jukebox.rb:44:in `put': put not supported for FFI::StructLayoutBuilder::ArrayField_Signed8_3 (ArgumentError)
    from jukebox.rb:44:in `[]='
    from jukebox.rb:44:in `<main>

Es ist ein guter Vorschlag, den Speicherzeiger Typen ausprobieren und ich werde versuchen, dass heute nach der Arbeit.

War es hilfreich?

Lösung

FFI lehnt automatisch Strings einstellen. Probieren Sie es aus zu ändern: string zu: char_array, wie erwähnt auf dieser Seite :

  

: char_array - NUR in einer Struktur Layout verwendet, in denen Struktur einen C-String hat (char []) als Mitglied

Wenn das nicht funktioniert, wirst du eine verwenden haben: Zeiger und wandeln es wieder in einen String. Es ist nicht gut dokumentiert, aber MemoryPointer hat eine Bündel von verfügbaren Funktionen , wie write_string, das helfen soll.

Andere Tipps

So dank der Antwort von Pesto (angenommen) ich eine Lösung gefunden zu haben. write_string kehrt früh, wenn es ein Null-Byte in dem Puffer ist, (c folgt Semantik-string). Hier ist der Code für alle, die auf dieses Problem in Zukunft stolpern könnten.

# Open my application key file and store it in a byte array
appkeyfile = File.read("spotify_appkey.key")

# get the number of bytes in the key
bytecount = appkeyfile.unpack("C*").size

# create a pointer to memory and write the file to it
appkeypointer = FFI::MemoryPointer.new(:char, bytecount)
appkeypointer.put_bytes(0, appkeyfile, 0, bytecount)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top