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

 
 
> (Не)доработки языков программирования, которые хотели ли бы вы
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
сообщение May 21 2018, 17:32
Сообщение #2


.
******

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



Продолжаем фантазировать.
Надо что-то вроде инкомплит-тайп-каст'а. Чтобы сделать "принудительное" чтение переменной типа result = *(volatile *)&var; которая объявлена конечно же неволатильной. Скажете: сделай сразу переменную волатильной. А я отвечу: хочу массив неволатильных переменных, а первый элемент волатильный))) Ну и для всяческих приблуд pack/align/const.

Хотя инкомплит неудачное название. Лучше что-то вроде "атрибут-тайп-каст". Понятно, что что-то похожее можно сделать через стандартный тайп-каст, но хочется чтобы это работало без явного указания ширины переменной, вобщем лишней инфы. И из этой же оперы, хотелось делать тайп-каст (signed) или (unsigned). Это уже инкомплит-тип.

Сообщение отредактировал GetSmart - May 21 2018, 19:42


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 22 2018, 03:16
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



1. Было-бы лучше, если бы в си, при объявлении инициализированного массива с явно указанной размерностью
int m[N] = {1, 2, 3};
компилятор выдавал бы ошибку компиляции если количество инициализаторов не равно N.
Это очень полезно для создания связанных списков: define_значение/значение_константы.
2. Было бы очень полезно, если бы в константных выражениях можно было смешивать строки и значения:
enum {z1 = 5};
char const t[] = "string" z1 " - " (z1+2)*9;
3. Было бы классно если бы строковые константы можно было задавать не только в форме ASCIIZ (завершающийся нулём набор символов), но и в виде:
длина_строки "строка" (без 0 в конце). Хотя это решается автоматически при выполнении пункта 2.
4. Полезно было бы в stdlib в обязательном порядке внести прототип функции _Printf(void *(*)(void *), void *, char *, ...) - т.е. функцию из семейства printf...() передающую поток выводимых символов не на stdout (printf()) или в память (sprintf()), а в callback-функцию (первый аргумент _Printf()).
5. Было бы очень полезно наличие в языке возможностей задания списков define-ов (или enum) с уникальными значениями. Т.е. чтобы на:
enum {V_1 = 11, V_2 = 12, V_3 = 13, V_4 = 11, ...};
вылетало на ошибке компиляции типа: "V_4 - duplicate value".
Часто приходится задавать или списки define ног контроллера или каналов DMA, портов и пр. ресурсов, в которых каждый элемент списка должен иметь уникальное значение, не совпадающее с другими. При каждом редактировании очень неудобно каждый раз перепроверять весь список на наличие конфликтов, особенно если значения справа от "=" - это не литеральные константы, а выражения.
Приходится выкручиваться через проверяющие макросы.
Go to the top of the page
 
+Quote Post
Forger
сообщение May 22 2018, 06:57
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(jcxz @ May 22 2018, 06:16) *
1. Было-бы лучше, если бы в си, при объявлении инициализированного массива с явно указанной размерностью
int m[N] = {1, 2, 3};компилятор выдавал бы ошибку компиляции если количество инициализаторов не равно N.

Дык, он и так ругается, но лишь в одном случае - число инициализаторов больше размерности массива.
Увы, не ругается, если меньше. Просто "забивает" недостающие нулями. Это действительно неудобно.

Цитата
2. Было бы очень полезно, если бы в константных выражениях можно было смешивать строки и значения:

В голом виде (без STL и типа того), подобная затея - это рассадник опасных и довольно коварных ошибок на абсолютно ровном месте:
как минимум нужно контролировать размерности типов данных на разных платформах, в т. ч. "банальный" char.
Вангую головную боль, в принципе, на ровном месте.
К тому же такое "оружие" опасно отдавать в руки новичками.

Цитата
3. Было бы классно если бы строковые константы можно было задавать не только в форме ASCIIZ (завершающийся нулём набор символов), но и в виде:
длина_строки "строка" (без 0 в конце).

Код
const char t1[] = "012";
const char t2[3] = { '0', '1', '2' };

t1 будет иметь длину 4 байта, а t2 - 3 байта.
Определить длину t1 можно лишь найдя ноль в конце, у t2 размер указан явно. Все логично.

Но, если убрать ноль у t1, сделав его длину 3 байта, то как в коде понять, что он имеет размер в 3 байта?
Как отличить его с "классической" строкой в 4 байта?
Путаница на абсолютно ровном месте. Имхо, опасная блажь!

Цитата
4. Полезно было бы в stdlib в обязательном порядке внести прототип функции _Printf(void *(*)(void *), void *, char *, ...) - т.е. функцию из семейства printf...() передающую поток выводимых символов не на stdout (printf()) или в память (sprintf()), а в callback-функцию (первый аргумент _Printf()).

Это легко делается и сейчас: достаточно лишь "перегрузить" встроенную функцию "putc" своей собственной реализацией, игнорируя второй параметр FILE *.
Вот ее прототип: int putc(int ch, FILE *stream);
В этом случае при сборке проекта линкер "возьмет" реализацию putc из вашего кода, а не штатную из библиотеки stdio.


Цитата
5. Было бы очень полезно наличие в языке возможностей задания списков define-ов (или enum) с уникальными значениями. Т.е. чтобы на:
enum {V_1 = 11, V_2 = 12, V_3 = 13, V_4 = 11, ...};
вылетало на ошибке компиляции типа: "V_4 - duplicate value".

Очень спорная потребность: могут начаться проблемы как минимум со сторонним кодом, где дублированные значения могут быть созданы намеренно.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 22 2018, 08:15
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Forger @ May 22 2018, 09:57) *
Дык, он и так ругается, но лишь в одном случае - число инициализаторов больше размерности массива.

Я писал, что хотелось бы ошибку при не равно, а не только при больше. Что будет при меньше я прекрасно знаю, именно поэтому и написал такой пункт.

Цитата(Forger @ May 22 2018, 09:57) *
В голом виде (без STL и типа того), подобная затея - это рассадник опасных и довольно коварных ошибок на абсолютно ровном месте:

В чём именно опасность? Не понял. wacko.gif
Да, программировать нужно уметь и язык знать - это вроде не должно вызывать сомнений.
И в ассемблерах такая возможность часто имеется.

Цитата(Forger @ May 22 2018, 09:57) *
Но, если убрать ноль у t1, сделав его длину 3 байта, то как в коде понять, что он имеет размер в 3 байта?
Как отличить его с "классической" строкой в 4 байта?

Прочитайте моё сообщение внимательнее прежде чем критиковать.
Я пишу, что хотелось бы не только "классические" строки (это называется обычно ASCIIZ), а и строки в формате длина,символы_без_0_в_конце.

Цитата(Forger @ May 22 2018, 09:57) *
Путаница на абсолютно ровном месте. Имхо, опасная блажь!

Теперь расскажите это создателям Паскаля и тем десяткам тысяч программистов кто его использует. laughing.gif
Если Вы не в состоянии понять для чего это нужно, это ещё не повод говорить "блажь".
Например: программа получает текстовый поток данных, который разбивает на лексемы (слова) заменяя строковые значения лексем их номерами из некоего словаря. Значит - в программе есть некий массив лексем, константный и возможно довольно большой.
Теперь объясните, пожалуйста, как эффективно (т.е. - быстро) организовать поиск лексем в таком массиве, если принять, что лексемы имеют сильно разные размеры и что для удобства читаемости (и редактирования) исходника лексемы очень желательно иметь в виде строк (а не в виде {'a','b',...}) и лексемы нельзя расположить в некоем удобном для поиска порядке, а порядок их расположения одна относительно другой определяется другими критериями (разбивка на логические группы, связь со значениями define-ов и т.п.) ???
Так вот: с байтом длины поиск в таком списке лексем будет идти гораздо быстрее чем со списком ASCIIZ-строк.

Цитата(Forger @ May 22 2018, 09:57) *
Это легко делается и сейчас: достаточно лишь "перегрузить" встроенную функцию "putc" своей собственной реализацией, игнорируя второй параметр FILE *.

Данный пункт скорее касается компиляторов для PC, потому что в тех компиляторах для МК, с коими я работал (IAR и в CCS) такая функция и так имеется (_Printf()).
А в компиляторах на PC часто нежелательно перегружать putc(), потому что она может быть нужна.

Цитата(Forger @ May 22 2018, 09:57) *
Очень спорная потребность: могут начаться проблемы как минимум со сторонним кодом, где дублированные значения могут быть созданы намеренно.

Внимание: я не пишу что нужно изменить работу enum, я пишу что хотелось бы такой механизм. А назваться он естественно должен не enum. Enum там приведён для примера списка, который хотелось бы переделать по другому.

Цитата(ViKo @ May 22 2018, 10:42) *
Не согласен. Личный пример, как описываю альтернативные функции для портов STM32:

И что? Как это поможет от дубликатов? Вот у Вас AF_TIM1 и AF_TIM2 имеют одинаковые значения и при этом это нормально скомпилится. А не должно компилиться.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 22 2018, 08:25
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(jcxz @ May 22 2018, 11:15) *
И что? Как это поможет от дубликатов? Вот у Вас AF_TIM1 и AF_TIM2 имеют одинаковые значения и при этом это нормально скомпилится. А не должно компилиться.

Не согласен с вашим предложением, вот что. rolleyes.gif Потому что хочу иметь одинаковые значения в перечислении.
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
- - GetSmart   Ещё недоработку обнаружил. Volatile. Этот квалифи...   Jan 28 2012, 05:29
|- - _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
|- - sonycman   Цитата(GetSmart @ Jan 28 2012, 09:29) Ещё...   Jan 28 2012, 13:44
|- - Сергей Борщ   QUOTE (sonycman @ Jan 28 2012, 15:44) А е...   Jan 28 2012, 14:37
|- - GetSmart   Цитата(Сергей Борщ @ Jan 28 2012, 19:37) ...   Jan 29 2012, 02:42
|- - 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
|- - haker_fox   QUOTE (jcxz @ May 22 2018, 11:16) 1. Было...   May 22 2018, 05:31
|||- - 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 Текстовая версия Сейчас: 24th June 2025 - 01:35
Рейтинг@Mail.ru


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