да
на нем норм бэк или как у линуксяши с плюсами, где костыль на костыле?
supabase
Бэк? Может быть ты имел в виду Бэг? Ну, структура данных такая... Или бык? Самец коровы? Бэк это спина, "парни, а есть спина на Си?" - не имеет смысла...
полагаю, что бек - сокращение бекенд
ну или сервер, да
Стикер
Конец спины? То есть жопа? "Есть жопа на С? " - подходит! Есть жопа, почти весь язык одна сплошная жопа! Массив передать в функции нельзя, из функции вернуть массив тоже нельзя, локальных функций нет, printf параметры не проверяет, да и вообще одно сплошное UB вокруг!
На любом языке можно сделать бэк
Видел на асм даже
1. Льзя (через указатель + размер/количество элементов) 2. Льзя (выделить из кучи и вернуть указатель) 3. Нормальные компиляторы проверяют вызов printf 4. Нам платят за избегание UB. Нормальный язык.
о, щас опять срач будет
нельзя нельзя САМА ФУНКЦИЯ не проверяет аааа, нууу! Вывод: Плохо знаешь язык!
Линуксяша, разлогинься
Так, си - это жопа, значит си++ это жопа и два кочегара. Массив передать в функции можно. Из функции тоже массив вернуть можно. Локальные функции для файла есть, локальные функции для скоупа других функций есть в расширениях. Любой уважающий себя компилятор проверяет параметры принтфа. А уб и в плюсах есть, выходит, плюсы это одно уб чуть поменьше, вложенное в другое уб побольше.
Ну что вы как маленькие нельзя передать массив функцию можно передать указатель на массив это не одно и то же
struct array { uint8_t values[32]; }; void func(struct array arg) { for (size_t i = 0; i < sizeof(arg); i++) { uint8_t byte = arg.values[i]; ... } }
Костылем попахивает. Хотя, можно ввести еще поле структуры, где содержится размер массива, что бы каждый итератор не вычислять этот размер. Ну и данные в массиве не испортятся.
Ооо, ну это ты зря, помнишь ведь, что такое массив? Верно, структура данных, обладающая тремя инвариантами - линейное целочисленное индексирование в заданном диапазоне по элементам определённого типа. А теперь думаем, чего же не хватает указателю - именно, интерфейса для проверки диапазона, а также размера. Смекаешь? Так можно ли передавать массив в функцию?)) P.S. вариант выше, к сожалению, не жизнеспособен, т.к. для каждого массива определённого типа и определённой длины требуется собственная структурка.
Just4lulz же. А вот struct buffer_t { uint8_t *array; size_t length; size_t capacity; }; у меня крутится в проде.
Вот тут более осмысленно. В первом примере массив был определеннлй длины. Тут же передается указатель и инфа о длине. В ядре линуха так тоже работает. Встречал такие констрцкции.
Это структура , не массив
Но "физически"-то массив передан в функцию. %)
вы чё там все такие умные, а чего тогда строем не ходите ? Я вам ПРО ЯЗЫК говорю, а не про уловки как его использовать. ВСЕ параметры в функции в С передаются ТОЛЬКО ПО ЗНАЧЕНИЮ. И возвращаются из функции в виде значения функции только по значению. Кроме массивов, которые ни передать в функцию, ни вернуть невозможно.
Вот только встречный вопрос - а на кой нужна возможность передачи массива по значению?
чтобы передавать массив в функцию и не объяснять глупым студентам ЧТО ТАК ДЕЛАТЬ НЕЛЬЗЯ
Вообще, какая проблема передать массив по значению ? И вернуть ? СТРУКТУРУ с массивом - можно. А сам массив - нельзя. Ну чё за бред ?
Ну ты же бред пишешь! Какая проблема? Ну наверное проблема в том, что никто не хочет копипастить тонну данных только ради того, чтобы передать их в функцию. Это было ещё в 72 году очевидной. Если вопрос в том, почему нельзя было сохранять инвариант размера при передаче в функцию, то дело всего лишь в унификации, т.к. гораздо удобнее написать функцию, которая работает с любым массивом, а не с массивом конкретной длины, к тому же, даже если такое может понадобиться, в си есть квалификатор статик для размера массива, который будет следить за корректность передаваемого массива в функцию (>=).
Что даст вывод sizeof(arg.values)?
Осталось, завести шарманку про рестрикт и план на день выполнен.
32 * sizeof(int)
У меня там uint8_t. Так что 32 байта.
А, ну да, не обратил внимания
Обсуждают сегодня