Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/31: Рейтинг темы: голосов - 31, средняя оценка - 4.87
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431

Помощь с ComDrv32!!!!

03.02.2012, 14:40. Показов 6069. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем! Люди помогите разобраться с ComDrv32! Дело в том что пишу я программу на C++Builder но использую компонент ComDrv32, инфа о котором написана для делфи (( и примеры использования тоже не нём! Мне нужно узнавать в каком состоянии находится линия DCD! В делфи это можно узнать вот так
Delphi
1
if(lsCD in rrcwindow.Com.GetLineStatus=True)then
(Кстати rrcwindow это имя компонента!) Но как это сделать на C++?
На форуме С++ тоже ни кто не знает! Просто непонятно что значит in? По идее rrcwindow.Com.GetLineStatus это структура, в ней есть элемент lsCD. На си по идее должно быть обращение к элементу структуры
C++
1
rrcwindow->GetLineStatus.lsCD
но выдает ошибку [C++ Error] Unit1.cpp(22): E2316 'lsCD' is not a member of 'TLineStatusSet'! Вот что есть в Хелпе))).
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type
  TLineStatus = ( lsCTS, lsDSR, lsRING, lsCD );
  TLineStatusSet = set of TLineStatus;
 
function GetLineStatus: TLineStatusSet;
 
Description
Returns the state of CTS, DSR, RING and RLSD (CD) signals. The function fails if the hardware does not support the control-register values.
The result value is a set of TCommPortLineStatus values:
 
 
Value   Meaning
 
lsCTS   CTS (Clear-To-Send) signal is on
lsDSR   DSR (Data-Set-Ready) signal is on
lsRING  RING (Ring Detect) signal is on
lsRLSD  RLSD (Receive-Line-Signal-Detect) signal is on
    ( also known as CD or Carrier-Detect )
Помогите!!!!
Вложения
Тип файла: zip cdd4.zip (88.6 Кб, 22 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.02.2012, 14:40
Ответы с готовыми решениями:

Где взять comdrv32? Реализация.
Здравствуйте! У меня такая проблема. Есть программа на C++Builder 6 в которой во время выполнения определенной части кода: Код: ...

Помощь
Как проверить список ссылающихся сайтов на конкретную страницу anchor#link="www.site.ru/страница" не выходит

Помощь по С++.
Задача должна считать минимальный элемент каждой четной строки матрицы, она не работает подскаэите что не так #include...

19
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
03.02.2012, 15:22
Vovik_0_1, в Си нет типа множеств. Вместо множества можно использовать битовые операции (применение битовых полей).
Delphi
1
  if lsCD in rrcwindow.Com.GetLineStatus then
->
C++
1
2
3
  if ((lsCD & rrcwindow.Com.GetLineStatus) == lsCD) {
    
  };
Это в случае, если в программе на Си переменная lsCD объявлена, как целочисленная.
1
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431
03.02.2012, 19:37  [ТС]
Спасибо, вот только выдает ошибку
Delphi
1
[C++ Error] Unit1.cpp(21): E2235 Member function must be called or its address taken
Что с ней делать?
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
03.02.2012, 21:30
Текст ошибки можно перевести примерно так: что здесь должен быть либо вызван метод, либо должен быть получен адрес метода (точка входа в него).
Но чего-то конкретного я здесь, видимо, не посоветую - я не работал с этим компонентом и проверить работу в Си Билдере у меня нет возможности.
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
04.02.2012, 10:11
Mawrat
Ты не прав & не является эквивалентом in.

Логика у in такая
Code
1
x in y = ((1 shl x) and y<>0)
Однако при x>31 произойдёт переполнение типа int.

Я бы посоветовал использовать встроенный ассемблер
Assembler
1
2
3
4
5
mov eax,[x]
bt  [y],eax
jnc @f
  //Если x содержится в множестве y, то выполнится эта часть кода
@f:
1
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431
04.02.2012, 11:56  [ТС]
Мдаааа. Куда мне да ассемблера!! Можно конкретный пример реализации плиз!!!
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
04.02.2012, 12:11
Держи функцию
C++
1
2
3
4
5
6
7
8
9
10
bool in(int x,void *y)
{
    _asm
    {
        mov eax,[x]
        mov edx,[y]
        bt  [edx],eax
        sbb eax,eax
    }
}
Пример
C++
1
2
3
int y[4]={0,0,1,0}; //Множество содержит число 64
bool x=in(63,&y);   //в x будет false (0x00000000)
bool z=in(64,&y);   //в z будет true  (0xFFFFFFFF)
А вобще я плохо знаю C++ - может быть там есть множества.
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
04.02.2012, 12:42
Цитата Сообщение от murderer Посмотреть сообщение
Delphi
1
x in y = ((1 shl x) and y<>0)
murderer, не соглашусь. Если используется операция
Delphi
1
1 shl x
то при таком способе можно задать SizeOf(y)*8 значений. - Т. е. это позиционный способ кодирования. В Delphi во внутреннем представлении множества занимают 4 байта. Тогда, позиционным способом можно закодировать только 32 значения. Но множества позволяют хранить 256 значений.
В Delphi множества как-то по-хитрому устроены. Какой там механизм используется не знаю. Вот сейчас попробовал во множество добавить значение 2, потом привёл тип множества к целому (Cardinal, DWORD) и получил значение 37.
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
04.02.2012, 12:52
В Delphi во внутреннем представлении множества занимают 4 байта.
32 байта. Посмотри sizeof.
Вот сейчас попробовал в множество добавить значение 2, потом привёл тип множества к целому (Cardinal, DWORD) и получил значение 37.
А я получил 4 (это как раз таки 1 shl 2).
Delphi
1
2
x:=[2];
Form1.Caption:=inttostr(pdword(@x)^);
В Delphi множества как-то по-хитрому устроены. Какой там механизм используется не знаю.
Ничего особенного - там используется инструкция bt, которую я и предлагал. bt позволяет задавать множества произвольного размера от 8 до 2^32 элементов. Но Delphi насколько я знаю работает только с множествами в 256 элементов.
1
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431
04.02.2012, 13:26  [ТС]
Цитата Сообщение от murderer Посмотреть сообщение
Держи функцию
Код C++1
2
3
4
5
6
7
8
9
10 bool in(int x,void *y)
{
_asm
{
mov eax,[x]
mov edx,[y]
bt [edx],eax
sbb eax,eax
}
}
Пример
Код C++1
2
3 int y[4]={0,0,1,0}; //Множество содержит число 64
bool x=in(63,&y); //в x будет false (0x00000000)
bool z=in(64,&y); //в z будет true (0xFFFFFFFF)
А вобще я плохо знаю C++ - может быть там есть множества.
Это всё работает только в Z нет ни true ни false.
И еще вопросик, а как эту функцию можно использовать в
Цитата Сообщение от Vovik_0_1 Посмотреть сообщение
rrcwindow->GetLineStatus.lsCD
???????
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
04.02.2012, 14:05
Это всё работает только в Z нет ни true ни false.
TRUE определено как 1, а там возвращается -1. Чтобы возвращалась единица нужно заменить
Assembler
1
sbb eax,eax
на
Assembler
1
2
setc  al
movzx eax,al
а как эту функцию можно использовать
Ну если брать во внимание этот код
Delphi
1
if(lsCD in rrcwindow.Com.GetLineStatus=True)then
То так
C++
1
if (in(lsCD,&rrcwindow.Com.GetLineStatus)) {
Добавлено через 11 минут
[CPP]Сейчас только заметил
Delphi
1
TLineStatus = ( lsCTS, lsDSR, lsRING, lsCD );
Там значения от 0 до 3. Так что можно смело писать
C++
1
if (rrcwindow.Com.GetLineStatus & (1<<lsCD)) {
Только проверь как в c++ определена константа lsCD - должно быть 3.
1
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431
04.02.2012, 14:48  [ТС]
Делаю так
Цитата Сообщение от murderer Посмотреть сообщение
if (rrcwindow->GetLineStatus & (1<<lsCD)) {
Выдаёт ошибку [C++ Error] Unit1.cpp(22): E2235 Member function must be called or its address taken

А если так
Цитата Сообщение от murderer Посмотреть сообщение
if (in(lsCD,&rrcwindow->GetLineStatus)) {
то ошибки
[C++ Error] Unit1.cpp(32): E2034 Cannot convert 'TLineStatusSet (_fastcall * (_closure )())()' to 'void *'
[C++ Error] Unit1.cpp(32): E2342 Type mismatch in parameter 'y' (wanted 'void *', got 'TLineStatusSet (_fastcall * (_closure )())()')

Добавлено через 17 минут
Делаю так
C++
1
if (in( lsCD , & rrcwindow->GetLineStatus())) {}
Ошибка [Linker Fatal Error] Fatal: Expected a file name:

Добавлено через 2 минуты
Если так то
C++
1
if (rrcwindow->GetLineStatus().Contains( & (1<<lsCD))) {}
то [C++ Error] Unit1.cpp(32): E2027 Must take address of a memory location
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
04.02.2012, 14:54
А понял GetLineStatus - это функция. тогда
C++
1
if (rrcwindow->GetLineStatus() & (1<<lsCD)) {
либо
C++
1
2
int x=rrcwindow->GetLineStatus();
if (in(lsCD,&x)) {
Добавлено через 3 минуты
Где можно посмотреть исходный код ComDrv32 для C++?
1
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431
04.02.2012, 14:58  [ТС]
Делаю так
Цитата Сообщение от murderer Посмотреть сообщение
int x=rrcwindow->GetLineStatus();
if (in(lsCD,&x)) {
ошибка [C++ Error] Unit1.cpp(33): E2034 Cannot convert 'TLineStatusSet' to 'int'
Делаю так

Цитата Сообщение от murderer Посмотреть сообщение
if (rrcwindow->GetLineStatus() & (1<<lsCD)) {
то [C++ Error] Unit1.cpp(22): E2094 'operator&' not implemented in type 'TLineStatusSet' for arguments of type 'int'

Добавлено через 1 минуту
Цитата Сообщение от murderer Посмотреть сообщение
Где можно посмотреть исходный код ComDrv32 для C++?
Да вот, еслиб я знал!
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
04.02.2012, 15:04
Цитата Сообщение от murderer Посмотреть сообщение
32 байта. Посмотри sizeof.
Точно, murderer, ты прав. Именно, 32 байта = 32 * 8 = 256 значений.
Цитата Сообщение от murderer Посмотреть сообщение
А я получил 4 (это как раз таки 1 shl 2).
Понятно.
1
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
04.02.2012, 15:08
Vovik_0_1
Так попробуй
C++
1
2
TLineStatusSet x=rrcwindow->GetLineStatus();
if (in(lsCD,&x)) {
1
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431
04.02.2012, 15:13  [ТС]
Ща попробую!

Добавлено через 4 минуты
Выскакивает [Linker Fatal Error] Fatal: Expected a file name:
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
04.02.2012, 15:18
Смотрел в отладчике как это всё работает. Если создать функцию такого вида
Delphi
1
2
3
4
5
6
7
8
9
type
MySet=set of byte;
 
function func: MySet;
var
a,b: byte;
begin
  result:=[a,b];
end;
то она преобразуется в процедуру
Delphi
1
procedure func(var x);
Причём такая запись
Delphi
1
x:=func;
Будет преобразована в нечто такое
Delphi
1
2
func(temp);
x:=temp;
То есть компилятор создаёт дополнительную переменную для возвращения результата. Это жесть.

Добавлено через 4 минуты
Выскакивает [Linker Fatal Error] Fatal: Expected a file name:
Не имею ни малейшего представления как это исправить

Поиск по форуму: [Linker Fatal Error] Fatal: Expected a file name
1
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431
04.02.2012, 15:32  [ТС]
Всем огромное спасибо!!!!! Вроде ошибки не выскакивают и проект компилится! Осталось только на практике проверить!
0
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431
05.02.2012, 19:47  [ТС]
Кстати можно было сделать всё намного проще!!!! Но всё равно вам спасибо!!
C++
1
if (rrcwindow->GetLineStatus().Contains(lsCD)) {
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.02.2012, 19:47
Помогаю со студенческими работами здесь

Количество байтов в файле
Доброе время суток у меня есть проблемы, куча проблем, не буду долго объяснять, перейду сразу к делу. У меня задачи которые надо решить....

ПОМОЩЬ!
Помогите пожалуйста Разработать динамическую библиотеку, содержащую класс вычисления функций с помощью разложения в ряд Тейлора на...

Помощь
Как раскрутить сайт, используя скрытые страницы, т.е. черным методом????????????

Дано действительное x. Последовательность A1, A2 ... по следующему закону
Прошу, ну пожалуйста помогите с задачей. Я не могу разобраться. Буду очень сильно благодарен вам! Дано действительное x....

Помощь
Задали решить контрольную работу в MathCad, Excel, Visio. В программах я не расбираюсь, попросил помощи у знакомых учителей, положительного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru