嘿,我是编程新手(通过C中的cs50x学习),当他们提到结构时,我决定愚弄,只是编写一个快速程序,使用函数交换结构中的某些值。我正在运行,直到几个错误消息,第一个是“不兼容的指针类型将'struct numbers *'传递给'struct numbers *'类型的参数。另一个问题似乎出现在函数定义中,编译器说”不完整类型'结构编号'的定义“我只是希望得到一些帮助,因为我很难过。
继承代码(我知道它的粗糙,但我正在学习大声笑)
#include <stdio.h>
struct numbers;
void swap(struct numbers* s);
int main(void)
{
struct numbers
{
int a;
int b;
int c;
};
struct numbers x = {1, 5 , 9};
swap(&x);
printf("%i, %i, %i\n", x.a, x.b, x.c);
return 0;
}
void swap(struct numbers* s)
{
int temp = s -> a;
int temp2 = s -> b;
s -> a = s -> c;
s -> b = temp;
s -> c = temp2;
}
答案 0 :(得分:8)
您希望swap()
中的代码能够访问struct numbers
的字段,但该类型的完整声明是 in {{1所以它不可见。
宣布声明,必须让所有需要它的人都能看到。把它放在第一位也不需要预先声明结构。
与main()
本身相同,将其放在swap()
之前将无需在同一文件中为其创建原型。
应该是:
main()
答案 1 :(得分:6)
问题是struct numbers
声明是全局的,但定义在main
中是本地的,要使用结构的成员,swap
函数必须知道结构具有哪些成员,并且因为它无法看到它不知道的定义。删除声明并将定义放在全局范围内。
答案 2 :(得分:4)
功能swap
无法看到struct numbers
的定义。将其全局置于main
之外。
额外提示 - 对结构使用typedef
,它为您提供了声明的灵活性:
typedef struct typeNumbers
{
int a;
int b;
int c;
} numbers;
请注意,typeNumbers是可选的。声明如下:
numbers x = {1, 2, 3};
答案 3 :(得分:1)
问题在于结构是主要的,我还对代码进行了一些修复并对它们进行了评论。
#include <stdio.h>
//By defining the struct at the beginning you can avoid the forward declaration
//and it make more sense to know what "numbers" is before continuing reading the code.
struct numbers {
int a;
int b;
int c;
};
void swap(struct numbers* s)
{
//Small change to use only one temp variable...
int temp2 = s -> b;
s -> b = s -> a;
s -> a = s -> c;
s -> c = temp2;
}
int main(void)
{
struct numbers x = {1, 5 , 9};
swap(&x);
printf("%i, %i, %i\n", x.a, x.b, x.c);
return 0;
}