Tworzenie globalnych, dynamicznych tablic 2D.

0

Dzień dobry.

Jeżeli nie sprawi to zbyt dużego kłopotu, bardzo proszę o pomoc z pewnym programem napisanym w C++.

Na zajęciach na uczelni mamy za zadanie napisać program symulujący zachowanie się kryształu w funkcji temperatury, z danymi wczytywanymi z pliku tekstowego. W związku z tym, zachodzi potrzeba zastosowania dwuwymiarowych, dynamicznych tablic przechowujących min. wartości pędów cząstek w trzech osiach.

Ponieważ rozmiar tablicy nie może być zdefiniowany odgórnie, sugerując się przykładami w Internecie, starałem się zastosować wskaźniki (których niestety nie rozumiem). Pojawił się jednak pewien problem – przy zastosowaniu ich w taki sposób, jak w załączonym pliku, tworzy się tablica a[y][x] zamiast [x][y] (co trochę komplikuje już napisane funkcje), która w dodatku jest niedostępna globalnie (tj. poza funkcją, która ją inicjalizuje).

Bardzo prosiłbym o pomoc, w jaki sposób poprawić program, aby tablice te były dostępne globalnie dla pozostałych funkcji (w związku z celem programu, funkcje obliczające energie, pędy, itp., muszą być uruchamiane wielokrotnie w trakcie działania programu). Jeżeli jednak istnieją dużo lepsze i prostsze sposoby na uzyskanie podobnego efektu, to byłbym bardzo wdzięczny.

Od razu dziękuję za wszelką pomoc czy sugestie oraz poświęcony mi czas.

1

A może zastosujesz wektor (http://www.cplusplus.com/reference/stl/vector/)? To gotowa, dynamiczna tablica "wyposażona" od razu w przydatne funkcje. Dodatkowo te wczytywane dane zamiast w tablicy wielowymiarowej można by "zebrać do kupy" np w klasie (http://www.cplusplus.com/doc/tutorial/classes/).

1

Jak tworzysz tablicę 200-elementową to równie dobrze możesz ją podzielić na 20 sektorów po 10 jak i 10 sektorów po 20 elementów w każdym. Potem po prostu aby odczytać jakiś element danego sektoru używasz wzoru :

((nr_sektoru-1)*ilosc_elementow_w_sektorze) + (nr_elementu-1) 
0

Dziękuję za podane sugestie, bardzo mi pomogły.

Zastanawiam się tylko, czy gdybym stworzył, powiedźmy, klasę "particle" przechowującą wartości pędów, energii, położenia, itp - po czym zainicjalizował kilkadziesiąt takich elementów w funkcji main(), to czy były by one dostępne dla pozostałych funkcji?

I jeszcze raz dziękuję za dotychczasową pomoc.

1

Tylko gdyś stworzył te elementy poza jakąkolwiek funkcją (w tym main). Nadawać im wartości możesz gdziekolwiek (w funkcji main też) bo to już będą "globalne" obiekty klasy particle.

Generalnie zmienne globalne to takie zmienne które deklarujesz przed jakąkolwiek funkcją, w tym main.

0

W tym problem, bo ile dokładnie takich obiektów/elementów będzie potrzebnych, program ma dowiedzieć się dopiero przy odczytywaniu z pliku, a to już samo w sobie musi zawierać się w funkcji. Dlatego próbowałem początkowo korzystać ze wskaźników.

Jeszcze raz dziękuję.

1

No to zrób wektor obiektów klasy particle, takowy sam dopasuje swoją wielkość do ilości elementów w nim zawartych. Można co prawda podać mu "z góry" ile miejsca ma zarezerwować, ale przekroczenie tej wartości nie ma żadnych negatywnych skutków, wektor dalej będzie się dopasowywał do twoich zwiększających się potrzeb
Wyglądało by to mniej więcej tak
[code]
//include-y wszelakie potrzebne

using namespace std;

class particle {
public:
int pozycjax;
int pozycjay;
int wektor;
int prawdopodobienstwozewlasnietambyla;
string nazwa tego ustrojstwa;
float spin;
//etc
};
vector<particle> tab;

//cała reszta czyli funkcje w tym main
[/code]
W takim przypadku elementy do wektora możesz dodawać gdziekolwiek (przez tab.push_back(eleparti);, gdzie eleparti to inna instancja klasy particle stworzona na potrzeby wczytywania, nie musi być globalna starczy że będzie dostępna w funkcji w której wczytujesz więc najlepiej tam ją zadeklaruj), nawet w specjalnej funkcji wczytującej. Dostęp do nich będzie z każdej funkcji która nie zadeklaruje sobie własnego tab-a (czy jak tam ten wektor nazwiesz).

0

Chciałbym tylko poinformować, że stosując się do sugestii użytkownika sig, przerobiłem istniejący program i faktycznie działa on zgodnie z założeniami. Jedynym problemem jest wolniejsze działanie przy starcie (związane ze sposobem w jaki rozszerzana jest dynamiczna tablica klasy vector), ale mam nadzieję, że nie będzie stanowić to aż tak dużego problemu.

Ponownie dziękuję za pomoc.

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