Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的函数重写_C_Overriding_Abstraction - Fatal编程技术网

C语言中的函数重写

C语言中的函数重写,c,overriding,abstraction,C,Overriding,Abstraction,我在C中有一个类似于函数重写的要求。我有两个不同设备ID的设备。我有一个只调用device\u create(device\u id)的进程。进程不知道要调用哪个设备。如果设备id与驱动程序的设备id匹配,则由设备的驱动程序执行设备创建。如果您使用不同的共享对象(或DLL)来实现此功能,您可以自己编程处理此功能,是否有方法在C中执行此操作?。您可以创建一个类似插件的结构,并使用类似命令模式的东西 不是很简单,但是可以帮助你解决问题 干杯。好的。我知道我还没完成,但现在就离开这篇文章吧 您不知道进

我在C中有一个类似于函数重写的要求。我有两个不同设备ID的设备。我有一个只调用device\u create(device\u id)的进程。进程不知道要调用哪个设备。如果设备id与驱动程序的设备id匹配,则由设备的驱动程序执行设备创建。如果您使用不同的共享对象(或DLL)来实现此功能,您可以自己编程处理此功能,是否有方法在C中执行此操作?

。您可以创建一个类似插件的结构,并使用类似命令模式的东西

不是很简单,但是可以帮助你解决问题


干杯。

好的。我知道我还没完成,但现在就离开这篇文章吧

您不知道进程启动时的ID。连接HW时,您读取ID并希望根据ID调用正确的函数,但不直接使用ID

我能想到的最简单的解决方案是使用函数指针数组:

void (*funs[3])(void) = {
        &device_create100,
        &device_create200,
        NULL
};
int (*device_create)(int);

int device_create_init(int id)
{
     switch (id) {
     case 0x0a:
           device_create = &device_create_100;
           break;
     case 0x0b:
           device_create = &device_create_200;
           break;
     }
   /* After first call, the now set device_create_xxx function will be 
      invoked on device_create() */
     return device_create(id);
}


int main(void) 
{
     device_create = &device_create_init;

     /* Loop */

     return 0;
}
但只有当您可以规范化ID以匹配数组的索引时,才可以。假设所有ID都在1000-1032范围内,这将是一个32长的函数指针数组,您可以在其中使用
ID-1000

因为这不太可能,所以您可以求助于排序列表、二叉树、哈希表或类似的方法来进行查找

struct node {
    int (*fun)(void);
    int id;
    struct *node left;
    struct *node right;
}
当然,这是假设您有一个相当大的可能ID列表,并且
开关是不可能的


老职位

那么函数指针呢:

void (*funs[3])(void) = {
        &device_create100,
        &device_create200,
        NULL
};
int (*device_create)(int);

int device_create_init(int id)
{
     switch (id) {
     case 0x0a:
           device_create = &device_create_100;
           break;
     case 0x0b:
           device_create = &device_create_200;
           break;
     }
   /* After first call, the now set device_create_xxx function will be 
      invoked on device_create() */
     return device_create(id);
}


int main(void) 
{
     device_create = &device_create_init;

     /* Loop */

     return 0;
}

放一些你试过的代码看看工厂模式。读这篇文章-“内核中的面向对象设计模式”,这里有一些C技术来创建接口并实现它们。我不明白你的要求。你的密码在哪里?在呼叫过程中,在设备中?这个电话是在什么情况下发出的?“进程不知道要调用哪个设备。”。这个电话是怎么打的?我同意这个问题需要很多澄清。试着解释一下你为什么要这样做——这会帮助人们给你一些有用的建议。设备驱动程序的代码是如何加载到调用
device\u create()
的进程中的?谢谢您的回复。链表选项似乎解决了我的问题。如果它不能解决问题,那么我会用我面临的问题来回答。我计划写这样的东西:@user3354961:我假设它是一棵树;)。即使使用最简单的例程,排序数组也可以提供相当快速的查找。当涉及到链表时,您也可以考虑展开链接列表:但是如果这是静态列表,请仔细考虑LL。也可以考虑缓存至少最后一个ID,如果可能是同一个设备被删除连接并频繁重新连接。对于静态数据,考虑这样的主题:SrCutDeice 100 [AR][]{ListSyle条目(200,DeVice SyrCeTe100)ListSurl条目(Deice,CurryCeReT200)};有没有一种方法可以让我在驱动程序100和驱动程序200中使用一些宏,比如LIST_条目,它们都将成为这个全局数组的一部分?@user3354961:我不太明白你的意思。您需要一些宏,如
{LIST\u ENTRY(100)、LIST\u ENTRY(200)、LIST\u ENTRY(300)}
来创建类似
{&device\u create\u 100、&device\u create\u 200、&device\u create\u 300}