функция, возвращающая структуру?
- Войдите на сайт для отправки комментариев
Вс, 24/02/2013 - 15:07
Собственно, сабж.
Нужна фукнция, которая возвращала бы структуру.
Пример (описание структуры):
typedef struct{ int SensorID; // идентификатор датчика int ParamID; // идентификатор параметра float ParamValue; // значение параметра } Message;
Попробовал так:
Message myFun() { Message answer; ... return answer; }
В результате ошибка:
'Message' does not name a type
Или я слишком много хочу?
придумал "костыль":
1. Объявить глобальную переменную типа Message
2. В функции присваивать значение глобальной переменной типа Message
3. Функцию сделать с булевым результатом (0 - "не срослось", 1 - "все ок").
4. После вызова функции, если она вернула 1 - обрабатывать значения глобальной переменной.
Может, есть более изящное решение?
Более правильно было бы передавать в функцию ссылку на структуру, в которой нужно менять данные.
Именно так, передавать указатель на структуру, типа boolean foo( struct_type *pp_struct ) Возвращать указатель на структуру - это сложнее и больше проблем, вот пример:
UPD: Добавил пример. Писал навскидку, могут быть нестыковки, но принцип, примерно такой.
С Arduino познакомился с полгода назад. А недавно столкнулся с аналогичной задачей, решил ее так:
Очень хотелось бы увидеть комментарии от более продвинутых спецов.
В Вашем коде в строке d = fs() будет копирование локальной структуры, описанной в fs (struct Msg temp) во внешнюю структуру d. Потому, если нужно возвращать что то большее, чем простой тип (int, byte, double и т.п.), правильней передавать указатель на эти данные (на крайний случай - ссылочный тип, но это не рекомендуется в разной литературе) и заполнять эту структуру внутри функции. Ваш вариант будет работать, но памяти он пожрет на одну структуру больше, чем нужно, а зачем, в Ардуине и так памяти кот наплакал.
С т.з. "правильности", в функцию check_result нужно также передавать указатель на структуру, тогда не потребуется глобальная структура d.
Еще, обычно не рекомендуется использовать глобальные переменные, но для Ардуины это менее критично.
Так, ради прикола, не всё оптимально, зато есть оба варианта передачи структуры в виде параметра:
Спасибо.
Я пока плохо разобрался с указателями. Поясните пожалуйста, а использование функции передающей структуру всегда занимает память, или только на время выполнения этой функции?
Функцию check_result() я использовал только для проверки работоспособности, да, надо было написать про это в коментарии - упустил :-)
Не совсем понял вопрос, отвечу как понял.
Каждая переменная живет ровно в своем "пространстве и времени" (scope). Можно написать, например, так:
здесь l_msg1 "живет" только в строках 05-08, а l_msg2 - только в 08-10. Здесь scope определяется фигурными скобками. Т.е. l_msg1 в 08-10 строках уже не существует.
Пример очень надуманный, просто продемонстрировать область видимости переменных.
Любую структуру, чтобы заполнить - нужно создать (выделить под неё место), иначе заполнять будет нечего, а когда она уже не нужна, можно её удалить/освободить.
UPD: соответственно, локальные переменные в функциях (если они не static), живут ровно на время выполнения этой функции.
Да, ответ более полный чем вопрос.
"Чтобы задать правильный вопрос нужно знать бОльшую часть ответа"
Вы понятно объяснили, спасибо.