Перейти к содержанию
    

Передача параметров в функцию.

Меня ещё мой куратор на первой работе научил так выделять передаваемые в функцию параметры.

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Однако с гарвардской архитектурой у меня пока не очень складывается.

Я научился передавать в функцию константные строки, типа:

SendString (PSTR("Long-long-long String!\n"));

либо через глобальную или локальную статическую переменную:

char TestFlashStr[] PROGMEM = "Test String.\n";
SendString (TestFlashStr);

 

Разумеется с последующим использованием pgm_read_byte ();.

Но всё это константы.

А как мне передать переменную? Например результат работы функции atoi ();.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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");

 

А как мне передать переменную? Например результат работы функции 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы так делал

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверное к тому же, как возврат из функции send_block(char *data, size_t size) указателя на инвалидную ячейку памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Нормальный общеизвестный приём.

Чтобы ограничить видимость переменной фигурными скобками "липового" while.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

зачем в данном случае узор ввиде do{ .....}while(0); :)

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

 

Наверное к тому же, как возврат из функции send_block(char *data, size_t size) указателя на инвалидную ячейку памяти.

Кому он мешает в данном сферическом случае?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

 

{
   int result = atoi("6231");
   send_block((char *)&result, sizeof(result));
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нормальный общеизвестный приём.

Чтобы ограничить видимость переменной фигурными скобками "липового" while.

Чтобы ограничить видимость переменной достаточно написать {}. while для этого не требуется.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверное к тому же, как возврат из функции 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;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нормальный общеизвестный приём.

Чтобы ограничить видимость переменной фигурными скобками "липового" while.

Этот прием используеся для других целей, например чтобы не выполнять последующие условия при выполнении первых:

do
    {
    if(А)
        {
        /* действие для А */
        break;
        }
    if(Б)
        {
        /* действие для Б */
        break;
        }
    if(В)
        {
        /* действие для В */
        break;
        }
    } while (0);

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

 

А чтобы ограничить видимость переменной достаточно просто ограничить ее фигурными скобками. Никто не запрещает ставить их в любом месте программы.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Анатолий.

Изменено пользователем aesok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Повторяю еще раз. Под руку подвернулся способ объявить локальную переменную. А вообще, блоки "от фонаря" лично я не люблю, т.к. для меня они понижают читабельность кода. Думаю, что не я один такой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...