[c] Przekazywanie wskaznika na tablice intow

soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: soku11 »

WITAM!
Krotka pilka. Mam taki programik:

Kod: Zaznacz cały

int function(int (*tab)[30]);

int main()
{
  int tab[30];
  int ret;
  ret=function(&tab);

  return ret;
}

int function(int (*tab)[30])
{
  (*tab)[0]=1;
  (*tab)[1]=0;
  return 0;
}
Czy jest to poprawny zapis?? Oczywiscie funkcja przyjmuje wskaznik na tablice 30 elementowa. Chodzi o to czy dobrze zapisalem wszelkie gwiazdki itd... Z gory dzieki za pomoc. POZDRO
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: kadiii »

Krótka odpowiedź: kod jest poprawny.
A i tak btw: Niezapomnianego sylwestra dla wszystkich userów matemtyki.pl
DerSchmetterlig
Użytkownik
Użytkownik
Posty: 18
Rejestracja: 25 gru 2007, o 21:56
Płeć: Mężczyzna
Lokalizacja: Gniezno
Podziękował: 1 raz
Pomógł: 1 raz

[c] Przekazywanie wskaznika na tablice intow

Post autor: DerSchmetterlig »

Poprzez zapis:

Kod: Zaznacz cały

int function(int (*tab)[30]); 
nie przekazujesz całej tablicy 30 elementowej tylko konkretny tab[30], który notabene nie istnieje bo przecież później zadeklarowałeś tablicę tab[30] (tj. od tab[0] do tab[29]

Poprawny zapis powinien być:

Kod: Zaznacz cały

int function(int (*tab)[]); 
Pozdrawiam
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: soku11 »

Hmpf... Caly projekt sie opiera miedzy innymi na tym przekazywaniu i jakos nie wywala narazie bledow, program dziala jak powinien itd... A tutaj chcialem zapisac nie wskaznik na tablice nieokreslona tylko okreslona... Nie da sie tego tak zrobic?? A ja tam nie przekazuje elementu tablicy, tylko wskaznik na tablice. POZDRO
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: kadiii »

Jeżeli się nie do końca panuje wskaźnikami to warto sobie uzmysłowić co one pokazują i czy jest to fizycznie możliwe.
Wtedy jeśli utożsamimy sobie pamięć z taśmą a komórki pamięci z pojedyńczymi bajtami można sobie wyobrazić na co wskazuje wskaźnik i co jest w nim zapisane. A i kod jest oczywiście poprawny. Pozdrawiam.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: soku11 »

No wlasnie bo gdyby mial byc wskaznik na 30 element tablicy to by trzeba bylo poprostu wpisac:

Kod: Zaznacz cały

 int function(int *komorka);
POZDRO
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: smiechowiec »

Kod jest poprawny, choć może warto sobie uzmysłowić co tak naprawdę przekazuje do funkcji.
Nazwa tablicy w C jest adresem jej pierwszego element a wskaźnik do tabicy jest wskaźnikiem do wskaźnika. Prawdopodobnie z jakiś powodów autor miał taką koncepcję.
Nieco prościej byłoby np. tak

Kod: Zaznacz cały

int function(int tab[30]);

int main(){
  int tab[30];
  int ret;
  ret=function(tab);
  return ret;
}

int function(int tab[30]){
  tab[0]=1;
  tab[1]=0;
  return 0;
} 
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: soku11 »

Hehe no tak Zapomnialem jak sie poslugiwac tymi tablicami bo tylka na wskaznikach wszystko robilem Dzieki wielkie za podpowiedz. POZDRO
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: kadiii »

T o jeśli o to tylko chodziło to rzeczywiście lepiej byłoby tak int function(int tab[]) bo ta 30 i tak jest pomijana przez kompilar. Nie jest to jednak to samo co napisałeś na początku ze wskażnikiem na tablicę 30 intów-(*tab)[30](czy tam 31 jak ktoś woli). To tak gwoli sprostowania.
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: Rafal88K »

soku11 pisze:o wlasnie bo gdyby mial byc wskaznik na 30 element tablicy to by trzeba bylo poprostu wpisac:
Kod:
int function(int *komorka);
No nie sądzę Zobacz poniższy kod:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int function(int* tab);

int main()
{
  int tab[30];
  int ret;
  
  ret=function(tab);
  cout << tab[0] << " " << tab[1] << " " << ret << endl;
  
  system("pause");
  return ret;
}

int function(int* tab)
{
  tab[0]=11;
  tab[1]=22; 
  
  return 0;
} 
Nie tylko jest to poprawne ale i także wygodniejsze szczególnie przy tablicach wielowymiarowych
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: kadiii »

soku11 napisał/a:
o wlasnie bo gdyby mial byc wskaznik na 30 element tablicy to by trzeba bylo poprostu wpisac:
Kod:
int function(int *komorka);
No nie sądzę
Chyba chodziło mu jednak o coś takiego:

Kod: Zaznacz cały

#include <iostream>
using namespace std;
int function(int* tab);
int main()
{
  int tab[30];
  int ret;
 
  ret=function(&tab[29]);
  cout<<tab[29]<<endl;
  return ret;
}
int function(int *tab)
{
  *tab=10;
  return 0;
} 
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: smiechowiec »

Myślę, że warto dla osób które od niedawna programują w C wyjaśnić różnice w deklaracjach tablic jako parametrów funkcji.
Deklarcje funkcji
int f( int *tab)
int f( int tab[])
int f( int tab[30])
są prawie równoważne, a jako że w C nie ma potrzeby podawania ostatniego wymiaru tablicy przy wywołaniach funkcji zapisy int tab[] i int tab[30] są równoważne, bo w C zakresy tablic nie są sprawdzane.
Deklaracja int tab[30] może zwiększyć czytelność kodu.
Deklaracja int f( int *tab) choć może być wykorzystana identycznie, ale rózni się tym, że nazwa tablicy w C jest stałą czyli nie można do niej podstwić wartości innej tablicy czy wskaźnika, natomiast przy deklaracji wskaźnikowej, możemy pod tab podstawić tablicę czy inny wskaźnik.
W nagłówku funkcja może być zadeklarowana bez nazwy zmiennej więc poprawne jest również
int f( int (*));
czy
int f( int []);
ale jeśli w same funkcji nie podalibyśmy nazwy zmiennej wtedy nie będzie ona wprost dostepna dla kodu funkcji.
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: Rafal88K »

smiechowiec pisze:nie ma potrzeby podawania ostatniego wymiaru tablicy
Nie ma potrzeby podawanie skrajnego lewego czyli np.
t[][5][5][5]

[ Dodano: 3 Stycznia 2008, 13:10 ]
smiechowiec pisze:nie podalibyśmy nazwy zmiennej wtedy nie będzie ona wprost dostepna dla kodu funkcji.
W deklaracji możemy nie podawać jak w definicji podamy
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: kadiii »

To może w ramach dokończenia odnośnie tytułowego wskaźnika na tablicę.

Kod: Zaznacz cały

TYP (*wsk)[rozmiar] np. -> int (*wsk)[30]; 
Jest to wskaźnik na 30 elementowy blok po 4 bajty (sizeof(int)). Nie uzywa się go raczej do przesyłania tablicy do funkcji co wyglądałoby tak np.

Kod: Zaznacz cały

int fun(int (*wsk)[30])
. Ma on jednak inną funkcje. Umożliwa łatwe przeskoczenie wskażnikiem o dłuższy blok. Linijka cout
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[c] Przekazywanie wskaznika na tablice intow

Post autor: soku11 »

Hehe ;] Dzieki za wszelkie odpowiedzi POZDRO
ODPOWIEDZ