You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将文本文件整数传入struct函数?凸包实现报错问题

解决方法:整数数组转Point结构体数组并修正函数参数问题

你的代码里有几个关键问题导致编译/运行报错,我来一步步帮你解决:

核心问题分析

  1. 类型不匹配:你直接把int类型的全局数组integers传给需要struct Point数组的smallest_xCoord函数,这是完全不兼容的类型,编译器肯定会报错。
  2. 函数定义错误:smallest_xCoord的参数写的是单个struct Point points,但你实际要传的是数组;而且函数内部还重复定义了struct Point points[],这会触发重定义错误。
  3. 整数转Point的逻辑缺失:文本里的整数是成对表示坐标的(x,y),你需要把连续的两个整数转换成一个Point结构体,而不是直接传原始int数组。
  4. 输入格式符错误:用%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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:47:38