【发布时间】:2016-01-23 14:34:58
【问题描述】:
您好,我似乎无法弄清楚为什么我的程序在运行时会在 Visual Studio 中崩溃。调试时出现错误“整数除以 0”。我已经注释了代码中发生错误的行。该程序的目的是演示一个基本的 k-means 聚类算法。
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int m1, o1;
int mem1[10];
int sum1;
int in1;
int m2, o2;
int mem2[10];
int sum2;
int in2;
int arr[10] {21, 135, 45, 174, 10, 64, 85, 44, 96, 125};
int random_mean()
{
m1 = rand() % 255;
m2 = rand() % 255;
return 0;
}
int clustering(int x)
{
int d1;
int d2;
d1 = sqrt((pow(m1 - x, 2)));
d2 = sqrt((pow(m2 - x, 2)));
if (d1 < d2)
{
mem1[in1] = x;
in1++;
}
else if (d2 < d1)
{
mem2[in2] = x;
in2++;
}
return 0;
}
int updatemean()
{
o1 = m1;
o2 = m2;
for (size_t i = 0; i < in1; i++)
{
sum1 += mem1[i];
}
for (size_t i = 0; i < in2; i++)
{
sum2 += mem2[i];
}
m1 = sum1 / in1; //error is taking place on this line
m2 = sum2 / in2;
in1 = 0;
in2 = 0;
return 0;
}
int main()
{
random_mean();
do
{
for (size_t i = 0; i < 10; i++)
{
clustering(arr[i]);
}
updatemean();
} while (o1 != m1 && o2 !=m2);
return 0;
}
程序首先将值随机分配给 (m1) 和 (m2),它们充当集群均值。然后程序调用(聚类)函数 10 次,每次调用时,数组 (arr) 中的一个值被传递给函数。
在聚类函数中,计算传递值与每个均值之间的距离。然后将该值添加到 (mem1) 或 (mem2) 中,具体取决于哪个距离最短。添加后,(in1) 或 (in2) 都会递增。
在所有 10 个值都被传递并添加到它们各自的数组之后,程序然后调用 (updatemean) 函数,这就是问题发生的地方。该函数将 (m1) 和 (m2) 中的值复制到变量 (o1) 和 (o2)。然后计算并保存 (mem1) 和 (mem2) 的总和。然后更新 (m1) 和 (m2)。每一个都更新为数组 (mem1) 或 (mem2) 的总和除以数组 (in1) 或 (in2) 中的元素数。例如 m1 = sum1 / in1。然后变量 (in1) 和 (in2) 被重置。
程序重复步骤 2 和 3,直到满足 do/while 循环的条件。我似乎无法弄清楚为什么在第二个 do/while 循环中,当 (clustering) 函数在重新增加 (in1) 和 (in2) 之前, (updatemean) 函数会给出错误。
感谢阅读。
【问题讨论】:
-
你需要初始化你的变量。
-
嗯,一个很好的案例,开始学习如何使用你的工具链调试器。
-
建议减少对全局变量的依赖。通过引用阅读,函数不必总是返回 int。