我写过这个小文本,从文本文件中读取一些数字。
data.resize(7,datapoints); //Eigen::Matrix<float,7,-1> & data
dst = data.data();
while( fgets(buf,255,fp) != 0 && i/7 < datapoints)
{
int n = sscanf(buf,"%f \t%f \t%f \t%f \t%f \t%f \t%f",dst+i++, dst+i++,dst+i++,dst+i++,dst+i++,dst+i++,dst+i++);
i = i - 7 * (n<=0);
}
fclose(fp);
return !(datapoints == i/7);
问题是,当我对它翻转的数据做一个std :: cout时。
数据输入:
0 4 0.35763609 0.64077979 0 0 1
0 4 0.36267641 0.68243247 1 0 2
0 4 0.37477320 0.72945964 2 1 3
data.col(3)是
0.64077979
0.68243247
0.72945964
和data.col(4)是
0.35763609
0.36267641
0.37477320
我无法看到为什么它将数据水平翻转的逻辑?
答案 0 :(得分:6)
说明问题:
#include <cstdio>
void f(int i, int j, int k)
{
printf("i = %d\tj = %d\tk = %d\n", i, j, k);
}
int main()
{
int i=0;
f(i++, i++, i++);
}
执行此操作,返回此处(关于Cygwin的g ++ 4.3.4):
i = 2 j = 1 k = 0
函数调用中i++
调用的执行顺序完全是实现定义的(即任意)。
答案 1 :(得分:3)
你确定吗?
int i=0;
sscanf(buf,"%f \t%f \t%f \t%f \t%f \t%f \t%f",dst+i++, dst+i++,dst+i++,dst+i++,dst+i++,dst+i++,dst+i++);
等于:
sscanf(buf,"%f \t%f \t%f \t%f \t%f \t%f \t%f",dst+0,dst+1,dst+2,dst+3,dst+4,dst+5,dst+6 );
我认为在这种情况下变量列表arg正在评估,而@Christian Rau评论一般是未定义的评估顺序。重新考虑副作用顺序并不是一个好主意。