c - 如何通过两个 void 指针参数交换 2 个未知确切类型的数字?

标签 c

我需要编写一个函数来替换 2 个未知类型的“数字”。

我不知道确切的类型,我只能使用 2 个参数。

所以这是我尝试过的:

void swap(void *p1, void *p2)
{
    char p;
    char * q1 = (char *)p1;
    char * q2 = (char *)p2;
    for (int i = 0; i < sizeof(long double); i++)
    {
        p = q1[i];
        q1[i] = q2[i];
        q2[i] = p;
    }
}

用法:

double a = 100123000000.2;
double b = 100065450000.3;
printf("a: %1f, b: %1f\n", a, b);
swap(&a, &b)
printf("a: %1f, b: %1f\n", a, b);

这很好用,但我的问题是如果我的 numberlong double 大怎么办(或者没有人..)
我的解决方案可以吗?

最佳答案

This works fine but my question is what if my number is bigger (?)
Is my solution is OK ?

除非知道确切的大小,否则代码会遇到麻烦。所以,不,OP 的解决方案不可行。
void swap() 需要知道要交换的数据的大小。

i can only use 2 parameters.

自 C99 以来,代码可以作弊并将所有数据作为复合文字放入1参数。

typedef struct {
  void *a;
  void *b;
  size_t sz;
} swap_T;

// Only 1 parameter!!
void swap(swap_T sw) {
  unsigned char * q1 = sw.a;
  unsigned char * q2 = sw.b;
  while (sw.sz > 0) {
    sw.sz--;
    unsigned char p = q1[sw.sz];
    q1[sw.sz] = q2[sw.sz];
    q2[sw.sz] = p;
  }
}

int main(void) {
  double a = 100123000000.2;
  double b = 100065450000.3;
  printf("a: %g, b: %g\n", a, b);
  swap(((swap_T ) { &a, &b, sizeof a } ));  // Compound literal
  printf("a: %g, b: %g\n", a, b);
  return 0;
}

输出

a: 1.00123e+11, b: 1.00065e+11
a: 1.00065e+11, b: 1.00123e+11

代码可以将 swap(((swap_T ) { &a, &b, sizeof a } )) 包装在一个看起来像 2 的函数调用的宏中

#define SWAP(a,b) (swap(((swap_T ) { &(a), &(b), sizeof (a) } )))
...
SWAP(a,b);

只要 a 不是带有可变逻辑数组 (VLA) 且有副作用的表达式,宏就应该可以正常工作。

当然,最好 a,b 是同一类型。

关于c - 如何通过两个 void 指针参数交换 2 个未知确切类型的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48794397/

相关文章:

c++ - 什么是 Regal OpenGL?

c - 如何从 char[4] 生成 int? (在 C 中)

c - 在 Web 服务器中显示默认页面的问题

c - 将级别顺序插入到二叉树中?

c - 当我们 malloc() 时,我们真的必须 free() 吗?那么它与自动变量有什么不同呢?

c - 无需循环即可将字节数组转换为整数的方法?

python - 将列表从 python 移动到 C

c - 我的 C 程序从用户输入中查找最接近的数字对没有打印正确的输出?

c++ - 如何在fork之间共享数组?

c - 如何在 C 语言的 SQLite 中使用 IN 子句?