Помогите разобраться в проблеме импорта функции из dll - страница 4

 
Хороший совет насчет Ехе файла. Попробую воспользоваться им. Насчет проверки, конечно, Вы правы, их надо проверять. Я просто хотел услышать Ваше мнение по поводу стоит ли на них обращать внимание или нет, т.е. проверять. Но судя по описанию, по-моему, это то, о чем мы говорили, как Вы считаете? У меня ещё не очень хорошая практическая база по С++, мозгами то понимаю, что ничего глобально сложного в написании этих конверторов нет, но на данный момент для меня всё же это представляет некоторую сложность, а поэтому хочется решить это как можно проще, тем более если есть уже готовая функция...
 

Доверяй- но проверяй :-). Все правильно.

 

Пытаюсь понять как в С++ Builder сделать реализацию. Насколько я понял, чтобы сделать ЕХЕ файл, то надо в проекте в функции WinMain сделать последовательный вызов трех функций:

ConvertData_1 (...);

rmatrixsvd(...);

ConvertData_2 (...);

Правильно? А вот как поступить при формировании DLL? Тоже также? Чего то у меня какие то сомнения... Пытаюсь понять по книжке Архангельского "Программирование в С++ Builder.."

Но пока безрезультатно...

 

Разницы никакой нет, в Exe вы работаете или в Dll.

.

Скопировал мой пост со страницы 2 этой темы:

-----------------------------------------------------------

Объявить Вы должны примерно такую функцию:
extern "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)
// разумеется, сюда вы еще передадите кол-во строк и столбцов
{
// перевести входные параметры в ap::real_2d_array
ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1);
ap::real_2d_array a2 = ...;
.
// посчитать
ap::real_2d_array a3;
rmatrixsvd(a1, a2, a3);
.
// перевести результат a3 в out
convertReal2DArrayToPDouble(a3, out);
.
return;
}

-----------------------------------------------------------

.

А причем здесь функция WinMain? Это как бы точка входа в программу...

я извиняюсь, конечно, но Вы понимаете что есть функция?

.

Признайтесь честно, со 2 до 6 сентября сколько Вы уже времени потратили на эту задачу?

Не лучше ли попросить 2-х часовую консультацию у специалиста (подготовка кода + объяснение)?

 

Спасибо, понял теперь... всё эти функции обрамлены внешней, которую я и буду экспортировать. Извиняюсь, затупил немного...

По поводу специалиста, то я бы с удовольствием... если бы были такие рядом где-нибудь. Но, к сожалению, таковых нет, жаль, конечно...

Это же Казахстан... хотя, наверно, в Алматы и Астане есть хорошие спецы, но до них мне не добраться :-), свыше 1000 км.

Поэтому приходится доходить до всего самому. Да, время много уже потратил :-). Ну, ничего... Москва тоже не сразу строилась... :-) как говорится.

 

Я не совсем понял по поводу Visual Studio 2010... Сейчас доступна только Beta версия? Релиза, как я понял пока нет?

А Visual Assist идет отдельно?

А предпоследний релиз Visual Studio 2008?

 

Строго говоря, Вам хватит 2005-ого. Или 2003-ого.

Visual Assist- это сторонняя утилита.

 

Для данной задачи, конечно, и этих хватит. Но, хочется то на перспективу. Думаю, что это задача не будет последней...

А вот Visual Studio 2009 чего то вроде не встречается, поэтому я и уточнил у Вас насчет последних доступных версий...

Изучать... так изучать по полной... :-)

 

Наконец то что-то родилось... :-)

Но есть некоторые проблемы при компилировании, если указывать, что функция экспортируемая...

Если указать:

1.) int SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), компиляция без ошибок

2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), то возникают ошибки:

[ILINK32 Error] Error: Unresolved external 'ap::afree(void *)' referenced from \\COMP-BSN\МОИ ДОКУМЕНТЫ\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
[ILINK32 Error] Error: Unresolved external 'ap::minint(int, int)' referenced from \\COMP-BSN\МОИ ДОКУМЕНТЫ\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
[ILINK32 Error] Error: Unresolved external 'ap::amalloc(unsigned int, unsigned int)' referenced from \\COMP-BSN\МОИ ДОКУМЕНТЫ\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
[ILINK32 Error] Error: Unresolved external 'rmatrixsvd(ap::template_2d_array<double, 1>, int, int, int, int, int, ap::template_1d_array<double, 1>&, ap::template_2d_array<double, 1>&, ap::template_2d_array<double, 1>&)' referenced from \\COMP-BSN\МОИ ДОКУМЕНТЫ\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ

Как можно это интерпретировать?

Может в моём коде какая то ошибка?

Вот код:

//---------------------------------------------------------------------------

#include <windows.h>
//include "H_svd_dll.h"
//---------------------------------------------------------------------------

#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}

//---------------------------------------------------------------------------
#include "stdafx.h"
#include "svd.h"
//---------------------------------------------------------------------------

int Convert_Double_To_Real_2D_Array(double inArr[], ap::real_2d_array outArr, int iRow, int iCol)
{

for(int line = 0; line < iRow; line++)
for(int column = 0; column < iCol; column++)
outArr(line, column) = inArr[line*iCol + column];


return 1;
}

//---------------------------------------------------------------------------

int Convert_Real_1D_Array_To_Double(ap::real_1d_array inArr, double outArr[], int iRow, int iCol)
{
int minmn = ap::minint(iRow, iCol);
for(int i = 0; i < minmn; i++)
outArr[i] = inArr(i);

return 1;
}

//---------------------------------------------------------------------------

int Convert_Real_2D_Array_To_Double(ap::real_2d_array inArr, double outArr[], int iRow, int iCol)
{
for(int line = 0; line < iRow; line++)
for(int column = 0; column < iCol; column++)
outArr[line*iCol + column] = inArr(line, column);

return 1;
}

//---------------------------------------------------------------------------

extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col)
//int SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col)
{
ap::real_2d_array A;
ap::real_1d_array W;
ap::real_2d_array U;
ap::real_2d_array VT;
int Uneeded = 2;
int VTneeded = 2;
int AdditionalMemory = 2;
// Выделение памяти под массивы
int minmn = ap::minint(Row, Col);
A.setbounds(0, Row-1, 0, Col-1);
W.setbounds(0, minmn-1);
U.setbounds(0, Row-1, 0, Col-1);
VT.setbounds(0, Row-1, 0, Col-1);

// переводим входные параметры из double в ap::real_2d_array
Convert_Double_To_Real_2D_Array(inA, A, Row, Col);

// svd-разложение матрицы
rmatrixsvd(A, Row, Col, Uneeded, VTneeded, AdditionalMemory, W, U, VT);

// переводим результат W, U, VT в out
Convert_Real_1D_Array_To_Double(W, outW, Row, Col);
Convert_Real_2D_Array_To_Double(U, outU, Row, Col);
Convert_Real_2D_Array_To_Double(VT, outVT, Row, Col);

return 1;
}

 
2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), то возникают ошибки:

[ILINK32 Error] Error: Unresolved external 'ap::afree(void *)' referenced from \\COMP-BSN\МОИ ДОКУМЕНТЫ\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ

Уважаемый, если Вы выложите архив с исходниками- я попытаюсь это скомпилировать и слинковать.

И еще- пообещайте показать мне сам индикатор mq4 :-).