【发布时间】:2014-11-12 09:49:18
【问题描述】:
我在 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-value (myValues) 已经初始化。这在 MSVC/Windows 上似乎没有必要。我可以在 Linux 上调用 myValues.resize(1),它也能正常工作。
现在,有人知道确切的差异或互联网上的资源吗?是否有如何使用 valarray 的最佳实践?
软件版本:
- Windows 7、MS Visual Studio 2010 SP1、Visual C++ 编译器 16.00.40219.01 for 80x86
- Lubuntu 14.04 64 位虚拟机,GNU Make 3.81,GCC 4.8.2
谢谢大家。
更新:详细的代码示例。 可以编译。第一个示例在 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,
【问题讨论】:
-
能不能做一个完整的可以编译的例子?另外,您使用的是哪个版本的 g++?
-
@MatsPetersson 完成,感谢评论。
标签: c++ visual-c++ gcc g++ valarray