개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.03.08 06:38

FFI::cdef 사용 시 함수 인수 타입의 문제

목록
  • 패턴마스터 12일 전 2025.03.08 06:38
  • 13
    1
내가 사용하고 있는 FFI::cdef를 이용하여 C 함수를 호출하고 있습니다.

ruby

ffi = FFI::Library.new('libexample.so')

ffi.cdef([

  'int add(int a, int b)',

  'void say_hello(char *name)'

])



위의 코드에서 add 함수는 정수를 인수로 받고 say_hello 함수는 char 타입의 포인터를 인수로 받습니다.

ruby

add = ffi.method(:add)

say_hello = ffi.method(:say_hello)



위의 코드에서 add 함수와 say_hello 함수를 호출할 수 있습니다.

ruby

add.call(1, 2)  # 3

say_hello.call("John")  # John이 출력됩니다.



이러한 코드를 이용하여 C 함수를 호출하고 있습니다. 그러나 say_hello 함수에서 char 타입의 포인터를 인수로 받는 것은 제대로 작동하지 않습니다.

ruby

say_hello.call("John")  # nil이 출력됩니다.



위의 코드에서 say_hello 함수를 호출할 때 nil이 출력되는 것을 볼 수 있습니다.

say_hello 함수를 호출할 때 nil이 출력되는 이유는 무엇이며, 어떻게 say_hello 함수를 호출할 수 있을까요?

    댓글목록

    profile_image
    나우호스팅  12일 전



    say_hello 함수를 호출할 때 nil이 출력되는 이유는 char 타입의 포인터를 인수로 받는 say_hello 함수가 Ruby의 String 타입을 인수로 받을 수 없기 때문입니다.

    Ruby의 String 타입은 C의 char 타입의 포인터와 다르게 동작하기 때문에 say_hello 함수를 호출할 때 nil이 출력됩니다.

    say_hello 함수를 호출할 수 있는 방법은 다음과 같습니다.

    #hostingforum.kr
    ruby
    
    say_hello.call("John".encode('ASCII-8BIT'))
    
    


    위의 코드에서 "John".encode('ASCII-8BIT')은 Ruby의 String 타입을 C의 char 타입의 포인터와 호환되도록 변환합니다.

    이러한 변환을 통해 say_hello 함수를 호출할 수 있습니다.

    2025-03-08 06:39

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 5,048건 / 224 페이지

검색

게시물 검색