Skocz do zawartości
Puchacz1

[C++] użycie zmiennych poza funkcją

Rekomendowane odpowiedzi

zadeklarowałem funkcję która stworzy mi tablicę wypełnioną 0 lub 1. Za każdym razem tablica może mieć inny rozmiar.

 

int moja_funckja (int x, int y){  int rozmiar = 1;  int *wsk_rozmiar = &rozmiar;  int Tab[*wsk_rozmiar];  while(warunek)  {    if(warunek)    {      Tab[*wsk_rozmiar] = 1;    }    esle    {      Tab[*wsk_rozmiar] = 1    }   *rozmiar +=1;  }}
mam potrzebę uzyskania dostępu do tablicy oraz jej rozmiaru ale nie potrafię tego zrobić. Muszę to zrobić aby przekazać tą tablicę oraz jej rozmiar do innej funkcji. Na pewno będzie mi potrzebny wskaźnik, tylko nie umiem go chyba wykorzystać. Edytowane przez Puchacz1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

int rozmiar = 1;  int *wsk_rozmiar = &rozmiar;  int Tab[*wsk_rozmiar];

Te linijki nie zrobią tablicy dynamicznej, to będzie działać tylko jeśli kompilator statycznie będzie potrafił obliczyć rozmiar Tab. W c++ tablice dynamiczne robi się za pomocą operatora new i usuwa delete.

 

*rozmiar +=1;
Tego nie rozumiem, czy chcesz w trakcie działania programu zwiększyć rozmiar tablicy?

Jeśli tak, to tak się tego nie da zrobić. Pierwszy błąd to "*", zwiększasz coś co jest pod adresem rozmiar (idea działania: jeśli rozmiar == 123 to pamięć o adresie 123 zwiększasz o 1). Drugi: tablica Tab ma ustalony rozmiar i nie zmienia się on w trakcie działania programu. Do odczytania rozmiaru tablicy służy operator sizeof.

Edytowane przez boo007

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

int rozmiar_tab_calk = 0;int *wsk_rozm_tab_calk = &rozmiar_tab_calk; //int *Tab = new int[*wsk_rozm_tab_calk]; //dynamiczne stworzenie tablicy :)int dec_to_bin(long int a, double b, bool wypisz ){    //konwertujemy    while (a > 0)    {        if(a % 2 != 0)        {            Tab[*wsk_rozm_tab_calk] = 1;        }        else        {            Tab[*wsk_rozm_tab_calk] = 0;        }        // tablica testowa, jeśli true to wypisuje.        if(wypisz == true)        {            cout << "Tab[" << *wsk_rozm_tab_calk << "]: " << Tab[*wsk_rozm_tab_calk] << endl;        }        a /= 2;        *wsk_rozm_tab_calk += 1; // zmieniam rozmiar tablicy o 1    }    return 0;}

problem polega na tym, że nigdy nie będę wiedział ile elementów ma mieć moja tablica. Muszę to najpierw policzyć dlatego dobrze byłoby gdybym mógł zmieniać jej rozmiar w trakcie jej działania. Innym sposób to wywołać dwie pętle. W pierwszej pętli policzyć wielkość tablicy a w drugiej przypisywać tej tablicy już wartości. Tylko to zabiera sporo czasu... :)

 

i... sizeof() nie pokazuje odpowiedniej liczby elementów :(

Edytowane przez Puchacz1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Trochę lepiej, ale nie rozumiesz czym jest dynamiczne tworzenie tablicy. Tablicy takiej pamięć jest przydzielana raz, jej rozmiar jest stały (w trakcie działania programu się nie zmienia). To co odróżnia ją od tablicy statycznej to to, że rozmiar nie musi być znany przed uruchomieniem programu (np. może być pobrany przez cin).

Pisząc:

int *Tab = new int[*wsk_rozm_tab_calk]; //dynamiczne stworzenie tablicy :)
nie wiążesz Tab z *wsk_rozm_tab_calk, tylko mówisz, że Tab ma mieć rozmiar *wsk_rozm_tab_calk, jak wykonywanie programu dojdzie do tej instrukcji to system przyporządkuje pamięć o odpowiednim rozmiarze i "przypisze" ją do zmiennej Tab.

 

problem polega na tym, że nigdy nie będę wiedział ile elementów ma mieć moja tablica. Muszę to najpierw policzyć dlatego dobrze byłoby gdybym mógł zmieniać jej rozmiar w trakcie jej działania. Innym sposób to wywołać dwie pętle. W pierwszej pętli policzyć wielkość tablicy a w drugiej przypisywać tej tablicy już wartości. Tylko to zabiera sporo czasu... :)

 

Najpierw napisz działający program, później martw się wydajnością. W tym przypadku nie jest ważne czy zrobisz jedną, czy dwie pętle. Gdybyś chciał zmieniać rozmiar tablicy o jeden element (da się to zrobić kilkoma sposobami, np. zamiast tablicy można użyć listy, jest to taka struktura danych, gdzie możemy dodawać po jednym elemencie (to jest idea twojego rozwiązania)), to gwarantuję ci, że będzie wolniej niż "dwie pętle" (alokowanie pamięci jest wolne).

sizeof - zwraca rozmiar w bajtach

Tab - wskaźnik, sizeof(Tab) - rozmiar wskaźnika , czyli 4

*Tab - to samo co Tab[0], sizeof(*Tab)- rozmiar elementu tab[0] , czyli 4

int tab[12] - tablica 12 elementów int

sizeof(tab) == 12*sizeof(int) == 48

 

Rozmiar tablicy można odczytać przez sizeof, ale tablica, której miejsce przydzieliliśmy dynamicznie tak naprawdę nie jest tablicą, tylko wskaźnikiem, dlatego musimy pamiętać rozmiar. Jeśli przekazujemy tablice do funkcji przez wskaźnik to tracimy informację o jej rozmiarze.

Edytowane przez boo007

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...