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

 
 
7 страниц V  « < 2 3 4 5 6 > »   
Reply to this topicStart new topic
> (Не)доработки языков программирования, которые хотели ли бы вы
GetSmart
сообщение Apr 13 2017, 16:08
Сообщение #46


.
******

Группа: Участник
Сообщений: 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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
iiv
сообщение Apr 29 2017, 15:19
Сообщение #47


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Цитата(SasaVitebsk @ Feb 23 2010, 01:12) *
Единственное, что я пользовал в Pascal, а в С этого нет - так это вложенные процедуры.


в GNU-C это есть где-то с 1999 года, ужасно удобно, так как пространство имен вспомогательных вложенных функций и вспомогательных переменных не засоряется, но в ISO стандарт так и не попало, посему GNU поддерживает это на общественных началах, и, как я понимаю, не на всех архитектурах.

Конечно можно возразить, что де пиши на С++, но там аналогичный код становится достаточно большим, поэтому если вам платят не за число строк, а за результат, то вложенные С-шные функции - крайне полезная конструкция.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Apr 30 2017, 08:29
Сообщение #48


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



bb-offtopic.gif
Цитата
что де пиши на С++, но там аналогичный код становится достаточно большим,
Нда, шел 2017год, а наш народ по прежнему рассказывал, как на с++ код становится достаточно большим..... Грустно sad.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
ar__systems
сообщение May 4 2017, 03:27
Сообщение #49


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();


Зачем мудрить-то?
Go to the top of the page
 
+Quote Post
Эдди
сообщение May 4 2017, 05:20
Сообщение #50


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
ar__systems
сообщение May 4 2017, 11:40
Сообщение #51


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



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

socket ы это библиотека а не язык....
Go to the top of the page
 
+Quote Post
Эдди
сообщение May 4 2017, 15:22
Сообщение #52


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Вообще-то, сокеты входят в stdlib — для работы с ними дополнительных библиотек линковать не надо.
Но сама по себе реализация как-то не очень… Скажем, если write в закрытый сокет вернет ошибку, то read вернет просто 0 — как будто бы данных нет! И select/poll с закрытым сокетом ошибку не дадут.
Go to the top of the page
 
+Quote Post
Grizzzly
сообщение May 4 2017, 17:55
Сообщение #53


Знающий
****

Группа: Свой
Сообщений: 565
Регистрация: 22-02-13
Пользователь №: 75 748



Цитата(Эдди @ May 4 2017, 18:22) *
Вообще-то, сокеты входят в stdlib — для работы с ними дополнительных библиотек линковать не надо.

Ну, дык, это всё равно же библиотека. Причем реализаций этой библиотеки довольно много.
Go to the top of the page
 
+Quote Post
Эдди
сообщение May 4 2017, 18:01
Сообщение #54


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Предлагаю не рассматривать всякие альтернативы. Обычный "стандартный" gcc и stdlib. Дома я еще на 4.9.3 сижу, на работе давно уже на 5.4.0 перешел.
Go to the top of the page
 
+Quote Post
Kane
сообщение May 5 2017, 14:32
Сообщение #55


Участник
*

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



Цитата(Эдди @ May 4 2017, 21:01) *
Предлагаю не рассматривать всякие альтернативы. Обычный "стандартный" gcc и stdlib.

Вы б с содержимым стандартов для начала ознакомились. Не входят сокеты в стандартную библиотеку С99/11. C++ я не знаю, но поиском по pdf С++2014 ничего похожего на сокеты тоже не нашел.
Go to the top of the page
 
+Quote Post
Guest_TSlicer_*
сообщение May 5 2017, 17:17
Сообщение #56





Guests






Цитата(Kane @ May 5 2017, 15:32) *
Вы бы с содержимым стандартов для начала ознакомились.

В горах - все по другому. Там звезды ближе и телескопы есть.
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение May 7 2017, 11:00
Сообщение #57


Местный
***

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



Цитата(Эдди @ May 4 2017, 18:22) *
Скажем, если write в закрытый сокет вернет ошибку, то read вернет просто 0 — как будто бы данных нет!

Ну не знаю, как у Вас, а у меня 0, полученный от read() для сокета однозначно идентифицирует, что он был закрыт с другой стороны.
Вот если удалённый хост упал - да, вы будете ждать некоторое время, пока стек решит, что связи больше не будет, но это решается, например, уровнем выше sm.gif

А вообще, вот очень хороший материал:
Снейдер Йон: Эффективное программирование TCP/IP.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 21 2018, 17:32
Сообщение #58


.
******

Группа: Участник
Сообщений: 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
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 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
haker_fox
сообщение May 22 2018, 05:31
Сообщение #60


Познающий...
******

Группа: Свой
Сообщений: 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)()))


--------------------
Выбор.
Go to the top of the page
 
+Quote Post

7 страниц V  « < 2 3 4 5 6 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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