[C++] "Dziwna" tablica

Mam taki kod:

#include 

#include 


using namespace std;


int main()

{

      int c, cw;

      cin>>c;

      int w[c];

      for(int i=0; i
              cin>>cw;

              int w[c][cw];

              for(int j=0; j
                      cin>>w[i][j];

              }

      }

      cin.ignore();

      getchar();

      return 0;

}

Nie działa on jednak poprawnie. Format wprowadzanych danych:

5 //rozmiar pierwszego wymiaru

3 //rozmiar elementu [0] tablicy

1 2 3 //elementy w tablicy [0][0]

4 //rozmiar elementu [1] tablicy

4 5 6 7 //elementy w tablicy [0][1]

itd.

Nie chcę zajmować niepotrzebnej pamięci. Wynikiem ma być “krzywa” tablica, opisana tak, jak napisałem wyżej.

Proszę o pomoc i z góry dziękuję.

nie możesz deklarować rozmiaru tablicy na podstawie zmiennej wprowadzonej w działającym programie,

rozmiar tablicy musi być znany w momencie kompilacji,

do dynamicznego tworzenia tablic używaj operatora “new”,

musisz zadeklarować z góry określoną tablicę wskaźników do int

a potem do każdego wskaźnika przydzielić pamięć za pomocą operatora new (rozmiar może być zmienną w programie)

Pozdrawiam

Hmm… Czy mógłbym prosić o przykłady?

zamiast - int w[c];

napisz int * w[“max”]; max = maksymalna ilość tablic (może być to wartość dosyć duża, jeden wskaźnik to 4 bajty)

w pętli zamiast int w[c][cw];

w = new int[“rozmiar”]; rozmiar może być dowolną wartością wprowadzoną również podczas działania programu, w każdym przebiegu pętli może być inny

Pozdrawiam

Może standard na to nie pozwala, ale większość kompilatorów to przełknie. To nie tutaj leży problem.

Masz “int[c] w,” a potem w pętli for “int w_[cw]” (nazwijmy je w2). Pomijając, że w jest tablicą jednowymiarową, a w2 dwu, w każdej iteracji fora tworzysz nowe w2, a po wczytaniu wiersza, niszczysz. Deklarowane zmienne na stosie (np. int tab[10]) giną przed powrotem z funkcji lub wyjściem z bloku instrukcji (for, while, {}). To chyba tak powinno wyglądać._

#include 

#include 


using namespace std;


int main()

{

      int c, cw;

      cin>>c;

      int *w[c];

      for(int i=0; i
              cin>>cw;

              w[i] = new int[cw];

              for(int j=0; j
                      cin>>w[i][j];

              }

      }

      cin.ignore();

      getchar();


      /* wypisz sobie */


      /* zwalniamy dynamicznie zaalokowaną pamięć */

      for(int i=0; i
              delete[] w[i];

      /* zauwaz, ze nie dealokujemy tablicy w */

      return 0;

}

Polecam poczytać: http://www.parashift.com/c+±faq-lite/dtors.html

A jakbym chciał teraz wypisać?

#include 

#include 


using namespace std;


int main()

{

      int c, cw;

      cin>>c;

      int *w[c];

      for(int i=0; i
              cin>>cw;

              w[i] = new int[cw];

              for(int j=0; j
                      cin>>w[i][j];

              }

      }

      for(int i=0; i
              for(int j=0; j
              cout<
      }

      for(int i=0; i
      cin.ignore();

      getchar();

      return 0;

}

Taki kod wywala błąd:

c jest liczbą całkowitą, w jest dwuwymiarową tablicą liczb całkowitych. Na pewno chodziło o takie coś?

cout<

Nazywaj zmienne tak, żeby ich nazwa coś mówiła - trudniej się wtedy pogubić.

Wow… Dzięki wielkie - nie zauważyłbym… :roll: Siostro, jest funkcja “pomógł” na sali?

EDIT: Problem…

Wprowadzam dane:

I dostaję coś takiego

, podczas, gdy powinienem otrzymać

Nie podam Ci tego na tacy, ale podpowiem:

#include 


using namespace std;


int main()

{

  int n;

  cin >> n;


  int *tab1 = new int[n];

  int tab2[n];


  cout << sizeof(tab1) << ' ' << sizeof(tab2) << ' ' << sizeof(n) << endl;

  return 0;

}

Takie uroki C++

A podpowiesz, dlaczego tak jest? (wklepałem 5, dostałem “4 20 4”; wklepałem 6, dostałem “4 24 4”; wklepałem 7, dostałem “4 28 4”)

sizeof mówi, ile bajtów zajmuje typ lub obiekt. Kompilujesz na 32 bitową architekturę, więc int ma 4 bajty. *int to wskaźnik. Czasem reprezentuje sobą tablicę, a czasem pojedynczy obiekt - nieważne. Wskaźnik (nieważne na jaki typ), to tak na prawdę ‘unsigned int’, a NULL == 0. tab2 jest już tablicą i wiadomo o tym w czasie kompilacji.

#include 


using namespace std;


int main()

{

  int n;

  cin >> n;


  int *tab1 = new int[n];

  int tab2[n];


  cout << sizeof(tab2) / sizeof(int);

  cin.ignore();

  getchar();

  return 0;

}

Taki kodzik działa bez problemu… Dla tab2. A co z tab1? Nijak nie mogę pobrać rozmiaru bajtowego…

Zapamiętaj rozmiar każdego wiersza, kiedy go alokujesz - najprościej w osobnej tablicy.

Wielkie dzięki (znowu)… Cieszę się, że są jeszcze tacy ludzie, skłonni do pomocy. :slight_smile: