serg_svd писал(а):И меня смущает наличие в строчке ошибки знака указателя (*).
Потому что эта функция ожидает именно указатель на строку(массив символов), вы же подсовываете ей иной тип данных. От того компилятор возмущается.
Коротко:
Для вывода строки lcd_puts
Для вывода числа как одиночного символа lcd_putchar
Для перевода числа в строковый человекочитаемый вид sprintf(из библиотеки stdio) и только потом lcd_putsf.
uk8amk писал(а):
Потому что эта функция ожидает именно указатель на строку(массив символов), вы же подсовываете ей иной тип данных. От того компилятор возмущается.
А разве строка char text2[10]="Test"; не является строковым массивом?
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
uk8amk, спасибо! sprintf помогло. Но хочу уточнить, прямого вывода числа нет на экран? Вывод только после преобразования в строковый вид?
Эта запись таки является массивом. Но ведь у вас в коде ошибка в ином месте:
Да, но я по наивности думал, что получу числовое значение длины строки и выведу это число на экран. Но я не разобрался, что выводить можно только строковые переменные.
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
serg_svd писал(а):прямого вывода числа нет на экран?
Курите доку на библиотеку, возможно что там есть такая возможность.
Но, даже если и есть функция, принимающая на входе числа, она будет использовать преобразование числа в строку.
Уже всю вдоль и поперек. Она короткая. Там только вывод строковых переменных из разных областей памяти и выод отдельных символов.
Мне очень не хватает книжки по изучению языка С с подробными комментариями и примерами. Не подскажете такую?
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
*Trigger*, О! Спасибо. Сейчас поищу. Хотя возможно это нечто похожее на №3 в моем списке литературы. Но все равно найду и почитаю.
PS
uk8amk писал(а):Для перевода числа в строковый человекочитаемый вид sprintf(из библиотеки stdio) и только потом lcd_putsf.
Мама дорогая!!!
У меня проект использует в качестве микроконтроллера ATmega8A. Ну я вот мигаю светодиодом на нем, на жк вывожу....
Так вот! До компиляции с оператором sprintf объем программы в памяти МК был 9,8%, с ее введением 21,9%!!!
Чего она так память жрет то?
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Не стоит эти sprinf-ы использовать. Дело в том, что эта функция универсальная - она может любое число переменных любого типа преобразовать в строку, разбирая при этом строку формата. Только для перевода чисел и вывода их сразу на индикатор лучше использовать что-то такое (это для положительных чисел, для отрицательных нужно доработать):
unsigned char string[10];
unsigned char i
.........
i=strlenf(text); Текст хранится в FLASH
itoa(i,string);
lcd_gotoxy(0,3);
lcd_puts("Char=");
lcd_puts(string)
Все работает, объем кода стал 12%
Ктати еще насчет памяти подскажите в двух словах. Есть память FLASH и SRAM. Где лучше хранить данные и почему? Просто в бэйсике я не задавал апмять. Видимо компилятор сам "распихивал"
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
И тем не менее если проект разростётся до уровня скажем atmega256 или 128, то расходы на sprintf могут оказаться сопоставимыми или даже меньше чем кучка lcd_putnum для всех условий.
serg_svd писал(а): Где лучше хранить данные и почему?
Константы и неизменные данные разумнее держать только во флеш просто потому что они изначально сохраняются туда вместе с программой, а размер ОЗУ обычно много дефицитнее флеш.
У меня строковый массив задается так: unsigned char str[5]="hello";
Я не знаю насчет правильности такого написания для С, но в книге и в хэлпе кодевижена прописаны оба варианта. Да и мне удобнее писать просто предложением, нежели разбивать на символы. Выводится то на экран все равно одной функцией.
rxstart1 писал(а):правда я никогда не пользовался стандартными функциями
Это хорошо, но на начальном этапе желательно иметь универсальную программу с библиотеками. Поэтому я после раздумий и начал ковырять в кодевижен, а не в студии.
uk8amk, спасибо! примерно такое представление было и у меня. Значит думал в нужном направлении.
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
WiseLord писал(а):Вообще-то строка "hello" занимает 6 байтов, а не 5.
Это да. Я тоже скопировал и не проверил.
Как раз вот сейчас у себя в коде на это нарвался.
На данный момент реализовал побуквенный вывод из строкового массива. Но провозился долго, и, честно говоря, шел путем научного тыка, опять же из-за непонимания чего от меня Си хочет.
Тот же код
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
unsigned char str[5]={'h','e','l','l','o'}; // вот так будет задан МАССИВ, а не строка
разница между массивом и строкой в том, что компилятор ничего не добавляет сам, и вы получаете не строку с ноликом на конце, а массив из 5 символов.
если откинуть unsigned, то с точки зрения компилятора такой массив ничем от строки не будет отличаться, если его передавать в функции работы со строками, но именно в этом и кроется 90% всех багов операционных систем: в этом случае программа не сможет верно определить количество символов в строке! обычно все функции работы со строками знают, что если в строке попался ноль - это признак конца строки и дальше не надо лезть. в вышепоказанном примере такого нуля не будет, и любая функция работы со строкой полезет ЗА ПРЕДЕЛЫ этого массива по ОЗУ и бог знает, когда ей там попадется ноль и чего она к тому времени успеет натворить... не делайте так.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
если вы не любите стандартные функции - это ваши сексуальные предпочтения... но знать-то правила работ с ними следует, раз уж взялись за Си во всей его красе. это не конкретно вам совет - это тем, кто пытается понять, что есть Си и как им не подавиться.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...