Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 08.01.2023
Сообщений: 36

Ошибки при передаче в dll массива и его возвращение

10.04.2023, 20:45. Показов 3605. Ответов 49

Студворк — интернет-сервис помощи студентам
Приветствую форумчан. Возник вопрос: как передать массив из действительных чисел в dll, а потом вернуть полученный результат - такой же массив. Попытался найти что-нибудь в интернете по этому поводу, но ничего полезного для себя найти не смог. Мое задание: есть последовательность, ее значения необходимо "сгладить", но мне либо просто не скомпилировать какой-либо из файлов, либо вылезает ошибка при работе кода, что " '' is not a valid floating point value. ".
Кто-нибудь может дать совет моим начинаниям?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2023, 20:45
Ответы с готовыми решениями:

Одинаково ли быстродействие: 1. при передаче параметров в функцию или 2. создание кортежа и передаче его в функцию?
Одинаково ли быстродействие: 1. при передаче параметров в функцию или 2. создание кортежа и передаче его в функцию? Зависит ли это от...

Возвращение массива строк из dll
Здравствуйте! Помогите, пожалуйста, со следующей проблемой. Имеется проект на C# и dll на С++. Я пытаюсь вернуть из функции,...

Ошибка при отладке ActiveX.DLL при передаче объекта форма
в вызывающем модуле Функция(Me) в ActiveX Sub Функция(frm as Object) typeof frm is form - выдает False в режиме отладки ActiveX...

49
0 / 0 / 0
Регистрация: 08.01.2023
Сообщений: 36
11.04.2023, 17:29  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от D1973 Посмотреть сообщение
это шутка такая?
Формула неправильно передалась при копировании, не заметил.
ai = (ai - 1 + ai + ai + 1) / 3

Добавлено через 1 минуту
Цитата Сообщение от D1973 Посмотреть сообщение
Слова, как говорится, к делу не пришьёшь... Терзают меня смутные сомнения, что речь шла про отдельный модуль, а не про DLL...
К сожалению, про dll.

Добавлено через 1 минуту
Цитата Сообщение от KSergey9 Посмотреть сообщение
А stdcall; можете убрать (только везде! если убирать), раз уже вы начали использовать ShareMem - всё равно вы этим отрубили себе возможность использования вашей dll из других языков (ну кроме C++ Builder, возможно), а потому и прочие средства совместимости применять смысла нет.
Хорошо, буду иметь в виду, спасибо.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
11.04.2023, 17:31
Если передавать только ссылку, то можно и без ShareMem.
0
0 / 0 / 0
Регистрация: 08.01.2023
Сообщений: 36
11.04.2023, 17:59  [ТС]
Я попытался переписать код по этому принципу, но немного не вышло: сейчас он выдает ошибку "Access violation at address *in module 'borlndmm.dll. Read address *.". а как с этим справиться?..
До этого, кстати, я нашел ошибку. Он выдавал ошибку из-за того, что неправильно расставил для StringGrid'а значения колонки и строки.

Добавлено через 42 секунды
Эта ошибка связана с ShareMem?
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
11.04.2023, 18:04
Цитата Сообщение от Couguar Посмотреть сообщение
Я попытался переписать код по этому принципу
Где код?

Цитата Сообщение от Couguar Посмотреть сообщение
сейчас он выдает ошибку
Где "он"?
0
0 / 0 / 0
Регистрация: 08.01.2023
Сообщений: 36
11.04.2023, 18:17  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Где код?
Delphi
1
2
3
4
5
type
    Tpar = array of double;
    PTpar = ^Tpar;
 
Procedure arr(a: Tpar; b: Tpar); external 'Project1.dll';
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
type
    Tpar = array of double;
    PTpar = ^Tpar;
 
Procedure arr(a: Tpar; b: Tpar);
 var
  i: Integer;
begin
    SetLength(b, length(a));
    b[Low(b)] := a[Low(a)];
    b[High(b)] := a[High(b)];
    for i := Low(b) + 1 to High(b) - 1 do
        b[i] := (a[i - 1] + a[i] + a[i + 3] / 3);
end;
 
exports
    arr;
Delphi
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
procedure TForm2.BitBtn2Click(Sender: TObject);
 
procedure oput(mas: Tpar);  // Вывод сглаженного массива
var
    i: integer;
begin
    for i := 0 to length(mas) - 1 do
        StringGrid1.Cells[i, 2] := FloatToStr(mas[i + 1]);
end;
 
var
    A, B : Tpar;
    i : integer;
 
begin
    size := StringGrid1.ColCount;
    setLength(A, size);
    SetLength(B, size);
    for i := 0 to size - 1 do
    begin
        A[i + 1] := StrToFloat(StringGrid1.Cells[i, 0]);
    end;
    arr(A, B);
    oput(B);
end;
Добавлено через 7 минут
Цитата Сообщение от AzAtom Посмотреть сообщение
Где "он"?
Я имею в виду основную программу, которая обращается к этой dll.
0
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,495
Записей в блоге: 3
11.04.2023, 18:28
Цитата Сообщение от KSergey9 Посмотреть сообщение
Откуда эта странная мантра идет...
KSergey9, а вот черт его знает. Сам я так никогда не делал, просто таскал с собой и этого хватало... Но вот "совет" такой помню с незапамятных времен...
Цитата Сообщение от KSergey9 Посмотреть сообщение
Нет в ней интерфейсов для регистрации
Сейчас проверил - точно нет
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
11.04.2023, 18:39
Цитата Сообщение от Couguar Посмотреть сообщение
for i := 0 to size - 1 do
begin
A[i + 1]
Почему i+1? Нумерация у динамических массивов идёт от 0 до Size-1.
1
0 / 0 / 0
Регистрация: 08.01.2023
Сообщений: 36
11.04.2023, 19:41  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Почему i+1? Нумерация у динамических массивов идёт от 0 до Size-1.
Проблема старая ушла, но теперь ошибка "Range check error"...
Прошу прощения за динамический массив - я не знал, что он от 0 индексируется. Я думал, что он по такому же принципу работает, как и статический массив.

Добавлено через 8 минут
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
type
    Tpar = array of double;
    PTpar = ^Tpar;
 
Procedure arr(var a: Tpar; var b: Tpar);
 var
  i: Integer;
begin
    SetLength(b, Length(A));
    b[Low(b)] := a[Low(a)];
    b[High(b)] := a[High(b)];
    for i := Low(b) + 1 to High(b) - 1 do
        b[i] := (a[i - 1] + a[i] + a[i + 3] / 3);
end;
 
exports
    arr;
Delphi
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
procedure TForm2.BitBtn2Click(Sender: TObject);
 
procedure oput(mas: Tpar);  // Вывод исправленного массива
var
    i: integer;
begin
    for i := 0 to length(mas) - 1 do
        StringGrid1.Cells[i, 2] := FloatToStr(mas[i]);
end;
 
var
    A, B : Tpar;
    i : integer;
 
begin
    size := StringGrid1.ColCount;
    SetLength(A, size);
    SetLength(B, size);
    for i := Low(A) to size - 1 do
    begin
        A[i] := StrToFloat(StringGrid1.Cells[i, 0]);
    end;
    arr(A, B);
    oput(B);
end;
Добавлено через 1 минуту
Цитата Сообщение от Couguar Посмотреть сообщение
begin
    size := StringGrid1.ColCount;
    SetLength(A, size);
    SetLength(B, size);
Причем, если убрать SetLength(B, size), то вылетает старая ошибка, а если не трогать, то ошибка уже с ранжированием.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
11.04.2023, 19:50
Кстати, в основной программе ShareMem модуль надо только в dpr-файле подключать, первым. В остальных модулях он не нужен.
Это не связано с указанной ошибкой, просто вспомнилось.

Добавлено через 3 минуты
Цитата Сообщение от Couguar Посмотреть сообщение
a[i - 1]
Цитата Сообщение от Couguar Посмотреть сообщение
a[i + 3]
Это вот что такое? вы ж здесь за границу массива a выходите
1
0 / 0 / 0
Регистрация: 08.01.2023
Сообщений: 36
11.04.2023, 20:05  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Это вот что такое? вы ж здесь за границу массива a выходите
Невнимательность. Спасибо большое...
Но это все равно не решило проблему с ранжированием. Все так же выбивает ошибку "Range check error".

Добавлено через 1 минуту
Цитата Сообщение от KSergey9 Посмотреть сообщение
Кстати, в основной программе ShareMem модуль

Убрал с dll этот модуль. Никак не повлияло на работу. Все та же ошибка. По крайней мере пока.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
11.04.2023, 20:14
Цитата Сообщение от Couguar Посмотреть сообщение
Все так же выбивает ошибку "Range check error".
Где, в какой строке?
Оно ж явно пишет если под отладкой запускать. Там и ищите.

Добавлено через 43 секунды
StringGrid1.Cells[] такое же исключение даёт, кстати

Добавлено через 2 минуты
Цитата Сообщение от Couguar Посмотреть сообщение
for i := Low(b) + 1 to High(b) - 1 do
Извиняюсь, не замиетил тут про +1
Тогда a[i - 1] годится.

Добавлено через 53 секунды
Цитата Сообщение от Couguar Посмотреть сообщение
b[i] := (a[i - 1] + a[i] + a[i + 3] / 3);
Кстати, здесь вы только последний элемент хотите на 3 поделить? или всю сумму?
1
0 / 0 / 0
Регистрация: 08.01.2023
Сообщений: 36
11.04.2023, 20:34  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Где, в какой строке?
Оно ж явно пишет если под отладкой запускать. Там и ищите.
Добавлено через 43 секунды
StringGrid1.Cells[] такое же исключение даёт, кстати
Цитата Сообщение от KSergey9 Посмотреть сообщение
Где, в какой строке?
Оно ж явно пишет если под отладкой запускать. Там и ищите.
Добавлено через 43 секунды
StringGrid1.Cells[] такое же исключение даёт, кстати
Буду иметь в виду. Спасибо.
Цитата Сообщение от KSergey9 Посмотреть сообщение
Извиняюсь, не замиетил тут про +1
Тогда a[i - 1] годится.
Вы правильное замечание сделали. Там формула была неправильно написана у меня. Сейчас все исправил. Скажу честно: я надеялся, что все проблемы крылись в этом...

Добавлено через 1 минуту
Цитата Сообщение от KSergey9 Посмотреть сообщение
Кстати, здесь вы только последний элемент хотите на 3 поделить? или всю сумму?
Да, здесь тоже ошибка, спасибо.

Добавлено через 15 минут
Delphi
1
2
3
4
5
6
7
8
9
10
    for i := Low(A) to size - 1 do
    begin
        A[i] := StrToFloat(StringGrid1.Cells[i, 0]);
    end;
    arr(A, B);
    for i := Low(B) to High(B) do
      begin
          StringGrid1.Cells[i, 2] := FloatToStr(B[i]);
      end;
end;
Я
Цитата Сообщение от KSergey9 Посмотреть сообщение
Где, в какой строке?
Там, где сейчас цикл в конце находится, была процедура с тем же кодом. На этой строчке программа летела с этим ранжированием. Сейчас я решил убрать к чертям эту процедуру и добавить просто код, однако проблема не ушла. Все так же вылетает ошибка.

Добавлено через 2 минуты
Цитата Сообщение от Couguar Посмотреть сообщение
for i := Low(B) to High(B) do
      begin
          StringGrid1.Cells[i, 2] := FloatToStr(B[i]);
      end;
end;
А если быть точнее, то при отладке, я спокойно наступаю на "arr(A, B)", а при попытке перескочить на цикл for уже вылетает данная ошибка.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
11.04.2023, 21:01
Ну значит при "наступании на arr(A, B)" надо нажать F7
1
0 / 0 / 0
Регистрация: 08.01.2023
Сообщений: 36
11.04.2023, 21:09  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Ну значит при "наступании на arr(A, B)" надо нажать F7
Source Breakpoint at $00CD250E: D:\projects\Delphi\DLL\test code\Unit2.pas line 75. Process Project4.exe (8592)
Source Breakpoint at $00CD250E: D:\projects\Delphi\DLL\test code\Unit2.pas line 75. Process Project4.exe (8592)
Source Breakpoint at $00CD250E: D:\projects\Delphi\DLL\test code\Unit2.pas line 75. Process Project4.exe (8592)
Source Breakpoint at $00CD250E: D:\projects\Delphi\DLL\test code\Unit2.pas line 75. Process Project4.exe (8592)
Source Breakpoint at $00CD250E: D:\projects\Delphi\DLL\test code\Unit2.pas line 75. Process Project4.exe (8592)


Он мне это показал. Можно еще, пожалуйста, подсказку?
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
11.04.2023, 21:13
А, так это
Вы это делаете с dll или в один проект все поместили?
Сделайте все одном проекте для начала! без dll
Там и отлаживайте
0
0 / 0 / 0
Регистрация: 08.01.2023
Сообщений: 36
11.04.2023, 21:21  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Вы это делаете с dll или в один проект все поместили?
Я создал dll файл и поместил его к exe.
Мне надо dll подключать как-то иначе?

Добавлено через 15 секунд
Цитата Сообщение от KSergey9 Посмотреть сообщение
Сделайте все одном проекте для начала! без dll
Сейчас попробую.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
11.04.2023, 21:23
У вас явно внутри arr() проблема.
Можно и dll отлаживать, конечно.
1
0 / 0 / 0
Регистрация: 08.01.2023
Сообщений: 36
11.04.2023, 21:41  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
У вас явно внутри arr() проблема.
Только что переписал код из dll в основную программу: (код ниже, который я добавил основной программе)
Delphi
1
2
3
4
 b[Low(b)] := a[Low(a)];
    b[High(b)] := a[High(b)];
    for i := Low(b) + 1 to High(b) - 1 do
        b[i] := (a[i - 1] + a[i] + a[i + 1]) / 3;
Она нормально отработала, а если я сейчас попробую то же самое запустить с использованием dll, то, я чувствую, она снова начнет выдавать ту же ошибку.
Код, который в dll:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
type
    Tpar = array of double;
    PTpar = ^Tpar;
 
Procedure arr(var a: Tpar; var b: Tpar);
 var
  i: Integer;
begin
    SetLength(b, Length(a));
    b[Low(b)] := a[Low(a)];
    b[High(b)] := a[High(b)];
    for i := Low(b) + 1 to High(b) - 1 do
        b[i] := (a[i - 1] + a[i] + a[i + 1]) / 3;
end;
 
exports
    arr;
Код, который был в основной программе до изменений:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm2.BitBtn2Click(Sender: TObject);
 
var
    A, B : Tpar;
    i : integer;
 
begin
    size := StringGrid1.ColCount;
    SetLength(A, size);
    SetLength(B, size);
    for i := Low(A) to size - 1 do
    begin
        A[i] := StrToFloat(StringGrid1.Cells[i, 0]);
    end;
    arr(A, B);
    end;
 
    for i := Low(B) to High(B) do
      begin
          StringGrid1.Cells[i, 2] := FloatToStr(B[i]);
      end;
end;
Код после изменения в основной программе:
Delphi
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
procedure TForm2.BitBtn2Click(Sender: TObject);
 
var
    A, B : Tpar;
    i : integer;
 
begin
    size := StringGrid1.ColCount;
    SetLength(A, size);
    SetLength(B, size);
    for i := Low(A) to size - 1 do
    begin
        A[i] := StrToFloat(StringGrid1.Cells[i, 0]);
    end;
    //r(A, B);
    B[Low(b)] := A[Low(A)];
    B[High(b)] := A[High(A)];
    for i := Low(B) + 1 to High(B) - 1 do
    begin
        B[i] := (A[i - 1] + A[i] + A[i + 1]) / 3;
    end;
 
    for i := Low(B) to High(B) do
      begin
          StringGrid1.Cells[i, 2] := FloatToStr(B[i]);
      end;
end;
Добавлено через 20 секунд
Цитата Сообщение от KSergey9 Посмотреть сообщение
Можно и dll отлаживать, конечно.
Это как-то странно все очень работает...
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
11.04.2023, 21:43
Всю функцию arr переносите, не надо полу-мер.
Можете arr_ назвать и вызов поправить
Надо нормально проверять, а не отдельные кусочки
0
0 / 0 / 0
Регистрация: 08.01.2023
Сообщений: 36
11.04.2023, 22:15  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Всю функцию arr переносите, не надо полу-мер.
Можете arr_ назвать и вызов поправить
Надо нормально проверять, а не отдельные кусочки
Я разобрался: у меня в коде dll стояли вары:
Цитата Сообщение от Couguar Посмотреть сообщение
Procedure arr(var a: Tpar; var b: Tpar);
Сейчас все запустилось, отработала программа, но вернула мне нолики)

Добавлено через 5 минут
Касательно сглаживания, то у меня первые 3 значения равняются: 0, 0.84147, 0.90929. Они складываются и разделяются на три, что уже не может же равняться нулю. В чем может быть проблема? Это же уже надо решать проблему с dll?

Добавлено через 4 минуты
Нашел пару помарок в коде основной программы, но она все равно выводит нолики.

Добавлено через 7 минут
Я попробовал присвоить второму динамическому массиву значения первого, чтобы отправить их в dll. Там все без ошибок отрабатывает, но возвращается старый массив со старыми значениями, с чем может быть связана проблема?

Добавлено через 8 минут
Проблема решена. Сделал все через функцию, а не процедуру. И новый массив мне вернулся с другими значениями. Всем спасибо большое за помощь, кто давал дельные советы и поправлял мои помарки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.04.2023, 22:15

Ошибка при передаче текста из ComboBox в DLL
Подскажите где я ошибся, при передачи текста из CombaBox в dll. текст длл extern "C" char* __declspec(dllexport)...

Ошибки при передаче DataTable
Есть сервис и клиент все работает нормально на простых данных, например строках, но мне нужно передать datatable, при попытке это сделать...

Возвращение к условию при возникновении ошибки
Добрый день! Есть вот такой код: On Error GoTo er: G = MsgBox("Óäàëèòü çàïèñü?", vbQuestion + vbYesNo,...

Проблема при передаче параметров функции из потока в dll
Здравствуйте, пишу программу, создающую com-объект из dll. При успешном создании получаю указатель на интерфейс и через него реализую метод...

STM32F105 CAN копятся ошибки при передаче
Здравствуйте. Все экспериментирую с канами и вылезла такая проблемка. На шине три устройства: 1. STM32F105 2. Софт Кан хакер и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты 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: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru