Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

Как из VС передать массив в DLL на Делфи   Найти похожие ветки 

 
Pushkin   (2004-09-30 11:40) [0]

Доброе утро.
Написал DLL на Делфи в вызываемую функцию надо передать массив из проги написанной на VC, тут и выдаеться ошибка?
И если  просто передать массив нельзя ,то как обойти это препятсвие?


 
Digitman ©   (2004-09-30 11:42) [1]


> тут и выдаеться ошибка?


это тебя надо спросить, выдается или не выдается


> если  просто передать массив нельзя ,то как обойти это препятсвие?


передать "сложно", например, по ссылке


 
Aleksey V.P.   (2004-09-30 11:43) [2]

Передавай в качестве параметр ссылку на массив и размерность, в процедуре копируй содержимое масива из VC в свой формат


 
PVOzerski ©   (2004-09-30 11:50) [3]

Хорошо бы код посмотреть - как минимум, заголовок функции и описание массива - на Си и Delphi.


 
KSergey ©   (2004-09-30 12:02) [4]

> [2] Aleksey V.P.   (30.09.04 11:43)

А копировать-то зачем?


 
Pushkin   (2004-09-30 12:12) [5]

>Передавай в качестве параметр ссылку на массив и размерность
Пробовал пишу так
function ShowChart(var XVector1;Count:Longint;Caption:PChar):boolean;stdcall;
Var
XVector:array of real;
begin
for i:=0 to Count do
XVector[i]:=XVector1+i; <<здесь выдает ошибку Type mismatch
end;
Может подскажете что не так?


 
PVOzerski ©   (2004-09-30 12:22) [6]

>Var
>XVector:array of real;
SetLength кто делать будет? Пушкин? :^)
>:=XVector1+i
Приводить к разумному типу (статический массив) и указывать индекс кто будет? Он же!


 
PVOzerski ©   (2004-09-30 12:24) [7]

>for i:=0 to Count do
Count - это число элементов или № последнего? Если-таки число элементов, то for i:=0 to Count-1 do


 
PVOzerski ©   (2004-09-30 12:30) [8]

>XVector[i]:=XVector1+i

Пытался я понять код, кажется понял...
Видимо, имелся виду вот такой кошмар (по синтаксису, но не по сути, впрочем :^);

XVector[i]:=real(pointer(longword(@XVector1)+i)^);

Ну нет у Паскаля нормальной адресной арифметики...


 
PVOzerski ©   (2004-09-30 12:31) [9]

Точнее,
XVector[i]:=real(pointer(longword(@XVector1)+i*sizeof(real))^);


 
Pushkin   (2004-09-30 13:37) [10]

2PVOzerski
Спасибо заработало!!!
А можно ли передать этот массив без последующего копирования в свой?


 
DiamondShark ©   (2004-09-30 14:05) [11]


> Ну нет у Паскаля нормальной адресной арифметики...

Руки прочь от Паскаля.

type
 TRealVector = array[0..MaxInt div sizeof(real) - 1] of real;
function ShowChart(var XVector1: TRealVector; Count:Longint; Caption:PChar):boolean;stdcall;

И никакой адресной арифметики.


 
Суслик ©   (2004-09-30 14:08) [12]

Нормально все в паскале с адресной арифметикой.

Приводи pointer к PByteArray (где PByteArray = ^TByteArray; TByteArray = packed array[0..maxint] of Byte) и посльуйся.

Например
PByteArray(P)^[29]


 
PVOzerski ©   (2004-09-30 14:31) [13]

>Руки прочь от Паскаля.
>Приводи pointer к PByteArray (где PByteArray = ^TByteArray; TByteArray = packed

Да будет вам :^))) Я даже больше скажу: к указателями типа pChar приложимы процедуры inc, dec, сложение и вычитание. Но это - увы, лишь частный случай. Кстати, в [9] я именно обошел эти ограничения.


 
Суслик ©   (2004-09-30 14:34) [14]


> Да будет вам :^))) Я даже больше скажу: к указателями типа
> pChar приложимы процедуры inc, dec, сложение и вычитание.
> Но это - увы, лишь частный случай. Кстати, в [9] я именно
> обошел эти ограничения.

1. "^" я ставлю по привычке - еще с паскаля. Не вижу ничего плохого.
2. PChar я не люблю, т.к. компилятор выдет предупреждение "сомнительный typecast" на строчку PChar(WS)+2, где WS - wide string (здесь я хочу получить low байт второго символа).


 
DiamondShark ©   (2004-09-30 15:15) [15]


> Кстати, в [9] я именно обошел эти ограничения.

Получив совершенно нечитаемую конструкцию с большой вероятностью допустить ошибку.

По-моему, индексация смотрится гораздо приятнее ;)


 
Pushkin ©   (2004-09-30 17:33) [16]

А теперь появился глюк при вызове фунции из  Delphi.


var
XVector,YVector:array of Single;
Count,Code,i:Longint;
Caption:string;
begin
Count:=7;
SetLength(XVector,Count);
SetLength(YVector,Count);
for i := 0 to Count-1 do
begin
  XVector[i]:=i*10;
  YVector[i]:=Random;  //здесь задаються значения
end;
Caption:="Пример";
ShowChart(XVector,YVector,Count,PChar(Caption)); //вызываем   функцию из DLL
....
//описание функции в DLL
function ShowChart(var XVector1,YVector1;Count:Longint;Caption:PChar):boolean;stdcall;external "ChartDll.dll"
type
TArrSingle=array of Single;
Var
XVector,YVector: TArrSingle;
i:LongInt;
begin
SetLength(XVector,Count);
SetLength(YVector,Count);
for i := 0 to Count-1 do
begin
XVector[i]:=Single(pointer(longword(@XVector1)+i*sizeof(Single))^);
YVector[i]:=Single(pointer(longword(@YVector1)+i*sizeof(Single))^);
end;
//все работает без ошибок,только значения не те,а из под VC все нормально





Страницы: 1 вся ветка

Текущий архив: 2004.10.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.058 c
1-1095381419
Артем К.
2004-09-17 04:36
2004.10.17
Пауза на программу?


3-1095839241
New
2004-09-22 11:47
2004.10.17
SQL


14-1096277529
panov
2004-09-27 13:32
2004.10.17
Безопасность ICQ.


1-1096538930
Yuri Btr
2004-09-30 14:08
2004.10.17
Application.Title проблема


3-1095404198
gonzales
2004-09-17 10:56
2004.10.17
Too many open tables