неправильное возвращаемое значение функции c в Matlab - PullRequest
1 голос
/ 12 сентября 2011

Я хочу закодировать некоторые функции моей программы Matlab в c, чтобы сделать это быстрее. Но эта функция не возвращает результат выражения. Он возвращает другое значение, например 29. Без вызова функции (говоря о размещении выражения внутри функции в том месте, где я вызываю функцию) она работает. даже внутри функции результат выражения верен, но не после возврата ...

…
double distance = 0;
// function call
distance = distpos(position[0], position[1], *(origin), *(origin+1)); 
printf("%f", distance); // incorrect
 …

// funktion
double distpos(double x1, double y1, double x2, double y2) 
{
    printf("%f", sqrt(pow((x1 - x2),2) + pow((y1 - y2),2))); // correct
    return sqrt(pow((x1 - x2),2) + pow((y1 - y2),2));
}

// РЕДАКТИРОВАТЬ ------

Я использую Matlab 7.3.0 (R2006b).

Следующий код не работает:

#include <stdio.h>
    #include <math.h>
    #include "mex.h"

    void main()
    {
            double position[2] = { 5, 6 };
            double origin[2] = { 3, 4 };

            double distance = 0;
            // function call
            distance = distpos(position[0], position[1], *(origin), *(origin+1)); 
            printf("%f\n", distance); // incorrect

    }

    // funktion
    double distpos(double x1, double y1, double x2, double y2) 
    {
        printf("%f\n", sqrt(pow((x1 - x2),2) + pow((y1 - y2),2))); // correct
        return sqrt(pow((x1 - x2),2) + pow((y1 - y2),2));
    }

    void mexFunction(int nlhs, mxArray *plhs[],
                     int nrhs, const mxArray *prhs[])
    {
        main();
    }

Результат:

2,828427

639,000000

Этот код работает:

    #include <stdio.h>
    #include <math.h>
    #include "mex.h"


    // funktion
    double distpos(double x1, double y1, double x2, double y2) 
    {
        printf("%f\n", sqrt(pow((x1 - x2),2) + pow((y1 - y2),2))); // correct
        return sqrt(pow((x1 - x2),2) + pow((y1 - y2),2));
    }


    void main()
    {
            double position[2] = { 5, 6 };
            double origin[2] = { 3, 4 };

            double distance = 0;
            // function call
            distance = distpos(position[0], position[1], *(origin), *(origin+1)); 
            printf("%f\n", distance); // incorrect

    }



    void mexFunction(int nlhs, mxArray *plhs[],
                     int nrhs, const mxArray *prhs[])
    {
        main();
    }

Результат:

2,828427

2,828427

Это значит: Существует разница, если функция объявлена ​​до или после использования. (Я уже знаю, что вы должны объявить функцию, прежде чем использовать ее, но вы не должны)

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Я могу подтвердить, что компилятор MEX по умолчанию (Lcc-win32) успешно компилирует код.Причина неправильных результатов была объяснена @Vicky в комментариях ...

Теперь в будущем, если вы хотите увидеть какие-либо предупреждения, включите подробный режим:

>> mex -v a.c
...
Warning a.c: 16  missing return value 
Warning a.c: 19  declaration of `distpos' does not match previous declaration at a.c 14 
0 errors, 2 warnings 
...

Iследует отметить, что и VS2010, и MinGW-GCC4 генерируют ошибки компиляции:

> gcc -o a.exe a.c
a.c:18:8: error: conflicting types for 'distpos'
a.c:13:20: note: previous implicit declaration of 'distpos' was here

и

> cl a.c
a.c(18) : error C2371: 'distpos' : redefinition; different basic types

В общем, вы всегда должны определять функции перед их использованием, или использовать функцию прототипы .

0 голосов
/ 12 сентября 2011

Следующий код работает как положено (см. http://ideone.com/GfLkZ):

#include <stdio.h>
#include <math.h>

// funktion
double distpos(double x1, double y1, double x2, double y2) 
{
    printf("%f\n", sqrt(pow((x1 - x2),2) + pow((y1 - y2),2))); // correct
    return sqrt(pow((x1 - x2),2) + pow((y1 - y2),2));
}


int main(void)
{
        double position[2] = { 5, 6 };
        double origin[2] = { 3, 4 };

        double distance = 0;
        // function call
        distance = distpos(position[0], position[1], *(origin), *(origin+1)); 
        printf("%f\n", distance); // incorrect
}
...