这是我想要做的:
typedef enum { ONE, TWO, THREE } Numbers;
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个函数来执行类似于以下的切换案例:
char num_str[10];
int process_numbers_str(Numbers num) {
switch(num) {
case ONE:
case TWO:
case THREE:
{
strcpy(num_str, num); //some way to get the symbolic constant name in here?
} break;
default:
return 0; //no match
return 1;
}
Run Code Online (Sandbox Code Playgroud)
而不是在每种情况下定义,有没有办法使用枚举变量设置它,就像我在上面尝试做的那样?
我做了比"普通的旧C"编程更多的C++编程.在普通C编程时,我非常想念的一件事是类型安全的通用数据结构,它是通过模板在C++中提供的.
为了具体起见,请考虑一般的单链表.在C++中,定义自己的模板类,然后根据需要对其进行实例化是一件简单的事情.
在C中,我可以想到一些实现通用单链表的方法:
我不喜欢选项1,因为它颠覆了类型系统,并且可能比特定类型的特定实现具有更差的性能.对于所有类型使用数据结构的统一表示,并向/从void指针进行转换,据我所知,需要一个间接性,这可以通过专用于元素类型的实现来避免.
选项2不需要任何额外的工具,但感觉有些笨拙,并且在使用不当时可能会导致错误的编译器错误.
选项3可以提供比选项2更好的编译器错误消息,因为专用数据结构代码将以扩展形式存在,可以在编辑器中打开并由程序员检查(而不是由预处理器宏生成的代码).但是,这个选项是最重量级的,一种"穷人的模板".之前我使用过这种方法,使用一个简单的sed脚本来专门化一些C代码的"模板化"版本.
我想用C而不是C++来编写我未来的"低级"项目,但是为每种特定类型重写通用数据结构的想法让我感到害怕.
人们对这个问题有什么经验?C中是否存在通用数据结构和算法的良好库,这些库不与选项1一起使用(即与void指针进行转换,这会牺牲类型安全性并增加间接级别)?
我需要实现一些使用不同数字数组的方法.通常,我会使用泛型来完成这项工作,但由于C不提供它们,我现在正试图使用宏来模拟它们.
这是我正在尝试做的一个例子:
#ifndef TYPE
#define TYPE int
#endif
TYPE get_minimum_##TYPE (TYPE * nums, int len){
TYPE min = nums[0];
for (int i = 1; i < len; i++) {
if (nums[i] < min) {
min = nums[i];
}
}
return min;
}
Run Code Online (Sandbox Code Playgroud)
但是,这不会编译.clang错误消息:
错误:预期';' 在顶级声明者之后
有没有办法在C中这样做?或者我需要手动为每种类型实现这个吗?
您好我正在尝试使用void*作为C中的通用数据类型.我想要的是一种机制,使用它我可以存储任何东西并得到任何东西.我写了一些代码,但在最后一种情况下失败了.任何人都可以看看代码,如果您有任何其他想法,请告诉我.
我知道我要存储的是什么,所以在那一点上我知道数据类型,但在重审期间我只知道起始地址和大小.
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
static void store( void *destination, void *source, size_t size ) {
memcpy ( (char*)destination, source, size);
}
static void retrieve ( void *destination, void *source, size_t size) {
memcpy ( destination, (char*)source, size);
}
void *storage_char_ptr = (void*) malloc ( sizeof( char* ));
void *storage_int_ptr = (void*) malloc ( sizeof(int*));
void *storage_int = (void*) malloc ( sizeof( int));
int main() {
int int_in = 65;
void *int_out_ptr;
int *ptr …Run Code Online (Sandbox Code Playgroud) 问题:为队列找到正确的数据结构:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>
int main(int argc, const char *argv[])
{
Queue q;
ch ='A';
for (int k = 0; int k < 4; int k++) {
q.addQ(ch);
ch++;
q.addQ(ch);
ch=q.front();
q.removeQ();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我试图编译它,但队列是未声明的:
$ gcc -o Qu_1 -g q_queue.c
q_queue.c: In function 'main':
q_queue.c:8: error: 'Queue' undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)
问题:基本数据结构的库是什么,例如示例中的队列?
有没有办法在 C 中创建通用数据结构并根据存储的数据类型使用函数,该结构具有各种类型的数据,例如可以根据存储的数据进行打印。
例如,
假设我希望创建一个只存储 float 和 int 的二叉搜索树。自然的方法是创建一个包含 int 和 float 的枚举。它看起来像这样:
Typedef enum {INT, FLOAT} DataType;
Typedef struct node
{
void *data;
DataType t;
struct node *left,
*right;
}Node;
Run Code Online (Sandbox Code Playgroud)
如果我想打印出来:
void printTree(Node *n)
{
if (n != NULL)
{
if (n->t == INT)
{
int *a = (int *) n->data;
printf("%d ", *a);
}
else
{
float *a = (float *) n->data;
printf("%f ", *a);
}
printTree(n->left);
printTree(n->right);
}
}
Run Code Online (Sandbox Code Playgroud)
没关系,但我想将另一种数据类型存储为堆栈、查询或其他内容。这就是为什么我创建了一个不依赖于特定数据类型的树,例如:
Typedef struct node
{
void *data;
struct …Run Code Online (Sandbox Code Playgroud) 我编写了一个解释串行数据(CAN)的函数,当前返回一个浮点数.我希望函数包含一个参数,其中用户在字符串中指定返回类型,并且该函数返回该类型的值.这只是一个方便的事情,避免必须编写几乎共享所有相同代码的多个函数.
我正在使用嵌入式微控制器,我必须将多种类型的数据读/写到非易失性RAM(NVRAM).我想避免为每个值编写单独的读/写函数来存储在NVRAM中,如下所示:
void Write_Value1(int value);
int Read_Value1(void);
void Write_Value2(unsigned long value);
unsigned long Read_Value2(void);
...
Run Code Online (Sandbox Code Playgroud)
随着读/写项目列表的增长,维护起来非常麻烦.有几种方法可以用C++解决这个问题,例如模板.使用模板我可以写一个.Read()和.Write(T value)功能的每个项目进行读/写将有机会获得.无论如何从C获得这种行为?我怀疑有一些方法,使用void指针和vtable的一些组合.我想以更多态的方式处理这个问题,并且具有以类似的方式读取/写入每个项目到NVRAM的功能.