0

テキスト ファイルからいくつかの数値を読み取るこの小さなパーサーを作成しました。

    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 

データを水平方向に反転した理由がわかりませんか?

4

2 に答える 2

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++関数呼び出し内の呼び出しの実行順序は、完全に実装によって定義されます(つまり任意)。

于 2013-01-28T11:43:12.347 に答える
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のコメントは一般に、評価の順序が未定義です。多くの場合、副作用の順序を実際に確認することはお勧めできません。

于 2013-01-28T11:36:31.527 に答える