2011-12-26 4 views
0

Я создавал сервер-клиентское приложение на основе 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.

Просьба предоставить мне решение и спасибо заранее:)

+3

Этот код не компилируется: вы возвращаете '& result', который имеет тип' event ** '. Пожалуйста, напишите какой-нибудь реальный код. –

+1

Кроме того, причина, по которой вы не можете заставить это работать, заключается в том, что ваш клиент и сервер (предположительно) два отдельных процесса и, следовательно, имеют независимые адресные пространства. Нельзя видеть память другого. Вам нужно будет изучить «общую память», если вы хотите перенести исходные указатели. –

+0

@ OliCharlesworth, даже с разделяемой памятью блоки памяти, вероятно, не будут иметь тот же адрес.Вместо необработанного указателя вы хотите использовать смещение в блоке разделяемой памяти. –

ответ

0

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

  1. Существует вопиющая утечка памяти (память таНос() «d, но никогда не бесплатно()» г).
  2. я никогда не инициализируется в log_1_svc
  3. структура * результат события указатель не должен быть статичным
  4. log_1_svc возвращает STRUCT ** событие, а структура * событие (как уже говорилось выше, по на пути , это будет компилировать с предупреждением есть неявный указатель литой. Исправьте предупреждение!)

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

0

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

т.е.

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

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

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