int fromVectoEigen(vector<string> & source, double ** & array, int & n)
{
cout<<"n:"<<n<<'\n';
int counter = 0;
for (int j = n-1 ; j >= 0 ; j--) // iterate through each line
{
string mystring = source.back(); // take last line
counter++;
char * str = new char [mystring.length()+1];
std::strcpy (str, mystring.c_str()); // copy string to char array
char * pch; // pointer to tokens
pch = strtok (str," ,-");
for( int i = 0 ; i<3 ; i++) // dismiss first 3 columns
{
pch = strtok (NULL, " ,-");
}
for (int i= 0 ; i<n ; i++)
{
double val = atof(pch); // cast char to double
//array[j][i]= val;
//cout<<array[j][i]<<'\t';
//pch = strtok (NULL, " ,-");
}
//
//source.pop_back();
}
return 0;
}嘿!
使用这个函数,我想从文件读取矩阵到二维数组,矩阵的行数和列一样多。我想用strtok把线按空间分开。这些行已经被读入另一个函数中的向量。(这起作用了)。所以我不知道这个问题,因为我试着用一个小的矩阵4列4行来运行它,它工作得很好!现在我想用一个很大的矩阵来试一试,它有超过1000行和同样多的列。我从val差尔那里得到了一条错误信息:
0x58A87AB:____strtod_l_internal (strtod_l.c:538) ==26501== by 0x4015BB: fromVectoEigen(std::vector >&,double**&,int&) (topo.cpp:70) ==26501== by 0x40362B: main (main.cpp:36) ==26501==地址0x0不是堆栈地址、malloc地址或(最近)免费地址
我尝试了注释/取消注释的方法,直到我使用atof....which为止,一切都很好,我不明白,因为它在小矩阵中工作得很好
大矩阵中的值如下所示: 0.11991517,与小测试矩阵一样,我只有0或0.1这样的值。
我希望我解释过,如果需要的话,enough...pls要求提供更多的细节。
发布于 2014-02-13 21:43:08
你分配str,但你从不释放它.有了你的代码,你永远也做不到。因此,每次调用此函数时,都会泄漏内存。
您应该在使用完delete [] str;后添加一个动态内存,或者根本不使用动态内存,继续使用std::string。
此外,您可以避免整个转换问题,只需使用std::istream::operator>> (例如使用std::istringstream)来解析输入。
像这样的东西(未经测试)应该更适合你:
struct reader : std::ctype<char>
{
reader() : std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table()
{
static std::vector<std::ctype_base::mask> rc(table_size, std::ctype_base::mask());
rc['\n'] = std::ctype_base::space;
rc[','] = std::ctype_base::space;
rc['-'] = std::ctype_base::space;
rc[' '] = std::ctype_base::space;
rc['\t'] = std::ctype_base::space;
return &rc[0];
}
};
int fromVectorEigen(const std::vector<std::string>& source, std::vector<std::vector<double>>& destination)
{
reader rdr;
std::for_each(source.rbegin(), source.rend(), [&](const std::string& s)
{
std::istringstream iss(s);
iss.imbue(std::locale(), &rdr);
std::string ignored_columns;
double value;
iss >> ignored_columns >> ignored_columns >> ignored_columns;
std::vector<double> values;
while (iss >> value)
{
values.push_back(value);
}
destination.push_front(values);
});
return 0;
}发布于 2014-02-13 22:19:45
如果您希望保持当前的不使用流的设计,但消除内存的显式分配,则可以使用std::vector:
#include <vector>
//...
std::vector<char> str(mystring.begin(), mystring,end());
str.push_back(0);
char * pch; // pointer to tokens
pch = strtok (&str[0]," ,-");https://stackoverflow.com/questions/21765999
复制相似问题