Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск Min-Max в стеке FIFO / 25 сообщений из 72, страница 1 из 3
17.04.2013, 07:31
    #38228440
underC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
В стек FIFO, реализованный в массиве с плавающим пойнтером*, поступают данные. Среди прочих вычислений необходимо иметь доступ к мин-макс значениям, находящимся в данный момент в стеке.

Как это эффективно реализовать? Есть ли нативная сишная ф-ция вычисления мин-макс массива?

В голову пришло лишь:
- хранить еще два пойнтера на индексы последних значений, признанных мин-макс, и проверять их на присутствие в стеке при поступлении каждого нового значения. Если они вышли из стека - перебором выявить новые мин и/или макс.

Быстродействие крайне критично. Из-за этого и обратился к C++

*
не знаю, как обозвать - постоянно хранится указатель на индекс, в который произошла последняя запись. Т.е. новым значением перезаписывается самое старое - FO. Без смещения всего стека по массиву.

** C++ почти не знаю. Допиливаю чужую заготовку.
...
Рейтинг: 0 / 0
17.04.2013, 08:50
    #38228469
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
underC,

Для начала давайте уточним -термины стек и FIFO - взаимоисключающие.
Стек это всегда LIFO, а FIFO - это очередь.
И данная задача решается для них по разному.

У вас очередь или стек?
...
Рейтинг: 0 / 0
17.04.2013, 08:57
    #38228474
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
Две переменные max и min, определяются перед помещением значений в FIFO.
При выталкивании значений проверяем на max(min). Если вытолкнули max(min), то перебором находим новое max(min).
...
Рейтинг: 0 / 0
17.04.2013, 09:04
    #38228484
underC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
Сорри. Я не настоящий сварщик :)

В предлагаемой нотации - очередь. FIFO. Или LILO. Как удобнее. Пулеметная лента. Не магазин. Стек, прдн, очередь, выдавливается. Т.е. всегда заполнен(а) полностью.
...
Рейтинг: 0 / 0
17.04.2013, 09:20
    #38228506
underC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
m_Sla,
m_SlaДве переменные max и min, определяются перед помещением значений в FIFO.
При выталкивании значений проверяем на max(min). Если вытолкнули max(min), то перебором находим новое max(min). Схоже с тем, что я предложил выше. Только хранятся сами значения, а не указатели. А т.к. в стеке м.б. несколько величин, равных граничным, то в моем варианте можно оптимизироваться под хранение указателя на наиболее актуальную максимальную величину, перебирая стек с последнего вошедшего. Тогда не придется перебирать при выходе каждой величины, равной граничным. На длинных стеках может возникнуть существенная экономия.
...
Рейтинг: 0 / 0
17.04.2013, 09:37
    #38228525
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
А как много операций вставки - удаления - запроса минимакса будет? Какова длина очереди. Может там и оптимизировать нечего. Рискну предположить, что этот участок не станет узким местом системы.

Структура данных с затиранием иногда называется кольцом.

забавная книжка про узкие места
http://yandex.ru/yandsearch?text=голдратт+цель+-+процесс+непрерывного+совершенствования&lr=213
...
Рейтинг: 0 / 0
17.04.2013, 09:41
    #38228529
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
underC,

Если макс. размер очереди небольшой (десятки байтов), то быстрее всего будет перебор при удалении (как вы изначально предложили).
Если же очередь существенно больше (например миллионы байтов), то данный алгоритм имеющий сложность O(n) будет не самой эффективной реализацией.
Если заменить массив на список, и вести два списка - один в порядке очереди, а другой (параллельный для тех же элементов списка) в порядке сортировки, то можно добиться сложности O(log(n)).
Сортированный список можно эффективно реализовать с помощью std::multiset, а список для очереди - введя указатель на предыдущий элемент в каждом элементе multiset.

Набросок структуры данных:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
struct item
{
	T value;  // T это тип значений элементов очереди, вероятно числовой
	item* next; // указатель на следующий (в порядке добавления и соответственно извлечения) элемент очереди
	
	// оператор сравнения для реализации сортировки multiset
	friend bool operator<(const item& a, const item& b) {
		return a.value < b.value;
	}
};

std::multi_set<item> queue;
item* first_item = 0;

queue.begin()->value  // мин значение
queue.rbegin()->value  // макс значение
...
Рейтинг: 0 / 0
17.04.2013, 09:52
    #38228551
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
На самом деле в моем примере в multiset скорее надо хранить не item, а указатель item* - так проще реализовать.
Если будете реализовывать в этом направлении, то напишу подробнее.
...
Рейтинг: 0 / 0
17.04.2013, 10:20
    #38228597
underC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
Vladimir Baskakov ,

* как много операций вставки - удаления - запроса минимакса будет?
- непрерывно поступают данные с неких датчиков со скоростью до 500 отсчетов секунду в пределе, стандартно - 5-10 в сек. Каждое входящее надо проверять на минмакс и фиксировать, если оно таково.

* Какова длина очереди
- три-четыре самостоятельных очереди с максимальной длиной до 10 тыс. Из расчета, чтобы охватить хотя бы 3-4 минуты в экстремуме (0.2 мсек Х 10'000 pcs)

* Рискну предположить, что этот участок не станет узким местом системы.
- Ну, за всю систему, конечно, не самое-самое. А на этапе обработки сырых данных - самое узкое. Из сложной статистики, вычисляемой на каждом тике еще считаются (но все тривиально):
- приращение очереди: (Chg = New - Old);
- сумма значений очереди: (Sum = Sum + Chg);
- скользящее среднее: (Avg = Sum / Siz);
- диапазон минмакс: (Dnx = Max - Min)

Так что, все упирается в минмакс...

На книжку обязательно взгляну. Снкс.
...
Рейтинг: 0 / 0
17.04.2013, 10:21
    #38228601
underC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
Anatoly Moskovsky,
Спасиюо. Чуть позже отвечу. Надо отлучиться.
...
Рейтинг: 0 / 0
17.04.2013, 10:43
    #38228646
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
underC,

Я тут подумал, что может эффективнее и проще сделать по другому.
Очередь оставить такой какая у вас уже есть (в массиве).
А отдельно вести счетчик уникальных значений.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
std::map<T, size_t> unique_values;

void add(T value)
{
    // добавляем в очередь 
    ...
    // добавляем в счетчик
    ++unique_values[value];
}
T remove()
{
    // извлекаем из очереди
    T value = ...
    // удаляем из счетчика
    if (--unique_values[value] == 0)
    	unique_values.erase(value);
    return value;    	
}

T get_min()
{
    std::map<T, size_t>::iterator i = unique_values.begin();
    if (i == unique_values.end())
       return 0; // очередь пуста
    return i->first;
}

T get_max()
{
    std::map<T, size_t>::iterator i = unique_values.rbegin();
    if (i == unique_values.rend())
       return 0; // очередь пуста
    return i->first;
}



Теперь у нас add и remove выполняются за O(log(n)) - где n, не размер очереди, а кол-во уникальных значений, что худшем случае то же самое, а в лучшем - существенно меньше.
get_min и get_max выполняются за O(1)
...
Рейтинг: 0 / 0
17.04.2013, 10:47
    #38228656
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
Поправка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
T get_max()
{
    std::map<T, size_t>::reverse_iterator i = unique_values.rbegin();
    if (i == unique_values.rend())
       return 0; // очередь пуста
    return i->first;
}
...
Рейтинг: 0 / 0
17.04.2013, 11:18
    #38228735
vromanov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
underC,
1) Бъем очередь на сегменты. например, на 100.
2) на каждом сегменте храним время старта и стопа, считаем мин, макс, среднее.
3) при добавлении/удалении значения пересчитываем только значения в блоке.
4) Когда блок покидает или добавляется пересчитываются общие значения

Еще одна оптимизация. При обычном поиске мин/макс в массиве делается два сравнения на элемент. Можно делать так, берем два значения из массива. сравниваем их между собой, а потом максимальный сравниваем с макс и меньший с мин. Итого получается 1.5 сравнения на элемент. Ускорение на 25%
...
Рейтинг: 0 / 0
17.04.2013, 11:36
    #38228784
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
Смотрите, люди 500 вставок в секунду в mySql делают.
http://www.sql.ru/forum/actualthread.aspx?tid=973281
И он держит вроде.
Неужели самописная очередь, даже неоптимальная, не работает в 5-6 раз быстрее?
Какая структура данных - что кроме замеренного числа записывается?

Может сделать конвеер. Приемник данных заполняет блоки в памяти, второй паралельно работающий процесс скидывает полностью заполненные блоки в файлы, а уже третий, фоновый - все обрабатывает?
...
Рейтинг: 0 / 0
17.04.2013, 11:58
    #38228851
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public class num_test {
   public static void main (String[] argv) {
	   double a[]=new double[11000];
	   int i,j;
	   for (i=0; i<10000; i++) {
		   a[i]=i*i/1234;
	   }
	   for (j=1;j<1000000;j++){
		   double min,max;
		   min=0; max=0;
		   for (i=0; i<10000; i++) {
				  if (a[i] < min) {min=a[i];}
				  if (a[i] > max) {max=a[i];}
		   }
		   
	   }
	   
   }
}


на джаве - милион тупых минимаксов - секунд 30 на глаз....
а на С++? 500 в сек - с запасом, правда?
...
Рейтинг: 0 / 0
17.04.2013, 12:28
    #38228938
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
underC Vladimir Baskakov ,
* как много операций вставки - удаления - запроса минимакса будет?
- непрерывно поступают данные с неких датчиков со скоростью до 500 отсчетов секунду в пределе, стандартно - 5-10 в сек. Каждое входящее надо проверять на минмакс и фиксировать, если оно таково.

* Какова длина очереди
- три-четыре самостоятельных очереди с максимальной длиной до 10 тыс. Из расчета, чтобы охватить хотя бы 3-4 минуты в экстремуме (0.2 мсек Х 10'000 pcs)

* Рискну предположить, что этот участок не станет узким местом системы.
- Ну, за всю систему, конечно, не самое-самое. А на этапе обработки сырых данных - самое узкое. Из сложной статистики, вычисляемой на каждом тике еще считаются (но все тривиально):
- приращение очереди: (Chg = New - Old);
- сумма значений очереди: (Sum = Sum + Chg);
- скользящее среднее: (Avg = Sum / Siz);
- диапазон минмакс: (Dnx = Max - Min)

Так что, все упирается в минмакс...

На книжку обязательно взгляну. Снкс.Поиск max и min перебором из массива double data[10000] на моем компьютере выполняется за 0,00002сек. А искать надо только при выталкивании max или min.
...
Рейтинг: 0 / 0
17.04.2013, 12:37
    #38228957
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
так и я про что. Узкое место - не тут))))) но пооптимизировать - если есть время - это мы любим. и поговорить о оптимизации.
...
Рейтинг: 0 / 0
17.04.2013, 15:29
    #38229383
vromanov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
Vladimir Baskakov,

Мы давали тестовое задание при приеме работу с похожей задачей.
Предположим, наше приложение получает по разным каналам данные. Данные поступают пачками переменного размера.
Т.е. в некоторый момент времени дергается функция on_get_data(size_t size);
периодически дергается метод double get_average_speed() который должен возвращать приблизительную (+-10%) среднюю скорость за последние n секунд.
Интервал n задается при старте приложения.
Интнервал может быть от 60 секунд до суток или даже месяца.
частота событий получения данных также может быть от тысяч за секунду до раза в сутки.
...
Рейтинг: 0 / 0
20.04.2013, 09:04
    #38233687
underC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
underCAnatoly Moskovsky,
Спасиюо. Чуть позже отвечу. Надо отлучиться.Отлучился, млин, сходил за хлебушком :) Полсоюза за это время проехал.
Прошу прощения за пропажу топикстартера.

Спасиюо за высказанные соображения и примеры. С позволения присутствующих - возьму еще таймаут. В понедельник-вторник вернемся к обсуждению, ОК?
...
Рейтинг: 0 / 0
22.04.2013, 23:31
    #38235801
underC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
Ну вот. У меня есть первые результаты и замеры. Я реализовал вот такой алгоритм в модели на VBA, которую предполагаю переносить в сишную длл:
VBA code
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
' l_Arr      - массив (очередь) поступающих значений
' l_ArrSiz   - наибольший (верхний) индекс элементов массива l_Arr
' l_Pnt_OLD  - пойнтер выталкиваемого значения
' l_Pnt()    - пойнтеры на miN и maX элементы массива l_Arr
' l_Val()    - сохраненные значения  miN и maX элеменов массива l_Arr
' l_LB, l_UB - нижняя и верхняя границы цикла 'for'

Const cQ As Byte = 0    ' eQu (здесь не задействована)
Const cX As Byte = 1    ' maX
Const cN As Byte = 2    ' miN

Sub sb_NX_Simple() ' miN-maX simple compare
' сравниваем пойнтер удаляемого значения с пойнтерами на мин и макс
    Select Case ((l_Pnt_OLD = l_Pnt(cN)) Or (l_Pnt_OLD = l_Pnt(cX))) 
        Case True ' удаляется или мин, или макс
            l_Val(cN) = l_Arr(0): l_Val(cX) = l_Val(cN) ' назначаем произвольное значение _
                                                        ' из массива и на мин, и на макс
            l_LB = 0: l_UB = l_StkSiz     ' надо проверять весь массив заново
        Case False
            l_LB = l_Pnt_OLD: l_UB = l_LB ' проверяем только последнее вошедшее значение, _
                                          ' вставшее на пойнтер l_Pnt_OLD взамен вытолкнутого   
    End Select
    
' назначаем новые мин или(и) макс и сохранем его(их) поинтер(ы)
    For i = l_LB To l_UB
        Select Case l_Stk(i)
            Case Is < l_Val(cN): l_Val(cN) = l_Arr(i): l_Pnt(cN) = i
            Case Is > l_Val(cX): l_Val(cX) = l_Arr(i): l_Pnt(cX) = i
        End Select
    Next
End Sub


У меня этот цикл выполняется для очередей длиной:
Код: plaintext
1.
2.
3.
4.
    50 -    15 мксек == 0.000'015 сек == 15 * 10^(-6) сек
   500 -   120 мксек
 1'000 -   230 мксек
 5'000 - 1'150 мксек
10'000 - 2'350 мксек 
(все округлено-усреднено на глаз, но замеры ведутся с точностью до 1 мксек)

Vladimir Baskakov
* на джаве - милион тупых минимаксов - секунд 30 на глаз

m_Sla
* double data[10000] на моем компьютере выполняется за 0,00002 сек

Спасибо за цифры. На джаве - это, конечно, ни в какие ворота :) А вот 2 мксек на 1000 записей - меня это более чем устраивает. Под VBA производительность получается на два порядка ниже. И то, с учетом, что m_Sla ворочал запятую, а уменя все целочисленное. Но это только модель. Потом все портируется на С и будет летать :) Важно алгоритм оценить.

Теоретически, можно еще ускориться за счет линейной записи кода - уйти от второго for (это я чисто для экономии строчек кода и понимания так записал).

Можно еще попытаться ускориться за счет уточнения - кто, мин или макс все-таки вышел, и проверять дальше только на него. vromanov , об этом шла речь в 14191192 ?vromanovЕще одна оптимизация. При обычном поиске мин/макс в массиве делается два сравнения на элемент. Можно делать так, берем два значения из массива. сравниваем их между собой, а потом максимальный сравниваем с макс и меньший с мин. Итого получается 1.5 сравнения на элемент. Ускорение на 25%
И там же 14191192 :
Бъем очередь на сегменты. например, на 100
* 2) на каждом сегменте храним время старта и стопа, считаем мин, макс, среднее.

Непонятно, зачем хранить время (хоть оно у меня хранится).

* 3) при добавлении/удалении значения пересчитываем только значения в блоке.
Недостаточно. После удаления текущего минимакса, ближайший может оказаться в другом блоке.


Anatoly Moskovsky
Спасибо за примеры кода. Но я, к сожалению, совершенно поверхностно знаю язык - лишь в рамках той длл, которую мне придется модифицировать. Поэтому я просто не могу по достоинству оценить предложенное. И хотелось бы остаться в рамках того, что я смогу потянуть самостоятельно без погружения в маны.

Интересны приведенные оценки сложности алгоритма O(log(n)). Что можно почитать на эту тему? Если не очень заумное :)


Vladimir Baskakov 14191364
* Какая структура данных - что кроме замеренного числа записывается?
Фактически очередь - это двумерный массив, т.к. значений (полей), одновременно в нее передающихся - несколько, плюс таймстемп на каждую запись, который я проставляю самостоятельно. Очередей таких - несколько разных длин. Т.е. элементы самой короткой очереди дублируются в более длинной. Кстати, в этом направлении тоже, думаю, есть место для оптимизации. Но мне пока надо в самом простом, но эффективном варианте.

* Может сделать конвеер. Приемник данных заполняет блоки в памяти, второй паралельно работающий процесс скидывает полностью заполненные блоки в файлы, а уже третий, фоновый - все обрабатывает?
Это было бы шикарно. Но я не потяну самостоятельно. Да и еще такой аспект - все сейчас обрабатыывается в Access через подключенный API в COM-модели. Поэтому синхронная обработа навязана. Можно было бы говорить о буфере, но по ТЗ указано мириться с потерянными тиками в пользу самых свежих. Т.е. выбор сделан в пользу актуальности, за счет целостности, полноты данных
.
...
Рейтинг: 0 / 0
23.04.2013, 09:46
    #38236032
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
авторСпасибо за цифры. На джаве - это, конечно, ни в какие ворота :)
Почему? В Ваши ворота пролазит с запасом. у Вас же 1000 замеров в секунду?
и у меня на джаве 10 К записей, а не 1 К.

И ВБА - уж тормозит так тормозит.

Да и еще такой аспект - все сейчас обрабатывается в Access
Ну посмотрите шутки ради - сколько времени оно туда льется. Через COM.
...
Рейтинг: 0 / 0
23.04.2013, 11:48
    #38236292
underC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
Vladimir Baskakov ,

* и у меня на джаве 10 К записей, а не 1 К.
Вот, что было написано выше: "милион тупых минимаксов - секунд 30 на глаз" . Пусть 20. Итого, на 1'000 циклов:
Код: plaintext
1.
2.
JS:  2 * 10^(-2) сек 
C++: 2 * 10^(-6) сек
VBA: 2 * 10^(-4) сек

Что уж так за яву расстраиваться :) Странно было бы от нее большего ожидать.

* В Ваши ворота пролазит с запасом. у Вас же 1000 замеров в секунду?
Пролазит. Ну и что? Пролазит-то лишь среднебольничная температура...

И я называл лишь ориентировочную цифру общего числа отсчетов за секунду. 500. В качестве ориентира. Об интервале между самими тиками я не обмолвился. За секунду может пройти всего два отсчета, но с минимальным зазором между ними. Минимальный зазор, который я наблюдаю - 11 мксек.

Борьба за быстродействие это не самоцель. С учетом COM-модели мне всегда будет мало скорости, т.к. хочется как можно меньше потерять отсчетов, а для этого надо как можно раньше освободить систему для следующего тика.

* И ВБА - уж тормозит так тормозит.
Ну, надо уметь его готовить :) А цифры выше я привел.

* Ну посмотрите шутки ради - сколько времени оно туда льется. Через COM.
Да не надо шуток. Смотрю постоянно :)
БД - десятка полтора целочисленных полей и три дабла, строковых нет. В онлайне пишется меньше чем за 1 мск (0.001 сек) запись (это включая сопутствующие статистические вычисления) и еще полно мест для оптимизации. Последовательное чтение (имитация онлайна, тоже с вычислениями) - до 80'000 записей в сек. Access на удивление шустер.

Пишется до 1.5 млн записей в сутки (обычно 700-800 тыс). Это в среднем чуть больше 10 записей в сек. В среднем!
...
Рейтинг: 0 / 0
23.04.2013, 13:16
    #38236480
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
underCВ стек FIFO, реализованный в массиве с плавающим пойнтером*, поступают данные. Среди прочих вычислений необходимо иметь доступ к мин-макс значениям, находящимся в данный момент в стеке.
Можно сделать стек указателей на дерево. А в дереве max/min ищется довольно быстро.
...
Рейтинг: 0 / 0
23.04.2013, 13:59
    #38236578
underC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
mayton ,
это мне сейчас не потянуть. Надо учиться. На заметку возьму, как и предложения Anatoly Moskovsky про уникальные значения и Vladimir Baskakov про конвейер. Конечно, вместо того, чтобы из API выплевывать в VBA, оттуда в сишную длл, а потом обратно, лучше на си написать шлюз (бридж) к API со всей математикой, а аксу оставить исключтельно БД-шный функционал.

В плане портирования предложенного алгоритма на C++ возникает следующий вопрос - как передать из VBA в сишную длл массив значений ?

Сейчас я передаю в нее несколько параметров.
Вот у меня вызов инициализации очереди:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
//	+-----------------------------------------------------------------
//	| Stack ini
//	+-----------------------------------------------------------------
_DLLAPI char __stdcall fn_MA_Ini(int &pBBB, int &pAAA, 
                                 short &pPer_S, short &pPer_L, short &pPer_D, 
                                 short &pPer_E, short &pPer_T, 
                                 short &pMpl_D, short &pSns_D, short &pSns_T)
{
...


Вот передача новых значений к пересчету:
Код: plaintext
1.
2.
3.
4.
5.
6.
//	+-----------------------------------------------------------------
//	| Stack recalc
//	+-----------------------------------------------------------------
_DLLAPI char __stdcall fn_MA_New(long &pBBB, long &pAAA) //, double *pDv)
{
...


Я, конечно, могу увеличить число передаваемых параметров, но может лучше массивом.

А еще более важно массивом же из нее получить результаты вычислений . Сейчас для получения одного из результатов вычислений я вызываю ее функцию с определенным параметром. И так несколько раз. Слава богу, они не все нужны одновременно. Но гораздо интереснее получить все махом за один вызов и уже в VBA разбираться с результатами.
...
Рейтинг: 0 / 0
23.04.2013, 17:21
    #38237041
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск Min-Max в стеке FIFO
underC mayton ,
это мне сейчас не потянуть. Надо учиться. На заметку возьму, как и предложения Anatoly Moskovsky про уникальные значения
А нужно потянуть. Единственные структуры данных которые быстро выбирают max/min - это деревья и пирамида (Heap).
Пирамида описана у Вирта в книге. Она более компактна но я не уверен что поможет в поиске min и нужно
проверить насколько она быстра при inserts/deletes. Дерево в этом плане конечно-же лучше.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск Min-Max в стеке FIFO / 25 сообщений из 72, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]