Поскольку я наткнулся на эту проблему и ничего не ответил здесь , я решил обратиться за помощью в моей ситуации.
Я хочу сделать простой RPC-сервер-клиент, где бытри операции:
- среднее значение массива X []
- max и min элементов массива X []
- , умножая каждый элемент массива X [] начисло с плавающей точкой 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 удаленных процедуры длясервер и проверил мой клиент с простым жестко закодированным массивом, который работал нормально (хотя я предполагаю, что иногда была ошибка arguments cannot be encoded
).
Но затем я попытался создать меню для клиента, спрашиваядлина 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");
...
и ад вырвался на свободу.В частности, на сервере произошла ошибка сегментации, и вскоре клиент начал «работать» без подключения к серверу.
![enter image description here](https://i.stack.imgur.com/t57eQ.png)
«Ошибка сегментации» дала мне представление о мошенническом указателе или неинициализированной переменной, но, посмотрев на код слишком много времени, я не нашел ничего похожего на это.Я подозревал способ написания моего .x
файла, но я тестировал более простую версию этого файла с теми же результатами.
Что пошло не так?
ps: repo для более детального просмотраэтого здесь
Обновление: Я разбираюсь с процедурами на сервере, и кажется, что почти вся структура, которая передается в качестве аргументов, на самом деле непередать что-либо вообще, что приведет к созданию цикла for на основе мусора.