s - строковая переменная фиксированной длины. какой тип переменной var?aftaev писал(а):Если вместо переменной S хочу использовать var например как будет выглядеть?
sprintf(s,"Print %d min\0", Pos_min);
Мои проекты на Ардуино
-
Impartial
- Мастер
- Сообщения: 953
- Зарегистрирован: 23 фев 2011, 01:50
- Репутация: 36
- Контактная информация:
Re: Мои проекты на Ардуино
-
aftaev
- Зачётный участник

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

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
вот это меня с понтолыку и сбило.Impartial писал(а):это название функции переменная s тут не причем.
varprintf сам пример придумал. Не мог понять как в Си в переменную s без равенства приравнивается значения. Если sprintf эт функция то все стало ясно.Impartial писал(а):это вообще непонятно что. буквы все правильно переписал?
может vaprintf ?
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Мои проекты на Ардуино
aftaev писал(а):2. varprintf(var,"Print %d min\0", Pos_min)
Cмотри, в строке %d заменяется на цело число.aftaev писал(а):Нужно теперь другое меню с выводом дробей сообразить.
Если хочешь дробное выводить надо писать %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: Мои проекты на Ардуино
эт ты меня с понтолыку сбил примеромNick писал(а): (ну не удержался)
Написал бы другую любую переменную кроме s и было понятней
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Мои проекты на Ардуино
В си там хитро, если пишут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: Мои проекты на Ардуино
Здесь главное понять, что никакого присвоения не происходит. Функция sprintf выполняет преобразование, в соответствии с заданным форматом, бинарного представления числа в код ASCII. Это тот, который понятен дисплею. Например число 100 при формате %d преобразуется в последовательностьaftaev писал(а):Не мог понять как в Си в переменную s без равенства приравнивается значения.
h31 h30 h30 h00.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Мои проекты на Ардуино
Разве? Всегда было, что в случае %7.2f лидирующие нули заменялись пробелами, то есть вывод будет "__12.34", а чтобы получить 0012.34, надо написать %07.2Nick писал(а):При этом все свободные символы перед числом заполнятся нулями (т.е. "%7.2f",12.345 = 0012.34 ), чтобы поставить вместо них другой символ (например пробел) пишем % 5.2f (тогда будет "% 7.2f",12.345 = __12.34 )
(здесь 0 перед семеркой означает именно это, а в других случаях, нуль перед числом означает восьмеричную систему счисления, то есть 011 == 9)
Хотя в ардуиновском диалекте могут быть отступления от стандарта.
Чудес не бывает. Бывают фокусы.
-
aftaev
- Зачётный участник

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
я ее принял примерно за такоеImpartial писал(а):Функция sprintf выполняет преобразование
s=printf(......)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Мои проекты на Ардуино
по какой ссылке?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: Мои проекты на Ардуино
Там некая помесь C и C++. Изучать на этой основе языки C и C++ крайне не советую.Serg-tmn писал(а):Хотя в ардуиновском диалекте могут быть отступления от стандарта.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
aftaev
- Зачётный участник

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
для начало привыкнуть бы к -- ++ == и подобной фиговинеUAVpilot писал(а):Там некая помесь C и C++. Изучать на этой основе языки C и C++ крайне не советую.
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Мои проекты на Ардуино
Самое весёлое - это когда напишешь условие типа такого:
if (x = 5)
и будешь долго тупить, почему оно срабатывает при любом значении x.
P.S. А в курсе, то x++ и ++x - это две большие разницы?
А ещё забавнее эти ++ и -- работают с указателями.
if (x = 5)
и будешь долго тупить, почему оно срабатывает при любом значении x.
P.S. А в курсе, то x++ и ++x - это две большие разницы?
А ещё забавнее эти ++ и -- работают с указателями.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- Сергей Саныч
- Мастер
- Сообщения: 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: Мои проекты на Ардуино
С какого перепугу? Это вролне законная запись.
Необходимо чётко понимать, что C - это всего-лишь макроассемблер высокого уровня. Из этого следует, что абсолютно всё во власти программиста, и возможность написать компактный код и наделать неочевидных труднообнаруживаемых ошибок - синтаксис языка и компилятор всё позволит. C++ - это попытка исправить ситуацию, но увы, не очень удачная. Это слова Кернигана в вольном переводе.
В качестве примера: компилятор не может вам запретить в том-же printf вывести значение переменной типа int по формату "%s", однако при выполнении скорее всего случится крах программы.
Необходимо чётко понимать, что C - это всего-лишь макроассемблер высокого уровня. Из этого следует, что абсолютно всё во власти программиста, и возможность написать компактный код и наделать неочевидных труднообнаруживаемых ошибок - синтаксис языка и компилятор всё позволит. C++ - это попытка исправить ситуацию, но увы, не очень удачная. Это слова Кернигана в вольном переводе.
В качестве примера: компилятор не может вам запретить в том-же printf вывести значение переменной типа int по формату "%s", однако при выполнении скорее всего случится крах программы.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
aftaev
- Зачётный участник

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

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
С дробями не выходит. Чтоне так?
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);
выводит:
?- ? ?- ?

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);
выводит:
?- ? ?- ?
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
