Форум программистов, компьютерный форум, киберфорум
bedvit
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Длинная арифметика (Bignum arithmetic) c COM-интерфейсом и C API Functions для Excel на библиотеках MPIR. С/С++

Запись от bedvit размещена 26.03.2018 в 22:15
Показов 26512 Комментарии 160
Метки c, c++

Теперь часть библиотеки BedvitCOM.
Проект основан на исходниках (на С++) библиотеки MPIR, Edition 3.0.0. (на основе библиотеки GMP)
Полностью написан на С/С++.
Скорость на порядок выше предыдущего решения.
Реализовал два блока в проекте:

1.DLL c COM интерфейсом. Реализованы dual-интерфейсы с Automation-совместимыми типами данных, структур
(поддержка как раннего вывязывания, так и позднего). Ранний предпочтительнее в части скорости (на 50% быстрее передача данных через СОМ-обертку).
Реализовано два класса: класс целых чисел с арифметикой (BignumArithmeticInteger) и класс чисел с плавающей точкой (BignumArithmeticFloat). При создании экземпляра класса создается массив из 256 чисел с арифметикой начиная с BedvitCOM v.2.0.0.0 - в массиве создается только 0-й элемент, с возможностью неограниченного добавления остальных чисел - пользователями. Массив начинается с 0. 0-й элемент инициализирован сраз нулем. Остальные числа добавляются автоматически в массив по их индексу, при присвоении им какого-либо значения пользователем (инициализации).
К числам можно обращаться по индексам (можно переменной присвоить индекс и работать с переменными, см. пример ниже)
BignumArithmeticInteger (Bignum) увеличивается в памяти по мере расчета автоматически, перераспределяя память.
BignumArithmeticFloat (Bignum), задается изначально, т.к. дробь может быть бесконечной (по умолчанию принимается минимальный размер - double).
Размер чисел ничем не ограничен, кроме вашей оперативки.

Регистрация COM реализовано как под админом, так и под пользователем (актуально в офисной части клиентов)
Регистрация стандартная:
Админ: Regsvr32 "FullName.DLL" !ПОМНИМ! В Win10 регистрация под правами админа: "правая кнопка" - "Пуск" -"Командная строка (администратор)"
Пользователь: Regsvr32 /i /n "FullName.DLL"
Удалить из реестра: Regsvr32 /u "FullName.DLL"

Свойства и методы последней версии библиотеки COM (из .Help):
Свойства и Методы BignumArithmeticInteger

1.Help(); HTML Справка (без параметров).

2.BSTR* StringBSTR = Bignum(BYTE Bignum, LONG BignumBase=10) = BSTR* StringBSTR ; Свойство. Принимает и возвращает BSTR* строку StringBSTR (задает число или возвращает значение). Bignum-индекс длинного числа в массиве (0-255). BignumBase-база длинного числа (от 2 до 36), по умолчанию = 10.

3.LONG Val = Sign(BYTE Bignum); Свойство. Возвращает знак длинного числа LONG Val.Возвращает 1 если Bignum > 0, 0 если Bignum = 0, и -1 если Bignum < 0.

4.LONG Val = Even(BYTE Bignum); Свойство. Определяет, является ли Bignum четное или нечетное. Возвращает 1 - Bignum четное, 0 - Bignum нечетное.

5.LONG Val = Compare(BYTE Bignum1, BYTE Bignum2); Метод. Сравнивает два длинных числа. Возвращает 1 если Bignum1 > Bignum2, 0 если Bignum1 = Bignum2, и -1 если Bignum1 < Bignum2.

6.BignumSet(BYTE Bignum, BSTR StringBSTR, LONG BignumBase=10); Метод. Задает число с параметрами аналогичными свойству Bignum()

7.Sum(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Суммирует два длинных числа. BignumSet = Bignum1 + Bignum2

8.SumL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Суммирует длинное число с обычным. BignumSet = Bignum1 + LONG_PTR(х64:LONG_PTR= LONGLONG, х32:LONG_PTR= LONG)

9.Abs(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает модуль значения из Bignum1 в BignumSet.

10.Negate(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает значение с противоположным знаком из Bignum1 в BignumSet. BignumSet = - Bignum1.

11.Subtract(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Вычитает из одного длинного числа второе. BignumSet = Bignum1 - Bignum2

12.SubtractL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Вычитает из длинного числа обычное. BignumSet = Bignum1 - LONG_PTR.

13.Multiply(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Умножает одно длинное число на второе. BignumSet = Bignum1 * Bignum2.

14.MultiplyL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Умножает длинное число на обычное. BignumSet = Bignum1 * LONG_PTR.

15.Divide(BYTE BignumQuotient, BYTE BignumRemainder, BYTE Bignum1, BYTE Bignum2); Метод. Делит одно длинное число на второе. При делении получаем частное в BignumQuotient, остаток от деления в BignumRemainder = Bignum1 / Bignum2.

16.DivideL(BYTE BignumQuotient, BYTE BignumRemainder, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Делит длинное число на обычное. При делении получаем частное в BignumQuotient, остаток от деления в BignumRemainder = Bignum1 / LONG_PTR.

17.Power(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Возводит в степень LONG_PTR длинное число Bignum1, результат возвращает в BignumSet. BignumSet = Bignum1 ^ LONG_PTR.

18.Clone(BYTE BignumSet, BYTE Bignum1); Метод. Копирует Bignum1 в BignumSet. BignumSet = Bignum1

19.RootRem(BYTE BignumRoot, BYTE BignumRemainder, BYTE Bignum1, LONG_PTR n_root); Метод. Извлекает корень n_root-степени из Bignum1. Целочисленный результат возвращает в BignumRoot, остаток в BignumRemainder = (n-th root)√ Bignum1.

20.Factorial(BYTE BignumSet, LONG n); Метод. Возвращает в BignumSet факториал n!

21.Fibonacci(BYTE BignumSet, LONG_PTR n); Метод. Возвращает в BignumSet число Фибоначи n. Fn+1 = Fn + Fn-1

22.LucNum(BYTE BignumSet, LONG_PTR n); Метод. Возвращает в BignumSet число Лукоса n. Ln+1 =Ln + Ln-1

23.FileSet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Загружает длинное число из файла (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.

24.FileGet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Сохраняет длинное число в файл (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.

25.Clear(LONG Bignum=-1); Метод. Освобождает память занятую длинным числом Bignum, или освобождает память занятую всеми числами при заданном параметре по умолчанию = -1.

26.LONG Val = BignumArraySize(); Метод. Возвращает количество чисел Bignum в созданном классе/массиве. Начиная с v2.0.0.0 (теперь массив чисел может быть произвольного размера, а не как ранее 256 чисел. Размер увеличиваться автоматически.)



Свойства и Методы BignumArithmeticFloat

1.Help(); HTML Справка (без параметров).

2.LONG Val = SizeBits(BYTE Bignum, LONG_PTR* pVal) = .LONG Val; Свойство. Задает и возвращает размер длинного числа в БИТАХ LONG Val. Bignum-индекс длинного числа в массиве (0-255).

3.BSTR* String = Bignum(BYTE Bignum, LONG BignumBase=10, LONG_PTR Precision=0, BSTR Separator=”.”, VARIANT_BOOL Exponential=-1) = BSTR* String; Свойство. Принимает и возвращает BSTR* строку String (задает число или возвращает значение). Bignum-индекс длинного числа в массиве (0-255). BignumBase-база длинного числа (от 2 до 36), по умолчанию = 10. Precision – точность (кол-во цифр в числе), по умолчанию = 0 - максимальная (равна заданному размеру в битах). Separator – символ разделителя целой и дробной частей числа, по умолчанию точка(“.”). Exponential – по умолчанию =-1 экспоненциальная запись, 0 – десятичная (в разработке).

(При парсинге строки в число, ожидаемая десятичная точка берется из текущей локали, на системах, предоставляющих localeconv).

4.LONG Val = Sign(BYTE Bignum); Свойство. Возвращает знак длинного числа LONG Val.Возвращает 1 если Bignum > 0, 0 если Bignum = 0, и -1 если Bignum < 0.

5.LONG Val = Compare(BYTE Bignum1, BYTE Bignum2); Метод. Сравнивает два длинных числа. Возвращает 1 если Bignum1 > Bignum2, 0 если Bignum1 = Bignum2, и -1 если Bignum1 < Bignum2.

6.SizeBitsSet(BYTE Bignum, LONG_PTR SizeBits); Метод. Задает размер длинного числа в БИТАХ LONG Val.

7.BignumSet(BYTE Bignum, BSTR StringBSTR, LONG BignumBase=10, BSTR Separator=”.”); Метод. Задает число с параметрами аналогичными свойству Bignum().

8.Sum(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Суммирует два длинных числа. BignumSet = Bignum1 + Bignum2

9.SumL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Суммирует длинное число с обычным. BignumSet = Bignum1 + LONG_PTR(х64:LONG_PTR= LONGLONG, х32:LONG_PTR= LONG)

10.Abs(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает модуль значения из Bignum1 в BignumSet.

11.Subtract(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Вычитает из одного длинного числа второе. BignumSet = Bignum1 - Bignum2.

12.SubtractL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Вычитает из длинного числа обычное. BignumSet = Bignum1 - LONG_PTR.

13.Multiply(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Умножает одно длинное число на второе. BignumSet = Bignum1 * Bignum2.

14.MultiplyL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Умножает длинное число на обычное. BignumSet = Bignum1 * LONG_PTR.

15.Divide(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Делит одно длинное число на второе. BignumSet = Bignum1 / Bignum2

16.DivideL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Делит длинное число на обычное. BignumSet = Bignum1 / LONG_PTR.

17.Root(BYTE BignumSet, BYTE Bignum1); Метод. Извлекает квадратный корень из Bignum1. Результат возвращает в BignumSet. BignumSet = √ Bignum1.

18.Negate(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает значение с противоположным знаком из Bignum1 в BignumSet. BignumSet = - Bignum1.

19.Power(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Возводит в степень LONG_PTR длинное число Bignum1, результат возвращает в BignumSet. BignumSet = Bignum1 ^ LONG_PTR.

20.Clone(BYTE BignumSet, BYTE Bignum1); Метод. Копирует Bignum1 в BignumSet. BignumSet = Bignum1

21.FileSet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Загружает длинное число из файла (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.

(При парсинге строки в число, ожидаемая десятичная точка берется из текущей локали, на системах, предоставляющих localeconv).

22.FileGet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10, LONG_PTR Precision=0); Метод. Сохраняет длинное число в файл (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10. Precision – точность (кол-во цифр в числе), по умолчанию = 0 - максимальная (равна заданному размеру в битах).

23.Clear(LONG Bignum=-1); Метод. Освобождает память занятую длинным числом Bignum, или освобождает память занятую всеми числами при заданном параметре по умолчанию = -1

24.LONG Val = BignumArraySize(); Метод. Возвращает количество чисел Bignum в созданном классе/массиве. Начиная с v2.0.0.0 (теперь массив чисел может быть произвольного размера, а не как ранее 256 чисел. Размер увеличиваться автоматически.)

25.BSTR* String = GetToBignumInt(LONG Bignum, LONG BignumBase=10); Метод. Преобразовать Bignum из Float в Integer и вывести. ВАЖНО! преобразование происходит с заданной ранее точностью в битах для Float (SizeBitsSet). Без округлений, отбрасывается дробная часть. Будьте внимательнее в таких преобразованиях. Начиная с v2.0.0.0.





2.XLL для Excel с C API функциями. Добавил базовый набор. Будет потребность в дополнительных - добавлю по запросу.
Для функций создано два раздела в стандартном списке с названиями классов в COM (+один общий).
Функции поддерживают многопоточные расчеты.
Работа с функциями как с обычными (различий нет). Обычные написаны тоже на С/С++ под C API.

Список C API - функций в Excel:
1.BedvitXLLBignumArithmeticInteger - функции для работы с длинными целыми числами.
Функции:
1.1 SumInteger() - сложение двух длинных/обычных целых чисел
1.2 SubtractInteger() - вычитание двух длинных/обычных целых чисел
1.3 MultiplyInteger() - умножение двух длинных/обычных целых чисел
1.4 DivideInteger() - деление двух длинных/обычных целых чисел - Неполное частное
1.5 ModInteger() - деление двух длинных/обычных целых чисел - Остаток от деления
1.6 PowerInteger() - возведение в степень длинного/обычного целого числа
1.7 ConvertBaseInteger() - конвертирование целого числа (строки) из одной базы в другую (от 2 до 36).
1.8 FactorialInteger() - факториал задаваемого числа.

2.XLLBignumArithmeticFloat - функции для работы с длинными дробными числами.
Функции:
2.1 SumFloat() - сложение двух длинных/обычных чисел с плавающей точкой
2.2 SubtractFloat() - вычитание двух длинных/обычных чисел с плавающей точкой
2.3 MultiplyFloat() - умножение двух длинных/обычных чисел с плавающей точкой
2.4 DivideFloat() - деление двух длинных/обычных чисел с плавающей точкой
2.5 PowerFloat() - возведение в степень длинного/обычного числа
2.6 RootFloat() - извлечение квадратного корня из длинного/обычного числа

Так же в XLL ресурсы упакована COM.DLL (первый блок проекта), распаковывается и устанавливается под пользователем - автоматом.
Поэтому открываем XLL или устанавливаем как надстройку - готово (ничего регистрировать не надо).
Пишем код в VBA и работаем. Советую раннее связывание. Видим свойства и методы объекта.
Оные можно посмотреть и в диспетчере объектов (см. рис.)
Т.е. при открытии XLL можно работать как с новыми C API функциями, так и с COM.DLL через VBA.

Примеры см. ниже.

Ресурсы:
MPIR library, Edition 3.0.0 (freely distributable librarys)
http://mpir.org/
+ my code written in C / C ++

©2018, BedvitCOM, BedvitXLL
License: Freely distributable library

Где тестировалось:
Пример №1 (Расширенный): VBA - через индексы, раннее+позднее связывание:
Visual Basic
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
35
36
'Для раннего связывания сначала включаем в References библиотеку, потом в конце кода отключаем. 
'Для позднего связывания этого не нужно (см.ниже).
'Sub RUN() 'ЗАПУСКАЕМ ДЛЯ РАННЕГО СВЯЗЫВАНИЯ
'ThisWorkbook.VBProject.References.AddFromGuid "{77D79CA3-15A0-4310-B8D8-0BCBE3F72D96}", 1, 0 ' подключаем библиотеку "BedvitCOM" в References VBA
'Continue 'выполняем нужные команды
'ThisWorkbook.VBProject.References.Remove ThisWorkbook.VBProject.References("BedvitCOM") 'отключаем библиотеку в References VBA
'End Sub
 
Sub Continue()
'раннее связывание
'Dim I As New BignumArithmeticInteger 'Создаем экземпляр класса - массив целых больших чисел
'Dim F As New BignumArithmeticFloat  'Создаем экземпляр класса - массив больших чисел с плавающей точкой
 
'позднее связывание
Dim I As Object: Set I = CreateObject("BedvitCOM.BignumArithmeticInteger")
Dim F As Object: Set F = CreateObject("BedvitCOM.BignumArithmeticFloat")
 
I.Bignum(1) = "111" & String$(74, "1") 'добавляем число из 103 единиц в первое целое длинное число
I.BignumSet 1, "111" & String$(74, "1") 'или так
F.SizeBits(1) = 256 'задаем размер в битах для 1го числа с плавающей точкой (закрывает точность в 77 символов, для десятичной системы)
F.SizeBits(2) = 256 'задаем размер в битах для 2го числа с плавающей точкой
F.SizeBits(3) = 256 'задаем размер в битах для 3го числа с плавающей точкой
F.Bignum(1) = I.Bignum(1) 'копируем данные из одного класса чисел в другой из Integer в Float (из первого в первое)
F.Clone 2, 1 'копируем в рамках одного класса число из первого во второе, т.е. число 2 = числу 1 (в рамках одного класса такое копирование на порядки быстрее)
F.Sum 3, 2, 1 'суммируем в 3е число первое и второе: число3 = число2 + число1
'логика всей арифметики в классах предполагает получение результата в первом параметре(левой части выражения) по аналогии с "x =..."
Debug.Print F.Bignum(3) 'смотрим результат в третьем числе Float
'2.2222222222222222222222222222222222222222222222222222222222222222222222222222E+76 (помещается в 256 бит для возможности перевести в Float, без потери точности)
I.Bignum(3) = F.GetToBignumInt(3) 'преобразование (без округлений, отбрасывается дробная часть) и копирование из Float в Integer с !!!заданной ранее точностью SizeBits!!!  Задавайте нужную точность сразу в BignumArithmeticFloat.
Debug.Print I.Bignum(3) 'смотрим результат в третьем числе Integer
I.Help 'смотрим Help
F.FileGet 3, "C:\1.txt" 'сохраняем 3-е число в файл "C:\1.txt"
'F.Clear 1 'освобождаем память для 1-го числа объекта F (число =0), начиная с BedvitCOM v.2.0.0.0 - это не обязательная команда.
'F.Clear 'освобождаем память для всего объекта F (число =0), начиная с BedvitCOM v.2.0.0.0 - это не обязательная команда.
'I.Clear 'освобождаем память для всего объекта I (число =0), начиная с BedvitCOM v.2.0.0.0 - это не обязательная команда.
End Sub
Пример №2: 1С
1C
1
2
3
4
5
6
7
8
F = Новый COMОбъект("BedvitCOM.BignumArithmeticDouble"); //Создаем массив больших чисел с плавающей точкой и арифметикой (класс)
F.SizeBitsSet(1,256); //задаем размер в битах для 1го числа с плавающей точкой
F.SetBignum(1, "11111"); //присваиваем данные для 1го числа
F.Power(1,1,51561); //возводим в степень 51561 первое число и кладем его в первое же число.
f = F.Bignum(1); //кладем данные в переменную из первого числа
Сообщить(f); //смотрим
F.Help(); //смотрим Help
F.Clear(1); 'освобождаем память первого числа

Пример №3 (Простой): VBA - через буквенное обозначение, позднее связывание
Visual Basic
1
2
3
4
5
6
7
8
Dim A, B, C: A = 1: B = 2: C = 3
Dim I As Object: Set I = CreateObject("BedvitCOM.BignumArithmeticInteger") 'Создаем массив целых больших чисел и арифметикой (класс)
I.BignumSet A, "12324344435654132546546546564453131" 'задаем данные в число A
I.BignumSet B, "34534534546546546546554665513213211" 'задаем данные в число B
I.BignumSet C, "0" 'задаем данные в число B
I.Sum C, A, B 'C=A+B
Debug.Print I.Bignum(C) 'смотрим
I.Help 'смотрим Help

Пример №4: 1С - через буквенное обозначение
1C
1
2
3
4
5
6
7
8
9
A=1; B=2; C=3; 
I = Новый COMОбъект("BedvitCOM.BignumArithmeticInteger"); //Создаем массив целых больших чисел и арифметикой (класс)
I.BignumSet(A,"12324344435654132546546546564453131");  //задаем данные в число A
I.BignumSet(B,"34534534546546546546554665513213211");  //задаем данные в число B
I.BignumSet(C,"0");  //задаем данные в число С
I.Sum(C,A,B); //C=A+B
Сообщить(I.Bignum(C)); //смотрим данные в числе С
I.Help(); //смотрим Help
I.Clear(); //освобождаем память для всего объекта I


26/03/2018 - Версия 0.0.0.1 под x64.



05/04/2018 - Новая версия BedvitCOM v.1.0.0.2 и BedvitXLL v.1.0.0.2
Изменения:
1. Изменен порядок аргументов в методе "BignumSet" (теперь, как во всех других методах, номер длинного числа в массиве - стоит первым аргументом), см.под спойлером
Кликните здесь для просмотра всего текста
Ранее было так:
I.BignumSet "6546414654564" , 1
теперь так:
I.BignumSet 1, "6546414654564"

2. Добавлены новые методы в два класса (запись длинного числа в файл .txt и чтение из файла)
.FileSet, .FileGet (описание в .Help и ниже)
3. Собраны библиотеки COM и XLL в 32-разрядной версии (с корректным Help-ом, описанием интерфейса).



24/04/2018 - Новая версия BedvitCOM v.1.0.0.3 и BedvitXLL v.1.0.0.3 (поддержка х32 и х64)
1. Добавлены новые функции в два класса библиотеки COM - арифметика длинных чисел с обычными, т.е. теперь можно совершать арифметические действия длинных чисел с обычными.
2. Добавлен механизм очистки/освобождения памяти как для одного числа, так и для класса/объекта в целом.
3. Сделано новое описание для всех свойств и методов двух классов на русском языке в справке (см. под спойлером и в .HELP)
4. XLL теперь удаляет данные из реестра (COM.DLL) под пользователем при закрытии надстройки.



29/04/2022 - Новая версия BedvitCOM v.2.0.0.0
1.Класс/массив Bignum теперь может быть любого размера, а не как ранее 256 чисел. Увеличение размера происходит автоматом, в зависимости от последнего задаваемого индекса числа в массиве.
2.В связи с этим добавлен метод BignumArraySize() - Возвращает количество чисел Bignum в созданном классе/массиве.
3.Добавлено преобразование Bignum из Float в Integer (обратное преобразование было возможно и ранее). Метод GetToBignumInt(LONG Bignum, LONG BignumBase=10). ВАЖНО! преобразование происходит с заданной ранее точностью в битах для Float (SizeBitsSet). Без округлений, отбрасывается дробная часть. Будьте внимательнее в таких преобразованиях.
4.Исправлен баг в выделением памяти для разных экземпляров одного и того же класса. Теперь для каждого экземпляра - свой участок памяти.
5.Теперь деструктор класса сам очищает память (при удалении класса или завершении процедуры в VBA). Методы Clear теперь нужны только там, где нужно освободить память в действующим классе. При завершении процедуры их писать не обязательно (для VB, и для языков, где класс уничтожается при завершении процедуры - запуская деструктор).
Миниатюры
Нажмите на изображение для увеличения
Название: BedvitXLL.PNG
Просмотров: 1647
Размер:	23.0 Кб
ID:	4738   Нажмите на изображение для увеличения
Название: BedvitXLL2.PNG
Просмотров: 1375
Размер:	14.8 Кб
ID:	4739   Нажмите на изображение для увеличения
Название: BedvitCOM3.PNG
Просмотров: 1561
Размер:	31.9 Кб
ID:	4786  

Нажмите на изображение для увеличения
Название: BedvitCOM5.PNG
Просмотров: 1813
Размер:	68.3 Кб
ID:	4787  
Изображения
 
Вложения
Тип файла: zip BedvitDLLv0.0.0.1.zip (560.0 Кб, 612 просмотров)
Тип файла: zip BedvitDLLv1.0.0.2x32.zip (474.2 Кб, 663 просмотров)
Тип файла: zip BedvitDLLv1.0.0.2x64.zip (556.8 Кб, 622 просмотров)
Тип файла: zip BedvitDLLv1.0.0.3x32.zip (701.8 Кб, 667 просмотров)
Тип файла: zip BedvitDLLv1.0.0.3x64.zip (754.7 Кб, 708 просмотров)
Метки c, c++
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 160
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    Ну так и я про это, она не кросс потому что СOM.
    Хотя GMP кросс.
    Запись от Avazart размещена 02.04.2018 в 23:35 Avazart вне форума
  2. Старый комментарий
    Аватар для bedvit
    Avazart, предложите вариант, когда библиотека будет кросс, и для всех языков? (GMP только для С\С++)
    Запись от bedvit размещена 03.04.2018 в 08:59 bedvit вне форума
  3. Старый комментарий
    Цитата Сообщение от Avazart
    Ну так и я про это, она не кросс потому что СOM.
    Она COM потому что под Windows. Если бы изначально здесь она позиционировала себя как кроссплатформенная, тогда был бы другой разговор, но опять-таки ничего не мешает сделать ее COM и использовать на других платформах, просто потеряв те фичи которые предоставляет Windows под COM.

    Вопросы в другом:
    Лучше и проще для конечного программиста ибо не нужно связываться с COM.
    Чем лучше и чем проще? Я приводил код на ассемблере, чем проще не-COM метод? Зато с COM мы получаем полную поддержку со стороны скриптовых языков типа vbs, 1С и т.д.

    но во первых должны быть средства для реализации этих структур на VBA, во вторых их можно обвернуть в Си ф-ции т.е сделать свою прослойку скрыв структуры за void*
    А как тоже самое сделать для vbs или js?

    Что со скоростью? Учитывая несколько прослоек?
    Каких прослоек? Чем отличается вызов метода от вызова экспортируемой функции?
    Запись от The trick размещена 03.04.2018 в 09:25 The trick вне форума
  4. Старый комментарий
    Аватар для Avazart
    стороны скриптовых языков типа vbs, 1С и т.д.
    Умолчу об этих языках.

    В python Вы запросто можете импортировать ф-ции (правда это на вряд ли потребуется).


    Чем отличается вызов метода от вызова экспортируемой функции?
    Вызов через COM прослойку.
    Запись от Avazart размещена 03.04.2018 в 11:44 Avazart вне форума
  5. Старый комментарий
    Аватар для Avazart
    Она COM потому что под Windows. Если бы изначально здесь она позиционировала себя как кроссплатформенная,
    Почему нет?

    Avazart, предложите вариант, когда библиотека будет кросс, и для всех языков? (GMP только для С\С++)
    Ну если либа на Си то скорее всего ее можно использовать под все языки, если язык поддерживает импорт ф-ций.
    Дело лишь за правильным импортом фций и ООП-обвертки на самом языке для удобства.
    Запись от Avazart размещена 03.04.2018 в 11:49 Avazart вне форума
  6. Старый комментарий
    Цитата Сообщение от Avazart
    Умолчу об этих языках.
    В python Вы запросто можете импортировать ф-ции (правда это на вряд ли потребуется).
    Не вижу тогда преимуществ, в python также я думаю можно работать с COM.

    Вызов через COM прослойку.
    Какую прослойку? Что такое COM-прослойка? Вызов метода COM объекта это вызов функции по указателю. Какая разница вызывать функцию так или же посредством импорта?

    Почему нет?
    Это ко мне вопрос? Я не знаю, это же не я разработчик этой библиотеки. Второй момент, каким образом сделать ее кроссплатформенной чтобы покрыть тот-же набор клиентских продуктов?

    Ну если либа на Си то скорее всего ее можно использовать под все языки, если язык поддерживает импорт ф-ций.
    Дело лишь за правильным импортом фций и ООП-обвертки на самом языке для удобства.
    Ну так какая разница, все равно нужно делать несколько билдов под разные платформы. В текущем виде также можно сделать несколько билдов которые будут предоставлять COM объект, точнее уже сейчас он предоставляется через те же самые экспортируемые функции. Сама COM технология платформо-независима, ее можно реализовать хоть на микроконтроллере:
    The Microsoft Component Object Model (COM) is a platform-independent, distributed, object-oriented system for creating binary software components that can interact.
    Запись от The trick размещена 03.04.2018 в 12:15 The trick вне форума
  7. Старый комментарий
    Аватар для Avazart
    Не вижу тогда преимуществ, в python также я думаю можно работать с COM.
    В питон можно работать по Linux и MacOS.
    Так что можно но не нужно.

    Сама COM технология платформо-независима, ее можно реализовать хоть на микроконтроллере:
    The Microsoft Component Object Model (COM) is a platform-independent,
    Ну вероятно у Microsoft свое представление о платформо-независимости.

    Ну так какая разница, все равно нужно делать несколько билдов под разные платформы.
    А это что проблема?
    Запись от Avazart размещена 03.04.2018 в 12:29 Avazart вне форума
  8. Старый комментарий
    Цитата Сообщение от Avazart
    В питон можно работать по Linux и MacOS.
    Так что можно но не нужно.
    Мы говорим о том что можно работать, а не о том что не нужно. Можно работать - плюс, нельзя (как в случае vbs/js) - минус. Пока плюсов больше у COM.

    Ну вероятно у Microsoft свое представление о платформо-независимости.
    Хорошо, что в технологии COM является платформо-зависимым? Т.е. к примеру у меня есть COM объект, какие сложности в работе с этим COM объектом возникнут например в Linux?
    Запись от The trick размещена 03.04.2018 в 12:44 The trick вне форума
  9. Старый комментарий
    А это что проблема?
    Нет, я об этом и написал:
    В текущем виде также можно сделать несколько билдов которые будут предоставлять COM объект, точнее уже сейчас он предоставляется через те же самые экспортируемые функции
    Запись от The trick размещена 03.04.2018 в 12:45 The trick вне форума
  10. Старый комментарий
    Аватар для Avazart
    Мы говорим о том что можно работать, а не о том что не нужно.
    Я не знаю что нужно, я говорю что охват может быть больше.
    Можно работать - плюс, нельзя (как в случае vbs/js) - минус.
    А нужно что бы работало под js ? Если не секрет где?

    Хорошо, что в технологии COM является платформо-зависимым? Т.е. к примеру у меня есть COM объект, какие сложности в работе с этим COM объектом возникнут например в Linux?
    COM под Linux насколько я знаю не используется, т.е вероятно есть какие-то отдельные извращения, но...
    И явно будет легче использовать обычную dll + обвертку.
    Запись от Avazart размещена 03.04.2018 в 12:49 Avazart вне форума
  11. Старый комментарий
    Цитата Сообщение от Avazart
    Я не знаю что нужно, я говорю что охват может быть больше.
    Где больше-то? Пока больше у варианта с COM.

    Цитата Сообщение от Avazart
    А нужно что бы работало под js ? Если не секрет где?
    Не знаю, я не пишу на js, но на vbs часто. Все-таки наверное лучше когда можно использовать дополнительный язык, не так ли? С COM мы можем как минимум vbs/js/1C использовать. Для чего был приведен в пример python я не знаю, в нем также можно использовать COM.

    Цитата Сообщение от Avazart
    COM под Linux насколько я знаю не используется, т.е вероятно есть какие-то отдельные извращения, но...
    И явно будет легче использовать обычную dll + обвертку.
    Как можно не зная технологию что-то утверждать? Специально скинул на ассемблере листинг, чтобы посмотреть как детально это работает. Да даже просто логически подумать что намного лучше иметь указатель на нужные функции и их вызывать вместо того чтобы импортировать кучу функций получая тот же результат.
    Запись от The trick размещена 03.04.2018 в 13:15 The trick вне форума
  12. Старый комментарий
    Аватар для bedvit
    Цитата Сообщение от The trick
    С COM мы можем как минимум vbs/js/1C использовать
    + VBA, где подключается одной строкой CreateObject(), и никаких обвязок делать не надо.
    + многие не настолько прокачены (в т.ч. и автор этих строк), как Вы, уважаемые коллеги, и вряд ли кто-то будет делать обвязку самостоятельно. Сейчас все хотят решение из коробки - открыть, работать. С этими целями и делался продукт + максимальный охват разных языков. Те, кто пишет на С/С++/C# могут сами подключить GMP/MPIR и пользоваться.
    Запись от bedvit размещена 03.04.2018 в 15:00 bedvit вне форума
  13. Старый комментарий
    Аватар для Avazart
    Ну так у него уже есть обвязка в виде классов BignumArithmeticInteger и BignumArithmeticFloat.

    Те, кто пишет на С/С++/C# могут сами подключить GMP/MPIR и пользоваться.
    C/C++ понятно но С# вроде та же история, нет?
    Запись от Avazart размещена 03.04.2018 в 20:42 Avazart вне форума
  14. Старый комментарий
    Аватар для Avazart
    Где больше-то? Пока больше у варианта с COM.
    С учетом что выпадают две ОС ?
    Запись от Avazart размещена 03.04.2018 в 20:45 Avazart вне форума
  15. Старый комментарий
    Аватар для bedvit
    Цитата Сообщение от Avazart
    С/C++ понятно но С# вроде та же история, нет?
    В MPIR, Edition 3.0.0. добавлен интерфейс для С#.NET. А когда то ранее сам пилил, для старых версий (был только сишный).
    Запись от bedvit размещена 03.04.2018 в 21:19 bedvit вне форума
  16. Старый комментарий
    Цитата Сообщение от Avazart
    С учетом что выпадают две ОС ?
    Не выпадают.
    Запись от The trick размещена 03.04.2018 в 22:26 The trick вне форума
  17. Старый комментарий
    Аватар для Avazart
    Не выпадают.
    Можно код для Linux к примеру на С++? Для подгрузки этой либы?
    Запись от Avazart размещена 03.04.2018 в 23:05 Avazart вне форума
  18. Старый комментарий
    Цитата Сообщение от Avazart
    Можно код для Linux к примеру на С++? Для подгрузки этой либы?
    Ну когда билд под Linux будет тогда я непременно покажу как это сделать. Мне не составит труда вызвать функцию по указателю, несмотря на то что я никогда не кодил под Linux.
    Запись от The trick размещена 03.04.2018 в 23:23 The trick вне форума
  19. Старый комментарий
    Аватар для bedvit
    Цитата Сообщение от Avazart
    Можно код для Linux к примеру на С++? Для подгрузки этой либы?
    На С++ вы можете спокойно подключать GMP и пользоваться. Эта библа дополнение, а не замена к оригинальной библиотеке. Сколько обычных клиентов сидят на win, сколько на других ОС и пользуются не С\С++\С#(net сейчас заходит на другие платформы(?)). О каких процентах мы говорим? значимы ли они, в свете существования оригинальной библы.
    Запись от bedvit размещена 04.04.2018 в 08:43 bedvit вне форума
  20. Старый комментарий
    Цитата Сообщение от bedvit
    На С++ вы можете спокойно подключать GMP и пользоваться. Эта библа дополнение, а не замена к оригинальной библиотеке. Сколько обычных клиентов сидят на win, сколько на других ОС и пользуются не С\С++\С#(net сейчас заходит на другие платформы(?)). О каких процентах мы говорим? значимы ли они, в свете существования оригинальной библы.
    Ничто не помешает использовать данную COM библиотеку на других платформах.
    Запись от The trick размещена 04.04.2018 в 19:50 The trick вне форума
 
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru