Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
ВнизКак из 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c