Samoczynne wyzerowanie globalnej tablicy

0

Witam,

Mam problem, który wydaje mi się, że nie jest związany z błędem w kodzie, tylko z jakimś bugiem w MS Visual Studio 2013, który wykorzystuje do kompilacji niżej wymienionego kodu.

 namespace {
	const unsigned int max_elementow = 10; // Okresla ilosc elementow w pojedynczym bloku elementu
	const unsigned char ilosc_pojemnikow = 6;

	void *Pacjent[max_elementow];
	void *Specjalizacja[max_elementow];
	void *Lekarz[max_elementow];
	void *SpecjalizacjaLekarz[max_elementow];
	void *Wizyty[max_elementow];
	void *Kalendarz[max_elementow];

	unsigned int Licznik_elementow_pojemnikow[ilosc_pojemnikow];
}

enum Rodzaj_pojemnika {
	en_rpacjent,
	en_rspecjalizacja,
	en_rlekarz,
	en_rspecjalizacjalekarz,
	en_rwizyty,
	en_rkalendarz,
};

void **Zwroc_pojemnik(Rodzaj_pojemnika do_ktorego) // Zwraca dany pojemnik wedlug argumentu "do_ktorego"
{
	switch (do_ktorego) // Wybieramy okreslony pojemnik
	{
	case en_rkalendarz:
		return Kalendarz;
	case en_rlekarz:
		return Lekarz;
	case en_rpacjent:
		return Pacjent;
	case en_rspecjalizacja:
		return Specjalizacja;
	case en_rspecjalizacjalekarz:
		return SpecjalizacjaLekarz;
	case en_rwizyty:
		return Wizyty;
	default:
		return 0;
	}
}

void Dodaj_element(void *adres_elementu, Rodzaj_pojemnika do_ktorego) // Dodaje nowy element do pojemnika 
// adres_elementu - adres elementu, ktory chcemy wstawic do pojemnika
// do_ktorego - okresla do ktorego pojemnika wstawiany przeslany jako argumunt adres nowego elementu
{
	void **adres_pojemnika = Zwroc_pojemnik(do_ktorego);
	bool zakoncz_wstawianie = false;

	while (adres_pojemnika[max_elementow - 1]) { adres_pojemnika = &adres_pojemnika[max_elementow - 1]; } // Wyszukujemy wolnego bloku elementow w pojemniku

	do
	{
		for (unsigned char licznik = 0; licznik < max_elementow; ++licznik) // Wyszukuje w danym bloku elementow wolne miejsce na nowy element
		{
			if (licznik == max_elementow - 1) // Sprawdza czy aktualny blok zostal calkowicie zapleniony
			{
				adres_pojemnika[licznik] = new void*[max_elementow]; // Tworzy nowy blok elementow i wstawia go w ostatnim elmemencie ostatniego bloku elementow
				adres_pojemnika = &adres_pojemnika[licznik]; // Ustawia nowo utworzony blok elementow jako wolny blok elementow
				for (unsigned char licznik = 0; licznik < max_elementow; ++licznik, adres_pojemnika[licznik] = 0); // Zeruje nowo utworzony blok
				break;
			}

			if (!adres_pojemnika[licznik]) // Dodaje nowy element do bloku elementow
			{
				adres_pojemnika[licznik] = adres_elementu;
				Licznik_elementow_pojemnikow[do_ktorego]++; // Zwieksza licznik elementow w pojemniku
				zakoncz_wstawianie = true; // Okresla czy zakonczyc wstawianie i konczy petle
				break;
			}
		}
	} while (!zakoncz_wstawianie);
}

void *Wyszukaj_element(unsigned int numer_elementu, Rodzaj_pojemnika do_ktorego) // Wyszukuje dany element w okreslnym pojemniku
{
	if (Licznik_elementow_pojemnikow[do_ktorego] < numer_elementu)
		return 0;

	void **adres_pojemnika = Zwroc_pojemnik(do_ktorego);

	for (unsigned int licznik = 0; licznik < numer_elementu / (max_elementow - 1); ++licznik, adres_pojemnika = &adres_pojemnika[max_elementow - 1]);
	for (unsigned int licznik = 0; licznik < numer_elementu % (max_elementow - 1); ++licznik, adres_pojemnika++);

	return *adres_pojemnika;
}

#include <iostream>

int main()
{
	unsigned int liczba[40] = {};

	for (int licznik = 0; licznik < 16; ++licznik)
	{
		liczba[licznik] = licznik;
		Dodaj_element(&liczba[licznik], Rodzaj_pojemnika::en_rkalendarz);
	}
		

	std::cout << "Org adres: " << reinterpret_cast<unsigned int>(liczba) << std::endl;
	std::cout << "element: " << *reinterpret_cast<unsigned int *>(Wyszukaj_element(13, Rodzaj_pojemnika::en_rkalendarz)) << std::endl;
}

Problem polega na tym, że w funkcji "Dodaj_element", wartość elementu tablicy, który jest inkrementowany (linia 69) -> "Licznik_elementow_pojemnikow[do_ktorego]++" po zwiększeniu do 8 automatycznie przeskakuje na 0 i tak w kółko. Kiedy deklarację tej tablicy "Licznik_elementow_pojemnikow" przeniosę z ostatniej linii przestrzeni nazw do linii pod deklaracje stałej "ilosc_pojemnikow" to inkrementacja przechodzi poprawnie po zwiększeniu do 8 następuje zwiększenie do 9. Być może coś źle napisałem w kodzie?? Być może to jakiś bug oprogramowania MS Visual Studio.

0

To są uroki zmiennych globalnych, przypadkiem masz taką samą nazwę lokalnie i powstaje coś co trzeba długo i namiętnie debugować.
Rada jest prosta, pozbądź się zmiennych globalnych.

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