Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dynamiczne tworzenie tablic a dobre praktyki

Ostatnio zmodyfikowano 2014-01-12 15:32
Autor Wiadomość
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? 

C/C++
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.
P-101908
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.
C/C++
std::vector < int > zrobT()
{
    std::vector < int > t = { 1, 2, 3 };
    return t;
}

int main()
{
    auto t = zrobT();
}
P-101909
faoo
Temat założony przez niniejszego użytkownika
» 2014-01-12 11:34:51
Dzięki! Bardzo pomocne :)
P-101912
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ę:

C/C++
tbl = new int[ r ];

C/C++
* tbl = new int[ r ];

Kompilator nie pozwala konwertować *int na int...
P-101915
pekfos
» 2014-01-12 12:16:23
Przekazuj przez referencję, na przykład.

C/C++
* tbl = new int[ r ];
Kompilator nie pozwala konwertować *int na int...
Wtedy tbl musi być typu int**.
P-101920
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?

C/C++
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;
   
}
P-101936
Monika90
» 2014-01-12 14:28:18
[] ma wyższy priorytet niz *, więc pewnie chciałeś mieć
C/C++
for( int i = 0; i < r; i++ ) {
    ( * t )[ i ] = i + 2;
}
cout << "Wartosc tbl[0] wewn: " <<( * t )[ 0 ] << endl;
P-101939
faoo
Temat założony przez niniejszego użytkownika
» 2014-01-12 15:32:33
Rozumiem, bardzo dziękuję za pomoc :)
P-101968
« 1 »
  Strona 1 z 1