Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как из 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]


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


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


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


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо