Salutare am o nelamurire in legatura cu functiile ce returneaza pointer catre un anumit tip de date …
De exemplu nu inteleg unde ar trebui sa fie greseala in acest cod
#include<stdio.h>
int *f1(int x, inty)
{
return (x+y);
}
int main()
{
int a=2,b=3,*s;
s=f1(a,b);
printf("%d",*s);
}
Te-as sfatui sa nu incerci asa ceva. Atat cei doi parametri cat si valoarea returnata se pun de obicei pe stiva (cu exceptii cand se opereaza cu registri). Valorile temporare pot fi pe stiva sau in ceva registri, se pot suprascrie. Daca tot vrei sa returnezi o adresa, ai putea sa aloci memorie in functie (dar atunci esti responsabil de eliberare dupa ce termini cu valoarea returnata). O alta metoda ar fi sa ai o valoare globala si sa returnezi pointer la valoarea aia, sau sa ai o valoare statica in functie cam asa:
static int val;
val = a + b;
return &val;
Nu vad de ce ai face asemenea lucruri in asemenea situatie. E inutil.
Nu e ca si cum vreau neaparat sa fac asta vreau doar sa inteleg mai bine termenul si problema e una didactica http://prntscr.com/jiqaxg , poti sa ma lamuresti de ce apare aceasta eroare , am inteles ca functia returneaza adresa a unei sume dintre doi intregi dar ce este gresit in ea
Ai putea sa faci conversia explicit la ‘(int*)’ ca sa scapi de eroarea la compilare, dar dupa aia o sa ai o surpriza cu ‘*s’. Dupa cum spuneam, nu e o idee buna. Incearca varianta din raspunsul meu anterior, daca tii mortis sa returnezi un pointer.
da chiar am inteles si am incercat ce ai zis , ideea e ca eu cautam o justificare pt acea eroare de compilare http://prntscr.com/jiqg47 de asta vroiam sa inteleg cum ar fi aratat codul corect cel mai apropiat de codul acesta , dar cred ca am gasit justificarea erorii ! Multumesc mult amandurora!
Pai justificarea e simpla, vrei sa returnezi un tip intreg in locul unei adrese. E adevarat ca pana la urma poti sa fortezi conversia, dar nu are prea mult sens in aceasta circumstanta.
Funcţia ta nu face decât să returneze rezultatul adunării, atât şi nimic mai mult. Întămplator, pointerii sunt şi ei un fel de integeri (pe 64 de biti, im cazuri programelor pe 64 de biti), din acest motiv nu primesti eroare de compilare acolo.
int f1(int *x, int *y)
{
return *x + *y;
}
int main()
{
/*int a = 2, b = 3, *s;
s = f1(a, b);
printf("%d", *s);*/
int x = 10;
int y = 20;
//initializez pointerii cu adresele variabilelor x si y de mai sus
int* a = &x;
int* b = &y;
int s = f1(a, b);
printf("%d", s);
_getche();
}
Sper sa fie mai clar. Cred ca este mai aproape de ceea ce voiai sa faci tu initial
#include <stdio.h>
#include <stdlib.h>
int *f1(int a, int b)
{
// se aloca memorie in heap
int *result = (int*)malloc(sizeof(int));
// se stocheaza rezultatul adunarii in heap
*result = a + b;
// se returneaza adresa memoriei unde este stocat
// rezultatul adunarii
return result;
}
int main()
{
int a = 2, b = 3, *s;
// atentie, aici se aloca memorie
// dupa ce terminam cu ea, trebuie dealocata
// alfel ne trezim cu celebrul memory-leak
s = f1(a, b);
printf("%d",*s);
// atentie, memoria trebuie dealocata
free(s);
return 0;
}
Desigur, in C++ se va folosi perechea de operatori new si delete sau new şi “smart pointer”.
Adica ce-i explicam mai sus in cuvinte. Apropo de smart pointers, nu mai e nevoie sa folosesti new, poti sa folosesti std::make_shared (sau std::make_unique, daca folosesti unique_ptr). Pentru cine are chef de asa ceva, se poate scrie un intreg program fara sa apara in el (m/c/re)alloc/free, new/delete.