簡體   English   中英

valarray在gcc和msvc(或Linux和Windows)中有什么區別

[英]What are the differences of valarray in gcc and msvc (or Linux and Windows)

我在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嗎?

軟件版本:

  • Windows 7,MS Visual Studio 2010 SP1,Visual C ++編譯器16.00.40219.01(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,

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>&);前提條件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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM