2013-10-07 25 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文件,我可以不compi樂。下面是該文件的內容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()進行函數調用時,它將視爲聲明。19:5:ERREUR:

main()

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

rcalculs.c添加此行返回時型 '結構result_int',但不兼容的類型 '結構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 
    } 

返回指針。並在你的功能做相應的改變。


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

當您在文件中說

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

你所定義的函數add_1作爲指針返回到result_intrcalculs.c

然而,該函數內部定義

struct result_int result; 

和當你返回一個值時,你做

return result; 

如果你不想一個錯誤,你就必須做

return &result; 

但問題是,你的result變量是本地函數內部產生(在棧上) - 使其一旦函數返回就會失效。一個快速和醜陋的「修復」,將這個變量定義爲static(這意味着1-它將在函數返回後繼續存在,但是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用戶rcalculs.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; 
} 

內容:

#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; 
} 

讓我知道,如果它的工作原理。