2017-03-07 9 views
-1

値を変更するためにranged forループにauto &を使用しようとしていました。しかし、私はそれが "すべての時"に動作しなかったので、とてもショックを受けました。私は元のコードを以下に添付します。これは、行列の要素0を見つけて、対応する行と列をすべて0に設定するだけです。C++ 11の自動ループ&ループが動作しない

#include<iostream> 
    #include<vector> 
    using namespace std; 

    void zerolify(vector<vector<int>>& m) 
    { 
     int row=m.size(); 
     int col=col>0?m[0].size():0; 

     vector<int> r(row,0); 
     vector<int> c(col,0); 

     for(int i=0;i<row;i++) 
     { 
      for(int j=0;j<col;j++) 
      { 
       if(m[i][j]==0) 
       { 
        r[i]=1; 
        c[j]=1; 
       } 
      } 
     } 

     for(int i=0;i<row;i++) 
     { 
      if(r[i]) 
      { 
       //cout<<"row: "<<i<<endl; 
       for(auto &e : m[i]) 
       { 
        e=0; 
       } 
       //for(int j=0;j<col;j++) 
       //{ 
       // m[i][j]=0; 
       //} 
      } 
     } 
     for(int i=0;i<col;i++) 
     { 
      if(c[i]) 
      { 
       for(int j=0;j<row;j++) 
       { 
        m[j][i]=0; 
       } 
      } 
     } 
    } 
    void printMatrix(vector<vector<int>> m) 
    { 
     for(auto i:m) 
     { 
      for(auto j:i) 
      { 
       cout<<j<<" "; 
      } 
      cout<<endl; 
     } 
    } 
    int main(int argn, char** argv) 
    { 
     vector<vector<int>> m(5,vector<int>(5)); 
     m[0]={1,2,3,0,4}; 
     m[1]={1,1,3,5,4}; 
     m[2]={1,2,3,0,4}; 
     m[3]={1,2,3,5,4}; 
     m[4]={1,2,3,5,4}; 
     cout<<"Original matrix:"<<endl; 
     printMatrix(m); 
     zerolify(m); 
     cout<<"Zerolify"<<endl; 
     printMatrix(m); 
     return 0; 
    } 

私は、Apple LLVMのバージョン8.0.0(打ち鳴らす-800.0.42.1)コンパイラを搭載したMac OS 10.12.2を使用しています。ここに私の結果があります: My command line output

最初に動作しなかったことが分かります。それが二度目に働いた。私もauto &&を試しました、それは私に同じ「不確実な」振る舞いを与えました。しかし、直接索引付けを行うループでは、常に(コード内でコメントアウトされています)。現在のところ、他のケースでは問題を再現することはできませんでしたが、ここでのロジックはすでに単純です。

コンパイラに問題はありますか?誰でもコードを実行して、問題を複製できるかどうか確認できますか?

答えて

5

autoは有罪ではありません。あなたがcolの値を使用してcolを初期化するため

zerolify()で)以下の初期化が

int col=col>0?m[0].size():0; 

(未定義の動作)間違っています。

したいが、私は、正しい初期化がナイスキャッチ、愚かな間違い、感謝

int col { row > 0 ? m[0].size() : 0 }; 
+0

あると思いますかを理解してわかりません! – tengi

関連する問題