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

 
 
> Век живи, век учись..., функции в CodeVision не позволяют возвращать структуры
zhevak
сообщение Nov 17 2007, 15:00
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



ну, или скорее это удар в поддых...

Ситуация такая. Пишу крупный прокт на CodeWizardAVR V1.25.3 Standard для mega2561.

Почти ООП. Почти самопальная ОСь. Сообщения, очереди, синхронизация... Проект разрастается быстро. Сегодня пришел к пониманию того, что сообщения нужно сделать не ввиде простох чисел

Код
typedef BYTE MSG;


, а как в виде структур

Код
typedef struct
{
  BYTE code;
  WORD param;
} MSG;



Предвижу Ваши соображения по поводу неизвестных BYTE и WORD. Где-то в хэдерных файлах у меня есть определение
Код
typedef unsigned char BYTE;
typedef unsigned int WORD;

так что все здесь срастается и работает.

Переделываю исходники на новый лад и ... получаю удар граблями со стороны CodeVision.
Угадайте с трех раз, откуда?

Подсказка
Цитата
Error: ... function must return a pointer to structure


раньше было красиво

msg = GetMessage();

Сейчас это уже не канает. Даже передать указатель на структуру, как это просит уважаемый CV, нельзя. Ну, не в том смысле что компилятор не пропустит, а в том, что на _какую_именно_структуру? -- Т.е. на ту, которая определяется в функции, -- нельзя. Ибо структура прекратит свое существоание в момент выхода из функции. Указатель невалиден. Значит остается, единственное решение -- наоборот, передавать указатель в функцию. Как-то это все не по-людски... sad.gif

Я уже было усомнился в своих знаниях языка (1) по передаче структур из функций, а потом в самих компиляторах для микроконтроллеров. Но нет! Ни старый добрый Borland Turbo-C 2.0, ни IAR таких ограничений не налагают.

Знаит, это есть причуда CV. Читаем в хэлпах КоудВижина

Цитата
The old Kernighan & Ritchie style of writing function definitions is not supported.


и еще тут

Цитата
Because some AVR devices have a small amount of SRAM, in order to keep the size of the Data Stack small, it is recommended not to pass structures as function parameters and use pointers for this purpose.


Правда, про возврат структур тут прямо ничего не сказано. Но видимо, подрадумевается, что программер понимает, что если передавать структуру в функцию -- это вилы, то уж возврат из функции явно крах всей системы!

Народ, не наступайте на мои грабли smile.gif Больна-а...


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
WHALE
сообщение Nov 17 2007, 17:08
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



ну и при чем здесь CV?Если вам надо ООП,пространства имен и прочие прелести-это другое дело и С компилятор тут ни в чем не виновват.Тогда да,адназначна или IAR или WINAVR.

пока писал-вы добавили.Имхо,Паша Хайдук принял достаточно мудрое решение и в хэлпе обьяснил почему он решил не поддерживать в качестве возвращаемого параметра из фукцию структуру.
А представьте обратную ситуацию-все поддерживается и большая структура пихается в стек.В резуль-
тате выход за пределы стека и крах программы или абсолютно непредсказуемые глюки.
ИМХО,возврат структуры напрямую путем копирования ее в стек а не через указатель дурной тон.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 17 2007, 17:32
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(WHALE @ Nov 17 2007, 19:08) *
Паша Хайдук принял достаточно мудрое решение и в хэлпе обьяснил почему он решил не поддерживать в качестве возвращаемого параметра из фукцию структуру. А представьте обратную ситуацию-все поддерживается и большая структура пихается в стек.В результате выход за пределы стека и крах программы или абсолютно непредсказуемые глюки.
В маленькой тиньке мало памяти. В м128 ее уже 4К, и можно навешать внешней по самое нехочу. Это "мало"?

А вот когда все рушится, потому что горе-программист положил огромную структуру в стек - тут уж точно компилятор виноватым быть не может. Для начала - если использовать метод передачи указателя на структуру, то структуру, на которую передается уазатель тоже надо где-то размещать. Где? Создавать локально в вызывающей функции. На стеке. Ровно в том же самом месте стека, где она бы разместилась если бы возвращалась из функции. При возврате структуры из функции указатель на нее передается неявно через указатель стека - а мы вынуждены передавать его явно в одном из параметров. Очень "мудрое" решение.

Программист может точно также завести внутри функции локальный массив из 1000 элементов - и все навернется аналогично. И что, компилятор сразу станет плохим, что позволил массивы? Хорошо, запретитм массивы. Насоздаем локальных переменных - структур или просто много-много переменных встроенных типов. Сдуру можно и х.. сломать.


Цитата(zhevak @ Nov 17 2007, 19:24) *
и заказчик хотел бы видеть CV.
Сочувствую. Возможно пора начинать убеждать его, что WinAVR не сложнее, стоит дешевле (ноль), и не имеет тупиков. Тем более что реальный аргумент у вас есть.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- zhevak   Век живи, век учись...   Nov 17 2007, 15:00
- - Yason   Цитата(zhevak @ Nov 17 2007, 16:00) Значи...   Nov 17 2007, 15:16
- - Сергей Борщ   Цитата(zhevak @ Nov 17 2007, 17:00) ну, и...   Nov 17 2007, 15:27
|- - zhevak   Цитата(Yason @ Nov 17 2007, 20:16) Прошу ...   Nov 17 2007, 16:54
|- - VDG   ЦитатаРазница между МС и моим ГетМессэйджем в том,...   Nov 17 2007, 22:46
- - VDG   Я что-то не въезжаю. ЦитатаИбо структура прекратит...   Nov 17 2007, 16:08
|- - WHALE   Цитата(VDG @ Nov 17 2007, 19:08) Я что-то...   Nov 17 2007, 16:29
|- - zhevak   Цитата(VDG @ Nov 17 2007, 21:08) Я что-то...   Nov 17 2007, 18:03
|- - zhevak   Цитата(WHALE @ Nov 17 2007, 22:08) ну и п...   Nov 17 2007, 17:24
|- - ReAl   Цитата(WHALE @ Nov 17 2007, 19:08) почему...   Nov 17 2007, 21:35
- - SlavaG   Можно попробовать сделать так: Кодtypedef union {...   Nov 17 2007, 18:30
|- - zhevak   Цитата(SlavaG @ Nov 17 2007, 23:30) Можно...   Nov 17 2007, 19:21
- - vmp   Возврат структуры - довольно неудачное решение. Гд...   Nov 19 2007, 06:32
|- - dxp   Цитата(vmp @ Nov 19 2007, 12:32) Возврат ...   Nov 19 2007, 06:38
||- - vmp   Цитата(dxp @ Nov 19 2007, 09:38) Никакого...   Nov 19 2007, 08:03
||- - Непомнящий Евгений   Цитата(vmp @ Nov 19 2007, 11:03) Разве? ...   Nov 19 2007, 08:43
||- - zhevak   Цитата(vmp @ Nov 19 2007, 13:03) Итак, чт...   Nov 19 2007, 08:50
||- - dxp   Цитата(zhevak @ Nov 19 2007, 14:50) Я про...   Nov 19 2007, 09:17
||- - zhevak   Цитата(dxp @ Nov 19 2007, 14:17) А где ту...   Nov 19 2007, 09:39
||- - dxp   Цитата(zhevak @ Nov 19 2007, 15:39) Прозр...   Nov 19 2007, 10:06
||- - defunct   Цитата(zhevak @ Nov 19 2007, 12:39) Прозр...   Nov 19 2007, 10:49
|- - IgorKossak   Цитата(vmp @ Nov 19 2007, 08:32) Возврат ...   Nov 19 2007, 07:43
- - zhevak   я там где-то ранее обещал опубликовать результаты ...   Nov 21 2007, 20:18
- - VDG   12-ти %-ная разница в объёме сгенерировнного кода....   Nov 21 2007, 23:02


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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