|
|
  |
Передача параметров в функцию., AVR-GCC/ATMega2560 |
|
|
|
Aug 16 2011, 13:22
|
Группа: Новичок
Сообщений: 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 ();.
|
|
|
|
|
Aug 16 2011, 14:50
|
;
     
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 16 2011, 18:11
|
Участник

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

|
Цитата(zltigo @ Aug 16 2011, 19:06)  Помолчу, но об одном все-же не удержусь спросить - зачем в данном случае узор ввиде do{ .....}while(0);  Нормальный общеизвестный приём. Чтобы ограничить видимость переменной фигурными скобками "липового" while.
|
|
|
|
|
Aug 16 2011, 18:18
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(zltigo @ Aug 16 2011, 19:06)  зачем в данном случае узор ввиде do{ .....}while(0);  Под руку подвернулся способ объявить локальную переменную. Цитата(sergeeff @ Aug 16 2011, 19:11)  Наверное к тому же, как возврат из функции send_block(char *data, size_t size) указателя на инвалидную ячейку памяти. Кому он мешает в данном сферическом случае?
|
|
|
|
|
Aug 16 2011, 19:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Интересная позиция. Городить do {} while(0) для объявления локальной переменной (видимо для какой-то глубинной оптимизации) - это здорово, а тратить время на запихивание в регистр/ы никчемного указателя - это "не мешающие" мелочи жизни. А кто мешает без изголизмов: Код { int result = atoi("6231"); send_block((char *)&result, sizeof(result)); }
|
|
|
|
|
Aug 17 2011, 02:49
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 12-04-05
Из: Новосибирск
Пользователь №: 4 057

|
Цитата(Юрий_СВ @ Aug 17 2011, 01:11)  Нормальный общеизвестный приём. Чтобы ограничить видимость переменной фигурными скобками "липового" while. Чтобы ограничить видимость переменной достаточно написать {}. while для этого не требуется.
|
|
|
|
|
Aug 17 2011, 03:11
|

фанат дивана
     
Группа: Свой
Сообщений: 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; }
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 17 2011, 09:50
|

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

|
Цитата(Юрий_СВ @ Aug 16 2011, 22:11)  Нормальный общеизвестный приём. Чтобы ограничить видимость переменной фигурными скобками "липового" while. Этот прием используеся для других целей, например чтобы не выполнять последующие условия при выполнении первых: Код do { if(А) { /* действие для А */ break; } if(Б) { /* действие для Б */ break; } if(В) { /* действие для В */ break; } } while (0); Это придумали goto-ненавистники, они считают что это уродство лучше чем goto. А чтобы ограничить видимость переменной достаточно просто ограничить ее фигурными скобками. Никто не запрещает ставить их в любом месте программы.
|
|
|
|
|
Aug 20 2011, 12:02
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(zltigo @ Aug 16 2011, 20:06)  Помолчу, но об одном все-же не удержусь спросить - зачем в данном случае узор ввиде do{ .....}while(0);  ответ тут: http://ru.w3support.net/index.php?db=so&id=1067226Анатолий.
Сообщение отредактировал aesok - Aug 20 2011, 12:03
|
|
|
|
|
Aug 20 2011, 13:12
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(zltigo @ Aug 20 2011, 16:10)  Для особо непонятливых слова "в данном случае" в моем вопросе были выделены жирным шрифтом. Если я выделю их, например, большими красными буквами, Вы сможете дать разумный ответ на вопрос? Если Ваш вопрос звучит зачем оборачивать в .do{ .....}while(0); (c точкой с запитой), то пусть за свой код отвечает автор. Ссылку я привел для него чтобы он руководствовался знаниями, а не поговоркой "Слышал звон, да не знаю где он.'. Когда я пишу макрос то хочу чтобы он работал всегда а не только " в данном случае", и поэтому всегда оборачиваю мнотострочный макрос в .do{ .....}while(0) (без точки с запятой). Анатолий.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|