C Academy · leksjon

Tabeller med funksjonspekere

Dispatch-mønstre

Leksjon 4 av 413 trinn

Tabeller med funksjonspekere er en gratis leksjon i C Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C Academy inneholder totalt 4 leksjoner.

Tabeller med funksjoner

De kan lagre funksjonspekere i en tabell for å bygge en dispatch-tabell. En indeks eller kode velger hvilken funksjon som skal kjøres, og erstatter lange kjeder med if-else eller switch.

#include <stdio.h>

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int main(void) {
    int (*ops[2])(int,int) = { add, sub };
    printf("%d\n", ops[0](5, 3));
    printf("%d\n", ops[1](5, 3));
    return 0;
}

Indeksere tabellen

Velg en operasjon under kjøring ved å indeksere tabellen. Indeksen kan komme fra brukerinput eller programmets tilstand.

#include <stdio.h>

int mul(int a, int b) { return a * b; }
int add(int a, int b) { return a + b; }

int main(void) {
    int (*ops[2])(int,int) = { add, mul };
    int choice = 1;
    printf("%d\n", ops[choice](6, 7));
    return 0;
}

Erstatte en switch

En dispatch-tabell er ofte ryddigere enn en switch når hvert tilfelle bare kaller en funksjon.

#include <stdio.h>

void start(void) { printf("start\n"); }
void stop(void)  { printf("stop\n"); }
void pause(void) { printf("pause\n"); }

int main(void) {
    void (*table[3])(void) = { start, stop, pause };
    for (int i = 0; i < 3; i++) table[i]();
    return 0;
}

typedef rydder opp i tabellen

Hvis De bruker en typedef for funksjonspekertypen, blir tabelldeklarasjonen kort og lesbar.

#include <stdio.h>

typedef int (*BinOp)(int,int);

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int main(void) {
    BinOp ops[] = { add, sub };
    printf("%d\n", ops[0](10, 4));
    return 0;
}

Knytte symboler til funksjoner

Knytt hvert operatorsymbol til funksjonen sin i parallelle tabeller eller i en struktur­tabell, slik at De kan slå opp etter navn.

#include <stdio.h>

typedef int (*BinOp)(int,int);

int add(int a, int b){return a+b;}
int sub(int a, int b){return a-b;}

int main(void) {
    char syms[] = {'+', '-'};
    BinOp ops[] = { add, sub };
    char want = '-';
    for (int i = 0; i < 2; i++)
        if (syms[i] == want) printf("%d\n", ops[i](9, 2));
    return 0;
}

En kommandotabell basert på strukturer

Samle et navn og en handler i en struktur, og lag deretter en tabell med dem. Dette er det klassiske mønsteret for kommandotabeller.

#include <stdio.h>
#include <string.h>

typedef struct {
    const char *name;
    void (*run)(void);
} Command;

void hello(void){printf("hi\n");}
void bye(void){printf("bye\n");}

int main(void) {
    Command cmds[] = {{"hello", hello}, {"bye", bye}};
    const char *input = "bye";
    for (int i = 0; i < 2; i++)
        if (strcmp(cmds[i].name, input) == 0) cmds[i].run();
    return 0;
}

Kontrollere grenser

Valider alltid indeksen før De kaller gjennom tabellen, slik at De unngår å lese forbi tabellen.

#include <stdio.h>

typedef int (*Fn)(int);
int sq(int x){return x*x;}
int neg(int x){return -x;}

int main(void) {
    Fn table[] = { sq, neg };
    int n = 2;
    int idx = 5;
    if (idx >= 0 && idx < n) printf("%d\n", table[idx](3));
    else printf("index out of range\n");
    return 0;
}

Tilstandsmaskiner

Dispatch-tabeller driver tilstandsmaskiner: hver tilstand er en funksjonspeker, og handlerne returnerer indeksen til neste tilstand.

#include <stdio.h>

int state_a(void){ printf("A\n"); return 1; }
int state_b(void){ printf("B\n"); return -1; }

int main(void) {
    int (*states[2])(void) = { state_a, state_b };
    int s = 0;
    while (s >= 0) s = states[s]();
    return 0;
}

Dispatch som i programtillegg

Ved å registrere handlere i en tabell kan De legge til ny virkemåte ved å føye til en oppføring, i stedet for å endre en stor switch.

#include <stdio.h>

typedef void (*Handler)(int);
void log_low(int v){printf("low %d\n", v);}
void log_high(int v){printf("high %d\n", v);}

int main(void) {
    Handler handlers[] = { log_low, log_high };
    int level = 1;
    handlers[level](7);
    return 0;
}

Standardhandler

Reserver én plass eller en reservepeker for ukjente koder, slik at dispatch aldri mislykkes uten synlig tegn.

#include <stdio.h>

typedef void (*Fn)(void);
void known(void){printf("known\n");}
void fallback(void){printf("unknown command\n");}

int main(void) {
    Fn table[] = { known };
    int n = 1, code = 9;
    Fn f = (code >= 0 && code < n) ? table[code] : fallback;
    f();
    return 0;
}

Hvorfor tabeller skalerer

Dispatch-tabeller gjør forgreningslogikk om til et dataoppslag. Når De legger til tilfeller, legger De til data, noe som holder koden flat og rask.

#include <stdio.h>

typedef int (*Fn)(int);
int a(int x){return x+1;}
int b(int x){return x*2;}
int c(int x){return x*x;}

int main(void) {
    Fn t[] = { a, b, c };
    for (int i = 0; i < 3; i++) printf("%d ", t[i](4));
    printf("\n");
    return 0;
}

Rask kontroll

Test forståelsen Deres av tabeller med funksjonspekere.

Oppsummering

De har lært dispatch-mønstre med tabeller av funksjonspekere:

  • Lagre funksjonspekere i en tabell og velg dem etter indeks.
  • De erstatter lange switch-kjeder og skalerer ved at De legger til data.
  • Bruk typedef og struktur­baserte kommandotabeller for tydelighet.
  • Kontroller alltid indeksens grenser, og oppgi en standardhandler.
Gratis å komme i gang

Lær deg C med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
39
Leksjoner
144

Ofte stilte spørsmål

Er leksjonen «Tabeller med funksjonspekere» gratis?

Ja – hele teksten i «Tabeller med funksjonspekere» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Tabeller med funksjonspekere»?

Dispatch-mønstre Du øver på C Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C Academy?

Ingen tidligere erfaring er nødvendig. C Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Tabeller med funksjonspekere»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C Academy-leksjonen?

Ja. Alle C Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Deklarere funksjonspekere
  2. Sende funksjoner
  3. qsort med sammenligningsfunksjoner
  4. Tabeller med funksjonspekere
← Tilbake til C Academy