Форум программистов, компьютерный форум CyberForum.ru

Перевод кода из Delphi в C++ Builder - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Записать цепочки символов в отдельные переменные строки http://www.cyberforum.ru/cpp-beginners/thread1743907.html
Добрый день, есть задание : Составить программу для замены одной цепочки символов на другую (с тем же количеством символов). Первая строка текста содержит две цепочки символов (что на что заменить), разделенных символом '/'. В конце первой строки (через пробел после второй цепочки) стоит символ '*', отделяющий цепочки от основного текста. Исходный текст на русском языке начинается со второй...
C++ Найти фирму которая наибольшее количество раз выступала в роли истца Добрый день! Помогите написать функцию. Вопрос жизни и смерти. Есть база данных и в которую надо дописать функцию. Функция должна определить фирму которая наибольшее количество раз выступала в роли истца. Я думаю что сначала надо отсортировать фирмы которые выступали в роли истца, а потом среди них найти фирму которая самое большое количество раз выступала истцом, то есть максимальный... http://www.cyberforum.ru/cpp-beginners/thread1743890.html
C++ Protected наследование
Когда нужно защищенное наследование?
Использование виртуальных функций C++
Программа берет данные из двух файлов, в которых есть дата и количество проданных билетов, и высчитывает среднее количество проданных билетов за месяц. Кароч вот программа #include<iostream> #include<fstream> #include<clocale> using namespace std; class read { protected: ifstream file; int i, b, summ, sr_zn;
C++ Выбор структуры для операции сложения попарных элементов при N=10^6 http://www.cyberforum.ru/cpp-beginners/thread1743862.html
Доброго дня!Подскажите пожалуйста, есть множество элементов от 1 до N.(где N=10^6). Мне нужно выполнить суммирование 1-ого элемента со 2-ым, 3-ого с 4-ым ит.д. То есть за один проход в цикле, я получу N/2 элементов, далее N/4 ит.д. В конце останется один элемент,являющейся результатом. Вопрос какую структуру использовать лучше (м.б. массив?) ? Если да,то как это лучше сделать, функция похоже...
C++ Матрицы - перегрузка операторов >> и << Здравствуйте! Помогите, пожалуйста. Компилятор ругается на мою попытку перегрузить операторы ввода и вывода. Не знаю как исправить, посоветуйте что-нибудь, пожалуйста. Matrix.h #pragma once #include <iostream> //библиотека для потокового ввода, вывода using namespace std; //пространство имен class Matrix подробнее

Показать сообщение отдельно
Pasha326
0 / 0 / 0
Регистрация: 21.04.2016
Сообщений: 5
24.05.2016, 12:53     Перевод кода из Delphi в C++ Builder
Есть программа и листинг к ней. Программа считывает с датчка освещенности через USB данные и выдает это все в виде диаграмм. Написано изначально на делфи. Можно ли это перевести как то в C++? Я полный профан в этом деле. ТАк что любая помощ была бы кстати.

ССЫЛКА НА ПРОГУ ДЛЯ НАГЛЯДНОСТИ:
https://yadi.sk/d/i_2n24JTrKdHe
Результат рабочей программы:
https://yadi.sk/i/NLucEGT0rwwQa
______________________________________________________________________________________________________
Следует отметить, что приемное устройство присоединяется через адаптер к USB, а его драйвер предоставляет в Windows виртуальный COM-порт с определенным номером. После выбора номера COM-порта в списке слева вверху пользователь может открыть порт. В случае успешного обнаружения передачи от удаленного устройства в текстовом редакторе приложе-ния пользователь увидит зарегистрированные данные с указанием времени приема в левом столбце.
В нижней части окна приложения располагается график принятых данных как функции времени. В показанном примере датчик перемещали по нескольким помещениям при освеще-нии только естественным светом от окна в пасмурную погоду.
Кроме того, приложение предоставляет следующие возможности:
– показ всего принятого пакета в 16-ричном виде (чекбокс «Dump»);
– запись принятых данных в файл (чекбокс «Write File»).
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
//
unit LightXBeeUser;
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Spin, TeEngine, Series, TeeProcs,
  Chart;
type
  TLightXBeeUserForm = class(TForm)
    OpenComButton: TButton; // Кнопка Open COM
    CloseComButton: TButton; // Кнопка Close COM
    Timer: TTimer;
    DumpCheckBox: TCheckBox;
    RichEdit: TRichEdit;
    ComPortNumberSpinEdit: TSpinEdit;
    Label1: TLabel; // Левый верхний угол COM
    Chart: TChart;
    Series1: TFastLineSeries;
    WriteFileCheckBox: TCheckBox;
    StatusBar: TStatusBar;
    procedure OpenComButtonClick(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure CloseComButtonClick(Sender: TObject);
    procedure WriteFileCheckBoxClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  LightXBeeUserForm: TLightXBeeUserForm;
//
Рассмотрим кратко принципы передачи и приема информации на персональном компь-ютере через COM-порт. При разработке программ достаточно использовать вызовы функций API (Application Program Interface) существующие в Windows для этой цели.
Для работы с COM-портом Windows использует следующие структуры данных:
//
var
//Переменные для настройки COM-порта
  fError: integer;
  ComHandle: THandle;
  Timeouts: TCommTimeOuts;
  DCB: TDCB;
//
где:
– fError – код последней ошибки;
– ComHandle – дескриптор системного объекта (хэндлер);
– Timeouts – структура данных, хранящая настройки таймаутов (интервалов ожидания информации) для COM-порта;
– DCB – структура, хранящая настройки аппаратной части COM-порта персонального компьютера.
Кроме того, для приема и последующего декодирования пакета желательно использовать массив достаточного размера, обеспечивающий произвольный доступ к полям пакета:
//
//Приемный буфер
  Buffer: array[0..127] of byte;
//
Перед приемом информации сначала надо открыть порт, то есть указать Windows, что приложение собирается его использовать и настроить его параметры. Это показано в следую-щем фрагменте программы.
//--------------------------------------------------------------
//Открыть COM-порт и настроить его
//--------------------------------------------------------------
procedure TLightXBeeUserForm.OpenComButtonClick(Sender: TObject);
begin
  SetLastError(0);
  //Попробовать открыть COM-порт и создать его дескриптор ComHandle
  ComHandle := CreateFile(PChar('\\.\COM' + IntToStr(ComPortNumberSpinEdit.Value)), //Имя порта
                    GENERIC_READ or GENERIC_WRITE, //Открыть на чтение и запись
                    0, //Параметр совместного доступа для портов должен быть равен 0
                    nil, //Атрибуты защиты файла. Для портов должен быть пустой указатель
                    OPEN_EXISTING, //Режим создания. Порты должны открываться как уже существующие
                    FILE_ATTRIBUTE_NORMAL, //Отсутствуют специальные атрибуты
                    0); //Дескриптор файла-шаблона. Для портов должен быть равен 0
  fError := GetLastError;
  //Если была ошибка, то просто сообщить
  if fError <> 0 then begin
    ComHandle := 0;
    if fError = 5 then ShowMessage('COM'
                                   + IntToStr(ComPortNumberSpinEdit.Value)
                                   + ' уже открыт (занят)')
    else ShowMessage('Ошибка '
                     + IntToStr(fError)
                     + '     COM'
                     + IntToStr(ComPortNumberSpinEdit.Value) + ' не найден');
  end else begin
    OpenComButton.Enabled := false;
    //Задать размеры буферов COM-порта
    SetupComm(ComHandle,
              2048,  //Размер буфера ввода в байтах
              1); //Размер буфера вывода в байтах
    //Очистить буферы
    PurgeComm(ComHandle,
              PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
    //Задать таймауты
    with TimeOuts do begin
      ReadIntervalTimeout := 500; //максимум полсекунды между кадрами
      ReadTotalTimeoutMultiplier := 20; //максимум 20 мс между байтами
      ReadTotalTimeoutConstant := 0; //остальные таймауты не используются
    end;
    if SetCommTimeouts(ComHandle, TimeOuts) then begin
      //Заполнить Data Control Block (блок управления данными)
      GetCommState(ComHandle, DCB);
      with DCB do begin
        DCBlength := SizeOf(TDCB);
        BaudRate := 9600; //Скорость передачи
        ByteSize := 8; //8 битов данных
        Parity := 0; //Без контроля четности
        StopBits := 0; //Один стоп-бит
      end;
      if not SetCommState(ComHandle, DCB) then begin
        ShowMessage('COM'
          + IntToStr(ComPortNumberSpinEdit.Value) + ' неправильные параметры');
      end else begin
        Timer.Enabled := true;
        OpenComButton.Enabled := false;
        CloseComButton.Enabled := true;
      end;
    end else begin
      ShowMessage('COM'
        + IntToStr(ComPortNumberSpinEdit.Value) + ' неправильные таймауты');
    end;
  end;
end;
В случае, если порта с заданным номером нет или он занят, на экране будет сообщение об этом. Настройка порта на заданную скорость и прочие параметры делается через описан-ные выше структуры данных.
Далее можно передавать и принимать информацию. Для этого есть функции API Windows WriteFile и ReadFile. Например, в данном приложении:
//--------------------------------------------------------------
//Принять и обработать очередной кадр от датчика освещенности
//--------------------------------------------------------------
procedure TLightXBeeUserForm.TimerTimer(Sender: TObject);
var
  ReadCount, i: Cardinal;
  s: string;
begin
  //Попытаться принять кадр в буфер
  ReadCount := 0;
  ReadFile(ComHandle,
           Buffer,
           128,
           ReadCount,
           nil);
  //Если что-то принято, обработать кадр
  if ReadCount > 0 then begin
    //Преобразовать кадр в строку с шестнадцатеричными кодами
    s := '';
    for i := 0 to ReadCount - 1 do
      s := s + IntToHex(Buffer[i], 2) + ' ';
    //Если нужно, вывести в шестнадцатеричном виде,
    if DumpCheckBox.Checked then RichEdit.Lines.Add(s)
    //иначе - вывести в десятичном виде с указанием времени
    else if Buffer[0] = $7E then RichEdit.Lines.Add(FormatDateTime('hh:nn:ss,zzz', Now)
                                                    + Chr(9)
                                                    + IntToStr(Buffer[19] * 256 + Buffer[20]));
    //Добавить точку на график
    with Chart do begin
      if SeriesList.Series[0].Count < MaxChartCount then begin
        BottomAxis.Maximum := MaxChartCount - 1;
        BottomAxis.Minimum := 0;
      end else begin  //Если много точек, сдвинуть график влево
        BottomAxis.Maximum := SeriesList.Series[0].Count;
        BottomAxis.Minimum := SeriesList.Series[0].Count - MaxChartCount + 1;
      end;
      SeriesList.Series[0].Add(Buffer[19] * 256 + Buffer[20], FormatDateTime('hh:nn:ss', Now));
    end;
    //Если нужно, записать отсчет в текстовый файл
    if WriteFileCheckBox.Checked then
      Writeln(TextOutFile, FormatDateTime('hh:nn:ss,zzz', Now)
                                          + Chr(9)
                                          + IntToStr(Buffer[19] * 256 + Buffer[20]));
  end;
end;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 13:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru