2009-12-28 4 views
0

Я пытаюсь написать функцию клей между двумя типами данных, и я не могу заставить компилятор быть счастливым. С одной стороны, у меня есть указатель на порции данных, которые логически AnX 2 массива, но объявлен как:нужен синтаксис броска для доступа к старому c api

double* pData=new double[2*n]; 

С другой стороны, у меня есть функция переменного тока, который объявлен как

void Function(double data[][2], int n); 

Если я помню свой синтаксис c, данные [] [2] на самом деле являются указателем на непрерывный кусок памяти, но компилятор знает, что размер второго измерения равен 2. Поэтому я хотел бы взять pData и передайте его в функцию() без memcpy. Я просто не могу написать бросок. Я думал, что-то вроде

Function((double [][2])pData,n) 

будет работать, но компилятору (MSVC 8) это не нравится. Может ли кто-нибудь сообщить мне правильный способ написать актерский состав, чтобы заставить компилятор быть счастливым.

+0

двойные данные [] [2] являются двойными **, а y наша pData двойная * –

ответ

2
void Function(double data[][2], int n); 
double* pData = new double[2*n]; 
Function((double (*)[2])pData, n); 

Функциональные параметры формы T[] идентичны T* (даже не T* const, что некоторые люди ожидают). Это особый случай для типов параметров как в C, так и в C++. Итак, ваше double[][2] следует этому правилу, при этом T double[2]. Определения типов проиллюстрировать это:

typedef double T[2]; 
void Function(T data[], int n); 
// identical to: 
void Function(double data[][2], int n); 
// also identical to: 
void Function(double (*data)[2], int n); 

Так вы пишете T*, когда Т double[2] в double (*)[2].


Вы также можете сделать это:

void Function(double data[][2], int n); 
double (*pData)[2] = new double[n][2]; 
Function(pData, n); 

который не требует броска, потому что PDATA уже правильный тип. Или с определениями типов:

typedef double T[2]; 
T* pData = new T[n]; 
0

Просто разъяснить его, Эндрю ответ

Function(&pData, n) 

не работает, вы получите:

компилирует
error C2664: 'Function' : cannot convert parameter 1 from 'double **' to 'double [][2]' 

Roger Pate в синтаксисе без определений типов является это:

Function((double (*)[2]) &pData, n); 
Смежные вопросы