【问题标题】:C Program hangs after trying to call function from mainC 程序在尝试从 main 调用函数后挂起
【发布时间】:2015-11-16 19:51:22
【问题描述】:

这是代码:

#include <stdlib.h>
#include <stdio.h>
#include "descartes.h"

/*
 *  Eulidean travelling salesman
 */

#define MAXCITIES 100
#define FALSE 0
#define TRUE 1

point_t city [MAXCITIES];
int numCities = 0;

int ReadCities(void);
double TourLength(lineSeg_t cityLines[]);
void DrawTour(void);

int main(void) {
  printf ("main1\n");    
  OpenGraphics();    
  printf ("main2\n");
  ReadCities();    
  DrawTour();    
  double TourLength(lineSeg_t cityLines[]);    
  CloseGraphics();
  return EXIT_SUCCESS;
}


int ReadCities(void) {
  printf ("ReadCities1");
  int i = 1;

  printf ("ReadCities2");

  city[0] = GetPoint();
  while ((XCoord(city[i])) >= 0) {
    city[i] = GetPoint();
    printf ("(%d, %d)", XCoord(city[i]), YCoord(city[i]));
    numCities++;
    i++;
  }

  if (numCities <= MAXCITIES) {
    return TRUE;
  }
  else {
    return FALSE;
  }
}


double TourLength(lineSeg_t cityLines[]) {
  double totLen = 0;
  int i;

  for (i = 0; i < (numCities - 1); i++) {
    totLen += Length(cityLines[i]);
  }

  return totLen;
}


void DrawTour(void) {
  lineSeg_t cityLines[MAXCITIES];
  int i;

  for (i = 0; i < (numCities - 1); i++) {
    cityLines[i] = LineSeg(city[i], city[i + 1]);
    DrawLineSeg(cityLines[i]);
  }
}

当我运行它打印的程序时:

main1
main2

然后程序挂起。我至少希望它会调用ReadCities() 并尽可能打印

ReadCities1
ReadCities2

但无论我尝试什么,它都会在打印main2 后在终端中挂起一个闪烁的光标。代码中可能还有其他错误,但我什至无法测试它!

对不起,如果这很明显,我是编程新手! 干杯!

【问题讨论】:

  • 您介意创建一个MCVE 吗?反正被调用的函数有一半没有在这里定义。
  • MCVE?我会尽力帮助你帮助我:P @SouravG
  • 使用调试器。至少它会告诉您代码“卡住”的位置。
  • 在 ReadCities1 和 ReadCities2 字符串之后添加 \n,以便将输出缓冲区刷新到终端。
  • @keith 我想就是这样!我得到了打印输出“ReadCities1”和“ReadCities2”。既然我知道它实际上正在调用该函数,我想我会再给它一次调试,非常感谢!

标签: c function call freeze


【解决方案1】:

不太清楚这一行是什么:

while ((XCoord(city[i])) >= 0)

正在返回,看来这个循环可能不会中断。在这种情况下,我会在循环中 printf() ofo XCoord(city[i]) 的值,以查看其中的实际值...

使用 printf() 对这样的事情非常有用。

另外,正如有人所说,main 中有一个函数原型声明:

double TourLength(lineSeg_t cityLines[]);

【讨论】:

  • 好吧,我试试那些东西!
  • 当我将 double TourLength(lineSeg_t cityLines[]); 更改为 TourLength(lineSeg_t cityLines[]); 时,我收到错误 expected expression before ‘lineSeg_t’ TourLength(lineSeg_t cityLines[]);。这是什么原因,干杯
  • 好吧,您仍在声明要传递的类型。 lineSeg_t cityLines[] 是一个声明...您没有在这里声明函数,您应该调用它...本质上您应该将 lineSeg_t 类型的数组传递给函数。
  • lineSeg_t myArray[n];
  • 说实话,作为一个小型 cmets 部门,在这里真正帮助您非常困难。您似乎对函数原型有些困惑,我建议您备份一下并重新开始。您声明一个声明“此函数接受此类型的数组”的函数原型,然后声明该类型的数组并在调用时将其传递给函数。
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
相关资源
最近更新 更多