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