Мои проекты на Ардуино

Контроллеры, драйверы, датчики, управляющие устройства.
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение Impartial »

aftaev писал(а):Если вместо переменной S хочу использовать var например как будет выглядеть?
sprintf(s,"Print %d min\0", Pos_min);
s - строковая переменная фиксированной длины. какой тип переменной var?
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение aftaev »

Impartial писал(а):s - строковая переменная фиксированной длины. какой тип переменной var?
неважно, хочу понять то что красным это переменные sprintf(s,"Print %d min\0", Pos_min);
или sprintf это функция?

Если допустим переменная var
как правильно будет:
1. sprintf(var,"Print %d min\0", Pos_min)
2. varprintf(var,"Print %d min\0", Pos_min)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение Impartial »

aftaev писал(а):sprintf
это название функции переменная s тут не причем.
aftaev писал(а):varprintf(var,"Print %d min\0", Pos_min)
это вообще непонятно что. буквы все правильно переписал?
может vaprintf ?
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение aftaev »

Impartial писал(а):это название функции переменная s тут не причем.
вот это меня с понтолыку и сбило.
Impartial писал(а):это вообще непонятно что. буквы все правильно переписал?
может vaprintf ?
varprintf сам пример придумал. Не мог понять как в Си в переменную s без равенства приравнивается значения. Если sprintf эт функция то все стало ясно.
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение Nick »

aftaev писал(а):2. varprintf(var,"Print %d min\0", Pos_min)
:hehehe: (ну не удержался)
aftaev писал(а):Нужно теперь другое меню с выводом дробей сообразить.
Cмотри, в строке %d заменяется на цело число.
Если хочешь дробное выводить надо писать %f.
Если хочешь дробное с 2 знаками, то пишешь %.2f
Если хочешь, чтобы число всегда занимало 5 символов (чтобы по экрану ничего не скакало) пишешь %5.2f
При этом все свободные символы перед числом заполнятся нулями (т.е. "%7.2f",12.345 = 0012.34 ), чтобы поставить вместо них другой символ (например пробел) пишем % 5.2f (тогда будет "% 7.2f",12.345 = __12.34 )
Если еще хочешь, чтобы всегда писался + если число больше нуля то пишем "%+ 5.2f"

Тебе скорее всего пойдет % 4.1f - будет формат типа xxx.x,
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение aftaev »

Nick писал(а): (ну не удержался)
эт ты меня с понтолыку сбил примером :) sprintf(s,"Print %d min\0", Pos_min);
Написал бы другую любую переменную кроме s и было понятней :) вот так например sprintf(i,"Print %d min\0", Pos_min);
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение Nick »

aftaev писал(а): Не мог понять как в Си в переменную s без равенства приравнивается значения.
В си там хитро, если пишут
int sprintf( char *s, const char *format, ... );
то в функцию передается указатель на переменную, и потом по этому указателю можно что-записать. Кстати, можно очень просто на ошибку нарваться, если строка окажется больше по длине, чем размер того самого char *s, тогда функция может записать в память мимо переменной и что дальше будет никому не известно.

Есть у printf еще вот такой вариант, там жестко прописывается размер:
int vsnprintf( char *s, size_t n, const char *format, va_list ap );
Запись форматированной строки в строку с ограничением на количество выводимых символов. Значения для вывода передаются в функцию в виде списка va list

(Все из википедии, сам не пробовал)
http://ru.wikipedia.org/wiki/Printf
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение Impartial »

aftaev писал(а):Не мог понять как в Си в переменную s без равенства приравнивается значения.
Здесь главное понять, что никакого присвоения не происходит. Функция sprintf выполняет преобразование, в соответствии с заданным форматом, бинарного представления числа в код ASCII. Это тот, который понятен дисплею. Например число 100 при формате %d преобразуется в последовательность
h31 h30 h30 h00.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение Сергей Саныч »

Nick писал(а):При этом все свободные символы перед числом заполнятся нулями (т.е. "%7.2f",12.345 = 0012.34 ), чтобы поставить вместо них другой символ (например пробел) пишем % 5.2f (тогда будет "% 7.2f",12.345 = __12.34 )
Разве? Всегда было, что в случае %7.2f лидирующие нули заменялись пробелами, то есть вывод будет "__12.34", а чтобы получить 0012.34, надо написать %07.2
(здесь 0 перед семеркой означает именно это, а в других случаях, нуль перед числом означает восьмеричную систему счисления, то есть 011 == 9)
Хотя в ардуиновском диалекте могут быть отступления от стандарта.
Чудес не бывает. Бывают фокусы.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение aftaev »

Impartial писал(а):Функция sprintf выполняет преобразование
я ее принял примерно за такое
s=printf(......)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение Serg »

Impartial писал(а):
UAVpilot писал(а):C++ тут никаким боком. Обычный C позволяет объявить структуру, членом которой может быть указатель на функцию.
Ну тогда почитайте то, что по ссылке.
Объявит можно, передать параметры проблематично. Это обеспечивается однозначно механизмом полиформизма С++.
по какой ссылке?

а в чём именно проблема-то?

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

$ cat tst.c
#include <stdio.h>

struct t_lcd {
	int i;
	int (*print) (const char *format, ...);
};

void main (void) {
	struct t_lcd lcd;
	int a;

	lcd.print = printf;
	a = 12345;

	lcd.print("a=%i\n", a);
}
$ make tst
cc     tst.c   -o tst
$ ./tst
a=12345
$ 
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение Serg »

Serg-tmn писал(а):Хотя в ардуиновском диалекте могут быть отступления от стандарта.
Там некая помесь C и C++. Изучать на этой основе языки C и C++ крайне не советую.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение aftaev »

UAVpilot писал(а):Там некая помесь C и C++. Изучать на этой основе языки C и C++ крайне не советую.
для начало привыкнуть бы к -- ++ == и подобной фиговине :)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение Serg »

Самое весёлое - это когда напишешь условие типа такого:
if (x = 5)
и будешь долго тупить, почему оно срабатывает при любом значении x. :hehehe:

P.S. А в курсе, то x++ и ++x - это две большие разницы? :)
А ещё забавнее эти ++ и -- работают с указателями. :idiot:
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение Сергей Саныч »

aftaev писал(а):для начало привыкнуть бы к -- ++ == и подобной фиговине :)
если привыкнешь - понравится. Чем привлекает Си - это лаконичностью "выразительных средств". Хотя неочевидностей тоже немало.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение Сергей Саныч »

UAVpilot писал(а):Самое весёлое - это когда напишешь условие типа такого:
if (x = 5)
Обычно компиляторы на такое выдают предупреждение.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение Serg »

С какого перепугу? Это вролне законная запись.

Необходимо чётко понимать, что C - это всего-лишь макроассемблер высокого уровня. Из этого следует, что абсолютно всё во власти программиста, и возможность написать компактный код и наделать неочевидных труднообнаруживаемых ошибок - синтаксис языка и компилятор всё позволит. C++ - это попытка исправить ситуацию, но увы, не очень удачная. Это слова Кернигана в вольном переводе.

В качестве примера: компилятор не может вам запретить в том-же printf вывести значение переменной типа int по формату "%s", однако при выполнении скорее всего случится крах программы.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение aftaev »

UAVpilot писал(а):Самое весёлое - это когда напишешь условие типа такого:
if (x = 5)
и будешь долго тупить, почему оно срабатывает при любом значении x.
Уже прошел :)
UAVpilot писал(а):P.S. А в курсе, то x++ и ++x - это две большие разницы?
до этого еще не добрался :)
UAVpilot писал(а):А ещё забавнее эти ++ и -- работают с указателями.
эт ваще не понятно что такое указатели :)
Serg-tmn писал(а):если привыкнешь - понравится. Чем привлекает Си - это лаконичностью "выразительных средств". Хотя неочевидностей тоже немало.
Да, особенно нравиться что нужно вглядываться где скобка, а где фигурная скобка. Во кайф
Serg-tmn писал(а):Обычно компиляторы на такое выдают предупреждение.
Ардуино пофиг!
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение Сергей Саныч »

UAVpilot писал(а):С какого перепугу? Это вролне законная запись.
Законная. Это не ошибка. Но тем не менее:
warning.JPG (3122 просмотра) <a class='original' href='./download/file.php?id=9124&mode=view' target=_blank>Загрузить оригинал (25.36 КБ)</a>
По 4 строке - то самое предупреждение.
Чудес не бывает. Бывают фокусы.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

Re: Мои проекты на Ардуино

Сообщение aftaev »

С дробями не выходит. Чтоне так?

float Fr_min=23.33; // переменная ферментация мин.
float Fr_max=23.33; // переменная ферментация макс.
float Ps_min=23.33; // переменная пастеризация мин.
float Ps_max=23.33; // переменная пастеризация макс.
.............................

lcd.clear(); // очищаем
lcd.setCursor(0, 0);
//sprintf(s,"Fr%d-%d Ps%d-%d\0", Fr_min,Fr_max,Ps_min,Ps_max); // работает
sprintf(s," %.2f- %.2f %.2f- %.2f\0", Fr_min,Fr_max,Ps_min,Ps_max); //
lcd.print(s);

выводит:
?- ? ?- ?

:thinking:
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Ответить

Вернуться в «Электроника»