2012-04-25 3 views
0

Я написал заявление на C++ и в нем, мне нужно вызвать математическую функцию, которая была написана на C. Прототип выглядит следующим образом:C в C++ код

void Jacobi_Cyclic_Method(double *eigenvalues, double *eigenvectors, double *A, int n); 

Моя проблема заключается в том, что я не могу кажется, передать функцию двойной * (например, как собственные векторы и а являются многомерными массивами. C++ способ передать эти вещи, кажется,

double [][size] 

Я прочитал о экстерне C, но я не думаю, что это применяется здесь, так как я не взаимодействую с объектом, но с самим источником. Как я могу отправить эту функцию C my multi мерные массивы, определенные в качестве такового:

double [100][100] A; 
double [100][100] eigenvectors; 
double [100] eigenvalues; 

Попытки скомпилировать я получают:

error: no matching function for call to ‘MathEngine::Jacobi_Cyclic_Method(double 
[100], double [100][100], double [100][100], int)’ 
mathEngine.h:9: note: candidates are: static void  
MathEngine::Jacobi_Cyclic_Method(double*, double*, double*, int) 
+0

Вы перекомпилируете все, включая реализацию вашей математической функции, или связываете ли вы с существующей скомпилированной библиотекой? Это имеет большое значение в отношении того, имеет ли значение «extern» C »или нет. –

+0

Точно так же, как вы это делали, были определены ваши массивы на C. – Kiril

+0

. Вы должны просто передать эти значения напрямую. 'Double [100]' является 'double *', а также 'double [100] [100]'. Что не так, когда вы пытаетесь? –

ответ

0

Я предполагаю, что ваша функция C требует многомерных массивов для некоторых из его параметров, и прототип написанный с указателями на парные параметры матрицы/матрицы, где целочисленный параметр указывает размер каждого измерения (я полагаю, что матрицы являются квадратными?). Если это так, то вы можете передать указатель на первый элемент каждого массива/матрицы, как это:

Jacobi_Cyclic_Methods(&eigenvalues[0], &eigenvectors[0][0], &A[0][0], 100); 

Ваша первая попытка не работает, так как тип, например, eigenvectors является double[100][100] распадающегося до double (*)[100], а не double *.

This почта адресует вопрос о указателях и многомерных массивах.

+2

Я бы не пробовал это, если в документации по функциям не указано, что 'double [100] [100]' - правильный формат. Проверьте, нужна ли функция для макета главной строки или столбца. –

+0

Это имеет большой смысл, я попробую, когда вернусь домой. Спасибо –

+0

Это точно влияет на литье непосредственно (double *). Оба метода позволяют мне скомпилировать, но у меня все еще были проблемы с тем, как функция C считала, что память была выложена, и как это было на самом деле. Тем не менее, это работает как решение для моего первоначального поста. –

1

Возможно, проблема заключается в том, что для вашей функции Jacobi_Cyclic_Method требуется, чтобы матрица находилась в основном формате столбца или строки, где каждый столбец/строка хранится последовательно в одном одномерном массиве. Например. для ряда крупной матрицы размера MxN, элементы в любой данной строке, хранятся смежно и элемент в строке я и столбце J будет в положении я * п + J (для индексов нулевой основы i и j). Если матрица имеет значение столбца, она будет находиться в позиции i + j * m.

Использование многомерных массивов в C/C++ часто не то, что вы хотите, потому что что-то вроде

double A[100][100]; 

не двумерный массив, но один массив из 100 элементов, содержащий указатели на массивы длины 100. Следовательно, строки в A не хранятся смежно.

+0

Ну, метод определен здесь: http://code.google.com/p/biaxmc2/source/browse/trunk/montecarlo2/mc2/src/jacobi_cyclic_method.c?spec=svn98&r=98 Кажется, что он действительно принять двойной [] []. –

+0

Вот что говорят комментарии, но код говорит по-разному. Если он принял 'double [] []', объявление аргумента для матрицы должно быть 'double ** A', а не' double * A'. - Кстати, какой ты человек, чтобы выбрать такое неуважительное, глупое имя пользователя ?! –

+0

Ничего себе! Вы знаете, что я взял имя от кого-то, кого я видел в игре, которую я играл некоторое время назад, и, конечно же, не знал об аспекте военной войны. Я был совершенно смущен вашим комментарием, пока не посмотрел. У меня был аватар парня в оранжевом костюме и т. Д. И т. Д. Конечно, никакого преступления не было, я прошу прощения. Спасибо, что указали это. –