in reply to Re: Perlxs help please
in thread Perlxs help please

This is what I tried, but it's failing with with incompatible types

in the .h file:
void QAErrorMessage(int, char *, int);

in the .xs file:
void QAErrorMessage(err_code, ret_error, bufflen) int err_code SV* ret_error int bufflen OUTPUT: ret_error

I'm bviously missing something

Replies are listed 'Best First'.
Re: Re: Re: Perlxs help please
by tachyon (Chancellor) on Oct 01, 2003 at 06:04 UTC

    How do you want to call the C function out of Perl? I think you are looking for something like:

    SV * err_msg( code ) int code; INIT: char sError[255]; CODE: QAErrorMessage( code, sError, 255 ); SV *result = newSVpv(sError, 0); OUTPUT: result

    cheers

    tachyon

    s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

Re: Re: Re: Perlxs help please
by PodMaster (Abbot) on Oct 01, 2003 at 06:26 UTC
    Let me bold some things for you ;)
    void
    QAErrorMessage(err_code, ret_error, bufflen)
            int     err_code
            SV*     ret_error
            int     bufflen
        OUTPUT:
            ret_error
    
    void and OUTPUT do not mix (void means no output). You should try something like
    void QAErrorMessage(error_code) CASE: int err_code PREINIT: int bufflen = 256; char ret_error[bufflen]; PPCODE: { QAErrorMessage(err_code, ret_error, bufflen); XPUSHs(sv_2mortal( newSVpvn(ret_error,bufflen) )); }

    MJD says "you can't just make shit up and expect the computer to know what you mean, retardo!"
    I run a Win32 PPM repository for perl 5.6.x and 5.8.x -- I take requests (README).
    ** The third rule of perl club is a statement of fact: pod is sexy.

      Actually when you use void in the XS sub declaration it does not prevent you using OUTPUT (although this is now deprecated) SV* is now preferred to void..... There are even examples of doing it that way in perlxstut.

      Older versions of this document recommended to use void return value i +n such cases. It was discovered that this could lead to segfaults in +cases when XSUB was truly void. This practice is now deprecated, and +may be not supported at some future version. Use the return value SV +* in such cases. (Currently xsubpp contains some heuristic code which + tries to disambiguate between ``truly-void'' and ``old-practice-decl +ared-as-void'' functions. Hence your code is at mercy of this heurist +ics unless you use SV * as return value.)

      cheers

      tachyon

      s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print