Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Доверяй- но проверяй :-). Все правильно.
Пытаюсь понять как в С++ 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;
}
[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 :-).