реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Передача параметров в функцию., AVR-GCC/ATMega2560
zltigo
сообщение Aug 16 2011, 11:38
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Tuma @ Aug 15 2011, 14:32) *
Меня ещё мой куратор на первой работе научил так выделять передаваемые в функцию параметры.

Уволить без выходного пособие за создание гуано из подчеркиваний, прописных и строчных букв. 100% мерзость.




--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Tuma
сообщение Aug 16 2011, 13:22
Сообщение #17





Группа: Новичок
Сообщений: 6
Регистрация: 12-08-11
Пользователь №: 66 695



Однако с гарвардской архитектурой у меня пока не очень складывается.
Я научился передавать в функцию константные строки, типа:
Код
SendString (PSTR("Long-long-long String!\n"));

либо через глобальную или локальную статическую переменную:
Код
char TestFlashStr[] PROGMEM = "Test String.\n";
SendString (TestFlashStr);


Разумеется с последующим использованием pgm_read_byte ();.
Но всё это константы.
А как мне передать переменную? Например результат работы функции atoi ();.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 16 2011, 14:50
Сообщение #18


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Код
extern void send_char(char what);
#define SendStr(s) do{int i; for(i=0;i<sizeof(s);++i) send_char(str[i]);}while(0);
#define SendStr_P(s) do{static PROGMEM char str[] = s; int i; for(i=0;i<sizeof(str);++i) send_char(pgm_read_byte(&str[i]));}while(0);

SendStr_P ("Long-long-long String!\n");


Цитата(Tuma @ Aug 16 2011, 16:22) *
А как мне передать переменную? Например результат работы функции atoi ();.

Я бы так делал
Код
char * send_block(char *data, size_t size)
{
  while(size--) send_char(*data++);
return data;
}
// пример
do
{
   int result = atoi("6231");
   send_block((char *)&result, sizeof(result));
} while(0);


Сообщение отредактировал _Pasha - Aug 16 2011, 14:54
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 16 2011, 16:06
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (_Pasha @ Aug 16 2011, 16:50) *
Я бы так делал

Помолчу, но об одном все-же не удержусь спросить - зачем в данном случае узор ввиде do{ .....}while(0); sm.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 16 2011, 16:11
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Наверное к тому же, как возврат из функции send_block(char *data, size_t size) указателя на инвалидную ячейку памяти.
Go to the top of the page
 
+Quote Post
Юрий_СВ
сообщение Aug 16 2011, 18:11
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 4-05-08
Пользователь №: 37 272



Цитата(zltigo @ Aug 16 2011, 19:06) *
Помолчу, но об одном все-же не удержусь спросить - зачем в данном случае узор ввиде do{ .....}while(0); sm.gif

Нормальный общеизвестный приём.
Чтобы ограничить видимость переменной фигурными скобками "липового" while.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 16 2011, 18:18
Сообщение #22


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(zltigo @ Aug 16 2011, 19:06) *
зачем в данном случае узор ввиде do{ .....}while(0); sm.gif

Под руку подвернулся способ объявить локальную переменную.

Цитата(sergeeff @ Aug 16 2011, 19:11) *
Наверное к тому же, как возврат из функции send_block(char *data, size_t size) указателя на инвалидную ячейку памяти.

Кому он мешает в данном сферическом случае?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Aug 16 2011, 19:33
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Интересная позиция. Городить do {} while(0) для объявления локальной переменной (видимо для какой-то глубинной оптимизации) - это здорово, а тратить время на запихивание в регистр/ы никчемного указателя - это "не мешающие" мелочи жизни.

А кто мешает без изголизмов:


Код
{
   int result = atoi("6231");
   send_block((char *)&result, sizeof(result));
}
Go to the top of the page
 
+Quote Post
Zlumd
сообщение Aug 17 2011, 02:49
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 12-04-05
Из: Новосибирск
Пользователь №: 4 057



Цитата(Юрий_СВ @ Aug 17 2011, 01:11) *
Нормальный общеизвестный приём.
Чтобы ограничить видимость переменной фигурными скобками "липового" while.
Чтобы ограничить видимость переменной достаточно написать {}. while для этого не требуется.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 17 2011, 03:11
Сообщение #25


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sergeeff @ Aug 16 2011, 22:11) *
Наверное к тому же, как возврат из функции send_block(char *data, size_t size) указателя на инвалидную ячейку памяти.

Это чем же она "инвалидная"? Нормальная ячейка, первый неотправленный символ. Можно отправлять буфер по частям, типа
Код
char *ptr = buf_to_send;
size_t bytes_to_send = strlen(ptr);
while (bytes_to_send)
{
    size_t size = tx_free_size();
    if (size > bytes_to_send)
        size = bytes_to_send;
    ptr = send_block(ptr, size)
    bytes_to_send -= size;
}



--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
777777
сообщение Aug 17 2011, 09:50
Сообщение #26


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Юрий_СВ @ Aug 16 2011, 22:11) *
Нормальный общеизвестный приём.
Чтобы ограничить видимость переменной фигурными скобками "липового" while.

Этот прием используеся для других целей, например чтобы не выполнять последующие условия при выполнении первых:
Код
do
    {
    if(А)
        {
        /* действие для А */
        break;
        }
    if(Б)
        {
        /* действие для Б */
        break;
        }
    if(В)
        {
        /* действие для В */
        break;
        }
    } while (0);

Это придумали goto-ненавистники, они считают что это уродство лучше чем goto.

А чтобы ограничить видимость переменной достаточно просто ограничить ее фигурными скобками. Никто не запрещает ставить их в любом месте программы.
Go to the top of the page
 
+Quote Post
aesok
сообщение Aug 20 2011, 12:02
Сообщение #27


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(zltigo @ Aug 16 2011, 20:06) *
Помолчу, но об одном все-же не удержусь спросить - зачем в данном случае узор ввиде do{ .....}while(0); sm.gif


ответ тут: http://ru.w3support.net/index.php?db=so&id=1067226

Анатолий.

Сообщение отредактировал aesok - Aug 20 2011, 12:03
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 20 2011, 12:10
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (aesok @ Aug 20 2011, 14:02) *

Для особо непонятливых слова "в данном случае" в моем вопросе были выделены жирным шрифтом. Если я выделю их, например, большими красными буквами, Вы сможете дать разумный ответ на вопрос?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aesok
сообщение Aug 20 2011, 13:12
Сообщение #29


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(zltigo @ Aug 20 2011, 16:10) *
Для особо непонятливых слова "в данном случае" в моем вопросе были выделены жирным шрифтом. Если я выделю их, например, большими красными буквами, Вы сможете дать разумный ответ на вопрос?


Если Ваш вопрос звучит зачем оборачивать в .do{ .....}while(0); (c точкой с запитой), то пусть за свой код отвечает автор. Ссылку я привел для него чтобы он руководствовался знаниями, а не поговоркой "Слышал звон, да не знаю где он.'.

Когда я пишу макрос то хочу чтобы он работал всегда а не только "в данном случае", и поэтому всегда оборачиваю мнотострочный макрос в .do{ .....}while(0) (без точки с запятой).

Анатолий.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 20 2011, 13:27
Сообщение #30


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(zltigo @ Aug 20 2011, 15:10) *
Для особо непонятливых слова "в данном случае" в моем вопросе были выделены жирным шрифтом. Если я выделю их, например, большими красными буквами, Вы сможете дать разумный ответ на вопрос?

Повторяю еще раз. Под руку подвернулся способ объявить локальную переменную. А вообще, блоки "от фонаря" лично я не люблю, т.к. для меня они понижают читабельность кода. Думаю, что не я один такой.
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 22:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01563 секунд с 7
ELECTRONIX ©2004-2016