2013-03-24 110 views
0

這是一個超級簡單的問題,但我似乎無法看到出了什麼問題。這段代碼做的是計算pixID向量中元素的數量,並將該總和返回到方陣矩陣PtP中的對角線元素。然而,即使「我」在第一循環讀取:0,5,10,15爲元素的輸出是這樣的:C++元素訪問失敗?

1,0,0,0, 
0,0,3,0, 
0,0,0,0, 
0,3,0,0, 

,而不是所期望的:

1,0,0,0, 
0,3,0,0, 
0,0,2,0, 
0,0,0,2, 

任何想法在這裏?

double where(std::vector<double> &vec,unsigned int &v){ 

    double count = 0; 
    int val; 
    for(std::vector<double>::iterator it = vec.begin(); 
     it != vec.end(); 
     ++it){ 
     if(*it == val){ 
     count++; 
     } 
    } 

    return count; 
    } 


    int main(){ 

    unsigned int pixSide = 2; 
    int id; 
    std::vector<double> pixID {1,1,2,3,0,2,1,3}; 
    std::vector<double> PtP (pixSide*pixSide); 

    for(unsigned int i=0;i<pixSide*pixSide;i++){ 
    id = i*pixSide*pixSide + i; 
    std::cout << id << std::endl; 
    PtP[id] = where(pixID,i); 
    } 

    for(int i=0;i<pixSide*pixSide;i++){ 
    for(int j=0;j<pixSide*pixSide;j++){ 
     std::cout << int(PtP[i*pixSide + j]) << ','; 
     if(j==pixSide*pixSide-1){ 
    std::cout << std::endl; 
     } 
    } 
    } 
} 
+0

你是怎麼用'std :: vector pixID {1,1,2,3,0,2,1,3};''編譯這段代碼的?這是一個編譯時錯誤 – Nima 2013-03-24 22:24:39

+4

@Nima最有可能與一個支持C++ 11的編譯器 – PlasmaHH 2013-03-24 22:25:22

+0

您是否嘗試過使用調試器單步執行代碼?或者,在每個步驟輸出值並與您在該步驟期望的結果進行比較呢?簡而言之:您是否嘗試過調試代碼? – PlasmaHH 2013-03-24 22:26:09

回答

1

首先,你沒有在where()中使用參數「v」。相反,您正在使用未初始化的局部變量「val」。

其次,我認爲你可能會在幾個點上混淆物體的尺寸。我認爲你對是否只保留對角線或整個矩陣感到困惑。

這樣,您將一致地保持整個矩陣:

std::vector<double> PtP (pixSide*pixSide); 

應該

std::vector<double> PtP (pixSide*pixSide*pixSide*pixSide); 

std::cout << int(PtP[i*pixSide + j]) << ','; 

應該

std::cout << int(PtP[i*pixSide*pixSide + j]) << ','; 

當然,這對於這樣一個稀疏矩陣是浪費的 - 我不知道在你的應用程序中是否有問題(你的實數是否大於pixSide = 2?)。

+0

啊謝謝你!這會教會我爲我的向量使用難以處理的大小定義。至於絕望中最後一刻的變化,哈哈。 – Bremsstrahlung 2013-03-24 22:37:25

+0

我真的建議慢慢來,並添加一些明智的中間變量。特別是_something_的值應該是pixSide * pixSide,它是你實際矩陣的邊長。 – svk 2013-03-24 22:40:52