谁能告诉我为什么此代码不起作用并继续打印 0.00 km 作为最短距离?

克里索斯

这是我写的代码。它应该获取名称(最多 100000 个字符)和 n(最多 1000)个城市的坐标并计算它们之间的欧几里德距离。之后,程序应该读取起始城市和要行驶的最大距离,然后打印最短路径和每条可行路径(如果路径 <= 最大距离,则该路径是可行的)。当我打印 dist 数组时,值似乎是正确的,但最终输出完全错误。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

int main()
{
   int n, i, j, pos = -1, min_pos;
   char *temp = malloc(100000 * sizeof(char)), *names[1000], *start;
   float *X, *Y, max_dist, *dist[1000], min = 1000;

   if(temp == NULL)
       return 1;

   scanf("%d", &n);
   if(n < 2 || n > 1000)
      return 1;

   X = malloc(n * sizeof(float));
   Y = malloc(n * sizeof(float));
   if(X == NULL || Y == NULL)
      return 1;

  for(i = 0;i < n;i++)
  {
      scanf("%s %f %f", temp, &X[i], &Y[i]);
      names[i] = malloc((strlen(temp) + 1) * sizeof(char));
      if(names[i] == NULL)
          return 1;
      strcpy(names[i], temp);
  }

  scanf("%s %f", temp, &max_dist);
  start = malloc((strlen(temp) + 1) * sizeof(char));
  if(start == NULL)
      return 1;
  strcpy(start, temp);
  free(temp);

  for(i = 0;i < n;i++)
      for(j = 0;j < n;j++)
      {
          dist[i] = malloc(n * sizeof(float));
          if(dist[i] == NULL)
              return 1;
          dist[i][j] = sqrt(powf(X[j] - X[i], 2) + powf(Y[j] - Y[i], 2));
      }

  free(X);
  free(Y);

  for(i = 0;i < n && pos == -1;i++)
      if(!(strcmp(names[i], start)))
          pos = i;
  if(pos == -1)
      return 1;

  for(i = 0;i < n;i++)
      if(dist[pos][i] < min && pos != i)
      {
          min_pos = i;
          min = dist[pos][i];
      }
  printf("Shortest path is %.2f km between %s and %s\n", min, names[pos], names[min_pos]);

  for(i = 0;i < n;i++)
      if(dist[pos][i] <= max_dist && pos != i)
          printf("Feasible path of %.2f km to %s\n", dist[pos][i], names[i]);

  return 0;
}
辣山羊

您正在为dist[i]第二个for周期内的每个分配内存我通过dist如下初始化解决了你的问题

dist = calloc(1000, sizeof(float*));
for(i = 0; i < n; i++) {
    dist[i] = calloc(n, sizeof(float));

    for(j = 0; j < n; j++) {
        if(dist[i] == NULL)
            return 1;
        dist[i][j] = sqrt(powf(X[j] - X[i], 2) + powf(Y[j] - Y[i], 2));
    }
}

您的代码的问题在于某些指令依赖于未初始化的值。每当遇到麻烦时——实际上,我建议这样做,即使一切都运行良好只是为了确保——使用valgrind. 使用-ggdb3标志编译您的程序并使用 valgrind 运行它。它应该是这样的:

gcc -Wall -Wextra -ggdb3 -o prog prog.c
valgrind ./prog

这将告诉您所有读/写错误、未初始化的值、内存泄漏等。它甚至可以准确地告诉您这些事情发生在哪一行,因此它确实是一个很好的工具。

最后一点,您还有一些内存泄漏。这是释放分配的内存所需的代码:

free(start);

for (i = 0; i < n; i++)
    free(dist[i]);
free(dist);

for (i = 0; i < n; i++)
    free(names[i]);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章