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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

isx - учить матчасть
RAM - хранит переменные, а flash константы
RAM - можно менять, а flash - нет
что не ясно?
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

ChipKiller , я ж говорю - памяти маловато :)))
Одно записалось - другое стёрлось :)))
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

не благодарное дело объяснять, а уж "вдалбливать" и подавно
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

А почему тогда вот это рабоет нормально:

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

char flash *lcdA = "erye";
char *lcdB = "Tyujfkvi";
int code = 4;

    void main( void ) 

 {         
   

  lcdA = "BEZHELME";
     
                 
  lcd_init( 16 );  
  lcd_clear( );
  lcd_gotoxy( 0,0 ); 

  lcd_putsf( lcdA );
  lcd_gotoxy( 0,1 ); 
  lcd_puts(lcdB);
  
               }
Реклама
Эиком - электронные компоненты и радиодетали
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

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

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

Да уж, веселый день сегодня.
Аlex писал(а):
Поставил значение 103....В протеусе всё в норме...
Вам повезло - в следующей ячейке, после массива, оказалось нулевое значение :))
А вам не повезло, вы не знаете как работает стандартная функция. И при этом еще и пытаетесь блеснуть остроумием.
Аlex писал(а):в Си нельзя просто так присваивать указателю целую строку через знак равенства. Это делается через оператор strcpy, который копирует одну область памяти в другую.
Это кто вам сказал?
ChipKiller писал(а):RAM - хранит переменные, а flash константы
RAM - можно менять, а flash - нет
Про то что константы хранятся и в RAM не слышали? И даже больше, по умолчанию они там и хранятся.

isx : вы бы почитали теорию, все ваши непонятки объясняются довольно просто, ничего загадочного нет.
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Совесть писал(а):Про то что константы хранятся и в RAM не слышали? И даже больше, по умолчанию они там и хранятся.
... ага - питание включаем и весь RAM уже в константах :))
Совесть писал(а): Да уж, веселый день сегодня.
... да - клоунов полно
Реклама
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

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

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

Дурак не тот кто не знает, а тот кто знать не хочет.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

А вам не повезло, вы не знаете как работает стандартная функция.
Куда уж нам, невезучим, до Вас... Если Вы собрались форматировать строку в массив, размером превышающую размер массива, то желаю Вам удачи...
Это кто вам сказал?
Мне приснился сон, в котором сидим - я, Керниган и Ритчи за столом и пьём пиво. И тут они мне говорят - "Alex, никогда и ни за что на свете, не присваивай строки знаком равенства !". Вот я теперь хожу и всем советую. :)))
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Дурак не тот кто не знает, а тот кто не знает сам, а другим советует......
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Совесть писал(а):Дурак не тот кто не знает, а тот кто знать не хочет.
А тут кто-то кого-то дураком назвал ? Ткните в меня ссылкой, плиз...
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

....эх Аlex - не разглядел ты специалиста :))
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Да куда уж нам, слепым котятам :shock: :)))
isx писал(а):А почему тогда вот это рабоет нормально:

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

char flash *lcdA = "erye";
char *lcdB = "Tyujfkvi";
int code = 4;

    void main( void ) 

 {         
   

  lcdA = "BEZHELME";
     
                 
  lcd_init( 16 );  
  lcd_clear( );
  lcd_gotoxy( 0,0 ); 

  lcd_putsf( lcdA );
  lcd_gotoxy( 0,1 ); 
  lcd_puts(lcdB);
  
               }
Всё просто. lcdA у Вас - указатель на строку-константу. Ему можно присвоить адрес строки (даже через равенство), просто некоторые специалисты не следят за диалогом, не вникают в суть и не понимают что Вы хотите. Вы считаете lcdA некой переменной, хранящей строку, но это не так. Это всего лишь указатель на строку. А т.к. этот указатель на константу, то, соответственно, строку на которую он указывает изменить нельзя (что пытается сделать sprintf) !

Объяснил как смог :)))
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Аlex писал(а):Объяснил как смог :)))
... для такого вопроса этого явно недостаточно
Это получается мне надо перевести её в RAM, поменять значение, и потом опять во FLASH?
:)))
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Тогда попробуем объяснить по другому.
isx, Вам нужно объявить переменную-массив (выделить некую область памяти в РАМе), в которую Вы будете укладывать строку с помощью sprintf или strcpy.

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

char lcd_buf[10];
Объявили.
Теперь работаем с этим массивом. Имя массива, кстати, - есть указатель на начало этого массива.
Выведем в первую строку "String 1":

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

strcpy(lcd_buf,"String 1") ;   \\ Копируем в буфер/массив строку "String 1"
lcd_gotoxy( 0,0 );                \\ Перемещаем курсор
lcd_putsf( lcd_buf );             \\ Выводим буфер на LCD
Выведем во вторую строку "String 2" через sprintf:

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

int var;
var=2;

sprintf(lcd_buf,"String %u",var);  \\ Форматируем строку
lcd_gotoxy( 0,1 );                       \\ Перемещаем курсор
lcd_putsf( lcd_buf );                    \\ Выводим буфер на LCD
Ну вот, как-то так... Писал на лету, могут быть ошибки. :write:
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

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

Сообщение coredumped »

2 isx - прежде, чем сушить мозги себе и людям, все-таки настоятельно советую почитать учебник по языку С. Особенно работу с массивами и указателями. А также посмотреть функции работы со строками (strcpy, strcmp итд)
Не спорю, для начинающего программера извраты с указателями могут застатвить закипеть мозг, но это надо изучить и понять, иначе бросайте это дело.
Все будет только лучше, в крайнем случае - хуже.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

И так не работает.. :o
Но вот проблемма гораздо глубже... Код у меня огромный....
вот часть:

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

 if (punkt == 0) {lcdA = "Lineyka v1.0"; lcdB = "Glavnoe menu"; }
         if (punkt == 1) { lcdA = "    Options"; lcdB = " "; }
         if (punkt == 11) {lcdA = "Options"; lcdB = "Kalibrovka";}  
         if (punkt == 111) { lcdA = "Kalibrovka"; lcdB = "Wait!!! ";  }   
         if (punkt == 12) { lcdA = "Options"; lcdB = "Proverka"; }
         if (punkt == 121) {  lcdA = "Proverka"; lcdB = "Wait!!! "; }
         if (punkt == 2) { lcdA = "    Vvod Visoti"; lcdB = "   "; } 
         if (punkt == 21) {lcdA = " Vvod Visoti"; lcdB = "Visota";} 

         if (block == 1) {lcdA = "      VVOD";    lcdB = code;   } // вот именно здесь необходимо присвоить числовое значение lcdB
                 
  lcd_init( 16 );  
  lcd_clear( );
  lcd_gotoxy( 0,0 );
  lcd_putsf( lcdA );
  lcd_gotoxy( 0,1 ); 
  lcd_putsf( lcdB );
и таких присвоений lcdB других значений строк море, но присвоение числа нужно только здесь...
До встречи со sprintf всё работает нормально....
Может можно воспользоваться другой функцией?
Есть мысль разбить число на составляющие и каждой цифре присвоить своё строковое значение (типа: if (a == 1) {b = "1"}; if(a == 2) {c = "2"}; ), но сложить их потом в одну строку и присвоить к lcdB
(типо того что я делал в своём коде: lcdB = "1", "2") не получается... Может я синтаксис неправильный использую, а может так впринципе невозможно?
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

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

Сообщение coredumped »

моск включать не хотим, как я понял

Попробуй так

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

char lcd_buf[16];
sprintf(lcd_buf, "%d", 1234);

lcd_putsf(lcd_buf);
Все будет только лучше, в крайнем случае - хуже.
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Когда добавляю строку sprintf, то размер прошивки увеличивается в 5 РАЗ!!!! Походу эта функция хавает ООЧЕНЬ много памяти.... Я нашёл решение по экономнее (раз в 5 :))) ), как доделаю выложу код....
Кстати.... Всё можно изменять.......Только после вставки sprintf, нужно уже писать не lcdB = "111"; , а lcdB = '111';. Почему не знаю, но работает только так....
Аватара пользователя
isx
Поставщик валерьянки для Кота
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

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

Сообщение isx »

Вот товарищи, как и обещал выкладываю своё творение... Если кто нибудь знает как упростить СВИТЧИ то подскажите пожалуйста, ато моя голова уже совсем не варит ничего...
Кстати даже в таком виде программа занимает 15% , а при использовании вместо моей "извращении" sprintf, занимает 57% .... Так что даже так использовать её выгодней... :)

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

int code = 964;

char lcd_buf[10] = "isx";
char AA[2] = "1";
char AB[2] = "1";
char AC[2] = "1";

int a = 0;
int b = 0;
int c = 0;

    void main( void ) 

 {         
 a = code / 100;
 b = (code / 10) - (a*10);
 c = code - (a*100 + b*10);        
 
switch (a)
  {
   case 0: 
   AA[0] = '0';
   break;  
   case 1:
   AA[0] = '1';
   break;   
   case 3:
   AA[0] = '3';
   break;   
   case 4:
   AA[0] = '4';
   break;   
   case 5:
   AA[0] = '5';
   break;   
   case 6:
   AA[0] = '6';
   break;   
   case 7:
   AA[0] = '7';
   break;    
   case 8:
   AA[0] = '8';
   break;   
   case 9:
   AA[0] = '9';
   break;
   
  }
    
  switch (b)
  {
   case 0: 
   AB[0] = '0';
   break;  
   case 1:
   AB[0] = '1';
   break;   
   case 3:
   AB[0] = '3';
   break;   
   case 4:
   AB[0] = '4';
   break;   
   case 5:
   AB[0] = '5';
   break;   
   case 6:
   AB[0] = '6';
   break;   
   case 7:
   AB[0] = '7';
   break;    
   case 8:
   AB[0] = '8';
   break;   
   case 9:
   AB[0] = '9';
   break;
   
  }
    
    switch (c)
  {
   case 0: 
   AC[0] = '0';
   break;  
   case 1:
   AC[0] = '1';
   break;   
   case 3:
   AC[0] = '3';
   break;   
   case 4:
   AC[0] = '4';
   break;   
   case 5:
   AC[0] = '5';
   break;   
   case 6:
   AC[0] = '6';
   break;   
   case 7:
   AC[0] = '7';
   break;    
   case 8:
   AC[0] = '8';
   break;   
   case 9:
   AC[0] = '9';
   break; 
   }
               
  lcd_init( 16 );  
  lcd_clear( );
  lcd_gotoxy( 0,0 ); 
  lcd_putsf( lcdA );  
  lcd_gotoxy( 0,1 );   
 strcat(lcd_buf, AA);  
 strcat(lcd_buf, AB); 
 strcat(lcd_buf, AC);     
lcd_puts( lcd_buf );         
  
               }
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

а разве не так делает функция itoa?
а знаете что '1' это на самом деле 0х31в числовом эквиваленте?
как раз это число совпадает с адресом символа 1 на вашем буквенном дисплее.
В поисках истины человек развивается.
Ответить

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