Wskaźniki, listy i dynamiczna alokacja i Bóg wie co jeszcze

0

Witam. Piszę w c++ od dość (bardzo) dawna. Jestem samoukiem i często wychodzi to w głupich i popularnych błędach. Ogólnie większość projektów kończy się sukcesem i umiem praktycznie wszystko napisać, tym razem jednak mam głupi problem nad którym nawet nie mam ochoty myśleć..

#include <iostream>
#include <conio.h>
#include <vector>
#include <math.h>
using namespace std;

short TF(short In)
{if(In==0)return 3;
if(In==1)return 2;
if(In==2)return 1;
if(In==3)return 0;}

struct CH;
vector <CH*> Lista;


struct CH
{CH* W[4]; int WW[4];
CH* Here;
short Wodory;

void DC(short Wi)
     {if(WW[Wi]!=0)return;
     W[Wi]=new CH;
     WW[Wi]=-3;
     Lista.push_back(W[Wi]);
     W[Wi]->WW[0]=0;W[Wi]->W[0]=0;
     W[Wi]->WW[1]=0;W[Wi]->W[1]=0;
     W[Wi]->WW[2]=0;W[Wi]->W[2]=0;
     W[Wi]->WW[3]=0;W[Wi]->W[3]=0;
     if(Wi==0){W[Wi]->W[3]=Here;W[Wi]->WW[3]=-3;}
     if(Wi==1){W[Wi]->W[2]=Here;W[Wi]->WW[2]=-3;}
     if(Wi==2){W[Wi]->W[1]=Here;W[Wi]->WW[1]=-3;}
     if(Wi==3){W[Wi]->W[0]=Here;W[Wi]->WW[0]=-3;}
      W[Wi]->Wodory=3; Wodory--;}

int UDroge(short Wi)
    {int Max=0;int N;
    for(N=0;N<4;N++)
                     {if(Wi!=N)
                      {if(WW[N]==-3)
                      WW[N]=W[N]->UDroge(TF(N))+1; 
                       if(WW[N]>Max)Max=WW[N];}               
                               }    
    return Max;
                 }
       
};





int main()
{CH Czastka;Czastka.Here=&Czastka;Czastka.Wodory=4;Lista.push_back(&Czastka);
Czastka.W[0]=0;Czastka.W[1]=0;Czastka.W[2]=0;Czastka.W[3]=0;
Czastka.WW[0]=1;Czastka.WW[1]=0;Czastka.WW[2]=0;Czastka.WW[3]=0;


Czastka.DC(0);
Czastka.W[0]->DC(0);
Czastka.W[0]->W[0]->DC(1);
Czastka.W[0]->W[0]->DC(0);
Czastka.W[0]->W[0]->W[0]->DC(0);
Czastka.W[0]->W[0]->W[0]->W[0]->DC(0);



int I=0;
int A=0;
int Max=0;
for(I=Lista.size()-1;I>=0;I--)
if(Lista[I]->Wodory>=3)
{for(A=0;A<4;A++)if(Lista[I]->WW[A]!=0)
{Lista[I]->WW[A]=Lista[I]->UDroge(int(sqrt((A-1)*(A-1))));
if(Max<Lista[I]->WW[A])Max=Lista[I]->WW[A];}
                                       }
cout<<Max;
int Wegle;





getch();
return 0;
}
 

Kodzik to dopiero wstęp rozpoczęcia pierwowzoru pisania końcowego programu. Testuję tu algorytm szukania najdłuższej gałęzi.
Jak widać próbuję zbudować tu drzewko z struktury CH. Każdy element może być połączony z maksymalnie 4 innymi budując w ten sposób różnorakie figury. Na razie nie stworzyłem funkcji zwalniającej zasoby bo.. mi się nie chce xP. Te kilka bajtów pamięci może mi zaginąć w próbach.
Problemem jest to, że gdy próbuję się odwołać do zmiennej W[i] dla i€<1;3>∩N wszędzie z wyjątkiem struktury pierwotnej to windows (i standardowy dev'owy debbuger) wykrzykują mi naruszenie dostępu.

Gdzie tym razem robię błąd? Najprawdopodobniej znów w jakiś podstawach. Za długo nie bawiłem się z wskaźnikami xP

Oraz oczywiście przepraszam za zupełną nieczytelność kodu.

0

Hej :D

Chciałam tylko powiedzieć że to formatowanie wygląda jak psia kupa po zjedzeniu przez w/w tabletki na przeczyszczenie :] Czy to ma czemuś służyć tak z ciekawości zapytam? Łatwiej Ci czytać taki kod? Bo wiesz, jak oszczędzasz spacje w pliku to możesz wszystko napisać w jednej linijce :P

Ja nie wiem jak możesz nie widzieć tak prostego błędu:) Błąd jest tak banalny że z szacunku do Twojej inteligencji nie podam Ci rozwiązania tylko zasugeruję przejrzenie kodu raz jeszcze :D Szczególnie Twojej funkcji "Dodaj Węgiel" czy co to miało tam być :P

Bo wiesz, tu są ludzie chętni do pomocy ale nie w przypadku, gdy ich ktoś chce wykorzystać jako tanią siłę roboczą bo mu się nie chce myśleć... :P

0

Szkoda slów na komentowanie tego czegoś co tu wstawiłeś. Skasuj ten kod i przeczytaj ze zrozumieniem dowlną książkę na temat C++.

0

Człowieku masakra... To jest na prawdę jedna wielka masakra. Chciałem czytać Twój kod. Po 20 min czytaniach nadal nie miałem pojęcia o co chodzi...

Trochę poformatowałem kod i od razu znalazłem Twój błąd. Znajdź go sam.

http://pastebin.com/bguWLmpq

Przejrzyj od początku. Od main, bądź debuggerem. I mów sobie na głos co każda linijka kodu robi. (inaczej nie znajdziesz)

ale oprócz błędu który pytasz jest jeszcze jeden (a może i więcej bo nie chciało mi się już kompilować i sprawdzać czy działa a tym bardziej czytać tego potwora). Moja rada to napisać to tak żeby czytelnik bez problemów zrozumiał kod i nie musiał myśleć "co to !@#$% jest to W, WW, DC TF" itd. Niech Ci zajmę godzinę a nawet dwie dłużej ale z czymś takim nie będziesz się musiał bawić.

0

polecam zmienić środowisko programistyczne. Takie które nie robi randomowego formatowania kodu oraz nazywać zmienne normalnie. Stałe w C/C++ zazwyczaj się piszę z wielkich liter, nazwy nowych typów danych zaczyna się z wielkich liter, nazwy zmienych to pierwszy człon z małych liter a drugi człon nazwy zaczyna się z wielkiej litery. Zobaczysz ,że zachowanie jednolitego stylu kodowania sprzyja czytelności.

0
short TF(short In)
{if(In==0)return 3;
if(In==1)return 2;
if(In==2)return 1;
if(In==3)return 0;}

do samo, tylko po ludzku:

short TF(short In) { return 3-In; }

jeszcze raz to samo:

#define TF(In) (3-In)

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