zltigo 2 16 августа, 2011 Опубликовано 16 августа, 2011 · Жалоба Меня ещё мой куратор на первой работе научил так выделять передаваемые в функцию параметры. Уволить без выходного пособие за создание гуано из подчеркиваний, прописных и строчных букв. 100% мерзость. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tuma 0 16 августа, 2011 Опубликовано 16 августа, 2011 · Жалоба Однако с гарвардской архитектурой у меня пока не очень складывается. Я научился передавать в функцию константные строки, типа: SendString (PSTR("Long-long-long String!\n")); либо через глобальную или локальную статическую переменную: char TestFlashStr[] PROGMEM = "Test String.\n"; SendString (TestFlashStr); Разумеется с последующим использованием pgm_read_byte ();. Но всё это константы. А как мне передать переменную? Например результат работы функции atoi ();. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 16 августа, 2011 Опубликовано 16 августа, 2011 (изменено) · Жалоба 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); Изменено 16 августа, 2011 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 16 августа, 2011 Опубликовано 16 августа, 2011 · Жалоба Я бы так делал Помолчу, но об одном все-же не удержусь спросить - зачем в данном случае узор ввиде do{ .....}while(0); :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 16 августа, 2011 Опубликовано 16 августа, 2011 · Жалоба Наверное к тому же, как возврат из функции send_block(char *data, size_t size) указателя на инвалидную ячейку памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буян 0 16 августа, 2011 Опубликовано 16 августа, 2011 · Жалоба Помолчу, но об одном все-же не удержусь спросить - зачем в данном случае узор ввиде do{ .....}while(0); :) Нормальный общеизвестный приём. Чтобы ограничить видимость переменной фигурными скобками "липового" while. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 16 августа, 2011 Опубликовано 16 августа, 2011 · Жалоба зачем в данном случае узор ввиде do{ .....}while(0); :) Под руку подвернулся способ объявить локальную переменную. Наверное к тому же, как возврат из функции send_block(char *data, size_t size) указателя на инвалидную ячейку памяти. Кому он мешает в данном сферическом случае? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 16 августа, 2011 Опубликовано 16 августа, 2011 · Жалоба Интересная позиция. Городить do {} while(0) для объявления локальной переменной (видимо для какой-то глубинной оптимизации) - это здорово, а тратить время на запихивание в регистр/ы никчемного указателя - это "не мешающие" мелочи жизни. А кто мешает без изголизмов: { int result = atoi("6231"); send_block((char *)&result, sizeof(result)); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zlumd 0 17 августа, 2011 Опубликовано 17 августа, 2011 · Жалоба Нормальный общеизвестный приём. Чтобы ограничить видимость переменной фигурными скобками "липового" while. Чтобы ограничить видимость переменной достаточно написать {}. while для этого не требуется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 17 августа, 2011 Опубликовано 17 августа, 2011 · Жалоба Наверное к тому же, как возврат из функции 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 17 августа, 2011 Опубликовано 17 августа, 2011 · Жалоба Нормальный общеизвестный приём. Чтобы ограничить видимость переменной фигурными скобками "липового" while. Этот прием используеся для других целей, например чтобы не выполнять последующие условия при выполнении первых: do { if(А) { /* действие для А */ break; } if(Б) { /* действие для Б */ break; } if(В) { /* действие для В */ break; } } while (0); Это придумали goto-ненавистники, они считают что это уродство лучше чем goto. А чтобы ограничить видимость переменной достаточно просто ограничить ее фигурными скобками. Никто не запрещает ставить их в любом месте программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 20 августа, 2011 Опубликовано 20 августа, 2011 (изменено) · Жалоба Помолчу, но об одном все-же не удержусь спросить - зачем в данном случае узор ввиде do{ .....}while(0); :) ответ тут: http://ru.w3support.net/index.php?db=so&id=1067226 Анатолий. Изменено 20 августа, 2011 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 20 августа, 2011 Опубликовано 20 августа, 2011 · Жалоба ответ тут: http://ru.w3support.net/index.php?db=so&id=1067226 Для особо непонятливых слова "в данном случае" в моем вопросе были выделены жирным шрифтом. Если я выделю их, например, большими красными буквами, Вы сможете дать разумный ответ на вопрос? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 20 августа, 2011 Опубликовано 20 августа, 2011 · Жалоба Для особо непонятливых слова "в данном случае" в моем вопросе были выделены жирным шрифтом. Если я выделю их, например, большими красными буквами, Вы сможете дать разумный ответ на вопрос? Если Ваш вопрос звучит зачем оборачивать в .do{ .....}while(0); (c точкой с запитой), то пусть за свой код отвечает автор. Ссылку я привел для него чтобы он руководствовался знаниями, а не поговоркой "Слышал звон, да не знаю где он.'. Когда я пишу макрос то хочу чтобы он работал всегда а не только "в данном случае", и поэтому всегда оборачиваю мнотострочный макрос в .do{ .....}while(0) (без точки с запятой). Анатолий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 20 августа, 2011 Опубликовано 20 августа, 2011 · Жалоба Для особо непонятливых слова "в данном случае" в моем вопросе были выделены жирным шрифтом. Если я выделю их, например, большими красными буквами, Вы сможете дать разумный ответ на вопрос? Повторяю еще раз. Под руку подвернулся способ объявить локальную переменную. А вообще, блоки "от фонаря" лично я не люблю, т.к. для меня они понижают читабельность кода. Думаю, что не я один такой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться