2

我编写了一个函数来确定是否分配默认值(如果标志不存在,它会分配默认值,如果标志存在,它会分配用户传递的值)。我正在尝试用一个字符串测试我的函数,看看它是否给了我正确的数字。当我尝试运行测试时,我不断收到“分段错误”,它可以编译,但测试不起作用。:(

这是我的头文件:

#ifndef COMMANDLINE_H
#define COMMANDLINE_H
#include "data.h"
#include <stdio.h>

struct point eye;

/* The variable listed above is a global variable */

void eye_flag(int arg_list, char *array[]);

#endif

这是我的实现文件:

#include <stdio.h>
#include "commandline.h"
#include "data.h"
#include "string.h"

/* Used global variables for struct point eye */

void eye_flag(int arg_list, char *array[])
{
   eye.x = 0.0;
   eye.y = 0.0;
   eye.z = -14.0;

   /* The values listed above for struct point eye are the default values. */

   for (int i = 0; i <= arg_list; i++)
   {
      if (strcmp(array[i], "-eye") == 0)
      {
         sscanf(array[i+1], "%lf", &eye.x);
         sscanf(array[i+2], "%lf", &eye.y);
         sscanf(array[i+3], "%lf", &eye.z);
      }
   }
}

这是我的测试用例:

#include "commandline.h"
#include "checkit.h"
#include <stdio.h>

void eye_tests(void)
{
   char *arg_eye[6] = {"a.out", "sphere.in.txt", "-eye", "2.4", "3.5", "6.7"};
   eye_flag(6, arg_eye);

   checkit_double(eye.x, 2.4);
   checkit_double(eye.y, 3.5);
   checkit_double(eye.z, 6.7);

   char *arg_eye2[2] = {"a.out", "sphere.in.txt"};
   eye_flag(2, arg_eye2);

   checkit_double(eye.x, 0.0);
   checkit_double(eye.y, 0.0);
   checkit_double(eye.z, -14.0);
}

int main()
{
   eye_tests();

   return 0;
}
4

3 回答 3

3

解决这个问题的最简单方法是在调试器中运行它。您甚至可能不需要学习如何单步执行您的代码或任何东西——只需启动、运行并阅读该行。

如果您在 *nix 系统上:

  1. -g用标志编译你的代码。
  2. 加载为,例如gdb a.out
  3. 现在运行它已加载 - (gdb) run
  4. 做任何你需要重现段错误的事情。
  5. bt或者where应该给你一个堆栈跟踪 - 以及导致你的问题的确切行。

我敢肯定,您可以从那里解决它以将其发布为答案;但如果没有,知道确切的路线将使研究和解决变得非常容易。

于 2013-05-28T02:09:24.977 回答
2

你的循环条件是错误的。应该是i < arg_list
想想当i == arg_list.

于 2013-05-28T02:10:36.690 回答
2

错误在这里:

  for (int i = 0; i <= arg_list; i++)
  {            ///^^
      if (strcmp(array[i], "-eye") == 0)
      {
          sscanf(array[i+1], "%lf", &eye.x);
                   //^^^
          sscanf(array[i+2], "%lf", &eye.y);
          sscanf(array[i+3], "%lf", &eye.z);
      }
  }
  1. i <= arg_list是错误的,因为你传入 6,数组索引从 0 开始,最大值是 5
  2. i+1, i+2,i+3当您从 0 迭代到 5 时,会给您超出范围的索引。
于 2013-05-28T02:12:02.147 回答