How to pass struct as argument of function
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 25/100
Piste de recherche
Commencez par les déclarations de Fiddle::Importer, Fiddle::CParser et struct présentées dans l’issue, puis reproduisez les appels à tc_create_context, tc_read_string et tc_destroy_string avec l’en-tête C fourni. Confirmez comment l’argument struct et la valeur de retour doivent être représentés, et documentez un exemple fonctionnel qui évite les erreurs et les segmentation faults signalés.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Hi, sorry for my english. I will show the problem with examples:
header.h
typedef struct {
const char* content;
uint32_t len;
} tc_string_data_t;
typedef struct tc_string_handle_t tc_string_handle_t;
tc_string_handle_t* tc_create_context(tc_string_data_t config);
tc_string_data_t tc_read_string(const tc_string_handle_t* handle);
void tc_destroy_string(const tc_string_handle_t* handle);
How its work in ruby with gem ffi
require "json"
require "ffi"
module Binding
class TcStringDataT < FFI::Struct
layout :content, :pointer,
:len, :uint32
end
end
module Binding
extend FFI::Library
ffi_lib "/path_to_lib"
def self.setup_bindings
attach_function :tc_create_context, [TcStringDataT.by_value], :pointer
attach_function :tc_read_string, [:pointer], TcStringDataT.by_value
attach_function :tc_destroy_string, [:pointer], :void
end
end
config_json = {network: {endpoints: ["http://some_url"]}}.to_json
# make struct
data_struct = Binding::TcStringDataT.new
data_struct[:content] = FFI::MemoryPointer.from_string(config_json)
data_struct[:len] = config_json.bytesize
# create context
string_ref = Binding.tc_create_context(data_struct)
# read context response
result_data_struct = Binding.tc_read_string(string_ref)
result_string = result_data_struct[:content].read_string(result_data_struct[:len])
# destroy ref
Binding.tc_destroy_string(string_ref)
ffi gem works, but sometimes i get segmentation fault :(
So I decided to try to do it with fiddle !
But how ? How to do it with fiddle ? I climbed the entire Internet. I haven't found a single example of how to pass a struct to a function. There are only very few examples of how to pass ordinary primitives and not a single example of how to pass a structure. I have tried many options and still have not been able to achieve a result. Please help me !!! Write an example of calling these functions and passing arguments to them. Really looking forward to the answer.
Here is what I do with fidl:
require 'fiddle'
require 'fiddle/import'
require 'json'
module TestFiddle
extend Fiddle::Importer
extend Fiddle::CParser
dlload('/lib_client.dylib')
TcStringDataT = struct [
'const char* content',
'uint len'
]
# tc_string_handle_t* tc_create_context(tc_string_data_t config);
# extern 'TcStringDataT* tc_create_context(TcStringDataT config)' ## unknown type TcStringDataT
extern 'TcStringDataT* tc_create_context(TcStringDataT* config)' ## OK
# tc_string_data_t tc_read_string(const tc_string_handle_t* handle);
# extern 'TcStringDataT tc_read_string(const TcStringDataT* handle)' ## unknown type TcStringDataT
extern 'TcStringDataT* tc_read_string(const TcStringDataT* handle)' ## OK
# void tc_destroy_string(const tc_string_handle_t* handle)
# extern 'void tc_destroy_string(const TcStringDataT handle)' ## unknown type TcStringDataT
extern 'void tc_destroy_string(const TcStringDataT* handle)' ## OK
end
config_json = {network: {endpoints: ["http://some_url"]}}.to_json
struct = TestFiddle::TcStringDataT.malloc
struct.content = Fiddle::Pointer.to_ptr(config_json)
struct.len = config_json.bytesize
# How to pass this struct ???
ctx_ptr = TestFiddle.tc_create_context(struct) ## ERROR ERROR ERROR, many many zeros and ones
string_ptr = TestFiddle.tc_read_string(ctx_ptr)
struct = Test::TcStringDataT.new(string_ptr)
p struct.content.to_s
please help me with this 🙏
- Langage dominant
- Ruby
- Étoiles
- 195
- Forks
- 53
- Merge moyen
- 23 h 57 min
- PR mergées (30 j)
- 1
Guide de contribution
Aucun guide de contribution indexé pour ce dépôt
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de ruby/fiddle
-
Difficulté 3/5 1-2 jours Accessibilité débutants 52/100
-
Difficulté 3/5 1-2 jours Accessibilité débutants 68/100
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 30/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 45/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 52/100
Toutes les issues de ruby/fiddle
Issues similaires
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
hanami/hanami-cli#449 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
resque/resque-scheduler#826 ·
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100