Ostatnio postanowiłem się sprawdzić trochę w algorytmach (co nie zmienia faktu, że jestem kiepski - nie mam podstaw nawet) i robię jedno z zadań z olimpiady informatycznej. Jednak natrafiłem na błąd, który mnie nieco blokuje. Mianowicie naruszenie ochrony pamięci.
Błąd wywala najprawdopodobniej w linijce for ( tar=1; tar<=iTargets; tar++ )
(wnioskuję po wyjściach z gęsto rozmieszczonych printf
), ale tylko wtedy, gdy iRounds
jest większe niż iTargets
(obie zmienne pobierane na początku z wejścia). Jest to dziwne, bo na podstawie iRounds
nie tworzę żadnych tablic czy obiektów, a błąd występuje przy liczbach poniżej 10. Jakieś pomysły?
Pełny kod:
/*
Łucznicy
*/
#include <stdio.h>
using namespace std;
struct Target {
int p1;
int p2;
int ww;
int wl;
};
int main()
{
int iTargets,iRounds;
scanf("%d %d", &iTargets, &iRounds);
int playerRank[iTargets*2+1];
Target target[iTargets+1];
for ( int i=0; i<iTargets*2; i++)
{
scanf("%d", &playerRank[i]);
}
int winner, loser, currPlayer, currTarget, i, round, tar;
for ( int startPosition=1; startPosition<=iTargets; startPosition++ )
{
printf("--------> Start position %d:\n\n", startPosition);
for ( currPlayer=1, currTarget; currPlayer<iTargets*2; currPlayer+=2 )
{
currTarget = currPlayer/2+1;
target[currTarget].p1 = currPlayer;
if ( currTarget == startPosition )
{
target[currTarget].p2 = 0;
currPlayer--;
}
else
{
target[currTarget].p2 = currPlayer+1;
}
}
for ( i=1; i<=iTargets; i++ )
{
printf("%d: %d %d\n", i, target[i].p1, target[i].p2);
}
for ( round=1; round<=iRounds; round++ )
{
printf("Round %d:\n", round);
for ( tar=1; tar<=iTargets; tar++ )
{
printf("\tTarget %d: ", tar);
if ( playerRank[target[tar].p1] < playerRank[target[tar].p2] )
{
winner = target[tar].p1;
loser = target[tar].p2;
}
else
{
winner = target[tar].p2;
loser = target[tar].p1;
}
printf("w: %d, l: %d", winner, loser);
if ( tar==1 )
{
target[iTargets].wl = loser;
target[1].ww = winner;
}
else
{
target[tar-1].ww = winner;
target[tar].wl = loser;
}
printf(" ... saved\n");
}
for ( tar=1; tar<=iTargets; tar++ )
{
target[tar].p1 = target[tar].ww;
target[tar].p2 = target[tar].wl;
}
printf("... replaced\n");
}
printf("------------\n\n\n\n");
}
return 1;
}