2016-03-04 37 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

是的。你只需要声明一次结构。当你包含头文件时,(在概念上)头文件的内容被复制到源文件中,并成为你的新源代码。 –