#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;
}
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
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?
@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...
Ja jeszcze dodam, że w linijce: if(tab[i]%2==0)
masz UB, bo wartości w tej tablicy są nieustalone (śmieci ze sterty).
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?
napisz po polsku co Ty chcesz osiagnac. jezeli poprzednie odpowiedzi nie pomagaja.
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 ?
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.
No jak najbardziej sie zgadzam ale co z tym "Tablice stworzyc w wewnatrz funkcji i (odebrac ja jako argument od funkcji poprzez wskaznik)."
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;
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ć.