我正在学习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的向量时它会起作用,但是只是当我只想使用一个变量来存储一个平面时就没有。
第一种方法有什么问题?
对不起,英语不好。
答案 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
一样完全传递一个指向该对象的指针。否则,当您只想读取一个对象时,通常可以通过它。