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

 
 
> (Не)доработки языков программирования, которые хотели ли бы вы
GetSmart
сообщение Feb 22 2010, 12:13
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Почему не делают в ЯВУ возврат из функций несколько переменных?

Вроде бы несложно было бы объявить функцию типо так:
(int,int,char) funcname(char);
а потом аналогично использовать при вызове:
(a,b,c) = funcname('A');
причём даже в некоторых местах так:
(,,e) = funcname('A');
таким образом не используя часть переменных/регистров

То есть по сути ситуация аналогичная передаче параметров через регистры, когда (ну например в АРМ) первые 3 параметра передаются в регистрах. И возврат результата по логике строго аналогичен процессу передачи параметров, только не "в", а "из". Обычно возврат нескольких параметров делают через передачу ссылок, что в некоторой степени универсальнее, т.к. можно часть ссылок не использовать в зависимости от "нити" алгоритма. Однако, такой способ требует выделение места в стеке или в другой раме под ссылочные переменные. Что на современном уровне компиляторостроения не есть гуд. Хранение и передача (возврат) переменных в регистрах - предпочтительнее.

Сообщение отредактировал Omen_13 - Feb 22 2010, 14:14
Причина редактирования: Тема переименованна по просьбе автора


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GetSmart
сообщение Jan 28 2012, 05:29
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Ещё недоработку обнаружил. Volatile.

Этот квалификатор действует глобально на всю прогу и заставляет компилятор не оптимизировать переменную. Используется обычно тогда, когда в разных тредах, равно как и в программе+прерывании используется переменная. Но. Когда в программе юзается эта переменная, то она конечно может измениться и оптимизировать её не надо. Но когда в прерывании она юзается, то там было бы оптимальным снимать этот квалификатор. Но вроде бы это не предусмотрено. (?)


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 28 2012, 13:44
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(GetSmart @ Jan 28 2012, 09:29) *
Ещё недоработку обнаружил. Volatile.

Этот квалификатор действует глобально на всю прогу и заставляет компилятор не оптимизировать переменную. Используется обычно тогда, когда в разных тредах, равно как и в программе+прерывании используется переменная. Но. Когда в программе юзается эта переменная, то она конечно может измениться и оптимизировать её не надо. Но когда в прерывании она юзается, то там было бы оптимальным снимать этот квалификатор. Но вроде бы это не предусмотрено. (?)

А если обработчики прерываний вынести в отдельный файл, там объявить необходимую переменную int val, а в другие файлы добавить эту переменную как extern volatile int val?
В результате обработчики прерываний будут работать с оптимизированной переменной, а вся остальная прога - с volatile.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 28 2012, 14:37
Сообщение #4


Гуру
******

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



QUOTE (sonycman @ Jan 28 2012, 15:44) *
А если обработчики прерываний вынести в отдельный файл,
Как-то слишком сложно. _Pasha правильно предложил - завести временную переменную (только не указатель, на Пашин пример будет справедливо ругаться, ибо указатель должен быть на volatile), когда надо считывать в эту переменную, проводить с ней вычисления и когда надо записывать обратно в volatile-переменную. Лишь только программист в состоянии определить, когда наступает этот момент "когда надо". Ни один компилятор угадать его не сможет.


--------------------
На любой вопрос даю любой ответ
"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
GetSmart
сообщение Jan 29 2012, 02:42
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Сергей Борщ @ Jan 28 2012, 19:37) *
Лишь только программист в состоянии определить, когда наступает этот момент "когда надо". Ни один компилятор угадать его не сможет.

Это почему?
Внутри прерывания переменную можно оптимизировать как угодно. Не важно, вложенное оно или нет и есть ли другие прерывания c таким же или меньшим приоритетом, юзающие эту переменную. В идеале лучше задавать (отменять volatile) каким-то квалификатором внутри какой-то зоны видимости, будь то обработчик или {}.

Вручную копировать volatile в простую переменную, которую потом юзать не есть хорошо. Т.к. переменная volatile, то она сразу будет скопирована куда-то и отнимать место там (рег/рама). В конце обработчика та же беда. С указателем (вариант Паши) чем-то лучше, чем-то хуже. Как именно, зависит от компилятора по части разных методов оптимизации указателей и значений переменных. Указатель придётся грубо приводить к обычной переменной, но и фиг с ним.

=================================

Ещё одну недоработку родил. Хотя, может есть вариант прямого обхода, а не через переменную.

Когда в выражении юзаются две или более volatile, то компилер выдаёт варнинг, что "доступ к volatile не определён (не обозначен?) в выражении". Не очень понятно, как он расчитывает чтобы я его обозначил. Но можно было бы например задать скобками. Бувквально так ggg = abc + (volvar1) + volvar2; Тогда уровень вложенности скобок для volatile будет задавать приоритет доступа. Чем больше скобок, тем раньше доступ. При равном количестве - варнинг, означающий что реализация вычисления на откуп компилятора.

У меня такая ситуация происходит при сравнении (вне прерывания) volatile переменной временнОй метки и значения таймера, когда прерывание может изменить значение этой временнОй метки. При этом обязательно временнУю метку нужно прочитать раньше значения таймера, если произойдёт наоборот, то временнАя метка может "обогнать" значение из таймера, что вери вери бэд. Щас сделано через врЕменную переменную. Но из-за этого компилятор её суёт в стек (ИАР MCS-51). Upd. Хотя вот тут щас уже не суёт, но это не принципиально.

Сообщение отредактировал GetSmart - Jan 29 2012, 08:37


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- GetSmart   (Не)доработки языков программирования   Feb 22 2010, 12:13
- - DpInRock   Оккам не одобряет.   Feb 22 2010, 12:25
|- - Моисей Самуилович   Цитата(DpInRock @ Feb 22 2010, 15:25) Окк...   May 22 2018, 18:19
- - Leka   Для софт-процессора с 1К "регистров" у м...   Feb 22 2010, 12:56
|- - CaPpuCcino   ну, всё зависит от того, о каких ЯВУ вы говорите. ...   Feb 22 2010, 13:25
- - GetSmart   Да, я говорю о Си к примеру. Паскаль аналогично. Д...   Feb 22 2010, 13:46
|- - CaPpuCcino   Цитата(GetSmart @ Feb 22 2010, 16:46) Ста...   Feb 22 2010, 14:40
- - Dog Pawlowa   Цитата(GetSmart @ Feb 22 2010, 16:13) Поч...   Feb 22 2010, 14:45
- - zltigo   Цитата(GetSmart @ Feb 22 2010, 15:13) Одн...   Feb 22 2010, 14:45
|- - GetSmart   Цитата(zltigo @ Feb 22 2010, 19:45) .. то...   Feb 22 2010, 15:02
|- - CaPpuCcino   Цитата(GetSmart @ Feb 22 2010, 18:02) Why...   Feb 22 2010, 15:28
|- - zltigo   Цитата(GetSmart @ Feb 22 2010, 18:02) Это...   Feb 22 2010, 16:48
|- - GetSmart   Цитата(zltigo @ Feb 22 2010, 21:48) 1. Ес...   Feb 22 2010, 17:47
|- - zltigo   Цитата(GetSmart @ Feb 22 2010, 20:47) Ещё...   Feb 22 2010, 18:46
|- - ReAl   Цитата(zltigo @ Feb 22 2010, 20:46) А уро...   Feb 22 2010, 22:37
- - Leka   "...доработки языков программирования, которы...   Feb 22 2010, 15:37
- - SasaVitebsk   Честно говоря, тоже не понимаю зачем это надо. Как...   Feb 22 2010, 20:12
|- - sasamy   Цитата(SasaVitebsk @ Feb 23 2010, 00:12) ...   Jan 28 2012, 21:27
|- - iiv   Цитата(SasaVitebsk @ Feb 23 2010, 01:12) ...   Apr 29 2017, 15:19
|- - Эдди   Цитата(iiv @ Apr 29 2017, 18:19) в GNU-C ...   May 4 2017, 05:20
|- - ar__systems   Цитата(Эдди @ May 4 2017, 00:20) В gcc5 э...   May 4 2017, 11:40
- - Xenia   Отчего бы не помечтать Тогда я и свою мечто озвуч...   Feb 22 2010, 21:02
- - vmp   Цитата(GetSmart @ Feb 22 2010, 15:13) Поч...   Feb 24 2010, 06:38
- - _Pasha   Я бы хотел, чтоб в сях(да и паскале тоже) наконец-...   Feb 24 2010, 07:22
- - sigmaN   Сэр, по-моему у вас возникают дурные мысли по прич...   Feb 24 2010, 07:32
- - _Pasha   В принципе, было бы на 100% эффективным введение с...   Feb 24 2010, 07:35
- - AlexandrY   LUA может возвращать переменные пачками. http://ww...   Feb 24 2010, 08:25
- - GetSmart   vmp, это то же самое как и передавать указатель на...   Feb 24 2010, 09:20
|- - dxp   Цитата(GetSmart @ Feb 24 2010, 15:20) vmp...   Feb 24 2010, 10:04
|- - _Pasha   Цитата(GetSmart @ Feb 24 2010, 12:20) Пер...   Feb 24 2010, 13:06
- - GetSmart   Структура - структурой. А я предлагаю "симмет...   Feb 24 2010, 15:04
|- - _Pasha   Цитата(GetSmart @ Jan 28 2012, 08:29) Но ...   Jan 28 2012, 09:00
||- - GetSmart   Цитата(_Pasha @ Jan 28 2012, 14:00) Кодvo...   Mar 6 2012, 05:49
|- - toweroff   Цитата(GetSmart @ Jan 28 2012, 09:29) Ещё...   Jan 28 2012, 13:36
|- - ReAl   Цитата(Сергей Борщ @ Jan 28 2012, 16:37) ...   Mar 7 2012, 06:58
|- - GetSmart   Цитата(ReAl @ Mar 7 2012, 11:58) А вообще...   Mar 7 2012, 07:17
- - vitan   Цитата(GetSmart @ Feb 22 2010, 16:13) Поч...   Jan 28 2012, 07:49
- - _Ivana   А мне бы хотелось вот какую доработку - чтобы напи...   Jan 29 2012, 10:03
- - _Pasha   Цитата(GetSmart @ Jan 29 2012, 05:42) Чем...   Jan 29 2012, 11:42
|- - GetSmart   Цитата(_Pasha @ Jan 29 2012, 16:42) Дык, ...   Jan 29 2012, 12:10
- - sigmaN   Я тут про прерывания подумал... В стандарте языка ...   Jan 30 2012, 01:34
- - Alex-sh   Добрый вечер. Я знаю что мой вопрос несколько не в...   Mar 6 2012, 19:16
- - ReAl   Не понял вопрос. Какая запись и где должна быть ну...   Mar 7 2012, 17:22
- - _Pasha   До кучи   Mar 9 2012, 07:46
|- - GetSmart   Цитата(_Pasha @ Mar 9 2012, 12:46) До куч...   Mar 9 2012, 11:23
- - GetSmart   Хотел красиво оптимизировать Си-код, выполняющий о...   Apr 13 2017, 16:08
|- - ar__systems   Цитата(GetSmart @ Apr 13 2017, 11:08) Хот...   May 4 2017, 03:27
- - sigmaN   Цитатачто де пиши на С++, но там аналогичный код с...   Apr 30 2017, 08:29
- - Эдди   Вообще-то, сокеты входят в stdlib — для работы с ...   May 4 2017, 15:22
|- - Grizzzly   Цитата(Эдди @ May 4 2017, 18:22) Вообще-т...   May 4 2017, 17:55
|- - RabidRabbit   Цитата(Эдди @ May 4 2017, 18:22) Скажем, ...   May 7 2017, 11:00
- - Эдди   Предлагаю не рассматривать всякие альтернативы. Об...   May 4 2017, 18:01
|- - Kane   Цитата(Эдди @ May 4 2017, 21:01) Предлага...   May 5 2017, 14:32
|- - TSlicer   Цитата(Kane @ May 5 2017, 15:32) Вы бы с ...   May 5 2017, 17:17
- - GetSmart   Продолжаем фантазировать. Надо что-то вроде инкомп...   May 21 2018, 17:32
|- - jcxz   1. Было-бы лучше, если бы в си, при объявлении ини...   May 22 2018, 03:16
|- - haker_fox   QUOTE (jcxz @ May 22 2018, 11:16) 1. Было...   May 22 2018, 05:31
|- - Forger   Цитата(jcxz @ May 22 2018, 06:16) 1. Было...   May 22 2018, 06:57
||- - jcxz   Цитата(Forger @ May 22 2018, 09:57) Дык, ...   May 22 2018, 08:15
||- - ViKo   Цитата(jcxz @ May 22 2018, 11:15) И что? ...   May 22 2018, 08:25
|||- - jcxz   Цитата(ViKo @ May 22 2018, 11:25) Не согл...   May 22 2018, 08:45
|||- - ViKo   Цитата(jcxz @ May 22 2018, 11:45) Блин...   May 22 2018, 09:03
||- - Forger   Цитата(jcxz @ May 22 2018, 11:15) Теперь ...   May 22 2018, 08:49
||- - Nixon   Цитата(Forger @ May 22 2018, 11:49) Поэто...   May 22 2018, 09:13
|||- - Forger   Цитата(Nixon @ May 22 2018, 12:13) Кодcon...   May 22 2018, 09:25
||- - jcxz   Цитата(Forger @ May 22 2018, 11:49) Это л...   May 22 2018, 14:20
||- - Forger   Цитата(jcxz @ May 22 2018, 17:20) Всё что...   May 22 2018, 14:41
||- - jcxz   Цитата(Forger @ May 22 2018, 17:41) Элеме...   May 22 2018, 15:11
||- - Forger   Цитата(jcxz @ May 22 2018, 18:11) Как Вы ...   May 22 2018, 16:00
|||- - jcxz   Цитата(Forger @ May 22 2018, 19:00) Учест...   May 22 2018, 16:35
|||- - Forger   Цитата(jcxz @ May 22 2018, 19:35) А прогр...   May 22 2018, 16:57
|||- - _pv   Цитата(jcxz @ May 22 2018, 22:35) Но лучш...   May 23 2018, 08:18
||- - _pv   Цитата(jcxz @ May 22 2018, 21:11) Эти сво...   May 22 2018, 16:08
||- - XVR   Цитата(jcxz @ May 22 2018, 18:11) наприме...   May 23 2018, 12:04
||- - jcxz   Цитата(XVR @ May 23 2018, 15:04) Это как ...   May 23 2018, 18:49
|- - ViKo   Цитата(jcxz @ May 22 2018, 06:16) 5. Было...   May 22 2018, 07:42
|- - k155la3   Цитата(jcxz @ May 22 2018, 06:16) 1. Было...   May 22 2018, 09:18
- - Nixon   Кодtemplate < int...Params > struct AAA { ...   May 22 2018, 10:07
|- - Forger   Цитата(Nixon @ May 22 2018, 13:07) добро ...   May 22 2018, 10:33
|- - haker_fox   QUOTE (Forger @ May 22 2018, 18:33) В дан...   May 22 2018, 13:00
|- - Forger   Цитата(haker_fox @ May 22 2018, 16:00) Мы...   May 22 2018, 13:47
|- - Nixon   Цитата(Forger @ May 22 2018, 16:47) Имхо,...   May 22 2018, 13:54
|- - Forger   Цитата(Nixon @ May 22 2018, 16:54) IAR AR...   May 22 2018, 14:05
- - haker_fox   QUOTE (Forger @ May 22 2018, 21:47) Анало...   May 23 2018, 00:33
- - Forger   Цитата(haker_fox @ May 23 2018, 03:33) Ед...   May 23 2018, 06:36
- - haker_fox   QUOTE (Forger @ May 23 2018, 14:36) Подав...   May 23 2018, 07:00
- - Forger   Цитата(haker_fox @ May 23 2018, 10:00) Я ...   May 23 2018, 07:57


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

 


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


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