c - 为什么我在此代码上出现运行时错误?(由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;
}
解决方案
从 C++ 过渡到 CI 思考可能比其他方式更难(这就是我所做的)。
下一段已从原始答案略微编辑。感谢John Bode纠正了我关于 C99 引入可变长度数组的问题
最初,在 C 中使用 [ ] 的数组不能像在 C++ 中那样使用变量声明为大小。正如有人在评论中指出的那样,“自 C99 以来,可以使用运行时变量声明数组,尽管支持参差不齐,并且该功能在 C11 中是可选的。它们被称为可变长度数组,并且很有用。” 因此,这意味着它不适合您,因为您当前的编程环境设置不支持它。
如果您想弄清楚如何让您的编程环境支持这一点,请继续。我个人不知道我的头顶。对于你来说,在这个问题的背景下,我认为这有点矫枉过正。最简单的事情就是使用宏。删除int array_size = 10;
并将其定义为 main 上方的宏,例如#define array_size 10
. (附带说明,我总是喜欢将宏全部设为大写,例如 ARRAY_SIZE,但您不必这样做)。出于您的目的,读者在此上下文中对宏的解释是,在这里它将充当文本替换。因此,无论哪里写 array_size,它都相当于你手动输入数字 10,或者你给它的任意大小。
推荐阅读
- r - 将特定列更改为 R 中的因子
- vba - 关闭 Shell.Application 实例
- angular - 是否可以重新生成使用 ng build --prod 构建的代码?
- python-3.x - 用 Python 和 BeautifulSoup 抓取网页,发现错误
- django - 我想在 django 中将用户活动添加到数据库
- javascript - Angular - 如何最小化相同的代码使用?
- javascript - 无论大小如何调整我的画布大小以适应相同的内容
- python - 如何将当前url中的参数传递给Django 3中的html模板
- python - IndexError:列表索引超出范围(将地址转换为地理坐标的 Python 程序
- python-3.x - 使用 python 和 bs4 获取 url 中短语的计数