Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.03.2012, 20:24
Сергей Викторович Сергей Викторович вне форума
Прохожий
 
Регистрация: 29.02.2012
Сообщения: 14
Репутация: 10
По умолчанию как правильно сделать ссылку на массив

Суть проблемы:

в программе вызываю функцию СontinuousReadADCFrame(Chan: integer; *inBuf; LONG: integer ) из Dll. В описании функции только это:
Выборка данных, в режиме непрерывного чтения АЦП
//*inBuf - Указатель на буфер данных, размером Length.
//Length - Количество считываемых данных.
//Функция не ожидает окончания приема данных

Код:
.
.
function ContinuousReadADCFrame(Chan: integer; buf:array of Cardinal	; LONG: integer):Cardinal	; stdcall;   external  'xxxx'  index  6;
.
.
ContinuousReadADCFrame(0,buf,512)
.
.

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

Подскажите как записать этот buf чтоб не было ошибки с памятью и таки получить массив данных.
Ответить с цитированием
  #2  
Старый 13.03.2012, 21:23
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

на всякий случай - Вы размер массива через SetLength задали?
Ответить с цитированием
  #3  
Старый 13.03.2012, 21:42
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Код:
type
   TCardinalArray= array of cardinal;


var
   buf:TCardinalArray;
   Len:integer
begin
   Len:=512;
   SetLength(Buf,Len);
   ContinuousReadADCFrame(0,Buf,Len);
// что-то делаем с данными
........
   Finalize(Buf);
Ответить с цитированием
  #4  
Старый 13.03.2012, 23:45
Сергей Викторович Сергей Викторович вне форума
Прохожий
 
Регистрация: 29.02.2012
Сообщения: 14
Репутация: 10
По умолчанию

Спасибо, теперь хоть программа запускается, но нет прибора чтоб проверить по полной.
Ответить с цитированием
  #5  
Старый 15.03.2012, 03:34
Сергей Викторович Сергей Викторович вне форума
Прохожий
 
Регистрация: 29.02.2012
Сообщения: 14
Репутация: 10
По умолчанию

Постоянно при выполнении программы возникает ошибка с памятью. Dll- ка Сишная возвращать должна массив тип данных Char, как не пытаюсь всё равно выдаёт ошибку чтения памяти. Перепробовал разные типы принимать не дало ничего.
Чего делать? Подскажите.
Ответить с цитированием
  #6  
Старый 15.03.2012, 03:37
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

У вас объявлено как stdcall, это точно так? Может нужно cdecl?
Дополнительно:
Цитата:
Сишная возвращать должна массив тип данных Char
у вас объявлено как array of cardinal
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 15.03.2012 в 03:39.
Ответить с цитированием
  #7  
Старый 15.03.2012, 03:43
Сергей Викторович Сергей Викторович вне форума
Прохожий
 
Регистрация: 29.02.2012
Сообщения: 14
Репутация: 10
По умолчанию

уже всякие попробовал и cardinal и char, ошибка в любом случаею
cdecl ещё не пробовал, попробую

Последний раз редактировалось Сергей Викторович, 15.03.2012 в 03:45.
Ответить с цитированием
  #8  
Старый 15.03.2012, 10:10
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

А как описана СontinuousReadADCFrame в документации по DLL?
Ответить с цитированием
  #9  
Старый 15.03.2012, 12:26
Сергей Викторович Сергей Викторович вне форума
Прохожий
 
Регистрация: 29.02.2012
Сообщения: 14
Репутация: 10
По умолчанию

MDAQ2LIB bool __stdcall ContinuousReadADCFrame(unsigned char id,signed short *inBuf,LONG Length);
//Выборка данных, в режиме непрерывного чтения АЦП
//*inBuf - Указатель на буфер данных, размером Length.
//Length - Количество считываемых данных. Должно быть не менее 512байт и кратно 512
//Функция не ожидает окончания приема данных
// Пример:
//StartContinuousReadADC(0);
//ContinuousReadADCFrame(0,Buf,1024);
//while(!isADCXferComplete(0));
//StopContinuousReadADC(0);
Ответить с цитированием
  #10  
Старый 15.03.2012, 13:59
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Попробуйте так:
Код:
function ContinuousReadADCFrame(Chan: Byte; buf: Pointer; len: DWORD): BOOL; stdcall; external 'xxxx' index  6;

procedure TForm1.Button1Click(Sender: TObject);
var
   buf: array of char;
   Len: integer;
begin
   Len:= 512;
   SetLength(Buf, Len + 1);
   StartContinuousReadADC(0);
   ContinuousReadADCFrame(0, @Buf[0], Len);
   while not isADCXferComplete(0) do;
   StopContinuousReadADC(0);

   Finalize(Buf);
end;
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.

Последний раз редактировалось Karsh, 15.03.2012 в 14:19.
Ответить с цитированием
Этот пользователь сказал Спасибо Karsh за это полезное сообщение:
  #11  
Старый 15.03.2012, 15:13
Сергей Викторович Сергей Викторович вне форума
Прохожий
 
Регистрация: 29.02.2012
Сообщения: 14
Репутация: 10
По умолчанию

Ура! Спасибо, заработало.
Если вместо bool указывать другие типы то ошибка с памятью, а так работает
Ответить с цитированием
  #12  
Старый 15.03.2012, 15:31
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

только если в с++
Код:
signed short *inBuf
то в Delphi
Код:
var
   buf: array of SmallInt;
Ответить с цитированием
  #13  
Старый 15.03.2012, 16:44
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

icWasya, да, верно. Просто меня смутило:
Цитата:
//Length - Количество считываемых данных. Должно быть не менее 512байт и кратно 512
и
Цитата:
Сишная возвращать должна массив тип данных Char
Поэтому и написал Char.
__________________
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:00.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter