Запутался в указателях
19.12.2012, 22:12
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Запутался в указателях
А по теме топика - смысл следующий...
В описанной Вами процедуре Вы не используете массив. Зачем тогда его там объявлять? Правильным является объявление переменных там, где Вы их используете. И именно там. Это и функционально и наглядно.
Кроме того, язык Си, позволяет многое, но есть так сказать "правила установившейся практики". Эти правила рекомендуют функционально разбивать задачу на части. Как правило каждая часть имеет "c" и "h" файлы с одним и тем же именем. Если Вы применяете массив, который увязан с таким блоком, то имеет смысл, создавать этот массив глобальным в этом функциональном блоке. И объявлять его в начале файла с тем же static, для локальности. Данное правило не распространяется для работы из под ОС. Там чаще применяют Объявление переменных в задаче или вызывающей ф-ции.
===
Итак смысл в том, что Вам предпочтительней объявить массив там где вы его используете, а в Вашу ф-цию передать указатель на данный массив.
|
|
|
|
20.12.2012, 00:40
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Запутался в указателях
Сообщение от whoim
|
|
Boba_spb не решает конкретно эту проблему.. ничего лучше не придумал. Задача - переводить в строки числа от uint8 до uint32. Кстати пробовал нагугленный синтаксис подстановки в формат своего числа, не захотело работать сцуко, пытался долго. Может, подскажете как?
|
Не понимаю в чем проблема.
ну заведите буфер, сформируйте в ней строку. И передавайте буфер.
Что то типа такого
char buf[256];
void SetLine( char *pt, uint8 a. uint16 b, uint32 c)
{
int uk=0;
char *pString=pt;
pString += sprintf ( pString, "CHAR=%03u\n\r" ,a);
pString += sprintf ( pString, "SHORT=%05u\n\r" ,b);
pString += sprintf ( pString, "LONG= %010ul\n\r" ,c);
pString += sprintf ( pString, "Привет Волку !!!\n\r");
}
///======================
ну и пользйте далее
SetLine(buf, 255,xFFFF,0xFFFFFFFF);
SendToRs(buf);
|
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
20.12.2012, 07:30
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Запутался в указателях
Сообщение от SasaVitebsk
|
Если Вы применяете массив, который увязан с таким блоком, то имеет смысл, создавать этот массив глобальным в этом функциональном блоке. И объявлять его в начале файла с тем же static, для локальности.
===
Итак смысл в том, что Вам предпочтительней объявить массив там где вы его используете, а в Вашу ф-цию передать указатель на данный массив.
|
Так и сделал, потестирую - в этом ли дело было с "иногда перезагрузками"
|
|
|
|
20.12.2012, 07:34
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Запутался в указателях
Сообщение от Boba_spb
|
Не понимаю в чем проблема.
ну заведите буфер, сформируйте в ней строку. И передавайте буфер.
Что то типа такого
char buf[256];
void SetLine( char *pt, uint8 a. uint16 b, uint32 c)
{
int uk=0;
char *pString=pt;
pString += sprintf ( pString, "CHAR=%03u\n\r" ,a);
pString += sprintf ( pString, "SHORT=%05u\n\r" ,b);
pString += sprintf ( pString, "LONG= %010ul\n\r" ,c);
pString += sprintf ( pString, "Привет Волку !!!\n\r");
}
///======================
ну и пользйте далее
SetLine(buf, 255,xFFFF,0xFFFFFFFF);
SendToRs(buf);
|
си не критичен к непередаче параметра?) мне же не все сразу, а по очереди. Но в таком случае придется ту же проверку case вводить, что не имеет смысла - проще не станет. А вот передача указателя - понял, реализую
|
|
|
|
20.12.2012, 10:22
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Запутался в указателях
Может Вы такое хотите?
void sprin(char *bf, void *v,int n)
{
switch(n)
{
case 1:
sprintf(bf, "%03u", (Int8U)(*(Int8U *)v)); break;
case 2:
sprintf(bf, "%05u", (Int16U)(*(Int16U *)v)); break;
case 4:
sprintf(bf, "%010u", (Int32U)(*(Int32U *)v)); break;
case 8:
sprintf(bf, "%020u", (Int64U)(*(Int64U *)v)); break;
}
}
int main(void)
{
char bf[256];
Int8U i8=255;
Int16U i16=255;
Int32U i32=255;
Int64U i64=255;
sprin(bf, &i8, sizeof(i  );
sprin(bf, &i16, sizeof(i16));
sprin(bf, &i32, sizeof(i32));
sprin(bf, &i64, sizeof(i64));
}
|
|
|
|
21.12.2012, 12:06
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Запутался в указателях
Boba_spb, видимо да, спасибо  Счас разберу
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:49.
|
|