Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » FAQ по Borland C++ Builder

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
spike
File > New... > Package
А потом добавляй в проект модули. Компоненты обычно состоят из Designtime и Runtime частей - отдельные пэкэджи, но бывает и всё в одном. Так что выставляй это в свойствах проекта. там же подсоединяй другие требуемые пэкэджи.

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 11:16 08-09-2005 | Исправлено: EZH, 11:17 08-09-2005
DeviL



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Народ я пишу для МК но понадобилось написать и ПО для ПК. так вот возник такой вопрос.  
Установил компонент для работы с ком портом- все пучком. получаю данные в массив  
Код:  
 
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 но нравится

Всего записей: 268 | Зарегистр. 24-10-2003 | Отправлено: 11:33 05-10-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DeviL
Разберись какой из байтов у тебя старший и умножай его на 256 (или делай сдвиг на 8), а затем прибавляй младший байт. Присваивать надо конечно всё не байту, а тому же int например А потом полученное пихай в стандартную функцию IntToHex. Можно и поотдельности байты пихнуть в IntToHex и склеить строки.
 

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 12:31 05-10-2005
Xarde



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
в итоге имею все свои байты в массиве 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;
 

Кстати, если не в курсе (новичёк всё-таки) - на Win32 int имеет размер 4(!) байта, а не 2. На 2 байта рассчитан short.
 

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

Для этого тебе надо сначала преобразовать hex-строку в число, а затем произвести операцию, обратную приведённой выше.

Всего записей: 266 | Зарегистр. 06-07-2003 | Отправлено: 13:02 05-10-2005
DeviL



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ну в целом отправить данные получилось(хотя и корявенько
чтоб оправить байт С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; // вот только это с новой строки будет?
}
 
 
думаю приблизительно все так а может и нет    
будем пробовать! теперь я не боюсь!    

Всего записей: 268 | Зарегистр. 24-10-2003 | Отправлено: 13:30 06-10-2005
DeviL



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Еще интересует! имеется массив  

Код:
 
char *data = new[len];
 
 
потом data получает массив из ком порта - допустим 8 байт
первый команда она не нужна потом 6 нужной инфы + контрольная сумма (она тоже нафиг для отображения не нужна)
мне бы все это дело вывести в Memo отформатированно  
например приходит 01 11 22 22 11 33 33 65 (это от балды взял    )
нужно чтоб в Memo отображалось так

0x11 0x22 0x22
0x11 0x33 0x33
 
кто посоветует как сделать?  

Всего записей: 268 | Зарегистр. 24-10-2003 | Отправлено: 15:37 07-10-2005
Xarde



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

Всего записей: 266 | Зарегистр. 06-07-2003 | Отправлено: 16:48 07-10-2005
DeviL



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ок напишу как я понял поправьте плз если не так

Код:
 
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);
 
 

Всего записей: 268 | Зарегистр. 24-10-2003 | Отправлено: 16:57 07-10-2005
Xarde



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это работать не будет.
Во-первых, 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 );
 

Всего записей: 266 | Зарегистр. 06-07-2003 | Отправлено: 17:09 10-10-2005
DeviL



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
 
народ подскажите плз. У меня есть файл в котором нужные мне данные либо в символах чтото типа "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);
 
 

Всего записей: 268 | Зарегистр. 24-10-2003 | Отправлено: 10:58 07-11-2005
greenfox



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Граждани!
При работе приложения возникает стандартная ошибка:
   
Не понятно откуда она - при компиляции ничего не лезет, при останове на ней вылетаетв строчки где по идее ничего нет... как и куда помотреть!? Кто как мониторит такое!? Заранее спасибо.

----------
Три вещи вечны: смерть, налоги и потеря данных...

Всего записей: 4139 | Зарегистр. 29-07-2003 | Отправлено: 14:48 07-11-2005 | Исправлено: greenfox, 14:50 07-11-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
greenfox
Вероятнее всего попытка использования указателя, когда там NULL. Проявляется только во время выполнения.
 
Включай режим отладки проекта (в свойствах проекта - Debug). Когда вылетит ошибка - смотри стэк (Call Stack) и ищи там в списке сверху вниз какой-либо твой модуль. Тыкай на него и ставь точку останова на строчку выше. Перезапускай приложение и когда дойдешь до точки останова проверяй все указатели на NULL, а уже затем ищи причину почему там NULL.

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 15:39 07-11-2005 | Исправлено: EZH, 15:39 07-11-2005
greenfox



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EZH
спасибо, буду пробовать, а точнее опять читать наверно...
у меня она стала выскакивать после того как вместо ButtonClick функции (стандартное наз-е) решил ещё в неё подфункции написать - в cpp файле вверху всё нарисовал, компилю - и вот на этой подфункции и вылетает Мож её ещё надо и в хидере определить (только из этой формы вызывается)!?

----------
Три вещи вечны: смерть, налоги и потеря данных...

Всего записей: 4139 | Зарегистр. 29-07-2003 | Отправлено: 16:32 07-11-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
greenfox
Не понял, ты заменил ранее созданную функцию обработки OnClick на другую свою? Не понял что значит написать "подфункции" - нет такого понятия, это в паскале такое есть, если мы об одном и том же говорим.

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 17:00 07-11-2005
greenfox



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EZH
вынес часть кода функции ButtonClick в отдельную функцию - начались глюки

----------
Три вещи вечны: смерть, налоги и потеря данных...

Всего записей: 4139 | Зарегистр. 29-07-2003 | Отправлено: 17:23 07-11-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
greenfox
Может какие параметры не передал нужные в функцию? Гадать можно долго, проще всего отладить как я написал выше, или выложи основыне моменты этих функций - попробуем так посмотреть... только укажи где какие переменные описаны.

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 17:27 07-11-2005 | Исправлено: EZH, 17:28 07-11-2005
greenfox



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да собственно там если всё упростить то 2 строчки то и остаётся:
 

Код:
void NumberGenerate(void){    //моя подфункция - в неё код и выносил из ButtonClick
        FormMain->Number = 555;
        FormMain->EditOutput->Text = "01";
        }
 
void __fastcall TFormMain::ButtonClick(TObject *Sender){ // собственно жмём кнопку и вылетаем в дебагер
    Timer->Enabled = 1;
    NumberGenerate();
    }

 
в заголовочном файле функция моя NumberGenerate никак не прописана (только на этой форме в cpp)... Проблема то наверно простая, но не бум-бум я в програмировании...

----------
Три вещи вечны: смерть, налоги и потеря данных...

Всего записей: 4139 | Зарегистр. 29-07-2003 | Отправлено: 18:04 07-11-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
greenfox
Попробуй описать твою функцию как член класса в хэдере (можно в private разделе), а в cpp пиши её так

Код:
 
void __fastcall TFormMain::NumberGenerate()
{
   Number = 555;
   EditOutput->Text = "01";
}
 

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 22:35 07-11-2005
greenfox



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
EZH
всё решилось, спасибо.
где то я там что-то на определял... объявил как метод класса и потом через this-> всё пошло. Спасибо.

----------
Три вещи вечны: смерть, налоги и потеря данных...

Всего записей: 4139 | Зарегистр. 29-07-2003 | Отправлено: 11:36 08-11-2005 | Исправлено: greenfox, 19:45 08-11-2005
Kott



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
[q][/q]
DeviL
Не понятно, с чем собственно у тебя проблема?

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

Только может не нуно использовать все вот тетети  WriteFile без особой на то нужды. ИМХО потоковые быстрее управляемее и надежнее.

Всего записей: 161 | Зарегистр. 12-12-2003 | Отправлено: 23:58 08-11-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » FAQ по Borland C++ Builder


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru