【问题标题】:float for loop, core dumped c++float for 循环,核心转储 c++
【发布时间】:2021-04-30 14:47:26
【问题描述】:

我不明白我做错了什么。我的代码应该只是从零增加 i: 0.1,然后在每个位置添加 0.5,非常简单,但是我得到了 segmentation fault (core dumped)

有人可以帮我吗?

vector<float> sinal;

int main(){
  sinal[0] = 0;
  for (float i = 0.1; i <= 1; i += 0.1){
    sinal[i] = sinal[i - 1] + 0.5;
    if (i == 1){
      break;
    }
    cout << "\n" << sinal[i];
  }

getchar();
cin.get();
}
 

【问题讨论】:

  • 两件事 - vector&lt;float&gt; sinal; 是一个大小为 0 的空向量,因此对其的任何索引都是无效的(并导致 UB)。对数组索引使用浮点值是不寻常的,请参阅stackoverflow.com/questions/588004/…
  • 也许您想改用std::map&lt;float, float&gt;。虽然它有自己的陷阱。
  • 由于您正在递增0.1,因此无法保证您的循环将迭代您认为的次数,因为0.1 是一个近似值。如果要循环 10 次,则使用整数索引重写循环,即for (int i = 1; i &lt;= 10; ++i),并在循环内,将整数除以 10 后缩放回浮点数。Here is one resource explaining this issue

标签: c++ for-loop coredump


【解决方案1】:

这里有两个问题:

1.当您访问sinal[0]sinal[i]时,sinal还没有任何容量。

2. 使用浮点数作为下标是不寻常的,并且可能会发生错误。下标通常是你要访问的项目的偏移量,所以如果我想访问第五个元素,我使用4的下标,因为我向前移动4空格到达第五个元素。如果我将1.5 作为下标,那么我正在尝试向前推进11/2 空格,而我们的std::vector 不理解这一点。我猜operator[] 的向量重载只需要一个int,所以当你放一个浮点数时会发生某种类型的转换。

如需解决方案,请在此处查看我的其他答案:Not getting output in case of string

“Core Dumped”通常试图取消引用 null 指针,或者在这种情况下,试图访问超出范围的对象。

【讨论】:

    【解决方案2】:

    问题在于浮点数的精度,以及浮点数作为索引的使用。

    vector<float> sinal {0};
    
    int main()
    {
        for (int idx = 1; idx <= 10; idx++)
        {
            auto last = sinal.back(); // reference to last element in vector
            sinal[idx] = last + 0.5;
            if (i < 10)
            {
                cout << "\n" << sinal[idx]; 
                // cout << "\n" << sinal.back(); // Even better 
            }
    
        }
        //... more code...
    }
    

    operator[] 函数需要一个 'size_type' 值;所以用浮点类型作为索引是很奇怪的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      相关资源
      最近更新 更多