如何将文本文件整数传入struct函数?凸包实现报错问题
解决方法:整数数组转Point结构体数组并修正函数参数问题
你的代码里有几个关键问题导致编译/运行报错,我来一步步帮你解决:
核心问题分析
- 类型不匹配:你直接把
int类型的全局数组integers传给需要struct Point数组的smallest_xCoord函数,这是完全不兼容的类型,编译器肯定会报错。 - 函数定义错误:
smallest_xCoord的参数写的是单个struct Point points,但你实际要传的是数组;而且函数内部还重复定义了struct Point points[],这会触发重定义错误。 - 整数转Point的逻辑缺失:文本里的整数是成对表示坐标的(x,y),你需要把连续的两个整数转换成一个
Point结构体,而不是直接传原始int数组。 - 输入格式符错误:用
%u(无符号整数)读取到int类型变量里,可能会导致数据异常,应该用%d。
修正后的完整代码
#include <stdio.h> // 补上你提到的Point结构体定义 struct Point { int x; int y; }; // GLOBAL Variable static int integers[100000]; int load_integers(const char* filename) { FILE *fp = NULL; int value; int i = -1; if ((fp = fopen(filename, "r")) == NULL) { return -1; } // 把%u改成%d,匹配int类型的value while (fscanf(fp, "%d", &value) == 1 && ++i < 100000) { integers[i] = value; } fclose(fp); return i + 1; } // 修正函数参数:接收Point数组(用指针表示)和点的数量 struct Point smallest_xCoord(struct Point *points, int numPoints) { // 去掉内部重复定义的points数组 struct Point minX_point = points[0]; int i; for (i = 1; i < numPoints; i++) { if (points[i].x < minX_point.x) { minX_point = points[i]; } else if (points[i].x == minX_point.x) { if (points[i].y < minX_point.y) { minX_point = points[i]; } } } return minX_point; } int main(int argc, char *argv[]) { int num_ints = 0; if (argc < 2) { fprintf(stderr, "%s <file>\n", argv[0]); return -1; } if ((num_ints = load_integers(argv[1])) <= 0) { fprintf(stderr, "Error reading from file: %s\n", argv[1]); return -1; } // 检查整数数量是否是偶数(每个Point需要x和y两个整数) if (num_ints % 2 != 0) { fprintf(stderr, "Invalid data: number of integers is odd\n"); return -1; } int num_points = num_ints / 2; struct Point points[50000]; // 因为100000个int最多对应50000个Point // 把int数组转换成Point数组 for (int i = 0; i < num_points; i++) { points[i].x = integers[2 * i]; points[i].y = integers[2 * i + 1]; } // 调用函数并处理返回值 struct Point min_point = smallest_xCoord(points, num_points); printf("Smallest x coordinate point: (%d, %d)\n", min_point.x, min_point.y); return 0; }
关键修正点说明
- 补上Point结构体:你提到了但没写,必须显式定义才能用。
- 修正函数参数:
smallest_xCoord现在接收struct Point *points(等价于数组),这样才能传入结构体数组。 - 整数转Point逻辑:循环将每两个int元素打包成一个Point,确保坐标配对正确。
- 输入格式符修正:用
%d读取int类型,避免无符号/有符号类型不匹配的问题。 - 数据合法性检查:判断读取的整数数量是否为偶数,防止出现不完整的坐标点。
如果你不想用全局数组,也可以考虑在load_integers里动态分配内存,这样更灵活,但上面的代码是基于你现有结构的最小改动。
内容的提问来源于stack exchange,提问作者IBSurviver
相关产品推荐
相关产品推荐

