как вернуть массив из функции - PullRequest
0 голосов
/ 27 декабря 2011

Я создавал сервер-клиентское приложение на основе RPC.

У меня есть struct с именем event, который содержит:

int type_id
long int time

У меня есть функция на сервере, которая возвращает(event*):

event *
log_1_svc(event *argp, struct svc_req *rqstp)
{
    static event*  result;
result = (struct event*)malloc (3 * sizeof (struct event));
while (i <3)
        {
            result[i].type_id = i;
            result[i].time = i;
            i++;
        }
return &result

}

Я хочу получать результаты на клиенте, используя этот указатель.

Вот код на сайте клиента:

log_prog_1(char *host,int client_type,int type_id,long int time)
{

event  *result_1;

result_1 = log_1(&log_1_arg, clnt); // this calls the function in server and gurantee that the result is returned an address to pointer

int i =0;
        while (i<3)
        {
            printf ("Type: %d\n",result_1[i].type_id);
            printf ("Time: %ld\n",result_1[i].time);
            [CODE][/CODE]
            i++;
        }

}

Этот код работает, но, похоже, он возвращает адреса, а не значения (числа, показанные в клиентском терминале, отличаются от номеров в терминале сервера).

Я попытался разрешить серверу вернуть result:

return result;

не адрес результата (как написано ранее):

return &result;

Работает, но только первый элемент правильно печатается в клиентском терминале, остальные 2 элемента равны 0.

Пожалуйста, предоставьте мне решение и заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 13 января 2012

Я думаю, что лучше всего передать указатель на память в функцию для заполнения трех struct event.

т.е.

void log_1_svc(event *argp, struct svc_req *rqstp, struct event *result)

Это добавляет дополнительное преимуществочтобы вызывающий мог просто использовать стек и избежать утечек памяти.

0 голосов
/ 13 января 2012

Несколько замечаний:

  1. Произошла явная утечка памяти (память malloc () 'd, но никогда не свободна ()' d).
  2. я никогда не инициализируюсь в log_1_svc
  3. указатель результата события struct * не обязательно должен быть статическим
  4. log_1_svc возвращает событие struct ** вместо события struct * (как уже было сказано выше; Кстати, это скомпилируется с предупреждением о неявном приведении указателя. Исправьте свои предупреждения!)

Чтобы исправить вашу проблему, я бы поставил свою ставку на 2.

...