Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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
在ANSIC中是否有制作抽象数据类型的标准方法?_C_Abstract Data Type - Fatal编程技术网

在ANSIC中是否有制作抽象数据类型的标准方法?

在ANSIC中是否有制作抽象数据类型的标准方法?,c,abstract-data-type,C,Abstract Data Type,我最近转到了另一所学校&cs课程。与我上一所学校教的java相比,使用的语言是C。我的一个主要问题可能是由于没有编写足够的C代码导致的,那就是我很难找到制作抽象数据类型的标准 从我所看到的,有很多实现方法,缺乏一个可见的标准让我担心我在自学C时错过了一些东西 #定义createVector(vec)Vector vec;void init_向量(&vec) 还有另一个版本,我更习惯于使用句柄来保存createVector()函数返回的指向struct的指针。问题是我在网上或我的课程2书中找不到

我最近转到了另一所学校&cs课程。与我上一所学校教的java相比,使用的语言是C。我的一个主要问题可能是由于没有编写足够的C代码导致的,那就是我很难找到制作抽象数据类型的标准

从我所看到的,有很多实现方法,缺乏一个可见的标准让我担心我在自学C时错过了一些东西

#定义createVector(vec)Vector vec;void init_向量(&vec)
还有另一个版本,我更习惯于使用句柄来保存createVector()函数返回的指向struct的指针。问题是我在网上或我的课程2书中找不到任何关于手柄的详细描述。课程2的书只展示了界面和方法,而没有展示它们是如何以一种对用户隐藏实现的方式组合在一起的。我想知道ADT是否有“正确”的方法/标准?有争议的书是Robert Sedgewick的“C中的算法-第三版”。

抽象数据类型 分开你的消息来源。 标头(.h文件)包含抽象声明,如数据类型(结构、函数、枚举、常量等) 实际实现是在.c文件中完成的。 当使用这样一个(我们称之为)模块时,您只在源代码中包含头。 您使用的实现在链接时决定。您可以决定使用不同的.c文件来实现或使用静态库(甚至是动态库)。 如果要隐藏所使用的数据

为什么是这个标准?听说过
文件类型吗?这是c的标准库中用于IO的不透明类型。您只包括头
stdio.h
,并将实现留给编译器。另一方面,标题或至少它定义的符号都有很好的文档记录(并且是c标准的一部分)

抽象类 Java有抽象类的概念。嗯,一般来说,它也有一个类的概念。C没有。这更多的是个人观点,但是不要浪费时间去模拟语言不提供的语言特性。 对于非抽象方法,使用指向(可能是不透明的)结构的指针作为第一个参数的函数,如
fprintf(FILE*,const char*,…)
。 对于抽象方法,您需要函数指针。 使用这些函数指针(或者可能是函数指针的结构)就像使用。您可以定义注册此类策略的
方法
,并将正常功能委托给他们。以
atexit
函数为例,它全局(您可以称之为单例)添加了一个退出策略

XY问题 我很难找到制作抽象数据类型的标准

阅读并将其应用于你的问题。
不要试图强迫你的解决方案工作,而是重新考虑尝试的解决方案是否适用于问题。试着用上面描述的技术来获得舒适感。这可能需要一点实践,但是你可以用一种更c风格的方式来建模你的解决方案。

我只是想发布这篇文章,因为我找到了更适合我的案例的答案,但是我明白这可能并不适用于所有人。我一直在寻找的是“第一类ADT”的概念,它使用一个句柄来包含指向实际对象的指针,该对象是从一个.c实现文件创建的,该文件将对用户隐藏

就我所知,对于使用C的ADT,这种方法是标准的。您将有一个头(.h)文件和一个或多个实现(.c)文件。头文件可能类似于:

typedef struct * Doodad;

Doodad * doodadInit(int);

void doodadDestroy(Doodad *);

int doodadGetData(Doodad *);

void doodadSetData(int);
对于您的实现文件,您可能有:

typedef struct iDoodad {
   int data;
} Doodad;

Doodad * doodadInit(int data) {
   ...
}

...

您可以使用函数指针创建一个结构,也可以适当地命名函数,以明确它们与结构相关联。例如,一个带有函数指针的链表可能看起来是这样的:据我所知,这个过程没有法律上的标准(如“ISO”或“ECMA”)。事实上有多种标准——你发现的所有这些不同的变化。你展示的宏在我建议的“好主意”列表中有很长一段路要走。在完成这个问题所基于的课程后,你对不透明数据结构的看法是正确的。通常,我们使用void*来保存实际对象和包含所述void*及其可以使用的函数的结构。然后我们制作了一个宏,这样每个对象的函数调用都引用了结构中的object/void*