RAD XE3+ Как изменить размер динамического массива, переданного по ссылке в функцию?06.05.2025, 11:20. Показов 3762. Ответов 40
Метки нет (Все метки)
Приветствую!
Почему размер передаваемого по ссылке массива не получается изменить?
С процедурой (вместо функции) — то же самое.
0
|
||||||
| 06.05.2025, 11:20 | |
|
Ответы с готовыми решениями:
40
Как изменить размер TImage под текущий размер Picture ? Изменить размерность массива в процедуре, переданного в виде параметра. Работа с внешним массивом внутри функции переданным как параметр Delphi 10.2 на .Net |
| 13.05.2025, 12:43 [ТС] | ||
|
0
|
||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 13.05.2025, 12:53 | ||
![]() Обратную совместимость языка не ломают. Ну т.е. это не случайная фича, а документированная. Однако согласен, что если уж хочется внутри функции изменять массив - то лучше написать var, ибо программа - она для человека.
1
|
||
|
Модератор
10476 / 5771 / 3411
Регистрация: 17.08.2012
Сообщений: 17,528
|
|||||||
| 13.05.2025, 19:48 | |||||||
|
KSergey9, заблуждаетесь. "Открытый" и "динамический" - это совершенно разные вещи.
Открытый массив - это древний костыль паскаля для передачи в подпрограмму статических массивов различной длины.
Как видите, массив передаётся по значению, как и планировалось.
2
|
|||||||
|
Native x86
6860 / 3792 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
|
|
| 13.05.2025, 19:52 | |
|
0
|
|
|
Модератор
10476 / 5771 / 3411
Регистрация: 17.08.2012
Сообщений: 17,528
|
|
| 13.05.2025, 19:56 | |
|
Ну, в таком виде - никак. Это я пока пост правил с целью повышения наглядности, Вам удалось это заметить.
0
|
|
|
Native x86
6860 / 3792 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
|
||||||
| 13.05.2025, 19:59 | ||||||
|
Разговор был немного про другое, KSergey9 зря смешал в одну кучу открытые и динамические массивы, но по сути он прав:
Но var, я считаю, все равно нужен. Потому что даже профи при беглом изучении исходника о таких особенностях внутренней реализации могут забывать.
1
|
||||||
|
Модератор
10476 / 5771 / 3411
Регистрация: 17.08.2012
Сообщений: 17,528
|
|
| 13.05.2025, 20:12 | |
|
Ну да, динамический массив (в любом случае) передаётся по ссылке, потому что он и есть ссылка. Хоть по значению его передавай, хоть по ссылке - всё равно будет по ссылке. А открытый массив передаётся так, как задано.
И в чём же KSergey9 прав?
0
|
|
|
Native x86
6860 / 3792 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
|
||||
| 13.05.2025, 20:25 | ||||
0
|
||||
|
Модератор
10476 / 5771 / 3411
Регистрация: 17.08.2012
Сообщений: 17,528
|
|
| 13.05.2025, 20:37 | |
|
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||
| 13.05.2025, 22:13 | |||
|
Добавлено через 1 минуту
0
|
|||
|
Native x86
6860 / 3792 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
|
|||||||
| 14.05.2025, 00:35 | |||||||
TCertificate. И по месту совершенно не ясно, динамический это массив, или статический.Зато когда видишь это:
1
|
|||||||
|
Модератор
10476 / 5771 / 3411
Регистрация: 17.08.2012
Сообщений: 17,528
|
||||||||||||||||||
| 20.05.2025, 01:05 | ||||||||||||||||||
|
Это сообщение содержит глупую ощибку. Смотрите сообщение № 37.
quwy, может возникнуть ошибка, да ещё какая! С умолчаниями насчёт динамического массива всё не так просто. Есть нехороший подводный камень: если изменить размер динамического массива, передаваемого по ссылке, внутри подпрограммы, то динамический массив по-тихому копируется в новый динамический массив, который по ссылке не может быть возвращён, поскольку ссылка на новый массив не соответствует ссылке в формальных параметрах процедуры. Иными словами, при изменении размера внутри процедуры массив следует передавать по значению, в этом случае новый массив скопируется в исходный при выходе из подпрограммы. Примеры: Передаём массив по значению.
Всё верно, массив возвращён из процедуры. А теперь по ссылке:
Опаньки... Ошибочка, однако. Да ещё и при большом объёме кода трудно вылавливаемая. Тот же казус происходит и при изменении длины копии массива без подпрограммы:
2
|
||||||||||||||||||
|
Модератор
|
||
| 20.05.2025, 07:08 | ||
|
3
|
||
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 20.05.2025, 07:58 | |
|
0
|
|
|
Модератор
10476 / 5771 / 3411
Регистрация: 17.08.2012
Сообщений: 17,528
|
|
| 21.05.2025, 02:20 | |
|
Ну да, попутал... Вообще всё с ног на голову поставил. Видно, мне по ночам лучше спать...
1
|
|
|
Злостный нарушитель
10878 / 5817 / 1288
Регистрация: 12.03.2015
Сообщений: 26,855
|
|
| 21.05.2025, 07:59 | |
|
0
|
|
|
Модератор
10476 / 5771 / 3411
Регистрация: 17.08.2012
Сообщений: 17,528
|
||||||||||||||||||
| 21.05.2025, 19:26 | ||||||||||||||||||
|
Работа над ошибками по сообщению #32, а то как-то нехорошо получается.
quwy, может возникнуть ошибка, да ещё какая! С умолчаниями насчёт динамического массива всё не так просто. Переменная, переданная по значению, является копией глобальной переменной, и, вроде бы, если копию изменить внутри подпрограммы, глобальная переменная изменяться не должна. Но, динамический массив - это ссылка, и изменения элементов массива внутри подпрограммы на самом деле изменяют элементы глобального массива. Получается, что, вроде бы, в случае динамического массива передача по ссылке и по значению - это практически одно и то же. Но, есть нехороший подводный камень. Действительно, если не изменять размер массива, то это и есть одно и то же. Однако, если изменить размер динамического массива, передаваемого по ссылке, внутри подпрограммы, то динамический массив по-тихому копируется в новый динамический массив, который по ссылке не может быть возвращён, поскольку ссылка на новый массив не соответствует ссылке в формальных параметрах процедуры. Иными словами, для гарантированного изменения глобального динамического массива из подпрограммы, его следует передавать именно по значению, а не по ссылке. Вот такой казус. Примеры: Передаём массив по значению.
Динамический массив, переданный по значению, изменён из процедуры. На первый взгляд, этого быть не может, но так оно и есть. А теперь по ссылке:
Опаньки... Ошибочка, однако. Ожидалось, что массив, переданный по ссылке, должен измениться, но он никак не изменился. Особенно при большом объёме кода, это очень трудно вылавливаемая ошибка. Тот же казус происходит и при изменении длины копии массива без подпрограммы:
1
|
||||||||||||||||||
|
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
|
|
| 22.05.2025, 01:15 | |
|
1
|
|
|
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
|
|||
| 22.05.2025, 02:08 | |||
|
Одинаково с № 32 получилось.
1
|
|||
| 22.05.2025, 08:44 [ТС] | ||||||
|
Вот так у меня прекрасно работает
Print: 0_1 1_2 2_111 3_222 TRUE
0
|
||||||
| 22.05.2025, 08:44 | |
|
Сохранение изменений, произведённых в функции с переменной, переданной в эту функцию в качестве параметра. Создать функцию, которая бы возвращала кол-во бит в переданном ей байте Запись значения по указателю, переданному в качестве аргумента в функцию
Как написать счетчик переданных байт интернета на Delphi7? Какой компонент использовать? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|