Zwracanie wskaźnika do tablicy

Odpowiedz Nowy wątek
2018-03-19 00:49
0

Cześć, jestem na etapie poznawania wskaźników i ich używania w dynamicznych tablicach, mam pewien problem, pewnie dość banalny dla większości.
Otóż piszę pewien program na zaliczenie i nie wiem w jaki sposób skorzystać z tablicy utworzonej w funkcji, do której zwróciłem wskaźnik. Dla przykładu dam swoją funkcję (nieistotne co ona robi)

int tabd(const int *tab, const int &n, const double &s) {
    int **tabd;
    tabd = new int *[n];
    for (int i = 0; i < n; i++){
        tabd[i] = new int[2];
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < 2; j++) {
            if (tab[i] < s) {
                tabd[i][0] = tab[i];
                tabd[i][1] = 0;
            }
            else {
                tabd[i][0] = 0;
                tabd[i][1] = tab[i];
            }
            cout << tabd[i][j] << " ";
        }
        cout << endl;
        }

    return **tabd;
}

Teraz chciałbym użyć tej tablicy (tabd), żeby np. w innej fukncji void wyczyścić pamięć, którą zajęła. W jaki sposób mogę to zrobić?
Próbowałem utworzyć wskaźnik w mainie i przypisać mu wartość tej funkcji ale wyrzuca błąd.

Może pokaż, jak próbowałeś. - Silv 2018-03-19 00:51

Pozostało 580 znaków

2018-03-19 00:53
4

void **tabd(const int *tab, const int &n, const double &s)
oraz
return tabd;


Pozostało 580 znaków

2018-03-19 01:07
0
pingwindyktator napisał(a):

void **tabd(const int *tab, const int &n, const double &s)
oraz
return tabd;

"E0311 nie można przeciążyć funkcji różniących się tylko typem zwracanej wartości"

Próbowałem na przykład zadeklarować sobie wskaźnik int **tablicad i do niego przypisać wartość z funkcji, ale no to też nie działa

tablicad = tabd(tablica, n, s);

Nie wiem w jaki sposób mogę użyć tej tablicy w mainie, albo odnieść się do niej w innej funkcji.

Cały kod: https://ideone.com/lsrWMS
edytowany 1x, ostatnio: skillz, 2018-03-19 01:12

Pozostało 580 znaków

2018-03-19 01:32
kq
1

"E0311 nie można przeciążyć funkcji różniących się tylko typem zwracanej wartości"

To tego nie rób...

W pokazanym kodzie w ogóle nie zastosowałeś się do rad @pingwindyktator


Pozostało 580 znaków

2018-03-19 01:51
0
kq napisał(a):

"E0311 nie można przeciążyć funkcji różniących się tylko typem zwracanej wartości"

To tego nie rób...

W pokazanym kodzie w ogóle nie zastosowałeś się do rad @pingwindyktator

Wrzuciłem pierwotny kod, dlatego, że to mi po prostu nie działa, wyświetla błąd napisany wyżej już podczas samej deklaracji funkcji. Siedzę na tym już jakiś czas i trochę utknąłem.

Pozostało 580 znaków

2018-03-19 01:52
kq
0

Nie widząc kodu, z którym masz problem, nie możemy udzielić pomocy. Co do kodu zamieszczonego, rady od @pingwindyktator są dobre.


Pozostało 580 znaków

2018-03-19 02:21
0

Możliwe, że są dobre ale ja nie wiem jak się do nich zastosować. Powiedzmy deklaruje te funkcje

void **tabd(const int *tab, const int &n, const double &s){
<tu jakiś kod>
return tabd;
}

Tylko co ona mi daje? Mam już tablicę tabd którą utworzyłem w innej funkcji, ale w jaki sposób mam się do niej odnieść w mainie?
Przykładowo wcześniej utworzyłem tablice w main

int main(){
int *tablica;
cout << "podaj ilosc elementow tablicy: ";
    cin >> n;
tablica = new int[n];

i wtedy mogę bez problemu używać jej w innych funkcjach

stworz(n, tablica);
o = odchylenie(tablica, n, s);
nowatab(tablica, n, s, o);
i tak dalej..

Nie wiem tylko w jaki sposób odnieść się do tej tablicy którą utworzyłem w tej funkcji. Czy mogę ją jakiś przypisać do innego wskaźnika w mainie, żeby później dopisać go do wywołania funkcji?

int tabd(const int *tab, const int &n, const double &s) {
int **tabd;
<kod>
return **tabd;
}
int main(){
[..]
tabd(tablica, n, s); <--- w jaki sposób tego użyć, żeby wykorzystać w nowej funkcji?
}

Pozostało 580 znaków

2018-03-19 02:24
kq
2

Zakładam, że to mogę pominąć, bo wskaźniki, new i delete muszą zostać użyte.

Przede wszystkim, mylnie zakładasz, że jeśli nazwiesz dwie różne zmienne (albo jeszcze lepiej: zmienną i funkcję) tak samo, to będzie to ten sam byt. Tak nie jest. Jeśli chcesz przekazać tablicę do funkcji to musisz ją przekazać. Jeśli chcesz tablicę z funkcji zwrócić, to musisz ją zwrócić. Być może to pomoże: Przekazywanie parametru przez wartość i referencję


Pozostało 580 znaków

2018-03-19 02:47
0
kq napisał(a):

Zakładam, że to mogę pominąć, bo wskaźniki, new i delete muszą zostać użyte.

Przede wszystkim, mylnie zakładasz, że jeśli nazwiesz dwie różne zmienne (albo jeszcze lepiej: zmienną i funkcję) tak samo, to będzie to ten sam byt. Tak nie jest. Jeśli chcesz przekazać tablicę do funkcji to musisz ją przekazać. Jeśli chcesz tablicę z funkcji zwrócić, to musisz ją zwrócić. Być może to pomoże: Przekazywanie parametru przez wartość i referencję

Wiem, że tak nie jest. Zresztą w tym moim kodzie czasem nazwy się nie pokrywają, chociaż fakt, że zazwyczaj nazywam je tak samo, bo po prostu jest to dla mnie bardziej czytelne. Rozumiem już (przynajmniej tak mi się wydaje) jak działa przekazywanie przez referencje czy wartość.
Czy chodzi o to, że przy zwróceniu wskaźnika do tablicy **tabd nie mogę się do niej już odnieść w innej funkcji? Muszę utworzyć i zwrócić całą tablicę?

Pozostało 580 znaków

2018-03-19 02:49
kq
1

Potocznie zwrócenie wskaźnika na pierwszy element jest rozumiane jako zwrócenie tablicy, więc zbytnio nie wiem co masz na myśli.


Pozostało 580 znaków

2018-03-19 02:57
0

Też tak myślałem, ale po tych odpowiedziach czuje się zbity z tropu. Skoro zwróciłem wskaźnik do tablicy to dlaczego nie mogę go przypisać do innego wskaźnika zadeklarowanego w mainie? Tak chciałem zrobić na samym początku, a później w innej funkcji użyć tego wskaźnika i działać na tej tablicy..

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0