0

So i wrote a little extension with the help of php-cpp. In this function, i just simply calculate the pow, which works perfectly fine. After calculating the result, i return the string from the function. When i call this extensions function in php, i receive an integer which contains the strlen of my original string, instead of my string:

Php::Value Math::some_pow(Php::Parameters &params)
{
    mpfr_t base, exponent, result;

    mpfr_set_emin(mpfr_get_emin_min());

    mpfr_init2(base, 256);
    mpfr_init2(exponent, 256);

    mpfr_init2(result, 10);

    mpfr_set_str(base, params[0], 10, GMP_RNDN);
    mpfr_set_d(exponent, params[1], GMP_RNDN);

    mpfr_pow(result, base, exponent, GMP_RNDN);

    char data[255];
    mpfr_snprintf(data, 254, "%.20Ff", result);

    return data;
}

The mpfr_printf output, to verify that everything inside the function works well:

base=1e+02  exponent=8.3999999999999996891375531049561686813831329345703125e-01
Result=4.7875e+01

So the function itself is supposed to return the following: Result=4.7875e+01 In PHP; calling the function, which looks like this:

$result = $math->some_pow(100, 0.84);

Output via var_dump($result); shows 17 -> the strlen of "Result=4.7875e+01"

2 Answers 2

1

According to the docs (and comparing it to regular printf), your function works as expected:

— Function: int mpfr_printf (const char *template, ...)
Print to stdout the optional arguments under the control of the template string template. Return the number of characters written or a negative value if an error occurred. 

mpfr_printf returns the number of characters printed to the stdout.

If you want to get the text as a string, instead of printing it to stdout, you need to use something like:

— Function: int mpfr_snprintf (char *buf, size_t n, const char *template, ...)
Form a null-terminated string corresponding to the optional arguments under the control of the template string template, and print it in buf. No overlap is permitted between buf and the other arguments. Return the number of characters written in the array buf not counting the terminating null character or a negative value if an error occurred. 
Sign up to request clarification or add additional context in comments.

2 Comments

Okay, so it is just my stupid understanding. How do i return the result back to php as a string then - instead of just the amount of characters printed?
@Tyralcori I've added additional info to my answer. If you know how to create a PHP string variable in C++ it should be enough. There are some examples here: php-cpp.com/documentation/variables
0

The result is correct. You are returning the result of mpfr_printf(). From the manual: The return value is the number of characters written in the string, excluding the null-terminator, or a negative value if an error occurred, in which case the contents of str are undefined.

Read more here: http://cs.swan.ac.uk/~csoliver/ok-sat-library/internet_html/doc/doc/Mpfr/3.0.0/mpfr.html/Formatted-Output-Functions.html

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.