Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
Ошибочку поправлю в примере выше с кейсом: s/defoult/default/

- Реклама
Re: Вопросы по С/С++ (СИ)
Разобрался...просто накосячил когда написал шаблон для программы, забыл поставить всё это в бесконечный цикл, поэтому только одно значение и было..
Вот может кому пригодится... Этот код позволяет выводить на экран введёные цифры с клавиатуры МК без сторонних библиотек (кроме <string.h> разумеется)... Можно в дальнейшем ограничить количество вводимых символов, запретить вводить "0" в качестве первого символа и т.д.
Код: Выделить всё
switch (code)
{
case 0:
RAZMER[pozician] = '0';
break;
case 1:
RAZMER[pozician] = '1';
break;
case 2:
RAZMER[pozician] = '2';
break;
case 3:
RAZMER[pozician] = '3';
break;
case 4:
RAZMER[pozician] = '4';
break;
case 5:
RAZMER[pozician] = '5';
break;
case 6:
RAZMER[pozician] = '6';
break;
case 7:
RAZMER[pozician] = '7';
break;
case 8:
RAZMER[pozician] = '8';
break;
case 9:
RAZMER[pozician] = '9';
break;
}
pozician = pozician + 1;
lcd_init( 16 );
lcd_clear( );
lcd_gotoxy( 0,0 );
lcd_putsf( lcdA );
lcd_gotoxy( 0,1 );
strcpy(lcd_buf, RAZMER);
lcd_puts( lcd_buf );
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
вообще вам уже совесть подсказывает, что можно все свести к простой функции
я могу дополнить что можно сделать вот так и все.
Не помню только как с указателем правильно будет
как то так вроде
я могу дополнить что можно сделать вот так и все.
Не помню только как с указателем правильно будет
Код: Выделить всё
void char_to_str(unsigned char number,unsigned char * buffer){
unsigned char temp=number,res;
res=temp/100;//Calculate 100-s
*buffer++=res+'0';
temp=temp-res*100;
res=temp/10; //Calculate 10-s
*buffer++=res+'0';
temp=temp-res*10;
*buffer++=temp+'0';
*buffer++=0; //terminating character
}
//Использование
unsigned char Buff[5];
lcd_gotoxy(0,1);
ptr_Buff= (void*)Buff ;
while(*ptr_Buff)lcd_putchar(*ptr_Buff++);
Последний раз редактировалось vitalik_1984 Пт июн 08, 2012 17:24:49, всего редактировалось 1 раз.
В поисках истины человек развивается.
Re: Вопросы по С/С++ (СИ)
Ну мой случай предполагает последовательное введение цифр с клавиатуры. Строка может иметь неограниченную длину, при этом не требуется менять код...
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
вместо кучи кейсов, тем более при чтении наверняка тоже кейсы используются, можно
только цифры должны совпадать.
Код: Выделить всё
*buffer++=code+'0'; В поисках истины человек развивается.
- Реклама
Re: Вопросы по С/С++ (СИ)
Не будет это работать, не будетvitalik_1984 писал(а):как то так вродеКод: Выделить всё
void char_to_str(unsigned char number,unsigned char char * buffer){ unsigned char temp=number; *buffer++=temp/1000+'0'; *buffer++=temp/100+'0'; *buffer++=temp/10+'0'; *buffer++=temp+'0'; }
- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли
Re: Вопросы по С/С++ (СИ)
Да накрутили. А itoa() все-таки применить вера не позволяет?
Все будет только лучше, в крайнем случае - хуже.
Re: Вопросы по С/С++ (СИ)
Послушайте coredumped. Не знаете, что это такое? Почитайте классиков...
http://ru.wikipedia.org/wiki/Itoa_(%D0%A1%D0%B8)
http://ru.wikipedia.org/wiki/Itoa_(%D0%A1%D0%B8)
С уважением,
Виктор.
Виктор.
Re: Вопросы по С/С++ (СИ)
Бесполезно. Именно эту ссылку на википедию уже давал, но тут терминальная стадия видимо.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
ПоправилСовесть писал(а): Не будет это работать, не будет
Тупанул, малеха, согласен.
Можно в цикле так же сделать как в ссылке на статью про itoa();
можно упростить такisx писал(а):Код: Выделить всё
switch (code) { case 0: RAZMER[pozician] = '0'; break; case 1:
Код: Выделить всё
#define Key_MENU 21 //код кнопки меню и так далее
#define Key_OK 22
#define Key_UP 23
#define Key_DOWN 24
#define MAX_OF_CHARS 3
char func(char code,unsigned char * buffer){
static unsigned char i=0;
if(code<10&&i<MAX_OF_CHARS){*buffer++=code+'0';i++;}
else switch(code){
case Key_MENU:menu();break;
case Key_OK:*buffer++=0;ok();break;
case Key_UP:up();break;
case Key_DOWN:down();break;
default:main_screen();
return i;
}//end switch
}//end func
********
unsigned char Buff[MAX_OF_CHARS+1];
if(Buff[0]==0) ptr_buffer=(void*)&Buff;//проверка если массив пуст,то указатель на начало массива.
func (code,ptr_buffer)
Ну и до железа сами доводите,это ведь не вся программа.
Последний раз редактировалось vitalik_1984 Сб июн 09, 2012 21:46:27, всего редактировалось 6 раз.
В поисках истины человек развивается.
Re: Вопросы по С/С++ (СИ)
Этот код даже плохим назвать нельзя, это "нечто".
Ладно, допустим тут ваши руки не успевали за головой, или наоборотИ тут тожеЛадно, вот это будем считать просто вашей уверенностью что char включен по умолчанию беззнаковымЛадно, забыв в функции func поставить ретурн, мы всего лишь получим предупреждение.
Вот это просто бред и ошибкаИ еще одна ошибка
Ладно, допустим тут ваши руки не успевали за головой, или наоборот
Код: Выделить всё
if(code<10&&)Код: Выделить всё
char BuffКод: Выделить всё
char func(char code,unsigned char * buffer){
if(code<10&&) {*buffer++=code+'0';}Вот это просто бред и ошибка
Код: Выделить всё
*ptr_buffer=(void*)Buff;Код: Выделить всё
func (code,*ptr_buffer)Re: Вопросы по С/С++ (СИ)
Присоединяясь к совесть, хочется попросить всех учителей "прогонять" через компилятор подаваемые примеры. Так сказать, проверить для начала, чему учим.
С уважением,
Виктор.
Виктор.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
исправил отвлекся.Совесть писал(а): if(code<10&&)
Хе а то что это еще и массив не заметили?Гуру программирования.Совесть писал(а):Ладно, вот это будем считать просто вашей уверенностью что char включен по умолчанию беззнаковым
исправил.Совесть писал(а):Ладно, забыв в функции func поставить ретурн, мы всего лишь получим предупреждение.
Ничего не бред, работает, проверено.Совесть писал(а):Вот это просто бред и ошибка
Код:
*ptr_buffer=(void*)Buff;
Правда в GCC не проверял но КВ глотает.
Это вовсе не мой код, листаните выше.Да скопировал.Но я вовсе не это в том примере показывал.И я написал, что непонятно для чего так делается.Совесть писал(а):мои строки? это ваш код. Вы вглядитесь внимательнее в них. Еще внимательнее. Еще... Если не видите проблему, попробуйте прогнать в симуляторе.
В поисках истины человек развивается.
Re: Вопросы по С/С++ (СИ)
5 минут ушло на то чтобы скачать CV и проверить.
- Вложения
-
- CV.JPG
- (152.72 КБ) 384 скачивания
Последний раз редактировалось Аlex Сб июн 09, 2012 20:03:51, всего редактировалось 1 раз.
Причина: -
Причина: -
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Скачивайте нову версию.
И это не фотошоп
Последний раз редактировалось Аlex Сб июн 09, 2012 20:15:03, всего редактировалось 2 раза.
Причина: -
Причина: -
В поисках истины человек развивается.
Re: Вопросы по С/С++ (СИ)
Код: Выделить всё
*ptr_buffer=(void*)Buff;Код: Выделить всё
ptr_buffer=(void*)Buff- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли
Re: Вопросы по С/С++ (СИ)
Я думаю, что при таких раскладах, начинающие программеры уже и не знают кому верить
Раз уж у гуру код неработает, то что нам, несчастным, делать?
Все будет только лучше, в крайнем случае - хуже.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Ладно не плачьте, исправил.А за дурака попросил бы извиниться.Совесть писал(а): Конечно не фотошоп.
Если вас модер прикрывает, то это не значит, что ваша СОВЕСТЬ чиста.
Причем еще и часть слов стирает, невнимательно.
В поисках истины человек развивается.
-
uk8amk
- Поставщик валерьянки для Кота
- Сообщения: 2222
- Зарегистрирован: Вт ноя 27, 2007 11:32:06
- Откуда: Tashkent
Re: Вопросы по С/С++ (СИ)
Возможно ли как-то организовать массив указателей на строки во FLASH и как это правильно сделать?
Поясню зачем это мне. Допустим, МК общается с GSM-модемом, для обработки(парсинга) приходящих от модема ответов на АТ-команды используются шаблоны строк типа такого:
Т.е. мы как-бы имеем массив фиксированного размера, причем размер в "ширину" этого массива равен "ширине" самой длинной команды(строки). Выходит, что место в памяти расходуется впустую для коротких строк. Это довольно простой пример, но по мере увеличения функциональности девайса увеличивается ширина массива, а в месте с ней и уменьшается объем полезной свободной памяти.
Я бы хотел сделать типа такого:
Но пока не знаю как правильно описать такую конструкцию.
ЗЫ. Пишу в Кейле под ARM.
Поясню зачем это мне. Допустим, МК общается с GSM-модемом, для обработки(парсинга) приходящих от модема ответов на АТ-команды используются шаблоны строк типа такого:
Код: Выделить всё
const unsigned char at_cmd_pattern[RESP_TOTAL_CNT][17]={
{ CR, LF, 'O', 'K', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', 4, RESP_OK , CLEN_FIX },
{ CR, LF, 'R', 'I', 'N', 'G', '?', '?', '?', '?', '?', '?', '?', '?', 6, RESP_RING , CLEN_FIX },
{ CR, LF, 'N', 'O', 'C', 'A', 'R', 'R', 'I', 'E', 'R', '?', '?', '?', 11, RESP_TERMINATE , CLEN_FIX },
{ CR, LF, 'N', 'O', 'D', 'I', 'A', 'L', 'T', 'O', 'N', 'E', '?', '?', 12, RESP_TERMINATE , CLEN_FIX },
{ CR, LF, 'B', 'U', 'S', 'Y', '?', '?', '?', '?', '?', '?', '?', '?', 6, RESP_TERMINATE , CLEN_FIX },
{ CR, LF, 'N', 'O', 'A', 'N', 'S', 'W', 'E', 'R', '?', '?', '?', '?', 10, RESP_TERMINATE , CLEN_FIX },
{ CR, LF, 'E', 'R', 'R', 'O', 'R', '?', '?', '?', '?', '?', '?', '?', 7, RESP_ERROR , CLEN_FIX },
{ CR, LF, 'C', 'O', 'N', 'N', 'E', 'C', 'T', '?', '?', '?', '?', '?', 9, RESP_CONNECT , CLEN_VAR },
{'^', 'S', 'Y', 'S', 'S', 'T', 'A', 'R', 'T', '?', '?', '?', '?', '?', 9, RESP_RESET , CLEN_FIX }
};Я бы хотел сделать типа такого:
Код: Выделить всё
const char str_ok="OK";
const char str_ring="RING";
const char str_nocarr="NOCARRIER";
const char *at_cmd_pattern[RESP_TOTAL_CNT] = { str_ok, str_ring, str_no_carr };ЗЫ. Пишу в Кейле под ARM.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
можно разделить команды по повторяющимся символам.Правда это еще нужно посмотреть как меньше места будет занято с функцией или с простым массивом во флеш.хотя при расширении программы выигрыш может и увеличиться.
сейчас еще раз прочитал,можно сделать такую функцию.и добивать пустые символы,если нужно.
или если для приема,то просто игнорировать.
а если использовать указатели, все равно ведь во флеш будет место на пустые байты занято.
сейчас еще раз прочитал,можно сделать такую функцию.и добивать пустые символы,если нужно.
или если для приема,то просто игнорировать.
а если использовать указатели, все равно ведь во флеш будет место на пустые байты занято.
В поисках истины человек развивается.


