Puchacz1 Opublikowano 18 Lutego 2011 Zgłoś Opublikowano 18 Lutego 2011 (edytowane) 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 18 Lutego 2011 przez Puchacz1 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
boo007 Opublikowano 18 Lutego 2011 Zgłoś Opublikowano 18 Lutego 2011 (edytowane) 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 18 Lutego 2011 przez boo007 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Puchacz1 Opublikowano 18 Lutego 2011 Zgłoś Opublikowano 18 Lutego 2011 (edytowane) 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 18 Lutego 2011 przez Puchacz1 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kfgz Opublikowano 18 Lutego 2011 Zgłoś Opublikowano 18 Lutego 2011 (edytowane) C++ dynamic array template class C++: equivalent to "realloc" in C++, array array, array size EDIT: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4027 http://en.wikipedia.org/wiki/Vector_%28C%2B%2B%29 Edytowane 18 Lutego 2011 przez kfgz Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
boo007 Opublikowano 18 Lutego 2011 Zgłoś Opublikowano 18 Lutego 2011 (edytowane) 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 18 Lutego 2011 przez boo007 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
_OskaR Opublikowano 18 Lutego 2011 Zgłoś Opublikowano 18 Lutego 2011 W takim przypadku, zamiast tablicy, lepiej skorzystać z STLa, ew. zrobić własną strukturę. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...