Hogy tudok az egyik függvényből egy másikra hivatkozni? C++
Lehet, hogy hülyén tettem fel a kérdést.
De például van egy függvény, amiben kiszámolom számok összegét. (valamilyen ciklussal sum=sum+array[i])
És a következő függvényben hogyan tudom ezt felhasználni, ha az átlagot akarom kiszámolni? Mert ha írom, hogy
atlag=sum/10 (ha pl. 10 az elemek száma), akkor kiírja, hogy "atlag was not declared in this scope".
Hogyan kellene csinálni, hogy jó legyen?
Az “atlag” változód nincsen deklarálva az adott scopeban. Ennek több oka is lehet:
1) a függvényeden belül deklarálod, viszont azon kívül szeretnéd használni
2) nem is deklarálod
Próbáld meg így:
int atlag = sum / 10;
Előző vagyok.
Küldd el a kódod, és akkor hatékonyabban tudunk segíteni! :)
int main(){
int array[10];
int i;
int sum=0;
for (i=0; i<10; i++){
printf("%d. elem", i); scanf("%d", &array[i]);
sum=sum+array[i];
}
}
void atl(){
int atlag;
atlag=sum/10;
printf ("A számok átlaga: %d", atlag);
}
Itt számos probléma van.
1. Az összeget nem egy függvényben számolod ki, hanem a főprogramban
2. Az atl() függvényt meg sem hívod sehol (hogy értsd: amikor egy C++ programot futtatsz, akkor csak a főprogram (a main() függvény tartalma) fut le. A többi függvény hiába van ott, ha azok nincsenek sehol meghívva.
3. Az atl() függvény nem látja a sum változót, mivel nincs a scope-jában. Egy függvény kizárólag azokat a változókat látja, amik a függvényen belül lettek deklarálva, a függvény paramétereként lettek átadva, vagy globálisak (ilyet nem nagyon csinálunk).
A programot úgy lehetne pl megjavítani, hogy a sum kiszámolását kivezeted egy sum() függvénybe, az atl() függvényben meghívod a sum függvényt, pl így:
atlag = sum()/10;
Illetve a főprogramban meghívod az atl() függvényt:
int atlag = atl();
Így is elég rondácska a kód, de legalább működik, és azt csinálja amit kell.
Van egy-két furcsasága a programodnak, némelyiket már említették is a kollégák.
1. Ez egy C++ program, nem egészen érthető a printf(), scanf() alkalmazása, amikor semmiféle plusszal nem kecsegtet a cout és cin használatához képest.
2. Ha az atl()-t meghívnád is, a fordító a main() lefordításakor még nem tud róla, ezért reklamálni fog – ennek megfelelően vagy deklarálnod kell, hogy lesz ilyen nevű függvényed, vagy a main elé kell írnod.
3. Attól függetlenül, hogy a próbálkozás eleve működésképtelen, a szándékból kikövetkeztethető, hogy a sum egészváltozót osztanád egy másik egésszel. Ennek eredményeképpen nem az általános esetben törtszámot eredményező tényleges átlagot írná ki, hanem annak egészre kerekített értékét.
4. Az atl() függvénynek ebben a formában semmi értelme, csak fölöslegesen becsomagolod egyetlen művelet eredményének kiíratását. Tökéletesen helyettesítené pl. a
std::cout << "A számok átlaga: " << sum / 10 << '\n';
programsor. Mellesleg a függvény neve is megtévesztő, valójában semmiféle átlagot nem számol, csak egy osztást végez el. Rendesebben megfelelne a nevének, ha mondjuk a már feltöltött tömb címét és hosszát megkapva maga végezné el az összeadogatást is, az eredményt pedig visszaadná a main()-nek (vagy egyéb hívó programrésznek) – majd az kiírja, ha akarja.
5. Nem szerencsés a bűvös számok használata. A programod némi igazgatással, de remekül fut 10 elemű tömbök esetén, de ha pl. 15 eleműre akarod változtatni, máris két helyen át kell írnod a határértékeket. Ez nem nagy kunszt, de mi lesz, ha egy valahai százoldalas kódod 28 különféle tömbjének átlagait számolgatod majd? Mindegyikhez külön függvényt írsz? Érdemes arra törekedned, hogy a függvény általánosan oldja meg a feladatát, ne csak egy speciális esetben.
Az látszik, hogy nagyon az elején tartasz (vagyis még nálam is hátrább), ezért lehet, hogy egyszerre nem tudsz még mindent megcsinálni. Próbálkozni attól még érdemes, nagyon kevés kell csak, hogy a programod legalább ebben a változatában leforduljon.
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!