我的代码
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <sstream>
#include <cmath>
#define PI 3.14159265
int main(){
std::ifstream ifs("MFSO7.dat");
std::string line;
std::vector<float> column1;
std::vector<float> column2;
std::vector<float> column3;
std::vector<float> vkos;
std::vector<float> vsin;
while(std::getline(ifs, line)) // read one line from ifs
{
std::istringstream iss(line); // access line as a stream
float item1;
float item2;
float item3;
// Read the items from the line
iss >> item1 >> item2 >> item3;
// Add them to the columns.
column1.push_back(item1);
column2.push_back(item2);
column3.push_back(item3);
}
for(int i=0;i<38;i++)
{
vkos[i]=cos(column3[i]* PI/180.0 );
vsin[i]=sin(column3[i]* PI/180.0 );
}
std::cout << vkos[1] << std::endl;
}
我执行我得到的代码
milenko@milenko-X58-USB3:~/Calibration Files$ ./a1
Segmentation fault (core dumped)
为什么?我应该避免循环或......?
答案 0 :(得分:1)
如果您坚持使用索引迭代到向量中,则可以使用:
for (int i = 0; i < column3.size(); ++i) ...
这样,您至少不会尝试以大于当前数字或元素+ 1的索引进行访问。
否则,您可以尝试将矢量初始化为具有多个值:
std::vector<float> column3(38, 0);
或者,如果您使用的是C ++ 11,您甚至可以选择
for (auto x : column3) ...
答案 1 :(得分:1)
std::valarray就是这样做的,罪恶超载了valarray:
vkos = cos(column3 * PI/180.0);
vsin = sin(column3 * PI/180.0);
不需要循环,这可行。
答案 2 :(得分:0)
vector
将有一些容量来保存新项目。这与 size 不同, size 是vector
中实际存在的元素数。因此n
的容量并不意味着它已经有n
个项目。当一个向量刚刚由默认构造函数 - 没有参数的构造函数构造时,它就没有项目。
在i
vector::operator[]
时,i >= n
th 元素通过n
是不正确的,其中n
是大小;在你的情况下vkos.push_back(cos(value))
是0.所以首先你要用push_back
创建它们,而不是直接分配给索引。在每个for(auto angle : column3)
{
vkos.push_back(cos(angle * PI/180.0));
vsin.push_back(sin(angle * PI/180.0));
}
if (vkos.size() >= 2)
cout << vkos[1] << '\n';
上,向量的大小增加1。
package helloservice.endpoint;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public class Hello {
private String message = new String("Hello, ");
public Hello() {System.out.println("Hello !");}
/**
* Web service operation
*/
@WebMethod(operationName = "operation")
public String operation() {
//TODO write your implementation code here:
return null;
}
}
答案 3 :(得分:0)
问题是你正在尝试分配你没有的内存。你为什么不用std::transform
?使用标准算法有助于避免这些类型的错误,通常比手写循环更好,最重要的是更易于阅读和阅读。了解。另外,请避免使用#define
,而不是constexpr
。
constexpr double Pi {3.14159265};
constexpr auto PiDiv180 = Pi / 180;
std::transform(std::cbegin(column3), std::cend(column3), std::back_inserter(vkos),
[PiDiv180] (const auto v) { return std::cos(v * PiDiv180); });
std::transform(std::cbegin(column3), std::cend(column3), std::back_inserter(vsin),
[PiDiv180] (const auto v) { return std::sin(v * PiDiv180); });
答案 4 :(得分:0)
这是因为您要分配尚未构建的vkos
和vsin
元素。
最好坚持使用STL来完成这些类型的基于循环的任务,为您解决了很多错误。对于这个特殊问题,您正在寻找std::transform
。与您接受的解决方案相比,以下代码具有零开销:
std::vector<std::pair<float, float>> vkossin{};
std::transform(
std::begin(column3), std::end(column3), std::back_inserter(vkossin),
[](float degs) {
float rads = degs*PI/180.0;
return std::make_pair(cos(rads), sin(rads));
});
std::cout << vkossin[1].first << '\n';