|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
как правильно сделать ссылку на массив
Суть проблемы:
в программе вызываю функцию С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
|
|||
|
|||
на всякий случай - Вы размер массива через SetLength задали?
|
#3
|
||||
|
||||
Код:
type TCardinalArray= array of cardinal; var buf:TCardinalArray; Len:integer begin Len:=512; SetLength(Buf,Len); ContinuousReadADCFrame(0,Buf,Len); // что-то делаем с данными ........ Finalize(Buf); |
#4
|
|||
|
|||
Спасибо, теперь хоть программа запускается, но нет прибора чтоб проверить по полной.
|
#5
|
|||
|
|||
Постоянно при выполнении программы возникает ошибка с памятью. Dll- ка Сишная возвращать должна массив тип данных Char, как не пытаюсь всё равно выдаёт ошибку чтения памяти. Перепробовал разные типы принимать не дало ничего.
Чего делать? Подскажите. |
#6
|
||||
|
||||
У вас объявлено как stdcall, это точно так? Может нужно cdecl?
Дополнительно: Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 15.03.2012 в 03:39. |
#7
|
|||
|
|||
уже всякие попробовал и cardinal и char, ошибка в любом случаею
cdecl ещё не пробовал, попробую Последний раз редактировалось Сергей Викторович, 15.03.2012 в 03:45. |
#8
|
|||
|
|||
А как описана СontinuousReadADCFrame в документации по DLL?
|
#9
|
|||
|
|||
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
|
||||
|
||||
Попробуйте так:
Код:
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 за это полезное сообщение: | ||
Сергей Викторович (15.03.2012)
|
#11
|
|||
|
|||
Ура! Спасибо, заработало.
Если вместо bool указывать другие типы то ошибка с памятью, а так работает |
#12
|
|||
|
|||
только если в с++
Код:
signed short *inBuf Код:
var buf: array of SmallInt; |
#13
|
||||
|
||||
icWasya, да, верно. Просто меня смутило:
Цитата:
Цитата:
Начинающий программист уверен, что в 1 килобайте 1000 байт.
Законченный программист уверен, что в 1 километре 1024 метра. |