2013-10-07 3 views
1

Я новичок в программировании в C. Я пытаюсь создать небольшую и простую программу для сложения двух целых чисел из файла calculs.xПростой калькулятор с rpcgen

Здесь, содержимое файла calculs.x

/* calculs.x*/ 

struct data_in { 
    int arg1; 
    int arg2; 
}; 
typedef struct data_in data_in; 

struct result_int { 
    int result; 
    int errno; 
}; 

struct result_float { 
    int result; 
    int errno; 
}; 

typedef struct result_int result_int; 
typedef struct result_float result_float; 

program CALCULS{ 
    version VERSION_UN{ 
     void CALCULS_NULL(void) = 0; 
     result_int ADD (data_in) = 1; 
     result_int SUB(data_in) = 2; 
     result_int MUL(data_in) = 3; 
     result_float DIV (data_in) = 4; 
    } = 1; 
} = 0x20000001; 

впервые я создал файл calculs.c для клиента:

#include <rpc/rpc.h> 
#include "calculs.h" 

int main(int argc, char *argv[]) { 
    int buffer[256]; 
    struct data_in input; 
    struct result_int *output; 
    CLIENT *cl; 

    if (argc != 2) { 
     printf("usage: client hostname_of_server\n"); 
     exit(1); 
    } 

    /*Etablir le lien vers le serveur distant 
    * cl = clnt_create(server, PROG, VERS, prot); 
    */ 
    cl = clnt_create(argv[1], CALCULS, VERSION_UN, "tcp"); 
    if (cl == NULL) { 
     clnt_pcreateerror(argv[1]); 
     exit(1); 
    } 

    input.arg1 = 5; 
    input.arg2 = 5; 

    output = add_1(&input, cl); 
    if (output == NULL) { 
     clnt_perror(cl, argv[1]); 
     exit(1); 
    } 
    printf("the result field is %d\n", output->result); 
    printf("the errno field is %d\n", output->errno); 

    clnt_destroy(cl); 

    return 0; 
} 

Я не получил какую-либо ошибку компиляции для этого файла, но для другого файла rcalculs.c, я могу не компилятор ле. Вот содержимое файла rcalculs.c:

#include <rpc/rpc.h> 
#include "calculs.h" 

result_int *add_1(struct data_in data, struct svc_req *rqstp) { 
    int buffer; 
    struct result_int result; 
    int a = data.arg1; 
    int b = data.arg2; 
    buffer = a+b; 
    result.result = buffer; 
    result.errno =0; 
    return result; 
} 

Ошибка сообщение для компиляции является

rcalculs.c:11:13: erreur: conflicting types for ‘add_1’ 
In file included from rcalculs.c:9:0: 
calculs.h:46:22: note: previous declaration of ‘add_1’ was here 
rcalculs.c: In function ‘add_1’: 
rcalculs.c:19:5: erreur: incompatible types when returning type ‘struct result_int’ but ‘struct result_int *’ was expected 

могли бы вы помочь мне решить эту проблему, пожалуйста?

ответ

0
erreur: conflicting types for ‘add_1 

Эта ошибка возникает из-за того, что вы не объявили функцию add_1(). и когда вы когда-либо делали вызов функции add_1(), он обрабатывается как объявление.

Добавить эту строку перед main()

result_int *add_1(struct data_in data, struct svc_req *rqstp); 

rcalculs.c: 19: 5: ERREUR: несовместимые типы при возвращении типа 'STRUCT result_int' но 'STRUCT result_int * Ожидалось

result_int * add_1(struct data_in data, struct svc_req *rqstp) { 
    int buffer; 
    struct result_int result; //here declare pointer 
    int a = data.arg1; 
    int b = data.arg2; 
    buffer = a+b; 
    result.result = buffer; //change here 
    result.errno =0;  //change here 
    return result; //here you are returning struct result_int type but required is struct result_int * type 
    } 

return pointer. И соответственно вносите изменения в свою функцию.


output = add_1(&input, cl); //here you are passing reference of input but you just need to pass input. 
0

Вы определяете функцию add_1 как возвращающая указатель на result_int, когда вы говорите

result_int *add_1(struct data_in data, struct svc_req *rqstp) { 

в файле rcalculs.c

Однако внутри этой функции можно определить

struct result_int result; 

и когда вы возвращаете значение, вы делаете

return result; 

Если вы не хотите об ошибке, вы должны сделать

return &result; 

Проблема в том, что ваша переменная result была создана локально внутри функции (в стеке) - так что станет недействительным после возвращения функции. Быстрое и уродливое «исправление» для этого было бы определить вашу переменную как static (что означает, что она будет продолжать существовать после возвращения функции, но 2- ваша функция перестает быть потокобезопасной: если она вызывается из двух разных места не знают, какое значение будет указано).

Вы не разместили свой файл .h, поэтому я угадываю немного, но я думаю, что следующее изменение на rcalculs.c «исправит» вашу проблему (но обратите внимание на комментарий выше ... это НЕ считается хорошей практикой программирования)

#include <rpc/rpc.h> 
#include "calculs.h" 

result_int *add_1(struct data_in data, struct svc_req *rqstp) { 
    int buffer; 
    static struct result_int result; 
    int a = data.arg1; 
    int b = data.arg2; 
    buffer = a+b; 
    result.result = buffer; 
    result.errno =0; 
    return &result; 
} 

Сообщите мне, если это работает. Примечание. Это предназначено только для того, чтобы помочь вам понять ошибку. Я НЕ РЕКОМЕНДУЮ это как структуру программы для «реальной» программы.

Bonne шанс!

1

Используйте calculs.x в такте, как показано ниже.

/* calculs.x*/ 

struct data_in { 
    int arg1; 
    int arg2; 
}; 
typedef struct data_in data_in; 

struct result_int { 
    int result; 
    int errno; 
}; 

struct result_float { 
    int result; 
    int errno; 
}; 

typedef struct result_int result_int; 
typedef struct result_float result_float; 

program CALCULS{ 
    version VERSION_UN{ 
     void CALCULS_NULL(void) = 0; 
     result_int ADD (data_in) = 1; 
     result_int SUB(data_in) = 2; 
     result_int MUL(data_in) = 3; 
     result_float DIV (data_in) = 4; 
    } = 1; 
} = 0x20000001; 

Для вашего клиента calculs.c пользователя

#include <rpc/rpc.h> 
#include "calculs.h" 

result_int *add_1(struct data_in data, struct svc_req *rqstp); 

int main(int argc, char *argv[]) { 
    int buffer[256]; 
    struct data_in input; 
    struct result_int *output; 
    CLIENT *cl; 

    if (argc != 2) { 
     printf("usage: client hostname_of_server\n"); 
     exit(1); 
    } 

    /*Etablir le lien vers le serveur distant 
    * cl = clnt_create(server, PROG, VERS, prot); 
    */ 
    cl = clnt_create(argv[1], CALCULS, VERSION_UN, "tcp"); 
    if (cl == NULL) { 
     clnt_pcreateerror(argv[1]); 
     exit(1); 
    } 

    input.arg1 = 5; 
    input.arg2 = 5; 

    output = add_1(&input, cl); 
    if (output == NULL) { 
     clnt_perror(cl, argv[1]); 
     exit(1); 
    } 
    printf("the result field is %d\n", output->result); 
    printf("the errno field is %d\n", output->errno); 

    clnt_destroy(cl); 

    return 0; 
} 

содержимое rcalculs.c:

#include <rpc/rpc.h> 
#include "calculs.h" 

result_int *add_1(struct data_in data, struct svc_req *rqstp) { 
    int buffer; 
    struct result_int result; 
    int a = data.arg1; 
    int b = data.arg2; 
    buffer = a+b; 
    result.result = buffer; 
    result.errno =0; 
    return &result; 
} 

Позвольте мне знать, если он работает.

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