Проблема идентична максимальной подпоследовательности, которую я решил использовать с помощью динамического программирования. Следите за текущей и предыдущей (прибыль, день продажи и дата продажи) Если ток выше предыдущего, замените предыдущий на текущий.
int prices[] = { 38, 37, 35, 31, 20, 24, 35, 21, 24, 21, 23, 20, 23, 25, 27 };
int buyDate = 0, tempbuyDate = 0;
int sellDate = 0, tempsellDate = 0;
int profit = 0, tempProfit =0;
int i ,x = prices.length;
int previousDayPrice = prices[0], currentDayprice=0;
for(i=1 ; i<x; i++ ) {
currentDayprice = prices[i];
if(currentDayprice > previousDayPrice ) { // price went up
tempProfit = tempProfit + currentDayprice - previousDayPrice;
tempsellDate = i;
}
else { // price went down
if(tempProfit>profit) { // check if the current Profit is higher than previous profit....
profit = tempProfit;
sellDate = tempsellDate;
buyDate = tempbuyDate;
}
// re-intialized buy&sell date, profit....
tempsellDate = i;
tempbuyDate = i;
tempProfit =0;
}
previousDayPrice = currentDayprice;
}
// if the profit is highest till the last date....
if(tempProfit>profit) {
System.out.println("buydate " + tempbuyDate + " selldate " + tempsellDate + " profit " + tempProfit );
}
else {
System.out.println("buydate " + buyDate + " selldate " + sellDate + " profit " + profit );
}
Что относительно позднего связывания? Как в загрузке его с LoadLibrary () и GetProcAddress ()? Я - используемая способность загрузить библиотеку во время выполнения, и было бы замечательно, если Вы могли бы сделать это здесь.
, Таким образом, существует два способа загрузить DLL. Первое должно сослаться на один или несколько символов от DLL (Ваше имя класса, например), предоставить соответствующий импорт.LIB и позволить компоновщику понять все.
второе должно явно загрузить DLL через LoadLibrary.
Любой подход хорошо работает для экспорта функции C-уровня. Можно или позволить компоновщику обработать его или назвать GetProcAddress, как Вы отметили.
, Но когда дело доходит до экспортируемого классы , обычно только первый подход используется, т.е. неявно свяжитесь с DLL. В этом случае DLL загружается во время начала приложения, и приложению не удается загрузиться, если DLL не может быть найден.
, Если Вы хотите связаться с классом, определенным в DLL, и Вы хотите, чтобы тот DLL был загружен динамично, когда-то после инициирования программы, у Вас есть две опции:
Создают объекты класса с помощью специальной функции фабрики, которая внутренне должна будет использовать (крошечный бит) ассемблер для "поднимания трубку" недавно созданных объектов к их соответствующим смещениям. Это должно быть сделано во времени выполнения ПОСЛЕ ТОГО, КАК DLL был загружен, очевидно. Хорошее объяснение этого подхода может быть найдено здесь .
Использование загрузка задержки DLL .
, Учитывая все обстоятельства... вероятно, лучше, чтобы просто пойти с неявным соединением, в этом случае Вы определенно хотите использовать метод препроцессора, показанный выше. На самом деле, если Вы создадите новый DLL в Visual Studio и выберете опцию "export symbols" они, то макросы будут созданы для Вас.
Удача...
Когда Вы создаете DLL и модуль, который будет использовать DLL, иметь некоторый #define, который можно использовать для различения одного и другой, тогда можно сделать что-то вроде этого в заголовочном файле класса:
#if defined( BUILD_DLL )
#define IMPORT_EXPORT __declspec(dllexport)
#else
#define IMPORT_EXPORT __declspec(dllimport)
#endif
class IMPORT_EXPORT MyClass {
...
};
Редактирование: crashmstr бьют меня к нему!
Я использую некоторые макросы для маркировки кода для импорта, или экспорт
#ifdef ISDLL #define DLL __declspec(dllexport) #endif #ifdef USEDLL #define DLL __declspec(dllimport) #endif
Тогда объявляют класс в заголовочном файле:
class DLL MyClassToExport { ... }
Тогда #define ISDLL
в libary, и USEDLL
прежде включая заголовочный файл в месте Вы хотите использовать класс.
я не знаю, если Вы, возможно, должны были сделать что-нибудь по-другому для работы с LoadLibrary
Если Вы готовы поместить vtable в класс, Вы экспортируете, можно экспортировать функцию, которая возвращает интерфейс, и реализуйте класс в .dll, то помещенный это в .def файл. Вам, возможно, придется сделать некоторый обман объявления, но это не должно быть слишком твердо.
Точно так же, как COM.:)