| ZER DAKIDAN: Hainbat funtzio estandar ikasi dut eta badakit datu bat edo batzuk emanik emaitza itzultzen dutela. Esate baterako, fabs() funtzioak zenbakizko datu baten balio absolutua itzultzen du eta pow() funtzioak bi zenbaki behar ditu potentzia kalkulatu eta itzultzeko. ZER IKASIKO DUDAN: Funtzio estandarrak oso interesbarriak izanik, orain ikasiko dut nere funtzioak programatzen eta hartuko dudan lehen zeregina da parametroak zer diren ikastea. |
Funtzioaren parametroak balioaren arabera edo erreferentziaren arabera igaro daitezke. Hau da, funtzio bati dei egiten zaionean, balioak edo erreferentziak izan daitezke uneko parametroak.
Hau garrantzitsua da
Parametroak balioz pasatzeak esan nahi du uneko parametroak dagozkien parametro formaletan kopiatzen direla, ekintza hori automatikoki egiten da, eta, beraz, ez dira aldatzen uneko parametroak. Parametroak balioz pasatzen dira sarrerako parametroak direnean. Ikusi BatuketaEgin() izeneko funtzioa hurrengo Ariketa-37a programan. |
Hau garrantzitsua da
Parametroak erreferentziaz pasatzeak esan nahi du transferitutakoa ez direla balioak, baizik eta balio horiek dituzten aldagaien helbideak, eta, beraz, uneko parametroak alda daitezke. Parametroak erreferentziaz pasatzen dira irteerako parametroak direnean (zehatzago hitz eginez sarrera/irteerako parametroak direnean). Ikusi BaturaLortu() izeneko funtzioa Ariketa-37b delako programan. |
Ondoko bi programa hauek ikusi eta aztertu BatuketaEgin() izeneko funtzioa eta BaturaLortu() funtzioa. Biek bi daturen batura kalkulatzen dute baina bakoitzak dituen parametroen jokamoldea desberdina da:
/* Ariketa-37a_FuntzioarenParametroak: balioz */
// Zenbaki osoekin lan eginez, main() funtzio nagusian bi kopuru
// irakurri ondoren funtzio honi deia egin:
// - BatuketaEgin() funtzioaren bidez bi datuen batura lortu
#include <stdio.h>
int BatuketaEgin(int, int); // funtzioaren prototipoa
int main()
{
int iZbk1, iZbk2, iBatura;
int *pErakuslea; // oso bati seinalatzen dion erakuslea
// oso baten helbidea gordetzeko aldagaia
printf("\n");
printf("\n Zenbaki osoekin lan eginez...\n\n");
printf(" Lehen batugaiaren balioa sartu: ");
scanf("%d", &iZbk1);
printf(" Bigarren batugaiarena eman ere: ");
scanf("%d", &iZbk2);
pErakuslea = &iZbk1;
printf("\n===============================");
printf("\n iZbk1=%d \t *pErakuslea=%d", iZbk1, *pErakuslea);
printf("\n===============================\n");
iBatura = BatuketaEgin(iZbk1, iZbk2); // uneko parametroak
printf("\n 'BatuketaEgin()' funtzioari deia egin ondoren:");
printf("\n\t (%d) + (%d) = %d", iZbk1, iZbk2, iBatura);
printf("\n\n");
return 0;
}
// Bi parametroetatik biak sarrerakoak dira
int BatuketaEgin(int iZenbakia1, int iZenbakia2) // parametro formalak
{
return(iZenbakia1 + iZenbakia2);
}
Hona hemen Ariketa-37a_FuntzioarenParametroak.pas proiektuaren azalpenak:
- BatuketaEgin() izeneko funtzioaren bi sarrerak int datu-motakoak dira izanik, eta funtzioak beste int bat itzultzen du return aginduari esker
- pErakuslea aldagaia int bati seinalatzen dion erakuslea da, edo beste modu batez esanik int baten helbidea gordetzeko gaitasuna duen aldagaia da
- pErakuslea aldagaian iZbk1 aldagaiaren helbidea gordetzean, iZbk1 aldagaiaren edukia bi moduz eskura daiteke:
- Aldagaiaren iZbk1 identifikadorearen bitartez
- Aldagai-erakuslearen bitartez, erakuslearen *pErakuslea erakutsia idatziz
/* Ariketa-37b_FuntzioarenParametroak: erreferentziaz */
// Zenbaki osoekin lan eginez, main() funtzio nagusian bi kopuru
// irakurri ondoren funtzio honi deia egin:
// - BaturaLortu() funtzioaren bidez bi datuen batura lortu
#include <stdio.h>
void BaturaLortu(int, int, int *); // funtzioaren prototipoa
int main()
{
int iZbk1, iZbk2, iBatura;
int *pErakuslea; // oso bati seinalatzen dion erakuslea
// oso baten helbidea gordetzeko aldagaia
printf("\n");
printf("\n Zenbaki osoekin lan eginez...\n\n");
printf(" Lehen batugaiaren balioa sartu: ");
scanf("%d", &iZbk1);
printf(" Bigarren batugaiarena eman ere: ");
scanf("%d", &iZbk2);
pErakuslea = &iZbk2;
printf("\n===============================");
printf("\n iZbk2=%d \t *pErakuslea=%d", iZbk2, *pErakuslea);
printf("\n===============================\n");
BaturaLortu(iZbk1, iZbk2, &iBatura); // uneko parametroak
printf("\n 'BaturaLortu()' funtzioari deia egin ondoren:");
printf("\n\t (%d) + (%d) = %d", iZbk1, iZbk2, iBatura);
printf("\n\n");
return 0;
}
// Hiru parametroetatik lehen biak sarrerakoak dira eta hirugarrena irteerakoa
void BaturaLortu(int iZenbakia1, int iZenbakia2, int *iKalkulua) // parametro formalak
{
*iKalkulua = iZenbakia1 + iZenbakia2;
}
Hona hemen Ariketa-37b_FuntzioarenParametroak.pas proiektuaren azalpenak:
- BaturaLortu() izeneko funtzioaren bi sarrerak int datu-motakoak dira izanik eta hirugarren parametroa int bati seinalatzen dion erakuslea denez irteerakoa izango da
- pErakuslea aldagaia int bati seinalatzen dion erakuslea da, edo beste modu batez esanik int baten helbidea gordetzeko gaitasuna duen aldagaia da
- pErakuslea aldagaian iZbk2 aldagaiaren helbidea gordetzean, iZbk2 aldagaiaren edukia bi moduz eskura daiteke:
- Aldagaiaren iZbk2 identifikadorearen bitartez
- Aldagai-erakuslearen bitartez, erakuslearen *pErakuslea erakutsia idatziz
Jakin badakigu aldagai bat memoriako zati bat dela eta identifikadore bati esker eskura dezakegula bai bere edukia eta bai aldagaiaren helbidea memorian. Hona hemen 37c_AldagaienHelbideak.cbp proiektua zeinek hainbat aldagaien edukiak eta helbideak erakusten dituen (programa hau konpilatzean ager daitezkeen abisuei jaramonik ez egin):
/* Ariketa-37c_AldagaienHelbideak: aldagaien helbideak pantailaratzen */
// Aldagaien helbideak erakusten dituen adibidea, 6 datu-mota:
// int, short, long, float, double eta char.
#include <stdio.h>
int main()
{
int iZbk4 = 4;
int iZbk3 = 3;
int iZbk2 = 2;
int iZbk1 = 1;
printf("\n");
printf("Int ---> %d byte\n", (int)sizeof(int));
printf("\tiZbk1=%d eta &iZbk1=%d\n", iZbk1, (int)&iZbk1);
printf("\tiZbk2=%d eta &iZbk2=%d\n", iZbk2, (int)&iZbk2);
printf("\tiZbk3=%d eta &iZbk3=%d\n", iZbk3, (int)&iZbk3);
printf("\tiZbk4=%d eta &iZbk4=%d\n", iZbk4, (int)&iZbk4);
short shZbk1 = 1;
short shZbk2 = 2;
short shZbk3 = 3;
short shZbk4 = 4;
printf("\n");
printf("Short ---> %d byte\n", (int)sizeof(short));
printf("\tshZbk1=%d eta &shZbk1=%d\n", shZbk1, (int)&shZbk1);
printf("\tshZbk2=%d eta &shZbk2=%d\n", shZbk2, (int)&shZbk2);
printf("\tshZbk3=%d eta &shZbk3=%d\n", shZbk3, (int)&shZbk3);
printf("\tshZbk4=%d eta &shZbk4=%d\n", shZbk4, (int)&shZbk4);
long lZbk1 = 1;
long lZbk2 = 2;
long lZbk3 = 3;
long lZbk4 = 4;
printf("\n");
printf("Long ---> %d byte\n", (int)sizeof(long));
printf("\tlZbk1=%ld eta &lZbk1=%d\n", lZbk1, (int)&lZbk1);
printf("\tlZbk2=%ld eta &lZbk2=%d\n", lZbk2, (int)&lZbk2);
printf("\tlZbk3=%ld eta &lZbk3=%d\n", lZbk3, (int)&lZbk3);
printf("\tlZbk4=%ld eta &lZbk4=%d\n", lZbk4, (int)&lZbk4);
float fZbk1 = 1.1;
float fZbk2 = 2.2;
float fZbk3 = 3.3;
float fZbk4 = 4.4;
printf("\n");
printf("Float ---> %d byte\n", (int)sizeof(float));
printf("\tfZbk1=%.1f eta &fZbk1=%d\n", fZbk1, (int)&fZbk1);
printf("\tfZbk2=%.1f eta &fZbk2=%d\n", fZbk2, (int)&fZbk2);
printf("\tfZbk3=%.1f eta &fZbk3=%d\n", fZbk3, (int)&fZbk3);
printf("\tfZbk4=%.1f eta &fZbk4=%d\n", fZbk4, (int)&fZbk4);
double dZbk1 = 1.1;
double dZbk2 = 2.2;
double dZbk3 = 3.3;
double dZbk4 = 4.4;
printf("\n");
printf("Double ---> %d byte\n", (int)sizeof(double));
printf("\tdZbk1=%.1lf eta &dZbk1=%d\n", dZbk1, (int)&dZbk1);
printf("\tdZbk2=%.1lf eta &dZbk2=%d\n", dZbk2, (int)&dZbk2);
printf("\tdZbk3=%.1lf eta &dZbk3=%d\n", dZbk3, (int)&dZbk3);
printf("\tdZbk4=%.1lf eta &dZbk4=%d\n", dZbk4, (int)&dZbk4);
char cKar1 = 'A';
char cKar2 = 'B';
char cKar3 = 'C';
char cKar4 = 'D';
printf("\n");
printf("Char ---> %d byte\n", (int)sizeof(char));
printf("\tcKar1=%c eta &cKar1=%d\n", cKar1, (int)&cKar1);
printf("\tcKar2=%c eta &cKar2=%d\n", cKar2, (int)&cKar2);
printf("\tcKar3=%c eta &cKar3=%d\n", cKar3, (int)&cKar3);
printf("\tcKar4=%c eta &cKar4=%d\n", cKar4, (int)&cKar4);
}
Ikusi adibide honetan sarrerako parametroen eta irteerako parametroen arteko aldeak:
|


iruzkinik ez:
Argitaratu iruzkina