首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C泛型编程

C泛型编程
EN

Stack Overflow用户
提问于 2009-12-26 19:14:14
回答 5查看 6.8K关注 0票数 14

首先,我是一个初学者(还有很多东西需要学习)。在我的一个小型学校项目中,我为一个结构编写了一个堆栈。现在我有了一个稍微不同的结构,我也需要一个堆栈。我应该写另一个数据结构stack,还是尝试实现一些泛型编程……

你知道在C中有什么好的泛型编程策略(最终是在线资源)吗?我用过谷歌,但我没有找到任何令人满意的东西,因为大多数结果都是关于C++策略的。

谢谢!

后来的编辑:经过一些阅读和体验,最终我找到了两个解决我的问题的方法。我在这里记录了它们:http://andreinc.net/2010/09/30/generic-data-structures-in-c/。那篇文章可能有错误或不准确之处,但它总结了我到目前为止所知道的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-26 19:40:02

寻找共性和创建抽象是程序员最有价值的技能之一。因为你还在学习,所以我建议你做以下事情:

(1)实现另一个结构的堆栈。是的,这是双重工作,但在你的阶段,每个工作程序都很重要。积累经验。

(2)比较两种方案。它们的共同点是什么?有哪些不同之处?您的目标是将常见的部分与不同的部分分开。这两组人的交流方式是什么?它们共有的部分放入系统的一部分(stack.h/stack.c),不同的部分放入各自的文件(account.h/c、person.h/c等)。合并它们的部分应该包含stack.h和参数化实体。

(3)尝试找到所有您知道的语言提供的实现抽象结构功能的可能方法。乍一看,似乎只有一种方法,但对于每个重要的问题,总会有几种方法。在堆栈的情况下,例如,使用标准C,你可以使用空指针,你可以使用预处理器宏,你应该查看标记粘贴,你可以使用函数指针和结构指针,等等。

(4)尽可能多地实现它们。再说一次,这是为了学习体验。C有很多陷阱,越早遇到它们越好。

(5)在枚举并实现了所有这些不同的方法之后,您应该对它们进行评估:哪种方法最容易使用?哪一个最容易实现?哪一个是最快的?哪一个最容易调试?

票数 15
EN

Stack Overflow用户

发布于 2009-12-26 19:31:53

对于产品代码,我通常更喜欢C++。即使您不打算全力以赴使用OO、泛型和元编程,您也可以将C++用作更好的C语言(在本例中,只是为了免费获得std::stack )。

如果你必须使用C,试着保持它的简单性,并根据你的特定环境做出实用的选择。例如,如果您确定您的堆栈有一定的限制,并且您保存的数据很简单,那么您的堆栈代码就可以像stack[tos++] = x;return stack[--tos]一样简单,而不需要可重用的库。建议基于void*的库的答案在不同的情况下也是合适的。C++的std::stack基本上一劳永逸地解决了这个问题;C并没有给你带来那样的享受。

票数 2
EN

Stack Overflow用户

发布于 2009-12-26 19:37:56

我在这里用C写了一个泛型编程的例子,虽然它不是一种数据结构算法,但它可以给你一些关于这个主题的线索。我希望它能帮助你。

下面的算法是冒泡排序算法的一般实现。我使用空指针并将数据强制转换为字节级。此外,我还使用了一个外部比较函数,它是唯一知道排序数据类型的代码。该比较函数作为参数传递给排序算法。

另一个要点是,主算法需要知道正在操作的数据的字节大小,以便知道需要多少字节才能将该数据移动到数组中的新位置。它还创建了一个缓冲区来存储此数据的一个实例( bubleSort函数中的k变量)。

代码语言:javascript
复制
    static int compare(void *menor, void *maior)
    {
       int *pMenor = (int *)menor;
       int *pMaior = (int *)maior;

       return ( *pMenor > *pMaior );
    }

    void bubleSort(void *base, int bWidth, int len, int (*func)(void *key, void *data))
    {
       int i, j;
       char *k=0;
       char *bPtr = (char *)base;         //Points to the beginning of the array 
       char *pi, *pj;

       k = (char *)malloc(bWidth);        //Creates a new var with the size of the data type

       if(!k)
          return;

       for(i = 0; i < len; i++)
       {
          pi = (bPtr + (i*bWidth));

          for(j=i+1; j < len; j++)
          {
             pj = (bPtr+(j*bWidth));

             if( func((void *)pi, (void *)pj) )
             {
                memcpy(k, pi, bWidth);
                memcpy(pi,pj, bWidth);
                memcpy(pj, k, bWidth);
             }
          }
       }

       free(k);
    }

int main()
{
   int vet[5] = {4, 1, 3, 5, 2};
   bubleSort((void *)vet, sizeof(int), 5, compare);

   return 0;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1963169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档