相关疑难解决方法(0)

在C中使用枚举类型的变量作为字符串的简单方法?

这是我想要做的:

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 enums c-preprocessor

86
推荐指数
8
解决办法
9万
查看次数

普通C中的类型安全通用数据结构?

我做了比"普通的旧C"编程更多的C++编程.在普通C编程时,我非常想念的一件事是类型安全的通用数据结构,它是通过模板在C++中提供的.

为了具体起见,请考虑一般的单链表.在C++中,定义自己的模板类,然后根据需要对其进行实例化是一件简单的事情.

在C中,我可以想到一些实现通用单链表的方法:

  1. 编写链接列表类型和支持过程一次,使用void指针绕过类型系统.
  2. 编写预处理器宏,获取必要的类型名称等,以生成特定于类型的数据结构版本和支持过程.
  3. 使用更复杂的独立工具为您需要的类型生成代码.

我不喜欢选项1,因为它颠覆了类型系统,并且可能比特定类型的特定实现具有更差的性能.对于所有类型使用数据结构的统一表示,并向/从void指针进行转换,据我所知,需要一个间接性,这可以通过专用于元素类型的实现来避免.

选项2不需要任何额外的工具,但感觉有些笨拙,并且在使用不当时可能会导致错误的编译器错误.

选项3可以提供比选项2更好的编译器错误消息,因为专用数据结构代码将以扩展形式存在,可以在编辑器中打开并由程序员检查(而不是由预处理器宏生成的代码).但是,这个选项是最重量级的,一种"穷人的模板".之前我使用过这种方法,使用一个简单的sed脚本来专门化一些C代码的"模板化"版本.

我想用C而不是C++来编写我未来的"低级"项目,但是为每种特定类型重写通用数据结构的想法让我感到害怕.

人们对这个问题有什么经验?C中是否存在通用数据结构和算法的良好库,这些库不与选项1一起使用(即与void指针进行转换,这会牺牲类型安全性并增加间接级别)?

c generics code-generation data-structures

52
推荐指数
2
解决办法
2万
查看次数

C中的伪泛型

我需要实现一些使用不同数字数组的方法.通常,我会使用泛型来完成这项工作,但由于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中这样做?或者我需要手动为每种类型实现这个吗?

c generics c-preprocessor

31
推荐指数
2
解决办法
2万
查看次数

C [void*]中的通用数据类型

您好我正在尝试使用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)

c

10
推荐指数
2
解决办法
2万
查看次数

C语言中的基本数据结构库,例如Queue

问题:为队列找到正确的数据结构:

 #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 queue data-structures

7
推荐指数
2
解决办法
4万
查看次数

C 中的通用数据结构

有没有办法在 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)

c generic-collections data-structures

5
推荐指数
2
解决办法
1万
查看次数

我可以让C函数返回任意类型吗?

我编写了一个解释串行数据(CAN)的函数,当前返回一个浮点数.我希望函数包含一个参数,其中用户在字符串中指定返回类型,并且该函数返回该类型的值.这只是一个方便的事情,避免必须编写几乎共享所有相同代码的多个函数.

c types

4
推荐指数
1
解决办法
771
查看次数

C中的多态函数参数/返回值

我正在使用嵌入式微控制器,我必须将多种类型的数据读/写到非易失性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的功能.

c polymorphism c89

1
推荐指数
1
解决办法
440
查看次数