MST

星途 面试题库

面试题:C语言中通过函数指针实现复杂回调机制

在一个图形绘制库的模拟场景中,有多种图形绘制函数,如绘制圆形、矩形、三角形。每个绘制函数返回值为void,参数为表示图形位置和尺寸的结构体。请设计一个通用的绘制框架,通过函数指针实现回调机制,使得用户可以方便地注册不同的绘制函数,并根据需求调用相应的绘制函数来绘制图形。请详细写出相关的结构体定义、函数指针定义以及调用逻辑代码。
47.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 定义表示图形位置和尺寸的结构体
typedef struct {
    int x;
    int y;
    int width;
    int height;
} ShapePosition;

// 定义绘制圆形的函数
void drawCircle(ShapePosition pos) {
    printf("Drawing a circle at (x=%d, y=%d), width=%d, height=%d\n", pos.x, pos.y, pos.width, pos.height);
}

// 定义绘制矩形的函数
void drawRectangle(ShapePosition pos) {
    printf("Drawing a rectangle at (x=%d, y=%d), width=%d, height=%d\n", pos.x, pos.y, pos.width, pos.height);
}

// 定义绘制三角形的函数
void drawTriangle(ShapePosition pos) {
    printf("Drawing a triangle at (x=%d, y=%d), width=%d, height=%d\n", pos.x, pos.y, pos.width, pos.height);
}

// 定义函数指针类型
typedef void (*DrawFunction)(ShapePosition);

// 定义一个结构体来存储函数指针和对应的图形名称
typedef struct {
    const char* name;
    DrawFunction drawFunc;
} DrawCallback;

// 注册函数,将函数指针和名称添加到数组中
void registerDrawFunction(DrawCallback callbacks[], int* count, const char* name, DrawFunction func) {
    callbacks[*count].name = name;
    callbacks[*count].drawFunc = func;
    (*count)++;
}

// 根据名称调用相应的绘制函数
void drawShapeByName(DrawCallback callbacks[], int count, const char* name, ShapePosition pos) {
    for (int i = 0; i < count; i++) {
        if (strcmp(callbacks[i].name, name) == 0) {
            callbacks[i].drawFunc(pos);
            return;
        }
    }
    printf("No such shape: %s\n", name);
}

int main() {
    DrawCallback callbacks[10];
    int callbackCount = 0;

    // 注册绘制函数
    registerDrawFunction(callbacks, &callbackCount, "circle", drawCircle);
    registerDrawFunction(callbacks, &callbackCount, "rectangle", drawRectangle);
    registerDrawFunction(callbacks, &callbackCount, "triangle", drawTriangle);

    ShapePosition pos = {10, 20, 50, 30};

    // 根据名称调用绘制函数
    drawShapeByName(callbacks, callbackCount, "circle", pos);
    drawShapeByName(callbacks, callbackCount, "rectangle", pos);
    drawShapeByName(callbacks, callbackCount, "triangle", pos);
    drawShapeByName(callbacks, callbackCount, "unknown", pos);

    return 0;
}
  1. 结构体定义
    • ShapePosition结构体用于表示图形的位置和尺寸,包含x坐标、y坐标、宽度width和高度height
    • DrawCallback结构体用于存储图形名称和对应的绘制函数指针。
  2. 函数指针定义
    • DrawFunction是一个函数指针类型,指向返回值为void,参数为ShapePosition的函数,即绘制图形的函数。
  3. 调用逻辑
    • registerDrawFunction函数用于将绘制函数和其对应的图形名称注册到DrawCallback数组中。
    • drawShapeByName函数根据传入的图形名称,在DrawCallback数组中查找对应的绘制函数并调用。如果找不到,则提示没有该图形。
    • main函数中,先注册了圆形、矩形和三角形的绘制函数,然后通过drawShapeByName函数根据名称调用相应的绘制函数,并测试了不存在的图形名称的情况。