Форум программистов, компьютерный форум, киберфорум
bedvit
Войти
Регистрация
Восстановить пароль
Рейтинг: 3.67. Голосов: 6.

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

Запись от bedvit размещена 26.03.2018 в 22:15
Обновил(-а) bedvit 30.11.2023 в 11:55 (Более наглядный Пример №1)

Теперь часть библиотеки 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
Просмотров: 1052
Размер:	23.0 Кб
ID:	4738   Нажмите на изображение для увеличения
Название: BedvitXLL2.PNG
Просмотров: 865
Размер:	14.8 Кб
ID:	4739   Нажмите на изображение для увеличения
Название: BedvitCOM3.PNG
Просмотров: 970
Размер:	31.9 Кб
ID:	4786  

Нажмите на изображение для увеличения
Название: BedvitCOM5.PNG
Просмотров: 1070
Размер:	68.3 Кб
ID:	4787  
Изображения
 
Вложения
Тип файла: zip BedvitDLLv0.0.0.1.zip (560.0 Кб, 334 просмотров)
Тип файла: zip BedvitDLLv1.0.0.2x32.zip (474.2 Кб, 313 просмотров)
Тип файла: zip BedvitDLLv1.0.0.2x64.zip (556.8 Кб, 272 просмотров)
Тип файла: zip BedvitDLLv1.0.0.3x32.zip (701.8 Кб, 298 просмотров)
Тип файла: zip BedvitDLLv1.0.0.3x64.zip (754.7 Кб, 366 просмотров)
Размещено в Без категории
Показов 21710 Комментарии 160
Всего комментариев 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 вне форума
    Обновил(-а) Avazart 03.04.2018 в 11:45
  5. Старый комментарий
    Аватар для Avazart
    Цитата:
    Она COM потому что под Windows. Если бы изначально здесь она позиционировала себя как кроссплатформенная,
    Почему нет?

    Цитата:
    Avazart, предложите вариант, когда библиотека будет кросс, и для всех языков? (GMP только для С\С++)
    Ну если либа на Си то скорее всего ее можно использовать под все языки, если язык поддерживает импорт ф-ций.
    Дело лишь за правильным импортом фций и ООП-обвертки на самом языке для удобства.
    Запись от Avazart размещена 03.04.2018 в 11:49 Avazart вне форума
    Обновил(-а) Avazart 03.04.2018 в 11:53
  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 вне форума
    Обновил(-а) Avazart 03.04.2018 в 12:35
  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 вне форума
    Обновил(-а) Avazart 03.04.2018 в 12:52
  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 вне форума
    Обновил(-а) The trick 03.04.2018 в 13:19
  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 вне форума
    Обновил(-а) Avazart 03.04.2018 в 20:43
  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 вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru