Передача массива const double[][] в качестве аргумента интерфейсу double**

У меня есть двухмерная константная двойная матрица, которую нужно передать в качестве аргумента функции, которая принимает (неконстантный) параметр 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 » (в последнем сегменте фрагментов кода) должен принимать right.dm_params (или соответствующее представление его содержимого соответственно).

Что еще, кроме ручного переноса right.dm_params во вспомогательную структуру double** (с помощью вложенного цикла, перебирающего все поля массива и копирующего их по одному) и последующей передачи последнего в setEqParams, я мог здесь сделать?

PS: И учитывая, что я смогу передать right.dm_params функции, которая принимает double[][] (или double[4][8]?) в качестве параметра - как мне избавиться от const? "Подсказка": const_cast<double[4][8]>(right.dm_parameters) не работает.


person fbahr    schedule 22.09.2011    source источник
comment
почему бы не использовать неявные преобразования?   -  person onof    schedule 22.09.2011
comment
double** не является указателем на двумерный массив. Это указатель на [первый элемент в массиве] указателей.   -  person Lightness Races in Orbit    schedule 22.09.2011
comment
@onof: T[][] НЕ не совпадает с T**.   -  person Puppy    schedule 22.09.2011
comment
Откровенно говоря, весь этот интерфейс тупой. Никто в здравом уме на современном C++ не стал бы брать T**.   -  person Puppy    schedule 22.09.2011
comment
@DeadMG: Часть some_functions.h представляет собой заголовочный файл C почти 20-летней давности, который с тех пор не обновлялся. Часть CEqParams.h представляет собой абстракцию C++ низкоуровневых подпрограмм из some_functions.h, которую мне не разрешено изменять. Итак: Да, это некрасиво.   -  person fbahr    schedule 22.09.2011
comment
Это не просто уродливо: это неправильно, как и ваша интерпретация этого.   -  person Lightness Races in Orbit    schedule 22.09.2011
comment
@TomalakGeret'kal: Моя интерпретация этого? Что вы имеете в виду? (Я не говорил, что ‹code›double**‹/code› был a указателем на 2D-массив... или говорил?) - Уточнения приветствуются.   -  person fbahr    schedule 22.09.2011


Ответы (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);
}
person Paul R    schedule 22.09.2011
comment
Тем не менее, проблема остается: dm_params[i], i=0..7, имеют тип const double [8]. Здесь может работать const_cast‹double*›(dm_params[i]) ... но на самом деле это хуже текущего решения, не так ли? - person fbahr; 22.09.2011
comment
Да, вам придется каким-то образом отбросить константность (при условии, что она действительно будет рассматриваться как константа?). - person Paul R; 22.09.2011