![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
дин.массивы и указатели [D7, WinXP]
ghg © (2004-10-15 12:33:00)есть следующий код:
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 16:16:00) [1]>Sergey © (15.10.04 15:24) [11]
нет не меняется
то есть мы резервируем память, потом в DLL с ней (мамятью выделенной под массивы) работаем и когда возвращаемся из DLL наши массивы уже заполнены теми данными которые нам нужны
KSergey (2004-10-15 15:24:00) [2]> 3) извлекаем из DLL массивы с данными причем их размер (массивов)
> уже тот который нам нужен
Немного не ясно: в DLL размер массива меняется или нет?
ghg (2004-10-15 14:58:00) [3]это DLL сделанная в фортране
в этой процедуре есть некоторое кол-во входных параметров которые здесь убраны
и есть выходные, как раз те которые мной написаны выше
1) setlength(...) выделили память под массивы
2) далее с этой памятью работаем в DLL заполняем ее тем что нам нужно
3) извлекаем из DLL массивы с данными причем их размер (массивов) уже тот который нам нужен
а "нормально" значит что их структура и содержание на выходе из процедуры такие, какие и должны быть
panov (2004-10-15 13:48:00) [4]А меня вот эти строки смущают:
setlength( DUT, ntau * 2);
setlength( NSHT, 2);
setlength( ST, ntau * 2);
DRCTQQ(DUT, ST, NSHT); //некая экспортируемая из DLL процедура, все ее параметры выходные и с ними все нормально
1. Если все парметры выходные, то что означают первые 3 строки в этом коде?
2. Что означает "...и с ними все нормально.."?(как формируются эти выходные параметры)
ghg (2004-10-15 13:34:00) [5]>MBo © (15.10.04 13:07) [7]
видимо придется, но вопрос все равно остается
почему частично работает, а частично нет?
MBo (2004-10-15 13:07:00) [6]>поэтому делаю переадресацию
тогда откажись от дельфийских динамических массивов, пользуйся своими.
-=SS=- (2004-10-15 13:03:00) [7]> high в моем случае дает неправильный результат
Незнаю у меня в том примере работает нормально
ghg (2004-10-15 12:55:00) [8]> -=SS=- (15.10.04 12:46) [2]
high в моем случае дает неправильный результат
> Skier © (15.10.04 12:48) [3]
нет не используется
щас попробую поиспользовать
>MBo © (15.10.04 12:48) [4]
понимаю что это нештатная работа, но насколько я понимаю Move это копирование данных. Оно делается медленно, поэтому делаю переадресацию. Про утечку памяти здесь знаю устраню позже.
Я бы понял если бы данная операция не работала совсем, или работала всегда. А она ведь работает частично, то помнит длину массива, то нет. Почему?
Skier (2004-10-15 12:48:00) [9]ShareMem используется ?
MBo (2004-10-15 12:48:00) [10]Вместо
ST_delphi[i-1]:=@ST[(i-1)*ntau];
что нарушает штатную работу динам. массивов, сделай Move данных из ST в ST_delphi
-=SS=- (2004-10-15 12:46:00) [11]Длину массива можно получить и 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;
ghg (2004-10-15 12:43:00) [12]сорри есть добавление
строки
setlength(DUT_delphi, quantity_izm);
setlength(ST_delphi, quantity_izm);
читать как
setlength(DUT_delphi, 2);
setlength(ST_delphi, 2);
и еще можно добавить что для массива DUT_delphi длина не теряется