|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
15.12.2013, 21:06 | #1 |
Пользователь
Регистрация: 10.03.2009
Сообщений: 15
|
Использование нетипизированного указателя для передачи массива.
Здравствуйте уважаемые форумчане!
Никак не могу понять почему не работает конструкция вида: Код:
Объявления типа Код:
|
15.12.2013, 21:35 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Можно, но не так. А лучше более безопасным способом MakeArray1
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
15.12.2013, 22:30 | #3 |
Пользователь
Регистрация: 10.03.2009
Сообщений: 15
|
А можно, если не трудно, по подробнее расписать почему именно так нужно, а то первый представленный ранее вариант работал до тех пор, пока размер массива был известен заранее.
Просто хочется разобраться. Второй вариант конечно самый популярный в интернете, но, как я писал это лишь пример ситуации из реального кода, в котором не хотелось бы везде менять Код:
Код:
|
16.12.2013, 05:42 | #4 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
array of - это magic конструкция дельфи аналогичная string... под "магичностью" подразумевается автоматическое управление временем жизни, контроль количества ссылок и куча кода которую компилятор добавляет скрытно для обеспечения этой автоматичности...
обращаясь к такому массиву как поинтеру в MakeArray ты нарушаешь подсчет ссылок (нехватает 1 ссылки), и по выходу из процедуры массив уничтожается так как считает что он никому не нужен. а далее ты работаешь с трупом
Не стесняемся, плюсуем!
|
16.12.2013, 11:34 | #5 |
Пользователь
Регистрация: 10.03.2009
Сообщений: 15
|
Я чего-то не понимаю, я же вызываю
Setlength() я думал что при этом счётчик ссылок увеличивается на единицу, а перед завершением процедуры перевожу указатель локального массива на nil. Мне казалось, что при завершении процедуры счётчик ссылок исходного массива не должен измениться, так как локальный массив уже не связан с глобальным. То есть после работы MakeArray, как мне казалось должен был остаться кусок памяти от Pointer(a)-12 до Pointer(a)+length(a)-1. Который должен трактоваться программой как массив. Вопрос: где теряется ссылки, и что не так в рассуждениях? |
16.12.2013, 13:25 | #6 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
в первом посте не инициализированная а передается, и такой же остается после MakeArray т.к. параметр не var
Не стесняемся, плюсуем!
|
17.12.2013, 20:08 | #7 | |
Пользователь
Регистрация: 10.03.2009
Сообщений: 15
|
Цитата:
|
|
20.12.2013, 01:28 | #8 |
Пользователь
Регистрация: 10.03.2009
Сообщений: 15
|
Всем спасибо! Разобрался в чём проблема. Процедура
Код:
Кстати, по этой же причине работает только процедура Код:
Видимо Slym как раз имел ввиду необходимость передать указатель с параметром var и изменить его. Последний раз редактировалось frosich; 20.12.2013 в 01:54. |
20.12.2013, 12:24 | #9 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
20.12.2013, 13:24 | #10 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
вот так и появились поинтеры на поинтеры
int **i;
Не стесняемся, плюсуем!
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Передача указателя массива в фунцию. | firephenix | Общие вопросы C/C++ | 4 | 09.07.2011 06:07 |
определения массива как указателя | jon888 | Общие вопросы C/C++ | 2 | 09.05.2011 13:00 |
Использование указателя socket.Data TServerSocket | _PROGRAMM_ | Работа с сетью в Delphi | 0 | 13.02.2011 19:26 |
Массив с использование указателя | Seferus | Общие вопросы C/C++ | 1 | 02.11.2010 19:54 |
Инкремент для указателя массива структур | Valter | Общие вопросы C/C++ | 6 | 31.05.2010 18:30 |