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

Вниз

дин.массивы и указатели   Найти похожие ветки 

 
ghg ©   (2004-10-15 12:33) [0]

есть следующий код:

 DUT,ST: array of double;
 NSHT: array of integer;
 DUT_delphi, ST_delphi : array of array of double;
...
...
 setlength(DUT, ntau * 2);
 setlength(NSHT, 2);
 setlength(ST, ntau * 2);

 DRCTQQ(DUT, ST, NSHT); //некая экспортируемая из DLL процедура, все ее параметры выходные и с ними все нормально

 setlength(DUT_delphi, quantity_izm);
 setlength(ST_delphi, quantity_izm);

 for i:=1 to 2 do
 begin
   setlength(DUT_delphi[i-1], ntau);
   setlength(ST_delphi[i-1], NSHT[i-1]);
 end;

 for i:=1 to 2 do
 begin
   DUT_delphi[i-1]:=@DUT[(i-1)*ntau];
   ST_delphi[i-1]:=@ST[(i-1)*ntau];
 end;          


Суть в следующем из DLL получаем массив с данными от нескольких приемников. Эти данные идут друг за другом. Потом нужно эти данные рассовать по другим массивам отдельным для кадого приемника. В общем из одного длинного нарезать несколько поменьше.

после всех проведенных выше операций в массивах DUT_delphi и ST_delphi все правильно расположено, НО есть сложности.

в массиве ST_delphi[0] имеем правильную длину самомго массива, а в массиве ST_delphi[1] имеем нулевую длину, хотя если напрямую обращаться к элементу {ST_delphi[1,5]} то все данные находятся там где надо.

Вопрос: почему теряется информация о длине массива ST_delphi[1] и как сделать правильно, чтобы все работало как должно работать?

Заранее благодарен.


 
ghg ©   (2004-10-15 12:43) [1]

сорри есть добавление
строки
setlength(DUT_delphi, quantity_izm);
setlength(ST_delphi, quantity_izm);


читать как
setlength(DUT_delphi, 2);
setlength(ST_delphi, 2);


и еще можно добавить что для массива DUT_delphi длина не теряется


 
-=SS=-   (2004-10-15 12:46) [2]

Длину массива можно получить и high(ST_del)
пример
procedure TForm1.Button1Click(Sender: TObject);
Var
 DD:array of double;
begin
 getmem(dd,sizeof(double)*200);
 showmessage(intToStr(round( high(dd)/sizeof(double))-1));
 freemem(dd,sizeof(double)*200);
end;


 
Skier ©   (2004-10-15 12:48) [3]

ShareMem используется ?


 
MBo ©   (2004-10-15 12:48) [4]

Вместо
 ST_delphi[i-1]:=@ST[(i-1)*ntau];
что нарушает штатную работу динам. массивов, сделай Move данных из ST в ST_delphi


 
ghg ©   (2004-10-15 12:55) [5]

> -=SS=-   (15.10.04 12:46) [2]
high в моем случае дает неправильный результат

> Skier ©   (15.10.04 12:48) [3]
нет не используется
щас попробую поиспользовать

>MBo ©   (15.10.04 12:48) [4]
понимаю что это нештатная работа, но насколько я понимаю Move это копирование данных. Оно делается медленно, поэтому делаю переадресацию. Про утечку памяти здесь знаю устраню позже.

Я бы понял если бы данная операция не работала совсем, или работала всегда. А она ведь работает частично, то помнит длину массива, то нет. Почему?


 
-=SS=-   (2004-10-15 13:03) [6]

> high в моем случае дает неправильный результат
Незнаю у меня в том примере работает нормально


 
MBo ©   (2004-10-15 13:07) [7]

>поэтому делаю переадресацию
тогда откажись от дельфийских динамических массивов, пользуйся своими.


 
ghg ©   (2004-10-15 13:34) [8]

>MBo ©   (15.10.04 13:07) [7]
видимо придется, но вопрос все равно остается
почему частично работает, а частично нет?


 
panov ©   (2004-10-15 13:48) [9]

А меня вот эти строки смущают:

setlength(DUT, ntau * 2);
setlength(NSHT, 2);
setlength(ST, ntau * 2);

DRCTQQ(DUT, ST, NSHT); //некая экспортируемая из DLL процедура, все ее параметры выходные и с ними все нормально

1. Если все парметры выходные, то что означают первые 3 строки в этом коде?
2. Что означает "...и с ними все нормально.."?(как формируются эти выходные параметры)


 
ghg ©   (2004-10-15 14:58) [10]

это DLL сделанная в фортране
в этой процедуре есть некоторое кол-во входных параметров которые здесь убраны
и есть выходные, как раз те которые мной написаны выше

1) setlength(...)  выделили память под массивы
2) далее с этой памятью работаем в DLL заполняем ее тем что нам нужно
3) извлекаем из DLL массивы с данными причем их размер (массивов) уже тот который нам нужен

а "нормально" значит что их структура и содержание на выходе из процедуры такие, какие и должны быть


 
KSergey ©   (2004-10-15 15:24) [11]

> 3) извлекаем из DLL массивы с данными причем их размер (массивов)
> уже тот который нам нужен

Немного не ясно: в DLL размер массива меняется или нет?


 
ghg ©   (2004-10-15 16:16) [12]

>Sergey ©   (15.10.04 15:24) [11]
нет не меняется
то есть мы резервируем память, потом в DLL с ней (мамятью выделенной под массивы) работаем и когда возвращаемся из DLL наши массивы уже заполнены теми данными которые нам нужны



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

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

Наверх




Память: 0.49 MB
Время: 0.024 c
4-1096021630
Antonmm2
2004-09-24 14:27
2004.10.31
Устройства


1-1098085265
denis24
2004-10-18 11:41
2004.10.31
редактирование или добавление нового


3-1096646842
avsam
2004-10-01 20:07
2004.10.31
Firebird Client


1-1097774010
fess
2004-10-14 21:13
2004.10.31
MS Equation в Delphi


1-1097650128
Rentgen
2004-10-13 10:48
2004.10.31
Как узнать число-ли переменная S:String;