Ruby Noobie: Comment définir une valeur de chaîne dans une struct IFF

StackOverflow https://stackoverflow.com/questions/745127

  •  09-09-2019
  •  | 
  •  

Question

Je vais avoir quelques problèmes débutants Définition d'une struct IFF en Ruby. Ce que je veux faire est de passer un pointeur sur une chaîne C en définissant une propriété de chaîne dans un IFF :: objet struct:

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!

Mais quand je lance le code que je reçois cette erreur:

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

Je ne sais pas vraiment où aller d'ici.

De plus, si vous connaissez des bonnes documtation ou des tutoriels sur ce sujet s'il vous plaît laisser une réponse! Jusqu'à présent, j'ai trouvé la documentation wiki sur Projet Kenai  très utile, mais plus on est de fous!

Merci!

J'ai essayé de déclarer les membres de données de chaîne comme [: char, 5], mais qui donne une autre erreur:

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>

Il est une bonne idée d'essayer le type de pointeur de mémoire et je vais essayer après le travail aujourd'hui.

Était-ce utile?

La solution

rejette automatiquement les chaînes IFF réglage. Essayez de le changer de: chaîne à: char_array, comme mentionné sur cette page :

  

: char_array - utilisé uniquement dans une mise en page struct où struct a une chaîne de style C (char []) en tant que membre

Si cela ne fonctionne pas, vous allez devoir utiliser un: pointeur et le convertir en une chaîne. Il est pas bien documenté, mais MemoryPointer a une groupe de fonctions disponibles , comme write_string, qui devrait aider.

Autres conseils

Ainsi, grâce à la réponse de Pesto (accepté) Je l'ai trouvé une solution. write_string rendements tôt s'il y a un zéro octet dans la mémoire tampon (sémantique suivante c-chaîne). Voici le code pour toute personne qui pourrait tomber sur ce problème à l'avenir.

# 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top