![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как из VС передать массив в DLL на Делфи [D4]
Pushkin © (2004-09-30 11:40:00)Доброе утро.
Написал DLL на Делфи в вызываемую функцию надо передать массив из проги написанной на VC, тут и выдаеться ошибка?
И если просто передать массив нельзя ,то как обойти это препятсвие?
Pushkin (2004-09-30 17:33:00) [1]А теперь появился глюк при вызове фунции из 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 все нормально
DiamondShark (2004-09-30 15:15:00) [2]
> Кстати, в [9] я именно обошел эти ограничения.
Получив совершенно нечитаемую конструкцию с большой вероятностью допустить ошибку.
По-моему, индексация смотрится гораздо приятнее ;)
Суслик (2004-09-30 14:34:00) [3]
> Да будет вам :^))) Я даже больше скажу: к указателями типа
> pChar приложимы процедуры inc, dec, сложение и вычитание.
> Но это - увы, лишь частный случай. Кстати, в [9] я именно
> обошел эти ограничения.
1. "^" я ставлю по привычке - еще с паскаля. Не вижу ничего плохого.
2. PChar я не люблю, т.к. компилятор выдет предупреждение "сомнительный typecast" на строчку PChar(WS)+2, где WS - wide string (здесь я хочу получить low байт второго символа).
PVOzerski (2004-09-30 14:31:00) [4]>Руки прочь от Паскаля.
>Приводи pointer к PByteArray (где PByteArray = ^TByteArray; TByteArray = packed
Да будет вам :^))) Я даже больше скажу: к указателями типа pChar приложимы процедуры inc, dec, сложение и вычитание. Но это - увы, лишь частный случай. Кстати, в [9] я именно обошел эти ограничения.
Суслик (2004-09-30 14:08:00) [5]Нормально все в паскале с адресной арифметикой.
Приводи pointer к PByteArray (где PByteArray = ^TByteArray; TByteArray = packed array[0..maxint] of Byte) и посльуйся.
Например
PByteArray(P)^[29]
DiamondShark (2004-09-30 14:05:00) [6]
> Ну нет у Паскаля нормальной адресной арифметики...
Руки прочь от Паскаля.
type
TRealVector = array[0..MaxInt div sizeof(real) - 1] of real;
function ShowChart(var XVector1: TRealVector; Count:Longint; Caption:PChar):boolean;stdcall;
И никакой адресной арифметики.
Pushkin (2004-09-30 13:37:00) [7]2PVOzerski
Спасибо заработало!!!
А можно ли передать этот массив без последующего копирования в свой?
PVOzerski (2004-09-30 12:31:00) [8]Точнее,
XVector[i]:=real(pointer(longword(@XVector1)+i*sizeof(real))^);
PVOzerski (2004-09-30 12:30:00) [9]>XVector[i]:=XVector1+i
Пытался я понять код, кажется понял...
Видимо, имелся виду вот такой кошмар (по синтаксису, но не по сути, впрочем :^);
XVector[i]:=real(pointer(longword(@XVector1)+i)^);
Ну нет у Паскаля нормальной адресной арифметики...
PVOzerski (2004-09-30 12:24:00) [10]>for i:=0 to Count do
Count - это число элементов или № последнего? Если-таки число элементов, то for i:=0 to Count -1do
PVOzerski (2004-09-30 12:22:00) [11]>Var
>XVector:array of real;
SetLength кто делать будет? Пушкин? :^)
>:=XVector1+i
Приводить к разумному типу ( статическиймассив) и указывать индекс кто будет? Он же!
Pushkin (2004-09-30 12:12:00) [12]> Передавай в качестве параметр ссылку на массив и размерность
Пробовал пишу так
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;
Может подскажете что не так?
KSergey (2004-09-30 12:02:00) [13]> [2] Aleksey V.P. (30.09.04 11:43)
А копировать-то зачем?
PVOzerski (2004-09-30 11:50:00) [14]Хорошо бы код посмотреть - как минимум, заголовок функции и описание массива - на Си и Delphi.
Aleksey V.P. (2004-09-30 11:43:00) [15]Передавай в качестве параметр ссылку на массив и размерность, в процедуре копируй содержимое масива из VC в свой формат
Digitman (2004-09-30 11:42:00) [16]
> тут и выдаеться ошибка?
это тебя надо спросить, выдается или не выдается
> если просто передать массив нельзя ,то как обойти это препятсвие?
передать "сложно", например, по ссылке