【问题标题】:Passing a const double[][] array as argument to a double** interface将 const double[][] 数组作为参数传递给 double** 接口
【发布时间】:2011-09-22 10:49:47
【问题描述】:

我有一个 2-dim const double 矩阵,它需要作为参数传递给采用(非 const)double** 参数的函数。

[CEqParams.h] // < given as is - can't do a thing about it

class CEqParams
{
public:
  void operator=(const CEqParams &right);  
  ...
  double dm_params[4][8];
};

.

[some_functions.h] // < dto.
...
void setEqParams(double **m);
...

.

[CEqParams.cpp]

void CEqParams::operator=(const CEqParams &right)
{
  setEqParams( « magic here » );
}

其中« magic here »(在代码 sn-ps 的最后一段)应采用 right.dm_params(或其内容的适当表示)。

除了手动将right.dm_params 转移到辅助double** 结构(通过在所有数组字段上运行并逐个复制它们的嵌套循环)然后将后者传递给setEqParams 之外,我还能在这里做吗? ?

PS:鉴于我能够将right.dm_params 传递给一个以double[][](或double[4][8]?)作为参数的函数 - 我将如何摆脱const? “提示”:const_cast&lt;double[4][8]&gt;(right.dm_parameters) 不起作用。

【问题讨论】:

  • 为什么不使用隐式转换?
  • A double** 不是指向二维数组的指针。它是指向[数组中的第一个元素]指针的指针。
  • @onof: T[][]T**相同。
  • 坦率地说,这整个界面是愚蠢的。在现代 C++ 中没有任何理智的人会接受 T**。
  • @DeadMG:“some_functions.h”部分是一个将近 20 年前的 C 头文件 - 从那时起就没有更新过。 “CEqParams.h”部分是来自“some_functions.h”的低级例程的快速-n-dirty C++ 抽象——我不允许更改。所以:是的,它很丑。

标签: c++ pointers multidimensional-array argument-passing


【解决方案1】:

一种相当丑陋的方法,至少不需要复制所有数据,是创建一个行指针的临时数组,例如

void CEqParams::operator=(const CEqParams &right)
{
  double * dm_params_ptrs[4] = { dm_params[0], dm_params[1], dm_params[2], dm_params[3] };

  setEqParams(dm_params_ptrs);
}

【讨论】:

  • 仍然存在一个问题:dm_params[i], i=0..7 是 const double [8] 类型。一个 const_cast(dm_params[i]) 可能在这里工作......但这实际上比当前的解决方案更糟糕,不是吗?
  • 是的,你将不得不以某种方式抛弃 const-ness(假设它实际上将被视为 const ?)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2015-10-15
相关资源
最近更新 更多