Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];
Вниздин.массивы и указатели Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c