Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Вопросы по С/С++ (СИ)

Сообщение hybroid »

Ошибочку поправлю в примере выше с кейсом: s/defoult/default/
:oops:
Реклама
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Вопросы по С/С++ (СИ)

Сообщение isx »

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

Код: Выделить всё

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 );
Вот может кому пригодится... Этот код позволяет выводить на экран введёные цифры с клавиатуры МК без сторонних библиотек (кроме <string.h> разумеется)... Можно в дальнейшем ограничить количество вводимых символов, запретить вводить "0" в качестве первого символа и т.д.
Реклама
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

вообще вам уже совесть подсказывает, что можно все свести к простой функции
я могу дополнить что можно сделать вот так и все.
Не помню только как с указателем правильно будет

Код: Выделить всё

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 раз.
В поисках истины человек развивается.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Re: Вопросы по С/С++ (СИ)

Сообщение isx »

Ну мой случай предполагает последовательное введение цифр с клавиатуры. Строка может иметь неограниченную длину, при этом не требуется менять код...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

вместо кучи кейсов, тем более при чтении наверняка тоже кейсы используются, можно

Код: Выделить всё

*buffer++=code+'0'; 
только цифры должны совпадать.
В поисках истины человек развивается.
Реклама
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

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: Вопросы по С/С++ (СИ)

Сообщение coredumped »

Да накрутили. А itoa() все-таки применить вера не позволяет?
Все будет только лучше, в крайнем случае - хуже.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение ut1wpr »

Послушайте coredumped. Не знаете, что это такое? Почитайте классиков... :)
http://ru.wikipedia.org/wiki/Itoa_(%D0%A1%D0%B8)
С уважением,
Виктор.
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Вопросы по С/С++ (СИ)

Сообщение hybroid »

Бесполезно. Именно эту ссылку на википедию уже давал, но тут терминальная стадия видимо.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Совесть писал(а): Не будет это работать, не будет :(
Поправил
Тупанул, малеха, согласен.
Можно в цикле так же сделать как в ссылке на статью про 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 раз.
В поисках истины человек развивается.
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: Вопросы по С/С++ (СИ)

Сообщение Совесть »

Этот код даже плохим назвать нельзя, это "нечто".
Ладно, допустим тут ваши руки не успевали за головой, или наоборот

Код: Выделить всё

 if(code<10&&)
И тут тоже

Код: Выделить всё

char Buff
Ладно, вот это будем считать просто вашей уверенностью что char включен по умолчанию беззнаковым

Код: Выделить всё

char func(char code,unsigned char * buffer){
   if(code<10&&) {*buffer++=code+'0';}
Ладно, забыв в функции func поставить ретурн, мы всего лишь получим предупреждение.
Вот это просто бред и ошибка

Код: Выделить всё

*ptr_buffer=(void*)Buff;
И еще одна ошибка

Код: Выделить всё

func (code,*ptr_buffer)
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение ut1wpr »

Присоединяясь к совесть, хочется попросить всех учителей "прогонять" через компилятор подаваемые примеры. Так сказать, проверить для начала, чему учим.
С уважением,
Виктор.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Совесть писал(а): if(code<10&&)
исправил отвлекся.
Совесть писал(а):Ладно, вот это будем считать просто вашей уверенностью что char включен по умолчанию беззнаковым
Хе а то что это еще и массив не заметили?Гуру программирования.
Совесть писал(а):Ладно, забыв в функции func поставить ретурн, мы всего лишь получим предупреждение.
исправил.
Совесть писал(а):Вот это просто бред и ошибка
Код:
*ptr_buffer=(void*)Buff;
Ничего не бред, работает, проверено.
Правда в GCC не проверял но КВ глотает.
Совесть писал(а)::facepalm: мои строки? это ваш код. Вы вглядитесь внимательнее в них. Еще внимательнее. Еще... Если не видите проблему, попробуйте прогнать в симуляторе.
Это вовсе не мой код, листаните выше.Да скопировал.Но я вовсе не это в том примере показывал.И я написал, что непонятно для чего так делается.
В поисках истины человек развивается.
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: Вопросы по С/С++ (СИ)

Сообщение Совесть »

5 минут ушло на то чтобы скачать CV и проверить.
Вложения
CV.JPG
(152.72 КБ) 384 скачивания
Последний раз редактировалось Аlex Сб июн 09, 2012 20:03:51, всего редактировалось 1 раз.
Причина: -
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Скачивайте нову версию.
Доказательство.GIF
(86.1 КБ) 363 скачивания
И это не фотошоп
Последний раз редактировалось Аlex Сб июн 09, 2012 20:15:03, всего редактировалось 2 раза.
Причина: -
В поисках истины человек развивается.
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: Вопросы по С/С++ (СИ)

Сообщение Совесть »

:cry: Конечно не фотошоп. Если вы убрали один знак '*' и думаете, что это не заметно, то вы ошибаетесь. Записи:

Код: Выделить всё

*ptr_buffer=(void*)Buff;
и

Код: Выделить всё

ptr_buffer=(void*)Buff
не эквивалентны.
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Re: Вопросы по С/С++ (СИ)

Сообщение coredumped »

Я думаю, что при таких раскладах, начинающие программеры уже и не знают кому верить :shock: Раз уж у гуру код неработает, то что нам, несчастным, делать?
Все будет только лучше, в крайнем случае - хуже.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Совесть писал(а): Конечно не фотошоп.
Ладно не плачьте, исправил.А за дурака попросил бы извиниться.
Если вас модер прикрывает, то это не значит, что ваша СОВЕСТЬ чиста.
Причем еще и часть слов стирает, невнимательно.
В поисках истины человек развивается.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Вопросы по С/С++ (СИ)

Сообщение uk8amk »

Возможно ли как-то организовать массив указателей на строки во FLASH и как это правильно сделать?
Поясню зачем это мне. Допустим, МК общается с 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: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

можно разделить команды по повторяющимся символам.Правда это еще нужно посмотреть как меньше места будет занято с функцией или с простым массивом во флеш.хотя при расширении программы выигрыш может и увеличиться.
сейчас еще раз прочитал,можно сделать такую функцию.и добивать пустые символы,если нужно.
или если для приема,то просто игнорировать.
а если использовать указатели, все равно ведь во флеш будет место на пустые байты занято.
В поисках истины человек развивается.
Ответить

Вернуться в «Разные вопросы по МК»