Lehetséges ilyen függvényeket írni c-ben?
Létezik olyan függvény, mely több értéket ad vissza.
Eddig olyanokat tanultunk, melyeknek csak egy visszatérési értéke van (pl kiszámolja két szám összegét és az összeggel tér vissza).
Lehet olyan csinálni, hogy akár 3 értékkel térjen vissza egyszerre? Olvasgattam angol fórumokat, de ott pointerekkel oldották meg olyat meg még nem tanultunk.
Pl return a, b, c;
A másik kérdésem, hogy van-e olyan függvény, aminek bemeneti paramétere egy másik függvény?
pl float atlag(int osszeg(int a; int b))
{
....
return atlag;
}
A visszatérési értékben csak egy valami lehet. A szokásos módszer a paraméterként átadott mutató (pointer). Van lehetőség arra a static kulcsszóval hozz létre tömböt és azt add vissza vagy egy struktúrába rakd az értékeket, de mind a kettő módszerrel vannak problémák.
A static tömb minden alkalommal felülíródik amikor meg lesz hívva, nem biztonságos a használata. Sok régebbi fordító pedig nem támogatja a regiszternél nagyobb méretű adatok visszatérését, így a legtöbb struktúráét sem. Modern fordítók már memcpy-vel lemásolják az adatot, de ezt nem lehet általánosságban elmondani, jobb nem használni.
Jó hír viszont hogy használtál már pointert, és pointert váró függvényt! Erre jó példa a scanf(). Van visszatérési értéke, de amellett a paraméterben átadott változókat tölti inkább fel, például:
int szam1, szam2;
//scanf visszateresi erdeke a sikeresen beolvasott adatok szama
if(scanf("%d %d", &szam1, &szam2) != 2)
. . print("Nem sikerult a beolvasas!\n");
Mutatok példát a static tömb hibájára is és arra, hogy mennyivel egyszerűbb pointereket használni:
#include <stdio.h>
//osszeg es szorzat visszaadasa tombbel
int* osszegSzorzat1(int a, int b) {
. . static int ret[2];
. . ret[0] = a + b;
. . ret[1] = a * b;
. . return ret;
}
//a pointeres valtozat
void osszegSzorzat2(int a, int b, int* osszeg, int* szorzat) {
. . *osszeg = a + b;
. . *szorzat = a * b;
}
int main(void) {
. . int* ret1 = osszegSzorzat1(2, 3);
. . int* ret2 = osszegSzorzat1(3, 4); //felülírja a ret1-et!!
. . printf("Osszeg1: %d, Szorzat1: %d\n", ret1[0], ret1[1]); //7, 12
. . printf("Osszeg2: %d, Szorzat2: %d\n", ret2[0], ret2[1]); //7, 12
. . int osszeg, szorzat;
. . osszegSzorzat2(4, 5, &osszeg, &szorzat);
. . printf("Osszeg3: %d, Szorzat3: %d\n", osszeg, szorzat); //9, 20
. . return 0;
}
Végül pedig igen, át lehet adni függvényt is paraméterként:
int osszeg(int a, int b) {
. . return a + b;
}
float atlag(int (*fuggveny)(int,int), int a, int b) {
. . return (*fuggveny)(a, b) / 2.0f;
}
int main(void) {
. . printf("Atlag: %f\n", atlag(&osszeg, 4, 6));
. . return 0;
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!