|
0 / 0 / 1
Регистрация: 16.07.2013
Сообщений: 24
|
||||||
Работа с Pchar04.10.2013, 16:11. Показов 6168. Ответов 16
Метки нет (Все метки)
Добрый день!
У меня есть задача. Hанее почти не работал с PChar. Помогите разобраться. В длл есть функция: GetCfgData(var Info:TPosInfo): Byte(возвращает код ошибки) при запуске в коде программы эта функция должна получить данные из длл в TPosIno. Где TPosInfo = record Open: Byte SerNo: PChar (указатель на буфер серийного номера, min размер 12+1 байт) Вопрос: рак реализовать работу этой функции. Не совсем понимаю как работать с Pchar. Кто может объяснить как описать это в коде программы. И как далее работать с полем SerNo. В теории это должен быть серийный номер устройства. вот например так:
0
|
||||||
| 04.10.2013, 16:11 | |
|
Ответы с готовыми решениями:
16
Как переступить через #0 в PChar ? String - '1234567890123456SomethingElse' PChar - '1234567890123456'
|
|
Пишу на Delphi...иногда
|
||||||
| 04.10.2013, 18:15 | ||||||
0
|
||||||
|
0 / 0 / 1
Регистрация: 16.07.2013
Сообщений: 24
|
|||||||
| 09.10.2013, 14:56 [ТС] | |||||||
|
Возник другой вопрос как к примеру через ConfigData правильно передать в функцию данные. Пример.
По идее верный только вариант 2. Вариант 1 по сути переопределяет указатель на строку "test" и тогда в ConfigData.SerNo := StrAlloc(13) нет никакого смысла так как мы меняем адрес. Вариант 3 делает тоже самое с приведением типа Вариант 2 копирует строку по адресу который мы указали правильно ли я понимаю?? Важно: нужно поместить данные именно по адресу выделенному в ConfigData.SerNo := StrAlloc(13) может есть еще способы?
0
|
|||||||
|
angstrom
|
||||||
| 09.10.2013, 15:13 | ||||||
|
Для
|
||||||
|
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
||||||||||||
| 09.10.2013, 15:34 | ||||||||||||
|
Добавлю.
Если параметр Info служит также для передачи данных в функцию, то выделять память должна вызывающая программа. Причём, если функция не заменяет нуль-терминальную строку, а изменяет значение в ней, то вызывающая программа должна разместить нуль-терминальную строку в динамической памяти. Т. е., в этом случае приемлем вот такой способ в задании нуль-терминальной строки:
В общем, действия зависят от логики работы функции. Надо начать именно с этого - выяснить как функция использует параметр Info.
0
|
||||||||||||
|
0 / 0 / 1
Регистрация: 16.07.2013
Сообщений: 24
|
||
| 09.10.2013, 15:50 [ТС] | ||
|
function(var SendInfo: Info1 , var GetInfo: Info2): Byte данные передаются через SendInfo: Info1 ответ передают назад в программу через GetInfo: Info2 Если с получением данных разобрался(2-й пост). То с передачей возникли проблемы. Для каждого поля рекорда указан объем передаваемых данных (например 12+1). Т.е необходимо выделять и освобождать память и в процессе присваивания данных не менять выделенный адрес. Я так понял этот вариант единственно возможный: ConfigData.SerNo := StrAlloc(12 + 1); //+ 1 - так мы учитываем терминальный ноль. StrPCopy(ConfigData.SerNo, 'test'); StrDispose(ConfigData.SerNo); P.S. и еще как поступать в таком случае. Для разных полей размер данных указан по разному к примеру: min размер 12+1 max размер 184 или вообще не указан как лучше действовать в таких случаях
0
|
||
|
angstrom
|
|
| 09.10.2013, 16:03 | |
|
Кто мешает выделить сразу по максимуму?
|
|
|
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|||||||||
| 09.10.2013, 16:29 | |||||||||
|
Что касается тех данных, которые функция передаёт в вызывающую программу (Info2) - там ведь тоже есть нуль-терминальная срока. И память, которая выделена для этой строки, должна освободить вызывающая программа. Вот в этом случае надо решить, какой функцией эту память освободить. Если функция написана на Delphi и если паять для нуль-терминальных строк выделяется в теле функции через вызов StrAlloc(), то освобождать такую память надо через вызов StrDispose(). А если функция писалась, например, на Си или на Delphi и для нуль-терминальной строки память выделялась через AllocMem() или GetMem(), например, то освобождать память надо через вызов FreeMem():
0
|
|||||||||
|
0 / 0 / 1
Регистрация: 16.07.2013
Сообщений: 24
|
||
| 09.10.2013, 16:35 [ТС] | ||
|
в функцию передается адрес памяти куда она и записывает данные
0
|
||
|
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
||||||
| 09.10.2013, 16:35 | ||||||
|
Или так (входной параметр, передаваемый в функцию):
0
|
||||||
|
0 / 0 / 1
Регистрация: 16.07.2013
Сообщений: 24
|
|
| 09.10.2013, 16:43 [ТС] | |
|
Остался последний вопрос
к примеру один из выходных параметров равен ' ' или nill StrPCopy(ConfigData.SerNo, ' '); как данное преобразование будет влиять на данные записанные по адресу. Необходимо чтобы функция понимала их как nill или как ' '
0
|
|
|
0 / 0 / 1
Регистрация: 16.07.2013
Сообщений: 24
|
||
| 09.10.2013, 17:13 [ТС] | ||
|
0
|
||
|
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|||
| 09.10.2013, 17:18 | |||
|
0
|
|||
|
0 / 0 / 1
Регистрация: 16.07.2013
Сообщений: 24
|
|
| 10.10.2013, 16:32 [ТС] | |
|
Всем спасибо господа! Все отлично работает!
Правда в ХЕ2 не получилось, ошибки в кодировках какие-то при приеме-передаче данных через PChar. Не смог разобраться в чем дело. В D7 все отлично работает.
0
|
|
|
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,612
|
||
| 10.10.2013, 16:49 | ||
|
0
|
||
| 10.10.2013, 16:49 | |
|
Помогаю со студенческими работами здесь
17
Как конвертировать формат String в PChar? Нуль-терминальные строки PChar, StrCopy() ошибка. работа с указателями Pchar Pchar из dll
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|