Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.053 c
1-1096540085
Dragon21
2004-09-30 14:28
2004.10.17
Interface


14-1095841078
Unknown_User
2004-09-22 12:17
2004.10.17
Поймали, что делать??


3-1095518436
Irmantukas
2004-09-18 18:40
2004.10.17
Свой индекс


1-1096613560
klerk
2004-10-01 10:52
2004.10.17
Снова про Excel


14-1096290021
1008
2004-09-27 17:00
2004.10.17
Как из процедуры в DataModul-е завершить работу приложения?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский