Hint: C arrays are passed by reference

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Hint: C arrays are passed by reference

Сообщение Vadim » 04.04.2019 16:02:03

Дож писал(а):И нет: передать динамический массив не то же самое, что передать открытый массив.

Меня интересует только то, что видно снаружи. Во внутренности я не вдаюсь. А снаружи это выглядит одинаково.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Hint: C arrays are passed by reference

Сообщение Дож » 04.04.2019 16:11:47

O_o
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Hint: C arrays are passed by reference

Сообщение debi12345 » 05.04.2019 00:14:54

Vadim, вы в предыдущем же сообщении написали, что динамический массив никак не передать в процедуру,

А есть гарантия, что все элементы опенэрррэя при доступе в обход паскалевского менеджера памяти лежат в непрерывной области памяти -то есть пригодны для итерации указателя средствами "С"?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Hint: C arrays are passed by reference

Сообщение Дож » 05.04.2019 01:05:31

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

Open Array -- это пара <указатель на начало массива, число элементов в массиве>, ему не требуется менеджер памяти. Область памяти непрерывна (это базовое свойство структуры массив). Элементы идут друг за другом.

Смысл открытого массива в том, что это самый общий тип для массива, в него можно скастовать и статический, и динамический массив.

(Но я не исключаю, что есть способы нашаманить настройки выравнивания таким образом, что массив станет непригоден для итерации в Си коде (и в других юнитах паскаля, где выравнивание другое), но не знаю о них.)
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Hint: C arrays are passed by reference

Сообщение Vadim » 05.04.2019 06:56:59

Дож
А есть ли реальная необходимость, не доверяя компилятору, задавать прямо в коде выравнивание для разных участков программы?

И такой ещё вопрос: если в сишном коде явно не указана "pragma pack", выравнивание ведь тоже производится? По какому принципу? К примеру, по массивам понятно - 4/8 байт, в зависимости от типа ячейки. А тип struct?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Hint: C arrays are passed by reference

Сообщение Дож » 05.04.2019 19:16:25

А есть ли реальная необходимость, не доверяя компилятору, задавать прямо в коде выравнивание для разных участков программы?

Конечно. Бывают задачи, когда у пользователя больше информации о том, что происходит, чем у компилятора, и ему виднее как выравнивать. (Например, условие эффективности упаковки в памяти, или выравнивание данных для эффективной обработки SSE инструкциями.)

И такой ещё вопрос: если в сишном коде явно не указана "pragma pack", выравнивание ведь тоже производится?

Для массивов -- нет.

pragma pack влияет только на выравнивание полей в структуре. Например, в данном коде
Код: Выделить всё
struct S {
    char first;
    char a[2];
    int b;
};

выравнивание позиций полей first, a и b зависит от pragma pack, а выравнивание a[1] относительно a[0] не зависит.

Элементы массива не выравниваются, об этом написано в C99, например, в 6.2.5.20
An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type.

Слово contiguously означает "последовательно, друг за дружкой".

По какому принципу? А тип struct?

У каждого поля в структуре есть смещение от начала этой структуры. Это смещение при делении на число-выравниватель должно давать остаток 0.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Hint: C arrays are passed by reference

Сообщение debi12345 » 05.04.2019 21:34:19

n array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type.

Аллокйэтид или аксессед ? Эмулировать (индекс или итератор) последовательный доступ при наличии собаки сверху (менеджера памяти) - не вопрос. А вот доступ к элементам массива по смешению указателя от стартового элемента - это скорее лайф-хак, работающий пока массив не заредизайнили :roll:
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Hint: C arrays are passed by reference

Сообщение Дож » 05.04.2019 21:39:33

Аллокйэтид или аксессед ?

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

Это не лайф-хак, а описанное в стандарте поведение (арифметика указателя приравнена к арифметике обращения к массиву). C99 6.5.2.1.2
A postfix expression followed by an expression in square brackets[] is a subscripted designation of an element of an array object. The definition of the subscript operato r[] is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that apply to the binary+operator, if E1 is an array object (equivalently, a pointer to the initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th element of E1(counting from zero).
Последний раз редактировалось Дож 05.04.2019 21:41:03, всего редактировалось 1 раз.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Hint: C arrays are passed by reference

Сообщение debi12345 » 05.04.2019 21:41:01

Массивов не может быть в невыделенной памяти.

Он может как в джаве собираться из выделенных кусоов

Добавлено спустя 1 минуту 40 секунд:
а описанное в стандарте поведение (арифметика указателя приравнена к арифметике обращения к массиву)

Это скорее хотелка а не стандарт. Уже для строковых (при строках разной длины) массивов не работает.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Hint: C arrays are passed by reference

Сообщение Дож » 05.04.2019 21:46:18

Он может как в джаве собираться из выделенных кусоов

Здорово, я рад за джаву!

Но здесь мы обсуждаем массивы в Си. Что такое массив в Си определяется прописанным стандартом. В стандарте чётко написано что такое массив, как он описывается и как он себя ведёт. В стандарте нет ничего про выделенные куски.

Добавлено спустя 1 минуту 4 секунды:
Уже для строковых (при строках разной длины) массивов не работает.

Примеры в студию.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Hint: C arrays are passed by reference

Сообщение debi12345 » 05.04.2019 21:53:34

Заполните "array[n] of pchar" произвольным количеством строк с произвольным количеством завершающих нулей в каждой строке - и попробуйте найти границы указателей для каждой строки в этом массиве так,чтобы не обходить каждый символ каждой строки а также нули вне строк.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Hint: C arrays are passed by reference

Сообщение Дож » 05.04.2019 21:58:09

Попробовал, не получилось.

Какое утверждение стандарта было нарушено?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Hint: C arrays are passed by reference

Сообщение debi12345 » 05.04.2019 22:30:44

Какое утверждение стандарта было нарушено?

Последовательный доступ к данным, а не к указателям на данные. Подмена понятий.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Hint: C arrays are passed by reference

Сообщение Дож » 05.04.2019 22:40:13

Так вы и подменили понятия, определив массив указателей в постановке задачи ("array[n] of pchar"). Стандарт-то тут причём? Можете процитировать утверждение стандарта, которое каким-то образом было нарушено "кодом", который мне не удалось написать?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Hint: C arrays are passed by reference

Сообщение debi12345 » 05.04.2019 23:30:20

Стандарт-то тут причём? Можете процитировать утверждение стандарта, которое каким-то образом было нарушено "кодом", который мне не удалось написать?

В случае чужой ДЛЛки ожидаемое "стандартное поведение" массивов со сложностью данных "строки+" малополезно.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

Рейтинг@Mail.ru