void zlosliwieZamienZawartosc(int tablica[],unsigned rozmiar) { int *podtablica=new int[rozmiar]; // nie możesz użyć sizeof() bo zwróci rozmiar taki jak sizeof(int*); for(int i=0;irozmiar;++i) // w for też nie możesz użyć sizeof() { podtablica[i]=tablica[i]; tablica[i]=0; } }
No dobra, ale jeśli bym miał przydzielony rozmiar dynamicznie, to jak mam sprawdzić długość tablicy?
Nie ma takiej możliwości.
Ale zawsze możesz użyć:
#include
Hm… a gdybym przechodził po wskaźnikach i sprawdzał na co on wskazuje albo jakoś tak?
– Dodane 21.05.2010 (Pt) 20:44 –
hmm… czy ktoś może mi wyjaśnić dlaczego jak przekaże tablicę do funkcji tablicę i spróbuję z nią zrobić coś takiego:
cout << sizeof(tablica)/sizeof(*tablica) << endl;
to mi nie działa, ale jeśli zadeklaruję tą tablicę
int tablica2[222];
cout << sizeof(tablica2)/sizeof(*tablica2) << endl;
to jest ok. Dlaczego?
– Dodane 21.05.2010 (Pt) 21:00 –
Tzn. przekazuję tablice do funkcji na zasadzie
void mojaFunkcja(int tablica) {
cout << sizeof(tablica)/sizeof(*tablica) << endl;
}
void main() {
// … kod
mojaFunkcja(tablica);
}
Ktoś ma jakieś na to wytłumaczenie?
Sprawdź jakiego typu jest coś co się kryje pod nazwą “tablica” w mainie, a jaki typ przyjmuje mojaFuncja jako argument.
Gdybyś przechodził po wskaźnikach i sprawdzał na co on wskazuje to byłoby jakoś tak - cokolwiek to znaczy.
Jeżeli poprawnie przekazujesz tablice do funkcji:
int *tablica
lub:
int tablica[]
to jest dokładnie tak jak wyjaśniłem w pierwszym poście:
// nie możesz użyć sizeof() bo zwróci rozmiar taki jak sizeof(int*); [/code]
czyli wyrażenie sizeof(tablica)/sizeof(*tablica) zawsze ma wartość 1.
Jeżeli funkcja przyjmuje argument:
int tablica, to nie ma mowy o przekazaniu tablicy, co najwyżej jednego jej elementu i to przez wartość.
“Nie przechodzi” w tym fragmencie operator wyłuskania:
*tablica
który ma za zadanie wyłuskać obiekt z jego adresu, ponieważ tablica nie jest adresem to akurat tu kompilator się załamuje.