Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.04 c
14-1097251913
ОлегЪ
2004-10-08 20:11
2004.10.31
Проект!


14-1097314379
race1
2004-10-09 13:32
2004.10.31
раскладка


3-1096964604
Rule
2004-10-05 12:23
2004.10.31
Вопрос по условным операторам в SQL Firebird 1.X


3-1096464925
Хома
2004-09-29 17:35
2004.10.31
Connect to Informix


1-1098087032
Checist [root]
2004-10-18 12:10
2004.10.31
Хитрый парсинг





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский