将指针解释为二维数组

2024-01-12

我有一个数组转置函数,可以像这样镜像数组:

[1][2][3]            [1][4][7]
[4][5][6]    ===>    [2][5][8]
[7][8][9]            [3][6][9]

这是我提出的算法的概念:

size_t numvars = variables.size(), numsegs = segments.size();

for (int v = 0; v < numvars; ++v) {
  for (int s = 0; s < numsegs; ++s) {
    float * row = in + (s * numvars);
    out[v][s] = *(row + v);
  }
}

当手动执行算法时,一切都按预期进行。我想实现该函数,使其需要两个指向二维数组的指针,一个指向源数组,第二个指向将保存转置数组的内存缓冲区。当我尝试在函数中用 C++ 实现该算法时,出现以下错误:

void transposeArray(float * in, float * out) throw()
{
  size_t numvars = variables.size(), numsegs = segments.size();

  for (int v = 0; v < numvars; ++v) {
    for (int s = 0; s < numsegs; ++s) {
      float * row = in + (s * numvars);
      out[v][s] = *(row + v);
    }
  }
}

输出[v][s] = *(行+v); 数组下标的无效类型“float[int]”

这是因为编译器不知道它应该处理第二个float * out作为二维数组?如果是这样,解决办法是什么?


嗯,你的out变量是一个指向a的指针float,所以取消引用它out[v]产生一个浮点值。并且您不能为浮点值添加下标。

您需要做的是计算数组索引out二维数组与您计算它的方式相同in二维数组:

void transposeArray(float * in, float * out) throw() {
  size_t numvars = variables.size(), numsegs = segments.size();

  for (int v = 0; v < numvars; ++v) {
    for (int s = 0; s < numsegs; ++s) {
      out[v*numsegs + s] = in[s*numvars + v];
    }
  }
}

Note:
遗憾的是,您显然是用 C++ 编写这段代码,而不是用 C。因为在 C 中,您可以用一种非常好的方式来做到这一点:

void transposeArray(int numvars, int numsegs, float (*in)[numvars], float (*out)[numsegs]) {
  for (int v = 0; v < numvars; ++v) {
    for (int s = 0; s < numsegs; ++s) {
      out[v][s] = in[s][v];
    }
  }
}

这里的技巧是in and out参数被声明为指向行数组的指针,这允许语言调用与声明数组时使用的相同的指针算术魔法float myArray[numvars][numsegs];。这个指针算术归结为隐式做同样的事情v*numsegs + s明确地表示。

C 的优点是,它允许使用数组类型运行时间大小,这是 C++ 不做的事情。当然,如果numvars and numsegs是编译时常量,您可以在 C++ 中执行等效操作。

如果您想使用与问题中给出的函数签名相同的函数签名,则可以按照以下方式编写函数:

void transposeArray(float * in, float * out) throw() {
  size_t numvars = variables.size(), numsegs = segments.size();
  float (*in2D)[numvars] = (void*)in;
  float (*out2D)[numsegs] = (void*)out;

  for (int v = 0; v < numvars; ++v) {
    for (int s = 0; s < numsegs; ++s) {
      out2D[v][s] = in2D[s][v];
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将指针解释为二维数组 的相关文章

随机推荐