[C++] Sposób użycia tablicy

rafal9541
Użytkownik
Użytkownik
Posty: 63
Rejestracja: 31 sty 2012, o 20:38
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 11 razy
Pomógł: 1 raz

[C++] Sposób użycia tablicy

Post autor: rafal9541 »

Tworzę następujący kod, zawierający funkcję i tworzący nową tablicę:

Kod: Zaznacz cały

double* funkcja(double *t, int n)
{
     double*nowa=new double [n]
     for(int i=0;i<n;i++)
     nowa[i]=sqrt(t[i]);
   return nowa;
}
Chciałbym się dowiedzieć w jaki sposób mogę teraz działać na tej nowej tablicy w programie, czy odwoływać się do niej przez nazwę?
Ostatnio zmieniony 13 lis 2012, o 22:50 przez Afish, łącznie zmieniany 2 razy.
Powód: Poprawa wiadomości.
Awatar użytkownika
Gadziu
Użytkownik
Użytkownik
Posty: 653
Rejestracja: 7 lut 2009, o 21:08
Płeć: Mężczyzna
Lokalizacja: Warszawa\Radom
Podziękował: 90 razy
Pomógł: 48 razy

[C++] Sposób użycia tablicy

Post autor: Gadziu »

Do samej nowej tablicy stworzonej w funkcji nie możesz się odwoływać, możesz jedynie wywoływać funkcję w int'cie
pawellogrd
Użytkownik
Użytkownik
Posty: 844
Rejestracja: 19 lis 2009, o 15:03
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 121 razy
Pomógł: 156 razy

[C++] Sposób użycia tablicy

Post autor: pawellogrd »

Skoro zwracasz nową tablicę to może po prostu podstaw tą tablicę pod zmienną w odpowiednim miejscu programu i wtedy odwołuj się do tej zmiennej? Do tablicy się nie odwołasz jak kolega wyżej napisał, bo coś, co deklarujesz wewnątrz funkcji jest widzialne tylko wewnątrz tej funkcji, nie widać tego poza nią. Musisz zadeklarować tablicę poza funkcją (przed nią) lub właśnie wynik działania tej funkcji podstawić pod nową zmienną (tablicę), do której będziesz się dalej odwoływać.
abc666

[C++] Sposób użycia tablicy

Post autor: abc666 »

Zwróć jeszcze uwagę, że teraz Twoja funkcja zwraca double*, a nie double, więc musisz poprawić nagłówek.
rafal9541
Użytkownik
Użytkownik
Posty: 63
Rejestracja: 31 sty 2012, o 20:38
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 11 razy
Pomógł: 1 raz

[C++] Sposób użycia tablicy

Post autor: rafal9541 »

Dzięki bardzo, myślę że już wiem o co chodzi. Dobrze abc666 poruszyłeś wątek nagłówka double*, rzeczywiście masz rację, chociaż sam nie wiem dlaczego jest on konieczny. Tą gwiazdkę traktuję jako wskaźnik czyli coś do czego mogę się odwołać w programie, czy mógłbyś mi wytłumaczyć dlaczego tutaj musi zostać użyty?
pawellogrd
Użytkownik
Użytkownik
Posty: 844
Rejestracja: 19 lis 2009, o 15:03
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 121 razy
Pomógł: 156 razy

[C++] Sposób użycia tablicy

Post autor: pawellogrd »

Muszę jednak poprawkę napisać, dla kodu:

Kod: Zaznacz cały

double* funkcja(double *t, int n)
{
     double*nowa=new double [n]
     for(int i=0;i<n;i++)
     nowa[i]=sqrt(t[i]);
   return nowa;
}
nowa tablica tworzona jest za pomocą operatora new, więc pozostanie ona w pamięci do momentu skasowania jej przy pomocy delete. Nagłówek funkcji jest poprawny. Jak odwołać się do takiej tablicy w dalszym kodzie programu? Oto przykład:

Kod: Zaznacz cały

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

double* funkcja(double *t, int n)
{
   double*nowa=new double [n];
   for(int i=0;i<n;i++)
   nowa[i]=sqrt(t[i]);
   return nowa;
}
 
int main()
{
    double* tablica;
    double tab[3]={1.0,4.0,9.0};
    tablica=funkcja(tab,3);
    cout << tablica[0] << endl;
    cout << tablica[1] << endl;
    cout << tablica[2] << endl;
return 0;
}
Uruchomienie tego kodu da oczywiście wydruk na ekranie:

Kod: Zaznacz cały

1
2
3
abc666

[C++] Sposób użycia tablicy

Post autor: abc666 »

W c++ nazwę tablicy utożsamia się ze wskaźnikiem. Jeśli chcesz zwrócić tablicę to zwracasz wskaźnik. Jeśli zadeklarujemy sobie np.

double *tab = new double[5]; oraz double tab2[5];

późniejsze odwołania do tab i tab2 są identyczne. Jedyna różnica jest to, że w jednym przypadku ty musisz dbać o zwolnienie pamięci, a w drugim nie.

Musisz zdać sobie także sprawę, że
tab[2] jest tożsame z *(tab + 2)
Ukryta treść:    
Z uwagi na to musisz pamiętać, że nikt za ciebie nie sprawdzi czy twój indeks jest rzeczywiście elementem tablicy. Możesz się odwołać do tab[100] i jeśli nie spowoduje to błędu dostępu do pamięci to otrzymasz to co się znajduje w tym miejscu pamięci zintepretowane jako double.

edit
Nie rozumiem pytania jak się odwołać, skoro się odwołujesz i działa ?
ODPOWIEDZ