inicjalizacja n-elementowej tablicy - sposób

0

Hey,
Mam takie pytanko:
Czy poprawny jest taki "myk" do inicjalizowania n-elementowych tablic w c++ (prosiłbym jednak o ocenę tylko tego pomysłu - zalet i wad - bez odwoływania się np. do tablic dynamicznych):

void start()
{
   int x = 0;
   cin>>x;  //zmienna wartość (ktoś może podać 10 a ktoś inny np. 100)
   const int n = x; //przypisujemy zmiennej n wartość podaną przez użytkownika
   double tablica[n]; //deklarujemy tablicę używając stałej zmiennej
   // pozostała część kodu korzystająca z n-elementowej tablicy 

Czy takie rozwiązanie ma jakieś wady?
bardzo bym prosił o ocenę tego rozwiązania.
Pozdrawiam

0

A slyszał o new i new[] ? To niech doczyta.

0
int n;
cin >> n;
double *tablica = new double[n];
// tutaj robisz co chcesz z tablica
delete [] tablica
0

No właśnie słyszałem. Prosiłbym jednak o ocenę powyższego rozwiązania - czy są jakieś wady takiego podejścia?
Dynamiczne alokowanie pamięci to swoją drogą - chciałem jednak się zapytać o wady powyższego rozwiązania.
Pozdrawiam

0

@smart powyższe rozwiązanie jest idiotyczne. Nie wiem skad pomysł przypisania wartości zmiennej do stałej. Poza tym taka tablica będzie widziana tylko wewnątrz tej jednej funkcji, co też niewiele ci daje. No i na koniec jest to tablica na stosie, więc jej rozmiar jest bardzo mocno ograniczony.

0

@smart
A ma takie wady, że np u mnie w MSVC 2010 nie kompiluje się program i wyskakują błędy, poza tym podczas kompilacji nie określasz rozmiaru tablicy a to źle.

0

Aha :/,
Ok, dzięki. Ja patrzyłem to jakiś czas temu w Visual-u i u mnie się skompilowało :]. Ale ok. to chyba rzeczywiście nie był trafiony pomysł :/.
Dziękuję za odpowiedzi i pozdrawiam

0

auć, przecież MSVC 2010 to Visual :/ - to nie wiem co jest nie tak - u mnie się skompilowało O_o.
Ehh, ok. zostawmy ten temat :D
Pozdrawiam

0

Czy poprawny jest taki "myk" do inicjalizowania n-elementowych tablic w c++ (prosiłbym jednak o ocenę tylko tego pomysłu - zalet i wad - bez odwoływania się np. do tablic dynamicznych):

  1. jest poprawny w standardzie C99, ale język C to nie C++
  2. nie jest poprawny według standardu C++ (ani obecnego ani najbliższego nowego)
  3. jest to obsługiwane przez kompilator gcc, zarówno w trybie C jak i C++

zalety:
· fajne, prostsze od new/delete, nie trzeba pamiętać o zwalnianiu tej pamięci
· tablica jest zmienną lokalną, na stosie — ginie automatycznie po wyjściu z funkcji

wady
· nie można w ten sposób definiować tablicy globalnej
· nie można za pomocą goto przeskoczyć „ponad” definicją takiej tablicy (ale goto i tak się prawie nie używa)
· nie można zmieniać rozmiaru tej tablicy (ale oczywiście za każdym wejściem do funkcji można podawać inny rozmiar)
· nie wszystkie kompilatory to obsługują

Poza tym taka tablica będzie widziana tylko wewnątrz tej jednej funkcji, co też niewiele ci daje.
ale można ją przekazać jako parametr do innej funkcji, i będzie tam widziana jako zwykła tablica (lub wskaźnik):

void foo()
{
  int n = 10;
  int tab[n];
  bar(tab,n); // tablicę można przekazać jako parametr
  // ale nie można jej zwrócić z funkcji
}

void bar(int tablica[], int rozmiar) // lub int *tablica
{
  // ...
}

więc jej rozmiar jest bardzo mocno ograniczony.
Nie aż tak „bardzo mocno”, nie zawsze potrzebujemy tablic o wielkości rzędu megabajtów albo większych.

0

Dziękuję Ci bardzo Azarien za rzetelną odpowiedź!!!
Pozdrawiam!

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