How to pass struct as argument of function
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 25/100
Direção de pesquisa
Comece pelas declarações de Fiddle::Importer, Fiddle::CParser e struct mostradas na issue e, em seguida, reproduza as chamadas a tc_create_context, tc_read_string e tc_destroy_string usando o header C fornecido. Confirme como o argumento struct e o valor de retorno devem ser representados e documente um exemplo funcional que evite os erros e segmentation faults relatados.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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 🙏
- Linguagem predominante
- Ruby
- Estrelas
- 195
- Forks
- 53
- Métricas de merge de PRs
- Nenhum PR com merge em 30d
Preparar o ambiente
- Inclui um Dockerfile ou arquivo Docker Compose
- Sem modelo de pull request
- Sem guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de ruby/fiddle
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 52/100
-
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 68/100
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 30/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 45/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 52/100
Todas as issues de ruby/fiddle
Issues semelhantes
-
Add Catalan (ca) translationAberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 70/100
eurosky-social/eu-haul#32 ·
-
README configuration examples use the wrong module name and describe removed Bootstrap assetsAbertagood first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
benbalter/add-to-org#17 ·
-
good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
benbalter/change_agent#11 ·
-
good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
benbalter/count-org-loc#20 ·
-
good first issue
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
benbalter/sitemap-parser#33 ·