2015-03-07 2 views
0

Так что я пытаюсь использовать некоторую функцию RPC.Указатель rpc не показывает правильный результат

В основном я хочу умножить 2 2 * 2 матрицы, клиент отправит 2 матрицы, которые клиент вычисляет и отправляет матрицу.

Матрица, полученная в моем клиенте, не та, которую я отправил.

// server.c 
matrice* multiply(matrice2 *m2) 
{ 
    matrice* res=&(matrice){.w=0.0,.x=0.0,.y=0.0,.z=0.0}; 
    res->w=m2->m.w*m2->n.w+m2->m.x*m2->n.y; // ww'+xy' 
    res->x=m2->m.w*m2->n.x+m2->m.x*m2->n.z; // wx'+xz' 
    res->y=m2->m.y*m2->n.w+m2->m.z*m2->n.y; // yw'+zy' 
    res->z=m2->m.y*m2->n.x+m2->m.z+m2->n.z; // yx'+z'z 

    return res; 
} 

int main(void) 
{ 
    ... 
    stat = registerrpc(PROGNUM, VERSNUM,PROCNUM, multiply, (xdrproc_t)xdr_matrice2, (xdrproc_t)xdr_matrice); 
    svc_run(); 
} 

//client.c 
int main (int argc, char **argv) 
{ 
    matrice m={1.0,2.0,3.0,4.0}; 
    matrice n={9.0,8.0,7.0,6.0}; 
    matrice2 donnees = {m , n}; 
    stat = callrpc(host, PROGNUM, VERSNUM, PROCNUM, (xdrproc_t) xdr_matrice2, (char *)&donnees, (xdrproc_t)xdr_matrice, (char *)&res); 
} 

//include.h 
typedef struct { double w; double x; double y; double z; } matrice; 
typedef struct { matrice m; matrice n; } matrice2; 
bool_t xdr_matrice(XDR *, matrice *); 
bool_t xdr_matrice2(XDR *, matrice2 *); 

//xdr_matrice.c 
bool_t xdr_matrice(XDR *xdrs, matrice *m) 
{ 
    return xdr_double(xdrs,&(m->w)) && xdr_double(xdrs,&(m->x)) && xdr_double(xdrs,&(m->y)) && xdr_double(xdrs,&(m->z)); 
} 

bool_t xdr_matrice2(XDR *xdrs, matrice2 *m2) 
{ 
    return xdr_matrice(xdrs,&(m2->m)) && xdr_matrice(xdrs,&(m2->n)); 
} 

Может кто-нибудь объяснить мне, почему он не работает должным образом или какую ошибку я сделал?

+0

Умножьте сервера, кажется, возвращает указатель локальная переменная, которая выходит из области действия при возврате функции. – jschultz410

+1

Возможно, если вы объявили 'res' статическим и вернули его адрес, тогда это сработает. Я предполагаю, что xdr гарантирует, что функция вашего сервера (и декодирование и кодирование) не может выполняться параллельно. – jschultz410

ответ

0

Это было действительно глупо, я просто изменил мою множественно функцию, чтобы иметь статический res (и, очевидно return &res и изменил -> к .), и она работала ...

Смежные вопросы