【问题标题】:cast 2d char array to 2d int array将 2d char 数组转换为 2d int 数组
【发布时间】:2021-01-14 13:42:08
【问题描述】:

我有以下二维无符号字符数组来将图像存储为 0 到 255 之间的值:

unsigned char img[MAX_DIM][MAX_DIM];

我有一个以二维 int 数组为参数的函数:

void transpose(int m[][MAX_DIM], int h, int w);

如何将 char 数组传递给该函数?我尝试了类似的方法,但它不起作用:

transpose((int (*)[MAX_DIM])img, h, w);

【问题讨论】:

  • 您不能将 unsigned char [][] 数组传递给接受 int[][]array 的函数。确定您希望使用的类型,然后始终如一地使用该类型。
  • @Lundin 为什么我不能直接投射?
  • 因为这些类型远不兼容,所以它们有不同的大小。
  • 因为转换 (int)my_char 适用于单个变量,在这种情况下会被转换。如果要对 2D 数组执行相同的操作,则必须遍历 2D char 数组并将每个单独的项目转换为 2D int。这行得通,但速度很慢。为什么必须首先使用unsigned char
  • 因此,我是否应该将transpose 改为使用unsigned char

标签: arrays c multidimensional-array casting type-conversion


【解决方案1】:

您可以创建一个类型通用接口并实现两种不同的转置函数,一种用于 8 位数据,另一种用于 32 位数据。示例:

#include <stdint.h>
#include <stdio.h>

void transpose_32 (size_t h, size_t w, uint32_t m[h][w]){ puts(__func__); }
void transpose_8  (size_t h, size_t w, uint8_t  m[h][w]){ puts(__func__); }

#define transpose(m,h,w) _Generic(**(m), uint8_t: transpose_8, uint32_t: transpose_32)(h,w,m)

int main(void)
{
  const size_t MAX_DIM = 10;
  uint8_t  img1[MAX_DIM][MAX_DIM];
  uint32_t img2[MAX_DIM][MAX_DIM];
  
  transpose(img1, MAX_DIM, MAX_DIM);
  transpose(img2, MAX_DIM, MAX_DIM);

  return 0;
}

【讨论】:

    【解决方案2】:

    我想指出一些可能对你有帮助的事情。

    首先,如果您想将数组作为函数参数传递,请不要在括号中指定大小,因为没有必要。其实觉得是错的。

    其次,当您想将某些内容类型转换为 int 时,我猜您正在尝试您的第三行代码,表达式为: (int)charArray[] ; 并不是 int charArray(*) [大小]

    第三个也是最重要的,你不能将非算术 (char) 的东西类型转换为 (int) 的东西。但是您可以做的是使用将参数转换为 int 的 atoi 函数。

    int atoi(const char *str);
    

    另外,下次你想将数组传递给函数时,你应该更喜欢引用它并将数组的地址作为参数传递,而不是包含内容本身的数组,因为没有办法返回整个数组从转置函数转换而来,即使你设法以你想要的方式处理它。

    我希望我能帮上一点忙,但是如果您的问题没有解决,请尝试发布您的问题陈述,以便我们能够更好地帮助您。

    【讨论】:

    • char 可以很好地用于存储算术数据,它只是一个 8 位整数。无论如何不要使用atoi,因为糟糕的错误处理应该避免使用strtoul
    • " 您应该更喜欢引用它并将数组的地址作为参数传递,而不是包含内容本身的数组" 代码执行此操作。您不能在 C 中按值传递数组。
    • 尽管我不同意你的观点,但出于相当多的原因,我不希望在没有先查看完整陈述的情况下给一个困惑的人提供答案,因为这个问题本身有点不清楚.
    • "您不能在 C 中按值传递数组" 。嗯,是的,但是 Stepii 也没有正确地通过引用传递它们。
    • void transpose(int m[][MAX_DIM], int h, int w); 非常好,并且“通过引用”传递。
    猜你喜欢
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2022-01-18
    • 2012-06-08
    相关资源
    最近更新 更多