2014-04-11 6 views
7

내 C 프로그램에서 perl 루틴을 호출해야합니다. 펄 루틴은 다음과 같은 인수를 취합니다 : 및 $b이 정수 인 $a, $b, $c, $c은 문자열입니다 (2 진수 문자를 포함 할 수 있음). perlcall에 따르면 여기에 전화를 걸기위한 수단이 있습니다.매개 변수가있는 perl 루틴 호출

I32 call_sv(SV* sv, I32 flags); 
I32 call_pv(char *subname, I32 flags); 
I32 call_method(char *methname, I32 flags); 
I32 call_argv(char *subname, I32 flags, char **argv); 

내가 단지 call_argv (...)를 사용할 수있는 것 같다,하지만 두 가지 질문

이있다
  • 나는 (A를 통과 어떻게
  • 루틴 펄의 정수를 전달 어떻게 바이너리) 문자열을 perl로?

소원

I32 call_argv(char *subname, I32 flags, int numOfArgs, SV* a, SV* b, SV *c ...); 
+0

perlcall에는 이유 때문에 "전달 매개 변수"섹션이 있습니다. 당신은 Perl 스택에 항목을 넣는 것으로 그것을한다. – hobbs

답변

8

같은 함수 Passing Parameters section of perlcall를 참조있다. 인수는 Perl 스택에 푸시됩니다. call_argv은 문자열이 아닌 다른 항목을 전달하는 데 유용하지 않습니다. 호출 규칙은

PUSHMARK(SP); 
mPUSHi(some_integer); 
mPUSHp(binary_data, len); 
XPUSHs(some_SV_I_had_laying_around); 
PUTBACK; 
call_pv("sub_name", G_DISCARD); 

처럼 보일 것입니다거나 일부 개체의 이름으로 메소드를 호출 call_method을 당신이 SV*의 하위 이름이있는 경우 call_sv를 사용하거나 할 수 있습니다.

하위 값이 반환되면 G_SCALAR 또는 G_ARRAY으로 호출하고 POP 매크로를 사용하여 반환 값에 액세스 할 수 있습니다. 이에 대해서는 다음 두 절에서 자세히 설명합니다. SPAGAIN을 잊지 마세요.

+0

제안에 감사드립니다! "전달 매개 변수"섹션의 예제는 내가 찾고있는 것입니다. - ( – packetie

+0

) 코드를 약간 깔끔하게 만들면, 대신에'mPUSH * '패밀리를 사용하는 것입니다. 왜냐하면 그들이 푸시 한 SV를 죽이기 때문입니다. 또한 IV를위한'mPUSHi'와 같은 몇 가지 특정 코드가 있습니다. 그리고 PV를위한'mPUSHp' – LeoNerd

+0

@LeoNerd 만약 당신이 원하면 편집해라. :) – hobbs