Thread Denkfehler in while? (29 answers)
Opened by Ichhalt at 2016-11-21 08:18

Ichhalt
 2016-11-21 08:18
#185607 #185607
User since
2016-10-10
30 articles
BenutzerIn
[default_avatar]
Wunderschönen Montagmorgen allen,

Ich hab n Array @spieler in welchem sich gesichert 24 Elemente befinden.

ich muss nun testen, ob eine Paarung der der Spieler schon stattfand und wenn ja, mir den nächsten Spieler als Gegner holen und wieder erst überprüfen, ob diese Paarung schon gespielt hat.
In dem Array sind die Spieler aus einer Tabelle eingelesen und damit sortiert, da es dabei auch auf die Reihenfolge ankommt.

more (10.9kb):

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
while(@spieler)
        {
                my $sp1 = shift(@spieler);
                my $sp2 = shift(@spieler);
                $testpaar = testpaarung($sp1,$sp2,$runde);
                if($testpaar == 0)
                {
                        push (@asql, "INSERT IGNORE INTO runde$runde (spieler1, spieler2, sperg1, sperg2, sp1avg, sp2avg) VALUES ('$sp1', '$sp2', 0, 0, 0, 0);");
                }
                if($testpaar == 1)
                {
                        unshift(@spieler,$sp2);
                        for(my $ii = 1;$ii < @spieler;$ii++)
                        {
                                $testpaar = testpaarung($sp1,$spieler[$ii],$runde);
                                if($testpaar == 0)
                                {
                                        push (@asql, "INSERT IGNORE INTO runde$runde (spieler1, spieler2, sperg1, sperg2, sp1avg, sp2avg) VALUES ('$sp1', '$spieler[$ii]', 0, 0, 0, 0);");
                                        splice(@spieler,$ii,0);
                                        last;
                                }
                        }
                }
        }

sub testpaarung
{
        my $sp1 = shift;
        my $sp2 = shift;
        my $runde = shift;
        my $testsp = 0;
        
        for(my $i = 1; $i < $runde; $i++)
        {
                my $testdb = $dbh->prepare("SELECT COUNT(*) FROM runde$i WHERE (spieler1 = '$sp1' AND spieler2 = '$sp2') OR (spieler1 = '$sp2' AND spieler2 = '$sp1');");
                $testdb->execute();
                $testsp = $testdb->fetchrow_arrayref()->[0];
                $exe->finish;
                last if($testsp > 0);
        }
        
        return($testsp);
}



Das funktioniert auch bis aktuell zu Runde 4. In Runde 5 wird plötzlich ein Spieler 2 mal gepaart und ich kann mir einfach nicht erklären warum ...

Könnt ihr mal bitte drüber gucken - ich finde den Fehler nicht ...

Danke vorab für Eure Hilfe
Ichhalt
Last edited: 2016-11-21 08:38:21 +0100 (CET)

View full thread Denkfehler in while?