我在Windows和Linux中遇到了valarray的不同行为。有谁知道这个或知道在哪里看?很明显,在这两个系统上工作的一个版本是正确的C ++,但为什么另一个版本在Windows中工作? valarray的实现是否存在更多差异?
在MSVC / Windows上工作但不在gcc / Linux上的代码示例:
valarray<signed short> myValues;
for(size_t s = 0; s < 10; s++)
{
slice dataSlice(1, 1, 1);
// on Linux, this slice operation gives me a segmentation fault
myValues= RawData[dataSlice];
}
我跟踪它以修复gcc / Linux版本的代码:
for(size_t s = 0; s < 10; s++)
{
slice dataSlice(1, 1, 1);
valarray<signed short> myValues = RawData[dataSlice];
}
gcc / Linux版本预计已经初始化了l值(myValues)。在MSVC / Windows上似乎没有必要这样做。我可以在Linux上调用myValues.resize(1)
,它也能正常工作。
现在,有没有人确切知道互联网上的差异或资源?是否有最佳实践如何使用valarray?
软件版本:
谢谢大家。
更新:详细代码示例。编译。第一个例子在Linux中给出了分段错误,但在Windows中运行良好。
// This example compiles both on Windows with MSVC and on Linux with GCC.
// It gives a segmentation fault in Linux.
// It gives the expected output on Windows.
#include "stdafx.h"
#include <iostream>
#include <valarray>
int main(int argc, char **argv) {
//init base data
std::valarray<signed short> myData(10);
for (int i = 0; i < 10; i++)
{
myData[i] = i;
}
std::valarray<signed short> myValues;
for (int i = 0; i < 10; i++)
{
myValues = myData[std::slice(0, i, 1)];
std::cout << "myValues: ";
for (size_t k = 0; k < myValues.size(); k++)
{
std::cout << myValues[k] << ",";
}
std::cout << std::endl;
}
}
以下示例适用于Linux和Windows。注意for循环中myValues的声明和初始化,就在切片完成的地方。
#include "stdafx.h"
#include <iostream>
#include <valarray>
int main(int argc, char **argv) {
//init base data
std::valarray<signed short> myData(10);
for (int i = 0; i < 10; i++)
{
myData[i] = i;
}
for (int i = 0; i < 10; i++)
{
std::valarray<signed short> myValues = myData[std::slice(0, i, 1)];
std::cout << "myValues: ";
for (size_t k = 0; k < myValues.size(); k++)
{
std::cout << myValues[k] << ",";
}
std::cout << std::endl;
}
}
预期产出:
myValues:
myValues: 0,
myValues: 0,1,
myValues: 0,1,2,
myValues: 0,1,2,3,
myValues: 0,1,2,3,4,
myValues: 0,1,2,3,4,5,
myValues: 0,1,2,3,4,5,6,
myValues: 0,1,2,3,4,5,6,7,
myValues: 0,1,2,3,4,5,6,7,8,
答案 0 :(得分:1)
valarray.assign/8
:valarray<T>& operator=(const slice_array<T>&); valarray<T>& operator=(const gslice_array<T>&); valarray<T>& operator=(const mask_array<T>&); valarray<T>& operator=(const indirect_array<T>&);
需要:参数引用的数组的长度等于
size()
。
您将myValues
创建为大小为0的空valarray
。不符合使用valarray<T>& operator=(const slice_array<T>&);
的前提条件。
替换
myValues = myData[std::slice(0, i, 1)];
带
auto s = std::slice(0, i, 1);
myValues.resize(s.size());
myValues = myData[s];
或
myValues = std::valarray<signed short>(myData[std::slice(0, i, 1)]);
它会起作用。
我还不明白为什么选择slice_array<T> operator[](slice slicearr)
代替valarray<T> operator[](slice slicearr) const
。