Большой Воронежский Форум

Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел.
Вернуться   Большой Воронежский Форум » Компьютеры и все, что с ними связано » » Программирование
Философия, технологии, алгоритмы!

Ответ
 
Опции темы
Старый 27.04.2013, 14:39   #1   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
Помогите перевести c Delphi на C++ фрагмент

На Delphi:
Цитата:
procedure TMainForm.ShowRead(HidDev: TJvHidDevice; ReportID: Byte;
const Data: Pointer; Size: Word);

.......................
for I := 0 to Size - 1 do
Str := Str + Format('%.2x ', [Cardinal(PAnsiChar(Data)[I])]);

................
В билдере заголовок функции таков:
Цитата:
void __fastcall TForm1::HidCtlDeviceData(TJvHidDevice *HidDev, BYTE ReportID, const Pointer Data, WORD Size)
Как в билдере обратиться к конкретному элементу Data ? И, в идеале, вывеcти его строкой в Memo..

Спасибо.
  Ответить с цитированием
Старый 27.04.2013, 14:42   #2   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
Блин... так всегда.... два часа проковыряешься, бестолку, стоит только задать вопрос на форуме - тут же решение приходит в голову. Спасибо.
  Ответить с цитированием
Старый 28.04.2013, 22:07   #3   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
Не... поторопился я...
Вот эта конструкция (PAnsiChar(Data)[I]); дает мне символ с кодом, содержащимся в (Data)[I].
Кстати, почему (Data)[I], а не (Data[I]) ?

А как мне получить непосредственно код, то есть число unsigned char ?
  Ответить с цитированием
Старый 28.04.2013, 23:08   #4   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 36

silly вне форума Не в сети
Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
Кстати, почему (Data)[I], а не (Data[I])?
Нифига не понял. Вопрос не про приведение типа Pointer → PAnsiChar надо полагать?


Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
А как мне получить непосредственно код, то есть число unsigned char ?
На delphi или на c++?
  Ответить с цитированием
Старый 28.04.2013, 23:22   #5   
Registered User
 
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58

Hopkroft вне форума Не в сети
-=Женек=-,
Может для начала заголовок нужно на этот поменять?
void __fastcall HidDevCtlDeviceData(TJvHidDevice *WorkDev, BYTE ReportID, const *Data, WORD Size);

И что у вас за тип Pointer? В билдере разве есть такой тип.
На вашем месте, я бы посмотрел готовые исходники на билдере для компонента jvHidDevice, а потом переделал бы их под свою задачу
  Ответить с цитированием
Старый 29.04.2013, 05:23   #6   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
Hopkroft,
Цитата:
На вашем месте, я бы посмотрел готовые исходники на билдере
ОЧень странный подход. Если вы хотите пронести шкаф в дверь, вы будете пилить дверной проем вместо того, чтобы разобрать шкаф?

Цитата:
бы их под свою задачу
Моя задача не конфликтует с jvHidDevice, просто отображение информации в примере от производителя не сходится с желаемым.

silly,
Цитата:
На delphi или на c++?
На С++.
  Ответить с цитированием
Старый 29.04.2013, 08:53   #7   
Registered User
 
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58

Hopkroft вне форума Не в сети
Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
Hopkroft,

ОЧень странный подход. Если вы хотите пронести шкаф в дверь, вы будете пилить дверной проем вместо того, чтобы разобрать шкаф?
Не совсем понял аллегорию. У вас в поставке JVCL идёт 4 примера, работы с компонентом jvHidDevice. Вы их разобрали?

Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
Моя задача не конфликтует с jvHidDevice, просто отображение информации в примере от производителя не сходится с желаемым.
Какая версия JVCL? И что-то мне подсказывает что возможно некорректность чтения вызвана программами по типу USB Safely Remove. У меня пару раз были проблемы с определением флешек, после того как пользовался "народными" поделками. Хотя Safely работает без нареканий.

UPD. А что за девайс хоть? Дома смогу посмотреть результат для джойстика XBox.
И чем Delphi не устраивает?

Последний раз редактировалось Hopkroft; 29.04.2013 в 09:22.
  Ответить с цитированием
Старый 29.04.2013, 09:27   #8   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
Цитата:
У вас в поставке JVCL идёт 4 примера, работы с компонентом jvHidDevice. Вы их разобрали?
Под C++ примеров нет. Все 4 примера - для Дельфи.

Цитата:
готовые исходники на билдере для компонента jvHidDevice, а потом переделал бы их под свою задачу
Так это уже сделано, есил вы не поняли. ПОлностью переделал один из примеров, застрял только на вышеуказанной переменной.

Цитата:
программами по типу USB Safely Remove
Хм... внешняя программа влияет на процесс компиляции, и вызывает ошибку компиляции? Что-то новенькое.

Я понимаю, что вы не телепат, но неужели непонятно, что если я пишу:
Цитата:
Вот эта конструкция (PAnsiChar(Data)[I]); дает мне символ с кодом, содержащимся в (Data)[I].
Кстати, почему (Data)[I], а не (Data[I]) ?

А как мне получить непосредственно код, то есть число unsigned char ?
..то значит я пытался изменить конструкцию строки,пытаясь получить unsigned char, но застрял на стадии компиляции?
У меня программа в микроконтроллере, вней что-то вроде:
Цитата:
unsigned char a;
a=0xEF;
Buffer[i]=a;
SendUsb();
А уже в компе, в компоненте JvHidDevice происходит некое шаманство, которое упаковывает полученные данные в const Pointer Data.
И если я записал в Buffer 0x30, то конструкция [Cardinal(PAnsiChar(Data)[I])] предстает на экране в виде строки "48", если использовать PAnsiChar(Data)[I], то это дает строку (символ) "0".

А я хочу нечто вроде:
Цитата:
unsigned char X;
X=Data[i];
как мне это реализовать?
  Ответить с цитированием
Старый 29.04.2013, 11:02   #9   
Registered User
 
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58

Hopkroft вне форума Не в сети
Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
И если я записал в Buffer 0x30, то конструкция [Cardinal(PAnsiChar(Data)[I])] предстает на экране в виде строки "48", если использовать PAnsiChar(Data)[I], то это дает строку (символ) "0".
как мне это реализовать?
Всё правильно 48 это код 0, и 0x30 соответствует символ 0.

По идее вот так:

unsigned char x;
x=(unsigned char)(PAnsiChar(Data)[I]);

x при печати выведет 0.

Cardinal в Delphi это unsigned int в Buildere.
  Ответить с цитированием
Старый 29.04.2013, 11:18   #10   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,633
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
там глюка, кажись.
именно с этим типом - AnsiChar, в дельфе он равен char'у, а в Builder - Short'у. Т.е. два байта.
Что делать - для начала вывести sizeof(AnsiChar) и посмотреть сколько выйдет. Если 2, то дело в этом.
  Ответить с цитированием
Старый 29.04.2013, 11:23   #11   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
Hopkroft,
Спасибо, но вот только PAnsiChar как то режет глаз.
Получилось вот так:
Цитата:
(int)(((unsigned char*)Data)[I] & 0xFF)
Spectator,
Цитата:
там глюка, кажись.
именно с этим типом - AnsiChar, в дельфе он равен char'у, а в Builder - Short'у. Т.е. два байта.
Что делать - для начала вывести sizeof(AnsiChar) и посмотреть сколько выйдет. Если 2, то дело в этом.
Вот шайтан - а глюк этот и правда есть. Вчера долго не мог понять, почему иногда в комп приходят 6-8-значные числа. Видать, когда число превышало 128. Пытался списать это на глюк контроллера, который на тот момент действительно сидел в его прошивке.
  Ответить с цитированием
Старый 29.04.2013, 14:43   #12   
Registered User
 
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58

Hopkroft вне форума Не в сети
-=Женек=-, тогда уж лучше
(unsigned int)(((unsigned char*)Data)[I] & 0xFF).
Без PAnsiChar смотрится лучше и нагляднее.
  Ответить с цитированием
Старый 29.04.2013, 15:04   #13   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
Hopkroft,
Цитата:
(unsigned int)(((unsigned char*)Data)[I] & 0xFF).
А вот так:
Цитата:
(unsigned int)(((unsigned char*)Data)[I] & 0xFF);
еще красивше )))))
  Ответить с цитированием
Старый 29.04.2013, 15:13   #14   
Registered User
 
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58

Hopkroft вне форума Не в сети
-=Женек=-, на unsigned int заменил, что-бы не было переполнения при чтении данных. Не зря же в Дельфёвом примере они использовали Cardinal (беззнаковый тип).
  Ответить с цитированием
Старый 29.04.2013, 15:21   #15   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
Цитата:
Cardinal
Не знал. думал какая-то фенечка библиотечная.
  Ответить с цитированием
Старый 29.04.2013, 15:36   #16   
Registered User
 
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58

Hopkroft вне форума Не в сети
-=Женек=-, кстати, а что за контроллер?
  Ответить с цитированием
Старый 29.04.2013, 15:48   #17   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
STM32F103VGT6

кстати, а почему приводится к типу int, а не char?
И зачем вообще приводить -я сделал просто (((unsigned char*)Data)[I] & 0xFF). - работает.
МОжет, при условии, что кроме unsigned char ничего не ожидается, приведение не нужно?
  Ответить с цитированием
Старый 29.04.2013, 16:03   #18   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,633
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
во вы творите

Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
STM32F103VGT6

кстати, а почему приводится к типу int, а не char?
И зачем вообще приводить -я сделал просто (((unsigned char*)Data)[I] & 0xFF). - работает.
МОжет, при условии, что кроме unsigned char ничего не ожидается, приведение не нужно?
к инту приводится потому что это стандартный тип для хранения таких данных. от char'а и даже от unsigned char'а надо сразу уходить. бо не забываем что иначе 3*100 = 44
  Ответить с цитированием
Старый 29.04.2013, 16:13   #19   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
Spectator,
Для микроконтроллеров пишу куда больше, чем для PC.
Привычка экономить на всем, дабы влезть в 1 кб ОЗУ, развилась еще когда я AVR юзал.
  Ответить с цитированием
Старый 29.04.2013, 16:30   #20   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,633
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
Spectator,
Для микроконтроллеров пишу куда больше, чем для PC.
Привычка экономить на всем, дабы влезть в 1 кб ОЗУ, развилась еще когда я AVR юзал.
это я всё понимаю.
ты спросил - зачем, я тебе говорю - затем.
  Ответить с цитированием
Старый 29.04.2013, 16:44   #21   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
Цитата:
ты спросил - зачем, я тебе говорю - затем.
ууу... тогда почему не в long int? или в float, на всякий случай.
ИМХО, программист сам обязан контроллировать размерность данных.
  Ответить с цитированием
Старый 29.04.2013, 16:52   #22   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,633
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
ууу... тогда почему не в long int? или в float, на всякий случай.
ИМХО, программист сам обязан контроллировать размерность данных.
патаму шта int - это более правильный тип. самый правильный, православный.
всё что меньше - мало, всё что больше - много.
  Ответить с цитированием
Старый 29.04.2013, 18:21   #23   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
Spectator,
Цитата:
патаму шта int - это более правильный тип. самый правильный, православный
Ага.... а char - обрезанный, значит, иудейский, стало быть?
А буддийский тип не подскажете? Который в памяти чакры открывает?
  Ответить с цитированием
Старый 29.04.2013, 18:59   #24   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 36

silly вне форума Не в сети
Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
И зачем вообще приводить -я сделал просто (((unsigned char*)Data)[I] & 0xFF). - работает.
Здесь по идее должно быть что-то вроде (unsigned int*)Data[i] (если там действительно два байта на символ), но нужно посмотреть определение PAnsiChar, поскольку судя по выводу гугла скорее всего Spectator путает его с PChar.
  Ответить с цитированием
Старый 29.04.2013, 19:06   #25   
///
 
Аватар для -=Женек=-
 
Сообщений: 9,552
Регистрация: 02.04.2005
Возраст: 45

-=Женек=- вне форума Не в сети
Продолжаю копать. Чего я не понял с самого начала, и не пойму сейчас - зачем & 0xFF?
Убрал - тоже работает.
  Ответить с цитированием
Старый 29.04.2013, 19:13   #26   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,633
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
Продолжаю копать. Чего я не понял с самого начала, и не пойму сейчас - зачем & 0xFF?
Убрал - тоже работает.
Убирает всё что свыше одного байта. Если в байт и запихивать - совершенно без нужды. Если в инт - будет разница

int m = 0x101;
int n = m & 0xFF;

n=1;
  Ответить с цитированием
Старый 29.04.2013, 19:52   #27   
Registered User
 
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58

Hopkroft вне форума Не в сети
Цитата:
Сообщение от -=Женек=- Посмотреть сообщение
Продолжаю копать. Чего я не понял с самого начала, и не пойму сейчас - зачем & 0xFF?
Убрал - тоже работает.
конечно будет работать, приведением к типу unsigned char вы "обрезали" остальные данные.
А получилось вам сделать вот этот фрагмент
Цитата:
(((unsigned char*)Data)[I] & 0xFF).
т.к. компилятор смог преобразовать тип, вот и всё.
По-поводу того что int православнее в данном случае я бы поспорил. Если у Евгения, библиотека обрабатывает, по 1 байту из потока, зачем ему использовать int?
Где он выиграет?
  Ответить с цитированием
Старый 29.04.2013, 20:15   #28   
highly mean
 
Сообщений: 1,128
Регистрация: 26.05.2011
Возраст: 36

silly вне форума Не в сети
Э… Вы бы сначала разобрались кто из вас вообще первым предложил использовать int, а то здесь выходит спор без предмета спора.
  Ответить с цитированием
Старый 29.04.2013, 20:20   #29   
Registered User
 
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58

Hopkroft вне форума Не в сети
silly, первым int было предложено использовать в примере от создателей компонентов. Потом, оказалось что нужно работать с unsigned char, ну и понеслось))
  Ответить с цитированием
Старый 02.05.2013, 08:38   #30   
Форумец
 
Аватар для Spectator
 
Сообщений: 44,633
Регистрация: 27.05.2003
Возраст: 48

Spectator вне форума Не в сети
почему int самый православный тип. еще раз, хотя я уже объяснял.
по правилам и идее размерность (в байтах) инта должна быть равна разрядности процессора. это самый родной для процессора тип данных. для оперирования целыми числами с большей или меньшей размерностью процессор либо обрезает данные в регистрах, либо задействует память свыше одного регистра.
ПОЭТОМУ в случаях, когда не ТРЕБУЕТСЯ использовать более другой тип данных, нужно использовать именно int.
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind