Odebranie argumentu z funkcji poprzez wskaznik

0
#include <iostream>

using namespace std;

int* utworz(int rozmiar)
{
    int *tab=new int [rozmiar];
    for (int i = 0; i<rozmiar ; i++)
    if(tab[i]%2==0)
    {
        tab[i]=i*2;
    }
    else
    {
        tab[i]=i-1;
    }
    return tab;
}

int main()
{
    //int *wsk=utworz; Probowalem  stworzyc wskaznik ktory pokazuje na adres funkcji a pozniej wyswietlic to co funkcja zrobila za pomoca tego wskaznika cout << *wsk; (Niestety ten zapis int *wsk=utworz;  jest niepoprawny nie wiem dlaczego ;(
    utworz(n);


    return 0;
}

 
0

Poczytaj jak zapisuje się wskaźniki na funkcje w C++, a nie zgaduj.
No dobra, sam już nie wiem, co próbujesz zrobić.
int *wsk = utworz(10);? :P

0

Nie no, funkcja sama w sobie jest prawidłowa.
Ty coś kombinujesz i psujesz pewnie ;P.
A wskaźniki na funkcje to najprosciej, bez zabawy w wskaźniki.

int x(int y)
{}
std::function<int(int)> func = std::bind(x, std::placeholders::_1);
// btw. gdzieś na forum przeczytałem, że bind to ZUO, dlaczego?
0

@balti chcesz wskaźnik do funkcji (żeby potem przekazać tą funkcję do innej funkcji na przykład) czy chcesz WYWOŁAĆ funkcje, która akurat przypadkiem zwraca wskaźnik? Bo to różnica jak między krzesłem a krzesłem elektrycznym...

Wywołanie wymaga użycia nawiasów...

0

Ja jeszcze dodam, że w linijce: if(tab[i]%2==0) masz UB, bo wartości w tej tablicy są nieustalone (śmieci ze sterty).

0

Chcialem zrobić funkcje (która akurat przypadkiem zwraca wskaźnik) ale ktos mi powiedzial ze dopiero jak ta funkcje przypisze w mainie do jakiejs zmiennej pomocniczej to moge ja zwrocic?

1

napisz po polsku co Ty chcesz osiagnac. jezeli poprzednie odpowiedzi nie pomagaja.

0

Ogolnie chcialem zaimplementowac funkcje ktora wypelnia tablice (t) o rozmiarze (n) w nastepujacy sposob: jesli indeks jest liczba parzysta to do tablicy o tym indeksie przypisac podwojona wartosc indeksu, w przeciwnym razie pomniejszona o 1 . Tablice stworzyc w wewnatrz funkcji i odebrac ja jako argument od funkcji poprzez wskaznik.

Piszac to teraz wydaje mi sie ze najpierw powinnienem sobie wypelnic tablice w tej funkcji liczbami naturlnymi a potem sprawdzic za pomoca petli te warunki ?

0

Powinieneś wypełniać po prostu odpowiednio - co drugi element wartością indeksu pomniejszoną o 1, a co drugi podwojoną wartością.
I uwaga, jeśli blok ma więcej niż 2 -3 linie - stosuj klamry, bo inaczej ciężko będzie ci namierzać błędy.

0

No jak najbardziej sie zgadzam ale co z tym "Tablice stworzyc w wewnatrz funkcji i (odebrac ja jako argument od funkcji poprzez wskaznik)."

1

Przykładowe 2 rozwiązania:

1:
Tutaj deklarujesz wskaźnik już w main() i wysyłasz go jako argument do funkcji, gdzie zostanie stworzona tablica o pierwszym elemencie na definiowanym w funkcji wskaźniku. Ważne abyś wskaźnik wysyłał właśnie przez referencję.

 #include <iostream>

#define ROZMIAR 10

using namespace std;

void funkcja1(int *&wsk1, int rozmiar){
    wsk1 = new int [10];
    for(int i = 0; i < rozmiar; i++){
        if(i % 2 == 0) //parzysty index
            wsk1[i] = i*2;
        else if(i % 2 == 1) //w tym wypadku jednoznaczne z samym else
            wsk1[i] = i-1;
    }
}

int main()
{
    int *wsk1;
    funkcja1(wsk1, ROZMIAR);
    for(int i = 0; i < ROZMIAR; i++)
        cout << wsk1[i] << endl;
    
   
   return 0;
}

2:
Tutaj definiujesz funkcję, która zwraca wskaźnik na int'a. W funkcji alokujesz pamięć na tablicę, a jej pierwszy index przypisujesz do wskaźnika, który jest wewnątrz funkcji. Potem zwracasz ten wskaźnik. W main() definiujesz od razu wskaźnik na to, co zwróciła Ci funkcja.

 #include <iostream>

#define ROZMIAR 10

using namespace std;

int *funkcja1(int rozmiar){
    int *wsk1 = new int [10];
    for(int i = 0; i < rozmiar; i++){
        if(i % 2 == 0) //parzysty index
            wsk1[i] = i*2;
        else if(i % 2 == 1) //w tym wypadku jednoznaczne z samym else
            wsk1[i] = i-1;
    }
    return wsk1;
}

int main()
{
    int *wskMain = funkcja1(ROZMIAR);
    for(int i = 0; i < ROZMIAR; i++)
        cout << wskMain[i] << endl;
        
   return 0;
}


Jak już było powiedziane, podczas przypisywania wartości do elementów funkcji powinieneś odnosić się (porównywać) index tablicy, bo to jest to, co właśnie chciałeś zrobić.
Dodatkowo w funkcji dodałem to, co według Ciebie ta funkcja powinna robić.

Po zakończeniu korzystania z tablicy dealokujemy pamięć:

 delete [] wsk1;
 delete [] wskMain;
1

Generalnie to parę dni temu był podobny temat.
Dokładnie: http://4programmers.net/Forum/C_i_C++/250352-pytania_zaimplementowac_funkcje_c++?p=1130664#id1130664
@kaczus powinien pamiętać, a autor lepiej szukać.

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