5d. Pointers naar functies

2021-02-19
slides.com/jod/pt_5d

Docent: Jo Devriendt

Assistent: Ann Philips

Coördinator: Joost Vennekens

voornaam.achternaam@kuleuven.be

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Terminologie:
subroutine, functie, procedure

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

  • Subroutine: stuk code dat je kunt oproepen via een naam
  • Functie: subroutine die waarde teruggeeft
  • Procedure: subroutine die geen waarde teruggeeft
  • Sommige mensen gebruiken alles door elkaar (*kuch*)
    •  deze presentatie en hst 5.8 gaan eigenlijk over pointers naar subroutines (dus zowel procedures als functies)

Functies hebben adres

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

lagere adressen
hogere adressen

instructies in de executable

heap

 

...
 


stack

statische data

command line argumenten

Daar ergens...

Pointers naar functies

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

#include <stdio.h>
#define PI 3.14159

double omtrek(double r) {
  return 2*PI*r;
}

double oppervlak(double r) {
  return PI*r*r;
}

void main() {
  double straal = 10;
  
  double (*fptr)(double);
  
  fptr=omtrek;
  printf("Omtrek: %lf\n",
    fptr(straal));
  
  fptr=oppervlak;
  printf("Oppervlak: %lf\n",
    fptr(straal));
}

Toekenning: naam van bestaande functie met gepast prototype

Declaratie:

output type 
(*naam)
(types argumenten)

Oproep: zoals elke functie

Gedraagt zich zoals andere variabelen

Haakjes zijn belangrijk

Nut van functiepointers?

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

  • Functies kunnen nuttige data-elementen zijn, die opgeslagen en doorgegeven moeten worden
  • Asynchroon programmeren met callbacks (cfr. Javascript)
  • Functioneel programmeren
    • bvb. map, filter in Python
#include <stdio.h>
#define N 5

void sorteer(int a[], int n, int (*cmp)(int, int)) {
  // ...
}

int kleinerDan(int x, int y) {
  return x<y;
}

int delerVan(int x, int y) {
  return x%y==0;
}

void main() {
  int a[N] = {6,5,4,3,2};
  // ...
  sorteer(a,N,delerVan);
  // ...
  sorteer(a,N,kleinerDan);
}

Samenvatting

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

  • Het kan handig zijn om functies als data te behandelen
  • Een functiepointer is een variabele die naar het adres van een functie wijst
  • Kan aangepast, meegegeven als argument, en opgeroepen worden
Made with Slides.com