rozpoznajD,O,M是双[1],里面有一个双。
progD,O,M是常数atm(0.5)。
在foreach循环之前 int i = 0
。
在循环之前声明的一些其他变量:
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 :(得分:0)
每次在foreach循环中都需要重新创建对象rozpoznajD / O / M.由于对象引用由数组元素保存。
因为,数组元素持有对象引用,所以在每次迭代之后,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的答案,了解值类型和引用类型之间的区别。
答案 1 :(得分:0)
我通过编辑trzysiecitab类来接受double
而不是double[]
作为参数来解决问题,并按照以下方式创建它:
valid[i] = new trzysiecitab(rozpoznajD[0], 1, 'd');