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)
Ответ на: комментарий от Dr64h

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hateyoufeel ★★★★★
() автор топика

Что скажут эксперты в программировании на 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
()
Ответ на: комментарий от 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 ★★★
()
Ответ на: комментарий от 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)