编程新手,结构和功能问题

时间:2015-01-28 08:39:54

标签: c

嘿,我是编程新手(通过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;
}

4 个答案:

答案 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;
}