2016-03-04 36 views
0

我試圖發送一個結構從主要.h文件在那裏操縱。這裏是我的.C代碼:注意:期望'結構填充',但參數的類型'結構信息'

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include "funcon.h" 
enum sign{ 
positive, 
negative 
}sign; 

enum type{ 
integer, 
floating 
}type; 

struct Info{ 
enum sign leading; 
enum type out; 
char * exp; 
char * fraction; 
char * binary; 
}; 


int main(int argc, char ** argv){ 
struct Info stuff; 
stuff.exp = malloc(8); 
stuff.fraction = malloc(23); 
stuff.binary = malloc(31); 
strncpy(stuff.exp, argv[1]+1,8); 
strcpy(stuff.fraction,argv[1]+9); 
strcpy(stuff.binary, argv[1] + 1); 
printf("%s\n", stuff.exp); 
printf("%s\n", stuff.fraction); 
doyourjob(stuff); 
return 0; 
} 

這是.h文件:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
enum signf{ 
positive1, 
negative1 
}signf; 

enum typef{ 
integer2, 
floating2 
}typef; 

struct filler{ 
enum signf leading2; 
enum typef out2; 
char * exp2; 
char * fraction2; 
char * binary2; 
}; 

int doyourjob(struct filler solveme){ 

if(solveme.out2 == integer2){ 

    if(solveme.leading2 == positive1){ 
    int hold; 
    sscanf(solveme.binary2, "%d", &hold); 

    }else{ 

    } 

}else{//When solveme is a floating type 

} 
} 

我編譯時出現錯誤:
function.c:在函數 '主':
function.c:51:error:'doyourjob'參數1的不兼容類型
funcon.h:23:note:expected'struct filler'但參數的類型是'struct Info'
我也試過在f中更改結構體填充不會將信息放入Info中,但是會出現範圍錯誤。

+0

將函數定義放在頭文件中的風格非常糟糕。你爲什麼要傳遞一個類型信息「stuff」的結構給doyourjob(...)函數,這個函數顯然需要一個類型填充的結構體?如果他們是指針,你可以將它們施放,但是你傳遞整個結構。 – cleblanc

+0

我不介意在struct類型的信息,但由於範圍編譯錯誤,我認爲我不得不重新命名.h中的結構類型。如果情況並非如此,那麼如何將結構發送給我的.h並保存所有信息?是否有可能刪除我在.h中創建的結構,並將簽名保存爲要傳遞的結構信息? – AlwaysLearning

+0

我會將'struct Info {...}'移動到.h文件,並將'doyourjob(...)'移動到.c文件並使其使用Info結構類型。 – cleblanc

回答

1

這些類型是不兼容的。他們需要是兩個相同的類型。 更改類型爲struct Info是正確的,但您還需要將struct Info的聲明移動到某處int doyourjob(..)可以看到它。例如。之前int doyourjob(..)在.h文件中。

在旁註中,您應該聲明但不在頭文件中實現函數。即在您的.h增加:

struct Info { 
    // ... 
} 

int doyourjob(struct Info); 

現在.c文件(說doyourjob.c)您有:

#include "doyourjob.h" 

int doyourjob(struct Info) { 
    // Your code here 
} 

最後,您需要編譯和鏈接兩個文件。

+0

您是否刪除舊的結構刪除文件?你應該只有一個結構信息,它應該在_int之前doyourjob(結構信息)_ –

+0

這是否意味着我原來的.c我正在處理應該不再有結構信息? – AlwaysLearning

+0

是的。你只需要聲明一次結構。當你包含頭文件時,(在概念上)頭文件的內容被複制到源文件中,併成爲你的新源代碼。 –