嗯,你的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];
}
}
}