LINUX.ORG.RU

Новое слово в программировании на C: штатное определение количества элементов в массиве

 ,


1

2

Привет, ЛОР!

Тихо и незаметно во всеми нами горячо любимый язык программирования Си решили наконец добавить новый оператор, возвращающий количество элементов в массиве. То есть, аналог вот такого:

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))

Название нового оператора пока не определено, и по ссылке ниже можно проголосовать за понравившийся вариант.

Ссылка на опрос: https://www.allcounted.com/s?did=qld5u66hixbtj&lang=en_US

Статья от автора предложения: https://thephd.dev/the-big-array-size-survey-for-c

Что скажут эксперты в программировании на C по поводу этого нововведения? Нужно ли оно? Станет ли язык Си ещё лучше?

★★★★★

Последнее исправление: hobbit (всего исправлений: 2)

Нужно ли оно?

Не нужно.

Станет ли язык Си ещё лучше?

Все что не делается — все к худшему.

urxvt ★★★★★
()
Ответ на: комментарий от EXL

Просто len надо.

«Тебе придётся сделать из питон из си, потому что тебе его больше не из чего делать!»(с)

AntonI ★★★★★
()
Ответ на: комментарий от a1ba

кое-кто тут просто врёт

Не будем показывать пальцем на наглую рыжую морду.

anonymous
()

Разные либы посмотрел там везде size и length используются по-разному, а вот count - в основном для подсчёта элементов.

Dr64h ★★★★
()
Ответ на: комментарий от Dr64h

ну так буквально

размер это размер в байтах

длина это длина равная количеству элементов

потому имхо правильное название должено быть что то от length

guyvernk
()
Последнее исправление: guyvernk (всего исправлений: 1)
Ответ на: комментарий от anonymous

это скорее си говно, так как не имеет готовых коллекций в стандартной библиотеке и приходится на каждый пук создавать массивы

guyvernk
()
Ответ на: комментарий от guyvernk

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

s-warus ★★★★
()
Ответ на: комментарий от guyvernk

В некоторых библиотеках size и length одинаковы и возвращают количество байт, в других они могут возвращать количество элементов, в некоторых они работают по-разному, count чаще используется для возврата количества элементов. Поэтому я думаю, что count - это наиболее однозначный выбор.

Dr64h ★★★★
()

$#array - в Perl удобно сделали, можно и тут в том же стиле сделать. Ну или что-то вроде _lena (length of array) :)

necromant ★★
()
Ответ на: комментарий от necromant

Ну или что-то вроде _lena (length of array) :)

Чтобы у меня каждый раз при виде этого оператора в голове крутилось «п?*?*а до колена»? Нет уж, увольте!

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от zx_gamer

Отправить ламеров @# $%^ вариант самый удачный. Те, кто это предлагают, точно программировать умеют?

Так ты же и не умеешь программировать. Не думал сам проследовать в @# $%^?

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от necromant

Ну только Лены ещё и не хватало в Си.

AlexVR ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Настолько не нужно, что этот макрос пишут во всех сишных проектах больше двух сотен строк.

anonymous
()
Ответ на: комментарий от hateyoufeel

Аргументированно. Естественно ничего больше мы не увидим. Ваше мнение очень важно для нас, оставайтесь на линии.

zx_gamer ★★★
()
Ответ на: комментарий от Nervous

Верной дорогой идёте, товарищи! Ленин жил, Ленин жив, Ленин будет жить!

anonymous
()
Ответ на: комментарий от zx_gamer

Он вообще за базар не отвечает и ответ не держит.

anonymous
()
Ответ на: комментарий от zx_gamer

А чо аргументировать-то ещё, когда ты сам написал прямо в этом треде:

Отправить ламеров @# $%^ вариант самый удачный. Те, кто это предлагают, точно программировать умеют?

При том, что этот макрос в любом сишном проекте есть. Как и offsetof и иже с ними.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от zx_gamer

Всё просто, покажи свой код.

(А мы скажем кто ты)

anonymous
()

Что скажут эксперты в программировании на C по поводу этого нововведения? Нужно ли оно? Станет ли язык Си ещё лучше?

Лучше бы добавили поддержку __attribute__ ((malloc)) из gcc. Синтаксический сахар не нужен.

Skullnet ★★★★★
()
Последнее исправление: Skullnet (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Это никак не мешает использовать len, просто в зависимости от варианта использования компилятор будет определять переменная это или оператор. Что бы не спутать с функций можно определить его использование без скобок, например int len = len array;

MOPKOBKA ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Это никак не мешает использовать len, просто в зависимости от варианта использования компилятор будет определять переменная это или оператор. Что бы не спутать с функций можно определить его использование без скобок, например int len = len array;

Мммм… превратить сишечный парсер в context-sensitive! Что может быть лучше? Ведь в C++ это так замечательно сработало!

UPD:

сорян, сишечный парсер уже давно context-sensitive. Хотя бы потому что выражение (a)*b можно парсить минимум двумя способами.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от Skullnet

Конечно нужен. Потому что (sizeof(x) / sizeof(x[0])) прекрасно работает на указателях, возвращая тебе полную срань. Чтобы написать нормальную версию, нужно использовать хтоническую магию атрибутов и обычно никто не заморачивается, получая дебильные баги на рефакторинге.

anonymous
()
Ответ на: комментарий от anonymous

Хотя прогресс, последний GCC таки научился это детектить. Ещё лет десять и шланг тоже научится :DDD

anonymous
()
Ответ на: комментарий от hateyoufeel

Вот именно. Он УЖЕ есть. А если его нет, то пишется он в 1 строчку. Давайте тогда добавим оператор, который будет определять, сколько пробелов встречается в статическом массиве char, в друг кому-то понадобиться? Что за бред-то? Зачем решать несуществующие проблемы?

zx_gamer ★★★
()
Ответ на: комментарий от zx_gamer

Что за бред-то? Зачем решать несуществующие проблемы?

Как указал анон выше, если ты случайно скармливаешь указатель вместо массива, такой макрос выдаёт полную херню. Что очень легко может возникнуть при рефакторинге.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от zx_gamer

Одним способом же? Разыменовать b, привести к типу a. Какой еще способ я не вижу?

Охлол… а ты точно Си знаешь?

#include <stdio.h>

int main(void) {
  int a = 1, b = 2;
  printf("%d\n", (a)*b);
}
hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Если sizeof(x) больше, чем sizeof(void*), то это точно массив. Массивов размером 1 элемент в реальной программе не бывает, на этот случай можно забить. Так что если очень хочется подстраховаться, можно assert или даже STATIC_ASSERT сделать.

zx_gamer ★★★
()
Ответ на: комментарий от zx_gamer

Если sizeof(x) больше, чем sizeof(void*), то это точно массив.

Во-первых, нет. Шланг вот умеет инты до мегабайта размером.

Во-вторых, а если меньше? char arr[] = "penis" будет меньше размером чем void*, например, но там аж шесть элементов.

А, ну да, два варианта.

Ага. Поэтому, как я уже выше утверждал, сишечки ты не знаешь.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от zx_gamer

А почему тогда «уже давно context-sensitive»? Так всегда, даже в K&R было.

Было. Но typedef был не всегда, и без него сишечка (после препроцессора) без проблем парсится context-free парсером.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Во-первых, нет. Шланг вот умеет инты до мегабайта размером.

Это не Си, это какой-то другой язык программирования, ничего общего с Си не имеющий.

Во-вторых, а если меньше? char arr[] = «penis» будет меньше размером чем void*, например, но там аж шесть элементов.

Согласен, но реальных массивов размером меньше размера указателя почти не бывает. На большинстве платформ, это 2 int. Вряд ли кому-то потребуется определять размер такого массива или даже создавать его.

zx_gamer ★★★
()
Ответ на: комментарий от hateyoufeel

Как это не всегда? Он тоже с K&R был. C 1978 года.

zx_gamer ★★★
()
Ответ на: комментарий от zx_gamer

Это не Си, это какой-то другой язык программирования, ничего общего с Си не имеющий.

Это часть стандарта языка Си. Можешь в ISO себе бумажную копию заказать за 100 баксов.

реальных массивов размером меньше размера указателя почти не бывает

Мозгов в твоей черепушке почти не бывает, только зияющие пустоты. В любом сишной проге вагон строк до 7 символов длиной. Натрави strings на любой бинарник и сам оцени.

Вряд ли кому-то потребуется определять размер такого массива или даже создавать его.

Вряд ли ты умеешь программировать или когда-либо это делал.

Как это не всегда? Он тоже с K&R был. C 1978 года.

Ага. А язык Си появился в 1972.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 2)
Ответ на: комментарий от hateyoufeel

Это часть стандарта языка Си. Можешь в ISO себе бумажную копию заказать за 100 баксов.

Дорогая какая-то туалетная бумага.

В любом сишной проге вагон строк до 7 символов длиной. Натрави strings на любой бинарник и сам оцени.

И у тебя есть желание измерить размер этой строки с помощью макроса? А что ты скажешь о строках, объявленных как const char* string = «string»;? Они вообще не массивы.

Ага. А язык Си появился в 1972.

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

zx_gamer ★★★
()
Ответ на: комментарий от zx_gamer

Это часть стандарта языка Си. Можешь в ISO себе бумажную копию заказать за 100 баксов.

Дорогая какая-то туалетная бумага.

Этой бумагой руководствуются авторы компиляторов. Возможно, в твоём манямирке существует какой-то особенный язык Си, но это явно не тот язык, на котором пишут софт. Когда мы говорим про язык Си здесь, мы имеем ввиду его в том виде, в котором он описан в стандарте и реализован в компиляторах.

В любом сишной проге вагон строк до 7 символов длиной. Натрави strings на любой бинарник и сам оцени.

И у тебя есть желание измерить размер этой строки с помощью макроса?

Да.

А что ты скажешь о строках, объявленных как const char* string = «string»;? Они вообще не массивы.

Вот именно. А макрос (sizeof(x) / sizeof(x[0])) скомпилируется и будет работать в том числе на них, но выдаст полную херню как результат. Так быть не должно.

Ага. А язык Си появился в 1972.

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

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

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.