gpt4 book ai didi

c++ - gcc 和 msvc(或 Linux 和 Windows)中的 valarray 有什么区别

转载 作者:太空宇宙 更新时间:2023-11-04 11:25:19 25 4
gpt4 key购买 nike

我在 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 版本期望左值 (myValues) 已经初始化。这在 MSVC/Windows 上似乎不是必需的。我可以在 Linux 上调用 myValues.resize(1),它也能正常工作。

现在,有没有人知道确切的差异或互联网上的资源?是否有使用 valarray 的最佳实践?

软件版本:

  • Windows 7、MS Visual Studio 2010 SP1、适用于 80x86 的 Visual C++ 编译器 16.00.40219.01
  • 虚拟机上的 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,

最佳答案

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>&);

Requires: The length of the array to which the argument refers equals size().

您创建 myValues作为空 valarray大小为 0。使用 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 .

关于c++ - gcc 和 msvc(或 Linux 和 Windows)中的 valarray 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26883840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com