Указатель на указатель
-
- junior
- Сообщения: 51
- Зарегистрирован: 15 ноя 2014, 17:26
- Версия LabVIEW: 12
- Контактная информация:
Указатель на указатель
Добрый день! Как можно записать данные в память по указателю. Есть Dll она выдает указатель на указатель первого элемента массива, задача массив этот заполнить... Можно ли это сделать в Labview?)
- Вложения
-
[Расширение dll было запрещено, вложение больше недоступно.]
-
- write.vi
- проба пера
- (27.6 КБ) 140 скачиваний
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Указатель на указатель
Великий и ужасный MoveBlock справится с задачей.
Где описание прототипов функций? Какова длина массива? Каков формат данных?
Где описание прототипов функций? Какова длина массива? Каков формат данных?
-
- junior
- Сообщения: 51
- Зарегистрирован: 15 ноя 2014, 17:26
- Версия LabVIEW: 12
- Контактная информация:
Re: Указатель на указатель
dll Возвращает длину массива(12)
и она выдает указатель на указатель первого элемента массива.
Туда нужно записать любые данные числовые.
DLL 32 разрядная. На 64 разрядной машине она не откроется
и она выдает указатель на указатель первого элемента массива.
Туда нужно записать любые данные числовые.
DLL 32 разрядная. На 64 разрядной машине она не откроется
-
- junior
- Сообщения: 51
- Зарегистрирован: 15 ноя 2014, 17:26
- Версия LabVIEW: 12
- Контактная информация:
Re: Указатель на указатель
IDLA_get_write_address это имя функции в DLL. Которая возвращает длину массива. И адрес она дает на первый элемент массива
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Указатель на указатель
Axel, а все данные в массиве - числа Integer 32 бита?
Вот, смотрю, чтение по адресу вы правильно сделали (второй кадр последовательности). Тут даже и придраться особо не к чему. По такому же принципу и запись делается. GetValueByPointer нет смысла использовать, MoveBlock будет проще и быстрей.
---
Хотя, может, я между строк прочитал. Если указатель на указатель, то надо его де-референсить перед чтением/записью, т.к. MoveBlock не может работать с хэндлами (т.е., с указателями на указатели). Дереференс делается очень просто - тем же MoveBlock'ом читаете U32 (4 байта) (или U64 - 8 байтов в 64-битной IDE) по имеющемуся адресу, получаете новый указатель и работаете дальше с ним.
Если среда (IDE) 32-разрядная, то без проблем. Но я не хотел эту библиотеку вызывать, т.к. у меня нет вашего железа.Axel писал(а):DLL 32 разрядная. На 64 разрядной машине она не откроется
Вот, смотрю, чтение по адресу вы правильно сделали (второй кадр последовательности). Тут даже и придраться особо не к чему. По такому же принципу и запись делается. GetValueByPointer нет смысла использовать, MoveBlock будет проще и быстрей.
---
Хотя, может, я между строк прочитал. Если указатель на указатель, то надо его де-референсить перед чтением/записью, т.к. MoveBlock не может работать с хэндлами (т.е., с указателями на указатели). Дереференс делается очень просто - тем же MoveBlock'ом читаете U32 (4 байта) (или U64 - 8 байтов в 64-битной IDE) по имеющемуся адресу, получаете новый указатель и работаете дальше с ним.
-
- junior
- Сообщения: 51
- Зарегистрирован: 15 ноя 2014, 17:26
- Версия LabVIEW: 12
- Контактная информация:
Re: Указатель на указатель
Данные 32 разрядные. Железа нет, это простая dll, она создает массив в памяти по указателю просто тестовая для тренировки, считать проблем нет, а вот запись сделать никак не получается, если есть возможность, настройте пожалуйста move block на запись, чтоб записать , перед считыванием, а потом считать, что записалась, записать можно обычные числа в массив.
-
- junior
- Сообщения: 51
- Зарегистрирован: 15 ноя 2014, 17:26
- Версия LabVIEW: 12
- Контактная информация:
Re: Указатель на указатель
Спасибо большое! У меня указатель на указатель должен быть. Мне кажется когда мы работаем с массивом, move block, понимает, что мы работаем с указателями на указатель...
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Указатель на указатель
Он не настолько умён, это всего лишь операция копирования области памяти с одного адреса в другой. На винде это обычный memcpy / MoveMemory. Завёрнуто в MoveBlock для кросс-платформенности.Axel писал(а):Мне кажется когда мы работаем с массивом, move block, понимает, что мы работаем с указателями на указатель...
Похоже, вас компилятор обманул. Или вы сами обманулись. В настройках CLFN вы передаёте входной параметр Ptr по ссылке, не забыли? (Pass by Pointer to Value) Прототип функции выглядит так:Axel писал(а):У меня указатель на указатель должен быть.
Код: Выделить всё
int32_t IDLA_get_write_address(uintptr_t *Ptr)
Код: Выделить всё
int myArray [12];
void *arrPtr, ptrToArrPtr;
arrPtr = &myArray[0];
ptrToArrPtr = &arrPtr;
*Ptr = uintptr_t(ptrToArrPtr)
Но это наверно не важно, так как в итоге получили, что хотели.
-
- junior
- Сообщения: 51
- Зарегистрирован: 15 ноя 2014, 17:26
- Версия LabVIEW: 12
- Контактная информация:
Re: Указатель на указатель
А как через MOVE BLOCK обратиться к памяти, не как к массиву, а как к адресу первого члена массива. Массивы он понимает, а когда я вашу программу поправил, не через массив, он перестал даже читать... Допустим записать по адресу с DLL и прочитать этот же адрес
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Указатель на указатель
Axel писал(а):А как через MOVE BLOCK обратиться к памяти, не как к массиву, а как к адресу первого члена массива. Массивы он понимает, а когда я вашу программу поправил, не через массив, он перестал даже читать... Допустим записать по адресу с DLL и прочитать этот же адрес
- Вложения
-
- Untitled 1.vi
- lv2012
- (6.38 КБ) 146 скачиваний
-
- junior
- Сообщения: 51
- Зарегистрирован: 15 ноя 2014, 17:26
- Версия LabVIEW: 12
- Контактная информация:
Re: Указатель на указатель
Вот так примерно это выглядит, как я понял
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;
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;
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Указатель на указатель
Похоже, функция сама дереференсит входной параметр. Внутри должно быть как-то так:Axel писал(а):int IDLA_get_write_address(unsigned int** lpadr);
...
unsigned int *lp;
int sz = IDLA_get_write_address(&lp);
Код: Выделить всё
* lpadr = &arrPtr[0];
Код: Выделить всё
* Ptr = &arrPtr[0];
Пожалуйста :)Axel писал(а):Спасибо Вам, ОГРОМНЕЙШЕЕ!!!
-
- junior
- Сообщения: 51
- Зарегистрирован: 15 ноя 2014, 17:26
- Версия LabVIEW: 12
- Контактная информация:
Re: Указатель на указатель
Здравствуйте! Извиняюсь, что отнимаю ваше время элементарными вопросами, но программист поменял размер возвращаемого адреса на unsigned char, и теперь надо заполнять массив 8 битными значениями... И программа начала зависать, если Вас не затруднит гляньте пожалуйста... В программе просто запись и чтение... DLL прилагаю
- Вложения
-
- 8bit.vi
- Это запись 8 битного массива
- (12.03 КБ) 142 скачивания
-
[Расширение dll было запрещено, вложение больше недоступно.]