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.