Tablice dynamiczne w funkcjach

0

Witam

Mam dylemat

Piszę taki program, który muszę oddać do sprawdzenia.

W funkcji main() mam taki kawałek kodu, który jest dość długi, skomplikowany i przeprowadza sporo obliczeń. Wykorzystuje do tego kilka tablic dwuwymiarowych, które są wykorzystywane tylko na ten czas obliczeń i mogą osiągnąć wysokie indeksy. Uznałem więc, że ładnie będzie to wyglądało, gdy użyje tablic dynamicznych. Wszystko w porządku. Jednak postanowiłem, że ten kod przeniosę do funkcji, którą sobie potem wywołam. Poprawi to estetykę programu. Ale nie wiem czy w tym wypadku jest potrzeba używania tablic dynamicznych? Wyglądało by to mniej więcej tak:

void funkcja()
{
//przydzielanie pamięci
... //obliczenia
//zwalnianie pamięci
}

Bo z tego co mi wiadomo nawet jeśli użyłbym tablic statycznych to i tak bo zakończeniu działania funkcji pamięć z nich zostałaby zwolniona, więc użycie dynamicznych tablic tylko sprawi, że kod będzie bardziej nieczytelny.

No więc, czy mam rację?

0
lukasz93 napisał(a)

Bo z tego co mi wiadomo nawet jeśli użyłbym tablic statycznych to i tak bo zakończeniu działania funkcji pamięć z nich zostałaby zwolniona

To prawda, ale to też zależy jak duże są te tablice, i czy z góry znasz ich rozmiar.
• jeśli rozmiar danych jest zmienny, tablice dynamiczne pozwolą ci alokować tyle pamięci co potrzeba, zamiast ustalać na sztywno jakieś nieduże maksimum
• jeśli danych jest bardzo dużo, w grę wchodzi w zasadzie tylko przydzielanie dynamiczne
• jeśli jednak tablice są niewielkie, i zawsze takiej samej wielkości, wystarczą statyczne

0

Jeśli chodzi ci o wysokie indeksy (podejrzewam, że duże tzn. pierdyliardy i wyżej). Wtedy możesz robić tak:

void obliczenia(int tab1[], unsigned int size_tab1, int tab2[], unsigned int size_tab2) {
   // twoje obliczenia
}

int main() {
   unsigned int pieldyriald = 0xDeadBeef;
   int *tab1 = new int[pierdyliard], *tab2 = new int[pierdyliard];

   obliczenia(tab1, pierdyliard, tab2, pierdyliard);

   delete [] tab1;
   delete [] tab2;

   return 0;
}

lub:

void obliczenia(unsigned int size) {
   int *tab1 = new int[size], *tab2 = new int[size];

   // obliczenia

   delete [] tab1;
   delete [] tab2;
}

int main() {
   unsigned int pieldyriald = 0xDeadBeef;

   obliczenia(pierdyliard);

   return 0;
}

, a najlepiej (o ile to C++ a nie C) to użyć wektorów i nie martwić się o to czy się pamięta o zwolnieniu pamięci.
</i>

0

Dzięki Panowie :)

Nie chodzi aż o tak wysokie indeksy, ale zapisze sobie na pewno :)

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