Указатель на указатель

Простейшие вопросы в области инженерной разработки

Указатель на указатель

Postby Axel on 25 May 2017, 01:16

Добрый день! Как можно записать данные в память по указателю. Есть Dll она выдает указатель на указатель первого элемента массива, задача массив этот заполнить... Можно ли это сделать в Labview?)
Attachments
dlt_idla (1).dll
dll возвращает адрес, куда надо записать данные
(507.5 KiB) Downloaded 22 times
write.vi
проба пера
(27.6 KiB) Downloaded 21 times
Axel
junior
junior
 
Posts: 51
Joined: 15 Nov 2014, 17:26
LabVIEW Version: 12
Karma: 0

Re: Указатель на указатель

Postby dadreamer on 25 May 2017, 07:45

Великий и ужасный MoveBlock справится с задачей.

Где описание прототипов функций? Какова длина массива? Каков формат данных?
User avatar
dadreamer
doctor
doctor
 
Posts: 2785
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 696
I/O VIP vision internet

Re: Указатель на указатель

Postby Axel on 25 May 2017, 08:15

dll Возвращает длину массива(12)
и она выдает указатель на указатель первого элемента массива.
Туда нужно записать любые данные числовые.
DLL 32 разрядная. На 64 разрядной машине она не откроется
Attachments
Безымянный.jpg
Axel
junior
junior
 
Posts: 51
Joined: 15 Nov 2014, 17:26
LabVIEW Version: 12
Karma: 0

Re: Указатель на указатель

Postby Axel on 25 May 2017, 08:20

IDLA_get_write_address это имя функции в DLL. Которая возвращает длину массива. И адрес она дает на первый элемент массива
Axel
junior
junior
 
Posts: 51
Joined: 15 Nov 2014, 17:26
LabVIEW Version: 12
Karma: 0

Re: Указатель на указатель

Postby dadreamer on 25 May 2017, 08:31

Axel, а все данные в массиве - числа Integer 32 бита?
Axel wrote:DLL 32 разрядная. На 64 разрядной машине она не откроется

Если среда (IDE) 32-разрядная, то без проблем. Но я не хотел эту библиотеку вызывать, т.к. у меня нет вашего железа.

Вот, смотрю, чтение по адресу вы правильно сделали (второй кадр последовательности). Тут даже и придраться особо не к чему. По такому же принципу и запись делается. GetValueByPointer нет смысла использовать, MoveBlock будет проще и быстрей.
---
Хотя, может, я между строк прочитал. :crazy: Если указатель на указатель, то надо его де-референсить перед чтением/записью, т.к. MoveBlock не может работать с хэндлами (т.е., с указателями на указатели). Дереференс делается очень просто - тем же MoveBlock'ом читаете U32 (4 байта) (или U64 - 8 байтов в 64-битной IDE) по имеющемуся адресу, получаете новый указатель и работаете дальше с ним.
User avatar
dadreamer
doctor
doctor
 
Posts: 2785
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 696
I/O VIP vision internet

Re: Указатель на указатель

Postby Axel on 25 May 2017, 09:09

Данные 32 разрядные. Железа нет, это простая dll, она создает массив в памяти по указателю просто тестовая для тренировки, считать проблем нет, а вот запись сделать никак не получается, если есть возможность, настройте пожалуйста move block на запись, чтоб записать , перед считыванием, а потом считать, что записалась, записать можно обычные числа в массив.
Axel
junior
junior
 
Posts: 51
Joined: 15 Nov 2014, 17:26
LabVIEW Version: 12
Karma: 0

Re: Указатель на указатель

Postby dadreamer on 25 May 2017, 09:52

Untitled 1.vi
lv2012
(7.52 KiB) Downloaded 25 times

У вас не указатель на указатель, а обычный указатель.
User avatar
dadreamer
doctor
doctor
 
Posts: 2785
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 696
I/O VIP vision internet

Re: Указатель на указатель

Postby Axel on 25 May 2017, 10:50

Спасибо большое! У меня указатель на указатель должен быть. Мне кажется когда мы работаем с массивом, move block, понимает, что мы работаем с указателями на указатель...
Axel
junior
junior
 
Posts: 51
Joined: 15 Nov 2014, 17:26
LabVIEW Version: 12
Karma: 0

Re: Указатель на указатель

Postby dadreamer on 25 May 2017, 11:50

Axel wrote:Мне кажется когда мы работаем с массивом, move block, понимает, что мы работаем с указателями на указатель...

Он не настолько умён, это всего лишь операция копирования области памяти с одного адреса в другой. На винде это обычный memcpy / MoveMemory. Завёрнуто в MoveBlock для кросс-платформенности.
Axel wrote:У меня указатель на указатель должен быть.

Похоже, вас компилятор обманул. Или вы сами обманулись. :wink:
2017-05-25_13-32-41.jpg

В настройках CLFN вы передаёте входной параметр Ptr по ссылке, не забыли? (Pass by Pointer to Value) Прототип функции выглядит так:
Code: Select all
int32_t IDLA_get_write_address(uintptr_t *Ptr)

В коде функции тогда должно быть что-то такое:
Code: Select all
int myArray [12];
void *arrPtr, ptrToArrPtr;
arrPtr = &myArray[0];
ptrToArrPtr = &arrPtr;
*Ptr = uintptr_t(ptrToArrPtr)

Должен вернуться указатель на указатель.

Но это наверно не важно, так как в итоге получили, что хотели.
User avatar
dadreamer
doctor
doctor
 
Posts: 2785
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 696
I/O VIP vision internet

Re: Указатель на указатель

Postby Axel on 25 May 2017, 12:12

А как через MOVE BLOCK обратиться к памяти, не как к массиву, а как к адресу первого члена массива. Массивы он понимает, а когда я вашу программу поправил, не через массив, он перестал даже читать... Допустим записать по адресу с DLL и прочитать этот же адрес
Axel
junior
junior
 
Posts: 51
Joined: 15 Nov 2014, 17:26
LabVIEW Version: 12
Karma: 0

Re: Указатель на указатель

Postby dadreamer on 25 May 2017, 12:18

Axel wrote:А как через MOVE BLOCK обратиться к памяти, не как к массиву, а как к адресу первого члена массива. Массивы он понимает, а когда я вашу программу поправил, не через массив, он перестал даже читать... Допустим записать по адресу с DLL и прочитать этот же адрес
Attachments
Untitled 1.vi
lv2012
(6.38 KiB) Downloaded 19 times
User avatar
dadreamer
doctor
doctor
 
Posts: 2785
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 696
I/O VIP vision internet

Re: Указатель на указатель

Postby Axel on 25 May 2017, 12:20

Вот так примерно это выглядит, как я понял

1) int IDLA_get_write_address(unsigned int** lpadr);
-возвращает в lpadr указатель на сишный массив беззнаковых int (32хбитных)
возвращаемое значение функции- число элементов в массиве, должно быть 12


Вот примерный код на C для работы с dll :

...загрузка инициализация dll...
unsigned int *lp;
int sz = IDLA_get_write_address(&lp);
if(sz != 12) {
show_error();
return;
Axel
junior
junior
 
Posts: 51
Joined: 15 Nov 2014, 17:26
LabVIEW Version: 12
Karma: 0

Re: Указатель на указатель

Postby Axel on 25 May 2017, 12:26

Спасибо Вам, ОГРОМНЕЙШЕЕ!!!
Axel
junior
junior
 
Posts: 51
Joined: 15 Nov 2014, 17:26
LabVIEW Version: 12
Karma: 0

Re: Указатель на указатель

Postby dadreamer on 25 May 2017, 12:43

Axel wrote:int IDLA_get_write_address(unsigned int** lpadr);
...
unsigned int *lp;
int sz = IDLA_get_write_address(&lp);

Похоже, функция сама дереференсит входной параметр. Внутри должно быть как-то так:
Code: Select all
* lpadr = &arrPtr[0];

Тогда мы удачно угадали: :labview: передал в функцию * Ptr и получилось
Code: Select all
* Ptr = &arrPtr[0];

Таким образом вернулся указатель на первый элемент массива.
Axel wrote:Спасибо Вам, ОГРОМНЕЙШЕЕ!!!

Пожалуйста :)
User avatar
dadreamer
doctor
doctor
 
Posts: 2785
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 696
I/O VIP vision internet

Re: Указатель на указатель

Postby Axel on 15 Jun 2017, 19:08

Здравствуйте! Извиняюсь, что отнимаю ваше время элементарными вопросами, но программист поменял размер возвращаемого адреса на unsigned char, и теперь надо заполнять массив 8 битными значениями... И программа начала зависать, если Вас не затруднит гляньте пожалуйста... В программе просто запись и чтение... DLL прилагаю
Attachments
8bit.vi
Это запись 8 битного массива
(12.03 KiB) Downloaded 16 times
dlt_idla (2).dll
Это Dll, которая возвращает указатель на массив и на размер массива
(508 KiB) Downloaded 13 times
Axel
junior
junior
 
Posts: 51
Joined: 15 Nov 2014, 17:26
LabVIEW Version: 12
Karma: 0

Next

Return to Для чайников

Who is online

Users browsing this forum: No registered users and 9 guests

cron