x-kom hosting

[C++] Dwuwymiarowa tablica wskaźników

Święty
utworzono
utworzono

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
komentarz

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
komentarz

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
komentarz

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
komentarz (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
komentarz

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.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.