gpt4 book ai didi

c - RPC:段错误(核心已转储)

转载 作者:行者123 更新时间:2023-11-30 16:31:29 25 4
gpt4 key购买 nike

自从我偶然发现这个问题以来,没有任何答案here ,我决定针对我的情况寻求帮助。

我想制作一个简单的 RPC 服务器-客户端,其中包含三个操作:

  • 数组 X[] 的平均值
  • 数组 X[] 的最大和最小元素
  • 将数组 X[] 的每个元素与 float r 相乘

所以我制作了 .x 文件,并生成了我需要的代码框架。

struct X_arr
{
int X <100>;
int X_size;
};

struct max_min
{
int max;
int min;
};

struct X_times_r
{
int X <100>;
int X_size;
float r;
};

struct prod
{
float prod <100>;
};

program DUM_PROG
{
version DUM_VERS
{
float average(X_arr)=1;
max_min max_and_min(X_arr)=2;
prod product(X_times_r)=3;
}=1;
}=0x23451111;

然后我修复了服务器的 3 个远程过程,并使用一个简单的硬编码数组测试了我的客户端,效果很好(尽管我猜有时会出现一些参数无法编码错误)。

但后来我尝试为客户端制作一个菜单,询问 X[] 的长度并获取每个所需操作的元素:

...


int i;
int flag=1;
int n;
int r;

int choice;

printf("--------------------------------------------------------------------------\n");

do
{

printf("==========================\n");
printf("=====Dummy Operations=====\n");
printf("==========================\n");
printf("1. average of X[] \n");
printf("2. max & min of X[] \n");
printf("3. r*X[] \n");
printf("4. Exit \n");
printf("==========================\n");
printf("Choice: ");
scanf("%d", &choice);
printf("==========================\n");




if(choice==1)
{
///////////////////////////////////////
//average of X[]
///////////////////////////////////////
printf("Number of elements: ");
scanf("%d", &n);

average_1_arg.X.X_len=n;
average_1_arg.X_size=n;
average_1_arg.X.X_val=(int *)malloc(n*sizeof(int));

for(i=0;i<n;i++)
{
printf("X[%d] = ", i);
scanf("%d", &average_1_arg.X.X_val[i]);
}

result_1=average_1(&average_1_arg, clnt);

printf("Average of X[]: %.2f\n", *result_1);
///////////////////////////////////////
///////////////////////////////////////
}
else if(choice==2)
{
///////////////////////////////////////
//max and min of X[]
///////////////////////////////////////
printf("Number of elements: ");
scanf("%d", &n);

max_and_min_1_arg.X.X_len=n;
max_and_min_1_arg.X_size=n;
max_and_min_1_arg.X.X_val=(int *)malloc(n*sizeof(int));

for(i=0;i<n;i++)
{
printf("X[%d] = ", i);
scanf("%d", &max_and_min_1_arg.X.X_val[i]);
}

result_2=max_and_min_1(&max_and_min_1_arg, clnt);

printf("Max of X[]: %d\n", result_2->max);
printf("Min of X[]: %d\n", result_2->min);
///////////////////////////////////////
///////////////////////////////////////
}
else if(choice==3)
{
///////////////////////////////////////
//r*X[]
///////////////////////////////////////
printf("Number of elements: ");
scanf("%d", &n);

printf("r: ");
scanf("%d", &r);

product_1_arg.X.X_len=n;
product_1_arg.X_size=n;
product_1_arg.r=r;
product_1_arg.X.X_val=(int *)malloc(n*sizeof(int));

for(i=0;i<n;i++)
{
printf("X[%d] = ", i);
scanf("%d", &product_1_arg.X.X_val[i]);
}

result_3=product_1(&product_1_arg, clnt);

for(i=0;i<n;i++)
printf("%.2f*X[%d]=%.2f\n", product_1_arg.r, i, result_3->prod.prod_val[i]);
///////////////////////////////////////
///////////////////////////////////////
}
else if(choice==4)
{
flag=0;
}
else
{
printf("Invalid Choice. Terminating in 3...2...1...\n");
exit(1);
}
}while(flag);

printf("--------------------------------------------------------------------------\n");

...

hell 爆发了。更具体地说,服务器发生段错误,不久之后,客户端在没有服务器连接的情况下开始“工作”。

enter image description here

“段错误”让我想到了流氓指针或未初始化的变量,但在查看代码太多时间后,我没有找到任何接近的东西。我怀疑我的 .x 文件的编写方式,但我测试了它的一个更简单的版本,得到了相同的结果。

出了什么问题?

ps:repo 可以更深入地了解此内容 here

更新:我搞乱了服务器上的过程,似乎作为参数传递的几乎整个结构实际上根本没有传递任何内容,导致创建一个基于垃圾的 for 循环。

最佳答案

啊,耻辱的行走......

结果我留下了生成的 rpc 文件交给我的所有默认函数调用,之前 我制作了我的菜单并给出了我的值(value)观:

result_1 = average_1(&average_1_arg, clnt);
if (result_1 == (float *) NULL) {
clnt_perror (clnt, "call failed");
}

result_2 = max_and_min_1(&max_and_min_1_arg, clnt);
if (result_2 == (max_min *) NULL) {
clnt_perror (clnt, "call failed");
}

result_3 = product_1(&product_1_arg, clnt);
if (result_3 == (prod *) NULL) {
clnt_perror (clnt, "call failed");
}

因此,每次客户端启动时,都已经调用了所有函数,并且没有参数初始化,这确实要归功于您可怕的编码技巧。

修复了它,文字就像魅力一样。你可以自己测试一下here

enter image description here

关于c - RPC:段错误(核心已转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50544389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com