0

rozpoznajD,O,M are double[1] with a single double inside.

progD,O,M are constant atm (0.5).

int i = 0 before the foreach loop.

Some additional variables declared before the loop:

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];

Problem is, in each step (every filename) the array valid overwrites it's previous values. Why is that happening?

To put it another way: after the loop finishes, each field has the value the last filename had.

Here's the code:

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;
    }
}
Januszoff
  • 315
  • 1
  • 16

2 Answers2

0

The objects rozpoznajD/O/M need to be created anew each time in the foreach loop. As the objects references are held by the array elements.

As, array elements are holding the object reference, so after every iteration the rozpoznajD/O/M objects are updated with new object references. And all of them start pointing to new objects.

You need to do below:

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

Have a look at the answers to the question here, to understand the difference between a value type and a reference type.

Community
  • 1
  • 1
Ankit Saroch
  • 680
  • 7
  • 14
0

I fixed the problem by editing trzysiecitab class to accept double instead of double[] as a parameter, and creating it like so:

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