首页 > 解决方案 > 为什么我在此代码上出现运行时错误?(由makefile通过linux运行的C代码)

问题描述

第一次用 C 编码,来自 C++。我试图制作一个解决 K-Neighbors 问题的程序。假设所有位置都是 2D 平面中的点,当给定 n 个城市的列表时,它应该返回最近的 k 个城市。经过多次调试,它终于编译运行了,但返回了运行时错误。我无法阅读错误代码,所以我不明白发生了什么。我做错了什么?

#include <stdio.h>  //for printf
#include <stdlib.h> //for malloc, free
#include <math.h>   //for sqrt, pow

struct City {
    double x;
    double y;
    double distance;
};

double get_distance(double x1, double y1, double x2, double y2){
    return sqrt(pow(x2 - x1, 2) + pow(y2- y1, 2));
}

void make_list(struct City arr[]){
    arr[0].x = 0;       arr[0].y = 0;       arr[0].distance = 0;
    arr[1].x = 110;     arr[1].y = 150;     arr[1].distance = 0;
    arr[2].x = 140;     arr[2].y = 30;      arr[2].distance = 0;
    arr[3].x = 91;      arr[3].y = 70;      arr[3].distance = 0;
    arr[4].x = 172;     arr[4].y = 161;     arr[4].distance = 0;
    arr[5].x = 62;      arr[5].y = 160;     arr[5].distance = 0;
    arr[6].x = 16;      arr[6].y = 163;     arr[6].distance = 0;
    arr[7].x = 161;     arr[7].y = 40;      arr[7].distance = 0;
    arr[8].x = 162;     arr[8].y = 20;      arr[8].distance = 0;
    arr[9].x = 61;      arr[9].y = 117;     arr[9].distance = 0;
}

//time complexity O(n^2)
void insertion_sort(double arr[], int n){
    int i, key, j;
    for(i = 1; i < n; i++) {
        key = arr[i];
        j = i - 1;

        while(j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
    }
}

int main() {
    int array_size = 10;
    struct City arr[array_size];
    double distances[array_size];
    make_list(arr);

    //Find distance from me and add to sorted distances
    for(int i = 0; i < array_size; i++){
        arr[i].distance = get_distance(arr[0].x, arr[0].y, arr[i].x, arr[i].y);
        insertion_sort(distances, array_size);
    }

    //Print the distances
    int k = 5;
    double temp = 0;
    printf("\nThe %d closest distances are:\n", k);
    if(k < array_size){
        for(int i = 1; i < k; i++){
            temp = distances[i];
            printf("%f\n", temp);
        }
    }
    
    return 0;
}

标签: cruntime-error

解决方案


从 C++ 过渡到 CI 思考可能比其他方式更难(这就是我所做的)。

下一段已从原始答案略微编辑。感谢John Bode纠正了我关于 C99 引入可变长度数组的问题

最初,在 C 中使用 [ ] 的数组不能像在 C++ 中那样使用变量声明为大小。正如有人在评论中指出的那样,“自 C99 以来,可以使用运行时变量声明数组,尽管支持参差不齐,并且该功能在 C11 中是可选的。它们被称为可变长度数组,并且很有用。” 因此,这意味着它不适合您,因为您当前的编程环境设置不支持它。

如果您想弄清楚如何让您的编程环境支持这一点,请继续。我个人不知道我的头顶。对于你来说,在这个问题的背景下,我认为这有点矫枉过正。最简单的事情就是使用宏。删除int array_size = 10;并将其定义为 main 上方的宏,例如#define array_size 10. (附带说明,我总是喜欢将宏全部设为大写,例如 ARRAY_SIZE,但您不必这样做)。出于您的目的,读者在此上下文中对宏的解释是,在这里它将充当文本替换。因此,无论哪里写 array_size,它都相当于你手动输入数字 10,或者你给它的任意大小。


推荐阅读