faoo Temat założony przez niniejszego użytkownika |
Dynamiczne tworzenie tablic a dobre praktyki » 2014-01-12 11:11:53 Witam, piszę w PHP, na uczelni mamy C++. Mam dość podstawowy problem i PHPowe przyzwyczajenia. Sporo czasu posiedziałem nad tym i nic sensownego. Cel: tworzenie funkcją tablicy o nieznanym wcześniej rozmiarze i zwracanie tablicy innym sposobem niż przez wartość. Zwrócić można coś innego np. jej wielkość, bool'a. Realizacja: przekazanie wskaźnika? Napisałem poniższe, ale chyba to 'głupoty'. Wygląda, że wskaźnik traci dostęp do pamięci alokowanej przez funkcję, adresu sterty? Dlaczego? int main() { int * tbl; int MAX = zrobT( tbl ); cout << "Wiekosc tablicy: " << MAX << endl; cout << "Wartosc tbl[0] zewn: " << tbl[ 0 ] << endl; }
int zrobT( int * tbl ) { cout << "Podaj rozmiar tablicy: "; int r; cin >> r; tbl = new int[ r ]; for( int i = 0; i < r; i++ ) { tbl[ i ] = i + 2; } cout << "Wartosc tbl[0] wewn: " << tbl[ 0 ] << endl; return r; }
A może lepiej przez referencję, ale jak? Będę wdzięczny za pokazanie dobrej praktyki w takiej sytuacji. |
|
Monika90 |
» 2014-01-12 11:20:11 Wygląda, że wskaźnik traci dostęp do pamięci alokowanej przez funkcję, adresu sterty? Dlaczego? |
Bo w funkcji zrobT modyfikujesz lokalną kopię wskaźnika, te modyfikacje nie będą odzwierciedlone w funkcji main. Będę wdzięczny za pokazanie dobrej praktyki w takiej sytuacji. |
std::vector < int > zrobT() { std::vector < int > t = { 1, 2, 3 }; return t; }
int main() { auto t = zrobT(); }
|
|
faoo Temat założony przez niniejszego użytkownika |
» 2014-01-12 11:34:51 Dzięki! Bardzo pomocne :) |
|
faoo Temat założony przez niniejszego użytkownika |
» 2014-01-12 11:49:36 Jeszcze jedno, jak operować na wskaźniku, a nie jego lokalnej kopii w tej funkcji? Jeśli zmienię: Kompilator nie pozwala konwertować *int na int... |
|
pekfos |
» 2014-01-12 12:16:23 Przekazuj przez referencję, na przykład. Kompilator nie pozwala konwertować *int na int... |
Wtedy tbl musi być typu int**. |
|
faoo Temat założony przez niniejszego użytkownika |
» 2014-01-12 14:15:52 Dzięki, czyli robię w funkcji zrobT wskaźnik do wskaźnika. Nie jest to łatwe, pogubiłem się. Po próbach dotarłem do miejsca, w którym kompiluje się, dochodzi do wywołania funkcji zrobT. Po podaniu liczby się zawiesza, potem zwraca 255. Jak to powinna wyglądać? Co się dzieje w środku z referencjami, wskaźnikami? int zrobT( int ** t ) { cout << "Podaj rozmiar tablicy: "; int r; cin >> r; * t = new int[ r ]; for( int i = 0; i < r; i++ ) { * t[ i ] = i + 2; } cout << "Wartosc tbl[0] wewn: " << t[ 0 ] << endl; return r; }
int main() { int * tbl; int MAX = zrobT( & tbl ); cout << "Wiekosc tablicy: " << MAX << endl; cout << "Wartosc tbl[0] zewn: " << tbl[ 0 ] << endl; }
|
|
Monika90 |
» 2014-01-12 14:28:18 [] ma wyższy priorytet niz *, więc pewnie chciałeś mieć for( int i = 0; i < r; i++ ) { ( * t )[ i ] = i + 2; } cout << "Wartosc tbl[0] wewn: " <<( * t )[ 0 ] << endl;
|
|
faoo Temat założony przez niniejszego użytkownika |
» 2014-01-12 15:32:33 Rozumiem, bardzo dziękuję za pomoc :) |
|
« 1 » |