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