尝试使用结构变量时遇到麻烦

时间:2018-08-18 00:55:19

标签: c struct

我正在学习C编程,并且试图制作一个简单的程序来将点存储在XY平面中。

起初我是这样的:

#include<stdio.h>
#include<stdlib.h>
typedef struct point { float x, y; } PNT;
typedef struct plane
{
    int n_points;
    PNT pt[50];

} plane;
void points_input(plane planexy);
void points_distance(plane planexy);
int main()
{
    plane planexy;
    printf("How many points do you want to enter? : ");
    scanf("%d", &planexy.n_points);
    points_input(planexy);
    points_distance(planexy);
}
void points_input(plane planexy)
{
    int i;

    for (i = 0; i < planexy.n_points; i++)
    {
        printf("\nEnter a coordinate for x%d ", i);
        scanf("%f", &planexy.pt[i].x);
        printf("\nEnter a coordinate for y%d ", i);
        scanf("%f", &planexy.pt[i].y);
        system("cls");
    }
}
void points_distance(plane planexy)
{
    int i;
    printf("Select first point :\n");

    for (i = 0; i < planexy.n_points; i++)
    {
        printf("\n %d.(%.1f ,%.1f)", i, planexy.pt[i].x, planexy.pt[i].y);
    }
}

而且它不起作用,当我尝试访问某个点的变量之一时,它总是返回0。

弄乱变量名“ planexy”并将其用作大小为1的向量,然后将其所有提及均用作planexy [0]后,它突然开始工作:

#include<stdio.h>
#include<stdlib.h>
typedef struct point { float x, y; } PNT;
typedef struct plane
{
    int n_points;
    PNT pt[50];

} plane;
void points_input(plane planexy[]);
void points_distance(plane planexy[]);
int main()
{
    plane planexy[1];
    printf("How many points do you want to enter? : ");
    scanf("%d", &planexy[0].n_points);
    points_input(planexy);
    points_distance(planexy);
}
void points_input(plane planexy[])
{
    int i;

    for (i = 0; i < planexy[0].n_points; i++)
    {
        printf("\nEnter a coordinate for x%d ", i);
        scanf("%f", &planexy[0].pt[i].x);
        printf("\nEnter a coordinate for y%d ", i);
        scanf("%f", &planexy[0].pt[i].y);
        system("cls");
    }
}
void points_distance(plane planexy[])
{
    int i;
    printf("Select first point :\n");

    for (i = 0; i < planexy[0].n_points; i++)
    {
        printf("\n %d.(%.1f ,%.1f)", i, planexy[0].pt[i].x, planexy[0].pt[i].y);
    }
}

现在,此代码可以工作了,但是我不知道为什么必须这样来使其起作用,而且看起来也不是很好的代码。

如果我要使用多个平面“ XY”,我应该将变量存储为向量,但是我只想使用一个,我不明白为什么在使用大小为1的向量时它会起作用,但是只是当我只想使用一个变量来存储一个平面时就没有。

第一种方法有什么问题?

对不起,英语不好。

2 个答案:

答案 0 :(得分:0)

您在编译时从编译器中获得的错误告诉您什么地方出错了:

program.c: In function ‘main’:
program.c:23:20: error: incompatible type for argument 1 of ‘ingreso_puntos’
     ingreso_puntos(planexy);
                    ^
program.c:15:6: note: expected ‘plane * {aka struct plane *}’ but argument is of type ‘plane {aka struct plane}’
 void ingreso_puntos(plane planexy[]);
      ^

您已将函数声明为采用指向平面(plane *)的指针,但是您正在使用平面调用它们。使用&运算符获取planexy的地址以传递给该函数。

program.c: In function ‘ingreso_puntos’:
program.c:31:28: error: request for member ‘n_puntos’ in something not a structure or union
     for (i = 0; i < planexy.n_puntos; i++)
                            ^

此函数中,planexy是指向平面的指针,因此您需要->而不是.来访问平面。

答案 1 :(得分:0)

我已将您的问题编辑为英语,以便其他人可以通过SO理解。
希望您能接受,因为我会用英语回答。

您正在函数planexy中传递对象points_input()副本,因此在planexy中定义的实际main()不会'改变。相反,您应该传递一个指向它的指针,然后修改该指针指向的对象。

修改后的代码:

转发声明

void points_input(plane* planexy); // ingreso_puntos function

代码

void points_input(plane* planexy)
{
    int i;

    for (i = 0; i < planexy->n_points; i++)
    {
        printf("\nEnter a coordinate for x%d ", i);
        scanf("%f", &planexy->pt[i].x);
        printf("\nEnter a coordinate for y%d ", i);
        scanf("%f", &planexy->pt[i].y);
        system("cls");
    }
}

使用指针时,使用->代替仅用于对象的点.

为什么它将数组作为第二个代码使用?

  

简单来说,数组 / 向量本身就是实际的指针。

证明:  scanf("%f", &planexy[0].pt[i].x);scanf("%f", &planexy->pt[i].x);相同。

main() 中。您应该传递创建指针的planexy地址

points_input(&planexy);

提示::当您想通过函数修改一个对象时,您可以像使用scanf一样完全传递一个指向该对象的指针。否则,当您只想读取一个对象时,通常可以通过它。