Вопросы по С/С++ (СИ)
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Вопросы по С/С++ (СИ)
isx - учить матчасть
RAM - хранит переменные, а flash константы
RAM - можно менять, а flash - нет
что не ясно?
RAM - хранит переменные, а flash константы
RAM - можно менять, а flash - нет
что не ясно?
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
ChipKiller , я ж говорю - памяти маловато 
Одно записалось - другое стёрлось
Одно записалось - другое стёрлось
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Вопросы по С/С++ (СИ)
не благодарное дело объяснять, а уж "вдалбливать" и подавно
Re: Вопросы по С/С++ (СИ)
А почему тогда вот это рабоет нормально:
Код: Выделить всё
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);
}Re: Вопросы по С/С++ (СИ)
Да уж, веселый день сегодня.
isx : вы бы почитали теорию, все ваши непонятки объясняются довольно просто, ничего загадочного нет.
А вам не повезло, вы не знаете как работает стандартная функция. И при этом еще и пытаетесь блеснуть остроумием.Аlex писал(а):Вам повезло - в следующей ячейке, после массива, оказалось нулевое значениеПоставил значение 103....В протеусе всё в норме...
Это кто вам сказал?Аlex писал(а):в Си нельзя просто так присваивать указателю целую строку через знак равенства. Это делается через оператор strcpy, который копирует одну область памяти в другую.
Про то что константы хранятся и в RAM не слышали? И даже больше, по умолчанию они там и хранятся.ChipKiller писал(а):RAM - хранит переменные, а flash константы
RAM - можно менять, а flash - нет
isx : вы бы почитали теорию, все ваши непонятки объясняются довольно просто, ничего загадочного нет.
- Реклама
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Вопросы по С/С++ (СИ)
... ага - питание включаем и весь RAM уже в константахСовесть писал(а):Про то что константы хранятся и в RAM не слышали? И даже больше, по умолчанию они там и хранятся.
... да - клоунов полноСовесть писал(а): Да уж, веселый день сегодня.
Re: Вопросы по С/С++ (СИ)
Дурак не тот кто не знает, а тот кто знать не хочет.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Куда уж нам, невезучим, до Вас... Если Вы собрались форматировать строку в массив, размером превышающую размер массива, то желаю Вам удачи...А вам не повезло, вы не знаете как работает стандартная функция.
Мне приснился сон, в котором сидим - я, Керниган и Ритчи за столом и пьём пиво. И тут они мне говорят - "Alex, никогда и ни за что на свете, не присваивай строки знаком равенства !". Вот я теперь хожу и всем советую.Это кто вам сказал?
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Вопросы по С/С++ (СИ)
Дурак не тот кто не знает, а тот кто не знает сам, а другим советует......
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
А тут кто-то кого-то дураком назвал ? Ткните в меня ссылкой, плиз...Совесть писал(а):Дурак не тот кто не знает, а тот кто знать не хочет.
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Вопросы по С/С++ (СИ)
....эх Аlex - не разглядел ты специалиста 
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Да куда уж нам, слепым котятам
Объяснил как смог
Всё просто. lcdA у Вас - указатель на строку-константу. Ему можно присвоить адрес строки (даже через равенство), просто некоторые специалисты не следят за диалогом, не вникают в суть и не понимают что Вы хотите. Вы считаете lcdA некой переменной, хранящей строку, но это не так. Это всего лишь указатель на строку. А т.к. этот указатель на константу, то, соответственно, строку на которую он указывает изменить нельзя (что пытается сделать sprintf) !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); }
Объяснил как смог
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Вопросы по С/С++ (СИ)
... для такого вопроса этого явно недостаточноАlex писал(а):Объяснил как смог
Это получается мне надо перевести её в RAM, поменять значение, и потом опять во FLASH?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Тогда попробуем объяснить по другому.
isx, Вам нужно объявить переменную-массив (выделить некую область памяти в РАМе), в которую Вы будете укладывать строку с помощью sprintf или strcpy.Объявили.
Теперь работаем с этим массивом. Имя массива, кстати, - есть указатель на начало этого массива.
Выведем в первую строку "String 1":
Выведем во вторую строку "String 2" через sprintf:
Ну вот, как-то так... Писал на лету, могут быть ошибки. 
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
Код: Выделить всё
int var;
var=2;
sprintf(lcd_buf,"String %u",var); \\ Форматируем строку
lcd_gotoxy( 0,1 ); \\ Перемещаем курсор
lcd_putsf( lcd_buf ); \\ Выводим буфер на LCD
- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли
Re: Вопросы по С/С++ (СИ)
2 isx - прежде, чем сушить мозги себе и людям, все-таки настоятельно советую почитать учебник по языку С. Особенно работу с массивами и указателями. А также посмотреть функции работы со строками (strcpy, strcmp итд)
Не спорю, для начинающего программера извраты с указателями могут застатвить закипеть мозг, но это надо изучить и понять, иначе бросайте это дело.
Не спорю, для начинающего программера извраты с указателями могут застатвить закипеть мозг, но это надо изучить и понять, иначе бросайте это дело.
Все будет только лучше, в крайнем случае - хуже.
Re: Вопросы по С/С++ (СИ)
И так не работает..
Но вот проблемма гораздо глубже... Код у меня огромный....
вот часть:
и таких присвоений lcdB других значений строк море, но присвоение числа нужно только здесь...
До встречи со sprintf всё работает нормально....
Может можно воспользоваться другой функцией?
Есть мысль разбить число на составляющие и каждой цифре присвоить своё строковое значение (типа: if (a == 1) {b = "1"}; if(a == 2) {c = "2"}; ), но сложить их потом в одну строку и присвоить к lcdB
(типо того что я делал в своём коде: lcdB = "1", "2") не получается... Может я синтаксис неправильный использую, а может так впринципе невозможно?
Но вот проблемма гораздо глубже... Код у меня огромный....
вот часть:
Код: Выделить всё
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 );До встречи со sprintf всё работает нормально....
Может можно воспользоваться другой функцией?
Есть мысль разбить число на составляющие и каждой цифре присвоить своё строковое значение (типа: if (a == 1) {b = "1"}; if(a == 2) {c = "2"}; ), но сложить их потом в одну строку и присвоить к lcdB
(типо того что я делал в своём коде: lcdB = "1", "2") не получается... Может я синтаксис неправильный использую, а может так впринципе невозможно?
- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли
Re: Вопросы по С/С++ (СИ)
моск включать не хотим, как я понял
Попробуй так
Попробуй так
Код: Выделить всё
char lcd_buf[16];
sprintf(lcd_buf, "%d", 1234);
lcd_putsf(lcd_buf);
Все будет только лучше, в крайнем случае - хуже.
Re: Вопросы по С/С++ (СИ)
Когда добавляю строку sprintf, то размер прошивки увеличивается в 5 РАЗ!!!! Походу эта функция хавает ООЧЕНЬ много памяти.... Я нашёл решение по экономнее (раз в 5
), как доделаю выложу код....
Кстати.... Всё можно изменять.......Только после вставки sprintf, нужно уже писать не lcdB = "111"; , а lcdB = '111';. Почему не знаю, но работает только так....
Кстати.... Всё можно изменять.......Только после вставки sprintf, нужно уже писать не lcdB = "111"; , а lcdB = '111';. Почему не знаю, но работает только так....
Re: Вопросы по С/С++ (СИ)
Вот товарищи, как и обещал выкладываю своё творение... Если кто нибудь знает как упростить СВИТЧИ то подскажите пожалуйста, ато моя голова уже совсем не варит ничего...
Кстати даже в таком виде программа занимает 15% , а при использовании вместо моей "извращении" sprintf, занимает 57% .... Так что даже так использовать её выгодней...
Кстати даже в таком виде программа занимает 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: Вопросы по С/С++ (СИ)
а разве не так делает функция itoa?
а знаете что '1' это на самом деле 0х31в числовом эквиваленте?
как раз это число совпадает с адресом символа 1 на вашем буквенном дисплее.
а знаете что '1' это на самом деле 0х31в числовом эквиваленте?
как раз это число совпадает с адресом символа 1 на вашем буквенном дисплее.
В поисках истины человек развивается.


