我的代码只是从42个不同的文本文件中读取问题并解决它们,然后打印出解决方案。
我知道这不是一个好习惯,但我使用的是全局变量,例如
Customer *customers;
vector<int> *schedules;
double **distanceMatrix;
并假设我必须这样做。
初始化distanceMatrix
时出现问题:
distanceMatrix = new double*[n];
for (int i = 0; i<n; i++)
distanceMatrix[i] = new double[n];
我无法理解的部分是,我得到的运行时错误不是第一个问题,不是第二个问题,而是9到25之间的随机问题。 因此,我很确定文件格式正确。
我没有任何语法错误。
有时,从文本文件9中读取时会出现运行时错误,有时是13,有时是22等。
我认为在初始化全局变量时我会遗漏一些技巧。也许我需要像flush
这样的东西。
我做错了什么?
我也尝试过一次只读一个文件,而不是用循环读取所有文件。 即不会一次又一次地初始化全局变量。我没有运行时错误。
一个最小的例子:
vector<int> **trucks;
vector<int> **presellers;
Customer *customers;
Customer *sortedCustomers;
double **distances;
int type, m, n, t, D, Q;
int id;
void readFromFile(const char *prefix, int instanceId)
{
stringstream fileName;
id = instanceId;
fileName << prefix << instanceId << ".txt";
FILE *file = fopen(fileName.str().c_str(), "r");
fscanf(file, "%d %d %d %d\n", &type, &m, &n, &t);
fscanf(file, "%d %d\n", &D, &Q);
trucks = new vector<int> *[m];
presellers = new vector<int> *[m];
for (int i = 0; i<m; i++)
{
trucks[i] = new vector<int>[t];
presellers[i] = new vector<int>[t];
}
customers = new Customer[n];
sortedCustomers = new Customer[n];
distances = new double*[n];
for (int i = 0; i<n; i++)
distances[i] = new double[n];
int i, d, q, f, a;
float x, y;
fscanf(file, "%d %f %f %d %d %d %d\n", &i, &x, &y, &d, &q, &f, &a);
createCustomer(i, x, y, d, q, f, a, t); // read depot
for (int j = 1; j<n + 1; j++) // read customers
{
fscanf(file, "%d %f %f %d %d %d %d\n", &i, &x, &y, &d, &q, &f, &a);
createCustomer(i, x, y, d, q, f, a, t);
for (int k = 0; k<a; k++)
fscanf(file, "%d ", &(customers[j].list[k]));
}
for (int j = 0; j<n-1; j++) // compute distance matrix
for (int k = j + 1; k<n; k++)
computeDistance(j, k);
}
int main()
{
const char *inputPrefix = "t"; // prefix of the instance files.
int begin = 1;
int end = 42;
for (int i = begin; i <= end; i++)
{
readFromFile(inputPrefix, i); // read instance from file
}
system("pause");
return 0;
}
输入: