Święty utworzono 14 lutego 2010 utworzono 14 lutego 2010 Witam Chodzi mi o alokacje, odwołanie do danego elementu i przekazanie do funkcji takiego czegoś jak 2-wymiarowa tablicy wskaźników na obiekty jakiegoś typu. Nie chodzi mi akurat o char, ale dla ułatwienia chciałem na tym spróbować. Próbowałem różnych sposobów: i tak: [code] #include <iostream> using namespace std; void pokaz(char *(*tab2D)[10][10]) { for (int i=0;i<10;i++) { for (int j=0;j<10;j++) cout<< *tab2D[i][j] <<" "; cout<<endl;; } } int main() { char *(*tab)[10][10] = NULL; for(int i = 0; i < 10; i++) for(int j = 0; j < 10; j++) **tab[i][j] = 'a'; pokaz(tab); system("pause"); return 0; }[/code] i tak: [code]#include <iostream> using namespace std; void pokaz(char *tab2D[10][10]) { for (int i=0;i<10;i++) { for (int j=0;j<10;j++) cout<< *tab2D[i][j] <<" "; cout<<endl;; } } int main() { char *tab[10][10]; for(int i = 0; i < 10; i++) for(int j = 0; j < 10; j++) *tab[i+10*j] = (char*)'a'; pokaz(tab); system("pause"); return 0; }[/code] i tak: [code]#include <iostream> using namespace std; void pokaz(char *(*tab2D)[10][10]) { for (int i=0;i<10;i++) { for (int j=0;j<10;j++) cout<< *tab2D[i][j] <<" "; cout<<endl;; } } int main() { char *(*tab)[10][10] = NULL; for(int i = 0; i < 10; i++) for(int j = 0; j < 10; j++) *(tab + i + 10*j) = (char*)'a'; pokaz(tab); system("pause"); return 0; }[/code] Ale nijak nie mogę tego poprawnie zrobić. Jaki sposób na to?
rafalluz komentarz 14 lutego 2010 komentarz 14 lutego 2010 Nie do końca rozumiem, co dokładnie chcesz zrobić, więc porady ogólne: Przede wszystkim [b]tablica to wskaźnik[/b]. Jeśli sobie napiszesz: [code] char tab[5][/code] możesz to bez problemu przekazać do funkcji przyjmującej char*, tylko musisz jeszcze przekazać rozmiar tablicy Dwuwymiarowa tablica wskaźników? Ciężko rozszyfrować. Pamiętaj, że string w C to char*, od tego wyjdź. Tablica stringów zatem to char**. Tablica tablic (coś jak tablica dwuwymiarowa) stringów to char*** Pamiętaj też, że operator [] wykonuje dereferencję. Zapis [code]tab[3][/code] jest równoważny [code]*(tab + 3)[/code]
Święty komentarz 14 lutego 2010 Autor komentarz 14 lutego 2010 Mówiłem, że char tutaj jest przykładowo. Wiem że char* to string. Chodzi mi o dwuwymiarową tablicę wskaźników na jakiś typ. Nie wiem jak to inaczej wytłumaczyć. 10 wierszy i 10 kolumn a w każdym polu wskaźnik na obiekt jakiegoś typu. Coś w stylu: typ *(tablica[10][10]) ale gubię się w przekazywaniu do funkcji i odwoływaniu do konkretnej wartości później.
rafalluz komentarz 15 lutego 2010 komentarz 15 lutego 2010 Skoro dałeś przykład char, to omawiamy char. Łatwiej ogarnąć, gdy ma się konkretny przykład. Dwuwymiarowa tablica (ściślej - tablica tablic - czyli wskaźnik do wskaźnika) wskaźników do char (czyli stringów - abstrahując od klasy string) to po prostu char***. Wymiary przekazuj jako parametry funkcji. Czyli coś jak pierwszy kod, ale o jedną * mniej w funkcji. Odwołanie się? 2 razy użyjesz operatora [] i masz char*: tab[0][0] da Ci char*
olas386 komentarz 20 lutego 2010 komentarz 20 lutego 2010 (edytowane) Ja rozwiązałem taki problem w sposób: int x,y; cin >>x>>y; int **wskaznik = new int *[x]; for(int i=0; i<x; i++) *(wskaznik+i) = new int [y]; gdzie x i y są rozmiarami dynamicznej tablicy wskaźników ( moźna to tak nazwać =D ) a do funkcji przekazujesz poprzez nazwę "tablicy wskaźników" ( adres zerowy ) void fun(int *(*wsk),int a, int b) ( a i b są rozmiarem tablicy ) w ciele main wywołujesz funkcje w ten sposób fun(wskaznik,x,y) Jeszcze coś bardzo ważnego, nazwa tablicy jest jej adresem zerowym, możesz oczywiście przekazać wybrany element do funkcji ale wydaje mi się że Ty chcesz operować wewnątrz funkcji na całej tablicy, jeżeli tak odwołujesz się poprzez jej adres zerowy czyli nazwę. W definicji funkcji (jeżeli deklaracja jest w innym miejscu to oczywiście również ) zaznaczasz, że masz do czynienia z tablica dwuwymiarową więc oczywiście dla przykładu void fun(tablica[][]); ja sam wolę zapis void fun(*(*tablica)); a następnie w mainie fun(nazwa_tablicy) , ewentualnie fun(*(*(tablica+x)+y)); wskazująca na wybrany tablica[x][y]. Mam nadzieję, że teraz wszystko jasne =D
Święty komentarz 21 lutego 2010 Autor komentarz 21 lutego 2010 No tak, dobrze piszesz, ale Ty piszesz o dynamicznej alokacji tablicy intów, a nie wskaźników na nie. A ma być coś takiego jak rafalluz pisał char*** lub ja w poprzednim poście. Więc poniższe zdanie jest nieprawdziwe [quote name='olas386' date='20 luty 2010 - 13:11' timestamp='1266667918' post='978839'] gdzie x i y są rozmiarami dynamicznej tablicy wskaźników ( moźna to tak nazwać =D ) [/quote] Ale reszta czyli proces tejże alokacji jest jak najbardziej ok Ale na marginesie to problem został zniwelowany, nastąpiło drobne przeoczenie w oryginalnym kodzie Pozdro
Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!
Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.