Naruszenie ochrony pamięci w dziwnym miejscu

0

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;

}
0

Tak na pierwszy rzut oka to

        int playerRank[iTargets*2+1];
        Target target[iTargets+1];

Nie da się tak zadeklarować tablicy dynamicznej. Użyj malloc lub zadeklaruj stały rozmiar tablicy.

0

Najmocniej przepraszam - już znalazłem błąd - długo by opisywać, a to raczej nic istotnego ani przydatnego dla potomnych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0