Niekontrolowana podmiana wartości

0

Witam niemal już ukończyłem program wyznaczający diagram Voronoi w oparciu o algorytm Fortune'a z periodycznymi warunkami brzegowymi. Pojawia się jednak mały problem. Otóż przed wejściem do funkcji RemoveParabola Pierwszy elemnt w tablicy Ord[] zostaje podmieniony z 10 na krzaczek 2.3342e-313. Nie zdziwiłbym się gdyby to była wina błędnego przypisania wartości gdzieś w kodzie. Jednak to nie to. Okazuje się, że wina w leży w procesie zapisywania punktów węzłowych do tablicy węzłów NodeTab[]. Przed wartość Ord[0]=10 natomiast po wykonaniu zapisu i przed wejściem do RemoveParabola() mamy Ord[0]=2.3342e-313.

Tutaj kod:

j=NodeTab[0];

do{

     SweapLine = Que[1*6+2];
     if(Que[1*6+0] == 1.0){
                   AddParabola( int(Que[1*6+1]), MapSize_x, MapSize_y, SweapLine, VoronoiTab, Ord, Que, NodeTab);
                   }
                   
     else{     
               // Tutaj Ord[0] = 10
               j = j+1;
               NodeTab[0]=j;
               NodeTab[j*4] = j;
               NodeTab[j*4+1] = int(Que[6+3]);
               NodeTab[j*4+2] = int(Que[6+4]);
               NodeTab[j*4+3] = int(Que[6+5]);               
               // Tuta już krzaczek
               RemoveParabola( NodeTab , MapSize_x, MapSize_y, SweapLine, VoronoiTab, Ord, Que);

                   }
  
}while(Que[0] >= 1.0);

Nie jestem mistrzem programowania i uczę się na własną rękę. Moje domysły to takie, że gdzieś wykraczam poza pamięć zarezerwowaną dla NodeTab[] i zmieniam Ord[0]. Co mam zrobić żeby to naprawić ? W czym tkwi błąd ?

0

Dodam jeszcze, że kiedu usunę tą część z zapisem do NodeTab wszystko działa ok.

0

A w jaki sposób deklarujesz/przydzielasz+zwalniasz Que oraz NodeTab?

0

Deklaruję je tak:

double Que[2*(Nmax+2)*6];
int NodeTab[2*(Nmax+2)*4];

I w odpowiednio w pętlach zeruję wszystkie elementy tych tabel. Natomiast nie zwalniam nigdzie pamięci.

0

Użyj debuggera. Możesz postawić "data breakpoint" - program się zatrzyma gdy dana porcja pamięci się zmieni.

0

Wyświetliłem sobie tabele Que i Ord i okazuje się, że po czasie coraz więcej "krzaczków" wpycha się w miejsca tych tabel. Czy system rezerwuje za mało pamięci dla programu?

0

A gdzie masz kontrole j<2*(Nmax+1) ?

0

W sumie racja nie ustawiłem czegoś takiego. Ale program wykonuje się przy 24 punktach węzłowych czyli jmax =24, a pamięci zarezerwowanej jest na 96 miejsc w tabeli NodeTab[].

0

@_13th_Dragon - rzeczywiście ale ze mnie gapa. Zarezerwowałem miejsce tylko dla 24 wierszy po 4 kolumny a punktów mam 28 czyli brakuje jeszcze 16 miejsc. Dzięki. Ech muszę sobie zrobić przerwę jak przy czymś takim się zawiesiłem.

0

Tak a propos może mi się wydaje ale chyba pomoże ci taka struktura:
struct { int Count; struct { int Number; int Param[3]; } Tab[Nmax]; } NodeTab;
zamiast: NodeTab[0] masz: NodeTab.Count;
zamiast: NodeTab[j4] masz: NodeTab.Tab[j].Number;
zamiast: NodeTab[j
4+x] masz: NodeTab.Tab[j].Param[x];

0

Dzięki za wskazówki. Chyba jednak muszę sobie wypożyczyć Prata żeby lepiej programować. Na podstawach c++ mieliśmy nawet mniej niż podstawy a chciałbym już klepać nie wiadomo co. Wygląda to jak sklejanie rakiety przy pomocy taśmy klejącej, zapałki i gumy do żucia. W każdym razie mogę się pochwalić tym co naklepałem w załączniku. Jest tam Diagram Voronoi z periodycznymi warunkami brzegowymi :D.

Pozdrawiam

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