Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» FAQ по Borland C++ Builder

Автор: EZH
Дата сообщения: 08.09.2005 10:16
spike
File > New... > Package
А потом добавляй в проект модули. Компоненты обычно состоят из Designtime и Runtime частей - отдельные пэкэджи, но бывает и всё в одном. Так что выставляй это в свойствах проекта. там же подсоединяй другие требуемые пэкэджи.
Автор: DeviL
Дата сообщения: 05.10.2005 10:33
Народ я пишу для МК но понадобилось написать и ПО для ПК. так вот возник такой вопрос.
Установил компонент для работы с ком портом- все пучком. получаю данные в массив
Код:

char *data = new[lenght+1];
comm->GetBlock(data, lenght);


в итоге имею все свои байты в массиве data (не знаю только в hex коде или нет)
далее мне нужно все это отобразить в Memo поле только в полученной посылке каждые смежные 2 байта представляют собой int
тобишь 0x22 0xFF есть число 8959 . вот мне и нужно или 0х22FF или 8959 так отображать в Memo - потом следущие 2 байта анализировать и т.д.

и еще вопросик допустим я в поле Edit ввел 0x33DD как мне из этого получить массив char типа 0х33 0хDD ?

спасибо если кто откликнется. сам я только начинаю на Builder'e но нравится
Автор: EZH
Дата сообщения: 05.10.2005 11:31
DeviL
Разберись какой из байтов у тебя старший и умножай его на 256 (или делай сдвиг на 8), а затем прибавляй младший байт. Присваивать надо конечно всё не байту, а тому же int например А потом полученное пихай в стандартную функцию IntToHex. Можно и поотдельности байты пихнуть в IntToHex и склеить строки.

Автор: Xarde
Дата сообщения: 05.10.2005 12:02

Цитата:
в итоге имею все свои байты в массиве data (не знаю только в hex коде или нет)

char имеет диапазон значений 0..255. Причем тут hex? У тебя там должны быть просто числа, а не их символьное представление.


Цитата:
далее мне нужно все это отобразить в Memo поле только в полученной посылке каждые смежные 2 байта представляют собой int
тобишь 0x22 0xFF есть число 8959 . вот мне и нужно или 0х22FF или 8959 так отображать в Memo - потом следущие 2 байта анализировать и т.д.

Для начала ты должен точно знать, какой байт int'a в буфере идет первым - старший или младший. Хотя, изменить будет нетрудно.
Вот небольшой примерчик получения int из двух char:

Код:
char LO = 0xFF;
char HI = 0x22;
int res;
res = LO + HI * 256;
// или так:
res = LO + ((int)HI) << 8;
Автор: DeviL
Дата сообщения: 06.10.2005 12:30
Ну в целом отправить данные получилось(хотя и корявенько
чтоб оправить байт С0 сделал char = "`"; хотя можно создать int 192 и преобразовать в char - тот же эффект- да и главное работает).
Да и принять их я тоже смогу.
В общем зря я боялся что тут все по другому все теже приведения типов и будет пахать как миленькое. единственный гимор(и то потому что не пользовался никогда) это преобразования всякие AnsiString Char Int и т.д. преобразование из визуальных форм в нужный вид данных .. но ниче разбираюсь потихоньку.
думаю если сделать так то будет и в приеме счастье

Код:
char *input_data=данные с порта тут;
int len_input = длина принятой посылки;
for(int i=0;i<(длинна посылки/2);i++)
{
char out_data[2];
out_data[0]=input_data[i];
out_data[1]=input_data[i];
ansistring out_data_as = (AnsiString)out_data;
(тут не точно) Memo->AddLines = то что было + out_data_as; // вот только это с новой строки будет?
}
Автор: DeviL
Дата сообщения: 07.10.2005 14:37
Еще интересует! имеется массив

Код:
char *data = new[len];
Автор: Xarde
Дата сообщения: 07.10.2005 15:48

Цитата:
кто посоветует как сделать?

Как добавлять строки в мему ты уже знаешь. Как сделать hex-строку из двух байт тебе объяснили. Остаётся только собрать три hex-строки в одну, разделив их пробелами. В чём тут сложность? Или я чего-то недопонял?
Автор: DeviL
Дата сообщения: 07.10.2005 15:57
ок напишу как я понял поправьте плз если не так

Код:
char *data = new[len];
AnsiString str1 =(AnsiString) ("0x" + data[1] + " 0x" + data[2] + " 0x" + data[3]);
Memo->Lines->Add(str1);
AnsiString str2 =(AnsiString) ("0x" + data[4] + " 0x" + data[5] + " 0x" + data[6]);
Memo->Lines->Add(str2);
Автор: Xarde
Дата сообщения: 10.10.2005 16:09
Это работать не будет.
Во-первых, data[x] является у тебя не символом, а байтом, присланным по порту. Представлен он будет символом - это да. Но! Тут будут и символы звука, и табуляция, и другие - в общем, все 255, включая специальные.
Во-вторых... блин, забыл уже, что там во-вторых было - отвлекли на пару часов и забыл
В общем, должно быть что-то вроде этого (если, как ты сказал, первый байт тебе не нужен):

Код:
char * data = new [len]
// load data from port
AnsiString str;
str = "0x" + IntToHex( data[1] ) + " 0x" + IntToHex( data[2] ) + " 0x" + IntToHex( data[3] ) );
Memo->Lines->Add( str );
str = "0x" + IntToHex( data[4] ) + " 0x" + IntToHex( data[5] ) + " 0x" + IntToHex( data[6] ) );
Memo->Lines->Add( str );
Автор: DeviL
Дата сообщения: 07.11.2005 09:58

народ подскажите плз. У меня есть файл в котором нужные мне данные либо в символах чтото типа "UUU" либо в hex виде "55 55 55" мне нужно читать из файла по одному байту и дальше я их преобразую и получаю определенным образом число (int) и его мне нужно записывать в файл что типа такого образа
"45864
32146684
1223
-566
0
686868
-343
и т.д."
вот не могу нормально прочитать байт(особенно если файл в hex коде)
записать вроде получилось

Код: WriteFile(H, data.c_str(), 6, &DWORD(n), NULL);
WriteFile(H, "\n", 1, &DWORD(n), NULL);
Автор: greenfox
Дата сообщения: 07.11.2005 13:48
Граждани!
При работе приложения возникает стандартная ошибка:

Не понятно откуда она - при компиляции ничего не лезет, при останове на ней вылетаетв строчки где по идее ничего нет... как и куда помотреть!? Кто как мониторит такое!? Заранее спасибо.
Автор: EZH
Дата сообщения: 07.11.2005 14:39
greenfox
Вероятнее всего попытка использования указателя, когда там NULL. Проявляется только во время выполнения.

Включай режим отладки проекта (в свойствах проекта - Debug). Когда вылетит ошибка - смотри стэк (Call Stack) и ищи там в списке сверху вниз какой-либо твой модуль. Тыкай на него и ставь точку останова на строчку выше. Перезапускай приложение и когда дойдешь до точки останова проверяй все указатели на NULL, а уже затем ищи причину почему там NULL.
Автор: greenfox
Дата сообщения: 07.11.2005 15:32
EZH
спасибо, буду пробовать, а точнее опять читать наверно...
у меня она стала выскакивать после того как вместо ButtonClick функции (стандартное наз-е) решил ещё в неё подфункции написать - в cpp файле вверху всё нарисовал, компилю - и вот на этой подфункции и вылетает Мож её ещё надо и в хидере определить (только из этой формы вызывается)!?
Автор: EZH
Дата сообщения: 07.11.2005 16:00
greenfox
Не понял, ты заменил ранее созданную функцию обработки OnClick на другую свою? Не понял что значит написать "подфункции" - нет такого понятия, это в паскале такое есть, если мы об одном и том же говорим.
Автор: greenfox
Дата сообщения: 07.11.2005 16:23
EZH
вынес часть кода функции ButtonClick в отдельную функцию - начались глюки
Автор: EZH
Дата сообщения: 07.11.2005 16:27
greenfox
Может какие параметры не передал нужные в функцию? Гадать можно долго, проще всего отладить как я написал выше, или выложи основыне моменты этих функций - попробуем так посмотреть... только укажи где какие переменные описаны.
Автор: greenfox
Дата сообщения: 07.11.2005 17:04
Да собственно там если всё упростить то 2 строчки то и остаётся:


Код: void NumberGenerate(void){ //моя подфункция - в неё код и выносил из ButtonClick
        FormMain->Number = 555;
        FormMain->EditOutput->Text = "01";
        }

void __fastcall TFormMain::ButtonClick(TObject *Sender){ // собственно жмём кнопку и вылетаем в дебагер
    Timer->Enabled = 1;
NumberGenerate();
}
Автор: EZH
Дата сообщения: 07.11.2005 21:35
greenfox
Попробуй описать твою функцию как член класса в хэдере (можно в private разделе), а в cpp пиши её так

Код:
void __fastcall TFormMain::NumberGenerate()
{
Number = 555;
EditOutput->Text = "01";
}
Автор: greenfox
Дата сообщения: 08.11.2005 10:36
EZH
всё решилось, спасибо.
где то я там что-то на определял... объявил как метод класса и потом через this-> всё пошло. Спасибо.
Автор: Kott
Дата сообщения: 08.11.2005 22:58
[q][/q]
DeviL
Не понятно, с чем собственно у тебя проблема?

Код:
ifstream in("file.in", ios::binary);
char ch;
while( !in.eof() )
{
in.read(&ch, sizeof(char));
//Ну дальше преобразуй так как тебе нравится. И записывай в файл.
}

Автор: MKalavera
Дата сообщения: 09.11.2005 08:58
Хозяйке на заметку:
Касперский - враг BCB.
Время полного билда проекта
- с включенным KAV: ~820secs
- с выключенным KAV: ~140secs
Версия KAV: 5.0.388 (c более ранней версией 5.x подобного не наблюдалось)
При включенном KAV ресурсы процессора распределяются так:
bcb - 20-30%
kav - 80-70%
Автор: DeviL
Дата сообщения: 09.11.2005 10:22
Kott
Да действительно так и сделал чтение - потоки что-то мне больше по душе. Да и переносимость кода должна быть лучше - ведь CreatFile, WriteFile .. работают только в билдере? и когда их удобнее применять?
только не понял как вывести числа в файл в "нормальном" виде

Код: ofstream out("out.txt");
int i = 123;
out.write((char *)&i, sizeof(int));
out.close();
Автор: Xarde
Дата сообщения: 10.11.2005 14:00

Цитата:
Так зачем нужны все эти функции через WinAPI - когда их лучше применять?

А как же свобода выбора?
Если так спрашивать, то можно дойти и до "а зачем вообще этот WinAPI, если всё можно делать и без него? зачем микрософт вообще его сделала?"
Видимо, без WinAPI все эти радости и не работают (они же сами функции API вызывают).
Автор: DeviL
Дата сообщения: 10.11.2005 16:16

Цитата:
А как же свобода выбора?

Весомый аргумен!
напоминает разговор Нео с "Создателем" - "У нас есть выбор" - говорит Нео. "Я лишь даю вам его иллюзию а выбираете то что мне нужно" - отвечает создатель. (не дословно)
А что теже потоки используют вызов WinAPI ? я только начинаю программирование для ОС. специализация у меня немного другая - но мне инетересно!
Просто инетересно узнать у народа который это уже поюзал - когда и что удобнее применять.На что сделать больший уклон в изучении и что использовать в предпочтении.
Автор: ShIvADeSt
Дата сообщения: 11.11.2005 00:58
DeviL

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

Чем хорошо АПИ, это тем, что если тебе понадобится перекомпилировать программу в более новой версии, то тебе не придется заботиться, как она поведет себя, так как АПИ отработает одинаково (ведь его выполняет сама винда, если упрощено) а вот всякие outsream (они реализованы специфично, и возможно могут меняться от версии к версии) либо вообще перестанут работать. Да и если требуется перенести код на другой язык, то АПИ переносится проще, так как просто меняется синтаксис. Насчет скорости работы кода сказать не могу, но возможно что на АПИ код будет работать быстрее (хотя хз).
Автор: Xarde
Дата сообщения: 11.11.2005 09:43

Цитата:
Насчет скорости работы кода сказать не могу, но возможно что на АПИ код будет работать быстрее (хотя хз).

Должен работать быстрее, т.к. потоки реализуются на том же АПИ. Довольно редко люди пишут полностью свой код (без использования АПИ напрямую или где-то в глубине иерархии наследуемых объектов), т.к. в подавляющем большинстве случаев это не требуется.
Автор: DeviL
Дата сообщения: 11.11.2005 10:12
Вот! За такие объяснения спасиба!
А то многие тут твердили что лучше работать с потоками т.к. они ближе к железу!
Но понял что изучение поток обязательно для точного и полоного понимания что происходит при вызове WinAPI(наверное )
А вот на счет переносимости мне казалось что наоборот - хотя все меняется и наверное это правильно.
Вот думаю перейти на VS2005. Пишут что там можно хоть на Си писать.
В общем думаю стоит теперь оснавательно изучить работу с WinAPI.
Автор: Xarde
Дата сообщения: 12.11.2005 05:03
Только учти, что микрософт активно продвигает свою платформу .NET, что постепенно приводит к тому, что вызов WinAPI становится дурным тоном
Автор: ShIvADeSt
Дата сообщения: 14.11.2005 00:58
Xarde

Цитата:
Только учти, что микрософт активно продвигает свою платформу .NET, что постепенно приводит к тому, что вызов WinAPI становится дурным тоном

Вызов АПИ в программе на НЕТ считается дурным тоном, так как приходится это АПИ эмулировать, а вот в обычных не НЕТ программах, это нормальный тон .
Автор: Xarde
Дата сообщения: 15.11.2005 09:29

Цитата:
а вот в обычных не НЕТ программах, это нормальный тон

Я это и имел в виду.

Страницы: 12345678910111213141516171819202122232425262728

Предыдущая тема: ms exchange


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.