|
|
  |
(Не)доработки языков программирования, которые хотели ли бы вы |
|
|
|
Apr 13 2017, 16:08
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Хотел красиво оптимизировать Си-код, выполняющий общие действия для сложносоставного условия-алгоритма, содержащего в себе вызов void-функций между несколькими булевыми выражениями внутри if-условия. Чтобы обходиться без goto или дублирования исполняемого выражения (тела) if. Код void foo1(int); ...
void foo2(void); ...
int main() { ..... if (expr1) goto do_foo2; foo1(a); if (expr2) { do_foo2: foo2(); } ..... } Получилось так Код { if (expr1 || (foo1(a), expr2)) { foo2(); } } Но понял, что разработчик неудачно выбрал оператор/символ для функции Comma. Удачнее было бы нагрузить двоеточие этой функцией. А запятая оставалась бы только разделителем множества элементов. С двоеточием появились бы новые плюшки. Например, внутри первого выражения в for в режиме C99 можно было бы создавать несколько разнотипных переменных. И некрасивое do {....} while(0) в дефайнах не понадобилось бы, т.к. двоеточием можно было бы "склеить" несколько независимых выражений/действий, выполняющихся строго вместе. И, если пофантазировать, то в режиме C2100 можно было бы создавать (локальные) переменные внутри многих мест, где пока это запрещено. Например внутри условных выражений if, while, прочих, с ограничением области видимости переменной только внутри границ ключевого слова (if, while,...). И ещё, касательно unions. Бросается в глаза удобство варианта, когда при описании членов union, массив, а так же список однотипных членов, разделённых запятой, делаются по логике создания структуры. То есть это будут члены/переменные, следующие в адресном пространстве друг за другом. И только после точки с запятой адрес следущего члена обнуляется.
Сообщение отредактировал GetSmart - Apr 13 2017, 21:25
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Apr 29 2017, 15:19
|
вопрошающий
    
Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436

|
Цитата(SasaVitebsk @ Feb 23 2010, 01:12)  Единственное, что я пользовал в Pascal, а в С этого нет - так это вложенные процедуры. в GNU-C это есть где-то с 1999 года, ужасно удобно, так как пространство имен вспомогательных вложенных функций и вспомогательных переменных не засоряется, но в ISO стандарт так и не попало, посему GNU поддерживает это на общественных началах, и, как я понимаю, не на всех архитектурах. Конечно можно возразить, что де пиши на С++, но там аналогичный код становится достаточно большим, поэтому если вам платят не за число строк, а за результат, то вложенные С-шные функции - крайне полезная конструкция.
|
|
|
|
|
May 4 2017, 03:27
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(GetSmart @ Apr 13 2017, 11:08)  Хотел красиво оптимизировать Си-код, Код if (expr1) goto do_foo2; foo1(a); if (expr2) { do_foo2: foo2(); } } Получилось так Код { if (expr1 || (foo1(a), expr2)) { foo2(); } } Нда, уж, афигеть, оптимизация. Вместо того, чтобы разработчиков корить, на свои художества бы лучше критически посмотрели. Код if ( ! expr1 ) foo1(); if ( expr1 || expr2 ) foo2(); Зачем мудрить-то?
|
|
|
|
|
May 4 2017, 05:20
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Цитата(iiv @ Apr 29 2017, 18:19)  в GNU-C это есть где-то с 1999 года В gcc5 это посчитали вредным, поэтому в опции компилятора теперь нужно добавлять -Wno-trampoline, иначе не соберется (я всегда указываю -Wall -Wextra, чтобы не было соблазна игнорировать предупреждения). А вот что мне не нравится, так это работа с сокетами! Ну никак не обойтись без таймаутов...
Сообщение отредактировал Эдди - May 4 2017, 05:21
|
|
|
|
|
May 4 2017, 11:40
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(Эдди @ May 4 2017, 00:20)  В gcc5 это посчитали вредным, поэтому в опции компилятора теперь нужно добавлять -Wno-trampoline, иначе не соберется (я всегда указываю -Wall -Wextra, чтобы не было соблазна игнорировать предупреждения). А вот что мне не нравится, так это работа с сокетами! Ну никак не обойтись без таймаутов... socket ы это библиотека а не язык....
|
|
|
|
|
May 5 2017, 14:32
|
Участник

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

|
Цитата(Эдди @ May 4 2017, 21:01)  Предлагаю не рассматривать всякие альтернативы. Обычный "стандартный" gcc и stdlib. Вы б с содержимым стандартов для начала ознакомились. Не входят сокеты в стандартную библиотеку С99/11. C++ я не знаю, но поиском по pdf С++2014 ничего похожего на сокеты тоже не нашел.
|
|
|
|
Guest_TSlicer_*
|
May 5 2017, 17:17
|
Guests

|
Цитата(Kane @ May 5 2017, 15:32)  Вы бы с содержимым стандартов для начала ознакомились. В горах - все по другому. Там звезды ближе и телескопы есть.
|
|
|
|
|
May 7 2017, 11:00
|

Местный
  
Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040

|
Цитата(Эдди @ May 4 2017, 18:22)  Скажем, если write в закрытый сокет вернет ошибку, то read вернет просто 0 — как будто бы данных нет! Ну не знаю, как у Вас, а у меня 0, полученный от read() для сокета однозначно идентифицирует, что он был закрыт с другой стороны. Вот если удалённый хост упал - да, вы будете ждать некоторое время, пока стек решит, что связи больше не будет, но это решается, например, уровнем выше  А вообще, вот очень хороший материал: Снейдер Йон: Эффективное программирование TCP/IP.
|
|
|
|
|
May 22 2018, 03:16
|
Гуру
     
Группа: Свой
Сообщений: 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, портов и пр. ресурсов, в которых каждый элемент списка должен иметь уникальное значение, не совпадающее с другими. При каждом редактировании очень неудобно каждый раз перепроверять весь список на наличие конфликтов, особенно если значения справа от "=" - это не литеральные константы, а выражения. Приходится выкручиваться через проверяющие макросы.
|
|
|
|
|
May 22 2018, 05:31
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (jcxz @ May 22 2018, 11:16)  1. Было-бы лучше, если бы в си, при объявлении инициализированного массива с явно указанной размерностью int m[N] = {1, 2, 3}; компилятор выдавал бы ошибку компиляции если количество инициализаторов не равно N. Да, либо сделать эту опцию управлемой ключом. QUOTE (jcxz @ May 22 2018, 11:16)  enum {V_1 = 11, V_2 = 12, V_3 = 13, V_4 = 11, ...}; вылетало на ошибке компиляции типа: "V_4 - duplicate value". И здесь согласен. Можно также ключом. Теперь вопрос, кому позвонить. чтобы добавили в IAR 8.22)()))
--------------------
Выбор.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|