Zwracanie wskaźnika do tablicy

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.

4

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

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
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

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.

0

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

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?
}

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ę

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ę?

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.

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..

3
return **tabd;

nie zwracasz tablicy. Zwracasz pierwszy element pierwszej tablicy.

Jeśli chcesz zwrócić wskaźnik, zwracasz wskaźnik:

return tabd;

Tylko typ funkcji musi odpowiednio o tym mówić, że zwracasz wskaźnik.

Przekazywanie parametru przez wartość i referencję - przeczytaj, szczególnie ostatni przykład

0
kq napisał(a):
return **tabd;

nie zwracasz tablicy. Zwracasz pierwszy element pierwszej tablicy.

Jeśli chcesz zwrócić wskaźnik, zwracasz wskaźnik:

return tabd;

Tylko typ funkcji musi odpowiednio o tym mówić, że zwracasz wskaźnik.

Przekazywanie parametru przez wartość i referencję - przeczytaj, szczególnie ostatni przykład

Dzięki, chyba odkrywam amerykę na nowo
Czyli deklaruję funkcję

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

i potem w mainie

int **tablicad;
tablicad=tabd(tablica, n, s);
2

To wygląda sensownie, przynajmniej pod kątem samej tablicy.

0

I nawet działa, teraz to mi się wydaje tak oczywiste, że nie wiem jak mogłem tego od początku nie zrozumieć, tym bardziej, że w programie widziałem różnice pomiędzy wartością wskaźnika a jego adresem. Ale cóż, czasami jakoś mi tak mózg zamrozi. W każdym razie dzięki za pomoc.

1

Wskaźników ucz się w kontekście shared_ptr, unique_ptr i weak_ptr. Do kontenerów masz wektory, listy, kolejki, mapy, etc.

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