2015-03-02 69 views
0

rozpoznajD,O,M是double [1],裏面只有一個double。爲什麼數組覆蓋之前的值

progD,O,M是常數atm(0.5)。

int i = 0 foreach循環之前。

在循環之前聲明的一些附加變量:

double[] rozpoznajD, rozpoznajO, rozpoznajM; 
trzysiecitab[] valid = new trzysiecitab[ileObrazkow * 3]; 
double[] progD, progO, progM; 
progD = new double[] { 0.5 }; 
progO = new double[] { 0.5 }; 
progM = new double[] { 0.5 }; 
rozpoznajD = new double[1]; 
rozpoznajO = new double[1]; 
rozpoznajM = new double[1]; 

問題是,在每一個步驟(每文件名)陣列有效覆蓋它的先前值。爲什麼會發生?

換句話說:在循環結束後,每個字段都有最後一個文件名的值。

下面的代碼:

foreach(string filename in files) { 
    bmp1 = new Bitmap(Image.FromFile(filename)); 
    rozpoznajD = ssn1.policzWyjscia(Pomocnicze.binaryzacja(bmp1)); 
    rozpoznajO = ssn2.policzWyjscia(Pomocnicze.binaryzacja(bmp1)); 
    rozpoznajM = ssn3.policzWyjscia(Pomocnicze.binaryzacja(bmp1)); 
    if (filename.EndsWith("d.bmp")) { 
     if (rozpoznajD[0] > progD[0]) valid[i] = new trzysiecitab(rozpoznajM, 1, 'd'); 
     else valid[i] = new trzysiecitab(rozpoznajM, 0, 'd'); 
     if (rozpoznajO[0] < progO[0]) valid[i + 1] = new trzysiecitab(rozpoznajO, 1, 'o'); 
     else valid[i + 1] = new trzysiecitab(rozpoznajO, 0, 'o'); 
     if (rozpoznajM[0] < progM[0]) valid[i + 2] = new trzysiecitab(rozpoznajM, 1, 'm'); 
     else valid[i + 2] = new trzysiecitab(rozpoznajM, 0, 'm'); 
     i += 3; 
    } else if (filename.EndsWith("o.bmp")) { 
     if (rozpoznajD[0] < progD[0]) valid[i] = new trzysiecitab(rozpoznajM, 1, 'd'); 
     else valid[i] = new trzysiecitab(rozpoznajM, 0, 'd'); 
     if (rozpoznajO[0] > progO[0]) valid[i + 1] = new trzysiecitab(rozpoznajO, 1, 'o'); 
     else valid[i + 1] = new trzysiecitab(rozpoznajO, 0, 'o'); 
     if (rozpoznajM[0] < progM[0]) valid[i + 2] = new trzysiecitab(rozpoznajM, 1, 'm'); 
     else valid[i + 2] = new trzysiecitab(rozpoznajM, 0, 'm'); 
     i += 3; 
    } else if (filename.EndsWith("m.bmp")) { 
     if (rozpoznajD[0] < progD[0]) valid[i] = new trzysiecitab(rozpoznajM, 1, 'd'); 
     else valid[i] = new trzysiecitab(rozpoznajM, 0, 'd'); 
     if (rozpoznajO[0] < progO[0]) valid[i + 1] = new trzysiecitab(rozpoznajO, 1, 'o'); 
     else valid[i + 1] = new trzysiecitab(rozpoznajO, 0, 'o'); 
     if (rozpoznajM[0] > progM[0]) valid[i + 2] = new trzysiecitab(rozpoznajM, 1, 'm'); 
     else valid[i + 2] = new trzysiecitab(rozpoznajM, 0, 'm'); 
     i += 3; 
    } 
} 

回答

0

我通過編輯trzysiecitab類解決了這一問題接受double,而不是double[]作爲參數,例如創建它如此:

valid[i] = new trzysiecitab(rozpoznajD[0], 1, 'd'); 
0

的對象rozpoznajD/O/M需要在foreach循環每次都重新創建。由於對象引用是由數組元素保存的。

由於數組元素包含對象引用,所以在每次迭代之後,rozpoznajD/O/M對象都會使用新的對象引用進行更新。他們都開始指向新的對象。

你需要下面的事情:

var rozpoznajD = ssn1.policzWyjscia(Pomocnicze.binaryzacja(bmp1)); 
var rozpoznajO = ssn2.policzWyjscia(Pomocnicze.binaryzacja(bmp1)); 
var rozpoznajM = ssn3.policzWyjscia(Pomocnicze.binaryzacja(bmp1)); 

有一個看問題的答案here,要了解一個值類型和引用類型之間的區別。

+0

這不只要第2名是解決問題,發生重寫正在努力。 – Januszoff 2015-03-02 21:02:05