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

Знающий
   
Группа: Свой
Сообщений: 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, нельзя. Ну, не в том смысле что компилятор не пропустит, а в том, что на _какую_именно_структуру? -- Т.е. на ту, которая определяется в функции, -- нельзя. Ибо структура прекратит свое существоание в момент выхода из функции. Указатель невалиден. Значит остается, единственное решение -- наоборот, передавать указатель в функцию. Как-то это все не по-людски...  Я уже было усомнился в своих знаниях языка (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. Правда, про возврат структур тут прямо ничего не сказано. Но видимо, подрадумевается, что программер понимает, что если передавать структуру в функцию -- это вилы, то уж возврат из функции явно крах всей системы! Народ, не наступайте на мои грабли  Больна-а...
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
 |
Ответов
|
Nov 17 2007, 15:27
|

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

|
Цитата(zhevak @ Nov 17 2007, 17:00)  ну, или скорее это удар в поддых...
Ситуация такая. Пишу крупный прокт на CodeWizardAVR V1.25.3 Standard для mega2561. Поздравляем! Вы прошли CV до конца  Пора менять компилятор. И лучше это сделать сейчас, пока проект только разрастается, а не "разросся". Ибо это не единтственный тупик в CV. Можно рекомендовать IAR и WinAVR. Цитата(zhevak @ Nov 17 2007, 17:00)  Знаит, это есть причуда CV. Читаем в хэлпах КоудВижина Цитата The old Kernighan & Ritchie style of writing function definitions is not supported. Это не то. Это в первом издании K&R был вариант определения функций void func() int a, int b { } или что-то очень похожее вместо void func (int a, int b ) { }.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 17 2007, 16:54
|

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

|
Цитата(Yason @ Nov 17 2007, 20:16)  Прошу прощения, что лезу с советами не в свой огород, но чем Вам не нравится передавать указатель на структуру как параметр функции? Думаю, опыт microsoft в разработке софта оспаривать никто не будет, но они делают именно так. Код BOOL GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax );
lpMsg [out] Pointer to an MSG structure that receives message information from the thread's message queue. (остальное здесь неважно) Не надо прость прощения, все нормально. Ну это как яблоки -- "ну почему вам не нравятся зеленые яблоки?". Не нравится потому, что придется сейчас переделывать еще и вызовы функций (PutMessage, GetMessage, может еще какие) и далее преретрехать проект. Ну, нравится - не нравится, а прийдется... Разница между МС и моим ГетМессэйджем в том, что я не обрабатываю сообщений об окончании работы приложения, и следовательно, мне не нужно возвращать BOOL. У меня их просто как таковых нет. Зачем, собственно? Т.е. это как раз тот момент, чем отличается программы для микроконтроллеров от программ для компов. Цитата(Сергей Борщ @ Nov 17 2007, 20:27)  Поздравляем! Вы прошли CV до конца  Пора менять компилятор. И лучше это сделать сейчас, пока проект только разрастается, а не "разросся". Спасибо. Я тоже склоняюсь этой мысли... Давно было пора. А оно вот когда выстрелило. В самый не подходящий момент. Цитата Это не то. Это в первом издании K&R был вариант определения функций void func() int a, int b { } или что-то очень похожее вместо void func (int a, int b ) { }. ах, да! Точно.  Цитата(WHALE @ Nov 17 2007, 21:29)  там-же,где и возвращаемые локальные переменные из фукции-в стеке.т.е не проходит return MSG; Но имхо,это не не причина отказываться от компилятора.сделайте вашу структуру MSG глобальной или работайте с ней динамически-создавйте-удаляйте в куче в планировщике и возвращайте через указатель-чуть проиграите в обьеме свободного озу,выиграете в размере стека. господин Хайдук вполне внятно обьяснил-озу в авр кот наплакал.и это ваша структура крохотная, а бывают и байт на 100 и больше-зачем ее всю в стек пихать. Глобальная структура? Ну, я не знаю... по моему перебор! Я итак огребаю сложности из-за отсутствия ни пространств имен и классов, так ту еще одна глобальная бестия появится. Нет, конечно, это можно сделать. Более того работать оно будет. Но каков будет код! И все это ради сохранеия религии CV? Динамическое выделение памяти тоже не метод. Сильно проиграю в скорости. Не говоря уже про фрагментацию памяти и прочие возможные проблемы, которые сейчас не видны. Нет, господа, разговор идет не о том, как мне сохранить проект в CV. При желании я и сам смогу обойти эти грабли. Проблема вынесена в название топика: речь о другом -- о фичах CV, которые не были видны по началу. И я думаю, что я не один такой, кто сначала обрадовался легкости CV и сориентировался на него, как на средство разработки. Цитата(WHALE @ Nov 17 2007, 21:29)  господин Хайдук вполне внятно обьяснил-озу в авр кот наплакал.и это ваша структура крохотная, а бывают и байт на 100 и больше-зачем ее всю в стек пихать. да-да, именно! Структура крохотная. С опломбом влезет в регистры, которые CV традиционно использует при возврате из функции. Нам ничего не мешает возвращать эту крохотную структуру из функции по значению, а не, наоборот, передавать в функцию указатель на нее (чтоб функция по указатель произвела присвоение нужным элементам структуры). Ничего, кроме самого компилятора. В этом-то и проблема.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Nov 17 2007, 22:46
|

Знающий
   
Группа: Участник
Сообщений: 845
Регистрация: 10-02-06
Пользователь №: 14 193

|
Цитата Разница между МС и моим ГетМессэйджем в том, что я не обрабатываю сообщений об окончании работы приложения, и следовательно, мне не нужно возвращать BOOL. У меня их просто как таковых нет. Зачем, собственно? Т.е. это как раз тот момент, чем отличается программы для микроконтроллеров от программ для компов. У меня например не отличаются. Я делаю окна в МК аналогично как в Win32. Т.е. мои окна также "закрываются". Когда Ваш код также разрастётся, то Вам эту функцию придётся также ввести. Лучше сейчас, чем потом опять переписывать уже второй раз. Цитата Функция же как таковой возврат не производит, она просто напрямую работает с переданным ей адресом структуры. Наверняка это возможно только в момент возврата. Цитата Если что не понятно, попробуйте посмотреть ассемблерный код. Хотя это звучит очень агрессивно с моей стороны, за что приношу свои извинения. Не агрессивно. В скомпиллированном коде CV я много копаюсь, и как он возвращает результат знаю, поэтому мне интересно как другие компиляторы возвращают объёмные данные.
--------------------
|
|
|
|
Сообщений в этой теме
zhevak Век живи, век учись... Nov 17 2007, 15:00 Yason Цитата(zhevak @ Nov 17 2007, 16:00) Значи... Nov 17 2007, 15:16 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 WHALE ну и при чем здесь CV?Если вам надо ООП,пространст... Nov 17 2007, 17:08 zhevak Цитата(WHALE @ Nov 17 2007, 22:08) ну и п... Nov 17 2007, 17:24 Сергей Борщ Цитата(WHALE @ Nov 17 2007, 19:08) Паша Х... Nov 17 2007, 17:32 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|