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

Простейшие вопросы в области инженерной разработки
Axel
junior
junior
Сообщения: 51
Зарегистрирован: 15 ноя 2014, 17:26
Версия LabVIEW: 12
Контактная информация:

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

Сообщение Axel »

Добрый день! Как можно записать данные в память по указателю. Есть Dll она выдает указатель на указатель первого элемента массива, задача массив этот заполнить... Можно ли это сделать в Labview?)
Вложения

[Расширение dll было запрещено, вложение больше недоступно.]

write.vi
проба пера
(27.6 КБ) 138 скачиваний
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

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

Где описание прототипов функций? Какова длина массива? Каков формат данных?
Axel
junior
junior
Сообщения: 51
Зарегистрирован: 15 ноя 2014, 17:26
Версия LabVIEW: 12
Контактная информация:

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

Сообщение Axel »

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

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

Сообщение Axel »

IDLA_get_write_address это имя функции в DLL. Которая возвращает длину массива. И адрес она дает на первый элемент массива
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

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

Вот, смотрю, чтение по адресу вы правильно сделали (второй кадр последовательности). Тут даже и придраться особо не к чему. По такому же принципу и запись делается. GetValueByPointer нет смысла использовать, MoveBlock будет проще и быстрей.
---
Хотя, может, я между строк прочитал. :crazy: Если указатель на указатель, то надо его де-референсить перед чтением/записью, т.к. MoveBlock не может работать с хэндлами (т.е., с указателями на указатели). Дереференс делается очень просто - тем же MoveBlock'ом читаете U32 (4 байта) (или U64 - 8 байтов в 64-битной IDE) по имеющемуся адресу, получаете новый указатель и работаете дальше с ним.
Axel
junior
junior
Сообщения: 51
Зарегистрирован: 15 ноя 2014, 17:26
Версия LabVIEW: 12
Контактная информация:

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

Сообщение Axel »

Данные 32 разрядные. Железа нет, это простая dll, она создает массив в памяти по указателю просто тестовая для тренировки, считать проблем нет, а вот запись сделать никак не получается, если есть возможность, настройте пожалуйста move block на запись, чтоб записать , перед считыванием, а потом считать, что записалась, записать можно обычные числа в массив.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

Untitled 1.vi
lv2012
(7.52 КБ) 163 скачивания
У вас не указатель на указатель, а обычный указатель.
Axel
junior
junior
Сообщения: 51
Зарегистрирован: 15 ноя 2014, 17:26
Версия LabVIEW: 12
Контактная информация:

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

Сообщение Axel »

Спасибо большое! У меня указатель на указатель должен быть. Мне кажется когда мы работаем с массивом, move block, понимает, что мы работаем с указателями на указатель...
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

Axel писал(а):Мне кажется когда мы работаем с массивом, move block, понимает, что мы работаем с указателями на указатель...
Он не настолько умён, это всего лишь операция копирования области памяти с одного адреса в другой. На винде это обычный memcpy / MoveMemory. Завёрнуто в MoveBlock для кросс-платформенности.
Axel писал(а):У меня указатель на указатель должен быть.
Похоже, вас компилятор обманул. Или вы сами обманулись. :wink:
2017-05-25_13-32-41.jpg
В настройках CLFN вы передаёте входной параметр Ptr по ссылке, не забыли? (Pass by Pointer to Value) Прототип функции выглядит так:

Код: Выделить всё

int32_t IDLA_get_write_address(uintptr_t *Ptr)
В коде функции тогда должно быть что-то такое:

Код: Выделить всё

int myArray [12];
void *arrPtr, ptrToArrPtr;
arrPtr = &myArray[0];
ptrToArrPtr = &arrPtr;
*Ptr = uintptr_t(ptrToArrPtr)
Должен вернуться указатель на указатель.

Но это наверно не важно, так как в итоге получили, что хотели.
Axel
junior
junior
Сообщения: 51
Зарегистрирован: 15 ноя 2014, 17:26
Версия LabVIEW: 12
Контактная информация:

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

Сообщение Axel »

А как через MOVE BLOCK обратиться к памяти, не как к массиву, а как к адресу первого члена массива. Массивы он понимает, а когда я вашу программу поправил, не через массив, он перестал даже читать... Допустим записать по адресу с DLL и прочитать этот же адрес
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

Axel писал(а):А как через MOVE BLOCK обратиться к памяти, не как к массиву, а как к адресу первого члена массива. Массивы он понимает, а когда я вашу программу поправил, не через массив, он перестал даже читать... Допустим записать по адресу с DLL и прочитать этот же адрес
Вложения
Untitled 1.vi
lv2012
(6.38 КБ) 145 скачиваний
Axel
junior
junior
Сообщения: 51
Зарегистрирован: 15 ноя 2014, 17:26
Версия LabVIEW: 12
Контактная информация:

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

Сообщение Axel »

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

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
Сообщения: 51
Зарегистрирован: 15 ноя 2014, 17:26
Версия LabVIEW: 12
Контактная информация:

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

Сообщение Axel »

Спасибо Вам, ОГРОМНЕЙШЕЕ!!!
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

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

Сообщение dadreamer »

Axel писал(а):int IDLA_get_write_address(unsigned int** lpadr);
...
unsigned int *lp;
int sz = IDLA_get_write_address(&lp);
Похоже, функция сама дереференсит входной параметр. Внутри должно быть как-то так:

Код: Выделить всё

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

Код: Выделить всё

* Ptr = &arrPtr[0];
Таким образом вернулся указатель на первый элемент массива.
Axel писал(а):Спасибо Вам, ОГРОМНЕЙШЕЕ!!!
Пожалуйста :)
Axel
junior
junior
Сообщения: 51
Зарегистрирован: 15 ноя 2014, 17:26
Версия LabVIEW: 12
Контактная информация:

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

Сообщение Axel »

Здравствуйте! Извиняюсь, что отнимаю ваше время элементарными вопросами, но программист поменял размер возвращаемого адреса на unsigned char, и теперь надо заполнять массив 8 битными значениями... И программа начала зависать, если Вас не затруднит гляньте пожалуйста... В программе просто запись и чтение... DLL прилагаю
Вложения
8bit.vi
Это запись 8 битного массива
(12.03 КБ) 141 скачивание

[Расширение dll было запрещено, вложение больше недоступно.]

Ответить

Вернуться в «Для чайников»