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

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

Запись от bedvit размещена 26.03.2018 в 22:15
Показов 23079 Комментарии 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
Просмотров: 1384
Размер:	23.0 Кб
ID:	4738   Нажмите на изображение для увеличения
Название: BedvitXLL2.PNG
Просмотров: 1162
Размер:	14.8 Кб
ID:	4739   Нажмите на изображение для увеличения
Название: BedvitCOM3.PNG
Просмотров: 1252
Размер:	31.9 Кб
ID:	4786  

Нажмите на изображение для увеличения
Название: BedvitCOM5.PNG
Просмотров: 1429
Размер:	68.3 Кб
ID:	4787  
Изображения
 
Вложения
Тип файла: zip BedvitDLLv0.0.0.1.zip (560.0 Кб, 528 просмотров)
Тип файла: zip BedvitDLLv1.0.0.2x32.zip (474.2 Кб, 575 просмотров)
Тип файла: zip BedvitDLLv1.0.0.2x64.zip (556.8 Кб, 520 просмотров)
Тип файла: zip BedvitDLLv1.0.0.3x32.zip (701.8 Кб, 555 просмотров)
Тип файла: zip BedvitDLLv1.0.0.3x64.zip (754.7 Кб, 623 просмотров)
Метки c, c++
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 160
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    Покажите мне сначала VB для Linux, чтобы я ознакомился с его характеристиками.
    Я не знаю, но наверное Mono?
    Запись от Avazart размещена 10.04.2018 в 14:23 Avazart вне форума
  2. Старый комментарий
    Цитата Сообщение от Avazart
    Если тянуть объекты в не ООП, не может получится иначе.
    Цитата Сообщение от The trick
    Вы так сказали? Код будет нормальный.
    Чем концептуально структура отличается от объекта?
    Запись от The trick размещена 10.04.2018 в 14:24 The trick вне форума
  3. Старый комментарий
    Цитата Сообщение от Avazart
    Я не знаю, но наверное Mono?
    Так Вы не знаете или это Mono? Mono - это VB?
    Запись от The trick размещена 10.04.2018 в 14:27 The trick вне форума
  4. Старый комментарий
    Аватар для Avazart
    Чем концептуально структура отличается от объекта?
    Наличием методов и сокрытием, поддержкой наследования итд итп.
    Запись от Avazart размещена 10.04.2018 в 16:20 Avazart вне форума
  5. Старый комментарий
    Аватар для Avazart
    Так Вы не знаете или это Mono? Mono - это VB?
    Судя по информации из интернета Mono.
    Запись от Avazart размещена 10.04.2018 в 16:21 Avazart вне форума
  6. Старый комментарий
    Цитата Сообщение от Avazart
    Наличием методов и сокрытием, поддержкой наследования итд итп.[HASKELL]
    Я спросил не отличие класса от структуры, а отличие объекта от структуры.

    Цитата Сообщение от Avazart
    Судя по информации из интернета Mono.
    Поверхностный осмотр показал что это позволяет компилировать приложения на VB.NET для Linux. VB.NET позволяет работать с COM как через подключение библиотеки типов, так и объявляя интерфейс. Никаких ограничений на COM объекты я не увидел, только для элементов управления, но данная библиотека и библиотека на C не являются элементами управления. Во-вторых, про COM написано следующее:
    Mono has internal support for dealing with COM calls, via the COM Interop layer, which means the whole process is completely transparent to the developer.
    Ну также вот http://www.mono-project.com/docs/advanced/com-interop/
    Если есть пример который не позволяет запустить озвученную библиотеку написанную на C в VB.NET прошу показать, тогда посмотрим.
    Запись от The trick размещена 10.04.2018 в 17:11 The trick вне форума
  7. Старый комментарий
    Аватар для Avazart
    Я спросил не отличие класса от структуры, а отличие объекта от структуры.
    По тому что объект это не только данные, но и методы их обработки.
    Запись от Avazart размещена 10.04.2018 в 17:28 Avazart вне форума
  8. Старый комментарий
    Цитата Сообщение от Avazart
    По тому что объект это не только данные, но и методы их обработки.
    Ответьте на вопрос. В С++ в объявление структуры тоже можно вставить методы. Я у Вас не про это спрашиваю, а об отличии экземпляра объекта от экземпляра структуры.
    Запись от The trick размещена 10.04.2018 в 17:32 The trick вне форума
  9. Старый комментарий
    Аватар для Avazart
    Что значит тоже?
    В С++ обычно разделяют понятия структур на по POD(как в Си) и не POD (как классы).
    Запись от Avazart размещена 10.04.2018 в 21:48 Avazart вне форума
  10. Старый комментарий
    Цитата Сообщение от Avazart
    Что значит тоже?
    "Тоже" здесь имеет свое прямое значение. Задал я этот вопрос потому что объект - это и есть структура. C - прекрасно работает со структурами, поэтому и с объектами COM он будет нормально, а не "треш".
    Запись от The trick размещена 10.04.2018 в 21:51 The trick вне форума
  11. Старый комментарий
    Аватар для Avazart
    Если так думать можно все что угодно назвать объектом, в чем честь смысл, но не при данном контексте.

    Про объект я говорил в ООП контексте.

    Кроме того код именно - треш, даже для Си ибо в Си обычно работают через дескрипторы.
    А СОM в данном случае выглядит как костыльный костыль.

    Уберите из моего кода на С++ класс обвертку и оставьте Си ф-ции и получите куда более привычный код на Си.
    Запись от Avazart размещена 10.04.2018 в 23:40 Avazart вне форума
  12. Старый комментарий
    Цитата Сообщение от Avazart
    Если так думать можно все что угодно назвать объектом, в чем честь смысл, но не при данном контексте.
    Смысл в том что COM объект и есть структура, а в C работа со структурами - обычная практика. Называть работу с COM трешовым кодом, тоже самое что называть работу со структурами трешовой.

    Цитата Сообщение от Avazart
    Про объект я говорил в ООП контексте.
    А что поменяется для пользователя COM объекта если говорить об этом в ООП контексте? Что для C++, что для C это будет вызов функции по виртуальной таблице и запрос интерфейса через QueryInterface когда нужно.

    Цитата Сообщение от Avazart
    Кроме того код именно - треш, даже для Си ибо в Си обычно работают через дескрипторы.
    А СОM в данном случае выглядит как костыльный костыль.
    Не треш. Код для C++ и для C почти одинаковый:
    C++
    1
    
    example->SetString("Some text");
    C
    1
    
    example->lpVtbl->SetString("Some text");
    А дескртиптор это что? В COM дескриптором можно назвать указатель на интерфейс. Что поменялось?

    Цитата Сообщение от Avazart
    Уберите из моего кода на С++ класс обвертку и оставьте Си ф-ции и получите куда более привычный код на Си.
    Для чего убирать ООП обертку если мы наоборот стараемся охватить как можно больше языков? Как минимум языки указанные ранее не работают с импортом, а работают нативно с COM (к тому же очень просто). Т.е. либо мы оставляем COM и имеем больший охват языков, либо мы убираем COM (в угоду чему?) и лишаемся как минимум тех языков о которых говорилось ранее, а также преимуществ COM технологии.
    Запись от The trick размещена 11.04.2018 в 13:01 The trick вне форума
  13. Старый комментарий
    Аватар для Black Fregat
    Внимательно слежу. Уважаемый Avazart уже одиннадцать страниц воюет с ветряными мельницами. Лишь бы не признать, что для перечисленных языков (VBA, 1С) решение через COM реально проще использовать.

    Мне тоже приходилось работать через COM на C++ - так это небо и земля. Я даже в трудные моменты специально открывал Word и писал там макрос, чтобы лучше разобраться
    Запись от Black Fregat размещена 11.04.2018 в 13:38 Black Fregat вне форума
  14. Старый комментарий
    Аватар для Avazart
    Я изначально утверждал что через импорт ф-ций будет лучше и проще. Для любых языков.
    Запись от Avazart размещена 11.04.2018 в 14:39 Avazart вне форума
  15. Старый комментарий
    Цитата Сообщение от Avazart
    Я изначально утверждал что через импорт ф-ций будет лучше и проще. Для любых языков.
    Нет, это лишь Ваши ничем не подтвержденные слова. Вам это уже неоднократно доказали.
    Запись от The trick размещена 11.04.2018 в 14:58 The trick вне форума
  16. Старый комментарий
    Аватар для bedvit
    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) под пользователем при закрытии надстройки.
    Запись от bedvit размещена 24.04.2018 в 20:08 bedvit вне форума
  17. Старый комментарий
    Аватар для bedvit
    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, и для языков, где класс уничтожается при завершении процедуры - запуская деструктор).
    Запись от bedvit размещена 23.06.2022 в 20:24 bedvit вне форума
  18. Старый комментарий
    СОМ несёт значительное замедление для арифметических операций, которые для обычных чисел (80-бит) исполняются очень быстро.

    Если скорость не важна, то можно веб сервисом.
    http://www.dneonline.com/calculator.asmx
    Запись от QueryMonkey размещена 24.06.2022 в 05:03 QueryMonkey вне форума
  19. Старый комментарий
    Аватар для bedvit
    QueryMonkey, для обычных чисел нужно использовать обычную арифметику, для для бОльших точностей - длинную арифметику. Дополнительные обертки кушают ресурсы, но позволяют получить нужный инструмент там, где его гет. Ваш сайт - это реклама? Для языков С++, С# можно использовать MPIR напрямую с максимальным выхлопом, вплодь до оптимизации для конкретного процессора.
    К чему ваш пост, вы читали тему? Может вы хотели донести что-то важное?
    Запись от bedvit размещена 24.06.2022 в 09:18 bedvit вне форума
  20. Старый комментарий
    Извините, я не заметил возраст этой записи. Почитал комментарии - тут и до меня все сказали.
    Запись от QueryMonkey размещена 24.06.2022 в 17:01 QueryMonkey вне форума
 
Новые блоги и статьи
Оптимизация производительности Express.js бэкенда
Reangularity 23.05.2025
Express. js заслуженно остаётся одним из самых популярных инструментов для создания бэкенда, но даже он не застрахован от проблем с производительностью. Многие разработчики сталкиваются с ситуацией,. . .
Продвинутая обработка данных с LINQ в C#
stackOverflow 23.05.2025
LINQ (Language Integrated Query) — это фундаментальное изменение парадигмы работы с данными в C#. Простые запросы Where и Select знакомы любому разработчику, но настоящая мощь LINQ раскрывается в. . .
Инфраструктура PKI и сертификатов безопасности
Mr. Docker 23.05.2025
PKI (Public Key Infrastructure) — это невидимый фундамент цифрового доверия, без которого современный интернет просто рассыпался бы как карточный домик. За этой аббревиатурой скрывается целый. . .
Аутентификация OAuth в Python
py-thonny 22.05.2025
OAuth (Open Authorization) — это целый стандарт для делегированного доступа. Звучит занудно? Давайте проще: OAuth позволяет приложениям получать доступ к информации пользователя на сторонних сервисах. . .
Хеширование и соль паролей в веб-приложениях C#
stackOverflow 22.05.2025
Когда-то в начале своей карьеры я тоже грешил простейшими подходами к хранению паролей – MD5-хеширование казалось верхом защиты. Но технологии не стоят на месте, вычислительные мощьности растут, и. . .
Генераторы Python для эффективной обработки данных
AI_Generated 21.05.2025
В Python существует инструмент настолько мощный и в то же время недооценённый, что я часто сравниваю его с тайным оружием в арсенале программиста. Речь идёт о генераторах — одной из самых элегантных. . .
Чем заменить Swagger в .NET WebAPI
stackOverflow 21.05.2025
Если вы создавали Web API на . NET в последние несколько лет, то наверняка сталкивались с зелёным интерфейсом Swagger UI. Этот инструмент стал практически стандартом для документирования и. . .
Использование Linq2Db в проектах C# .NET
UnmanagedCoder 21.05.2025
Среди множества претендентов на корону "идеального ORM" особое место занимает Linq2Db — микро-ORM, балансирующий между мощью полноценных инструментов и легковесностью ручного написания SQL. Что. . .
Реализация Domain-Driven Design с Java
Javaican 20.05.2025
DDD — это настоящий спасательный круг для проектов со сложной бизнес-логикой. Подход, предложенный Эриком Эвансом, позволяет создавать элегантные решения, которые точно отражают реальную предметную. . .
Возможности и нововведения C# 14
stackOverflow 20.05.2025
Выход версии C# 14, который ожидается вместе с . NET 10, приносит ряд интересных нововведений, действительно упрощающих жизнь разработчиков. Вы уже хотите опробовать эти новшества? Не проблема! Просто. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru