Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2024, 23:50   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Если в параметрах массив - это 2 регистра?

Я правильно понимаю, что если среди параметров функции есть массив, то при вызове он занимает сразу два регистра?
Один регистр - ссылка на сам массив
Во второй - его длина-1

Я правильно понял? Так и должно быть? Это так работает?

Массив на котором тестируется имеет длину 4
Изображения
Тип файла: png изображение_2024-02-03_224812502.png (19.4 Кб, 31 просмотров)

Последний раз редактировалось Kronos913; 03.02.2024 в 23:53.
Kronos913 вне форума Ответить с цитированием
Старый 04.02.2024, 00:49   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Я правильно понял? Так и должно быть? Это так работает?
Нет, конечно. Размер динамического массива хранится вместе с массивом и передается только указатель на первый элемент.
p51x вне форума Ответить с цитированием
Старый 04.02.2024, 01:49   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

А что тогда означает 3, которое передалось в регистр ecx ? Если не длину массива-1
При чем, пока все тесты этот код проходит успешно...

Но просто у меня это вышло "методом тыка" и хотелось бы послушать тех, кто знает теорию, может какую-то возможную ошибку я не учёл
Kronos913 вне форума Ответить с цитированием
Старый 04.02.2024, 02:16   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Действительно, открытый массив передается как 2 параметра: адрес первого элемента, индекс последнего элемента (длина - 1). А динамический массив через 1 параметр.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.02.2024, 01:45   #5
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

И я обратил внимание, что если тип ShortString передавать с меткой var, то в следующий регистр попадает длина строки. Это тоже официально верная информация?
Kronos913 вне форума Ответить с цитированием
Старый 05.02.2024, 02:46   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Не нашел пояснений в документации (может быть не смог верно сформулировать запрос), но в исходниках дельфи 7 есть такое:
Код:
// Don't use var param here - var ShortString is an open string param, which passes
// the ptr in EAX and the string's declared buffer length in EDX.  Compiler codegen
// expects only two params for this call - ptr and newlength

procedure       _SetLength(s: PShortString; newLength: Byte);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.02.2024, 10:23   #7
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
И я обратил внимание, что если тип ShortString передавать с меткой var, то в следующий регистр попадает длина строки.
Хотел было написать, что это наведенный эффект, но внимательно прочитал комментарий Borland из ответа BDA и офигел.

Цитата:
Сообщение от BDA Посмотреть сообщение
в исходниках дельфи 7 есть такое:
Код:
// Don't use var param here - var ShortString is an open string param, which passes
// the ptr in EAX and the string's declared buffer length in EDX.  Compiler codegen
// expects only two params for this call - ptr and newlength

procedure       _SetLength(s: PShortString; newLength: Byte);
Никогда бы не подумал, что передаваемая по ссылке строка имеет тип так называемой «открытой строки». Хотя, скорее, так долго уже не использовал короткие строки в коде, что забыл, как они обрабатываются.
Vapaamies на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив конкретной длинны в параметрах процедуры Kronos913 Общие вопросы Delphi 9 30.09.2022 17:31
Варианты параметров (Строка или массив строк в параметрах) Kronos913 Общие вопросы Delphi 1 07.02.2022 21:35
Если так заполнять массив, то второй цикл не выполняется, а если задавать элементы вручную - выполняется. Почему так? Hermeneticus Помощь студентам 1 30.10.2017 09:29
Задан массив a1, a2, …, an. Если массив упорядочен, то оставить без изменений, иначе переставить элементы ( Delphi ) Natashakosmos Помощь студентам 1 10.01.2014 22:44
Преобразовать все буквы нижнего регистра в буквы верхнего регистра druger Помощь студентам 5 18.09.2011 17:27