【问题标题】:program received signal SIGFPE, Arithmetic exception when using modulo in C程序收到信号 SIGFPE,在 C 中使用模数时出现算术异常
【发布时间】:2021-12-27 08:29:12
【问题描述】:

我正在尝试使用 C lang 编写一个程序来计算给定的两个数字 A 和 B,从 A 到 B 有多少个数字,包括在内,可以被另一个数字 K 整除。例如,如果 A 是 1, B 为 10,K 为 3,则有 3 个数满足:3、6、9。

当试图在在线编译器中调试它时,我得到了这个错误:

Program received signal SIGFPE, Arithmetic exception.
0x00005555555553fd in main () at main.c:346
346             int temp = j % newArr[j][2];

模数有什么问题吗?

这是我目前的尝试。我已经在js 中尝试过这个,它可以工作,但在C 中却不行

int main(void)
{
  int arr[] = {100,16,9905,8,7346,...,301n]
  //the input is array 0f 301 integers, which the 
     first element is just the number of test case

  int newArr[100][3];
  int no = 1;
  int result = 0;
  int x, y, i, j;
  int start, end;

  for (x = 0; x < 100; x++)
  {
    for (y = 0; y < 3; y++)
    {
      newArr[x][y] = arr[no];
      no += 1;
    }
  }

  for (i = 0; i < 100; i++)
  {
    if (newArr[i][0] < newArr[i][1])
    {
      start = newArr[i][0];
      end = newArr[i][1];
    }
    else
    {
      start = newArr[i][1];
      end = newArr[i][0];
    }

    for (j = start; j <= end; j++)
    {
      int temp = j % newArr[j][2];

      if ( temp == 0)
      {
        result += 1;
      }

      printf(" %d result %d\n",i, result);
    }

    printf("case %d : %d \n", i, result);
    result = 0;
  }

  return 0;
}

提前致谢!

【问题讨论】:

  • 如果我正确阅读了代码,您会将newArr[0][0] 设置为值100。然后将其分配给end。然后使用for (j = start; j &lt;= end; j++),它将使用值100 作为newArr 的索引。但是100 超出了newArr 的范围,导致未定义的行为
  • 继续前面的评论,newArr[1][1] 将被设置为值7346,这也是超出范围的。所以修复循环for (j = start; j &lt;= end; j++)的条件是不够的,你还必须修复arr中的值。
  • @Someprogrammerdude newArr[0][0] 实际上设置为arr[1],因为我将no 声明为1,抱歉代码不清楚。
  • 好的,所以你跳过arr[0]。然后将newArr[0][1] 设置为值9905 并将其用作newArr 的索引。这仍然超出范围,非常超出范围。
  • 我很抱歉,原来我唯一的错误是,在应该是int temp = j % newArr[i][2];int temp = j % newArr[j][2]; 中,我将“i”误认为“j”。因为我正在迭代newArr 的第一个维度并且它有效。无论如何,我并没有真正赶上越界问题,(也许我们可以讨论更多)我只能假设这可能与您之前提到的newArr有关,而问题出现在newArr。感谢您的洞察力!

标签: c math exception modulo


【解决方案1】:

这里没有技术问题:您混淆了 ij

int temp = j % newArr[j][2];

应该变成

int temp = j % newArr[i][2];

【讨论】:

    猜你喜欢
    • 2011-10-08
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多