Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RPC浮点结果错误_C_Rpc - Fatal编程技术网

RPC浮点结果错误

RPC浮点结果错误,c,rpc,C,Rpc,我正在编写一个简单的RPC程序,可以对两个int数字进行加、减、乘和除。我编写了int,然后使用int生成文件。当我执行服务器时,客户端给它两个简单的整数,服务器给它一个大的浮点数 怎么了 文件.x如下所示: struct entier{ int a; int b;}; typedef struct entier params; struct resultat{ float result; int resp;}; typedef struct resultat res; program CA

我正在编写一个简单的RPC程序,可以对两个
int
数字进行加、减、乘和除。我编写了
int
,然后使用
int
生成文件。当我执行服务器时,客户端给它两个简单的整数,服务器给它一个大的浮点数

怎么了

文件.x
如下所示:

struct entier{
int a;
int b;};
typedef struct entier params;
struct resultat{
float result;
int   resp;};
typedef struct resultat res;
program CALC{
version VERS1{
    void CALCUL_NULL(void)=0;
    res ADDITION(params )=1;
    res SOUTRACTION(params)=2;
    res MULTIPLICATION(params)=3;
    res DIVISION(params)=4;
         }=1;
}=0x20000001;
服务器代码为:

/*
 * This is sample code generated by rpcgen.
 * These are only templates and you can use them
 * as a guideline for developing your own functions.
 */

#include "file.h"

void *
calcul_null_1_svc(void *argp, struct svc_req *rqstp)
{
    static char * result;

    /*
     * insert server code here
     */

    return (void *) &result;
}

res *
addition_1_svc(params *argp, struct svc_req *rqstp)
{
    static res  result;

    result.result= argp->a + argp->b;
    result.resp=0;

    return &result;
}

res *
soutraction_1_svc(params *argp, struct svc_req *rqstp)
{
    static res  result;

    result.result= argp->a - argp->b;
    result.resp=0;

    return &result;
}

res *
multiplication_1_svc(params *argp, struct svc_req *rqstp)
{
    static res  result;

    result.result= argp->a * argp->b;
    result.resp=0;

    return &result;
}

res *
division_1_svc(params *argp, struct svc_req *rqstp)
{
    static res  result;

    if(argp->b ==0)
    result.resp=1;
    else
        result.result= argp->a / argp->b;

    return &result;
}
客户:

/*
* This is sample code generated by rpcgen.
 * These are only templates and you can use them
 * as a guideline for developing your own functions.
 */

#include "file.h"

int x;
int y;
void
calc_1(char *host)
{
    CLIENT *clnt;
    void  *result_1;
    char *calcul_null_1_arg;

    params  arguments;
    arguments.a=(float)x;
    arguments.b=(float)y;
    res  *respons;


#ifndef DEBUG
    clnt = clnt_create (host, CALC, VERS1, "udp");
    if (clnt == NULL) {
        clnt_pcreateerror (host);
        exit (1);
    }
    #endif  /* DEBUG */

    result_1 = calcul_null_1((void*)&calcul_null_1_arg, clnt);
    if (result_1 == (void *) NULL) {
        clnt_perror (clnt, "call failed");
    }
    respons = addition_1(&arguments, clnt);
    printf("the additon is%f \n",respons->result);
    if (respons == (res *) NULL) {
        clnt_perror (clnt, "call failed");
    }
    respons = soutraction_1(&arguments, clnt);
    printf("the substraction is %f \n",respons->result);
    if (respons == (res *) NULL) {
        clnt_perror (clnt, "call failed");
    }
    respons = multiplication_1(&arguments, clnt);
        printf("the multiplication is %f \n",respons->result);
    if (respons == (res *) NULL) {
    clnt_perror (clnt, "call failed");
    }
    respons = division_1(&arguments, clnt);
    if (respons == (res *) NULL) {
        clnt_perror (clnt, "call failed");
    if(respons->resp==1)
    printf("error division by zero");
    else printf("the division is %f \n",respons->result);
    }
#ifndef DEBUG
    clnt_destroy (clnt);
#endif   /* DEBUG */
}

int
main (int argc, char *argv[])
{
    char *host;

    if (argc < 4) {
        printf ("usage: %s server_host\n", argv[0]);
        exit (1);
    }
    host = argv[1];
    x=(int) argv[2];
    y= (int) argv[3];
    calc_1 (host);
exit (0);
}

似乎您已将
entier.a
entier.b
定义为整数,但正在将它们作为浮点数传入。我希望这会在编译时产生错误,但如果不是,那么它可能会尝试对浮点数进行整数运算,这不会很好地工作

struct entier{
  int a;
  int b;
};

typedef struct entier params;


问题2

x=(int) argv[2];
y= (int) argv[3];
在C语言中,这将获取一个
char*
,并尝试将其作为
int
处理,这也不会满足您的需要。您需要使用某种转换函数将它们作为整数
atoi()
可以在这里执行您需要的操作


由于从
int
float
char[]的大量转换问题,此代码不应按原样运行,因此您确定在编译时未收到有关此问题的警告吗
to
int

是的,这是一个更新,但在我传递整数但仍然显示之前,sameI至少会收到一些警告。无论如何,请将输入字符串转换为整数,不要将它们转换为浮点数,然后重试。我还将通过
printf(“%d%d\n”,arguments.a,arguments.a)
打印输入,以确保它们是您期望的数字。非常好。然后请把我的答案投上一票,并勾选下面的复选标记,这样我就可以获得学分了。
params  arguments;
arguments.a=(float)x;
arguments.b=(float)y;
x=(int) argv[2];
y= (int) argv[3];